@bikdotai/bik-component-library 0.0.777-beta.2 → 0.0.777-beta.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/assets/icons/magic-line.svg.js +1 -0
- package/dist/cjs/assets/icons/rewind.svg.js +1 -0
- package/dist/cjs/assets/icons/thumbs_down.svg.js +1 -0
- package/dist/cjs/assets/icons/thumbs_up.svg.js +1 -0
- package/dist/cjs/components/TablePagination/TablePagination.d.ts +0 -1
- package/dist/cjs/components/TablePagination/TablePagination.js +1 -1
- package/dist/cjs/components/WhatsAppTextEditor/AIRephrase.styled.d.ts +10 -0
- package/dist/cjs/components/WhatsAppTextEditor/AIRephrase.styled.js +1 -0
- package/dist/cjs/components/WhatsAppTextEditor/AIRephraseButton.d.ts +17 -0
- package/dist/cjs/components/WhatsAppTextEditor/AIRephraseButton.js +1 -0
- package/dist/cjs/components/WhatsAppTextEditor/BorderAnimation.d.ts +11 -0
- package/dist/cjs/components/WhatsAppTextEditor/BorderAnimation.js +1 -0
- package/dist/cjs/components/WhatsAppTextEditor/CustomEditor.styled.d.ts +13 -0
- package/dist/cjs/components/WhatsAppTextEditor/CustomEditor.styled.js +1 -1
- package/dist/cjs/components/WhatsAppTextEditor/WhatsAppTextEditor.d.ts +126 -3
- package/dist/cjs/components/WhatsAppTextEditor/WhatsAppTextEditor.js +5 -1
- package/dist/cjs/components/WhatsAppTextEditor/WhatsAppTextEditorHeader.d.ts +42 -1
- package/dist/cjs/components/WhatsAppTextEditor/WhatsAppTextEditorHeader.js +1 -1
- package/dist/cjs/components/WhatsAppTextEditor/ai/actionRegistry.d.ts +14 -0
- package/dist/cjs/components/WhatsAppTextEditor/ai/actionRegistry.js +1 -0
- package/dist/cjs/components/WhatsAppTextEditor/ai/aiTag.d.ts +58 -0
- package/dist/cjs/components/WhatsAppTextEditor/ai/aiTag.js +1 -0
- package/dist/cjs/components/WhatsAppTextEditor/ai/api.d.ts +22 -0
- package/dist/cjs/components/WhatsAppTextEditor/ai/api.js +1 -0
- package/dist/cjs/components/alerts/Alert.styled.js +1 -0
- package/dist/cjs/components/feature-announcements/MajorUpdatePopup.js +1 -1
- package/dist/cjs/components/feature-announcements/MinorUpdatePopup.js +1 -1
- package/dist/cjs/components/multi-level-dropdown/GroupedMenuList.d.ts +4 -0
- package/dist/cjs/components/multi-level-dropdown/GroupedMenuList.js +1 -1
- package/dist/cjs/components/multi-level-dropdown/MenuItem.d.ts +3 -0
- package/dist/cjs/components/multi-level-dropdown/MenuItem.js +1 -1
- package/dist/cjs/components/multi-level-dropdown/MenuList.d.ts +4 -0
- package/dist/cjs/components/multi-level-dropdown/MenuList.js +1 -1
- package/dist/cjs/components/multi-level-dropdown/MultiLevelDropdown.js +1 -1
- package/dist/cjs/components/multi-level-dropdown/type.d.ts +3 -0
- package/dist/cjs/components/radioButton/RadioButton.d.ts +1 -0
- package/dist/cjs/components/radioButton/RadioButton.js +1 -1
- package/dist/cjs/components/tag/Tag.d.ts +1 -1
- package/dist/cjs/components/tag/Tag.js +1 -1
- package/dist/cjs/components/tag/Tag.stories.d.ts +5 -5
- package/dist/cjs/components/tag/Tag.styled.d.ts +3 -0
- package/dist/cjs/components/tag/Tag.styled.js +1 -1
- package/dist/cjs/components/tag/model.d.ts +15 -0
- package/dist/cjs/components/template-preview/TemplatePreview.js +1 -1
- package/dist/cjs/helpers/BaseWhatsappContentLang.helper.js +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/esm/assets/icons/magic-line.svg.js +1 -0
- package/dist/esm/assets/icons/rewind.svg.js +1 -0
- package/dist/esm/assets/icons/thumbs_down.svg.js +1 -0
- package/dist/esm/assets/icons/thumbs_up.svg.js +1 -0
- package/dist/esm/components/TablePagination/TablePagination.d.ts +0 -1
- package/dist/esm/components/TablePagination/TablePagination.js +1 -1
- package/dist/esm/components/WhatsAppTextEditor/AIRephrase.styled.d.ts +10 -0
- package/dist/esm/components/WhatsAppTextEditor/AIRephrase.styled.js +1 -0
- package/dist/esm/components/WhatsAppTextEditor/AIRephraseButton.d.ts +17 -0
- package/dist/esm/components/WhatsAppTextEditor/AIRephraseButton.js +1 -0
- package/dist/esm/components/WhatsAppTextEditor/BorderAnimation.d.ts +11 -0
- package/dist/esm/components/WhatsAppTextEditor/BorderAnimation.js +1 -0
- package/dist/esm/components/WhatsAppTextEditor/CustomEditor.styled.d.ts +13 -0
- package/dist/esm/components/WhatsAppTextEditor/CustomEditor.styled.js +1 -1
- package/dist/esm/components/WhatsAppTextEditor/WhatsAppTextEditor.d.ts +126 -3
- package/dist/esm/components/WhatsAppTextEditor/WhatsAppTextEditor.js +5 -1
- package/dist/esm/components/WhatsAppTextEditor/WhatsAppTextEditorHeader.d.ts +42 -1
- package/dist/esm/components/WhatsAppTextEditor/WhatsAppTextEditorHeader.js +1 -1
- package/dist/esm/components/WhatsAppTextEditor/ai/actionRegistry.d.ts +14 -0
- package/dist/esm/components/WhatsAppTextEditor/ai/actionRegistry.js +1 -0
- package/dist/esm/components/WhatsAppTextEditor/ai/aiTag.d.ts +58 -0
- package/dist/esm/components/WhatsAppTextEditor/ai/aiTag.js +1 -0
- package/dist/esm/components/WhatsAppTextEditor/ai/api.d.ts +22 -0
- package/dist/esm/components/WhatsAppTextEditor/ai/api.js +1 -0
- package/dist/esm/components/alerts/Alert.styled.js +9 -8
- package/dist/esm/components/feature-announcements/MajorUpdatePopup.js +1 -1
- package/dist/esm/components/feature-announcements/MinorUpdatePopup.js +1 -1
- package/dist/esm/components/multi-level-dropdown/GroupedMenuList.d.ts +4 -0
- package/dist/esm/components/multi-level-dropdown/GroupedMenuList.js +1 -1
- package/dist/esm/components/multi-level-dropdown/MenuItem.d.ts +3 -0
- package/dist/esm/components/multi-level-dropdown/MenuItem.js +1 -1
- package/dist/esm/components/multi-level-dropdown/MenuList.d.ts +4 -0
- package/dist/esm/components/multi-level-dropdown/MenuList.js +1 -1
- package/dist/esm/components/multi-level-dropdown/MultiLevelDropdown.js +1 -1
- package/dist/esm/components/multi-level-dropdown/type.d.ts +3 -0
- package/dist/esm/components/radioButton/RadioButton.d.ts +1 -0
- package/dist/esm/components/radioButton/RadioButton.js +1 -1
- package/dist/esm/components/tag/Tag.d.ts +1 -1
- package/dist/esm/components/tag/Tag.js +1 -1
- package/dist/esm/components/tag/Tag.stories.d.ts +5 -5
- package/dist/esm/components/tag/Tag.styled.d.ts +3 -0
- package/dist/esm/components/tag/Tag.styled.js +1 -1
- package/dist/esm/components/tag/model.d.ts +15 -0
- package/dist/esm/components/template-preview/TemplatePreview.js +1 -1
- package/dist/esm/helpers/BaseWhatsappContentLang.helper.js +1 -1
- package/dist/esm/index.js +1 -1
- package/package.json +1 -1
|
@@ -1 +1,5 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var I=require("@emotion/styled/base"),g=require("../../_virtual/_tslib.js"),C=require("react/jsx-runtime"),A=require("@emotion/react"),l=require("../../assets/icons/check.svg.js"),c=require("../../assets/icons/chevronLeft.svg.js"),b=require("../../assets/icons/chevronRight.svg.js"),Z=require("../../assets/icons/cross.svg.js"),G=require("../../assets/icons/edit.svg.js"),X=require("../../assets/icons/info.svg.js"),d=require("../../assets/icons/rewind.svg.js"),V=require("../../assets/icons/thumbs_down.svg.js"),W=require("../../assets/icons/thumbs_up.svg.js"),R=require("../../helpers/BaseWhatsappContentLang.helper.js"),H=require("react"),B=require("../../constants/Theme.js"),J=require("../tooltips/Tooltip.js"),m=require("../TypographyStyle.js"),N=require("./ai/actionRegistry.js"),u=require("./ai/aiTag.js"),Y=require("./ai/api.js"),x=require("./CustomEditor.styled.js"),F=require("./WhatsAppTextEditorHeader.js");function y(I){return I&&"object"==typeof I&&"default"in I?I:{default:I}}var h=y(I),a=y(H);function i(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}const p="Character limit reached",n=A.keyframes`
|
|
2
|
+
0% { opacity: 0.55; }
|
|
3
|
+
50% { opacity: 1; }
|
|
4
|
+
100% { opacity: 0.55; }
|
|
5
|
+
`,S=h.default("div","production"===process.env.NODE_ENV?{target:"ea7i3sh18"}:{target:"ea7i3sh18",label:"EditorSkeletonContainer"})("production"===process.env.NODE_ENV?{name:"zdv776",styles:"padding:14px 12px;display:flex;flex-direction:column;gap:10px;min-height:150px"}:{name:"zdv776",styles:"padding:14px 12px;display:flex;flex-direction:column;gap:10px;min-height:150px",map:"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBbUMyQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */",toString:i}),k=h.default("div","production"===process.env.NODE_ENV?{target:"ea7i3sh17"}:{target:"ea7i3sh17",label:"EditorSkeletonLine"})("height:16px;border-radius:6px;width:",(I=>I.width),";background:#ececef;animation:",n," 1.1s ease-in-out infinite;"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBMENzQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),U=h.default("div","production"===process.env.NODE_ENV?{target:"ea7i3sh16"}:{target:"ea7i3sh16",label:"SuggestionSessionContainer"})("production"===process.env.NODE_ENV?{name:"lwqbyv",styles:"padding:12px;display:flex;flex-direction:column;gap:8px;max-height:260px;overflow-y:scroll;scrollbar-width:thin;scrollbar-color:#c8c8cf transparent;::-webkit-scrollbar{width:8px;}::-webkit-scrollbar-thumb{background:#c8c8cf;border-radius:8px;}::-webkit-scrollbar-track{background:transparent;}"}:{name:"lwqbyv",styles:"padding:12px;display:flex;flex-direction:column;gap:8px;max-height:260px;overflow-y:scroll;scrollbar-width:thin;scrollbar-color:#c8c8cf transparent;::-webkit-scrollbar{width:8px;}::-webkit-scrollbar-thumb{background:#c8c8cf;border-radius:8px;}::-webkit-scrollbar-track{background:transparent;}",map:"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBaUQ4QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */",toString:i}),s=h.default("div","production"===process.env.NODE_ENV?{target:"ea7i3sh15"}:{target:"ea7i3sh15",label:"SuggestionBaselineText"})("text-decoration:line-through;color:",B.COLORS.content.secondary,";"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBcUUwQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),v=h.default("div","production"===process.env.NODE_ENV?{target:"ea7i3sh14"}:{target:"ea7i3sh14",label:"SuggestionCandidateText"})("color:",B.COLORS.content.primary,";"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBeUUyQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),z=h.default("div","production"===process.env.NODE_ENV?{target:"ea7i3sh13"}:{target:"ea7i3sh13",label:"SuggestionCandidateSkeleton"})("production"===process.env.NODE_ENV?{name:"j0onnx",styles:"display:flex;flex-direction:column;gap:8px;width:100%;min-height:40px"}:{name:"j0onnx",styles:"display:flex;flex-direction:column;gap:8px;width:100%;min-height:40px",map:"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBNEUrQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */",toString:i}),Q=h.default("div","production"===process.env.NODE_ENV?{target:"ea7i3sh12"}:{target:"ea7i3sh12",label:"SuggestionControlsRow"})("production"===process.env.NODE_ENV?{name:"1pi78hi",styles:"display:flex;align-items:center;gap:6px"}:{name:"1pi78hi",styles:"display:flex;align-items:center;gap:6px",map:"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBbUZ5QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */",toString:i}),o=h.default("span","production"===process.env.NODE_ENV?{target:"ea7i3sh11"}:{target:"ea7i3sh11",label:"SuggestionCounter"})("color:",B.COLORS.content.primary,";font-size:14px;"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBd0ZzQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),w=h.default("button","production"===process.env.NODE_ENV?{target:"ea7i3sh10"}:{target:"ea7i3sh10",label:"SuggestionIconButton"})("border:0;background:transparent;padding:6px;border-radius:6px;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;color:",B.COLORS.content.primary,";transition:background-color 0.12s ease;:not(:disabled):hover{background-color:",B.COLORS.surface.hovered,";}:disabled{opacity:0.35;cursor:not-allowed;}"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBNEYyQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),t=h.default(w,"production"===process.env.NODE_ENV?{target:"ea7i3sh9"}:{target:"ea7i3sh9",label:"SuggestionRegenerateButton"})("production"===process.env.NODE_ENV?{name:"p2u7ri",styles:":disabled{opacity:1;cursor:wait;}"}:{name:"p2u7ri",styles:":disabled{opacity:1;cursor:wait;}",map:"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBZ0hnRSIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */",toString:i}),j=h.default("div","production"===process.env.NODE_ENV?{target:"ea7i3sh8"}:{target:"ea7i3sh8",label:"RegenerateIconShimmer"})("width:14px;height:14px;border-radius:4px;background:#ececef;flex-shrink:0;animation:",n," 1.1s ease-in-out infinite;"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBc0h5QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),T=h.default("div","production"===process.env.NODE_ENV?{target:"ea7i3sh7"}:{target:"ea7i3sh7",label:"InstructionContainer"})("background:",B.COLORS.surface.standard,";display:flex;flex-direction:column;padding:8px 12px;gap:10px;border-radius:0 0 4px 4px;position:relative;"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBK0h3QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),D=h.default("div","production"===process.env.NODE_ENV?{target:"ea7i3sh6"}:{target:"ea7i3sh6",label:"InstructionInputRow"})("border:1px solid #f5a4c0;border-radius:10px;padding:8px 10px;display:flex;align-items:center;gap:10px;background:",B.COLORS.surface.standard,";"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBd0l1QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),e=h.default("input","production"===process.env.NODE_ENV?{target:"ea7i3sh5"}:{target:"ea7i3sh5",label:"InstructionInput"})("flex:1;min-width:0;border:0;outline:none;font-size:14px;background:transparent;color:",B.COLORS.content.primary,";"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBaUpzQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),L=h.default("div","production"===process.env.NODE_ENV?{target:"ea7i3sh4"}:{target:"ea7i3sh4",label:"InstructionActions"})("production"===process.env.NODE_ENV?{name:"1og3vwv",styles:"display:flex;align-items:center;gap:10px"}:{name:"1og3vwv",styles:"display:flex;align-items:center;gap:10px",map:"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBMEpzQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */",toString:i}),K=h.default("button","production"===process.env.NODE_ENV?{target:"ea7i3sh3"}:{target:"ea7i3sh3",label:"InstructionCancel"})("border:0;background:transparent;color:",B.COLORS.content.secondary,";font-size:14px;font-weight:500;padding:0;cursor:pointer;"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBK0p3QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),O=h.default("button","production"===process.env.NODE_ENV?{target:"ea7i3sh2"}:{target:"ea7i3sh2",label:"InstructionImprove"})("border:1px solid #5d3a72;color:#5d3a72;background:",B.COLORS.surface.standard,";border-radius:8px;padding:8px 14px;font-size:14px;line-height:1.1;font-weight:600;cursor:pointer;"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBd0t5QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),E=h.default("div","production"===process.env.NODE_ENV?{target:"ea7i3sh1"}:{target:"ea7i3sh1",label:"InstructionSuggestionList"})("margin-top:10px;border-radius:12px;background:",B.COLORS.surface.standard,";box-shadow:0 6px 18px rgba(0, 0, 0, 0.1);overflow:hidden;"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBbUw2QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),P=h.default("button","production"===process.env.NODE_ENV?{target:"ea7i3sh0"}:{target:"ea7i3sh0",label:"InstructionSuggestionButton"})("width:100%;border:0;border-top:1px solid ",B.COLORS.stroke.primary,";background:",(I=>I.selected?"#e5f3e8":"transparent"),";color:",(I=>I.selected?"#1e6b34":B.COLORS.content.primary),";text-align:left;padding:12px 14px;font-size:14px;line-height:1.2;cursor:pointer;:first-of-type{border-top:0;}"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBMExrRCIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */"));var f;!function(I){I.LIKE="like",I.DISLIKE="dislike"}(f||(f={}));const M=new R.BaseWhatsappContentLangHelper,r={[F.EditorActionTypes.BOLD]:"*",[F.EditorActionTypes.ITALIC]:"_",[F.EditorActionTypes.STRIKETHROUGH]:"~"};const q=a.default.forwardRef(((I,A)=>{var{onChange:R,onClickVariable:y,text:h,RightComponent:a,error:i,limit:n,onError:q,rows:_,actions:$,editorInstanceKey:II,editorSessionId:gI,templateType:CI="marketing",templateId:AI,requestExecutor:lI,baseUrl:cI,endpointPath:bI,useCase:ZI,storeId:GI,apiAdapter:XI,conversationId:dI="whatsapp-template-editor",systemId:VI="whatsapp-writer",intent:WI="default",enabledAIActions:RI=[F.AIEditorActionTypes.REPHRASE,F.AIEditorActionTypes.SHORTEN,F.AIEditorActionTypes.EXPAND,F.AIEditorActionTypes.EMOJIFY],disableBuiltInAIActions:HI=!1,promptOverrides:BI,rephraseTones:JI,aiActionMinChars:mI,instructionSuggestions:NI=N.DEFAULT_INSTRUCTION_SUGGESTIONS,onAnalyticsEvent:uI,onAITagComputed:YI,prefillWasAiGenerated:xI=!1,editorHeader:FI,onAIToneSelect:yI,onAIActionRequest:hI,onBuildAIPrompt:aI,onBlur:iI}=I,pI=g.__rest(I,["onChange","onClickVariable","text","RightComponent","error","limit","onError","rows","actions","editorInstanceKey","editorSessionId","templateType","templateId","requestExecutor","baseUrl","endpointPath","useCase","storeId","apiAdapter","conversationId","systemId","intent","enabledAIActions","disableBuiltInAIActions","promptOverrides","rephraseTones","aiActionMinChars","instructionSuggestions","onAnalyticsEvent","onAITagComputed","prefillWasAiGenerated","editorHeader","onAIToneSelect","onAIActionRequest","onBuildAIPrompt","onBlur"]);const nI=H.useRef(null),[SI,kI]=H.useState(h||""),[UI,sI]=H.useState(!1),[vI,zI]=H.useState(0),[QI,oI]=H.useState(!1),[wI,tI]=H.useState(!1),[jI,TI]=H.useState(""),[DI,eI]=H.useState({}),[LI,KI]=H.useState(null),[OI,EI]=H.useState([]),[PI,fI]=H.useState(0),[MI,rI]=H.useState(null),qI=H.useRef(null),_I=H.useRef(null),$I=H.useRef(null),Ig=H.useRef(null),gg=H.useRef(null),Cg=H.useRef(null),Ag=H.useRef(null),lg=H.useRef(!!xI),cg=H.useRef(null),bg=H.useRef(h||""),[Zg,Gg]=H.useState({}),Xg=H.useRef(`mount-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`),dg=H.useMemo((()=>function(I){return`whatsapp-editor-rephrase-highlight-${I||"default"}`}(`${II||"default"}-${gI||Xg.current}`)),[II,gI]);H.useEffect((()=>{lg.current=!!xI}),[xI,II]),H.useEffect((()=>{bg.current=xI&&h||""}),[xI,II]);const Vg=H.useMemo((()=>N.resolveActionPrompts(CI,BI,JI)),[BI,JI,CI]),Wg=H.useMemo((()=>{const I=jI.trim().toLowerCase();return I?NI.filter((g=>g.toLowerCase().includes(I))):[]}),[NI,jI]),Rg=H.useMemo((()=>Object.assign(Object.assign({},N.DEFAULT_AI_ACTION_MIN_CHARS),mI||{})),[mI]),Hg=Rg[F.AIEditorActionTypes.REPHRASE]||N.DEFAULT_AI_ACTION_MIN_CHARS[F.AIEditorActionTypes.REPHRASE],Bg=H.useCallback((I=>{const g=I.trim().replace(/\s+/g," ");if(!g)return"";const C=g.split(" ").length;return`[anonymized:length_${g.length}:words_${C}]`}),[]),Jg=H.useCallback(((I,g)=>{null==uI||uI(I,g)}),[uI]),mg=H.useCallback((I=>{kI((g=>g===I?g:I))}),[]),Ng=H.useCallback((I=>{if(Cg.current&&clearTimeout(Cg.current),I.length>1200)return null==R||R(I,I),void(Cg.current=setTimeout((()=>{null==R||R(I,M.getHTML(I))}),16));null==R||R(I,M.getHTML(I))}),[R]),ug=H.useCallback((I=>{const g=cg.current,C=(null==g?void 0:g.acceptedText)||(xI?bg.current||SI:"");if(!C)return;if(I===C)return;const A=u.computeAiTagOnPostEdit({acceptedAiText:C,currentEditedText:I});null==YI||YI(Object.assign(Object.assign({},A),{source:"post_edit_debounce"}))}),[SI,YI,xI]),Yg=H.useCallback((()=>{KI(null),EI([]),fI(0),rI(null),Gg({})}),[]),xg=H.useCallback((()=>{if(QI)return;if(vI>=5)return;const I=vI+1;zI(I),"undefined"!=typeof window&&II&&sessionStorage.setItem(dg,String(I)),sI(!0),$I.current&&clearTimeout($I.current),$I.current=setTimeout((()=>{sI(!1)}),1200)}),[II,dg,QI,vI]),Fg=H.useRef(xg);function yg(I){const g=null==nI?void 0:nI.current;null!=g&&(g.selectionStart?(g.focus(),g.selectionEnd=I):g.focus())}function hg(I){var g,C;let A=null!==(C=null===(g=nI.current)||void 0===g?void 0:g.value)&&void 0!==C?C:"";if(nI.current&&I){const g=nI.current.selectionStart,C=nI.current.selectionEnd,l=I;if(g===C)return ag(l);{A=M.wrappWildcard(g,C,l,A);const I=M.getHTML(A);return mg(A),{text:A,html:I}}}return{text:A,html:A}}function ag(I){var g,C;const A=null!==(C=null===(g=nI.current)||void 0===g?void 0:g.value)&&void 0!==C?C:"";if(nI.current&&I){const g=nI.current.selectionStart;if(g===nI.current.selectionEnd)return ig(I,g)}return{text:A,html:A}}function ig(I,g){var C,A;let l=null!==(A=null===(C=nI.current)||void 0===C?void 0:C.value)&&void 0!==A?A:"";l=l.slice(0,g)+I+l.slice(g);const c=M.getHTML(l);return mg(l),{text:l,html:c}}Fg.current=xg,H.useEffect((()=>{if("undefined"==typeof window||!II)return;const I=Number(sessionStorage.getItem(dg)||"0");return Number.isNaN(I)||zI(I),()=>{sessionStorage.removeItem(dg)}}),[II,dg]),H.useEffect((()=>{if(QI)return sI(!1),void(_I.current&&(clearTimeout(_I.current),_I.current=null));const I=!!SI.trim()&&SI.length>=Hg;if(null===gg.current)return gg.current=I,void(I&&(_I.current=setTimeout((()=>{Fg.current()}),3e3)));if(!I)return gg.current=!1,sI(!1),void(_I.current&&(clearTimeout(_I.current),_I.current=null));const g=!gg.current&&I;gg.current=!0,g&&Fg.current(),_I.current&&clearTimeout(_I.current),_I.current=setTimeout((()=>{Fg.current()}),3e3)}),[SI,QI,Hg]),H.useEffect((()=>()=>{_I.current&&clearTimeout(_I.current),$I.current&&clearTimeout($I.current),Cg.current&&clearTimeout(Cg.current),Ig.current&&clearTimeout(Ig.current)}),[]);const pg=OI[PI]||"",ng=H.useMemo((()=>MI&&pg?`${MI}-${PI}-${pg}`:null),[pg,MI,PI]),Sg=!(!ng||!Zg[ng]),kg=H.useMemo((()=>M.getHTML(LI||"")),[LI]),Ug=H.useMemo((()=>M.getHTML(pg)),[pg]),sg=OI.length<3,vg=!!LI&&OI.length>0,zg=OI.length<=1||PI<=0,Qg=OI.length<=1||PI>=OI.length-1;H.useEffect((()=>{if(!vg)return;const I=qI.current;I&&(I.scrollTop=I.scrollHeight)}),[pg,vg,QI]);const og=H.useCallback((function(I){let C=arguments.length>1&&void 0!==arguments[1]&&arguments[1],A=arguments.length>2?arguments[2]:void 0,l=arguments.length>3?arguments[3]:void 0,c=arguments.length>4&&void 0!==arguments[4]?arguments[4]:F.AIActionVariant.DEFAULT;return g.__awaiter(void 0,void 0,void 0,(function*(){var g;if(!(hI||XI||lI&&cI))return void(null==q||q("AI configuration missing"));if(!SI.trim())return;const b=Rg[I]||N.DEFAULT_AI_ACTION_MIN_CHARS[I]||50;if(SI.length<b)return;if(QI)return;if(C&&!sg)return;const Z=Vg[I],G=I===F.AIEditorActionTypes.REPHRASE&&"utility"===CI&&c===F.AIActionVariant.REPHRASE?Object.assign(Object.assign({},Z),{label:"Rephrase",basePrompt:"Rephrase this WhatsApp utility template to improve clarity and readability while preserving variables, intent, and compliance."}):Z,X=l||DI[I],d=null===(g=G.tones)||void 0===g?void 0:g.find((I=>I.id===X)),V=void 0!==A?A:jI,W=(null==aI?void 0:aI({actionType:I,actionVariant:c,currentText:SI,templateType:CI,config:G,toneId:X,toneLabel:null==d?void 0:d.label,instructionText:V||void 0}))||Y.buildActionPrompt({config:G,currentText:SI,selectedToneId:X,instructionText:V});oI(!0),Jg("ai_action_triggered",{action_type:I,template_id:AI,template_category:CI});try{const g=hI?yield hI({actionType:I,actionVariant:c,currentText:SI,templateType:CI,toneId:X,toneLabel:null==d?void 0:d.label,instructionText:V||void 0,prompt:W}):yield Y.requestAISuggestion({apiAdapter:XI,requestExecutor:lI,baseUrl:cI,endpointPath:bI,prompt:W,intent:WI,conversationId:dI,systemId:VI,useCase:ZI,storeId:GI}),A="string"==typeof g?g.trim():((null==g?void 0:g.body)||"").trim();if(!A)return;if(!C)return KI(SI),rI(I),EI([A]),void fI(0);EI((I=>{const g=[...I,A].slice(0,3);return fI(g.length-1),g}))}catch(I){null==q||q("Failed to generate AI suggestion")}finally{oI(!1)}}))}),[lI,cI,SI,QI,sg,Vg,DI,jI,Jg,AI,bI,XI,WI,dI,VI,ZI,GI,CI,q,Rg,hI,aI]),wg=H.useCallback((()=>{if(!pg||!LI||!MI)return;mg(pg),Ng(pg),Jg("ai_suggestion_accepted",{action_type:MI,template_id:AI}),cg.current={acceptedText:pg,baselineText:LI,actionType:MI,editedEventEmitted:!1};const I=lg.current,g=u.computeAiTagOnAccept({baselineText:LI,acceptedText:pg,initialAiPrefillPhase:I});I&&(lg.current=!1),null==YI||YI(Object.assign(Object.assign({},g),{source:"accept"})),Yg()}),[pg,LI,MI,mg,Ng,Jg,AI,YI,Yg]),tg=H.useCallback((()=>{MI&&(Jg("ai_suggestion_discarded",{action_type:MI,template_id:AI}),Yg())}),[Yg,Jg,MI,AI]),jg=H.useCallback((I=>{MI&&ng&&(Zg[ng]||(Gg((g=>Object.assign(Object.assign({},g),{[ng]:I}))),Jg("ai_feedback_submitted",{action_type:MI,template_id:AI,rating:I,candidate_index:PI+1})))}),[ng,Jg,Zg,MI,PI,AI]),Tg=H.useMemo((()=>HI?[]:RI.map((I=>{var g;const C=Vg[I],A=DI[I];return{type:I,label:C.label,isPrimary:I===F.AIEditorActionTypes.REPHRASE,loading:QI&&MI===I,highlighted:I===F.AIEditorActionTypes.REPHRASE&&UI,disabled:!SI.trim()||SI.length<(Rg[I]||N.DEFAULT_AI_ACTION_MIN_CHARS[I]||50)||QI||vg&&MI===I,showToneDropdown:I===F.AIEditorActionTypes.REPHRASE&&!!(null===(g=C.tones)||void 0===g?void 0:g.length),tones:C.tones,selectedToneId:A}}))),[RI,HI,Vg,DI,QI,MI,vg,UI,SI,Rg]);return H.useImperativeHandle(A,(()=>({addTextOrWrap:hg,addText:ag,get:()=>SI,setCaretPosition:yg})),[hg,ag,SI]),H.useEffect((()=>{void 0!==h&&mg(h||"")}),[h,mg]),H.useEffect((()=>{if(!n||!q)return;const I=SI.length>n?p:null!=i?i:"";Ag.current!==I&&(Ag.current=I,q(I))}),[SI,i,n,q]),C.jsxs(x.OuterContainer,{children:[C.jsxs(x.EditorFooterRow,{children:[C.jsx(x.EditorFooterTitle,{children:FI?C.jsx(m.TitleSmall,Object.assign({"data-test":"body-text-for-edit-template"},{children:FI})):null}),C.jsxs(x.EditorFooterRight,{children:[i&&i!==p?C.jsxs(C.Fragment,{children:[C.jsx(X.default,{width:16,height:16,color:B.COLORS.content.negative}),C.jsx(m.BodyCaption,Object.assign({color:B.COLORS.content.negative},{children:i}))]}):null,n?C.jsxs(m.BodyCaption,Object.assign({style:{color:i===p||SI.length>n?B.COLORS.content.negative:B.COLORS.content.secondary}},{children:[SI.length,"/",n]})):null]})]}),C.jsxs(x.Container,Object.assign({isError:!!i},{children:[vg?C.jsxs(U,Object.assign({ref:qI},{children:[C.jsx(s,{dangerouslySetInnerHTML:{__html:kg}}),QI?C.jsx(v,Object.assign({"aria-busy":"true"},{children:C.jsxs(z,{children:[C.jsx(k,{width:"96%"}),C.jsx(k,{width:"84%"}),C.jsx(k,{width:"68%"})]})})):C.jsx(v,{dangerouslySetInnerHTML:{__html:Ug}}),C.jsxs(Q,{children:[C.jsxs(o,{children:[PI+1,"/",OI.length]}),C.jsx(w,Object.assign({"aria-label":"Previous suggestion",type:"button",disabled:zg,onClick:()=>fI((I=>Math.max(0,I-1)))},{children:C.jsx(c.default,{width:14,height:14})})),C.jsx(w,Object.assign({"aria-label":"Next suggestion",type:"button",disabled:Qg,onClick:()=>fI((I=>Math.min(OI.length-1,I+1)))},{children:C.jsx(b.default,{width:14,height:14})})),C.jsx(J.Tooltip,Object.assign({body:"Like",placement:"top"},{children:C.jsx(w,Object.assign({"aria-label":"Like suggestion",type:"button",disabled:Sg,onClick:()=>jg(f.LIKE)},{children:C.jsx(W.default,{width:14,height:14})}))})),C.jsx(J.Tooltip,Object.assign({body:"Dislike",placement:"top"},{children:C.jsx(w,Object.assign({"aria-label":"Dislike suggestion",type:"button",disabled:Sg,onClick:()=>jg(f.DISLIKE)},{children:C.jsx(V.default,{width:14,height:14})}))})),sg?C.jsx(J.Tooltip,Object.assign({body:QI?"Regenerating…":"Regenerate",placement:"top"},{children:C.jsx(t,Object.assign({"aria-label":"Regenerate suggestion","aria-busy":QI,type:"button",disabled:QI,onClick:()=>{MI&&og(MI,!0)}},{children:QI?C.jsx(j,{"aria-hidden":!0}):C.jsx(d.default,{width:14,height:14})}))})):null,C.jsx(J.Tooltip,Object.assign({body:"Discard",placement:"top"},{children:C.jsx(w,Object.assign({"aria-label":"Discard suggestion",type:"button",onClick:tg},{children:C.jsx(Z.default,{width:14,height:14})}))})),C.jsx(J.Tooltip,Object.assign({body:"Accept",placement:"top"},{children:C.jsx(w,Object.assign({"aria-label":"Accept suggestion",type:"button",onClick:wg},{children:C.jsx(l.default,{width:14,height:14})}))}))]})]})):QI?C.jsxs(S,{children:[C.jsx(k,{width:"96%"}),C.jsx(k,{width:"92%"}),C.jsx(k,{width:"88%"}),C.jsx(k,{width:"54%"})]}):C.jsx(x.TextSpace,Object.assign({ref:nI},pI,{value:SI,onChange:function(I){const g=I.target.value,C=cg.current;C&&!C.editedEventEmitted&&g!==C.acceptedText&&(cg.current=Object.assign(Object.assign({},C),{editedEventEmitted:!0}),Jg("ai_suggestion_edited",{action_type:C.actionType,template_id:AI})),Ig.current&&(clearTimeout(Ig.current),Ig.current=null);const A=(null==C?void 0:C.acceptedText)||(xI?bg.current||SI:"");A&&g!==A&&(Ig.current=setTimeout((()=>{ug(g)}),1e3)),mg(g),Ng(g)},onBlur:I=>{Ig.current&&(clearTimeout(Ig.current),Ig.current=null),ug(I.target.value),null==iI||iI(I)},onPaste:I=>{var g,C,A;const l=I.clipboardData.getData("text");if(l.length>1200){I.preventDefault();const c=nI.current,b=null!==(g=null==c?void 0:c.selectionStart)&&void 0!==g?g:0,Z=null!==(C=null==c?void 0:c.selectionEnd)&&void 0!==C?C:b,G=null!==(A=null==c?void 0:c.value)&&void 0!==A?A:SI,X=G.slice(0,b)+l+G.slice(Z);mg(X),Ng(X);const d=b+l.length;requestAnimationFrame((()=>{const I=nI.current;if(I)try{I.setSelectionRange(d,d)}catch(I){}}))}},rows:_})),wI?C.jsxs(T,{children:[C.jsxs(D,{children:[C.jsx(G.default,{width:18,height:18,color:B.COLORS.content.secondary}),C.jsx(e,{value:jI,placeholder:"Add specific instructions to refine your message",onChange:I=>TI(I.target.value)}),C.jsxs(L,{children:[C.jsx(K,Object.assign({type:"button",onClick:()=>{TI(""),tI(!1)}},{children:"Cancel"})),C.jsx(O,Object.assign({type:"button",onClick:()=>{const I=jI.trim();I&&Jg("ai_instruction_used",{action_type:F.AIEditorActionTypes.REPHRASE,template_id:AI,instruction_text:Bg(I)}),tI(!1),TI(""),og(F.AIEditorActionTypes.REPHRASE,!1,I)}},{children:"Improve"}))]})]}),jI.trim().length>0&&Wg.length>0?C.jsx(E,{children:Wg.map((I=>C.jsx(P,Object.assign({type:"button",selected:jI===I,onClick:()=>TI(I)},{children:I}),I)))}):null]}):C.jsx(F.WhatsAppTextEditorHeader,{actions:$,ref:nI,onActionSelect:function(I){const g=r[I];if(g&&nI.current){const I=nI.current.selectionStart;if(I===nI.current.selectionEnd){const{text:C}=ig(g,I);yg(I+1),Ng(C)}else{const{text:I}=hg(g);Ng(I)}}},RightComponent:a,rightActionsDisabled:vg||QI,onEmojiClick:function(I){const{text:g}=ag(I);Ng(g)},aiActions:Tg,disableAllActions:vg||QI,instructionActive:wI,onAIInstructionsClick:()=>tI(!0),onAIToneChange:(I,g)=>{eI((C=>Object.assign(Object.assign({},C),{[I]:g}))),null==yI||yI(I,g),I===F.AIEditorActionTypes.REPHRASE&&og(I,!1,void 0,g,F.AIActionVariant.DEFAULT)},onAIActionClick:function(I){let g=arguments.length>1&&void 0!==arguments[1]?arguments[1]:F.AIActionVariant.DEFAULT;if(!QI){if(vg){if(MI===I)return;return Yg(),void og(I,!1,void 0,void 0,g)}og(I,!1,void 0,void 0,g)}}})]}))]})}));q.displayName="WhatsAppTextEditor",exports.AI_TAG_CHANGE_RATIO_THRESHOLD=u.AI_TAG_CHANGE_RATIO_THRESHOLD,exports.computeAiTagOnAccept=u.computeAiTagOnAccept,exports.levenshteinDistance=u.levenshteinDistance,exports.WhatsAppTextEditor=q;
|