@bikdotai/bik-component-library 0.0.777-beta.19 → 0.0.777-beta.2
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/components/TablePagination/TablePagination.d.ts +1 -0
- package/dist/cjs/components/TablePagination/TablePagination.js +1 -1
- package/dist/cjs/components/WhatsAppTextEditor/CustomEditor.styled.d.ts +0 -13
- package/dist/cjs/components/WhatsAppTextEditor/CustomEditor.styled.js +1 -1
- package/dist/cjs/components/WhatsAppTextEditor/WhatsAppTextEditor.d.ts +3 -126
- package/dist/cjs/components/WhatsAppTextEditor/WhatsAppTextEditor.js +1 -5
- package/dist/cjs/components/WhatsAppTextEditor/WhatsAppTextEditorHeader.d.ts +1 -42
- package/dist/cjs/components/WhatsAppTextEditor/WhatsAppTextEditorHeader.js +1 -1
- package/dist/cjs/components/alerts/Alert.styled.js +0 -1
- 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 +0 -4
- package/dist/cjs/components/multi-level-dropdown/GroupedMenuList.js +1 -1
- package/dist/cjs/components/multi-level-dropdown/MenuItem.d.ts +0 -3
- package/dist/cjs/components/multi-level-dropdown/MenuItem.js +1 -1
- package/dist/cjs/components/multi-level-dropdown/MenuList.d.ts +0 -4
- 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 +0 -3
- package/dist/cjs/components/radioButton/RadioButton.d.ts +0 -1
- 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 +0 -3
- package/dist/cjs/components/tag/Tag.styled.js +1 -1
- package/dist/cjs/components/tag/model.d.ts +0 -15
- 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/components/TablePagination/TablePagination.d.ts +1 -0
- package/dist/esm/components/TablePagination/TablePagination.js +1 -1
- package/dist/esm/components/WhatsAppTextEditor/CustomEditor.styled.d.ts +0 -13
- package/dist/esm/components/WhatsAppTextEditor/CustomEditor.styled.js +1 -1
- package/dist/esm/components/WhatsAppTextEditor/WhatsAppTextEditor.d.ts +3 -126
- package/dist/esm/components/WhatsAppTextEditor/WhatsAppTextEditor.js +1 -5
- package/dist/esm/components/WhatsAppTextEditor/WhatsAppTextEditorHeader.d.ts +1 -42
- package/dist/esm/components/WhatsAppTextEditor/WhatsAppTextEditorHeader.js +1 -1
- package/dist/esm/components/alerts/Alert.styled.js +8 -9
- 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 +0 -4
- package/dist/esm/components/multi-level-dropdown/GroupedMenuList.js +1 -1
- package/dist/esm/components/multi-level-dropdown/MenuItem.d.ts +0 -3
- package/dist/esm/components/multi-level-dropdown/MenuItem.js +1 -1
- package/dist/esm/components/multi-level-dropdown/MenuList.d.ts +0 -4
- 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 +0 -3
- package/dist/esm/components/radioButton/RadioButton.d.ts +0 -1
- 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 +0 -3
- package/dist/esm/components/tag/Tag.styled.js +1 -1
- package/dist/esm/components/tag/model.d.ts +0 -15
- 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
- package/dist/cjs/assets/icons/magic-line.svg.js +0 -1
- package/dist/cjs/assets/icons/rewind.svg.js +0 -1
- package/dist/cjs/assets/icons/thumbs_down.svg.js +0 -1
- package/dist/cjs/assets/icons/thumbs_up.svg.js +0 -1
- package/dist/cjs/components/WhatsAppTextEditor/AIRephrase.styled.d.ts +0 -10
- package/dist/cjs/components/WhatsAppTextEditor/AIRephrase.styled.js +0 -1
- package/dist/cjs/components/WhatsAppTextEditor/AIRephraseButton.d.ts +0 -17
- package/dist/cjs/components/WhatsAppTextEditor/AIRephraseButton.js +0 -1
- package/dist/cjs/components/WhatsAppTextEditor/BorderAnimation.d.ts +0 -11
- package/dist/cjs/components/WhatsAppTextEditor/BorderAnimation.js +0 -1
- package/dist/cjs/components/WhatsAppTextEditor/ai/actionRegistry.d.ts +0 -14
- package/dist/cjs/components/WhatsAppTextEditor/ai/actionRegistry.js +0 -1
- package/dist/cjs/components/WhatsAppTextEditor/ai/aiTag.d.ts +0 -58
- package/dist/cjs/components/WhatsAppTextEditor/ai/aiTag.js +0 -1
- package/dist/cjs/components/WhatsAppTextEditor/ai/api.d.ts +0 -22
- package/dist/cjs/components/WhatsAppTextEditor/ai/api.js +0 -1
- package/dist/esm/assets/icons/magic-line.svg.js +0 -1
- package/dist/esm/assets/icons/rewind.svg.js +0 -1
- package/dist/esm/assets/icons/thumbs_down.svg.js +0 -1
- package/dist/esm/assets/icons/thumbs_up.svg.js +0 -1
- package/dist/esm/components/WhatsAppTextEditor/AIRephrase.styled.d.ts +0 -10
- package/dist/esm/components/WhatsAppTextEditor/AIRephrase.styled.js +0 -1
- package/dist/esm/components/WhatsAppTextEditor/AIRephraseButton.d.ts +0 -17
- package/dist/esm/components/WhatsAppTextEditor/AIRephraseButton.js +0 -1
- package/dist/esm/components/WhatsAppTextEditor/BorderAnimation.d.ts +0 -11
- package/dist/esm/components/WhatsAppTextEditor/BorderAnimation.js +0 -1
- package/dist/esm/components/WhatsAppTextEditor/ai/actionRegistry.d.ts +0 -14
- package/dist/esm/components/WhatsAppTextEditor/ai/actionRegistry.js +0 -1
- package/dist/esm/components/WhatsAppTextEditor/ai/aiTag.d.ts +0 -58
- package/dist/esm/components/WhatsAppTextEditor/ai/aiTag.js +0 -1
- package/dist/esm/components/WhatsAppTextEditor/ai/api.d.ts +0 -22
- package/dist/esm/components/WhatsAppTextEditor/ai/api.js +0 -1
|
@@ -1,5 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var
|
|
2
|
-
0% { opacity: 0.55; }
|
|
3
|
-
50% { opacity: 1; }
|
|
4
|
-
100% { opacity: 0.55; }
|
|
5
|
-
`,S=a.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/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGlucHV0VmFsdWUsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQobnVsbCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoW10pO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShudWxsKTtcclxuICAgICAgICBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUoe30pO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VIaWdobGlnaHRDb3VudCA+PSBNQVhfUkVQSFJBU0VfSElHSExJR0hUUykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG5leHRDb3VudCA9IHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgKyAxO1xyXG4gICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQobmV4dENvdW50KTtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShoaWdobGlnaHRTdG9yYWdlS2V5LCBTdHJpbmcobmV4dENvdW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZCh0cnVlKTtcclxuICAgICAgICBpZiAoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICB9LCAxMjAwKTtcclxuICAgIH0sIFtcclxuICAgICAgICBlZGl0b3JJbnN0YW5jZUtleSxcclxuICAgICAgICBoaWdobGlnaHRTdG9yYWdlS2V5LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICByZXBocmFzZUhpZ2hsaWdodENvdW50LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb24gPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChhY2NlcHRlZFN1Z2dlc3Rpb24gJiZcclxuICAgICAgICAgICAgIWFjY2VwdGVkU3VnZ2VzdGlvbi5lZGl0ZWRFdmVudEVtaXR0ZWQgJiZcclxuICAgICAgICAgICAgdGV4dCAhPT0gYWNjZXB0ZWRTdWdnZXN0aW9uLmFjY2VwdGVkVGV4dCkge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhY2NlcHRlZFN1Z2dlc3Rpb24pLCB7IGVkaXRlZEV2ZW50RW1pdHRlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX3N1Z2dlc3Rpb25fZWRpdGVkJywge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSA9IChhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IG51bGwgfHwgYWNjZXB0ZWRTdWdnZXN0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB8fFxyXG4gICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgIGlmIChiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSAmJiB0ZXh0ICE9PSBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSkge1xyXG4gICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGF0ZXN0QmFzZWxpbmUgPSAobGF0ZXN0ID09PSBudWxsIHx8IGxhdGVzdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGF0ZXN0LmFjY2VwdGVkVGV4dCkgfHxcclxuICAgICAgICAgICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBpZiAodGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjb21wdXRlUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uUG9zdEVkaXQoe1xyXG4gICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogdGV4dCxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uVG9BcHBseSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRBSUV2ZW50KCdhaV9pbnN0cnVjdGlvbl91c2VkJywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uX3RleHQ6IGFub255bWl6ZUluc3RydWN0aW9uVGV4dChpbnN0cnVjdGlvblRvQXBwbHkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSldIH0pKTtcclxufSk7XHJcbldoYXRzQXBwVGV4dEVkaXRvci5kaXNwbGF5TmFtZSA9ICdXaGF0c0FwcFRleHRFZGl0b3InO1xyXG5leHBvcnQgeyBBSV9UQUdfQ0hBTkdFX1JBVElPX1RIUkVTSE9MRCwgY29tcHV0ZUFpVGFnT25BY2NlcHQsIGxldmVuc2h0ZWluRGlzdGFuY2UsIH0gZnJvbSAnLi9haS9haVRhZyc7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdoYXRzQXBwVGV4dEVkaXRvci5qcy5tYXAiXX0= */",toString:p}),k=a.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/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGlucHV0VmFsdWUsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQobnVsbCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoW10pO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShudWxsKTtcclxuICAgICAgICBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUoe30pO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VIaWdobGlnaHRDb3VudCA+PSBNQVhfUkVQSFJBU0VfSElHSExJR0hUUykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG5leHRDb3VudCA9IHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgKyAxO1xyXG4gICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQobmV4dENvdW50KTtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShoaWdobGlnaHRTdG9yYWdlS2V5LCBTdHJpbmcobmV4dENvdW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZCh0cnVlKTtcclxuICAgICAgICBpZiAoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICB9LCAxMjAwKTtcclxuICAgIH0sIFtcclxuICAgICAgICBlZGl0b3JJbnN0YW5jZUtleSxcclxuICAgICAgICBoaWdobGlnaHRTdG9yYWdlS2V5LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICByZXBocmFzZUhpZ2hsaWdodENvdW50LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb24gPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChhY2NlcHRlZFN1Z2dlc3Rpb24gJiZcclxuICAgICAgICAgICAgIWFjY2VwdGVkU3VnZ2VzdGlvbi5lZGl0ZWRFdmVudEVtaXR0ZWQgJiZcclxuICAgICAgICAgICAgdGV4dCAhPT0gYWNjZXB0ZWRTdWdnZXN0aW9uLmFjY2VwdGVkVGV4dCkge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhY2NlcHRlZFN1Z2dlc3Rpb24pLCB7IGVkaXRlZEV2ZW50RW1pdHRlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX3N1Z2dlc3Rpb25fZWRpdGVkJywge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSA9IChhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IG51bGwgfHwgYWNjZXB0ZWRTdWdnZXN0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB8fFxyXG4gICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgIGlmIChiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSAmJiB0ZXh0ICE9PSBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSkge1xyXG4gICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGF0ZXN0QmFzZWxpbmUgPSAobGF0ZXN0ID09PSBudWxsIHx8IGxhdGVzdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGF0ZXN0LmFjY2VwdGVkVGV4dCkgfHxcclxuICAgICAgICAgICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBpZiAodGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjb21wdXRlUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uUG9zdEVkaXQoe1xyXG4gICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogdGV4dCxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uVG9BcHBseSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRBSUV2ZW50KCdhaV9pbnN0cnVjdGlvbl91c2VkJywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uX3RleHQ6IGFub255bWl6ZUluc3RydWN0aW9uVGV4dChpbnN0cnVjdGlvblRvQXBwbHkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSldIH0pKTtcclxufSk7XHJcbldoYXRzQXBwVGV4dEVkaXRvci5kaXNwbGF5TmFtZSA9ICdXaGF0c0FwcFRleHRFZGl0b3InO1xyXG5leHBvcnQgeyBBSV9UQUdfQ0hBTkdFX1JBVElPX1RIUkVTSE9MRCwgY29tcHV0ZUFpVGFnT25BY2NlcHQsIGxldmVuc2h0ZWluRGlzdGFuY2UsIH0gZnJvbSAnLi9haS9haVRhZyc7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdoYXRzQXBwVGV4dEVkaXRvci5qcy5tYXAiXX0= */")),U=a.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/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGlucHV0VmFsdWUsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQobnVsbCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoW10pO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShudWxsKTtcclxuICAgICAgICBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUoe30pO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VIaWdobGlnaHRDb3VudCA+PSBNQVhfUkVQSFJBU0VfSElHSExJR0hUUykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG5leHRDb3VudCA9IHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgKyAxO1xyXG4gICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQobmV4dENvdW50KTtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShoaWdobGlnaHRTdG9yYWdlS2V5LCBTdHJpbmcobmV4dENvdW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZCh0cnVlKTtcclxuICAgICAgICBpZiAoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICB9LCAxMjAwKTtcclxuICAgIH0sIFtcclxuICAgICAgICBlZGl0b3JJbnN0YW5jZUtleSxcclxuICAgICAgICBoaWdobGlnaHRTdG9yYWdlS2V5LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICByZXBocmFzZUhpZ2hsaWdodENvdW50LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb24gPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChhY2NlcHRlZFN1Z2dlc3Rpb24gJiZcclxuICAgICAgICAgICAgIWFjY2VwdGVkU3VnZ2VzdGlvbi5lZGl0ZWRFdmVudEVtaXR0ZWQgJiZcclxuICAgICAgICAgICAgdGV4dCAhPT0gYWNjZXB0ZWRTdWdnZXN0aW9uLmFjY2VwdGVkVGV4dCkge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhY2NlcHRlZFN1Z2dlc3Rpb24pLCB7IGVkaXRlZEV2ZW50RW1pdHRlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX3N1Z2dlc3Rpb25fZWRpdGVkJywge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSA9IChhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IG51bGwgfHwgYWNjZXB0ZWRTdWdnZXN0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB8fFxyXG4gICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgIGlmIChiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSAmJiB0ZXh0ICE9PSBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSkge1xyXG4gICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGF0ZXN0QmFzZWxpbmUgPSAobGF0ZXN0ID09PSBudWxsIHx8IGxhdGVzdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGF0ZXN0LmFjY2VwdGVkVGV4dCkgfHxcclxuICAgICAgICAgICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBpZiAodGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjb21wdXRlUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uUG9zdEVkaXQoe1xyXG4gICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogdGV4dCxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uVG9BcHBseSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRBSUV2ZW50KCdhaV9pbnN0cnVjdGlvbl91c2VkJywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uX3RleHQ6IGFub255bWl6ZUluc3RydWN0aW9uVGV4dChpbnN0cnVjdGlvblRvQXBwbHkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSldIH0pKTtcclxufSk7XHJcbldoYXRzQXBwVGV4dEVkaXRvci5kaXNwbGF5TmFtZSA9ICdXaGF0c0FwcFRleHRFZGl0b3InO1xyXG5leHBvcnQgeyBBSV9UQUdfQ0hBTkdFX1JBVElPX1RIUkVTSE9MRCwgY29tcHV0ZUFpVGFnT25BY2NlcHQsIGxldmVuc2h0ZWluRGlzdGFuY2UsIH0gZnJvbSAnLi9haS9haVRhZyc7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdoYXRzQXBwVGV4dEVkaXRvci5qcy5tYXAiXX0= */",toString:p}),v=a.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/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGlucHV0VmFsdWUsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQobnVsbCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoW10pO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShudWxsKTtcclxuICAgICAgICBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUoe30pO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VIaWdobGlnaHRDb3VudCA+PSBNQVhfUkVQSFJBU0VfSElHSExJR0hUUykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG5leHRDb3VudCA9IHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgKyAxO1xyXG4gICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQobmV4dENvdW50KTtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShoaWdobGlnaHRTdG9yYWdlS2V5LCBTdHJpbmcobmV4dENvdW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZCh0cnVlKTtcclxuICAgICAgICBpZiAoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICB9LCAxMjAwKTtcclxuICAgIH0sIFtcclxuICAgICAgICBlZGl0b3JJbnN0YW5jZUtleSxcclxuICAgICAgICBoaWdobGlnaHRTdG9yYWdlS2V5LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICByZXBocmFzZUhpZ2hsaWdodENvdW50LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb24gPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChhY2NlcHRlZFN1Z2dlc3Rpb24gJiZcclxuICAgICAgICAgICAgIWFjY2VwdGVkU3VnZ2VzdGlvbi5lZGl0ZWRFdmVudEVtaXR0ZWQgJiZcclxuICAgICAgICAgICAgdGV4dCAhPT0gYWNjZXB0ZWRTdWdnZXN0aW9uLmFjY2VwdGVkVGV4dCkge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhY2NlcHRlZFN1Z2dlc3Rpb24pLCB7IGVkaXRlZEV2ZW50RW1pdHRlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX3N1Z2dlc3Rpb25fZWRpdGVkJywge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSA9IChhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IG51bGwgfHwgYWNjZXB0ZWRTdWdnZXN0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB8fFxyXG4gICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgIGlmIChiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSAmJiB0ZXh0ICE9PSBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSkge1xyXG4gICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGF0ZXN0QmFzZWxpbmUgPSAobGF0ZXN0ID09PSBudWxsIHx8IGxhdGVzdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGF0ZXN0LmFjY2VwdGVkVGV4dCkgfHxcclxuICAgICAgICAgICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBpZiAodGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjb21wdXRlUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uUG9zdEVkaXQoe1xyXG4gICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogdGV4dCxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uVG9BcHBseSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRBSUV2ZW50KCdhaV9pbnN0cnVjdGlvbl91c2VkJywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uX3RleHQ6IGFub255bWl6ZUluc3RydWN0aW9uVGV4dChpbnN0cnVjdGlvblRvQXBwbHkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSldIH0pKTtcclxufSk7XHJcbldoYXRzQXBwVGV4dEVkaXRvci5kaXNwbGF5TmFtZSA9ICdXaGF0c0FwcFRleHRFZGl0b3InO1xyXG5leHBvcnQgeyBBSV9UQUdfQ0hBTkdFX1JBVElPX1RIUkVTSE9MRCwgY29tcHV0ZUFpVGFnT25BY2NlcHQsIGxldmVuc2h0ZWluRGlzdGFuY2UsIH0gZnJvbSAnLi9haS9haVRhZyc7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdoYXRzQXBwVGV4dEVkaXRvci5qcy5tYXAiXX0= */")),z=a.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/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGlucHV0VmFsdWUsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQobnVsbCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoW10pO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShudWxsKTtcclxuICAgICAgICBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUoe30pO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VIaWdobGlnaHRDb3VudCA+PSBNQVhfUkVQSFJBU0VfSElHSExJR0hUUykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG5leHRDb3VudCA9IHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgKyAxO1xyXG4gICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQobmV4dENvdW50KTtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShoaWdobGlnaHRTdG9yYWdlS2V5LCBTdHJpbmcobmV4dENvdW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZCh0cnVlKTtcclxuICAgICAgICBpZiAoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICB9LCAxMjAwKTtcclxuICAgIH0sIFtcclxuICAgICAgICBlZGl0b3JJbnN0YW5jZUtleSxcclxuICAgICAgICBoaWdobGlnaHRTdG9yYWdlS2V5LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICByZXBocmFzZUhpZ2hsaWdodENvdW50LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb24gPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChhY2NlcHRlZFN1Z2dlc3Rpb24gJiZcclxuICAgICAgICAgICAgIWFjY2VwdGVkU3VnZ2VzdGlvbi5lZGl0ZWRFdmVudEVtaXR0ZWQgJiZcclxuICAgICAgICAgICAgdGV4dCAhPT0gYWNjZXB0ZWRTdWdnZXN0aW9uLmFjY2VwdGVkVGV4dCkge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhY2NlcHRlZFN1Z2dlc3Rpb24pLCB7IGVkaXRlZEV2ZW50RW1pdHRlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX3N1Z2dlc3Rpb25fZWRpdGVkJywge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSA9IChhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IG51bGwgfHwgYWNjZXB0ZWRTdWdnZXN0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB8fFxyXG4gICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgIGlmIChiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSAmJiB0ZXh0ICE9PSBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSkge1xyXG4gICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGF0ZXN0QmFzZWxpbmUgPSAobGF0ZXN0ID09PSBudWxsIHx8IGxhdGVzdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGF0ZXN0LmFjY2VwdGVkVGV4dCkgfHxcclxuICAgICAgICAgICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBpZiAodGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjb21wdXRlUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uUG9zdEVkaXQoe1xyXG4gICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogdGV4dCxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uVG9BcHBseSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRBSUV2ZW50KCdhaV9pbnN0cnVjdGlvbl91c2VkJywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uX3RleHQ6IGFub255bWl6ZUluc3RydWN0aW9uVGV4dChpbnN0cnVjdGlvblRvQXBwbHkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSldIH0pKTtcclxufSk7XHJcbldoYXRzQXBwVGV4dEVkaXRvci5kaXNwbGF5TmFtZSA9ICdXaGF0c0FwcFRleHRFZGl0b3InO1xyXG5leHBvcnQgeyBBSV9UQUdfQ0hBTkdFX1JBVElPX1RIUkVTSE9MRCwgY29tcHV0ZUFpVGFnT25BY2NlcHQsIGxldmVuc2h0ZWluRGlzdGFuY2UsIH0gZnJvbSAnLi9haS9haVRhZyc7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdoYXRzQXBwVGV4dEVkaXRvci5qcy5tYXAiXX0= */")),s=a.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/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGlucHV0VmFsdWUsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQobnVsbCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoW10pO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShudWxsKTtcclxuICAgICAgICBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUoe30pO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VIaWdobGlnaHRDb3VudCA+PSBNQVhfUkVQSFJBU0VfSElHSExJR0hUUykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG5leHRDb3VudCA9IHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgKyAxO1xyXG4gICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQobmV4dENvdW50KTtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShoaWdobGlnaHRTdG9yYWdlS2V5LCBTdHJpbmcobmV4dENvdW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZCh0cnVlKTtcclxuICAgICAgICBpZiAoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICB9LCAxMjAwKTtcclxuICAgIH0sIFtcclxuICAgICAgICBlZGl0b3JJbnN0YW5jZUtleSxcclxuICAgICAgICBoaWdobGlnaHRTdG9yYWdlS2V5LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICByZXBocmFzZUhpZ2hsaWdodENvdW50LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb24gPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChhY2NlcHRlZFN1Z2dlc3Rpb24gJiZcclxuICAgICAgICAgICAgIWFjY2VwdGVkU3VnZ2VzdGlvbi5lZGl0ZWRFdmVudEVtaXR0ZWQgJiZcclxuICAgICAgICAgICAgdGV4dCAhPT0gYWNjZXB0ZWRTdWdnZXN0aW9uLmFjY2VwdGVkVGV4dCkge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhY2NlcHRlZFN1Z2dlc3Rpb24pLCB7IGVkaXRlZEV2ZW50RW1pdHRlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX3N1Z2dlc3Rpb25fZWRpdGVkJywge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSA9IChhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IG51bGwgfHwgYWNjZXB0ZWRTdWdnZXN0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB8fFxyXG4gICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgIGlmIChiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSAmJiB0ZXh0ICE9PSBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSkge1xyXG4gICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGF0ZXN0QmFzZWxpbmUgPSAobGF0ZXN0ID09PSBudWxsIHx8IGxhdGVzdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGF0ZXN0LmFjY2VwdGVkVGV4dCkgfHxcclxuICAgICAgICAgICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBpZiAodGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjb21wdXRlUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uUG9zdEVkaXQoe1xyXG4gICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogdGV4dCxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uVG9BcHBseSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRBSUV2ZW50KCdhaV9pbnN0cnVjdGlvbl91c2VkJywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uX3RleHQ6IGFub255bWl6ZUluc3RydWN0aW9uVGV4dChpbnN0cnVjdGlvblRvQXBwbHkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSldIH0pKTtcclxufSk7XHJcbldoYXRzQXBwVGV4dEVkaXRvci5kaXNwbGF5TmFtZSA9ICdXaGF0c0FwcFRleHRFZGl0b3InO1xyXG5leHBvcnQgeyBBSV9UQUdfQ0hBTkdFX1JBVElPX1RIUkVTSE9MRCwgY29tcHV0ZUFpVGFnT25BY2NlcHQsIGxldmVuc2h0ZWluRGlzdGFuY2UsIH0gZnJvbSAnLi9haS9haVRhZyc7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdoYXRzQXBwVGV4dEVkaXRvci5qcy5tYXAiXX0= */",toString:p}),w=a.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/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGlucHV0VmFsdWUsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQobnVsbCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoW10pO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShudWxsKTtcclxuICAgICAgICBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUoe30pO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VIaWdobGlnaHRDb3VudCA+PSBNQVhfUkVQSFJBU0VfSElHSExJR0hUUykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG5leHRDb3VudCA9IHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgKyAxO1xyXG4gICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQobmV4dENvdW50KTtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShoaWdobGlnaHRTdG9yYWdlS2V5LCBTdHJpbmcobmV4dENvdW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZCh0cnVlKTtcclxuICAgICAgICBpZiAoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICB9LCAxMjAwKTtcclxuICAgIH0sIFtcclxuICAgICAgICBlZGl0b3JJbnN0YW5jZUtleSxcclxuICAgICAgICBoaWdobGlnaHRTdG9yYWdlS2V5LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICByZXBocmFzZUhpZ2hsaWdodENvdW50LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb24gPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChhY2NlcHRlZFN1Z2dlc3Rpb24gJiZcclxuICAgICAgICAgICAgIWFjY2VwdGVkU3VnZ2VzdGlvbi5lZGl0ZWRFdmVudEVtaXR0ZWQgJiZcclxuICAgICAgICAgICAgdGV4dCAhPT0gYWNjZXB0ZWRTdWdnZXN0aW9uLmFjY2VwdGVkVGV4dCkge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhY2NlcHRlZFN1Z2dlc3Rpb24pLCB7IGVkaXRlZEV2ZW50RW1pdHRlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX3N1Z2dlc3Rpb25fZWRpdGVkJywge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSA9IChhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IG51bGwgfHwgYWNjZXB0ZWRTdWdnZXN0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB8fFxyXG4gICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgIGlmIChiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSAmJiB0ZXh0ICE9PSBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSkge1xyXG4gICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGF0ZXN0QmFzZWxpbmUgPSAobGF0ZXN0ID09PSBudWxsIHx8IGxhdGVzdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGF0ZXN0LmFjY2VwdGVkVGV4dCkgfHxcclxuICAgICAgICAgICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBpZiAodGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjb21wdXRlUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uUG9zdEVkaXQoe1xyXG4gICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogdGV4dCxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uVG9BcHBseSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRBSUV2ZW50KCdhaV9pbnN0cnVjdGlvbl91c2VkJywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uX3RleHQ6IGFub255bWl6ZUluc3RydWN0aW9uVGV4dChpbnN0cnVjdGlvblRvQXBwbHkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSldIH0pKTtcclxufSk7XHJcbldoYXRzQXBwVGV4dEVkaXRvci5kaXNwbGF5TmFtZSA9ICdXaGF0c0FwcFRleHRFZGl0b3InO1xyXG5leHBvcnQgeyBBSV9UQUdfQ0hBTkdFX1JBVElPX1RIUkVTSE9MRCwgY29tcHV0ZUFpVGFnT25BY2NlcHQsIGxldmVuc2h0ZWluRGlzdGFuY2UsIH0gZnJvbSAnLi9haS9haVRhZyc7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdoYXRzQXBwVGV4dEVkaXRvci5qcy5tYXAiXX0= */",toString:p}),Q=a.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/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGlucHV0VmFsdWUsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQobnVsbCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoW10pO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShudWxsKTtcclxuICAgICAgICBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUoe30pO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VIaWdobGlnaHRDb3VudCA+PSBNQVhfUkVQSFJBU0VfSElHSExJR0hUUykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG5leHRDb3VudCA9IHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgKyAxO1xyXG4gICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQobmV4dENvdW50KTtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShoaWdobGlnaHRTdG9yYWdlS2V5LCBTdHJpbmcobmV4dENvdW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZCh0cnVlKTtcclxuICAgICAgICBpZiAoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICB9LCAxMjAwKTtcclxuICAgIH0sIFtcclxuICAgICAgICBlZGl0b3JJbnN0YW5jZUtleSxcclxuICAgICAgICBoaWdobGlnaHRTdG9yYWdlS2V5LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICByZXBocmFzZUhpZ2hsaWdodENvdW50LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb24gPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChhY2NlcHRlZFN1Z2dlc3Rpb24gJiZcclxuICAgICAgICAgICAgIWFjY2VwdGVkU3VnZ2VzdGlvbi5lZGl0ZWRFdmVudEVtaXR0ZWQgJiZcclxuICAgICAgICAgICAgdGV4dCAhPT0gYWNjZXB0ZWRTdWdnZXN0aW9uLmFjY2VwdGVkVGV4dCkge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhY2NlcHRlZFN1Z2dlc3Rpb24pLCB7IGVkaXRlZEV2ZW50RW1pdHRlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX3N1Z2dlc3Rpb25fZWRpdGVkJywge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSA9IChhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IG51bGwgfHwgYWNjZXB0ZWRTdWdnZXN0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB8fFxyXG4gICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgIGlmIChiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSAmJiB0ZXh0ICE9PSBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSkge1xyXG4gICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGF0ZXN0QmFzZWxpbmUgPSAobGF0ZXN0ID09PSBudWxsIHx8IGxhdGVzdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGF0ZXN0LmFjY2VwdGVkVGV4dCkgfHxcclxuICAgICAgICAgICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBpZiAodGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjb21wdXRlUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uUG9zdEVkaXQoe1xyXG4gICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogdGV4dCxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uVG9BcHBseSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRBSUV2ZW50KCdhaV9pbnN0cnVjdGlvbl91c2VkJywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uX3RleHQ6IGFub255bWl6ZUluc3RydWN0aW9uVGV4dChpbnN0cnVjdGlvblRvQXBwbHkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSldIH0pKTtcclxufSk7XHJcbldoYXRzQXBwVGV4dEVkaXRvci5kaXNwbGF5TmFtZSA9ICdXaGF0c0FwcFRleHRFZGl0b3InO1xyXG5leHBvcnQgeyBBSV9UQUdfQ0hBTkdFX1JBVElPX1RIUkVTSE9MRCwgY29tcHV0ZUFpVGFnT25BY2NlcHQsIGxldmVuc2h0ZWluRGlzdGFuY2UsIH0gZnJvbSAnLi9haS9haVRhZyc7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdoYXRzQXBwVGV4dEVkaXRvci5qcy5tYXAiXX0= */")),o=a.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/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGlucHV0VmFsdWUsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQobnVsbCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoW10pO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShudWxsKTtcclxuICAgICAgICBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUoe30pO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VIaWdobGlnaHRDb3VudCA+PSBNQVhfUkVQSFJBU0VfSElHSExJR0hUUykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG5leHRDb3VudCA9IHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgKyAxO1xyXG4gICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQobmV4dENvdW50KTtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShoaWdobGlnaHRTdG9yYWdlS2V5LCBTdHJpbmcobmV4dENvdW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZCh0cnVlKTtcclxuICAgICAgICBpZiAoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICB9LCAxMjAwKTtcclxuICAgIH0sIFtcclxuICAgICAgICBlZGl0b3JJbnN0YW5jZUtleSxcclxuICAgICAgICBoaWdobGlnaHRTdG9yYWdlS2V5LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICByZXBocmFzZUhpZ2hsaWdodENvdW50LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb24gPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChhY2NlcHRlZFN1Z2dlc3Rpb24gJiZcclxuICAgICAgICAgICAgIWFjY2VwdGVkU3VnZ2VzdGlvbi5lZGl0ZWRFdmVudEVtaXR0ZWQgJiZcclxuICAgICAgICAgICAgdGV4dCAhPT0gYWNjZXB0ZWRTdWdnZXN0aW9uLmFjY2VwdGVkVGV4dCkge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhY2NlcHRlZFN1Z2dlc3Rpb24pLCB7IGVkaXRlZEV2ZW50RW1pdHRlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX3N1Z2dlc3Rpb25fZWRpdGVkJywge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSA9IChhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IG51bGwgfHwgYWNjZXB0ZWRTdWdnZXN0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB8fFxyXG4gICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgIGlmIChiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSAmJiB0ZXh0ICE9PSBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSkge1xyXG4gICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGF0ZXN0QmFzZWxpbmUgPSAobGF0ZXN0ID09PSBudWxsIHx8IGxhdGVzdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGF0ZXN0LmFjY2VwdGVkVGV4dCkgfHxcclxuICAgICAgICAgICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBpZiAodGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjb21wdXRlUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uUG9zdEVkaXQoe1xyXG4gICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogdGV4dCxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uVG9BcHBseSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRBSUV2ZW50KCdhaV9pbnN0cnVjdGlvbl91c2VkJywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uX3RleHQ6IGFub255bWl6ZUluc3RydWN0aW9uVGV4dChpbnN0cnVjdGlvblRvQXBwbHkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSldIH0pKTtcclxufSk7XHJcbldoYXRzQXBwVGV4dEVkaXRvci5kaXNwbGF5TmFtZSA9ICdXaGF0c0FwcFRleHRFZGl0b3InO1xyXG5leHBvcnQgeyBBSV9UQUdfQ0hBTkdFX1JBVElPX1RIUkVTSE9MRCwgY29tcHV0ZUFpVGFnT25BY2NlcHQsIGxldmVuc2h0ZWluRGlzdGFuY2UsIH0gZnJvbSAnLi9haS9haVRhZyc7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdoYXRzQXBwVGV4dEVkaXRvci5qcy5tYXAiXX0= */")),t=a.default(o,"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/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGlucHV0VmFsdWUsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQobnVsbCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoW10pO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShudWxsKTtcclxuICAgICAgICBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUoe30pO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VIaWdobGlnaHRDb3VudCA+PSBNQVhfUkVQSFJBU0VfSElHSExJR0hUUykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG5leHRDb3VudCA9IHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgKyAxO1xyXG4gICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQobmV4dENvdW50KTtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShoaWdobGlnaHRTdG9yYWdlS2V5LCBTdHJpbmcobmV4dENvdW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZCh0cnVlKTtcclxuICAgICAgICBpZiAoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICB9LCAxMjAwKTtcclxuICAgIH0sIFtcclxuICAgICAgICBlZGl0b3JJbnN0YW5jZUtleSxcclxuICAgICAgICBoaWdobGlnaHRTdG9yYWdlS2V5LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICByZXBocmFzZUhpZ2hsaWdodENvdW50LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb24gPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChhY2NlcHRlZFN1Z2dlc3Rpb24gJiZcclxuICAgICAgICAgICAgIWFjY2VwdGVkU3VnZ2VzdGlvbi5lZGl0ZWRFdmVudEVtaXR0ZWQgJiZcclxuICAgICAgICAgICAgdGV4dCAhPT0gYWNjZXB0ZWRTdWdnZXN0aW9uLmFjY2VwdGVkVGV4dCkge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhY2NlcHRlZFN1Z2dlc3Rpb24pLCB7IGVkaXRlZEV2ZW50RW1pdHRlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX3N1Z2dlc3Rpb25fZWRpdGVkJywge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSA9IChhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IG51bGwgfHwgYWNjZXB0ZWRTdWdnZXN0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB8fFxyXG4gICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgIGlmIChiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSAmJiB0ZXh0ICE9PSBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSkge1xyXG4gICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGF0ZXN0QmFzZWxpbmUgPSAobGF0ZXN0ID09PSBudWxsIHx8IGxhdGVzdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGF0ZXN0LmFjY2VwdGVkVGV4dCkgfHxcclxuICAgICAgICAgICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBpZiAodGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjb21wdXRlUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uUG9zdEVkaXQoe1xyXG4gICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogdGV4dCxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uVG9BcHBseSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRBSUV2ZW50KCdhaV9pbnN0cnVjdGlvbl91c2VkJywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uX3RleHQ6IGFub255bWl6ZUluc3RydWN0aW9uVGV4dChpbnN0cnVjdGlvblRvQXBwbHkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSldIH0pKTtcclxufSk7XHJcbldoYXRzQXBwVGV4dEVkaXRvci5kaXNwbGF5TmFtZSA9ICdXaGF0c0FwcFRleHRFZGl0b3InO1xyXG5leHBvcnQgeyBBSV9UQUdfQ0hBTkdFX1JBVElPX1RIUkVTSE9MRCwgY29tcHV0ZUFpVGFnT25BY2NlcHQsIGxldmVuc2h0ZWluRGlzdGFuY2UsIH0gZnJvbSAnLi9haS9haVRhZyc7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdoYXRzQXBwVGV4dEVkaXRvci5qcy5tYXAiXX0= */",toString:p}),j=a.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/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGlucHV0VmFsdWUsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQobnVsbCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoW10pO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShudWxsKTtcclxuICAgICAgICBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUoe30pO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VIaWdobGlnaHRDb3VudCA+PSBNQVhfUkVQSFJBU0VfSElHSExJR0hUUykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG5leHRDb3VudCA9IHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgKyAxO1xyXG4gICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQobmV4dENvdW50KTtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShoaWdobGlnaHRTdG9yYWdlS2V5LCBTdHJpbmcobmV4dENvdW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZCh0cnVlKTtcclxuICAgICAgICBpZiAoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICB9LCAxMjAwKTtcclxuICAgIH0sIFtcclxuICAgICAgICBlZGl0b3JJbnN0YW5jZUtleSxcclxuICAgICAgICBoaWdobGlnaHRTdG9yYWdlS2V5LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICByZXBocmFzZUhpZ2hsaWdodENvdW50LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb24gPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChhY2NlcHRlZFN1Z2dlc3Rpb24gJiZcclxuICAgICAgICAgICAgIWFjY2VwdGVkU3VnZ2VzdGlvbi5lZGl0ZWRFdmVudEVtaXR0ZWQgJiZcclxuICAgICAgICAgICAgdGV4dCAhPT0gYWNjZXB0ZWRTdWdnZXN0aW9uLmFjY2VwdGVkVGV4dCkge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhY2NlcHRlZFN1Z2dlc3Rpb24pLCB7IGVkaXRlZEV2ZW50RW1pdHRlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX3N1Z2dlc3Rpb25fZWRpdGVkJywge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSA9IChhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IG51bGwgfHwgYWNjZXB0ZWRTdWdnZXN0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB8fFxyXG4gICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgIGlmIChiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSAmJiB0ZXh0ICE9PSBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSkge1xyXG4gICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGF0ZXN0QmFzZWxpbmUgPSAobGF0ZXN0ID09PSBudWxsIHx8IGxhdGVzdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGF0ZXN0LmFjY2VwdGVkVGV4dCkgfHxcclxuICAgICAgICAgICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBpZiAodGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjb21wdXRlUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uUG9zdEVkaXQoe1xyXG4gICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogdGV4dCxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uVG9BcHBseSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRBSUV2ZW50KCdhaV9pbnN0cnVjdGlvbl91c2VkJywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uX3RleHQ6IGFub255bWl6ZUluc3RydWN0aW9uVGV4dChpbnN0cnVjdGlvblRvQXBwbHkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSldIH0pKTtcclxufSk7XHJcbldoYXRzQXBwVGV4dEVkaXRvci5kaXNwbGF5TmFtZSA9ICdXaGF0c0FwcFRleHRFZGl0b3InO1xyXG5leHBvcnQgeyBBSV9UQUdfQ0hBTkdFX1JBVElPX1RIUkVTSE9MRCwgY29tcHV0ZUFpVGFnT25BY2NlcHQsIGxldmVuc2h0ZWluRGlzdGFuY2UsIH0gZnJvbSAnLi9haS9haVRhZyc7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdoYXRzQXBwVGV4dEVkaXRvci5qcy5tYXAiXX0= */")),T=a.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/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGlucHV0VmFsdWUsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQobnVsbCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoW10pO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShudWxsKTtcclxuICAgICAgICBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUoe30pO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VIaWdobGlnaHRDb3VudCA+PSBNQVhfUkVQSFJBU0VfSElHSExJR0hUUykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG5leHRDb3VudCA9IHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgKyAxO1xyXG4gICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQobmV4dENvdW50KTtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShoaWdobGlnaHRTdG9yYWdlS2V5LCBTdHJpbmcobmV4dENvdW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZCh0cnVlKTtcclxuICAgICAgICBpZiAoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICB9LCAxMjAwKTtcclxuICAgIH0sIFtcclxuICAgICAgICBlZGl0b3JJbnN0YW5jZUtleSxcclxuICAgICAgICBoaWdobGlnaHRTdG9yYWdlS2V5LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICByZXBocmFzZUhpZ2hsaWdodENvdW50LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb24gPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChhY2NlcHRlZFN1Z2dlc3Rpb24gJiZcclxuICAgICAgICAgICAgIWFjY2VwdGVkU3VnZ2VzdGlvbi5lZGl0ZWRFdmVudEVtaXR0ZWQgJiZcclxuICAgICAgICAgICAgdGV4dCAhPT0gYWNjZXB0ZWRTdWdnZXN0aW9uLmFjY2VwdGVkVGV4dCkge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhY2NlcHRlZFN1Z2dlc3Rpb24pLCB7IGVkaXRlZEV2ZW50RW1pdHRlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX3N1Z2dlc3Rpb25fZWRpdGVkJywge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSA9IChhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IG51bGwgfHwgYWNjZXB0ZWRTdWdnZXN0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB8fFxyXG4gICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgIGlmIChiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSAmJiB0ZXh0ICE9PSBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSkge1xyXG4gICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGF0ZXN0QmFzZWxpbmUgPSAobGF0ZXN0ID09PSBudWxsIHx8IGxhdGVzdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGF0ZXN0LmFjY2VwdGVkVGV4dCkgfHxcclxuICAgICAgICAgICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBpZiAodGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjb21wdXRlUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uUG9zdEVkaXQoe1xyXG4gICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogdGV4dCxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uVG9BcHBseSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRBSUV2ZW50KCdhaV9pbnN0cnVjdGlvbl91c2VkJywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uX3RleHQ6IGFub255bWl6ZUluc3RydWN0aW9uVGV4dChpbnN0cnVjdGlvblRvQXBwbHkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSldIH0pKTtcclxufSk7XHJcbldoYXRzQXBwVGV4dEVkaXRvci5kaXNwbGF5TmFtZSA9ICdXaGF0c0FwcFRleHRFZGl0b3InO1xyXG5leHBvcnQgeyBBSV9UQUdfQ0hBTkdFX1JBVElPX1RIUkVTSE9MRCwgY29tcHV0ZUFpVGFnT25BY2NlcHQsIGxldmVuc2h0ZWluRGlzdGFuY2UsIH0gZnJvbSAnLi9haS9haVRhZyc7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdoYXRzQXBwVGV4dEVkaXRvci5qcy5tYXAiXX0= */")),L=a.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/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGlucHV0VmFsdWUsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQobnVsbCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoW10pO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShudWxsKTtcclxuICAgICAgICBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUoe30pO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VIaWdobGlnaHRDb3VudCA+PSBNQVhfUkVQSFJBU0VfSElHSExJR0hUUykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG5leHRDb3VudCA9IHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgKyAxO1xyXG4gICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQobmV4dENvdW50KTtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShoaWdobGlnaHRTdG9yYWdlS2V5LCBTdHJpbmcobmV4dENvdW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZCh0cnVlKTtcclxuICAgICAgICBpZiAoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICB9LCAxMjAwKTtcclxuICAgIH0sIFtcclxuICAgICAgICBlZGl0b3JJbnN0YW5jZUtleSxcclxuICAgICAgICBoaWdobGlnaHRTdG9yYWdlS2V5LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICByZXBocmFzZUhpZ2hsaWdodENvdW50LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb24gPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChhY2NlcHRlZFN1Z2dlc3Rpb24gJiZcclxuICAgICAgICAgICAgIWFjY2VwdGVkU3VnZ2VzdGlvbi5lZGl0ZWRFdmVudEVtaXR0ZWQgJiZcclxuICAgICAgICAgICAgdGV4dCAhPT0gYWNjZXB0ZWRTdWdnZXN0aW9uLmFjY2VwdGVkVGV4dCkge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhY2NlcHRlZFN1Z2dlc3Rpb24pLCB7IGVkaXRlZEV2ZW50RW1pdHRlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX3N1Z2dlc3Rpb25fZWRpdGVkJywge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSA9IChhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IG51bGwgfHwgYWNjZXB0ZWRTdWdnZXN0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB8fFxyXG4gICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgIGlmIChiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSAmJiB0ZXh0ICE9PSBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSkge1xyXG4gICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGF0ZXN0QmFzZWxpbmUgPSAobGF0ZXN0ID09PSBudWxsIHx8IGxhdGVzdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGF0ZXN0LmFjY2VwdGVkVGV4dCkgfHxcclxuICAgICAgICAgICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBpZiAodGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjb21wdXRlUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uUG9zdEVkaXQoe1xyXG4gICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogdGV4dCxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uVG9BcHBseSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRBSUV2ZW50KCdhaV9pbnN0cnVjdGlvbl91c2VkJywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uX3RleHQ6IGFub255bWl6ZUluc3RydWN0aW9uVGV4dChpbnN0cnVjdGlvblRvQXBwbHkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSldIH0pKTtcclxufSk7XHJcbldoYXRzQXBwVGV4dEVkaXRvci5kaXNwbGF5TmFtZSA9ICdXaGF0c0FwcFRleHRFZGl0b3InO1xyXG5leHBvcnQgeyBBSV9UQUdfQ0hBTkdFX1JBVElPX1RIUkVTSE9MRCwgY29tcHV0ZUFpVGFnT25BY2NlcHQsIGxldmVuc2h0ZWluRGlzdGFuY2UsIH0gZnJvbSAnLi9haS9haVRhZyc7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdoYXRzQXBwVGV4dEVkaXRvci5qcy5tYXAiXX0= */")),D=a.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/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGlucHV0VmFsdWUsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQobnVsbCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoW10pO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShudWxsKTtcclxuICAgICAgICBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUoe30pO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VIaWdobGlnaHRDb3VudCA+PSBNQVhfUkVQSFJBU0VfSElHSExJR0hUUykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG5leHRDb3VudCA9IHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgKyAxO1xyXG4gICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQobmV4dENvdW50KTtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShoaWdobGlnaHRTdG9yYWdlS2V5LCBTdHJpbmcobmV4dENvdW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZCh0cnVlKTtcclxuICAgICAgICBpZiAoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICB9LCAxMjAwKTtcclxuICAgIH0sIFtcclxuICAgICAgICBlZGl0b3JJbnN0YW5jZUtleSxcclxuICAgICAgICBoaWdobGlnaHRTdG9yYWdlS2V5LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICByZXBocmFzZUhpZ2hsaWdodENvdW50LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb24gPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChhY2NlcHRlZFN1Z2dlc3Rpb24gJiZcclxuICAgICAgICAgICAgIWFjY2VwdGVkU3VnZ2VzdGlvbi5lZGl0ZWRFdmVudEVtaXR0ZWQgJiZcclxuICAgICAgICAgICAgdGV4dCAhPT0gYWNjZXB0ZWRTdWdnZXN0aW9uLmFjY2VwdGVkVGV4dCkge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhY2NlcHRlZFN1Z2dlc3Rpb24pLCB7IGVkaXRlZEV2ZW50RW1pdHRlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX3N1Z2dlc3Rpb25fZWRpdGVkJywge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSA9IChhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IG51bGwgfHwgYWNjZXB0ZWRTdWdnZXN0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB8fFxyXG4gICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgIGlmIChiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSAmJiB0ZXh0ICE9PSBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSkge1xyXG4gICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGF0ZXN0QmFzZWxpbmUgPSAobGF0ZXN0ID09PSBudWxsIHx8IGxhdGVzdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGF0ZXN0LmFjY2VwdGVkVGV4dCkgfHxcclxuICAgICAgICAgICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBpZiAodGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjb21wdXRlUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uUG9zdEVkaXQoe1xyXG4gICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogdGV4dCxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uVG9BcHBseSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRBSUV2ZW50KCdhaV9pbnN0cnVjdGlvbl91c2VkJywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uX3RleHQ6IGFub255bWl6ZUluc3RydWN0aW9uVGV4dChpbnN0cnVjdGlvblRvQXBwbHkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSldIH0pKTtcclxufSk7XHJcbldoYXRzQXBwVGV4dEVkaXRvci5kaXNwbGF5TmFtZSA9ICdXaGF0c0FwcFRleHRFZGl0b3InO1xyXG5leHBvcnQgeyBBSV9UQUdfQ0hBTkdFX1JBVElPX1RIUkVTSE9MRCwgY29tcHV0ZUFpVGFnT25BY2NlcHQsIGxldmVuc2h0ZWluRGlzdGFuY2UsIH0gZnJvbSAnLi9haS9haVRhZyc7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdoYXRzQXBwVGV4dEVkaXRvci5qcy5tYXAiXX0= */")),e=a.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/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGlucHV0VmFsdWUsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQobnVsbCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoW10pO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShudWxsKTtcclxuICAgICAgICBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUoe30pO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VIaWdobGlnaHRDb3VudCA+PSBNQVhfUkVQSFJBU0VfSElHSExJR0hUUykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG5leHRDb3VudCA9IHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgKyAxO1xyXG4gICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQobmV4dENvdW50KTtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShoaWdobGlnaHRTdG9yYWdlS2V5LCBTdHJpbmcobmV4dENvdW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZCh0cnVlKTtcclxuICAgICAgICBpZiAoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICB9LCAxMjAwKTtcclxuICAgIH0sIFtcclxuICAgICAgICBlZGl0b3JJbnN0YW5jZUtleSxcclxuICAgICAgICBoaWdobGlnaHRTdG9yYWdlS2V5LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICByZXBocmFzZUhpZ2hsaWdodENvdW50LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb24gPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChhY2NlcHRlZFN1Z2dlc3Rpb24gJiZcclxuICAgICAgICAgICAgIWFjY2VwdGVkU3VnZ2VzdGlvbi5lZGl0ZWRFdmVudEVtaXR0ZWQgJiZcclxuICAgICAgICAgICAgdGV4dCAhPT0gYWNjZXB0ZWRTdWdnZXN0aW9uLmFjY2VwdGVkVGV4dCkge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhY2NlcHRlZFN1Z2dlc3Rpb24pLCB7IGVkaXRlZEV2ZW50RW1pdHRlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX3N1Z2dlc3Rpb25fZWRpdGVkJywge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSA9IChhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IG51bGwgfHwgYWNjZXB0ZWRTdWdnZXN0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB8fFxyXG4gICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgIGlmIChiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSAmJiB0ZXh0ICE9PSBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSkge1xyXG4gICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGF0ZXN0QmFzZWxpbmUgPSAobGF0ZXN0ID09PSBudWxsIHx8IGxhdGVzdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGF0ZXN0LmFjY2VwdGVkVGV4dCkgfHxcclxuICAgICAgICAgICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBpZiAodGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjb21wdXRlUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uUG9zdEVkaXQoe1xyXG4gICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogdGV4dCxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uVG9BcHBseSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRBSUV2ZW50KCdhaV9pbnN0cnVjdGlvbl91c2VkJywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uX3RleHQ6IGFub255bWl6ZUluc3RydWN0aW9uVGV4dChpbnN0cnVjdGlvblRvQXBwbHkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSldIH0pKTtcclxufSk7XHJcbldoYXRzQXBwVGV4dEVkaXRvci5kaXNwbGF5TmFtZSA9ICdXaGF0c0FwcFRleHRFZGl0b3InO1xyXG5leHBvcnQgeyBBSV9UQUdfQ0hBTkdFX1JBVElPX1RIUkVTSE9MRCwgY29tcHV0ZUFpVGFnT25BY2NlcHQsIGxldmVuc2h0ZWluRGlzdGFuY2UsIH0gZnJvbSAnLi9haS9haVRhZyc7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdoYXRzQXBwVGV4dEVkaXRvci5qcy5tYXAiXX0= */",toString:p}),K=a.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/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGlucHV0VmFsdWUsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQobnVsbCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoW10pO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShudWxsKTtcclxuICAgICAgICBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUoe30pO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VIaWdobGlnaHRDb3VudCA+PSBNQVhfUkVQSFJBU0VfSElHSExJR0hUUykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG5leHRDb3VudCA9IHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgKyAxO1xyXG4gICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQobmV4dENvdW50KTtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShoaWdobGlnaHRTdG9yYWdlS2V5LCBTdHJpbmcobmV4dENvdW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZCh0cnVlKTtcclxuICAgICAgICBpZiAoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICB9LCAxMjAwKTtcclxuICAgIH0sIFtcclxuICAgICAgICBlZGl0b3JJbnN0YW5jZUtleSxcclxuICAgICAgICBoaWdobGlnaHRTdG9yYWdlS2V5LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICByZXBocmFzZUhpZ2hsaWdodENvdW50LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb24gPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChhY2NlcHRlZFN1Z2dlc3Rpb24gJiZcclxuICAgICAgICAgICAgIWFjY2VwdGVkU3VnZ2VzdGlvbi5lZGl0ZWRFdmVudEVtaXR0ZWQgJiZcclxuICAgICAgICAgICAgdGV4dCAhPT0gYWNjZXB0ZWRTdWdnZXN0aW9uLmFjY2VwdGVkVGV4dCkge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhY2NlcHRlZFN1Z2dlc3Rpb24pLCB7IGVkaXRlZEV2ZW50RW1pdHRlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX3N1Z2dlc3Rpb25fZWRpdGVkJywge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSA9IChhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IG51bGwgfHwgYWNjZXB0ZWRTdWdnZXN0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB8fFxyXG4gICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgIGlmIChiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSAmJiB0ZXh0ICE9PSBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSkge1xyXG4gICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGF0ZXN0QmFzZWxpbmUgPSAobGF0ZXN0ID09PSBudWxsIHx8IGxhdGVzdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGF0ZXN0LmFjY2VwdGVkVGV4dCkgfHxcclxuICAgICAgICAgICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBpZiAodGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjb21wdXRlUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uUG9zdEVkaXQoe1xyXG4gICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogdGV4dCxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uVG9BcHBseSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRBSUV2ZW50KCdhaV9pbnN0cnVjdGlvbl91c2VkJywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uX3RleHQ6IGFub255bWl6ZUluc3RydWN0aW9uVGV4dChpbnN0cnVjdGlvblRvQXBwbHkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSldIH0pKTtcclxufSk7XHJcbldoYXRzQXBwVGV4dEVkaXRvci5kaXNwbGF5TmFtZSA9ICdXaGF0c0FwcFRleHRFZGl0b3InO1xyXG5leHBvcnQgeyBBSV9UQUdfQ0hBTkdFX1JBVElPX1RIUkVTSE9MRCwgY29tcHV0ZUFpVGFnT25BY2NlcHQsIGxldmVuc2h0ZWluRGlzdGFuY2UsIH0gZnJvbSAnLi9haS9haVRhZyc7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdoYXRzQXBwVGV4dEVkaXRvci5qcy5tYXAiXX0= */")),O=a.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/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGlucHV0VmFsdWUsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQobnVsbCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoW10pO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShudWxsKTtcclxuICAgICAgICBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUoe30pO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VIaWdobGlnaHRDb3VudCA+PSBNQVhfUkVQSFJBU0VfSElHSExJR0hUUykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG5leHRDb3VudCA9IHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgKyAxO1xyXG4gICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQobmV4dENvdW50KTtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShoaWdobGlnaHRTdG9yYWdlS2V5LCBTdHJpbmcobmV4dENvdW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZCh0cnVlKTtcclxuICAgICAgICBpZiAoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICB9LCAxMjAwKTtcclxuICAgIH0sIFtcclxuICAgICAgICBlZGl0b3JJbnN0YW5jZUtleSxcclxuICAgICAgICBoaWdobGlnaHRTdG9yYWdlS2V5LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICByZXBocmFzZUhpZ2hsaWdodENvdW50LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb24gPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChhY2NlcHRlZFN1Z2dlc3Rpb24gJiZcclxuICAgICAgICAgICAgIWFjY2VwdGVkU3VnZ2VzdGlvbi5lZGl0ZWRFdmVudEVtaXR0ZWQgJiZcclxuICAgICAgICAgICAgdGV4dCAhPT0gYWNjZXB0ZWRTdWdnZXN0aW9uLmFjY2VwdGVkVGV4dCkge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhY2NlcHRlZFN1Z2dlc3Rpb24pLCB7IGVkaXRlZEV2ZW50RW1pdHRlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX3N1Z2dlc3Rpb25fZWRpdGVkJywge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSA9IChhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IG51bGwgfHwgYWNjZXB0ZWRTdWdnZXN0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB8fFxyXG4gICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgIGlmIChiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSAmJiB0ZXh0ICE9PSBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSkge1xyXG4gICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGF0ZXN0QmFzZWxpbmUgPSAobGF0ZXN0ID09PSBudWxsIHx8IGxhdGVzdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGF0ZXN0LmFjY2VwdGVkVGV4dCkgfHxcclxuICAgICAgICAgICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBpZiAodGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjb21wdXRlUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uUG9zdEVkaXQoe1xyXG4gICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogdGV4dCxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uVG9BcHBseSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRBSUV2ZW50KCdhaV9pbnN0cnVjdGlvbl91c2VkJywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uX3RleHQ6IGFub255bWl6ZUluc3RydWN0aW9uVGV4dChpbnN0cnVjdGlvblRvQXBwbHkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSldIH0pKTtcclxufSk7XHJcbldoYXRzQXBwVGV4dEVkaXRvci5kaXNwbGF5TmFtZSA9ICdXaGF0c0FwcFRleHRFZGl0b3InO1xyXG5leHBvcnQgeyBBSV9UQUdfQ0hBTkdFX1JBVElPX1RIUkVTSE9MRCwgY29tcHV0ZUFpVGFnT25BY2NlcHQsIGxldmVuc2h0ZWluRGlzdGFuY2UsIH0gZnJvbSAnLi9haS9haVRhZyc7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdoYXRzQXBwVGV4dEVkaXRvci5qcy5tYXAiXX0= */")),E=a.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/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGlucHV0VmFsdWUsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQobnVsbCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoW10pO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShudWxsKTtcclxuICAgICAgICBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUoe30pO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VIaWdobGlnaHRDb3VudCA+PSBNQVhfUkVQSFJBU0VfSElHSExJR0hUUykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG5leHRDb3VudCA9IHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgKyAxO1xyXG4gICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQobmV4dENvdW50KTtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShoaWdobGlnaHRTdG9yYWdlS2V5LCBTdHJpbmcobmV4dENvdW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZCh0cnVlKTtcclxuICAgICAgICBpZiAoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICB9LCAxMjAwKTtcclxuICAgIH0sIFtcclxuICAgICAgICBlZGl0b3JJbnN0YW5jZUtleSxcclxuICAgICAgICBoaWdobGlnaHRTdG9yYWdlS2V5LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICByZXBocmFzZUhpZ2hsaWdodENvdW50LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb24gPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChhY2NlcHRlZFN1Z2dlc3Rpb24gJiZcclxuICAgICAgICAgICAgIWFjY2VwdGVkU3VnZ2VzdGlvbi5lZGl0ZWRFdmVudEVtaXR0ZWQgJiZcclxuICAgICAgICAgICAgdGV4dCAhPT0gYWNjZXB0ZWRTdWdnZXN0aW9uLmFjY2VwdGVkVGV4dCkge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhY2NlcHRlZFN1Z2dlc3Rpb24pLCB7IGVkaXRlZEV2ZW50RW1pdHRlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX3N1Z2dlc3Rpb25fZWRpdGVkJywge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSA9IChhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IG51bGwgfHwgYWNjZXB0ZWRTdWdnZXN0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB8fFxyXG4gICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgIGlmIChiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSAmJiB0ZXh0ICE9PSBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSkge1xyXG4gICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGF0ZXN0QmFzZWxpbmUgPSAobGF0ZXN0ID09PSBudWxsIHx8IGxhdGVzdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGF0ZXN0LmFjY2VwdGVkVGV4dCkgfHxcclxuICAgICAgICAgICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBpZiAodGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjb21wdXRlUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uUG9zdEVkaXQoe1xyXG4gICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogdGV4dCxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uVG9BcHBseSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRBSUV2ZW50KCdhaV9pbnN0cnVjdGlvbl91c2VkJywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uX3RleHQ6IGFub255bWl6ZUluc3RydWN0aW9uVGV4dChpbnN0cnVjdGlvblRvQXBwbHkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSldIH0pKTtcclxufSk7XHJcbldoYXRzQXBwVGV4dEVkaXRvci5kaXNwbGF5TmFtZSA9ICdXaGF0c0FwcFRleHRFZGl0b3InO1xyXG5leHBvcnQgeyBBSV9UQUdfQ0hBTkdFX1JBVElPX1RIUkVTSE9MRCwgY29tcHV0ZUFpVGFnT25BY2NlcHQsIGxldmVuc2h0ZWluRGlzdGFuY2UsIH0gZnJvbSAnLi9haS9haVRhZyc7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdoYXRzQXBwVGV4dEVkaXRvci5qcy5tYXAiXX0= */")),P=a.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/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGlucHV0VmFsdWUsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQmFzZVRleHQobnVsbCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkNhbmRpZGF0ZXMoW10pO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShudWxsKTtcclxuICAgICAgICBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUoe30pO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVwaHJhc2VIaWdobGlnaHRDb3VudCA+PSBNQVhfUkVQSFJBU0VfSElHSExJR0hUUykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG5leHRDb3VudCA9IHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgKyAxO1xyXG4gICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQobmV4dENvdW50KTtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShoaWdobGlnaHRTdG9yYWdlS2V5LCBTdHJpbmcobmV4dENvdW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldElzUmVwaHJhc2VIaWdobGlnaHRlZCh0cnVlKTtcclxuICAgICAgICBpZiAoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICB9LCAxMjAwKTtcclxuICAgIH0sIFtcclxuICAgICAgICBlZGl0b3JJbnN0YW5jZUtleSxcclxuICAgICAgICBoaWdobGlnaHRTdG9yYWdlS2V5LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICByZXBocmFzZUhpZ2hsaWdodENvdW50LFxyXG4gICAgXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb24gPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChhY2NlcHRlZFN1Z2dlc3Rpb24gJiZcclxuICAgICAgICAgICAgIWFjY2VwdGVkU3VnZ2VzdGlvbi5lZGl0ZWRFdmVudEVtaXR0ZWQgJiZcclxuICAgICAgICAgICAgdGV4dCAhPT0gYWNjZXB0ZWRTdWdnZXN0aW9uLmFjY2VwdGVkVGV4dCkge1xyXG4gICAgICAgICAgICBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhY2NlcHRlZFN1Z2dlc3Rpb24pLCB7IGVkaXRlZEV2ZW50RW1pdHRlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX3N1Z2dlc3Rpb25fZWRpdGVkJywge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSA9IChhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IG51bGwgfHwgYWNjZXB0ZWRTdWdnZXN0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB8fFxyXG4gICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgIGlmIChiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSAmJiB0ZXh0ICE9PSBiYXNlbGluZUFpVGV4dEZvclJlY29tcHV0ZSkge1xyXG4gICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGF0ZXN0QmFzZWxpbmUgPSAobGF0ZXN0ID09PSBudWxsIHx8IGxhdGVzdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGF0ZXN0LmFjY2VwdGVkVGV4dCkgfHxcclxuICAgICAgICAgICAgICAgICAgICAocHJlZmlsbFdhc0FpR2VuZXJhdGVkID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IDogJycpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBpZiAodGV4dCA9PT0gbGF0ZXN0QmFzZWxpbmUpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjb21wdXRlUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uUG9zdEVkaXQoe1xyXG4gICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkQWlUZXh0OiBsYXRlc3RCYXNlbGluZSxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogdGV4dCxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uVG9BcHBseSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRBSUV2ZW50KCdhaV9pbnN0cnVjdGlvbl91c2VkJywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVfaWQ6IHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uX3RleHQ6IGFub255bWl6ZUluc3RydWN0aW9uVGV4dChpbnN0cnVjdGlvblRvQXBwbHkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSldIH0pKTtcclxufSk7XHJcbldoYXRzQXBwVGV4dEVkaXRvci5kaXNwbGF5TmFtZSA9ICdXaGF0c0FwcFRleHRFZGl0b3InO1xyXG5leHBvcnQgeyBBSV9UQUdfQ0hBTkdFX1JBVElPX1RIUkVTSE9MRCwgY29tcHV0ZUFpVGFnT25BY2NlcHQsIGxldmVuc2h0ZWluRGlzdGFuY2UsIH0gZnJvbSAnLi9haS9haVRhZyc7XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdoYXRzQXBwVGV4dEVkaXRvci5qcy5tYXAiXX0= */"));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=h.default.forwardRef(((I,A)=>{var{onChange:R,onClickVariable:y,text:a,RightComponent:h,error:p,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:uI,aiActionMinChars:mI,instructionSuggestions:JI=J.DEFAULT_INSTRUCTION_SUGGESTIONS,onAnalyticsEvent:NI,onAITagComputed:xI,prefillWasAiGenerated:YI=!1,editorHeader:FI,onAIToneSelect:yI,onAIActionRequest:aI,onBuildAIPrompt:hI}=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"]);const iI=H.useRef(null),[nI,SI]=H.useState(a||""),[kI,UI]=H.useState(!1),[vI,zI]=H.useState(0),[sI,wI]=H.useState(!1),[QI,oI]=H.useState(!1),[tI,jI]=H.useState(""),[TI,LI]=H.useState({}),[DI,eI]=H.useState(null),[KI,OI]=H.useState([]),[EI,PI]=H.useState(0),[fI,MI]=H.useState(null),rI=H.useRef(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(!!YI),lg=H.useRef(null),cg=H.useRef(a||""),[bg,Zg]=H.useState({}),Gg=H.useRef(`mount-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`),Xg=H.useMemo((()=>function(I){return`whatsapp-editor-rephrase-highlight-${I||"default"}`}(`${II||"default"}-${gI||Gg.current}`)),[II,gI]);H.useEffect((()=>{Ag.current=!!YI}),[YI,II]),H.useEffect((()=>{cg.current=YI&&a||""}),[YI,a,II]);const dg=H.useMemo((()=>J.resolveActionPrompts(CI,BI,uI)),[BI,uI,CI]),Vg=H.useMemo((()=>{const I=tI.trim().toLowerCase();return I?JI.filter((g=>g.toLowerCase().includes(I))):[]}),[JI,tI]),Wg=H.useMemo((()=>Object.assign(Object.assign({},J.DEFAULT_AI_ACTION_MIN_CHARS),mI||{})),[mI]),Rg=Wg[F.AIEditorActionTypes.REPHRASE]||J.DEFAULT_AI_ACTION_MIN_CHARS[F.AIEditorActionTypes.REPHRASE],Hg=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}]`}),[]),Bg=H.useCallback(((I,g)=>{null==NI||NI(I,g)}),[NI]),ug=H.useCallback((I=>{SI((g=>g===I?g:I))}),[]),mg=H.useCallback((I=>{if(gg.current&&clearTimeout(gg.current),I.length>1200)return null==R||R(I,I),void(gg.current=setTimeout((()=>{null==R||R(I,M.getHTML(I))}),16));null==R||R(I,M.getHTML(I))}),[R]),Jg=H.useCallback((()=>{eI(null),OI([]),PI(0),MI(null),Zg({})}),[]),Ng=H.useCallback((()=>{if(sI)return;if(vI>=5)return;const I=vI+1;zI(I),"undefined"!=typeof window&&II&&sessionStorage.setItem(Xg,String(I)),UI(!0),_I.current&&clearTimeout(_I.current),_I.current=setTimeout((()=>{UI(!1)}),1200)}),[II,Xg,sI,vI]),xg=H.useRef(Ng);function Yg(I){const g=null==iI?void 0:iI.current;null!=g&&(g.selectionStart?(g.focus(),g.selectionEnd=I):g.focus())}function Fg(I){var g,C;let A=null!==(C=null===(g=iI.current)||void 0===g?void 0:g.value)&&void 0!==C?C:"";if(iI.current&&I){const g=iI.current.selectionStart,C=iI.current.selectionEnd,l=I;if(g===C)return yg(l);{A=M.wrappWildcard(g,C,l,A);const I=M.getHTML(A);return ug(A),{text:A,html:I}}}return{text:A,html:A}}function yg(I){var g,C;const A=null!==(C=null===(g=iI.current)||void 0===g?void 0:g.value)&&void 0!==C?C:"";if(iI.current&&I){const g=iI.current.selectionStart;if(g===iI.current.selectionEnd)return ag(I,g)}return{text:A,html:A}}function ag(I,g){var C,A;let l=null!==(A=null===(C=iI.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 ug(l),{text:l,html:c}}xg.current=Ng,H.useEffect((()=>{if("undefined"==typeof window||!II)return;const I=Number(sessionStorage.getItem(Xg)||"0");return Number.isNaN(I)||zI(I),()=>{sessionStorage.removeItem(Xg)}}),[II,Xg]),H.useEffect((()=>{if(sI)return UI(!1),void(qI.current&&(clearTimeout(qI.current),qI.current=null));const I=!!nI.trim()&&nI.length>=Rg;if(null===Ig.current)return Ig.current=I,void(I&&(qI.current=setTimeout((()=>{xg.current()}),3e3)));if(!I)return Ig.current=!1,UI(!1),void(qI.current&&(clearTimeout(qI.current),qI.current=null));const g=!Ig.current&&I;Ig.current=!0,g&&xg.current(),qI.current&&clearTimeout(qI.current),qI.current=setTimeout((()=>{xg.current()}),3e3)}),[nI,sI,Rg]),H.useEffect((()=>()=>{qI.current&&clearTimeout(qI.current),_I.current&&clearTimeout(_I.current),gg.current&&clearTimeout(gg.current),$I.current&&clearTimeout($I.current)}),[]);const hg=KI[EI]||"",pg=H.useMemo((()=>fI&&hg?`${fI}-${EI}-${hg}`:null),[hg,fI,EI]),ig=!(!pg||!bg[pg]),ng=H.useMemo((()=>M.getHTML(DI||"")),[DI]),Sg=H.useMemo((()=>M.getHTML(hg)),[hg]),kg=KI.length<3,Ug=!!DI&&KI.length>0,vg=KI.length<=1||EI<=0,zg=KI.length<=1||EI>=KI.length-1;H.useEffect((()=>{if(!Ug)return;const I=rI.current;I&&(I.scrollTop=I.scrollHeight)}),[hg,Ug,sI]);const sg=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(!(aI||XI||lI&&cI))return void(null==q||q("AI configuration missing"));if(!nI.trim())return;const b=Wg[I]||J.DEFAULT_AI_ACTION_MIN_CHARS[I]||50;if(nI.length<b)return;if(sI)return;if(C&&!kg)return;const Z=dg[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||TI[I],d=null===(g=G.tones)||void 0===g?void 0:g.find((I=>I.id===X)),V=void 0!==A?A:tI,W=(null==hI?void 0:hI({actionType:I,actionVariant:c,currentText:nI,templateType:CI,config:G,toneId:X,toneLabel:null==d?void 0:d.label,instructionText:V||void 0}))||x.buildActionPrompt({config:G,currentText:nI,selectedToneId:X,instructionText:V});wI(!0),Bg("ai_action_triggered",{action_type:I,template_id:AI,template_category:CI});try{const g=aI?yield aI({actionType:I,actionVariant:c,currentText:nI,templateType:CI,toneId:X,toneLabel:null==d?void 0:d.label,instructionText:V||void 0,prompt:W}):yield x.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 eI(nI),MI(I),OI([A]),void PI(0);OI((I=>{const g=[...I,A].slice(0,3);return PI(g.length-1),g}))}catch(I){null==q||q("Failed to generate AI suggestion")}finally{wI(!1)}}))}),[lI,cI,nI,sI,kg,dg,TI,tI,Bg,AI,bI,XI,WI,dI,VI,ZI,GI,CI,q,Wg,aI,hI]),wg=H.useCallback((()=>{if(!hg||!DI||!fI)return;ug(hg),mg(hg),Bg("ai_suggestion_accepted",{action_type:fI,template_id:AI}),lg.current={acceptedText:hg,baselineText:DI,actionType:fI,editedEventEmitted:!1};const I=Ag.current,g=N.computeAiTagOnAccept({baselineText:DI,acceptedText:hg,initialAiPrefillPhase:I});I&&(Ag.current=!1),null==xI||xI(Object.assign(Object.assign({},g),{source:"accept"})),Jg()}),[hg,DI,fI,ug,mg,Bg,AI,xI,Jg]),Qg=H.useCallback((()=>{fI&&(Bg("ai_suggestion_discarded",{action_type:fI,template_id:AI}),Jg())}),[Jg,Bg,fI,AI]),og=H.useCallback((I=>{fI&&pg&&(bg[pg]||(Zg((g=>Object.assign(Object.assign({},g),{[pg]:I}))),Bg("ai_feedback_submitted",{action_type:fI,template_id:AI,rating:I,candidate_index:EI+1})))}),[pg,Bg,bg,fI,EI,AI]),tg=H.useMemo((()=>HI?[]:RI.map((I=>{var g;const C=dg[I],A=TI[I];return{type:I,label:C.label,isPrimary:I===F.AIEditorActionTypes.REPHRASE,loading:sI&&fI===I,highlighted:I===F.AIEditorActionTypes.REPHRASE&&kI,disabled:!nI.trim()||nI.length<(Wg[I]||J.DEFAULT_AI_ACTION_MIN_CHARS[I]||50)||sI||Ug&&fI===I,showToneDropdown:I===F.AIEditorActionTypes.REPHRASE&&!!(null===(g=C.tones)||void 0===g?void 0:g.length),tones:C.tones,selectedToneId:A}}))),[RI,HI,dg,TI,sI,fI,Ug,kI,nI,Wg]);return H.useImperativeHandle(A,(()=>({addTextOrWrap:Fg,addText:yg,get:()=>nI,setCaretPosition:Yg})),[Fg,yg,nI]),H.useEffect((()=>{void 0!==a&&ug(a||"")}),[a,ug]),H.useEffect((()=>{if(!n||!q)return;const I=nI.length>n?i:null!=p?p:"";Cg.current!==I&&(Cg.current=I,q(I))}),[nI,p,n,q]),C.jsxs(Y.OuterContainer,{children:[C.jsxs(Y.EditorFooterRow,{children:[C.jsx(Y.EditorFooterTitle,{children:FI?C.jsx(m.TitleSmall,Object.assign({"data-test":"body-text-for-edit-template"},{children:FI})):null}),C.jsxs(Y.EditorFooterRight,{children:[p&&p!==i?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:p}))]}):null,n?C.jsxs(m.BodyCaption,Object.assign({style:{color:p===i||nI.length>n?B.COLORS.content.negative:B.COLORS.content.secondary}},{children:[nI.length,"/",n]})):null]})]}),C.jsxs(Y.Container,Object.assign({isError:!!p},{children:[Ug?C.jsxs(U,Object.assign({ref:rI},{children:[C.jsx(v,{dangerouslySetInnerHTML:{__html:ng}}),sI?C.jsx(z,Object.assign({"aria-busy":"true"},{children:C.jsxs(s,{children:[C.jsx(k,{width:"96%"}),C.jsx(k,{width:"84%"}),C.jsx(k,{width:"68%"})]})})):C.jsx(z,{dangerouslySetInnerHTML:{__html:Sg}}),C.jsxs(w,{children:[C.jsxs(Q,{children:[EI+1,"/",KI.length]}),C.jsx(o,Object.assign({"aria-label":"Previous suggestion",type:"button",disabled:vg,onClick:()=>PI((I=>Math.max(0,I-1)))},{children:C.jsx(c.default,{width:14,height:14})})),C.jsx(o,Object.assign({"aria-label":"Next suggestion",type:"button",disabled:zg,onClick:()=>PI((I=>Math.min(KI.length-1,I+1)))},{children:C.jsx(b.default,{width:14,height:14})})),C.jsx(u.Tooltip,Object.assign({body:"Like",placement:"top"},{children:C.jsx(o,Object.assign({"aria-label":"Like suggestion",type:"button",disabled:ig,onClick:()=>og(f.LIKE)},{children:C.jsx(W.default,{width:14,height:14})}))})),C.jsx(u.Tooltip,Object.assign({body:"Dislike",placement:"top"},{children:C.jsx(o,Object.assign({"aria-label":"Dislike suggestion",type:"button",disabled:ig,onClick:()=>og(f.DISLIKE)},{children:C.jsx(V.default,{width:14,height:14})}))})),kg?C.jsx(u.Tooltip,Object.assign({body:sI?"Regenerating…":"Regenerate",placement:"top"},{children:C.jsx(t,Object.assign({"aria-label":"Regenerate suggestion","aria-busy":sI,type:"button",disabled:sI,onClick:()=>{fI&&sg(fI,!0)}},{children:sI?C.jsx(j,{"aria-hidden":!0}):C.jsx(d.default,{width:14,height:14})}))})):null,C.jsx(u.Tooltip,Object.assign({body:"Discard",placement:"top"},{children:C.jsx(o,Object.assign({"aria-label":"Discard suggestion",type:"button",onClick:Qg},{children:C.jsx(Z.default,{width:14,height:14})}))})),C.jsx(u.Tooltip,Object.assign({body:"Accept",placement:"top"},{children:C.jsx(o,Object.assign({"aria-label":"Accept suggestion",type:"button",onClick:wg},{children:C.jsx(l.default,{width:14,height:14})}))}))]})]})):sI?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(Y.TextSpace,Object.assign({ref:iI},pI,{value:nI,onChange:function(I){const g=I.target.value,C=lg.current;C&&!C.editedEventEmitted&&g!==C.acceptedText&&(lg.current=Object.assign(Object.assign({},C),{editedEventEmitted:!0}),Bg("ai_suggestion_edited",{action_type:C.actionType,template_id:AI})),$I.current&&(clearTimeout($I.current),$I.current=null);const A=(null==C?void 0:C.acceptedText)||(YI?cg.current:"");A&&g!==A&&($I.current=setTimeout((()=>{const I=lg.current,C=(null==I?void 0:I.acceptedText)||(YI?cg.current:"");if(!C)return;if(g===C)return;const A=N.computeAiTagOnPostEdit({acceptedAiText:C,currentEditedText:g});null==xI||xI(Object.assign(Object.assign({},A),{source:"post_edit_debounce"}))}),1e3)),ug(g),mg(g)},onPaste:I=>{var g,C,A;const l=I.clipboardData.getData("text");if(l.length>1200){I.preventDefault();const c=iI.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:nI,X=G.slice(0,b)+l+G.slice(Z);ug(X),mg(X);const d=b+l.length;requestAnimationFrame((()=>{const I=iI.current;if(I)try{I.setSelectionRange(d,d)}catch(I){}}))}},rows:_})),QI?C.jsxs(T,{children:[C.jsxs(L,{children:[C.jsx(G.default,{width:18,height:18,color:B.COLORS.content.secondary}),C.jsx(D,{value:tI,placeholder:"Add specific instructions to refine your message",onChange:I=>jI(I.target.value)}),C.jsxs(e,{children:[C.jsx(K,Object.assign({type:"button",onClick:()=>{jI(""),oI(!1)}},{children:"Cancel"})),C.jsx(O,Object.assign({type:"button",onClick:()=>{const I=tI.trim();I&&Bg("ai_instruction_used",{action_type:F.AIEditorActionTypes.REPHRASE,template_id:AI,instruction_text:Hg(I)}),oI(!1),jI(""),sg(F.AIEditorActionTypes.REPHRASE,!1,I)}},{children:"Improve"}))]})]}),tI.trim().length>0&&Vg.length>0?C.jsx(E,{children:Vg.map((I=>C.jsx(P,Object.assign({type:"button",selected:tI===I,onClick:()=>jI(I)},{children:I}),I)))}):null]}):C.jsx(F.WhatsAppTextEditorHeader,{actions:$,ref:iI,onActionSelect:function(I){const g=r[I];if(g&&iI.current){const I=iI.current.selectionStart;if(I===iI.current.selectionEnd){const{text:C}=ag(g,I);Yg(I+1),mg(C)}else{const{text:I}=Fg(g);mg(I)}}},RightComponent:h,rightActionsDisabled:Ug||sI,onEmojiClick:function(I){const{text:g}=yg(I);mg(g)},aiActions:tg,disableAllActions:Ug||sI,instructionActive:QI,onAIInstructionsClick:()=>oI(!0),onAIToneChange:(I,g)=>{LI((C=>Object.assign(Object.assign({},C),{[I]:g}))),null==yI||yI(I,g),I===F.AIEditorActionTypes.REPHRASE&&sg(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(!sI){if(Ug){if(fI===I)return;return Jg(),void sg(I,!1,void 0,void 0,g)}sg(I,!1,void 0,void 0,g)}}})]}))]})}));q.displayName="WhatsAppTextEditor",exports.AI_TAG_CHANGE_RATIO_THRESHOLD=N.AI_TAG_CHANGE_RATIO_THRESHOLD,exports.computeAiTagOnAccept=N.computeAiTagOnAccept,exports.levenshteinDistance=N.levenshteinDistance,exports.WhatsAppTextEditor=q;
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../_virtual/_tslib.js"),t=require("react/jsx-runtime"),n=require("../../assets/icons/info.svg.js"),r=require("../../helpers/BaseWhatsappContentLang.helper.js"),l=require("react"),o=require("../../constants/Theme.js"),i=require("../TypographyStyle.js"),u=require("./CustomEditor.styled.js"),s=require("./WhatsAppTextEditorHeader.js");function c(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=c(l);const d="Character limit reached",v=new r.BaseWhatsappContentLangHelper,h={[s.EditorActionTypes.BOLD]:"*",[s.EditorActionTypes.ITALIC]:"_",[s.EditorActionTypes.STRIKETHROUGH]:"~"},p=a.default.forwardRef(((r,c)=>{var a,p,{onChange:f,onClickVariable:g,text:x,RightComponent:j,error:C,limit:m,onError:E,rows:T,actions:O}=r,y=e.__rest(r,["onChange","onClickVariable","text","RightComponent","error","limit","onError","rows","actions"]);const L=l.useRef(null);function S(e){const t=null==L?void 0:L.current;null!=t&&(t.selectionStart?(t.focus(),t.selectionEnd=e):t.focus())}function R(e){var t,n;let r=null!==(n=null===(t=L.current)||void 0===t?void 0:t.value)&&void 0!==n?n:"";if(L.current&&e){const t=L.current.selectionStart,n=L.current.selectionEnd,l=e;if(t===n)return b(l);{r=v.wrappWildcard(t,n,l,r);const e=v.getHTML(r);return L.current.value=r,{text:r,html:e}}}return{text:r,html:r}}function b(e){var t,n;let r=null!==(n=null===(t=L.current)||void 0===t?void 0:t.value)&&void 0!==n?n:"";if(L.current&&e){const t=L.current.selectionStart;if(t===L.current.selectionEnd)return H(e,t)}return{text:r,html:r}}function H(e,t){var n,r;let l=null!==(r=null===(n=L.current)||void 0===n?void 0:n.value)&&void 0!==r?r:"";l=l.slice(0,t)+e+l.slice(t);const o=v.getHTML(l);return L.current.value=l,{text:l,html:o}}return l.useImperativeHandle(c,(()=>({addTextOrWrap:R,addText:b,get(){var e,t;return null!==(t=null===(e=L.current)||void 0===e?void 0:e.value)&&void 0!==t?t:""},setCaretPosition:S}))),l.useEffect((()=>{if(null==L?void 0:L.current){L.current.value=x||"";const e=v.getHTML(x||"");null==f||f(x||"",e)}}),[x]),l.useEffect((()=>{var e,t;(null===(e=null==L?void 0:L.current)||void 0===e?void 0:e.value)&&m&&((null===(t=null==L?void 0:L.current)||void 0===t?void 0:t.value.length)>m?null==E||E(d):null==E||E(null!=C?C:""))}),[null===(a=null==L?void 0:L.current)||void 0===a?void 0:a.value.length]),t.jsxs(u.OuterContainer,{children:[t.jsxs(u.Container,Object.assign({isError:!!C},{children:[t.jsx(s.WhatsAppTextEditorHeader,{actions:O,ref:L,onActionSelect:function(e){if((null==h?void 0:h[e])&&L.current){const t=L.current.selectionStart;if(t===L.current.selectionEnd){H(null==h?void 0:h[e],t);const{text:n,html:r}=H(null==h?void 0:h[e],t);S(t+1),null==f||f(n,r)}else{const{text:t,html:n}=R(null==h?void 0:h[e]);null==f||f(t,n)}}},RightComponent:j,onEmojiClick:function(e){const{text:t,html:n}=b(e);null==f||f(t,n)}}),t.jsx(u.TextSpace,Object.assign({ref:L,onChange:function(e){const t=e.target.value,n=v.getHTML(t);null==f||f(t,n)}},y,{rows:T}))]})),C&&C!==d?t.jsxs("div",Object.assign({style:{display:"flex",gap:6,alignItems:"center"}},{children:[t.jsx(n.default,{width:16,height:16,color:o.COLORS.content.negative}),t.jsx(i.BodyCaption,Object.assign({color:o.COLORS.content.negative},{children:C}))]})):t.jsx(t.Fragment,{children:m&&(null==L?void 0:L.current)?t.jsxs(i.BodyCaption,Object.assign({style:{color:C===d||(null===(p=null==L?void 0:L.current)||void 0===p?void 0:p.value.length)>m?o.COLORS.content.negative:o.COLORS.content.secondary}},{children:[L.current.value.length,"/",m]})):t.jsx(t.Fragment,{})})]})}));p.displayName="WhatsAppTextEditor",exports.WhatsAppTextEditor=p;
|