{"version":3,"sources":["node_modules/browser-pack/_prelude.js","TypeScripts/AbsenceConfirmation/saop-absenceConfirmation-details-events.ts","TypeScripts/AbsenceConfirmation/saop-absenceConfirmation-details-view.ts","TypeScripts/AbsenceConfirmation/saop-absenceConfirmation-partially-approve-view.ts","TypeScripts/AbsenceConfirmation/saop-absenceConfirmation-pending-view.ts","TypeScripts/AbsenceConfirmation/saop-absenceConfirmation-processed-view.ts","TypeScripts/AbsenceConfirmation/saop-absenceConfirmation-reject-view.ts","TypeScripts/AbsenceConfirmation/saop-absenceConfirmation-view.ts","TypeScripts/AbsenceConfirmation/saop-absenceConfirmationCalendar-view.ts","TypeScripts/AbsenceConfirmation/saop-employeeLeaveCalendar-view.ts","TypeScripts/AbsenceConfirmation/saop-employeeLeaveList-grid.ts","TypeScripts/Account/saop-change-pwd-view.ts","TypeScripts/AppSettings/saop-appsettings-view.ts","TypeScripts/Common/saop-common.ts","TypeScripts/Components/saop-TreeTable.ts","TypeScripts/Components/saop-attachment-list.ts","TypeScripts/Components/saop-calendar.ts","TypeScripts/Components/saop-checkbox-switch.ts","TypeScripts/Components/saop-export.ts","TypeScripts/Components/saop-floating-label.ts","TypeScripts/Components/saop-googlemaps.ts","TypeScripts/Components/saop-grid-filter-UnitOrg.ts","TypeScripts/Components/saop-grid-filter.ts","TypeScripts/Components/saop-grid.ts","TypeScripts/Components/saop-input-wfl.ts","TypeScripts/Components/saop-inputmask.ts","TypeScripts/Components/saop-menu-sidebar.ts","TypeScripts/Components/saop-message-banner.ts","TypeScripts/Components/saop-message-dlg.ts","TypeScripts/Components/saop-multiselect.ts","TypeScripts/Components/saop-popover.ts","TypeScripts/Components/saop-popup-dialog.ts","TypeScripts/Components/saop-right-sidebar.ts","TypeScripts/Components/saop-select-dropdown.ts","TypeScripts/Components/saop-select-month-year.ts","TypeScripts/Components/saop-select-wfl.ts","TypeScripts/Components/saop-selectize-select-tooltip.ts","TypeScripts/Components/saop-selectize-select-w.ts","TypeScripts/Components/saop-sifranti.ts","TypeScripts/Components/saop-toggle-panel.ts","TypeScripts/Components/saop-upload-files.ts","TypeScripts/Components/saop-view-spinner.ts","TypeScripts/Core/saop-services-core.ts","TypeScripts/Core/saop-translate.ts","TypeScripts/Core/saop-utils.ts","TypeScripts/Core/saop-view-form-bindings.ts","TypeScripts/Core/saop-view-form.ts","TypeScripts/Dashboard/saop-dashboard-LIKConfirmation-view.ts","TypeScripts/Dashboard/saop-dashboard-absence-confirmation-view.ts","TypeScripts/Dashboard/saop-dashboard-absences-view.ts","TypeScripts/Dashboard/saop-dashboard-employeePresence-view.ts","TypeScripts/Dashboard/saop-dashboard-internalOrder-view.ts","TypeScripts/Dashboard/saop-dashboard-myGrades-view.ts","TypeScripts/Dashboard/saop-dashboard-todayEvents-view.ts","TypeScripts/Dashboard/saop-dashboard-travelOrder-view.ts","TypeScripts/Dashboard/saop-dashboard-view.ts","TypeScripts/KE/KEAllEmployeesGrades-view.ts","TypeScripts/KE/KEEmployeeGradesEdit-view.ts","TypeScripts/KE/KEGradeCriterion.ts","TypeScripts/KE/KEGradePeriod-grid.ts","TypeScripts/KE/KEGradePeriod-view.ts","TypeScripts/KE/KEGradesPeriod.ts","TypeScripts/KE/KEMyGrade-view.ts","TypeScripts/KE/KEMyGradeDetails.ts","TypeScripts/KE/KEMyGrades-grid.ts","TypeScripts/KE/KEMyGrades.ts","TypeScripts/LIKV/LIKVCakalnaVrsta-Comment.ts","TypeScripts/LIKV/LIKVCakalnaVrsta-CommentConfirm.ts","TypeScripts/LIKV/LIKVCakalnaVrsta-grid.ts","TypeScripts/LIKV/LIKVCakalnaVrsta-view.ts","TypeScripts/LIKV/LIKVCakalnaVrstaArhiv-grid.ts","TypeScripts/LIKV/LIKVNivojiPotrjevanja-grid.ts","TypeScripts/LIKV/LIKVNivojiPotrjevanja-modal.ts","TypeScripts/NDK/NDKInternalOrderEditForm.ts","TypeScripts/NDK/NDKInternalOrders-Active-grid.ts","TypeScripts/NDK/NDKInternalOrders-Archived-grid.ts","TypeScripts/NDK/NDKInternalOrders-view.ts","TypeScripts/NDK/NDKInternalOrders.ts","TypeScripts/OPN/OPNNaloge-select.ts","TypeScripts/OPN/OPNNaloge-view.ts","TypeScripts/OPN/OPNPotniNalogi-grid.ts","TypeScripts/OPN/OPNPotniNalogi-view.ts","TypeScripts/OPN/OPNPotniNalogiAll-grid.ts","TypeScripts/OPN/OPNPotniNalogiArhiv-grid.ts","TypeScripts/OPN/OPNPotniNalogiGoggleMaps-view.ts","TypeScripts/OPN/OPNRelacije-select.ts","TypeScripts/OPN/OPNRelacije-view.ts","TypeScripts/Organization/saop-organigram-view.ts","TypeScripts/REG/saop-reg-keZapDopusti-view.ts","TypeScripts/REG/saop-regAbsenceCalendarEvents-view.ts","TypeScripts/REG/saop-regAbsenceEvents-view.ts","TypeScripts/REG/saop-regAbsenceMain-view.ts","TypeScripts/REG/saop-regAttendance-view.ts","TypeScripts/REG/saop-regAttendanceAllEmployees-view.ts","TypeScripts/REG/saop-regAttendanceAllEmployeesAnalysis-view.ts","TypeScripts/REG/saop-regAttendanceAllEmployeesExcessHours-grid.ts","TypeScripts/REG/saop-regAttendanceAllEmployeesExcessHours-view.ts","TypeScripts/REG/saop-regCurrentEvent-view.ts","TypeScripts/REG/saop-regTodayEvents-view.ts","TypeScripts/REG/saop-regUra-details-table-view.ts","TypeScripts/REG/saop-regUra-view.ts","TypeScripts/REG/saop-regUraDan-view.ts","TypeScripts/REG/saop-regUraDogodek-view.ts","TypeScripts/REG/saop-regUraDogodekDelete-view.ts","TypeScripts/REG/saop-regUraDogodekDeleteOne-view.ts","TypeScripts/SPLDocument/saop-splDocument-view.ts","TypeScripts/Settings/saop-settings-view.ts","TypeScripts/core/saop-services-core.ts","TypeScripts/core/saop-view-form.ts","TypeScripts/main.ts","TypeScripts/opn/OPNSelectPassengers-view.ts","node_modules/moment/moment.js"],"names":[],"mappings":"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CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"bundle.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i\r\nimport { global } from \"../Common/saop-common\";\r\nimport { SaopWfSubmitResult } from \"../core/saop-view-form\";\r\nimport { SaopServicesCore } from \"../core/saop-services-core\";\r\nimport { SaopAbsenceConfirmationPartiallyApproveView } from \"./saop-absenceConfirmation-partially-approve-view\";\r\nimport { SaopAbsenceConfirmationRejectView } from \"../AbsenceConfirmation/saop-absenceConfirmation-reject-view\";\r\nimport { SaopTranslationService } from '../Core/saop-translate';\r\nimport { SaopMessageDlg, SaopMsgDlgButton } from '../Components/saop-message-dlg';\r\n\r\nexport class SaopAbsenceConfirmationDetailsEvents {\r\n private _viewId: string\r\n private _libName: string;\r\n private _rejectViewId: string\r\n private _rejectBtnId: string;\r\n private _partiallyApproveViewId: string;\r\n private _partiallyApproveBtnId: string;\r\n private _approveBtnId: string;\r\n private _saopServicesCore: SaopServicesCore;\r\n private saopAbsenceConfirmationRejectView: SaopAbsenceConfirmationRejectView;\r\n private saopAbsenceConfirmationPartiallyApproveView: SaopAbsenceConfirmationPartiallyApproveView;\r\n private saopMessageDlg: SaopMessageDlg;\r\n private _translationService: SaopTranslationService;\r\n\r\n constructor(viewId: string, libName: string = \"\") {\r\n this._viewId = viewId;\r\n this._libName = libName;\r\n this._rejectViewId = \"#absenceConfirmationRejectView0\";\r\n this._rejectBtnId = \"#detailsKePlanDopustovZavrniBtn\";\r\n this._partiallyApproveViewId = \"#absenceConfirmationPartiallyApproveView0\";\r\n this._partiallyApproveBtnId = \"#detailsKePlanDopustovDelnoPotrdiBtn\";\r\n this._approveBtnId = \"#detailsKePlanDopustovPotrdiBtn\";\r\n this._saopServicesCore = new SaopServicesCore();\r\n\r\n this.saopAbsenceConfirmationRejectView = new SaopAbsenceConfirmationRejectView(this._rejectViewId, this._libName + \".saopAbsenceConfirmationRejectView\");\r\n this.saopAbsenceConfirmationRejectView.refreshData = this.refreshData.bind(this);\r\n\r\n this.saopAbsenceConfirmationPartiallyApproveView = new SaopAbsenceConfirmationPartiallyApproveView(this._partiallyApproveViewId, this._libName + \".saopAbsenceConfirmationPartiallyApproveView\");\r\n this.saopAbsenceConfirmationPartiallyApproveView.refreshData = this.refreshData.bind(this);\r\n\r\n this.saopMessageDlg = new SaopMessageDlg({ data: null, parent: null })\r\n this._translationService = new SaopTranslationService(); \r\n this.setTerminologyList();\r\n }\r\n\r\n setTerminologyList() {\r\n let dictionary: string[] = [\"Potrdi\"\r\n , \"Pozor, število dni predlaganega dopusta je večje kot število dni, ki ga ima zaposleni na razpolago. Želite nadaljevati?\"\r\n , \"Pozor, vpisano število ur predlaganega koriščenja je večje od števila ur, ki jih imate na razpolago. Ali želite nadaljevati?\"\r\n , \"Želim nadaljevati\"\r\n ];\r\n this._translationService.setTranslationsList(dictionary);\r\n } \r\n\r\n init(): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationDetailsEvents.init\");\r\n let _this = this;\r\n\r\n $(this._rejectBtnId).click(function () {\r\n _this.showRejectView(_this._rejectBtnId); \r\n });\r\n\r\n $(this._approveBtnId).click(function () {\r\n let opozoriloStr = $(\"#PrekoracitevOdsotnostiOpozorilo\").val().toString();\r\n let opozorilo = opozoriloStr === \"\" ? false : true;\r\n\r\n if (opozorilo) {\r\n _this.showApproveAlert(opozoriloStr.toLowerCase());\r\n }\r\n else {\r\n _this.approve(_this._approveBtnId);\r\n }\r\n });\r\n\r\n $(this._partiallyApproveBtnId).click(function () {\r\n _this.showPartiallyApproveView(_this._partiallyApproveBtnId)\r\n });\r\n }\r\n\r\n showRejectView(elementId: string): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationDetailsEvents.showRejectView\");\r\n\r\n let elementCtrl = $(elementId);\r\n let leto = elementCtrl.data(\"leto\");\r\n let sifraZaposleni = elementCtrl.data(\"sifrazaposleni\");\r\n let zaporednaStevilka = elementCtrl.data(\"zaporednastevilka\");\r\n let title = elementCtrl.data(\"formtitle\");\r\n\r\n this.saopAbsenceConfirmationRejectView.title = title;\r\n this.saopAbsenceConfirmationRejectView.editRecord({ leto: leto, sifraZaposleni: sifraZaposleni, zaporednaStevilka: zaporednaStevilka });\r\n }\r\n\r\n approve(elementId: string): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationDetailsEvents.approve\");\r\n\r\n let elementCtrl = $(elementId);\r\n let leto = elementCtrl.data(\"leto\");\r\n let sifraZaposleni = elementCtrl.data(\"sifrazaposleni\");\r\n let zaporednaStevilka = elementCtrl.data(\"zaporednastevilka\");\r\n\r\n let data = { leto: leto, sifraZaposleni: sifraZaposleni, zaporednaStevilka: zaporednaStevilka };\r\n global.ConsoleLogDegug(data);\r\n\r\n let _this = this;\r\n\r\n this._saopServicesCore.afterDone = function (response) {\r\n if (response.alertMessage) {\r\n $(\"#absenceConfirmationDetailsView0\").modal('toggle'); \r\n alertify.message(response.alertMessage);\r\n }\r\n\r\n if (response.viewContent) {\r\n $(\"#messageBanner\").html(response.viewContent);\r\n }\r\n\r\n if (response.success) {\r\n _this.refreshData();\r\n }\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action: \"AbsenceConfirmation/ConfirmApproved\"\r\n , data: data\r\n , type: \"POST\"\r\n , spinnerDivId: \"#absenceConfirmationPendingLoading\"\r\n }); \r\n }\r\n\r\n showPartiallyApproveView(elementId: string): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationDetailsEvents.showPartiallyApproveView\");\r\n\r\n let elementCtrl = $(elementId);\r\n let leto = elementCtrl.data(\"leto\");\r\n let sifraZaposleni = elementCtrl.data(\"sifrazaposleni\");\r\n let zaporednaStevilka = elementCtrl.data(\"zaporednastevilka\");\r\n let title = elementCtrl.data(\"formtitle\");\r\n\r\n this.saopAbsenceConfirmationPartiallyApproveView.title = title;\r\n this.saopAbsenceConfirmationPartiallyApproveView.editRecord({ leto: leto, sifraZaposleni: sifraZaposleni, zaporednaStevilka: zaporednaStevilka });\r\n }\r\n\r\n showApproveAlert(sifraVrsteDogodka: string): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationDetailsEvents.showApproveAlert\");\r\n let _this = this;\r\n\r\n let title = this._translationService.translate(\"Potrdi\");\r\n\r\n let message = \"\";\r\n if (sifraVrsteDogodka == 't') {\r\n message = this._translationService.translate(\"Pozor, število dni predlaganega dopusta je večje kot število dni, ki ga ima zaposleni na razpolago. Želite nadaljevati?\"); \r\n }\r\n else if (sifraVrsteDogodka == 'k') {\r\n message = this._translationService.translate(\"Pozor, vpisano število ur predlaganega koriščenja je večje od števila ur, ki jih imate na razpolago. Ali želite nadaljevati?\"); \r\n }\r\n\r\n message = \r\n `\r\n
\r\n ${message}\r\n
\r\n
\r\n \r\n ${_this._translationService.translate(\"Želim nadaljevati\")}\r\n
\r\n `; \r\n\r\n _this.saopMessageDlg.afterShow = function() {\r\n $(\"#btnAlertYes\").prop('disabled', true);\r\n $(\"#check_Approve\").off(\"change\");\r\n $(\"#check_Approve\").on(\"change\",\r\n function() {\r\n if($('#check_Approve').is(\":checked\")) {\r\n $(\"#btnAlertYes\").prop('disabled', false);\r\n } else {\r\n $(\"#btnAlertYes\").prop('disabled', true);\r\n }\r\n \r\n }\r\n );\r\n };\r\n\r\n _this.saopMessageDlg.onYes = _this.proceedYes.bind(_this);\r\n _this.saopMessageDlg.onNo = _this.proceedNo.bind(_this);\r\n _this.saopMessageDlg.Show(message, title, 1, [SaopMsgDlgButton.mbYes, SaopMsgDlgButton.mbNo]);\r\n }\r\n\r\n proceedYes(): void {\r\n global.ConsoleLogDegug(\"approve.proceedYes\");\r\n let _this = this;\r\n $(_this._approveBtnId).attr('type', 'submit');\r\n $(_this._approveBtnId).attr('data-modal', 'dismiss');\r\n\r\n $(\"#PrekoracitevOdsotnostiOpozorilo\").val('')\r\n\r\n $(_this._approveBtnId).trigger(\"click\");\r\n }\r\n\r\n proceedNo(): void {\r\n global.ConsoleLogDegug(\"approve.proceedNo\");\r\n }\r\n\r\n private refreshData(): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationDetailsEvents.refreshData\");\r\n this.refreshFormDataExtended();\r\n }\r\n\r\n refreshFormDataExtended(): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationDetailsEvents.refreshFormDataExtended\");\r\n }\r\n}\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\nimport { SaopViewForm } from \"../Core/saop-view-form\";\r\nimport { SaopAbsenceConfirmationDetailsEvents } from \"./saop-absenceConfirmation-details-events\";\r\n\r\nexport class SaopAbsenceConfirmationDetailsView extends SaopViewForm {\r\n private saopAbsenceConfirmationDetailsEvents: SaopAbsenceConfirmationDetailsEvents;\r\n\r\n constructor(viewId: string, libName: string = \"\") {\r\n super(viewId, libName);\r\n this.setDictionary(); \r\n this.addRecordEndpoint = \"\";\r\n this.editRecordEndpoint = \"AbsenceConfirmation/GetDetails\";\r\n this.deleteRecordEndpoint = \"\";\r\n\r\n this.saopAbsenceConfirmationDetailsEvents = new SaopAbsenceConfirmationDetailsEvents(\"\", libName + \".saopAbsenceConfirmationDetailsEvents\");\r\n this.saopAbsenceConfirmationDetailsEvents.refreshFormDataExtended = this.refreshFormData.bind(this);\r\n } \r\n\r\n setDictionary() {\r\n this.setTerminologyList();\r\n } \r\n\r\n showForm(data: any, title: string): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationDetailsView.showForm\");\r\n\r\n this.title = title;\r\n this.recordDetails(data);\r\n\r\n this.viewShowComplete = this.initForm.bind(this);\r\n }\r\n\r\n initForm(): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationDetailsView.initForm\");\r\n this.saopAbsenceConfirmationDetailsEvents.init();\r\n }\r\n\r\n private refreshFormData(): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationDetailsView.refreshFormData\");\r\n this.refreshDataExtended();\r\n }\r\n\r\n refreshDataExtended(): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationDetailsView.refreshDataExtended\");\r\n }\r\n}\r\n\r\n\r\n","import { SaopViewForm } from \"../Core/saop-view-form\";\r\nimport { global, convertString2Date } from \"../Common/saop-common\";\r\n\r\nexport class SaopAbsenceConfirmationPartiallyApproveView extends SaopViewForm {\r\n private _potrjenoOdId: string\r\n private _potrjenoDoId: string;\r\n private _potrjenoDniId: string;\r\n\r\n constructor(viewId: string, libName: string = \"\") {\r\n super(viewId, libName);\r\n this.setDictionary(); \r\n this.addRecordEndpoint = \"\";\r\n this.editRecordEndpoint = \"AbsenceConfirmation/GetPartiallyApproveForm\";\r\n this.deleteRecordEndpoint = \"\";\r\n\r\n this._potrjenoOdId = \"#PotrjenoOd\";\r\n this._potrjenoDoId = \"#PotrjenoDo\";\r\n this._potrjenoDniId = \"#PotrjenoDni\";\r\n }\r\n\r\n setDictionary() {\r\n this.setTerminologyList(); \r\n } \r\n\r\n initView(): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationPartiallyApproveView.initView\");\r\n\r\n this.initControls();\r\n }\r\n\r\n isVrstaDopustaKompenzacija(): boolean {\r\n var vrstaDopusta = $(\"#VrstaDopusta option:selected\").val();\r\n\r\n return vrstaDopusta == 'K' || vrstaDopusta == 'V' ? true : false;\r\n }\r\n\r\n initControls(): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationPartiallyApproveView.initControls\");\r\n const _this = this;\r\n\r\n $(this._potrjenoOdId).on('changeDate', function () {\r\n if (_this.isVrstaDopustaKompenzacija()) {\r\n $(_this._potrjenoDoId).datepicker('update', $(_this._potrjenoOdId).datepicker('getFormattedDate'));\r\n $(_this._potrjenoDniId).val(\"1\");\r\n }\r\n });\r\n\r\n $(this._potrjenoDoId).on('changeDate', function () {\r\n if (!_this.isVrstaDopustaKompenzacija()) {\r\n let datumOd = convertString2Date($(_this._potrjenoOdId).datepicker('getFormattedDate'), \"dd.mm.yyyy\");\r\n let datumDo = convertString2Date($(_this._potrjenoDoId).datepicker('getFormattedDate'), \"dd.mm.yyyy\");\r\n\r\n var diff = Math.abs(datumOd.getTime() - datumDo.getTime());\r\n var diffDays = Math.ceil(diff / (1000 * 3600 * 24)) + 1; \r\n\r\n $(_this._potrjenoDniId).val(diffDays);\r\n }\r\n });\r\n }\r\n}\r\n\r\n\r\n","/// \r\nimport { filterTableRows, global, isUnDefined, isEmpty } from \"../Common/saop-common\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { SaopAbsenceConfirmationProcessedView } from \"./saop-absenceConfirmation-processed-view\";\r\nimport { SaopAbsenceConfirmationRejectView } from \"./saop-absenceConfirmation-reject-view\";\r\nimport { SaopAbsenceConfirmationPartiallyApproveView } from \"./saop-absenceConfirmation-partially-approve-view\";\r\nimport { SaopAbsenceConfirmationDetailsView } from \"./saop-absenceConfirmation-details-view\";\r\nimport { SaopMessageBanner } from '../Components/saop-message-banner';\r\nimport { SaopTranslationService } from '../Core/saop-translate';\r\nimport { SaopMessageDlg, SaopMsgDlgButton } from '../Components/saop-message-dlg';\r\nimport { SaopWebGridUnitOrgFilter } from \"../Components/saop-grid-filter-UnitOrg\";\r\n\r\nclass KePlanDopustovPK {\r\n leto: number;\r\n sifraZaposleni: string; \r\n zaporednaStevilka: number;\r\n}\r\n\r\nclass DataColumnAttributes extends KePlanDopustovPK {\r\n title: string;\r\n}\r\n\r\nclass AutoShowAbsenceDetailsData extends KePlanDopustovPK {\r\n hasPKValue: boolean;\r\n valid: boolean;\r\n invalidMessage: string;\r\n}\r\n\r\nexport class SaopAbsenceConfirmationPendingView {\r\n private _viewId: string\r\n private _libName: string;\r\n private _rejectViewId: string\r\n private _partiallyApproveViewId: string;\r\n private _detailsViewId: string\r\n private _saopServicesCore: SaopServicesCore;\r\n private _searchAllFieldsValueId: string;\r\n private _selectOrgFilter: SaopWebGridUnitOrgFilter;\r\n private _tableId: string;\r\n private _autoShowAbsenceDetailsId: string;\r\n private _autoShowAbsenceDetailsInvalidMessageId: string;\r\n\r\n\r\n private saopAbsenceConfirmationRejectView: SaopAbsenceConfirmationRejectView;\r\n private saopAbsenceConfirmationPartiallyApproveView: SaopAbsenceConfirmationPartiallyApproveView;\r\n private saopAbsenceConfirmationDetailsView: SaopAbsenceConfirmationDetailsView;\r\n private saopMessageBanner: SaopMessageBanner;\r\n\r\n private saopMessageDlg: SaopMessageDlg;\r\n private _translationService: SaopTranslationService;\r\n\r\n constructor(viewId: string, libName: string = \"\") {\r\n this._viewId = viewId;\r\n this._libName = libName;\r\n this._rejectViewId = \"#absenceConfirmationRejectView0\";\r\n this._partiallyApproveViewId = \"#absenceConfirmationPartiallyApproveView0\";\r\n this._detailsViewId = \"#absenceConfirmationDetailsView0\";\r\n this._saopServicesCore = new SaopServicesCore();\r\n this._searchAllFieldsValueId = \"#OdsotnostiCakajoceSearchValue\";\r\n\r\n this._selectOrgFilter = new SaopWebGridUnitOrgFilter(libName, \"Pending\");\r\n this._selectOrgFilter.filterZaposleniTableRows = this.filterZaposleniTableRows.bind(this);\r\n\r\n this._tableId = \"#absenceConfirmationPendingTable\";\r\n this._autoShowAbsenceDetailsId = \"#autoShowAbsenceDetails\";\r\n this._autoShowAbsenceDetailsInvalidMessageId = \"#autoShowAbsenceDetailsInvalidMessage\";\r\n\r\n this.saopAbsenceConfirmationRejectView = new SaopAbsenceConfirmationRejectView(this._rejectViewId, this._libName + \".saopAbsenceConfirmationRejectView\");\r\n this.saopAbsenceConfirmationRejectView.refreshData = this.refreshData.bind(this);\r\n\r\n this.saopAbsenceConfirmationPartiallyApproveView = new SaopAbsenceConfirmationPartiallyApproveView(this._partiallyApproveViewId, this._libName + \".saopAbsenceConfirmationPartiallyApproveView\");\r\n this.saopAbsenceConfirmationPartiallyApproveView.refreshData = this.refreshData.bind(this);\r\n\r\n this.saopAbsenceConfirmationDetailsView = new SaopAbsenceConfirmationDetailsView(this._detailsViewId, this._libName + \".saopAbsenceConfirmationDetailsView\");\r\n this.saopAbsenceConfirmationDetailsView.refreshDataExtended = this.refreshData.bind(this);\r\n\r\n this.saopMessageBanner = new SaopMessageBanner();\r\n\r\n this.saopMessageDlg = new SaopMessageDlg({ data: null, parent: null })\r\n this._translationService = new SaopTranslationService();\r\n this.setTerminologyList();\r\n }\r\n\r\n setTerminologyList() {\r\n let dictionary: string[] = [\"Potrdi\"\r\n , \"Pozor, število dni predlaganega dopusta je večje kot število dni, ki ga ima zaposleni na razpolago. Želite nadaljevati?\"\r\n , \"Pozor, vpisano število ur predlaganega koriščenja je večje od števila ur, ki jih imate na razpolago. Ali želite nadaljevati?\"\r\n , \"Želim nadaljevati\"\r\n ];\r\n this._translationService.setTranslationsList(dictionary);\r\n } \r\n\r\n initView(): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationPendingView.initView\");\r\n\r\n this.initControls();\r\n }\r\n\r\n initControls(): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationPendingView.initControls\");\r\n let _this = this;\r\n\r\n $(this._searchAllFieldsValueId).keyup(function () {\r\n let filterVal = String($(_this._searchAllFieldsValueId).val());\r\n filterTableRows(filterVal, _this._tableId);\r\n });\r\n\r\n this._selectOrgFilter.initFilterControls();\r\n }\r\n\r\n bindGridEvents() {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationPendingView.bindGridEvents\");\r\n let _this = this;\r\n\r\n $(\".btnRejectKEPlanDopustov\").off(\"click\");\r\n $(\".btnRejectKEPlanDopustov\").on('click', function (row) {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationProcessedView.btnDetailsKEPlanDopustov.click\");\r\n let leto = row.target.getAttribute(\"data-leto\");\r\n let sifraZaposleni = row.target.getAttribute(\"data-sifrazaposleni\");\r\n let zaporednaStevilka = row.target.getAttribute(\"data-zaporednastevilka\");\r\n let title = row.target.getAttribute(\"data-formtitle\");\r\n\r\n _this.showRejectForm({ leto: leto, sifraZaposleni: sifraZaposleni, zaporednaStevilka: zaporednaStevilka }, title);\r\n });\r\n\r\n $(\".btnPartiallyApproveKEPlanDopustov\").off(\"click\");\r\n $(\".btnPartiallyApproveKEPlanDopustov\").on('click', function (row) {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationProcessedView.btnPartiallyApproveKEPlanDopustov.click\");\r\n let leto = row.target.getAttribute(\"data-leto\");\r\n let sifraZaposleni = row.target.getAttribute(\"data-sifrazaposleni\");\r\n let zaporednaStevilka = row.target.getAttribute(\"data-zaporednastevilka\");\r\n let title = row.target.getAttribute(\"data-formtitle\");\r\n\r\n _this.showPartiallyApproveAbsence({ leto: leto, sifraZaposleni: sifraZaposleni, zaporednaStevilka: zaporednaStevilka }, title);\r\n });\r\n\r\n $(\".btnApproveKEPlanDopustov\").off(\"click\");\r\n $(\".btnApproveKEPlanDopustov\").on('click', function (row) {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationProcessedView.btnApproveKEPlanDopustov.click\");\r\n let leto = row.target.getAttribute(\"data-leto\");\r\n let sifraZaposleni = row.target.getAttribute(\"data-sifrazaposleni\");\r\n let zaporednaStevilka = row.target.getAttribute(\"data-zaporednastevilka\");\r\n let sifraVrsteDogodka = row.target.getAttribute(\"data-sifravrstedogodka\");\r\n _this.showApproveAlert({ leto: leto, sifraZaposleni: sifraZaposleni, zaporednaStevilka: zaporednaStevilka, sifraVrsteDogodka: sifraVrsteDogodka }); \r\n });\r\n\r\n $(\"body\").off(\"click\", \"#absenceConfirmationPendingTable td:not(.td-action)\");\r\n $(\"body\").on(\"click\", \"#absenceConfirmationPendingTable td:not(.td-action)\", function () {\r\n var dataColumn = $(this).closest(\"tr\").find(\"td\").eq(0);\r\n let dataValues = _this.getTableDataColumnValues(dataColumn);\r\n _this.saopAbsenceConfirmationDetailsView.showForm({ leto: dataValues.leto, sifraZaposleni: dataValues.sifraZaposleni, zaporednaStevilka: dataValues.zaporednaStevilka }, dataValues.title); \r\n });\r\n }\r\n\r\n getTableDataColumnValues(dataColumn: JQuery): DataColumnAttributes {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationPendingView.getTableDataColumnValues\");\r\n\r\n let dataValues = new DataColumnAttributes();\r\n\r\n dataValues.leto = parseInt(dataColumn.attr(\"data-leto\"));\r\n dataValues.sifraZaposleni = dataColumn.attr(\"data-sifrazaposleni\");\r\n dataValues.zaporednaStevilka = parseInt(dataColumn.attr(\"data-zaporednastevilka\"));\r\n dataValues.title = dataColumn.attr(\"data-formtitle\");\r\n\r\n return dataValues;\r\n }\r\n\r\n showRejectForm(data: any, title: string): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationPendingView.showRejectForm\");\r\n\r\n this.saopAbsenceConfirmationRejectView.title = title;\r\n this.saopAbsenceConfirmationRejectView.editRecord(data);\r\n }\r\n\r\n showPartiallyApproveAbsence(data: any, title: string): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationPendingView.showPartiallyApproveAbsence\");\r\n\r\n this.saopAbsenceConfirmationPartiallyApproveView.title = title;\r\n this.saopAbsenceConfirmationPartiallyApproveView.editRecord(data);\r\n }\r\n\r\n approveAbsence(data: any): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationPendingView.approveAbsence\");\r\n global.ConsoleLogDegug(data);\r\n let _this = this;\r\n\r\n this._saopServicesCore.afterDone = function (response) {\r\n if (response.alertMessage) {\r\n alertify.message(response.alertMessage);\r\n }\r\n _this.refreshData();\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action: \"AbsenceConfirmation/ConfirmApproved\"\r\n , data: data\r\n , type: \"POST\"\r\n , spinnerDivId: \"#absenceConfirmationPendingLoading\"\r\n }); \r\n }\r\n\r\n showApproveAlert(data: any): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationPendingView.showApproveAlert\");\r\n let _this = this;\r\n\r\n this._saopServicesCore.afterDone = function (response) {\r\n if (response.success == false) {\r\n let title = _this._translationService.translate(\"Potrdi\");;\r\n\r\n let message = \"\";\r\n if (data.sifraVrsteDogodka.toLowerCase() == 't') {\r\n message = _this._translationService.translate(\"Pozor, število dni predlaganega dopusta je večje kot število dni, ki ga ima zaposleni na razpolago. Želite nadaljevati?\");\r\n }\r\n else if (data.sifraVrsteDogodka.toLowerCase() == 'k') {\r\n message = _this._translationService.translate(\"Pozor, vpisano število ur predlaganega koriščenja je večje od števila ur, ki jih imate na razpolago. Ali želite nadaljevati?\");\r\n }\r\n\r\n message = \r\n `\r\n
\r\n ${message}\r\n
\r\n
\r\n \r\n ${_this._translationService.translate(\"Želim nadaljevati\")}\r\n
\r\n `; \r\n\r\n _this.saopMessageDlg.afterShow = function() {\r\n $(\"#btnAlertYes\").prop('disabled', true);\r\n $(\"#check_Approve\").off(\"change\");\r\n $(\"#check_Approve\").on(\"change\",\r\n function() {\r\n if($('#check_Approve').is(\":checked\")) {\r\n $(\"#btnAlertYes\").prop('disabled', false);\r\n } else {\r\n $(\"#btnAlertYes\").prop('disabled', true);\r\n }\r\n \r\n }\r\n );\r\n };\r\n _this.saopMessageDlg.onYes = _this.approveAbsence.bind(_this, data);\r\n _this.saopMessageDlg.onNo = _this.proceedNo.bind(_this);\r\n _this.saopMessageDlg.Show(message, title, 1, [SaopMsgDlgButton.mbYes, SaopMsgDlgButton.mbNo]);\r\n\r\n }\r\n else {\r\n _this.approveAbsence(data);\r\n }\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action: \"AbsenceConfirmation/ConfirmApprovedAlert\"\r\n , data: data\r\n , type: \"GET\"\r\n , spinnerDivId: \"#absenceConfirmationPendingLoading\"\r\n }); \r\n }\r\n\r\n proceedNo(): void {\r\n global.ConsoleLogDegug(\"approve.proceedNo\");\r\n }\r\n\r\n\r\n private refreshData(): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationPendingView.refreshData\");\r\n\r\n this.refreshDataExternal();\r\n }\r\n\r\n // ta metoda se lahko override z drugo metodo (npr. v DashboardAbsenceConfirmationView)\r\n refreshDataExternal(): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationPendingView.refreshDataExternal\");\r\n\r\n this.refreshBaseData();\r\n }\r\n\r\n refreshBaseData(): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationPendingView.refreshBaseData\");\r\n\r\n let _this = this;\r\n let data = null;\r\n\r\n // preberemo\r\n let autoShowDetailsValues = this.getAutoShowAbsenceDetailsValues();\r\n if (autoShowDetailsValues != null) {\r\n data = { year: autoShowDetailsValues.leto, sequenceNumber: autoShowDetailsValues.zaporednaStevilka, employeeId: autoShowDetailsValues.sifraZaposleni };\r\n }\r\n\r\n this._saopServicesCore.afterDone = function (response) {\r\n $(\"#absenceConfirmationPending\").html(response);\r\n _this.bindGridEvents();\r\n _this.checkAutoShowAbsenceDetails();\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action: \"AbsenceConfirmation/GetPendingAbsences\"\r\n , data: data\r\n , type: \"GET\"\r\n , spinnerDivId: \"#absenceConfirmationPendingLoading\"\r\n });\r\n }\r\n\r\n checkAutoShowAbsenceDetails() {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationPendingView.checkAutoShowAbsenceDetails\");\r\n\r\n // preberemo podatke iz hidden input elementa\r\n let autoShowAbsenceDetailsValues = this.getAutoShowAbsenceDetailsValues();\r\n global.ConsoleLogDegug(autoShowAbsenceDetailsValues);\r\n\r\n // resetriamo vrednosti, da se ne bi okno za details ponovno pojavilo, ko se izvede refresh podatkov\r\n this.resetAutoShowAbsenceDetailsValues();\r\n\r\n if (autoShowAbsenceDetailsValues != null && autoShowAbsenceDetailsValues.hasPKValue) {\r\n if (!autoShowAbsenceDetailsValues.valid) {\r\n //ni veljavna, moramo prikazati obvestilo na pregledu\r\n let messages: string[] = [];\r\n messages.push(autoShowAbsenceDetailsValues.invalidMessage)\r\n this.saopMessageBanner.show(messages);\r\n }\r\n else {\r\n // poiscemo podatek iz pending absence tabele in ce obstaja, prikazemo details form\r\n var table, tr, i;\r\n table = document.getElementById(this._tableId.replace(\"#\", \"\"));\r\n tr = table.getElementsByTagName(\"tr\");\r\n // Loop through all table rows, and hide those who don't match the search query\r\n for (i = 0; i < tr.length; i++) {\r\n let dataColumn = $(tr[i]).find(\"td\").eq(0);\r\n if (!isUnDefined(dataColumn)) {\r\n let dataValues = this.getTableDataColumnValues(dataColumn);\r\n\r\n if (this.compareAbsenceDetailsValuesAndTableDataValues(autoShowAbsenceDetailsValues, dataValues)) {\r\n this.saopAbsenceConfirmationDetailsView.showForm({ leto: dataValues.leto, sifraZaposleni: dataValues.sifraZaposleni, zaporednaStevilka: dataValues.zaporednaStevilka }, dataValues.title); \r\n return\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n getAutoShowAbsenceDetailsValues(): AutoShowAbsenceDetailsData {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationPendingView.getAutoShowAbsenceDetailsValues\");\r\n\r\n let dataValues = new AutoShowAbsenceDetailsData();\r\n\r\n let dataElement = $(this._autoShowAbsenceDetailsId);\r\n if (dataElement != null) {\r\n dataValues = dataElement.data('details');\r\n\r\n if (dataValues != null && dataValues.invalidMessage == \"\") {\r\n // ni nobenih napak, ki bi jih lahko vrnil \"Index\" action\r\n // preverimo, če je kaj zapisano v _pendingForm.cshtml\r\n // vrednost se postavi v \"GetPendingAbsences\" action\r\n let dataPendingInvalidMessageElement = $(this._autoShowAbsenceDetailsInvalidMessageId);\r\n if (dataPendingInvalidMessageElement != null) {\r\n let invMessage = dataPendingInvalidMessageElement.data('invalidmessage');\r\n if (invMessage != null && invMessage != \"\") {\r\n dataValues.valid = false;\r\n dataValues.invalidMessage = invMessage;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return dataValues\r\n }\r\n\r\n resetAutoShowAbsenceDetailsValues() {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationPendingView.resetAutoShowAbsenceDetailsValues\");\r\n\r\n let dataElement = $(this._autoShowAbsenceDetailsId);\r\n if (dataElement != null) {\r\n dataElement.data('details', null);\r\n }\r\n\r\n let dataPendingInvalidMessageElement = $(this._autoShowAbsenceDetailsInvalidMessageId);\r\n if (dataPendingInvalidMessageElement != null) {\r\n dataPendingInvalidMessageElement.data('invalidmessage', null);\r\n }\r\n }\r\n\r\n // ce sta enaka, vrne true, sicer false\r\n compareAbsenceDetailsValuesAndTableDataValues(absenceDetailsValues: AutoShowAbsenceDetailsData, tableDataValues: DataColumnAttributes): boolean {\r\n if (absenceDetailsValues.leto === tableDataValues.leto && absenceDetailsValues.zaporednaStevilka === tableDataValues.zaporednaStevilka && absenceDetailsValues.sifraZaposleni === tableDataValues.sifraZaposleni) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n\r\n filterZaposleniTableRows(filterZaposleni: string) {\r\n // Declare variables\r\n var table, tr, _rowId, i, txtValue;\r\n table = document.getElementById(\"absenceConfirmationPendingTable\");\r\n tr = table.getElementsByTagName(\"tr\");\r\n // Loop through all table rows, and hide those who don't match the search query\r\n for (i = 0; i < tr.length; i++) {\r\n _rowId = null;\r\n let _trId = $(tr[i]).attr(\"data-sifra-zaposleni\");\r\n if (!isUnDefined(_trId)) {\r\n _rowId = _trId.toString()\r\n }\r\n\r\n if (_rowId) {\r\n txtValue = _rowId.toUpperCase();\r\n if (isEmpty(filterZaposleni)) {\r\n $(tr[i]).addClass(\"element-hidden\");\r\n } else if (filterZaposleni.toUpperCase().indexOf(txtValue) > -1) {\r\n $(tr[i]).removeClass(\"element-hidden\");\r\n } else {\r\n $(tr[i]).addClass(\"element-hidden\");\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n\r\n","/// \r\nimport { filterTableRows, global, isEmpty, isUnDefined } from \"../Common/saop-common\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { SaopAbsenceConfirmationDetailsView } from \"./saop-absenceConfirmation-details-view\";\r\nimport { SaopPopover } from \"../Components/saop-popover\";\r\nimport { SaopWebGridUnitOrgFilter } from \"../Components/saop-grid-filter-UnitOrg\";\r\n\r\nexport class SaopAbsenceConfirmationProcessedView {\r\n private _viewId: string\r\n private _libName: string;\r\n private _detailsViewId: string\r\n private _saopServicesCore: SaopServicesCore;\r\n private _letoId: string;\r\n private _letoMobileFilterId: string;\r\n private _potrjeniCheckBoxId: string;\r\n private _potrjeniCheckBoxMobileFilterId: string;\r\n private _preklicaniCheckBoxId: string;\r\n private _preklicaniCheckBoxMobileFilterId: string;\r\n private _searchAllFieldsValueId: string;\r\n private _selectOrgFilter: SaopWebGridUnitOrgFilter;\r\n private _tableId: string;\r\n\r\n private saopAbsenceConfirmationDetailsView: SaopAbsenceConfirmationDetailsView;\r\n private _saopPopover: SaopPopover;\r\n\r\n constructor(viewId: string, libName: string = \"\") {\r\n this._viewId = viewId;\r\n this._libName = libName;\r\n this._detailsViewId = \"#absenceConfirmationDetailsView0\";\r\n this._saopServicesCore = new SaopServicesCore();\r\n\r\n // desktop filter html elements\r\n this._letoId = \"#Leto\";\r\n this._potrjeniCheckBoxId = \"#cbpotrjeniCheckBox\";\r\n this._preklicaniCheckBoxId = \"#cbpreklicaniCheckBox\";\r\n // mobile filter html elements\r\n this._letoMobileFilterId = \"#letoFilter\";\r\n this._potrjeniCheckBoxMobileFilterId =\"#cbpotrjeniCheckBoxFilter\"\r\n this._preklicaniCheckBoxMobileFilterId = \"#cbpreklicaniCheckBoxFilter\";\r\n\r\n this._searchAllFieldsValueId = \"#OdsotnostiObdelaneSearchValue\";\r\n\r\n this._selectOrgFilter = new SaopWebGridUnitOrgFilter(libName, \"Processed\");\r\n this._selectOrgFilter.filterZaposleniTableRows = this.filterZaposleniTableRows.bind(this);\r\n\r\n this._tableId = \"#absenceConfirmationProcessedTable\";\r\n this.saopAbsenceConfirmationDetailsView = new SaopAbsenceConfirmationDetailsView(this._detailsViewId, this._libName + \".saopAbsenceConfirmationDetailsView\");\r\n this.saopAbsenceConfirmationDetailsView.refreshDataExtended = this.refreshTableData.bind(this);\r\n this._saopPopover = new SaopPopover();\r\n this._saopPopover.afterPopoverShow = this.afterPopoverMobileFilterShow.bind(this);\r\n }\r\n\r\n initView(): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationProcessedView.initView\");\r\n\r\n this._saopPopover.bindPopoverEvents();\r\n\r\n this.initControls();\r\n }\r\n\r\n initControls(): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationProcessedView.initControls\");\r\n let _this = this;\r\n\r\n $(this._searchAllFieldsValueId).keyup(function () {\r\n let filterVal = String($(_this._searchAllFieldsValueId).val());\r\n filterTableRows(filterVal, _this._tableId);\r\n });\r\n\r\n this._selectOrgFilter.initFilterControls(); \r\n }\r\n\r\n bindGridEvents() {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationProcessedView.bindGridEvents\");\r\n let _this = this;\r\n \r\n $(\".btnDetailsKEPlanDopustov\").off(\"click\");\r\n $(\".btnDetailsKEPlanDopustov\").on('click', function (row) {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationProcessedView.btnDetailsKEPlanDopustov.click\");\r\n let leto = row.target.getAttribute(\"data-leto\");\r\n let sifraZaposleni = row.target.getAttribute(\"data-sifrazaposleni\");\r\n let zaporednaStevilka = row.target.getAttribute(\"data-zaporednastevilka\");\r\n let title = row.target.getAttribute(\"data-formtitle\");\r\n\r\n _this.showRecordDetails({ leto: leto, sifraZaposleni: sifraZaposleni, zaporednaStevilka: zaporednaStevilka }, title);\r\n });\r\n }\r\n\r\n showRecordDetails(detailsData: any, title: string): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationProcessedView.showRecordDetails\");\r\n\r\n this.saopAbsenceConfirmationDetailsView.showForm(detailsData, title);\r\n }\r\n\r\n refreshData(params: any = null): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationProcessedView.refreshData\");\r\n let _this = this;\r\n\r\n this._saopServicesCore.afterDone = function (response) {\r\n $(\"#absenceConfirmationProcessed\").html(response);\r\n _this.bindGridEvents();\r\n _this._saopPopover.bindPopoverEvents();\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action: \"AbsenceConfirmation/GetProcessedAbsences\"\r\n , data: params\r\n , type: \"GET\"\r\n , spinnerDivId: \"#absenceConfirmationProcessedLoading\"\r\n }); \r\n }\r\n\r\n refreshTableData(): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationProcessedView.refreshTableData\");\r\n let _this = this;\r\n let filterValues = this.getFilterValues();\r\n\r\n this._saopServicesCore.afterDone = function (response) {\r\n $(\"#absenceConfirmationProcessedTableDiv\").html(response);\r\n\r\n let filterVal = String($(_this._searchAllFieldsValueId).val());\r\n filterTableRows(filterVal, _this._tableId);\r\n\r\n _this.filterZaposleniTableRows($(_this._selectOrgFilter._selectZaposleniId).val().toString());\r\n\r\n _this.bindGridEvents();\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action: \"AbsenceConfirmation/GetProcessedAbsencesTable\"\r\n , data: filterValues\r\n , type: \"GET\"\r\n , spinnerDivId: \"#absenceConfirmationProcessedLoading\"\r\n }); \r\n }\r\n\r\n // če je tip = \"M\", bereme vrednsoti iz HTML mobile elementov sicer iz desktop elementov\r\n getFilterValues(tip: string = \"\"): any {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationProcessedView.getFilterValues\");\r\n\r\n let potrjeni = true;\r\n let potrjeniCheckBox = $(this._potrjeniCheckBoxId);\r\n if (tip == \"M\") {\r\n potrjeniCheckBox = $(\"div.popover.show\").find(this._potrjeniCheckBoxMobileFilterId);\r\n }\r\n if (potrjeniCheckBox.length) {\r\n if (potrjeniCheckBox.is(\":checked\")) {\r\n potrjeni = true;\r\n } else {\r\n potrjeni = false;\r\n }\r\n }\r\n\r\n let preklicani = true;\r\n let preklicaniCheckBox = $(this._preklicaniCheckBoxId);\r\n if (tip == \"M\") {\r\n preklicaniCheckBox = $(\"div.popover.show\").find(this._preklicaniCheckBoxMobileFilterId);\r\n }\r\n if (preklicaniCheckBox.length) {\r\n if (preklicaniCheckBox.is(\":checked\")) {\r\n preklicani = true;\r\n } else {\r\n preklicani = false;\r\n }\r\n }\r\n\r\n let leto = null;\r\n let letoInput = $(this._letoId)\r\n if (tip == \"M\") {\r\n letoInput = $(\"div.popover.show\").find(this._letoMobileFilterId);\r\n }\r\n let letoStr = String(letoInput.val());\r\n if (letoStr.length == 4 || letoStr.length == 0) {\r\n if (letoStr.length == 4) {\r\n leto = +letoStr;\r\n }\r\n }\r\n\r\n return { leto: leto, potrjeni: potrjeni, preklicani: preklicani };\r\n }\r\n\r\n // kopiranje filter vrednosti iz html elementi za mobile v html elemente za desktop pregled\r\n copyFilterValues(): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationProcessedView.copyFilterValues\");\r\n\r\n // pridobimo vrednosti iz HTML mobile elementov\r\n let filterValues = this.getFilterValues(\"M\");\r\n\r\n $(this._potrjeniCheckBoxId).prop('checked', filterValues.potrjeni);\r\n $(this._preklicaniCheckBoxId).prop('checked', filterValues.preklicani);\r\n $(this._letoId).val(filterValues.leto);\r\n }\r\n\r\n // če je tip = \"M\", je prisel klic iz mobile filter popover okna\r\n filtersChanged(tip: string = \"\"): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationProcessedView.filtersChanged\");\r\n\r\n let filterValues = this.getFilterValues(tip);\r\n\r\n // zapisemo vrednosti tudi v drugi filter\r\n // ce je tip = \"M\" (mobile), se zapise vrednosti filtrov v html elementov za desktop pregled in obratno\r\n // potem se pri prikazu filtriranih podatkov upostevajo vrednosti iz deskotp html elementov\r\n if (tip == \"M\") {\r\n this.copyFilterValues();\r\n }\r\n\r\n // leto ne sme biti null\r\n if (filterValues.leto != null) {\r\n this.refreshTableData();\r\n }\r\n }\r\n\r\n afterPopoverMobileFilterShow(): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationProcessedView.afterPopoverMobileFilterShow\");\r\n\r\n // get filter values from desktop html elements\r\n let filterValues = this.getFilterValues();\r\n\r\n // write filter values to popover html elements when its showen\r\n\r\n var letoInput = $(\"div.popover.show\").find(this._letoMobileFilterId);\r\n letoInput.val(filterValues.leto);\r\n\r\n var potrjeniCheckBox = $(\"div.popover.show\").find(this._potrjeniCheckBoxMobileFilterId);\r\n potrjeniCheckBox.prop('checked', filterValues.potrjeni);\r\n\r\n var preklicaniCheckBox = $(\"div.popover.show\").find(this._preklicaniCheckBoxMobileFilterId);\r\n preklicaniCheckBox.prop('checked', filterValues.preklicani);\r\n\r\n // prikazi filter okno\r\n var filterBody = $(\"div.popover.show\").find(\"#popOverProcessedFilterBody\");\r\n filterBody.show();\r\n }\r\n\r\n filterZaposleniTableRows(filterZaposleni: string) {\r\n // Declare variables\r\n var table, tr, _rowId, i, txtValue;\r\n table = document.getElementById(\"absenceConfirmationProcessedTable\");\r\n tr = table.getElementsByTagName(\"tr\");\r\n // Loop through all table rows, and hide those who don't match the search query\r\n for (i = 0; i < tr.length; i++) {\r\n _rowId = null;\r\n let _trId = $(tr[i]).attr(\"data-sifra-zaposleni\");\r\n if (!isUnDefined(_trId)) {\r\n _rowId = _trId.toString()\r\n }\r\n\r\n if (_rowId) {\r\n txtValue = _rowId.toUpperCase();\r\n if (isEmpty(filterZaposleni)) {\r\n $(tr[i]).addClass(\"element-hidden\");\r\n } else if (filterZaposleni.toUpperCase().indexOf(txtValue) > -1) {\r\n $(tr[i]).removeClass(\"element-hidden\");\r\n } else {\r\n $(tr[i]).addClass(\"element-hidden\");\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n\r\n","import { SaopViewForm } from \"../Core/saop-view-form\";\r\n\r\nexport class SaopAbsenceConfirmationRejectView extends SaopViewForm {\r\n constructor(viewId: string, libName: string = \"\") {\r\n super(viewId, libName);\r\n this.setDictionary(); \r\n this.addRecordEndpoint = \"\";\r\n this.editRecordEndpoint = \"AbsenceConfirmation/GetRejectedForm\";\r\n this.deleteRecordEndpoint = \"\";\r\n } \r\n\r\n setDictionary() {\r\n this.setTerminologyList();\r\n } \r\n}\r\n\r\n\r\n","/// \r\nimport { global } from \"../Common/saop-common\";\r\nimport { SaopAbsenceConfirmationPendingView } from \"./saop-absenceConfirmation-pending-view\";\r\nimport { SaopAbsenceConfirmationProcessedView } from \"./saop-absenceConfirmation-processed-view\";\r\n\r\nexport class SaopAbsenceConfirmationView {\r\n private _libName:string;\r\n \r\n public saopAbsenceConfirmationPendingView: SaopAbsenceConfirmationPendingView;\r\n public saopAbsenceConfirmationProcessedView: SaopAbsenceConfirmationProcessedView;\r\n\r\n constructor(viewId: string, libName: string = \"\") {\r\n this._libName = libName;\r\n //\r\n this.saopAbsenceConfirmationPendingView = new SaopAbsenceConfirmationPendingView(viewId, this._libName + \".saopAbsenceConfirmationPendingView\")\r\n this.saopAbsenceConfirmationPendingView.refreshDataExternal = this.refreshAllData.bind(this);\r\n this.saopAbsenceConfirmationProcessedView = new SaopAbsenceConfirmationProcessedView(viewId, this._libName + \".saopAbsenceConfirmationProcessedView\")\r\n }\r\n\r\n initView(): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationView.initView\");\r\n\r\n // form nima sidebar right, zato se dodan class, da btn ni viden tudi v mobile verziji\r\n $(\"#btnShowSidebarr\").addClass(\"d-none-mobile\");\r\n }\r\n\r\n // se uporabi v init metodi v AbsenceConfirmation index cshtml datoteki\r\n refreshAllData(): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationView.refreshAllData\");\r\n this.saopAbsenceConfirmationPendingView.refreshBaseData();\r\n this.saopAbsenceConfirmationProcessedView.refreshData();\r\n }\r\n}\r\n\r\n\r\n","import { global, isEmpty, isUnDefined } from \"../Common/saop-common\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { SaopCalendar,SaopCalendarNavigation } from \"../Components/saop-calendar\";\r\nimport { SaopAbsenceConfirmationDetailsView } from \"./saop-absenceConfirmation-details-view\";\r\nimport { SaopRegKeZapDopustiView } from \"../REG/saop-reg-keZapDopusti-view\";\r\nimport { SaopMultiselect, SaopMultiselectOptions } from \"../Components/saop-multiselect\";\r\nimport { SaopPopover } from \"../Components/saop-popover\";\r\nimport { SaopEmployeeLeaveCalendar } from \"../AbsenceConfirmation/saop-employeeLeaveCalendar-view\";\r\nimport { SaopWebGridUnitOrgFilter } from \"../Components/saop-grid-filter-UnitOrg\";\r\n\r\nexport class SaopAbsenceConfirmationCalendarView extends SaopCalendar {\r\n private _libname: string; \r\n\r\n private saopAbsenceConfirmationDetailsView: SaopAbsenceConfirmationDetailsView;\r\n private saopRegKeZapDopustiView: SaopRegKeZapDopustiView;\r\n private _lastCellId :string;\r\n private _lastCategoryId: string;\r\n private _saopLeftSideAdditionalControlsServicesCore: SaopServicesCore;\r\n private _saopRightSideAdditionalControlsServicesCore: SaopServicesCore;\r\n\r\n private _saopPopoverFilter: SaopPopover;\r\n\r\n private _saopRegKeZapDopustiView: SaopEmployeeLeaveCalendar;\r\n\r\n private _selectOrgDesktopFilter: SaopWebGridUnitOrgFilter;\r\n private _selectOrgMobileFilter: SaopWebGridUnitOrgFilter;\r\n //\r\n constructor(libName: string = \"\") {\r\n super(libName);\r\n this._libname = libName;\r\n this.saopAbsenceConfirmationDetailsView = new SaopAbsenceConfirmationDetailsView(\"#absenceConfirmationDetailsView0\", libName + \".saopAbsenceConfirmationDetailsView\");\r\n this.saopAbsenceConfirmationDetailsView.refreshDataExtended = this.refreshDataAfterUpdate.bind(this);\r\n this.saopRegKeZapDopustiView = new SaopRegKeZapDopustiView(\"#regKeZapDopustiView0\", libName + \".saopRegKeZapDopustiView\");\r\n this.saopRegKeZapDopustiView.refreshData = this.refreshDataAfterUpdate.bind(this);\r\n this._saopLeftSideAdditionalControlsServicesCore = new SaopServicesCore();\r\n this._saopRightSideAdditionalControlsServicesCore = new SaopServicesCore();\r\n\r\n this._saopPopoverFilter = new SaopPopover('.daygrid-event');\r\n this._saopPopoverFilter.afterPopoverShow = this.afterPopoverMobileFilterShow.bind(this);\r\n\r\n this._saopRegKeZapDopustiView = new SaopEmployeeLeaveCalendar('#keEmployeeLeaveCalendar0', libName + \".saopRegKeZapDopustiView\");\r\n }\r\n\r\n initView() {\r\n super.initView({controller:\"AbsenceConfirmation\",action:\"Calendar\",partialRender:true});\r\n let _this = this;\r\n $(document).on('click', '.popoverLink', function (e:any) {\r\n let _popoverId = \"#\"+e.target.id;\r\n let _categoryId = \"#\"+$(_popoverId).attr(\"data-categoryId\");\r\n let _cellId = \"#\"+$(_popoverId).attr(\"data-cellId\");\r\n let _link = $(_popoverId).attr(\"link\");\r\n const _data = JSON.parse(_link);\r\n _this.showRecordDetails(_categoryId,_cellId,_data);\r\n });\r\n\r\n $(document).on('click', '.categoryLink', function (e: any) {\r\n let _link = $(\"#\" + e.target.id).attr(\"link\");\r\n if (_link == null) {\r\n return;\r\n }\r\n const _data = JSON.parse(_link);\r\n\r\n _this.showEmployeeLeaveCalendar(_data.sifraZaposleni, _data.nazivZaposleni);\r\n });\r\n\r\n $(document).on('click', '#btnAddConfirmedAbsence', function (e: any) {\r\n let elementCtrl = $(\"#\" + e.target.id);\r\n let formTitle = elementCtrl.data(\"formtitle\");\r\n _this.showAddAbsenceForm(formTitle, \"\");\r\n });\r\n\r\n // dodamo Css v categoriesDiv za potrebe responsive\r\n let categoriesDiv = $(\"#categoriesDiv\");\r\n if (categoriesDiv != null) {\r\n let customCss = \"d-none-mobile\";\r\n if (!categoriesDiv.hasClass(customCss)) {\r\n categoriesDiv.addClass(customCss);\r\n }\r\n }\r\n\r\n // prikazemo dodatne header controle za AbsenceConfirmation koledar, ker je SaopCalendar splosna kontrola\r\n this.showAbsenceConfirmationCalendarLeftSideAdditionalControls();\r\n this.showAbsenceConfirmationCalendarRightSideAdditionalControls();\r\n\r\n this.setTableTdWidth();\r\n }\r\n\r\n bindDivs(){\r\n super.bindDivs();\r\n this.formData.addClass(\"absences-calendar\");\r\n this.formData.addClass(\"table-column-holder\");\r\n this.formData.addClass(\"saop-table-fixhead\");\r\n // \r\n }\r\n\r\n showRecordDetails(categoryId:string,cellId:string,detailsData: any): void {\r\n this._lastCellId = cellId;\r\n this._lastCategoryId = categoryId;\r\n this.saopAbsenceConfirmationDetailsView.showForm(detailsData, detailsData.nazivZaposleni);\r\n }\r\n\r\n showAddAbsenceForm(title: string, sifraZaposleni: string): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationCalendarView.showAddAbsenceForm\");\r\n this.saopRegKeZapDopustiView.title = title;\r\n this.saopRegKeZapDopustiView.addRecord({ selectSifraZaposleni: true, sifraZaposleni: sifraZaposleni, avtomatskaPotrditev: true });\r\n }\r\n\r\n refreshDataAfterUpdate(){\r\n this.refreshData(SaopCalendarNavigation.refreshTableData,this._lastCategoryId);\r\n }\r\n\r\n afterRefreshTableData(e:any){\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationCalendarView.afterRefreshTableData\");\r\n\r\n this.bindDivs();\r\n this.setTableTdWidth();\r\n }\r\n\r\n showAbsenceConfirmationCalendarRightSideAdditionalControls(): void {\r\n const _this = this;\r\n\r\n this._saopRightSideAdditionalControlsServicesCore.afterDone = function (response) {\r\n $(\"#\" + _this.getHeaderControlGroupId()).append(response);\r\n _this._saopPopoverFilter.bindPopoverEvents();\r\n };\r\n this._saopRightSideAdditionalControlsServicesCore.ExecuteAction({\r\n action: \"AbsenceConfirmation/GetCalendarRightSideAdditionalControls\"\r\n , data: null\r\n , type: \"GET\"\r\n , spinnerDivId: \"#calendarFormHeaderControlGroupLoading\"\r\n });\r\n }\r\n\r\n showAbsenceConfirmationCalendarLeftSideAdditionalControls(): void {\r\n const _this = this;\r\n\r\n this._saopLeftSideAdditionalControlsServicesCore.afterDone = function (response) {\r\n $(\"#\" + _this.getHeaderControlGroupId()).prepend(response);\r\n\r\n const options: SaopMultiselectOptions = {\r\n selectAll: false\r\n };\r\n\r\n _this._selectOrgDesktopFilter = new SaopWebGridUnitOrgFilter(_this._libname, \"Desktop\");\r\n _this._selectOrgDesktopFilter.filterZaposleniTableRows = _this.categoriesFilter.bind(_this);\r\n _this._selectOrgDesktopFilter.initFilterControls();\r\n };\r\n this._saopLeftSideAdditionalControlsServicesCore.ExecuteAction({\r\n action: \"AbsenceConfirmation/GetCalendarLeftSideAdditionalControls\"\r\n , data: null\r\n , type: \"GET\"\r\n , spinnerDivId: \"#calendarFormHeaderControlGroupLoading\"\r\n });\r\n }\r\n\r\n filterSelectSkupinaData(element: any) {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationCalendarView.filterSelectSkupinaData\");\r\n\r\n // preberemo, katere sifre zaposlenih sodijo v izbrane skupine\r\n let izbraneSkupine = (element.val().toString());\r\n let izbraneSifreZaposlenih: string[] = null;\r\n\r\n if (izbraneSkupine != null && izbraneSkupine.length > 0) {\r\n let izbraneSifreZaposlenihStr = this.getSelestedEmployeesIds(izbraneSkupine);\r\n izbraneSifreZaposlenih = izbraneSifreZaposlenihStr.split(\",\");\r\n }\r\n\r\n if (this._selectOrgDesktopFilter._selectZaposleni != null) {\r\n this._selectOrgDesktopFilter._selectZaposleni.setSelectValues(izbraneSifreZaposlenih);\r\n }\r\n }\r\n\r\n filterTableRows(filterSkupina: string, filterZaposleni: string) {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationCalendarView.filterTableRows\");\r\n\r\n // Declare variables\r\n var table, tr, _rowId, i, txtValue;\r\n table = document.getElementById(\"saop-calendar-table\");\r\n tr = table.getElementsByTagName(\"tr\");\r\n // Loop through all table rows, and hide those who don't match the search query\r\n for (i = 0; i < tr.length; i++) {\r\n _rowId = null;\r\n let _trId = $(tr[i]).attr(\"data-sifra-zaposleni\");\r\n if (!isUnDefined(_trId)) {\r\n _rowId = _trId.toString()\r\n }\r\n if (_rowId) {\r\n txtValue = _rowId.toUpperCase();\r\n if (isEmpty(filterZaposleni)) {\r\n tr[i].style.display = \"none\";\r\n } else if (filterZaposleni.toUpperCase().indexOf(txtValue) > -1) {\r\n // filterZaposleni je izpolnjen, preveri se filterSkupina\r\n let dataSkupina = String($(tr[i]).data(\"sifraenoteorgstrukture\"));\r\n if (filterSkupina.toUpperCase().indexOf(dataSkupina.toUpperCase()) > -1) {\r\n tr[i].style.display = \"\";\r\n }\r\n else {\r\n tr[i].style.display = \"none\";\r\n }\r\n } else {\r\n tr[i].style.display = \"none\";\r\n }\r\n }\r\n }\r\n }\r\n\r\n getSelestedEmployeesIds(izbraneSkupine: string): string {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationCalendarView.getSelestedEmployeesIds\");\r\n\r\n let selectedEmployeesIds: string = \"\";\r\n let arrayIzbraneSkupine = izbraneSkupine.split(',');\r\n for (var ind = 0; ind < arrayIzbraneSkupine.length; ind++) {\r\n if (arrayIzbraneSkupine[ind] != null && arrayIzbraneSkupine[ind].length > 0) {\r\n // preberemo seznam zaposlenih iz hidden text html elementov\r\n let hiddetTextHtmlId = \"#sifraEnoteOrgStrukture\" + arrayIzbraneSkupine[ind].trim();\r\n let valu = $(hiddetTextHtmlId).val();\r\n valu = valu.toString().trim()\r\n selectedEmployeesIds = selectedEmployeesIds + valu;\r\n if (ind < (arrayIzbraneSkupine.length - 1)) {\r\n selectedEmployeesIds = selectedEmployeesIds + \",\";\r\n } \r\n }\r\n }\r\n return selectedEmployeesIds;\r\n }\r\n\r\n afterPopoverMobileFilterShow(element: HTMLElement): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationCalendarView.afterPopoverMobileFilterShow\");\r\n\r\n let atrContent = element.getAttribute(\"data-popover-content\");\r\n // preverimo če je popup calendar filter\r\n if (atrContent === \"#popOverCalendarFilter\") {\r\n this._selectOrgMobileFilter = new SaopWebGridUnitOrgFilter(this._libname, \"Mobile\", \".popover\");\r\n this._selectOrgMobileFilter.filterZaposleniTableRows = this.categoriesFilter.bind(this);\r\n this._selectOrgMobileFilter.initFilterControls();\r\n\r\n this.setSelectSkupinaMobileFilterValues();\r\n this._selectOrgMobileFilter._selectSkupina.afterChangeCommonEvent = this.selectSkupinaMobileFilterChanged.bind(this);\r\n\r\n this.setSelectCategoryMobileFilterValues();\r\n this._selectOrgMobileFilter._selectZaposleni.afterChangeCommonEvent = this.selectCategoryMobileFilterChanged.bind(this);\r\n\r\n // dodamo custom css za filter\r\n let filterPopoverDiv = $(\"div.popover.show\");\r\n if (filterPopoverDiv != null) {\r\n let customCss = \"calendar-filter\";\r\n if (!filterPopoverDiv.hasClass(customCss)) {\r\n filterPopoverDiv.addClass(customCss);\r\n }\r\n }\r\n\r\n // dodamo custom css za filter\r\n let filterPopoverBodyDiv = $(\"div.popover.show\").find(\"div.popover-body\");\r\n if (filterPopoverBodyDiv != null) {\r\n let customCss = \"calendar-filter-body\";\r\n if (!filterPopoverBodyDiv.hasClass(customCss)) {\r\n filterPopoverBodyDiv.addClass(customCss);\r\n }\r\n }\r\n \r\n // prikazi filter okno\r\n let filterBody = $(\"div.popover.show\").find(\"#popOverCalendarFilterBody\");\r\n filterBody.show();\r\n }\r\n }\r\n\r\n setSelectSkupinaMobileFilterValues() {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationCalendarView.setSelectSkupinaMobileFilterValues\");\r\n\r\n let skupine = (this._selectOrgDesktopFilter._selectSkupina.selectedCB.val());\r\n\r\n this._selectOrgMobileFilter._selectSkupina.setSelectValues(skupine);\r\n }\r\n\r\n setSelectCategoryMobileFilterValues() {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationCalendarView.setSelectCategoryMobileFilterValues\");\r\n\r\n let zaposleni = (this._selectOrgDesktopFilter._selectZaposleni.selectedCB.val());\r\n\r\n var vodja = $(\"#AdminID\").val().toString();\r\n if (vodja !== null && vodja !== '' && zaposleni.indexOf(vodja) === -1) {\r\n zaposleni.push(vodja);\r\n }\r\n\r\n this._selectOrgMobileFilter._selectZaposleni.setSelectValues(zaposleni);\r\n }\r\n\r\n selectSkupinaMobileFilterChanged(element: any) {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationCalendarView.selectSkupinaMobileFilterChanged\");\r\n\r\n // shranimo vrednosti v desktop multiSelectSkupina element\r\n // avtomatsko se bodo nastavili tudi zaposleni v desktop filter elementu\r\n let izbraneSkupine = (this._selectOrgMobileFilter._selectSkupina.selectedCB.val());\r\n this._selectOrgDesktopFilter._selectSkupina.setSelectValues(izbraneSkupine);\r\n\r\n // preberemo oznacene zaposlene v desktop filter elementu\r\n // in nastavimo tudi zaposlene v mobile filter elementu\r\n this.setSelectCategoryMobileFilterValues();\r\n }\r\n\r\n selectCategoryMobileFilterChanged(element: any) {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationCalendarView.selectCategoryMobileFilterChanged\");\r\n\r\n // shranimo vrednosti v desktop Category element\r\n let izbraniZaposleni = (this._selectOrgMobileFilter._selectZaposleni.selectedCB.val());\r\n this._selectOrgDesktopFilter._selectZaposleni.setSelectValues(izbraniZaposleni);\r\n }\r\n\r\n showEmployeeLeaveCalendar(sifraZaposleni: string, nazivZaposleni: string): void {\r\n global.ConsoleLogDegug(\"SaopAbsenceConfirmationCalendarView.showSaopAbsenceConfirmationCalendarView\");\r\n\r\n this._saopRegKeZapDopustiView._sifraZaposleni = sifraZaposleni;\r\n this._saopRegKeZapDopustiView._nazivZaposleni = nazivZaposleni;\r\n this._saopRegKeZapDopustiView.setFullTitle();\r\n this._saopRegKeZapDopustiView.recordDetails({ sifraZaposleni: sifraZaposleni });\r\n this._saopRegKeZapDopustiView.SetToFullScreen();\r\n }\r\n\r\n filterData(element: any) {\r\n global.ConsoleLogDegug(\"SaopCalendar.filterData\");\r\n this.externalFilterData(element);\r\n }\r\n\r\n // external metoda za filter, ki lahko nadomesti this.categoriesFilter metodo\r\n externalFilterData(element: any) {\r\n global.ConsoleLogDegug(\"SaopCalendar.externalFilterData-default\");\r\n // klice default metodo\r\n this.categoriesFilter(element.val().toString());\r\n }\r\n\r\n categoriesFilter(filter: string = \"\") {\r\n // Declare variables\r\n var table, tr, _rowId, i, txtValue;\r\n table = document.getElementById(\"saop-calendar-table\");\r\n tr = table.getElementsByTagName(\"tr\");\r\n // Loop through all table rows, and hide those who don't match the search query\r\n for (i = 0; i < tr.length; i++) {\r\n _rowId = null;\r\n let _trId = $(tr[i]).attr(\"id\");\r\n if (!isUnDefined(_trId)) {\r\n _rowId = _trId.toString()\r\n }\r\n if (_rowId) {\r\n txtValue = _rowId.toUpperCase();\r\n if (isEmpty(filter)) {\r\n tr[i].style.display = \"none\";\r\n } else if (filter.toUpperCase().indexOf(txtValue) > -1) {\r\n tr[i].style.display = \"\";\r\n } else {\r\n tr[i].style.display = \"none\";\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n\r\n","import { SaopViewForm } from \"../core/saop-view-form\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { global } from \"../Common/saop-common\";\r\nimport { SaopTranslationService } from '../Core/saop-translate';\r\nimport { SaopRightSidebar, SaopRightSidebarView } from '../Components/saop-right-sidebar';\r\n\r\nexport class SaopEmployeeLeaveCalendar extends SaopViewForm {\r\n private _saopServicesCore: SaopServicesCore;\r\n private _yearCaption: string = \"yearCaption\";\r\n private _btnPreviousId: string = \"btnYearPrevious\";\r\n private _btnNextId: string = \"btnYearNext\";\r\n public _sifraZaposleni: string = \"\";\r\n public _nazivZaposleni: string = \"\";\r\n public rightSidebar: SaopRightSidebar;\r\n\r\n private _translationService: SaopTranslationService;\r\n //\r\n constructor(viewId: string, libName: string = \"\") {\r\n super(viewId, libName);\r\n\r\n this._translationService = new SaopTranslationService();\r\n this.setTerminologyList();\r\n\r\n this.addRecordEndpoint = \"\";\r\n this.editRecordEndpoint = \"AbsenceConfirmation/EmployeeAbsencesCalendarPartial\";\r\n this.deleteRecordEndpoint = \"\";\r\n this.fullScreen = true;\r\n\r\n this._saopServicesCore = new SaopServicesCore();\r\n\r\n this.afterViewShowSuccess = this.initView;\r\n this.afterSubmitSuccess = this.initView;\r\n\r\n }\r\n\r\n initRightSidebar() {\r\n this.rightSidebar = new SaopRightSidebar();\r\n this.rightSidebar.bindCarouselDiv(\"#right-sidebar-ajax\", SaopRightSidebarView.Absence);\r\n this.rightSidebar.refreshOdsotnostiEmployeeSummary(this._sifraZaposleni, \"#dopustZaKoriscenjeSummary\", \"#ureZaKoriscenjeSummary\");\r\n }\r\n\r\n setTerminologyList() {\r\n let dictionary: string[] = [\"Pregled odsotnosti\"];\r\n this._translationService.setTranslationsList(dictionary);\r\n } \r\n\r\n initView(): void {\r\n this.initRightSidebar();\r\n this.LoadViewEvents();\r\n }\r\n\r\n public LoadViewEvents(): void {\r\n global.ConsoleLogDegug(\"SaopEmployeeLeaveCalendar.bindGridEvents\");\r\n let _this = this;\r\n\r\n _this.fullTitle = _this._translationService.translate(\"Pregled odsotnosti\") + \": \" + _this._sifraZaposleni + \" - \" + _this._nazivZaposleni;\r\n\r\n $(\"#\" + this._btnPreviousId).off(\"click\");\r\n $(\"#\" + this._btnPreviousId).click(function () {\r\n global.ConsoleLogDegug(\"SaopEmployeeLeaveCalendar.btnPrevious.click\");\r\n let leto = _this.getCurrentCalendarYear() - 1;\r\n _this.refreshCalendarAllMonthsData(leto);\r\n });\r\n\r\n $(\"#\" + this._btnNextId).off(\"click\");\r\n $(\"#\" + this._btnNextId).click(function () {\r\n global.ConsoleLogDegug(\"SaopEmployeeLeaveCalendar.btnNext.click\");\r\n let leto = _this.getCurrentCalendarYear() + 1;\r\n _this.refreshCalendarAllMonthsData(leto);\r\n });\r\n\r\n $('[rel=\"tooltipCalendarDayDetails\"]').popover({\r\n content: function () {\r\n global.ConsoleLogDegug(\"SaopEmployeeLeaveCalendar.tooltipCalendarDayDetails.popover\");\r\n var content = $(this).attr(\"data-popover-content\");\r\n return $(content).children(\".popover-body\").html();\r\n }\r\n });\r\n }\r\n\r\n refreshCalendarAllMonthsData(leto: number): void {\r\n global.ConsoleLogDegug(\"SaopEmployeeLeaveCalendar.refreshCalendarAllMonthsData\");\r\n let _this = this;\r\n\r\n this._saopServicesCore.afterDone = function (response) {\r\n $(\"#regEmployeeAbsenceCalendar\").html(response);\r\n _this.LoadViewEvents();\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action: \"AbsenceConfirmation/EmployeeAbsencesYearCalendarPartial\"\r\n , type: \"GET\"\r\n , data: { leto: leto, sifraZaposleni: this._sifraZaposleni }\r\n , spinnerDivId: \"#saopLoading\"\r\n });\r\n }\r\n\r\n getCurrentCalendarYear(): number {\r\n global.ConsoleLogDegug(\"SaopEmployeeLeaveCalendar.getCurrentCalendarYear\");\r\n return $(\"#\" + this._yearCaption).data(\"year\");\r\n }\r\n\r\n public setFullTitle(): void {\r\n\r\n this.fullTitle = this._translationService.translate(\"Pregled odsotnosti\") + \": \" + this._sifraZaposleni + \" - \" + this._nazivZaposleni;\r\n }\r\n}\r\n\r\n\r\n","import { global, isEmpty, isUnDefined } from \"../Common/saop-common\";\r\nimport { SaopWebGrid, SaopWebGridProperties, SaopWebGridToolbar, SaopWebGridToolbarButton, SaopWebDataTable } from \"../Components/saop-grid\";\r\nimport { SaopEmployeeLeaveCalendar } from \"../AbsenceConfirmation/saop-employeeLeaveCalendar-view\";\r\nimport { SaopWebGridUnitOrgFilter } from \"../Components/saop-grid-filter-UnitOrg\";\r\n\r\nexport class KeEployeeLeaveListGrid {\r\n private libName: string;\r\n private _mainFormDiv: JQuery;\r\n private _searchValue: JQuery;\r\n\r\n private _selectOrgFilter: SaopWebGridUnitOrgFilter;\r\n\r\n //\r\n public webGrid1: SaopWebGrid;\r\n\r\n private _saopRegKeZapDopustiView: SaopEmployeeLeaveCalendar;\r\n\r\n constructor(libName: string) {\r\n this.libName = libName;\r\n\r\n this._saopRegKeZapDopustiView = new SaopEmployeeLeaveCalendar('#keEmployeeLeaveCalendar0', libName + \".saopRegKeZapDopustiView\");\r\n\r\n this._selectOrgFilter = new SaopWebGridUnitOrgFilter(libName, \"\");\r\n this._selectOrgFilter.filterZaposleniTableRows = this.filterZaposleniTableRows.bind(this);\r\n }\r\n\r\n initView() {\r\n this._mainFormDiv = $(\"#KeEmployeeLeaveListBrowseForm\");\r\n this.initWebGrid1();\r\n this._searchValue = this._mainFormDiv.find(\"#SearchValue\");\r\n this.initFilterControls();\r\n }\r\n\r\n initWebGrid1(){\r\n let wgId = \"#KeEmployeeLeaveList\";\r\n let captionToolbar = $(wgId).attr(\"caption-toolbar\");\r\n let toolbarItemsTemplateId = $(wgId).attr(\"toolbar-items-templateId\");\r\n //\r\n this.webGrid1 = new SaopWebGrid(this.libName+\".webGrid1\");\r\n let gridProperties: SaopWebGridProperties;\r\n let gridToolbar:SaopWebGridToolbar;\r\n let toolbarButtons:SaopWebGridToolbarButton[] = [];\r\n let dataTable:SaopWebDataTable;\r\n //\r\n\r\n let _this = this;\r\n //\r\n gridToolbar = { caption: captionToolbar, buttons: toolbarButtons, itemsTemplateId: toolbarItemsTemplateId };\r\n\r\n dataTable = { enabled: true }\r\n\r\n gridProperties = {\r\n gridId: wgId\r\n , togglePanel: { enabled: false }\r\n , toolbar: gridToolbar\r\n , dataTable: dataTable\r\n , css: \"max-height-KeEmployeeLeaveList\"\r\n };\r\n //\r\n this.webGrid1.init(gridProperties);\r\n\r\n $(document).on('click', '.categoryLink', function (e: any) {\r\n let _link = $(\"#\" + e.target.id).attr(\"link\");\r\n if (_link == null) {\r\n return;\r\n }\r\n\r\n const _data = JSON.parse(_link);\r\n _this.showEmployeeLeaveCalendar(_data.sifraZaposleni, _data.nazivZaposleni);\r\n });\r\n }\r\n\r\n initFilterControls(): void {\r\n let _this = this;\r\n this._searchValue.keyup(function () {\r\n let oTable = _this.webGrid1.dataTable;\r\n oTable.search($(this).val().toString()).draw() ;\r\n });\r\n\r\n this._selectOrgFilter.initFilterControls();\r\n }\r\n\r\n showEmployeeLeaveCalendar(sifraZaposleni: string, nazivZaposleni: string): void {\r\n global.ConsoleLogDegug(\"KeEployeeLeaveListGrid.showSaopAbsenceConfirmationCalendarView\");\r\n\r\n this._saopRegKeZapDopustiView._sifraZaposleni = sifraZaposleni;\r\n this._saopRegKeZapDopustiView._nazivZaposleni = nazivZaposleni;\r\n this._saopRegKeZapDopustiView.setFullTitle();\r\n this._saopRegKeZapDopustiView.recordDetails({ sifraZaposleni: sifraZaposleni});\r\n this._saopRegKeZapDopustiView.SetToFullScreen();\r\n }\r\n\r\n filterZaposleniTableRows(filterZaposleni: string) {\r\n // Declare variables\r\n var table, tr, _rowId, i, txtValue;\r\n table = document.getElementById(\"KeEmployeeLeaveList\");\r\n tr = table.getElementsByTagName(\"tr\");\r\n // Loop through all table rows, and hide those who don't match the search query\r\n for (i = 0; i < tr.length; i++) {\r\n _rowId = null;\r\n let _trId = $(tr[i]).attr(\"data-sifra-zaposleni\");\r\n if (!isUnDefined(_trId)) {\r\n _rowId = _trId.toString()\r\n }\r\n\r\n if (_rowId) {\r\n txtValue = _rowId.toUpperCase();\r\n if (isEmpty(filterZaposleni)) {\r\n $(tr[i]).addClass(\"element-hidden\");\r\n } else if (filterZaposleni.toUpperCase().indexOf(txtValue) > -1) {\r\n $(tr[i]).removeClass(\"element-hidden\");\r\n } else {\r\n $(tr[i]).addClass(\"element-hidden\");\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\nimport { SaopServicesCore, SaopServicesCoreResponse } from \"../Core/saop-services-core\";\r\nimport { SaopTranslationService } from '../Core/saop-translate';\r\n\r\nexport interface SaopPasswordCriterias {\r\n pwdCheck:boolean;\r\n pwdLengthCheck:boolean;\r\n pwdLengthSetting:number;\r\n pwdComplexityCheck :boolean;\r\n pwdMinLength :boolean;\r\n pwdContainsUpperCase :boolean;\r\n pwdContainsLowerCase :boolean;\r\n pwdContainsNumbers :boolean;\r\n pwdContainsSpecialChars :boolean;\r\n pwdNotContainsUserData :boolean;\r\n pwdHistoryCheck:boolean;\r\n pwdNotUsedYet :boolean;\r\n}\r\n\r\nexport class SaopChangePwdView {\r\n //\r\n private _translationService: SaopTranslationService;\r\n private _changePasswordForm :JQuery; \r\n\r\n constructor(viewId:string,libName:string = \"\") {\r\n this._changePasswordForm = $(viewId);\r\n this._translationService = new SaopTranslationService();\r\n this.setTerminologyList();\r\n }\r\n\r\n setTerminologyList(){\r\n let _terminology: string[] = ['vsaj {0} znakov'];\r\n this._translationService.setTranslationsList(_terminology);\r\n }\r\n\r\n initView(): void {\r\n global.ConsoleLogDegug(\"SaopChangePwdView.initView\");\r\n\r\n this.bindViewEvents(); \r\n \r\n this.checkPasswordStrength();\r\n }\r\n\r\n bindViewEvents(){\r\n global.ConsoleLogDegug(\"SaopChangePwdView.bindGridEvents\");\r\n let _this = this;\r\n //\r\n let _NewPassword = this._changePasswordForm.find(\"#NewPassword\");\r\n _NewPassword.off(\"change\");\r\n _NewPassword.on('change', function (row) {\r\n _this.checkPasswordStrength();\r\n }); \r\n }\r\n\r\n fsetPwdClass(condition:boolean, divId:string):void {\r\n let okStatusCss = \"left saop-cl-green saop-img-check-mark-solid si-s\";\r\n let warringStatusCss = \"left saop-cl-red saop-img-close-solid si-s\"; \r\n let _targetDiv = this._changePasswordForm.find(divId);\r\n\r\n _targetDiv.removeAttr( \"class\" );\r\n // _targetDiv.removeClass(function(){\r\n // return $(this).attr( \"class\" );\r\n // });\r\n\r\n if (condition == true) {\r\n _targetDiv.addClass(okStatusCss);\r\n } else {\r\n _targetDiv.addClass(warringStatusCss);\r\n }\r\n }\r\n\r\n setPwdComplexityDivVal(saopPasswordCriterias:SaopPasswordCriterias):void{\r\n this.fsetPwdClass(saopPasswordCriterias.pwdMinLength,\"#pwdMinLength\");\r\n this.fsetPwdClass(saopPasswordCriterias.pwdContainsUpperCase,\"#pwdContainsUpperCase\");\r\n this.fsetPwdClass(saopPasswordCriterias.pwdContainsLowerCase,\"#pwdContainsLowerCase\");\r\n this.fsetPwdClass(saopPasswordCriterias.pwdContainsNumbers,\"#pwdContainsNumbers\");\r\n this.fsetPwdClass(saopPasswordCriterias.pwdContainsSpecialChars,\"#pwdContainsSpecialChars\");\r\n this.fsetPwdClass(saopPasswordCriterias.pwdNotContainsUserData,\"#pwdNotContainsUserData\");\r\n this.fsetPwdClass(saopPasswordCriterias.pwdNotUsedYet,\"#pwdNotUsedYet\");\r\n //\r\n\r\n let _pwdCheckDiv = this._changePasswordForm.find(\"#pwdCheck\");\r\n if (_pwdCheckDiv.length > 0) {\r\n if (saopPasswordCriterias.pwdCheck == false){\r\n _pwdCheckDiv.remove();\r\n }\r\n }\r\n\r\n let _pwdHistoryCheckDiv = this._changePasswordForm.find(\"#pwdHistoryCheck\");\r\n if (_pwdHistoryCheckDiv.length > 0) {\r\n if (saopPasswordCriterias.pwdHistoryCheck == false){\r\n _pwdHistoryCheckDiv.remove();\r\n }\r\n }\r\n\r\n let _pwdComplexityDiv = this._changePasswordForm.find(\"#pwdComplexity\");\r\n if (_pwdComplexityDiv.length > 0) {\r\n if (saopPasswordCriterias.pwdComplexityCheck == false){\r\n _pwdComplexityDiv.remove();\r\n }\r\n }\r\n\r\n let _pwdLengthCheckDiv = this._changePasswordForm.find(\"#pwdLengthCheck\");\r\n if (_pwdLengthCheckDiv.length > 0) {\r\n let _pwdLengthSettingDiv = this._changePasswordForm.find(\"#pwdLengthSetting\");\r\n if (saopPasswordCriterias.pwdLengthCheck == false){\r\n _pwdLengthCheckDiv.remove();\r\n } else {\r\n let _pwdLengthSettingCaption = this._translationService.translate(\"vsaj {0} znakov\").replace(\"{0}\",saopPasswordCriterias.pwdLengthSetting.toString());\r\n _pwdLengthSettingDiv.html(_pwdLengthSettingCaption);\r\n }\r\n }\r\n //\r\n }\r\n\r\n public checkPasswordStrength():void{\r\n let _this = this;\r\n let _newPassword = this._changePasswordForm.find(\"#NewPassword\");\r\n let _password = _newPassword.val();\r\n\r\n let data = {password: _password};\r\n\r\n let _saopServicesCore = new SaopServicesCore(); \r\n _saopServicesCore.afterSuccess = function (response:SaopServicesCoreResponse) {\r\n let _saopPasswordCriterias = response.data as SaopPasswordCriterias;\r\n _this.setPwdComplexityDivVal(_saopPasswordCriterias);\r\n };\r\n _saopServicesCore.ExecuteAction({\r\n action: \"Settings/CheckPasswordStrength\"\r\n , data: data\r\n , type: \"POST\"\r\n }); \r\n }\r\n //\r\n}\r\n\r\n\r\n","/// \r\nimport { global, relodeCurrentPage } from \"../Common/saop-common\";\r\nimport { SaopViewForm } from \"../core/saop-view-form\";\r\nimport { OPNRelacijeSelect } from \"../OPN/OPNRelacije-select\";\r\nimport { OPNNalogeSelect } from \"../OPN/OPNNaloge-select\";\r\n\r\nexport class SaopAppSettingsView extends SaopViewForm { \r\n //private _viewForm:SaopViewForm;\r\n public _opnRelacijeSelect:OPNRelacijeSelect;\r\n public _opnNalogeSelect:OPNNalogeSelect;\r\n\r\n constructor(viewId:string,libName:string = \"\"){\r\n super(viewId,libName);\r\n //this.title = this.translationService.translate(\"\");\r\n this.addRecordEndpoint = \"\";\r\n this.editRecordEndpoint = \"\";\r\n this.deleteRecordEndpoint = \"\"; \r\n // \r\n this._opnRelacijeSelect = new OPNRelacijeSelect(this._libName+\"._opnRelacijeSelect\",{inputWidthPX:\"360px\"});\r\n this._opnNalogeSelect = new OPNNalogeSelect(this._libName+\"._opnNalogeSelect\",{inputWidthPX:\"360px\"});\r\n }\r\n\r\n setDictionary(){\r\n let dictionary:string[] = [\"Nastavitve\"];\r\n this.setTerminologyList(dictionary);\r\n } \r\n\r\n initView(): void {\r\n global.ConsoleLogDegug(\"SaopAppSettingsView.initView\");\r\n //\r\n this._opnRelacijeSelect.init(\"#SettingsOPN_PrivzetaSifraRelacije\");\r\n this._opnNalogeSelect.init(\"#SettingsOPN_PrivzetaSifraNaloge\");\r\n //\r\n this.bindViewEvents(); \r\n this.setWebDodajanjePnZaSopotnika();\r\n }\r\n\r\n bindViewEvents(){\r\n global.ConsoleLogDegug(\"SaopAppSettingsView.bindEvents\");\r\n let _this = this;\r\n //\r\n $(\".saop-sidebar-container .saop-sb-item\").off(\"click\");\r\n $(\".saop-sidebar-container .saop-sb-item\").on('click', function (e) {\r\n //\r\n let _currentTarget = e.currentTarget.id;\r\n var item = $('#'+_currentTarget);\r\n\r\n $(\".saop-sidebar-container .saop-sb-item-selected\").removeClass(\"saop-sb-item-selected\");//'un-color' previous item\r\n\r\n item.addClass(\"saop-sb-item-selected\");//color item\r\n\r\n if (_currentTarget == \"AppSettingsCommon\") {\r\n $(\"#AppSettingsCommonPan\").css(\"display\", \"\");\r\n $(\"#AppSettingsREGPan\").css(\"display\", \"none\");\r\n $(\"#AppSettingsKEPan\").css(\"display\", \"none\");\r\n $(\"#AppSettingsOPNPan\").css(\"display\", \"none\");\r\n } \r\n else if (_currentTarget == \"AppSettingsREG\") {\r\n $(\"#AppSettingsCommonPan\").css(\"display\", \"none\");\r\n $(\"#AppSettingsREGPan\").css(\"display\", \"\");\r\n $(\"#AppSettingsKEPan\").css(\"display\", \"none\");\r\n $(\"#AppSettingsOPNPan\").css(\"display\", \"none\"); \r\n }\r\n else if (_currentTarget == \"AppSettingsKE\") {\r\n $(\"#AppSettingsCommonPan\").css(\"display\", \"none\");\r\n $(\"#AppSettingsREGPan\").css(\"display\", \"none\");\r\n $(\"#AppSettingsKEPan\").css(\"display\", \"\");\r\n $(\"#AppSettingsOPNPan\").css(\"display\", \"none\"); \r\n }\r\n else if (_currentTarget == \"AppSettingsOPN\") {\r\n $(\"#AppSettingsCommonPan\").css(\"display\", \"none\");\r\n $(\"#AppSettingsREGPan\").css(\"display\", \"none\");\r\n $(\"#AppSettingsKEPan\").css(\"display\", \"none\");\r\n $(\"#AppSettingsOPNPan\").css(\"display\", \"\"); \r\n }\r\n }); \r\n \r\n $(\"#headerCloseButton\").click(function () {\r\n $(\"#btnCancel\").click();\r\n }); \r\n\r\n $('#SettingsOPN_WebDodajanjeSopotnika').change(function() {\r\n _this.setWebDodajanjePnZaSopotnika();\r\n }); \r\n \r\n $('#SettingsOPN_WebEmailObvescanje').change(function() {\r\n _this.setWebEmailZaObvescanje();\r\n }); \r\n\r\n }\r\n\r\n setWebDodajanjePnZaSopotnika():void {\r\n if($('#SettingsOPN_WebDodajanjeSopotnika').is(\":checked\")) {\r\n $(\"#WebDodajanjePnZaSopotnikaGroup\").css(\"display\",\"flex\");\r\n } else {\r\n $(\"#SettingsOPN_WebDodajanjePnZaSopotnika\").prop('checked', false);\r\n $(\"#WebDodajanjePnZaSopotnikaGroup\").css(\"display\",\"none\"); \r\n } \r\n }\r\n\r\n setWebEmailZaObvescanje():void {\r\n if($('#SettingsOPN_WebEmailObvescanje').is(\":checked\")) {\r\n $(\"#WebEmailZaObvescanjeGroup\").css(\"visibility\",\"unset\");\r\n } else {\r\n $(\"#WebEmailZaObvescanjeGroup\").css(\"visibility\",\"hidden\"); \r\n } \r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n","\r\nexport abstract class global {\r\n public static debugMode: boolean;\r\n public static siteBaseUrl: string;\r\n\r\n public static ConsoleLogDegug(message: any): void {\r\n if (this.debugMode) console.log(message);\r\n }\r\n\r\n public static GetClientLogModeStorageKeyValue(): string {\r\n return \"SaopMojInfo.globalClientLogModeVal\";\r\n }\r\n\r\n public static GetClientLogModeStorageValue(): boolean {\r\n let debugModeDefaultValue = false;\r\n\r\n var debugModeStringVal = ReadVariableFromStorage(global.GetClientLogModeStorageKeyValue());\r\n\r\n let debugModeVal = debugModeDefaultValue;\r\n if (debugModeStringVal) {\r\n debugModeVal = debugModeStringVal === \"true\" ? true : false;\r\n }\r\n\r\n return debugModeVal;\r\n }\r\n\r\n public static SetClientLogModeStorageValue(): void {\r\n let logMode = this.GetClientLogModeStorageValue();\r\n WriteVariableToStorage(global.GetClientLogModeStorageKeyValue(), !logMode);\r\n\r\n alertify.message(\"Client log mode enabled: \" + !logMode);\r\n }\r\n\r\n public static getSiteBaseUrl(): string {\r\n return $(\"#siteBaseUrl\").val() as string;\r\n }\r\n\r\n public static setHelpLink(): void {\r\n //nastavi help link, v odvisnosti od lokalizacije\r\n let svgHelp: any = document.getElementById('saop-help');\r\n\r\n if(svgHelp != null)\r\n {\r\n let language = svgHelp.getAttribute(\"data-language\");\r\n\r\n //počakamo da se gneszdeni objekt naloži\r\n svgHelp.addEventListener(\"load\", function () {\r\n if (svgHelp.contentDocument != null) {\r\n let svgHelpLink = svgHelp.contentDocument.getElementById(\"saop-help-link\");\r\n if (isUnDefined(svgHelpLink) == false) {\r\n if (language == \"hr\") {\r\n svgHelpLink.setAttribute(\"href\", \"http://help.saop.hr/hr/mojinfo\");\r\n }\r\n else if (language == \"sr\") {\r\n svgHelpLink.setAttribute(\"href\", \"http://www.saop.rs/icenter/100/uputstva-za-upotrebu/\");\r\n }\r\n else {\r\n svgHelpLink.setAttribute(\"href\", \"https://si-icenter.knowledgeowl.com/help/mojinfo-navodila-za-uporabo-prenovljenega-portala\");\r\n }\r\n }\r\n }\r\n });\r\n\r\n //zaradi braskalnik - mozilla firefox - izgleda, da je object ''loaded'' preden mu dodamo on loaded\r\n if($('#saop-help-link') != null)\r\n {\r\n const event = new Event('load');\r\n svgHelp.dispatchEvent(event);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function formatDate(date: Date, format: string): string {\r\n const to2 = (n: number): string => ((Math.abs(n) < 10 ? '0' : '') + Math.abs(n));\r\n return format.replace(/[ydmh]+/gi, (match: string): string => {\r\n switch (match) {\r\n case 'yyyy': return date.getFullYear().toString();\r\n case 'd': return date.getDate().toString();\r\n case 'dd': return to2(date.getDate());\r\n case 'm': return (date.getMonth() + 1).toString();\r\n case 'mm': return to2(date.getMonth() + 1);\r\n case 'H': return date.getHours().toString();\r\n case 'HH': return to2(date.getHours());\r\n case 'MM': return to2(date.getMinutes());\r\n default:\r\n return match;\r\n }\r\n });\r\n}\r\n\r\nexport function convertString2Date(stringDate: string, format: string): Date {\r\n global.ConsoleLogDegug(\"convertString2Date\");\r\n\r\n switch (format) {\r\n case \"dd.mm.yyyy\":\r\n let day = stringDate.substring(0, 2);\r\n let month = stringDate.substring(3, 5);\r\n let year = stringDate.substring(6, 10);\r\n\r\n return new Date(+year, +month - 1, +day);\r\n\r\n default:\r\n return null;\r\n }\r\n}\r\n\r\nexport function setModalFormZIndex(modalFormId: string): void {\r\n global.ConsoleLogDegug(\"setModalFormZIndex\");\r\n global.ConsoleLogDegug(\"modalFormId:\" + modalFormId);\r\n var zIndex = 1050 + (10 * $('.modal:visible').length);\r\n\r\n $(modalFormId).css('z-index', zIndex);\r\n setTimeout(function () {\r\n $('.modal-backdrop').not('.modal-stack').css('z-index', zIndex - 1).addClass('modal-stack');\r\n }, 0);\r\n}\r\n\r\nexport function isEmpty(str: string) {\r\n return (!str || str.length === 0);\r\n}\r\n\r\nexport function isUnDefined(_obj: any) {\r\n return (!_obj || _obj === null || typeof _obj === \"undefined\");\r\n}\r\n\r\nexport function isNotSet(_obj: any) {\r\n return (_obj === null || typeof _obj === \"undefined\");\r\n}\r\n\r\nexport function ReadVariableFromStorage(variableName: string): string {\r\n return localStorage.getItem(variableName);\r\n}\r\n\r\nexport function WriteVariableToStorage(variableName: string, value: any): void {\r\n localStorage.setItem(variableName, value);\r\n}\r\n\r\nexport function filterTableRows(filterVal: string, idTableElement: string): void {\r\n global.ConsoleLogDegug(\"filterTableRows\");\r\n\r\n let val = $.trim(filterVal).replace(/ +/g, ' ').toLowerCase();\r\n let rows = $(idTableElement + \" tr:has(td)\");\r\n\r\n rows.show().filter(function () {\r\n var _text = $(this).text().replace(/\\s+/g, ' ').toLowerCase();\r\n return !~_text.indexOf(val);\r\n }).hide();\r\n}\r\n\r\nexport function setFirstFormControlToFocus(formId: string): void {\r\n global.ConsoleLogDegug(\"setFirstFormControlToFocus\");\r\n\r\n // brez timeout funkcije focus ne dela :(\r\n setTimeout(function () {\r\n var firstFormControl = $(formId + \" .form-control:visible:not(:disabled):first\");\r\n if (firstFormControl) {\r\n firstFormControl.focus();\r\n }\r\n }, 500);\r\n}\r\n\r\nexport function getRelativeSiteURL(controller: string): string {\r\n let _url = window.location.href;\r\n let iC = _url.indexOf(controller);\r\n if (iC > 0) {\r\n return _url.substring(0, iC) + controller;\r\n } else {\r\n return window.location.href;\r\n }\r\n}\r\n\r\nexport function getSiteAbsoluteURL(relativePath: string): string {\r\n let controller = relativePath.split(\"/\")[0];\r\n let method = relativePath.replace(controller, \"\").replace(\"//\", \"\");\r\n\r\n // če relative path že vsebuje http, ga ne dodamo\r\n if (relativePath.indexOf(\"http\") >= 0) {\r\n return relativePath;\r\n }\r\n\r\n return global.siteBaseUrl + \"/\" + controller + method;\r\n}\r\n\r\nexport function relodeCurrentPage(): void {\r\n window.location.reload();\r\n}","/// \r\nimport { isUnDefined, global, formatDate } from \"../Common/saop-common\";\r\nimport { SaopTranslationService } from '../Core/saop-translate';\r\n\r\n\r\ndeclare global {\r\n interface JQuery {\r\n treeTable(opts?: any):any;\r\n }\r\n}\r\n\r\nexport interface SaopTreeTableParams {\r\n id:string;\r\n url:string\r\n columns: any;\r\n order:any;\r\n} \r\n\r\nexport class SaopTreeTable {\r\n private _translationService: SaopTranslationService;\r\n\r\n public libName: string; \r\n\r\n constructor(libName: string) {\r\n this.libName = libName;\r\n this._translationService = new SaopTranslationService();\r\n } \r\n\r\n setTerminologyList(){\r\n let _terminology: string[] = ['Ni podatkov za prikaz.','Urejanje stolpcev','Ponastavi stolpce','Shrani','Prekliči'];\r\n this._translationService.setTranslationsList(_terminology);\r\n }\r\n\r\n init(params:SaopTreeTableParams) {\r\n\r\n let _Msg_emptyTable = this._translationService.translate(\"Ni podatkov za prikaz.\")\r\n\r\n $(params.id).treeTable({\r\n ajax: {\r\n url: params.url\r\n ,type:\"GET\",\r\n dataSrc:''\r\n },\r\n orderCellsTop: false,\r\n \"paging\": false,\r\n \"autoWidth\": true, \r\n \"collapsed\": false,\r\n \"ordering\": false,\r\n \"orderable\": false,\r\n \"columns\": params.columns,\r\n initComplete: function () {\r\n $(params.id+\"_filter\").remove();\r\n $(params.id+\"_info\").remove(); \r\n $(params.id+\"_length\").remove(); \r\n $(params.id+\"_paginate\").remove(); \r\n $(params.id).css('width', '');\r\n //\r\n } \r\n ,order: params.order\r\n ,language : {emptyTable:_Msg_emptyTable,zeroRecords:_Msg_emptyTable}\r\n });\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { global, isEmpty, isUnDefined } from \"../Common/saop-common\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\n\r\nexport interface SaopAttachmentListParams {\r\n validationFingerprintController: string,\r\n validationFingerprintAction: string,\r\n validationFingerprintBannerDivId: string,\r\n validationController: string,\r\n validationAction: string,\r\n validationBannerDivId: string,\r\n downloadController: string,\r\n downloadAction: string,\r\n deletedAttachmentListId?: string;\r\n}\r\n\r\nexport class SaopAttachmentList {\r\n private _clibName: string;\r\n private _viewId: string;\r\n private _params: SaopAttachmentListParams;\r\n private _validationBanner: JQuery;\r\n\r\n constructor(viewId: string, libName: string = \"\"){\r\n this._clibName = libName;\r\n this._viewId = viewId;\r\n } \r\n\r\n initComponent(params: SaopAttachmentListParams){ \r\n global.ConsoleLogDegug(\"SaopAttachmentList.initComponent\");\r\n this._params = params;\r\n\r\n this.initWebControls()\r\n\r\n this.initWebGridListners();\r\n }\r\n\r\n initWebControls(): void {\r\n // spraznimo html element, ki vsebuje ID priponk, ki se jih zbrise, \r\n // se jih mora, ce se izvede post validacija edit forma in so napake na edit formu\r\n if (!isUnDefined(this._params.deletedAttachmentListId) && !isEmpty(this._params.deletedAttachmentListId)) {\r\n let element = $(this._params.deletedAttachmentListId);\r\n if (element.length) {\r\n element.val(\"\");\r\n }\r\n }\r\n }\r\n\r\n initWebGridListners() {\r\n global.ConsoleLogDegug(\"SaopAttachmentList.initWebGridListners\");\r\n\r\n let _this = this;\r\n\r\n $(this._viewId + \" .attachment_download\").off(\"click\");\r\n $(this._viewId + \" .attachment_download\").on('click', function () {\r\n global.ConsoleLogDegug(\"SaopAttachmentList.attachment_download.click\");\r\n\r\n let idDokumenta = this.getAttribute(\"data-iddokumenta\");\r\n let fingerprint = this.getAttribute(\"data-iddokumentafingerprint\");\r\n\r\n if (!isUnDefined(idDokumenta) && !isEmpty(idDokumenta)) {\r\n _this.downloadValidateAttachmentFingerPrint(idDokumenta, fingerprint);\r\n }\r\n });\r\n\r\n $(this._viewId + \" .attachment_delete\").off(\"click\");\r\n $(this._viewId + \" .attachment_delete\").on('click', function () {\r\n global.ConsoleLogDegug(\"SaopAttachmentList.attachment_delete.click\");\r\n\r\n let idDokumenta = this.getAttribute(\"data-iddokumenta\");\r\n let fingerPrint = this.getAttribute(\"data-iddokumentafingerprint\");\r\n\r\n if (!isUnDefined(idDokumenta) && !isEmpty(idDokumenta)) {\r\n let htmlDeleteElement = $(this).closest(\"tr\")[0];\r\n _this.deleteValidateAttachmentFingerPrint(htmlDeleteElement, idDokumenta, fingerPrint);\r\n }\r\n });\r\n }\r\n\r\n downloadValidateAttachmentFingerPrint(idDokumenta: string, fingerPrint: string): void {\r\n global.ConsoleLogDegug(\"SaopAttachmentList.downloadValidateAttachmentFingerPrint\");\r\n\r\n let _this = this;\r\n let params = { documentID: idDokumenta, fingerPrint: fingerPrint };\r\n this._validationBanner = $(this._params.validationFingerprintBannerDivId);\r\n\r\n let saopServicesCore = new SaopServicesCore();\r\n saopServicesCore.afterDone = function (response) {\r\n if (response.success == false) {\r\n _this._validationBanner.html(response.viewContent);\r\n _this._validationBanner.focus();\r\n\r\n return;\r\n }\r\n\r\n // ni napake, validate priponko\r\n _this.downloadValidateAttachment(idDokumenta);\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: this._params.validationFingerprintController + \"/\" + this._params.validationFingerprintAction\r\n , data: params\r\n , type: \"POST\"\r\n });\r\n }\r\n\r\n downloadValidateAttachment(idDokumenta: string): void {\r\n global.ConsoleLogDegug(\"SaopAttachmentList.downloadValidateAttachment\");\r\n\r\n let _this = this;\r\n let params = { documentID: idDokumenta };\r\n this._validationBanner = $(this._params.validationBannerDivId);\r\n\r\n let saopServicesCore = new SaopServicesCore();\r\n saopServicesCore.afterDone = function (response) {\r\n if (response.success == false) {\r\n _this._validationBanner.html(response.viewContent);\r\n _this._validationBanner.focus();\r\n\r\n return;\r\n }\r\n\r\n // ni napake, download priponko\r\n _this.downloadAttachment(idDokumenta);\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: this._params.validationController + \"/\" + this._params.validationAction\r\n , data: params\r\n , type: \"POST\"\r\n });\r\n }\r\n\r\n downloadAttachment(idDokumenta: string): void {\r\n global.ConsoleLogDegug(\"SaopAttachmentList.downloadAttachment\");\r\n\r\n let params = { documentID: idDokumenta };\r\n let saopServicesCore = new SaopServicesCore();\r\n \r\n saopServicesCore.ExecuteBlobAction({\r\n action: this._params.downloadController + \"/\" + this._params.downloadAction\r\n , data: params\r\n });\r\n }\r\n\r\n deleteValidateAttachmentFingerPrint(htmlElement: HTMLElement, idDokumenta: string, fingerPrint: string): void {\r\n global.ConsoleLogDegug(\"SaopAttachmentList.deleteValidateAttachmentFingerPrint\");\r\n\r\n let _this = this;\r\n let params = { documentID: idDokumenta, fingerPrint: fingerPrint };\r\n this._validationBanner = $(this._params.validationFingerprintBannerDivId);\r\n\r\n let saopServicesCore = new SaopServicesCore();\r\n saopServicesCore.afterDone = function (response) {\r\n if (response.success == false) {\r\n _this._validationBanner.html(response.viewContent);\r\n _this._validationBanner.focus();\r\n\r\n return;\r\n }\r\n\r\n // ni napake\r\n _this.deleteValidateAttachment(htmlElement, idDokumenta);\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: this._params.validationFingerprintController + \"/\" + this._params.validationFingerprintAction\r\n , data: params\r\n , type: \"POST\"\r\n }); \r\n }\r\n\r\n deleteValidateAttachment(htmlElement: HTMLElement, idDokumenta: string): void {\r\n global.ConsoleLogDegug(\"SaopAttachmentList.deleteValidateAttachment\");\r\n\r\n htmlElement.remove();\r\n\r\n if (!isUnDefined(this._params.deletedAttachmentListId) && !isEmpty(this._params.deletedAttachmentListId)) {\r\n // id dokumenta dodamo v seznam brisanih priponk,\r\n // da se lahko pri shranjevanjnu dokumenta(komponenta je lahko na edit formah) lahko na serverju pobrisejo \r\n let element = $(this._params.deletedAttachmentListId);\r\n if (element.length) {\r\n let elemetValue = element.val() + \",\" + idDokumenta;\r\n element.val(elemetValue);\r\n }\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { global, isEmpty, isUnDefined } from \"../Common/saop-common\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { SaopMultiselect } from \"./saop-multiselect\";\r\nimport { SaopPopover } from \"../Components/saop-popover\";\r\n\r\nexport enum SaopCalendarNavigation {\r\n refreshCell = -1\r\n , refreshTableData = 0\r\n , gotoPrevious = 1\r\n , gotoNext = 2\r\n}\r\n\r\nexport interface SaopCalendarParams {\r\n controller:string,\r\n action:string,\r\n partialRender?:boolean\r\n}\r\n\r\nexport class SaopCalendar {\r\n private _libName: string;\r\n private _params:SaopCalendarParams;\r\n private _saopServicesCore: SaopServicesCore;\r\n private _formFrame: JQuery;\r\n private _formData: JQuery;\r\n private _monthCaption: JQuery;\r\n private _btnPrevious: JQuery;\r\n private _btnNext: JQuery;\r\n \r\n private _saopPopover: SaopPopover;\r\n //\r\n get formData(): JQuery {\r\n return this._formData;\r\n }\r\n\r\n constructor(libName: string = \"\") {\r\n global.ConsoleLogDegug(\"SaopCalendar\");\r\n this._libName = libName;\r\n this._saopServicesCore = new SaopServicesCore();\r\n this._saopPopover = new SaopPopover('day-container-event');\r\n }\r\n\r\n initView(params:SaopCalendarParams) {\r\n global.ConsoleLogDegug(\"SaopCalendar.initView\");\r\n $(\"#saop-calendar-form\").hide();\r\n let _this = this;\r\n this._params = params;\r\n this.bindDivs();\r\n //this.initMultiSelect();\r\n\r\n $(window).resize(function () {\r\n _this.setTableHeigth();\r\n _this.setTableTdWidth();\r\n }).resize();\r\n\r\n this._saopPopover.bindPopoverEvents();\r\n\r\n $(\"#saop-calendar-form\").show();\r\n }\r\n\r\n setTableHeigth(){\r\n var bodyheight = $(document).height();\r\n $(\"#saop-calendar-data\").height(bodyheight-250); \r\n }\r\n\r\n setTableTdWidth() {\r\n $(\".daygrid-event\").each(function () {\r\n // Get the width of the parent element\r\n var parentWidth = $(this).parent().outerWidth(true);\r\n if (parentWidth <= 53) {\r\n parentWidth = 53;\r\n }\r\n // Get the width of the current element\r\n var width = $(this).width();\r\n // Divide the width by 53\r\n var result = Number($(this).attr('data-days-num'));\r\n // Set the new width for the current element\r\n $(this).width(result * parentWidth);\r\n });\r\n }\r\n\r\n bindDivs() {\r\n global.ConsoleLogDegug(\"SaopCalendar.bindDivs\");\r\n let _this = this;\r\n this._formFrame = $(\"#saop-calendar-form\");\r\n this._formData = this._formFrame.find(\"#saop-calendar-data\");\r\n this._monthCaption = $(\"#monthCaption\");\r\n this._btnPrevious = this._formFrame.find(\"#btnPrevious\");\r\n this._btnNext = this._formFrame.find(\"#btnNext\");\r\n //\r\n this._btnPrevious.off(\"click\");\r\n this._btnPrevious.click(function () {\r\n global.ConsoleLogDegug(\"SaopCalendar._btnPrevious\");\r\n _this.refreshData(SaopCalendarNavigation.gotoPrevious);\r\n });\r\n this._btnNext.off(\"click\");\r\n this._btnNext.click(function () {\r\n global.ConsoleLogDegug(\"SaopCalendar._btnNext\");\r\n _this.refreshData(SaopCalendarNavigation.gotoNext);\r\n });\r\n }\r\n\r\n bindCaptions() {\r\n global.ConsoleLogDegug(\"SaopCalendar.bindCaptions\");\r\n this._formData = this._formFrame.find(\"#saop-calendar-data\");\r\n let dataPeriodCaption = this._formData.attr(\"data-periodCaption\");\r\n let dataYear = this._formData.attr(\"data-year\"); \r\n this._monthCaption.html(dataPeriodCaption+\" \"+dataYear);\r\n }\r\n\r\n refreshData(action: SaopCalendarNavigation,cellId?:string) {\r\n global.ConsoleLogDegug(\"SaopCalendar.refreshData\");\r\n let dataYear = this._formData.attr(\"data-year\");\r\n let dataMonth = this._formData.attr(\"data-month\");\r\n let actionM = SaopCalendarNavigation.refreshTableData.toString();\r\n if (action == SaopCalendarNavigation.gotoPrevious) {\r\n actionM = SaopCalendarNavigation.gotoPrevious.toString();\r\n } else if (action == SaopCalendarNavigation.gotoNext) {\r\n actionM = SaopCalendarNavigation.gotoNext.toString();\r\n }\r\n if (action == SaopCalendarNavigation.refreshTableData || this._params.partialRender == null || this._params.partialRender == true){\r\n this.refreshTableDataAjaxCall(dataYear, dataMonth, actionM, cellId);\r\n } else {\r\n window.location.href = \"../\"+this._params.controller+\"/\"+this._params.action+\"?periodYYYY=\" + dataYear + \"&periodMM=\"+dataMonth+\"&periodAction=\"+actionM;\r\n }\r\n }\r\n\r\n refreshTableDataAjaxCall(periodYear: string, periodMonth: string, actionM: string, cellId?:string): void {\r\n global.ConsoleLogDegug(\"SaopCalendar.refreshTableDataAjaxCall\");\r\n let _this = this;\r\n this._saopServicesCore.afterDone = function (response) {\r\n if(!isEmpty(cellId)) {\r\n _this.refreshCellData(response,cellId);\r\n } else {\r\n $(\"#saop-calendar-data\").parent().html(response);\r\n _this.bindCaptions();\r\n }\r\n _this._saopPopover.bindPopoverEvents();\r\n _this.setTableHeigth();\r\n _this.setTableTdWidth();\r\n //_this.filterData(_this._multiSelectCategory.selectedCB);\r\n _this.afterRefreshTableData(response); \r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action: \"\"+this._params.controller+\"/\"+this._params.action+\"?periodYYYY=\" + periodYear + \"&periodMM=\" + periodMonth + \"&periodAction=\" + actionM + \"&partial=true\"\r\n , type: \"GET\"\r\n });\r\n }\r\n\r\n afterRefreshTableData(e: any) {\r\n global.ConsoleLogDegug(\"SaopCalendar.afterRefreshTableData\");\r\n }\r\n\r\n refreshCellData(htmlResponse:string,elementId:string): void {\r\n global.ConsoleLogDegug(\"SaopCalendar.refreshCellData\");\r\n let _document = $(htmlResponse);\r\n let _cell = _document.find(elementId);\r\n $(elementId).replaceWith(_cell);\r\n }\r\n\r\n //filterData(element: any) {\r\n // global.ConsoleLogDegug(\"SaopCalendar.filterData\");\r\n // this.externalFilterData(element);\r\n //}\r\n\r\n //// external metoda za filter, ki lahko nadomesti this.categoriesFilter metodo\r\n //externalFilterData(element: any) {\r\n // global.ConsoleLogDegug(\"SaopCalendar.externalFilterData-default\");\r\n // // klice default metodo\r\n // this.categoriesFilter(element.val().toString());\r\n //}\r\n\r\n //initMultiSelect() {\r\n // this._multiSelectCategory = new SaopMultiselect();\r\n // this._multiSelectCategory.afterChangeCommonEvent = this.filterData.bind(this);\r\n // this._multiSelectCategory.init(\"#Categories\", \"Zaposleni za prikaz\");\r\n //}\r\n\r\n //categoriesFilter(filter: string = \"\") {\r\n // // Declare variables\r\n // var table, tr, _rowId, i, txtValue;\r\n // table = document.getElementById(\"saop-calendar-table\");\r\n // tr = table.getElementsByTagName(\"tr\");\r\n // // Loop through all table rows, and hide those who don't match the search query\r\n // for (i = 0; i < tr.length; i++) {\r\n // _rowId = null;\r\n // let _trId = $(tr[i]).attr(\"id\");\r\n // if (!isUnDefined(_trId)) {\r\n // _rowId = _trId.toString()\r\n // } \r\n // if (_rowId) {\r\n // txtValue = _rowId.toUpperCase();\r\n // if (isEmpty(filter)) {\r\n // tr[i].style.display = \"none\";\r\n // } else if (filter.toUpperCase().indexOf(txtValue) > -1) {\r\n // tr[i].style.display = \"\";\r\n // } else {\r\n // tr[i].style.display = \"none\";\r\n // }\r\n // }\r\n // }\r\n //}\r\n\r\n getHeaderControlGroupId(): string {\r\n return \"saop-calendar-form-header-control-group\";\r\n }\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\n\r\nexport class SaopCheckboxSwitch {\r\n\r\n init(parentElement: string = \"\") {\r\n this.checkboxSwitchOnClick(parentElement);\r\n this.switchLabelOnClick(parentElement);\r\n }\r\n\r\n checkboxSwitchOnClick(parentElement: string) {\r\n global.ConsoleLogDegug(\"saop-switch-checkbox...\");\r\n global.ConsoleLogDegug(\"saop-switch-checkbox parentElement: \" + parentElement);\r\n\r\n let _frame = $(\"\" + parentElement + \" *>.saop-switch-checkbox\");\r\n _frame.off(\"click\");\r\n _frame.click(function (event: any) {\r\n let _checkBox = event.target;\r\n let _atrParent = \"#\"+$(_checkBox).attr(\"for\");\r\n let _checkBoxP = $(\"\" + parentElement + \" *>\" + _atrParent);\r\n let _label1 = _checkBoxP.find(\"#saop-switch-label1\");\r\n let _label2 = _checkBoxP.find(\"#saop-switch-label2\");\r\n if (_checkBox.checked) {\r\n global.ConsoleLogDegug(\"checked\");\r\n _label1.removeClass('switch-label-on');\r\n _label1.addClass('switch-label-off');\r\n _label2.removeClass('switch-label-off');\r\n _label2.addClass('switch-label-on');\r\n } else {\r\n global.ConsoleLogDegug(\"unchecked\");\r\n _label1.removeClass('switch-label-off');\r\n _label1.addClass('switch-label-on');\r\n _label2.removeClass('switch-label-on');\r\n _label2.addClass('switch-label-off');\r\n }\r\n });\r\n }\r\n\r\n switchLabelOnClick(parentElement: string) {\r\n global.ConsoleLogDegug(\"saop-switch-label...\");\r\n global.ConsoleLogDegug(\"saop-switch-label parentElement: \" + parentElement);\r\n\r\n let _frame = $(\"\" + parentElement + \" *>.saop-switch-label\");\r\n _frame.off(\"click\");\r\n _frame.click(function (event: any) {\r\n let _switchLabel = event.target;\r\n let _atrCheckBox = \"#\"+$(_switchLabel).attr(\"for\");\r\n let _checkBox = $(_atrCheckBox);\r\n $(_checkBox).prop( 'checked', 'flase');\r\n });\r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\n\r\nexport class SaopExport {\r\n private _libName: string;\r\n //\r\n \r\n constructor(libName: string = \"\") {\r\n global.ConsoleLogDegug(\"SaopExport\");\r\n this._libName = libName;\r\n }\r\n\r\n public exportData2Csv(data: string[][], fileName: string = \"ExportData.csv\") {\r\n global.ConsoleLogDegug(\"SaopExport.exportData2Csv\");\r\n\r\n let csv = this.arrayToCsv(data);\r\n\r\n this.downloadBlob(\"\\uFEFF\" + csv, fileName, 'text/csv;charset=utf-8;');\r\n }\r\n\r\n public exportTableData2Csv(tableSelector: string, fileName: string = \"ExportData.csv\") {\r\n global.ConsoleLogDegug(\"SaopExport.exportTableData2Csv\");\r\n\r\n let data = this.getTableData(tableSelector);\r\n\r\n this.exportData2Csv(data, fileName);\r\n }\r\n\r\n private arrayToCsv(data: string[][], csvDelimiter: string = \";\") {\r\n global.ConsoleLogDegug(\"SaopExport.arrayToCsv\");\r\n\r\n let csvData = data.map(row =>\r\n row\r\n .map(String) // convert every value to String\r\n .map(v => v.replace('\"', '\"\"')) // escape double colons\r\n .map(v => `\"${v}\"`) // quote it\r\n .join(csvDelimiter) // comma-separated\r\n ).join('\\r\\n'); // rows starting on new lines\r\n\r\n return csvData;\r\n }\r\n\r\n private downloadBlob(content: string, filename: string, contentType: string) {\r\n global.ConsoleLogDegug(\"SaopExport.downloadBlob\");\r\n\r\n // Create a blob\r\n var blob = new Blob([content], { type: contentType });\r\n var url = URL.createObjectURL(blob);\r\n\r\n // Create a link to download it\r\n var pom = document.createElement('a');\r\n pom.href = url;\r\n pom.setAttribute('download', filename);\r\n pom.click();\r\n pom.remove();\r\n }\r\n\r\n private getTableData(tableSelector: string): string[][] {\r\n global.ConsoleLogDegug(\"SaopExport.getTableData\");\r\n\r\n let result: string[][] = [];\r\n\r\n // najprej dodamo headerje\r\n let headerRow: string[] = [];\r\n let tedenCaptionheaderDivs = $(tableSelector + ' thead tr th:not(.element-hidden) div.saop-table-header-caption');\r\n tedenCaptionheaderDivs.each(function (index, element) {\r\n headerRow.push(element.innerText.trim());\r\n });\r\n result.push(headerRow);\r\n\r\n // dodamo vrstice z podatki\r\n let tableRows = $(tableSelector + ' tbody tr:not(.element-hidden)'); \r\n tableRows.each(function (index, rowElement) {\r\n // za vsako vrstico poiscemo podatke iz stopcev vrstice\r\n let oneRowData: string[] = [];\r\n $(rowElement).find('td:not(.element-hidden)').each(function (index, colElement) {\r\n oneRowData.push(colElement.innerText.trim())\r\n });\r\n\r\n result.push(oneRowData);\r\n });\r\n\r\n return result;\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\n\r\nexport class SaopFloatingLabel {\r\n\r\n init() {\r\n let _this = this;\r\n //$('.has-float-label > .form-control').off(\"focus\",_this.saopInputOnFocus);\r\n //$('.has-float-label > .form-control').on(\"focus\",_this.saopInputOnFocus);\r\n $('.has-float-label > .form-control:not([readonly=\"readonly\"])').off(\"focus\", _this.saopInputOnFocus);\r\n $('.has-float-label > .form-control:not([readonly=\"readonly\"])').on(\"focus\", _this.saopInputOnFocus);\r\n\r\n $('.has-float-label > .form-control').off(\"blur\",_this.saopInputOnBlur);\r\n $('.has-float-label > .form-control').on(\"blur\",_this.saopInputOnBlur);\r\n \r\n $('.has-float-label > .form-control').off(\"focusout\",_this.saopInputOnChange);\r\n $('.has-float-label > .form-control').on(\"focusout\",_this.saopInputOnChange);\r\n\r\n }\r\n\r\n saopInputOnChange(e:any) {\r\n global.ConsoleLogDegug(\"saop-floating-label...saopInputOnChange\");\r\n let htmlElement = e.target;\r\n let _node = $(\"#\"+htmlElement.id);\r\n if (_node.length > 0){\r\n let _parentN = _node.parent();\r\n if (_parentN.length > 0){\r\n _parentN.removeClass(\"saop-error-input\");\r\n let _label = _parentN.find(\".text-danger\");\r\n if (_label.length > 0){\r\n _label.remove();\r\n }\r\n }\r\n }\r\n } \r\n\r\n saopInputOnFocus(e:any) {\r\n global.ConsoleLogDegug(\"saop-floating-label...\");\r\n //barvanje \"floating label\"\r\n let htmlElement = e.target;\r\n htmlElement.parentElement.querySelector('.saop-floating-label').classList.add(\"saop-txt-primary\");\r\n }\r\n \r\n saopInputOnBlur(e:any) {\r\n global.ConsoleLogDegug(\"saop-floating-label...\");\r\n //barvanje \"floating label\" on input blur (focus lost) nazaj v sivo (remove razred \"saop-txt-primary\")\r\n let htmlElement = e.target;\r\n htmlElement.parentElement.querySelector('.saop-floating-label').classList.remove(\"saop-txt-primary\");\r\n }\r\n\r\n\r\n setCaptionAsRequired(labelId:string,required:boolean):void{\r\n let _element = $(labelId);\r\n let _elementVal = _element.text().toString();\r\n _elementVal = _elementVal.replace(\"*\",\"\");\r\n if (required) {\r\n _element.text(_elementVal+\"*\");\r\n } else {\r\n _element.text(_elementVal);\r\n }\r\n } \r\n\r\n setValidationErrorById(labelId:string, valMessage:string):void{\r\n let _inputElement = $(labelId)[0] as HTMLInputElement; //input\r\n this.setValidationError(_inputElement, valMessage);\r\n }\r\n\r\n setValidationError(inputElement:HTMLInputElement, valMessage:string):void{\r\n let _inputElement = $(inputElement);\r\n let _spanElement = _inputElement.parent(); //has-float-label\r\n if (_spanElement.hasClass(\"saop-error-input\") == false) {\r\n let _placeholder = _inputElement.attr(\"placeholder\");\r\n _spanElement.addClass(\"saop-error-input\");\r\n if (_inputElement.hasClass(\"input-validation-error\") == false) {\r\n _inputElement.addClass(\"input-validation-error\");\r\n }\r\n let _message = valMessage.replace(\"{0}\",_placeholder);\r\n _spanElement.append('
'+_message+'
');\r\n }\r\n }\r\n\r\n\r\n //\r\n}","/// \r\nimport { global ,isUnDefined } from \"../Common/saop-common\";\r\nimport { SaopMessageBanner } from '../Components/saop-message-banner';\r\nimport { SaopFloatingLabel } from '../Components/saop-floating-label';\r\n\r\nexport class SaopGoogleMaps {\r\n private _saopFloatingLabel:SaopFloatingLabel = new SaopFloatingLabel();\r\n private _routes : string;\r\n private _msgRequred :string; \r\n private _viewElement : JQuery;\r\n //###\r\n private _geocoder = new google.maps.Geocoder(); \r\n private _map:google.maps.Map;\r\n private _marker:google.maps.Marker;\r\n private _directionsDisplay = new google.maps.DirectionsRenderer(); \r\n private _directionsService = new google.maps.DirectionsService(); \r\n //\r\n private _saopMessageBanner: SaopMessageBanner;\r\n\r\n constructor(libName: string = \"\") {\r\n global.ConsoleLogDegug(\"SaopGoogleMaps.constructor\"); \r\n }\r\n\r\n private initFieldAutocomplete(elementIs:string,countryCode:string):void{\r\n // Create the autocomplete object, restricting the search to geographical\r\n // location types. \r\n //\r\n let _this = this;\r\n let _inputField = $(elementIs)[0] as HTMLInputElement;\r\n let _inputFieldAutocomplete = new google.maps.places.Autocomplete(\r\n _inputField, {\r\n fields: [\"formatted_address\", \"geometry\", \"name\"],\r\n strictBounds: false,\r\n // types: ['geocode'],\r\n // fields: [\"name\", \"address_component\", \"formatted_address\", \"geometry.location\"],\r\n // componentRestrictions: { 'country': ['si','hr'] },\r\n });\r\n // // Set initial restrict to the greater list of countries.\r\n // _inputFieldAutocomplete.setComponentRestrictions({\r\n // 'country': [\"si\",\"hr\"]\r\n // });\r\n\r\n _inputFieldAutocomplete.addListener('place_changed', function() {\r\n _this.refreshMap();\r\n }.bind(this));\r\n\r\n if (isUnDefined(this._map) == false) {\r\n _inputFieldAutocomplete.bindTo(\"bounds\", this._map);\r\n } \r\n\r\n } \r\n\r\n getLocation():void {\r\n let _this = this;\r\n if (navigator.geolocation) {\r\n //navigator.geolocation.getCurrentPosition((position: any) => _this.showPosition(position));\r\n //navigator.geolocation.getCurrentPosition((position: GeolocationPosition) => console.log(position.coords.latitude));\r\n //\r\n navigator.geolocation.getCurrentPosition((position: GeolocationPosition) => new google.maps.LatLng(position.coords.latitude, position.coords.longitude));\r\n } else {\r\n alert(\"Geolocation is not supported by this browser.\");\r\n }\r\n } \r\n \r\n showPosition(position:any) {\r\n var lat = position.coords.latitude;\r\n var lng = position.coords.longitude;\r\n this._map.setCenter(new google.maps.LatLng(lat, lng));\r\n }\r\n\r\n public initView():void {\r\n global.ConsoleLogDegug(\"SaopGoogleMaps.initView\"); \r\n //\r\n this._viewElement = $('#GoogleMapsRoutes'); \r\n this._msgRequred = this._viewElement.find('#msgRequred').text();\r\n //\r\n let _this = this;\r\n window.onresize = function () {\r\n _this.setRowHeight();\r\n }; \r\n this.setRowHeight();\r\n //\r\n this._saopMessageBanner = new SaopMessageBanner(); \r\n //\r\n var address = \"Slovenija\";\r\n //###\r\n this._geocoder.geocode( { 'address': address, language:'sl'}, function(results:any, status:any) {\r\n if (status == google.maps.GeocoderStatus.OK)\r\n {\r\n let _map_canvas = _this._viewElement.find('#map_canvas')[0];\r\n\r\n let _lat = results[0].geometry.location;\r\n var myOptions = {\r\n zoom: 10,\r\n center: _lat\r\n }\r\n\r\n _this._map = new google.maps.Map(_map_canvas, myOptions);\r\n\r\n // const myLatLng = { lat: 45.953662, lng: 13.648237 };\r\n\r\n // _this._marker = new google.maps.Marker(\r\n // {\r\n // position: myLatLng,\r\n // map: _this._map\r\n // } \r\n // );\r\n\r\n // _this._marker.setPosition(results[0].geometry.location);\r\n // _this._marker.setMap(_this._map);\r\n\r\n _this._directionsDisplay.setMap(_this._map); \r\n }\r\n });\r\n //\r\n //this.getLocation();\r\n //\r\n this.LoadViewEvents(); \r\n //this.initAutocomplete(); \r\n }\r\n \r\n private setRowHeight():void {\r\n global.ConsoleLogDegug(\"setRowHeight...\");\r\n //let _height = $('#grid-toolbar-processed').height();\r\n let remaining_height = window.innerHeight - 200;\r\n this._viewElement.find('#GoogleMapsRoutesRow').height(remaining_height); \r\n }\r\n\r\n private LoadViewEvents():void {\r\n global.ConsoleLogDegug(\"SaopGoogleMaps.LoadViewEvents\"); \r\n let _this = this;\r\n\r\n //Dodaj naslov na seznam\r\n let _btnAddWaypoint = this._viewElement.find('#btnAddWaypoint');\r\n _btnAddWaypoint.off(\"click\");\r\n _btnAddWaypoint.on(\"click\",_this.addWaypoint.bind(_this));\r\n \r\n //Funkcija, ki se prikliče ob kliku gumba za sledenje poti\r\n let _btnCalculateDistance = this._viewElement.find('#btnCalculateDistance');\r\n _btnCalculateDistance.off(\"click\");\r\n _btnCalculateDistance.on(\"click\",_this.calculateDistance.bind(_this));\r\n\r\n let _cbchkStartEqualEnd = this._viewElement.find('#cbchkStartEqualEnd');\r\n _cbchkStartEqualEnd.off(\"change\");\r\n _cbchkStartEqualEnd.on(\"change\",_this.oncbchkStartEqualEndChange.bind(_this)); \r\n\r\n this.onSortableChange();\r\n \r\n };\r\n\r\n public delay(time:number):any {\r\n return new Promise(resolve => setTimeout(resolve, time));\r\n } \r\n\r\n private getNextId():string{\r\n let _id = Date.now().toString();\r\n let _e = this._viewElement.find('#waypoint_'+_id);\r\n global.ConsoleLogDegug(\"SaopGoogleMaps.getNextId:\"+'#waypoint_'+_id); \r\n while (_e.length > 0) {\r\n global.ConsoleLogDegug(\"SaopGoogleMaps.getNextId:\"+'#waypoint_'+_id+':duplicate');\r\n _id = Date.now().toString();\r\n _e = this._viewElement.find('#waypoint_'+_id);\r\n }\r\n return _id;\r\n } \r\n\r\n public addWaypoint(waypointDescription:string = \"\"):void{\r\n //control_panel\r\n global.ConsoleLogDegug(\"SaopGoogleMaps.addWaypoint\"); \r\n let _control_panel = this._viewElement.find('#control_panel'); \r\n let _waypointTemplate = _control_panel.find('#waypointTemplate');\r\n let _waypoint = _waypointTemplate.find('#waypoint');\r\n if (_control_panel.length > 0 && _waypointTemplate.length > 0 && _waypoint.length > 0) {\r\n let _placeholderText = _waypoint.attr(\"placeholder\");\r\n //let _length = _control_panel.children().length+1;\r\n let _wpId = this.getNextId(); \r\n let _cloneId = \"waypoint_\" + _wpId.toString();\r\n //this.delay(100);\r\n let _inputClone = \r\n _waypointTemplate\r\n .clone()\r\n .html(function(i, oldHTML) {\r\n let _newText = oldHTML.replace(/waypoint/g,_cloneId);\r\n var regex = new RegExp(_placeholderText, 'g');\r\n _newText = _newText.replace(regex,_placeholderText+_wpId.toString());\r\n return _newText;\r\n });\r\n\r\n _inputClone.attr(\"id\",\"waypoint_\"+_wpId.toString()+\"_row\");\r\n _inputClone.attr(\"delete-id\",\"waypoint_\"+_wpId.toString()+\"_del\");\r\n _inputClone.css(\"display\",\"flex\");\r\n\r\n _control_panel.append(_inputClone);\r\n\r\n //let _waypoint_del = _control_panel.find(\"#waypoint_\"+_length.toString()+\"_del\");\r\n // if (_waypoint_del.length > 0){\r\n // _waypoint_del.css(\"display\",\"block\");\r\n // }\r\n\r\n let _waypointClone = _control_panel.find(\"#waypoint_\"+_wpId.toString()+\"\");\r\n if (_waypointClone.length > 0) {\r\n this.initFieldAutocomplete(\"#\"+_waypointClone[0].id,\"si\"); \r\n if (waypointDescription.length > 0) {\r\n _waypointClone.val(waypointDescription.trim());\r\n }\r\n \r\n }\r\n }\r\n //\r\n this._saopFloatingLabel.init();\r\n this.onSortableChange();\r\n this.getRoutes();\r\n }\r\n\r\n public getRoutes():any{\r\n global.ConsoleLogDegug(\"SaopGoogleMaps.getRoutes\"); \r\n this._routes = \"\";\r\n\r\n let _list = this.getWaypoints();\r\n let _i = 0;\r\n for(var _index in _list)\r\n { \r\n let _element = _list[_index] as HTMLInputElement ;\r\n let _lableId = \"#lbl\"+_element.id;\r\n let _labelCaption = \"\";\r\n if (_i == 1) {\r\n _labelCaption = \"Začetna lokacija*\";\r\n } else if (_i == 2) {\r\n _labelCaption = \"Cilj*\";\r\n } else {\r\n _labelCaption = \"Cilj\"+(_i-1).toString()+\"*\"; \r\n }\r\n $(_lableId).text(_labelCaption);\r\n //console.log(\"val:\"+_element.value); \r\n //console.log($(\"#\"+_element.id).val()); \r\n let _wp = _element.value.replace(', Slovenija','');\r\n _wp = _wp.replace(', Slovenia','').trim();\r\n //\r\n\r\n\r\n if (_element.value.length > 0) {\r\n if (this._routes.length > 0) {\r\n _wp = \"; \"+_wp\r\n }\r\n this._routes = this._routes +_wp ;\r\n }\r\n _i = _i + 1;\r\n }\r\n\r\n return this._routes;\r\n }\r\n\r\n public getWaypoints(): HTMLElement[] {\r\n var _result : HTMLElement[] = [];\r\n let _control_panel = $('#GoogleMapsRoutes').find('#control_panel'); \r\n _control_panel.children().each(function () {\r\n let _input = $(this).find(\":input\");\r\n if (_input.length > 0) {\r\n if (_input[0] != null) {\r\n _result.push(_input[0]); \r\n }\r\n }\r\n });\r\n return _result;\r\n }\r\n\r\n public deleteWaypoint(e:any):void{\r\n let _control_panel = $('#GoogleMapsRoutes').find('#control_panel'); \r\n\r\n if (_control_panel.children().length == 3) {\r\n return;\r\n }\r\n\r\n let _btnDel = $(e as HTMLElement);\r\n let _rowId = _btnDel.attr(\"row-id\");\r\n\r\n if (_rowId != \"waypointTemplate\") {\r\n let _row = $(\"#\"+_rowId);\r\n if (_row.length > 0) {\r\n _row.remove();\r\n this.calculateDistance();\r\n }\r\n }\r\n }\r\n\r\n public calculateDistance():void{\r\n global.ConsoleLogDegug(\"SaopGoogleMaps.calculateDistance\"); \r\n this.getRoutes();\r\n //\r\n let _this = this;\r\n let _startWaypoint = \"\";\r\n let _endWaypoint = \"\";\r\n let _waypoints:any = [];\r\n let _validationErrors:boolean = false;\r\n \r\n let _list = this.getWaypoints();\r\n\r\n for (let i = 1; i < _list.length; i++) {\r\n let _element = _list[i] as HTMLInputElement ;\r\n if (_element.value.length > 0 ) {\r\n if (i == 1) {\r\n _startWaypoint = _element.value;\r\n } else if (i == _list.length-1) {\r\n _endWaypoint = _element.value;\r\n } else {\r\n _waypoints.push({location:_element.value,stopover:true}); \r\n }\r\n } else {\r\n _validationErrors = true; \r\n }\r\n // else if(_element.id != \"waypoint\" ) {\r\n // this._saopFloatingLabel.setValidationError(_element,this._msgRequred);\r\n // _validationErrors = true;\r\n // }\r\n }\r\n\r\n if (_validationErrors == true) {\r\n this._directionsDisplay.set('directions', null); ; \r\n }\r\n\r\n let _dobleDistance = false;\r\n let _cbchkStartEqualEnd = $('#GoogleMapsRoutes').find(\"#cbchkStartEqualEnd\");\r\n if (_cbchkStartEqualEnd.length > 0) {\r\n if (_cbchkStartEqualEnd.is(\":checked\")){\r\n _dobleDistance = true;\r\n }\r\n }\r\n\r\n if (_dobleDistance) {\r\n _waypoints.push({location:_endWaypoint,stopover:true}); \r\n _endWaypoint = _startWaypoint; \r\n }\r\n\r\n if (_startWaypoint.length > 0 && _waypoints.length > 0 && _waypoints[0].location.length > 0 ) {\r\n var request:google.maps.DirectionsRequest = {\r\n origin: _startWaypoint,\r\n destination: _endWaypoint,\r\n waypoints: _waypoints,\r\n optimizeWaypoints: false,\r\n travelMode: google.maps.TravelMode.DRIVING\r\n };\r\n \r\n this.renderDirectionsRequest(request);\r\n }\r\n\r\n\r\n\r\n }\r\n\r\n public renderDirectionsRequest(request:google.maps.DirectionsRequest){\r\n global.ConsoleLogDegug(\"SaopGoogleMaps.renderDirectionsRequest\"); \r\n global.ConsoleLogDegug(\"SaopGoogleMaps.request: \"+JSON.stringify(request)); \r\n //naredi zahtevo\r\n let _this = this;\r\n _this._directionsService.route(request, function(response:any, status:any) {\r\n if (status == google.maps.DirectionsStatus.OK) {\r\n _this._directionsDisplay.setDirections(response); // Če se uspešno vrne, upodobi zemljevid\r\n //\r\n var routes = response.routes;\r\n var distances = []; \r\n for (var i = 0; i < routes.length; i++) {\r\n\r\n var distance = 0;\r\n for (var j = 0; j < routes[i].legs.length; j++) {\r\n distance = distance + 1;\r\n let _rootDist = routes[i].legs[j].distance.value;\r\n distance = _rootDist + distance;\r\n //for each 'leg'(route between two waypoints) we get the distance and add it to \r\n }\r\n //Convert into kilometer\r\n distances.push(distance / 1000);\r\n //\r\n var maxDistance = distances.sort(function(a, b) {\r\n return a - b;\r\n });\r\n //Display distance having highest value.\r\n var outputDiv = $('#GoogleMapsRoutes').find('#distance');\r\n let __distance = Math.round(maxDistance[routes.length - 1]);\r\n // if (_dobleDistance) {\r\n // __distance = __distance * 2;\r\n // }\r\n outputDiv.val(__distance);\r\n } \r\n } \r\n else {\r\n //alert('Nekaj ​​je šlo narobe, preverite naslove.');\r\n let messages: string[] = [];\r\n messages.push(\"Prišlo je do napake pri iskanju poti\")\r\n _this._saopMessageBanner.show(messages); \r\n }\r\n }); \r\n }\r\n\r\n public refreshMap(){\r\n global.ConsoleLogDegug(\"SaopGoogleMaps.refreshMap\");\r\n this.delay(1000).then(() => $('#GoogleMapsRoutes').find('#btnCalculateDistance').click()); \r\n }\r\n\r\n public loadRoutesList(): void {\r\n this._viewElement = $('#GoogleMapsRoutes'); \r\n let _routesList = this._viewElement.find('#RoutesList');\r\n let _routesListString = _routesList.val() as string;\r\n \r\n if (_routesListString.length > 0) {\r\n let _routesArray = _routesListString.split(\";\");\r\n this.loadWaypoints(_routesArray);\r\n } else {\r\n this.loadWaypoints(null);\r\n }\r\n }\r\n\r\n public loadWaypoints(list:string[]):void {\r\n global.ConsoleLogDegug(\"SaopGoogleMaps.loadWaypoints\");\r\n this._viewElement = $('#GoogleMapsRoutes'); \r\n let _allWaypoints = this._viewElement.find(\"[delete-id]\");\r\n _allWaypoints.remove();\r\n //\r\n let _distance = this._viewElement.find('#distance');\r\n if (_distance.length > 0) {\r\n _distance.val(\"\");\r\n } \r\n //\r\n this._viewElement.find(\"#startpoint\").val(\"\");\r\n this._viewElement.find(\"#waypoint\").val(\"\");\r\n //\r\n let _initStartEndWaypoint = false;\r\n if (list == null) {\r\n _initStartEndWaypoint = true;\r\n list = [];\r\n list.push(\"\");\r\n list.push(\"\");\r\n }\r\n let _elementOrder = 0;\r\n for (let i = 0; i < list.length; i++) {\r\n if (list[i].length > 0 || _initStartEndWaypoint) {\r\n // if (_elementOrder == 0) {\r\n // this._viewElement.find(\"#startpoint\").val(list[i]); \r\n // } else if (_elementOrder == 1) {\r\n // this._viewElement.find(\"#waypoint\").val(list[i]); \r\n // } else {\r\n this.addWaypoint(list[i]);\r\n // }\r\n _elementOrder = _elementOrder + 1;\r\n }\r\n }\r\n //\r\n this.refreshMap();\r\n }\r\n\r\n public getDistance():string{\r\n this._viewElement = $('#GoogleMapsRoutes'); \r\n let _distanceString = this._viewElement.find('#distance').val() as string;\r\n return _distanceString;\r\n }\r\n\r\n public onmouseoverWaypoint(e:any):void{\r\n this._viewElement = $('#GoogleMapsRoutes'); \r\n let _control_panel = $('#GoogleMapsRoutes').find('#control_panel'); \r\n\r\n if (_control_panel.children().length == 3) {\r\n return;\r\n }\r\n\r\n let _waypointRow = $(e); \r\n let _deleteButtonId = _waypointRow.attr(\"delete-id\");\r\n $('#'+_deleteButtonId).css(\"display\",\"block\");\r\n } \r\n\r\n public onmouseoutWaypointFocus(e:any):void{\r\n this._viewElement = $('#GoogleMapsRoutes'); \r\n let _control_panel = $('#GoogleMapsRoutes').find('#control_panel'); \r\n\r\n if (_control_panel.children().length == 3) {\r\n return;\r\n }\r\n\r\n let _waypointRow = $(e); \r\n let _deleteButtonId = _waypointRow.attr(\"delete-id\");\r\n $('#'+_deleteButtonId).css(\"display\",\"none\");\r\n } \r\n\r\n private oncbchkStartEqualEndChange(e:any):void {\r\n // if (e.currentTarget.checked) {\r\n // alert('checked');\r\n // } else {\r\n // alert('not checked');\r\n // }\r\n this.calculateDistance();\r\n }\r\n\r\n private onSortableChange():void {\r\n this._viewElement.find('#control_panel').sortable({axis:'y',stop:this.calculateDistance.bind(this)}); \r\n }\r\n\r\n //\r\n}\r\n","import { global, isEmpty, isUnDefined } from \"../Common/saop-common\";\r\nimport { SaopMultiselect, SaopMultiselectOptions } from \"../Components/saop-multiselect\";\r\n\r\nexport class SaopWebGridUnitOrgFilter {\r\n private libName: string;\r\n\r\n public _selectSkupinaId: string;\r\n public _selectZaposleniId: string;\r\n\r\n public _selectSkupina: SaopMultiselect;\r\n public _selectZaposleni: SaopMultiselect;\r\n\r\n public izbraniZaposleni: string = \"\";\r\n\r\n constructor(libName: string, orgUnitFilterId: string = \"\", parentDiv: string = \"\") {\r\n this.libName = libName;\r\n\r\n if (!isEmpty(parentDiv)) { parentDiv = parentDiv + \" \"; }\r\n\r\n this._selectSkupinaId = parentDiv + \"#OrgUnitFilter\" + orgUnitFilterId;\r\n this._selectZaposleniId = parentDiv + \"#EmployeesFilter\" + orgUnitFilterId;\r\n }\r\n\r\n initFilterControls(): void {\r\n let _this = this;\r\n\r\n const options: SaopMultiselectOptions = {\r\n selectAll: false\r\n };\r\n this._selectSkupina = new SaopMultiselect(this.libName, options);\r\n this._selectSkupina.afterChangeCommonEvent = _this.filterSelectSkupinaData.bind(_this);\r\n this._selectSkupina.init(this._selectSkupinaId, \"Skupina za prikaz\");\r\n var data = _this._selectSkupina.selectedCB[0].getAttribute(\"data-default\");\r\n var valArr = data.split(\",\");\r\n\r\n this._selectZaposleni = new SaopMultiselect();\r\n this._selectZaposleni.afterChangeCommonEvent = this.filterTableRows.bind(this);\r\n this._selectZaposleni.init(this._selectZaposleniId, \"Zaposleni za prikaz\");\r\n\r\n this._selectSkupina.setSelectValues(valArr);\r\n\r\n var vodja = this._selectZaposleni.selectedCB[0].getAttribute(\"data-default\");\r\n valArr = this._selectZaposleni.selectedCB.val();\r\n if (vodja !== '' && data.indexOf(vodja) === -1) {\r\n valArr.push(vodja);\r\n }\r\n this._selectZaposleni.setSelectValues(valArr);\r\n }\r\n\r\n filterSelectSkupinaData(element: any) {\r\n global.ConsoleLogDegug(this.libName + \".filterSelectSkupinaData\");\r\n\r\n // preberemo, katere sifre zaposlenih sodijo v izbrane skupine\r\n let izbraneSkupine = (element.val().toString());\r\n let izbraneSifreZaposlenih: string[] = null;\r\n\r\n if (izbraneSkupine != null && izbraneSkupine.length > 0) {\r\n let izbraneSifreZaposlenihStr = this.getSelestedEmployeesIds(izbraneSkupine);\r\n izbraneSifreZaposlenih = izbraneSifreZaposlenihStr.split(\",\");\r\n }\r\n\r\n if (this._selectZaposleni != null) {\r\n this._selectZaposleni.setSelectValues(izbraneSifreZaposlenih);\r\n this.izbraniZaposleni = this._selectZaposleni.selectedCB.val().toString();\r\n }\r\n }\r\n\r\n filterTableRows() {\r\n global.ConsoleLogDegug(this.libName + \".filterTableRows\");\r\n\r\n // filter glede na izbrane sifre zaposlenih\r\n if (this._selectZaposleni) {\r\n this.filterSelectZaposleniData(this._selectZaposleni.selectedCB);\r\n }\r\n }\r\n\r\n filterSelectZaposleniData(element: any) {\r\n global.ConsoleLogDegug(this.libName + \".filterSelectZaposleniData\");\r\n\r\n // preberemo, katere sifre zaposlenih sodijo v izbrane skupine\r\n let izbraneSifreZaposlenih = (element.val().toString());\r\n\r\n // filter vrstic\r\n this.filterZaposleniTableRows(izbraneSifreZaposlenih);\r\n }\r\n\r\n\r\n getSelestedEmployeesIds(izbraneSkupine: string): string {\r\n global.ConsoleLogDegug(this.libName + \".getSelestedEmployeesIds\");\r\n\r\n let selectedEmployeesIds: string = \"\";\r\n let arrayIzbraneSkupine = izbraneSkupine.split(',');\r\n for (var ind = 0; ind < arrayIzbraneSkupine.length; ind++) {\r\n if (arrayIzbraneSkupine[ind] != null && arrayIzbraneSkupine[ind].length > 0) {\r\n // preberemo seznam zaposlenih iz hidden text html elementov\r\n let hiddetTextHtmlId = \"#sifraEnoteOrgStrukture\" + arrayIzbraneSkupine[ind].trim();\r\n let valu = $(hiddetTextHtmlId).val();\r\n valu = valu.toString().trim()\r\n selectedEmployeesIds = selectedEmployeesIds + valu;\r\n if (ind < (arrayIzbraneSkupine.length - 1)) {\r\n selectedEmployeesIds = selectedEmployeesIds + \",\";\r\n }\r\n }\r\n }\r\n return selectedEmployeesIds;\r\n }\r\n\r\n filterZaposleniTableRows(filterZaposleni: string) {\r\n global.ConsoleLogDegug(this.libName + \".filterZaposleniTableRows\");\r\n\r\n //// Declare variables\r\n //var table, tr, _rowId, i, txtValue;\r\n //table = document.getElementById(this._tableName);\r\n //tr = table.getElementsByTagName(\"tr\");\r\n //// Loop through all table rows, and hide those who don't match the search query\r\n //for (i = 0; i < tr.length; i++) {\r\n // _rowId = null;\r\n // let _trId = $(tr[i]).attr(\"data-sifra-zaposleni\");\r\n // if (!isUnDefined(_trId)) {\r\n // _rowId = _trId.toString()\r\n // }\r\n\r\n // if (_rowId) {\r\n // txtValue = _rowId.toUpperCase();\r\n // if (isEmpty(filterZaposleni)) {\r\n // $(tr[i]).addClass(\"element-hidden\");\r\n // } else if (filterZaposleni.toUpperCase().indexOf(txtValue) > -1) {\r\n // $(tr[i]).removeClass(\"element-hidden\");\r\n // } else {\r\n // $(tr[i]).addClass(\"element-hidden\");\r\n // }\r\n // }\r\n //}\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","/// \r\nimport { SaopInputWFL,SaopInputWFLProperties } from './saop-input-wfl'\r\nimport { SaopselectWFL } from './saop-select-wfl'\r\n\r\nexport class SaopWebGridFilter {\r\n public id:string = \"wgf1\";\r\n public modalFilterArray: any = [];\r\n //This function initializes the content inside the filter modal\r\n configFilter(libName:string,htmlTable: any, colArray: any) {\r\n let _this = this;\r\n setTimeout(function () {\r\n var tableName = htmlTable[0].id;\r\n var columns = htmlTable.api().columns();\r\n $.each(colArray, function (i, arg) {\r\n let _colNo = arg.toString();\r\n $('#' + tableName + ' th:eq(' + _colNo + ')').attr(\"id\",\"column-header-\"+ _colNo +\"\");\r\n $('#' + tableName + ' th:eq(' + _colNo + ')').append('');\r\n $('#' + tableName + ' th:eq(' + _colNo + ')').append(\"   \");\r\n $('#' + tableName + ' th:eq(' + _colNo + ')').append(\"
\");\r\n });\r\n\r\n var template =\r\n '
' +\r\n '
' +\r\n '{0}
' +\r\n '
' +\r\n 'V redu' + \r\n 'Zbriši' +\r\n 'Prekliči' +\r\n '
' +\r\n '
';\r\n\r\n $.each(colArray, function (index: any, value: any) {\r\n columns.every(function (i: any) {\r\n if (value === i) {\r\n var column = this, \r\n content = '';//'
';\r\n var columnName = $(this.header()).text().replace(/\\s+/g, \"_\");\r\n var distinctArray: any[] = [];\r\n column.data().each(function (d: string, j: any) {\r\n if (distinctArray.indexOf(d) == -1) {\r\n var id = tableName + \"_\" + columnName + \"_\" + j; // onchange=\"formatValues(this,' + value + ');\r\n content += '
';\r\n distinctArray.push(d);\r\n }\r\n }); \r\n var newTemplate = $(template.replace('{0}', content).replace('{1}', value).replace('{1}', value).replace('{2}', tableName).replace('{2}', tableName));\r\n $('body').append(newTemplate);\r\n _this.modalFilterArray[tableName + \"_\" + value] = newTemplate;\r\n content = '';\r\n }\r\n });\r\n });\r\n }, 50);\r\n\r\n }\r\n\r\n\r\n //User to show the filter modal\r\n showFilter(e: any, index: any) {\r\n $('.modalFilter').hide();\r\n $(this.modalFilterArray[index]).css({ left: 0, top: 0 });\r\n var th = $(e.target).parent();\r\n var pos = th.offset();\r\n let arrayItem = this.modalFilterArray[index];\r\n //$(this.modalFilterArray[index]).width(th.width() * 0.75);\r\n $(arrayItem).css({ 'left': pos.left, 'top': pos.top, 'min-width':(th.width() * 0.75) });\r\n $(arrayItem).show();\r\n e.stopPropagation();\r\n }\r\n\r\n updateTableHeaderStatus(tableId:string,columnId:string,activeFilter:boolean){\r\n let _colFilterId = columnId+\"-filter\";\r\n let _colFilter = $(tableId).find(_colFilterId)[0];\r\n let _colFilterAtr = _colFilter.getAttribute(\"class\");\r\n if(activeFilter){\r\n _colFilterAtr.replace(\"saop-img-filter\", \"saop-img-filter saop-cl-blue\");\r\n } else {\r\n _colFilterAtr.replace(\"saop-img-filter saop-cl-blue\", \"saop-img-filter\");\r\n \r\n }\r\n }\r\n\r\n //This function is to use the searchbox to filter the checkbox\r\n filterValues(node: any) {\r\n var searchString = $(node).val().toString().toUpperCase().trim();\r\n var rootNode = $(node).parent();\r\n if (searchString == '') {\r\n rootNode.find('div').show();\r\n } else {\r\n rootNode.find(\"div\").hide();\r\n rootNode.find(\"div:contains('\" + searchString + \"')\").show();\r\n }\r\n }\r\n\r\n //Execute the filter on the table for a given column\r\n performFilter(node: any, i: any, tableId: any) {\r\n var rootNode = $(node).parent().parent();\r\n var searchString = '', counter = 0;\r\n\r\n rootNode.find('input:checkbox').each(function (index: any, checkbox: any) {\r\n if (checkbox.checked) {\r\n searchString += (counter == 0) ? checkbox.value : '|' + checkbox.value;\r\n counter++;\r\n }\r\n });\r\n\r\n let _colId = \"#column-header-\"+i.toString();\r\n if(counter > 0){\r\n this.updateTableHeaderStatus('#' +tableId,_colId,true);\r\n } else {\r\n this.updateTableHeaderStatus('#' +tableId,_colId,false);\r\n }\r\n\r\n $('#' + tableId).DataTable().column(i).search(\r\n searchString,\r\n true, false\r\n ).draw();\r\n rootNode.hide();\r\n }\r\n\r\n //Removes the filter from the table for a given column\r\n clearFilter(node: any, i: any, tableId: any) {\r\n var rootNode = $(node).parent().parent();\r\n rootNode.find(\".filterSearchText\").val('');\r\n rootNode.find('input:checkbox').each(function (index: any, checkbox: any) {\r\n checkbox.checked = false;\r\n $(checkbox).parent().show();\r\n });\r\n\r\n let _colId = \"#column-header-\"+i.toString();\r\n this.updateTableHeaderStatus('#' +tableId,_colId,false);\r\n\r\n $('#' + tableId).DataTable().column(i).search(\r\n '',\r\n true, false\r\n ).draw();\r\n rootNode.hide();\r\n }\r\n\r\n hideFilter(node: any, i: any, tableId: any) {\r\n $('.modalFilter').hide();\r\n }\r\n\r\n setResizeEvent(gridId:string){\r\n let _this = this;\r\n var _tableDiv = $(\"table\"+gridId+\" th\") as any;\r\n var thHeight = $(\"table\"+gridId+\" th:first\").height();\r\n\t_tableDiv.resizable({\r\n handles: \"e\",\r\n\t minHeight: thHeight,\r\n maxHeight: thHeight,\r\n minWidth: 40,\r\n start: function (event: any, ui: any) {\r\n console.log(\"resize start\");\r\n },\r\n stop: function (event: any, ui: any) {\r\n console.log(\"resize stop\");\r\n },\r\n\t resize: function (event:any, ui:any) {\r\n console.log(\"resize...\");\r\n var sizerid = \"#\" + $(event.target).attr(\"id\") + \"-sizer\";\r\n $(sizerid).width(ui.size.width);\r\n\t }\r\n\t}); \r\n\r\n setTimeout(function () {\r\n _this.setTableColumnsMinColumnsWidth(gridId);\r\n }, 1000);\r\n }\r\n\r\n public setTableColumnsMinColumnsWidth(gridId: string): void {\r\n let colsWidth = this.getTableColumnsWidth(gridId);\r\n\r\n for (var i = 0; i < colsWidth.length; i++) {\r\n let ind = i + 1;\r\n let _col = $(gridId + \" tr th:nth-child(\" + ind + \")\");\r\n let _setW = !_col.hasClass(\"no-sort\");\r\n //if (_setW){\r\n $(gridId + \" tr th:nth-child(\" + ind + \")\").css({ \"min-width\": colsWidth[i] + \"px\" });\r\n $(gridId + \" tr td:nth-child(\" + ind + \")\").css({ \"min-width\": colsWidth[i] + \"px\" });\r\n //}\r\n }\r\n }\r\n\r\n private getTableColumnsWidth(gridId: string): number[] {\r\n let colWidth: number[] = [];\r\n $(gridId + ' tr:nth-child(1) > td').each(function () {\r\n colWidth.push($(this).outerWidth());\r\n });\r\n\r\n // preverimo, če je kaj zapisov. Ce ni, moramo vzeti vrstico z imeni stolpcev\r\n if (colWidth.length <= 1) {\r\n colWidth = [];\r\n\r\n $(gridId + ' tr:nth-child(1) > th').each(function () {\r\n colWidth.push($(this).outerWidth());\r\n });\r\n }\r\n\r\n return colWidth\r\n }\r\n\r\n setSortElementEvent(gridId: string):void{\r\n let _this = this;\r\n $(gridId).on('click', 'th', function () {\r\n _this.setSortElement(gridId);\r\n });\r\n }\r\n \r\n setSortElement(gridId: string):void {\r\n $(\"\" + gridId + \" thead:first th\").each(function (i, th) {\r\n let _col = $(th);\r\n let _colId = \"#\"+_col.attr('id');\r\n //let _sortType = _col.attr(\"column-sort\");\r\n let _colIconIdUp = _colId+\"-icon-up\";\r\n let _colIconId = _colId+\"-icon\";\r\n let _colIconUpElement = $(gridId+' '+_colIconIdUp);\r\n let _colIconElement = $(gridId+' '+_colIconId);\r\n let cls = $(th).attr('class');\r\n\r\n //if (_sortType != null) {\r\n if (cls != null && cls.indexOf(\"no-sort\") >= 0) {\r\n _colIconUpElement.removeClass(\"saop-img-arrow-down\");\r\n _colIconElement.removeClass(\"saop-img-arrow-up\");\r\n _colIconElement.removeClass(\"saop-img-arrow-down\"); \r\n _colIconElement.removeClass(\"saop-cl-blue\"); \r\n } \r\n else if (cls != null && cls.indexOf(\"sorting_asc\") >= 0) {\r\n _colIconUpElement.removeClass(\"saop-img-arrow-down\");\r\n _colIconElement.removeClass(\"saop-img-arrow-down\");\r\n _colIconElement.addClass(\"saop-img-arrow-up saop-cl-blue\");\r\n } else if (cls != null && cls.indexOf(\"sorting_desc\") >= 0) {\r\n _colIconUpElement.removeClass(\"saop-img-arrow-down\");\r\n _colIconElement.removeClass(\"saop-img-arrow-up\");\r\n _colIconElement.addClass(\"saop-img-arrow-down saop-cl-blue\"); \r\n } else {\r\n _colIconElement.removeClass(\"saop-img-arrow-up\");\r\n _colIconElement.removeClass(\"saop-img-arrow-down\"); \r\n _colIconElement.removeClass(\"saop-cl-blue\"); \r\n _colIconElement.addClass(\"saop-img-arrow-up\");\r\n _colIconUpElement.addClass(\"saop-img-arrow-down\");\r\n }\r\n //}\r\n });\r\n } \r\n\r\n configSimpleFilter(dataTable: any):void {\r\n let _this = this;\r\n let tableId = \"#\"+dataTable[0].id;\r\n let _iCount = 0;\r\n var _filterEnable = false;\r\n let _th_columns = $(tableId).find('th');\r\n _th_columns.each( \r\n function () {\r\n _iCount = _iCount + 1;\r\n let _element = $(this);\r\n let _filterType = _element.attr(\"column-filter\"); \r\n let _nosort = _element.hasClass(\"no-sort\");\r\n let _noResize = _element.hasClass(\"no-resize\");\r\n let _actionColumn = _element.hasClass(\"saop-table-th-last\");\r\n let _dt_checkboxes_cell = _element.hasClass(\"dt-checkboxes-cell\");\r\n _element.attr(\"id\",\"column-header-\"+ _iCount +\"\");\r\n _element.css(\"outline\",\"none\");\r\n let col_title = _element.text();\r\n //let col_max_width = col_title.length * 7;\r\n if (_dt_checkboxes_cell != null && _dt_checkboxes_cell == true) {\r\n return;\r\n }\r\n _element.text(\"\");\r\n\r\n //_element.append(\"
\"+col_title+\"
\");\r\n _element.append(\"
\"+col_title+\"
\");\r\n \r\n if (_filterType != null && _filterType.toLowerCase() == \"text\"){\r\n _filterEnable = true;\r\n } else if (_filterType != null && _filterType.toLowerCase() == \"dropdown\"){\r\n _filterEnable = true;\r\n }\r\n\r\n if (_actionColumn != null && _actionColumn == true){\r\n _nosort = true;\r\n }\r\n\r\n if (_nosort == null ||_nosort == false){\r\n _element.append(\"
\");\r\n _element.append(\"
\"); \r\n }\r\n\r\n if (_noResize == null ||_noResize == false){\r\n _element.append(\"
\");\r\n }\r\n \r\n }\r\n );\r\n\r\n if (_filterEnable) {\r\n $(tableId+' thead tr')\r\n .clone(true)\r\n .addClass('filters')\r\n .appendTo(tableId+' thead');\r\n\r\n // Setup - add a text input to each footer cell\r\n let _filters = $(tableId).find('.filters');\r\n let _filters_th = _filters.find('th');\r\n _iCount = 0;\r\n _filters_th.each( \r\n function () {\r\n _iCount = _iCount + 1;\r\n let _element = $(this);\r\n _element.off();\r\n\r\n _element.html(\"\");\r\n\r\n let _filterType = _element.attr(\"column-filter\");\r\n\r\n while(_element[0].attributes.length > 0)\r\n _element[0].removeAttribute(_element[0].attributes[0].name);\r\n\r\n let _colId = \"col_\"+_iCount.toString(); \r\n _element.attr(\"id\",_colId);\r\n let _inputId = _colId+\"_filter\"; \r\n let title = _element.text();\r\n \r\n if (_filterType != null && _filterType.toLowerCase() == \"text\"){\r\n let _inputE = new SaopInputWFL({id:_inputId,caption:title,placeholder:title}).getInnerHtml();\r\n _element.html(_inputE);\r\n } else if (_filterType != null && _filterType.toLowerCase() == \"dropdown\"){\r\n let _selectId = _colId+\"_select\"; \r\n let selectHtml = new SaopselectWFL({id:_selectId,caption:\"\",placeholder:\"\"}).getInnerHtml();\r\n let select = $(selectHtml); \r\n //\r\n\r\n let _index = _iCount;\r\n _index = _index - 1;\r\n\r\n dataTable.DataTable()\r\n .column(_index+':visible')\r\n .data()\r\n .unique()\r\n .sort()\r\n .each(function (d:any, j:any) {\r\n if (d.length > 0){\r\n let _content = d;\r\n let _firstChar = _content[0];\r\n if (_firstChar.charCodeAt(0) > 1000) {_content = _content.replace(_firstChar+\" \",\"\");}\r\n select.find('select').last().append('');\r\n }\r\n });\r\n\r\n _element.append(select);\r\n } \r\n } \r\n );\r\n\r\n // Apply the filter\r\n $(tableId+\" thead input\").on( 'keyup change', function () {\r\n const target = event.target as HTMLInputElement;\r\n let _index = $(this).parent().parent().index();\r\n dataTable.DataTable()\r\n .column(_index+':visible')\r\n .search( target.value )\r\n .draw();\r\n\r\n //var val = $.fn.dataTable.util.escapeRegex(target.value);\r\n //dataTable.DataTable().search(val ? '^' + val + '$' : '', true, false).draw();\r\n\r\n } ); \r\n \r\n // Apply the dropdown filter\r\n $(tableId+\" thead select\").on( 'change', function () {\r\n const target = event.target as HTMLInputElement;\r\n let _index = $(this).parent().parent().index();\r\n var val = $.fn.dataTable.util.escapeRegex(target.value);\r\n dataTable.DataTable()\r\n .column(_index+':visible')\r\n .search(val ? '^' + val + '$' : '', true, false)\r\n .draw();\r\n } ); \r\n\r\n //\r\n }\r\n\r\n\r\n }\r\n\r\n configSimpleSort(gridId: string):void {\r\n this.setSortElement(gridId);\r\n this.setSortElementEvent(gridId);\r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","/// \r\nimport { isUnDefined, global } from \"../Common/saop-common\";\r\nimport { SaopWebGridFilter } from \"../Components/saop-grid-filter\";\r\nimport { DataTables } from \"../@types/data-tables/types\";\r\nimport { SaopTranslationService } from '../Core/saop-translate';\r\n// function statusFormatter(row: number, cell: number, value: any, columnDef: Slick.Column, dataContext: Slick.SlickData) {\r\n// if (value == null || value === \"\") {\r\n// return \"-\";\r\n// } else if (value < 50) {\r\n// return \"\" + value + \"%\";\r\n// } else {\r\n// return \"\" + value + \"%\";\r\n// }\r\n// }\r\n\r\nexport interface SaopWebGridToolbar {\r\n id?:string,\r\n caption:string,\r\n buttons?:SaopWebGridToolbarButton[]\r\n itemsTemplateId?: string;\r\n} \r\n\r\nexport interface SaopWebGridToolbarButton {\r\n id:string,\r\n caption :string, \r\n class? :string,\r\n attributes?:string,\r\n onClickEvent?:string,\r\n template?: string;\r\n} \r\n\r\nexport interface SaopWebGridTogglePanel {\r\n enabled:boolean\r\n} \r\n\r\nexport interface SaopWebGridProperties {\r\n gridId:string\r\n ,css?:string\r\n ,togglePanel?:SaopWebGridTogglePanel\r\n ,toolbar?:SaopWebGridToolbar \r\n ,dataTable?:SaopWebDataTable\r\n}\r\n\r\nexport interface SaopWebDataTable {\r\n enabled:boolean\r\n ,columnDefsSettings?: DataTables.ColumnDefsSettings[]\r\n ,ordering?:boolean\r\n ,columns?:any[]\r\n ,data?: any\r\n ,order?: Array<(number | string)> | Array>\r\n ,colResizeOnly?:boolean \r\n ,colSettings?:boolean \r\n}\r\n\r\nexport interface SaopWebGridColDialogProperties {\r\n dialogId:string\r\n btnResetColId:string\r\n}\r\n\r\nexport class SaopWebGrid {\r\n private _properties:SaopWebGridProperties\r\n private _tableDiv:HTMLTableElement;\r\n private _translationService: SaopTranslationService;\r\n private _dialog:any;\r\n private _colDialogProperties : SaopWebGridColDialogProperties;\r\n private _saveState:boolean = false;\r\n //\r\n public libName: string; \r\n public webGridFilter:SaopWebGridFilter;\r\n public dataTable: DataTables.Api;\r\n public markedColumnCheckbox: JQuery;\r\n\r\n constructor(libName: string) {\r\n this.libName = libName;\r\n this.webGridFilter = new SaopWebGridFilter();\r\n this._translationService = new SaopTranslationService();\r\n this._colDialogProperties = {\r\n dialogId:\"\"\r\n ,btnResetColId:\"\"\r\n };\r\n this.setTerminologyList();\r\n } \r\n\r\n setTerminologyList(){\r\n let _terminology: string[] = ['Ni podatkov za prikaz.','Urejanje stolpcev','Ponastavi stolpce','Shrani','Prekliči'];\r\n this._translationService.setTranslationsList(_terminology);\r\n }\r\n\r\n //\r\n init(gridProp:SaopWebGridProperties) {\r\n this._properties = gridProp;\r\n this._tableDiv = document.querySelector(gridProp.gridId) as HTMLTableElement;\r\n //\r\n let _togglePanelDefault = {enabled:true};\r\n gridProp.togglePanel = {..._togglePanelDefault, ...gridProp.togglePanel}\r\n if (isUnDefined(gridProp.togglePanel)){\r\n gridProp.togglePanel = _togglePanelDefault;\r\n } \r\n //\r\n\r\n this.webGridFilter.id = gridProp.gridId+\"filter\";\r\n this.generateHtmlTable();\r\n this.addGridToolbar();\r\n // det defaults\r\n let _Msg_emptyTable = this._translationService.translate(\"Ni podatkov za prikaz.\")\r\n\r\n let _dataTableDef = {enabled:true,ordering:true,colReorder:false,colSettings:false};\r\n gridProp.dataTable = {..._dataTableDef, ...gridProp.dataTable}\r\n\r\n if (isUnDefined(gridProp.dataTable)){\r\n gridProp.dataTable = gridProp.dataTable;\r\n } \r\n\r\n let _columnDefsSettingsDef:DataTables.ColumnDefsSettings[] = [{orderable: true, targets: \"no-sort\"}];\r\n if (isUnDefined(gridProp.dataTable.columnDefsSettings)){\r\n gridProp.dataTable.columnDefsSettings = _columnDefsSettingsDef;\r\n } else {\r\n gridProp.dataTable.columnDefsSettings = Array.from(new Set([..._columnDefsSettingsDef,...gridProp.dataTable.columnDefsSettings]));\r\n } \r\n\r\n //\r\n \r\n //\r\n if (!isUnDefined(this._properties.dataTable) \r\n && this._properties.dataTable.enabled\r\n ){\r\n let _this = this;\r\n //\r\n let _colReorder = {};\r\n _colReorder = {\r\n allowReorder:this._properties.dataTable.colResizeOnly\r\n ,allowResize:this._properties.dataTable.colResizeOnly\r\n };\r\n //\r\n this._saveState = this._properties.dataTable.colResizeOnly ||this._properties.dataTable.colSettings;\r\n //\r\n if (this._saveState == false) {\r\n this.dataTable = \r\n $(gridProp.gridId).DataTable(\r\n {\r\n \"paging\": false\r\n , \"searching\": true\r\n ,\"autoWidth\": true\r\n ,orderCellsTop: true\r\n //, \"dom\": \"Rlfrtip\"\r\n , initComplete: function () {\r\n if (gridProp.dataTable.ordering){\r\n _this.webGridFilter.configSimpleFilter(this); \r\n _this.webGridFilter.configSimpleSort(_this._properties.gridId); \r\n }\r\n //if(!isUnDefined(_this._properties.dataTable.filters)) {\r\n // _this.webGridFilter.configFilter(_this.libName,this, _this._properties.dataTable.filters);\r\n //}\r\n }\r\n ,order: _this._properties.dataTable.order\r\n // ,ajax: function (data, callback, settings) {\r\n // callback({ data: data }) //reloads data \r\n // } \r\n ,columnDefs: _this._properties.dataTable.columnDefsSettings \r\n ,ordering : gridProp.dataTable.ordering \r\n ,language : {emptyTable:_Msg_emptyTable,zeroRecords:_Msg_emptyTable}\r\n }\r\n ); \r\n //\r\n $(gridProp.gridId+\"_filter\").remove();\r\n $(gridProp.gridId+\"_info\").remove(); \r\n this.webGridFilter.setResizeEvent(this._properties.gridId);\r\n //\r\n } else {\r\n \r\n this.dataTable = \r\n $(gridProp.gridId).DataTable(\r\n {\r\n \"paging\": false\r\n ,\"searching\": true\r\n //,\"autoWidth\": true\r\n //,scrollX: true\r\n ,orderCellsTop: true\r\n ,colReorder: _colReorder\r\n //, \"dom\": \"Bfrtip\"\r\n , stateSave: this._saveState\r\n , initComplete: function () {\r\n if (gridProp.dataTable.ordering){\r\n _this.webGridFilter.configSimpleFilter(this); \r\n _this.webGridFilter.configSimpleSort(_this._properties.gridId); \r\n }\r\n // if(!isUnDefined(_this._properties.dataTable.filters)) {\r\n // _this.webGridFilter.configFilter(_this.libName,this, _this._properties.dataTable.filters);\r\n // }\r\n }\r\n //,stateSaveCallback : _this.gridColSize.stateSaveCallback.bind(_this.gridColSize)\r\n ,order: _this._properties.dataTable.order\r\n // ,ajax: function (data, callback, settings) {\r\n // callback({ data: data }) //reloads data \r\n // } \r\n ,columnDefs: gridProp.dataTable.columnDefsSettings \r\n ,ordering : gridProp.dataTable.ordering \r\n ,language : {emptyTable:_Msg_emptyTable,zeroRecords:_Msg_emptyTable} \r\n // ,buttons: [ \r\n // {\r\n // extend: 'pdfHtml5',\r\n // orientation: 'landscape',\r\n // pageSize: 'LEGAL'\r\n // }\r\n // ] \r\n }\r\n ); \r\n //\r\n $(gridProp.gridId+\"_filter\").remove();\r\n //\r\n $(gridProp.gridId+\"_info\").remove(); \r\n //\r\n this.setResizableColumn();\r\n //\r\n this.initEventListners();\r\n }\r\n //\r\n\r\n }\r\n \r\n //\r\n\r\n }\r\n\r\n addToolbarButtons(gridPanel: JQuery,buttons:SaopWebGridToolbarButton[]){\r\n if(isUnDefined(buttons) == false){\r\n buttons.forEach(_button => {\r\n var buttonTemplate = \r\n `\r\n
\r\n \r\n
\r\n `;\r\n\r\n if (_button.template != null) {\r\n buttonTemplate = _button.template;\r\n }\r\n\r\n gridPanel.find(\"#toolbarButtons\").append(buttonTemplate); \r\n });\r\n }\r\n }\r\n\r\n generateHtmlTable() {\r\n this.generateTableBody(); \r\n this.generateTableHead();\r\n }\r\n\r\n generateTableHead() {\r\n if (!isUnDefined(this._properties.dataTable)){\r\n if(!isUnDefined(this._properties.dataTable.columns)){\r\n let thead = this._tableDiv.createTHead();\r\n let row = thead.insertRow();\r\n for (let key of this._properties.dataTable.columns) {\r\n let th = document.createElement(\"th\");\r\n let text = document.createTextNode(key.name);\r\n th.appendChild(text);\r\n row.appendChild(th);\r\n }\r\n }\r\n }\r\n }\r\n \r\n generateTableBody() {\r\n if (!isUnDefined(this._properties.dataTable)){\r\n if (!isUnDefined(this._properties.dataTable.data)){\r\n for (let element of this._properties.dataTable.data) {\r\n let row = this._tableDiv.insertRow();\r\n for (let key in element) {\r\n let cell = row.insertCell();\r\n let text = document.createTextNode(element[key]);\r\n cell.appendChild(text);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n addGridToolbar() {\r\n let _this = this;\r\n let gridPanel: JQuery;\r\n let _css = isUnDefined(this._properties.css) == false ? this._properties.css :\"\";\r\n\r\n let gridPanelTemplate = `\r\n
\r\n
\r\n
\r\n `;\r\n if (!isUnDefined(this._properties.toolbar)) {\r\n if (isUnDefined(this._properties.toolbar.id)) {\r\n this._properties.toolbar.id = this._properties.gridId+\"TB\";\r\n }\r\n let gridTogglePanel = ``;\r\n let gridTogglePanelClass = \"\";\r\n let gridBorderBottom = \"\";\r\n if(this._properties.togglePanel.enabled) {\r\n gridTogglePanelClass = \"collapse show\";\r\n gridBorderBottom = \"saop-border-bottom\";\r\n\r\n gridTogglePanel = \r\n `\r\n
\r\n

\r\n ${this._properties.toolbar.caption} \r\n

\r\n
\r\n `; \r\n }\r\n\r\n let _toolbarItems = ``;\r\n if (!isUnDefined(this._properties.toolbar.itemsTemplateId)){\r\n let _toolbarItemsTemplate = $(this._properties.toolbar.itemsTemplateId);\r\n if (_toolbarItemsTemplate.length > 0){\r\n _toolbarItems = _toolbarItemsTemplate.html();\r\n _toolbarItemsTemplate.remove();\r\n }\r\n }\r\n\r\n let _btnSettings = ``;\r\n if (this._properties.dataTable.colSettings == true || this._properties.dataTable.colResizeOnly == true) {\r\n _btnSettings = \r\n `\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n `;\r\n if (this._properties.dataTable.colSettings == true){\r\n _btnSettings = _btnSettings + `
${_this._translationService.translate(\"Urejanje stolpcev\")}
`;\r\n }\r\n if (this._properties.dataTable.colResizeOnly == true){\r\n _btnSettings = _btnSettings + `
${_this._translationService.translate(\"Ponastavi stolpce\")}
`;\r\n }\r\n\r\n //_btnSettings = _btnSettings + `
${_this._translationService.translate(\"Izvozi v PDF\")}
`;\r\n\r\n _btnSettings = _btnSettings + \r\n `\r\n
\r\n
\r\n
\r\n `;\r\n }\r\n\r\n this._colDialogProperties.btnResetColId = this._properties.gridId.replace(\"#\",\"btn\")+\"ResetCol\";\r\n let _dialogHTML = ``;\r\n _dialogHTML = \r\n `\r\n \r\n \r\n
\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n `;\r\n\r\n gridPanelTemplate = `\r\n ${_dialogHTML}\r\n
    \r\n ${gridTogglePanel}\r\n
    \r\n ${_btnSettings}\r\n
    \r\n
    \r\n ${_toolbarItems}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n `;\r\n }\r\n gridPanelTemplate = gridPanelTemplate.replace(\"#slickGrid#\",this._properties.gridId.replace(\"#\",\"\"));\r\n gridPanel = $(gridPanelTemplate);\r\n if (!isUnDefined(this._properties.toolbar)) {\r\n this.addToolbarButtons(gridPanel,this._properties.toolbar.buttons);\r\n }\r\n\r\n let _tableHtml = this._tableDiv;\r\n\r\n $(this._properties.gridId).replaceWith(gridPanel);\r\n\r\n $(this._properties.gridId).replaceWith(_tableHtml);\r\n }\r\n\r\n refreshData(data:any) {\r\n let _this = this;\r\n this.dataTable.clear();\r\n data.each(function( index:any, tr:string ) {\r\n _this.dataTable.row.add($(tr));\r\n });\r\n this.dataTable.draw(); \r\n }\r\n\r\n reorderColumns(htmlContent:string):JQuery{\r\n let order = this.dataTable.colReorder.GetCurrentOrder();\r\n //###\r\n let rows = $(htmlContent).find('tbody > tr');\r\n let _tbodyNew = $(htmlContent).find('tbody').clone();\r\n _tbodyNew = _tbodyNew.empty();\r\n\r\n //$('body').append( $(htmlContent).find('tbody').clone());\r\n\r\n rows.each(function(index:any,tr:any) {\r\n let cols = jQuery(this).children('td');\r\n let _newTr = $(tr).clone().empty();\r\n for (let _order of order) {\r\n _newTr.append(cols.eq(_order));\r\n }\r\n _tbodyNew.append(_newTr);\r\n });\r\n\r\n //$('body').append(_tbodyNew);\r\n \r\n return _tbodyNew;\r\n } \r\n\r\n replaceGridRows(htmlContent:string) {\r\n let _this = this;\r\n this.dataTable.clear();\r\n //\r\n let _tbodyNew;\r\n if (this._saveState){\r\n _tbodyNew =_this.reorderColumns(htmlContent);\r\n _tbodyNew.find(\"tr\").each(\r\n function(index:any,tr:any) {\r\n _this.dataTable.row.add($(tr));\r\n }\r\n ); \r\n } else {\r\n _tbodyNew = $(htmlContent);\r\n $(this._properties.gridId+\" > tbody > tr\", $(htmlContent)).each(\r\n function(index:any,tr:any) {\r\n _this.dataTable.row.add($(tr));\r\n }\r\n ); \r\n } \r\n //this.dataTable.colReorder.order([0, 2, 3, 4, 5, 6, 7, 8, 9, 1, 10, 11]);\r\n this.dataTable.draw(false); \r\n } \r\n\r\n setTabelFoother():void {\r\n $(this._properties.gridId+' body') \r\n }\r\n\r\n initWebGridColumnCheckboxBindClickEvent() {\r\n let _this = this;\r\n this.markedColumnCheckbox = null;\r\n\r\n if (isUnDefined(this._tableDiv)) {\r\n return;\r\n }\r\n\r\n $(\"#\" + this._tableDiv.id + \" .saop-td-input-checkbox\").off(\"change\");\r\n $(\"#\" + this._tableDiv.id + \" .saop-td-input-checkbox\").on('change', function (row) {\r\n _this.markedColumnCheckbox = $(\"#\" + _this._tableDiv.id + \" #\" + row.currentTarget.id);\r\n\r\n // odznacimo vse ostale checkboxe\r\n $(\"#\" + _this._tableDiv.id + \" input.saop-td-input-checkbox:not(#\" + row.currentTarget.id + \")\").each(\r\n function () {\r\n $(\"#\" + _this._tableDiv.id + \" #\" + this.id).prop(\"checked\", false);\r\n }\r\n );\r\n\r\n _this.afterColumnCheckboxChanged();\r\n });\r\n }\r\n\r\n afterColumnCheckboxChanged(): void {\r\n\r\n }\r\n\r\n markSelectedRow(selectedRow: HTMLElement): void {\r\n // odstranimo css \"selected_row\" iz vseh vrstic \r\n $(this._properties.gridId + \" > tbody > tr\").each(\r\n function (index: any, tr: any) {\r\n $(tr).removeClass(\"saop-table-selected-row\");\r\n }\r\n );\r\n // dodamo css \"selected_row\" izbrani vrstici\r\n $(selectedRow).addClass(\"saop-table-selected-row\");\r\n }\r\n\r\n getSelectedRows(colID:number = 0):string[] {\r\n let _result : string[] = [];\r\n let rows_selected = this.dataTable.column(colID).checkboxes.selected();\r\n if (rows_selected != null) {\r\n $.each(rows_selected, function(index:any, rowId:any){\r\n _result.push(rowId);\r\n }) \r\n }\r\n return _result; \r\n }\r\n\r\n getSelectedRowsV2():string[] {\r\n global.ConsoleLogDegug(\"getSelectedRowsV2\");\r\n let _result : string[] = [];\r\n $(this._properties.gridId+\" tr td.dt-checkboxes-cell input[type='checkbox'].dt-checkboxes\").each(function (index:any, e:any) {\r\n let checked = $(this).is(\":checked\");\r\n if (checked) {\r\n _result.push(index);\r\n }\r\n }); \r\n return _result; \r\n }\r\n\r\n selectAllRows():void {\r\n this.dataTable.column(0).checkboxes.select();\r\n } \r\n\r\n deselectAllRows():void {\r\n this.dataTable.column(0).checkboxes.deselect();\r\n } \r\n\r\n setDefaultColumnsState():void{\r\n localStorage.removeItem(this._properties.gridId);\r\n //\r\n let _instanceID = \"DataTables_\"+this._properties.gridId.replace(\"#\",\"\")+\"_\"+location.pathname;\r\n localStorage.removeItem(_instanceID); \r\n //\r\n location.reload();\r\n }\r\n\r\n createDialog():void {\r\n let _this = this;\r\n let dt = this.dataTable as any;\r\n\r\n var ul = $('#sortable').sortable({axis:'y'});\r\n ul.empty();\r\n\r\n $.each(dt.colReorder.order(), function (idx, val) {\r\n var col = dt.column(idx);\r\n let _th = col.header();\r\n let _isVisible = true;\r\n let _className = _th.className.toLowerCase() as string;\r\n if (screen.width > 400){\r\n if (_className.includes(\"d-none-desktop\".toLowerCase())){\r\n _isVisible = false;\r\n }\r\n } else {\r\n if (_className.includes(\"d-none-mobile\".toLowerCase())){\r\n _isVisible = false;\r\n } \r\n }\r\n \r\n let _fieldCaption = \"?\";\r\n if (_th.children.length > 0) {\r\n _fieldCaption = _th.firstChild.innerText;\r\n } else {\r\n _fieldCaption = _th.innerText;\r\n }\r\n _fieldCaption = _fieldCaption.trim();\r\n \r\n let _checked = ' checked'; \r\n if (_isVisible == false) {\r\n _fieldCaption = \"\";\r\n _checked = '';\r\n }\r\n\r\n \r\n let _display = \"\";\r\n if (_fieldCaption.length == 0){\r\n _display = \"display:none;\";\r\n }\r\n\r\n let _ul = \r\n '
  1. '\r\n +''\r\n +' '\r\n +'' + _fieldCaption + ''\r\n +'
  2. ';\r\n\r\n ul.append(_ul); \r\n }); \r\n\r\n this.updateDialog(); \r\n this._dialog.dialog('open');\r\n\r\n let _btnResetCol = $(\"#\"+this._colDialogProperties.btnResetColId);\r\n _btnResetCol.off(\"click\",_this.setDefaultColumnsState.bind(_this));\r\n _btnResetCol.on(\"click\",_this.setDefaultColumnsState.bind(_this)); \r\n\r\n }\r\n\r\n updateDialog():void {\r\n\r\n let _this = this;\r\n var ul = $('#sortable').sortable();\r\n\r\n this._dialog = $('#dialog').dialog({\r\n modal: true,\r\n autoOpen: false,\r\n buttons: [\r\n {\r\n text: this._translationService.translate('Shrani'),\r\n class: \"btn saop-button-primary\",\r\n click: function() {\r\n \r\n let dt = _this.dataTable as any;\r\n\r\n var cols = ul.sortable('toArray', { attribute: 'data-sort' });\r\n\r\n // //\r\n // dt.columns().header().each(function(value:any, index:any){\r\n // if ( $(value).hasClass('no-sort') ) {\r\n // // Set column width here\r\n // global.ConsoleLogDegug('value:'+value);\r\n // cols.unshift(index.toString());\r\n // }\r\n // }) \r\n // //\r\n\r\n // cols.unshift(\"0\");\r\n // cols.push(\"10\");\r\n\r\n global.ConsoleLogDegug(cols);\r\n global.ConsoleLogDegug(dt.colReorder.transpose( cols ));\r\n cols = dt.colReorder.transpose( Array.from(cols.map(Number)) );\r\n global.ConsoleLogDegug(dt.colReorder.transpose( cols ));\r\n dt.colReorder.order(cols);\r\n\r\n var show = $('#sortable li > input:checked').map(function () {\r\n return this.parentElement.dataset.sort;\r\n });\r\n\r\n let show1 = Array.from(Array.from(show, item => Number(item)));\r\n\r\n // show1.unshift(0);\r\n // show1.push(10); \r\n\r\n show1 = dt.colReorder.transpose( show1 );\r\n global.ConsoleLogDegug(show1);\r\n dt.columns( show1 ).visible(true);\r\n\r\n //var hide = $(cols).not(show);\r\n var hide = cols.filter((x:any) => show1.indexOf(x)===-1);\r\n global.ConsoleLogDegug(hide);\r\n dt.columns( hide ).visible(false);\r\n\r\n $(this).dialog('close');\r\n\r\n location.reload();\r\n }\r\n },\r\n {\r\n id:\"btnCancel\",\r\n text: _this._translationService.translate(\"Prekliči\"),\r\n class: \"btn saop-button-secondary\",\r\n click: function() {\r\n $(this).dialog('close');\r\n }\r\n }, \r\n ],\r\n close: function() {\r\n //document.activeElement.blur(); \r\n } \r\n }); \r\n\r\n }\r\n\r\n initEventListners():void{\r\n let _this = this;\r\n if (this._properties.dataTable.colResizeOnly == true){\r\n let _btnSettings = $(\"#\"+this._properties.toolbar.id+\"\").find(\".gridRessetColSettings\");\r\n _btnSettings.off(\"click\",_this.setDefaultColumnsState.bind(_this));\r\n _btnSettings.on(\"click\",_this.setDefaultColumnsState.bind(_this)); \r\n }\r\n if (this._properties.dataTable.colSettings == true){\r\n //\r\n let _btnSetSettings = $(\"#\"+this._properties.toolbar.id+\"\").find(\".gridColSettings\");\r\n _btnSetSettings.off(\"click\",_this.createDialog.bind(_this));\r\n _btnSetSettings.on(\"click\",_this.createDialog.bind(_this)); \r\n // \r\n }\r\n //\r\n // let _gridExportToPDF = $(\"#\"+this._properties.toolbar.id+\"\").find(\".gridExportToPDF\");\r\n // _gridExportToPDF.off(\"click\",_this.exportToPdf.bind(_this));\r\n // _gridExportToPDF.on(\"click\",_this.exportToPdf.bind(_this)); \r\n }\r\n\r\n setResizableColumn():void{\r\n //add phantom column in case of hidden columns\r\n $(this._properties.gridId+' tr').find(\"th:last\").removeClass(\"saop-table-th-last\");\r\n $(this._properties.gridId+' tr').find(\"th:last\").addClass(\"saop-table-th-last-res\");\r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","\r\nexport interface SaopInputWFLProperties {\r\n id:string;\r\n placeholder:string;\r\n caption:string;\r\n}\r\n\r\nexport class SaopInputWFL {\r\n private _inputTemplate:string;\r\n constructor(properties:SaopInputWFLProperties) {\r\n this._inputTemplate = \r\n `\r\n \r\n \r\n \r\n \r\n `; \r\n // this._inputTemplate = \r\n // `\r\n // \r\n // \r\n // \r\n // \r\n // \r\n // `; \r\n }\r\n\r\n getElement():JQuery{\r\n let _element = $(this._inputTemplate);\r\n return _element;\r\n }\r\n\r\n getInnerHtml():string{\r\n return this._inputTemplate;\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","\r\n/// \r\nimport { convertString2Date, global,isEmpty } from \"../Common/saop-common\";\r\n\r\nexport class SaopInputMask {\r\n\r\n init() {\r\n global.ConsoleLogDegug(\"SaopInputMask.init...\");\r\n var inputDivs = document.querySelectorAll('input[data-inputmask-alias]');\r\n Inputmask().mask(inputDivs);\r\n\r\n $(\".saop-decimal-2\").inputmask({\r\n 'alias': 'decimal',\r\n 'radixPoint': ',',\r\n 'digits': 2,\r\n 'digitsOptional': false,\r\n 'placeholder': '0,00'\r\n });\r\n\r\n $(\".saop-decimal-3\").inputmask({\r\n 'alias': 'decimal',\r\n 'radixPoint': ',',\r\n 'digits': 3,\r\n 'digitsOptional': false,\r\n 'placeholder': '0,000'\r\n });\r\n\r\n inputDivs.forEach(element => {\r\n global.ConsoleLogDegug(\"element.init......................\" + element.id);\r\n\r\n let _this = this;\r\n let spanDiv:any;\r\n let elementAtrr = $(element).attr(\"data-inputmask-alias\");\r\n if (isEmpty(elementAtrr)) {return;};\r\n global.ConsoleLogDegug(elementAtrr);\r\n spanDiv = $(element).parent();\r\n if (spanDiv === null) { return;};\r\n if (spanDiv.hasClass(\"has-float-label\")===false) { return;};\r\n global.ConsoleLogDegug(spanDiv.get(0).id);\r\n\r\n let languageAtrr = (String)($(\"#siteLanguage\").val());\r\n global.ConsoleLogDegug(\"language:\"+languageAtrr);\r\n languageAtrr = isEmpty(languageAtrr) ? \"sl\" :languageAtrr;\r\n global.ConsoleLogDegug(\"language:\"+languageAtrr);\r\n\r\n if (elementAtrr === \"hh:mm:ss\") {\r\n let iconBtn = $(spanDiv).find(\"#timeIcon\");\r\n global.ConsoleLogDegug(\"clock...\");\r\n\r\n global.ConsoleLogDegug(\"clock.focus.init:\" + element.id);\r\n $(element).focus(function (event: any) {\r\n global.ConsoleLogDegug(\"call.clock.focus:\" + event.target.id);\r\n\r\n // ce je bil fokusiran z tab, damo mali timeout, ker drugace ne dela\r\n let timeOut = 1;\r\n if (_this.wasTabPressed(event)) {\r\n timeOut = 200;\r\n }\r\n\r\n setTimeout(function () {\r\n let inputCtrl: HTMLInputElement = event.target;\r\n _this.inputSelectAllText(inputCtrl);\r\n }, timeOut);\r\n });\r\n\r\n global.ConsoleLogDegug(\"clock.blur.init:\" + element.id);\r\n $(element).blur(function (event: any) {\r\n global.ConsoleLogDegug(\"call.clock.blur:\" + event.target.id);\r\n var controlValue = event.target.value;\r\n if (controlValue.includes(\"h\")) {\r\n event.target.value = \"\";\r\n return;\r\n }\r\n controlValue = controlValue.replace(\"mm\", \"00\");\r\n controlValue = controlValue.replace(\"m\", \"0\");\r\n controlValue = controlValue.replace(\"ss\", \"00\");\r\n controlValue = controlValue.replace(\"s\", \"0\");\r\n event.target.value = controlValue;\r\n // prozimo input even, ker smo vpisali novo vrednost \r\n const e = new Event(\"input\");\r\n event.target.dispatchEvent(e);\r\n });\r\n\r\n global.ConsoleLogDegug(\"clock.click.init:\" + element.id);\r\n $(iconBtn).click(function (event: any) {\r\n global.ConsoleLogDegug(\"clockIcon.clicked:\" + element.id);\r\n var ctrlInputCtrl = $(element).get(0) as HTMLInputElement;\r\n ctrlInputCtrl.focus();\r\n });\r\n } else if (elementAtrr === \"dd.mm.yyyy\"\r\n // || elementAtrr === \"dd.mm.yyyy hh:mm\" \r\n // || elementAtrr === \"dd.mm.yyyy hh:mm:ss\"\r\n ) {\r\n\r\n let iconBtn = $(spanDiv).find(\"#calendarIcon\");\r\n\r\n global.ConsoleLogDegug(\"calendar...\");\r\n\r\n let datepickerStartDate = new Date();\r\n if ($(element).attr(\"data-enable-select-pastdates\") != undefined) {\r\n if (($(element).attr(\"data-enable-select-pastdates\")).toLowerCase() == 'true') {\r\n datepickerStartDate = null;\r\n }\r\n }\r\n\r\n if ($(element).attr(\"data-min-start-date\") != undefined) {\r\n var datepickerStartDate1 = $(element).attr(\"data-min-start-date\");\r\n datepickerStartDate = convertString2Date(datepickerStartDate1, \"dd.mm.yyyy\");\r\n }\r\n\r\n let datepickerEndDate = null;\r\n if ($(element).attr(\"data-max-end-date\") != undefined) {\r\n datepickerEndDate = $(element).attr(\"data-max-end-date\");\r\n datepickerEndDate = convertString2Date(datepickerEndDate, \"dd.mm.yyyy\");\r\n }\r\n\r\n $(element).datepicker({\r\n startDate: datepickerStartDate,\r\n endDate: datepickerEndDate,\r\n autoclose: true,\r\n keyboardNavigation: false,\r\n weekStart: 1,\r\n format: \"dd.mm.yyyy\",\r\n language: languageAtrr,\r\n orientation: \"bottom right\",\r\n showOnFocus:false\r\n //forceParse:false,\r\n });\r\n\r\n $(element).focus(function (event: any) {\r\n global.ConsoleLogDegug(\"calendar...focus:\" + event.target.id);\r\n\r\n // ce je bil fokusiran z tab, damo mali timeout, ker drugace ne dela\r\n let timeOut = 1;\r\n if (_this.wasTabPressed(event)) {\r\n timeOut = 200;\r\n }\r\n\r\n setTimeout(function () {\r\n let inputCtrl: HTMLInputElement = event.target;\r\n _this.inputSelectAllText(inputCtrl);\r\n }, timeOut);\r\n });\r\n\r\n $(iconBtn).click(function()\r\n {\r\n global.ConsoleLogDegug(\"calendar...click\");\r\n var datepickerInputCtrl = $(element).get(0) as HTMLInputElement;\r\n //datepickerInputCtrl.focus();\r\n $(element).datepicker(\"show\");\r\n _this.inputSelectAllText(datepickerInputCtrl);\r\n });\r\n\r\n } else if (elementAtrr === \"dd.mm.yyyy hh:mm\") {\r\n global.ConsoleLogDegug(\"datetimepicker hh:mm ...\");\r\n\r\n let iconBtn = $(spanDiv).find(\"#calendarIcon\");\r\n //\r\n $(element)\r\n .bind('keydown',function(e){\r\n\r\n e.stopImmediatePropagation();\r\n })\r\n .datetimepicker({\r\n format: 'DD.MM.YYYY H:mm',\r\n locale: languageAtrr,\r\n showTodayButton: true,\r\n });\r\n\r\n $(element).on(\"dp.change\", function (e) {\r\n $(this).data(\"DateTimePicker\").hide();\r\n $(element).focus();\r\n //\r\n var datepickerInputCtrl = $(element).get(0) as HTMLInputElement;\r\n datepickerInputCtrl.setSelectionRange(11,16,\"forward\");\r\n });\r\n\r\n $(element).off(\"focus\");\r\n\r\n $(iconBtn).click(function()\r\n {\r\n $(element).data(\"DateTimePicker\").show();\r\n });\r\n\r\n } else if (elementAtrr === \"dd.mm.yyyy hh:mm:ss\") {\r\n global.ConsoleLogDegug(\"datetimepicker hh:mm:ss ...\");\r\n\r\n let iconBtn = $(spanDiv).find(\"#calendarIcon\");\r\n //\r\n $(element)\r\n .bind('keydown',function(e){\r\n\r\n e.stopImmediatePropagation();\r\n })\r\n .datetimepicker({\r\n format: 'DD.MM.YYYY H:mm:ss',\r\n locale: languageAtrr,\r\n showTodayButton: true\r\n });\r\n\r\n $(element).off(\"focus\");\r\n\r\n // $(element).on(\"dp.change\", function (e) {\r\n // $(this).data(\"DateTimePicker\").hide();\r\n // //\r\n // $(element).focus();\r\n // var datepickerInputCtrl = $(element).get(0) as HTMLInputElement;\r\n // var datepickerInputCtrlStrLength = datepickerInputCtrl.value.length;\r\n // datepickerInputCtrl.setSelectionRange(11,3); \r\n // }); \r\n\r\n $(element).click(function()\r\n {\r\n $(element).data(\"DateTimePicker\").hide();\r\n });\r\n\r\n //$(element).off(\"keydown\");\r\n // .on('dp.hide', function(e){\r\n // console.log('dp.hide');\r\n // }) \r\n // .on('dp.show', function(e){\r\n // console.log('dp.show');\r\n // }); \r\n //\r\n $(iconBtn).click(function()\r\n {\r\n // global.ConsoleLogDegug(\"calendar...click\");\r\n // if ($(document).find(\".datepicker-dropdown\").is(\":visible\")) {\r\n $(element).data(\"DateTimePicker\").show();\r\n });\r\n\r\n // $(element).focus(function (event: any) {\r\n // $(element).data(\"DateTimePicker\").hide(); \r\n // }); \r\n } else {\r\n console.log(\"not implemented...\");\r\n }\r\n\r\n });\r\n\r\n this.initMultiDateSelectDatepicker();\r\n\r\n global.ConsoleLogDegug(\"initInputs...done\");\r\n }\r\n\r\n private initMultiDateSelectDatepicker(): void {\r\n global.ConsoleLogDegug(\"SaopInputMask.initMultiDateSelectDatepicker...\");\r\n\r\n var inputDivs = document.querySelectorAll('input[data-izbor-vec-dni]');\r\n\r\n inputDivs.forEach(element => {\r\n global.ConsoleLogDegug(\"element.init......................\" + element.id);\r\n\r\n let spanDiv: any;\r\n spanDiv = $(element).parent();\r\n if (spanDiv === null) { return; };\r\n if (spanDiv.hasClass(\"has-float-label\") === false) { return; };\r\n global.ConsoleLogDegug(spanDiv.get(0).id);\r\n\r\n let languageAtrr = (String)($(\"#siteLanguage\").val());\r\n global.ConsoleLogDegug(\"language:\" + languageAtrr);\r\n languageAtrr = isEmpty(languageAtrr) ? \"sl\" : languageAtrr;\r\n global.ConsoleLogDegug(\"language:\" + languageAtrr);\r\n\r\n let iconBtn = $(spanDiv).find(\"#calendarIcon\");\r\n\r\n global.ConsoleLogDegug(\"calendar...\");\r\n\r\n let datepickerStartDate = new Date();\r\n if ($(element).attr(\"data-enable-select-pastdates\") != undefined) {\r\n if (($(element).attr(\"data-enable-select-pastdates\")).toLowerCase() == 'true') {\r\n datepickerStartDate = null;\r\n }\r\n }\r\n\r\n if ($(element).attr(\"data-min-start-date\") != undefined) {\r\n var datepickerStartDate1 = $(element).attr(\"data-min-start-date\");\r\n datepickerStartDate = convertString2Date(datepickerStartDate1, \"dd.mm.yyyy\");\r\n }\r\n\r\n let datepickerEndDate = null;\r\n if ($(element).attr(\"data-max-end-date\") != undefined) {\r\n datepickerEndDate = $(element).attr(\"data-max-end-date\");\r\n datepickerEndDate = convertString2Date(datepickerEndDate, \"dd.mm.yyyy\");\r\n }\r\n\r\n $(element).datepicker({\r\n startDate: datepickerStartDate,\r\n endDate: datepickerEndDate,\r\n autoclose: false,\r\n multidate: true,\r\n keyboardNavigation: false,\r\n weekStart: 1,\r\n format: \"dd.mm.yyyy\",\r\n language: languageAtrr,\r\n orientation: \"bottom right\"\r\n });\r\n\r\n $(iconBtn).click(function () {\r\n global.ConsoleLogDegug(\"calendar...click\");\r\n var datepickerInputCtrl = $(element).get(0) as HTMLInputElement;\r\n var datepickerInputCtrlStrLength = datepickerInputCtrl.value.length * 2;\r\n datepickerInputCtrl.focus();\r\n datepickerInputCtrl.setSelectionRange(datepickerInputCtrlStrLength, datepickerInputCtrlStrLength)\r\n });\r\n\r\n });\r\n\r\n global.ConsoleLogDegug(\"SaopInputMask.initMultiDateSelectDatepicker...done\");\r\n }\r\n\r\n private inputSelectAllText(inputCtrl: HTMLInputElement): void {\r\n global.ConsoleLogDegug(\"SaopInputMask.inputSelectAllText...\");\r\n\r\n inputCtrl.setSelectionRange(0, inputCtrl.value.length);\r\n }\r\n\r\n private wasTabPressed(event: any): boolean {\r\n global.ConsoleLogDegug(\"SaopInputMask.wasTabPressed...\");\r\n\r\n let result = false;\r\n\r\n let code = (event.keyCode ? event.keyCode : event.which);\r\n if (code == 9) {\r\n result = true;\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\nimport { SaopPopover } from \"../Components/saop-popover\";\r\n\r\nexport class MenuSidebar {\r\n\r\n protected _collElement: HTMLElement;\r\n protected _expElement: HTMLElement;\r\n private _menuSidebarPopover: SaopPopover;\r\n\r\n init(): void {\r\n global.ConsoleLogDegug(\"MenuSidebar.init...\");\r\n\r\n this._collElement = document.getElementById(\"collapse-icon-coll\");\r\n this._expElement = document.getElementById(\"collapse-icon-exp\");\r\n if (this._collElement != null) this._collElement.style.display = \"none\";\r\n if (this._expElement != null) this._expElement.style.display = \"block\";\r\n\r\n let _this = this;\r\n\r\n // Expand icon click\r\n $(\"#collapse-icon-exp\").off(\"click\");\r\n $(\"#collapse-icon-exp\").on('click', function () {\r\n global.ConsoleLogDegug(\"MenuSidebar.collapse-icon-exp.click\");\r\n\r\n _this._menuSidebarPopover.enablePopover();\r\n });\r\n\r\n // Collapse icon click\r\n $(\"#collapse-icon-coll\").off(\"click\");\r\n $(\"#collapse-icon-coll\").on('click', function () {\r\n global.ConsoleLogDegug(\"MenuSidebar.collapse-icon-coll.click\");\r\n\r\n _this._menuSidebarPopover.disablePopover();\r\n });\r\n\r\n // Collapse click\r\n $('[data-toggle=sidebar-colapse]').click(\r\n function () {\r\n _this.sidebarCollapse();\r\n }\r\n );\r\n\r\n //menu item click\r\n $(\".saop-bg-item\").click(\r\n function () {\r\n //sessionStorage.setItem(\"saop-menu-previous-item-id\", sessionStorage.getItem(\"saop-menu-item-id\"));\r\n //sessionStorage.setItem(\"saop-menu-item-id\", this.id);\r\n //sessionStorage.setItem(\"saop-menu-subitem-id\", \"0\");\r\n }\r\n )\r\n\r\n //menu sub-item click\r\n //$(\".saop-bg-subitem\").click(\r\n // function(){\r\n // sessionStorage.setItem(\"saop-menu-subitem-id\", this.id);\r\n // }\r\n //)\r\n\r\n if (document.getElementById(\"menu-sidebar\") != null)\r\n this.GetSessionStorageValues();\r\n else\r\n this.DeleteSessionStorageValues();\r\n\r\n this.initMenuSidebarPopover();\r\n }\r\n\r\n protected sidebarCollapse(): void {\r\n global.ConsoleLogDegug(\"MenuSidebar.sidebarCollapse\");\r\n $('#menuTopIconLarge').toggleClass('d-none');\r\n $('#menuTopIconSmall').toggleClass('d-none');\r\n $('.sidebar-menu-caption').toggleClass('d-none');\r\n $('#sidebar-container').toggleClass('sidebar-expanded sidebar-collapsed');\r\n $('.saop-bg-subitems').toggleClass('d-none');\r\n $('#menuCloseButton').toggleClass('d-none');\r\n var SeparatorTitle = $('#sidebar-container');\r\n if (SeparatorTitle.hasClass('sidebar-collapsed')) {\r\n sessionStorage.setItem(\"saop-menu-sidebar-expanded\", \"true\")\r\n this._collElement.style.display = \"block\";\r\n this._expElement.style.display = \"none\";\r\n } else {\r\n sessionStorage.setItem(\"saop-menu-sidebar-expanded\", \"false\")\r\n this._collElement.style.display = \"none\";\r\n this._expElement.style.display = \"block\";\r\n }\r\n }\r\n\r\n protected menuItemCollapse(): void {\r\n global.ConsoleLogDegug(\"MenuSidebar.menuItemCollapse\");\r\n //var previousItemID = sessionStorage.getItem(\"saop-menu-item-id\");\r\n //var itemID = sessionStorage.getItem(\"saop-menu-item-id\");\r\n //var subitemsID = itemID+\"-collapse\";\r\n //var subitemID = sessionStorage.getItem(\"saop-menu-subitem-id\");\r\n\r\n //var previous = $(\"#\" + previousItemID);\r\n //var item = $('#'+itemID);\r\n //var subitems = $(\"#\" + subitemsID);\r\n //var subitem = $(\"#\"+subitemsID+\">#\"+subitemID);\r\n\r\n //previous.removeClass(\"saop-bg-item-selected\");//'un-color' previous item\r\n //previous[0].setAttribute(\"aria-expanded\", \"false\");\r\n //item[0].setAttribute(\"aria-expanded\", \"true\");\r\n //item.addClass(\"saop-bg-item-selected\");//color item\r\n //subitems.addClass('show');//expand collapse\r\n //subitem.addClass(\"saop-bg-subitem-selected\");//color subitem\r\n }\r\n\r\n protected GetSessionStorageValues(): void {\r\n global.ConsoleLogDegug(\"MenuSidebar.GetSessionStorageValues\");\r\n //defaults\r\n //if (sessionStorage.getItem(\"saop-menu-item-id\") == null) {\r\n //sessionStorage.setItem(\"saop-menu-sidebar-expanded\", null);\r\n // sessionStorage.setItem(\"saop-menu-previous-item-id\", null);\r\n // sessionStorage.setItem(\"saop-menu-item-id\", \"namizje\");\r\n // sessionStorage.setItem(\"saop-menu-subitem-id\", \"0\");\r\n //}\r\n\r\n //sidebar expanded/contracted\r\n if (sessionStorage.getItem(\"saop-menu-sidebar-expanded\") == \"true\") {\r\n this.sidebarCollapse();\r\n }\r\n\r\n //selected-menu item\r\n this.menuItemCollapse()\r\n }\r\n\r\n protected DeleteSessionStorageValues(): void {\r\n global.ConsoleLogDegug(\"MenuSidebar.DeleteSessionStorageValues\");\r\n\r\n sessionStorage.removeItem(\"saop-menu-sidebar-expanded\");\r\n //sessionStorage.removeItem(\"saop-menu-previous-item-id\");\r\n //sessionStorage.removeItem(\"saop-menu-item-id\");\r\n //sessionStorage.removeItem(\"saop-menu-subitem-id\");\r\n }\r\n\r\n initMenuSidebarPopover() {\r\n global.ConsoleLogDegug(\"MenuSidebar.initMenuSidebarPopover\");\r\n\r\n this._menuSidebarPopover = new SaopPopover(\".menu-popup\");\r\n this._menuSidebarPopover.initSelfContainerPopover();\r\n this._menuSidebarPopover.disablePopover();\r\n\r\n var elementVisible = $(\"#collapse-icon-coll\").is(':visible');\r\n if (elementVisible) {\r\n this._menuSidebarPopover.enablePopover();\r\n } else {\r\n this._menuSidebarPopover.disablePopover();\r\n }\r\n\r\n }\r\n}\r\n\r\n\r\n\r\n","\r\nexport class SaopMessageBanner {\r\n private _messagesDivId: string = \"#messagesDivId\";\r\n private _messageBannerId: string = \"#saopMessageBanner1\";\r\n\r\n show(messages: string[]) {\r\n\r\n let htmlMessageString = \"
      \";\r\n messages.forEach((message) => {\r\n htmlMessageString = htmlMessageString + \"
    • \" + message + \"
    • \";\r\n });\r\n htmlMessageString = htmlMessageString + \"
    \";\r\n\r\n $(this._messagesDivId).html(htmlMessageString);\r\n $(this._messageBannerId).removeClass('message-banner-hide');\r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","import { global, setModalFormZIndex,isEmpty,isUnDefined } from \"../Common/saop-common\";\r\n\r\nexport enum SaopMsgDlgType {\r\n mtInformation = 1\r\n ,mtWarning = 2\r\n ,mtError = 3\r\n //, mtConfirmation, mtCustom\r\n}\r\n\r\nexport enum SaopMsgDlgButton {\r\n mbNone = 0\r\n ,mbOK = 1\r\n ,mbCancel = 2\r\n ,mbYes = 3\r\n ,mbNo = 4\r\n}\r\n\r\nexport interface SaopMsgDlgEvent {\r\n parent:any;\r\n data:any;\r\n}\r\n\r\ntype SaopMsgDlgButtons = Array;\r\n\r\n\r\n\r\nexport class SaopMessageDlg {\r\n private _sender:SaopMsgDlgEvent;\r\n private _modalParent:boolean = false;\r\n //\r\n public onOk: (sender:any) => any = null;\r\n public onCancel: (sender:any) => any = null;\r\n public onYes: (sender:any) => any = null;\r\n public onNo: (sender:any) => any = null;\r\n public onHide: (sender:any) => any = null;\r\n public afterShow: (sender:any) => any = null;\r\n\r\n constructor(sender:SaopMsgDlgEvent){\r\n this._sender = sender;\r\n }\r\n\r\n Show(Msg:string,Title:string,DlgType:SaopMsgDlgType = SaopMsgDlgType.mtInformation,Buttons:SaopMsgDlgButtons = [SaopMsgDlgButton.mbOK]):SaopMsgDlgButton{\r\n global.ConsoleLogDegug(\"message:\"+Msg);\r\n global.ConsoleLogDegug(\"title:\"+Title);\r\n\r\n let _this = this;\r\n this._modalParent = $(\"body\").hasClass(\"modal-open\");\r\n\r\n let titleDiv = $('#alert-modal-title-div');\r\n let bodyTag = $('#alert-modal-body');\r\n\r\n if (DlgType == SaopMsgDlgType.mtInformation){\r\n $(\"#alert-modal-title-div\").css(\"background-color\",\"white\");\r\n } else if (DlgType == SaopMsgDlgType.mtError) {\r\n $(\"#alert-modal-title-div\").css(\"background-color\",\"#D82C25\");\r\n } else {\r\n $(\"#alert-modal-title-div\").css(\"background-color\",\"silver\"); \r\n }\r\n\r\n if (!isEmpty(Title)){\r\n titleDiv.html(Title);\r\n }\r\n \r\n bodyTag.html(Msg);\r\n\r\n if (Buttons !== null) {\r\n let _element_mbOK = Buttons.find(element => element === SaopMsgDlgButton.mbOK);\r\n if (isUnDefined(_element_mbOK)) {\r\n $(\"#btnAlertOK\").remove();\r\n } else {\r\n $(\"#btnAlertOK\").off(\"click\");\r\n $(\"#btnAlertOK\").click(\r\n function () {\r\n if (!isUnDefined(_this.onOk)){\r\n _this.onOk(_this._sender);\r\n }\r\n return SaopMsgDlgButton.mbOK;\r\n }\r\n ); \r\n }\r\n //\r\n let _element_mbCancel = Buttons.find(element => element === SaopMsgDlgButton.mbCancel);\r\n if (isUnDefined(_element_mbCancel)) {\r\n $(\"#btnAlertCancel\").remove();\r\n } else {\r\n $(\"#btnAlertCancel\").off(\"click\");\r\n $(\"#btnAlertCancel\").click(\r\n function () {\r\n if (!isUnDefined(_this.onCancel)){\r\n _this.onCancel(_this._sender);\r\n }\r\n return SaopMsgDlgButton.mbCancel;\r\n }\r\n ); \r\n }\r\n //\r\n let _element_mbYes = Buttons.find(element => element === SaopMsgDlgButton.mbYes);\r\n if (isUnDefined(_element_mbYes)) {\r\n $(\"#btnAlertYes\").remove();\r\n } else {\r\n $(\"#btnAlertYes\").off(\"click\");\r\n $(\"#btnAlertYes\").click(\r\n function () {\r\n if (!isUnDefined(_this.onYes)){\r\n _this.onYes(_this._sender);\r\n }\r\n return SaopMsgDlgButton.mbYes;\r\n }\r\n ); \r\n } \r\n //\r\n let _element_mbNo = Buttons.find(element => element === SaopMsgDlgButton.mbNo);\r\n if (isUnDefined(_element_mbNo)) {\r\n $(\"#btnAlertNo\").remove();\r\n } else {\r\n $(\"#btnAlertNo\").off(\"click\");\r\n $(\"#btnAlertNo\").click(\r\n function () {\r\n if (!isUnDefined(_this.onNo)){\r\n _this.onNo(_this._sender);\r\n }\r\n return SaopMsgDlgButton.mbNo;\r\n }\r\n ); \r\n } \r\n } else {\r\n $(\"#btnAlertOK\").remove();\r\n $(\"#btnAlertCancel\").remove();\r\n $(\"#btnAlertYes\").remove();\r\n $(\"#btnAlertNo\").remove();\r\n return SaopMsgDlgButton.mbNone;\r\n }\r\n\r\n $('#alert-modal').on('hidden.bs.modal', function (e) {\r\n $(\"#alert-modal-btn-ok\").unbind(\"click\");\r\n $(this).modal('dispose');\r\n if (!isUnDefined(_this.onHide)){\r\n _this.onHide(_this._sender);\r\n } \r\n if (_this._modalParent) {\r\n $(\"body\").addClass(\"modal-open\");\r\n } \r\n })\r\n \r\n $('#alert-modal').modal('show');\r\n setModalFormZIndex('#alert-modal'); \r\n\r\n if (!isUnDefined(_this.afterShow)){\r\n _this.afterShow(_this._sender);\r\n } \r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","/// \r\nimport { SaopTranslationService } from '../Core/saop-translate';\r\n\r\nimport { global,isEmpty, isNotSet, isUnDefined } from \"../Common/saop-common\";\r\n\r\nexport interface SaopMultiselectParams {\r\n target:string,\r\n selectAll?:boolean\r\n}\r\n\r\nexport interface SaopMultiselectOptions {\r\n templatesButton?: string,\r\n selectAll?:boolean,\r\n selectAllOption?:boolean,\r\n inputWidthPX?:string\r\n}\r\n\r\nexport interface SelectOption {\r\n value: string;\r\n text: string;\r\n}\r\n\r\nexport class SaopMultiselect {\r\n private _libName:string;\r\n private _translationService: SaopTranslationService;\r\n public _target:string;\r\n public _caption: string = \"Skupina\";\r\n private _multiSelectObject: any;\r\n private _options: SaopMultiselectOptions;\r\n //\r\n public msContainer:JQuery;\r\n public msButton: JQuery;\r\n\r\n public msContainerLabel:JQuery;\r\n public selectedCB:any;\r\n\r\n constructor(libName:string = \"\", options:SaopMultiselectOptions = null) {\r\n global.ConsoleLogDegug(\"SaopMultiselect\");\r\n this._translationService = new SaopTranslationService();\r\n this.setOptions(options);\r\n } \r\n\r\n setOptions(options: SaopMultiselectOptions): void {\r\n // first set default options\r\n\r\n let _templatesButton = '';\r\n this._options = {};\r\n this._options.templatesButton = _templatesButton;\r\n this._options.inputWidthPX = '200px';\r\n this._options.selectAll = true;\r\n this._options.selectAllOption = true;\r\n\r\n if (options != null) {\r\n if (isNotSet(options.templatesButton) == false) {\r\n this._options.templatesButton = options.templatesButton;\r\n }\r\n if (isNotSet(options.selectAll) == false){\r\n this._options.selectAll = options.selectAll;\r\n }\r\n if (isNotSet(options.selectAllOption) == false){\r\n this._options.selectAllOption = options.selectAllOption;\r\n } \r\n // \r\n if (isNotSet(options.inputWidthPX) == false){\r\n this._options.inputWidthPX = options.inputWidthPX;\r\n } \r\n }\r\n\r\n }\r\n\r\n setTerminologyList() {\r\n let _terminology: string[] = ['Išči', 'Vsi', 'Izberi prikazane', 'izbranih'];\r\n if (!isEmpty(this._caption)) {\r\n _terminology = ['Išči', 'Vsi', 'Izberi prikazane', 'izbranih', this._caption];\r\n } \r\n this._translationService.setTranslationsList(_terminology);\r\n }\r\n\r\n bindDiv(elemet:any){\r\n this.msContainer = $(elemet.$container);\r\n this.msButton = $(elemet.$button);\r\n this.msContainerLabel = this.msContainer.find(\"#containerLabel\");\r\n //this.selectedCB = elemet.$select;\r\n\r\n if (this.selectedCB.val().length){\r\n this.setMsFloatingLabel(false);\r\n } else {\r\n this.setMsFloatingLabel(true);\r\n } \r\n }\r\n\r\n setMsFloatingLabel(isEmpry:boolean){\r\n if (isEmpry){\r\n this.msContainerLabel.addClass('ms-float-label-empty');\r\n this.msContainerLabel.removeClass('ms-float-label-selected');\r\n } else {\r\n this.msContainerLabel.removeClass('ms-float-label-empty');\r\n this.msContainerLabel.addClass('ms-float-label-selected'); \r\n } \r\n }\r\n\r\n onInitializedControl(element: any) {\r\n global.ConsoleLogDegug(\"SaopMultiselect.onInitializedControl\");\r\n\r\n if (this.selectedCB.hasClass(\"input-validation-error\")) {\r\n this.msButton.addClass(\"saop-error-input\");\r\n this.msContainerLabel.addClass(\"saop-error-input-text\");\r\n }\r\n\r\n // dodamo sticky css za prvi element\r\n this.addStickyClass();\r\n\r\n this.afterInitializedControl(element);\r\n }\r\n\r\n addStickyClass(): void {\r\n global.ConsoleLogDegug(\"SaopMultiselect.addStickyClass\");\r\n\r\n let seznam = this.msContainer.find(\"button.multiselect-option.dropdown-item\").each(function (index: number, elem: any) {\r\n let selectItem = $(elem);\r\n if (selectItem.text() === \"\") {\r\n selectItem.addClass(\"saop-multiselect-item-sticky\");\r\n }\r\n }); \r\n }\r\n\r\n init(target: string = \"\", caption = \"\" ){\r\n global.ConsoleLogDegug(\"SaopMultiselect.init\");\r\n\r\n this._target = target;\r\n this._caption = caption;\r\n\r\n // poiscemo prevode (tudi za this._caption)\r\n this.setTerminologyList();\r\n\r\n if (isEmpty(target)) {target = \".saop-multiselect\";}\r\n\r\n this.selectedCB = $(target);\r\n\r\n // ali ima selectedCB data-caption\r\n let selectCaption = \"\";\r\n if (!isEmpty(this._caption)) {\r\n selectCaption = this._translationService.translate(this._caption);\r\n }\r\n let dataCaption = this.selectedCB.attr(\"data-caption\");\r\n if (!isEmpty(dataCaption)) {\r\n selectCaption = dataCaption;\r\n }\r\n\r\n let _this = this;\r\n\r\n $(target).multiselect({\r\n maxHeight: 350, \r\n enableFiltering: true,\r\n includeSelectAllOption: _this._options.selectAllOption,\r\n enableCaseInsensitiveFiltering: true,\r\n enableFullValueFiltering: false,\r\n filterPlaceholder: this._translationService.translate(\"Išči\"),\r\n nonSelectedText: '',\r\n allSelectedText:this._translationService.translate(\"Vsi\"),\r\n selectAllText:this._translationService.translate(\"Izberi prikazane\"),\r\n nSelectedText:this._translationService.translate(\"izbranih\"),\r\n includeFilterClearBtn: true,\r\n disableIfEmpty: false,\r\n numberDisplayed: 2,\r\n buttonWidth: _this._options.inputWidthPX,\r\n buttonClass :'saop-control form-control shadow-none ms-image-down pr-0',\r\n buttonContainer: '
    ',\r\n onSelectAll: function (selectedOptions: JQuery) {\r\n _this.bindDiv(this);\r\n _this.afterSelectAll(selectedOptions);\r\n _this.afterChangeCommonEvent(this.$select);\r\n }, \r\n onDeselectAll: function(selectedOptions:JQuery){\r\n _this.bindDiv(this);\r\n _this.afterDeselectAll(selectedOptions);\r\n _this.afterChangeCommonEvent(this.$select);\r\n }, \r\n onChange: function(option: JQuery, checked: boolean){\r\n _this.bindDiv(this);\r\n _this.afterChange(option, checked);\r\n _this.afterChangeCommonEvent(this.$select);\r\n },\r\n onInitialized: function ($select, $container) {\r\n _this._multiSelectObject = this;\r\n _this.bindDiv(this);\r\n _this.onInitializedControl(this);\r\n },\r\n onDropdownHide: function (event: Event) {\r\n let _multiselect_search = _this.msContainer.find(\".multiselect-search\");\r\n if (_multiselect_search.length > 0) {\r\n _multiselect_search.val('').trigger('keydown');\r\n }\r\n },\r\n templates: {\r\n button: this._options.templatesButton,\r\n filter: '
  3. '\r\n } \r\n })\r\n //.multiselect('selectAll', false, true)\r\n .multiselect('updateButtonText');\r\n ; \r\n if (this._options.selectAll == null || this._options.selectAll == true) {\r\n $(target).multiselect('selectAll', false, true);\r\n }\r\n }\r\n afterSelectAll(selectedOptions:JQuery){\r\n\r\n }\r\n\r\n afterDeselectAll(selectedOptions:JQuery){\r\n\r\n }\r\n\r\n afterChange(option: JQuery, checked: boolean){\r\n\r\n }\r\n\r\n afterChangeCommonEvent(element:any){\r\n\r\n }\r\n\r\n afterInitializedControl(element: any){\r\n global.ConsoleLogDegug(\"SaopMultiselect.afterInitializedControl\");\r\n }\r\n\r\n // selectValues vrednosti\r\n setSelectValues(selectValues: string[]): void {\r\n // odznacimo vse zaposlene\r\n this.selectedCB.multiselect('deselectAll');\r\n\r\n if (selectValues != null) {\r\n // oznacimo izbrane\r\n this.selectedCB.multiselect('select', selectValues);\r\n }\r\n this.selectedCB.multiselect('refresh');\r\n\r\n if (this._multiSelectObject != null) {\r\n this.bindDiv(this._multiSelectObject);\r\n this.afterChangeCommonEvent(this._multiSelectObject.$select);\r\n } \r\n }\r\n\r\n // selectValues vrednosti\r\n unsetSelectValues(selectValues: string[]): void {\r\n if (selectValues != null) {\r\n // oznacimo izbrane\r\n this.selectedCB.multiselect('deselect', selectValues);\r\n }\r\n this.selectedCB.multiselect('refresh');\r\n\r\n if (this._multiSelectObject != null) {\r\n this.bindDiv(this._multiSelectObject);\r\n this.afterChangeCommonEvent(this._multiSelectObject.$select);\r\n } \r\n } \r\n\r\n clearHtmlOptions(): void {\r\n this.selectedCB\r\n .find('option')\r\n .remove()\r\n .end();\r\n }\r\n\r\n rebuild(): void {\r\n this.selectedCB.multiselect('rebuild');\r\n }\r\n\r\n refreshHtmlOptions(optionList: SelectOption[], selectAll: boolean = false): void {\r\n let _this = this;\r\n\r\n this.clearHtmlOptions();\r\n if (optionList.length > 0) {\r\n optionList.forEach(element => _this.selectedCB.append(''));\r\n }\r\n this.rebuild();\r\n this.addStickyClass();\r\n\r\n if (selectAll) {\r\n this.selectedCB.multiselect('selectAll');\r\n\r\n if (this.selectedCB.val().length) {\r\n this.setMsFloatingLabel(false);\r\n } else {\r\n this.setMsFloatingLabel(true);\r\n } \r\n }\r\n }\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\n\r\nexport class SaopPopover {\r\n private _querySelector: string;\r\n\r\n constructor(querySelector: string = \"[data-toggle=popover]\") {\r\n this._querySelector = querySelector;\r\n }\r\n\r\n bindPopoverEvents() {\r\n global.ConsoleLogDegug(\"SaopPopover.bindPopoverEvents\");\r\n let _this = this;\r\n\r\n $(\"[data-toggle=popover]\").popover({\r\n html: true,\r\n sanitize: false,\r\n trigger: 'click',\r\n content: function () {\r\n var content = $(this).attr(\"data-popover-content\");\r\n return $(content).children(\".popover-body\").html();\r\n }\r\n });\r\n\r\n $('html').on('mouseup', function (e) {\r\n global.ConsoleLogDegug(\"mouseup!\");\r\n if (!$(e.target).closest('.popover').length) {\r\n global.ConsoleLogDegug(\"mouseup.popover!\");\r\n $('.popover').each(function () {\r\n global.ConsoleLogDegug(\"mouseup.popover.hide!\");\r\n //$(this.previousSibling).popover('hide');\r\n $(_this._querySelector).popover('hide');\r\n });\r\n }\r\n });\r\n\r\n // when popover's content is shown\r\n $(\"[data-toggle=popover]\").on('shown.bs.popover', function (e: any) {\r\n // set what happens when user clicks on the button\r\n global.ConsoleLogDegug(\"set!\");\r\n\r\n _this.afterPopoverShow(this);\r\n\r\n $(\".popoverLink\").off('click');\r\n $(\".popoverLink\").on('click', function () {\r\n global.ConsoleLogDegug(\"popoverLink clicked!!!\");\r\n $(\"[data-toggle=popover]\").popover('hide');\r\n });\r\n\r\n $(\".popoverClose\").off('click');\r\n $(\".popoverClose\").on('click', function () {\r\n global.ConsoleLogDegug(\"Close popover clicked!!!\");\r\n $(\"[data-toggle=popover]\").popover('hide');\r\n });\r\n });\r\n\r\n }\r\n\r\n afterPopoverShow(element: HTMLElement) {\r\n global.ConsoleLogDegug(\"SaopPopover.afterPopoverShow\");\r\n }\r\n\r\n initSelfContainerPopover() {\r\n global.ConsoleLogDegug(\"SaopPopover.initSelfContainerPopover\");\r\n\r\n $(this._querySelector).each(function () {\r\n let $elem = $(this);\r\n let elem = this;\r\n $elem.popover({\r\n container: elem,\r\n sanitize: false\r\n });\r\n });\r\n }\r\n\r\n enablePopover() {\r\n global.ConsoleLogDegug(\"SaopPopover.enablePopover\");\r\n\r\n $(this._querySelector).each(function () {\r\n let $elem = $(this);\r\n $elem.popover('enable');\r\n });\r\n }\r\n\r\n disablePopover() {\r\n global.ConsoleLogDegug(\"SaopPopover.disablePopover\");\r\n\r\n $(this._querySelector).each(function () {\r\n let $elem = $(this);\r\n $elem.popover('disable');\r\n });\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { setModalFormZIndex } from \"../Common/saop-common\";\r\n\r\nexport class SaopPopupDialogOptions {\r\n title: string;\r\n body: string;\r\n showCancelButton: boolean;\r\n confirmButtonCaption: string;\r\n cancelButtonCaption: string;\r\n confirmAction: string;\r\n confirmActiondata: object;\r\n onSuccess: (params:any) => any;\r\n constructor() {\r\n this.title = \"\";\r\n this.body = \"body text\";\r\n this.showCancelButton = true;\r\n this.confirmButtonCaption = \"Ok\";\r\n this.cancelButtonCaption = \"Cancel\";\r\n this.confirmAction = \"\";\r\n this.confirmActiondata = {};\r\n this.onSuccess = null;\r\n }\r\n}\r\n\r\nexport class SaopPopupDialog {\r\n private _options:SaopPopupDialogOptions;\r\n\r\n\r\n constructor(options:SaopPopupDialogOptions) {\r\n this._options = options;\r\n } \r\n \r\n save(callback: (n: number) => any) : void {\r\n callback(42);\r\n }\r\n\r\n ShowLoadingSaop() {\r\n var obj = $(\"#saopLoading\");\r\n if (obj.length)\r\n obj.show();\r\n }\r\n\r\n HideLoadingSaop() {\r\n var obj = $(\"#saopLoading\");\r\n if (obj.length)\r\n obj.hide();\r\n } \r\n\r\n ShowPopupDialog():void {\r\n let _this = this;\r\n // Display info message to the user in a modal\r\n let titleDiv = $('#info-modal-title-div');\r\n let titleH = $('#info-modal-title');\r\n let confirmButton = $('#info-modal-btn-ok');\r\n let cancelButton = $('#info-modal-btn-cancel');\r\n\r\n cancelButton.html(this._options.cancelButtonCaption);\r\n\r\n // show or hide header div based on title property\r\n titleDiv.css(\"display\", \"\");\r\n if (this._options.title) {\r\n titleH.html(this._options.title);\r\n }\r\n else {\r\n titleDiv.css(\"display\", \"none\");\r\n }\r\n\r\n if (this._options.confirmButtonCaption){\r\n confirmButton.html(this._options.confirmButtonCaption);\r\n confirmButton.css(\"display\", \"\"); \r\n } else {\r\n confirmButton.css(\"display\", \"none\");\r\n }\r\n\r\n if (this._options.showCancelButton) {\r\n cancelButton.html(this._options.cancelButtonCaption);\r\n cancelButton.css(\"display\", \"\"); \r\n } else {\r\n cancelButton.css(\"display\", \"none\");\r\n }\r\n\r\n $('#info-modal-body').html(this._options.body);\r\n\r\n $(\"#info-modal-btn-ok\").click(\r\n function () {\r\n _this.popupDialogConfirm();\r\n }\r\n );\r\n\r\n $('#info-modal').on('hidden.bs.modal', function (e) {\r\n $(\"#info-modal-btn-ok\").unbind(\"click\");\r\n $(this).modal('dispose');\r\n })\r\n\r\n $('#info-modal').modal('show');\r\n setModalFormZIndex('#info-modal');\r\n } \r\n\r\n popupDialogConfirm() {\r\n let _this = this;\r\n let cancelButton = $('#info-modal-btn-cancel');\r\n\r\n if (this._options.confirmAction !== \"\") {\r\n $.ajax({\r\n url: this._options.confirmAction,\r\n type: \"POST\",\r\n data: this._options.confirmActiondata,\r\n beforeSend: function () { _this.ShowLoadingSaop(); },\r\n complete: function () { _this.HideLoadingSaop(); },\r\n success: function (result) {\r\n // close dialog\r\n cancelButton.trigger(\"click\");\r\n\r\n if(_this._options.onSuccess !== null){\r\n _this._options.onSuccess(result);\r\n }\r\n \r\n },\r\n error: function (response) {\r\n // close dialog\r\n cancelButton.trigger(\"click\");\r\n alert(response.responseJSON.message);\r\n }\r\n });\r\n }\r\n else {\r\n //close dialog\r\n cancelButton.trigger(\"click\");\r\n\r\n if (this._options.onSuccess != null) {\r\n this._options.onSuccess(null);\r\n }\r\n }\r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { ObdobjefilterValues } from \"../Components/saop-select-month-year\";\r\n\r\nexport enum SaopRightSidebarView {\r\n Dashboard = 0\r\n ,Absence = 1\r\n ,AttendanceDay = 2\r\n ,AttendanceMonth = 3 \r\n ,TravelOrders = 4\r\n , InternalOrders = 5\r\n , AbsenceCalendar = 6\r\n}\r\n\r\nexport class SaopRightSidebar {\r\n private _saopServicesCore: SaopServicesCore;\r\n private _saopServicesCoreAlternative: SaopServicesCore;\r\n\r\n constructor() {\r\n this._saopServicesCore = new SaopServicesCore();\r\n this._saopServicesCoreAlternative = new SaopServicesCore();\r\n }\r\n\r\n\r\n bindCarouselDiv(contentId:string,view:SaopRightSidebarView){\r\n global.ConsoleLogDegug(\"SaopRightSidebar.bindDiv\"); \r\n this._saopServicesCore.afterDone = function(response){\r\n $(contentId).html(response);\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"RightSideBar/GetCarouselView?view=\"+view.toString()\r\n ,data:null\r\n ,type:\"GET\"\r\n ,spinnerDivId:\"#saopLoadingSidebarr\"\r\n ,async:false\r\n }); \r\n }\r\n\r\n refreshDopustZaKoriscenjeSummary(contentId: string, spinnerDivId: string = \"#saopLoadingSidebarr\"): void {\r\n global.ConsoleLogDegug(\"SaopRightSidebar.refreshDopustZaKoriscenjeSummary\");\r\n\r\n this._saopServicesCore.afterDone = function(response){\r\n $(contentId).html(response);\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"RightSideBar/DopustZaKoriscenjeSummaryPartial\"\r\n ,data:null\r\n ,type:\"GET\"\r\n ,spinnerDivId: spinnerDivId\r\n }); \r\n }\r\n\r\n\r\n refreshUreZaKoriscenjeSummary(contentId: string, spinnerDivId: string = \"#saopLoadingSidebarr\"): void {\r\n global.ConsoleLogDegug(\"SaopRightSidebar.refreshUreZaKoriscenjeSummary\");\r\n\r\n this._saopServicesCore.afterDone = function(response){\r\n $(contentId).html(response);\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"RightSideBar/UreZaKoriscenjeSummaryPartial\"\r\n ,data:null\r\n ,type:\"GET\"\r\n ,spinnerDivId: spinnerDivId\r\n });\r\n }\r\n\r\n refreshOdsotnostiEmployeeSummary(sifraZapolseni: string, contentDopustId: string, contentUreId: string, spinnerDivId: string = \"#saopLoadingSidebarr\"): void {\r\n global.ConsoleLogDegug(\"SaopRightSidebar.refreshOdsotnostiEmployeeSummary\");\r\n\r\n this._saopServicesCore.afterDone = function (response) {\r\n $(contentDopustId).html(response);\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action: \"RightSideBar/DopustZaKoriscenjeEmployeeSummaryPartial\"\r\n , data: {\r\n sifraZapolseni: sifraZapolseni\r\n }\r\n , type: \"GET\"\r\n , spinnerDivId: spinnerDivId\r\n });\r\n\r\n this._saopServicesCoreAlternative.afterDone = function (response) {\r\n $(contentUreId).html(response);\r\n };\r\n this._saopServicesCoreAlternative.ExecuteAction({\r\n action: \"RightSideBar/UreZaKoriscenjeEmployeeSummaryPartial\"\r\n , data: {\r\n sifraZapolseni: sifraZapolseni\r\n }\r\n , type: \"GET\"\r\n , spinnerDivId: spinnerDivId\r\n });\r\n }\r\n\r\n refreshOdsotnostiSummary(contentDopustId: string, contentUreId: string, spinnerDivId: string = \"#saopLoadingSidebarr\"): void {\r\n global.ConsoleLogDegug(\"SaopRightSidebar.refreshOdsotnostiSummary\");\r\n\r\n this._saopServicesCore.afterDone = function (response) {\r\n $(contentDopustId).html(response);\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action: \"RightSideBar/DopustZaKoriscenjeSummaryPartial\"\r\n , type: \"GET\"\r\n , spinnerDivId: spinnerDivId\r\n });\r\n\r\n this._saopServicesCoreAlternative.afterDone = function (response) {\r\n $(contentUreId).html(response);\r\n };\r\n this._saopServicesCoreAlternative.ExecuteAction({\r\n action: \"RightSideBar/UreZaKoriscenjeSummaryPartial\"\r\n , type: \"GET\"\r\n , spinnerDivId: spinnerDivId\r\n });\r\n }\r\n\r\n\r\n refreshRegUraDogodkiSummary(contentId: string, selectedMonthYear: ObdobjefilterValues, spinnerDivId:string): void {\r\n global.ConsoleLogDegug(\"SaopRightSidebar.refreshRegUraDogodkiSummary\");\r\n\r\n let _this = this;\r\n let params = { leto: selectedMonthYear.leto, mesec: selectedMonthYear.mesec };\r\n\r\n this._saopServicesCore.afterDone = function(response){\r\n $(contentId).html(response);\r\n _this.setHeight();\r\n window.onresize = function () {\r\n _this.setHeight();\r\n };\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"RightSideBar/RegUraDogodkiSummaryPartial\"\r\n ,data:params\r\n ,type:\"GET\"\r\n ,spinnerDivId:spinnerDivId\r\n //,spinnerDivId:\"#saopLoadingSidebarr\"\r\n });\r\n }\r\n\r\n refreshRegOPNPotniNalogiSummary(contentId: string, spinnerDivId:string): void {\r\n global.ConsoleLogDegug(\"SaopRightSidebar.refreshRegOPNPotniNalogiSummary\");\r\n\r\n this._saopServicesCore.afterDone = function(response){\r\n $(contentId).html(response);\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"TravelOrder/TravelOrdersSummary\"\r\n ,data:null\r\n ,type:\"GET\"\r\n ,spinnerDivId:spinnerDivId\r\n //,spinnerDivId:\"#saopLoadingSidebarr\"\r\n });\r\n }\r\n\r\n refreshNdkInternalOrdersSummary(contentId: string, spinnerDivId: string): void {\r\n global.ConsoleLogDegug(\"SaopRightSidebar.refreshNdkInternalOrdersSummary\");\r\n\r\n this._saopServicesCore.afterDone = function (response) {\r\n $(contentId).html(response);\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action: \"RightSideBar/InternalOrdersSummary\"\r\n , data: null\r\n , type: \"GET\"\r\n , spinnerDivId: spinnerDivId\r\n //,spinnerDivId:\"#saopLoadingSidebarr\"\r\n });\r\n }\r\n\r\n setHeight() {\r\n var header = $(\"#site-header\").height();\r\n var footer = $(\"#site-footer\").height();\r\n $(\"#reg-summary-container\").height(window.innerHeight - header - footer - 106);\r\n }\r\n\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n","import { global, isEmpty, isUnDefined } from \"../Common/saop-common\";\r\nimport { SaopMultiselect, SaopMultiselectOptions } from \"../Components/saop-multiselect\";\r\nimport { SaopServicesCore, SaopServicesCoreParams } from \"../Core/saop-services-core\";\r\n\r\nexport class SaopSelectDropDownItem {\r\n public key: string;\r\n public value: string;\r\n}\r\n\r\nexport class SaopSelectDropDownItems {\r\n public downItems:[SaopSelectDropDownItem?] = [];\r\n}\r\n\r\nexport class SaopSelectDropDown extends SaopMultiselect{\r\n //\r\n public dropDownContainerId:string; \r\n public msDropDownContainer:JQuery;\r\n //\r\n public msAddButton: JQuery;\r\n public msEditButton: JQuery; \r\n //\r\n\r\n constructor(libName:string = \"\", options:SaopMultiselectOptions = null) {\r\n global.ConsoleLogDegug(\"SaopMultiselect\");\r\n if (options == null) {\r\n options = {templatesButton:\"\"};\r\n } \r\n\r\n if (isUnDefined(options.templatesButton) || options.templatesButton.length == 0){\r\n options.templatesButton = ''; \r\n } \r\n\r\n super(libName,options);\r\n } \r\n\r\n init(target: string = \"\", caption = \"\" ){\r\n \r\n //\r\n this.dropDownContainerId = target+\"_DropDownContainer\";\r\n this.msDropDownContainer = $(this.dropDownContainerId);\r\n if (this.msDropDownContainer.length > 0) {\r\n this.msAddButton = this.msDropDownContainer.find(\".saop-img-plus\");\r\n this.msEditButton = this.msDropDownContainer.find(\".saop-img-edit\");\r\n } \r\n // \r\n super.init(target, caption);\r\n //\r\n this.bindEvents();\r\n }\r\n\r\n public bindEvents ():void{\r\n let _this = this;\r\n if (this.msDropDownContainer.length > 0) {\r\n $(this.dropDownContainerId+\" .saop-img-close\").off(\"click\");\r\n $(this.dropDownContainerId+\" .saop-img-close\").on(\"click\", function (e) {\r\n global.ConsoleLogDegug(\"SaopMultiselect.clear.click\");\r\n e.stopPropagation();\r\n if (_this.msDropDownContainer.length > 0){\r\n _this.msDropDownContainer.find('input[type=\"radio\"]').prop('checked', false);\r\n _this.msDropDownContainer.find('.multiselect-selected-text').html(\"\");\r\n _this.setMsFloatingLabel(true);\r\n } else {\r\n _this.selectedCB.multiselect('deselectAll');\r\n }\r\n }); \r\n //\r\n this.msAddButton.off(\"click\");\r\n this.msAddButton.on(\"click\", function (e) {\r\n global.ConsoleLogDegug(\"SaopMultiselect.msAddButton.click\");\r\n _this.onAddBtnClick(e);\r\n }); \r\n //\r\n this.msEditButton.off(\"click\");\r\n this.msEditButton.on(\"click\", function (e) {\r\n global.ConsoleLogDegug(\"SaopMultiselect.msEditButton.click\");\r\n _this.onEditBtnClick(e);\r\n }); \r\n // \r\n }\r\n }\r\n\r\n setMsFloatingLabel(isEmpry:boolean){\r\n super.setMsFloatingLabel(isEmpry);\r\n if (isEmpry){\r\n if (this.msDropDownContainer.length > 0) {\r\n this.msAddButton.css(\"display\",\"unset\"); \r\n this.msEditButton.css(\"display\",\"none\");\r\n }\r\n } else { \r\n if (this.msDropDownContainer.length > 0) {\r\n this.msAddButton.css(\"display\",\"none\"); \r\n this.msEditButton.css(\"display\",\"unset\"); \r\n } \r\n } \r\n }\r\n\r\n public onAddBtnClick(sender:any):void{\r\n global.ConsoleLogDegug(\"onAddBtnClick...\");\r\n } \r\n\r\n public onEditBtnClick(sender:any):void{\r\n global.ConsoleLogDegug(\"onEditBtnClick...\");\r\n } \r\n\r\n initAll(targetClass: string = \"\"){\r\n var _msList = document.querySelectorAll('.saop-dropdownselect');\r\n\r\n _msList.forEach(element => {\r\n let _input = new SaopMultiselect();\r\n let _id = \"#\"+element.id;\r\n _input.init(_id);\r\n });\r\n }\r\n\r\n getDropDownItemsData(_params:SaopServicesCoreParams, selectVal:string): void {\r\n global.ConsoleLogDegug(\"getDropDownItemsData\");\r\n //\r\n let _this = this;\r\n let saopServicesCore = new SaopServicesCore();\r\n \r\n saopServicesCore.afterDone = function (response) {\r\n _this.refreshDropDownSelect(response, selectVal);\r\n };\r\n \r\n saopServicesCore.ExecuteAction({\r\n action: _params.action\r\n , data: _params.data\r\n , type: _params.type\r\n }); \r\n }\r\n\r\n refreshDropDownSelect(dropDown:[any], selectVal:string): void {\r\n let selectDivTemplate = \"\";\r\n\r\n //let _sifraRelacije = this.selectedCB.val();\r\n\r\n dropDown.forEach(function (value) {\r\n if (value.key == selectVal) {\r\n selectDivTemplate = selectDivTemplate + \"\\n\" + \"\"\r\n } else {\r\n selectDivTemplate = selectDivTemplate + \"\\n\" + \"\"\r\n }\r\n \r\n });\r\n \r\n this.selectedCB.html(selectDivTemplate);\r\n\r\n let _selectDiv = this.selectedCB.clone();\r\n\r\n this.msDropDownContainer.find(\"#fLabel\").html(_selectDiv);\r\n\r\n this.init(this._target, this._caption);\r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","/// \r\nimport { SaopTranslationService } from '../Core/saop-translate';\r\nimport { global,isEmpty, isUnDefined } from \"../Common/saop-common\";\r\nimport { SaopPopover } from './saop-popover';\r\n\r\nexport class ObdobjefilterValues {\r\n leto: number;\r\n mesec: number;\r\n mesecNaziv: string;\r\n}\r\n\r\nexport class SaopSelectMonthYear {\r\n private _viewId: string;\r\n private _controlId: string;\r\n private _libName: string;\r\n\r\n private _obdobjeId: string;\r\n private _calendarIconId: string;\r\n private _obdobjeFilterLetoId: string;\r\n private _obdobjeFilterMesecId: string;\r\n private _obdobjeCurrentBtnId: string;\r\n private _popOverObdobjeBodyId: string;\r\n private _previousMonthBtnId: string;\r\n private _nextMonthBtnId: string;\r\n\r\n private _translationService: SaopTranslationService;\r\n private _saopPopover: SaopPopover;\r\n\r\n public _refreshingRecordsInProgress: boolean;\r\n\r\n constructor(viewId: string, controlId: string, libName: string = \"\") {\r\n global.ConsoleLogDegug(\"SaopSelectMonthYear\");\r\n\r\n this._viewId = viewId;\r\n this._controlId = controlId;\r\n this._libName = libName;\r\n\r\n this._refreshingRecordsInProgress = false;\r\n this._obdobjeId = \"#Obdobje\";\r\n this._calendarIconId = \"#calendarIcon\";\r\n this._obdobjeFilterLetoId = \"#letoObdobje\";\r\n this._obdobjeFilterMesecId = \"#MesecString\";\r\n this._obdobjeCurrentBtnId = \"#currentMonthBtnFilter\";\r\n this._popOverObdobjeBodyId = \"#popOverObdobjeBody\";\r\n this._previousMonthBtnId = \"#previousMonthBtnFilter\";\r\n this._nextMonthBtnId = \"#nextMonthBtnFilter\";\r\n\r\n this._translationService = new SaopTranslationService();\r\n\r\n this._saopPopover = new SaopPopover();\r\n this._saopPopover.afterPopoverShow = this.afterPopoverShow.bind(this); \r\n } \r\n\r\n private afterPopoverShow(): void {\r\n global.ConsoleLogDegug(\"SaopSelectMonthYear.afterPopoverShow\");\r\n\r\n let obdobjeData = this.getObdobjeDataAttributes(this._obdobjeId);\r\n\r\n // osvezimo vrednosti filtrov iz data attributes\r\n this.setObdobjeFilterValues(obdobjeData);\r\n\r\n // prikazi okno\r\n var filterBody = $(\"div.popover.show\").find(this._popOverObdobjeBodyId);\r\n filterBody.show();\r\n\r\n // bind popup events\r\n this.bindPopupEvents();\r\n }\r\n\r\n private getObdobjeDataAttributes(id: string): ObdobjefilterValues {\r\n global.ConsoleLogDegug(\"SaopSelectMonthYear.getObdobjeDataAttributes\");\r\n\r\n let obdobjeElement = $(this._obdobjeId);\r\n\r\n let dataAttributes = new ObdobjefilterValues();\r\n dataAttributes.leto = parseInt(obdobjeElement.attr(\"data-leto\"));\r\n dataAttributes.mesec = parseInt(obdobjeElement.attr(\"data-mesec\"));\r\n dataAttributes.mesecNaziv = obdobjeElement.attr(\"data-mesec-naziv\");\r\n\r\n return dataAttributes;\r\n }\r\n\r\n private setObdobjeFilterValues(filterValues: ObdobjefilterValues): void {\r\n global.ConsoleLogDegug(\"SaopSelectMonthYear.setObdobjeFilterValues\");\r\n\r\n let oldfilterValues = this.getObdobjefilterValues();\r\n\r\n // leto\r\n if (oldfilterValues.leto != filterValues.leto) {\r\n let letoElement = $(\"div.popover.show\").find(this._obdobjeFilterLetoId);\r\n if (letoElement.length) {\r\n letoElement.val(filterValues.leto);\r\n }\r\n }\r\n\r\n // mesec\r\n if (oldfilterValues.mesec != filterValues.mesec) {\r\n let mesecElement = $(\"div.popover.show\").find(this._obdobjeFilterMesecId);\r\n if (mesecElement.length) {\r\n mesecElement.val(filterValues.mesec.toString());\r\n }\r\n }\r\n }\r\n\r\n private getObdobjefilterValues(): ObdobjefilterValues {\r\n global.ConsoleLogDegug(\"SaopSelectMonthYear.getObdobjefilterValues\");\r\n\r\n let filterValues = new ObdobjefilterValues();\r\n filterValues.leto = null;\r\n filterValues.mesec = null;\r\n filterValues.mesecNaziv = \"\";\r\n\r\n // dolocimo leto\r\n let letoElement = $(\"div.popover.show\").find(this._obdobjeFilterLetoId);\r\n if (letoElement.length) {\r\n let letoStr = String(letoElement.val());\r\n if (letoStr.length == 4 || letoStr.length == 0) {\r\n if (letoStr.length == 4) {\r\n filterValues.leto = +letoStr;\r\n }\r\n }\r\n }\r\n\r\n // dolocimo mesec\r\n let mesecElement = $(\"div.popover.show\").find(this._obdobjeFilterMesecId);\r\n if (mesecElement.length) {\r\n let selMesecNaziv = $(mesecElement).find(\":selected\").text();\r\n let selMesec = $(mesecElement).find(\":selected\").val();\r\n\r\n if (!isNaN(+selMesec)) {\r\n filterValues.mesec = +selMesec\r\n filterValues.mesecNaziv = selMesecNaziv\r\n }\r\n }\r\n\r\n return filterValues;\r\n }\r\n\r\n private bindPopupEvents(): void {\r\n global.ConsoleLogDegug(\"SaopSelectMonthYear.bindPopupEvents\");\r\n\r\n let _this = this;\r\n\r\n $(\"div.popover.show \" + this._popOverObdobjeBodyId + \" \" + this._obdobjeCurrentBtnId).off(\"click\");\r\n $(\"div.popover.show \" + this._popOverObdobjeBodyId + \" \" + this._obdobjeCurrentBtnId).on('click', function (element) {\r\n _this.obdobjeCurrentClick();\r\n });\r\n\r\n $(\"div.popover.show \" + this._popOverObdobjeBodyId + \" \" + this._previousMonthBtnId).off(\"click\");\r\n $(\"div.popover.show \" + this._popOverObdobjeBodyId + \" \" + this._previousMonthBtnId).on('click', function (element) {\r\n _this.obdobjefiltersMonthStepChange(-1);\r\n });\r\n\r\n $(\"div.popover.show \" + this._popOverObdobjeBodyId + \" \" + this._nextMonthBtnId).off(\"click\");\r\n $(\"div.popover.show \" + this._popOverObdobjeBodyId + \" \" + this._nextMonthBtnId).on('click', function (element) {\r\n _this.obdobjefiltersMonthStepChange(1);\r\n });\r\n\r\n $(\"div.popover.show \" + this._popOverObdobjeBodyId + \" \" + this._obdobjeFilterMesecId).off(\"change\");\r\n $(\"div.popover.show \" + this._popOverObdobjeBodyId + \" \" + this._obdobjeFilterMesecId).on('change', function (element) {\r\n _this.obdobjefiltersChanged();\r\n });\r\n\r\n $(\"div.popover.show \" + this._popOverObdobjeBodyId + \" \" + this._obdobjeFilterLetoId).off(\"change\");\r\n $(\"div.popover.show \" + this._popOverObdobjeBodyId + \" \" + this._obdobjeFilterLetoId).on('change', function (element) {\r\n _this.obdobjefiltersChanged();\r\n });\r\n\r\n $(\"div.popover.show \" + this._popOverObdobjeBodyId + \" \" + this._obdobjeFilterLetoId).off(\"keyup\");\r\n $(\"div.popover.show \" + this._popOverObdobjeBodyId + \" \" + this._obdobjeFilterLetoId).on('keyup', function (element) {\r\n _this.obdobjefiltersChanged();\r\n });\r\n }\r\n\r\n public init(){\r\n global.ConsoleLogDegug(\"SaopSelectMonthYear.init\");\r\n\r\n // poiscemo prevode\r\n this.setTerminologyList();\r\n\r\n this._saopPopover.bindPopoverEvents();\r\n\r\n this.setObdobjeText(this._obdobjeId)\r\n\r\n\r\n // bind events\r\n this.bindEvents();\r\n\r\n this.afterInitializedControl(this);\r\n }\r\n\r\n private setTerminologyList(): void {\r\n let _terminology: string[] = ['Išči'];\r\n this._translationService.setTranslationsList(_terminology);\r\n }\r\n\r\n private setObdobjeText(id: string): void {\r\n global.ConsoleLogDegug(\"SaopSelectMonthYear.setObdobjeText\");\r\n\r\n let obdobjeElement = $(this._obdobjeId);\r\n\r\n let mesecNaziv = obdobjeElement.attr(\"data-mesec-naziv\");\r\n let leto = obdobjeElement.attr(\"data-leto\");\r\n\r\n obdobjeElement.val(mesecNaziv + \" \" + leto);\r\n }\r\n\r\n private bindEvents(): void {\r\n global.ConsoleLogDegug(\"SaopSelectMonthYear.bindEvents\");\r\n\r\n let _this = this;\r\n\r\n $(this._viewId + \" \" + this._controlId + \" \" + this._obdobjeId).off(\"click\");\r\n $(this._viewId + \" \" + this._controlId + \" \" + this._obdobjeId).on('click', function (element) {\r\n _this.obdobjeClick();\r\n }); \r\n\r\n $(this._viewId + \" \" + this._controlId + \" \" + this._obdobjeCurrentBtnId).off(\"click\");\r\n $(this._viewId + \" \" + this._controlId + \" \" + this._obdobjeCurrentBtnId).on('click', function (element) {\r\n _this.obdobjeCurrentClick();\r\n }); \r\n }\r\n\r\n private obdobjeClick(): void {\r\n global.ConsoleLogDegug(\"SaopSelectMonthYear.obdobjeClick\");\r\n $(this._calendarIconId).trigger(\"click\");\r\n }\r\n\r\n\r\n private obdobjeCurrentClick(): void {\r\n global.ConsoleLogDegug(\"SaopSelectMonthYear.obdobjeCurrentClick\");\r\n\r\n let currentMonthFilterValues = new ObdobjefilterValues();\r\n\r\n currentMonthFilterValues.leto = new Date().getFullYear();\r\n currentMonthFilterValues.mesec = new Date().getMonth() + 1;\r\n currentMonthFilterValues.mesecNaziv = this.getMonthName(currentMonthFilterValues.mesec);\r\n\r\n // zapisemo vrednost v filter leto\r\n this.setObdobjeFilterValues(currentMonthFilterValues);\r\n\r\n // osvezimo obdobje element z novimi podatki\r\n this.setObdobjeDataAttributes(this._obdobjeId, currentMonthFilterValues);\r\n\r\n this.monthYearValuesChanged(currentMonthFilterValues.leto, currentMonthFilterValues.mesec);\r\n }\r\n\r\n private getMonthName(month: number): string {\r\n global.ConsoleLogDegug(\"SaopSelectMonthYear.getMonthName\");\r\n\r\n let mesecElement = $(\"div.popover.show\").find(this._obdobjeFilterMesecId);\r\n if (mesecElement.length) {\r\n return $(mesecElement).find(\" option[value = '\" + month + \"']\").text();\r\n }\r\n\r\n return \"\";\r\n }\r\n\r\n private setObdobjeDataAttributes(id: string, values: ObdobjefilterValues): void {\r\n global.ConsoleLogDegug(\"SaopSelectMonthYear.setObdobjeDataAttributes\");\r\n\r\n let obdobjeElement = $(id);\r\n\r\n if (values.leto != null && values.mesec != null) {\r\n obdobjeElement.attr(\"data-leto\", values.leto);\r\n obdobjeElement.attr(\"data-mesec\", values.mesec);\r\n obdobjeElement.attr(\"data-mesec-naziv\", values.mesecNaziv);\r\n\r\n this.setObdobjeText(this._obdobjeId);\r\n }\r\n }\r\n\r\n // na popover filtru za obdobje pomik za en mesec naprej, nazaj\r\n private obdobjefiltersMonthStepChange(step: number): void {\r\n if (this._refreshingRecordsInProgress == true) {\r\n // poteka postopek osvezevanja podatkov, novi zahtevek ni dovoljen \r\n return;\r\n }\r\n\r\n global.ConsoleLogDegug(\"SaopSelectMonthYear.obdobjefiltersMonthStepChange\");\r\n\r\n // preberemo vrednosti leto in mesec\r\n let filterValues = this.getObdobjefilterValues();\r\n\r\n let newFilterValues = new ObdobjefilterValues();\r\n newFilterValues.mesec = filterValues.mesec + step;\r\n newFilterValues.leto = filterValues.leto;\r\n if (newFilterValues.mesec == 13) {\r\n // za december je januar\r\n newFilterValues.mesec = 1;\r\n newFilterValues.leto = newFilterValues.leto + 1;\r\n }\r\n else if (newFilterValues.mesec == 0) {\r\n // pred januarjem je december\r\n newFilterValues.mesec = 12;\r\n newFilterValues.leto = newFilterValues.leto - 1;\r\n }\r\n\r\n // poiscemo se naziv meseca\r\n newFilterValues.mesecNaziv = this.getMonthName(newFilterValues.mesec);\r\n\r\n // zapisemo novo vrednost v filter leto\r\n this.setObdobjeFilterValues(newFilterValues);\r\n\r\n // osvezimo obdobje element z novimi podatki\r\n this.setObdobjeDataAttributes(this._obdobjeId, newFilterValues);\r\n\r\n this.monthYearValuesChanged(newFilterValues.leto, newFilterValues.mesec);\r\n }\r\n\r\n // vrednosti v filtru leto, mesec so se spremenile\r\n private obdobjefiltersChanged(): void {\r\n global.ConsoleLogDegug(\"SaopSelectMonthYear.obdobjefiltersChanged\");\r\n\r\n // preberemo vrednosti leto in mesec\r\n let filterValues = this.getObdobjefilterValues();\r\n\r\n // osvezimo obdobje element z novimi podatki\r\n this.setObdobjeDataAttributes(this._obdobjeId, filterValues);\r\n\r\n this.monthYearValuesChanged(filterValues.leto, filterValues.mesec);\r\n }\r\n\r\n private monthYearValuesChanged(leto: number, mesec: number): void {\r\n if (this._refreshingRecordsInProgress == true) {\r\n // poteka postopek osvezevanja podatkov, novi zahtevek ni dovoljen \r\n return;\r\n }\r\n\r\n if (isUnDefined(leto) || isUnDefined(leto)) {\r\n return;\r\n }\r\n\r\n global.ConsoleLogDegug(\"SaopSelectMonthYear.monthYearValuesChanged\");\r\n\r\n // disable kontrole, ker se izvaja refresh\r\n this.enableDisableObdobjeFilters(true);\r\n\r\n this.afterMonthYearValuesChanged(leto, mesec);\r\n }\r\n\r\n private enableDisableObdobjeFilters(disable: boolean): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesAnalysisView.enableDisableObdobjeFilters\");\r\n\r\n this._refreshingRecordsInProgress = disable;\r\n\r\n // leto\r\n let letoElement = $(\"div.popover.show\").find(this._obdobjeFilterLetoId);\r\n if (letoElement.length) {\r\n letoElement.prop(\"disabled\", disable);\r\n }\r\n\r\n // mesec\r\n let mesecElement = $(\"div.popover.show\").find(this._obdobjeFilterMesecId);\r\n if (mesecElement.length) {\r\n mesecElement.prop(\"disabled\", disable);\r\n }\r\n\r\n // gumb trenutni\r\n let _obdobjeCurrentBtnElement = $(\"div.popover.show\").find(this._obdobjeCurrentBtnId);\r\n if (_obdobjeCurrentBtnElement.length) {\r\n _obdobjeCurrentBtnElement.prop(\"disabled\", disable);\r\n }\r\n }\r\n\r\n // za externi bind event\r\n public afterInitializedControl(element: any): void{\r\n global.ConsoleLogDegug(\"SaopSelectMonthYear.afterInitializedControl\");\r\n }\r\n\r\n public getSelectedMonthYear(): ObdobjefilterValues {\r\n global.ConsoleLogDegug(\"SaopSelectMonthYear.getSelectedMonthYear\");\r\n\r\n // preberemo vrednosti leto in mesec\r\n return this.getObdobjeDataAttributes(this._obdobjeId);\r\n }\r\n\r\n // za externi bind event\r\n public afterMonthYearValuesChanged(leto: number, mesec: number): void {\r\n global.ConsoleLogDegug(\"SaopSelectMonthYear.afterMonthYearValuesChanged\");\r\n }\r\n\r\n // za externi uporabo\r\n public setRefreshingRecordsComplete(): void {\r\n global.ConsoleLogDegug(\"SaopSelectMonthYear.setRefreshingRecordsComplete\");\r\n\r\n // enable kontrole, ker se je refresh koncal\r\n this.enableDisableObdobjeFilters(false);\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","\r\nexport interface SaopInputWFLProperties {\r\n id:string;\r\n placeholder:string;\r\n caption:string;\r\n}\r\n\r\nexport class SaopselectWFL {\r\n private _inputTemplate:string;\r\n constructor(properties:SaopInputWFLProperties) {\r\n this._inputTemplate = \r\n `\r\n \r\n \r\n \r\n \r\n \r\n `; \r\n }\r\n\r\n getElement():JQuery{\r\n let _element = $(this._inputTemplate);\r\n return _element;\r\n }\r\n\r\n getInnerHtml():string{\r\n return this._inputTemplate;\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","/// \r\n\r\nimport { global, getRelativeSiteURL, getSiteAbsoluteURL, isEmpty, isUnDefined } from \"../Common/saop-common\";\r\n\r\nexport class SaopSelectizeSelectToolTip {\r\n constructor() {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelectToolTip.constructor\");\r\n }\r\n\r\n public InitTooltype(selectorName: string = \"[data-selectable]\"): void {\r\n $(document).off(\"mouseenter\", selectorName, (e) => this.SetTooltype(e));\r\n $(document).on(\"mouseenter\", selectorName, (e) => this.SetTooltype(e));\r\n }\r\n\r\n public SetTooltype(e: any): void {\r\n const element = $(e.currentTarget);\r\n element.tooltip({\r\n placement: 'top',\r\n title: element.find('span').text().trim(),\r\n }).tooltip('show');\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","/// \r\n\r\nimport { global, getRelativeSiteURL, getSiteAbsoluteURL, isEmpty, isUnDefined } from \"../Common/saop-common\";\r\n\r\nexport class SaopSelectizeSelectWraper {\r\n private _viewId : string; \r\n private _libName : string;\r\n\r\n constructor(viewId: string = \"\",libName: string = \"\") {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelectWraper.constructor\");\r\n this._viewId = viewId;\r\n this._libName = libName;\r\n }\r\n\r\n public initAll(className:string = \".selectizeSelect\"):void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelectWraper.initAll\");\r\n var allDivs = document.querySelectorAll(className);\r\n\r\n allDivs.forEach(element => {\r\n global.ConsoleLogDegug(\"element.init......................\" + element.id);\r\n if (isEmpty(element.id) == false){\r\n let _elementId = \"#\"+element.id;\r\n let _saopSelectizeSelect = new icSaopCore.SaopSelectizeSelectEx(this._viewId,_elementId,this._libName);\r\n _saopSelectizeSelect.initControlByHtml(element);\r\n }\r\n });\r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","\r\n/// \r\nimport { convertString2Date, global,isEmpty } from \"../Common/saop-common\";\r\n\r\nexport class SaopSifranti {\r\n\r\n init() {\r\n global.ConsoleLogDegug(\"SaopSifranti.init...\");\r\n var inputDivs = document.querySelectorAll('input[data-saopSifranti-inputmask]');\r\n\r\n inputDivs.forEach(element => {\r\n global.ConsoleLogDegug(\"element.init......................\" + element.id);\r\n\r\n let _this = this;\r\n let elementAtrr = $(element).attr(\"data-saopSifranti-inputmask\");\r\n if (isEmpty(elementAtrr)) {return;};\r\n global.ConsoleLogDegug(elementAtrr);\r\n //\r\n const artrrArray = elementAtrr.split(\"#\");\r\n let _inputType = artrrArray[2];\r\n let _maskLength = parseInt(artrrArray[3]);\r\n if (_maskLength.toString() != artrrArray[3]) {\r\n _maskLength = 0;\r\n }\r\n let _inputLeadingChar = artrrArray[4];\r\n //\r\n if (_inputType == \"N\") {\r\n $(element).attr(\"type\",\"text\");\r\n $(element).on('keypress', function(event) {\r\n let allowedChars ='1234567890';\r\n const chr = String.fromCharCode(event.which);\r\n if (allowedChars.indexOf(chr) < 0) {\r\n return false;\r\n }\r\n }); \r\n }\r\n //\r\n let _readonlyAtrr = $(element).attr('readonly');\r\n let _readonly = false;\r\n if (isEmpty(_readonlyAtrr) == false && _readonlyAtrr == \"readonly\"){\r\n _readonly = true;\r\n }\r\n //\r\n let _disabledAtrr = $(element).attr('disabled');\r\n let _disabled = false;\r\n if (isEmpty(_disabledAtrr) == false && _disabledAtrr == \"disabled\"){\r\n _disabled = true;\r\n } \r\n //\r\n $(element).off(\"focusout\");\r\n if (_readonly == false && _maskLength > 0) {\r\n $(element).attr('maxlength',_maskLength.toString());\r\n $(element).on(\"focusout\", function (event: any) {\r\n var controlValue = event.target.value;\r\n controlValue = _inputLeadingChar.repeat(_maskLength)+controlValue;\r\n controlValue = controlValue.substring(controlValue.length - _maskLength);\r\n event.target.value = controlValue;\r\n }); \r\n }\r\n //\r\n });\r\n\r\n global.ConsoleLogDegug(\"initInputs...done\");\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\n\r\nexport class SaopTogglePanel {\r\n\r\n init():void{\r\n global.ConsoleLogDegug(\"SaopTogglePanel.init...\");\r\n this.setClickEventOnFrame(\"body\");\r\n }\r\n\r\n setClickEventOnFrame(frameName:string = \"body\"):void {\r\n global.ConsoleLogDegug(\"SaopTogglePanel.setClickEventOnFrame...\");\r\n\r\n let _frame = $(\"\"+frameName+\" *> .saop-toggle-panel\");\r\n _frame.off(\"click\");\r\n _frame.click(function () {\r\n //na klik se puščica obrne gor / dol\r\n var arrowDiv = $(this).find(\".saop-toggle-arrow\");\r\n\r\n for (var i = 0; i < arrowDiv.length; i++) {\r\n if (arrowDiv[i].classList.contains(\"saop-img-down\")) {\r\n arrowDiv[i].classList.remove(\"saop-img-down\");\r\n arrowDiv[i].classList.add(\"saop-img-up\");\r\n } else {\r\n arrowDiv[i].classList.remove(\"saop-img-up\");\r\n arrowDiv[i].classList.add(\"saop-img-down\");\r\n }\r\n }\r\n });\r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { global, getRelativeSiteURL, getSiteAbsoluteURL, isEmpty, isUnDefined } from \"../Common/saop-common\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { SaopViewFormBindings } from \"../Core/saop-view-form-bindings\";\r\nimport { SaopWfSubmitResult } from \"../Core/saop-view-form\";\r\n\r\n\r\nexport interface SaopUploadFilesParams {\r\n controller:string,\r\n action:string,\r\n validateAjax?:boolean,\r\n formId?:string,\r\n validationDivId?:string,\r\n allowSelectMultiFiles?: boolean\r\n}\r\n\r\nexport class SaopUploadFiles extends SaopViewFormBindings {\r\n private _clibName: string;\r\n private _siteUrl: string;\r\n private _params:SaopUploadFilesParams;\r\n private _popupViewId:string;\r\n private _popupView:JQuery;\r\n private _popupViewTitle:JQuery;\r\n private _viewModalBody:JQuery;\r\n private _btnSave:JQuery;\r\n private _btnCancel:JQuery;\r\n private _validations:JQuery;\r\n private contentElementId = \".saop-modal-body-element\"; \r\n private _saopServicesCore: SaopServicesCore;\r\n private _filesCount:number = 0;\r\n //\r\n public viewTitle:string = \"Upload\";\r\n\r\n constructor(viewId:string,libName:string = \"\"){\r\n super(\"#uploadSplDocumentsView\",libName);\r\n this._clibName = libName;\r\n this._popupViewId = viewId;\r\n this.onErrorCallback = null; \r\n this.onFailureCallback = null; \r\n this._saopServicesCore = new SaopServicesCore();\r\n } \r\n\r\n initComponent(params:SaopUploadFilesParams){ // use this method in case of no modal window\r\n global.ConsoleLogDegug(\"initComponent\");\r\n let _this = this;\r\n this._params = params;\r\n this._siteUrl = getSiteAbsoluteURL(this._params.controller); \r\n this.initInputControl(this._params.allowSelectMultiFiles);\r\n this.bindFormControlsEvents();\r\n }\r\n\r\n initView(params:SaopUploadFilesParams) { // use this method in case of modal window\r\n global.ConsoleLogDegug(\"initView\");\r\n this._params = params;\r\n this._siteUrl = getRelativeSiteURL(this._params.controller);\r\n this.initInputControl(this._params.allowSelectMultiFiles);\r\n this.bindPopupControls();\r\n this.renderView();\r\n }\r\n\r\n initInputControl(allowSelectMultiFiles: boolean) {\r\n global.ConsoleLogDegug(\"SaopUploadFiles.initInputControl\");\r\n let inputElement = $('.custom-file input');\r\n\r\n // po defaulti omogoča izbor multi datotek\r\n if (allowSelectMultiFiles == false) {\r\n inputElement.removeAttr(\"multiple\");\r\n }\r\n }\r\n\r\n bindPopupControls(){\r\n global.ConsoleLogDegug(\"SaopUploadFiles.bindControls\");\r\n this._popupView = $(this._popupViewId);\r\n this._popupViewTitle = $(\"\"+this._popupViewId+\" *> #exampleModalLongTitle\");\r\n var contentSel = this._popupViewId + \" \" + this.contentElementId;\r\n this._viewModalBody = $(contentSel); \r\n //\r\n this._popupViewTitle.html(this.viewTitle);\r\n //\r\n }\r\n\r\n bindFormControls(){\r\n global.ConsoleLogDegug(\"SaopUploadFiles.bindFormControls\");\r\n this.bindFormAjaxEvents({controller:\"SPLDocument\",action:\"UploadDocuments\"}); \r\n this._btnSave = this._formFrame.find(\"#btnOk\");\r\n this._btnCancel = this._formFrame.find(\"#btnCancel\");\r\n this._validations = $(\"#uploadFilesValidationsAjax\"); \r\n this.bindFormControlsEvents(); \r\n }\r\n\r\n bindFormControlsEvents(){\r\n global.ConsoleLogDegug(\"SaopUploadFiles.bindFormControlsEvents\");\r\n let _this = this;\r\n $('.custom-file input').off(\"change\");\r\n $('.custom-file input').change(function (e) {\r\n _this.refreshFileList(e.target);\r\n }); \r\n }\r\n\r\n refreshFileList(inputElement: HTMLInputElement): void {\r\n global.ConsoleLogDegug(\"SaopUploadFiles.refreshFileList\");\r\n\r\n let files = inputElement.files;\r\n var file_list = \"\";\r\n\r\n this._filesCount = files.length;\r\n if (this._filesCount > 0) {\r\n file_list = \"
    \";\r\n for (var i = 0; i < files.length; i++) {\r\n let fileElement = \"
    \";\r\n fileElement = fileElement + \"
    \" + files[i].name + \"
    \";\r\n fileElement = fileElement + \"
    \";\r\n fileElement = fileElement + \"
    \";\r\n file_list = file_list + fileElement;\r\n }\r\n file_list = file_list + \"
    \"\r\n }\r\n\r\n $('div.custom-file-list').removeClass(\"d-none\");\r\n $('div.custom-file-list').addClass(\"d-block\");\r\n\r\n $('.custom-file-list').html(file_list);\r\n\r\n this.afterRefreshFilesList();\r\n }\r\n\r\n removeFile(divElement: any): void {\r\n global.ConsoleLogDegug(\"SaopUploadFiles.removeFile\");\r\n let fileName = divElement.getAttribute(\"data-file-name\");\r\n\r\n let inputElementSelector = \".custom-file input\";\r\n if (!isEmpty(this._params.formId)) {\r\n inputElementSelector = this._params.formId + \" \" + inputElementSelector;\r\n }\r\n\r\n let inputElement = $(inputElementSelector)[0];\r\n let files = inputElement.files\r\n\r\n const dt = new DataTransfer();\r\n\r\n for (var i = 0; i < files.length; i++) {\r\n if (files[i].name.toLowerCase() === fileName.toLowerCase()) {\r\n }\r\n else {\r\n dt.items.add(files[i]); \r\n }\r\n }\r\n\r\n inputElement.files = dt.files;\r\n this.refreshFileList(inputElement);\r\n }\r\n\r\n afterRefreshFilesList(){\r\n\r\n }\r\n\r\n renderView(){\r\n let _this = this;\r\n this._saopServicesCore.afterDone = function(response){\r\n _this._viewModalBody.html(response);\r\n _this.bindFormControls();\r\n _this._popupView.modal('show');\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action: this._siteUrl+\"/\"+this._params.action\r\n ,type:\"GET\"\r\n }); \r\n }\r\n\r\n onSubmitSuccess(data: SaopWfSubmitResult): void {\r\n global.ConsoleLogDegug(\"SaopUploadFiles.onSubmitSuccess\");\r\n if (data.success) {\r\n alertify.message(data.alertMessage);\r\n this._popupView.modal('hide');\r\n // just in case: odstrani, če je še vedno vidno, avtomatsko se ne zapre vedno :(\r\n $('.modal-backdrop').remove();\r\n $(document.body).removeClass(\"modal-open\"); \r\n }\r\n else{\r\n //alertify.error(data.alertMessage);\r\n this._validations.html(data.viewContent);\r\n //this._btnSave.attr(\"disabled\", \"true\");\r\n }\r\n this.afterSubmitSuccess(data);\r\n } \r\n\r\n public afterSubmitSuccess(result: SaopWfSubmitResult): void {\r\n global.ConsoleLogDegug(\"SaopUploadFiles.afterExecuteSuccess\");\r\n } \r\n\r\n ajaxValidate():boolean{\r\n if (this._filesCount <= 0) { return; }\r\n if ((this._params.validateAjax == null) || (this._params.validateAjax == false) || isEmpty(this._params.validationDivId) || isEmpty(this._params.formId)) {\r\n return;\r\n }\r\n let _this = this;\r\n let _result = true;\r\n this._validations = $(this._params.validationDivId); \r\n\r\n let _formE = $(this._params.formId)[0];\r\n let _form = (_formE);\r\n var formData = new FormData(_form);\r\n\r\n $.ajax({\r\n url: this._siteUrl+\"/\"+this._params.action,\r\n type: 'POST',\r\n data: formData,\r\n async: false,\r\n cache: false,\r\n contentType: false,\r\n processData: false,\r\n success: function(data: SaopWfSubmitResult) {\r\n global.ConsoleLogDegug(\"success\");\r\n if (data.success == false) {\r\n _this._validations.html(data.viewContent); \r\n _this._validations.focus();\r\n _result = false;\r\n } \r\n }\r\n }); \r\n return _result;\r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\n\r\n\r\nexport class SaopViewSpinner {\r\n\r\n generateSpinnerDiv(spinnerId: string = '#saopLoading'): string {\r\n global.ConsoleLogDegug(\"generateSpinnerDiv \" + spinnerId);\r\n let spinnrDiv =\r\n '
    '\r\n + '\t
    '\r\n + '\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t
    '\r\n + '
    ';\r\n\r\n return spinnrDiv;\r\n }\r\n\r\n showLoadingSaop(elementId: string = \"#saopLoading\") {\r\n global.ConsoleLogDegug(\"showLoadingSaop \" + elementId);\r\n var obj = $(elementId);\r\n if (obj.length) {\r\n global.ConsoleLogDegug(\"Show... \");\r\n obj.show();\r\n //setModalFormZIndex(elementId);\r\n }\r\n }\r\n\r\n hideLoadingSaop(elementId: string = \"#saopLoading\") {\r\n global.ConsoleLogDegug(\"hideLoadingSaop \" + elementId);\r\n var obj = $(elementId);\r\n if (obj.length)\r\n obj.hide();\r\n }\r\n\r\n // showLoadingSaop(elementId: string = \"\") {\r\n // global.ConsoleLogDegug(\"showLoadingSaop \" + elementId);\r\n // if (!isEmpty(elementId)) {\r\n // let elementDiv = $(elementId);\r\n // if (elementDiv.length) {\r\n // let spinnerID = elementId + \"Loading\";\r\n // spinnerID = spinnerID.replace(\"#\",\"\");\r\n // let spinnerDiv = $(spinnerID);\r\n // if (!spinnerDiv.length) {\r\n // let _div = this.generateSpinnerDiv(spinnerID);\r\n // elementDiv.append(_div);\r\n // spinnerDiv = $(spinnerID);\r\n // }\r\n // spinnerDiv.show();\r\n // }\r\n // }\r\n // }\r\n\r\n // hideLoadingSaop(elementId: string = \"\") {\r\n // global.ConsoleLogDegug(\"hideLoadingSaop \" + elementId);\r\n // if (!isEmpty(elementId)) {\r\n // let elementDiv = $(elementId);\r\n // if (elementDiv.length) {\r\n // let spinnerID = elementId + \"Loading\";\r\n // let spinnerDiv = $(spinnerID);\r\n // if (!spinnerDiv.length) {\r\n // elementDiv.append(this.generateSpinnerDiv(spinnerID));\r\n // spinnerDiv = $(spinnerID);\r\n // }\r\n // spinnerDiv.hide();\r\n // }\r\n // }\r\n // }\r\n // //\r\n}\r\n","import { global,isEmpty,getSiteAbsoluteURL, isUnDefined } from \"../Common/saop-common\";\r\nimport { SaopViewSpinner } from '../Components/saop-view-spinner'\r\n\r\nexport interface SaopServicesCoreParams {\r\n action:string;\r\n async?:boolean\r\n type?:string;\r\n data?:any;\r\n spinnerDivId?:string;\r\n // contentType?: string | false | undefined;\r\n // dataType?: 'xml' | 'html' | 'script' | 'json' | 'jsonp' | 'text' | string | undefined;\r\n // processData?: boolean | undefined;\r\n}\r\n\r\nexport enum SaopServicesCoreResult {\r\n success = 1\r\n , error = 2\r\n}\r\n\r\nexport enum SaopServicesCoreHTTPResultStatusCode {\r\n ok = 200,\r\n unauthorized = 401,\r\n internalServerError = 500\r\n}\r\n\r\nexport interface SaopServicesCoreResponse {\r\n response: SaopServicesCoreResult;\r\n data: any;\r\n};\r\n\r\n// function syncDelay(milliseconds:any){\r\n// var start = new Date().getTime();\r\n// var end=0;\r\n// while( (end-start) < milliseconds){\r\n// end = new Date().getTime();\r\n// }\r\n// }\r\n\r\nexport class SaopServicesCore {\r\n private _saopViewSpinner:SaopViewSpinner = new SaopViewSpinner();\r\n private _params:SaopServicesCoreParams;\r\n private _defaultParams:SaopServicesCoreParams;\r\n // \r\n //public _result:SaopServicesCoreResponse = {response:null,data:null}; \r\n\r\n constructor(){\r\n this._defaultParams = {\r\n action:\"\"\r\n ,type:\"GET\"\r\n ,async:true\r\n ,data:null\r\n ,spinnerDivId:\"\"\r\n };\r\n }\r\n\r\n private onDone(result:any){\r\n global.ConsoleLogDegug(\"SaopServicesCore.onDone\");\r\n this.afterDone(result);\r\n //this._saopViewSpinner.hideLoadingSaop(this._params.spinnerDivId); \r\n }\r\n\r\n afterDone(result:any):void{\r\n global.ConsoleLogDegug(\"SaopServicesCore.afterDone\");\r\n } \r\n\r\n private onSuccess(result:any):void{\r\n global.ConsoleLogDegug(\"SaopServicesCore.success\");\r\n let _result:SaopServicesCoreResponse = {response:null,data:null}; \r\n if (typeof result.success === \"undefined\" || result.success === null) {\r\n _result.response = SaopServicesCoreResult.success;\r\n } else {\r\n _result.response = result.success == true ? SaopServicesCoreResult.success : SaopServicesCoreResult.error;\r\n }\r\n \r\n _result.data = result;\r\n this.afterSuccess(_result);\r\n }\r\n\r\n afterSuccess(result:any):void{\r\n global.ConsoleLogDegug(\"SaopServicesCore.afterSuccess\");\r\n } \r\n\r\n private onError(result:any):void{\r\n global.ConsoleLogDegug(\"SaopServicesCore.error\");\r\n \r\n if (result.status == SaopServicesCoreHTTPResultStatusCode.unauthorized) {\r\n // redirect to login\r\n this.unAuthorizedRedirectToLoginPage();\r\n return;\r\n }\r\n\r\n if (result.status = SaopServicesCoreHTTPResultStatusCode.internalServerError && !isUnDefined(result.responseText)) {\r\n alert(\"Internal error!\");\r\n }\r\n\r\n let _result:SaopServicesCoreResponse = {response:null,data:null}; \r\n _result.response = SaopServicesCoreResult.error;\r\n _result.data = result;\r\n this.afterError(_result);\r\n }\r\n\r\n afterError(result:any):void{\r\n global.ConsoleLogDegug(\"SaopServicesCore.afterSuccess\");\r\n } \r\n\r\n ExecuteAction(params:SaopServicesCoreParams):void {\r\n global.ConsoleLogDegug(\"SaopServicesCore.ExecuteAction\");\r\n let options = { ...this._defaultParams, ...params };\r\n params = options;\r\n this._params = params;\r\n let _this = this;\r\n let _ajaxAction = getSiteAbsoluteURL(params.action);\r\n\r\n //@Url.Action(\"crearCampManual\", \"DPS\")\r\n\r\n try {\r\n $.ajax({\r\n async: params.async,\r\n url: _ajaxAction,\r\n type: !isEmpty(params.type) ? params.type : \"POST\",\r\n data: params.data,\r\n // contentType: params.contentType == null ? 'application/x-www-form-urlencoded; charset=UTF-8' : params.contentType,\r\n // dataType: params.type == null ? 'Intelligent Guess (xml, json, script, or html)' : params.type, \r\n // processData : params.processData == null ? true : params.processData, \r\n beforeSend: function () { _this._saopViewSpinner.showLoadingSaop(params.spinnerDivId); },\r\n complete: function () { _this._saopViewSpinner.hideLoadingSaop(params.spinnerDivId); },\r\n success: this.onSuccess.bind(_this),\r\n error: this.onError.bind(_this)\r\n }).done(function (result) {\r\n global.ConsoleLogDegug(\"Done...\");\r\n _this.onDone(result);\r\n });\r\n }\r\n catch(err) {\r\n alert(\"Internal error!\");\r\n } \r\n\r\n \r\n }\r\n\r\n ExecuteBlobAction(params: SaopServicesCoreParams): void {\r\n global.ConsoleLogDegug(\"SaopServicesCore.ExecuteBlobAction\");\r\n let options = { ...this._defaultParams, ...params };\r\n params = options;\r\n this._params = params;\r\n let _this = this;\r\n let _ajaxAction = getSiteAbsoluteURL(params.action);\r\n\r\n try {\r\n $.ajax({\r\n type: \"POST\",\r\n url: _ajaxAction,\r\n data: params.data,\r\n xhrFields: {\r\n responseType: 'blob' // to avoid binary data being mangled on charset conversion\r\n },\r\n success: function (blob, status, xhr) {\r\n // check for a filename\r\n var filename = \"\";\r\n var disposition = xhr.getResponseHeader('Content-Disposition');\r\n if (disposition && disposition.indexOf('attachment') !== -1) {\r\n var filenameRegex = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/;\r\n var matches = filenameRegex.exec(disposition);\r\n if (matches != null && matches[1]) filename = matches[1].replace(/['\"]/g, '');\r\n }\r\n\r\n //if (typeof window.navigator.msSaveBlob !== 'undefined') {\r\n // // IE workaround for \"HTML7007: One or more blob URLs were revoked by closing the blob for which they were created. These URLs will no longer resolve as the data backing the URL has been freed.\"\r\n // window.navigator.msSaveBlob(blob, filename);\r\n //} else\r\n //{\r\n var URL = window.URL || window.webkitURL;\r\n var downloadUrl = URL.createObjectURL(blob);\r\n\r\n if (filename) {\r\n // use HTML5 a[download] attribute to specify filename\r\n var a = document.createElement(\"a\");\r\n // safari doesn't support this yet\r\n if (typeof a.download === 'undefined') {\r\n window.location.href = downloadUrl;\r\n } else {\r\n a.href = downloadUrl;\r\n a.download = filename;\r\n document.body.appendChild(a);\r\n a.click();\r\n }\r\n } else {\r\n window.location.href = downloadUrl;\r\n }\r\n\r\n setTimeout(function () { URL.revokeObjectURL(downloadUrl); }, 100); // cleanup\r\n //}\r\n },\r\n error: this.onError.bind(_this)\r\n }).done(function (result) {\r\n global.ConsoleLogDegug(\"Done...\");\r\n _this.onDone(result);\r\n });\r\n }\r\n catch (err) {\r\n alert(\"Internal error!\");\r\n }\r\n }\r\n \r\n public handleSubmitError(response: any): void {\r\n global.ConsoleLogDegug(\"SaopServicesCore.HandleSubmitError\");\r\n\r\n if (response.status == SaopServicesCoreHTTPResultStatusCode.unauthorized) {\r\n this.unAuthorizedRedirectToLoginPage();\r\n return;\r\n }\r\n\r\n // display error\r\n console.log(\"response\", response);\r\n alert(response.statusText);\r\n }\r\n\r\n public unAuthorizedRedirectToLoginPage(): void {\r\n global.ConsoleLogDegug(\"SaopServicesCore.redirectToLoginPage\");\r\n\r\n window.location.reload();\r\n }\r\n \r\n //\r\n}\r\n","import { global, isEmpty, isUnDefined } from \"../Common/saop-common\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\n\r\nexport class SaopTranslation {\r\n public key: string = \"#\";\r\n public translation: string = null;\r\n}\r\n\r\nexport class SaopTranslations {\r\n public translationsList:[SaopTranslation?] = [];\r\n}\r\n\r\n\r\nexport interface SaopTranslationServiceParams {\r\n controller:string,\r\n action:string,\r\n}\r\n\r\n\r\nexport class SaopTranslationService {\r\n private _params:SaopTranslationServiceParams;\r\n private _saopServicesCore: SaopServicesCore;\r\n //\r\n public _terminology:SaopTranslations;\r\n\r\n\r\n constructor(params:SaopTranslationServiceParams = null){\r\n if(!isUnDefined(params)){\r\n this._params = params;\r\n } else {\r\n this._params = {controller:\"Translation\",action:\"GetTranslations\"};\r\n }\r\n \r\n this._saopServicesCore = new SaopServicesCore();\r\n this._terminology = new SaopTranslations();\r\n }\r\n \r\n setTranslationsList(translations:string[]):any{\r\n let _this = this;\r\n translations.forEach(function (value) {\r\n _this._terminology.translationsList.push({key:value,translation:value}); \r\n }); \r\n return this.getTranslations(this._terminology);\r\n }\r\n\r\n getTranslations(translations:SaopTranslations):any{\r\n let jsonData = JSON.stringify(translations);\r\n let _data = {jsonInput:jsonData};\r\n let _response:any;\r\n this._saopServicesCore.afterDone = function (response) {\r\n _response = response;\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action: this._params.controller+\"/\"+this._params.action+\"\"\r\n , type: \"POST\"\r\n , data: _data\r\n , async: false\r\n });\r\n this._terminology.translationsList = _response.translationsList;\r\n return _response;\r\n }\r\n\r\n translate(key:string):string{\r\n let _tr = this._terminology.translationsList.find(e => e.key == key) as any;\r\n if (isUnDefined(_tr)) { \r\n return key;\r\n } else {\r\n return _tr.translation;\r\n }\r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","/// \r\n\r\nexport class SaopUtils {\r\n checkCompatibility():boolean {\r\n return SaopCommon.checkCompatibility();\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","import { global, setModalFormZIndex, isEmpty, isUnDefined,getRelativeSiteURL } from \"../Common/saop-common\";\r\n\r\nexport interface SaopViewFormBindingsParamsters {\r\n controller:string;\r\n action:string;\r\n} \r\n\r\nexport class SaopViewFormBindings {\r\n public id:string;\r\n public _formFrame:JQuery; \r\n //\r\n private _libName:string;\r\n private _FbParams:SaopViewFormBindingsParamsters;\r\n private _websiteUrl:string;\r\n //\r\n public onSucccessCallback: string = \"\";\r\n public onErrorCallback: string = \"\";\r\n public onFailureCallback: string = \"\"; \r\n //\r\n \r\n constructor(viewId:string,libName:string = \"\"){\r\n global.ConsoleLogDegug(\"SaopViewFormBindings...\");\r\n global.ConsoleLogDegug(\"viewId:\"+viewId);\r\n this.id = viewId;\r\n this._libName = libName;\r\n this.onSucccessCallback = libName+\".onSubmitSuccess(data,\"+libName+\");\";\r\n this.onErrorCallback = libName + \".onSubmitError(data,\" + libName + \");\"; \r\n this.onFailureCallback = libName + \".onSubmitFailure(xhr,\" + libName + \");\"; \r\n // \r\n } \r\n\r\n public bindFormAjaxEvents(params:SaopViewFormBindingsParamsters = null): void {\r\n global.ConsoleLogDegug(\"bindViewEvents\");\r\n this._FbParams = params;\r\n \r\n //\r\n this._formFrame = $(this.id);\r\n if (this._formFrame == null) { console.log(this.id+\" not found!\");}; \r\n //\r\n if(this._FbParams != null){\r\n this._websiteUrl = getRelativeSiteURL(this._FbParams.controller);\r\n if(isEmpty(this._FbParams.controller) == false){\r\n this._formFrame.attr(\"asp-controller\", this._FbParams.controller);\r\n }\r\n if(isEmpty(this._FbParams.action) == false){\r\n this._formFrame.attr(\"asp-action\", this._FbParams.action);\r\n } \r\n if(isEmpty(this._FbParams.action) == false){\r\n var _action = this._websiteUrl+\"/\"+this._FbParams.action;\r\n this._formFrame.attr(\"action\", _action);\r\n } \r\n }\r\n\r\n if (this.onSucccessCallback !== null) {\r\n this._formFrame.attr(\"data-ajax-success\", this.onSucccessCallback);\r\n } \r\n if (this.onSucccessCallback !== null) {\r\n this._formFrame.attr(\"data-ajax-success\", this.onSucccessCallback);\r\n }\r\n if (this.onErrorCallback !== null) {\r\n this._formFrame.attr(\"data-ajax-error\", this.onErrorCallback);\r\n }\r\n if (this.onFailureCallback !== null) {\r\n this._formFrame.attr(\"data-ajax-failure\", this.onFailureCallback);\r\n }\r\n } \r\n\r\n // \r\n}\r\n","/// \r\nimport { global, setModalFormZIndex, isEmpty, isUnDefined, setFirstFormControlToFocus,getSiteAbsoluteURL } from \"../Common/saop-common\";\r\nimport { SaopServicesCore,SaopServicesCoreParams, SaopServicesCoreResponse, SaopServicesCoreResult } from './saop-services-core'\r\nimport { SaopMessageDlg, SaopMsgDlgButton } from '../Components/saop-message-dlg';\r\nimport { SaopTranslationService } from '../Core/saop-translate';\r\nimport {SaopFloatingLabel } from '../Components/saop-floating-label';\r\n\r\nexport class Error {\r\n public Code: string;\r\n public Message: string;\r\n}\r\n\r\nexport enum SaopWfAction {\r\n wfaNone = 0\r\n ,wfaAddRecord = 1\r\n ,wfaEditRecord = 2\r\n ,wfaDeleteRecord = 3\r\n ,wfaRecordDestails = 4\r\n ,wfaCustomHtml = 5\r\n}\r\n\r\nexport interface SaopWfSubmitResult {\r\n success:boolean;\r\n viewContent:string;\r\n redirectTo:string;\r\n alertMessage: string;\r\n data: string;\r\n}\r\n\r\nexport class SaopViewForm {\r\n private _viewModalFrame:JQuery;\r\n private _viewModalBody:JQuery; \r\n private _view_title:JQuery;\r\n private _view_btnOk:JQuery;\r\n private _view_btnCancel:JQuery;\r\n private _servicesParams:SaopServicesCoreParams = {action:null,data:null,type:\"POST\"};\r\n private _terminology: string[];\r\n private _prepareView:boolean = false;\r\n private _data:any;\r\n private _modalParent:boolean = false;\r\n //\r\n public _libName:string; \r\n public saopServicesCore:SaopServicesCore = new SaopServicesCore();\r\n public translationService:SaopTranslationService;\r\n public contentElementId = \".saop-modal-body-element\"; \r\n public addRecordEndpoint: string = \"\";\r\n public editRecordEndpoint: string = \"\";\r\n public deleteRecordEndpoint: string = \"\";\r\n public saopFloatingLabel: SaopFloatingLabel;\r\n //\r\n public onSucccessCallback: string = \"\";\r\n public onErrorCallback: string = \"\";\r\n public onFailureCallback: string = \"\";\r\n // \r\n public id:string;\r\n public title:string;\r\n public fullTitle:string = \"\";\r\n public fullScreen:boolean = false; \r\n //\r\n public onClose: (params:any) => any = null;\r\n public onSubmit: (params:any) => any = null;\r\n public onError: (params:any) => any = null; \r\n \r\n constructor(viewId:string,libName:string = \"\"){\r\n global.ConsoleLogDegug(\"SaopViewForm...\");\r\n global.ConsoleLogDegug(\"viewId:\"+viewId);\r\n this.id = viewId;\r\n this._libName = libName;\r\n this.onSucccessCallback = libName+\".onSubmitSuccess(data,\"+libName+\");\";\r\n this.onErrorCallback = libName + \".onSubmitError(data,\" + libName + \");\"; \r\n this.onFailureCallback = libName + \".onSubmitFailure(xhr,\" + libName + \");\"; \r\n this.translationService = new SaopTranslationService();\r\n this.saopFloatingLabel = new SaopFloatingLabel();\r\n // \r\n }\r\n\r\n getData():any {\r\n return this._data;\r\n }\r\n\r\n public setTerminologyList(dictionary: string[] = null) {\r\n this._terminology = [\"Uredi\",\"Nov vnos\",\"Podrobnosti\",\"Brisanje\"];\r\n if (dictionary != null) {\r\n this._terminology = this._terminology.concat(dictionary);\r\n }\r\n this.translationService.setTranslationsList(this._terminology);\r\n } \r\n\r\n public onBtnOkClick(sender:any):void{\r\n global.ConsoleLogDegug(\"onBtnOkClick...\");\r\n }\r\n\r\n public onBtnCancel(sender:any):void{\r\n global.ConsoleLogDegug(\"onBtnCancel...\");\r\n } \r\n\r\n public beforeViewShow(sender:any):void{\r\n global.ConsoleLogDegug(this.id+\".beforeViewShow()\");\r\n \r\n this._viewModalFrame = $(this.id);\r\n if (this._viewModalFrame == null) { console.log(this.id+\" not found!\");};\r\n //\r\n var contentSel = this.id + \" \" + this.contentElementId;\r\n this._viewModalBody = $(contentSel); \r\n }\r\n\r\n public afterViewShow(sender:any,wfAction:SaopWfAction):void{\r\n global.ConsoleLogDegug(this.id+\".afterViewShow()\");\r\n\r\n let _this = this;\r\n\r\n this.bindViewEvents(sender);\r\n\r\n // let _this = this;\r\n // this._view_btnOk = $(\"\"+this.id+\" *> #btnOk\");\r\n // this._view_btnCancel = $(\"\"+this.id+\" *> #btnCancel\");\r\n // this._view_title = $(\"\"+this.id+\" *> #exampleModalLongTitle\");\r\n //\r\n\r\n global.ConsoleLogDegug(\"afterViewShow title:\"+ this.title);\r\n\r\n if (this.fullTitle.length > 0) {\r\n this.title = this.fullTitle;\r\n }\r\n\r\n if (!isEmpty(this.title)){\r\n let _title = \"\";\r\n if (this.fullTitle.length > 0) {\r\n _title = this.title;\r\n }else if (wfAction == SaopWfAction.wfaAddRecord){\r\n _title = this.translationService.translate(\"Nov vnos\")+\": \"+this.title;\r\n } else if (wfAction == SaopWfAction.wfaEditRecord){\r\n _title = this.translationService.translate(\"Uredi\")+\": \"+this.title;\r\n } else if (wfAction == SaopWfAction.wfaRecordDestails){ \r\n _title = this.translationService.translate(\"Podrobnosti\")+\": \"+this.title;\r\n } \r\n global.ConsoleLogDegug(\"afterViewShow _title:\"+ _title);\r\n\r\n this._view_title.html(_title);\r\n } else {\r\n if (wfAction == SaopWfAction.wfaAddRecord){\r\n let defaultTitleAdd = $(\"\"+this.id+\" *> #addTitle\").val().toString();\r\n this._view_title.html(defaultTitleAdd);\r\n } else {\r\n let defaultTitleEdit = $(\"\"+this.id+\" *> #editTitle\").val().toString();\r\n this._view_title.html(defaultTitleEdit);\r\n }\r\n }\r\n\r\n this.viewShowComplete(sender, wfAction);\r\n \r\n //\r\n // this._view_btnOk.click(\r\n // function () {\r\n // _this.onBtnOkClick(sender);\r\n // }\r\n // );\r\n\r\n // this._view_btnCancel.click(\r\n // function () {\r\n // _this.onBtnCancel(sender);\r\n // }\r\n // ); \r\n \r\n //this.bindViewEvents();\r\n\r\n this._modalParent = $(\"body\").hasClass(\"modal-open\");\r\n\r\n if (this._prepareView == false){\r\n this._viewModalFrame.modal('show');\r\n setModalFormZIndex(this.id); \r\n setFirstFormControlToFocus(this.id);\r\n }\r\n //\r\n this.afterViewShowSuccess(sender);\r\n\r\n }\r\n\r\n public afterViewShowSuccess(sender:any):void{\r\n global.ConsoleLogDegug(this.id + \".afterViewShowSuccess()\");\r\n }\r\n\r\n public viewShowComplete(sender: any, wfAction: SaopWfAction): void {\r\n global.ConsoleLogDegug(this.id + \".viewShowComplete()\");\r\n }\r\n\r\n public viewShownComplete(sender: any): void {\r\n global.ConsoleLogDegug(this.id + \".viewShownComplete()\");\r\n }\r\n\r\n public bindViewEvents(sender:any): void {\r\n global.ConsoleLogDegug(\"bindViewEvents\");\r\n\r\n let _this = this;\r\n let divForm = this._viewModalFrame.find(\"form\");\r\n \r\n this._view_btnOk = $(\"\"+this.id+\" *> #btnOk\");\r\n this._view_btnCancel = $(\"\"+this.id+\" *> #btnCancel\");\r\n this._view_title = $(\"\"+this.id+\" *> #exampleModalLongTitle\"); \r\n\r\n this._view_btnOk.click(\r\n function () {\r\n _this.onBtnOkClick(sender);\r\n }\r\n );\r\n\r\n this._view_btnCancel.click(\r\n function () {\r\n _this.onBtnCancel(sender);\r\n }\r\n ); \r\n\r\n if (this.onSucccessCallback !== null) {\r\n divForm.attr(\"data-ajax-success\", this.onSucccessCallback);\r\n }\r\n if (this.onErrorCallback !== null) {\r\n divForm.attr(\"data-ajax-error\", this.onErrorCallback);\r\n }\r\n if (this.onFailureCallback !== null) {\r\n divForm.attr(\"data-ajax-failure\", this.onFailureCallback);\r\n }\r\n \r\n this._viewModalFrame.on('hidden.bs.modal', function (e) { \r\n if (_this._modalParent) {\r\n $(\"body\").addClass(\"modal-open\");\r\n } \r\n })\r\n\r\n this._viewModalFrame.on('shown.bs.modal', function(e) { \r\n _this.viewShownComplete(e);\r\n });\r\n\r\n this.saopFloatingLabel.init(); \r\n }\r\n\r\n private renderErrorsBanner(errors:Error[]):SaopServicesCoreResponse {\r\n let result:SaopServicesCoreResponse;\r\n result = {response:SaopServicesCoreResult.error,data:null}; \r\n //\r\n let jsonData = JSON.stringify(errors);\r\n let _data = {jsonInput:jsonData}; \r\n //\r\n let _saopServicesCore = new SaopServicesCore();\r\n _saopServicesCore.afterSuccess = function (response:SaopServicesCoreResponse) {\r\n result = response;\r\n };\r\n _saopServicesCore.ExecuteAction({\r\n action: \"Errors/RenderErrorsBanner\"\r\n , type: \"POST\"\r\n , data: _data\r\n , async: false\r\n });\r\n\r\n return result;\r\n }\r\n\r\n public renderError(errMessage:string):void{\r\n try {\r\n global.ConsoleLogDegug(\"ajax.afterError\");\r\n let _errors:Error[];\r\n _errors = [{Code:\"\",Message:errMessage}]; \r\n let _parentView = $(this.id).parent();\r\n let _errorBannerId = this.id+\"ErrorBanner\";\r\n let _view_banner = _parentView.find(_errorBannerId);\r\n if ( isUnDefined(_view_banner) || _view_banner.length == 0) {\r\n _parentView.append(\"
    \");\r\n _view_banner = _parentView.find(_errorBannerId);\r\n }\r\n let _bannerResult = this.renderErrorsBanner(_errors);\r\n _view_banner.html(_bannerResult.data.viewContent); \r\n }\r\n catch(err) {\r\n alert(err.message);\r\n } \r\n }\r\n //public loadViewBody(wfAction:SaopWfAction,data:any,sender:any):SaopServicesCoreResult{\r\n public loadViewBody(wfAction:SaopWfAction,data:any,sender:any):void{\r\n global.ConsoleLogDegug(\"loadViewBody\");\r\n let _this = this;\r\n this.beforeViewShow(sender);\r\n\r\n if (wfAction != SaopWfAction.wfaCustomHtml) {\r\n let _ajaxAction = wfAction == SaopWfAction.wfaAddRecord ? this.addRecordEndpoint : this.editRecordEndpoint;\r\n //_ajaxAction = getSiteAbsoluteURL(_ajaxAction);\r\n\r\n this._servicesParams = {action:_ajaxAction,data:data,type:\"POST\"};\r\n\r\n this.saopServicesCore.afterSuccess = function(_ajaxResult){\r\n if (_ajaxResult.response == SaopServicesCoreResult.success){\r\n global.ConsoleLogDegug(\"ajax.success\");\r\n _this._viewModalBody.html(_ajaxResult.data);\r\n _this.afterViewShow(sender,wfAction);\r\n } else {\r\n global.ConsoleLogDegug(\"ajax.error\");\r\n if ((isUnDefined(_ajaxResult.data) && isUnDefined(_ajaxResult.data.alertMessage)) == false){\r\n _this.renderError(_ajaxResult.data.alertMessage);\r\n } else if (_ajaxResult.data.responseJSON && _ajaxResult.data.responseJSON.message){\r\n alertify.error(_ajaxResult.data.responseJSON.message);\r\n } \r\n }\r\n \r\n };\r\n \r\n this.saopServicesCore.afterError = function(_ajaxResult){\r\n //###\r\n if ((isUnDefined(_ajaxResult.data) && isUnDefined(_ajaxResult.data.alertMessage)) == false){\r\n _this.renderError(_ajaxResult.data.alertMessage);\r\n } else {\r\n alert(\"Internal error!\");\r\n }\r\n };\r\n \r\n this.saopServicesCore.ExecuteAction(this._servicesParams);\r\n } else {\r\n if (!isUnDefined(data) && !isUnDefined(data.html)) {\r\n this._viewModalBody.html(data.html);\r\n }\r\n _this.afterViewShow(sender,wfAction);\r\n }\r\n\r\n } \r\n\r\n public afterSubmitSuccess(result: SaopWfSubmitResult): void {\r\n global.ConsoleLogDegug(\"submit.afterExecuteSuccess\");\r\n }\r\n\r\n public onSubmitSuccessComplete(result: SaopWfSubmitResult): void {\r\n global.ConsoleLogDegug(\"submit.onSubmitSuccessComplete\");\r\n }\r\n\r\n public onSubmitError(result: SaopWfSubmitResult): void {\r\n global.ConsoleLogDegug(\"submit.onSubmitError\");\r\n }\r\n\r\n public onSubmitFailure(result: any): void {\r\n global.ConsoleLogDegug(\"submit.onSubmitFailure\");\r\n var saopServicesCore = new SaopServicesCore();\r\n saopServicesCore.handleSubmitError(result);\r\n }\r\n \r\n public onSubmitSuccess(result: SaopWfSubmitResult): void {\r\n global.ConsoleLogDegug(\"submit.onExecuteSuccess\");\r\n if (result.success) {\r\n global.ConsoleLogDegug(\"submit.success\");\r\n\r\n this._viewModalFrame.modal('hide');\r\n\r\n // just in case: odstrani, če je še vedno vidno, avtomatsko se ne zapre vedno :(\r\n $('.modal-backdrop').remove();\r\n $(document.body).removeClass(\"modal-open\");\r\n\r\n if (result.alertMessage) {\r\n alertify.message(result.alertMessage);\r\n } \r\n\r\n if (!isUnDefined(this.refreshData)){\r\n this.refreshData(result);\r\n }\r\n\r\n this.onSubmitSuccessComplete(result);\r\n } else {\r\n global.ConsoleLogDegug(\"submit.error\");\r\n global.ConsoleLogDegug(\"reload view form\");\r\n this._viewModalBody.html(result.viewContent);\r\n this.bindViewEvents(result);\r\n }\r\n this.afterSubmitSuccess(result);\r\n } \r\n\r\n public onDeleteRecord(deleteData:any):void {\r\n global.ConsoleLogDegug(\"onDeleteRecord\");\r\n let _this = this;\r\n this._servicesParams = {action:this.deleteRecordEndpoint,data:deleteData,type:\"POST\"};\r\n\r\n this.saopServicesCore.afterSuccess = function(_ajaxResult){\r\n if (_ajaxResult.response == SaopServicesCoreResult.success){\r\n alertify.message(_ajaxResult.data.alertMessage);\r\n if (!isUnDefined(_this.refreshData)){\r\n _this.refreshData(deleteData);\r\n }\r\n } else {\r\n alertify.error(_ajaxResult.data.alertMessage);\r\n }\r\n };\r\n this.saopServicesCore.ExecuteAction(this._servicesParams);\r\n\r\n // let _ajaxResult = this.saopServicesCore.ExecuteAction(this._servicesParams);\r\n // if (_ajaxResult.response == SaopServicesCoreResult.success){\r\n // alertify.message(_ajaxResult.data.alertMessage);\r\n // if (!isUnDefined(this.refreshData)){\r\n // this.refreshData(deleteData);\r\n // }\r\n // } else {\r\n // alertify.error(_ajaxResult.data.alertMessage);\r\n // }\r\n // return _ajaxResult.response;\r\n }\r\n \r\n public refreshData(sender:any):void {\r\n global.ConsoleLogDegug(\"refreshData\");\r\n }\r\n\r\n public deleteRecord(title:string,message:string,deleteData:any):void{\r\n global.ConsoleLogDegug(\"deleteRecord.begin\");\r\n let saopMessageDlg = new SaopMessageDlg(deleteData) \r\n saopMessageDlg.onYes = this.onDeleteRecord.bind(this);\r\n saopMessageDlg.Show(message,title,1,[SaopMsgDlgButton.mbYes,SaopMsgDlgButton.mbNo]);\r\n global.ConsoleLogDegug(\"deleteRecord.end\");\r\n }\r\n\r\n public addRecord(data:any,sender:any = null):void {\r\n global.ConsoleLogDegug(\"addRecord\");\r\n this._data = data;\r\n let _result = this.loadViewBody(SaopWfAction.wfaAddRecord,data,sender);\r\n }\r\n\r\n public editRecord(data:any,sender:any = null):void {\r\n global.ConsoleLogDegug(\"editRecord\");\r\n this._data = data;\r\n this.loadViewBody(SaopWfAction.wfaEditRecord,data,sender);\r\n }\r\n\r\n public recordDetails(data:any,sender:any = null):void {\r\n global.ConsoleLogDegug(\"editRecord\");\r\n this._data = data;\r\n this.loadViewBody(SaopWfAction.wfaRecordDestails,data,sender);\r\n }\r\n\r\n public custonHtmlBody(data:any,sender:any = null):void {\r\n global.ConsoleLogDegug(\"custonHtmlBody\");\r\n this._data = data;\r\n this.loadViewBody(SaopWfAction.wfaCustomHtml,data,sender);\r\n }\r\n\r\n // public recordPreview(data:any,sender:any = null):void {\r\n // global.ConsoleLogDegug(\"editRecord\");\r\n // this.loadViewBody(SaopWfAction.wfaPrepareView,data,sender);\r\n // } \r\n\r\n public showViewForm(wfAction:SaopWfAction,data:any,sender:any = null):void{\r\n global.ConsoleLogDegug(\"showViewForm\");\r\n this._data = data;\r\n if (wfAction == SaopWfAction.wfaAddRecord) {\r\n this.addRecord(data,sender);\r\n } else if (wfAction == SaopWfAction.wfaEditRecord) {\r\n this.editRecord(data,sender);\r\n } else if (wfAction == SaopWfAction.wfaRecordDestails) { \r\n this.recordDetails(data,sender); \r\n } else if (wfAction == SaopWfAction.wfaCustomHtml) {\r\n this.custonHtmlBody(data,sender); \r\n } \r\n this.SetToFullScreen(); \r\n } \r\n\r\n public prepareViewForm(wfAction:SaopWfAction,data:any,sender:any = null):void{\r\n global.ConsoleLogDegug(\"showViewForm\");\r\n this._data = data;\r\n this._prepareView = true;\r\n if (wfAction == SaopWfAction.wfaAddRecord) {\r\n this.addRecord(data,sender);\r\n } else if (wfAction == SaopWfAction.wfaEditRecord) {\r\n this.editRecord(data,sender);\r\n } else if (wfAction == SaopWfAction.wfaRecordDestails) { \r\n this.recordDetails(data,sender); \r\n } else if (wfAction == SaopWfAction.wfaCustomHtml) {\r\n this.custonHtmlBody(data,sender); \r\n } \r\n\r\n this.SetToFullScreen(); \r\n } \r\n\r\n public SetToFullScreen(){\r\n if (this.fullScreen ){\r\n this._viewModalFrame.addClass(\"saop-modal-fullscreen-form\");\r\n let _dialogDiv = this._viewModalFrame.find(\".modal-dialog\");\r\n _dialogDiv.removeClass('modal-dialog-centered');\r\n _dialogDiv.addClass('modal-fullscreen');\r\n _dialogDiv.removeAttr('style');\r\n \r\n let _content = this._viewModalFrame.find(\".modal-content\");\r\n _content.removeAttr('class');\r\n _content.addClass('modal-content');\r\n }\r\n }\r\n\r\n public refreshElementData(htmlContent:string,elementId:string): void {\r\n global.ConsoleLogDegug(\"refreshElementData\");\r\n let _document = $(htmlContent);\r\n let _cell = _document.find(elementId);\r\n $(elementId).replaceWith(_cell);\r\n }\r\n\r\n public CloseViewForm(): void {\r\n this._viewModalFrame.modal('hide');\r\n // just in case: odstrani, če je še vedno vidno, avtomatsko se ne zapre vedno :(\r\n $('.modal-backdrop').remove();\r\n $(document.body).removeClass(\"modal-open\"); \r\n }\r\n\r\n public showModal():void {\r\n if (this._prepareView == false){\r\n this._viewModalFrame.modal('show');\r\n setModalFormZIndex(this.id); \r\n setFirstFormControlToFocus(this.id);\r\n } \r\n }\r\n \r\n // \r\n}\r\n","import { LIKVCakalnaVrstaGrid } from \"../LIKV/LIKVCakalnaVrsta-grid\";\r\nimport { global } from \"../Common/saop-common\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\n\r\nexport class DashboardLIKVConfirmationView {\r\n private _libName:string;\r\n private _saopServicesCore: SaopServicesCore;\r\n private likvCakalnaVrstaGrid: LIKVCakalnaVrstaGrid;\r\n //\r\n\r\n constructor(libName: string = \"\") {\r\n this._libName = libName;\r\n //\r\n this._saopServicesCore = new SaopServicesCore();\r\n this.likvCakalnaVrstaGrid = new LIKVCakalnaVrstaGrid(libName +\".likvCakalnaVrstaGrid\");\r\n this.likvCakalnaVrstaGrid.refreshData = this.refreshGridData.bind(this);\r\n }\r\n\r\n refreshGridData(): void {\r\n global.ConsoleLogDegug(\"DashboardLIKVConfirmationView.refreshGridData\");\r\n let _this = this;\r\n this._saopServicesCore.afterDone = function(response){\r\n let _grid = $(response).find(\"#LIKVCakalnaVrstaGrid\")[0];\r\n $(_grid).find(\"#dt-checkboxes-cell\").hide;\r\n \r\n let _body = $(_grid).find(\"#LIKVCakalnaVrstaGridBodyAjax\"); //poiscem tbody\r\n // $(_body).find(\"tr:first\").html('lalala');\r\n $(_body).find(\"tr\").each(function() { //za vsak tr v prvem td pobrisem value\r\n $(this).find(\"td:eq(0)\").html('');\r\n // $(this).find(\".LIKVCakalnaVrstaGrid_confirm\").html('');\r\n // $(this).find(\".LIKVCakalnaVrstaGrid_deny\").html('');\r\n $(this).find(\".td-icon-col\").html(''); \r\n });\r\n $(\"#card6 .card-body\").html(_grid);\r\n _this.likvCakalnaVrstaGrid._dashboard = true;\r\n _this.likvCakalnaVrstaGrid.initView(); \r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"Dashboard/LIKVConfirmationPartial\"\r\n ,type:\"GET\"\r\n ,spinnerDivId:\"#saopLoadingcard6\"\r\n }); \r\n } \r\n \r\n //\r\n}","/// \r\nimport { SaopAbsenceConfirmationPendingView } from \"../AbsenceConfirmation/saop-absenceConfirmation-pending-view\";\r\nimport { global } from \"../Common/saop-common\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\n\r\nexport class DashboardAbsenceConfirmationView {\r\n private _libName:string;\r\n private _saopServicesCore: SaopServicesCore;\r\n private absenceConfirmationPendingView: SaopAbsenceConfirmationPendingView;\r\n //\r\n\r\n constructor(libName: string = \"\") {\r\n this._libName = libName;\r\n //\r\n this._saopServicesCore = new SaopServicesCore();\r\n this.absenceConfirmationPendingView = new SaopAbsenceConfirmationPendingView(\"\", libName +\".absenceConfirmationPendingView\");\r\n this.absenceConfirmationPendingView.refreshDataExternal = this.refreshGridData.bind(this);\r\n }\r\n\r\n refreshGridData(): void {\r\n global.ConsoleLogDegug(\"DashboardAbsenceConfirmationView.refreshGridData\");\r\n let _this = this;\r\n this._saopServicesCore.afterDone = function(response){\r\n $(\"#card3 .card-body\").html(response);\r\n _this.absenceConfirmationPendingView.bindGridEvents();\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"Dashboard/AbsenceConfirmationPartial\"\r\n ,type:\"GET\"\r\n ,spinnerDivId:\"#saopLoadingcard3\"\r\n }); \r\n } \r\n \r\n //\r\n}\r\n\r\n\r\n","/// \r\nimport { global } from \"../Common/saop-common\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { SaopRightSidebar } from '../Components/saop-right-sidebar';\r\nimport { SaopRegAbsenceEventsView } from '../REG/saop-regAbsenceEvents-view';\r\n\r\nexport class DashboardAbsencesView {\r\n private _libName:string;\r\n private _saopServicesCore :SaopServicesCore;\r\n //\r\n public regAbsenceEventsView:SaopRegAbsenceEventsView;\r\n\r\n constructor(libName: string = \"\") {\r\n this._libName = libName;\r\n //\r\n this._saopServicesCore = new SaopServicesCore();\r\n this.regAbsenceEventsView = new SaopRegAbsenceEventsView(\"#regKeZapDopustiView0\",libName+\".regAbsenceEventsView\");\r\n this.regAbsenceEventsView.refreshData = this.refreshGridData.bind(this);\r\n }\r\n\r\n refreshGridData(): void {\r\n global.ConsoleLogDegug(\"DashboardCard2.refreshGridData\");\r\n let _this = this;\r\n this._saopServicesCore.afterDone = function(response){\r\n $(\"#card2 .card-body\").html(response);\r\n _this.regAbsenceEventsView.bindGridEvents();\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"Dashboard/AbsencePartial\"\r\n ,type:\"GET\"\r\n ,spinnerDivId:\"#saopLoadingcard2\"\r\n }); \r\n\r\n let _saopRightSidebar: SaopRightSidebar = new SaopRightSidebar();\r\n _saopRightSidebar.refreshDopustZaKoriscenjeSummary(\"#dopustZaKoriscenjeSummary\");\r\n \r\n let _saopRightSidebarUre: SaopRightSidebar = new SaopRightSidebar();\r\n _saopRightSidebarUre.refreshUreZaKoriscenjeSummary(\"#ureZaKoriscenjeSummary\");\r\n } \r\n \r\n //\r\n}\r\n\r\n\r\n","import { filterTableRows, global } from \"../Common/saop-common\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { SaopFloatingLabel } from '../Components/saop-floating-label';\r\n\r\nexport class DashboardEmployeePresenceView {\r\n private _libName:string;\r\n private _saopServicesCore: SaopServicesCore;\r\n\r\n private _saopFloatingLabel: SaopFloatingLabel = new SaopFloatingLabel();\r\n\r\n private divId: string = \"#card8\";\r\n\r\n private _searchValueId: string = \"#EmployeePresenceSearchValue\";\r\n private _searchValue: JQuery;\r\n\r\n constructor(libName: string = \"\") {\r\n this._libName = libName;\r\n //\r\n this._saopServicesCore = new SaopServicesCore();\r\n }\r\n\r\n refreshGridData(): void {\r\n global.ConsoleLogDegug(\"DashboardEmployeePresenceView.refreshGridData\");\r\n\r\n let _this = this;\r\n this._saopServicesCore.afterDone = function(response){\r\n $(\"#card8 .card-body\").html(response);\r\n _this._saopFloatingLabel.init();\r\n _this.initFilterControls();\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"Dashboard/EmployeePresencePartial\"\r\n ,type:\"GET\"\r\n ,spinnerDivId:\"#saopLoadingcard8\"\r\n });\r\n } \r\n\r\n initFilterControls(): void {\r\n global.ConsoleLogDegug(\"DashboardEmployeePresenceView.initFilterControls\");\r\n\r\n this._searchValue = $(this.divId).find(this._searchValueId);\r\n let _this = this;\r\n\r\n this._searchValue.off(\"keyup\");\r\n this._searchValue.on(\"keyup\", function () {\r\n _this.executeFilterSearch($(this).val().toString());\r\n });\r\n }\r\n\r\n\r\n executeFilterSearch(searchVal: string): void {\r\n global.ConsoleLogDegug(\"DashboardEmployeePresenceView.executeFilterSearch\");\r\n\r\n filterTableRows(searchVal, this.divId);\r\n }\r\n //\r\n}\r\n\r\n\r\n","/// \r\nimport { global } from \"../Common/saop-common\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { SaopRightSidebar } from '../Components/saop-right-sidebar';\r\nimport { NDKInternalOrdersActiveGrid, NDKInternalOrdersActiveGridOptions } from \"../NDK/NDKInternalOrders-Active-grid\";\r\n\r\nexport class DashboardInternalOrderView {\r\n private _libName:string;\r\n private _saopServicesCore: SaopServicesCore;\r\n private _addInternalOrderId: string = \"#addInternalOrder\";\r\n //\r\n public ndkInternalOrdersActiveGrid: NDKInternalOrdersActiveGrid;\r\n public rightSidebar: SaopRightSidebar;\r\n\r\n constructor(libName: string = \"\") {\r\n this._libName = libName;\r\n //\r\n this._saopServicesCore = new SaopServicesCore();\r\n\r\n let gridOptions = new NDKInternalOrdersActiveGridOptions();\r\n gridOptions.dashboard = true;\r\n gridOptions.showToolbar = false;\r\n gridOptions.showFilter = false;\r\n this.ndkInternalOrdersActiveGrid = new NDKInternalOrdersActiveGrid(this._libName + \".ndkInternalOrdersActiveGrid\", gridOptions);\r\n this.ndkInternalOrdersActiveGrid.afterRefreshDataAfterEditViewExternal = this.afterRefreshDataAfterEditView.bind(this);\r\n\r\n this.rightSidebar = new SaopRightSidebar();\r\n }\r\n\r\n refreshGridData(): void {\r\n global.ConsoleLogDegug(\"DashboardInternalOrderView.refreshGridData\");\r\n\r\n let _this = this;\r\n this._saopServicesCore.afterDone = function(response){\r\n $(\"#card4 .card-body\").html(response);\r\n _this.ndkInternalOrdersActiveGrid.initView();\r\n _this.bindAddEvent();\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"Dashboard/InternalOrderPartial\"\r\n ,type:\"GET\"\r\n ,spinnerDivId:\"#saopLoadingcard4\"\r\n });\r\n\r\n this.rightSidebar.refreshNdkInternalOrdersSummary(\"#ndkInternalOrdersSummary\", \"#saopLoadingSidebarr\");\r\n } \r\n\r\n afterRefreshDataAfterEditView(): void {\r\n global.ConsoleLogDegug(\"DashboardInternalOrderView.afterRefreshDataAfterEditView\");\r\n\r\n this.rightSidebar.refreshNdkInternalOrdersSummary(\"#ndkInternalOrdersSummary\", \"#saopLoadingSidebarr\");\r\n }\r\n\r\n bindAddEvent() {\r\n global.ConsoleLogDegug(\"DashboardInternalOrderView.bindGridEvents\");\r\n let _this = this;\r\n\r\n $(this._addInternalOrderId).off(\"click\");\r\n $(this._addInternalOrderId).on('click', function (row) {\r\n global.ConsoleLogDegug(\"DashboardInternalOrderView._addInternalOrder.click\");\r\n _this.ndkInternalOrdersActiveGrid.addRecord();\r\n });\r\n }\r\n \r\n //\r\n}\r\n\r\n\r\n","/// \r\nimport { global } from \"../Common/saop-common\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\n\r\nexport class DashboardMyGradesView {\r\n private _libName:string;\r\n private _saopServicesCore: SaopServicesCore;\r\n private _jeEnaSifraOcenObdobjaId: string = \"#hiddenJeEnaSifraOcenObdobja\"; \r\n private _nazivOcenObdobjaId: string = \"#hiddenNazivOcenObdobja\"; \r\n private _cardId: string = \"#card5\";\r\n //\r\n\r\n constructor(libName: string = \"\") {\r\n this._libName = libName;\r\n //\r\n this._saopServicesCore = new SaopServicesCore();\r\n }\r\n\r\n refreshGridData(): void {\r\n global.ConsoleLogDegug(\"DashboardMyGradesView.refreshGridData\");\r\n let _this = this;\r\n this._saopServicesCore.afterDone = function(response){\r\n $(\"#card5 .card-body\").html(response);\r\n _this.init();\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"Dashboard/MyGradesPartial\"\r\n ,type:\"GET\"\r\n ,spinnerDivId:\"#saopLoadingcard5\"\r\n }); \r\n } \r\n\r\n init(): void {\r\n global.ConsoleLogDegug(\"DashboardMyGradesView.init\");\r\n\r\n let jeEnaSifraOcenObdobjaStr = $(this._cardId + \" \" + this._jeEnaSifraOcenObdobjaId).val().toString().toLowerCase();\r\n let jeEnaSifraOcenObdobja = jeEnaSifraOcenObdobjaStr === \"true\" ? true : false;\r\n if (jeEnaSifraOcenObdobja) {\r\n let nazivOcenObdobja = $(this._cardId + \" \" + this._nazivOcenObdobjaId).val().toString();\r\n\r\n let cardHeaderElement = $(this._cardId + \" .card-header a.card-link\");\r\n let cardHeaderText = cardHeaderElement.text().trim().replace(\"\\n\", \"\");\r\n\r\n cardHeaderElement.text(cardHeaderText + \": \" + nazivOcenObdobja);\r\n }\r\n }\r\n //\r\n}\r\n\r\n\r\n","/// \r\nimport { global } from \"../Common/saop-common\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { SaopRightSidebar } from '../Components/saop-right-sidebar';\r\nimport { SaopRegTodayEventsView } from '../REG/saop-regTodayEvents-view'\r\nimport { ObdobjefilterValues } from \"../Components/saop-select-month-year\";\r\n\r\n\r\nexport class DashboardTodayEventsView {\r\n private _libName:string;\r\n private _saopServicesCore :SaopServicesCore;\r\n //\r\n public regTodayEventsView: SaopRegTodayEventsView;\r\n // \r\n public addEnabled: boolean = false;\r\n\r\n constructor(libName: string = \"\") {\r\n this._libName = libName;\r\n //\r\n this._saopServicesCore = new SaopServicesCore();\r\n //\r\n this.regTodayEventsView = new SaopRegTodayEventsView(\"#regDogodekView0\",this._libName+\".regTodayEventsView\");\r\n this.regTodayEventsView.initClock();\r\n this.regTodayEventsView.refreshData = this.refreshGridData.bind(this);\r\n this.regTodayEventsView.regCurrentEventView.afterSubmitSuccess = this.refreshGridData.bind(this); \r\n }\r\n\r\n refreshGridData(): void {\r\n global.ConsoleLogDegug(\"DashboardCard1.refreshTodayEventData\");\r\n let _this = this;\r\n\r\n this._saopServicesCore.afterDone = function(response){\r\n $(\"#card1 .card-body\").html(response);\r\n _this.regTodayEventsView.regCurrentEventView.bindFormAjaxEvents();\r\n _this.regTodayEventsView.bindGridEvents(); \r\n _this.enableAdd();\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"Dashboard/TodayEventPartial\"\r\n ,type:\"GET\"\r\n ,spinnerDivId:\"#saopLoadingcard1\"\r\n }); \r\n\r\n let _saopRightSidebar: SaopRightSidebar = new SaopRightSidebar();\r\n let obdobjefilterValues: ObdobjefilterValues = new ObdobjefilterValues();\r\n _saopRightSidebar.refreshRegUraDogodkiSummary(\"#regUraDogodkiSummary\", obdobjefilterValues,\"#saopLoadingRegUraMonthEventsSidebarr\");\r\n } \r\n\r\n enableAdd(): void {\r\n var val = $(\"#RegUraDogodekBrowseViewModel_AddEnabled\").val();\r\n var el = $(\"#regUraDogodekAddRecord\");\r\n if (el.length) {\r\n el.prop(\"disabled\", val.toString().toLowerCase()===\"false\");\r\n }\r\n }\r\n //\r\n}\r\n\r\n\r\n","/// \r\nimport { global } from \"../Common/saop-common\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { SaopRightSidebar } from '../Components/saop-right-sidebar';\r\nimport { OPNPotniNalogiGrid, OPNPotniNalogiGridOptions } from \"../OPN/OPNPotniNalogi-grid\";\r\n\r\nexport class DashboardTravelOrderView {\r\n private _libName:string;\r\n private _saopServicesCore: SaopServicesCore;\r\n private _addTravelOrderId: string = \"#addTravelOrder\";\r\n //\r\n public opnPotniNalogiGrid: OPNPotniNalogiGrid;\r\n public rightSidebar: SaopRightSidebar;\r\n\r\n constructor(libName: string = \"\") {\r\n this._libName = libName;\r\n //\r\n this._saopServicesCore = new SaopServicesCore();\r\n\r\n let gridOptions = new OPNPotniNalogiGridOptions();\r\n gridOptions.dashboard = true;\r\n gridOptions.showToolbar = false;\r\n gridOptions.showFilter = false;\r\n this.opnPotniNalogiGrid = new OPNPotniNalogiGrid(this._libName + \".opnPotniNalogiGrid\", gridOptions);\r\n this.opnPotniNalogiGrid.afterRefreshDataAfterEditViewExternal = this.afterRefreshDataAfterEditView.bind(this);\r\n this.opnPotniNalogiGrid.refreshData = this.refreshGridData.bind(this);\r\n\r\n this.rightSidebar = new SaopRightSidebar();\r\n }\r\n\r\n refreshGridData(): void {\r\n global.ConsoleLogDegug(\"DashboardTravelOrderView.refreshGridData\");\r\n\r\n let _this = this;\r\n this._saopServicesCore.afterDone = function(response){\r\n $(\"#card7 .card-body\").html(response);\r\n //_this.opnPotniNalogiGrid.initView();\r\n //_this.opnPotniNalogiGrid.initWebGrid1();\r\n _this.opnPotniNalogiGrid.initWebGrid1Listners();\r\n _this.opnPotniNalogiGrid.initEditView();\r\n _this.bindAddEvent();\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"Dashboard/TravelOrderPartial\"\r\n ,type:\"GET\"\r\n ,spinnerDivId:\"#saopLoadingcard7\"\r\n });\r\n\r\n this.rightSidebar.refreshRegOPNPotniNalogiSummary(\"#opnPotniNalogiSummary\", \"#saopLoadingSidebarr\");\r\n } \r\n\r\n afterRefreshDataAfterEditView(): void {\r\n global.ConsoleLogDegug(\"DashboardTravelOrderView.afterRefreshDataAfterEditView\");\r\n\r\n this.rightSidebar.refreshRegOPNPotniNalogiSummary(\"#opnPotniNalogiSummary\", \"#saopLoadingSidebarr\");\r\n }\r\n\r\n bindAddEvent() {\r\n global.ConsoleLogDegug(\"DashboardTravelOrderView.bindGridEvents\");\r\n let _this = this;\r\n\r\n $(this._addTravelOrderId).off(\"click\");\r\n $(this._addTravelOrderId).on('click', function (row) {\r\n global.ConsoleLogDegug(\"DashboardTravelOrderView._addTravelOrder.click\");\r\n _this.opnPotniNalogiGrid.addRecord();\r\n });\r\n }\r\n \r\n //\r\n}\r\n\r\n\r\n","/// \r\nimport { global } from \"../Common/saop-common\";\r\nimport { DashboardTodayEventsView } from './saop-dashboard-todayEvents-view';\r\nimport { DashboardAbsencesView } from './saop-dashboard-absences-view';\r\nimport { DashboardAbsenceConfirmationView } from './saop-dashboard-absence-confirmation-view';\r\nimport { SaopRightSidebar, SaopRightSidebarView } from '../Components/saop-right-sidebar';\r\nimport { DashboardTravelOrderView } from './saop-dashboard-travelOrder-view';\r\nimport { DashboardInternalOrderView } from \"./saop-dashboard-internalOrder-view\";\r\nimport { DashboardMyGradesView } from \"./saop-dashboard-myGrades-view\";\r\nimport { DashboardLIKVConfirmationView } from \"./saop-dashboard-LIKConfirmation-view\";\r\nimport { DashboardEmployeePresenceView } from \"./saop-dashboard-employeePresence-view\";\r\n\r\nexport class SaopDashboardView {\r\n private _libName:string;\r\n private _card1:JQuery;\r\n private _card2: JQuery;\r\n private _card3: JQuery;\r\n private _card4: JQuery;\r\n private _card5: JQuery;\r\n private _card6: JQuery;\r\n private _card7: JQuery;\r\n private _card8: JQuery;\r\n\r\n //\r\n public dashboardTodayEvents:DashboardTodayEventsView;\r\n public dashboardAbsences: DashboardAbsencesView;\r\n public dashboardAbsenceConfirmationView: DashboardAbsenceConfirmationView;\r\n public dashboardTravelOrderView: DashboardTravelOrderView;\r\n public dashboardInternalOrderView: DashboardInternalOrderView;\r\n public dashboardMyGradesView: DashboardMyGradesView;\r\n public dashboardLIKVConfirmationView: DashboardLIKVConfirmationView;\r\n public dashboardEmployeePresenceView: DashboardEmployeePresenceView;\r\n\r\n constructor(libName: string = \"\") {\r\n this._libName = libName;\r\n //\r\n this.dashboardTodayEvents = new DashboardTodayEventsView(this._libName + \".dashboardTodayEvents\");\r\n this.dashboardAbsences = new DashboardAbsencesView(this._libName + \".dashboardAbsences\");\r\n this.dashboardAbsenceConfirmationView = new DashboardAbsenceConfirmationView(this._libName + \".dashboardAbsenceConfirmationView\");\r\n this.dashboardTravelOrderView = new DashboardTravelOrderView(this._libName + \".dashboardTravelOrderView\");\r\n this.dashboardInternalOrderView = new DashboardInternalOrderView(this._libName + \".dashboardInternalOrderView\");\r\n this.dashboardMyGradesView = new DashboardMyGradesView(this._libName + \".dashboardMyGradesView\");\r\n this.dashboardLIKVConfirmationView = new DashboardLIKVConfirmationView(this._libName + \".dashboardLIKVConfirmationView\");\r\n this.dashboardEmployeePresenceView = new DashboardEmployeePresenceView(this._libName + \".dashboardEmployeeAttendanceView\");\r\n }\r\n\r\n initDashboardView(): void {\r\n global.ConsoleLogDegug(\"initDashboardView\");\r\n this._card1 = $(\"#card1\");\r\n this._card2 = $(\"#card2\");\r\n this._card3 = $(\"#card3\");\r\n this._card4 = $(\"#card4\");\r\n this._card5 = $(\"#card5\");\r\n this._card6 = $(\"#card6\"); \r\n this._card7 = $(\"#card7\"); \r\n this._card8 = $(\"#card8\");\r\n\r\n $(\"#site-main\").addClass(\"site-main-with-formSidebarr\");\r\n\r\n let _rightSidebar: SaopRightSidebar = new SaopRightSidebar();\r\n _rightSidebar.bindCarouselDiv(\"#right-sidebar-ajax\", SaopRightSidebarView.Dashboard);\r\n }\r\n\r\n refreshAllData(): void {\r\n global.ConsoleLogDegug(\"SaopDashboardView.refreshAllData\");\r\n if (this._card1.length){\r\n this.dashboardTodayEvents.refreshGridData();\r\n }\r\n if (this._card2.length){\r\n this.dashboardAbsences.refreshGridData();\r\n }\r\n if (this._card3.length) {\r\n this.dashboardAbsenceConfirmationView.refreshGridData();\r\n }\r\n if (this._card4.length) {\r\n this.dashboardInternalOrderView.refreshGridData();\r\n }\r\n\r\n if (this._card5.length) {\r\n this.dashboardMyGradesView.refreshGridData();\r\n }\r\n\r\n if (this._card6.length) {\r\n this.dashboardLIKVConfirmationView.refreshGridData();\r\n } \r\n\r\n if (this._card7.length) {\r\n this.dashboardTravelOrderView.refreshGridData();\r\n } \r\n\r\n if (this._card8.length) {\r\n this.dashboardEmployeePresenceView.refreshGridData();\r\n } \r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n","import { filterTableRows, global, isUnDefined } from \"../Common/saop-common\";\r\nimport { SaopWebDataTable, SaopWebGrid, SaopWebGridProperties, SaopWebGridToolbar, SaopWebGridToolbarButton } from \"../Components/saop-grid\";\r\nimport { SaopMessageDlg, SaopMsgDlgButton } from \"../Components/saop-message-dlg\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { SaopTranslationService } from \"../Core/saop-translate\";\r\nimport { SaopViewForm, SaopWfAction } from \"../Core/saop-view-form\";\r\nimport { KEEmployeeGradesEditView } from \"./KEEmployeeGradesEdit-view\";\r\n\r\nclass EmployeeGradesData {\r\n sifraOcenObdobja: string;\r\n sifraocenobdobjaFingerprint: string;\r\n sifraZaposleni: string;\r\n isOcenObdobjaStatusActive: boolean;\r\n fingerprint: string;\r\n formTitle: string\r\n}\r\n\r\nexport class KEAllEmployeesGradesView extends SaopViewForm {\r\n private viewId: string;\r\n private libName: string;\r\n private _loadingSpinnerId: string = \"allEmployeesGradesFormLoading\";\r\n private _buttonCloseId: string = \"btnClose\";\r\n private divId: string = \"#allEmployeesGradesForm\";\r\n private webGridId: string = \"#allEmployeesGradesGrid\";\r\n private webGridRowsBodyId: string = \"#allEmployeesGradesGridBodyAjax\";\r\n private _massVnosBtnId: string = \"#editMassAllEmployeesGrades\";\r\n private _colCheckboxAllId: string = \"#colCheckboxAll\";\r\n private _keEmployeeGradesEditView: KEEmployeeGradesEditView;\r\n public webGrid: SaopWebGrid;\r\n public formTranslationService: SaopTranslationService;\r\n\r\n private _searchValueId: string = \"#AllEmployeesGradesTableSearchValue\";\r\n private _mainFormDiv: JQuery;\r\n private _searchValue: JQuery;\r\n\r\n constructor(viewId:string,libName:string = \"\"){\r\n super(viewId, libName);\r\n\r\n this.viewId = viewId;\r\n this.libName = libName; \r\n\r\n this.setDictionary(); \r\n this.title = \"\";\r\n this.addRecordEndpoint = \"\";\r\n this.editRecordEndpoint = \"KeAllEmployeesGradesAdministration/GetAllEmployeesGrades\";\r\n this.deleteRecordEndpoint = \"\"; \r\n\r\n this.formTranslationService = new SaopTranslationService();\r\n }\r\n\r\n setDictionary(){\r\n this.setTerminologyList();\r\n } \r\n\r\n public afterViewShowSuccess(sender:any):void{\r\n this.LoadViewEvents();\r\n }\r\n\r\n public LoadViewEvents ():void{\r\n let _viewDiv = $(this.id);\r\n if (_viewDiv.length == 0) {\r\n return;\r\n }\r\n }\r\n\r\n showForm(data: any, fullTitle: string): void {\r\n global.ConsoleLogDegug(\"KEAllEmployeesGradesView.showForm\");\r\n\r\n this.fullTitle = fullTitle;\r\n this.recordDetails(data);\r\n this.SetToFullScreen(); \r\n\r\n this.viewShowComplete = this.initForm.bind(this);\r\n }\r\n\r\n initForm(): void {\r\n global.ConsoleLogDegug(\"KEAllEmployeesGradesView.initForm\");\r\n\r\n this._mainFormDiv = $(this.divId);\r\n\r\n // prevajanje\r\n this.setFormTerminologyList();\r\n\r\n // init grid \r\n this.getWebGridToolbarAndInitWebGrid();\r\n\r\n this.initEditView();\r\n }\r\n\r\n private setFormTerminologyList() {\r\n let terminology = [\"Masovni vnos\"];\r\n\r\n this.formTranslationService.setTranslationsList(terminology);\r\n }\r\n\r\n private getWebGridToolbarAndInitWebGrid(): void {\r\n global.ConsoleLogDegug(\"KEAllEmployeesGradesView.getWebGridToolbarAndInitWebGrid\");\r\n\r\n let _this = this;\r\n let isStatusActive = this._mainFormDiv.attr(\"data-isocenobdobjastatusactive\");\r\n let isOcenObdobjaStatusActive = isStatusActive === \"True\" ? true : false;\r\n\r\n let params = { javascriptKnjiznica: _this.libName, IsOcenObdobjaStatusActive: isOcenObdobjaStatusActive };\r\n\r\n let saopServicesCore = new SaopServicesCore();\r\n saopServicesCore.afterDone = function (response) {\r\n _this.initWebGrid(response);\r\n _this.initFilterControls();\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"KeAllEmployeesGradesAdministration/GetTableToolbar\"\r\n , data: params\r\n , type: \"GET\"\r\n });\r\n }\r\n\r\n private initWebGrid(toolbarTemplate: string = \"\") {\r\n global.ConsoleLogDegug(\"KEAllEmployeesGradesView.initWebGrid\");\r\n\r\n let captionToolbar = $(this.webGridId).attr(\"caption-toolbar\");\r\n //\r\n this.webGrid = new SaopWebGrid(this.libName + \".webGrid\");\r\n this.webGrid.afterColumnCheckboxChanged = this.webGridAfterColumnCheckboxChanged.bind(this);\r\n let gridProperties: SaopWebGridProperties;\r\n let gridToolbar: SaopWebGridToolbar;\r\n let toolbarButtons: SaopWebGridToolbarButton[] = [];\r\n let dataTable: SaopWebDataTable;\r\n\r\n toolbarButtons.push({ id: \"\", caption: \"\", template: toolbarTemplate });\r\n gridToolbar = { id: \"saopWebGridTB1\", caption: captionToolbar, buttons: toolbarButtons };\r\n\r\n dataTable = { enabled: true, ordering: true };\r\n\r\n gridProperties = {\r\n gridId: this.webGridId\r\n , togglePanel: { enabled: false }\r\n , toolbar: gridToolbar\r\n , dataTable: dataTable\r\n };\r\n //\r\n this.webGrid.init(gridProperties);\r\n\r\n this.initWebGridListners();\r\n\r\n $(this.divId).show();\r\n }\r\n\r\n private initFilterControls(): void {\r\n global.ConsoleLogDegug(\"KEAllEmployeesGradesView.initFilterControls\");\r\n\r\n this._searchValue = this._mainFormDiv.find(this._searchValueId);\r\n let _this = this;\r\n\r\n this._searchValue.off(\"keyup\");\r\n this._searchValue.on(\"keyup\", function () {\r\n _this.executeFilterSearch($(this).val().toString());\r\n });\r\n }\r\n\r\n private executeFilterSearch(searchVal: string): void {\r\n global.ConsoleLogDegug(\"KEAllEmployeesGradesView.executeFilterSearch\");\r\n\r\n // tole ni delovalo: ko se je spremenilo leto, je se vedno filtriral stare podatke od prejsnjega leta\r\n //let oTable = this.webGrid.dataTable;\r\n //oTable.search(searchVal).draw();\r\n\r\n filterTableRows(searchVal, this.divId);\r\n }\r\n\r\n private refreshAllEmployeesGradesGridRowsData(sender: any): void {\r\n global.ConsoleLogDegug(\"KEAllEmployeesGradesView.refreshAllEmployeesGradesGridRowsData\");\r\n\r\n let _this = this;\r\n let params = { sifraOcenObdobja: sender.datasifraocenobdobja, isStatusActive: sender.dataisstatusactive, fingerprint: sender.datasifraocenobdobjafingerprint, selectedSifraZaposleni: sender.dataselectedsifrazaposleni };\r\n\r\n let saopServicesCore = new SaopServicesCore();\r\n saopServicesCore.afterDone = function (response) {\r\n _this.refreshGridRowsData(response);\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"KeAllEmployeesGradesAdministration/GetAllEmployeesGradesTableRows\"\r\n , data: params\r\n , type: \"GET\"\r\n });\r\n }\r\n\r\n private refreshGridRowsData(htmlContent: string) {\r\n global.ConsoleLogDegug(\"KEAllEmployeesGradesView.refreshGridRowsData\");\r\n\r\n if ($(this.webGridId).length) {\r\n $(this.webGridRowsBodyId).html(htmlContent);\r\n this.initWebGridListners();\r\n if (!isUnDefined(this._searchValue) && this._searchValue.length) {\r\n this.executeFilterSearch(this._searchValue.val().toString());\r\n }\r\n }\r\n }\r\n\r\n private initWebGridListners() {\r\n global.ConsoleLogDegug(\"KEAllEmployeesGradesView.initWebGridListners\");\r\n\r\n let _this = this;\r\n\r\n // prikaz edit screen ko klikne na vrstico\r\n $(\"body\").off(\"click\", this.viewId + \" \" + this.webGridId + \" tr td:not(.td-action,.td-action-checkbox)\");\r\n $(\"body\").on(\"click\", this.viewId + \" \" + this.webGridId + \" tr td:not(.td-action,.td-action-checkbox)\", function () {\r\n let selectedRow = $(this).closest(\"tr\")[0];\r\n let data = _this.getDataAttribute(selectedRow);\r\n\r\n // barvanje oznacene vrstrice\r\n _this.webGrid.markSelectedRow(selectedRow);\r\n\r\n if (data.isOcenObdobjaStatusActive && !isUnDefined(data.sifraOcenObdobja) && !isUnDefined(data.sifraZaposleni)) {\r\n _this._keEmployeeGradesEditView.title = data.formTitle;\r\n _this._keEmployeeGradesEditView.showViewForm(SaopWfAction.wfaEditRecord, { sifraOcenObdobja: data.sifraOcenObdobja, sifraOcenObdobjaFingerprint: data.sifraocenobdobjaFingerprint, sifraZaposleniList: data.sifraZaposleni, isOcenObdobjaStatusActive: data.isOcenObdobjaStatusActive, fingerprintList: data.fingerprint }, null);\r\n }\r\n });\r\n\r\n // prikaz edit screen ko klikne na action stolpec\r\n $(\"body\").off(\"click\", this.viewId + \" \" + this.webGridId + \" tr .td-action .KEAllEmployeesGradesGrid_edit\");\r\n $(\"body\").on(\"click\", this.viewId + \" \" + this.webGridId + \" tr .td-action .KEAllEmployeesGradesGrid_edit\", function () {\r\n let selectedRow = $(this).closest(\"tr\")[0];\r\n let data = _this.getDataAttribute(selectedRow);\r\n\r\n // barvanje oznacene vrstrice\r\n _this.webGrid.markSelectedRow(selectedRow);\r\n\r\n if (data.isOcenObdobjaStatusActive && !isUnDefined(data.sifraOcenObdobja) && !isUnDefined(data.sifraZaposleni)) {\r\n _this._keEmployeeGradesEditView.title = data.formTitle;\r\n _this._keEmployeeGradesEditView.showViewForm(SaopWfAction.wfaEditRecord, { sifraOcenObdobja: data.sifraOcenObdobja, sifraOcenObdobjaFingerprint: data.sifraocenobdobjaFingerprint, sifraZaposleniList: data.sifraZaposleni, isOcenObdobjaStatusActive: data.isOcenObdobjaStatusActive, fingerprintList: data.fingerprint }, null);\r\n }\r\n });\r\n\r\n $(\"body\").off(\"click\", this.viewId + \" \" + this.webGridId + \" tr .saop-td-input-checkbox\");\r\n $(\"body\").on(\"click\", this.viewId + \" \" + this.webGridId + \" tr .saop-td-input-checkbox\", function () {\r\n _this.webGridAfterColumnCheckboxChanged();\r\n });\r\n\r\n $(\"body\").off(\"click\", this.viewId + \" \" + this._colCheckboxAllId);\r\n $(\"body\").on(\"click\", this.viewId + \" \" + this._colCheckboxAllId, function () {\r\n _this.webGridAfterColumnCheckboxAllChanged();\r\n });\r\n\r\n $(this.viewId + \" \" + this._colCheckboxAllId).prop('checked', false);\r\n $(this.viewId + \" \" + _this._massVnosBtnId).prop('disabled', true);\r\n }\r\n\r\n getDataAttribute(element: HTMLElement): EmployeeGradesData {\r\n global.ConsoleLogDegug(\"KEAllEmployeesGradesView.getDataAttribute\");\r\n\r\n let data = new EmployeeGradesData();\r\n\r\n data.sifraOcenObdobja = element.getAttribute(\"data-sifraocenobdobja\");\r\n data.sifraocenobdobjaFingerprint = element.getAttribute(\"data-sifraocenobdobjafingerprint\");\r\n data.sifraZaposleni = element.getAttribute(\"data-sifrazaposleni\");\r\n let isStatusActive = element.getAttribute(\"data-isocenobdobjastatusactive\");\r\n data.isOcenObdobjaStatusActive = isStatusActive === \"True\" ? true : false;\r\n data.fingerprint = element.getAttribute(\"data-fingerprint\");\r\n data.formTitle = element.getAttribute(\"data-formtitle\");\r\n\r\n return data;\r\n }\r\n\r\n initEditView(): void {\r\n global.ConsoleLogDegug(\"KEAllEmployeesGradesView.initEditView\");\r\n\r\n \r\n this._keEmployeeGradesEditView = new KEEmployeeGradesEditView(\"#keGradesAdministrationView003\", this.libName + \"._keEmployeeGradesEditView\");\r\n this._keEmployeeGradesEditView.fullScreen = true;\r\n this._keEmployeeGradesEditView.refreshData = this.refreshAllEmployeesGradesGridRowsData.bind(this);\r\n }\r\n\r\n webGridAfterColumnCheckboxChanged(): void {\r\n global.ConsoleLogDegug(\"KEAllEmployeesGradesView.webGridAfterColumnCheckboxChanged\");\r\n\r\n let _this = this;\r\n\r\n // disabled mass vnos gumba\r\n $(_this.viewId + \" \" + _this._massVnosBtnId).prop('disabled', true);\r\n\r\n // ali je kaksen checkobx oznacen? Da nastavimo gumb za masovno kpiranje enabled\r\n $(this.viewId + \" \" + this.webGridId + \" tr td input.saop-td-input-checkbox\").each(function () {\r\n let checked = $(this).is(\":checked\");\r\n if (checked) {\r\n $(_this.viewId + \" \" + _this._massVnosBtnId).prop('disabled', false);\r\n }\r\n });\r\n }\r\n\r\n private editMassData(): void {\r\n global.ConsoleLogDegug(\"KEAllEmployeesGradesView.editMassData\");\r\n\r\n let _this = this;\r\n let seznamSifraZaposleni: string[] = [];\r\n let seznamFingerprint: string[] = [];\r\n let dataSifraOcenObdobja: string = \"\";\r\n let dataSifraocenobdobjaFingerprint: string = \"\";\r\n let dataIsOcenObdobjaStatusActive: boolean = false;\r\n\r\n //poiscemo vse oznacene sifre zaposlenih\r\n $(this.viewId + \" \" + this.webGridId + \" tr td input.saop-td-input-checkbox\").each(function () {\r\n let checked = $(this).is(\":checked\");\r\n if (checked) {\r\n let selectedRow = $(this).closest(\"tr\")[0];\r\n let data = _this.getDataAttribute(selectedRow);\r\n\r\n dataSifraOcenObdobja = data.sifraOcenObdobja;\r\n dataSifraocenobdobjaFingerprint = data.sifraocenobdobjaFingerprint;\r\n dataIsOcenObdobjaStatusActive = data.isOcenObdobjaStatusActive;\r\n\r\n seznamSifraZaposleni.push(data.sifraZaposleni);\r\n seznamFingerprint.push(data.fingerprint);\r\n }\r\n });\r\n\r\n if (seznamSifraZaposleni.length > 0) {\r\n _this._keEmployeeGradesEditView.title = this.formTranslationService.translate(\"Masovni vnos\");\r\n _this._keEmployeeGradesEditView.showViewForm(SaopWfAction.wfaEditRecord, { sifraOcenObdobja: dataSifraOcenObdobja, sifraOcenObdobjaFingerprint: dataSifraocenobdobjaFingerprint, sifraZaposleniList: seznamSifraZaposleni.toString(), isOcenObdobjaStatusActive: dataIsOcenObdobjaStatusActive, fingerprintList: seznamFingerprint.toString() }, null);\r\n }\r\n } \r\n\r\n webGridAfterColumnCheckboxAllChanged(): void {\r\n global.ConsoleLogDegug(\"KEAllEmployeesGradesView.webGridAfterColumnCheckboxAllChanged\");\r\n\r\n let _this = this;\r\n\r\n let allCheckboxChecked = $(this.viewId + \" \" + this._colCheckboxAllId).is(\":checked\");\r\n $(_this.viewId + \" \" + _this._massVnosBtnId).prop('disabled', !allCheckboxChecked);\r\n \r\n // nastavimo vrednosti vseh checkboxov\r\n $(this.viewId + \" \" + this.webGridId + \" tr td input.saop-td-input-checkbox\").each(function () {\r\n $(this).prop('checked', allCheckboxChecked);\r\n });\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\nimport { SaopViewForm } from \"../Core/saop-view-form\";\r\n\r\nexport class KEEmployeeGradesEditView extends SaopViewForm {\r\n\r\n constructor(viewId:string,libName:string = \"\"){\r\n super(viewId, libName);\r\n this.setDictionary(); \r\n this.title = \"\";\r\n this.addRecordEndpoint = \"\";\r\n this.editRecordEndpoint = \"KeAllEmployeesGradesAdministration/EditEmployeeGrades\";\r\n this.deleteRecordEndpoint = \"\"; \r\n }\r\n\r\n setDictionary(){\r\n this.setTerminologyList();\r\n } \r\n\r\n public afterViewShowSuccess(sender:any):void{\r\n this.LoadViewEvents();\r\n }\r\n\r\n public LoadViewEvents ():void{\r\n let _viewDiv = $(this.id);\r\n if (_viewDiv.length == 0) {\r\n return;\r\n }\r\n }\r\n\r\n showForm(data: any, title: string): void {\r\n global.ConsoleLogDegug(\"KEEmployeeGradesEditView.showForm\");\r\n\r\n this.title = title;\r\n this.editRecord(data);\r\n this.SetToFullScreen(); \r\n\r\n this.viewShowComplete = this.initForm.bind(this);\r\n }\r\n\r\n initForm(): void {\r\n global.ConsoleLogDegug(\"KEEmployeeGradesEditView.initForm\");\r\n }\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\nimport { SaopWebDataTable, SaopWebGrid, SaopWebGridProperties, SaopWebGridToolbar, SaopWebGridToolbarButton } from \"../Components/saop-grid\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\n\r\nclass DataAttributes {\r\n sifraKriterija: string;\r\n opis: string;\r\n}\r\n\r\nexport class KEGradeCriterion {\r\n private _viewId: string;\r\n private _libName: string;\r\n private _spinnerDivId: string\r\n\r\n private webGridId: string = \"#gradesCriterionGrid\";\r\n private _rowDetailsPrefixId: string = \"#detailRow\";\r\n private _rowDetailsDivPrefixId: string = \"#detailRowDiv\";\r\n\r\n public webGrid: SaopWebGrid;\r\n\r\n constructor(viewId: string, libName: string = \"\", spinnerDivId: string = null) {\r\n this._viewId = viewId;\r\n this._libName = libName; \r\n this._spinnerDivId = spinnerDivId;\r\n } \r\n\r\n init() {\r\n global.ConsoleLogDegug(\"KEGradeCriterion.init\");\r\n\r\n this.initWebGrid();\r\n }\r\n\r\n initWebGrid() {\r\n global.ConsoleLogDegug(\"KEGradeCriterion.initWebGrid\");\r\n\r\n this.webGrid = new SaopWebGrid(this._libName + \".webGrid\");\r\n let gridProperties: SaopWebGridProperties;\r\n let dataTable: SaopWebDataTable;\r\n\r\n dataTable = { enabled: true, ordering: false };\r\n\r\n gridProperties = {\r\n gridId: this.webGridId\r\n , dataTable: dataTable\r\n };\r\n //\r\n this.webGrid.init(gridProperties);\r\n\r\n this.initWebGridListners();\r\n }\r\n\r\n initWebGridListners() {\r\n global.ConsoleLogDegug(\"KEGradeCriterion.initWebGridListners\");\r\n\r\n let _this = this;\r\n\r\n // prikaz dogodkov zaposlenega po vrsti dogodkov (sum ure)\r\n $(\"body\").off(\"click\", this._viewId + \" \" + this.webGridId + \" tr.saop-table-row-master td.td-action-details\");\r\n $(\"body\").on(\"click\", this._viewId + \" \" + this.webGridId + \" tr.saop-table-row-master td.td-action-details\", function () {\r\n let selectedRow = $(this).closest(\"tr\");\r\n let actionDetailsColumn = selectedRow.find(\"td\").eq(0);\r\n let dataAttributesValues = _this.getDataAttributesValues(selectedRow);\r\n\r\n _this.showHideDetailsSubTable(selectedRow, actionDetailsColumn, dataAttributesValues);\r\n });\r\n }\r\n\r\n getDataAttributesValues(row: JQuery): DataAttributes {\r\n global.ConsoleLogDegug(\"KEGradeCriterion.getDataAttributesValues\");\r\n\r\n let dataValues = new DataAttributes();\r\n \r\n dataValues.sifraKriterija = row.attr(\"data-sifrakriterija\");\r\n dataValues.opis = row.attr(\"data-opis\");\r\n\r\n return dataValues;\r\n }\r\n\r\n showHideDetailsSubTable(selectedRow: JQuery, actionDetailsColumn: JQuery, dataAttributesValues: DataAttributes): void {\r\n global.ConsoleLogDegug(\"KEGradeCriterion.showHideDetailsSubTable\");\r\n\r\n let iconElement = actionDetailsColumn.find(\"span\");\r\n\r\n let rowDetailsId = this._rowDetailsPrefixId + dataAttributesValues.sifraKriterija;\r\n let rowDetailsIdElement = $(this._viewId + \" \" + rowDetailsId);\r\n\r\n if (!this.isDetailsSubTableShowed(iconElement)) {\r\n // show details subtable\r\n // preverim, če tabela ze obstaja\r\n let detailRowDivId = this._rowDetailsDivPrefixId + dataAttributesValues.sifraKriterija;\r\n let detailRowTableElement = $(this._viewId + \" \" + detailRowDivId + \" table\");\r\n if (detailRowTableElement.length == 0) {\r\n // tabele ni, gremo na server po podatke za prikaz\r\n this.getDetailsSubTable(detailRowDivId, dataAttributesValues.opis);\r\n }\r\n }\r\n\r\n // prikazi/skrij bottom border\r\n selectedRow.toggleClass(\"saop-table-row-border-bottom-none\")\r\n\r\n // prikazi/skrij details tabelo\r\n rowDetailsIdElement.toggleClass(\"saop-table-row-hidden\");\r\n rowDetailsIdElement.toggleClass(\"saop-table-row-showed\");\r\n\r\n // sprememba ikone\r\n iconElement.toggleClass(\"saop-img-right\");\r\n iconElement.toggleClass(\"saop-img-down\");\r\n }\r\n\r\n isDetailsSubTableShowed(iconElement: JQuery): boolean {\r\n global.ConsoleLogDegug(\"KEGradeCriterion.isDetailsSubTableShowed\");\r\n\r\n return iconElement.hasClass(\"saop-img-down\");\r\n }\r\n\r\n getDetailsSubTable(detailRowDivId: string, opis: string): void {\r\n global.ConsoleLogDegug(\"KEGradeCriterion.getDetailsSubTable\");\r\n\r\n let _this = this;\r\n let saopServicesCore = new SaopServicesCore();\r\n let params = { opis: opis };\r\n\r\n saopServicesCore.afterDone = function (response) {\r\n $(_this._viewId + \" \" + detailRowDivId).html(response);\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"KeGradeCriterion/GetGradeCriterionTableRowDetails\"\r\n , data: params\r\n , type: \"GET\"\r\n , spinnerDivId: _this._spinnerDivId\r\n });\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","/// \r\nimport { filterTableRows, global, isUnDefined } from \"../Common/saop-common\";\r\nimport { SaopWebGrid,SaopWebGridProperties,SaopWebGridToolbar,SaopWebGridToolbarButton,SaopWebDataTable} from \"../Components/saop-grid\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { KEGradePeriodView } from \"./KEGradePeriod-view\";\r\nimport { SaopTranslationService } from \"../Core/saop-translate\";\r\nimport { KEAllEmployeesGradesView } from \"./KEAllEmployeesGrades-view\";\r\n\r\nclass GradesPeriodData {\r\n sifraOcenObdobja: string;\r\n isStatusActive: boolean;\r\n fingerprint: string;\r\n formTitle: string;\r\n}\r\n\r\nclass GradesViewSenderData {\r\n alertMessage: string;\r\n redirectTo: string;\r\n selectedSifraOcenObdobja: string;\r\n success: boolean;\r\n viewContent: string;\r\n}\r\n\r\nexport class KEGradesPeriodGridOptions {\r\n showToolbar: boolean = true;\r\n showFilter: boolean = true;\r\n}\r\n\r\nexport class KEGradesPeriodGrid {\r\n private libName: string;\r\n private _gridOptions: KEGradesPeriodGridOptions;\r\n //\r\n private divId: string = \"#gradesPeriodDiv\";\r\n private webGridId: string = \"#gradesPeriodGrid\";\r\n private webGridAktivnaRowsBodyId: string = \"#gradesPeriodGridBodyAjax\";\r\n public webGrid: SaopWebGrid;\r\n public keGradePeriodView: KEGradePeriodView;\r\n public keAllEmployeesGradesView: KEAllEmployeesGradesView;\r\n public formTranslationService: SaopTranslationService;\r\n private _searchValueId: string = \"#GradesPeriodSearchValue\";\r\n private _mainFormDiv: JQuery;\r\n private _searchValue: JQuery;\r\n\r\n constructor(libName: string, gridOptions: KEGradesPeriodGridOptions = null) {\r\n if (isUnDefined(gridOptions)) {\r\n gridOptions = new KEGradesPeriodGridOptions();\r\n }\r\n this._gridOptions = gridOptions;\r\n\r\n this.libName = libName; \r\n this.formTranslationService = new SaopTranslationService();\r\n } \r\n\r\n initView() {\r\n global.ConsoleLogDegug(\"KEGradesPeriodGrid.initView\");\r\n\r\n this._mainFormDiv = $(this.divId);\r\n\r\n // prevajanje\r\n this.setFormTerminologyList();\r\n\r\n // refresh grid data\r\n this.refreshGradesPeriodGridData();\r\n\r\n // init edit view\r\n this.initEditView();\r\n }\r\n\r\n private setFormTerminologyList() {\r\n let terminology = [\"Zapri\"];\r\n\r\n this.formTranslationService.setTranslationsList(terminology);\r\n } \r\n\r\n initEditView(): void {\r\n global.ConsoleLogDegug(\"KEGradesPeriodGrid.initEditView\");\r\n\r\n this.keGradePeriodView = new KEGradePeriodView(\"#keGradesAdministrationView001\", this.libName + \".keGradePeriodView\");\r\n this.keGradePeriodView.fullScreen = true;\r\n this.keGradePeriodView.refreshData = this.refreshDataAfterEditView.bind(this);\r\n\r\n this.keAllEmployeesGradesView = new KEAllEmployeesGradesView(\"#keGradesAdministrationView002\", this.libName + \".keAllEmployeesGradesView\")\r\n this.keAllEmployeesGradesView.fullScreen = true;\r\n }\r\n\r\n refreshDataAfterEditView(sender: GradesViewSenderData): void { \r\n global.ConsoleLogDegug(\"KEGradesPeriodGrid.refreshDataAfterEditView\");\r\n\r\n // osvezi se tabela\r\n this.refreshGradesPeriodGridData(true, sender.selectedSifraOcenObdobja);\r\n // klice se external metoda, da se lahko osvezijo se drugi podatki npr. right summary data\r\n this.afterRefreshDataAfterEditViewExternal(sender);\r\n }\r\n\r\n public afterRefreshDataAfterEditViewExternal(sender: any): void {\r\n global.ConsoleLogDegug(\"KEGradesPeriodGrid.afterRefreshDataAfterEditViewExternal\");\r\n }\r\n\r\n refreshGradesPeriodGridData(samoVrstice: boolean = false, selectedSifraOcenObdobja: string = \"\"): void {\r\n global.ConsoleLogDegug(\"KEGradesPeriodGrid.refreshGradesPeriodGridData\");\r\n\r\n let _this = this;\r\n let params = { samoVrstice: samoVrstice, selectedSifraOcenObdobja: selectedSifraOcenObdobja };\r\n\r\n let saopServicesCore = new SaopServicesCore();\r\n saopServicesCore.afterDone = function (response) {\r\n _this.refreshGridData(response);\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action:\"KeGradesAdministration/GetGradesPeriodTable\" \r\n ,data:params\r\n ,type:\"GET\"\r\n }); \r\n }\r\n\r\n refreshGridData(htmlContent: string) {\r\n global.ConsoleLogDegug(\"KEGradesPeriodGrid.refreshGridData\");\r\n\r\n if ($(this.webGridId).length) {\r\n $(this.webGridAktivnaRowsBodyId).html(htmlContent);\r\n this.initWebGridListners();\r\n if (!isUnDefined(this._searchValue) && this._searchValue.length) {\r\n this.executeFilterSearch(this._searchValue.val().toString());\r\n }\r\n }\r\n else {\r\n $(this.divId).html(htmlContent);\r\n this.getWebGridToolbarAndInitWebGrid(); \r\n }\r\n }\r\n\r\n getWebGridToolbarAndInitWebGrid(): void {\r\n global.ConsoleLogDegug(\"KEGradesPeriodGrid.getWebGridToolbarAndInitWebGrid\");\r\n\r\n let _this = this;\r\n let params = { javascriptKnjiznica: _this.libName };\r\n\r\n let saopServicesCore = new SaopServicesCore();\r\n saopServicesCore.afterDone = function (response) {\r\n _this.initWebGrid(response);\r\n _this.initFilterControls(); \r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"KeGradesAdministration/GetTableToolbar\"\r\n , data: params\r\n , type: \"GET\"\r\n });\r\n }\r\n\r\n initWebGrid(toolbarTemplate: string = \"\") {\r\n global.ConsoleLogDegug(\"KEGradesPeriodGrid.initWebGrid\");\r\n\r\n let captionToolbar = $(this.webGridId).attr(\"caption-toolbar\");\r\n //\r\n this.webGrid = new SaopWebGrid(this.libName + \".webGrid\");\r\n let gridProperties: SaopWebGridProperties;\r\n let gridToolbar: SaopWebGridToolbar;\r\n let toolbarButtons: SaopWebGridToolbarButton[] = [];\r\n let dataTable: SaopWebDataTable;\r\n //\r\n if (this._gridOptions.showToolbar) {\r\n toolbarButtons.push({ id: \"\", caption: \"\", template: toolbarTemplate });\r\n gridToolbar = { id: \"saopWebGridTB1\", caption: captionToolbar, buttons: toolbarButtons };\r\n }\r\n\r\n dataTable = { enabled: true, ordering: true};\r\n\r\n gridProperties = {\r\n gridId: this.webGridId\r\n , togglePanel: { enabled: false }\r\n , toolbar: gridToolbar\r\n , dataTable: dataTable\r\n };\r\n //\r\n this.webGrid.init(gridProperties);\r\n\r\n this.initWebGridListners();\r\n\r\n $(this.divId).show();\r\n\r\n //this.setDashboardSpecificView();\r\n }\r\n\r\n initWebGridListners() {\r\n global.ConsoleLogDegug(\"KEGradesPeriodGrid.initWebGridListners\");\r\n\r\n let _this = this;\r\n\r\n // prikaz full screen ko klikne na vrstico\r\n $(\"body\").off(\"click\", this.webGridId + \" tr td:not(.td-action,.td-action-checkbox)\");\r\n $(\"body\").on(\"click\", this.webGridId + \" tr td:not(.td-action,.td-action-checkbox)\", function () {\r\n let selectedRow = $(this).closest(\"tr\")[0];\r\n let data = _this.getGradePeriodDataAttribute(selectedRow);\r\n\r\n // barvanje oznacene vrstrice\r\n _this.webGrid.markSelectedRow(selectedRow);\r\n\r\n if (!isUnDefined(data.sifraOcenObdobja)) {\r\n _this.showRecordDetails({ sifraOcenObdobja: data.sifraOcenObdobja, isStatusActive: data.isStatusActive, fingerprint: data.fingerprint }, data.formTitle);\r\n }\r\n });\r\n\r\n // prikaz ocen\r\n //če se naredi z \"$(\"body\").off(\"click\", this.webGridId + \" tr .td-action .btnVsiZaposleniPrikazOcen\");\"\r\n // so težave, ker se event 2x izvede (verjetno, ker je narejeno z gumbom in ne z div in ikono v njem)\r\n $(this.webGridId + \" tr .td-action .btnVsiZaposleniPrikazOcen\").off(\"click\");\r\n $(this.webGridId + \" tr .td-action .btnVsiZaposleniPrikazOcen\").on('click', function (row) {\r\n let selectedRow = $(this).closest(\"tr\")[0];\r\n let data = _this.getGradePeriodDataAttribute(selectedRow);\r\n\r\n // barvanje oznacene vrstrice\r\n _this.webGrid.markSelectedRow(selectedRow);\r\n\r\n let baseTitle = $(this).attr(\"data-editocenetitle\");\r\n\r\n if (!isUnDefined(data.sifraOcenObdobja)) {\r\n let fullTitle = baseTitle + \": \" + data.formTitle;\r\n _this.showAllEmployeesGrades({ sifraOcenObdobja: data.sifraOcenObdobja, isStatusActive: data.isStatusActive, fingerprint: data.fingerprint }, fullTitle);\r\n }\r\n }); \r\n\r\n }\r\n\r\n initFilterControls(): void {\r\n global.ConsoleLogDegug(\"KEGradesPeriodGrid.initFilterControls\");\r\n\r\n this._searchValue = this._mainFormDiv.find(this._searchValueId);\r\n let _this = this;\r\n\r\n this._searchValue.off(\"keyup\");\r\n this._searchValue.on(\"keyup\", function () {\r\n _this.executeFilterSearch($(this).val().toString());\r\n });\r\n }\r\n\r\n executeFilterSearch(searchVal: string): void {\r\n global.ConsoleLogDegug(\"KEGradesPeriodGrid.executeFilterSearch\");\r\n\r\n // tole ni delovalo: ko se je spremenilo leto, je se vedno filtriral stare podatke od prejsnjega leta\r\n //let oTable = this.webGrid.dataTable;\r\n //oTable.search(searchVal).draw();\r\n\r\n filterTableRows(searchVal, this.divId);\r\n }\r\n\r\n getGradePeriodDataAttribute(element: HTMLElement): GradesPeriodData {\r\n global.ConsoleLogDegug(\"KEGradesPeriodGrid.getGradePeriodDataAttribute\");\r\n\r\n let data = new GradesPeriodData();\r\n\r\n data.sifraOcenObdobja = element.getAttribute(\"data-sifraocenobdobja\");\r\n data.fingerprint = element.getAttribute(\"data-fingerprint\");\r\n data.formTitle = element.getAttribute(\"data-formtitle\");\r\n let isStatusActive = element.getAttribute(\"data-isstatusactive\");\r\n data.isStatusActive = isStatusActive === \"True\" ? true : false;\r\n\r\n return data;\r\n }\r\n\r\n showRecordDetails(detailsData: any, title: string): void {\r\n global.ConsoleLogDegug(\"KEGradesPeriodGrid.showRecordDetails\");\r\n\r\n this.keGradePeriodView.showForm(detailsData, title);\r\n }\r\n\r\n showAllEmployeesGrades(data: any, fullTitle: string): void {\r\n global.ConsoleLogDegug(\"KEGradesPeriodGrid.showAllEmployeesGrades\");\r\n\r\n this.keAllEmployeesGradesView.showForm(data, fullTitle);\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { global, isUnDefined } from \"../Common/saop-common\";\r\nimport { SaopMessageDlg, SaopMsgDlgButton } from \"../Components/saop-message-dlg\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { SaopTranslationService } from \"../Core/saop-translate\";\r\nimport { SaopViewForm } from \"../Core/saop-view-form\";\r\nimport { KEAllEmployeesGradesView } from \"./KEAllEmployeesGrades-view\";\r\nimport { KEGradeCriterion } from \"./KEGradeCriterion\";\r\n\r\nclass GradesPeriodDetailsData {\r\n sifraOcenObdobja: string;\r\n isStatusActive: boolean;\r\n fingerprint: string;\r\n}\r\n\r\nexport class KEGradePeriodView extends SaopViewForm {\r\n private viewId: string;\r\n private libName: string;\r\n private _loadingSpinnerId: string = \"gradePeriodDetailsLoading\";\r\n private _buttonCloseId: string = \"btnClose\";\r\n private _keGradeCriterion: KEGradeCriterion;\r\n public keAllEmployeesGradesView: KEAllEmployeesGradesView;\r\n public formTranslationService: SaopTranslationService;\r\n\r\n constructor(viewId:string,libName:string = \"\"){\r\n super(viewId, libName);\r\n\r\n this.viewId = viewId;\r\n this.libName = libName; \r\n\r\n this.setDictionary(); \r\n this.title = \"\";\r\n this.addRecordEndpoint = \"\";\r\n this.editRecordEndpoint = \"KeGrade/GetGradePeriodDetails\";\r\n this.deleteRecordEndpoint = \"\"; \r\n\r\n this._keGradeCriterion = new KEGradeCriterion(viewId, libName + \"._keGradeCriterion\", \"#\" + this._loadingSpinnerId);\r\n this.formTranslationService = new SaopTranslationService();\r\n }\r\n\r\n setDictionary(){\r\n this.setTerminologyList();\r\n } \r\n\r\n public afterViewShowSuccess(sender:any):void{\r\n this.LoadViewEvents();\r\n }\r\n\r\n public LoadViewEvents ():void{\r\n let _viewDiv = $(this.id);\r\n if (_viewDiv.length == 0) {\r\n return;\r\n }\r\n }\r\n\r\n showForm(data: any, title: string): void {\r\n global.ConsoleLogDegug(\"KEGradePeriodView.showForm\");\r\n\r\n this.title = title;\r\n this.recordDetails(data);\r\n this.SetToFullScreen(); \r\n\r\n this.viewShowComplete = this.initForm.bind(this);\r\n }\r\n\r\n initForm(): void {\r\n global.ConsoleLogDegug(\"KEGradePeriodView.initForm\");\r\n\r\n // prevajanje\r\n this.setFormTerminologyList();\r\n\r\n this._keGradeCriterion.init();\r\n\r\n this.keAllEmployeesGradesView = new KEAllEmployeesGradesView(\"#keGradesAdministrationView002\", this.libName + \".keAllEmployeesGradesView\")\r\n this.keAllEmployeesGradesView.fullScreen = true;\r\n\r\n this.initEventListners();\r\n }\r\n\r\n private setFormTerminologyList() {\r\n let terminology = [\"Opozorilo\", \"Ali ste prepričani, da želite nadaljevati? Če je ocenjevanje zaključeno ocen ni mogoče več urejati.\"];\r\n\r\n this.formTranslationService.setTranslationsList(terminology);\r\n }\r\n\r\n initEventListners() {\r\n global.ConsoleLogDegug(\"KEGradePeriodView.initEventListners\");\r\n\r\n let _this = this;\r\n\r\n // prikaz full screen ko klikne na vrstico\r\n $(\"body\").off(\"click\", this.viewId + \" #concludeGradePeriod\");\r\n $(\"body\").on(\"click\", this.viewId + \" #concludeGradePeriod\", function () {\r\n let data = _this.getDataAttribute();\r\n\r\n if (!isUnDefined(data.sifraOcenObdobja)) {\r\n _this.showConcludeGradePeriodDialog(data);\r\n }\r\n });\r\n\r\n $(\"body\").off(\"click\", this.viewId + \" #btnOcene\");\r\n $(\"body\").on(\"click\", this.viewId + \" #btnOcene\", function () {\r\n let data = _this.getDataAttribute();\r\n var baseTitle = $(this).attr(\"data-editocenetitle\");\r\n\r\n if (!isUnDefined(data.sifraOcenObdobja)) {\r\n var fullTitle = baseTitle + \": \" + _this.title;\r\n _this.showAllEmployeesGrades({ sifraOcenObdobja: data.sifraOcenObdobja, isStatusActive: data.isStatusActive, fingerprint: data.fingerprint }, fullTitle);\r\n }\r\n });\r\n }\r\n\r\n getDataAttribute(): GradesPeriodDetailsData {\r\n global.ConsoleLogDegug(\"KEGradePeriodView.getDataAttribute\");\r\n\r\n let data = new GradesPeriodDetailsData();\r\n\r\n data.sifraOcenObdobja = $(this.viewId + \" #hiddenSifraOcenObdobja\").val().toString();\r\n data.fingerprint = $(this.viewId + \" #hiddenFingerprint\").val().toString();\r\n let isStatusActive = $(this.viewId + \" #hiddenIsStatusActive\").val().toString().toLowerCase();\r\n data.isStatusActive = isStatusActive === \"true\" ? true : false;\r\n\r\n return data;\r\n }\r\n\r\n showConcludeGradePeriodDialog(data: any): void {\r\n global.ConsoleLogDegug(\"KEGradePeriodView.showConcludeGradePeriodDialog\");\r\n\r\n let title = this.formTranslationService.translate(\"Opozorilo\");\r\n let message = this.formTranslationService.translate(\"Ali ste prepričani, da želite nadaljevati? Če je ocenjevanje zaključeno ocen ni mogoče več urejati.\");\r\n\r\n let saopMessageDlg = new SaopMessageDlg(data)\r\n saopMessageDlg.onYes = this.concludeGradePeriod.bind(this);\r\n saopMessageDlg.Show(message, title, 1, [SaopMsgDlgButton.mbYes, SaopMsgDlgButton.mbNo]);\r\n }\r\n\r\n concludeGradePeriod(data: GradesPeriodDetailsData): void {\r\n global.ConsoleLogDegug(\"KEGradePeriodView.concludeGradePeriod\");\r\n\r\n let _this = this;\r\n let params = { sifraOcenObdobja: data.sifraOcenObdobja, isStatusActive: data.isStatusActive, fingerprint: data.fingerprint };\r\n\r\n let saopServicesCore = new SaopServicesCore();\r\n saopServicesCore.afterDone = function (response) {\r\n if (response.success) {\r\n alertify.message(response.alertMessage);\r\n // zapremo okno\r\n $(_this.viewId + \" #\" + _this._buttonCloseId).click();\r\n // poklice se metodo, da se lahko v extended klasu izvede osvezitev grida\r\n _this.refreshData(response);\r\n } else {\r\n alertify.error(response.alertMessage);\r\n }\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"KeGrade/ConcludeGradePeriod\"\r\n , data: params\r\n , type: \"POST\"\r\n });\r\n }\r\n\r\n showAllEmployeesGrades(data: any, fullTitle: string): void {\r\n global.ConsoleLogDegug(\"KEGradePeriodView.showAllEmployeesGrades\");\r\n\r\n this.keAllEmployeesGradesView.showForm(data, fullTitle);\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\nimport { KEGradesPeriodGrid } from \"./KEGradePeriod-grid\";\r\n\r\nexport class KEGradesPeriod {\r\n private libName: string;\r\n\r\n private keGradesPeriodGrid: KEGradesPeriodGrid;\r\n \r\n constructor(libName: string) {\r\n this.libName = libName; \r\n\r\n this.keGradesPeriodGrid = new KEGradesPeriodGrid(this.libName + \".keGradesPeriodGrid\");\r\n this.keGradesPeriodGrid.afterRefreshDataAfterEditViewExternal = this.refreshDataAfterEditView.bind(this);\r\n } \r\n\r\n initView() {\r\n global.ConsoleLogDegug(\"KEGradesPeriod.initView\");\r\n\r\n this.keGradesPeriodGrid.initView();\r\n }\r\n\r\n refreshDataAfterEditView(): void { \r\n global.ConsoleLogDegug(\"KEGradesPeriod.refreshDataAfterEditView\");\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\nimport { SaopViewForm } from \"../Core/saop-view-form\";\r\n\r\nexport class KEMyGradeView extends SaopViewForm {\r\n\r\n constructor(viewId:string,libName:string = \"\"){\r\n super(viewId, libName);\r\n this.setDictionary(); \r\n this.title = \"\";\r\n this.addRecordEndpoint = \"\";\r\n this.editRecordEndpoint = \"KeGrade/GetGradeDetails\";\r\n this.deleteRecordEndpoint = \"\"; \r\n }\r\n\r\n setDictionary(){\r\n this.setTerminologyList();\r\n } \r\n\r\n public afterViewShowSuccess(sender:any):void{\r\n this.LoadViewEvents();\r\n }\r\n\r\n public LoadViewEvents ():void{\r\n let _viewDiv = $(this.id);\r\n if (_viewDiv.length == 0) {\r\n return;\r\n }\r\n }\r\n\r\n showForm(data: any, title: string): void {\r\n global.ConsoleLogDegug(\"KEMyGradeView.showForm\");\r\n\r\n this.title = title;\r\n this.recordDetails(data);\r\n this.SetToFullScreen(); \r\n\r\n this.viewShowComplete = this.initForm.bind(this);\r\n }\r\n\r\n initForm(): void {\r\n global.ConsoleLogDegug(\"KEMyGradeView.initForm\");\r\n }\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\nimport { KEGradeCriterion } from \"./KEGradeCriterion\";\r\n\r\nexport class KEMyGradeDetails {\r\n private viewId: string;\r\n private libName: string;\r\n private _loadingSpinnerId: string = \"gradeDetailsLoading\";\r\n private _keGradeCriterion: KEGradeCriterion;\r\n\r\n constructor(viewId: string, libName: string = \"\") {\r\n this.viewId = viewId;\r\n this.libName = libName; \r\n\r\n this._keGradeCriterion = new KEGradeCriterion(viewId, libName + \"._keGradeCriterion\", \"#\" + this._loadingSpinnerId);\r\n } \r\n\r\n initView() {\r\n global.ConsoleLogDegug(\"KEMyGradeDetails.initView\");\r\n\r\n this._keGradeCriterion.init();\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","/// \r\nimport { filterTableRows, global, isUnDefined } from \"../Common/saop-common\";\r\nimport { SaopWebGrid,SaopWebGridProperties,SaopWebGridToolbar,SaopWebGridToolbarButton,SaopWebDataTable} from \"../Components/saop-grid\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { KEMyGradeView } from \"./KEMyGrade-view\";\r\nimport { SaopTranslationService } from \"../Core/saop-translate\";\r\n\r\nclass MyGradeData {\r\n sifraOcenObdobja: string;\r\n sifraZaposleni: string;\r\n fingerprint: string;\r\n formTitle: string;\r\n}\r\n\r\nexport class KEMyGradesGridOptions {\r\n showToolbar: boolean = true;\r\n showFilter: boolean = true;\r\n}\r\n\r\nexport class KEMyGradesGrid {\r\n private libName: string;\r\n private _gridOptions: KEMyGradesGridOptions;\r\n //\r\n private divId: string = \"#myGradesDiv\";\r\n private webGridId: string = \"#myGradesGrid\";\r\n private webGridAktivnaRowsBodyId: string = \"#myGradesGridBodyAjax\";\r\n public webGrid: SaopWebGrid;\r\n public keMyGradeView: KEMyGradeView;\r\n public formTranslationService: SaopTranslationService;\r\n private _searchValueId: string = \"#MyGradesSearchValue\";\r\n private _mainFormDiv: JQuery;\r\n private _searchValue: JQuery;\r\n\r\n constructor(libName: string, gridOptions: KEMyGradesGridOptions = null) {\r\n if (isUnDefined(gridOptions)) {\r\n gridOptions = new KEMyGradesGridOptions();\r\n }\r\n this._gridOptions = gridOptions;\r\n\r\n this.libName = libName; \r\n this.formTranslationService = new SaopTranslationService();\r\n } \r\n\r\n initView() {\r\n global.ConsoleLogDegug(\"KEMyGradesGrid.initView\");\r\n\r\n this._mainFormDiv = $(this.divId);\r\n\r\n // prevajanje\r\n this.setFormTerminologyList();\r\n\r\n // refresh active internal orders\r\n this.refreshMyGradesGridData();\r\n\r\n // init edit view\r\n this.initEditView();\r\n }\r\n\r\n private setFormTerminologyList() {\r\n let terminology = [\"Interno naročilo za kopiranje ni izbrano.\"];\r\n\r\n this.formTranslationService.setTranslationsList(terminology);\r\n } \r\n\r\n initEditView(): void {\r\n global.ConsoleLogDegug(\"KEMyGradesGrid.initEditView\");\r\n\r\n this.keMyGradeView = new KEMyGradeView(\"#keMyGradeView001\", this.libName + \".keMyGradeView\");\r\n this.keMyGradeView.fullScreen = true;\r\n //this.keMyGradeView.refreshData = this.refreshDataAfterEditView.bind(this);\r\n }\r\n\r\n // metoda se izvede po edit, add ali delete metodi v this.ndkInternalOrdersView\r\n refreshDataAfterEditView(sender: any): void { \r\n global.ConsoleLogDegug(\"KEMyGradesGrid.refreshDataAfterEditView\");\r\n\r\n // osvezi se tabela\r\n this.refreshMyGradesGridData();\r\n // klice se external metoda, da se lahko osvezijo se drugi podatki npr. right summary data\r\n this.afterRefreshDataAfterEditViewExternal(sender);\r\n }\r\n\r\n public afterRefreshDataAfterEditViewExternal(sender: any): void {\r\n global.ConsoleLogDegug(\"KEMyGradesGrid.afterRefreshDataAfterEditViewExternal\");\r\n }\r\n\r\n refreshMyGradesGridData(): void {\r\n global.ConsoleLogDegug(\"KEMyGradesGrid.refreshMyGradesGridData\");\r\n\r\n let _this = this;\r\n\r\n let saopServicesCore = new SaopServicesCore();\r\n saopServicesCore.afterDone = function (response) {\r\n _this.refreshGridData(response);\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action:\"KeGrades/GetMyGradesTable\" \r\n ,data:null\r\n ,type:\"GET\"\r\n }); \r\n }\r\n\r\n refreshGridData(htmlContent: string) {\r\n global.ConsoleLogDegug(\"KEMyGradesGrid.refreshGridData\");\r\n\r\n if ($(this.webGridId).length) {\r\n $(this.webGridAktivnaRowsBodyId).html(htmlContent);\r\n this.initWebGridListners();\r\n if (!isUnDefined(this._searchValue) && this._searchValue.length) {\r\n this.executeFilterSearch(this._searchValue.val().toString());\r\n }\r\n }\r\n else {\r\n $(this.divId).html(htmlContent);\r\n this.getWebGridToolbarAndInitWebGrid(); \r\n }\r\n }\r\n\r\n getWebGridToolbarAndInitWebGrid(): void {\r\n global.ConsoleLogDegug(\"KEMyGradesGrid.getWebGridToolbarAndInitWebGrid\");\r\n\r\n let _this = this;\r\n let params = { javascriptKnjiznica: _this.libName };\r\n\r\n let saopServicesCore = new SaopServicesCore();\r\n saopServicesCore.afterDone = function (response) {\r\n _this.initWebGrid(response);\r\n _this.initFilterControls(); \r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"KeGrades/GetTableToolbar\"\r\n , data: params\r\n , type: \"GET\"\r\n });\r\n }\r\n\r\n initWebGrid(toolbarTemplate: string = \"\") {\r\n global.ConsoleLogDegug(\"KEMyGradesGrid.initWebGrid\");\r\n\r\n let captionToolbar = $(this.webGridId).attr(\"caption-toolbar\");\r\n //\r\n this.webGrid = new SaopWebGrid(this.libName + \".webGrid\");\r\n let gridProperties: SaopWebGridProperties;\r\n let gridToolbar: SaopWebGridToolbar;\r\n let toolbarButtons: SaopWebGridToolbarButton[] = [];\r\n let dataTable: SaopWebDataTable;\r\n //\r\n if (this._gridOptions.showToolbar) {\r\n toolbarButtons.push({ id: \"\", caption: \"\", template: toolbarTemplate });\r\n gridToolbar = { id: \"saopWebGridTB1\", caption: captionToolbar, buttons: toolbarButtons };\r\n }\r\n\r\n dataTable = { enabled: true, ordering: true};\r\n\r\n gridProperties = {\r\n gridId: this.webGridId\r\n , togglePanel: { enabled: false }\r\n , toolbar: gridToolbar\r\n , dataTable: dataTable\r\n };\r\n //\r\n this.webGrid.init(gridProperties);\r\n\r\n this.initWebGridListners();\r\n\r\n $(this.divId).show();\r\n\r\n //this.setDashboardSpecificView();\r\n }\r\n\r\n initWebGridListners() {\r\n global.ConsoleLogDegug(\"KEMyGradesGrid.initWebGridListners\");\r\n\r\n let _this = this;\r\n\r\n // prikaz full screen ko klikne na vrstico\r\n $(\"body\").off(\"click\", this.webGridId + \" tr td:not(.td-action,.td-action-checkbox)\");\r\n $(\"body\").on(\"click\", this.webGridId + \" tr td:not(.td-action,.td-action-checkbox)\", function () {\r\n let selectedRow = $(this).closest(\"tr\")[0];\r\n let data = _this.getMyGradeDataAttribute(selectedRow);\r\n\r\n // barvanje oznacene vrstrice\r\n _this.webGrid.markSelectedRow(selectedRow);\r\n\r\n if (!isUnDefined(data.sifraOcenObdobja) && !isUnDefined(data.sifraZaposleni)) {\r\n _this.showRecordDetails({ sifraOcenObdobja: data.sifraOcenObdobja, sifraZaposleni: data.sifraZaposleni, fingerprint: data.fingerprint }, data.formTitle);\r\n }\r\n });\r\n }\r\n\r\n initFilterControls(): void {\r\n global.ConsoleLogDegug(\"KEMyGradesGrid.initFilterControls\");\r\n\r\n this._searchValue = this._mainFormDiv.find(this._searchValueId);\r\n let _this = this;\r\n\r\n this._searchValue.off(\"keyup\");\r\n this._searchValue.on(\"keyup\", function () {\r\n _this.executeFilterSearch($(this).val().toString());\r\n });\r\n }\r\n\r\n executeFilterSearch(searchVal: string): void {\r\n global.ConsoleLogDegug(\"KEMyGradesGrid.executeFilterSearch\");\r\n\r\n // tole ni delovalo: ko se je spremenilo leto, je se vedno filtriral stare podatke od prejsnjega leta\r\n //let oTable = this.webGrid.dataTable;\r\n //oTable.search(searchVal).draw();\r\n\r\n filterTableRows(searchVal, this.divId);\r\n }\r\n\r\n getMyGradeDataAttribute(element: HTMLElement): MyGradeData {\r\n global.ConsoleLogDegug(\"KEMyGradesGrid.getMyGradeDataAttribute\");\r\n\r\n let data = new MyGradeData();\r\n\r\n data.sifraOcenObdobja = element.getAttribute(\"data-sifraocenobdobja\");\r\n data.sifraZaposleni = element.getAttribute(\"data-sifrazaposleni\");\r\n data.fingerprint = element.getAttribute(\"data-fingerprint\");\r\n data.formTitle = element.getAttribute(\"data-formtitle\");\r\n\r\n return data;\r\n }\r\n\r\n showRecordDetails(detailsData: any, title: string): void {\r\n global.ConsoleLogDegug(\"KEMyGradesGrid.showRecordDetails\");\r\n\r\n this.keMyGradeView.showForm(detailsData, title);\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\nimport { KEMyGradesGrid } from \"./KEMyGrades-grid\";\r\n\r\nexport class KEMyGrades {\r\n private libName: string;\r\n\r\n private keMyGradesGrid: KEMyGradesGrid;\r\n \r\n constructor(libName: string) {\r\n this.libName = libName; \r\n\r\n this.keMyGradesGrid = new KEMyGradesGrid(this.libName + \".keMyGradesGrid\");\r\n this.keMyGradesGrid.afterRefreshDataAfterEditViewExternal = this.refreshDataAfterEditView.bind(this);\r\n } \r\n\r\n initView() {\r\n global.ConsoleLogDegug(\"KEMyGrades.initView\");\r\n\r\n this.keMyGradesGrid.initView();\r\n }\r\n\r\n refreshDataAfterEditView(): void { \r\n global.ConsoleLogDegug(\"KEMyGrades.refreshDataAfterEditView\");\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { global, getRelativeSiteURL, getSiteAbsoluteURL, isEmpty, isUnDefined } from \"../Common/saop-common\";\r\nimport { SaopViewForm } from \"../Core/saop-view-form\";\r\nimport { SaopUploadFiles } from \"../Components/saop-upload-files\";\r\nimport { SaopAttachmentList } from \"../Components/saop-attachment-list\";\r\nimport { OPNPotniNalogiGoggleMapsView } from \"../OPN/OPNPotniNalogiGoggleMaps-view\";\r\nimport { SaopMessageDlg, SaopMsgDlgButton } from '../Components/saop-message-dlg';\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { SaopFloatingLabel } from '../Components/saop-floating-label';\r\n\r\n\r\nexport class LIKVCakalnaVrstaComment extends SaopViewForm {\r\n private _formId: string;\r\n private _saopFloatingLabel: SaopFloatingLabel = new SaopFloatingLabel();\r\n\r\n\r\n constructor(viewId: string, libName: string = \"\") {\r\n super(viewId, libName);\r\n this.setDictionary();\r\n this.title = this.translationService.translate(\"Zavrni dokument\");\r\n this.fullTitle = this.title;\r\n this.addRecordEndpoint = \"\";\r\n this.editRecordEndpoint = \"LikvConfirmations/AddComment\";\r\n this.deleteRecordEndpoint = \"\";\r\n //\r\n this.afterViewShowSuccess = this.initView;\r\n this.afterSubmitSuccess = this.initView;\r\n //\r\n }\r\n\r\n setDictionary() {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaComment.setDictionary\");\r\n let dictionary: string[] = [\"Potrjevanje: prejeti račun\", \"Razlog zavrnitve je obvezen podatek.\",\"Zavrni dokument\"];\r\n this.setTerminologyList(dictionary);\r\n }\r\n\r\n\r\n public initView(): void {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaComment.initView\");\r\n this.LoadViewEvents();\r\n }\r\n\r\n public LoadViewEvents(): void {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaComment.LoadViewEvents\");\r\n let _viewDiv = $(this.id);\r\n if (_viewDiv.length == 0) { return; }\r\n\r\n let _this = this;\r\n this._formId = \"#mainLikvCakalnaVrstaComment\";\r\n\r\n $(\"#AddCommentView\").find(\"#btnDeny\").off(\"click\");\r\n $(\"#AddCommentView\").find(\"#btnDeny\").on('click', function (row) {\r\n _this.onDenyClick();\r\n });\r\n }\r\n\r\n public onDenyClick(): void {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaComment.onDenyClick\");\r\n let _komentar = $(\"#AddCommentView\").find(\"#Komentar\")[0] as HTMLInputElement;\r\n let _komentarText = _komentar.value;\r\n if (this.onValideateKomentar(_komentar)) {\r\n\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaComment.onDenyClick.submit\");\r\n this.CloseViewForm();\r\n $(\"#LikvConfirmationsEditView\").find(\"#desktopKomentar\").val(_komentarText);\r\n $(\"#LikvConfirmationsEditView\").find(\"#mobileKomentar\").val(_komentarText);\r\n $(\"#LikvConfirmationsEditView\").find(\"#Status\").val(1);\r\n $(\"#LikvConfirmationsEditView\").submit();\r\n }\r\n }\r\n\r\n public onValideateKomentar(komentar: HTMLInputElement): boolean {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaComment.onValideateKomentar\");\r\n\r\n let _komentarText = komentar.value;\r\n if (_komentarText.length == 0) {\r\n let _msgRequred = this.translationService.translate(\"Razlog zavrnitve je obvezen podatek.\");\r\n this._saopFloatingLabel.setValidationError(komentar, _msgRequred);\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n //\r\n}\r\n\r\n","import { global, getRelativeSiteURL, getSiteAbsoluteURL, isEmpty, isUnDefined } from \"../Common/saop-common\";\r\nimport { SaopViewForm } from \"../Core/saop-view-form\";\r\nimport { SaopUploadFiles } from \"../Components/saop-upload-files\";\r\nimport { SaopAttachmentList } from \"../Components/saop-attachment-list\";\r\nimport { OPNPotniNalogiGoggleMapsView } from \"../OPN/OPNPotniNalogiGoggleMaps-view\";\r\nimport { SaopMessageDlg, SaopMsgDlgButton } from '../Components/saop-message-dlg';\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { SaopFloatingLabel } from '../Components/saop-floating-label';\r\n\r\n\r\nexport class LIKVCakalnaVrstaCommentConfirm extends SaopViewForm {\r\n private _formId:string;\r\n private _saopFloatingLabel:SaopFloatingLabel = new SaopFloatingLabel();\r\n\r\n\r\n constructor(viewId:string,libName:string = \"\"){\r\n super(viewId,libName);\r\n this.setDictionary(); \r\n this.title = this.translationService.translate(\"Potrdi dokument\");\r\n this.fullTitle = this.title;\r\n this.addRecordEndpoint = \"\";\r\n this.editRecordEndpoint = \"LikvConfirmations/AddCommentConfirm\";\r\n this.deleteRecordEndpoint = \"\"; \r\n //\r\n this.afterViewShowSuccess = this.initView;\r\n this.afterSubmitSuccess = this.initView;\r\n //\r\n }\r\n\r\n setDictionary(){\r\n let dictionary:string[] = [\"Potrjevanje: prejeti račun\",\"Razlog zavrnitve je obvezen podatek.\",\"Potrdi dokument\"];\r\n this.setTerminologyList(dictionary);\r\n } \r\n\r\n\r\n public initView():void{\r\n this.LoadViewEvents();\r\n }\r\n\r\n public LoadViewEvents ():void{\r\n let _viewDiv = $(this.id);\r\n if (_viewDiv.length == 0) {return;}\r\n\r\n let _this = this;\r\n this._formId = \"#mainLikvCakalnaVrstaCommentConfirm\";\r\n\r\n $(\"#AddCommentConfirmView\").find(\"#btnConfirm\").off(\"click\");\r\n $(\"#AddCommentConfirmView\").find(\"#btnConfirm\").on('click', function(row){\r\n _this.onConfirmClick();\r\n }); \r\n }\r\n\r\n public onConfirmClick (): void{\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaCommentConfirm.onConfirmClick\"); \r\n let _komentar = $(\"#AddCommentConfirmView\").find(\"#Komentar\")[0] as HTMLInputElement;\r\n let _komentarText = _komentar.value;\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaComment.onConfirmClick.submit\"); \r\n this.CloseViewForm();\r\n $(\"#LikvConfirmationsEditView\").find(\"#desktopKomentar\").val(_komentarText);\r\n $(\"#LikvConfirmationsEditView\").find(\"#mobileKomentar\").val(_komentarText); \r\n $(\"#LikvConfirmationsEditView\").find(\"#Status\").val(0);\r\n $(\"#LikvConfirmationsEditView\").submit(); \r\n }\r\n //\r\n}\r\n\r\n","import { global, setModalFormZIndex, getRelativeSiteURL, getSiteAbsoluteURL, isUnDefined } from \"../Common/saop-common\";\r\nimport { SaopWebGrid,SaopWebGridProperties,SaopWebGridToolbar,SaopWebGridToolbarButton,SaopWebDataTable} from \"../Components/saop-grid\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { LIKVCakalnaVrstaView } from \"../LIKV/LIKVCakalnaVrsta-view\";\r\nimport { SaopWfAction } from \"../Core/saop-view-form\";\r\nimport { LIKVCakalnaVrstaComment } from \"../LIKV/LIKVCakalnaVrsta-Comment\";\r\nimport { LIKVCakalnaVrstaCommentConfirm } from \"../LIKV/LIKVCakalnaVrsta-CommentConfirm\";\r\nimport { SaopMultiselect } from \"../Components/saop-multiselect\";\r\nimport { SaopPopover } from \"../Components/saop-popover\";\r\n\r\nexport class LIKVCakalnaVrstaGrid {\r\n private libName: string;\r\n private _saopServicesCore: SaopServicesCore;\r\n private _mainFormDiv: JQuery;\r\n private _searchValue: JQuery;\r\n private _searchValue1: JQuery;\r\n private _selectedRowNo: number;\r\n private _prevIDVrste: string;\r\n private _prevID: string; \r\n private _nextIDVrste: string;\r\n private _nextID: string;\r\n private _likvCakalnaVrstaComment: LIKVCakalnaVrstaComment;\r\n private _likvCakalnaVrstaCommentConfirm: LIKVCakalnaVrstaCommentConfirm;\r\n //\r\n public webGrid1: SaopWebGrid;\r\n public _LIKVCakalnaVrstaView: LIKVCakalnaVrstaView;\r\n private _vrstaDokumenta: SaopMultiselect;\r\n private _vrstaDokumentaMobile: SaopMultiselect;\r\n private _vrstaDokumentaDivId: string;\r\n public _dashboard: boolean = false;\r\n private _saopPopoverFilter: SaopPopover;\r\n private _izbranaVrstaDokumenta: string;\r\n\r\n constructor(libName: string) {\r\n this.libName = libName;\r\n this._saopServicesCore = new SaopServicesCore();\r\n //\r\n this._LIKVCakalnaVrstaView = new LIKVCakalnaVrstaView(\"#LIKVCakalnaVrstaView001\", this.libName + \"._LIKVCakalnaVrstaView\");\r\n this._LIKVCakalnaVrstaView.refreshData = this.onLIKVidDocumentComplete.bind(this);\r\n this._LIKVCakalnaVrstaView.fullScreen = true;\r\n this._LIKVCakalnaVrstaView.MoveToNext = this.MoveToNextExt.bind(this);\r\n this._LIKVCakalnaVrstaView.MoveToPrevious = this.MoveToPreviousExt.bind(this);\r\n this._LIKVCakalnaVrstaView.ConfirmAndMoveToNext = this.ConfirmAndMoveToNextExt.bind(this);\r\n this._LIKVCakalnaVrstaView.DenyAndMoveToNext = this.DenyAndMoveToNextExt.bind(this);\r\n this._likvCakalnaVrstaComment = new LIKVCakalnaVrstaComment(\"#LIKVCakalnaVrstaView002\", libName);\r\n this._likvCakalnaVrstaCommentConfirm = new LIKVCakalnaVrstaCommentConfirm(\"#LIKVCakalnaVrstaView003\", libName);\r\n // this._likvCakalnaVrstaComment.onDenyClick = this.onDenyClick.bind(this);\r\n // this._vrstaDokumentaDivId = \"#VrstaDokumentaDiv\"; \r\n this._saopPopoverFilter = new SaopPopover();\r\n this._saopPopoverFilter.afterPopoverShow = this.afterPopoverMobileFilterShow.bind(this);\r\n }\r\n\r\n initView() {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGrid.initView\");\r\n this._nextIDVrste = '';\r\n this._nextID = '';\r\n this._mainFormDiv = $(\"#LIKVCakalnaVrstaGridBrowseForm\");\r\n this.initWebGrid1();\r\n this.initWebGrid1Listners();\r\n this._searchValue = this._mainFormDiv.find(\"#SearchValue\");\r\n this._searchValue1 = this._mainFormDiv.find(\"#SearchValue1\");\r\n this.initFilterControls();\r\n // this.initVrstaDokumenta(); \r\n this._saopPopoverFilter.bindPopoverEvents();\r\n this.setGlobalConfirmDenyButtonsEnableDisable();\r\n this._mainFormDiv.show();\r\n this.setMobileView();\r\n this.setCheckboxEnabledDisabled();\r\n this.editRowFromDashboard();\r\n }\r\n\r\n initWebGrid1() {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGrid.\");\r\n let wgId = \"#LIKVCakalnaVrstaGrid\";\r\n let captionToolbar = $(wgId).attr(\"caption-toolbar\");\r\n let toolbarItemsTemplateId = $(wgId).attr(\"toolbar-items-templateId\");\r\n //\r\n this.webGrid1 = new SaopWebGrid(this.libName + \".webGrid1\");\r\n let gridProperties: SaopWebGridProperties;\r\n let gridToolbar: SaopWebGridToolbar;\r\n let toolbarButtons: SaopWebGridToolbarButton[] = [];\r\n let dataTable: SaopWebDataTable;\r\n //\r\n if (!this._dashboard) {\r\n gridToolbar = { id: \"saopWebGridTB1\", caption: captionToolbar, buttons: toolbarButtons, itemsTemplateId: toolbarItemsTemplateId };\r\n\r\n dataTable = { enabled: true, columnDefsSettings: [{ targets: 0, checkboxes: { selectRow: true } }],colSettings:true };\r\n }\r\n gridProperties = {\r\n gridId: wgId\r\n , togglePanel: { enabled: false }\r\n , toolbar: gridToolbar\r\n , dataTable: dataTable\r\n };\r\n //\r\n this.webGrid1.init(gridProperties);\r\n if (this._dashboard) {\r\n $(wgId + \"_wrapper\").addClass(\"saop-table-dashboard saop-table-dashboard-odsotnost\");\r\n $(wgId + \"_wrapper\").css('overflow-x', 'hidden');\r\n }\r\n else {\r\n $(wgId + \"_wrapper\").css('max-height', 'calc(100vh - 350px)');\r\n }\r\n }\r\n\r\n public MoveToNextExt(close: boolean = false): void {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGrid.MoveToNextExt\");\r\n\r\n let _idVrste = this._nextIDVrste;\r\n let _id = this._nextID\r\n this.StorePrevAndNextRowData(this._nextIDVrste, this._nextID);\r\n let _row = $(\"tr[data-IDVrste='\" + _idVrste + \"']\").filter(\"tr[data-ID='\" + _id + \"']\");\r\n\r\n if (_row.length > 0) {\r\n this._selectedRowNo = _row.index(); // here we store the ID of the current row \r\n //\r\n let _idVrste = _row.attr(\"data-idvrste\");\r\n let _id = _row.attr(\"data-id\");\r\n let _vrstaDokumenta = _row.attr(\"data-vrstadokumenta\");\r\n let _dokument = _row.attr(\"data-dokument\");\r\n //\r\n this.webGrid1.markSelectedRow((_row)[0]);\r\n this.editRecord(_vrstaDokumenta, _dokument, _idVrste, _id);\r\n } else if (close) {\r\n this._LIKVCakalnaVrstaView.CloseViewForm();\r\n }\r\n }\r\n\r\n public MoveToPreviousExt(): void {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGrid.\");\r\n\r\n let _idVrste = this._prevIDVrste;\r\n let _id = this._prevID\r\n this.StorePrevAndNextRowData(this._prevIDVrste, this._prevID);\r\n\r\n let _row = $(\"tr[data-IDVrste='\" + _idVrste + \"']\").filter(\"tr[data-ID='\" + _id + \"']\");\r\n\r\n if (_row.length > 0) {\r\n this._selectedRowNo = _row.index(); // here we store the ID of the current row \r\n //\r\n let _idVrste = _row.attr(\"data-idvrste\");\r\n let _id = _row.attr(\"data-id\");\r\n let _vrstaDokumenta = _row.attr(\"data-vrstadokumenta\");\r\n let _dokument = _row.attr(\"data-dokument\");\r\n //\r\n this.webGrid1.markSelectedRow((_row)[0]);\r\n this.editRecord(_vrstaDokumenta, _dokument, _idVrste, _id);\r\n } \r\n }\r\n\r\n public ConfirmAndMoveToNextExt(idVrste: string, id: string, komentar: string, idAkcije: string): void {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGrid.ConfirmAndMoveToNextExt\");\r\n this.confirmRecordAndNext(idVrste, id, komentar, idAkcije);\r\n }\r\n\r\n public DenyAndMoveToNextExt(idVrste: string, id: string, komentar: string, idAkcije: string): void {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGrid.\");\r\n this._likvCakalnaVrstaComment.onDenyClick = this.onDenyAndNext.bind(this);\r\n let _result = this._likvCakalnaVrstaComment.editRecord({});\r\n }\r\n\r\n initWebGrid1Listners() {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGrid.initWebGrid1Listners\");\r\n let _this = this;\r\n if (!this._dashboard) {\r\n $(\"body\").off(\"click\", \"#LIKVCakalnaVrstaGrid td:not(.td-action)\");\r\n $(\"body\").on(\"click\", \"#LIKVCakalnaVrstaGrid td:not(.td-action)\", function () {\r\n let _i = $(this).closest('tr').index();\r\n _this._selectedRowNo = _i; // here we store the ID of the current row\r\n // let _rows = $('#LIKVCakalnaVrstaGrid > tbody > tr');\r\n // let _row = $('#LIKVCakalnaVrstaGrid > tbody > tr').eq(_i);\r\n // let _idVrsteTest = _row[0].attributes[1].nodeValue;\r\n var data = $(this).closest(\"tr\");\r\n let _idVrste = data.attr(\"data-IDVrste\");\r\n let _id = data.attr(\"data-ID\");\r\n let _vrstaDokumenta = data.attr(\"data-vrstadokumenta\");\r\n let _dokument = data.attr(\"data-dokument\");\r\n\r\n if (!isUnDefined(_idVrste) && !isUnDefined(_id)) {\r\n // barvanje oznacene vrstrice\r\n _this.webGrid1.markSelectedRow((data)[0]);\r\n\r\n _this.editRecord(_vrstaDokumenta, _dokument, _idVrste, _id);\r\n }\r\n });\r\n\r\n $(\"body\").off(\"change\", \"#LIKVCakalnaVrstaGrid tr th.dt-checkboxes-select-all input[type='checkbox']\");\r\n $(\"body\").on(\"change\", \"#LIKVCakalnaVrstaGrid tr th.dt-checkboxes-select-all input[type='checkbox']\", function () {\r\n _this.setGlobalConfirmDenyButtonsEnableDisable();\r\n });\r\n\r\n $(\"body\").off(\"change\", \"#LIKVCakalnaVrstaGrid tr td.dt-checkboxes-cell input[type='checkbox'].dt-checkboxes\");\r\n $(\"body\").on(\"change\", \"#LIKVCakalnaVrstaGrid tr td.dt-checkboxes-cell input[type='checkbox'].dt-checkboxes\", function () {\r\n _this.setGlobalConfirmDenyButtonsEnableDisable();\r\n });\r\n }\r\n\r\n if (this._dashboard) {\r\n $(\"body\").off(\"click\", \"#LIKVCakalnaVrstaGrid td:not(.td-action)\");\r\n $(\"body\").on(\"click\", \"#LIKVCakalnaVrstaGrid td:not(.td-action)\", function () {\r\n let _i = $(this).closest('tr').index();\r\n _this._selectedRowNo = _i; // here we store the ID of the current row\r\n //poberemo podatke\r\n var data = $(this).closest(\"tr\");\r\n let _idVrste = data.attr(\"data-IDVrste\");\r\n let _id = data.attr(\"data-ID\");\r\n\r\n if (!isUnDefined(_idVrste) && !isUnDefined(_id)) {\r\n //naredimo redirect na kontroler s parametri idvrste in id\r\n let _applicationCode = this._izbranaVrstaDokumenta;\r\n let _year = 0\r\n let _controller = \"LikvConfirmations\";\r\n let _action = \"Index\";\r\n let _relativeURL = _controller + \"/\" + _action + \"?year =\" + _year + \"&applicationCode\" + _applicationCode + \"&idVrste=\" + _idVrste + \"&id=\" + _id;\r\n let _url = getSiteAbsoluteURL(_relativeURL);\r\n window.location.href = _url;\r\n //window.location.href = \"../\"+_controller+\"/\"+_action+\"?year =\" + _year + \"&applicationCode\" + _applicationCode + \"&idVrste=\"+_idVrste+\"&id=\"+_id;\r\n }\r\n });\r\n }\r\n\r\n $(\".LIKVCakalnaVrstaGrid_deny\").off(\"click\");\r\n $(\".LIKVCakalnaVrstaGrid_deny\").on('click', function (row) {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGrid_deny.click\");\r\n //$('#detailsOPNPotniNalogiForm').remove();\r\n let _i = $(this).closest('tr').index();\r\n if (_this._selectedRowNo == null)\r\n _this._selectedRowNo = _i; // here we store the ID of the current row \r\n let _btnEdit = row.currentTarget;\r\n let btnEnabled = _btnEdit.getAttribute(\"data-enabled\");\r\n if (btnEnabled.toString().toLowerCase() == \"true\") {\r\n _this._likvCakalnaVrstaComment.onDenyClick = _this.onDenyClick.bind(_this);\r\n let _result = _this._likvCakalnaVrstaComment.editRecord({});\r\n // let IDVrste = _btnEdit.getAttribute(\"data-IDVrste\");\r\n // let ID = _btnEdit.getAttribute(\"data-ID\");\r\n // _this.denyRecord(IDVrste,ID);\r\n }\r\n });\r\n\r\n $(\".LIKVCakalnaVrstaGrid_confirm\").off(\"click\");\r\n $(\".LIKVCakalnaVrstaGrid_confirm\").on('click', function (row) {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGrid_confirm.click\");\r\n //$('#detailsOPNPotniNalogiForm').remove();\r\n let _i = $(this).closest('tr').index();\r\n if (_this._selectedRowNo == null)\r\n _this._selectedRowNo = _i; // here we store the ID of the current row \r\n let _btnDelete = row.currentTarget;\r\n let btnEnabled = _btnDelete.getAttribute(\"data-enabled\");\r\n if (btnEnabled.toString().toLowerCase() == \"true\") {\r\n let IDVrste = _btnDelete.getAttribute(\"data-IDVrste\");\r\n let ID = _btnDelete.getAttribute(\"data-ID\");\r\n let komentar = \"\";\r\n let IDAkcije = \"-1\";\r\n _this.confirmRecord(IDVrste, ID, komentar, IDAkcije);\r\n }\r\n });\r\n\r\n if (!this._dashboard) {\r\n let _btnConfirmGlobal = this._mainFormDiv.find(\"#btnConfirmGlobal\");\r\n _btnConfirmGlobal.off(\"click\");\r\n _btnConfirmGlobal.on('click', function (row) {\r\n global.ConsoleLogDegug(\"btnConfirmGlobal.click\");\r\n // let rows_selected = _this.webGrid1.getSelectedRows();\r\n // rows_selected.forEach(_el => {\r\n // //console.log(_el);\r\n // let _row = $('#LIKVCakalnaVrstaGrid > tbody > tr').eq(Number(_el)); // here we extrapolate the row data of selected index\r\n // if (_row.length > 0) {\r\n // //\r\n // let _idVrste = _row.attr(\"data-idvrste\");\r\n // let _id = _row.attr(\"data-id\"); \r\n // let _idAkcije = _row.attr(\"data-idAkcije\"); \r\n // //\r\n // //console.log(_idVrste);\r\n // _this.confirmRecord(_idVrste, _id, _idAkcije);\r\n // }\r\n\r\n // });\r\n _this._likvCakalnaVrstaCommentConfirm.onConfirmClick = _this.onConfirmGlobalClick.bind(_this);\r\n let _result = _this._likvCakalnaVrstaCommentConfirm.editRecord({});\r\n });\r\n\r\n let _btnDenyGlobal = this._mainFormDiv.find(\"#btnDenyGlobal\");\r\n _btnDenyGlobal.off(\"click\");\r\n _btnDenyGlobal.on('click', function (row) {\r\n global.ConsoleLogDegug(\"btnDenyGlobal.click\");\r\n _this._likvCakalnaVrstaComment.onDenyClick = _this.onDenyGlobalClick.bind(_this);\r\n let _result = _this._likvCakalnaVrstaComment.editRecord({});\r\n });\r\n\r\n let _btnSwitchSignees = this._mainFormDiv.find(\"#btnSwitchSignees\");\r\n _btnSwitchSignees.off(\"click\");\r\n _btnSwitchSignees.on('click', function (row) {\r\n global.ConsoleLogDegug(\"btnSwitchSignees.click\");\r\n _this.switchSignees();\r\n });\r\n\r\n let _applicationFilter = this._mainFormDiv.find(\"#ApplicationFilter\");\r\n if (_applicationFilter.length > 0) {\r\n _applicationFilter.off(\"change\");\r\n _applicationFilter.on(\"change\", _this.onApplicationFilterChange.bind(_this));\r\n }\r\n }\r\n //\r\n }\r\n\r\n confirmRecord(idVrste: string, id: string, komentar: string, idAkcije: string, closeCommentView: boolean = false): void {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGrid.confirmRecord\");\r\n let _this = this;\r\n //\r\n let _idVrste = idVrste;\r\n let _id = id;\r\n let _confirmationStatus = 0;\r\n let _komentar = komentar;\r\n let _idAkcije = idAkcije;\r\n //\r\n let _data = { idVrste: _idVrste, id: _id, confirmationStatus: _confirmationStatus, komentar: _komentar, idAkcije: _idAkcije, caller:\"Grid\" };\r\n //\r\n let _urlAction = \"\";\r\n _urlAction = \"LikvConfirmations/SetConfirmationstatusGrid\";\r\n //\r\n let _saopServicesCore = new SaopServicesCore();\r\n _saopServicesCore.afterDone = function (response) {\r\n if (response.alertMessage) {\r\n alertify.message(response.alertMessage);\r\n }\r\n\r\n if (response.viewContent) {\r\n $(\"#messageBannerGrid\").html(response.viewContent);\r\n }\r\n if (closeCommentView)\r\n _this._likvCakalnaVrstaCommentConfirm.CloseViewForm();\r\n\r\n _this.refreshGridData(0);\r\n\r\n };\r\n _saopServicesCore.ExecuteAction({\r\n action: _urlAction\r\n , data: _data\r\n , type: \"POST\"\r\n });\r\n }\r\n\r\n confirmRecordAndNext(idVrste: string, id: string, komentar: string, idAkcije: string): void {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGrid.confirmRecordAndNext\");\r\n let _this = this;\r\n //\r\n let _idVrste = idVrste;\r\n let _id = id;\r\n let _confirmationStatus = 0;\r\n let _komentar = komentar;\r\n let _idAkcije = idAkcije;\r\n\r\n let _data = { idVrste: _idVrste, id: _id, confirmationStatus: _confirmationStatus, komentar: _komentar, idAkcije: _idAkcije, caller:\"Edit\" };\r\n //\r\n let _urlAction = \"\";\r\n _urlAction = \"LikvConfirmations/SetConfirmationstatusGrid\";\r\n //\r\n let _saopServicesCore = new SaopServicesCore();\r\n _saopServicesCore.afterDone = function (response) {\r\n if (response.alertMessage) {\r\n alertify.message(response.alertMessage);\r\n }\r\n\r\n if (response.viewContent) {\r\n $(\"#messageBannerEdit\").html(response.viewContent);\r\n }\r\n\r\n if (response.success == true)\r\n _this.MoveToNextExt(true);\r\n\r\n _this.refreshGridData(0);\r\n\r\n };\r\n _saopServicesCore.ExecuteAction({\r\n action: _urlAction\r\n , data: _data\r\n , type: \"POST\"\r\n });\r\n }\r\n\r\n denyRecord(idVrste: string, id: string, komentar: string, idAkcije: string): void {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGrid.denyRecord\");\r\n let _this = this;\r\n //\r\n let _idVrste = idVrste;\r\n let _id = id;\r\n let _confirmationStatus = 1;\r\n let _komentar = komentar;\r\n let _idAkcije = idAkcije;\r\n //\r\n let _data = { idVrste: _idVrste, id: _id, confirmationStatus: _confirmationStatus, komentar: _komentar, idAkcije: _idAkcije, caller:\"Grid\" };\r\n //\r\n let _urlAction = \"\";\r\n _urlAction = \"LikvConfirmations/SetConfirmationstatusGrid\";\r\n //\r\n let _saopServicesCore = new SaopServicesCore();\r\n _saopServicesCore.afterDone = function (response) {\r\n if (response.alertMessage) {\r\n alertify.message(response.alertMessage);\r\n }\r\n\r\n if (response.viewContent) {\r\n $(\"#messageBannerGrid\").html(response.viewContent);\r\n }\r\n\r\n _this._likvCakalnaVrstaComment.CloseViewForm();\r\n\r\n _this.refreshGridData(0);\r\n\r\n };\r\n _saopServicesCore.ExecuteAction({\r\n action: _urlAction\r\n , data: _data\r\n , type: \"POST\"\r\n });\r\n }\r\n\r\n onDenyAndNext() {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGrid.onDenyAndNext\");\r\n let _idVrsteElement = $('#LikvConfirmationsEditView').find(\"#IDVrste\");\r\n let _idVrste = _idVrsteElement.val().toString();\r\n let _idElement = $('#LikvConfirmationsEditView').find(\"#ID\");;\r\n let _id = _idElement.val().toString();\r\n let _idAkcije = \"-1\";\r\n\r\n let _komentar = $(\"#AddCommentView\").find(\"#Komentar\")[0] as HTMLInputElement;\r\n if (this._likvCakalnaVrstaComment.onValideateKomentar(_komentar)) {\r\n this.denyRecordAndNext(_idVrste, _id, _komentar.value, _idAkcije);\r\n }\r\n\r\n }\r\n\r\n denyRecordAndNext(idVrste: string, id: string, komentar: string, idAkcije: string): void {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGrid.denyRecordAndNext\");\r\n let _this = this;\r\n //\r\n let _idVrste = idVrste;\r\n let _id = id;\r\n let _confirmationStatus = 1;\r\n let _komentar = komentar;\r\n let _idAkcije = idAkcije;\r\n\r\n let _data = { idVrste: _idVrste, id: _id, confirmationStatus: _confirmationStatus, komentar: _komentar, idAkcije: _idAkcije, caller:\"Edit\" };\r\n //\r\n let _urlAction = \"\";\r\n _urlAction = \"LikvConfirmations/SetConfirmationstatusGrid\";\r\n //\r\n let _saopServicesCore = new SaopServicesCore();\r\n _saopServicesCore.afterDone = function (response) {\r\n if (response.alertMessage) {\r\n alertify.message(response.alertMessage);\r\n }\r\n\r\n if (response.viewContent) {\r\n $(\"#messageBannerEdit\").html(response.viewContent);\r\n }\r\n\r\n _this._likvCakalnaVrstaComment.CloseViewForm();\r\n\r\n if (response.success == true)\r\n _this.MoveToNextExt(true);\r\n\r\n _this.refreshGridData(0);\r\n\r\n };\r\n _saopServicesCore.ExecuteAction({\r\n action: _urlAction\r\n , data: _data\r\n , type: \"POST\"\r\n });\r\n }\r\n\r\n refreshData(htmlContent: string) {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGrid.refreshData\");\r\n this.webGrid1.replaceGridRows(htmlContent);\r\n this.initWebGrid1Listners();\r\n this.setGlobalConfirmDenyButtonsEnableDisable();\r\n this.setCheckboxEnabledDisabled();\r\n }\r\n\r\n refreshGridData(year: number): void {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGrid.refreshGridData\");\r\n\r\n // let applicationCode = (this._vrstaDokumenta.selectedCB.val().toString());\r\n let applicationCode = this._izbranaVrstaDokumenta;\r\n\r\n let _this = this;\r\n let saopServicesCore = new SaopServicesCore();\r\n let params = { year: year, applicationCode: applicationCode };\r\n\r\n saopServicesCore.afterDone = function (response) {\r\n _this.refreshData(response);\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"LikvConfirmations/Index\"\r\n , data: params\r\n , type: \"GET\"\r\n });\r\n }\r\n\r\n editRecord(_vrstaDokumenta: string, _dokument: string, _idVrste: string, _id: string) {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGrid.editRecord\");\r\n //pridobimo id-je naslednje vrstice\r\n this.StorePrevAndNextRowData(_idVrste, _id);\r\n let _fullTitle = this._LIKVCakalnaVrstaView.translationService.translate(\"Potrjevanje\") + \": \" + _vrstaDokumenta + \" \" + _dokument;\r\n this._LIKVCakalnaVrstaView.fullTitle = _fullTitle;\r\n this._LIKVCakalnaVrstaView.showViewForm(SaopWfAction.wfaEditRecord, { queueId: _idVrste, threeId: _id, fullView: true });\r\n }\r\n\r\n initFilterControls(): void {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGrid.initFilterControls\");\r\n let _this = this;\r\n this._searchValue.keyup(function () {\r\n let oTable = _this.webGrid1.dataTable;\r\n oTable.search($(this).val().toString()).draw();\r\n });\r\n this._searchValue1.keyup(function () {\r\n let oTable = _this.webGrid1.dataTable;\r\n oTable.search($(this).val().toString()).draw();\r\n });\r\n }\r\n\r\n onDenyClick() {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGrid.onDenyClick\");\r\n let _row = $('#LIKVCakalnaVrstaGrid > tbody > tr').eq(this._selectedRowNo);\r\n if (_row.length > 0) {\r\n let _komentar = $(\"#AddCommentView\").find(\"#Komentar\")[0] as HTMLInputElement;\r\n if (this._likvCakalnaVrstaComment.onValideateKomentar(_komentar)) {\r\n let _idVrste = _row.attr(\"data-idvrste\");\r\n let _id = _row.attr(\"data-id\");\r\n let _idAkcije = \"-1\";\r\n this.denyRecord(_idVrste, _id, _komentar.value, _idAkcije);\r\n }\r\n }\r\n }\r\n\r\n onConfirmGlobalClick() {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGrid.onConfirmGlobalClick\");\r\n let rows_selected = this.webGrid1.getSelectedRowsV2();\r\n rows_selected.forEach(_el => {\r\n //console.log(_el);\r\n let _row = $('#LIKVCakalnaVrstaGrid > tbody > tr').eq(Number(_el)); // here we extrapolate the row data of selected index\r\n if (_row.length > 0) {\r\n //\r\n let _idVrste = _row.attr(\"data-idvrste\");\r\n let _id = _row.attr(\"data-id\");\r\n let _komentar = $(\"#AddCommentConfirmView\").find(\"#Komentar\").val();\r\n let _idAkcije = _row.attr(\"data-idAkcije\");\r\n //\r\n //console.log(_idVrste);\r\n this.confirmRecord(_idVrste, _id, _komentar.toString(), _idAkcije, true);\r\n }\r\n\r\n });\r\n }\r\n\r\n onDenyGlobalClick() {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGrid.onDenyGlobalClick\");\r\n let rows_selected = this.webGrid1.getSelectedRowsV2();\r\n rows_selected.forEach(_el => {\r\n //console.log(_el);\r\n let _row = $('#LIKVCakalnaVrstaGrid > tbody > tr').eq(Number(_el)); // here we extrapolate the row data of selected index\r\n if (_row.length > 0) {\r\n let _komentar = $(\"#AddCommentView\").find(\"#Komentar\")[0] as HTMLInputElement;\r\n if (this._likvCakalnaVrstaComment.onValideateKomentar(_komentar)) {\r\n let _idVrste = _row.attr(\"data-idvrste\");\r\n let _id = _row.attr(\"data-id\");\r\n let _idAkcije = _row.attr(\"data-idAkcije\");\r\n this.denyRecord(_idVrste, _id, _komentar.value, _idAkcije);\r\n }\r\n }\r\n\r\n });\r\n }\r\n\r\n onApplicationFilterChange(e: any): void {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGrid.onApplicationFilterChange\");\r\n let _applicationFilter = this._mainFormDiv.find(\"#ApplicationFilter\");\r\n if (_applicationFilter.length > 0) {\r\n this._izbranaVrstaDokumenta = _applicationFilter.val() as string;\r\n if (this._izbranaVrstaDokumenta == \"?\")\r\n this._izbranaVrstaDokumenta = \"\";\r\n }\r\n this.refreshGridData(0);\r\n }\r\n\r\n // initVrstaDokumenta(): void {\r\n // global.ConsoleLogDegug(\"LIKVCakalnaVrstaView.initVrstaDokumenta\");\r\n\r\n // this._vrstaDokumenta = new SaopMultiselect();\r\n // this._vrstaDokumenta.afterChangeCommonEvent = this.filterVrstaDokumenta.bind(this);\r\n // // init za metodo \"afterChangeCommonEvent\", da se že v \"_vrstaDokumenta.init\" metodi sprozi filterVrstaDokumenta\r\n // this._vrstaDokumenta.init(\"#VrstaDokumentaFilter\", \"Vrsta dokumenta\");\r\n // // prikazemo select div\r\n // $(this._vrstaDokumentaDivId).show();\r\n // }\r\n\r\n filterVrstaDokumenta(element: any) {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaView.filterVrstaDokumenta\");\r\n\r\n this.refreshGridData(0);\r\n }\r\n\r\n afterPopoverMobileFilterShow(element: HTMLElement): void {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaView.afterPopoverMobileFilterShow\");\r\n\r\n let atrContent = element.getAttribute(\"data-popover-content\");\r\n // preverimo če je popup likv filter\r\n if (atrContent === \"#popOverLikvFilter\") {\r\n\r\n // this._vrstaDokumentaMobile = new SaopMultiselect();\r\n // this._vrstaDokumentaMobile.init(\"div.popover.show #VrstaDokumentaFilterMobile\", \"Vrsta dokumenta\");\r\n // // metoda this.setSelectSkupinaMobileFilterValues se mora izvesti pred this._selectSkupinaMobileFilter.afterChangeCommonEvent\r\n // // da se se ne izvede metoda this.selectSkupinaMobileFilterChanged, ker se v this.setSelectSkupinaMobileFilterValues\r\n // // nastavijo vrednosti v klasu SaopMultiselect in posledicno se klice tudi afterChangeCommonEvent event\r\n // this.setSelectVDMobileFilterValues(); \r\n // this._vrstaDokumentaMobile.afterChangeCommonEvent = this.filterVrstaDokumentaMobileChanged.bind(this);\r\n\r\n let _ApplicationFilterMobile = $('div.popover.show').find('#ApplicationFilterMobile');\r\n if (_ApplicationFilterMobile.length > 0) {\r\n _ApplicationFilterMobile.off(\"change\");\r\n _ApplicationFilterMobile.on(\"change\", this.onApplicationFilterMobileChange.bind(this));\r\n }\r\n _ApplicationFilterMobile.val(this._izbranaVrstaDokumenta).change(); //prop('selected', true);\r\n\r\n // dodamo custom css za filter\r\n let filterPopoverDiv = $(\"div.popover.show\");\r\n if (filterPopoverDiv != null) {\r\n let customCss = \"calendar-filter\";\r\n if (!filterPopoverDiv.hasClass(customCss)) {\r\n filterPopoverDiv.addClass(customCss);\r\n }\r\n }\r\n\r\n // dodamo custom css za filter\r\n let filterPopoverBodyDiv = $(\"div.popover.show\").find(\"div.popover-body\");\r\n if (filterPopoverBodyDiv != null) {\r\n let customCss = \"calendar-filter-body\";\r\n if (!filterPopoverBodyDiv.hasClass(customCss)) {\r\n filterPopoverBodyDiv.addClass(customCss);\r\n }\r\n }\r\n\r\n // prikazi filter okno\r\n let filterBody = $(\"div.popover.show\").find(\"#popOverLikvFilterBody\");\r\n filterBody.show();\r\n }\r\n }\r\n\r\n setSelectVDMobileFilterValues() {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaView.setSelectVDMobileFilterValues\");\r\n // preberemo vrednosti VD iz desktop Category element\r\n let izbranaVrstaDokumenta = (this._vrstaDokumenta.selectedCB.val());\r\n this._vrstaDokumentaMobile.setSelectValues(izbranaVrstaDokumenta);\r\n }\r\n\r\n filterVrstaDokumentaMobileChanged(element: any) {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaView.filterVrstaDokumenta\");\r\n\r\n // preberemo, VD in jih shranimo v desktop Category element\r\n let izbranaVrstaDokumenta = (element.val());\r\n this._vrstaDokumenta.setSelectValues(izbranaVrstaDokumenta);\r\n\r\n this.refreshGridData(0);\r\n }\r\n\r\n setGlobalConfirmDenyButtonsEnableDisable(): void {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGrid.webGridAfterColumnCheckboxChanged\");\r\n\r\n let _btnConfirmGlobal = this._mainFormDiv.find(\"#btnConfirmGlobal\");\r\n _btnConfirmGlobal.prop('disabled', true);\r\n let _btnDenyGlobal = this._mainFormDiv.find(\"#btnDenyGlobal\");\r\n _btnDenyGlobal.prop('disabled', true);\r\n\r\n $(\"#LIKVCakalnaVrstaGrid tr td.dt-checkboxes-cell input[type='checkbox'].dt-checkboxes\").each(function () {\r\n let checked = $(this).is(\":checked\");\r\n if (checked) {\r\n _btnConfirmGlobal.prop('disabled', false);\r\n _btnDenyGlobal.prop('disabled', false);\r\n }\r\n });\r\n }\r\n\r\n switchSignees() {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGrid.switchSignees\");\r\n let _this = this;\r\n let _data = {};\r\n //\r\n let _urlAction = \"\";\r\n _urlAction = \"LikvConfirmations/SwitchSignees\";\r\n //\r\n let _saopServicesCore = new SaopServicesCore();\r\n _saopServicesCore.afterDone = function (response) {\r\n if (response.alertMessage) {\r\n alertify.message(response.alertMessage);\r\n }\r\n\r\n if (response.viewContent) {\r\n $(\"#messageBanner\").html(response.viewContent);\r\n }\r\n\r\n _this.refreshGridData(0);\r\n\r\n };\r\n _saopServicesCore.ExecuteAction({\r\n action: _urlAction\r\n , data: _data\r\n , type: \"POST\"\r\n });\r\n\r\n }\r\n\r\n public onLIKVidDocumentComplete(): void {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaView.onDenyDocumentComplete\");\r\n\r\n this.refreshGridData(0);\r\n }\r\n\r\n setCheckboxEnabledDisabled(): void {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGrid.setCheckboxEnabledDisabled\");\r\n $(\"#LIKVCakalnaVrstaGrid tr\").each(function () {\r\n let _id = $(this).attr(\"data-rowID\");\r\n let _row = $('#LIKVCakalnaVrstaGrid > tbody > tr').eq(Number(_id));\r\n if (_row.length > 0) {\r\n let _idAkcije = _row.attr(\"data-idAkcije\");\r\n let _checkbox = _row.find(\"td.dt-checkboxes-cell input[type='checkbox'].dt-checkboxes\");\r\n if (_idAkcije == \"2\")\r\n _checkbox.prop('disabled', false)\r\n else\r\n _checkbox.prop('disabled', true);\r\n }\r\n });\r\n }\r\n\r\n onApplicationFilterMobileChange(e: any): void {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGrid.onApplicationFilterMobileChange\");\r\n let _applicationFilter = $('div.popover.show').find('#ApplicationFilterMobile');\r\n if (_applicationFilter.length > 0) {\r\n this._izbranaVrstaDokumenta = _applicationFilter.val() as string;\r\n if (this._izbranaVrstaDokumenta == \"?\")\r\n this._izbranaVrstaDokumenta = \"\";\r\n }\r\n this.refreshGridData(0);\r\n }\r\n\r\n private setMobileView(): void {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGrid.setMobileView\");\r\n if (this.isMobileView()) {\r\n this._mainFormDiv.find('#grid-toolbar').addClass(\"mobile-gridtoolbar\");\r\n this._mainFormDiv.find('#gridtoolbarRow').addClass(\"mobile-gridtoolbarRow\");\r\n this._mainFormDiv.find('#mobileSearchValueDiv').addClass(\"mobile-SearchValueDiv\");\r\n this._mainFormDiv.find('#mobileSearchValueDiv .saop-img-search').addClass(\"mobile-DropDownImgSearch\");\r\n this._mainFormDiv.find('#mobileDropDownDiv').addClass(\"mobile-DropDownDiv\");\r\n this._mainFormDiv.find('#LIKVCakalnaVrstaGrid').toggleClass(\"table-column-holder-last\");\r\n }\r\n }\r\n\r\n private isMobileView(): boolean {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGrid.\");\r\n let isMobile = this._mainFormDiv.find('#mobileSearchValueDiv').css(\"display\") != \"none\";\r\n\r\n return isMobile;\r\n }\r\n\r\n editRowFromDashboard(): void {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGrid.editRowFromDashboard\");\r\n let _this = this;\r\n if (!this._dashboard) {\r\n //poberemo vrstico ki ima atribut data-rowselected = true, natavimo index, jo oznacimo in odpremo edit formo\r\n let _rowSelected = \"True\";\r\n let data = $(\"tr[data-rowselected='\" + _rowSelected + \"']\");\r\n if (data.length > 0) {\r\n let _idVrste = data.attr(\"data-IDVrste\");\r\n let _id = data.attr(\"data-ID\");\r\n let _vrstaDokumenta = data.attr(\"data-vrstadokumenta\");\r\n let _dokument = data.attr(\"data-dokument\");\r\n _this._selectedRowNo = parseInt(data.attr(\"data-rowID\")); // here we store the ID of the current row\r\n\r\n if (!isUnDefined(_idVrste) && !isUnDefined(_id)) {\r\n // barvanje oznacene vrstrice\r\n _this.webGrid1.markSelectedRow((data)[0]);\r\n\r\n _this.editRecord(_vrstaDokumenta, _dokument, _idVrste, _id);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private StorePrevAndNextRowData(_idVrste:string, _id:string): void {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGrid.StoreNextRow\");\r\n if (_idVrste.length > 0) {\r\n this._prevIDVrste = \"\";\r\n this._prevID = \"\"; \r\n this._nextIDVrste = \"\";\r\n this._nextID = \"\"; \r\n let _row = $(\"tr[data-IDVrste='\" + _idVrste + \"']\").filter(\"tr[data-ID='\" + _id + \"']\");\r\n if (_row.length > 0) {\r\n let _nextTR = _row.next(\"tr\");\r\n if (_nextTR.length > 0){\r\n this._nextIDVrste = _nextTR.attr(\"data-idvrste\");\r\n this._nextID = _nextTR.attr(\"data-id\");\r\n }\r\n let _prevTR = _row.prev(\"tr\");\r\n if (_prevTR.length > 0){\r\n this._prevIDVrste = _prevTR.attr(\"data-idvrste\");\r\n this._prevID = _prevTR.attr(\"data-id\"); \r\n }\r\n }\r\n }\r\n }\r\n\r\n}","import { global, getRelativeSiteURL, getSiteAbsoluteURL, isEmpty, isUnDefined } from \"../Common/saop-common\";\r\nimport { SaopViewForm, SaopWfAction } from \"../Core/saop-view-form\";\r\nimport { SaopUploadFiles } from \"../Components/saop-upload-files\";\r\nimport { SaopAttachmentList } from \"../Components/saop-attachment-list\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { LIKVCakalnaVrstaComment } from \"../LIKV/LIKVCakalnaVrsta-Comment\";\r\nimport { LIKVNivojiPotrjevanjaModal } from \"../LIKV/LIKVNivojiPotrjevanja-modal\";\r\n\r\n\r\nexport class LIKVCakalnaVrstaView extends SaopViewForm {\r\n private _formId:string;\r\n private _viewId: string\r\n private _saopUploadFiles:SaopUploadFiles;\r\n private _saopAttachmentList: SaopAttachmentList;\r\n private _likvNivojiPotrjevanjaModal :LIKVNivojiPotrjevanjaModal;\r\n\r\n constructor(viewId:string,libName:string = \"\"){\r\n super(viewId,libName);\r\n this._viewId = viewId;\r\n this.title = this.translationService.translate(\"Potni nalog\");\r\n this.addRecordEndpoint = \"\";\r\n this.editRecordEndpoint = \"LikvConfirmations/Edit\";\r\n this.deleteRecordEndpoint = \"\"; \r\n this._saopUploadFiles = new SaopUploadFiles(viewId,libName);\r\n this._likvNivojiPotrjevanjaModal = new LIKVNivojiPotrjevanjaModal(\"#LIKVCakalnaVrstaView004\", libName);\r\n this._likvNivojiPotrjevanjaModal.fullScreen = true; \r\n //\r\n this.afterViewShowSuccess = this.initView;\r\n this.afterSubmitSuccess = this.initView;\r\n //this.viewShownComplete = this.shownComplete;\r\n this._saopAttachmentList = new SaopAttachmentList(\"#LikvCakalnaVrstaAttachments\", libName + \"._saopAttachmentList\");\r\n this._saopAttachmentList.initComponent(\r\n {\r\n validationFingerprintController: \"SPLDocument\",\r\n validationFingerprintAction: \"ValidateAttachmentFingerPrint\",\r\n validationFingerprintBannerDivId: viewId + \" #uploadFilesValidationsAjax\",\r\n validationController: \"SPLDocument\",\r\n validationAction: \"ValidateDownloadingDocumentAttachment\",\r\n validationBannerDivId: viewId + \" #uploadFilesValidationsAjax\",\r\n downloadController: \"SPLDocument\",\r\n downloadAction: \"DownloadDocumentAttachment\",\r\n deletedAttachmentListId: viewId + \" \" + \"#PriponkeBrisane\"\r\n });\r\n //\r\n this.setDictionary(); \r\n }\r\n\r\n setDictionary(){\r\n let dictionary:string[] = [\"Potrjevanje\"];\r\n this.setTerminologyList(dictionary);\r\n } \r\n\r\n // shownComplete():void{\r\n // console.log(\"shownComplete...\");\r\n // eval(\"CommonPointer['saopPdfPreview'].setDefaultScale(0.6);\");\r\n // }\r\n\r\n public initView():void{\r\n this.LoadViewEvents();\r\n this.setTitleCss();\r\n this.enableMobileKomentar();\r\n this.setAttachmentCss();\r\n $(this._viewId + \" #likvConfirmationsEditMainDiv\").show();\r\n }\r\n\r\n public LoadViewEvents ():void{\r\n let _viewDiv = $(this.id);\r\n if (_viewDiv.length == 0) {return;}\r\n\r\n let _this = this;\r\n this._formId = \"#mainLikvCakalnaVrstaEdit\";\r\n //this._saopUploadFiles.initComponent({controller:\"TravelOrder\",action:\"ValidateFiles\",validateAjax:true,formId:this._formId,validationDivId:\"#uploadFilesValidationsAjax\"});\r\n this._saopUploadFiles.afterRefreshFilesList = this._saopUploadFiles.ajaxValidate;\r\n\r\n $('#btnOk').off('click');\r\n $('#btnOk').bind('click', \r\n function() {\r\n let _result = _this._saopUploadFiles.ajaxValidate();\r\n return _result; \r\n } \r\n ); \r\n\r\n // let btnClose = $('#LikvConfirmationsEditView').find(\"#btnClose\");\r\n // btnClose.off(\"click\",_this.onCloseView);\r\n // btnClose.on(\"click\",_this.onCloseView); \r\n\r\n $('#LIKVCakalnaVrstaView001').on('hidden.bs.modal', function () {\r\n _this.onCloseView();\r\n }); \r\n\r\n //$('.saop-attachment-element').bind('click', this.RefreshAttachment ); \r\n $(\".saop-attachment-element\").on(\"click\", function (e:any) {\r\n var data = e.currentTarget;\r\n let _id = data.getAttribute(\"data-docId\");\r\n let preview = data.getAttribute(\"data-docpreview\");\r\n let docpreview = preview === \"true\" ? true : false;\r\n _this.refreshAttachment(_id, docpreview);\r\n }); \r\n\r\n $('#btnNext').off('click');\r\n $(\"#btnNext\").on(\"click\", function (e:any) {\r\n _this.MoveToNext();\r\n }); \r\n\r\n $('#btnPrevious').off('click');\r\n $(\"#btnPrevious\").on(\"click\", function (e:any) {\r\n _this.MoveToPrevious();\r\n }); \r\n\r\n $('#btnDeny').off('click');\r\n $(\"#btnDeny\").on(\"click\", function (e:any) {\r\n\r\n let _idVrsteElement = $('#LikvConfirmationsEditView').find(\"#IDVrste\");;\r\n let _idVrste = _idVrsteElement.val().toString();\r\n\r\n let _idElement = $('#LikvConfirmationsEditView').find(\"#ID\");;\r\n let _id = _idElement.val().toString();\r\n\r\n let komentarElement = $('#LikvConfirmationsEditView').find(\"#desktopKomentar\");\r\n let komentar = komentarElement.val();\r\n if (!komentarElement.is(\":visible\")) {\r\n komentar = $('#LikvConfirmationsEditView').find(\"#mobileKomentar\").val();\r\n }\r\n\r\n let _idAkcije = -1;\r\n\r\n _this.DenyAndMoveToNext(_idVrste, _id, komentar.toString(), _idAkcije.toString());\r\n }); \r\n\r\n $('#btnConfirm').off('click');\r\n $(\"#btnConfirm\").on(\"click\", function (e:any) {\r\n\r\n let _idVrsteElement = $('#LikvConfirmationsEditView').find(\"#IDVrste\");;\r\n let _idVrste = _idVrsteElement.val().toString();\r\n\r\n let _idElement = $('#LikvConfirmationsEditView').find(\"#ID\");;\r\n let _id = _idElement.val().toString();\r\n\r\n let komentarElement = $('#LikvConfirmationsEditView').find(\"#desktopKomentar\");\r\n let komentar = komentarElement.val();\r\n if (!komentarElement.is(\":visible\")) {\r\n komentar = $('#LikvConfirmationsEditView').find(\"#mobileKomentar\").val();\r\n }\r\n\r\n let _idAkcije = -1;\r\n\r\n _this.ConfirmAndMoveToNext(_idVrste, _id, komentar.toString(), _idAkcije.toString());\r\n }); \r\n\r\n $('#btnUncDocuments').off('click');\r\n $(\"#btnUncDocuments\").on(\"click\", function (e:any) {\r\n let _idVrsteElement = $('#LikvConfirmationsEditView').find(\"#IDVrste\");;\r\n let _idVrste = _idVrsteElement.val().toString();\r\n let _params = { idVrste: _idVrste };\r\n //\r\n _this._likvNivojiPotrjevanjaModal.showForm(_params); \r\n }); \r\n\r\n $('#btnUncDocumentsMB').off('click');\r\n $(\"#btnUncDocumentsMB\").on(\"click\", function (e:any) {\r\n let _idVrsteElement = $('#LikvConfirmationsEditView').find(\"#IDVrste\");;\r\n let _idVrste = _idVrsteElement.val().toString();\r\n let _params = { idVrste: _idVrste };\r\n //\r\n _this._likvNivojiPotrjevanjaModal.showForm(_params); \r\n }); \r\n\r\n }\r\n\r\n private refreshHtmlAttachment(htmlElement:string){\r\n $(\"#likvConfirmationsAttachment\").html(htmlElement);\r\n }\r\n\r\n public refreshAttachment (docID:string, preview: boolean ):void {\r\n let _this = this;\r\n let _params = { documentID: docID, documentPreview: preview };\r\n let _saopServicesCore = new SaopServicesCore();\r\n\r\n _saopServicesCore.afterDone = function(response){\r\n _this.refreshHtmlAttachment(response);\r\n };\r\n _saopServicesCore.ExecuteAction({\r\n action:\"LikvConfirmations/RefreshAttachment\" \r\n ,data: _params\r\n ,type:\"GET\"\r\n }); \r\n }\r\n\r\n public MoveToNext ():void{\r\n\r\n }\r\n\r\n public MoveToPrevious ():void{\r\n\r\n }\r\n\r\n public ConfirmAndMoveToNext(idVrste:string, id:string, komentar: string, idAkcije: string):void{\r\n\r\n }\r\n\r\n public DenyAndMoveToNext(idVrste:string, id:string, komentar: string, idAkcije: string):void{\r\n\r\n }\r\n\r\n private setTitleCss(): void {\r\n // samo ce je mobile, se zmanjsa velikost naslova edit forme\r\n if (this.isMobileView()) {\r\n let titleElement = $(this._viewId + \" .modal-title\");\r\n titleElement.removeClass(\"saop-txt-1\");\r\n titleElement.addClass(\"saop-txt-3\");\r\n titleElement.addClass(\"align-self-center\");\r\n }\r\n }\r\n\r\n private isMobileView(): boolean {\r\n let isMobile = $(this._viewId + \" #mobileButtons\").css(\"display\") != \"none\";\r\n\r\n return isMobile;\r\n }\r\n\r\n private enableMobileKomentar(): void {\r\n // po defaultu je mobile komentar text area kontrola disabled, da se form ne pomakne navzdol na text area kontrola\r\n // in ostane na vrhu, zato ga moramo cez nekaj casa enabled\r\n let _this = this;\r\n\r\n setTimeout(function () {\r\n $(_this._viewId + \" #mobileKomentar\").prop(\"disabled\", false);\r\n }, 1000);\r\n }\r\n\r\n private setAttachmentCss(): void {\r\n if (this.isMobileView()) {\r\n let likvConfirmationsAttachmentElement = $(this._viewId + \" #likvConfirmationsAttachment\");\r\n likvConfirmationsAttachmentElement.addClass(\"mobile-likvConfirmationsAttachment\");\r\n \r\n let likvConfirmationsAttachmentRowElement = $(this._viewId + \" #likvConfirmationsAttachmentRow\");\r\n let attachmentRowCss = \"mobile-likvConfirmationsAttachmentRow\";\r\n if (likvConfirmationsAttachmentElement.length == 0) {\r\n attachmentRowCss = \"mobile-likvConfirmationsNoAttachmentRow\";\r\n }\r\n likvConfirmationsAttachmentRowElement.addClass(attachmentRowCss);\r\n\r\n let likvConfirmationsNoAttachment = $(this._viewId + \" #likvConfirmationsNoAttachment\");\r\n likvConfirmationsNoAttachment.addClass(\"mobile-likvConfirmationsNoAttachment\");\r\n\r\n let _modalHeader = $(\".modal-header\");\r\n _modalHeader.css(\"height\",\"20px\");\r\n _modalHeader.css(\"padding\",\"20px 20px 20px 20px\"); \r\n _modalHeader.find(\".modal-title\").css(\"font-size\",\"14px\");\r\n _modalHeader.find(\".modal-title\").css(\"line-height\",\"20px\");\r\n _modalHeader.find(\".close\").css(\"padding\",\"unset\");\r\n //\r\n let _saopHorizontalScrollable = $(\".saop-horizontal-scrollable\");\r\n _saopHorizontalScrollable.find(\".saop-scroll-col\").css(\"padding-top\",\"7px\");\r\n //\r\n //$(this._viewId + \" .saop-control-listBox-wider \").css(\"height\",\"45px\");\r\n $(this._viewId + \" #EditInfoDoc .saop-modal-row \").css(\"padding-top\",\"5px\");\r\n $(this._viewId + \" .modal-footer-buttons \").css(\"padding\",\"5px 5px 5px 5px\"); \r\n $(this._viewId + \" .saop-edit-form-panel-heading \").css(\"padding-top\",\"7px\"); \r\n // \r\n $(this._viewId + \" #attachmentsMainDiv\").css(\"padding-left\",\"0px\");\r\n\r\n }\r\n }\r\n\r\n public onCloseView():void {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaView.onCloseView\");\r\n $(\".pdf-view-container\").remove();\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","import { global, setModalFormZIndex, isUnDefined } from \"../Common/saop-common\";\r\nimport { SaopWebGrid,SaopWebGridProperties,SaopWebGridToolbar,SaopWebGridToolbarButton,SaopWebDataTable} from \"../Components/saop-grid\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { LIKVCakalnaVrstaView } from \"./LIKVCakalnaVrsta-view\";\r\nimport { SaopWfAction } from \"../Core/saop-view-form\";\r\nimport { SaopMultiselect } from \"../Components/saop-multiselect\";\r\nimport { SaopPopover } from \"../Components/saop-popover\";\r\nimport { DataTables } from \"../@types/data-tables/types\";\r\n\r\nexport class LIKVCakalnaVrstaArhivGrid {\r\n private libName:string;\r\n private _saopServicesCore: SaopServicesCore;\r\n private _mainFormDiv:JQuery;\r\n private _searchValue:JQuery;\r\n private _selectedRowNo:number;\r\n \r\n //\r\n public webGrid1:SaopWebGrid;\r\n public _LIKVCakalnaVrstaView:LIKVCakalnaVrstaView;\r\n private _vrstaDokumenta: SaopMultiselect; \r\n private _vrstaDokumentaDivId: string; \r\n private _vrstaDokumentaMobile: SaopMultiselect; \r\n private _izbranaVrstaDokumenta: string;\r\n private _izbranoLeto: number; \r\n private _statusPotrjen: Boolean;\r\n private _statusZavrnjen: Boolean; \r\n private _statusBrisan: Boolean;\r\n private _saopPopoverFilter: SaopPopover; \r\n \r\n constructor(libName: string) {\r\n this.libName = libName;\r\n this._saopServicesCore = new SaopServicesCore();\r\n //\r\n this._LIKVCakalnaVrstaView = new LIKVCakalnaVrstaView(\"#LIKVCakalnaVrstaView001\",this.libName+\"._LIKVCakalnaVrstaView\");\r\n this._LIKVCakalnaVrstaView.fullScreen = true; \r\n this._LIKVCakalnaVrstaView.MoveToNext = this.MoveToNextExt.bind(this);\r\n this._LIKVCakalnaVrstaView.MoveToPrevious = this.MoveToPreviousExt.bind(this); \r\n// this._vrstaDokumentaDivId = \"#VrstaDokumentaDiv\"; \r\n this._izbranoLeto = 0; \r\n this._statusPotrjen = false;\r\n this._statusZavrnjen = false; \r\n this._statusBrisan = false;\r\n this._saopPopoverFilter = new SaopPopover();\r\n this._saopPopoverFilter.afterPopoverShow = this.afterPopoverMobileFilterShow.bind(this); \r\n } \r\n \r\n initView(){\r\n this._mainFormDiv = $(\"#LIKVCakalnaVrstaGridArchiveBrowseForm\");\r\n this.initWebGrid1();\r\n this.initWebGrid1Listners(); \r\n this._searchValue = this._mainFormDiv.find(\"#SearchValue\"); \r\n this.initFilterControls(); \r\n// this.initVrstaDokumenta(); \r\n this._saopPopoverFilter.bindPopoverEvents(); \r\n this._mainFormDiv.show();\r\n } \r\n \r\n initWebGrid1(){\r\n let wgId = \"#LIKVCakalnaVrstaGridArchive\";\r\n let captionToolbar = $(wgId).attr(\"caption-toolbar\");\r\n let toolbarItemsTemplateId = $(wgId).attr(\"toolbar-items-templateId\");\r\n //\r\n this.webGrid1 = new SaopWebGrid(this.libName+\".webGrid1\");\r\n let gridProperties: SaopWebGridProperties;\r\n let gridToolbar:SaopWebGridToolbar;\r\n let toolbarButtons:SaopWebGridToolbarButton[] = [];\r\n let dataTable:SaopWebDataTable;\r\n //\r\n gridToolbar = {id:\"saopWebGridTB1\",caption:captionToolbar,buttons:toolbarButtons,itemsTemplateId:toolbarItemsTemplateId};\r\n \r\n dataTable = { enabled:true, colSettings:true };\r\n \r\n gridProperties = {\r\n gridId:wgId\r\n ,togglePanel:{enabled:false}\r\n ,toolbar:gridToolbar\r\n ,dataTable:dataTable\r\n }; \r\n //\r\n this.webGrid1.init(gridProperties); \r\n let _SearchValue2 = $('#collapsesaopWebGridTB1').find('#SearchValue2');\r\n if (_SearchValue2.length > 0) {\r\n this._izbranoLeto = _SearchValue2.val() as number; \r\n } \r\n let _applicationFilter = this._mainFormDiv.find(\"#ApplicationFilter\"); \r\n if (_applicationFilter.length > 0) {\r\n this._izbranaVrstaDokumenta = _applicationFilter.val() as string; \r\n } \r\n\r\n $(wgId + \"_wrapper\").css('max-height', 'calc(100vh - 350px)');\r\n } \r\n \r\n public MoveToNextExt ():void{\r\n let _row = $('#LIKVCakalnaVrstaGridArchive > tbody > tr').eq(this._selectedRowNo + 1); // here we extrapolate the row data of selected index\r\n if (_row.length > 0) {\r\n this._selectedRowNo = this._selectedRowNo + 1; // here we increase the index of the selected row\r\n //\r\n let _idVrste = _row.attr(\"data-idvrste\");\r\n let _id = _row.attr(\"data-id\"); \r\n let _vrstaDokumenta = _row.attr(\"data-vrstadokumenta\");\r\n let _dokument = _row.attr(\"data-dokument\");\r\n //\r\n // barvanje oznacene vrstrice\r\n this.webGrid1.markSelectedRow((_row)[0]);\r\n this.editRecord(_vrstaDokumenta,_dokument,_idVrste,_id);\r\n }\r\n }\r\n\r\n public MoveToPreviousExt ():void{\r\n let _row = $('#LIKVCakalnaVrstaGridArchive > tbody > tr').eq(this._selectedRowNo - 1); // here we extrapolate the row data of selected index\r\n if (_row.length > 0) {\r\n this._selectedRowNo = this._selectedRowNo - 1; // here we decrease the index of the selected row\r\n //\r\n let _idVrste = _row.attr(\"data-idvrste\");\r\n let _id = _row.attr(\"data-id\"); \r\n let _vrstaDokumenta = _row.attr(\"data-vrstadokumenta\");\r\n let _dokument = _row.attr(\"data-dokument\");\r\n //\r\n // barvanje oznacene vrstrice\r\n this.webGrid1.markSelectedRow((_row)[0]);\r\n this.editRecord(_vrstaDokumenta,_dokument,_idVrste,_id);\r\n }\r\n }\r\n\r\n initWebGrid1Listners() {\r\n let _this = this;\r\n let _SearchValue2 = $('#collapsesaopWebGridTB1').find('#SearchValue2');\r\n if (_SearchValue2.length > 0) {\r\n _SearchValue2.off(\"change\");\r\n _SearchValue2.on(\"change\", _this.onSearchValue2Change.bind(_this));\r\n }\r\n\r\n let _applicationFilter = this._mainFormDiv.find(\"#ApplicationFilter\");\r\n if (_applicationFilter.length > 0) {\r\n _applicationFilter.off(\"change\");\r\n _applicationFilter.on(\"change\", _this.onApplicationFilterChange.bind(_this));\r\n }\r\n\r\n let _statPotrjen = $('#collapsesaopWebGridTB1').find('#statusPotrjen');\r\n if (_statPotrjen.length > 0) {\r\n _statPotrjen.off(\"change\");\r\n _statPotrjen.on(\"change\", _this.onStatusPotrjenChange.bind(_this));\r\n }\r\n\r\n let _statZavrnjen = $('#collapsesaopWebGridTB1').find('#statusZavrnjen');\r\n if (_statZavrnjen.length > 0) {\r\n _statZavrnjen.off(\"change\");\r\n _statZavrnjen.on(\"change\", _this.onStatusZavrnjenChange.bind(_this));\r\n }\r\n\r\n let _statBrisan = $('#collapsesaopWebGridTB1').find('#statusBrisan');\r\n if (_statBrisan.length > 0) {\r\n _statBrisan.off(\"change\");\r\n _statBrisan.on(\"change\", _this.onStatusBrisanChange.bind(_this));\r\n }\r\n\r\n\r\n $(\"body\").off(\"click\", \"#LIKVCakalnaVrstaGridArchive td:not(.td-action)\");\r\n $(\"body\").on(\"click\", \"#LIKVCakalnaVrstaGridArchive td:not(.td-action)\", function () {\r\n let _i = $(this).closest('tr').index();\r\n _this._selectedRowNo = _i; // here we store the ID of the current row\r\n var data = $(this).closest(\"tr\");\r\n let _idVrste = data.attr(\"data-IDVrste\");\r\n let _id = data.attr(\"data-ID\");\r\n let _vrstaDokumenta = data.attr(\"data-vrstadokumenta\");\r\n let _dokument = data.attr(\"data-dokument\");\r\n\r\n if (!isUnDefined(_idVrste) && !isUnDefined(_id)) {\r\n // barvanje oznacene vrstrice\r\n _this.webGrid1.markSelectedRow((data)[0]);\r\n\r\n _this.editRecord(_vrstaDokumenta, _dokument, _idVrste, _id);\r\n }\r\n });\r\n\r\n //\r\n } \r\n \r\n refreshData(htmlContent:string){\r\n this.webGrid1.replaceGridRows(htmlContent);\r\n this.initWebGrid1Listners();\r\n }\r\n\r\n refreshGridData(year: number, applicationCode: string = \"\", archive: boolean = true): void {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaGridArchive.refreshRows:\");\r\n\r\n let _this = this;\r\n let saopServicesCore = new SaopServicesCore();\r\n let _statusFilter = 111;\r\n if (this._statusPotrjen)\r\n _statusFilter = _statusFilter + 100;\r\n if (this._statusZavrnjen == true)\r\n _statusFilter = _statusFilter + 10;\r\n if (this._statusBrisan == true)\r\n _statusFilter = _statusFilter + 1;\r\n let params = { year: year, applicationCode: applicationCode, archive: archive, statusFilter: _statusFilter };\r\n\r\n saopServicesCore.afterDone = function (response) {\r\n _this.refreshData(response);\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"LikvConfirmations/IndexArchive\"\r\n , data: params\r\n , type: \"GET\"\r\n });\r\n }\r\n\r\n editRecord(_vrstaDokumenta:string,_dokument: string,_idVrste:string,_id:string){\r\n let _fullTitle = this._LIKVCakalnaVrstaView.translationService.translate(\"Potrjevanje\") + \": \" + _vrstaDokumenta + \" \" + _dokument;\r\n this._LIKVCakalnaVrstaView.fullTitle = _fullTitle;\r\n this._LIKVCakalnaVrstaView.showViewForm(SaopWfAction.wfaEditRecord,{ queueId: _idVrste, threeId: _id, archive: true, fullView: true }); \r\n } \r\n \r\n initFilterControls(): void {\r\n let _this = this;\r\n this._searchValue.keyup(function () {\r\n let oTable = _this.webGrid1.dataTable;\r\n oTable.search($(this).val().toString()).draw() ; \r\n }); \r\n }\r\n\r\n // initVrstaDokumenta(): void {\r\n // global.ConsoleLogDegug(\"LIKVCakalnaVrstaView.initVrstaDokumenta\");\r\n \r\n // this._vrstaDokumenta = new SaopMultiselect();\r\n // this._vrstaDokumenta.afterChangeCommonEvent = this.filterVrstaDokumenta.bind(this);\r\n // // init za metodo \"afterChangeCommonEvent\", da se že v \"_vrstaDokumenta.init\" metodi sprozi filterVrstaDokumenta\r\n // this._vrstaDokumenta.init(\"#VrstaDokumentaFilter\", \"Vrsta dokumenta\");\r\n // // prikazemo select div\r\n // $(this._vrstaDokumentaDivId).show();\r\n // }\r\n \r\n // filterVrstaDokumenta(element: any) {\r\n // global.ConsoleLogDegug(\"LIKVCakalnaVrstaView.filterVrstaDokumenta\");\r\n \r\n // // preberemo, katere sifre zaposlenih sodijo v izbrane skupine\r\n // this._izbranaVrstaDokumenta = (element.val().toString());\r\n \r\n // this.refreshGridData(this._izbranoLeto, this._izbranaVrstaDokumenta);\r\n // } \r\n\r\n onSearchValue2Change(e:any):void{\r\n let _SearchValue2 = $('#collapsesaopWebGridTB1').find('#SearchValue2');\r\n if (_SearchValue2.length > 0) {\r\n this._izbranoLeto = _SearchValue2.val() as number;\r\n } \r\n this.refreshGridData(this._izbranoLeto, this._izbranaVrstaDokumenta);\r\n } \r\n\r\n onApplicationFilterChange(e:any):void{\r\n let _applicationFilter = this._mainFormDiv.find(\"#ApplicationFilter\");\r\n if (_applicationFilter.length > 0) {\r\n this._izbranaVrstaDokumenta = _applicationFilter.val() as string;\r\n if (this._izbranaVrstaDokumenta == \"?\" )\r\n this._izbranaVrstaDokumenta = \"\";\r\n } \r\n this.refreshGridData(this._izbranoLeto, this._izbranaVrstaDokumenta);\r\n }\r\n\r\n onStatusPotrjenChange(e:any):void{\r\n this._statusPotrjen = false;\r\n let _statPotrjen = $('#collapsesaopWebGridTB1').find('#statusPotrjen');\r\n if (_statPotrjen.is(\":checked\")){ \r\n this._statusPotrjen = _statPotrjen.is(\":checked\");\r\n } \r\n this.refreshGridData(this._izbranoLeto, this._izbranaVrstaDokumenta);\r\n } \r\n\r\n onStatusZavrnjenChange(e:any):void{\r\n this._statusZavrnjen = false;\r\n let _statZavrnjen = $('#collapsesaopWebGridTB1').find('#statusZavrnjen');\r\n if (_statZavrnjen.is(\":checked\")){ \r\n this._statusZavrnjen = _statZavrnjen.is(\":checked\");\r\n } \r\n this.refreshGridData(this._izbranoLeto, this._izbranaVrstaDokumenta);\r\n } \r\n\r\n onStatusBrisanChange(e:any):void{\r\n this._statusBrisan = false;\r\n let _statBrisan = $('#collapsesaopWebGridTB1').find('#statusBrisan');\r\n if (_statBrisan.is(\":checked\")){ \r\n this._statusBrisan = _statBrisan.is(\":checked\");\r\n } \r\n this.refreshGridData(this._izbranoLeto, this._izbranaVrstaDokumenta, false);\r\n }\r\n\r\n afterPopoverMobileFilterShow(element: HTMLElement): void {\r\n global.ConsoleLogDegug(\"LIKVCakalnaVrstaView.afterPopoverMobileFilterShow\");\r\n\r\n let atrContent = element.getAttribute(\"data-popover-content\");\r\n // preverimo če je popup likv filter\r\n if (atrContent === \"#popOverLikvFilter\") {\r\n\r\n // this._vrstaDokumentaMobile = new SaopMultiselect();\r\n // this._vrstaDokumentaMobile.init(\"div.popover.show #VrstaDokumentaFilterMobile\", \"Vrsta dokumenta\");\r\n // // metoda this.setSelectSkupinaMobileFilterValues se mora izvesti pred this._selectSkupinaMobileFilter.afterChangeCommonEvent\r\n // // da se se ne izvede metoda this.selectSkupinaMobileFilterChanged, ker se v this.setSelectSkupinaMobileFilterValues\r\n // // nastavijo vrednosti v klasu SaopMultiselect in posledicno se klice tudi afterChangeCommonEvent event\r\n // this.setSelectVDMobileFilterValues(); \r\n // this._vrstaDokumentaMobile.afterChangeCommonEvent = this.filterVrstaDokumentaMobileChanged.bind(this);\r\n\r\n let _SearchValue2Mobile = $('div.popover.show').find('#SearchValue2Mobile'); \r\n if (_SearchValue2Mobile.length > 0) {\r\n _SearchValue2Mobile.off(\"change\");\r\n _SearchValue2Mobile.on(\"change\",this.onSearchValue2MobileChange.bind(this));\r\n }\r\n _SearchValue2Mobile.val(this._izbranoLeto);\r\n\r\n let _ApplicationFilterMobile = $('div.popover.show').find('#ApplicationFilterMobile'); \r\n if (_ApplicationFilterMobile.length > 0) {\r\n _ApplicationFilterMobile.off(\"change\");\r\n _ApplicationFilterMobile.on(\"change\",this.onApplicationFilterMobileChange.bind(this));\r\n }\r\n _ApplicationFilterMobile.val(this._izbranaVrstaDokumenta).change(); //prop('selected', true);\r\n\r\n let _statPotrjenMobile = $(\"div.popover.show\").find('#statusPotrjenMobile'); \r\n if (_statPotrjenMobile.length > 0) {\r\n _statPotrjenMobile.off(\"change\");\r\n _statPotrjenMobile.on(\"change\",this.onStatusPotrjenMobileChange.bind(this));\r\n }\r\n _statPotrjenMobile.prop('checked', this._statusPotrjen);\r\n \r\n let _statZavrnjenMobile = $(\"div.popover.show\").find('#statusZavrnjenMobile'); \r\n if (_statZavrnjenMobile.length > 0) {\r\n _statZavrnjenMobile.off(\"change\");\r\n _statZavrnjenMobile.on(\"change\",this.onStatusZavrnjenMobileChange.bind(this));\r\n } \r\n _statZavrnjenMobile.prop('checked', this._statusZavrnjen);\r\n\r\n let _statBrisanMobile = $(\"div.popover.show\").find('#statusBrisanMobile');\r\n if (_statBrisanMobile.length > 0) {\r\n _statBrisanMobile.off(\"change\");\r\n _statBrisanMobile.on(\"change\",this.onStatusBrisanMobileChange.bind(this));\r\n }\r\n\r\n // dodamo custom css za filter\r\n let filterPopoverDiv = $(\"div.popover.show\");\r\n if (filterPopoverDiv != null) {\r\n let customCss = \"calendar-filter\";\r\n if (!filterPopoverDiv.hasClass(customCss)) {\r\n filterPopoverDiv.addClass(customCss);\r\n }\r\n }\r\n\r\n // dodamo custom css za filter\r\n let filterPopoverBodyDiv = $(\"div.popover.show\").find(\"div.popover-body\");\r\n if (filterPopoverBodyDiv != null) {\r\n let customCss = \"calendar-filter-body\";\r\n if (!filterPopoverBodyDiv.hasClass(customCss)) {\r\n filterPopoverBodyDiv.addClass(customCss);\r\n }\r\n }\r\n \r\n // prikazi filter okno\r\n let filterBody = $(\"div.popover.show\").find(\"#popOverLikvFilterBody\");\r\n filterBody.show();\r\n }\r\n }\r\n\r\n// setSelectVDMobileFilterValues() {\r\n// global.ConsoleLogDegug(\"LIKVCakalnaVrstaView.setSelectVDMobileFilterValues\");\r\n// // preberemo vrednosti VD iz desktop Category element\r\n// let izbranaVrstaDokumenta = (this._vrstaDokumenta.selectedCB.val());\r\n// this._vrstaDokumentaMobile.setSelectValues(izbranaVrstaDokumenta);\r\n// } \r\n\r\n// filterVrstaDokumentaMobileChanged(element: any) {\r\n// global.ConsoleLogDegug(\"LIKVCakalnaVrstaView.filterVrstaDokumenta\");\r\n\r\n// // preberemo, VD in jih shranimo v desktop Category element\r\n// let izbranaVrstaDokumenta = (element.val());\r\n// this._vrstaDokumenta.setSelectValues(izbranaVrstaDokumenta);\r\n\r\n// this.refreshGridData(0, izbranaVrstaDokumenta.toString()); \r\n// }\r\n\r\nonSearchValue2MobileChange(e:any):void{\r\n let _SearchValue2 = $('div.popover.show').find('#SearchValue2Mobile');\r\n if (_SearchValue2.length > 0) {\r\n this._izbranoLeto = _SearchValue2.val() as number;\r\n } \r\n $(\"#SearchValue2\").val(this._izbranoLeto); \r\n this.refreshGridData(this._izbranoLeto, this._izbranaVrstaDokumenta);\r\n} \r\n\r\nonApplicationFilterMobileChange(e:any):void{\r\n let _applicationFilter = $('div.popover.show').find('#ApplicationFilterMobile');\r\n if (_applicationFilter.length > 0) {\r\n this._izbranaVrstaDokumenta = _applicationFilter.val() as string;\r\n if (this._izbranaVrstaDokumenta == \"?\" )\r\n this._izbranaVrstaDokumenta = \"\";\r\n } \r\n this.refreshGridData(this._izbranoLeto, this._izbranaVrstaDokumenta);\r\n} \r\n\r\nonStatusPotrjenMobileChange(e:any):void{\r\n this._statusPotrjen = false;\r\n let _statPotrjen = $(\"div.popover.show\").find('#statusPotrjenMobile');\r\n if (_statPotrjen.is(\":checked\")){ \r\n this._statusPotrjen = _statPotrjen.is(\":checked\");\r\n } \r\n $(\"#statusPotrjen\").prop('checked', this._statusPotrjen); \r\n this.refreshGridData(this._izbranoLeto, this._izbranaVrstaDokumenta);\r\n} \r\n\r\nonStatusZavrnjenMobileChange(e:any):void{\r\n this._statusZavrnjen = false;\r\n let _statZavrnjen = $(\"div.popover.show\").find('#statusZavrnjenMobile'); \r\n if (_statZavrnjen.is(\":checked\")){ \r\n this._statusZavrnjen = _statZavrnjen.is(\":checked\");\r\n } \r\n $(\"#statusZavrnjen\").prop('checked', this._statusZavrnjen); \r\n this.refreshGridData(this._izbranoLeto, this._izbranaVrstaDokumenta);\r\n } \r\n\r\n onStatusBrisanMobileChange(e: any): void {\r\n this._statusBrisan = false;\r\n let _statBrisan = $(\"div.popover.show\").find('#statusBrisanMobile');\r\n if (_statBrisan.is(\":checked\")) {\r\n this._statusBrisan = _statBrisan.is(\":checked\");\r\n }\r\n $(\"#statusBrisan\").prop('checked', this._statusBrisan);\r\n this.refreshGridData(this._izbranoLeto, this._izbranaVrstaDokumenta, false);\r\n }\r\n\r\n //\r\n}","import { global, getSiteAbsoluteURL } from \"../Common/saop-common\";\r\nimport { SaopWebGrid,SaopWebGridProperties,SaopWebGridToolbar,SaopWebGridToolbarButton,SaopWebDataTable} from \"../Components/saop-grid\";\r\nimport * as moment from '../../node_modules/moment/moment';\r\nimport { SaopTreeTable, SaopTreeTableParams } from \"../Components/saop-TreeTable\";\r\n\r\nexport class LIKVNivojiPotrjevanjaGrid {\r\n private libName:string;\r\n //\r\n public webGrid1:SaopWebGrid;\r\n public treeTable:SaopTreeTable;\r\n \r\n constructor(libName: string) {\r\n this.libName = libName;\r\n //\r\n } \r\n \r\n initView(idVrste:string){\r\n var _siteUrl = getSiteAbsoluteURL(\"LikvConfirmations\");\r\n\r\n this.treeTable = new SaopTreeTable(\"\"); \r\n let _params:SaopTreeTableParams;\r\n _params = {\r\n id:'#LIKVNivojiPotrjevanjaGrid'\r\n ,url: _siteUrl+'/GetUncDocumentsData?idVrste='+idVrste\r\n ,columns:\r\n [\r\n {\"data\": \"status\",\r\n render: function(data:any, type:any, row:any){\r\n var _div = \r\n `\r\n
    \r\n
    \r\n
    ${row[\"nazivStatusa\"]}
    \r\n
    \r\n `;\r\n return _div; \r\n }\r\n },\r\n {\"data\": \"nazivAkcije\", className: 'saop-table-text-truncate pr-2'},\r\n {\"data\": \"nazivPodpisnik\", className: 'saop-table-text-truncate pr-2'},\r\n {\"data\": \"casZacetka\",\r\n render: function(data:any, type:any, row:any){\r\n if(data == null || type === \"sort\" || type === \"type\"){\r\n return data;\r\n } \r\n return moment(data).format(\"DD.MM.YYYY\"); \r\n }\r\n },\r\n {\"data\": \"casKonca\",\r\n render: function(data:any, type:any, row:any){\r\n if(data == null || type === \"sort\" || type === \"type\"){\r\n return data;\r\n } \r\n return moment(data).format(\"DD.MM.YYYY\"); \r\n }\r\n },\r\n {\"data\": \"rokZakljucka\"},\r\n {\"data\": \"nazivPoverjenik\", className: 'saop-table-text-truncate'}\r\n ]\r\n ,order: [[1, 'desc']]\r\n };\r\n this.treeTable.init(_params);\r\n }\r\n //\r\n}","import { global, getRelativeSiteURL, getSiteAbsoluteURL, isEmpty, isUnDefined } from \"../Common/saop-common\";\r\nimport { SaopViewForm, SaopWfAction } from \"../Core/saop-view-form\";\r\nimport {LIKVNivojiPotrjevanjaGrid } from \"../LIKV/LIKVNivojiPotrjevanja-grid\"\r\n\r\nexport class LIKVNivojiPotrjevanjaModal extends SaopViewForm {\r\n private _likvNivojiPotrjevanjaGrid:LIKVNivojiPotrjevanjaGrid;\r\n\r\n constructor(viewId:string,libName:string = \"\"){\r\n super(viewId,libName);\r\n this.setDictionary(); \r\n this.title = this.translationService.translate(\"Nivoji potrjevanja\");\r\n this.fullTitle = this.title;\r\n this.addRecordEndpoint = \"\";\r\n this.editRecordEndpoint = \"LikvConfirmations/IndexUncDocuments\";\r\n this.deleteRecordEndpoint = \"\"; \r\n //\r\n this.afterViewShowSuccess = this.initView;\r\n this.afterSubmitSuccess = this.initView;\r\n //\r\n }\r\n\r\n setDictionary(){\r\n let dictionary:string[] = [\"Nivoji potrjevanja\"];\r\n this.setTerminologyList(dictionary);\r\n } \r\n\r\n public showForm(data:any):void{\r\n this.showViewForm(SaopWfAction.wfaEditRecord, data);\r\n }\r\n\r\n public initView():void{\r\n let _data = this.getData();\r\n this._likvNivojiPotrjevanjaGrid = new LIKVNivojiPotrjevanjaGrid(this._libName);\r\n this._likvNivojiPotrjevanjaGrid.initView(_data.idVrste);\r\n }\r\n\r\n //\r\n}\r\n\r\n","import { global, isEmpty, isUnDefined } from \"../Common/saop-common\";\r\nimport { SaopMultiselect } from \"../Components/saop-multiselect\";\r\nimport { SaopUploadFiles } from \"../Components/saop-upload-files\";\r\nimport { SaopAttachmentList } from \"../Components/saop-attachment-list\";\r\n\r\nclass TipInternegaNarocilaServis {\r\n sifra: string;\r\n naziv: string;\r\n sifreVrsteInternegaNarocilaServis: string;\r\n}\r\n\r\nclass SifraVrsteInternegaNarocilaPriponke {\r\n sifreVrsteInternegaNarocila: string;\r\n}\r\n\r\nclass ArtikelEnotaMereViewModel {\r\n SifraArtikla: string;\r\n MerskaEnota: string;\r\n}\r\n\r\nexport class NDKInternalOrderEditForm {\r\n private libName: string;\r\n private _viewId: string;\r\n private _formId: string;\r\n private _vrstaInternegaNarocilaId: string = \"#SifraVrsteInternihNarocil\";\r\n private _tipInternegaNarocilaId: string = \"#TipInternegaNarocila\";\r\n private _sifraArtiklaDivId: string = \"#sifraArtiklaDiv\";\r\n private _kolicinaDivId: string = \"#kolicinaDiv\";\r\n private _sifraNapraveDivId: string = \"#sifraNapraveDiv\";\r\n private _artikelOpisDivId: string = \"#artikelOpisDiv\";\r\n private _priponkeBrisaneId: string = \"#PriponkeBrisane\";\r\n private _dataTipServisInputId: string = \"#dataTipServisInput\";\r\n private _merskaEnotaHiddenId: string = \"#ArtikelEnotaMere\";\r\n private _merskaEnotaDisplayId: string = \"#ArtikelEnotaMereDisplay\";\r\n private _artikelEnotaMereListJsonId: string = \"#ArtikelEnotaMereListJson\";\r\n private _selectArtikel: SaopMultiselect;\r\n private _selectNaprava: SaopMultiselect;\r\n private _saopUploadFiles: SaopUploadFiles;\r\n private _saopAttachmentList: SaopAttachmentList;\r\n private _tipInternegaNarocilaServisData: TipInternegaNarocilaServis;\r\n private _sifraVrsteInternegaNarocilaPriponkeId: string = \"#vrsteInternegaNarocilaPriponkeInput\";\r\n private _sifraVrsteInternegaNarocilaPriponke: SifraVrsteInternegaNarocilaPriponke;\r\n private _uploadAttachmentElementId = \"#uploadAttachment\";\r\n private _artikelEnotaMereViewModelList: ArtikelEnotaMereViewModel[] = [];\r\n\r\n constructor(viewId: string, formId: string, libName: string = \"\"){\r\n this.libName = libName; \r\n this._viewId = viewId;\r\n this._formId = formId;\r\n\r\n this._saopUploadFiles = new SaopUploadFiles(viewId, libName + \"._saopUploadFiles\"); \r\n this._saopAttachmentList = new SaopAttachmentList(\"#internalOrdersAttachments\", libName + \"._saopAttachmentList\");\r\n }\r\n\r\n init() {\r\n global.ConsoleLogDegug(\"NDKInternalOrderEditForm.init\");\r\n\r\n let _this = this;\r\n\r\n this._artikelEnotaMereViewModelList = $.parseJSON($(this._viewId + ' ' + this._artikelEnotaMereListJsonId).attr(\"data-artikelenotamereList\"));\r\n\r\n this._tipInternegaNarocilaServisData = this.getTipInternegaNarocilaServis();\r\n this._sifraVrsteInternegaNarocilaPriponke = this.getVrsteInternegaNarocilaPriponke();\r\n\r\n this._saopUploadFiles.initComponent({ controller: \"InternalOrder\", action: \"ValidateFiles\", validateAjax: true, formId: this._formId, validationDivId: this._viewId + \" #uploadFilesValidationsAjax\", allowSelectMultiFiles: false });\r\n this._saopUploadFiles.afterRefreshFilesList = this._saopUploadFiles.ajaxValidate;\r\n this._saopAttachmentList.initComponent(\r\n {\r\n validationFingerprintController: \"SPLDocument\",\r\n validationFingerprintAction: \"ValidateAttachmentFingerPrint\",\r\n validationFingerprintBannerDivId: this._viewId + \" #uploadFilesValidationsAjax\",\r\n validationController: \"SPLDocument\",\r\n validationAction: \"ValidateDownloadingDocumentAttachment\",\r\n validationBannerDivId: this._viewId + \" #uploadFilesValidationsAjax\",\r\n downloadController: \"SPLDocument\",\r\n downloadAction: \"DownloadDocumentAttachment\",\r\n deletedAttachmentListId: this._viewId + \" \" + this._priponkeBrisaneId\r\n });\r\n\r\n $(this._viewId + ' #btnOk').off('click');\r\n $(this._viewId + ' #btnOk').bind('click',\r\n function () {\r\n let _result = _this._saopUploadFiles.ajaxValidate();\r\n return _result;\r\n }\r\n ); \r\n\r\n // glede na vrsto internega narocila se doda/odstrani \"Zahtevek za servis naprave\"\r\n this.vrstaInternegaNarocilaChange()\r\n\r\n let vrstaInternegaNarocilaElement = $(this._viewId + \" \" + this._vrstaInternegaNarocilaId);\r\n $(vrstaInternegaNarocilaElement).off(\"change\");\r\n $(vrstaInternegaNarocilaElement).on('change', function () {\r\n _this.vrstaInternegaNarocilaChange();\r\n });\r\n\r\n // inicializiramo elemente glede na tip\r\n this.tipInternegaNarocilaChange();\r\n\r\n let tipInternegaNarocilaElement = $(this._viewId + \" \" + this._tipInternegaNarocilaId);\r\n $(tipInternegaNarocilaElement).off(\"change\");\r\n $(tipInternegaNarocilaElement).on('change', function (row) {\r\n _this.tipInternegaNarocilaChange();\r\n });\r\n\r\n this._selectNaprava = new SaopMultiselect();\r\n this._selectNaprava.afterInitializedControl = this.afterInitializedControlSelectNaprava.bind(this);\r\n this._selectNaprava.init(this._viewId + \" #sifraNapraveSelect\");\r\n\r\n this._selectArtikel = new SaopMultiselect();\r\n this._selectArtikel.afterInitializedControl = this.afterInitializedControlSelectArtikel.bind(this);\r\n this._selectArtikel.init(this._viewId + \" #sifraArtiklaSelect\");\r\n this._selectArtikel.afterChangeCommonEvent = this.showArtikelMerskaEnota.bind(this);\r\n }\r\n\r\n afterInitializedControlSelectNaprava(element: any) {\r\n global.ConsoleLogDegug(\"NDKInternalOrderEditForm.afterInitializedControlSelectNaprava\");\r\n this.inicializeEditSelectControl(this._selectNaprava);\r\n }\r\n\r\n afterInitializedControlSelectArtikel(element: any) {\r\n global.ConsoleLogDegug(\"NDKInternalOrderEditForm.afterInitializedControlSelectArtikel\");\r\n this.inicializeEditSelectControl(this._selectArtikel);\r\n }\r\n\r\n inicializeEditSelectControl(multiSelect: SaopMultiselect) {\r\n global.ConsoleLogDegug(\"NDKInternalOrderEditForm.inicializeEditSelectControl\");\r\n\r\n multiSelect.msContainer.css('width', '260px');\r\n }\r\n\r\n tipInternegaNarocilaChange(): void {\r\n global.ConsoleLogDegug(\"NDKInternalOrderEditForm.tipInternegaNarocilaChange\");\r\n\r\n let tipInternegaNarocilaElement = $(this._viewId + \" \" + this._tipInternegaNarocilaId);\r\n let izbranTip = tipInternegaNarocilaElement.val();\r\n\r\n let sifraArtiklaDivElement = $(this._viewId + \" \" + this._sifraArtiklaDivId);\r\n let kolicinaDivElement = $(this._viewId + \" \" + this._kolicinaDivId);\r\n let sifraNapraveDivElement = $(this._viewId + \" \" + this._sifraNapraveDivId);\r\n let artikelOpisDivElement = $(this._viewId + \" \" + this._artikelOpisDivId);\r\n\r\n if (this.isTipInternegaNarocilaOpisno(izbranTip)) {\r\n sifraArtiklaDivElement.hide();\r\n kolicinaDivElement.hide();\r\n sifraNapraveDivElement.hide();\r\n artikelOpisDivElement.show();\r\n }\r\n else if (this.isTipInternegaNarocilaArtikel(izbranTip)) {\r\n sifraArtiklaDivElement.show();\r\n kolicinaDivElement.show();\r\n sifraNapraveDivElement.hide();\r\n artikelOpisDivElement.hide();\r\n\r\n }\r\n else if (this.isTipInternegaNarocilaServis(izbranTip)) {\r\n sifraArtiklaDivElement.hide();\r\n kolicinaDivElement.hide();\r\n sifraNapraveDivElement.show();\r\n artikelOpisDivElement.show();\r\n }\r\n else {\r\n sifraArtiklaDivElement.hide();\r\n kolicinaDivElement.hide();\r\n sifraNapraveDivElement.hide();\r\n artikelOpisDivElement.hide();\r\n }\r\n }\r\n\r\n isTipInternegaNarocilaOpisno(tip: string) {\r\n return tip.toUpperCase() == 'O' ? true : false;\r\n }\r\n\r\n isTipInternegaNarocilaArtikel(tip: string) {\r\n return tip.toUpperCase() == 'A' ? true : false;\r\n }\r\n\r\n isTipInternegaNarocilaServis(tip: string) {\r\n return tip.toUpperCase() == 'S' ? true : false;\r\n }\r\n\r\n vrstaInternegaNarocilaChange(): void {\r\n global.ConsoleLogDegug(\"NDKInternalOrderEditForm.vrstaInternegaNarocilaChange\");\r\n\r\n if (this._tipInternegaNarocilaServisData.sifra == \"\") {\r\n return;\r\n }\r\n\r\n let vrstaInternegaNarocilaElement = $(this._viewId + \" \" + this._vrstaInternegaNarocilaId);\r\n let izbranaVrsta = vrstaInternegaNarocilaElement.val();\r\n\r\n let tipInternegaNarocilaHTMLElement = document.querySelector(this._viewId + \" \" + this._tipInternegaNarocilaId);\r\n let tipInternegaNarocilaJqueryElement = $(this._viewId + \" \" + this._tipInternegaNarocilaId);\r\n\r\n let jeIzbranaVrstaZaServis = this._tipInternegaNarocilaServisData.sifreVrsteInternegaNarocilaServis.includes(izbranaVrsta);\r\n\r\n if (isEmpty(izbranaVrsta) || isUnDefined(izbranaVrsta) || izbranaVrsta == \"?\" || !jeIzbranaVrstaZaServis) {\r\n // prazen izbor\r\n // preverimo, če je slucajno izbran zahtevek za servis, \r\n // potem je potrebno tudi spremeniti izbrano vrstaInternegaNarocila select element\r\n let izbranTip = tipInternegaNarocilaJqueryElement.val();\r\n\r\n if (this.isTipInternegaNarocilaServis(izbranTip)) {\r\n // izbrani tip je servis, tip internega narocila select element postavimo na prazen izbor\r\n $(this._viewId + \" \" + this._tipInternegaNarocilaId).val(\"?\").change();\r\n }\r\n\r\n // preverimo, ce je zahtevek za servis v seznamu tipov internega narocila in ga odstranimo\r\n if ($(this._viewId + \" \" + this._tipInternegaNarocilaId + \" option[value='\" + this._tipInternegaNarocilaServisData.sifra + \"']\").length > 0) {\r\n tipInternegaNarocilaHTMLElement.options[tipInternegaNarocilaHTMLElement.options.length - 1] = null;\r\n }\r\n }\r\n else {\r\n // ni prazen\r\n // preverimo, ce je zahtevek za servis ni v seznamu tipov internega narocila in ga dodamo\r\n if ($(this._viewId + \" \" + this._tipInternegaNarocilaId + \" option[value='\" + this._tipInternegaNarocilaServisData.sifra + \"']\").length == 0) {\r\n let servisOption = new Option(this._tipInternegaNarocilaServisData.naziv, this._tipInternegaNarocilaServisData.sifra);\r\n tipInternegaNarocilaHTMLElement.options[tipInternegaNarocilaHTMLElement.options.length] = servisOption;\r\n }\r\n }\r\n\r\n // preverimo, ce je izbrana vrsta za priponke\r\n let jeIzbranaVrstaZaPriponke = this._sifraVrsteInternegaNarocilaPriponke.sifreVrsteInternegaNarocila.includes(izbranaVrsta);\r\n let attachmentElement = $(this._viewId + \" \" + this._uploadAttachmentElementId);\r\n\r\n if (isEmpty(izbranaVrsta) || isUnDefined(izbranaVrsta) || izbranaVrsta == \"?\" || !jeIzbranaVrstaZaPriponke) {\r\n attachmentElement.hide();\r\n }\r\n else {\r\n attachmentElement.show();\r\n }\r\n }\r\n\r\n getTipInternegaNarocilaServis(): TipInternegaNarocilaServis {\r\n global.ConsoleLogDegug(\"NDKInternalOrderEditForm.getTipInternegaNarocilaServis\");\r\n\r\n let data = new TipInternegaNarocilaServis();\r\n let element = $(this._viewId + \" \" + this._dataTipServisInputId);\r\n\r\n data = element.data('tipservis');\r\n\r\n return data;\r\n }\r\n\r\n getVrsteInternegaNarocilaPriponke(): SifraVrsteInternegaNarocilaPriponke {\r\n global.ConsoleLogDegug(\"NDKInternalOrderEditForm.getVrsteInternegaNarocilaPriponke\");\r\n\r\n let data = new SifraVrsteInternegaNarocilaPriponke();\r\n let element = $(this._viewId + \" \" + this._sifraVrsteInternegaNarocilaPriponkeId);\r\n\r\n data = element.data('vrsteinterneganarocilapriponke');\r\n\r\n return data;\r\n }\r\n\r\n showArtikelMerskaEnota(element: any) {\r\n global.ConsoleLogDegug(\"NDKInternalOrderEditForm.showArtikelMerskaEnota\");\r\n\r\n // preberemo, katere sifre zaposlenih sodijo v izbrane skupine\r\n let izbraniArtikel = ((element.val().toString())).trim();\r\n let izbraniArtikellMerskaEnota = \"\";\r\n if (!isEmpty(izbraniArtikel)) {\r\n // poisci mersko enoto za artikel\r\n this._artikelEnotaMereViewModelList.forEach((item) => {\r\n console.log(\"item\", item);\r\n if (item.SifraArtikla.trim() === izbraniArtikel.trim()) {\r\n izbraniArtikellMerskaEnota = item.MerskaEnota;\r\n }\r\n });\r\n }\r\n\r\n // zapisi mersko enoto v text kontrole\r\n $(this._viewId + ' ' + this._merskaEnotaHiddenId).val(izbraniArtikellMerskaEnota);\r\n $(this._viewId + ' ' + this._merskaEnotaDisplayId).val(izbraniArtikellMerskaEnota);\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","/// \r\nimport { filterTableRows, global, isUnDefined, setModalFormZIndex } from \"../Common/saop-common\";\r\nimport { SaopWebGrid,SaopWebGridProperties,SaopWebGridToolbar,SaopWebGridToolbarButton,SaopWebDataTable} from \"../Components/saop-grid\";\r\nimport { SaopWfAction } from \"../Core/saop-view-form\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { NDKInternalOrdersView } from \"./NDKInternalOrders-view\";\r\nimport { SaopTranslationService } from \"../Core/saop-translate\";\r\n\r\nclass InternaNarocilaData {\r\n letoNarocila: number;\r\n stevilkaNarocila: number;\r\n stevilkaVrstice: number;\r\n deleteFingerprint: string;\r\n}\r\n\r\nexport class NDKInternalOrdersActiveGridOptions {\r\n dashboard: boolean = false;\r\n showToolbar: boolean = true;\r\n showFilter: boolean = true;\r\n}\r\n\r\nexport class NDKInternalOrdersActiveGrid {\r\n private libName: string;\r\n private _gridOptions: NDKInternalOrdersActiveGridOptions;\r\n //\r\n private buttonCopyDisabledDivId: string = \"#copyActiveInternalOrderDisabledDiv\";\r\n private buttonCopyDivId: string = \"#copyActiveInternalOrderDiv\";\r\n private divAktivnaId: string = \"#internaNarocilaAktivnaDiv\";\r\n private webGridAktivnaId: string = \"#NDKInternaNarocilaAktivnaGrid\";\r\n private webGridAktivnaRowsBodyId: string = \"#NDKInternaNarocilaAktivnaGridBodyAjax\";\r\n public webGrid: SaopWebGrid;\r\n public ndkInternalOrdersView: NDKInternalOrdersView;\r\n public ndkInternalOrdersFullView: NDKInternalOrdersView;\r\n public formTranslationService: SaopTranslationService;\r\n private _searchValueId: string = \"#ActiveTableSearchValue\";\r\n private _mainFormDiv: JQuery;\r\n private _searchValue: JQuery;\r\n\r\n constructor(libName: string, gridOptions: NDKInternalOrdersActiveGridOptions = null) {\r\n if (isUnDefined(gridOptions)) {\r\n gridOptions = new NDKInternalOrdersActiveGridOptions();\r\n }\r\n this._gridOptions = gridOptions;\r\n\r\n this.libName = libName; \r\n this.formTranslationService = new SaopTranslationService();\r\n } \r\n\r\n initView() {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersActiveGrid.initView\");\r\n\r\n this._mainFormDiv = $(this.divAktivnaId);\r\n\r\n // prevajanje\r\n this.setFormTerminologyList();\r\n\r\n // refresh active internal orders\r\n this.refreshActiveInternalOrdersGridData();\r\n\r\n // init edit view\r\n this.initEditView();\r\n }\r\n\r\n private setFormTerminologyList() {\r\n let terminology = [\"Interno naročilo za kopiranje ni izbrano.\"];\r\n\r\n this.formTranslationService.setTranslationsList(terminology);\r\n } \r\n\r\n initEditView(): void {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersActiveGrid.initEditView\");\r\n\r\n this.ndkInternalOrdersView = new NDKInternalOrdersView(\"#ndkInternalOrdersView001\", this.libName + \".ndkInternalOrdersView\");\r\n this.ndkInternalOrdersView.refreshData = this.refreshDataAfterEditView.bind(this);\r\n\r\n this.ndkInternalOrdersFullView = new NDKInternalOrdersView(\"#ndkInternalOrdersView002\", this.libName + \".ndkInternalOrdersFullView\");\r\n this.ndkInternalOrdersFullView.fullScreen = true; \r\n this.ndkInternalOrdersFullView.refreshData = this.refreshDataAfterEditView.bind(this);\r\n }\r\n\r\n // metoda se izvede po edit, add ali delete metodi v this.ndkInternalOrdersView\r\n refreshDataAfterEditView(sender: any): void { \r\n global.ConsoleLogDegug(\"NDKInternalOrdersActiveGrid.refreshDataAfterEditView\");\r\n\r\n // osvezi se tabela\r\n this.refreshActiveInternalOrdersGridData(true);\r\n // klice se external metoda, da se lahko osvezijo se drugi podatki npr. right summary data\r\n this.afterRefreshDataAfterEditViewExternal(sender);\r\n }\r\n\r\n public afterRefreshDataAfterEditViewExternal(sender: any): void {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersActiveGrid.afterRefreshDataAfterEditViewExternal\");\r\n }\r\n\r\n refreshActiveInternalOrdersGridData(samoVrstice: boolean = false): void {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersActiveGrid.refreshActiveInternalOrdersGridData\");\r\n\r\n let _this = this;\r\n let params = { samoVrstice: samoVrstice, dashboard: this._gridOptions.dashboard };\r\n\r\n let saopServicesCore = new SaopServicesCore();\r\n saopServicesCore.afterDone = function (response) {\r\n _this.setCopyButtonsVisibility(false);\r\n _this.refreshGridData(response);\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action:\"InternalOrder/GetActiveInternalOrdersTable\" \r\n ,data:params\r\n ,type:\"GET\"\r\n }); \r\n }\r\n\r\n refreshGridData(htmlContent: string) {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersActiveGrid.refreshGridData\");\r\n\r\n if ($(this.webGridAktivnaId).length) {\r\n $(this.webGridAktivnaRowsBodyId).html(htmlContent);\r\n this.initWebGridListners();\r\n if (!isUnDefined(this._searchValue) && this._searchValue.length) {\r\n this.executeFilterSearch(this._searchValue.val().toString());\r\n }\r\n }\r\n else {\r\n $(this.divAktivnaId).html(htmlContent);\r\n this.getWebGridToolbarAndInitWebGrid(); \r\n }\r\n }\r\n\r\n getWebGridToolbarAndInitWebGrid(): void {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersActiveGrid.getWebGridToolbarAndInitWebGrid\");\r\n\r\n let _this = this;\r\n let params = { javascriptKnjiznica: _this.libName };\r\n\r\n let saopServicesCore = new SaopServicesCore();\r\n saopServicesCore.afterDone = function (response) {\r\n _this.setCopyButtonsVisibility(false);\r\n _this.initWebGrid(response);\r\n _this.initFilterControls(); \r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"InternalOrder/GetActiveTableToolbar\"\r\n , data: params\r\n , type: \"GET\"\r\n });\r\n }\r\n\r\n initWebGrid(toolbarTemplate: string = \"\") {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersActiveGrid.initWebGrid\");\r\n\r\n let captionToolbar = $(this.webGridAktivnaId).attr(\"caption-toolbar\");\r\n let captionAddButton = $(this.webGridAktivnaId).attr(\"caption-addButton\");\r\n //\r\n this.webGrid = new SaopWebGrid(this.libName + \".webGrid\");\r\n this.webGrid.afterColumnCheckboxChanged = this.webGridAfterColumnCheckboxChanged.bind(this);\r\n let gridProperties: SaopWebGridProperties;\r\n let gridToolbar: SaopWebGridToolbar;\r\n let toolbarButtons: SaopWebGridToolbarButton[] = [];\r\n let dataTable: SaopWebDataTable;\r\n //\r\n if (this._gridOptions.showToolbar) {\r\n toolbarButtons.push({ id: \"\", caption: \"\", template: toolbarTemplate });\r\n gridToolbar = { id: \"saopWebGridTB1\", caption: captionToolbar, buttons: toolbarButtons };\r\n }\r\n\r\n dataTable = {enabled: true};\r\n\r\n gridProperties = {\r\n gridId: this.webGridAktivnaId\r\n , toolbar: gridToolbar\r\n , dataTable: dataTable\r\n };\r\n //\r\n this.webGrid.init(gridProperties);\r\n\r\n this.initWebGridListners();\r\n\r\n this.setDashboardSpecificView();\r\n }\r\n\r\n initWebGridListners() {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersActiveGrid.initWebGridListners\");\r\n\r\n let _this = this;\r\n\r\n // prikaz full screen ko klikne na vrstico\r\n $(\"body\").off(\"click\", this.webGridAktivnaId + \" tr td:not(.td-action,.td-action-checkbox)\");\r\n $(\"body\").on(\"click\", this.webGridAktivnaId + \" tr td:not(.td-action,.td-action-checkbox)\", function () {\r\n let selectedRow = $(this).closest(\"tr\")[0];\r\n let data = _this.getInternaNarocilaDataAttribute(selectedRow);\r\n\r\n if (!isUnDefined(data.letoNarocila) && !isUnDefined(data.stevilkaNarocila) && !isUnDefined(data.stevilkaVrstice)) {\r\n _this.ndkInternalOrdersFullView.showViewForm(SaopWfAction.wfaEditRecord, { letoNarocila: data.letoNarocila, stevilkaNarocila: data.stevilkaNarocila, stevilkaVrstice: data.stevilkaVrstice });\r\n }\r\n });\r\n\r\n $(this.webGridAktivnaId + \" .NDKInternaNarocilaGrid_edit\").off(\"click\");\r\n $(this.webGridAktivnaId + \" .NDKInternaNarocilaGrid_edit\").on('click', function (row) {\r\n global.ConsoleLogDegug(\"NDKInternaNarocilaGrid_edit.click\");\r\n let _btnEdit = row.currentTarget;\r\n let btnEnabled = _btnEdit.getAttribute(\"data-enabled\");\r\n if (btnEnabled.toString().toLowerCase() == \"true\") {\r\n let data = _this.getInternaNarocilaDataAttribute(_btnEdit);\r\n _this.ndkInternalOrdersFullView.showViewForm(SaopWfAction.wfaEditRecord, { letoNarocila: data.letoNarocila, stevilkaNarocila: data.stevilkaNarocila, stevilkaVrstice: data.stevilkaVrstice }); \r\n }\r\n });\r\n\r\n $(this.webGridAktivnaId + \" .NDKInternaNarocilaGrid_delete\").off(\"click\");\r\n $(this.webGridAktivnaId + \" .NDKInternaNarocilaGrid_delete\").on('click', function (row) {\r\n global.ConsoleLogDegug(\"NDKInternaNarocilaGrid_delete.click\");\r\n let _btnDelete = row.currentTarget;\r\n let btnEnabled = _btnDelete.getAttribute(\"data-enabled\");\r\n if (btnEnabled.toString().toLowerCase() == \"true\") {\r\n let data = _this.getInternaNarocilaDataAttribute(_btnDelete);\r\n _this.ndkInternalOrdersView.deleteRecord({ letoNarocila: data.letoNarocila, stevilkaNarocila: data.stevilkaNarocila, stevilkaVrstice: data.stevilkaVrstice, deleteFingerprint: data.deleteFingerprint });\r\n }\r\n });\r\n\r\n this.webGrid.initWebGridColumnCheckboxBindClickEvent();\r\n }\r\n\r\n webGridAfterColumnCheckboxChanged(): void {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersActiveGrid.webGridAfterColumnCheckboxChanged\");\r\n\r\n let checked = this.getCheckboxCheckValue(this.webGrid.markedColumnCheckbox);;\r\n this.setCopyButtonsVisibility(checked);\r\n }\r\n\r\n setCopyButtonsVisibility(checked: boolean): void {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersActiveGrid.setCopyButtonsVisibility\");\r\n\r\n let buttonCopyDisabledDivElement = this._mainFormDiv.find(this.buttonCopyDisabledDivId);\r\n let buttonCopyDivElement = this._mainFormDiv.find(this.buttonCopyDivId);\r\n\r\n if (checked == false) {\r\n buttonCopyDisabledDivElement.show();\r\n buttonCopyDivElement.hide();\r\n } else {\r\n buttonCopyDisabledDivElement.hide();\r\n buttonCopyDivElement.show();\r\n }\r\n }\r\n\r\n getInternaNarocilaDataAttribute(element: HTMLElement): InternaNarocilaData {\r\n let data = new InternaNarocilaData();\r\n\r\n data.letoNarocila = parseInt(element.getAttribute(\"data-letonarocila\"));\r\n data.stevilkaNarocila = parseInt(element.getAttribute(\"data-stevilkanarocila\"));\r\n data.stevilkaVrstice = parseInt(element.getAttribute(\"data-stevilkavrstice\"));\r\n data.deleteFingerprint = element.getAttribute(\"data-deletefingerprint\");\r\n\r\n return data;\r\n }\r\n\r\n initFilterControls(): void {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersActiveGrid.initFilterControls\");\r\n\r\n this._searchValue = this._mainFormDiv.find(this._searchValueId);\r\n let _this = this;\r\n\r\n this._searchValue.off(\"keyup\");\r\n this._searchValue.on(\"keyup\", function () {\r\n _this.executeFilterSearch($(this).val().toString());\r\n });\r\n }\r\n\r\n executeFilterSearch(searchVal: string): void {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersActiveGrid.executeFilterSearch\");\r\n\r\n // tole ni delovalo: ko se je spremenilo leto, je se vedno filtriral stare podatke od prejsnjega leta\r\n //let oTable = this.webGrid.dataTable;\r\n //oTable.search(searchVal).draw();\r\n\r\n filterTableRows(searchVal, this.divAktivnaId);\r\n }\r\n\r\n addRecord() {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersActiveGrid.addRecord\");\r\n this.ndkInternalOrdersView.showViewForm(SaopWfAction.wfaAddRecord, null, null);\r\n } \r\n\r\n copyRecord() {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersActiveGrid.copyRecord\");\r\n this.copyInternalOrder(this.webGrid.markedColumnCheckbox);\r\n }\r\n\r\n copyInternalOrder(checkbox: JQuery): void {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersActiveGrid.copyInternalOrder\");\r\n\r\n let checked = this.getCheckboxCheckValue(checkbox);\r\n\r\n if (checked) {\r\n let data = this.getInternaNarocilaDataAttribute(checkbox[0]);\r\n this.ndkInternalOrdersView.showViewForm(SaopWfAction.wfaAddRecord, { letoNarocilaInput: data.letoNarocila, stevilkaNarocilaInput: data.stevilkaNarocila, stevilkaVrsticeInput: data.stevilkaVrstice }, null);\r\n }\r\n else {\r\n //potrebno izbrati vrstico \"Interno naročilo za kopiranje ni izbrano.\"\r\n alertify.message(this.formTranslationService.translate(\"Interno naročilo za kopiranje ni izbrano.\"));\r\n }\r\n }\r\n\r\n getCheckboxCheckValue(checkbox: JQuery): boolean {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersActiveGrid.getCheckboxCheckValue\");\r\n\r\n let checked = false;\r\n\r\n if (isUnDefined(checkbox)) {\r\n checked = false;\r\n } else {\r\n checked = checkbox.is(':checked');\r\n }\r\n\r\n return checked;\r\n }\r\n\r\n setDashboardSpecificView(): void {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersActiveGrid.setDashboardSpecificView\");\r\n\r\n let isDashBNoardView = $(this.webGridAktivnaId).attr(\"data-dashboardview\").toLowerCase() == \"true\" ? true : false;\r\n\r\n if (isDashBNoardView) {\r\n $(this.webGridAktivnaId + \"_wrapper\").addClass(\"saop-table-dashboard-odsotnost\");\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { filterTableRows, global, isUnDefined, setModalFormZIndex } from \"../Common/saop-common\";\r\nimport { SaopWebGrid,SaopWebGridProperties,SaopWebGridToolbar,SaopWebGridToolbarButton,SaopWebDataTable} from \"../Components/saop-grid\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { SaopWfAction } from \"../core/saop-view-form\";\r\nimport { NDKInternalOrdersView } from \"./NDKInternalOrders-view\";\r\n\r\nclass ArchivedFilterValues {\r\n letoNarocila: number;\r\n}\r\n\r\nclass InternaNarocilaData {\r\n letoNarocila: number;\r\n stevilkaNarocila: number;\r\n stevilkaVrstice: number;\r\n deleteFingerprint: string;\r\n}\r\n\r\nexport class NDKInternalOrdersArchivedGrid {\r\n private libName: string;\r\n\r\n private buttonCopyDisabledDivId: string = \"#copyArchivedInternalOrderDisabledDiv\";\r\n private buttonCopyDivId: string = \"#copyArchivedInternalOrderDiv\";\r\n private divArhiviranaId: string = \"#internaNarocilaArhiviranaDiv\";\r\n private webGridArhiviranaId: string = \"#NDKInternaNarocilaArhiviranaGrid\";\r\n private webGridArhiviranaRowsBodyId: string = \"#NDKInternaNarocilaArhiviranaGridBodyAjax\";\r\n public webGrid: SaopWebGrid;\r\n public ndkInternalOrdersFullView: NDKInternalOrdersView;\r\n public letoFilterId: string = \"#LetoNarocila\";\r\n private _searchValueId: string = \"#ArchivedTableSearchValue\";\r\n private _mainFormDiv: JQuery;\r\n private _searchValue: JQuery;\r\n\r\n constructor(libName: string) {\r\n this.libName = libName; \r\n } \r\n\r\n initView() {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersArchivedGrid.initView\");\r\n\r\n this._mainFormDiv = $(this.divArhiviranaId);\r\n\r\n // archived internal orders\r\n this.refreshArchiveInternalOrdersGridData();\r\n\r\n // init edit view\r\n this.initEditView();\r\n }\r\n\r\n initEditView(): void {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersArchivedGrid.initEditView\");\r\n\r\n this.ndkInternalOrdersFullView = new NDKInternalOrdersView(\"#ndkInternalOrdersView002\", this.libName + \".ndkInternalOrdersFullView\");\r\n this.ndkInternalOrdersFullView.fullScreen = true;\r\n }\r\n\r\n refreshArchiveInternalOrdersGridData(letoNarocila: number = null, samoVrstice: boolean = false): void {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersArchivedGrid.refreshArchiveInternalOrdersGridData\");\r\n\r\n let _this = this;\r\n let params = { letoNarocila: letoNarocila, samoVrstice: samoVrstice };\r\n\r\n let saopServicesCore = new SaopServicesCore();\r\n saopServicesCore.afterDone = function (response) {\r\n _this.setCopyButtonsVisibility(false);\r\n _this.refreshGridData(response);\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"InternalOrder/GetArchivedInternalOrdersTable\"\r\n , data: params\r\n , type: \"GET\"\r\n });\r\n }\r\n\r\n refreshGridData(htmlContent: string) {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersArchivedGrid.refreshGridData\");\r\n\r\n if ($(this.webGridArhiviranaId).length) {\r\n $(this.webGridArhiviranaRowsBodyId).html(htmlContent);\r\n this.initWebGridListners();\r\n this.executeFilterSearch(this._searchValue.val().toString());\r\n }\r\n else {\r\n $(this.divArhiviranaId).html(htmlContent);\r\n this.getWebGridToolbarAndInitWebGrid(); \r\n }\r\n }\r\n\r\n getWebGridToolbarAndInitWebGrid(): void {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersArchivedGrid.getWebGridToolbarAndInitWebGrid\");\r\n\r\n let _this = this;\r\n let params = { javascriptKnjiznica: _this.libName };\r\n\r\n let saopServicesCore = new SaopServicesCore();\r\n saopServicesCore.afterDone = function (response) {\r\n _this.setCopyButtonsVisibility(false);\r\n _this.initWebGrid(response);\r\n _this.initFilterControls(); \r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"InternalOrder/GetArchivedTableToolbar\"\r\n , data: params\r\n , type: \"GET\"\r\n });\r\n }\r\n\r\n initWebGrid(toolbarTemplate: string) {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersArchivedGrid.initWebGrid\");\r\n\r\n let captionToolbar = $(this.webGridArhiviranaId).attr(\"caption-toolbar\");\r\n //\r\n this.webGrid = new SaopWebGrid(this.libName + \".webGrid2\");\r\n this.webGrid.afterColumnCheckboxChanged = this.webGridAfterColumnCheckboxChanged.bind(this);\r\n let gridProperties: SaopWebGridProperties;\r\n let gridToolbar: SaopWebGridToolbar;\r\n let toolbarButtons: SaopWebGridToolbarButton[] = [];\r\n let dataTable: SaopWebDataTable;\r\n //\r\n // id in caption je ze v template\r\n toolbarButtons.push({ id: \"\", caption: \"\", template: toolbarTemplate });\r\n //\r\n gridToolbar = { id: \"saopWebGridTB2\", caption: captionToolbar, buttons: toolbarButtons };\r\n\r\n dataTable = { enabled:true };\r\n\r\n gridProperties = {\r\n gridId: this.webGridArhiviranaId\r\n , toolbar: gridToolbar\r\n , dataTable: dataTable\r\n };\r\n //\r\n this.webGrid.init(gridProperties);\r\n\r\n this.initWebGridListners();\r\n }\r\n\r\n initWebGridListners() {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersArchivedGrid.initWebGridListners\");\r\n\r\n let _this = this;\r\n\r\n // prikaz readonly full screen \r\n $(\"body\").off(\"click\", this.webGridArhiviranaId + \" tr td:not(.td-action,.td-action-checkbox)\");\r\n $(\"body\").on(\"click\", this.webGridArhiviranaId + \" tr td:not(.td-action,.td-action-checkbox)\", function () {\r\n let selectedRow = $(this).closest(\"tr\")[0];\r\n let data = _this.getDataValues(selectedRow);\r\n\r\n if (!isUnDefined(data.letoNarocila) && !isUnDefined(data.stevilkaNarocila) && !isUnDefined(data.stevilkaVrstice)) {\r\n _this.ndkInternalOrdersFullView.showViewForm(SaopWfAction.wfaEditRecord, { letoNarocila: data.letoNarocila, stevilkaNarocila: data.stevilkaNarocila, stevilkaVrstice: data.stevilkaVrstice });\r\n }\r\n });\r\n\r\n this.webGrid.initWebGridColumnCheckboxBindClickEvent();\r\n }\r\n\r\n webGridAfterColumnCheckboxChanged(): void {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersArchivedGrid.webGridAfterColumnCheckboxChanged\");\r\n\r\n let checked = this.getCheckboxCheckValue(this.webGrid.markedColumnCheckbox);;\r\n this.setCopyButtonsVisibility(checked);\r\n }\r\n\r\n setCopyButtonsVisibility(checked: boolean): void {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersArchivedGrid.setCopyButtonsVisibility\");\r\n\r\n let buttonCopyDisabledDivElement = this._mainFormDiv.find(this.buttonCopyDisabledDivId);\r\n let buttonCopyDivElement = this._mainFormDiv.find(this.buttonCopyDivId);\r\n\r\n if (checked == false) {\r\n buttonCopyDisabledDivElement.show();\r\n buttonCopyDivElement.hide();\r\n } else {\r\n buttonCopyDisabledDivElement.hide();\r\n buttonCopyDivElement.show();\r\n }\r\n }\r\n\r\n getDataValues(element: HTMLElement): InternaNarocilaData {\r\n let data = new InternaNarocilaData();\r\n\r\n data.letoNarocila = parseInt(element.getAttribute(\"data-letonarocila\"));\r\n data.stevilkaNarocila = parseInt(element.getAttribute(\"data-stevilkanarocila\"));\r\n data.stevilkaVrstice = parseInt(element.getAttribute(\"data-stevilkavrstice\"));\r\n\r\n return data;\r\n }\r\n\r\n initFilterControls(): void {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersArchivedGrid.initFilterControls\");\r\n\r\n this._searchValue = this._mainFormDiv.find(this._searchValueId);\r\n let _this = this;\r\n\r\n this._searchValue.off(\"keyup\");\r\n this._searchValue.on(\"keyup\", function () {\r\n _this.executeFilterSearch($(this).val().toString());\r\n });\r\n }\r\n\r\n executeFilterSearch(searchVal: string): void {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersArchivedGrid.executeFilterSearch\");\r\n\r\n // tole ni delovalo: ko se je spremenilo leto, je se vedno filtriral stare podatke od prejsnjega leta\r\n //let oTable = this.webGrid.dataTable;\r\n //oTable.search(searchVal).draw();\r\n\r\n filterTableRows(searchVal, this.divArhiviranaId);\r\n }\r\n\r\n copyArchiveInternalOrder(): void {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersArchivedGrid.copyArchiveInternalOrder\");\r\n\r\n this.copyArchiveInternalOrderExternal(this.webGrid.markedColumnCheckbox);\r\n }\r\n\r\n copyArchiveInternalOrderExternal(checkbox: JQuery): void {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersArchivedGrid.copyArchiveInternalOrderExternal\");\r\n }\r\n\r\n archivedFiltersChanged(): void {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersArchivedGrid.archivedFiltersChanged\");\r\n\r\n let archivedFilterValues = this.getArchivedFilterValues();\r\n\r\n this.refreshArchiveInternalOrdersGridData(archivedFilterValues.letoNarocila, true);\r\n }\r\n\r\n getArchivedFilterValues(): ArchivedFilterValues {\r\n global.ConsoleLogDegug(\"NDKInternalOrdersArchivedGrid.getFilterValues\");\r\n\r\n let leto = null;\r\n let letoInput = $(this.letoFilterId)\r\n let letoStr = String(letoInput.val());\r\n if (letoStr.length == 4 || letoStr.length == 0) {\r\n if (letoStr.length == 4) {\r\n leto = +letoStr;\r\n }\r\n }\r\n\r\n let result = new ArchivedFilterValues();\r\n result.letoNarocila = leto;\r\n return result;\r\n }\r\n\r\n getCheckboxCheckValue(checkbox: JQuery): boolean {\r\n let checked = false;\r\n\r\n if (isUnDefined(checkbox)) {\r\n checked = false;\r\n } else {\r\n checked = checkbox.is(':checked');\r\n }\r\n\r\n return checked;\r\n }\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { SaopViewForm } from \"../Core/saop-view-form\";\r\n\r\nexport class NDKInternalOrdersView extends SaopViewForm {\r\n\r\n constructor(viewId:string,libName:string = \"\"){\r\n super(viewId, libName);\r\n this.setDictionary(); \r\n this.title = this.translationService.translate(\"Interno naročilo\");\r\n this.addRecordEndpoint = \"InternalOrder/CreateInternalOrder\";\r\n this.editRecordEndpoint = \"InternalOrder/EditInternalOrder\";\r\n this.deleteRecordEndpoint = \"InternalOrder/DeleteInternalOrder\"; \r\n }\r\n\r\n setDictionary(){\r\n let dictionary: string[] = [\"Interno naročilo\",\"Brisanje\",\"Ali ste prepričani, da želite izbrisati interno naročilo?\"];\r\n this.setTerminologyList(dictionary);\r\n } \r\n \r\n public deleteRecord(deleteData:any):void{\r\n let deletTitle = this.translationService.translate(\"Brisanje\");\r\n let deleteMessage = this.translationService.translate(\"Ali ste prepričani, da želite izbrisati interno naročilo?\"); \r\n super.deleteRecord(deletTitle,deleteMessage,deleteData);\r\n } \r\n\r\n public afterViewShowSuccess(sender:any):void{\r\n this.LoadViewEvents();\r\n }\r\n\r\n public LoadViewEvents ():void{\r\n let _viewDiv = $(this.id);\r\n if (_viewDiv.length == 0) {\r\n return;\r\n }\r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { global, isUnDefined, setModalFormZIndex } from \"../Common/saop-common\";\r\n//import { SaopRightSidebar,SaopRightSidebarView } from '../Components/saop-right-sidebar';\r\nimport { NDKInternalOrdersActiveGrid } from \"./NDKInternalOrders-Active-grid\";\r\nimport { NDKInternalOrdersArchivedGrid } from \"./NDKInternalOrders-Archived-grid\";\r\n\r\nexport class NDKInternalOrders {\r\n private libName: string;\r\n\r\n private ndkInternalOrdersActiveGrid: NDKInternalOrdersActiveGrid;\r\n private ndkInternalOrdersArchivedGrid: NDKInternalOrdersArchivedGrid;\r\n //public rightSidebar: SaopRightSidebar;\r\n \r\n constructor(libName: string) {\r\n this.libName = libName; \r\n\r\n this.ndkInternalOrdersActiveGrid = new NDKInternalOrdersActiveGrid(this.libName + \".ndkInternalOrdersActiveGrid\");\r\n this.ndkInternalOrdersActiveGrid.afterRefreshDataAfterEditViewExternal = this.refreshDataAfterEditView.bind(this);\r\n\r\n this.ndkInternalOrdersArchivedGrid = new NDKInternalOrdersArchivedGrid(this.libName + \".ndkInternalOrdersArchivedGrid\");\r\n this.ndkInternalOrdersArchivedGrid.copyArchiveInternalOrderExternal = this.copyInternalOrder.bind(this);\r\n } \r\n\r\n initView() {\r\n global.ConsoleLogDegug(\"NDKInternalOrders.initView\");\r\n\r\n // active internal orders\r\n this.ndkInternalOrdersActiveGrid.initView();\r\n\r\n // archived internal orders\r\n this.ndkInternalOrdersArchivedGrid.initView();\r\n\r\n // init sidebar right\r\n //this.initRightSidebar();\r\n }\r\n\r\n //initRightSidebar() {\r\n // global.ConsoleLogDegug(\"NDKInternalOrders.initRightSidebar\");\r\n\r\n // this.rightSidebar = new SaopRightSidebar();\r\n // this.rightSidebar.bindCarouselDiv(\"#right-sidebar-ajax\",SaopRightSidebarView.InternalOrders);\r\n // this.rightSidebar.refreshNdkInternalOrdersSummary(\"#ndkInternalOrdersSummary\",\"#saopLoadingSidebarr\"); \r\n //}\r\n\r\n refreshDataAfterEditView(): void { \r\n global.ConsoleLogDegug(\"NDKInternalOrders.refreshDataAfterEditView\");\r\n\r\n //this.rightSidebar.refreshNdkInternalOrdersSummary(\"#ndkInternalOrdersSummary\", \"#saopLoadingSidebarr\"); \r\n }\r\n\r\n // metoda iz archived grid klasa\r\n copyInternalOrder(checkbox: JQuery): void {\r\n global.ConsoleLogDegug(\"NDKInternalOrders.copyInternalOrder\");\r\n\r\n this.ndkInternalOrdersActiveGrid.copyInternalOrder(checkbox);\r\n }\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { global, isUnDefined, isEmpty } from \"../Common/saop-common\";\r\nimport { SaopWfAction } from \"../Core/saop-view-form\";\r\nimport { SaopMultiselectOptions } from \"../Components/saop-multiselect\";\r\nimport { SaopSelectDropDown } from \"../Components/saop-select-dropdown\";\r\nimport { OPNNalogeView } from \"../OPN/OPNNaloge-view\";\r\nimport { SaopServicesCore, SaopServicesCoreParams } from \"../Core/saop-services-core\";\r\n\r\nexport class OPNNalogeSelect extends SaopSelectDropDown {\r\n // private __target:string;\r\n // private __caption:string; \r\n private __libName:string;\r\n public _opnNalogeView:OPNNalogeView;\r\n\r\n constructor(libName:string = \"\", options:SaopMultiselectOptions = null) {\r\n global.ConsoleLogDegug(\"OPNNalogeSelect\");\r\n super(libName,options);\r\n this.__libName = libName; \r\n //\r\n this._opnNalogeView = new OPNNalogeView(\"#opnTasksPopupForm\",this.__libName + \"._opnNalogeView\");\r\n this._opnNalogeView.fullScreen = false; \r\n this._opnNalogeView.afterSubmitSuccess = this.refreshDataAfterSubmit.bind(this); \r\n } \r\n\r\n init(target: string = \"\", caption = \"\" ){\r\n // this._target = target;\r\n // this._caption = caption;\r\n //\r\n if (target.length == 0){\r\n target = \"SifraNaloge\";\r\n }\r\n if (caption.length == 0){\r\n caption = \"Naloge\";\r\n }\r\n super.init(target, caption);\r\n //\r\n }\r\n\r\n addRecord(){\r\n let _fullTitle = this._opnNalogeView.translationService.translate(\"Naloge\");\r\n this._opnNalogeView.fullTitle = _fullTitle;\r\n this._opnNalogeView.showViewForm(SaopWfAction.wfaAddRecord,{ }); \r\n } \r\n\r\n editRecord(_sifraNaloge:string){\r\n let _fullTitle = this._opnNalogeView.translationService.translate(\"Naloge\");\r\n this._opnNalogeView.fullTitle = _fullTitle;\r\n this._opnNalogeView.showViewForm(SaopWfAction.wfaEditRecord,{ sifraNaloge: _sifraNaloge, fullView: false }); \r\n } \r\n\r\n public onAddBtnClick(sender:any):void{\r\n global.ConsoleLogDegug(\"onAddBtnClick...SifraLokacije\");\r\n this.addRecord();\r\n } \r\n\r\n public onEditBtnClick(sender:any):void{\r\n global.ConsoleLogDegug(\"onEditBtnClick...SifraLokacije\");\r\n let _sifraNaloge = this.selectedCB.val();\r\n this.editRecord(_sifraNaloge); \r\n } \r\n\r\n public refreshDataAfterSubmit(result: any): void {\r\n global.ConsoleLogDegug(\"submit.afterExecuteSuccess\");\r\n //\r\n if ( (isUnDefined(result.success) == false) && (result.success == true) ) {\r\n let _sifraNaloge = \"\";\r\n if (isUnDefined(result.data) == false) {\r\n let jsonData = JSON.parse(result.data);\r\n _sifraNaloge = jsonData.SifraNaloge;\r\n } \r\n //\r\n let _servicesParams:SaopServicesCoreParams = {\r\n action: \"OpnTasks/GetList\"\r\n , data: {sifraNaloge:_sifraNaloge}\r\n , type: \"GET\"\r\n };\r\n \r\n this.getDropDownItemsData(_servicesParams, _sifraNaloge);\r\n } \r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { SaopViewForm } from \"../Core/saop-view-form\";\r\nimport { SaopSifranti } from \"../Components/saop-sifranti\";\r\n\r\n\r\nexport class OPNNalogeView extends SaopViewForm {\r\n private _saopSifranti:SaopSifranti;\r\n\r\n constructor(viewId:string,libName:string = \"\"){\r\n super(viewId,libName);\r\n this.title = this.translationService.translate(\"Naloge\");\r\n this.addRecordEndpoint = \"OpnTasks/Create\";\r\n this.editRecordEndpoint = \"OpnTasks/Edit\";\r\n //this.deleteRecordEndpoint = \"OpnTasks/Delete\"; \r\n //\r\n this._saopSifranti = new SaopSifranti();\r\n //\r\n this.afterViewShowSuccess = this.initView;\r\n this.afterSubmitSuccess = this.initView; \r\n }\r\n\r\n\r\n setDictionary(){\r\n let dictionary:string[] = [\"Naloge\"];\r\n this.setTerminologyList(dictionary);\r\n } \r\n\r\n public initView():void{\r\n this.setDictionary(); \r\n this.LoadViewEvents();\r\n this._saopSifranti.init();\r\n }\r\n\r\n public LoadViewEvents ():void{\r\n\r\n }\r\n\r\n //\r\n}","import { global, isUnDefined, setModalFormZIndex } from \"../Common/saop-common\";\r\nimport { SaopWebGrid,SaopWebGridProperties,SaopWebGridToolbar,SaopWebGridToolbarButton,SaopWebDataTable} from \"../Components/saop-grid\";\r\nimport { SaopWfAction } from \"../Core/saop-view-form\";\r\nimport { OPNPotniNalogiView } from \"../OPN/OPNPotniNalogi-view\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { SaopRightSidebar,SaopRightSidebarView } from '../Components/saop-right-sidebar';\r\n\r\nexport class OPNPotniNalogiGridOptions {\r\n dashboard: boolean = false;\r\n showToolbar: boolean = true;\r\n showFilter: boolean = true;\r\n}\r\n\r\nexport class OPNPotniNalogiGrid {\r\n private libName: string;\r\n private _gridOptions: OPNPotniNalogiGridOptions;\r\n private _saopServicesCore: SaopServicesCore;\r\n //\r\n public webGrid1:SaopWebGrid;\r\n public opnPotniNalogiMinView:OPNPotniNalogiView;\r\n public opnPotniNalogiFullView:OPNPotniNalogiView;\r\n public rightSidebar: SaopRightSidebar;\r\n\r\n constructor(libName: string, gridOptions: OPNPotniNalogiGridOptions = null) {\r\n if (isUnDefined(gridOptions)) {\r\n gridOptions = new OPNPotniNalogiGridOptions();\r\n }\r\n this._gridOptions = gridOptions;\r\n\r\n this.libName = libName;\r\n this._saopServicesCore = new SaopServicesCore();\r\n }\r\n\r\n initView() {\r\n global.ConsoleLogDegug(\"OPNPotniNalogiGrid.initView\");\r\n\r\n this.initWebGrid1();\r\n this.initWebGrid1Listners(); \r\n this.initEditView();\r\n this.initRightSidebar();\r\n }\r\n\r\n initRightSidebar() {\r\n global.ConsoleLogDegug(\"OPNPotniNalogiGrid.initRightSidebar\");\r\n\r\n this.rightSidebar = new SaopRightSidebar();\r\n this.rightSidebar.bindCarouselDiv(\"#right-sidebar-ajax\",SaopRightSidebarView.TravelOrders);\r\n this.rightSidebar.refreshRegOPNPotniNalogiSummary(\"#opnPotniNalogiSummary\",\"#saopLoadingSidebarr\"); \r\n }\r\n\r\n initWebGrid1() {\r\n global.ConsoleLogDegug(\"OPNPotniNalogiGrid.initWebGrid1\");\r\n\r\n let wgId = \"#OPNPotniNalogiGrid\";\r\n let captionToolbar = $(wgId).attr(\"caption-toolbar\");\r\n let captionAddButton = $(wgId).attr(\"caption-addButton\"); \r\n //\r\n this.webGrid1 = new SaopWebGrid(this.libName+\".webGrid1\");\r\n let gridProperties: SaopWebGridProperties;\r\n let gridToolbar:SaopWebGridToolbar;\r\n let toolbarButtons:SaopWebGridToolbarButton[] = [];\r\n let dataTable:SaopWebDataTable;\r\n //\r\n toolbarButtons.push({id:\"addTo\",caption:captionAddButton,onClickEvent:this.libName+\".addRecord();\"}); \r\n gridToolbar = {id:\"saopWebGridTB1\",caption:captionToolbar,buttons:toolbarButtons};\r\n \r\n dataTable = { enabled:true,columnDefsSettings:[{orderable: true, targets: \"no-sort\"}],order: [[ 2, \"desc\" ], [ 3, \"desc\" ]],colSettings:true};\r\n\r\n gridProperties = {\r\n gridId:wgId\r\n ,togglePanel:{enabled:false}\r\n ,toolbar:gridToolbar\r\n ,dataTable:dataTable\r\n }; \r\n //\r\n this.webGrid1.init(gridProperties); \r\n }\r\n\r\n initWebGrid1Listners() {\r\n global.ConsoleLogDegug(\"OPNPotniNalogiGrid.initWebGrid1Listners\");\r\n\r\n let _this = this;\r\n $(\"body\").off(\"click\", \"#OPNPotniNalogiGrid td:not(.td-action)\");\r\n $(\"body\").on(\"click\", \"#OPNPotniNalogiGrid td:not(.td-action)\", function () {\r\n var data = $(this).closest(\"tr\");\r\n let letoPotnegaNaloga = data.attr(\"data-leto\");\r\n let stevilkaPotnegaNaloga = data.attr(\"data-stevilka\");\r\n _this.editRecord(letoPotnegaNaloga,stevilkaPotnegaNaloga);\r\n }); \r\n \r\n $(\".OPNPotniNalogiGrid_edit\").off(\"click\");\r\n $(\".OPNPotniNalogiGrid_edit\").on('click', function(row){\r\n global.ConsoleLogDegug(\"OPNPotniNalogiGrid_edit.click\");\r\n $('#detailsOPNPotniNalogiForm').remove();\r\n let _btnEdit = row.currentTarget;\r\n let btnEnabled = _btnEdit.getAttribute(\"data-enabled\");\r\n if (btnEnabled.toString().toLowerCase() == \"true\") {\r\n let letoPotnegaNaloga = _btnEdit.getAttribute(\"data-LetoPotnegaNaloga\");\r\n let stevilkaPotnegaNaloga = _btnEdit.getAttribute(\"data-StevilkaPotnegaNaloga\");\r\n _this.editRecord(letoPotnegaNaloga,stevilkaPotnegaNaloga);\r\n } \r\n }); \r\n\r\n $(\".OPNPotniNalogiGrid_delete\").off(\"click\");\r\n $(\".OPNPotniNalogiGrid_delete\").on('click', function(row){\r\n global.ConsoleLogDegug(\"OPNPotniNalogiGrid_delete.click\");\r\n let _btnDelete = row.currentTarget;\r\n let btnEnabled = _btnDelete.getAttribute(\"data-enabled\");\r\n if (btnEnabled.toString().toLowerCase() == \"true\") {\r\n let letoPotnegaNaloga = _btnDelete.getAttribute(\"data-LetoPotnegaNaloga\");\r\n let stevilkaPotnegaNaloga = _btnDelete.getAttribute(\"data-StevilkaPotnegaNaloga\");\r\n _this.opnPotniNalogiMinView.deleteRecord({ letoPotnegaNaloga: letoPotnegaNaloga, stevilkaPotnegaNaloga: stevilkaPotnegaNaloga });\r\n }\r\n }); \r\n }\r\n\r\n addRecord() {\r\n global.ConsoleLogDegug(\"OPNPotniNalogiGrid.addRecord\");\r\n\r\n $('#detailsOPNPotniNalogiFullForm').remove();\r\n this.opnPotniNalogiMinView.showViewForm(SaopWfAction.wfaAddRecord, null, null);\r\n } \r\n\r\n editRecord(letoPotnegaNaloga: string, stevilkaPotnegaNaloga: string) {\r\n global.ConsoleLogDegug(\"OPNPotniNalogiGrid.editRecord\");\r\n\r\n let _fullTitle = this.opnPotniNalogiFullView.translationService.translate(\"Uredi: Potni nalog\")+\" \" +letoPotnegaNaloga+\"-\"+stevilkaPotnegaNaloga;\r\n this.opnPotniNalogiFullView.fullTitle = _fullTitle;\r\n this.opnPotniNalogiFullView.showViewForm(SaopWfAction.wfaEditRecord,{ letoPotnegaNaloga: letoPotnegaNaloga, stevilkaPotnegaNaloga: stevilkaPotnegaNaloga, fullView: true }); \r\n }\r\n\r\n initEditView() {\r\n global.ConsoleLogDegug(\"OPNPotniNalogiGrid.initEditView\");\r\n\r\n this.opnPotniNalogiFullView = new OPNPotniNalogiView(\"#opnPotniNalogiView001\",this.libName+\".opnPotniNalogiFullView\");\r\n this.opnPotniNalogiFullView.fullScreen = true; \r\n this.opnPotniNalogiFullView.refreshData = this.refreshGridData.bind(this);\r\n //\r\n this.opnPotniNalogiMinView = new OPNPotniNalogiView(\"#opnPotniNalogiView002\",this.libName+\".opnPotniNalogiMinView\");\r\n this.opnPotniNalogiMinView.fullScreen = false; \r\n this.opnPotniNalogiMinView.refreshData = this.refreshGridData.bind(this);\r\n } \r\n\r\n refreshData(htmlContent: string) {\r\n global.ConsoleLogDegug(\"OPNPotniNalogiGrid.refreshData\");\r\n\r\n if(!this._gridOptions.dashboard)\r\n this.webGrid1.replaceGridRows(htmlContent);\r\n\r\n this.initWebGrid1Listners();\r\n\r\n if (!this._gridOptions.dashboard)\r\n this.rightSidebar.refreshRegOPNPotniNalogiSummary(\"#opnPotniNalogiSummary\",\"#saopLoadingSidebarr\"); \r\n }\r\n\r\n refreshGridData(): void {\r\n global.ConsoleLogDegug(\"OPNPotniNalogiGrid.refreshGridData\");\r\n\r\n let _this = this;\r\n\r\n this._saopServicesCore.afterDone = function (response) {\r\n //#ToDo#\r\n //_this.opnPotniNalogiView.refreshElementData(response,\"[data-stevilka=\\\"6\\\"]\");\r\n _this.refreshData(response);\r\n //_this.webGrid1.refreshData();\r\n //_this.initWebGrid1Listners();\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action: \"TravelOrder/Index\"\r\n , data: null\r\n , type: \"GET\"\r\n }); \r\n\r\n }\r\n\r\n public afterRefreshDataAfterEditViewExternal(sender: any): void {\r\n global.ConsoleLogDegug(\"OPNPotniNalogiGrid.afterRefreshDataAfterEditViewExternal\");\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","/// \r\nimport { global, getRelativeSiteURL, getSiteAbsoluteURL, isEmpty, isUnDefined } from \"../Common/saop-common\";\r\nimport { SaopViewForm, SaopWfAction } from \"../Core/saop-view-form\";\r\nimport { SaopUploadFiles } from \"../Components/saop-upload-files\";\r\nimport { SaopAttachmentList } from \"../Components/saop-attachment-list\";\r\nimport { OPNPotniNalogiGoggleMapsView } from \"../OPN/OPNPotniNalogiGoggleMaps-view\";\r\nimport { SaopMessageDlg, SaopMsgDlgButton } from '../Components/saop-message-dlg';\r\n//import { SaopMultiselect } from \"../Components/saop-multiselect\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { OPNSelectPassengersView } from \"../opn/OPNSelectPassengers-view\";\r\nimport { SaopSelectizeSelectWraper } from \"../Components/saop-selectize-select-w\";\r\nimport { SaopSelectizeSelectToolTip } from \"../Components/saop-selectize-select-tooltip\";\r\nimport { SaopInputMask } from \"../Components/saop-inputmask\";\r\n\r\nexport class OPNPotniNalogiView extends SaopViewForm {\r\n private _formId:string;\r\n private _saopAttachmentList: SaopAttachmentList;\r\n private _opnPotniNalogiGoggleMapsView :OPNPotniNalogiGoggleMapsView;\r\n private _opnSelectPassengersView:OPNSelectPassengersView;\r\n private _saopSelectizeSelectWraper:SaopSelectizeSelectWraper;\r\n private _saopSelectizeSelectToolTip:SaopSelectizeSelectToolTip;\r\n private _reloadAttachments:boolean = false;\r\n //\r\n public saopUploadFiles:SaopUploadFiles; \r\n public _removeLinkDialog:SaopViewForm\r\n\r\n constructor(viewId:string,libName:string = \"\"){\r\n super(viewId,libName);\r\n //\r\n this._reloadAttachments = false;\r\n this.title = this.translationService.translate(\"Potni nalog\");\r\n this.addRecordEndpoint = \"TravelOrder/CreateTravelOrder\";\r\n this.editRecordEndpoint = \"TravelOrder/EditTravelOrder\";\r\n this.deleteRecordEndpoint = \"TravelOrder/DeleteTravelOrder\"; \r\n this.saopUploadFiles = new SaopUploadFiles(viewId,libName+\".saopUploadFiles\"); \r\n this._opnPotniNalogiGoggleMapsView = new OPNPotniNalogiGoggleMapsView(\"#opnPotniNalogiView003\",libName);\r\n this._opnSelectPassengersView = new OPNSelectPassengersView(\"#opnPotniNalogiView004\",libName+\"._opnSelectPassengersView\");\r\n this._opnSelectPassengersView.onBtnOkClick = this.onBtnOkClickEx.bind(this);\r\n this._saopSelectizeSelectWraper = new SaopSelectizeSelectWraper(viewId,libName);\r\n this._saopSelectizeSelectToolTip = new SaopSelectizeSelectToolTip();\r\n //\r\n //this._selectZaposleni = new SaopMultiselect(libName+\"._selectZaposleni\",{selectAll:false});\r\n //this._selectZaposleni.afterChangeCommonEvent = this.refreshSelectedEmployeesList.bind(this);\r\n //\r\n this.afterViewShowSuccess = this.initView;\r\n this.afterSubmitSuccess = this.reloadView;\r\n this._saopAttachmentList = new SaopAttachmentList(\"#travelOrderAttachments\", libName + \"._saopAttachmentList\");\r\n this._saopAttachmentList.initComponent(\r\n {\r\n validationFingerprintController: \"SPLDocument\",\r\n validationFingerprintAction: \"ValidateAttachmentFingerPrint\",\r\n validationFingerprintBannerDivId: viewId + \" #uploadFilesValidationsAjax\",\r\n validationController: \"SPLDocument\",\r\n validationAction: \"ValidateDownloadingDocumentAttachment\",\r\n validationBannerDivId: viewId + \" #uploadFilesValidationsAjax\",\r\n downloadController: \"SPLDocument\",\r\n downloadAction: \"DownloadDocumentAttachment\",\r\n deletedAttachmentListId: viewId + \" \" + \"#PriponkeBrisane\"\r\n });\r\n\r\n }\r\n\r\n setDictionary(){\r\n let dictionary:string[] = [\"Uredi: Potni nalog\",\"Brisanje\",\"Ali ste prepričani, da želite preklicati dogodek?\",\"Ali ste prepričani, da želite izbrisati izbranega sopotnika?\",\"Brisanje\"];\r\n this.setTerminologyList(dictionary);\r\n } \r\n \r\n public deleteRecord(deleteData:any):void{\r\n let deletTitle = this.translationService.translate(\"Brisanje\");\r\n let deleteMessage = this.translationService.translate(\"Ali ste prepričani, da želite preklicati dogodek?\"); \r\n super.deleteRecord(deletTitle,deleteMessage,deleteData);\r\n } \r\n\r\n public initView():void{\r\n this._formId = $(this.id).find(\"form\").attr(\"Id\");\r\n\r\n if (this._formId.length == 0) {\r\n console.log(\"form id not found ...\");\r\n }\r\n this._formId = \"#\" + this._formId; \r\n // \r\n this.LoadViewEvents();\r\n this._saopSelectizeSelectWraper.initAll(\".selectizeSelect\");\r\n this._opnPotniNalogiGoggleMapsView.prepareView(this.id,\"Izračun relacije\");\r\n \r\n const selector = \" ~ .selectize-control\" + \" .selectize-dropdown-content\" + \" [data-selectable]\";\r\n const selector1 = \"#SifraRelacije\"+ selector;\r\n this._saopSelectizeSelectToolTip.InitTooltype(selector1);\r\n\r\n const selector2 = \"#SifraNaloge\"+ selector;\r\n this._saopSelectizeSelectToolTip.InitTooltype(selector2);\r\n }\r\n\r\n public reloadView():void{\r\n this.initView();\r\n this.copyFiles(\"#customFileBack\",\"#customFile\", true);\r\n this.setFocusOnError();\r\n// this.removeAllFiles(\"#customFileBack\");\r\n }\r\n\r\n public LoadViewEvents ():void{\r\n let _viewDiv = $(this.id);\r\n if (_viewDiv.length == 0) {return;}\r\n\r\n let _this = this;\r\n //this._formId = \"#detailsOPNPotniNalogiFullForm\";\r\n\r\n this.saopUploadFiles.initComponent({controller:\"TravelOrder\",action:\"ValidateFiles\",validateAjax:true,formId:this._formId,validationDivId:\"#uploadFilesValidationsAjax\"});\r\n this.saopUploadFiles.afterRefreshFilesList = this.saopUploadFiles.ajaxValidate;\r\n\r\n $('#btnOk').off('click');\r\n $('#btnOk').bind('click', \r\n function() {\r\n _this.copyFiles(\"#customFile\",\"#customFileBack\");\r\n let _result = _this.saopUploadFiles.ajaxValidate();\r\n return _result; \r\n } \r\n ); \r\n\r\n $('#PredvideniCasOdhoda').off('focusout',this.onFocusOutPredvideniCasOdhoda.bind(this));\r\n $(\"#PredvideniCasOdhoda\").bind('focusout',this.onFocusOutPredvideniCasOdhoda.bind(this));\r\n\r\n $('#StanjeStevcaKonec').off('focusout',this.onFocusOutStanjeStevcaKonec.bind(this));\r\n $(\"#StanjeStevcaKonec\").bind('focusout',this.onFocusOutStanjeStevcaKonec.bind(this)); \r\n\r\n $('#btnCheckIn').off('click');\r\n $('#btnCheckIn').bind('click', \r\n function(e) {\r\n _this.ChechIn(); \r\n } \r\n ); \r\n\r\n $('#btnCancel').off('click');\r\n $('#btnCancel').bind('click', \r\n function(e) {\r\n _this.CancelTO(); \r\n } \r\n ); \r\n\r\n $('#btnSyncREG').off('click');\r\n $('#btnSyncREG').bind('click',\r\n function (e) {\r\n _this.SyncREG();\r\n }\r\n ); \r\n\r\n // $(this._formId).submit(function(e){\r\n // let _sender = e.target;\r\n // //$('#CheckIn').val('true');\r\n // }); \r\n \r\n $('#OdobrenaUporaba').off('change');\r\n $('#OdobrenaUporaba').on('change', _this.onChangeOdobrenaUporaba.bind(this)); \r\n $('#OdobrenaUporaba').change();\r\n\r\n $('#SifraRelacije').off('change');\r\n $('#SifraRelacije').on('change', _this.onChangeSifraRelacije.bind(this)); \r\n $('#SifraRelacije').change();\r\n\r\n $('#SifraNaloge').off('change');\r\n $('#SifraNaloge').on('change', _this.onChangeSifraNaloge.bind(this)); \r\n $('#SifraNaloge').change();\r\n\r\n $('#btnOpnRoutes').off('click');\r\n $('#btnOpnRoutes').on('click', _this.onCliskbtnOpnRoutes.bind(this)); \r\n\r\n $('#btnAddPassenger').off('click');\r\n $('#btnAddPassenger').on('click', _this.onBtnAddPassengerClick.bind(this)); \r\n\r\n //this._selectZaposleni.init(\"#SelectedEmployees\", \"Zaposleni\"); \r\n\r\n this._saopAttachmentList.initWebGridListners();\r\n\r\n this.bindRemoveButtonEvents();\r\n\r\n //this.loadLinks();\r\n }\r\n\r\n // public loadLinks():void{\r\n // // let _selectedEmployeesList = $(this._formId).find(\"#SelectedEmployeesList\").val();\r\n // // let _selectedEmployeesArray = _selectedEmployeesList.toString().split(';');\r\n // let _selectedEmployeesList = $(this._formId).find(\"#SelectedEmployeesList\");\r\n // if(_selectedEmployeesList.length > 0) {\r\n // let _selectedEmployeesArray = _selectedEmployeesList.val().toString().split(';'); \r\n // this._selectZaposleni.setSelectValues(_selectedEmployeesArray);\r\n // }\r\n // }\r\n\r\n public ChechIn(): void {\r\n this.checkInDialog();\r\n }\r\n\r\n public CancelTO(): void {\r\n $('#CancelTO').val('true');\r\n }\r\n\r\n public SyncREG(): void {\r\n global.ConsoleLogDegug(\"SyncREG\");\r\n let _this = this;\r\n\r\n let _letoPotnegaNaloga = $(\"#LetoPotnegaNaloga\").val();\r\n let _stevilkaPotnegaNaloga = $(\"#StevilkaPotnegaNaloga\").val();\r\n\r\n let params = { letoPotnegaNaloga: _letoPotnegaNaloga, stevilkaPotnegaNaloga: _stevilkaPotnegaNaloga };\r\n\r\n let _saopServicesCore = new SaopServicesCore();\r\n _saopServicesCore.afterDone = function (response) {\r\n $(\"#tocen_cas\").html(response.viewContent);\r\n \r\n if (response.success) {\r\n alertify.message(response.alertMessage);\r\n }\r\n\r\n $('#btnSyncREG').off('click');\r\n $('#btnSyncREG').bind('click',\r\n function (e) {\r\n _this.SyncREG();\r\n }\r\n ); \r\n\r\n let saopInputMask = new SaopInputMask();\r\n saopInputMask.init();\r\n };\r\n _saopServicesCore.ExecuteAction({\r\n action: \"TravelOrder/SyncREG\"\r\n , data: params\r\n , type: \"POST\"\r\n , spinnerDivId: \"#saopLoading\"\r\n }); \r\n }\r\n\r\n onFocusOutPredvideniCasOdhoda(e:any):void{\r\n if(!$(\"#PredvideniCasPrihoda\").val()) {\r\n $(\"#PredvideniCasPrihoda\").val($(\"#PredvideniCasOdhoda\").val());\r\n }\r\n }\r\n\r\n onChangeOdobrenaUporaba(e:any):void{\r\n let _selectedValue = e.target.value; \r\n let _registrskaStevilkaPredlogGroup = $('#RegistrskaStevilkaPredlogGroup');\r\n if (_selectedValue == '1') {\r\n this.suggerstVehicle();\r\n _registrskaStevilkaPredlogGroup.show();\r\n } else {\r\n _registrskaStevilkaPredlogGroup.hide();\r\n }\r\n }\r\n\r\n onChangeSifraRelacije(e:any):void {\r\n let _selectedValue = e.target.value; \r\n let _privzetaSifraRelacije = $('#PrivzetaSifraRelacije').val();\r\n if (_selectedValue == _privzetaSifraRelacije) {\r\n this.saopFloatingLabel.setCaptionAsRequired(\"#lblDodatniOpisRelacije\",true);\r\n } else {\r\n this.saopFloatingLabel.setCaptionAsRequired(\"#lblDodatniOpisRelacije\",false);\r\n $(\"#DodatniOpisRelacije\").focusout(); \r\n }\r\n }\r\n\r\n\r\n onChangeSifraNaloge(e:any):void{\r\n let _selectedValue = e.target.value; \r\n let _privzetaSifraNaloge = $('#PrivzetaSifraNaloge').val();\r\n if (_selectedValue == _privzetaSifraNaloge) {\r\n this.saopFloatingLabel.setCaptionAsRequired(\"#lblDodatniOpisNaloge\",true);\r\n } else {\r\n this.saopFloatingLabel.setCaptionAsRequired(\"#lblDodatniOpisNaloge\",false);\r\n $(\"#DodatniOpisNaloge\").focusout();\r\n }\r\n }\r\n\r\n onCliskbtnOpnRoutes(e:any):void{\r\n global.ConsoleLogDegug(\"onCliskbtnOpnRoutes...\");\r\n this._opnPotniNalogiGoggleMapsView.showForm(this.id);\r\n } \r\n\r\n onFocusOutStanjeStevcaKonec(e:any):void{\r\n let _StanjeStevcaZacetek = parseInt($(\"#StanjeStevcaZacetek\").val() as string);\r\n let _StanjeStevcaKonec = parseInt($(\"#StanjeStevcaKonec\").val() as string);\r\n let _DejanskiKm = _StanjeStevcaKonec -_StanjeStevcaZacetek;\r\n if(_DejanskiKm > 0) {\r\n $(\"#DejanskiKm\").val(_DejanskiKm);\r\n }\r\n }\r\n\r\n public checkInDialog(): void {\r\n global.ConsoleLogDegug(\"checkInDialog\");\r\n\r\n let REG_sync = $('#WebUsklajevanjeREG').val().toString().toLowerCase() == 'true';\r\n\r\n let message = this.translationService.translate(\"Ali res želite zaključiti? Z zaključkom naknadne spremembe na potnem nalogu ne bodo več možne.\");\r\n if (REG_sync) {\r\n message = message + \"

    \" + this.translationService.translate(\"Vnesen čas odhoda/prihoda se bo prenesel v Registracijo prisotnosti, če dogodki že niso zabeleženi in obdelava ni zaključena.\")\r\n }\r\n\r\n let title = this.translationService.translate(\"Zaključevanje\");\r\n let saopMessageDlg = new SaopMessageDlg({ data: null, parent: null })\r\n saopMessageDlg.onYes = this.SubmitAndChechIn.bind(this);\r\n saopMessageDlg.Show(message, title, 1, [SaopMsgDlgButton.mbYes, SaopMsgDlgButton.mbNo]);\r\n }\r\n\r\n public SubmitAndChechIn():void { \r\n $('#CheckIn').val('true');\r\n $('#detailsOPNPotniNalogiFullForm').submit();\r\n }\r\n\r\n refreshLinksData(jsonEmployeesList:string):void {\r\n global.ConsoleLogDegug(\"refreshLinksData\");\r\n let _this = this;\r\n\r\n let _data = this.getData();\r\n Object.assign(_data, {\"jsonEmployeesList\":jsonEmployeesList});\r\n\r\n let _saopServicesCore = new SaopServicesCore();\r\n _saopServicesCore.afterDone = function(response){\r\n $(\"#SelectedEmployeesListAjax\").html(response);\r\n _this.bindRemoveButtonEvents();\r\n };\r\n _saopServicesCore.ExecuteAction({\r\n action:\"TravelOrder/GetLinks\" \r\n ,data: _data\r\n ,type:\"GET\"\r\n }); \r\n }\r\n\r\n onBtnAddPassengerClick(sender:any):void {\r\n console.log(\"onBtnAddPassengerClick\");\r\n let _data = this.getData();\r\n this._opnSelectPassengersView.showViewForm(SaopWfAction.wfaRecordDestails, _data);\r\n }\r\n\r\n public onBtnOkClickEx(sender: any): void {\r\n global.ConsoleLogDegug(\"onBtnOkClickEx\");\r\n //\r\n this.refreshLinks(sender);\r\n //\r\n this._opnSelectPassengersView.CloseViewForm();\r\n //\r\n } \r\n\r\n public refreshLinks(sender: any): void {\r\n global.ConsoleLogDegug(\"refreshLinks\");\r\n //\r\n let _selectedEmployeesList = $(this._formId).find(\"#SelectedEmployeesList\").val() as string;\r\n let _opnModel_SelectedEmployees = $(this._opnSelectPassengersView.id).find(\"#opnModel_SelectedEmployees\").val() as [any];\r\n if (isUnDefined(_opnModel_SelectedEmployees) == false){\r\n let _opnModel_SelectedEmployeesDeliminated = _opnModel_SelectedEmployees.join(\";\");\r\n _selectedEmployeesList = _selectedEmployeesList +\";\"+ _opnModel_SelectedEmployeesDeliminated;\r\n }\r\n //\r\n let _selectedEmployeesListDistinct = [...new Set(_selectedEmployeesList.split(\";\"))];\r\n _selectedEmployeesList = _selectedEmployeesListDistinct.join(\";\");\r\n //\r\n $(this._formId).find(\"#SelectedEmployeesList\").val(_selectedEmployeesList);\r\n let _selectedEmployeesListArray = _selectedEmployeesList.split(\";\");\r\n //\r\n var myJsonString = JSON.stringify(_selectedEmployeesListArray);\r\n this.refreshLinksData(myJsonString);\r\n }\r\n\r\n public removeLink(sifrazaposleni: string): void {\r\n global.ConsoleLogDegug(\"removeLink:\"+sifrazaposleni);\r\n let _selectedEmployeesList = $(this._formId).find(\"#SelectedEmployeesList\").val() as string;\r\n \r\n let _selectedEmployeesListDistinct = [...new Set(_selectedEmployeesList.split(\";\"))];\r\n //\r\n _selectedEmployeesListDistinct = _selectedEmployeesListDistinct.filter(function(item) {\r\n return item !== sifrazaposleni\r\n })\r\n //\r\n _selectedEmployeesList = _selectedEmployeesListDistinct.join(\";\");\r\n\r\n //_selectedEmployeesList = _selectedEmployeesList.replace(\";\"+sifrazaposleni,\"\");\r\n\r\n $(this._formId).find(\"#SelectedEmployeesList\").val(_selectedEmployeesList);\r\n //\r\n this.refreshLinks(sifrazaposleni);\r\n }\r\n\r\n\r\n public bindRemoveButtonEvents ():void{\r\n let _this = this;\r\n //\r\n $(this.id).find('.saop-remove-item-event').off('click');\r\n $(this.id).find('.saop-remove-item-event').bind('click', \r\n function(row) {\r\n global.ConsoleLogDegug(\".saop-remove-item-event.click\");\r\n //\r\n let _btnRemove = row.currentTarget;\r\n let _sifrazaposleni = _btnRemove.getAttribute(\"data-sifrazaposleni\");\r\n //\r\n _this.showDeleteDialog(_sifrazaposleni);\r\n //\r\n $(_this._opnSelectPassengersView.id).find(\"#opnModel_SelectedEmployees\").val(\"\")\r\n } \r\n ); \r\n }\r\n\r\n public showDeleteDialog(sifrazaposleni: string):void{\r\n global.ConsoleLogDegug(\"deleteDialog\");\r\n let _this = this;\r\n let message = this.translationService.translate(\"Ali ste prepričani, da želite izbrisati izbranega sopotnika?\");\r\n let title = this.translationService.translate(\"Brisanje\");\r\n let saopMessageDlg = new SaopMessageDlg({data:null,parent:null}) \r\n saopMessageDlg.onYes = this.removeLink.bind(this,sifrazaposleni);\r\n saopMessageDlg.Show(message,title,1,[SaopMsgDlgButton.mbYes,SaopMsgDlgButton.mbNo]);\r\n }\r\n\r\n public suggerstVehicle():void {\r\n //\r\n var _registrskaStevilkaOsebnaPredlog = $(this.id).find(\"#RegistrskaStevilkaOsebnaPredlog\");\r\n var _registrskaStevilkaPredlog = $(this.id).find(\"#RegistrskaStevilkaPredlog\");\r\n if (_registrskaStevilkaOsebnaPredlog.length > 0 && _registrskaStevilkaPredlog.length > 0) {\r\n var _vaue = _registrskaStevilkaPredlog.val() as string;\r\n if (_vaue.length == 0) {\r\n _registrskaStevilkaPredlog.val(_registrskaStevilkaOsebnaPredlog.val());\r\n }\r\n }\r\n }\r\n\r\n public copyFiles(idFrom:string, idTo:string, refreshList :boolean = false):void{\r\n\r\n let inputElementFrom = $(idFrom)[0];\r\n let filesFrom = inputElementFrom.files;\r\n\r\n let inputElementTo = $(idTo)[0];\r\n inputElementTo.files = filesFrom;\r\n if (refreshList) {\r\n this.saopUploadFiles.refreshFileList(inputElementTo);\r\n }\r\n }\r\n\r\n public removeAllFiles(id:string):void{\r\n let inputElementFrom = $(id)[0];\r\n inputElementFrom.value = null;\r\n }\r\n\r\n public setFocusOnError():void{\r\n let _validationSummary = $(\"#detailsKePlanDopustovValidationSummary\");\r\n if (_validationSummary.length > 0) {\r\n $(\"#detailsKePlanDopustovValidationSummary\").find(\"li\").focus();\r\n }\r\n }\r\n\r\n public onSubmitSuccessComplete(response: any): void {\r\n if (response.viewContent) {\r\n alertify.message(response.viewContent);\r\n } \r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { SaopWebGrid,SaopWebGridProperties,SaopWebGridToolbar,SaopWebDataTable} from \"../Components/saop-grid\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { global, isEmpty, isUnDefined, filterTableRows, convertString2Date, formatDate } from \"../Common/saop-common\";\r\n\r\nexport class OPNPotniNalogiAllGrid {\r\n private wgId:string;\r\n private libName:string;\r\n private _saopServicesCore: SaopServicesCore;\r\n //\r\n public webGrid:SaopWebGrid;\r\n\r\n constructor(libName: string) {\r\n this.wgId = \"#OPNPotniNalogiGridAll\";\r\n this.libName = libName;\r\n this._saopServicesCore = new SaopServicesCore();\r\n } \r\n\r\n initView(){\r\n this.initWebGrid();\r\n this.initWebGridListners(); \r\n }\r\n\r\n initWebGrid(){\r\n \r\n let captionToolbar = $(this.wgId).attr(\"caption-toolbar\")!;\r\n //\r\n this.webGrid = new SaopWebGrid(this.libName+\".webGrid\");\r\n let gridProperties: SaopWebGridProperties;\r\n let gridToolbar:SaopWebGridToolbar;\r\n let dataTable:SaopWebDataTable;\r\n let toolbarItemsTemplateId = $(this.wgId).attr(\"toolbar-items-templateId\");\r\n //\r\n gridToolbar = {id:\"saopWebGridTB1\",caption:captionToolbar, itemsTemplateId:toolbarItemsTemplateId};\r\n\r\n dataTable = { enabled:true,columnDefsSettings:[{orderable: true, targets: \"no-sort\"}]};\r\n\r\n gridProperties = {\r\n gridId:this.wgId\r\n ,togglePanel:{enabled:false}\r\n ,toolbar:gridToolbar\r\n ,dataTable:dataTable\r\n }; \r\n //\r\n this.webGrid.init(gridProperties); \r\n }\r\n\r\n initWebGridListners(){\r\n let _this = this;\r\n //\r\n let _SearchValue = $('#collapsesaopWebGridTB1').find('#SearchValue'); \r\n if (_SearchValue.length > 0) {\r\n _SearchValue.off(\"change\");\r\n _SearchValue.on(\"change\",_this.onSearchValue2Change.bind(_this));\r\n }\r\n //\r\n $(\"body\").off(\"click\", this.wgId + \" td.td-action-details\");\r\n $(\"body\").on(\"click\", this.wgId + \" td.td-action-details\", function () {\r\n let selectedRow = $(this).closest(\"tr\");\r\n _this.showHideDetailsSubTable(selectedRow);\r\n }); \r\n \r\n }\r\n\r\n showHideDetailsSubTable(selectedRow: JQuery): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesView.showHideDetailsSubTable\");\r\n let data_leto = selectedRow.attr(\"data-leto\");\r\n let data_stevilka = selectedRow.attr(\"data-stevilka\");\r\n let rowDetailsId = \"#detailRow\"+data_leto+data_stevilka;\r\n //\r\n let rowDetailsIdElement = $(rowDetailsId);\r\n // prikazi/skrij bottom border\r\n selectedRow.toggleClass(\"saop-table-row-border-bottom-none\")\r\n\r\n // prikazi/skrij details tabelo\r\n rowDetailsIdElement.toggleClass(\"saop-table-row-hidden\");\r\n rowDetailsIdElement.toggleClass(\"saop-table-row-showed\"); \r\n // // sprememba ikone\r\n let iconElement = selectedRow.find(\"span\");\r\n iconElement.toggleClass(\"saop-img-right\");\r\n iconElement.toggleClass(\"saop-img-down\"); \r\n\r\n }\r\n\r\n refreshData(htmlContent:string){\r\n this.webGrid.replaceGridRows(htmlContent);\r\n this.initWebGridListners();\r\n }\r\n\r\n refreshGridData():void {\r\n let _this = this;\r\n\r\n let _SearchValue = $('#collapsesaopWebGridTB1').find('#SearchValue');\r\n let _letoPotnegaNaloga = \"\";\r\n if (_SearchValue.length > 0) {\r\n _letoPotnegaNaloga = _SearchValue.val() as string;\r\n }\r\n\r\n this._saopServicesCore.afterDone = function(response){\r\n _this.refreshData(response);\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"TravelOrder/IndexAll\" \r\n ,data: {letoPotnegaNaloga : _letoPotnegaNaloga}\r\n ,type:\"GET\"\r\n }); \r\n }\r\n\r\n onSearchValue2Change(e:any):void{\r\n this.refreshGridData();\r\n } \r\n\r\n \r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\nimport { SaopWfAction } from \"../Core/saop-view-form\";\r\nimport { SaopWebGrid,SaopWebGridProperties,SaopWebGridToolbar,SaopWebGridToolbarButton,SaopWebDataTable} from \"../Components/saop-grid\";\r\nimport { OPNPotniNalogiView } from \"../OPN/OPNPotniNalogi-view\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\n\r\nexport class OPNPotniNalogiArhivGrid {\r\n private libName:string;\r\n private _saopServicesCore: SaopServicesCore;\r\n //\r\n public webGrid2:SaopWebGrid;\r\n public opnPotniNalogiFullView:OPNPotniNalogiView;\r\n\r\n constructor(libName: string) {\r\n this.libName = libName;\r\n this._saopServicesCore = new SaopServicesCore();\r\n } \r\n\r\n initView(){\r\n this.initWebGrid2();\r\n this.initWebGrid2Listners(); \r\n this.initEditView();\r\n }\r\n\r\n editRecord(letoPotnegaNaloga:string, stevilkaPotnegaNaloga:string){\r\n let _fullTitle = this.opnPotniNalogiFullView.translationService.translate(\"Uredi: Potni nalog\")+\" \" +letoPotnegaNaloga+\"-\"+stevilkaPotnegaNaloga;\r\n this.opnPotniNalogiFullView.fullTitle = _fullTitle;\r\n this.opnPotniNalogiFullView.showViewForm(SaopWfAction.wfaEditRecord,{ letoPotnegaNaloga: letoPotnegaNaloga, stevilkaPotnegaNaloga: stevilkaPotnegaNaloga, fullView: true }); \r\n }\r\n\r\n initWebGrid2(){\r\n let wgId = \"#OPNPotniNalogiGridArchive\";\r\n let captionToolbar = $(wgId).attr(\"caption-toolbar\")!;\r\n //\r\n this.webGrid2 = new SaopWebGrid(this.libName+\".webGrid2\");\r\n let gridProperties: SaopWebGridProperties;\r\n let gridToolbar:SaopWebGridToolbar;\r\n let dataTable:SaopWebDataTable;\r\n let toolbarItemsTemplateId = $(wgId).attr(\"toolbar-items-templateId\");\r\n //\r\n gridToolbar = {id:\"saopWebGridTB2\",caption:captionToolbar, itemsTemplateId:toolbarItemsTemplateId};\r\n\r\n dataTable = { enabled:true,columnDefsSettings:[{orderable: true, targets: \"no-sort\"}],order: [[ 2, \"desc\" ], [ 3, \"desc\" ]],};\r\n\r\n gridProperties = {\r\n gridId:wgId\r\n ,togglePanel:{enabled:false}\r\n ,toolbar:gridToolbar\r\n ,dataTable:dataTable\r\n }; \r\n //\r\n this.webGrid2.init(gridProperties); \r\n }\r\n\r\n initWebGrid2Listners(){\r\n let _this = this;\r\n //\r\n let _SearchValue2 = $('#collapsesaopWebGridTB2').find('#SearchValue2'); \r\n if (_SearchValue2.length > 0) {\r\n _SearchValue2.off(\"change\");\r\n _SearchValue2.on(\"change\",_this.onSearchValue2Change.bind(_this));\r\n }\r\n //\r\n $(\"body\").off(\"click\", \"#OPNPotniNalogiGridArchive td:not(.td-action)\");\r\n $(\"body\").on(\"click\", \"#OPNPotniNalogiGridArchive td:not(.td-action)\", function () {\r\n var data = $(this).closest(\"tr\");\r\n let letoPotnegaNaloga = data.attr(\"data-leto\")!;\r\n let stevilkaPotnegaNaloga = data.attr(\"data-stevilka\")!;\r\n _this.editRecord(letoPotnegaNaloga,stevilkaPotnegaNaloga);\r\n }); \r\n \r\n $(\".OPNPotniNalogiGridArchive_edit\").off(\"click\");\r\n $(\".OPNPotniNalogiGridArchive_edit\").on('click', function(row){\r\n global.ConsoleLogDegug(\"OPNPotniNalogiGridArchive_edit.click\");\r\n $('#detailsOPNPotniNalogiForm').remove();\r\n let _btnEdit = row.currentTarget;\r\n let btnEnabled = _btnEdit.getAttribute(\"data-enabled\")!;\r\n if (btnEnabled.toString().toLowerCase() == \"true\") {\r\n let letoPotnegaNaloga = _btnEdit.getAttribute(\"data-LetoPotnegaNaloga\")!;\r\n let stevilkaPotnegaNaloga = _btnEdit.getAttribute(\"data-StevilkaPotnegaNaloga\")!;\r\n _this.editRecord(letoPotnegaNaloga,stevilkaPotnegaNaloga);\r\n } \r\n }); \r\n }\r\n\r\n initEditView(){\r\n this.opnPotniNalogiFullView = new OPNPotniNalogiView(\"#opnPotniNalogiView001\",this.libName+\".opnPotniNalogiFullView\");\r\n this.opnPotniNalogiFullView.fullScreen = true; \r\n this.opnPotniNalogiFullView.refreshData = this.refreshGridData.bind(this);\r\n } \r\n\r\n refreshData(htmlContent:string){\r\n this.webGrid2.replaceGridRows(htmlContent);\r\n this.initWebGrid2Listners();\r\n }\r\n\r\n refreshGridData():void {\r\n let _this = this;\r\n\r\n let _SearchValue2 = $('#collapsesaopWebGridTB2').find('#SearchValue2');\r\n let _letoPotnegaNaloga = \"\";\r\n if (_SearchValue2.length > 0) {\r\n _letoPotnegaNaloga = _SearchValue2.val() as string;\r\n }\r\n\r\n this._saopServicesCore.afterDone = function(response){\r\n //#ToDo#\r\n //_this.opnPotniNalogiView.refreshElementData(response,\"[data-stevilka=\\\"6\\\"]\");\r\n _this.refreshData(response);\r\n //_this.webGrid1.refreshData();\r\n //_this.initWebGrid1Listners();\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"TravelOrder/indexArchive\" \r\n ,data: {letoPotnegaNaloga : _letoPotnegaNaloga}\r\n ,type:\"GET\"\r\n }); \r\n }\r\n\r\n // onOdobrenaUporabaChange(e:any):void{\r\n // let _selectedValue = e.value; \r\n // let _registrskaStevilkaPredlog = $('#RegistrskaStevilkaPredlog');\r\n // if (_selectedValue == '1') {\r\n // _registrskaStevilkaPredlog.show();\r\n // } else {\r\n // _registrskaStevilkaPredlog.hide();\r\n // }\r\n // }\r\n\r\n onSearchValue2Change(e:any):void{\r\n this.refreshGridData();\r\n } \r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { global, getRelativeSiteURL, getSiteAbsoluteURL, isEmpty, isUnDefined } from \"../Common/saop-common\";\r\nimport { SaopViewForm,SaopWfAction } from \"../Core/saop-view-form\";\r\n import { SaopGoogleMaps } from \"../Components/saop-googlemaps\";\r\n\r\nexport class OPNPotniNalogiGoggleMapsView extends SaopViewForm {\r\n private _parentViewId:string;\r\n //private _saopGoogleMaps:SaopGoogleMaps;\r\n\r\n constructor(viewId:string,libName:string = \"\"){\r\n global.ConsoleLogDegug(\"OPNPotniNalogiGoggleMapsView\");\r\n super(viewId,libName);\r\n this.setDictionary(); \r\n this.addRecordEndpoint = \"\";\r\n this.editRecordEndpoint = \"TravelOrder/GoogleMaps\";\r\n this.deleteRecordEndpoint = \"\"; \r\n this.fullScreen = true;\r\n //\r\n //this._saopGoogleMaps = new SaopGoogleMaps();\r\n //\r\n this.onBtnOkClick = this.onBtnOkClickEx.bind(this);\r\n //this.viewShowComplete = this.initForm.bind(this); \r\n }\r\n\r\n private setDictionary() {\r\n this.setTerminologyList();\r\n } \r\n\r\n private initForm(): void {\r\n global.ConsoleLogDegug(\"OPNPotniNalogiGoggleMapsView.initForm\");\r\n // this._saopGoogleMaps = new SaopGoogleMaps();\r\n // this._saopGoogleMaps.initView();\r\n this.loadRoutesList();\r\n }\r\n\r\n prepareView(parentViewId:string, title: string): void {\r\n global.ConsoleLogDegug(\"prepareView.showForm\");\r\n this._parentViewId = parentViewId;\r\n this.title = title;\r\n let _googleMapsRoutesElement = $('#GoogleMapsRoutes');\r\n if (_googleMapsRoutesElement.length == 0){\r\n this.prepareViewForm(SaopWfAction.wfaRecordDestails, null, null);\r\n }\r\n }\r\n\r\n showForm(parentViewId:string): void {\r\n global.ConsoleLogDegug(\"OPNPotniNalogiGoggleMapsView.showForm\");\r\n this._parentViewId = parentViewId;\r\n $('#opnPotniNalogiView003').modal('show');\r\n $('#opnPotniNalogiView003').find('#messageBanner').hide();\r\n this.initForm();\r\n }\r\n\r\n public loadRoutesList(): void {\r\n let _routesList = $(this._parentViewId).find('#DodatniOpisRelacije');\r\n let _routesListString = _routesList.val() as string;\r\n $('#GoogleMapsRoutes').find('#RoutesList').val(_routesListString);\r\n\r\n $('#GoogleMapsRoutes').find('#btnRoutesList').click();\r\n // let saopGoogleMaps = new SaopGoogleMaps(this.id);\r\n // if (_routesListString.length > 0) {\r\n // let _routesArray = _routesListString.split(\";\");\r\n // saopGoogleMaps.loadWaypoints(_routesArray);\r\n // } else {\r\n // saopGoogleMaps.loadWaypoints(null);\r\n // }\r\n }\r\n\r\n public onBtnOkClickEx(sender: any): void {\r\n global.ConsoleLogDegug(\"OPNPotniNalogiGoggleMapsView.onBtnOkClickEx\");\r\n let saopGoogleMaps = new SaopGoogleMaps(this.id);\r\n\r\n let _routesListString = saopGoogleMaps.getRoutes();\r\n\r\n //let _routesList = $(this._parentViewId).find('#DodatniOpisRelacije');\r\n let _routesList = $('#DodatniOpisRelacije');\r\n _routesList.val(_routesListString);\r\n //\r\n let _distanceString = saopGoogleMaps.getDistance();\r\n //$(this._parentViewId).find('#PredvideniKm').val(_distanceString);\r\n $('#PredvideniKm').val(_distanceString);\r\n } \r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { global, isUnDefined, isEmpty } from \"../Common/saop-common\";\r\nimport { SaopWfAction } from \"../Core/saop-view-form\";\r\nimport { SaopMultiselectOptions } from \"../Components/saop-multiselect\";\r\nimport { SaopSelectDropDown } from \"../Components/saop-select-dropdown\";\r\nimport { OPNRelacijeView } from \"../OPN/OPNRelacije-view\";\r\nimport { SaopServicesCore, SaopServicesCoreParams } from \"../Core/saop-services-core\";\r\n\r\nexport class OPNRelacijeSelect extends SaopSelectDropDown {\r\n // private __target:string;\r\n // private __caption:string; \r\n private __libName:string;\r\n public _opnRelacijeView:OPNRelacijeView;\r\n\r\n constructor(libName:string = \"\", options:SaopMultiselectOptions = null) {\r\n global.ConsoleLogDegug(\"OPNRelacijeSelect\");\r\n super(libName,options);\r\n this.__libName = libName; \r\n //\r\n this._opnRelacijeView = new OPNRelacijeView(\"#opnRelationsPopupForm\",this.__libName + \"._opnRelacijeView\");\r\n this._opnRelacijeView.fullScreen = false; \r\n this._opnRelacijeView.afterSubmitSuccess = this.refreshDataAfterSubmit.bind(this); \r\n } \r\n\r\n init(target: string = \"\", caption = \"\" ){\r\n // this._target = target;\r\n // this._caption = caption;\r\n //\r\n if (target.length == 0){\r\n target = \"SifraRelacije\";\r\n }\r\n if (caption.length == 0){\r\n caption = \"Relacije\";\r\n }\r\n super.init(target, caption);\r\n //\r\n }\r\n\r\n addRecord(){\r\n let _fullTitle = this._opnRelacijeView.translationService.translate(\"Relacije\");\r\n this._opnRelacijeView.fullTitle = _fullTitle;\r\n this._opnRelacijeView.showViewForm(SaopWfAction.wfaAddRecord,{ }); \r\n } \r\n\r\n editRecord(_sifraRelacije:string){\r\n let _fullTitle = this._opnRelacijeView.translationService.translate(\"Relacije\");\r\n this._opnRelacijeView.fullTitle = _fullTitle;\r\n this._opnRelacijeView.showViewForm(SaopWfAction.wfaEditRecord,{ sifraRelacije: _sifraRelacije, fullView: false }); \r\n } \r\n\r\n public onAddBtnClick(sender:any):void{\r\n global.ConsoleLogDegug(\"onAddBtnClick...SifraLokacije\");\r\n this.addRecord();\r\n } \r\n\r\n public onEditBtnClick(sender:any):void{\r\n global.ConsoleLogDegug(\"onEditBtnClick...SifraLokacije\");\r\n let _sifraRelacije = this.selectedCB.val();\r\n this.editRecord(_sifraRelacije); \r\n } \r\n\r\n public refreshDataAfterSubmit(result: any): void {\r\n global.ConsoleLogDegug(\"submit.afterExecuteSuccess\");\r\n //\r\n if ( (isUnDefined(result.success) == false) && (result.success == true) ) {\r\n let _sifraRelacije = \"\";\r\n if (isUnDefined(result.data) == false) {\r\n let jsonData = JSON.parse(result.data);\r\n _sifraRelacije = jsonData.SifraRelacije;\r\n } \r\n //\r\n let _servicesParams:SaopServicesCoreParams = {\r\n action: \"OpnRelations/GetList\"\r\n , data: {sifraRelacije:_sifraRelacije}\r\n , type: \"GET\"\r\n };\r\n \r\n this.getDropDownItemsData(_servicesParams, _sifraRelacije);\r\n } \r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { SaopViewForm } from \"../Core/saop-view-form\";\r\nimport { SaopSifranti } from \"../Components/saop-sifranti\";\r\n\r\n\r\nexport class OPNRelacijeView extends SaopViewForm {\r\n private _saopSifranti:SaopSifranti;\r\n\r\n constructor(viewId:string,libName:string = \"\"){\r\n super(viewId,libName);\r\n this.title = this.translationService.translate(\"Relacije\");\r\n this.addRecordEndpoint = \"OpnRelations/Create\";\r\n this.editRecordEndpoint = \"OpnRelations/Edit\";\r\n //this.deleteRecordEndpoint = \"OpnRelations/Delete\"; \r\n //\r\n this._saopSifranti = new SaopSifranti();\r\n //\r\n this.afterViewShowSuccess = this.initView;\r\n this.afterSubmitSuccess = this.initView; \r\n }\r\n\r\n\r\n setDictionary(){\r\n let dictionary:string[] = [\"Relacije\"];\r\n this.setTerminologyList(dictionary);\r\n } \r\n\r\n public initView():void{\r\n this.setDictionary(); \r\n this.LoadViewEvents();\r\n this._saopSifranti.init();\r\n }\r\n\r\n public LoadViewEvents ():void{\r\n\r\n }\r\n\r\n //\r\n}","/// \r\n\r\nimport { global } from \"../Common/saop-common\";\r\nimport { SaopMultiselect } from \"../Components/saop-multiselect\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\n\r\nclass apiResponse {\r\n success: boolean;\r\n data: any;\r\n alertMessage: string;\r\n}\r\n\r\nexport class SaopOrganigramView {\r\n private _libNameP: string;\r\n private _selectEnoteOrgStrukture: SaopMultiselect;\r\n private _enoteOrgStruktureDivId: string;\r\n private _selectZaposleni: SaopMultiselect;\r\n private _zaposleniDivId: string;\r\n private _treeChartDivId: string;\r\n\r\n constructor(viewId: string, libName: string = \"\") {\r\n this._libNameP = libName;\r\n this._enoteOrgStruktureDivId = \"#EnoteOrgStruktureDiv\";\r\n this._zaposleniDivId = \"#ZaposleniDiv\";\r\n this._treeChartDivId = \"#treeChart\";\r\n }\r\n\r\n initView(): void {\r\n global.ConsoleLogDegug(\"SaopOrganigramView.initView\");\r\n\r\n this.initSelectEnoteOrgStrukture();\r\n\r\n this.initSelectZaposleni();\r\n }\r\n\r\n initSelectEnoteOrgStrukture(): void {\r\n global.ConsoleLogDegug(\"SaopOrganigramView.initSelectEnoteOrgStrukture\");\r\n\r\n this._selectEnoteOrgStrukture = new SaopMultiselect();\r\n this._selectEnoteOrgStrukture.afterChangeCommonEvent = this.filterSelectEnoteOrgStrukture.bind(this);\r\n // init za metodo \"afterChangeCommonEvent\", da se že v \"_selectEnoteOrgStrukture.init\" metodi sprozi filterSelectEnoteOrgStrukture\r\n this._selectEnoteOrgStrukture.init(\"#EnoteOrgStruktureFilter\", \"Enota za prikaz\");\r\n // prikazemo select div\r\n $(this._enoteOrgStruktureDivId).show();\r\n }\r\n\r\n initSelectZaposleni(): void {\r\n global.ConsoleLogDegug(\"SaopOrganigramView.initSelectZaposleni\");\r\n\r\n this._selectZaposleni = new SaopMultiselect();\r\n this._selectZaposleni.init(\"#ZaposleniFilter\", \"Zaposleni\");\r\n // init pred metodo \"afterChangeCommonEvent\", da se ne izvede metoda filterSelectZaposleni\r\n this._selectZaposleni.afterChangeCommonEvent = this.filterSelectZaposleni.bind(this);\r\n // prikazemo select div\r\n $(this._zaposleniDivId).show();\r\n }\r\n\r\n filterSelectEnoteOrgStrukture(element: any) {\r\n global.ConsoleLogDegug(\"SaopOrganigramView.filterSelectEnoteOrgStrukture\");\r\n\r\n // preberemo, katere sifre zaposlenih sodijo v izbrane skupine\r\n let izbraneEnoteOrgStrukture = (element.val().toString());\r\n\r\n this.refreshData(izbraneEnoteOrgStrukture);\r\n }\r\n\r\n filterSelectZaposleni(element: any) {\r\n global.ConsoleLogDegug(\"SaopOrganigramView.filterSelectZaposleni\");\r\n\r\n // odstranimo css klas za obrobo vsem elementom\r\n $(\".tree li .trcont\").removeClass(\"selected-employee\");\r\n $(\".tree li .tree-chart-header\").removeClass(\"selected-employee-header\");\r\n\r\n // preberemo, katere sifre zaposlenih je izbrana\r\n let izbranZaposleni = (element.val().toString());\r\n if (izbranZaposleni != null && izbranZaposleni != \"\") {\r\n // oznacimo zaposlenega\r\n let zaposleniMainElement = $(\"#\" + izbranZaposleni + \" .trcont\").first();\r\n let zaposleniHeaderElement = $(\"#\" + izbranZaposleni + \" .tree-chart-header\").first();\r\n\r\n // dodamo css klas za obrobo\r\n if (zaposleniMainElement.length) {\r\n zaposleniMainElement.addClass(\"selected-employee\");\r\n }\r\n // popravimo header style\r\n if (zaposleniHeaderElement.length) {\r\n zaposleniHeaderElement.addClass(\"selected-employee-header\");\r\n }\r\n\r\n // preverimo, ce je potreben scroll\r\n let izvenHorizontal = this.checkHorizontalPositionOffset(zaposleniMainElement);\r\n let izvenVertical = this.checkVerticalPositionOffset(zaposleniMainElement);\r\n\r\n if (izvenHorizontal) {\r\n let length = 500\r\n for (var i = 0; i < length; i++) {\r\n $(this._treeChartDivId).scrollLeft(i * 100);\r\n if (!this.checkHorizontalPositionOffset(zaposleniMainElement)) {\r\n break;\r\n }\r\n }\r\n \r\n }\r\n if (izvenVertical) {\r\n let length = 500\r\n for (var i = 0; i < length; i++) {\r\n $(this._treeChartDivId).scrollTop(i * 100);\r\n if (!this.checkVerticalPositionOffset(zaposleniMainElement)) {\r\n break;\r\n }\r\n }\r\n }\r\n } \r\n }\r\n\r\n checkHorizontalPositionOffset(element: JQuery): boolean {\r\n let treeChartOffset = $(\"#treeChart\").offset();\r\n let w = Math.max(document.documentElement.clientWidth - treeChartOffset.left, window.innerWidth - treeChartOffset.left || 0)\r\n\r\n let leftPos = element.offset().left - treeChartOffset.left;\r\n if (leftPos < 0 || leftPos > w) {\r\n return true;\r\n }\r\n // left pristejemo se width in ponovno preverimo, ce je izved\r\n leftPos = leftPos + element.width();\r\n if (leftPos < 0 || leftPos > w) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n checkVerticalPositionOffset(element: JQuery): boolean {\r\n let treeChartOffset = $(\"#treeChart\").offset();\r\n let pageFooter = $(\"#site-footer\");\r\n let h = Math.max(document.documentElement.clientHeight - treeChartOffset.top - pageFooter.height(), window.innerHeight - treeChartOffset.top - pageFooter.height() || 0)\r\n let d = $(document).scrollTop();\r\n\r\n let topPos = element.offset().top - treeChartOffset.top;\r\n //vertical\r\n if (topPos < 0 || topPos > h - d) {\r\n return true;\r\n }\r\n // top pristejemo se height in ponovno preverimo, ce je izved\r\n topPos = topPos + element.height();\r\n if (topPos < 0 || topPos > h - d) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n refreshData(izbraneEnoteOrgStrukture: string): void {\r\n global.ConsoleLogDegug(\"SaopOrganigramView.refreshData\");\r\n\r\n let _this = this;\r\n let params = { izbraneEnote: izbraneEnoteOrgStrukture };\r\n let saopServicesCore = new SaopServicesCore();\r\n\r\n saopServicesCore.afterDone = function (response) {\r\n let apiResult: apiResponse = response;\r\n\r\n if (apiResult.success) {\r\n // pobrisemo div\r\n $(\"#treeChart\").html(\"\");\r\n\r\n $(\"#treeChart\").jHTree({\r\n callType: 'obj',\r\n structureObj: apiResult.data.items,\r\n zoomer: false\r\n });\r\n\r\n $(_this._treeChartDivId).scrollLeft(0);\r\n\r\n // osvezimo se zaposlene\r\n _this.refreshSelectZaposleni(apiResult.data.sifraZaposleniList);\r\n }\r\n\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"Organization/GetOrganizationChartData\"\r\n , data: params\r\n , type: \"GET\"\r\n , spinnerDivId: \"#organigramLoading\"\r\n }); \r\n }\r\n\r\n refreshSelectZaposleni(sifraZaposleniList: string[]): void {\r\n global.ConsoleLogDegug(\"SaopOrganigramView.refreshSelectZaposleni\");\r\n\r\n let _this = this;\r\n let params = { sifreZaposleni: sifraZaposleniList.toString() };\r\n let saopServicesCore = new SaopServicesCore();\r\n\r\n saopServicesCore.afterDone = function (response) {\r\n $(_this._zaposleniDivId).html(response);\r\n\r\n _this.initSelectZaposleni();\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"Organization/GetEmpoyeesFilter\"\r\n , data: params\r\n , type: \"GET\"\r\n , spinnerDivId: \"#organigramLoading\"\r\n }); \r\n }\r\n //\r\n}\r\n\r\n\r\n","import { SaopViewForm } from \"../core/saop-view-form\";\r\nimport { SaopWfSubmitResult } from \"../core/saop-view-form\";\r\nimport { SaopMessageDlg, SaopMsgDlgButton } from '../Components/saop-message-dlg';\r\nimport { global} from \"../Common/saop-common\";\r\n\r\n\r\nexport class SaopRegKeZapDopustiView extends SaopViewForm {\r\n constructor(viewId: string, libName: string = \"\") {\r\n super(viewId, libName);\r\n this.setDictionary(); \r\n this.title = this.translationService.translate(\"Odsotnost\"); \r\n this.addRecordEndpoint = \"KeZapDopusti/CreateKeZapDopusti\";\r\n this.editRecordEndpoint = \"\";\r\n this.deleteRecordEndpoint = \"KeZapDopusti/DeleteKeZapDopusti\";\r\n } \r\n \r\n setDictionary(){\r\n let dictionary: string[] = [\"Odsotnost\"\r\n , \"Ali ste prepričani, da želite izbrisati odsotnost?\"\r\n , \"Potrdi\"\r\n , \"Pozor, število dni predlaganega dopusta je večje kot število dni, ki ga imate na razpolago. Želite nadaljevati?\"\r\n , \"Pozor, vpisano število ur predlaganega koriščenja je večje od števila ur, ki jih imate na razpolago. Ali želite nadaljevati?\"];\r\n this.setTerminologyList(dictionary);\r\n } \r\n\r\n public afterSubmitSuccess(result: SaopWfSubmitResult): void {\r\n let prikaziOpozoriloStr = result.alertMessage.toString();\r\n let prikaziOpozorilo = prikaziOpozoriloStr == \"#PrekoracitevOdsotnostiOpozorilo\" ? true : false;\r\n\r\n let opozoriloStr = $(\"#PrekoracitevOdsotnostiOpozorilo\").val();// ne obstaja v primeru ko se dopust doda in niso nastavljene potrebne nastavitve za avtomatsko potrjevanje\r\n if (opozoriloStr !== undefined) {\r\n let opozorilo = opozoriloStr === \"\" ? false : true;\r\n\r\n if (opozorilo && prikaziOpozorilo) {\r\n let title = this.translationService.translate(\"Potrdi\");\r\n\r\n let message = \"\";\r\n if ($(\"#editFormVrstaDopusta\").val() == 'T') {\r\n message = this.translationService.translate(\"Pozor, število dni predlaganega dopusta je večje kot število dni, ki ga imate na razpolago. Želite nadaljevati?\");\r\n }\r\n else if ($(\"#editFormVrstaDopusta\").val() == 'K') {\r\n message = this.translationService.translate(\"Pozor, vpisano število ur predlaganega koriščenja je večje od števila ur, ki jih imate na razpolago. Ali želite nadaljevati?\");\r\n }\r\n\r\n let saopMessageDlg = new SaopMessageDlg({ data: null, parent: null })\r\n saopMessageDlg.onYes = this.proceedYes.bind(this);\r\n saopMessageDlg.onNo = this.proceedNo.bind(this);\r\n saopMessageDlg.Show(message, title, 1, [SaopMsgDlgButton.mbYes, SaopMsgDlgButton.mbNo]);\r\n }\r\n }\r\n }\r\n \r\n proceedYes(data: any): void {\r\n global.ConsoleLogDegug(\"CreateKeZapDopusti.Alert.proceedYes\");\r\n $(\"#PrekoracitevOdsotnostiOpozorilo\").val(\"\");\r\n $('#regKeZapDopustiView').first().trigger(\"submit\");\r\n }\r\n\r\n proceedNo(data: any): void {\r\n global.ConsoleLogDegug(\"CreateKeZapDopusti.Alert.proceedNo\");\r\n $(\"#PrekoracitevOdsotnostiOpozorilo\").val(\"true\");\r\n }\r\n}\r\n\r\n\r\n","/// \r\nimport { global } from \"../Common/saop-common\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { SaopRightSidebar,SaopRightSidebarView } from '../Components/saop-right-sidebar';\r\nimport { SaopRegKeZapDopustiView } from \"./saop-reg-keZapDopusti-view\";\r\n\r\nexport class SaopRegAbsenceCalendarEventsView extends SaopRegKeZapDopustiView {\r\n private _saopServicesCore :SaopServicesCore;\r\n private _yearCaption: string = \"yearCaption\";\r\n private _btnPreviousId: string = \"btnYearPrevious\";\r\n private _btnNextId: string = \"btnYearNext\";\r\n private _addKEZapDopustiId: string = \"addKEZapDopustiVnos\";\r\n\r\n public rightSidebar: SaopRightSidebar;\r\n\r\n constructor(viewId: string, libName: string = \"\") {\r\n super(viewId, libName);\r\n this.refreshData = this.refreshAllData.bind(this);\r\n //\r\n this._saopServicesCore = new SaopServicesCore();\r\n }\r\n\r\n initView(): void {\r\n global.ConsoleLogDegug(\"SaopRegAbsenceCalendarEventsView.initView\");\r\n this.initRightSidebar();\r\n }\r\n\r\n initRightSidebar() {\r\n this.rightSidebar = new SaopRightSidebar();\r\n this.rightSidebar.bindCarouselDiv(\"#right-sidebar-calendar\", SaopRightSidebarView.AbsenceCalendar);\r\n this.rightSidebar.refreshOdsotnostiSummary(\"#dopustZaKoriscenjeCalendarSummary\", \"#ureZaKoriscenjeCalendarSummary\");\r\n }\r\n\r\n bindGridEvents(){\r\n global.ConsoleLogDegug(\"SaopRegAbsenceCalendarEventsView.bindGridEvents\");\r\n let _this = this;\r\n\r\n $(\"#\" + this._btnPreviousId).off(\"click\");\r\n $(\"#\" + this._btnPreviousId).click(function () {\r\n global.ConsoleLogDegug(\"SaopRegAbsenceCalendarEventsView.btnPrevious.click\");\r\n let leto = _this.getCurrentCalendarYear() - 1;\r\n _this.refreshCalendarAllMonthsData(leto);\r\n });\r\n\r\n $(\"#\" + this._btnNextId).off(\"click\");\r\n $(\"#\" + this._btnNextId).click(function () {\r\n global.ConsoleLogDegug(\"SaopRegAbsenceCalendarEventsView.btnNext.click\");\r\n let leto = _this.getCurrentCalendarYear() + 1;\r\n _this.refreshCalendarAllMonthsData(leto);\r\n });\r\n\r\n $(\"#\" + this._addKEZapDopustiId).off(\"click\");\r\n $(\"#\" + this._addKEZapDopustiId).on('click', function(row){\r\n global.ConsoleLogDegug(\"SaopRegAbsenceCalendarEventsView.addKEZapDopustiVnos.click\");\r\n _this.addRecord({});\r\n }); \r\n }\r\n\r\n refreshAllData(trigger: boolean = true): void {\r\n global.ConsoleLogDegug(\"SaopRegAbsenceCalendarEventsView.refreshAllData\");\r\n let leto = this.getCurrentCalendarYear();\r\n\r\n this.refreshCalendarAllMonthsData(leto);\r\n this.initRightSidebar();\r\n\r\n if (trigger && this.afterRefreshAllData != null) {\r\n this.afterRefreshAllData();\r\n }\r\n }\r\n\r\n refreshCalendarAllMonthsData(leto: number): void {\r\n global.ConsoleLogDegug(\"SaopRegAbsenceCalendarEventsView.refreshCalendarAllMonthsData\");\r\n let _this = this;\r\n\r\n this._saopServicesCore.afterDone = function(response){\r\n $(\"#regAbsenceCalendar\").html(response);\r\n _this.bindGridEvents();\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"REGAbsence/MyAbsencesYearCalendarPartial\"\r\n ,type: \"GET\"\r\n ,data: { leto: leto }\r\n ,spinnerDivId:\"#saopLoading\"\r\n }); \r\n }\r\n\r\n //refreshRightSidebarData(): void {\r\n // global.ConsoleLogDegug(\"SaopRegAbsenceCalendarEventsView.refreshRightSidebarData\");\r\n // let _this = this;\r\n\r\n // let _saopRightSidebarDopust: SaopRightSidebar = new SaopRightSidebar();\r\n // _saopRightSidebarDopust.refreshDopustZaKoriscenjeSummary(\"#myAbsenceCalendarDopustZaKoriscenjeSummary\", \"saopLoadingSidebarrMyAbsencesCalendar\");\r\n\r\n // let _saopRightSidebarUre: SaopRightSidebar = new SaopRightSidebar();\r\n // _saopRightSidebarUre.refreshUreZaKoriscenjeSummary(\"#myAbsenceCalendarUreZaKoriscenjeSummary\", \"saopLoadingSidebarrMyAbsencesCalendar\");\r\n //}\r\n\r\n afterRefreshAllData(): void {\r\n global.ConsoleLogDegug(\"SaopRegAbsenceCalendarEventsView.afterRefreshAllData\");\r\n }\r\n\r\n getCurrentCalendarYear(): number {\r\n global.ConsoleLogDegug(\"SaopRegAbsenceCalendarEventsView.getCurrentCalendarYear\");\r\n return $(\"#\" + this._yearCaption).data(\"year\");\r\n }\r\n}\r\n\r\n\r\n","/// \r\nimport { global } from \"../Common/saop-common\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { SaopRightSidebar,SaopRightSidebarView } from '../Components/saop-right-sidebar';\r\nimport { SaopRegKeZapDopustiView } from \"./saop-reg-keZapDopusti-view\";\r\n\r\nexport class SaopRegAbsenceEventsView extends SaopRegKeZapDopustiView {\r\n private _saopServicesCore: SaopServicesCore;\r\n\r\n public rightSidebar: SaopRightSidebar;\r\n\r\n constructor(viewId: string, libName: string = \"\") {\r\n super(viewId, libName);\r\n this.refreshData = this.refreshAllData.bind(this);\r\n //\r\n this._saopServicesCore = new SaopServicesCore();\r\n }\r\n\r\n initView(): void {\r\n global.ConsoleLogDegug(\"SaopRegAbsenceEventsView.initView\");\r\n this.initRightSidebar();\r\n }\r\n\r\n initRightSidebar() {\r\n this.rightSidebar = new SaopRightSidebar();\r\n this.rightSidebar.bindCarouselDiv(\"#right-sidebar-dopust\", SaopRightSidebarView.Absence);\r\n this.rightSidebar.refreshOdsotnostiSummary(\"#dopustZaKoriscenjeSummary\", \"#ureZaKoriscenjeSummary\");\r\n }\r\n\r\n bindGridEvents(){\r\n global.ConsoleLogDegug(\"SaopRegAbsenceEventsView.bindGridEvents\");\r\n let _this = this;\r\n //\r\n $(\"#addKEZapDopusti\").off(\"click\");\r\n $(\"#addKEZapDopusti\").on('click', function(row){\r\n global.ConsoleLogDegug(\"SaopRegAbsenceEventsView.addKEZapDopusti.click\");\r\n _this.addRecord({});\r\n }); \r\n //\r\n $(\".deleteKEZapDopusti\").off(\"click\");\r\n $(\".deleteKEZapDopusti\").on('click', function(row){\r\n global.ConsoleLogDegug(\"SaopRegAbsenceEventsView.deleteKEZapDopusti.click\");\r\n let leto = row.target.getAttribute(\"data-leto\");\r\n let zaporednastevilka = row.target.getAttribute(\"data-zaporednastevilka\");\r\n //\r\n let deleteModalFormTitle = _this.translationService.translate(\"Brisanje\");\r\n let deleteModalFormBody = _this.translationService.translate(\"Ali ste prepričani, da želite izbrisati odsotnost?\");\r\n _this.deleteRecord(deleteModalFormTitle,deleteModalFormBody,{ leto: leto, zaporednaStevilka: zaporednastevilka });\r\n }); \r\n }\r\n\r\n refreshAllData(trigger: boolean = true): void {\r\n global.ConsoleLogDegug(\"SaopRegAbsenceEventsView.refreshAllData\");\r\n let _this = this;\r\n\r\n this._saopServicesCore.afterDone = function(response){\r\n $(\"#regAbsenceForm\").html(response);\r\n _this.bindGridEvents();\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"REGAbsence/MyAbsencesPartial\"\r\n ,type:\"GET\"\r\n ,spinnerDivId:\"#saopLoading\"\r\n }); \r\n\r\n this.initRightSidebar();\r\n\r\n if (trigger && this.afterRefreshAllData != null) {\r\n this.afterRefreshAllData();\r\n }\r\n }\r\n\r\n afterRefreshAllData(): void {\r\n global.ConsoleLogDegug(\"SaopRegAbsenceCalendarEventsView.afterRefreshAllData\");\r\n }\r\n}\r\n\r\n\r\n","/// \r\nimport { global } from \"../Common/saop-common\";\r\nimport { SaopRegAbsenceEventsView } from \"./saop-regAbsenceEvents-view\";\r\nimport { SaopRegAbsenceCalendarEventsView } from \"./saop-regAbsenceCalendarEvents-view\";\r\n\r\nexport class SaopRegAbsenceMainView {\r\n public regAbsenceEventsView: SaopRegAbsenceEventsView;\r\n public regAbsenceCalendarEventsView: SaopRegAbsenceCalendarEventsView;\r\n\r\n constructor(libName: string = \"\") {\r\n this.regAbsenceEventsView = new SaopRegAbsenceEventsView(\"#regKeZapDopustiView0\", libName + \".regAbsenceEventsView\");\r\n this.regAbsenceEventsView.afterRefreshAllData = this.afterRefreshEventsData.bind(this);\r\n\r\n this.regAbsenceCalendarEventsView = new SaopRegAbsenceCalendarEventsView(\"#regKeZapDopustiView0\", libName + \".regAbsenceCalendarEventsView\");\r\n this.regAbsenceCalendarEventsView.afterRefreshAllData = this.afterRefreshCalendarData.bind(this);\r\n }\r\n\r\n initView(): void {\r\n global.ConsoleLogDegug(\"SaopRegAbsenceMainView.initView\");\r\n $(\"#site-main\").addClass(\"site-main-with-formSidebarr\");\r\n this.regAbsenceEventsView.refreshAllData(false);\r\n this.regAbsenceCalendarEventsView.refreshAllData(false);\r\n }\r\n\r\n afterRefreshEventsData(): void {\r\n global.ConsoleLogDegug(\"SaopRegAbsenceMainView.afterRefreshEventsData\");\r\n // po refresu \"absence events tab\" potrebno tudi refresh \"calendar tab\"\r\n this.regAbsenceCalendarEventsView.refreshAllData(false);\r\n }\r\n\r\n afterRefreshCalendarData(): void {\r\n global.ConsoleLogDegug(\"SaopRegAbsenceMainView.afterRefreshCalendarData\");\r\n // po refresu \"calendar tab\" potrebno tudi refresh \"absence events tab\"\r\n this.regAbsenceEventsView.refreshAllData(false);\r\n }\r\n}\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\nimport { SaopRightSidebar,SaopRightSidebarView } from '../Components/saop-right-sidebar';\r\nimport { ObdobjefilterValues } from \"../Components/saop-select-month-year\";\r\nimport { SaopRegTodayEventsView } from \"./saop-regTodayEvents-view\"\r\nimport { SaopRegView } from \"./saop-regUra-view\";\r\n\r\nexport class SaopRegAttendanceView {\r\n public regTodayEventsView:SaopRegTodayEventsView;\r\n public regUraView:SaopRegView;\r\n public rightSidebar: SaopRightSidebar;\r\n public rightSidebarK: SaopRightSidebar;\r\n public rightMonthSidebar: SaopRightSidebar;\r\n public rightMonthSidebarK: SaopRightSidebar;\r\n //\r\n\r\n constructor(libName: string = \"\") {\r\n this.regTodayEventsView = new SaopRegTodayEventsView(\"#regDogodekView0\",libName+\".regTodayEventsView\");\r\n this.regUraView = new SaopRegView(libName+\".regUraView\");\r\n this.rightSidebar = new SaopRightSidebar();\r\n this.rightSidebarK = new SaopRightSidebar();\r\n this.rightMonthSidebar = new SaopRightSidebar();\r\n this.rightMonthSidebarK = new SaopRightSidebar();\r\n }\r\n\r\n onInitView():void{\r\n global.ConsoleLogDegug(\"onInitView\");\r\n this.regTodayEventsView.initView();\r\n this.regUraView.initView();\r\n //\r\n let obdobjefilterValues: ObdobjefilterValues = new ObdobjefilterValues();\r\n\r\n this.rightSidebar.bindCarouselDiv(\"#right-sidebar-day\", SaopRightSidebarView.AttendanceDay);\r\n this.rightMonthSidebar.bindCarouselDiv(\"#right-sidebar-month\", SaopRightSidebarView.AttendanceMonth);\r\n\r\n this.refreshRightSidebarData(false);\r\n this.regTodayEventsView.afterRefreshData = this.afterRefreshMonthData.bind(this);\r\n this.regUraView.afterRefreshData = this.afterRefreshTodayData.bind(this);\r\n this.regUraView.onCloseView = this.onCloseRegUraDanView.bind(this);\r\n }\r\n\r\n afterRefreshTodayData(): void {\r\n global.ConsoleLogDegug(\"afterRefreshTodayData\");\r\n // refresh \"Evidenca prisotnosti - danasnji dan\"\r\n this.regTodayEventsView.refreshListData(false);\r\n //refresh right sidebar\r\n this.refreshRightSidebarData(true);\r\n }\r\n\r\n afterRefreshMonthData(): void {\r\n global.ConsoleLogDegug(\"afterRefreshMonthData\");\r\n this.regUraView.refreshRegUraBrowseView(false);\r\n // refresh \"Evidenca prisotnosti - mesecna evidenca\"\r\n this.refreshRightSidebarData(true);\r\n } \r\n\r\n refreshRightSidebarData(monthRefresh: boolean): void {\r\n let obdobjefilterValues: ObdobjefilterValues = new ObdobjefilterValues();\r\n\r\n //refresh right sidebar\r\n this.rightSidebar.refreshRegUraDogodkiSummary(\"#regUraDogodkiUreSummary\", obdobjefilterValues, \"#saopLoadingSidebarr\");\r\n this.rightSidebarK.refreshUreZaKoriscenjeSummary(\"#regUraDogodkiKoriscenjeSummary\", \"#saopLoadingSidebarr\");\r\n //\r\n if (monthRefresh) {\r\n obdobjefilterValues = this.regUraView._saopSelectMonthYear.getSelectedMonthYear();\r\n }\r\n this.rightMonthSidebar.refreshRegUraDogodkiSummary(\"#regUraMonthEventsUreSummary\", obdobjefilterValues, \"#saopLoadingRegUraMonthEventsSidebarr\");\r\n this.rightMonthSidebarK.refreshUreZaKoriscenjeSummary(\"#regUraMonthEventsKoriscenjeSummary\", \"#saopLoadingRegUraMonthEventsSidebarr\");\r\n // \r\n }\r\n\r\n refreshAllData(): void {\r\n global.ConsoleLogDegug(\"refreshAllData\");\r\n // refresh \"Evidenca prisotnosti - danasnji dan\"\r\n this.regTodayEventsView.refreshListData(false);\r\n //\r\n this.regUraView.refreshRegUraBrowseView(false);\r\n //refresh right sidebar\r\n this.refreshRightSidebarData(true);\r\n } \r\n\r\n onCloseRegUraDanView():void{\r\n global.ConsoleLogDegug(\"SaopRegAttendanceView.onCloseRegUraDanView\"); \r\n this.refreshAllData();\r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n","import { global, isEmpty, isUnDefined, filterTableRows, convertString2Date, formatDate } from \"../Common/saop-common\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { SaopPopover } from \"../Components/saop-popover\";\r\nimport { SaopRegView } from \"./saop-regUra-view\";\r\nimport { SaopRegDetailsTableView } from \"./saop-regUra-details-table-view\";\r\nimport { SaopWebGrid,SaopWebGridProperties,SaopWebGridToolbar,SaopWebDataTable} from \"../Components/saop-grid\";\r\nimport { SaopRegUraDogodekView } from \"../REG/saop-regUraDogodek-view\";\r\nimport { SaopRegUraDogodekDeleteView } from \"../REG/saop-regUraDogodekDelete-view\";\r\nimport { SaopWebGridUnitOrgFilter } from \"../Components/saop-grid-filter-UnitOrg\";\r\n\r\nclass DataAttributes {\r\n sifraZaposleni: string;\r\n leto: number;\r\n mesec: number;\r\n}\r\n\r\nclass ObdobjefilterValues {\r\n leto: number;\r\n mesec: number;\r\n mesecNaziv: string;\r\n}\r\n\r\nexport class SaopRegAttendanceAllEmployeesView {\r\n private _libName: string;\r\n private _refreshingAllEmployeesTable: boolean;\r\n private _tableId: string;\r\n private _inputHiddenDataId: string;\r\n private _searchAllFieldsValueId: string;\r\n private _obdobjeId: string;\r\n private _calendarIconId: string;\r\n private _obdobjeFilterLetoId: string;\r\n private _obdobjeFilterMesecId: string;\r\n private _obdobjeCurrentBtnId: string\r\n private _rowDetailsPrefixId: string;\r\n private _rowDetailsDivPrefixId: string;\r\n private _allEmployeesTableDivId: string; \r\n private _allEmployeesTableRowsId: string;\r\n private _markColumnCss: string;\r\n private _selectOrgFilter: SaopWebGridUnitOrgFilter;\r\n private _saopPopover: SaopPopover;\r\n private _regUraView: SaopRegView;\r\n private saopRegDetailsTableView: SaopRegDetailsTableView;\r\n private _lastDataValues:DataAttributes;\r\n private _regUraDogodek:SaopRegUraDogodekView; \r\n private _regUraDogodekDeleteView:SaopRegUraDogodekDeleteView; \r\n //\r\n public webGrid1:SaopWebGrid;\r\n //\r\n\r\n constructor(libName: string = \"\") {\r\n this._libName = libName;\r\n this._refreshingAllEmployeesTable = false;\r\n this._tableId = \"#attendanceAllEmployeesTable\";\r\n this._inputHiddenDataId = \"#allEmployeesTableHiddenData\";\r\n this._searchAllFieldsValueId = \"#SearchValue\";\r\n this._obdobjeId = \"#Obdobje\";\r\n this._calendarIconId = \"#calendarIcon\";\r\n this._obdobjeFilterLetoId = \"#letoObdobje\";\r\n this._obdobjeFilterMesecId = \"#MesecString\";\r\n this._obdobjeCurrentBtnId = \"#currentMonthBtnFilter\";\r\n this._rowDetailsPrefixId = \"#detailRow\";\r\n this._rowDetailsDivPrefixId = \"#detailRowDiv\";\r\n this._allEmployeesTableDivId = \"#attendanceAllEmployeesTableDiv\";\r\n this._allEmployeesTableRowsId = \"#attendanceAllEmployeesTableRows\";\r\n this._markColumnCss = \"saop-column-mark\";\r\n\r\n this._selectOrgFilter = new SaopWebGridUnitOrgFilter(libName, \"\");\r\n this._selectOrgFilter.filterZaposleniTableRows = this.filterZaposleniTableRows.bind(this);\r\n\r\n this._saopPopover = new SaopPopover();\r\n this._saopPopover.afterPopoverShow = this.afterPopoverShow.bind(this);\r\n\r\n this._regUraView = new SaopRegView(libName + \"._regUraView\");\r\n this.saopRegDetailsTableView = new SaopRegDetailsTableView(libName + \".saopRegDetailsTableView\", \"#reg-grid\");\r\n //\r\n this._regUraView.afterRefreshData = this.afterRefreshTodayData.bind(this);\r\n this._regUraView.onCloseView = this.onCloseRegUraDanView.bind(this); \r\n //\r\n this._regUraDogodek = new SaopRegUraDogodekView(\"#regDogodekView0\",libName + \"._regUraDogodek\");\r\n this._regUraDogodek.refreshData = this.afterAddEventsSuccess.bind(this);\r\n // \r\n this._regUraDogodekDeleteView = new SaopRegUraDogodekDeleteView(\"#regDogodekView0\",libName + \"._regUraDogodekDeleteView\");\r\n this._regUraDogodekDeleteView.afterDeleteSuccess = this.afterDeleteEventsSuccess.bind(this);\r\n this._regUraDogodekDeleteView.afterValidationError = this.onDeleteValidationError.bind(this);\r\n \r\n }\r\n\r\n\r\n onInitView():void{\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesView.onInitView\");\r\n this.refreshAllData();\r\n }\r\n\r\n initWebGrid1(){\r\n let wgId = \"#attendanceAllEmployeesTable\";\r\n let captionToolbar = $(wgId).attr(\"caption-toolbar\");\r\n //let captionAddButton = $(wgId).attr(\"caption-addButton\"); \r\n //\r\n this.webGrid1 = new SaopWebGrid(this._libName+\".webGrid1\");\r\n let gridProperties: SaopWebGridProperties;\r\n let gridToolbar:SaopWebGridToolbar;\r\n //let toolbarButtons:SaopWebGridToolbarButton[] = [];\r\n let dataTable:SaopWebDataTable;\r\n //\r\n //toolbarButtons.push({id:\"addTo\",caption:captionAddButton,onClickEvent:this.libName+\".addRecord();\"}); \r\n //gridToolbar = {id:\"saopWebGridTB1\",caption:captionToolbar,buttons:toolbarButtons};\r\n \r\n dataTable = {enabled:true};\r\n \r\n gridProperties = {\r\n gridId:wgId\r\n //,toolbar:gridToolbar\r\n ,dataTable:dataTable\r\n }; \r\n //\r\n this.webGrid1.init(gridProperties); \r\n \r\n }\r\n\r\n refreshAllData(): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesView.refreshAllData\");\r\n\r\n this.refreshAllEmployeesData();\r\n } \r\n\r\n refreshAllEmployeesData(params: any = null): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesView.refreshAllEmployeesData\");\r\n \r\n let _this = this;\r\n let saopServicesCore = new SaopServicesCore();\r\n\r\n saopServicesCore.afterDone = function (response) {\r\n $(\"#attendanceAllEmployeesForm\").html(response);\r\n _this.initFilterControls();\r\n _this.bindGridEvents();\r\n _this.setEventBindings();\r\n // nastavimo prazno zabelo za prikaz mesecnih podatkov\r\n _this.getEmptyEmployeeMonthData();\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"REGAttendanceAllEmployees/GetAllEmployeesForm\"\r\n , data: params\r\n , type: \"GET\"\r\n , spinnerDivId: \"#attendanceAllEmployeesLoading\"\r\n }); \r\n }\r\n\r\n initFilterControls(): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesView.initFilterControls\");\r\n let _this = this;\r\n\r\n //\r\n this.buttonsBinding();\r\n //\r\n this.setEventBindings();\r\n //\r\n this._selectOrgFilter.initFilterControls();\r\n\r\n $(this._searchAllFieldsValueId).keyup(function () {\r\n let oTable = _this.webGrid1.dataTable;\r\n oTable.search($(this).val().toString()).draw() ; \r\n //$(_this.webGrid1.webGridId).dataTable().search($(this).val()).draw() ;\r\n });\r\n\r\n this._saopPopover.bindPopoverEvents();\r\n\r\n this.initObdobjeControl()\r\n }\r\n\r\n filterAllFields(): void {\r\n let filterVal = String($(this._searchAllFieldsValueId).val());\r\n filterTableRows(filterVal, this._tableId);\r\n }\r\n\r\n checkAndOnlyShowHideDetailsTable(masterRowId: string, isShowDemanded: boolean): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesView.checkAndOnlyShowHideDetailsTable\");\r\n\r\n let selectedRow = $(\"#\" + masterRowId);\r\n let actionDetailsColumn = selectedRow.find(\"td\").eq(1);\r\n let dataColumn = selectedRow.find(\"td\").eq(0);\r\n let dataValues = this.getDataValues(dataColumn, $(this._obdobjeId));\r\n\r\n // ce je definirano, da so details vidni, prikazi details tabelo\r\n let iconElement = actionDetailsColumn.find(\"span\");\r\n\r\n if (this.isDetailsSubTableShowed(iconElement)) {\r\n // prikazi/skrij details tabelo\r\n let rowDetailsId = this._rowDetailsPrefixId + dataValues.sifraZaposleni;\r\n let rowDetailsIdElement = $(rowDetailsId);\r\n let addClass = isShowDemanded ? \"saop-table-row-showed\" : \"saop-table-row-hidden\";\r\n let removeClass = isShowDemanded ? \"saop-table-row-hidden\" : \"saop-table-row-showed\";\r\n rowDetailsIdElement.addClass(addClass);\r\n rowDetailsIdElement.removeClass(removeClass);\r\n }\r\n }\r\n\r\n initObdobjeControl(): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesView.initObdobjeControl\");\r\n\r\n this.setObdobjeText(this._obdobjeId)\r\n }\r\n\r\n setObdobjeText(id: string): void {\r\n let obdobjeElement = $(this._obdobjeId);\r\n\r\n let mesecNaziv = obdobjeElement.attr(\"data-mesec-naziv\");\r\n let leto = obdobjeElement.attr(\"data-leto\");\r\n\r\n obdobjeElement.val(mesecNaziv + \" \" + leto);\r\n }\r\n\r\n getObdobjeDataAttributes(id: string): ObdobjefilterValues {\r\n let obdobjeElement = $(this._obdobjeId);\r\n\r\n let dataAttributes = new ObdobjefilterValues();\r\n dataAttributes.leto = parseInt(obdobjeElement.attr(\"data-leto\"));\r\n dataAttributes.mesec = parseInt(obdobjeElement.attr(\"data-mesec\"));\r\n dataAttributes.mesecNaziv = obdobjeElement.attr(\"data-mesec-naziv\");\r\n\r\n return dataAttributes;\r\n }\r\n \r\n setObdobjeDataAttributes(id: string, values: ObdobjefilterValues): void {\r\n let obdobjeElement = $(id);\r\n\r\n if (values.leto != null && values.mesec != null) {\r\n obdobjeElement.attr(\"data-leto\", values.leto);\r\n obdobjeElement.attr(\"data-mesec\", values.mesec);\r\n obdobjeElement.attr(\"data-mesec-naziv\", values.mesecNaziv);\r\n\r\n this.setObdobjeText(this._obdobjeId);\r\n } \r\n }\r\n\r\n bindGridEvents(): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesView.bindGridEvents\");\r\n let _this = this;\r\n\r\n // prikaz dogodkov zaposlenega po posameznih dnevih\r\n $(\"body\").off(\"click\", this._tableId + \" tr.saop-table-row-master td:not(.td-action-details)\");\r\n $(\"body\").on(\"click\", this._tableId + \" tr.saop-table-row-master td:not(.td-action-details)\", function () {\r\n let selectedRow = $(this).closest(\"tr\");\r\n let dataColumn = $(this).closest(\"tr\").find(\"td\").eq(0);\r\n let dataValues = _this.getDataValues(dataColumn, $(_this._obdobjeId));\r\n _this._lastDataValues = dataValues;\r\n _this.allEmployeesTableMarkRow(selectedRow, dataValues);\r\n _this.refreshEmployeeMonthData(dataValues);\r\n });\r\n\r\n // prikaz dogodkov zaposlenega po vrsti dogodkov (sum ure)\r\n $(\"body\").off(\"click\", this._tableId + \" tr.saop-table-row-master td.td-action-details\");\r\n $(\"body\").on(\"click\", this._tableId + \" tr.saop-table-row-master td.td-action-details\", function () {\r\n let selectedRow = $(this).closest(\"tr\");\r\n let actionDetailsColumn = selectedRow.find(\"td\").eq(2);\r\n let dataColumn = $(this).closest(\"tr\").find(\"td\").eq(0);\r\n let dataValues = _this.getDataValues(dataColumn, $(_this._obdobjeId));\r\n _this.showHideDetailsSubTable(selectedRow, actionDetailsColumn, dataValues);\r\n });\r\n //\r\n this.initWebGrid1();\r\n //\r\n this.bindDropDownMenuEvents(); \r\n }\r\n\r\n public bindDropDownMenuEvents(): void {\r\n let _this = this;\r\n //\r\n $(\".attendanceAllEmployeesFormCheckIn\").off(\"click\");\r\n $(\".attendanceAllEmployeesFormCheckIn\").on('click', function(row){\r\n global.ConsoleLogDegug(\"attendanceAllEmployeesFormCheckIn.click\");\r\n _this.attendanceAllEmployeesFormCheckInOut(row,true); \r\n }); \r\n $(\".attendanceAllEmployeesFormCheckOut\").off(\"click\");\r\n $(\".attendanceAllEmployeesFormCheckOut\").on('click', function(row){\r\n global.ConsoleLogDegug(\"attendanceAllEmployeesFormCheckOut.click\");\r\n _this.attendanceAllEmployeesFormCheckInOut(row,false);\r\n }); \r\n // \r\n }\r\n\r\n getDataValues(dataColumn: JQuery, dataInput: JQuery): DataAttributes {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesView.getDataValues\");\r\n\r\n let dataValues = new DataAttributes();\r\n if (dataColumn != null && dataColumn.length > 0){\r\n dataValues.sifraZaposleni = dataColumn.attr(\"data-sifrazaposleni\");\r\n }\r\n \r\n dataValues.leto = parseInt(dataInput.attr(\"data-leto\"));\r\n dataValues.mesec = parseInt(dataInput.attr(\"data-mesec\"));\r\n\r\n return dataValues;\r\n }\r\n\r\n // oznacimo, na katero vrstico je uporabnik kliknil\r\n allEmployeesTableMarkRow(selectedRow: JQuery, dataValues: DataAttributes): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesView.allEmployeesTableMarkRow\");\r\n\r\n // odznacimo vse vrstice\r\n this.allEmployeesTableUnMarkRows();\r\n\r\n let markColumn = selectedRow.find(\"td.saop-td-mark-row\");\r\n markColumn.addClass(this._markColumnCss);\r\n\r\n // oznacimo se details row markcolumn\r\n let rowDetailsElement = $(this._rowDetailsPrefixId + dataValues.sifraZaposleni);\r\n let detailsMarkColumn = rowDetailsElement.find(\"td.saop-td-mark-row\");\r\n detailsMarkColumn.addClass(this._markColumnCss);\r\n }\r\n\r\n allEmployeesTableUnMarkRows(): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesView.allEmployeesTableUnMarkRows\");\r\n\r\n let _this = this;\r\n\r\n $(this._tableId + \" > tbody > tr\").each(\r\n function (index: any, tr: any) {\r\n let markColumn = $(tr).find(\"td\").eq(1);\r\n markColumn.removeClass(_this._markColumnCss);\r\n }\r\n );\r\n }\r\n\r\n // osvezimo mesecne podatke za posameznega zaposlenega\r\n // ce je parameter null, se prikaze \"Izberite zaposlenega za prikaz dogodkov\" \r\n refreshEmployeeMonthData(dataValues: DataAttributes): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesView.refreshEmployeeMonthData\");\r\n global.ConsoleLogDegug(dataValues);\r\n\r\n if (dataValues.sifraZaposleni == null) {\r\n return;\r\n }\r\n\r\n let _this = this;\r\n let params = { leto: dataValues.leto, mesec: dataValues.mesec, sifraZaposleni: dataValues.sifraZaposleni };\r\n let saopServicesCore = new SaopServicesCore();\r\n\r\n //\r\n let employeeName = $(\"#attendanceAllEmployeesTableRows\").find(\"[data-sifra-zaposleni='\" + dataValues.sifraZaposleni + \"']\").find(\"#employeeName\").html();\r\n $(\"#attendanceAllEmployeesRightSideDiv\").find(\"#employeeName\").html(employeeName);\r\n //\r\n\r\n saopServicesCore.afterDone = function (response) {\r\n $(\"#reg-grid\").html(response);\r\n _this.refreshEmployeeMonthTableHtml();\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"REGMonthEvents/GetRegUraTableView2\"\r\n , data: params\r\n , type: \"GET\"\r\n , spinnerDivId: \"#saopLoadingEmployeeMonthGrid\"\r\n });\r\n }\r\n\r\n // vrne prazno tabelo mesecne podatke za zaposlenega\r\n getEmptyEmployeeMonthData(): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesView.getEmptyEmployeeMonthData\");\r\n\r\n let _this = this;\r\n let saopServicesCore = new SaopServicesCore();\r\n\r\n $(\"#attendanceAllEmployeesRightSideDiv\").find(\"#employeeName\").html(\"\");\r\n\r\n saopServicesCore.afterDone = function (response) {\r\n $(\"#reg-grid\").html(response);\r\n _this.refreshEmployeeMonthTableHtml();\r\n //_this.bindDropDownMenuEvents();\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"REGMonthEvents/GetEmptyRegUraTableView\"\r\n , type: \"GET\"\r\n , spinnerDivId: \"#saopLoadingEmployeeMonthGrid\"\r\n });\r\n }\r\n\r\n // osvezimo table html elemente\r\n refreshEmployeeMonthTableHtml(): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesView.refreshEmployeeMonthTableHtml\");\r\n // refresh month employee data brez bind events\r\n let _btnAddEvents = $(\"#btnAddEvents\");\r\n if (_btnAddEvents.length > 0) {\r\n this._regUraView.refreshTableData(true);\r\n } else {\r\n this._regUraView.refreshTableData(false);\r\n }\r\n\r\n // dodamo bind event za details tabelo\r\n this.saopRegDetailsTableView.bindGridEvents();\r\n\r\n this.bindDropDownMenuEvents();\r\n }\r\n\r\n isDetailsSubTableShowed(iconElement: JQuery): boolean {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesView.isDetailsSubTableShowed\");\r\n\r\n return iconElement.hasClass(\"saop-img-down\");\r\n }\r\n\r\n showHideDetailsSubTable(selectedRow: JQuery, actionDetailsColumn: JQuery, dataValues: DataAttributes): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesView.showHideDetailsSubTable\");\r\n\r\n let iconElement = actionDetailsColumn.find(\"span\");\r\n\r\n let rowDetailsId = this._rowDetailsPrefixId + dataValues.sifraZaposleni;\r\n let rowDetailsIdElement = $(rowDetailsId);\r\n\r\n if (!this.isDetailsSubTableShowed(iconElement)) {\r\n // show details subtable\r\n // preverim, če tabela ze obstaja\r\n let detailRowDivId = this._rowDetailsDivPrefixId + dataValues.sifraZaposleni;\r\n let detailRowTableElement = $(detailRowDivId + \" table\");\r\n if (detailRowTableElement.length == 0) {\r\n // tabele ni, gremo na server po podatke za prikaz\r\n this.getDetailsSubTable(detailRowDivId, dataValues.leto, dataValues.mesec, dataValues.sifraZaposleni);\r\n }\r\n }\r\n\r\n // prikazi/skrij bottom border\r\n selectedRow.toggleClass(\"saop-table-row-border-bottom-none\")\r\n\r\n // prikazi/skrij details tabelo\r\n rowDetailsIdElement.toggleClass(\"saop-table-row-hidden\");\r\n rowDetailsIdElement.toggleClass(\"saop-table-row-showed\");\r\n\r\n // sprememba ikone\r\n iconElement.toggleClass(\"saop-img-right\");\r\n iconElement.toggleClass(\"saop-img-down\");\r\n }\r\n\r\n getDetailsSubTable(detailRowDivId: string, leto: number, mesec: number, sifraZaposleni: string): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesView.getDetailsSubTable\");\r\n\r\n let saopServicesCore = new SaopServicesCore();\r\n let params = { leto: leto, mesec: mesec, sifraZaposleni: sifraZaposleni };\r\n\r\n saopServicesCore.afterDone = function (response) {\r\n $(detailRowDivId).html(response);\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"REGAttendanceAllEmployees/GetEmployeeEventsForm\"\r\n , data: params\r\n , type: \"GET\"\r\n , spinnerDivId: \"#attendanceAllEmployeesLoading\"\r\n }); \r\n }\r\n\r\n obdobjeClick(): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesView.obdobjeClick\");\r\n $(this._calendarIconId).trigger(\"click\");\r\n }\r\n\r\n afterPopoverShow(): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesView.afterPopoverShow\");\r\n\r\n let obdobjeData = this.getObdobjeDataAttributes(this._obdobjeId);\r\n\r\n // osvezimo vrednosti filtrov iz data attributes\r\n this.setObdobjeFilterValues(obdobjeData);\r\n\r\n // prikazi okno\r\n var filterBody = $(\"div.popover.show\").find(\"#popOverObdobjeBody\");\r\n filterBody.show();\r\n }\r\n\r\n // klik na gumb trenutni v popover filtru za obdobje\r\n obdobjeCurrentMonth(): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesView.obdobjeCurrentMonth\");\r\n\r\n let currentMonthFilterValues = new ObdobjefilterValues();\r\n\r\n currentMonthFilterValues.leto = new Date().getFullYear();\r\n currentMonthFilterValues.mesec = new Date().getMonth() + 1;\r\n currentMonthFilterValues.mesecNaziv = this.getMonthName(currentMonthFilterValues.mesec);\r\n\r\n // zapisemo vrednost v filter leto\r\n this.setObdobjeFilterValues(currentMonthFilterValues);\r\n\r\n // osvezimo obdobje element z novimi podatki\r\n this.setObdobjeDataAttributes(this._obdobjeId, currentMonthFilterValues);\r\n\r\n // osvezimo tabelo podatkov vseh zaposlenih\r\n this.refreshAllEmployeesTable(currentMonthFilterValues.leto, currentMonthFilterValues.mesec);\r\n }\r\n\r\n // na popover filtru za obdobje pomik za en mesec naprej, nazaj\r\n obdobjefiltersMonthStepChange(step: number): void {\r\n if (this._refreshingAllEmployeesTable == true) {\r\n // poteka postopek osvezevanja pdoatkov, novi zahtevek ni dovoljen \r\n return;\r\n }\r\n\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesView.obdobjefiltersMonthStepChange\");\r\n\r\n // preberemo vrednosti leto in mesec\r\n let filterValues = this.getObdobjefilterValues();\r\n\r\n let newFilterValues = new ObdobjefilterValues();\r\n newFilterValues.mesec = filterValues.mesec + step;\r\n newFilterValues.leto = filterValues.leto;\r\n if (newFilterValues.mesec == 13) {\r\n // za december je januar\r\n newFilterValues.mesec = 1;\r\n newFilterValues.leto = newFilterValues.leto + 1;\r\n }\r\n else if (newFilterValues.mesec == 0) {\r\n // pred januarjem je december\r\n newFilterValues.mesec = 12;\r\n newFilterValues.leto = newFilterValues.leto - 1;\r\n }\r\n\r\n // poiscemo se naziv meseca\r\n newFilterValues.mesecNaziv = this.getMonthName(newFilterValues.mesec);\r\n\r\n // zapisemo novo vrednost v filter leto\r\n this.setObdobjeFilterValues(newFilterValues);\r\n\r\n // osvezimo obdobje element z novimi podatki\r\n this.setObdobjeDataAttributes(this._obdobjeId, newFilterValues);\r\n\r\n // osvezimo tabelo podatkov vseh zaposlenih\r\n this.refreshAllEmployeesTable(newFilterValues.leto, newFilterValues.mesec);\r\n }\r\n\r\n getMonthName(month: number): string {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesView.getMonthName\");\r\n\r\n let mesecElement = $(\"div.popover.show\").find(this._obdobjeFilterMesecId);\r\n if (mesecElement.length) {\r\n return $(mesecElement).find(\" option[value = '\" + month + \"']\").text();\r\n }\r\n\r\n return \"\";\r\n }\r\n\r\n enableDisableObdobjeFilters(disable: boolean): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesView.enableDisableObdobjeFilters\");\r\n\r\n // leto\r\n let letoElement = $(\"div.popover.show\").find(this._obdobjeFilterLetoId);\r\n if (letoElement.length) {\r\n letoElement.prop(\"disabled\", disable);\r\n }\r\n\r\n // mesec\r\n let mesecElement = $(\"div.popover.show\").find(this._obdobjeFilterMesecId);\r\n if (mesecElement.length) {\r\n mesecElement.prop(\"disabled\", disable);\r\n } \r\n\r\n // gumb trenutni\r\n let _obdobjeCurrentBtnElement = $(\"div.popover.show\").find(this._obdobjeCurrentBtnId);\r\n if (_obdobjeCurrentBtnElement.length) {\r\n _obdobjeCurrentBtnElement.prop(\"disabled\", disable);\r\n } \r\n }\r\n\r\n setObdobjeFilterValues(filterValues: ObdobjefilterValues): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesView.setObdobjeFilterValues\");\r\n\r\n let oldfilterValues = this.getObdobjefilterValues();\r\n\r\n // leto\r\n if (oldfilterValues.leto != filterValues.leto) {\r\n let letoElement = $(\"div.popover.show\").find(this._obdobjeFilterLetoId);\r\n if (letoElement.length) {\r\n letoElement.val(filterValues.leto);\r\n }\r\n }\r\n\r\n // mesec\r\n if (oldfilterValues.mesec != filterValues.mesec) {\r\n let mesecElement = $(\"div.popover.show\").find(this._obdobjeFilterMesecId);\r\n if (mesecElement.length) {\r\n mesecElement.val(filterValues.mesec.toString());\r\n } \r\n } \r\n }\r\n\r\n // vrednosti v filtru leto, mesec so se spremenile\r\n obdobjefiltersChanged(): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesView.obdobjefiltersChanged\");\r\n\r\n // preberemo vrednosti leto in mesec\r\n let filterValues = this.getObdobjefilterValues();\r\n\r\n // osvezimo obdobje element z novimi podatki\r\n this.setObdobjeDataAttributes(this._obdobjeId, filterValues);\r\n\r\n this.refreshAllEmployeesTable(filterValues.leto, filterValues.mesec);\r\n }\r\n\r\n getObdobjefilterValues(): ObdobjefilterValues {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesView.getObdobjefilterValues\");\r\n\r\n let filterValues = new ObdobjefilterValues();\r\n filterValues.leto = null;\r\n filterValues.mesec = null;\r\n filterValues.mesecNaziv = \"\";\r\n\r\n // dolocimo leto\r\n let letoElement = $(\"div.popover.show\").find(this._obdobjeFilterLetoId);\r\n if (letoElement.length) {\r\n let letoStr = String(letoElement.val());\r\n if (letoStr.length == 4 || letoStr.length == 0) {\r\n if (letoStr.length == 4) {\r\n filterValues.leto = +letoStr;\r\n }\r\n }\r\n }\r\n \r\n // dolocimo mesec\r\n let mesecElement = $(\"div.popover.show\").find(this._obdobjeFilterMesecId);\r\n if (mesecElement.length) {\r\n let selMesecNaziv = $(mesecElement).find(\":selected\").text();\r\n let selMesec = $(mesecElement).find(\":selected\").val();\r\n\r\n if (!isNaN(+selMesec)) {\r\n filterValues.mesec = +selMesec\r\n filterValues.mesecNaziv = selMesecNaziv\r\n }\r\n }\r\n\r\n return filterValues;\r\n }\r\n\r\n refreshAllEmployeesTable(leto: number, mesec: number): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesView.refreshAllEmployeesTable\");\r\n\r\n let _this = this;\r\n let saopServicesCore = new SaopServicesCore();\r\n let params = { leto: leto, mesec: mesec };\r\n this._refreshingAllEmployeesTable = true;\r\n\r\n this.enableDisableObdobjeFilters(this._refreshingAllEmployeesTable);\r\n\r\n saopServicesCore.afterDone = function (response) {\r\n _this.webGrid1.replaceGridRows(response);\r\n\r\n //$(_this._tableId).html(response);\r\n \r\n _this._refreshingAllEmployeesTable = false;\r\n _this.enableDisableObdobjeFilters(_this._refreshingAllEmployeesTable);\r\n\r\n // izvedemo se filter vrstic tabele glede oznacenih zaposlenih\r\n let izbraniZaposleni = (_this._selectOrgFilter._selectZaposleni.selectedCB.val());\r\n _this._selectOrgFilter._selectZaposleni.setSelectValues(izbraniZaposleni);\r\n\r\n // nastavimo prazno zabelo za prikaz mesecnih podatkov\r\n _this.getEmptyEmployeeMonthData();\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"REGAttendanceAllEmployees/GetAllEmployeesTable\"\r\n , data: params\r\n , type: \"GET\"\r\n , spinnerDivId: \"#attendanceAllEmployeesLoading\"\r\n }); \r\n\r\n }\r\n\r\n refreshEmployeeRow(leto: number, mesec: number, sifraZaposleni: string = \"\"): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesView.refreshEmployeeTable:\"+sifraZaposleni);\r\n\r\n let _this = this;\r\n let saopServicesCore = new SaopServicesCore();\r\n let params = { leto: leto, mesec: mesec, sifraZaposleni: sifraZaposleni };\r\n\r\n saopServicesCore.afterDone = function (response) {\r\n _this.refreshEmployeeRowHtml(response,sifraZaposleni); \r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"REGAttendanceAllEmployees/GetAllEmployeesTable\"\r\n , data: params\r\n , type: \"GET\"\r\n , spinnerDivId: \"#attendanceAllEmployeesLoading\"\r\n }); \r\n }\r\n\r\n public refreshEmployeeRowHtml(htmlRespone:string,sifraZaposleni:string): void {\r\n //var source_dom_nodes = $($.parseHTML('
    '+htmlRespone+'
    '));\r\n //\r\n let responeNode = $(htmlRespone);\r\n\r\n //let sourceRow = responeNode[0].outerHTML;\r\n let sourceRow = $(responeNode[2].outerHTML);\r\n //let sourceDetailsRow = responeNode[2].outerHTML;\r\n\r\n let destinationRow = $(this._allEmployeesTableRowsId + \" > [data-sifra-zaposleni='\" + sifraZaposleni + \"']\");\r\n // destinationDetailsRow = $(this._allEmployeesTableRowsId+\" > #detailRow\"+sifraZaposleni);\"[data-sifra-zaposleni='\" + dataValues.sifraZaposleni + \"']\"\r\n if (destinationRow.length > 0){\r\n let _sourceTd = sourceRow.find(\"td\");\r\n let _destTd = destinationRow.find(\"td\");\r\n \r\n _destTd.eq(4).replaceWith(_sourceTd.eq(4));\r\n _destTd.eq(5).replaceWith(_sourceTd.eq(5));\r\n _destTd.eq(6).replaceWith(_sourceTd.eq(6));\r\n _destTd.eq(7).replaceWith(_sourceTd.eq(7));\r\n _destTd.eq(8).replaceWith(_sourceTd.eq(8));\r\n _destTd.eq(9).replaceWith(_sourceTd.eq(9));\r\n }\r\n }\r\n\r\n afterRefreshTodayData(): void {\r\n global.ConsoleLogDegug(\"afterRefreshTodayData\");\r\n }\r\n\r\n onCloseRegUraDanView():void{\r\n global.ConsoleLogDegug(\"SaopRegAttendanceView.onCloseRegUraDanView\"); \r\n if (isUnDefined(this._lastDataValues) == false) {\r\n let detailRowDivId = this._rowDetailsDivPrefixId + this._lastDataValues.sifraZaposleni;\r\n this.refreshEmployeeRow(this._lastDataValues.leto,this._lastDataValues.mesec,this._lastDataValues.sifraZaposleni);\r\n this.getDetailsSubTable(detailRowDivId,this._lastDataValues.leto,this._lastDataValues.mesec,this._lastDataValues.sifraZaposleni);\r\n //\r\n this.refreshEmployeeMonthData(this._lastDataValues);\r\n } \r\n } \r\n \r\n public buttonsBinding():void{\r\n global.ConsoleLogDegug(\"buttonsBinding...\");\r\n //\r\n let _this = this;\r\n let _btnAddEvents = $(\"#attendanceAllEmployeesForm\").find(\"#btnAddEvents\");\r\n if (_btnAddEvents.length > 0) {\r\n _btnAddEvents.off(\"click\");\r\n _btnAddEvents.on(\"click\", function () {\r\n global.ConsoleLogDegug(\"btnAddEvents.click...\");\r\n let dataValues = _this.getDataValues(null, $(_this._obdobjeId));\r\n let _leto = dataValues.leto;\r\n let _mesec = (\"0\"+dataValues.mesec).slice(-2);\r\n let _dateStart = convertString2Date(\"01.\"+_mesec+\".\"+_leto,\"dd.mm.yyyy\"); \r\n //\r\n let _today = new Date();\r\n let __todayYear = _today.getFullYear();\r\n let __todayMonth = _today.getMonth();\r\n if (__todayYear == _dateStart.getFullYear() && __todayMonth == _dateStart.getMonth() ){\r\n let _dan = (\"0\"+_today.getDate()).slice(-2);\r\n _dateStart = convertString2Date(_dan+\".\"+_mesec+\".\"+_leto,\"dd.mm.yyyy\"); \r\n }\r\n // \r\n _this._regUraDogodek.addRecord({ SelectedDay:formatDate(_dateStart,\"dd.mm.yyyy\"), sifraZaposleni:\"*\"}); \r\n });\r\n } else {\r\n console.log(\"error:attendanceAllEmployeesForm.btnAddEvents not found...\");\r\n \r\n }\r\n //\r\n let _btnDeleteEvents = $(\"#attendanceAllEmployeesForm\").find(\"#btnDeleteEvents\");\r\n if (_btnDeleteEvents.length > 0) {\r\n _btnDeleteEvents.off(\"click\");\r\n _btnDeleteEvents.on(\"click\", function () {\r\n global.ConsoleLogDegug(\"btnDeleteEvents.click...\");\r\n let dataValues = _this.getDataValues(null, $(_this._obdobjeId));\r\n let _leto = dataValues.leto;\r\n let _mesec = (\"0\"+dataValues.mesec).slice(-2);\r\n let _dateStart = convertString2Date(\"01.\"+_mesec+\".\"+_leto,\"dd.mm.yyyy\");\r\n let _dateEnd = convertString2Date(\"01.\"+_mesec+\".\"+_leto,\"dd.mm.yyyy\");; \r\n _dateEnd = new Date(_dateEnd.setMonth(_dateEnd.getMonth() + 1)-1);\r\n //\r\n _this._regUraDogodekDeleteView.showForm({DateStart:formatDate(_dateStart,\"dd.mm.yyyy\"),DateEnd:formatDate(_dateEnd,\"dd.mm.yyyy\")});\r\n });\r\n } else {\r\n console.log(\"error:attendanceAllEmployeesForm.btnAddEvents not found...\");\r\n \r\n } \r\n // \r\n let _btnRefresh = $(\"#attendanceAllEmployeesForm\").find(\"#btnRefresh\");\r\n if (_btnRefresh.length > 0) {\r\n _btnRefresh.off(\"click\");\r\n _btnRefresh.on(\"click\", function () {\r\n global.ConsoleLogDegug(\"btnRefresh.click...\");\r\n _this.refreshDataWithCurrentFiler(); \r\n });\r\n } else {\r\n console.log(\"error:attendanceAllEmployeesForm.btnRefresh not found...\");\r\n } \r\n //\r\n let _btnCheckInAll = $(\"#attendanceAllEmployeesForm\").find(\".btnCheckInAll\");\r\n if (_btnCheckInAll.length > 0) {\r\n _btnCheckInAll.off(\"click\");\r\n _btnCheckInAll.on(\"click\", function () {\r\n global.ConsoleLogDegug(\"CheckInAll.click...\");\r\n _this.attendanceAllEmployeesFormCheckInOutAll(true);\r\n });\r\n } else {\r\n console.log(\"error:attendanceAllEmployeesForm.btnCheckInAll not found...\");\r\n } \r\n //\r\n let _btnCheckOutAll = $(\"#attendanceAllEmployeesForm\").find(\".btnCheckOutAll\");\r\n if (_btnCheckOutAll.length > 0) {\r\n _btnCheckOutAll.off(\"click\");\r\n _btnCheckOutAll.on(\"click\", function () {\r\n global.ConsoleLogDegug(\"btnCheckOutAll.click...\");\r\n _this.attendanceAllEmployeesFormCheckInOutAll(false);\r\n });\r\n } else {\r\n console.log(\"error:attendanceAllEmployeesForm.btnCheckOutAll not found...\");\r\n } \r\n \r\n }\r\n\r\n public setTableHeight():void {\r\n global.ConsoleLogDegug(\"setTableHeight...\");\r\n\r\n let _height = $('#grid-toolbar-processed').height();\r\n let remaining_height = window.innerHeight - _height - 245;\r\n $('#attendanceAllEmployeesTable_wrapper').css(\"height\",remaining_height); \r\n }\r\n\r\n public setEventBindings():void{\r\n global.ConsoleLogDegug(\"setEventBindings...\");\r\n let _this = this;\r\n\r\n _this.setTableHeight();\r\n window.onresize = function () {\r\n _this.setTableHeight();\r\n };\r\n\r\n }\r\n\r\n public refreshDataWithCurrentFiler(): void {\r\n global.ConsoleLogDegug(\"refreshDataWithCurrentFiler...\");\r\n let dataValues = this.getDataValues(null, $(this._obdobjeId));\r\n this.refreshAllEmployeesTable(dataValues.leto, dataValues.mesec);\r\n }\r\n\r\n public afterAddEventsSuccess(result: any): void {\r\n global.ConsoleLogDegug(\"afterAddEventsSuccess...\");\r\n this.refreshDataWithCurrentFiler();\r\n } \r\n \r\n public afterDeleteEventsSuccess(result: any): void {\r\n global.ConsoleLogDegug(\"afterDeleteEventsSuccess...\");\r\n this.refreshDataWithCurrentFiler();\r\n } \r\n\r\n public onDeleteValidationError(result: any): void {\r\n global.ConsoleLogDegug(\"onDeleteValidationError...\");\r\n this._regUraDogodekDeleteView.afterViewShowSuccess(result);\r\n } \r\n\r\n public attendanceAllEmployeesFormCheckInOut(row:any,checkIn:boolean):void{\r\n global.ConsoleLogDegug(\"attendanceAllEmployeesFormCheckIn.click\");\r\n let _this = this;\r\n //\r\n let _subMenu = row.currentTarget; \r\n let _leto = _subMenu.getAttribute(\"data-year\");\r\n let _mesec = _subMenu.getAttribute(\"data-month\");\r\n let _sifraZaposleni = _subMenu.getAttribute(\"data-employeeCode\"); \r\n //\r\n let _data = { leto: _leto, mesec: _mesec, sifraZaposleni: _sifraZaposleni };\r\n //\r\n let _urlAction = \"\";\r\n _urlAction = checkIn ? \"REGAttendanceAllEmployees/CalculationCheckIn\" :\"REGAttendanceAllEmployees/CalculationCheckOut\"; \r\n //\r\n let _saopServicesCore = new SaopServicesCore();\r\n _saopServicesCore.afterDone = function (response) {\r\n if (response.alertMessage) {\r\n alertify.message(response.alertMessage);\r\n }\r\n\r\n if (response.viewContent) {\r\n $(\"#messageBanner\").html(response.viewContent);\r\n }\r\n\r\n _this.refreshEmployeeRow(parseInt(_leto),parseInt(_mesec),_sifraZaposleni);\r\n\r\n };\r\n _saopServicesCore.ExecuteAction({\r\n action: _urlAction\r\n , data: _data\r\n , type: \"POST\"\r\n , spinnerDivId: \"#attendanceAllEmployeesLoading\"\r\n }); \r\n }\r\n\r\n public attendanceAllEmployeesFormCheckInOutAll(checkIn:boolean):void{\r\n global.ConsoleLogDegug(\"attendanceAllEmployeesFormCheckInOutAll.click\");\r\n let _this = this;\r\n let dataValues = this.getDataValues(null, $(this._obdobjeId));\r\n //\r\n let _data = { leto: dataValues.leto, mesec: dataValues.mesec, sifraZaposleni: \"\" };\r\n // \r\n let _urlAction = \"\";\r\n _urlAction = checkIn ? \"REGAttendanceAllEmployees/CalculationCheckIn\" :\"REGAttendanceAllEmployees/CalculationCheckOut\"; \r\n //\r\n let _saopServicesCore = new SaopServicesCore();\r\n _saopServicesCore.afterDone = function (response) {\r\n if (response.alertMessage) {\r\n alertify.message(response.alertMessage);\r\n }\r\n\r\n if (response.viewContent) {\r\n $(\"#messageBanner\").html(response.viewContent);\r\n }\r\n\r\n _this.refreshDataWithCurrentFiler();\r\n\r\n };\r\n _saopServicesCore.ExecuteAction({\r\n action: _urlAction\r\n , data: _data\r\n , type: \"POST\"\r\n , spinnerDivId: \"#attendanceAllEmployeesLoading\"\r\n }); \r\n }\r\n\r\n filterZaposleniTableRows(filterZaposleni: string) {\r\n // Declare variables\r\n var table, tr, _rowId, i, txtValue;\r\n table = document.getElementById(\"attendanceAllEmployeesTable\");\r\n tr = table.getElementsByTagName(\"tr\");\r\n // Loop through all table rows, and hide those who don't match the search query\r\n for (i = 0; i < tr.length; i++) {\r\n _rowId = null;\r\n let _trId = $(tr[i]).attr(\"data-sifra-zaposleni\");\r\n if (!isUnDefined(_trId)) {\r\n _rowId = _trId.toString()\r\n }\r\n\r\n if (_rowId) {\r\n txtValue = _rowId.toUpperCase();\r\n if (isEmpty(filterZaposleni)) {\r\n $(tr[i]).addClass(\"element-hidden\");\r\n } else if (filterZaposleni.toUpperCase().indexOf(txtValue) > -1) {\r\n $(tr[i]).removeClass(\"element-hidden\");\r\n } else {\r\n $(tr[i]).addClass(\"element-hidden\");\r\n }\r\n }\r\n }\r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n","import { global, isEmpty, isUnDefined, filterTableRows, convertString2Date, formatDate } from \"../Common/saop-common\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { SaopMultiselect, SelectOption, SaopMultiselectOptions } from \"../Components/saop-multiselect\";\r\nimport { SaopPopover } from \"../Components/saop-popover\";\r\nimport { SaopWebGrid,SaopWebGridProperties,SaopWebGridToolbar,SaopWebDataTable} from \"../Components/saop-grid\";\r\nimport { SaopExport } from \"../Components/saop-export\";\r\nimport { SaopWebGridUnitOrgFilter } from \"../Components/saop-grid-filter-UnitOrg\";\r\nimport { SaopTranslationService } from '../Core/saop-translate';\r\n\r\nclass ObdobjefilterValues {\r\n leto: number;\r\n mesec: number;\r\n mesecNaziv: string;\r\n}\r\n\r\nexport class SaopRegAttendanceAllEmployeesAnalysisView {\r\n private _libName: string;\r\n private _refreshingAllEmployeesTable: boolean;\r\n private _tableDivId: string;\r\n private _tableId: string;\r\n private _searchAllFieldsValueId: string;\r\n private _obdobjeId: string;\r\n private _calendarIconId: string;\r\n private _obdobjeFilterLetoId: string;\r\n private _obdobjeFilterMesecId: string;\r\n private _obdobjeCurrentBtnId: string\r\n private _tableRowsId: string;\r\n private _selectDogodekHiddenId: string; \r\n private _selectOrgFilter: SaopWebGridUnitOrgFilter;\r\n private _selectDogodek: SaopMultiselect;\r\n private _selectPrikazPodatki: SaopMultiselect;\r\n //\r\n public translationService:SaopTranslationService; \r\n //\r\n private _saopPopover: SaopPopover;\r\n //\r\n public webGrid1:SaopWebGrid;\r\n //\r\n\r\n constructor(libName: string = \"\") {\r\n this._libName = libName;\r\n this._refreshingAllEmployeesTable = false;\r\n this._tableDivId = \"#attendanceAllEmployeesAnalysisTableDiv\";\r\n this._tableId = \"#attendanceAllEmployeesAnalysisTable\";\r\n this._searchAllFieldsValueId = \"#SearchValue\";\r\n this._obdobjeId = \"#Obdobje\";\r\n this._calendarIconId = \"#calendarIcon\";\r\n this._obdobjeFilterLetoId = \"#letoObdobje\";\r\n this._obdobjeFilterMesecId = \"#MesecString\";\r\n this._obdobjeCurrentBtnId = \"#currentMonthBtnFilter\";\r\n this._tableRowsId = \"#attendanceAllEmployeesAnalysisTableRows\";\r\n this._selectDogodekHiddenId = \"#EventsFilterHidden\";\r\n\r\n this._selectOrgFilter = new SaopWebGridUnitOrgFilter(libName, \"\");\r\n this._selectOrgFilter.filterZaposleniTableRows = this.filterZaposleniTableRows.bind(this);\r\n\r\n this._saopPopover = new SaopPopover();\r\n this._saopPopover.afterPopoverShow = this.afterPopoverShow.bind(this); \r\n\r\n this.translationService = new SaopTranslationService();\r\n //\r\n this.setDictionary();\r\n }\r\n\r\n setDictionary(){\r\n let dictionary:string[] = [\"Zbirnik ur zaposlenih\"];\r\n this.translationService.setTranslationsList(dictionary);\r\n } \r\n\r\n onInitView():void{\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesAnalysisView.onInitView\");\r\n this.refreshAllData();\r\n }\r\n\r\n initWebGrid1() {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesAnalysisView.initWebGrid1\");\r\n\r\n let wgId = this._tableId;\r\n let captionToolbar = $(wgId).attr(\"caption-toolbar\");\r\n //let captionAddButton = $(wgId).attr(\"caption-addButton\"); \r\n //\r\n this.webGrid1 = new SaopWebGrid(this._libName+\".webGrid1\");\r\n let gridProperties: SaopWebGridProperties;\r\n let gridToolbar:SaopWebGridToolbar;\r\n //let toolbarButtons:SaopWebGridToolbarButton[] = [];\r\n let dataTable:SaopWebDataTable;\r\n //\r\n //toolbarButtons.push({id:\"addTo\",caption:captionAddButton,onClickEvent:this.libName+\".addRecord();\"});\r\n //gridToolbar = {id:\"saopWebGridTB1\",caption:captionToolbar,buttons:toolbarButtons};\r\n\r\n dataTable = {\r\n enabled: true,\r\n columnDefsSettings: [\r\n {\r\n targets: 4,\r\n type: 'numeric-comma'\r\n },\r\n {\r\n targets: \"special-sort\",\r\n render: (data, type, row, meta) => type === 'display' ? row[meta.col + 1] : data,\r\n type: 'numeric-comma'\r\n },\r\n {\r\n targets: \"special-sort-hidden\",\r\n visible: false\r\n }\r\n ]\r\n };\r\n \r\n gridProperties = {\r\n gridId:wgId\r\n //,toolbar:gridToolbar\r\n , dataTable: dataTable\r\n , css: \"max-height-attendanceAllEmployeesAnalysisTable\"\r\n }; \r\n //\r\n this.webGrid1.init(gridProperties); \r\n\r\n // fix css za stolpce za tedne, da imajo lahko nazivi stolpcev dve vrstici\r\n let tedenCaptionheaderDivs = $(this._tableId + \" thead tr th.saop-table-col-teden div.saop-table-header-caption\");\r\n let indElement = 0\r\n tedenCaptionheaderDivs.each(function (index, divElement) {\r\n indElement = indElement + 1;\r\n $(divElement).removeClass(\"saop-table-text-truncate\");\r\n $(divElement).addClass(\"saop-table-col-teden-caption\");\r\n });\r\n }\r\n\r\n refreshAllData(): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesAnalysisView.refreshAllData\");\r\n\r\n this.refreshAllEmployeesData();\r\n } \r\n\r\n refreshAllEmployeesData(params: any = null): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesAnalysisView.refreshAllEmployeesData\");\r\n \r\n let _this = this;\r\n let saopServicesCore = new SaopServicesCore();\r\n\r\n saopServicesCore.afterDone = function (response) {\r\n $(\"#attendanceAllEmployeesAnalysisForm\").html(response);\r\n _this.initFilterControls();\r\n _this.bindGridEvents();\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"REGAttendanceAllEmployeesAnalysis/GetAllEmployeesAnalysisForm\"\r\n , data: params\r\n , type: \"GET\"\r\n , spinnerDivId: \"#attendanceAllEmployeesAnalysisLoading\"\r\n }); \r\n }\r\n\r\n initFilterControls(): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesAnalysisView.initFilterControls\");\r\n let _this = this;\r\n\r\n //\r\n this.setEventBindings();\r\n //\r\n\r\n this._selectOrgFilter.initFilterControls();\r\n\r\n this._selectDogodek = new SaopMultiselect();\r\n this._selectDogodek.init(\"#EventsFilter\", \"Dogodki za prikaz\");\r\n // event binding za init, da se v init metodi (se nastavi checkboxe na select all) ne izvede metoda filterEventColumns (ni potrebe)\r\n this._selectDogodek.afterChangeCommonEvent = _this.filterEventColumns.bind(_this);\r\n\r\n this._selectPrikazPodatki = new SaopMultiselect();\r\n this._selectPrikazPodatki.init(\"#PodatkiFilter\", \"Dodatno filtriranje\");\r\n // odznacimo vse opcije\r\n let izbraniPodatki: string[] = []; \r\n this._selectPrikazPodatki.setSelectValues(izbraniPodatki);\r\n // event binding za init, da se v init metodi (se nastavi checkboxe na select all) ne izvede metoda filterEventColumns (ni potrebe)\r\n this._selectPrikazPodatki.afterChangeCommonEvent = _this.filterZaposleniTableRows.bind(this);\r\n\r\n $(this._searchAllFieldsValueId).keyup(function () {\r\n let oTable = _this.webGrid1.dataTable;\r\n oTable.search($(this).val().toString()).draw() ; \r\n //$(_this.webGrid1.webGridId).dataTable().search($(this).val()).draw() ;\r\n });\r\n\r\n this._saopPopover.bindPopoverEvents();\r\n\r\n this.initObdobjeControl()\r\n }\r\n\r\n //filterAllFields(): void {\r\n // global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesAnalysisView.filterAllFields\");\r\n\r\n // let filterVal = String($(this._searchAllFieldsValueId).val());\r\n // filterTableRows(filterVal, this._tableId);\r\n //}\r\n\r\n initObdobjeControl(): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesAnalysisView.initObdobjeControl\");\r\n\r\n this.setObdobjeText(this._obdobjeId)\r\n }\r\n\r\n setObdobjeText(id: string): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesAnalysisView.setObdobjeText\");\r\n\r\n let obdobjeElement = $(this._obdobjeId);\r\n\r\n let mesecNaziv = obdobjeElement.attr(\"data-mesec-naziv\");\r\n let leto = obdobjeElement.attr(\"data-leto\");\r\n\r\n obdobjeElement.val(mesecNaziv + \" \" + leto);\r\n }\r\n\r\n getObdobjeDataAttributes(id: string): ObdobjefilterValues {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesAnalysisView.getObdobjeDataAttributes\");\r\n\r\n let obdobjeElement = $(this._obdobjeId);\r\n\r\n let dataAttributes = new ObdobjefilterValues();\r\n dataAttributes.leto = parseInt(obdobjeElement.attr(\"data-leto\"));\r\n dataAttributes.mesec = parseInt(obdobjeElement.attr(\"data-mesec\"));\r\n dataAttributes.mesecNaziv = obdobjeElement.attr(\"data-mesec-naziv\");\r\n\r\n return dataAttributes;\r\n }\r\n \r\n setObdobjeDataAttributes(id: string, values: ObdobjefilterValues): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesAnalysisView.setObdobjeDataAttributes\");\r\n\r\n let obdobjeElement = $(id);\r\n\r\n if (values.leto != null && values.mesec != null) {\r\n obdobjeElement.attr(\"data-leto\", values.leto);\r\n obdobjeElement.attr(\"data-mesec\", values.mesec);\r\n obdobjeElement.attr(\"data-mesec-naziv\", values.mesecNaziv);\r\n\r\n this.setObdobjeText(this._obdobjeId);\r\n } \r\n }\r\n\r\n bindGridEvents(): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesAnalysisView.bindGridEvents\");\r\n\r\n this.initWebGrid1(); \r\n }\r\n\r\n obdobjeClick(): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesAnalysisView.obdobjeClick\");\r\n $(this._calendarIconId).trigger(\"click\");\r\n }\r\n\r\n afterPopoverShow(): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesAnalysisView.afterPopoverShow\");\r\n\r\n let obdobjeData = this.getObdobjeDataAttributes(this._obdobjeId);\r\n\r\n // osvezimo vrednosti filtrov iz data attributes\r\n this.setObdobjeFilterValues(obdobjeData);\r\n\r\n // prikazi okno\r\n var filterBody = $(\"div.popover.show\").find(\"#popOverObdobjeBody\");\r\n filterBody.show();\r\n }\r\n\r\n // klik na gumb trenutni v popover filtru za obdobje\r\n obdobjeCurrentMonth(): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesAnalysisView.obdobjeCurrentMonth\");\r\n\r\n let currentMonthFilterValues = new ObdobjefilterValues();\r\n\r\n currentMonthFilterValues.leto = new Date().getFullYear();\r\n currentMonthFilterValues.mesec = new Date().getMonth() + 1;\r\n currentMonthFilterValues.mesecNaziv = this.getMonthName(currentMonthFilterValues.mesec);\r\n\r\n // zapisemo vrednost v filter leto\r\n this.setObdobjeFilterValues(currentMonthFilterValues);\r\n\r\n // osvezimo obdobje element z novimi podatki\r\n this.setObdobjeDataAttributes(this._obdobjeId, currentMonthFilterValues);\r\n\r\n // osvezimo tabelo podatkov vseh zaposlenih\r\n this.refreshAllEmployeesTable(currentMonthFilterValues.leto, currentMonthFilterValues.mesec);\r\n }\r\n\r\n // na popover filtru za obdobje pomik za en mesec naprej, nazaj\r\n obdobjefiltersMonthStepChange(step: number): void {\r\n if (this._refreshingAllEmployeesTable == true) {\r\n // poteka postopek osvezevanja podatkov, novi zahtevek ni dovoljen \r\n return;\r\n }\r\n\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesAnalysisView.obdobjefiltersMonthStepChange\");\r\n\r\n // preberemo vrednosti leto in mesec\r\n let filterValues = this.getObdobjefilterValues();\r\n\r\n let newFilterValues = new ObdobjefilterValues();\r\n newFilterValues.mesec = filterValues.mesec + step;\r\n newFilterValues.leto = filterValues.leto;\r\n if (newFilterValues.mesec == 13) {\r\n // za december je januar\r\n newFilterValues.mesec = 1;\r\n newFilterValues.leto = newFilterValues.leto + 1;\r\n }\r\n else if (newFilterValues.mesec == 0) {\r\n // pred januarjem je december\r\n newFilterValues.mesec = 12;\r\n newFilterValues.leto = newFilterValues.leto - 1;\r\n }\r\n\r\n // poiscemo se naziv meseca\r\n newFilterValues.mesecNaziv = this.getMonthName(newFilterValues.mesec);\r\n\r\n // zapisemo novo vrednost v filter leto\r\n this.setObdobjeFilterValues(newFilterValues);\r\n\r\n // osvezimo obdobje element z novimi podatki\r\n this.setObdobjeDataAttributes(this._obdobjeId, newFilterValues);\r\n\r\n // osvezimo tabelo podatkov vseh zaposlenih\r\n this.refreshAllEmployeesTable(newFilterValues.leto, newFilterValues.mesec);\r\n }\r\n\r\n getMonthName(month: number): string {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesAnalysisView.getMonthName\");\r\n\r\n let mesecElement = $(\"div.popover.show\").find(this._obdobjeFilterMesecId);\r\n if (mesecElement.length) {\r\n return $(mesecElement).find(\" option[value = '\" + month + \"']\").text();\r\n }\r\n\r\n return \"\";\r\n }\r\n\r\n enableDisableObdobjeFilters(disable: boolean): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesAnalysisView.enableDisableObdobjeFilters\");\r\n\r\n // leto\r\n let letoElement = $(\"div.popover.show\").find(this._obdobjeFilterLetoId);\r\n if (letoElement.length) {\r\n letoElement.prop(\"disabled\", disable);\r\n }\r\n\r\n // mesec\r\n let mesecElement = $(\"div.popover.show\").find(this._obdobjeFilterMesecId);\r\n if (mesecElement.length) {\r\n mesecElement.prop(\"disabled\", disable);\r\n } \r\n\r\n // gumb trenutni\r\n let _obdobjeCurrentBtnElement = $(\"div.popover.show\").find(this._obdobjeCurrentBtnId);\r\n if (_obdobjeCurrentBtnElement.length) {\r\n _obdobjeCurrentBtnElement.prop(\"disabled\", disable);\r\n } \r\n }\r\n\r\n setObdobjeFilterValues(filterValues: ObdobjefilterValues): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesAnalysisView.setObdobjeFilterValues\");\r\n\r\n let oldfilterValues = this.getObdobjefilterValues();\r\n\r\n // leto\r\n if (oldfilterValues.leto != filterValues.leto) {\r\n let letoElement = $(\"div.popover.show\").find(this._obdobjeFilterLetoId);\r\n if (letoElement.length) {\r\n letoElement.val(filterValues.leto);\r\n }\r\n }\r\n\r\n // mesec\r\n if (oldfilterValues.mesec != filterValues.mesec) {\r\n let mesecElement = $(\"div.popover.show\").find(this._obdobjeFilterMesecId);\r\n if (mesecElement.length) {\r\n mesecElement.val(filterValues.mesec.toString());\r\n } \r\n } \r\n }\r\n\r\n // vrednosti v filtru leto, mesec so se spremenile\r\n obdobjefiltersChanged(): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesAnalysisView.obdobjefiltersChanged\");\r\n\r\n // preberemo vrednosti leto in mesec\r\n let filterValues = this.getObdobjefilterValues();\r\n\r\n // osvezimo obdobje element z novimi podatki\r\n this.setObdobjeDataAttributes(this._obdobjeId, filterValues);\r\n\r\n this.refreshAllEmployeesTable(filterValues.leto, filterValues.mesec);\r\n }\r\n\r\n getObdobjefilterValues(): ObdobjefilterValues {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesAnalysisView.getObdobjefilterValues\");\r\n\r\n let filterValues = new ObdobjefilterValues();\r\n filterValues.leto = null;\r\n filterValues.mesec = null;\r\n filterValues.mesecNaziv = \"\";\r\n\r\n // dolocimo leto\r\n let letoElement = $(\"div.popover.show\").find(this._obdobjeFilterLetoId);\r\n if (letoElement.length) {\r\n let letoStr = String(letoElement.val());\r\n if (letoStr.length == 4 || letoStr.length == 0) {\r\n if (letoStr.length == 4) {\r\n filterValues.leto = +letoStr;\r\n }\r\n }\r\n }\r\n \r\n // dolocimo mesec\r\n let mesecElement = $(\"div.popover.show\").find(this._obdobjeFilterMesecId);\r\n if (mesecElement.length) {\r\n let selMesecNaziv = $(mesecElement).find(\":selected\").text();\r\n let selMesec = $(mesecElement).find(\":selected\").val();\r\n\r\n if (!isNaN(+selMesec)) {\r\n filterValues.mesec = +selMesec\r\n filterValues.mesecNaziv = selMesecNaziv\r\n }\r\n }\r\n\r\n return filterValues;\r\n }\r\n\r\n refreshAllEmployeesTable(leto: number, mesec: number): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesAnalysisView.refreshAllEmployeesTable\");\r\n\r\n let _this = this;\r\n let saopServicesCore = new SaopServicesCore();\r\n let params = { leto: leto, mesec: mesec };\r\n this._refreshingAllEmployeesTable = true;\r\n\r\n this.enableDisableObdobjeFilters(this._refreshingAllEmployeesTable);\r\n\r\n saopServicesCore.afterDone = function (response) {\r\n $(_this._tableDivId).html(response);\r\n\r\n let current_month = new Date();\r\n var previous_month = new Date(new Date(current_month).setMonth(current_month.getMonth() - 1));\r\n\r\n if (current_month.getFullYear() == leto && current_month.getMonth() + 1 == mesec) {\r\n $('.d-current-month').removeClass('d-none');\r\n $('.d-current-month').removeClass('element-hidden');\r\n } else {\r\n $('.d-current-month').addClass('d-none');\r\n $('.d-current-month').addClass('element-hidden');\r\n if (previous_month.getFullYear() == leto && previous_month.getMonth() + 1 == mesec) {\r\n $('.d-previous-month').removeClass('d-none');\r\n $('.d-previous-month').removeClass('element-hidden');\r\n } else {\r\n $('.d-previous-month').addClass('d-none');\r\n $('.d-previous-month').addClass('element-hidden');\r\n }\r\n }\r\n\r\n _this.initWebGrid1(); \r\n\r\n _this._refreshingAllEmployeesTable = false;\r\n _this.enableDisableObdobjeFilters(_this._refreshingAllEmployeesTable);\r\n\r\n // izvedemo se filter vrstic tabele glede oznacenih zaposlenih\r\n let izbraniZaposleni = (_this._selectOrgFilter._selectZaposleni.selectedCB.val());\r\n _this._selectOrgFilter._selectZaposleni.setSelectValues(izbraniZaposleni);\r\n\r\n // refresh options of selectDogodek html control\r\n _this.refreshSelectDogodekOptions();\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"REGAttendanceAllEmployeesAnalysis/GetAllEmployeesAnalysisTable\"\r\n , data: params\r\n , type: \"GET\"\r\n , spinnerDivId: \"#attendanceAllEmployeesAnalysisLoading\"\r\n }); \r\n\r\n }\r\n\r\n afterRefreshTodayData(): void {\r\n global.ConsoleLogDegug(\"afterRefreshTodayData\");\r\n }\r\n\r\n public setTableHeight(): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesAnalysisView.setTableHeight\");\r\n\r\n let _height = $('#grid-toolbar-processed').height();\r\n let remaining_height = window.innerHeight - _height - 245;\r\n $('#attendanceAllEmployeesTable_wrapper').height(remaining_height); \r\n }\r\n\r\n public setEventBindings(): void{\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesAnalysisView.setEventBindings\");\r\n\r\n let _this = this;\r\n\r\n _this.setTableHeight();\r\n window.onresize = function () {\r\n _this.setTableHeight();\r\n };\r\n\r\n }\r\n\r\n\r\n private refreshSelectDogodekOptions(): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesAnalysisView.refreshSelectDogodekOptions\");\r\n\r\n let options: SelectOption[] = [];\r\n\r\n // preberemo options iz hiddent select kontrole\r\n $(this._selectDogodekHiddenId + \" option\").each(function () {\r\n options.push({ value: $(this).val().toString(), text: $(this).text() });\r\n });\r\n\r\n this._selectDogodek.refreshHtmlOptions(options, true);\r\n }\r\n\r\n private filterEventColumns(element: any): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesAnalysisView.filterEventColumns\");\r\n\r\n let _this = this;\r\n let izbraneSifreDogodkov = (element.val().toString());\r\n let izbraneSifreDogodkovArray = izbraneSifreDogodkov.split(\",\");\r\n \r\n // event stolpci-headerji\r\n $(this._tableId + \" thead tr th.saop-table-col-event\").each(function (index, tableCellElement) {\r\n _this.showHideTableEventCell(tableCellElement, izbraneSifreDogodkovArray);\r\n });\r\n\r\n // event stolpci-podatki\r\n $(this._tableId + \" tbody td.saop-table-col-event\").each(function (index, tableCellElement) {\r\n _this.showHideTableEventCell(tableCellElement, izbraneSifreDogodkovArray);\r\n });\r\n }\r\n\r\n private showHideTableEventCell(element: HTMLElement, sifreDogodkovArray: string[]): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesAnalysisView.filterEventColumns\");\r\n\r\n let showTableCellElement = false;\r\n let $tableCellElement = $(element);\r\n\r\n for (var i = 0; i < sifreDogodkovArray.length; i++) {\r\n if ($tableCellElement.hasClass(\"saop-table-col-event-\" + sifreDogodkovArray[i].toLowerCase())) {\r\n showTableCellElement = true;\r\n }\r\n }\r\n\r\n if (showTableCellElement) {\r\n $tableCellElement.removeClass(\"element-hidden\");\r\n }\r\n else {\r\n $tableCellElement.addClass(\"element-hidden\");\r\n }\r\n }\r\n\r\n public exportCsv() {\r\n let saopExport = new SaopExport();\r\n\r\n saopExport.exportTableData2Csv(this._tableId, this.translationService.translate(\"Zbirnik ur zaposlenih\")+\".csv\");\r\n }\r\n\r\n public filterZaposleniTableRows() {\r\n // Declare variables\r\n var table, tr, _rowId, i, txtValue;\r\n table = document.getElementById(\"attendanceAllEmployeesAnalysisTable\");\r\n tr = table.getElementsByTagName(\"tr\");\r\n\r\n //skupine - zaposleni za prikaz\r\n let multiselectZaposleni = this._selectOrgFilter._selectZaposleni.selectedCB;\r\n let filterZaposleni = (multiselectZaposleni.val().toString());\r\n\r\n //dodatni pogoji\r\n let prikaziTedenskaPrekoracitev = false;\r\n let prikaziMesecnaPrekoracitev = false; \r\n if (this._selectPrikazPodatki) {\r\n let element = this._selectPrikazPodatki.selectedCB;\r\n\r\n // preberemo, katere sifre zaposlenih sodijo v izbrane skupine\r\n let izbraniDodatniPogoji = (element.val().toString());\r\n\r\n prikaziTedenskaPrekoracitev = (izbraniDodatniPogoji.toUpperCase().indexOf(\"TED\") > -1) ? true : false;\r\n prikaziMesecnaPrekoracitev = (izbraniDodatniPogoji.toUpperCase().indexOf(\"MES\") > -1) ? true : false;\r\n }\r\n\r\n\r\n // Loop through all table rows, and hide those who don't match the search query\r\n for (i = 0; i < tr.length; i++) {\r\n _rowId = null;\r\n let _trId = $(tr[i]).attr(\"data-sifra-zaposleni\");\r\n if (!isUnDefined(_trId)) {\r\n _rowId = _trId.toString()\r\n }\r\n\r\n if (_rowId) {\r\n txtValue = _rowId.toUpperCase();\r\n if (isEmpty(filterZaposleni)) {\r\n $(tr[i]).addClass(\"element-hidden\");\r\n }\r\n else if (filterZaposleni.toUpperCase().indexOf(txtValue) > -1) {\r\n let row = $(tr[i]);\r\n row.removeClass(\"element-hidden\");\r\n\r\n //dodatni pogoji\r\n if (prikaziTedenskaPrekoracitev || prikaziMesecnaPrekoracitev) {\r\n row.addClass(\"element-hidden\");\r\n if (prikaziTedenskaPrekoracitev && row.hasClass(\"tedenskiPodatki-nadure-error\")) {\r\n row.removeClass(\"element-hidden\");\r\n }\r\n if (prikaziMesecnaPrekoracitev && row.hasClass(\"mesecniPodatki-nadure-error\")) {\r\n row.removeClass(\"element-hidden\");\r\n }\r\n }\r\n } else {\r\n $(tr[i]).addClass(\"element-hidden\");\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n\r\n","import { global, isEmpty, isUnDefined } from \"../Common/saop-common\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { SaopWebGrid, SaopWebGridProperties, SaopWebDataTable } from \"../Components/saop-grid\";\r\nimport { SaopWebGridUnitOrgFilter } from \"../Components/saop-grid-filter-UnitOrg\";\r\nimport { SaopSelectMonthYear } from \"../Components/saop-select-month-year\";\r\nimport { SaopRegAttendanceAllEmployeesExcessHoursView } from \"../REG/saop-regAttendanceAllEmployeesExcessHours-view\";\r\nimport { SaopWfAction } from \"../Core/saop-view-form\";\r\n\r\nenum ExcessHoursActionType {\r\n ConfirmMultiple = 0\r\n , DeleteMultiple = 1\r\n , PayoutMultiple = 2\r\n , UnlockMultiple = 3\r\n , ConcludeMultiple = 4\r\n}\r\n\r\nexport class SaopRegAttendanceAllEmployeesExcessHoursGrid {\r\n public _libName: string;\r\n\r\n private _webgrid: SaopWebGrid;\r\n\r\n //filtri tabela\r\n private _selectOrgFilter: SaopWebGridUnitOrgFilter;\r\n public _saopSelectMonthYearFilter: SaopSelectMonthYear;\r\n\r\n //edit forma\r\n private regAttendanceAllEmployeesExcessHoursView: SaopRegAttendanceAllEmployeesExcessHoursView;\r\n\r\n private _tableId: string;\r\n private _refreshingAllEmployeesTable: boolean;\r\n private _tableDivId: string;\r\n\r\n constructor(libName: string = \"\") {\r\n this._libName = libName;\r\n this._refreshingAllEmployeesTable = false;\r\n this._tableDivId = \"#attendanceAllEmployeesExcessHoursTableDiv\";\r\n this._tableId = \"tableREGAllEmployeesExcessHours\";\r\n\r\n this._selectOrgFilter = new SaopWebGridUnitOrgFilter(libName, \"\");\r\n this._selectOrgFilter = new SaopWebGridUnitOrgFilter(libName, \"\");\r\n this._selectOrgFilter.filterZaposleniTableRows = this.filterZaposleniTableRows.bind(this);\r\n\r\n this._saopSelectMonthYearFilter = new SaopSelectMonthYear(\"\", \"#selectMesecLeto\", this._libName + \"._saopSelectMonthYear\");\r\n this._saopSelectMonthYearFilter.afterMonthYearValuesChanged = this.afterSaopMonthYearValuesChanged.bind(this);\r\n }\r\n\r\n editRecord(year: number, month: number, employeeId: string, employeeName: string): void {\r\n this.regAttendanceAllEmployeesExcessHoursView.fullTitle = this.regAttendanceAllEmployeesExcessHoursView.translationService.translate(\"Obdelava viška ur: \") + \" \" + employeeId + \" - \" + employeeName;\r\n this.regAttendanceAllEmployeesExcessHoursView.showViewForm(SaopWfAction.wfaEditRecord, { leto: year, mesec: month, sifraZaposleni: employeeId });\r\n };\r\n\r\n onInitView(): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesExcessHoursGrid.onInitView\");\r\n\r\n this.regAttendanceAllEmployeesExcessHoursView = new SaopRegAttendanceAllEmployeesExcessHoursView(\"#regAttendanceAllEmployeesExcessHoursView001\", this._libName + \".regAttendanceAllEmployeesExcessHoursView\");\r\n this.regAttendanceAllEmployeesExcessHoursView.refreshData = this.refreshAllEmployeesTable.bind(this);\r\n\r\n this.refreshAllEmployeesForm();\r\n\r\n this.setMultipleConfirmDenyButtonsEnableDisable();\r\n }\r\n\r\n initFilterControls(): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesExcessHoursGrid.initFilterControls\");\r\n\r\n this.setEventBindings();\r\n\r\n this._selectOrgFilter.initFilterControls();\r\n\r\n this._saopSelectMonthYearFilter.init();\r\n }\r\n\r\n initWebGrid1() {\r\n let _this = this;\r\n\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesExcessHoursGrid.initWebGrid1\");\r\n let wgId = \"#\" + this._tableId;\r\n\r\n this._webgrid = new SaopWebGrid(this._libName + \".webGrid1\");\r\n let gridProperties: SaopWebGridProperties;\r\n\r\n let dataTable: SaopWebDataTable;\r\n\r\n dataTable = {\r\n enabled: true\r\n , columnDefsSettings: [\r\n {\r\n targets: 0\r\n , checkboxes: { selectRow: true }\r\n , render: function (data, type, row, meta) {\r\n var table, tr;\r\n table = document.getElementById(\"tableREGAllEmployeesExcessHours\");\r\n tr = table.getElementsByTagName(\"tr\");\r\n\r\n data = ''\r\n let hidden = $(tr[meta.row + 1]).hasClass(\"element-hidden\");\r\n if (row[8].toLowerCase() === 'true') {\r\n data = '
    ';\r\n }\r\n if (hidden) {\r\n data = '';\r\n }\r\n return data;\r\n }\r\n },\r\n {\r\n targets: 8,\r\n visible: false\r\n }\r\n ]\r\n , order: [[1, 'asc']]\r\n }\r\n\r\n gridProperties = {\r\n gridId: wgId\r\n , togglePanel: { enabled: false }\r\n , dataTable: dataTable\r\n };\r\n\r\n this._webgrid.init(gridProperties);\r\n\r\n\r\n let _toolBar = $(\"#grid-toolbar-processed\");\r\n\r\n let _btnConfirmMultiple = _toolBar.find(\"#btnConfirmMultiple\");\r\n _btnConfirmMultiple.off(\"click\");\r\n _btnConfirmMultiple.on('click', function (row) {\r\n _this.MultipleRecordActionClick(ExcessHoursActionType.ConfirmMultiple);\r\n this.blur();\r\n });\r\n let _btnDeleteMultiple = _toolBar.find(\"#btnDeleteMultiple\");\r\n _btnDeleteMultiple.off(\"click\");\r\n _btnDeleteMultiple.on('click', function (row) {\r\n _this.MultipleRecordActionClick(ExcessHoursActionType.DeleteMultiple);\r\n this.blur();\r\n });\r\n let _btnPayoutMultiple = _toolBar.find(\"#btnPayoutMultiple\");\r\n _btnPayoutMultiple.off(\"click\");\r\n _btnPayoutMultiple.on('click', function (row) {\r\n _this.MultipleRecordActionClick(ExcessHoursActionType.PayoutMultiple);\r\n this.blur();\r\n });\r\n let _btnUnlockMultiple = _toolBar.find(\"#btnUnlockMultiple\");\r\n _btnUnlockMultiple.off(\"click\");\r\n _btnUnlockMultiple.on('click', function (row) {\r\n _this.MultipleRecordActionClick(ExcessHoursActionType.UnlockMultiple);\r\n this.blur();\r\n });\r\n let _btnConcludeMultiple = _toolBar.find(\"#btnConcludeMultiple\");\r\n _btnConcludeMultiple.off(\"click\");\r\n _btnConcludeMultiple.on('click', function (row) {\r\n _this.MultipleRecordActionClick(ExcessHoursActionType.ConcludeMultiple);\r\n this.blur();\r\n });\r\n\r\n\r\n $(\"body\").off(\"change\", \"#tableREGAllEmployeesExcessHours tr th.dt-checkboxes-select-all input[type='checkbox']\");\r\n $(\"body\").on(\"change\", \"#tableREGAllEmployeesExcessHours tr th.dt-checkboxes-select-all input[type='checkbox']\", function () {\r\n //_this.onClickUnselectHidden();\r\n _this.setMultipleConfirmDenyButtonsEnableDisable();\r\n });\r\n\r\n $(\"body\").off(\"change\", \"#tableREGAllEmployeesExcessHours tr td.dt-checkboxes-cell input[type='checkbox'].dt-checkboxes\");\r\n $(\"body\").on(\"change\", \"#tableREGAllEmployeesExcessHours tr td.dt-checkboxes-cell input[type='checkbox'].dt-checkboxes\", function () {\r\n _this.setMultipleConfirmDenyButtonsEnableDisable();\r\n });\r\n\r\n $(\".AllEmployeesExcessHours_edit\").off(\"click\");\r\n $(\".AllEmployeesExcessHours_edit\").on('click', function (row) {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesExcessHoursGrid.AllEmployeesExcessHours_edit.click\");\r\n let _btnEdit = row.currentTarget;\r\n let btnEnabled = _btnEdit.getAttribute(\"data-enabled\")!;\r\n if (btnEnabled) {\r\n let year = _btnEdit.getAttribute(\"data-year\")!;\r\n let month = _btnEdit.getAttribute(\"data-month\")!;\r\n let employeeId = _btnEdit.getAttribute(\"data-employee-id\")!;\r\n let employeeName = _btnEdit.getAttribute(\"data-employee-name\")!;\r\n\r\n _this.editRecord(Number(year), Number(month), employeeId, employeeName);\r\n }\r\n }); \r\n\r\n $(\"#attendanceAllEmployeesAnalysisTableRows>tr>td\").off(\"click\");\r\n $(\"#attendanceAllEmployeesAnalysisTableRows>tr>td\").on('click', function (row) {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesExcessHoursGrid.AllEmployeesExcessHours_edit.click\");\r\n let _btnEdit = row.currentTarget;\r\n var btnEnabled = (_btnEdit.parentElement.getAttribute(\"data-enabled\").toString().toLowerCase() == \"true\") && !_btnEdit.classList.contains(\"dt-checkboxes-cell\");\r\n if (btnEnabled) {\r\n let year = _btnEdit.parentElement.getAttribute(\"data-year\");\r\n let month = _btnEdit.parentElement.getAttribute(\"data-month\");\r\n let employeeId = _btnEdit.parentElement.getAttribute(\"data-employee-id\");\r\n let employeeName = _btnEdit.parentElement.getAttribute(\"data-employee-name\");\r\n _this.editRecord(Number(year), Number(month), employeeId, employeeName);\r\n }\r\n }); \r\n }\r\n\r\n MultipleRecordActionClick(type: ExcessHoursActionType): void {\r\n let _this = this;\r\n\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesExcessHoursGrid.MultipleRecordActionClick\");\r\n\r\n var rows = this._webgrid.dataTable.column(0).data().toArray();\r\n\r\n rows.forEach(function (_el) {\r\n var _row = _this._webgrid.dataTable.row(Number(_el)).node() as Element; \r\n var checked = $($(_row).find('input[type=\"checkbox\"]')[0]).prop('checked');\r\n if (typeof _row !== 'undefined' && checked == true) {\r\n var year = _row.getAttribute(\"data-year\");\r\n var month = _row.getAttribute(\"data-month\");\r\n var employeeId = _row.getAttribute(\"data-employee-id\");\r\n var fingerprint = _row.getAttribute(\"data-fingerprint\");\r\n console.log(year, month, employeeId, type);\r\n _this.confirmRecord(year, month, employeeId, fingerprint, type);\r\n }\r\n });\r\n }\r\n\r\n confirmRecord(year: string, month: string, employeeId: string, fingerprint: string, type: ExcessHoursActionType): void {\r\n let _this = this;\r\n\r\n let _data = { leto: year, mesec: month, sifraZaposleni: employeeId };\r\n\r\n let _urlAction = \"\";\r\n switch (type) {\r\n case ExcessHoursActionType.ConfirmMultiple:\r\n _urlAction = \"REGAttendanceAllEmployeesExcessHours/ConfirmMultiple\";\r\n break;\r\n case ExcessHoursActionType.DeleteMultiple:\r\n _urlAction = \"REGAttendanceAllEmployeesExcessHours/DeleteMultiple\";\r\n break;\r\n case ExcessHoursActionType.PayoutMultiple:\r\n _urlAction = \"REGAttendanceAllEmployeesExcessHours/PayoutMultiple\";\r\n break;\r\n case ExcessHoursActionType.UnlockMultiple:\r\n _urlAction = \"REGAttendanceAllEmployeesExcessHours/UnlockMultiple\";\r\n break;\r\n case ExcessHoursActionType.ConcludeMultiple:\r\n _urlAction = \"REGAttendanceAllEmployeesExcessHours/ConcludeMultiple\";\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesExcessHoursGrid.\" + _urlAction.split(\"/\")[1]);\r\n \r\n let _saopServicesCore = new SaopServicesCore();\r\n this._refreshingAllEmployeesTable = true;\r\n _saopServicesCore.afterDone = function (response) {\r\n $(_this._tableDivId).html(response);\r\n\r\n _this.initWebGrid1();\r\n\r\n _this._refreshingAllEmployeesTable = false;\r\n\r\n let izbraniZaposleni = (_this._selectOrgFilter._selectZaposleni.selectedCB.val());\r\n _this._selectOrgFilter._selectZaposleni.setSelectValues(izbraniZaposleni);\r\n _this._saopSelectMonthYearFilter.setRefreshingRecordsComplete();\r\n _this.setMultipleConfirmDenyButtonsEnableDisable();\r\n };\r\n _saopServicesCore.ExecuteAction({\r\n action: _urlAction\r\n , data: _data\r\n , type: \"POST\"\r\n , spinnerDivId: \"#attendanceAllEmployeesExcessHoursLoading\"\r\n });\r\n }\r\n\r\n\r\n refreshAllEmployeesTable(): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesExcessHoursGrid.refreshAllEmployeesTable\");\r\n \r\n let _this = this;\r\n let saopServicesCore = new SaopServicesCore();\r\n\r\n let filter_values = this._saopSelectMonthYearFilter.getSelectedMonthYear();\r\n let params = { leto: filter_values.leto, mesec: filter_values.mesec };\r\n this._refreshingAllEmployeesTable = true;\r\n\r\n saopServicesCore.afterDone = function (response) {\r\n $(_this._tableDivId).html(response);\r\n\r\n _this.initWebGrid1();\r\n\r\n _this._refreshingAllEmployeesTable = false;\r\n //_this.enableDisableObdobjeFilters(_this._refreshingAllEmployeesTable);\r\n\r\n // izvedemo se filter vrstic tabele glede oznacenih zaposlenih\r\n let izbraniZaposleni = (_this._selectOrgFilter._selectZaposleni.selectedCB.val());\r\n _this._selectOrgFilter._selectZaposleni.setSelectValues(izbraniZaposleni);\r\n _this._saopSelectMonthYearFilter.setRefreshingRecordsComplete();\r\n _this.setMultipleConfirmDenyButtonsEnableDisable();\r\n _this.setEventBindings();\r\n\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"REGAttendanceAllEmployeesExcessHours/GetAllEmployeesExcessHoursTable\"\r\n , data: params\r\n , type: \"GET\"\r\n , spinnerDivId: \"#attendanceAllEmployeesExcessHoursLoading\"\r\n }); \r\n }\r\n\r\n refreshAllEmployeesForm(params: any = null): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesExcessHoursGrid.refreshAllEmployeesForm\");\r\n\r\n let _this = this;\r\n let saopServicesCore = new SaopServicesCore();\r\n\r\n saopServicesCore.afterDone = function (response) {\r\n $(\"#attendanceAllEmployeesExcessHoursForm\").html(response);\r\n _this.initFilterControls();\r\n _this.bindGridEvents();\r\n _this.setEventBindings();\r\n\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"REGAttendanceAllEmployeesExcessHours/GetAllEmployeesExcessHoursForm\"\r\n , data: params\r\n , type: \"GET\"\r\n , spinnerDivId: \"#attendanceAllEmployeesExcessHoursLoading\"\r\n }); \r\n }\r\n\r\n bindGridEvents(): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesExcessHoursGrid.bindGridEvents\");\r\n\r\n this.initWebGrid1();\r\n }\r\n\r\n filterZaposleniTableRows(filterZaposleni: string) {\r\n //filtriranje glede na organizacijsko enoto in zaposlenega\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesExcessHoursGrid.filterZaposleniTableRows\");\r\n\r\n // Declare variables\r\n var table, tr, _rowId, i, txtValue;\r\n table = document.getElementById(this._tableId);\r\n tr = table.getElementsByTagName(\"tr\");\r\n // Loop through all table rows, and hide those who don't match the search query\r\n for (i = 0; i < tr.length; i++) {\r\n _rowId = null;\r\n let _trId = $(tr[i]).attr(\"data-employee-id\");\r\n if (!isUnDefined(_trId)) { \r\n _rowId = _trId.toString()\r\n }\r\n\r\n if (_rowId) {\r\n txtValue = _rowId.toUpperCase();\r\n let checkbox = $(tr[i])[0].children[0];\r\n let defined = checkbox.children.length == 1 && checkbox.children[0].localName == 'input';\r\n if (isEmpty(filterZaposleni)) {\r\n $(tr[i]).addClass(\"element-hidden\");\r\n if (defined) $(tr[i])[0].children[0].innerHTML = '';\r\n } else if (filterZaposleni.toUpperCase().indexOf(txtValue) > -1) {\r\n if (defined && $(tr[i]).hasClass(\"element-hidden\")) {\r\n $(tr[i])[0].children[0].innerHTML = '';\r\n }\r\n $(tr[i]).removeClass(\"element-hidden\");\r\n } else {\r\n $(tr[i]).addClass(\"element-hidden\");\r\n if (defined) $(tr[i])[0].children[0].innerHTML = '';\r\n }\r\n }\r\n }\r\n }\r\n\r\n public afterSaopMonthYearValuesChanged(leto: number, mesec: number): void {\r\n //pomikanje po mesecih, naprej nazaj, sprememba meseca....\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesExcessHoursGrid.afterSaopMonthYearValuesChanged\");\r\n\r\n this.refreshAllEmployeesTable();\r\n }\r\n\r\n setMultipleConfirmDenyButtonsEnableDisable(): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesExcessHoursGrid.setMultipleConfirmDenyButtonsEnableDisable\");\r\n\r\n let _toolBar = $(\"#grid-toolbar-processed\");\r\n\r\n let _btnConfirmMultiple = _toolBar.find(\"#btnConfirmMultiple\");\r\n _btnConfirmMultiple.prop('disabled', true);\r\n let _btnDeleteMultiple = _toolBar.find(\"#btnDeleteMultiple\");\r\n _btnDeleteMultiple.prop('disabled', true);\r\n let _btnPayoutMultiple = _toolBar.find(\"#btnPayoutMultiple\");\r\n _btnPayoutMultiple.prop('disabled', true);\r\n let _btnUnlockMultiple = _toolBar.find(\"#btnUnlockMultiple\");\r\n _btnUnlockMultiple.prop('disabled', true);\r\n let _btnConcludeMultiple = _toolBar.find(\"#btnConcludeMultiple\");\r\n _btnConcludeMultiple.prop('disabled', true);\r\n\r\n $(\"#tableREGAllEmployeesExcessHours tr td.dt-checkboxes-cell input[type='checkbox'].dt-checkboxes\").each(function () {\r\n let checked = $(this).is(\":checked\");\r\n if (checked)\r\n {\r\n _btnConfirmMultiple.prop('disabled', false);\r\n _btnDeleteMultiple.prop('disabled', false);\r\n _btnPayoutMultiple.prop('disabled', false);\r\n _btnUnlockMultiple.prop('disabled', false);\r\n _btnConcludeMultiple.prop('disabled', false);\r\n }\r\n });\r\n }\r\n \r\n public setEventBindings(): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesExcessHoursGrid.setEventBindings\");\r\n\r\n let _this = this;\r\n\r\n _this.setTableHeight();\r\n window.onresize = function () {\r\n _this.setTableHeight();\r\n };\r\n\r\n }\r\n\r\n public setTableHeight(): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesExcessHoursGrid.setTableHeight\");\r\n\r\n let _height = $('#grid-toolbar-processed').height();\r\n let remaining_height = window.innerHeight - _height - 245;\r\n $('#tableREGAllEmployeesExcessHours_wrapper').height(remaining_height);\r\n }\r\n}\r\n\r\n","import { SaopViewForm } from \"../Core/saop-view-form\";\r\nimport { global } from \"../Common/saop-common\";\r\n\r\n\r\nexport class SaopRegAttendanceAllEmployeesExcessHoursView extends SaopViewForm {\r\n private _formId: string;\r\n constructor(viewId: string, libName: string = \"\") {\r\n super(viewId, libName);\r\n\r\n this.addRecordEndpoint = \"\";\r\n this.editRecordEndpoint = \"REGAttendanceAllEmployeesExcessHours/EditAllEmployeesExcessHours\";\r\n this.deleteRecordEndpoint = \"\"; \r\n\r\n }\r\n}\r\n\r\n\r\n","/// \r\nimport { global } from \"../Common/saop-common\";\r\nimport { SaopViewFormBindings } from \"../Core/saop-view-form-bindings\";\r\nimport { SaopWfSubmitResult } from \"../core/saop-view-form\";\r\n\r\n\r\nexport class SaopRegCurrentEventView extends SaopViewFormBindings {\r\n\r\n constructor(viewId: string, libName: string = \"\") {\r\n super(viewId, libName);\r\n }\r\n\r\n onSubmitSuccess(data: SaopWfSubmitResult): void {\r\n global.ConsoleLogDegug(\"SaopRegCurrentEventView.onAddDataSuccess\");\r\n if (data.success) {\r\n alertify.message(data.alertMessage);\r\n }\r\n else{\r\n alertify.error(data.alertMessage);\r\n }\r\n this.afterSubmitSuccess(data);\r\n }\r\n\r\n public afterSubmitSuccess(result: SaopWfSubmitResult): void {\r\n global.ConsoleLogDegug(\"SaopRegCurrentEventView.afterExecuteSuccess\");\r\n } \r\n\r\n //\r\n}\r\n\r\n\r\n","/// \r\nimport { global, isEmpty } from \"../Common/saop-common\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport * as moment from '../../node_modules/moment/moment';\r\nimport { SaopRegUraDogodekView } from \"./saop-regUraDogodek-view\";\r\nimport { SaopRegCurrentEventView } from './saop-regCurrentEvent-view'\r\n\r\nexport class SaopRegTodayEventsView extends SaopRegUraDogodekView {\r\n public regCurrentEventView:SaopRegCurrentEventView;\r\n //\r\n private _saopServicesCore :SaopServicesCore;\r\n\r\n constructor(viewId:string,libName:string = \"\") {\r\n super(viewId,libName);\r\n this._saopServicesCore = new SaopServicesCore();\r\n //\r\n this.refreshData = this.refreshListData.bind(this);\r\n //\r\n this.regCurrentEventView = new SaopRegCurrentEventView(\"#regAcctionButtonsView\",libName+\".regCurrentEventView\");\r\n this.regCurrentEventView.afterSubmitSuccess = this.refreshListData.bind(this); \r\n }\r\n\r\n initView(): void {\r\n global.ConsoleLogDegug(\"initView\");\r\n this.initClock();\r\n this.onReadyInitRegUraDogodekView();\r\n this.onReadyInitDogodkiDanasnjiPartialView(); \r\n }\r\n\r\n bindGridEvents(){\r\n global.ConsoleLogDegug(\"bindGridEvents\");\r\n let _this = this;\r\n //\r\n $(\"#regUraDogodekAddRecord\").off(\"click\");\r\n $(\"#regUraDogodekAddRecord\").on('click', function(row){\r\n global.ConsoleLogDegug(\"regUraDogodekAddRecord.click\");\r\n let currentDate = moment(new Date()).format(\"DD.MM.YYYY\")\r\n _this.addRecord({ SelectedDay:currentDate});\r\n }); \r\n //\r\n $(\".regDogodkiDanasnjiTable_edit\").off(\"click\");\r\n $(\".regDogodkiDanasnjiTable_edit\").on('click', function(row){\r\n global.ConsoleLogDegug(\"regDogodkiDanasnjiTable_edit.click\");\r\n let _btnEdit = row.currentTarget;\r\n let btnEnabled = _btnEdit.getAttribute(\"data-enabled\");\r\n if (btnEnabled.toString().toLowerCase() == \"true\") {\r\n let zacetek = _btnEdit.getAttribute(\"data-zacetek\");\r\n let konec = _btnEdit.getAttribute(\"data-konec\");\r\n _this.editRecord({ idStart: zacetek, idEnd: konec },_this);\r\n } \r\n }); \r\n //\r\n $(\".regDogodkiDanasnjiTable_delete\").off(\"click\");\r\n $(\".regDogodkiDanasnjiTable_delete\").on('click', function(row){\r\n global.ConsoleLogDegug(\"regDogodkiDanasnjiTable_delete.click\");\r\n let _btnDelete = row.currentTarget;\r\n let btnEnabled = _btnDelete.getAttribute(\"data-enabled\");\r\n if (btnEnabled.toString().toLowerCase() == \"true\") {\r\n let zacetek = _btnDelete.getAttribute(\"data-zacetek\");\r\n let konec = _btnDelete.getAttribute(\"data-konec\");\r\n // //\r\n let deleteModalFormTitle = _this.translationService.translate(\"Brisanje\");\r\n let deleteModalFormBody = _this.translationService.translate(\"Ali ste prepričani, da želite izbrisati dogodek?\");\r\n //\r\n _this.deleteRecord(deleteModalFormTitle,deleteModalFormBody,{ idStart: zacetek, idEnd: konec });\r\n }\r\n }); \r\n }\r\n\r\n afterRefreshData():void {\r\n global.ConsoleLogDegug(\"SaopRegTodayEventsView.afterRefreshListData\");\r\n }\r\n\r\n refreshListData(trigger:boolean = true):void {\r\n global.ConsoleLogDegug(\"SaopRegTodayEventsView.refreshView\");\r\n let _this = this;\r\n\r\n this._saopServicesCore.afterDone = function(response){\r\n $(\"#regTodayRecordForm\").html(response);\r\n _this.bindGridEvents();\r\n _this.regCurrentEventView.bindFormAjaxEvents(); \r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"REGTodayEvents/MainFormPartial\" \r\n ,data:null\r\n ,type:\"GET\"\r\n ,spinnerDivId:\"#regTodayRecordLoading\"\r\n }); \r\n\r\n if (trigger && this.afterRefreshData != null){ this.afterRefreshData(); }\r\n }\r\n\r\n onReadyInitRegUraDogodekView(): void {\r\n global.ConsoleLogDegug(\"onReadyInitRegUraDogodekView\");\r\n\r\n let message = ($(\"#OnLoadMessage\").val());\r\n if (message) {\r\n alertify.message(message);\r\n }\r\n\r\n this.refreshListData();\r\n }\r\n\r\n initClock(): void {\r\n global.ConsoleLogDegug(\"onReadyInitDogodkiTekociPartialView\");\r\n\r\n this.updateClock();\r\n this.updateClock1();\r\n this.updateClock2();\r\n\r\n setInterval(this.updateClock, 1000)\r\n setInterval(this.updateClock1, 1000)\r\n setInterval(this.updateClock2, 1000)\r\n }\r\n\r\n updateClock(): void {\r\n let clockElement = $(\"#clock\");\r\n\r\n // trenutni čas\r\n let currentTime = moment();\r\n let currentTime_ms = moment.duration(currentTime.format(\"HH:mm:ss\")).asMilliseconds();\r\n\r\n // trenutni čas kot niz\r\n let currentTimeString = moment.utc(Math.abs(currentTime_ms)).format(\"HH:mm:ss\");\r\n\r\n clockElement.html(currentTimeString);\r\n }\r\n\r\n updateClock1(): void {\r\n let clockElement1 = $(\"#clock1\");\r\n\r\n // trenutni čas\r\n let currentTime = moment();\r\n let currentTime_ms = moment.duration(currentTime.format(\"HH:mm:ss\")).asMilliseconds();\r\n\r\n //saldo vseh zaključenih dogodkov na dnevni ravni (stolpec \"Dnevni saldo\" v \"Mesečni evidenci\")\r\n let saldoUreHHMM = $('#SaldoUreHHMM').val() + \":00\";\r\n let saldoUreHHMM_ms = moment.duration(saldoUreHHMM).asMilliseconds();\r\n\r\n //začetek zadnjega dogodka pred trenutnim časom\r\n let uraZadnjegaDogodka = $('#UraZadnjegaDogodka').val();\r\n\r\n //računanje tekoče dodanega časa\r\n let result_ms = saldoUreHHMM_ms;\r\n if (uraZadnjegaDogodka !== undefined) {\r\n let uraZadnjegaDogodka_ms = moment.duration(uraZadnjegaDogodka.toString()).asMilliseconds();\r\n\r\n if (uraZadnjegaDogodka_ms > 0)\r\n result_ms = result_ms + (currentTime_ms - uraZadnjegaDogodka_ms);\r\n }\r\n\r\n //ms -> formatted string\r\n let isNegative = result_ms < 0;\r\n let formattedDuration = moment.utc(Math.abs(result_ms)).format(\"H:mm\");\r\n\r\n isNegative = isNegative && formattedDuration !== '0:00';\r\n const result = isNegative ? `-${formattedDuration}` : `+${formattedDuration}`;\r\n\r\n clockElement1.html(result);\r\n }\r\n\r\n updateClock2(): void {\r\n let clockElement2 = $(\"#clock2\");\r\n\r\n // trenutni čas\r\n let currentTime = moment();\r\n let currentTime_ms = moment.duration(currentTime.format(\"HH:mm:ss\")).asMilliseconds();\r\n\r\n //saldo vseh zaključenih dogodkov na dnevni ravni (stolpec \"Tekoči saldo\" v \"Mesečni evidenci\")\r\n let saldoUreTekoceHHMM = $('#SaldoUreTekoceHHMM').val() + \":00\";\r\n let saldoUreTekoceHHMM_list = saldoUreTekoceHHMM.split(\":\");\r\n let saldoUreTekoceHHMM_ms = (Math.abs(Number(saldoUreTekoceHHMM_list[0]) * 3600) + Math.abs(Number(saldoUreTekoceHHMM_list[1]) * 60)) * 1000;\r\n saldoUreTekoceHHMM_ms = saldoUreTekoceHHMM_list[0][0] == '-' ? saldoUreTekoceHHMM_ms * (-1) : saldoUreTekoceHHMM_ms;\r\n\r\n //začetek zadnjega dogodka pred trenutnim časom\r\n let uraZadnjegaDogodka = $('#UraZadnjegaDogodka').val();\r\n\r\n //računanje tekoče dodanega časa\r\n let result_ms = saldoUreTekoceHHMM_ms;\r\n if (uraZadnjegaDogodka !== undefined) {\r\n let uraZadnjegaDogodka_ms = moment.duration(uraZadnjegaDogodka.toString()).asMilliseconds();\r\n\r\n if (uraZadnjegaDogodka_ms > 0)\r\n result_ms = result_ms + (currentTime_ms - uraZadnjegaDogodka_ms);\r\n }\r\n\r\n //ms -> formatted string (ne moremo uporabit enake funkcije kot v clock1, ker tudkaj lahko pride do ur večjih od 24)\r\n let isNegative = result_ms < 0;\r\n result_ms = Math.abs(result_ms);\r\n\r\n let hours = Math.floor(result_ms / 3600000);\r\n let minutes = Math.floor((result_ms - hours * 3600000) / 60000);\r\n\r\n let hoursStr = hours;\r\n let minutesStr = (minutes < 10 ? \"0\" : \"\") + minutes;\r\n\r\n let formattedDuration = hoursStr + ':' + minutesStr;\r\n isNegative = isNegative && formattedDuration !== '0:00';\r\n const result = isNegative ? `-${formattedDuration}` : `+${formattedDuration}`;\r\n\r\n clockElement2.html(result);\r\n }\r\n\r\n onReadyInitDogodkiDanasnjiPartialView(): void {\r\n global.ConsoleLogDegug(\"onReadyInitDogodkiDanasnjiPartialView\");\r\n\r\n $(\"#regDogodkiDanasnjiTable tbody tr\").each(\r\n function (i, row) {\r\n // koda zakomentirana, ker ni potrebna.\r\n // Če ni zakomentirana, se pojavijo težave pri refresh view \"Dogodki na dan\", in se polje \"Konec\" obarva rdece zaradi spodnje kode\r\n\r\n //var $actualRow = $(row);\r\n\r\n //if ($actualRow.children('td:nth-child(2)').text() == \"\") {\r\n // $(this).children('td:nth-child(6)').css(\"background-color\", '#FAC0BE');\r\n //} else if ($actualRow.children('td:nth-child(1)').text() == \"\") {\r\n // $(this).children('td:nth-child(5)').css(\"background-color\", '#FAC0BE');\r\n //}\r\n });\r\n\r\n $(\"#webgrid1 th:nth-child(1)\").hide();\r\n $(\"#webgrid1 th:nth-child(2)\").hide();\r\n }\r\n\r\n}\r\n\r\n\r\n","/// \r\nimport { global,isUnDefined, formatDate, setModalFormZIndex, isEmpty } from \"../Common/saop-common\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { SaopWebGrid, SaopWebGridProperties, SaopWebGridToolbar, SaopWebGridToolbarButton, SaopWebDataTable } from \"../Components/saop-grid\";\r\n\r\nexport class SaopRegDetailsTableView {\r\n private _libName: string;\r\n private _tableDivId: string;\r\n private webGrid: SaopWebGrid;\r\n\r\n constructor(libName: string = \"\", tableDivId: string) {\r\n this._libName = libName;\r\n this._tableDivId = tableDivId;\r\n } \r\n\r\n bindGridEvents(): void {\r\n global.ConsoleLogDegug(\"SaopRegDetailsTableView.bindGridEvents\");\r\n let _this = this;\r\n \r\n $(\"body\").off(\"click\", this._tableDivId + \" td.td-action-details\");\r\n $(\"body\").on(\"click\", this._tableDivId + \" td.td-action-details\", function () {\r\n let selectedRow = $(this).closest(\"tr\");\r\n let selectedDay = selectedRow.find(\"td\").eq(2).text()\r\n let actionDetailsColumn = selectedRow.find(\"td\").eq(1);\r\n let datumKey = selectedRow.attr(\"data-datum\");\r\n let sifraZaposleniKey = selectedRow.attr(\"data-sifrazaposleni\");\r\n _this.showHideDetailsSubTable(selectedRow, actionDetailsColumn, selectedDay, datumKey, sifraZaposleniKey);\r\n });\r\n }\r\n\r\n private showHideDetailsSubTable(selectedRow: JQuery, actionDetailsColumn: JQuery, selectedDay: string, datumKey: string, sifraZaposleniKey: string): void {\r\n global.ConsoleLogDegug(\"SaopRegDetailsTableView.showHideDetailsSubTable\");\r\n\r\n let iconElement = actionDetailsColumn.find(\"span\");\r\n\r\n let rowDetailsId = \"#detailRow\" + datumKey;\r\n let rowDetailsIdElement = $(rowDetailsId);\r\n\r\n if (!this.isDetailsSubTableShowed(iconElement)) {\r\n // show details subtable\r\n //preverim, če tabela ze obstaja\r\n let detailRowDivId = \"#detailRowDiv\" + datumKey;\r\n let detailRowTableElement = $(detailRowDivId + \" table\");\r\n if (detailRowTableElement.length == 0) {\r\n // tabele ni, gremo na server po podatke za prikaz\r\n this.getDetailsSubTable(detailRowDivId, selectedDay, sifraZaposleniKey);\r\n }\r\n }\r\n\r\n // prikazi/skrij bottom border\r\n selectedRow.toggleClass(\"saop-table-row-border-bottom-none\")\r\n\r\n // prikazi/skrij details tabelo\r\n rowDetailsIdElement.toggleClass(\"saop-table-row-hidden\");\r\n rowDetailsIdElement.toggleClass(\"saop-table-row-showed\");\r\n\r\n // sprememba ikone\r\n iconElement.toggleClass(\"saop-img-right\");\r\n iconElement.toggleClass(\"saop-img-down\");\r\n }\r\n\r\n private isDetailsSubTableShowed(iconElement: JQuery): boolean {\r\n global.ConsoleLogDegug(\"SaopRegDetailsTableView.isDetailsSubTableShowed\");\r\n\r\n return iconElement.hasClass(\"saop-img-down\");\r\n }\r\n\r\n private getDetailsSubTable(detailRowDivId: string, selectedDay: string, sifraZaposleni: string): void {\r\n global.ConsoleLogDegug(\"SaopRegDetailsTableView.getDetailsSubTable\");\r\n\r\n let _this = this;\r\n let saopServicesCore = new SaopServicesCore();\r\n let params = { SelectedDay: selectedDay, SifraZaposleni: sifraZaposleni };\r\n\r\n saopServicesCore.afterDone = function (response) {\r\n $(detailRowDivId).html(response);\r\n _this.initWebGrid();\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"REGDayEvents/GetRegUraBrowseEventsTable\"\r\n , data: params\r\n , type: \"GET\"\r\n //, spinnerDivId: \"#attendanceAllEmployeesLoading\"\r\n });\r\n }\r\n\r\n private initWebGrid() {\r\n //\r\n this.webGrid = new SaopWebGrid(this._libName);\r\n let gridProperties: SaopWebGridProperties;\r\n\r\n gridProperties = {\r\n gridId: \"#saopWebGridDetails\"\r\n , css: \"table-column-holder-last\"\r\n , toolbar: null\r\n };\r\n //\r\n this.webGrid.init(gridProperties);\r\n }\r\n //\r\n}\r\n\r\n\r\n","/// \r\nimport { global,isUnDefined, formatDate, setModalFormZIndex, isEmpty } from \"../Common/saop-common\";\r\nimport { SaopWfAction } from \"../core/saop-view-form\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { SaopRegUraDogodekView } from \"./saop-regUraDogodek-view\";\r\nimport { SaopRegDetailsTableView } from \"./saop-regUra-details-table-view\";\r\nimport { SaopRegUraDanView } from \"./saop-regUraDan-view\"\r\nimport { SaopSelectMonthYear } from \"../Components/saop-select-month-year\";\r\n\r\nexport class SaopRegView {\r\n private _libName:string;\r\n private _saopRegUraDogodekView1:SaopRegUraDogodekView;\r\n private _periodCheckBoxId: string;\r\n private saopRegDetailsTableView: SaopRegDetailsTableView;\r\n private _saopRegUraDanView:SaopRegUraDanView;\r\n public _saopSelectMonthYear: SaopSelectMonthYear;\r\n\r\n constructor(libName:string = \"\") {\r\n this._libName = libName;\r\n this._saopRegUraDogodekView1 = new SaopRegUraDogodekView(\"#regDogodekView0\",this._libName);\r\n this._saopRegUraDogodekView1.refreshData = this.refreshRegUraBrowseView.bind(this);\r\n //this._saopServicesCore = new SaopServicesCore();\r\n this._periodCheckBoxId = \"#cbperiodCheckBox\";\r\n this.saopRegDetailsTableView = new SaopRegDetailsTableView(this._libName + \".saopRegDetailsTableView\", \"#reg-grid\");\r\n //\r\n this._saopRegUraDanView = new SaopRegUraDanView(\"#regDogodekView0\",this._libName + \"._saopRegUraDanView\");\r\n this._saopRegUraDanView.afterRefreshData = this.afterRefreshRegUraDanView.bind(this);\r\n\r\n this._saopSelectMonthYear = new SaopSelectMonthYear(\"\", \"#selectMesecLeto\", this._libName + \"._saopSelectMonthYear\");\r\n this._saopSelectMonthYear.afterMonthYearValuesChanged = this.afterSaopMonthYearValuesChanged.bind(this);\r\n } \r\n\r\n initView(): void {\r\n global.ConsoleLogDegug(\"initRegUraBrowseView\");\r\n let _this = this;\r\n let _saopServicesCore = new SaopServicesCore();\r\n _saopServicesCore.afterDone = function(response){\r\n $(\"#tabRegBr\").html(response);\r\n _this.initRegUraControls();\r\n _this.refreshButtonsState();\r\n _this.refreshTableData(); \r\n };\r\n _saopServicesCore.ExecuteAction({\r\n action:\"REGMonthEvents/MainFormPartial\"\r\n ,type:\"GET\"\r\n ,spinnerDivId:\"#saopLoadingtabRegBr\"\r\n });\r\n }\r\n\r\n initRegUraControls(): void {\r\n global.ConsoleLogDegug(\"initRegUraControls\");\r\n let _this = this;\r\n\r\n $('#btnAddRecord').click(function () {\r\n global.ConsoleLogDegug(\"btnAddRecord\");\r\n let _today = formatDate(new Date(), \"d.mm.yyyy\");\r\n let _data = { SelectedDay: _today }\r\n\r\n _this._saopRegUraDogodekView1.onErrorCallback = \"\";\r\n _this._saopRegUraDogodekView1.showViewForm(SaopWfAction.wfaAddRecord, _data, null);\r\n });\r\n\r\n $('#btnSendMail').click(function () {\r\n _this.sendSummaryHours();\r\n });\r\n \r\n this._saopSelectMonthYear.init();\r\n }\r\n\r\n sendSummaryHours(): void {\r\n global.ConsoleLogDegug(\"sendSummaryHours\");\r\n let _this = this;\r\n\r\n let selectedMonthYear = this._saopSelectMonthYear.getSelectedMonthYear();\r\n let params = { leto: selectedMonthYear.leto, mesec: selectedMonthYear.mesec };\r\n\r\n let _saopServicesCore = new SaopServicesCore();\r\n _saopServicesCore.afterDone = function(response){\r\n if (response.success) {\r\n alertify.message(response.message);\r\n } else {\r\n $(\"#vsMonthlyRecord\").html(response.viewContent);\r\n }\r\n };\r\n _saopServicesCore.ExecuteAction({\r\n action: \"REGMonthEvents/SummaryHours\"\r\n , data: params\r\n , type: \"GET\"\r\n }); \r\n }\r\n\r\n afterRefreshData():void{\r\n global.ConsoleLogDegug(\"SaopRegView.afterRefreshData\");\r\n }\r\n\r\n refreshRegUraBrowseView(trigger:boolean = true):void{\r\n global.ConsoleLogDegug(\"refreshRegUraBrowseView\");\r\n let _this = this;\r\n\r\n let selectedMonthYear = this._saopSelectMonthYear.getSelectedMonthYear();\r\n let params = { leto: selectedMonthYear.leto, mesec: selectedMonthYear.mesec };\r\n\r\n let _saopServicesCore = new SaopServicesCore();\r\n _saopServicesCore.afterDone = function(response){\r\n $(\"#reg-grid\").html(response);\r\n _this.refreshButtonsState();\r\n _this.refreshTableData(); \r\n _this.refreshCaptions(); \r\n\r\n _this._saopSelectMonthYear.setRefreshingRecordsComplete();\r\n };\r\n _saopServicesCore.ExecuteAction({\r\n action:\"REGMonthEvents/GetRegUraTableView\"\r\n , data: params\r\n , type: \"GET\"\r\n ,spinnerDivId:\"#saopLoadingRegGrid\"\r\n });\r\n\r\n if (trigger && this.afterRefreshData != null){ this.afterRefreshData(); }\r\n }\r\n\r\n refreshCaptions(): void {\r\n global.ConsoleLogDegug(\"refreshCaptions\");\r\n let _captionMonthName = $('#captionMonthName');\r\n if (_captionMonthName.length){\r\n $('#caption').html(_captionMonthName.val().toString());\r\n }\r\n \r\n }\r\n\r\n refreshButtonsState(): void {\r\n global.ConsoleLogDegug(\"refreshButtonsState\");\r\n if (typeof $(\"#btnAddRecordEnabled\").val() === 'undefined') {\r\n return;\r\n }\r\n let _btnAddRecordEnabled = $(\"#btnAddRecordEnabled\").val().toString();\r\n if (!isUnDefined(_btnAddRecordEnabled) && _btnAddRecordEnabled.toLowerCase() == \"true\") {\r\n $('#btnAddRecord').removeAttr(\"disabled\"); \r\n } else {\r\n $('#btnAddRecord').attr(\"disabled\", \"true\");\r\n }\r\n }\r\n\r\n refreshTableData(setClickEvents: boolean = true): void {\r\n global.ConsoleLogDegug(\"RegUraBrowseView->refreshTableData\");\r\n let _this = this;\r\n $(\"#reg-grid tbody tr\").each(\r\n function (i, row) {\r\n var $actualRow = $(row);\r\n var $data = $actualRow.children('td:nth-child(1)').text();\r\n var $wd = $data.substring(0,1);\r\n var $col = $data.substring(1,2);\r\n var $adate = $data.substring(2,3);\r\n var $xy = $actualRow.children('td:nth-child(4)');\r\n let statusCaption = $xy.html();\r\n $xy.html(\"\");\r\n\r\n $xy.css('background-repeat', 'no-repeat');\r\n $xy.css('background-position', 'right');\r\n\r\n if ($wd == \"N\") {\r\n $actualRow.css('background-color', '#F7F7F7');\r\n } else if ($adate == \"B\") {\r\n } else if ($col == \"R\"){\r\n $xy.append(' ');\r\n } else if ($col == \"Y\") {\r\n $xy.append(' ');\r\n } else if ($col == \"W\" ) {\r\n $xy.append(' ');\r\n }\r\n\r\n if ($actualRow.children('td:nth-child(1)').text() == \"R\") {\r\n $xy.append('');\r\n } else if ($actualRow.children('td:nth-child(1)').text() == \"Y\") {\r\n $xy.append('');\r\n $xy.css('background-repeat', 'no-repeat');\r\n $xy.css('background-position', 'right');\r\n } else if ($actualRow.children('td:nth-child(1)').text() == \"W\") {\r\n $actualRow.css('background-color', '#F7F7F7');\r\n } else if ($actualRow.children('td:nth-child(1)').text() == \"G\") {\r\n $xy.append('');\r\n }\r\n\r\n $xy.append(statusCaption);\r\n });\r\n\r\n $(\"#reg-grid th:nth-child(1)\").hide();\r\n $(\"#reg-grid td:nth-child(1)\").hide();\r\n\r\n let sifraZaposleni = $(\"#reg-grid #SifraZaposleni\").val();\r\n\r\n let selectedMonthYear = this._saopSelectMonthYear.getSelectedMonthYear();\r\n var d = new Date();\r\n if (d.getFullYear() == selectedMonthYear.leto && (d.getMonth() + 1) == selectedMonthYear.mesec) {\r\n // show selected today in table only for current month\r\n var weekDay = d.getUTCDate();\r\n $(\"#reg-grid tr[tabindex=\\\"\" + String(weekDay) + \"\\\"]\").addClass(\"saop-table-selected-row\");\r\n $(\"#reg-grid tr[tabindex=\\\"\" + String(weekDay) + \"\\\"]\").focus();\r\n $(\"#reg-grid tr[tabindex=\\\"\" + String(weekDay) + \"\\\"]\").blur();\r\n }\r\n\r\n if (setClickEvents) {\r\n $(\"body\").off(\"click\", \"#reg-grid tr.saop-tr-main td:not(.td-action-details)\");\r\n $(\"body\").on(\"click\", \"#reg-grid tr.saop-tr-main td:not(.td-action-details)\", function () {\r\n var SelectedDay = $(this).closest(\"tr\").find(\"td\").eq(2).text()\r\n let _saopServicesCore = new SaopServicesCore();\r\n _saopServicesCore.afterDone = function(response){\r\n $(\"#fullscreenModalBody\").html(response);\r\n $('#saopModalFS').modal('show');\r\n setModalFormZIndex('#saopModalFS');\r\n _this.bindButtonsEventsView();\r\n };\r\n _saopServicesCore.ExecuteAction({\r\n action:\"REGDayEvents/GetRegUraBrowseViewPV?SelectedDay=\" + SelectedDay+\"&employeeId=\"+sifraZaposleni\r\n ,type:\"GET\"\r\n });\r\n\r\n });\r\n\r\n this.saopRegDetailsTableView.bindGridEvents();\r\n }\r\n }\r\n\r\n public onSubmitSuccess(result: any): void {\r\n this._saopRegUraDogodekView1.onSubmitSuccess(result);\r\n }\r\n\r\n public bindButtonsEventsView():void {\r\n global.ConsoleLogDegug(\"RegUraBrowseView->bindEventsRegUraDanView\");\r\n let _this = this;\r\n\r\n this._saopRegUraDanView.initView();\r\n\r\n let btnFullscreeClose = $(\"#popupModalFormFS\").find(\"#btnFullscreeClose\");\r\n btnFullscreeClose.off(\"click\",_this.onCloseView);\r\n btnFullscreeClose.on(\"click\",_this.onCloseView); \r\n\r\n let btnClose = $(\"#popupModalFormFS\").find(\"#btnClose\");\r\n btnClose.off(\"click\",_this.onCloseView);\r\n btnClose.on(\"click\",_this.onCloseView); \r\n\r\n }\r\n\r\n public afterRefreshRegUraDanView():void{\r\n global.ConsoleLogDegug(\"RegUraBrowseView->afterRefreshRegUraDanView\");\r\n this.bindButtonsEventsView();\r\n }\r\n\r\n public onCloseView():void {\r\n global.ConsoleLogDegug(\"RegUraBrowseView->onCloseRegUraDanView\");\r\n }\r\n\r\n public afterSaopMonthYearValuesChanged(leto: number, mesec: number): void {\r\n global.ConsoleLogDegug(\"RegUraBrowseView->afterSaopMonthYearValuesChanged\");\r\n\r\n this.refreshRegUraBrowseView();\r\n }\r\n //\r\n}\r\n\r\n\r\n","import { global, isUnDefined } from \"../Common/saop-common\";\r\nimport { SaopRegUraDogodekView } from \"../REG/saop-regUraDogodek-view\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { SaopWebGrid, SaopWebGridProperties, SaopWebGridToolbar, SaopWebGridToolbarButton, SaopWebDataTable } from \"../Components/saop-grid\";\r\nimport { SaopRegUraDogodekDeleteOneView } from \"../REG/saop-regUraDogodekDeleteOne-view\"\r\nimport * as moment from '../../node_modules/moment/moment';\r\n\r\n\r\nexport class SaopRegUraDanView extends SaopRegUraDogodekView {\r\n private _libNameP:string;\r\n private _saopServicesCore :SaopServicesCore;\r\n private _selectedDate:string; \r\n private webGrid1:SaopWebGrid;\r\n private webGrid2:SaopWebGrid;\r\n private _addRecordEnabledId: string;\r\n private _addButton1Id: string;\r\n private _sifraZaposleni:string;\r\n private _revizijskaSled: string;\r\n private _regUraDogodekDeleteOneView: SaopRegUraDogodekDeleteOneView;\r\n\r\n constructor(viewId:string,libName:string = \"\") {\r\n global.ConsoleLogDegug(\"SaopRegUraDanView.constructor\");\r\n super(viewId,libName);\r\n this._libNameP = libName;\r\n this._addRecordEnabledId = \"#addRecordEnabled\";\r\n this._addButton1Id = \"#addButton1\";\r\n //\r\n this.setDictionary();\r\n //\r\n this._saopServicesCore = new SaopServicesCore();\r\n //\r\n this.refreshData = this.refreshListData.bind(this);\r\n //\r\n this._regUraDogodekDeleteOneView = new SaopRegUraDogodekDeleteOneView(\"#regDogodekView0\", libName + \"._regUraDogodekDeleteOneView\");\r\n this._regUraDogodekDeleteOneView.afterDeleteSuccess = this.afterDeleteEventsSuccess.bind(this);\r\n this._regUraDogodekDeleteOneView.afterValidationError = this.onDeleteValidationError.bind(this);\r\n }\r\n\r\n initView():void{\r\n this.initWebGrid1();\r\n this.initWebGrid1Listners();\r\n this.initWebGrid2();\r\n this.initWebGrid2Listners();\r\n this.bindViewData();\r\n }\r\n\r\n bindViewData():void {\r\n this._selectedDate = $(\"#SelectedDate1\").val();\r\n this._sifraZaposleni = $(\"#reg-grid #SifraZaposleni\").val();\r\n this._revizijskaSled = $(\"#RevizijskaSled\").val();\r\n global.ConsoleLogDegug(\"selectedDate:\" + this._selectedDate);\r\n global.ConsoleLogDegug(\"RevizijskaSled:\" + this._revizijskaSled);\r\n }\r\n\r\n setDictionary():void{\r\n let dictionary:string[] = [\"Dogodek\",\"Brisanje\",\"Ali ste prepričani, da želite izbrisati dogodek?\"];\r\n this.setTerminologyList(dictionary);\r\n } \r\n\r\n initWebGrid1():void{\r\n let captionToolbar = $(\"#saopWebGrid1\").attr(\"caption-toolbar\");\r\n let captionAddButton = $(\"#saopWebGrid1\").attr(\"caption-addButton\");\r\n //\r\n this.webGrid1 = new SaopWebGrid(this._libNameP);\r\n let gridProperties: SaopWebGridProperties;\r\n let gridToolbar:SaopWebGridToolbar;\r\n let toolbarButtons:SaopWebGridToolbarButton[] = [];\r\n //\r\n toolbarButtons.push({id: this._addButton1Id.replace(\"#\",\"\"),caption:captionAddButton,onClickEvent:this._libName+\".addRecordEx();\"}); \r\n gridToolbar = {id:\"saopWebGridTB1\",caption:captionToolbar,buttons:toolbarButtons};\r\n gridProperties = {\r\n gridId:\"#saopWebGrid1\"\r\n ,css:\"table-column-holder-last\"\r\n ,toolbar:gridToolbar\r\n ,dataTable:{enabled:true,ordering:false}\r\n }; \r\n //\r\n this.webGrid1.init(gridProperties); \r\n\r\n this.refreshButtonsState();\r\n }\r\n\r\n initWebGrid1Listners():void{\r\n let _this = this;\r\n $(\".regDayEvents_edit\").off(\"click\");\r\n $(\".regDayEvents_edit\").on('click', function(row){\r\n global.ConsoleLogDegug(\"regDayEvents_edit.click\");\r\n let _btnEdit = row.currentTarget;\r\n let btnEnabled = _btnEdit.getAttribute(\"data-enabled\");\r\n if (btnEnabled.toString().toLowerCase() == \"true\") {\r\n let data_idStart = _btnEdit.getAttribute(\"data-idstart\");\r\n let data_idEnd = _btnEdit.getAttribute(\"data-idend\");\r\n _this.editRecord({ idStart: data_idStart, idEnd: data_idEnd });\r\n } \r\n }); \r\n \r\n $(\".regDayEvents_delete\").off(\"click\");\r\n $(\".regDayEvents_delete\").on('click', function(row){\r\n global.ConsoleLogDegug(\"regDayEvents_delete.click\");\r\n let _btnEdit = row.currentTarget;\r\n let btnEnabled = _btnEdit.getAttribute(\"data-enabled\");\r\n if (btnEnabled.toString().toLowerCase() == \"true\") {\r\n let data_idStart = _btnEdit.getAttribute(\"data-idstart\");\r\n let data_idEnd = _btnEdit.getAttribute(\"data-idend\");\r\n if (_this._revizijskaSled.toString().toLowerCase() == \"true\") {\r\n let trail_parms = {\r\n idStart: data_idStart,\r\n idEnd: data_idEnd,\r\n auditTrail: _this._revizijskaSled.toString().toLowerCase() == \"true\"\r\n }\r\n _this._regUraDogodekDeleteOneView.showForm({ IdStart: trail_parms.idStart, IdEnd: trail_parms.idEnd, AuditTrail: trail_parms.auditTrail });\r\n }\r\n else{\r\n _this.deleteRecord(\r\n _this.translationService.translate(\"Brisanje\")\r\n , _this.translationService.translate(\"Ali ste prepričani, da želite izbrisati dogodek?\")\r\n , { idStart: data_idStart, idEnd: data_idEnd }\r\n );\r\n }\r\n } \r\n }); \r\n\r\n $(\"#showPreviousDayData\").off(\"click\");\r\n $(\"#showPreviousDayData\").on('click', function(row){\r\n global.ConsoleLogDegug(\"showPreviousDayData.click\");\r\n _this.showPreviousDayData();\r\n }); \r\n\r\n $(\"#showNextDayData\").off(\"click\");\r\n $(\"#showNextDayData\").on('click', function(row){\r\n global.ConsoleLogDegug(\"showNextDayData.click\");\r\n _this.showNextDayData();\r\n }); \r\n\r\n }\r\n\r\n initWebGrid2Listners():void {\r\n global.ConsoleLogDegug(\"initWebGrid2Listners...\");\r\n let _this = this;\r\n let _btnRefresh = $(\".form-today-events\").find(\"#btnRefresh\");\r\n if (_btnRefresh.length > 0) {\r\n _btnRefresh.off(\"click\");\r\n _btnRefresh.on(\"click\", function () {\r\n global.ConsoleLogDegug(\"btnRefresh.click...\");\r\n _this.refreshChainingEvents(); \r\n });\r\n } else {\r\n console.log(\"error:.form-today-events.btnRefresh not found...\");\r\n } \r\n }\r\n\r\n addRecordEx():void{\r\n this.addRecord({ SelectedDay:this._selectedDate, sifraZaposleni:this._sifraZaposleni });\r\n } \r\n\r\n initWebGrid2(){\r\n let captionToolbar = $(\"#saopWebGrid2\").attr(\"caption-toolbar\");\r\n let toolbarItemsTemplateId = $(\"#saopWebGrid2\").attr(\"toolbar-items-templateId\");\r\n //\r\n this.webGrid2 = new SaopWebGrid(this._libNameP);\r\n let gridProperties: SaopWebGridProperties;\r\n let gridToolbar:SaopWebGridToolbar;\r\n //\r\n gridToolbar = {id:\"saopWebGridTB2\",caption:captionToolbar, itemsTemplateId:toolbarItemsTemplateId};\r\n gridProperties = {\r\n gridId:\"#saopWebGrid2\"\r\n ,toolbar:gridToolbar\r\n ,dataTable:{enabled:true,ordering:false}\r\n }; \r\n //\r\n this.webGrid2.init(gridProperties); \r\n }\r\n\r\n showNextDayData():void{\r\n global.ConsoleLogDegug(\"SaopRegUraDanView.showNextDayData\");\r\n let parsedDate = moment(this._selectedDate,\"DD.MM.YYYY\").add(1, 'days');\r\n\r\n //premikamo se lahko samo od prvega do zadnjega v mesecu _selectedDate\r\n if (moment(this._selectedDate,\"DD.MM.YYYY\").endOf('month').isBefore(moment(parsedDate,\"DD.MM.YYYY\"))){\r\n $('#showNextDayData').prop(\"disabled\", true);\r\n }\r\n else {\r\n $('#showNextDayData').prop(\"disabled\", false);\r\n let parsedDateF = parsedDate.format(\"DD.MM.YYYY\");\r\n this._selectedDate = parsedDateF;\r\n this.refreshListData(); \r\n }\r\n }\r\n\r\n showPreviousDayData():void{\r\n global.ConsoleLogDegug(\"SaopRegUraDanView.showPreviousDayData\");\r\n let parsedDate = moment(this._selectedDate,\"DD.MM.YYYY\").add(-1, 'days');\r\n\r\n //premikamo se lahko samo od prvega do zadnjega v mesecu _selectedDate\r\n if (moment(this._selectedDate,\"DD.MM.YYYY\").startOf('month').isAfter(moment(parsedDate, \"DD.MM.YYYY\"))) {\r\n $('#showPreviousDayData').prop(\"disabled\", true);\r\n }\r\n else {\r\n $('#showPreviousDayData').prop(\"disabled\", false);\r\n let parsedDateF = parsedDate.format(\"DD.MM.YYYY\");\r\n this._selectedDate = parsedDateF;\r\n this.refreshListData();\r\n }\r\n } \r\n\r\n afterRefreshData():void{\r\n global.ConsoleLogDegug(\"SaopRegUraDanView.afterRefreshListData\");\r\n }\r\n\r\n refreshListData(trigger:boolean = true):void{\r\n global.ConsoleLogDegug(\"SaopRegUraDanView.refreshListData\");\r\n global.ConsoleLogDegug(trigger);\r\n let _this = this;\r\n this._saopServicesCore.afterDone = function(response){\r\n $(\"#fullscreenModalBody\").html(response);\r\n\r\n if (trigger && _this.afterRefreshData != null){ \r\n _this.afterRefreshData(); \r\n }\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"REGDayEvents/GetRegUraBrowseViewPV?SelectedDay=\" + _this._selectedDate+\"&employeeId=\"+_this._sifraZaposleni\r\n ,data:null\r\n ,type:\"GET\"\r\n ,spinnerDivId:\"#saopLoadingSidebarr\"\r\n }); \r\n }\r\n\r\n refreshButtonsState(): void {\r\n global.ConsoleLogDegug(\"SaopRegUraDanView.refreshButtonsState\");\r\n\r\n if (typeof $(this._addRecordEnabledId).val() === 'undefined') {\r\n return;\r\n }\r\n let _btnAddRecordEnabled = $(this._addRecordEnabledId).val().toString();\r\n if (!isUnDefined(_btnAddRecordEnabled) && _btnAddRecordEnabled.toLowerCase() == \"true\") {\r\n $(this._addButton1Id).removeAttr(\"disabled\");\r\n } else {\r\n $(this._addButton1Id).attr(\"disabled\", \"true\");\r\n }\r\n }\r\n\r\n public afterDeleteEventsSuccess(result: any): void {\r\n global.ConsoleLogDegug(\"afterDeleteEventsSuccess...\");\r\n this.refreshListData();\r\n }\r\n\r\n public onDeleteValidationError(result: any): void {\r\n global.ConsoleLogDegug(\"onDeleteValidationError...\");\r\n this._regUraDogodekDeleteOneView.afterViewShowSuccess(result);\r\n }\r\n\r\n refreshChainDataTable(leto: number, mesec: number, dan :number, IdZaposleni:string): void {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesView.refreshAllEmployeesTable\");\r\n\r\n let _this = this;\r\n let saopServicesCore = new SaopServicesCore();\r\n let params = { leto: leto, mesec: mesec, dan : dan, IdZaposleni : IdZaposleni };\r\n\r\n saopServicesCore.afterDone = function (response) {\r\n\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"REGAttendanceAllEmployees/GetAllEmployeesTable\"\r\n , data: params\r\n , type: \"GET\"\r\n , spinnerDivId: \"#attendanceAllEmployeesLoading\"\r\n }); \r\n\r\n }\r\n\r\n refreshChainingEvents():void{\r\n global.ConsoleLogDegug(\"SaopRegUraDanView.refreshListData\");\r\n let _this = this;\r\n this._saopServicesCore.afterDone = function(response){\r\n $(\"#fullscreenModalBody\").html(response);\r\n if (_this.afterRefreshData != null){ \r\n _this.afterRefreshData(); \r\n }\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"REGDayEvents/GetRegUraBrowseViewPV?SelectedDay=\" + _this._selectedDate+\"&employeeId=\"+_this._sifraZaposleni+\"&refresh=y\"\r\n ,data:null\r\n ,type:\"GET\"\r\n ,spinnerDivId:\"#saopLoadingSidebarr\"\r\n }); \r\n } \r\n\r\n //\r\n}\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\nimport { SaopCheckboxSwitch } from \"../Components/saop-checkbox-switch\";\r\nimport { SaopViewForm } from \"../core/saop-view-form\";\r\nimport { SaopMultiselect } from \"../Components/saop-multiselect\";\r\n\r\n\r\nexport class SaopRegUraDogodekView extends SaopViewForm {\r\n private _viewId: string; \r\n private _sifraDogodkaId: string = \"#SifraDogodka\";\r\n private _createRowActionId: string = \"#CreateRowAction\";\r\n private _eventStartId: string = \"#EventStart\";\r\n private _eventEndId: string = \"#EventEnd\";\r\n private _trajenjeMalicaId: string = \"#TrajenjeMalica\";\r\n \r\n private _cbvecDniCheckBoxMainControl: JQuery;\r\n private _cbvecDniCheckBoxControl: JQuery;\r\n private _enDatumDivControl: JQuery;\r\n private _vecDatumovDivControl: JQuery;\r\n private _izborVecDniControl: JQuery;\r\n private _selectZaposleni: SaopMultiselect;\r\n private _sifraLokacijeDivControl : JQuery;\r\n\r\n constructor(viewId:string,libName:string = \"\"){\r\n super(viewId,libName);\r\n this.setDictionary(); \r\n this.title = this.translationService.translate(\"Dogodek\");\r\n this.addRecordEndpoint = \"REGUraDogodek/CreateRegUraDogodek\";\r\n this.editRecordEndpoint = \"REGUraDogodek/EditRegUraDogodek\";\r\n this.deleteRecordEndpoint = \"REGUraDogodek/DeleteRegUraDogodek\"; \r\n\r\n this._viewId = viewId;\r\n this.viewShowComplete = this.initForm.bind(this);\r\n this.afterSubmitSuccess = this.initForm.bind(this);\r\n //\r\n this._selectZaposleni = new SaopMultiselect(libName + \"._selectZaposleni\", { inputWidthPX: '260px' });\r\n this._selectZaposleni.afterChangeCommonEvent = this.filterSelectZaposleniData.bind(this);\r\n //this._selectZaposleni.init(\"#employeesFilter\", \"Išči\"); \r\n //\r\n }\r\n\r\n setDictionary(){\r\n let dictionary:string[] = [\"Dogodek\",\"Ali ste prepričani, da želite izbrisati dogodek?\"];\r\n this.setTerminologyList(dictionary);\r\n } \r\n\r\n initForm() {\r\n this.title = this.translationService.translate(\"Dogodek\");\r\n this.onBtnCancel = this.emptyCheckboxHtml.bind(this);\r\n this.onSubmitSuccessComplete = this.emptyCheckboxHtml.bind(this);\r\n\r\n let _this = this;\r\n global.ConsoleLogDegug(this.id + \".initForm()\");\r\n\r\n let saopCheckboxSwitch = new SaopCheckboxSwitch();\r\n saopCheckboxSwitch.init(this.id);\r\n\r\n this._cbvecDniCheckBoxMainControl = $(\"\" + this._viewId + \" *> #vecDniCheckBox\");\r\n this._cbvecDniCheckBoxControl = $(\"\" + this._viewId + \" *> #cbvecDniCheckBox\");\r\n this._izborVecDniControl = $(\"\" + this._viewId + \" *> #IzborVecDni\");\r\n this._enDatumDivControl = $(\"\" + this._viewId + \" *> #enDatumDiv\");\r\n this._vecDatumovDivControl = $(\"\" + this._viewId + \" *> #vecDatumovDiv\");\r\n this._sifraLokacijeDivControl = $(\"\" + this._viewId + \" *> #SifraLokacije\");\r\n\r\n this.setDatumControlsDisplay();\r\n\r\n $(this._cbvecDniCheckBoxControl).change(function () {\r\n _this.setDatumControlsDisplay();\r\n }); \r\n\r\n this._selectZaposleni.init(\"#employeesFilter\", \"Zaposleni\"); \r\n let selected_options = $(\"#employeesFilter\").attr(\"data-selected\");\r\n if (selected_options !== undefined) {\r\n let array = selected_options.split(\",\");\r\n _this._selectZaposleni.setSelectValues(array);\r\n }\r\n\r\n this.toggleLocationInput();\r\n $(this._viewId + ' ' + this._sifraDogodkaId).off('change');\r\n $(this._viewId + ' ' + this._sifraDogodkaId).on('change', _this.onChangesifraDogodka.bind(this));\r\n\r\n $(this._viewId + ' ' + this._eventStartId).on('input', function () {\r\n _this.checkAndSetLunchEventEndTime();\r\n });\r\n }\r\n\r\n setDatumControlsDisplay(): void {\r\n let checked = this._cbvecDniCheckBoxControl.is(\":checked\");\r\n let checkedStringVal = checked ? \"true\" : \"false\";\r\n\r\n $(this._izborVecDniControl).val(checkedStringVal);\r\n\r\n if (this._enDatumDivControl != null && this._vecDatumovDivControl != null) {\r\n if (checked) {\r\n this._enDatumDivControl.hide();\r\n this._vecDatumovDivControl.show();\r\n }\r\n else {\r\n this._enDatumDivControl.show(); \r\n this._vecDatumovDivControl.hide();\r\n }\r\n }\r\n }\r\n\r\n // potrebno, ker switch checkbox ne dela dobro, če je na isti html več isti edit form\r\n emptyCheckboxHtml(): void {\r\n global.ConsoleLogDegug(this.id + \".emptyCheckboxHtml()\");\r\n this._cbvecDniCheckBoxMainControl.html(\"\");\r\n }\r\n filterSelectZaposleniData(element: any) {\r\n global.ConsoleLogDegug(\"SaopRegAttendanceAllEmployeesView.filterSelectZaposleniData\");\r\n \r\n // preberemo, katere sifre zaposlenih sodijo v izbrane skupine\r\n let izbraneSifreZaposlenih = (element.val().toString());\r\n\r\n console.log(\"ch...:\"+izbraneSifreZaposlenih);\r\n\r\n let _SelectedEmployees = $(\"#regUraDogodekView > #SelectedEmployees\");\r\n if (_SelectedEmployees.length > 0) {\r\n $(\"#regUraDogodekView > #SelectedEmployees\").val(izbraneSifreZaposlenih);\r\n } else {\r\n console.log(\"regUraDogodekView.SelectedEmployees not found ...\");\r\n }\r\n \r\n }\r\n\r\n onChangesifraDogodka(e: any): void {\r\n this.checkAndSetLunchEventEndTime();\r\n this.toggleLocationInput();\r\n }\r\n\r\n private checkAndSetLunchEventEndTime(): void {\r\n let _selectedValue = $(this._viewId + ' ' + this._sifraDogodkaId).val().toString();\r\n let createRowActionVal = $(this._viewId + ' ' + this._createRowActionId).val().toString().toLowerCase();\r\n let isCreateRowAction = createRowActionVal === \"true\" ? true : false;\r\n\r\n if (isCreateRowAction && _selectedValue == 'MAK') {\r\n let eventStart = $(this._viewId + ' ' + this._eventStartId).val().toString().trim()\r\n let uraStartArray = eventStart.split(':');\r\n\r\n if (uraStartArray.length == 3) {\r\n if (!isNaN(Number(uraStartArray[0])) && !isNaN(Number(uraStartArray[1])) && !isNaN(Number(uraStartArray[2]))) {\r\n let datumZac = new Date(2023, 1, 1, Number((uraStartArray[0])), Number((uraStartArray[1])), Number((uraStartArray[2])))\r\n\r\n let trajanjeMaliceUre = Number($(this._viewId + ' ' + this._trajenjeMalicaId).val().toString().replace(\",\",\".\"));\r\n if (isNaN(trajanjeMaliceUre)) {\r\n trajanjeMaliceUre = 0.5;\r\n }\r\n\r\n let datumKon = new Date(datumZac.getTime() + (1000 * 60 * 60 * trajanjeMaliceUre)); // ms * sekunde * minute * ure\r\n\r\n let ure = datumKon.getHours();\r\n let minute = datumKon.getMinutes();\r\n let sekunde = datumKon.getSeconds();\r\n let uraKonecString = this.addLeadingZero(ure) + \":\" + this.addLeadingZero(minute) + \":\" + this.addLeadingZero(sekunde)\r\n\r\n $(this._viewId + ' ' + this._eventEndId).val(uraKonecString);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private toggleLocationInput(): void {\r\n global.ConsoleLogDegug(\"SaopRegUraDogodekView.toggleLocationInput\");\r\n\r\n let _selectedValue = $(this._viewId + ' ' + this._sifraDogodkaId).val().toString();\r\n\r\n let show = _selectedValue === '?' ? \"False\" : $('#' + _selectedValue).val();\r\n\r\n global.ConsoleLogDegug(show);\r\n \r\n if (show === 'True' || _selectedValue === 'RD') {\r\n this._sifraLokacijeDivControl.parent().show();\r\n } else {\r\n this._sifraLokacijeDivControl.parent().hide();\r\n }\r\n }\r\n\r\n private addLeadingZero(stevilo: number): string {\r\n return (stevilo < 10 ? \"0\" : \"\") + stevilo.toString().trim(); \r\n }\r\n // \r\n}\r\n","/// \r\nimport { global } from \"../Common/saop-common\";\r\nimport { SaopViewFormBindings } from \"../Core/saop-view-form-bindings\";\r\nimport { SaopViewForm } from \"../core/saop-view-form\";\r\nimport { SaopMultiselect } from \"../Components/saop-multiselect\";\r\nimport { SaopCheckboxSwitch } from \"../Components/saop-checkbox-switch\";\r\nimport { SaopMessageDlg, SaopMsgDlgButton } from '../Components/saop-message-dlg';\r\n\r\nexport interface SaopRegUraDogodekDeleteParamsters {\r\n DateStart:string;\r\n DateEnd:string;\r\n} \r\n\r\nexport class SaopRegUraDogodekDeleteView extends SaopViewFormBindings {\r\n private _viewForm:SaopViewForm;\r\n private _selectZaposleni: SaopMultiselect;\r\n private _cbSingleDaySelect:JQuery;\r\n private _multipleDaysDiv:JQuery;\r\n private _singleDayDiv:JQuery; \r\n private _singleDaySelect:JQuery; \r\n\r\n constructor(viewId:string,libName:string = \"\"){\r\n super(viewId,libName);\r\n this._viewForm = new SaopViewForm(viewId,libName+\"._viewForm\");\r\n this.setDictionary(); \r\n this._viewForm.fullTitle = this._viewForm.translationService.translate(\"Brisanje\");\r\n this._viewForm.title = \"\";\r\n this._viewForm.addRecordEndpoint = \"REGUraDogodek/DeleteRegUraDogodekPartial\";\r\n this._viewForm.editRecordEndpoint = \"\";\r\n this._viewForm.deleteRecordEndpoint = \"\"; \r\n //\r\n this._viewForm.afterViewShowSuccess = this.afterViewShowSuccess.bind(this); \r\n }\r\n\r\n setDictionary(){\r\n let dictionary:string[] = [\"Brisanje\",\"Ali ste prepričani, da želite izbrisati dogodke?\"];\r\n this._viewForm.setTerminologyList(dictionary);\r\n } \r\n\r\n public showForm(params:SaopRegUraDogodekDeleteParamsters = null):void {\r\n global.ConsoleLogDegug(\"showForm...\");\r\n this._viewForm.addRecord(params);\r\n }\r\n\r\n public afterViewShowSuccess(sender:any):void{\r\n global.ConsoleLogDegug(this.id + \".afterViewShowSuccess()\");\r\n let _this = this;\r\n //\r\n this._viewForm.refreshData = this.refreshData.bind(this);\r\n this._viewForm.onBtnOkClick = this.deleteDialog.bind(this);\r\n this._viewForm.afterSubmitSuccess = this.onValidationError.bind(this);\r\n //\r\n this._selectZaposleni = new SaopMultiselect();\r\n this._selectZaposleni.afterChangeCommonEvent = this.filterSelectZaposleniData.bind(this); \r\n //\r\n this._singleDaySelect = $(\"#deleteRegUraDogodekPartial\").find(\"#SingleDaySelect\");\r\n if (this._singleDaySelect.length == 0) {\r\n console.error(\"Could not find control 'SingleDaySelect'... \");\r\n } \r\n //\r\n this._cbSingleDaySelect = $(\"#deleteRegUraDogodekPartial\").find(\"#cbSingleDaySelectSwitch\");\r\n if (this._cbSingleDaySelect.length == 0) {\r\n console.error(\"Could not find control 'SingleDaySelect'... \");\r\n }\r\n //\r\n this._cbSingleDaySelect.off(\"change\",_this.setCBSelectedDaysDisplay);\r\n this._cbSingleDaySelect.on(\"change\",_this.setCBSelectedDaysDisplay.bind(this)); \r\n //\r\n this._multipleDaysDiv = $(\"#deleteRegUraDogodekPartial\").find(\"#multipleDaysDiv\");\r\n if (this._multipleDaysDiv.length == 0) {\r\n console.error(\"Could not find control 'multipleDaysDiv'... \");\r\n } \r\n //\r\n this._singleDayDiv = $(\"#deleteRegUraDogodekPartial\").find(\"#singleDayDiv\");\r\n if (this._singleDayDiv.length == 0) {\r\n console.error(\"Could not find control 'singleDayDiv'... \");\r\n } \r\n //\r\n this._selectZaposleni.init(\"#employeesFilter\", \"Zaposleni\");\r\n let selected_options = $(\"#employeesFilter\").attr(\"data-selected\");\r\n if (selected_options !== undefined) {\r\n let array = selected_options.split(\",\");\r\n _this._selectZaposleni.setSelectValues(array);\r\n }\r\n //\r\n let saopCheckboxSwitch = new SaopCheckboxSwitch();\r\n saopCheckboxSwitch.init(this._viewForm.id); \r\n\r\n }\r\n\r\n setCBSelectedDaysDisplay(): void {\r\n let checked = this._cbSingleDaySelect.is(\":checked\");\r\n let checkedStringVal = checked ? \"true\" : \"false\";\r\n $(this._cbSingleDaySelect).val(checkedStringVal);\r\n checkedStringVal = !checked ? \"true\" : \"false\"; \r\n $(this._singleDaySelect).val(checkedStringVal);\r\n\r\n if (this._singleDayDiv != null && this._multipleDaysDiv != null) {\r\n if (checked) {\r\n this._singleDayDiv.hide();\r\n this._multipleDaysDiv.show();\r\n }\r\n else {\r\n this._singleDayDiv.show(); \r\n this._multipleDaysDiv.hide();\r\n }\r\n }\r\n } \r\n\r\n filterSelectZaposleniData(element: any) {\r\n global.ConsoleLogDegug(\"SaopRegUraDogodekDeleteView.filterSelectZaposleniData\");\r\n \r\n // preberemo, katere sifre zaposlenih sodijo v izbrane skupine\r\n let izbraneSifreZaposlenih = (element.val().toString());\r\n\r\n console.log(\"ch...:\"+izbraneSifreZaposlenih);\r\n\r\n let _SelectedEmployees = $(\"#deleteRegUraDogodekPartial > #SelectedEmployees\");\r\n if (_SelectedEmployees.length > 0) {\r\n $(\"#deleteRegUraDogodekPartial > #SelectedEmployees\").val(izbraneSifreZaposlenih);\r\n } else {\r\n console.log(\"SelectedEmployees not found ...\");\r\n } \r\n }\r\n\r\n public deleteDialog(sender:any):void{\r\n global.ConsoleLogDegug(\"deleteDialog\");\r\n let message = this._viewForm.translationService.translate(\"Ali ste prepričani, da želite izbrisati dogodke?\");\r\n let title = this._viewForm.translationService.translate(\"Brisanje\");\r\n let saopMessageDlg = new SaopMessageDlg({data:null,parent:null}) \r\n saopMessageDlg.onYes = this.onDeleteRecord.bind(this);\r\n saopMessageDlg.Show(message,title,1,[SaopMsgDlgButton.mbYes,SaopMsgDlgButton.mbNo]);\r\n }\r\n\r\n public onDeleteRecord(sender:any):void{\r\n $(\"#deleteRegUraDogodekPartial\").submit();\r\n }\r\n\r\n public refreshData(sender:any):void {\r\n global.ConsoleLogDegug(\"SaopRegUraDogodekDeleteView.refreshData\");\r\n this.afterDeleteSuccess(sender);\r\n } \r\n\r\n public afterDeleteSuccess(sender:any):void {\r\n global.ConsoleLogDegug(\"SaopRegUraDogodekDeleteView.afterDeleteSuccess\");\r\n } \r\n\r\n public onValidationError(sender:any):void {\r\n global.ConsoleLogDegug(\"SaopRegUraDogodekDeleteView.onDeleteError\");\r\n //this._viewForm.bindViewEvents();\r\n this.afterValidationError(sender);\r\n } \r\n\r\n\r\n public afterValidationError(sender:any):void {\r\n global.ConsoleLogDegug(\"SaopRegUraDogodekDeleteView.AfterValidationError\");\r\n } \r\n //\r\n}","/// \r\nimport { global } from \"../Common/saop-common\";\r\nimport { SaopViewFormBindings } from \"../Core/saop-view-form-bindings\";\r\nimport { SaopViewForm } from \"../core/saop-view-form\";\r\n\r\nexport interface SaopRegUraDogodekDeleteOneParamsters {\r\n IdStart:string;\r\n IdEnd: string;\r\n AuditTrail: boolean;\r\n} \r\n\r\nexport class SaopRegUraDogodekDeleteOneView extends SaopViewFormBindings {\r\n private _viewForm:SaopViewForm;\r\n\r\n constructor(viewId:string,libName:string = \"\"){\r\n super(viewId,libName);\r\n this._viewForm = new SaopViewForm(viewId,libName+\"._viewForm\"); \r\n this._viewForm.fullTitle = this._viewForm.translationService.translate(\"Brisanje\");\r\n this._viewForm.title = \"\";\r\n this._viewForm.addRecordEndpoint = \"REGUraDogodek/DeleteRegUraDogodekOnePartial\";\r\n this._viewForm.editRecordEndpoint = \"\";\r\n this._viewForm.deleteRecordEndpoint = \"\"; \r\n //\r\n this._viewForm.afterViewShowSuccess = this.afterViewShowSuccess.bind(this); \r\n }\r\n\r\n public showForm(params: SaopRegUraDogodekDeleteOneParamsters = null):void {\r\n global.ConsoleLogDegug(\"showForm...\");\r\n this._viewForm.addRecord(params);\r\n }\r\n\r\n public afterViewShowSuccess(sender:any):void{\r\n global.ConsoleLogDegug(this.id + \".afterViewShowSuccess()\");\r\n let _this = this;\r\n //\r\n this._viewForm.refreshData = this.refreshData.bind(this);\r\n this._viewForm.onBtnOkClick = this.onDeleteRecord.bind(this);\r\n this._viewForm.afterSubmitSuccess = this.onValidationError.bind(this); \r\n }\r\n\r\n public onDeleteRecord(sender: any): void {\r\n $(\"#deleteRegUraDogodekOnePartial\").submit();\r\n } \r\n\r\n public refreshData(sender:any):void {\r\n global.ConsoleLogDegug(\"SaopRegUraDogodekDeleteOneView.refreshData\");\r\n this.afterDeleteSuccess(sender);\r\n } \r\n\r\n public afterDeleteSuccess(sender:any):void {\r\n global.ConsoleLogDegug(\"SaopRegUraDogodekDeleteOneView.afterDeleteSuccess\");\r\n } \r\n\r\n public onValidationError(sender:any):void {\r\n global.ConsoleLogDegug(\"SaopRegUraDogodekDeleteOneView.onDeleteError\");\r\n //this._viewForm.bindViewEvents(); \r\n this.afterValidationError(this);\r\n } \r\n\r\n public afterValidationError(sender:any):void {\r\n global.ConsoleLogDegug(\"SaopRegUraDogodekDeleteOneView.AfterValidationError\");\r\n } \r\n //\r\n}","/// \r\nimport { global } from \"../Common/saop-common\";\r\nimport { SaopUploadFiles } from \"../Components/saop-upload-files\";\r\n\r\nexport class SaopSplDocumentView {\r\n public saopUploadFiles:SaopUploadFiles;\r\n\r\n constructor(viewId: string, libName: string = \"\") {\r\n this.saopUploadFiles = new SaopUploadFiles(viewId,libName+\".saopUploadFiles\");\r\n this.saopUploadFiles.afterSubmitSuccess = this.afterSubmitSuccess;\r\n }\r\n\r\n initView(): void {\r\n global.ConsoleLogDegug(\"SaopSplDocumentView.initView\");\r\n // form nima sidebar right, zato se dodan class, da btn ni viden tudi v mobile verziji\r\n $(\"#btnShowSidebarr\").addClass(\"d-none-mobile\");\r\n this.bindControls();\r\n\r\n let _this = this;\r\n _this.setHeight();\r\n window.onresize = function () {\r\n _this.setHeight();\r\n };\r\n }\r\n\r\n bindControls() {\r\n global.ConsoleLogDegug(\"SaopSplDocumentView.bindGridEvents\");\r\n let _this = this;\r\n $(\".btnUploadSPLDocuments\").off(\"click\");\r\n $(\".btnUploadSPLDocuments\").on('click', function (row) {\r\n global.ConsoleLogDegug(\"SaopSplDocumentView.btnUploadSPLDocuments.click\");\r\n let title = row.target.getAttribute(\"data-formtitle\");\r\n _this.saopUploadFiles.viewTitle = title;\r\n _this.saopUploadFiles.initView({controller:\"SPLDocument\",action:\"GetUploadDocuments\"});\r\n });\r\n }\r\n\r\n public afterSubmitSuccess(result:any): void {\r\n global.ConsoleLogDegug(\"afterExecuteSuccess\");\r\n if(result.success)\r\n window.location.href = result.redirectTo;\r\n \r\n } \r\n\r\n setHeight() {\r\n var header = $(\"#site-header\").height();\r\n var footer = $(\"#site-footer\").height();\r\n $(\"#documentTree\").height(window.innerHeight - header - footer - 1);\r\n }\r\n //\r\n}\r\n\r\n\r\n","/// \r\nimport { global, relodeCurrentPage } from \"../Common/saop-common\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\nimport { SaopChangePwdView } from '../Account/saop-change-pwd-view'\r\n\r\nexport class SaopSettingsView { \r\n //\r\n private _saopServicesCore :SaopServicesCore;\r\n private _saopChangePwdView : SaopChangePwdView;\r\n\r\n constructor(viewId:string,libName:string = \"\") {\r\n this._saopServicesCore = new SaopServicesCore(); \r\n this._saopChangePwdView = new SaopChangePwdView(viewId,libName);\r\n }\r\n\r\n initView(): void {\r\n global.ConsoleLogDegug(\"SaopSettingsView.initView\");\r\n\r\n this.bindViewEvents(); \r\n \r\n this.checkPasswordStrength();\r\n \r\n }\r\n\r\n bindViewEvents(){\r\n global.ConsoleLogDegug(\"SaopSettingsView.bindGridEvents\");\r\n let _this = this;\r\n //\r\n $(\"#selectJezik\").off(\"change\");\r\n $(\"#selectJezik\").on('change', function (row) {\r\n _this.vrstaJezikaChanged();\r\n }); \r\n \r\n this._saopChangePwdView.bindViewEvents(); \r\n }\r\n\r\n vrstaJezikaChanged(): void {\r\n global.ConsoleLogDegug(\"SaopSettingsView.vrstaJezikaChanged\");\r\n let _this = this;\r\n\r\n let vrstaJezikaElement = document.getElementById('selectJezik') as HTMLSelectElement;\r\n let jezik = vrstaJezikaElement.options[vrstaJezikaElement.selectedIndex].value;\r\n\r\n let idWebOperaterja = (document.getElementById('IDWebOperaterja') as HTMLInputElement).value;\r\n\r\n let data = { idweboperaterja: idWebOperaterja, jezik: jezik};\r\n\r\n this._saopServicesCore.afterDone = function (response) {\r\n if (response.alertMessage) {\r\n alertify.message(response.alertMessage);\r\n }\r\n\r\n if (response.viewContent) {\r\n $(\"#messageBanner\").html(response.viewContent);\r\n }\r\n\r\n if (response.success) {\r\n //reload current page \r\n relodeCurrentPage();\r\n }\r\n else {\r\n $(\"#selectJezik\").val(response.jezik);\r\n }\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action: \"Settings/UpdateSaopwebOperaterjiJezik\"\r\n , data: data\r\n , type: \"POST\"\r\n , spinnerDivId: \"#absenceConfirmationPendingLoading\"\r\n }); \r\n }\r\n\r\n public checkPasswordStrength():void{\r\n this._saopChangePwdView.checkPasswordStrength();\r\n }\r\n\r\n}\r\n\r\n\r\n","import { global,isEmpty,getSiteAbsoluteURL, isUnDefined } from \"../Common/saop-common\";\r\nimport { SaopViewSpinner } from '../Components/saop-view-spinner'\r\n\r\nexport interface SaopServicesCoreParams {\r\n action:string;\r\n async?:boolean\r\n type?:string;\r\n data?:any;\r\n spinnerDivId?:string;\r\n // contentType?: string | false | undefined;\r\n // dataType?: 'xml' | 'html' | 'script' | 'json' | 'jsonp' | 'text' | string | undefined;\r\n // processData?: boolean | undefined;\r\n}\r\n\r\nexport enum SaopServicesCoreResult {\r\n success = 1\r\n , error = 2\r\n}\r\n\r\nexport enum SaopServicesCoreHTTPResultStatusCode {\r\n ok = 200,\r\n unauthorized = 401,\r\n internalServerError = 500\r\n}\r\n\r\nexport interface SaopServicesCoreResponse {\r\n response: SaopServicesCoreResult;\r\n data: any;\r\n};\r\n\r\n// function syncDelay(milliseconds:any){\r\n// var start = new Date().getTime();\r\n// var end=0;\r\n// while( (end-start) < milliseconds){\r\n// end = new Date().getTime();\r\n// }\r\n// }\r\n\r\nexport class SaopServicesCore {\r\n private _saopViewSpinner:SaopViewSpinner = new SaopViewSpinner();\r\n private _params:SaopServicesCoreParams;\r\n private _defaultParams:SaopServicesCoreParams;\r\n // \r\n //public _result:SaopServicesCoreResponse = {response:null,data:null}; \r\n\r\n constructor(){\r\n this._defaultParams = {\r\n action:\"\"\r\n ,type:\"GET\"\r\n ,async:true\r\n ,data:null\r\n ,spinnerDivId:\"\"\r\n };\r\n }\r\n\r\n private onDone(result:any){\r\n global.ConsoleLogDegug(\"SaopServicesCore.onDone\");\r\n this.afterDone(result);\r\n //this._saopViewSpinner.hideLoadingSaop(this._params.spinnerDivId); \r\n }\r\n\r\n afterDone(result:any):void{\r\n global.ConsoleLogDegug(\"SaopServicesCore.afterDone\");\r\n } \r\n\r\n private onSuccess(result:any):void{\r\n global.ConsoleLogDegug(\"SaopServicesCore.success\");\r\n let _result:SaopServicesCoreResponse = {response:null,data:null}; \r\n if (typeof result.success === \"undefined\" || result.success === null) {\r\n _result.response = SaopServicesCoreResult.success;\r\n } else {\r\n _result.response = result.success == true ? SaopServicesCoreResult.success : SaopServicesCoreResult.error;\r\n }\r\n \r\n _result.data = result;\r\n this.afterSuccess(_result);\r\n }\r\n\r\n afterSuccess(result:any):void{\r\n global.ConsoleLogDegug(\"SaopServicesCore.afterSuccess\");\r\n } \r\n\r\n private onError(result:any):void{\r\n global.ConsoleLogDegug(\"SaopServicesCore.error\");\r\n \r\n if (result.status == SaopServicesCoreHTTPResultStatusCode.unauthorized) {\r\n // redirect to login\r\n this.unAuthorizedRedirectToLoginPage();\r\n return;\r\n }\r\n\r\n if (result.status = SaopServicesCoreHTTPResultStatusCode.internalServerError && !isUnDefined(result.responseText)) {\r\n alert(\"Internal error!\");\r\n }\r\n\r\n let _result:SaopServicesCoreResponse = {response:null,data:null}; \r\n _result.response = SaopServicesCoreResult.error;\r\n _result.data = result;\r\n this.afterError(_result);\r\n }\r\n\r\n afterError(result:any):void{\r\n global.ConsoleLogDegug(\"SaopServicesCore.afterSuccess\");\r\n } \r\n\r\n ExecuteAction(params:SaopServicesCoreParams):void {\r\n global.ConsoleLogDegug(\"SaopServicesCore.ExecuteAction\");\r\n let options = { ...this._defaultParams, ...params };\r\n params = options;\r\n this._params = params;\r\n let _this = this;\r\n let _ajaxAction = getSiteAbsoluteURL(params.action);\r\n\r\n //@Url.Action(\"crearCampManual\", \"DPS\")\r\n\r\n try {\r\n $.ajax({\r\n async: params.async,\r\n url: _ajaxAction,\r\n type: !isEmpty(params.type) ? params.type : \"POST\",\r\n data: params.data,\r\n // contentType: params.contentType == null ? 'application/x-www-form-urlencoded; charset=UTF-8' : params.contentType,\r\n // dataType: params.type == null ? 'Intelligent Guess (xml, json, script, or html)' : params.type, \r\n // processData : params.processData == null ? true : params.processData, \r\n beforeSend: function () { _this._saopViewSpinner.showLoadingSaop(params.spinnerDivId); },\r\n complete: function () { _this._saopViewSpinner.hideLoadingSaop(params.spinnerDivId); },\r\n success: this.onSuccess.bind(_this),\r\n error: this.onError.bind(_this)\r\n }).done(function (result) {\r\n global.ConsoleLogDegug(\"Done...\");\r\n _this.onDone(result);\r\n });\r\n }\r\n catch(err) {\r\n alert(\"Internal error!\");\r\n } \r\n\r\n \r\n }\r\n\r\n ExecuteBlobAction(params: SaopServicesCoreParams): void {\r\n global.ConsoleLogDegug(\"SaopServicesCore.ExecuteBlobAction\");\r\n let options = { ...this._defaultParams, ...params };\r\n params = options;\r\n this._params = params;\r\n let _this = this;\r\n let _ajaxAction = getSiteAbsoluteURL(params.action);\r\n\r\n try {\r\n $.ajax({\r\n type: \"POST\",\r\n url: _ajaxAction,\r\n data: params.data,\r\n xhrFields: {\r\n responseType: 'blob' // to avoid binary data being mangled on charset conversion\r\n },\r\n success: function (blob, status, xhr) {\r\n // check for a filename\r\n var filename = \"\";\r\n var disposition = xhr.getResponseHeader('Content-Disposition');\r\n if (disposition && disposition.indexOf('attachment') !== -1) {\r\n var filenameRegex = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/;\r\n var matches = filenameRegex.exec(disposition);\r\n if (matches != null && matches[1]) filename = matches[1].replace(/['\"]/g, '');\r\n }\r\n\r\n //if (typeof window.navigator.msSaveBlob !== 'undefined') {\r\n // // IE workaround for \"HTML7007: One or more blob URLs were revoked by closing the blob for which they were created. These URLs will no longer resolve as the data backing the URL has been freed.\"\r\n // window.navigator.msSaveBlob(blob, filename);\r\n //} else\r\n //{\r\n var URL = window.URL || window.webkitURL;\r\n var downloadUrl = URL.createObjectURL(blob);\r\n\r\n if (filename) {\r\n // use HTML5 a[download] attribute to specify filename\r\n var a = document.createElement(\"a\");\r\n // safari doesn't support this yet\r\n if (typeof a.download === 'undefined') {\r\n window.location.href = downloadUrl;\r\n } else {\r\n a.href = downloadUrl;\r\n a.download = filename;\r\n document.body.appendChild(a);\r\n a.click();\r\n }\r\n } else {\r\n window.location.href = downloadUrl;\r\n }\r\n\r\n setTimeout(function () { URL.revokeObjectURL(downloadUrl); }, 100); // cleanup\r\n //}\r\n },\r\n error: this.onError.bind(_this)\r\n }).done(function (result) {\r\n global.ConsoleLogDegug(\"Done...\");\r\n _this.onDone(result);\r\n });\r\n }\r\n catch (err) {\r\n alert(\"Internal error!\");\r\n }\r\n }\r\n \r\n public handleSubmitError(response: any): void {\r\n global.ConsoleLogDegug(\"SaopServicesCore.HandleSubmitError\");\r\n\r\n if (response.status == SaopServicesCoreHTTPResultStatusCode.unauthorized) {\r\n this.unAuthorizedRedirectToLoginPage();\r\n return;\r\n }\r\n\r\n // display error\r\n console.log(\"response\", response);\r\n alert(response.statusText);\r\n }\r\n\r\n public unAuthorizedRedirectToLoginPage(): void {\r\n global.ConsoleLogDegug(\"SaopServicesCore.redirectToLoginPage\");\r\n\r\n window.location.reload();\r\n }\r\n \r\n //\r\n}\r\n","/// \r\nimport { global, setModalFormZIndex, isEmpty, isUnDefined, setFirstFormControlToFocus,getSiteAbsoluteURL } from \"../Common/saop-common\";\r\nimport { SaopServicesCore,SaopServicesCoreParams, SaopServicesCoreResponse, SaopServicesCoreResult } from './saop-services-core'\r\nimport { SaopMessageDlg, SaopMsgDlgButton } from '../Components/saop-message-dlg';\r\nimport { SaopTranslationService } from '../Core/saop-translate';\r\nimport {SaopFloatingLabel } from '../Components/saop-floating-label';\r\n\r\nexport class Error {\r\n public Code: string;\r\n public Message: string;\r\n}\r\n\r\nexport enum SaopWfAction {\r\n wfaNone = 0\r\n ,wfaAddRecord = 1\r\n ,wfaEditRecord = 2\r\n ,wfaDeleteRecord = 3\r\n ,wfaRecordDestails = 4\r\n ,wfaCustomHtml = 5\r\n}\r\n\r\nexport interface SaopWfSubmitResult {\r\n success:boolean;\r\n viewContent:string;\r\n redirectTo:string;\r\n alertMessage: string;\r\n data: string;\r\n}\r\n\r\nexport class SaopViewForm {\r\n private _viewModalFrame:JQuery;\r\n private _viewModalBody:JQuery; \r\n private _view_title:JQuery;\r\n private _view_btnOk:JQuery;\r\n private _view_btnCancel:JQuery;\r\n private _servicesParams:SaopServicesCoreParams = {action:null,data:null,type:\"POST\"};\r\n private _terminology: string[];\r\n private _prepareView:boolean = false;\r\n private _data:any;\r\n private _modalParent:boolean = false;\r\n //\r\n public _libName:string; \r\n public saopServicesCore:SaopServicesCore = new SaopServicesCore();\r\n public translationService:SaopTranslationService;\r\n public contentElementId = \".saop-modal-body-element\"; \r\n public addRecordEndpoint: string = \"\";\r\n public editRecordEndpoint: string = \"\";\r\n public deleteRecordEndpoint: string = \"\";\r\n public saopFloatingLabel: SaopFloatingLabel;\r\n //\r\n public onSucccessCallback: string = \"\";\r\n public onErrorCallback: string = \"\";\r\n public onFailureCallback: string = \"\";\r\n // \r\n public id:string;\r\n public title:string;\r\n public fullTitle:string = \"\";\r\n public fullScreen:boolean = false; \r\n //\r\n public onClose: (params:any) => any = null;\r\n public onSubmit: (params:any) => any = null;\r\n public onError: (params:any) => any = null; \r\n \r\n constructor(viewId:string,libName:string = \"\"){\r\n global.ConsoleLogDegug(\"SaopViewForm...\");\r\n global.ConsoleLogDegug(\"viewId:\"+viewId);\r\n this.id = viewId;\r\n this._libName = libName;\r\n this.onSucccessCallback = libName+\".onSubmitSuccess(data,\"+libName+\");\";\r\n this.onErrorCallback = libName + \".onSubmitError(data,\" + libName + \");\"; \r\n this.onFailureCallback = libName + \".onSubmitFailure(xhr,\" + libName + \");\"; \r\n this.translationService = new SaopTranslationService();\r\n this.saopFloatingLabel = new SaopFloatingLabel();\r\n // \r\n }\r\n\r\n getData():any {\r\n return this._data;\r\n }\r\n\r\n public setTerminologyList(dictionary: string[] = null) {\r\n this._terminology = [\"Uredi\",\"Nov vnos\",\"Podrobnosti\",\"Brisanje\"];\r\n if (dictionary != null) {\r\n this._terminology = this._terminology.concat(dictionary);\r\n }\r\n this.translationService.setTranslationsList(this._terminology);\r\n } \r\n\r\n public onBtnOkClick(sender:any):void{\r\n global.ConsoleLogDegug(\"onBtnOkClick...\");\r\n }\r\n\r\n public onBtnCancel(sender:any):void{\r\n global.ConsoleLogDegug(\"onBtnCancel...\");\r\n } \r\n\r\n public beforeViewShow(sender:any):void{\r\n global.ConsoleLogDegug(this.id+\".beforeViewShow()\");\r\n \r\n this._viewModalFrame = $(this.id);\r\n if (this._viewModalFrame == null) { console.log(this.id+\" not found!\");};\r\n //\r\n var contentSel = this.id + \" \" + this.contentElementId;\r\n this._viewModalBody = $(contentSel); \r\n }\r\n\r\n public afterViewShow(sender:any,wfAction:SaopWfAction):void{\r\n global.ConsoleLogDegug(this.id+\".afterViewShow()\");\r\n\r\n let _this = this;\r\n\r\n this.bindViewEvents(sender);\r\n\r\n // let _this = this;\r\n // this._view_btnOk = $(\"\"+this.id+\" *> #btnOk\");\r\n // this._view_btnCancel = $(\"\"+this.id+\" *> #btnCancel\");\r\n // this._view_title = $(\"\"+this.id+\" *> #exampleModalLongTitle\");\r\n //\r\n\r\n global.ConsoleLogDegug(\"afterViewShow title:\"+ this.title);\r\n\r\n if (this.fullTitle.length > 0) {\r\n this.title = this.fullTitle;\r\n }\r\n\r\n if (!isEmpty(this.title)){\r\n let _title = \"\";\r\n if (this.fullTitle.length > 0) {\r\n _title = this.title;\r\n }else if (wfAction == SaopWfAction.wfaAddRecord){\r\n _title = this.translationService.translate(\"Nov vnos\")+\": \"+this.title;\r\n } else if (wfAction == SaopWfAction.wfaEditRecord){\r\n _title = this.translationService.translate(\"Uredi\")+\": \"+this.title;\r\n } else if (wfAction == SaopWfAction.wfaRecordDestails){ \r\n _title = this.translationService.translate(\"Podrobnosti\")+\": \"+this.title;\r\n } \r\n global.ConsoleLogDegug(\"afterViewShow _title:\"+ _title);\r\n\r\n this._view_title.html(_title);\r\n } else {\r\n if (wfAction == SaopWfAction.wfaAddRecord){\r\n let defaultTitleAdd = $(\"\"+this.id+\" *> #addTitle\").val().toString();\r\n this._view_title.html(defaultTitleAdd);\r\n } else {\r\n let defaultTitleEdit = $(\"\"+this.id+\" *> #editTitle\").val().toString();\r\n this._view_title.html(defaultTitleEdit);\r\n }\r\n }\r\n\r\n this.viewShowComplete(sender, wfAction);\r\n \r\n //\r\n // this._view_btnOk.click(\r\n // function () {\r\n // _this.onBtnOkClick(sender);\r\n // }\r\n // );\r\n\r\n // this._view_btnCancel.click(\r\n // function () {\r\n // _this.onBtnCancel(sender);\r\n // }\r\n // ); \r\n \r\n //this.bindViewEvents();\r\n\r\n this._modalParent = $(\"body\").hasClass(\"modal-open\");\r\n\r\n if (this._prepareView == false){\r\n this._viewModalFrame.modal('show');\r\n setModalFormZIndex(this.id); \r\n setFirstFormControlToFocus(this.id);\r\n }\r\n //\r\n this.afterViewShowSuccess(sender);\r\n\r\n }\r\n\r\n public afterViewShowSuccess(sender:any):void{\r\n global.ConsoleLogDegug(this.id + \".afterViewShowSuccess()\");\r\n }\r\n\r\n public viewShowComplete(sender: any, wfAction: SaopWfAction): void {\r\n global.ConsoleLogDegug(this.id + \".viewShowComplete()\");\r\n }\r\n\r\n public viewShownComplete(sender: any): void {\r\n global.ConsoleLogDegug(this.id + \".viewShownComplete()\");\r\n }\r\n\r\n public bindViewEvents(sender:any): void {\r\n global.ConsoleLogDegug(\"bindViewEvents\");\r\n\r\n let _this = this;\r\n let divForm = this._viewModalFrame.find(\"form\");\r\n \r\n this._view_btnOk = $(\"\"+this.id+\" *> #btnOk\");\r\n this._view_btnCancel = $(\"\"+this.id+\" *> #btnCancel\");\r\n this._view_title = $(\"\"+this.id+\" *> #exampleModalLongTitle\"); \r\n\r\n this._view_btnOk.click(\r\n function () {\r\n _this.onBtnOkClick(sender);\r\n }\r\n );\r\n\r\n this._view_btnCancel.click(\r\n function () {\r\n _this.onBtnCancel(sender);\r\n }\r\n ); \r\n\r\n if (this.onSucccessCallback !== null) {\r\n divForm.attr(\"data-ajax-success\", this.onSucccessCallback);\r\n }\r\n if (this.onErrorCallback !== null) {\r\n divForm.attr(\"data-ajax-error\", this.onErrorCallback);\r\n }\r\n if (this.onFailureCallback !== null) {\r\n divForm.attr(\"data-ajax-failure\", this.onFailureCallback);\r\n }\r\n \r\n this._viewModalFrame.on('hidden.bs.modal', function (e) { \r\n if (_this._modalParent) {\r\n $(\"body\").addClass(\"modal-open\");\r\n } \r\n })\r\n\r\n this._viewModalFrame.on('shown.bs.modal', function(e) { \r\n _this.viewShownComplete(e);\r\n });\r\n\r\n this.saopFloatingLabel.init(); \r\n }\r\n\r\n private renderErrorsBanner(errors:Error[]):SaopServicesCoreResponse {\r\n let result:SaopServicesCoreResponse;\r\n result = {response:SaopServicesCoreResult.error,data:null}; \r\n //\r\n let jsonData = JSON.stringify(errors);\r\n let _data = {jsonInput:jsonData}; \r\n //\r\n let _saopServicesCore = new SaopServicesCore();\r\n _saopServicesCore.afterSuccess = function (response:SaopServicesCoreResponse) {\r\n result = response;\r\n };\r\n _saopServicesCore.ExecuteAction({\r\n action: \"Errors/RenderErrorsBanner\"\r\n , type: \"POST\"\r\n , data: _data\r\n , async: false\r\n });\r\n\r\n return result;\r\n }\r\n\r\n public renderError(errMessage:string):void{\r\n try {\r\n global.ConsoleLogDegug(\"ajax.afterError\");\r\n let _errors:Error[];\r\n _errors = [{Code:\"\",Message:errMessage}]; \r\n let _parentView = $(this.id).parent();\r\n let _errorBannerId = this.id+\"ErrorBanner\";\r\n let _view_banner = _parentView.find(_errorBannerId);\r\n if ( isUnDefined(_view_banner) || _view_banner.length == 0) {\r\n _parentView.append(\"
    \");\r\n _view_banner = _parentView.find(_errorBannerId);\r\n }\r\n let _bannerResult = this.renderErrorsBanner(_errors);\r\n _view_banner.html(_bannerResult.data.viewContent); \r\n }\r\n catch(err) {\r\n alert(err.message);\r\n } \r\n }\r\n //public loadViewBody(wfAction:SaopWfAction,data:any,sender:any):SaopServicesCoreResult{\r\n public loadViewBody(wfAction:SaopWfAction,data:any,sender:any):void{\r\n global.ConsoleLogDegug(\"loadViewBody\");\r\n let _this = this;\r\n this.beforeViewShow(sender);\r\n\r\n if (wfAction != SaopWfAction.wfaCustomHtml) {\r\n let _ajaxAction = wfAction == SaopWfAction.wfaAddRecord ? this.addRecordEndpoint : this.editRecordEndpoint;\r\n //_ajaxAction = getSiteAbsoluteURL(_ajaxAction);\r\n\r\n this._servicesParams = {action:_ajaxAction,data:data,type:\"POST\"};\r\n\r\n this.saopServicesCore.afterSuccess = function(_ajaxResult){\r\n if (_ajaxResult.response == SaopServicesCoreResult.success){\r\n global.ConsoleLogDegug(\"ajax.success\");\r\n _this._viewModalBody.html(_ajaxResult.data);\r\n _this.afterViewShow(sender,wfAction);\r\n } else {\r\n global.ConsoleLogDegug(\"ajax.error\");\r\n if ((isUnDefined(_ajaxResult.data) && isUnDefined(_ajaxResult.data.alertMessage)) == false){\r\n _this.renderError(_ajaxResult.data.alertMessage);\r\n } else if (_ajaxResult.data.responseJSON && _ajaxResult.data.responseJSON.message){\r\n alertify.error(_ajaxResult.data.responseJSON.message);\r\n } \r\n }\r\n \r\n };\r\n \r\n this.saopServicesCore.afterError = function(_ajaxResult){\r\n //###\r\n if ((isUnDefined(_ajaxResult.data) && isUnDefined(_ajaxResult.data.alertMessage)) == false){\r\n _this.renderError(_ajaxResult.data.alertMessage);\r\n } else {\r\n alert(\"Internal error!\");\r\n }\r\n };\r\n \r\n this.saopServicesCore.ExecuteAction(this._servicesParams);\r\n } else {\r\n if (!isUnDefined(data) && !isUnDefined(data.html)) {\r\n this._viewModalBody.html(data.html);\r\n }\r\n _this.afterViewShow(sender,wfAction);\r\n }\r\n\r\n } \r\n\r\n public afterSubmitSuccess(result: SaopWfSubmitResult): void {\r\n global.ConsoleLogDegug(\"submit.afterExecuteSuccess\");\r\n }\r\n\r\n public onSubmitSuccessComplete(result: SaopWfSubmitResult): void {\r\n global.ConsoleLogDegug(\"submit.onSubmitSuccessComplete\");\r\n }\r\n\r\n public onSubmitError(result: SaopWfSubmitResult): void {\r\n global.ConsoleLogDegug(\"submit.onSubmitError\");\r\n }\r\n\r\n public onSubmitFailure(result: any): void {\r\n global.ConsoleLogDegug(\"submit.onSubmitFailure\");\r\n var saopServicesCore = new SaopServicesCore();\r\n saopServicesCore.handleSubmitError(result);\r\n }\r\n \r\n public onSubmitSuccess(result: SaopWfSubmitResult): void {\r\n global.ConsoleLogDegug(\"submit.onExecuteSuccess\");\r\n if (result.success) {\r\n global.ConsoleLogDegug(\"submit.success\");\r\n\r\n this._viewModalFrame.modal('hide');\r\n\r\n // just in case: odstrani, če je še vedno vidno, avtomatsko se ne zapre vedno :(\r\n $('.modal-backdrop').remove();\r\n $(document.body).removeClass(\"modal-open\");\r\n\r\n if (result.alertMessage) {\r\n alertify.message(result.alertMessage);\r\n } \r\n\r\n if (!isUnDefined(this.refreshData)){\r\n this.refreshData(result);\r\n }\r\n\r\n this.onSubmitSuccessComplete(result);\r\n } else {\r\n global.ConsoleLogDegug(\"submit.error\");\r\n global.ConsoleLogDegug(\"reload view form\");\r\n this._viewModalBody.html(result.viewContent);\r\n this.bindViewEvents(result);\r\n }\r\n this.afterSubmitSuccess(result);\r\n } \r\n\r\n public onDeleteRecord(deleteData:any):void {\r\n global.ConsoleLogDegug(\"onDeleteRecord\");\r\n let _this = this;\r\n this._servicesParams = {action:this.deleteRecordEndpoint,data:deleteData,type:\"POST\"};\r\n\r\n this.saopServicesCore.afterSuccess = function(_ajaxResult){\r\n if (_ajaxResult.response == SaopServicesCoreResult.success){\r\n alertify.message(_ajaxResult.data.alertMessage);\r\n if (!isUnDefined(_this.refreshData)){\r\n _this.refreshData(deleteData);\r\n }\r\n } else {\r\n alertify.error(_ajaxResult.data.alertMessage);\r\n }\r\n };\r\n this.saopServicesCore.ExecuteAction(this._servicesParams);\r\n\r\n // let _ajaxResult = this.saopServicesCore.ExecuteAction(this._servicesParams);\r\n // if (_ajaxResult.response == SaopServicesCoreResult.success){\r\n // alertify.message(_ajaxResult.data.alertMessage);\r\n // if (!isUnDefined(this.refreshData)){\r\n // this.refreshData(deleteData);\r\n // }\r\n // } else {\r\n // alertify.error(_ajaxResult.data.alertMessage);\r\n // }\r\n // return _ajaxResult.response;\r\n }\r\n \r\n public refreshData(sender:any):void {\r\n global.ConsoleLogDegug(\"refreshData\");\r\n }\r\n\r\n public deleteRecord(title:string,message:string,deleteData:any):void{\r\n global.ConsoleLogDegug(\"deleteRecord.begin\");\r\n let saopMessageDlg = new SaopMessageDlg(deleteData) \r\n saopMessageDlg.onYes = this.onDeleteRecord.bind(this);\r\n saopMessageDlg.Show(message,title,1,[SaopMsgDlgButton.mbYes,SaopMsgDlgButton.mbNo]);\r\n global.ConsoleLogDegug(\"deleteRecord.end\");\r\n }\r\n\r\n public addRecord(data:any,sender:any = null):void {\r\n global.ConsoleLogDegug(\"addRecord\");\r\n this._data = data;\r\n let _result = this.loadViewBody(SaopWfAction.wfaAddRecord,data,sender);\r\n }\r\n\r\n public editRecord(data:any,sender:any = null):void {\r\n global.ConsoleLogDegug(\"editRecord\");\r\n this._data = data;\r\n this.loadViewBody(SaopWfAction.wfaEditRecord,data,sender);\r\n }\r\n\r\n public recordDetails(data:any,sender:any = null):void {\r\n global.ConsoleLogDegug(\"editRecord\");\r\n this._data = data;\r\n this.loadViewBody(SaopWfAction.wfaRecordDestails,data,sender);\r\n }\r\n\r\n public custonHtmlBody(data:any,sender:any = null):void {\r\n global.ConsoleLogDegug(\"custonHtmlBody\");\r\n this._data = data;\r\n this.loadViewBody(SaopWfAction.wfaCustomHtml,data,sender);\r\n }\r\n\r\n // public recordPreview(data:any,sender:any = null):void {\r\n // global.ConsoleLogDegug(\"editRecord\");\r\n // this.loadViewBody(SaopWfAction.wfaPrepareView,data,sender);\r\n // } \r\n\r\n public showViewForm(wfAction:SaopWfAction,data:any,sender:any = null):void{\r\n global.ConsoleLogDegug(\"showViewForm\");\r\n this._data = data;\r\n if (wfAction == SaopWfAction.wfaAddRecord) {\r\n this.addRecord(data,sender);\r\n } else if (wfAction == SaopWfAction.wfaEditRecord) {\r\n this.editRecord(data,sender);\r\n } else if (wfAction == SaopWfAction.wfaRecordDestails) { \r\n this.recordDetails(data,sender); \r\n } else if (wfAction == SaopWfAction.wfaCustomHtml) {\r\n this.custonHtmlBody(data,sender); \r\n } \r\n this.SetToFullScreen(); \r\n } \r\n\r\n public prepareViewForm(wfAction:SaopWfAction,data:any,sender:any = null):void{\r\n global.ConsoleLogDegug(\"showViewForm\");\r\n this._data = data;\r\n this._prepareView = true;\r\n if (wfAction == SaopWfAction.wfaAddRecord) {\r\n this.addRecord(data,sender);\r\n } else if (wfAction == SaopWfAction.wfaEditRecord) {\r\n this.editRecord(data,sender);\r\n } else if (wfAction == SaopWfAction.wfaRecordDestails) { \r\n this.recordDetails(data,sender); \r\n } else if (wfAction == SaopWfAction.wfaCustomHtml) {\r\n this.custonHtmlBody(data,sender); \r\n } \r\n\r\n this.SetToFullScreen(); \r\n } \r\n\r\n public SetToFullScreen(){\r\n if (this.fullScreen ){\r\n this._viewModalFrame.addClass(\"saop-modal-fullscreen-form\");\r\n let _dialogDiv = this._viewModalFrame.find(\".modal-dialog\");\r\n _dialogDiv.removeClass('modal-dialog-centered');\r\n _dialogDiv.addClass('modal-fullscreen');\r\n _dialogDiv.removeAttr('style');\r\n \r\n let _content = this._viewModalFrame.find(\".modal-content\");\r\n _content.removeAttr('class');\r\n _content.addClass('modal-content');\r\n }\r\n }\r\n\r\n public refreshElementData(htmlContent:string,elementId:string): void {\r\n global.ConsoleLogDegug(\"refreshElementData\");\r\n let _document = $(htmlContent);\r\n let _cell = _document.find(elementId);\r\n $(elementId).replaceWith(_cell);\r\n }\r\n\r\n public CloseViewForm(): void {\r\n this._viewModalFrame.modal('hide');\r\n // just in case: odstrani, če je še vedno vidno, avtomatsko se ne zapre vedno :(\r\n $('.modal-backdrop').remove();\r\n $(document.body).removeClass(\"modal-open\"); \r\n }\r\n\r\n public showModal():void {\r\n if (this._prepareView == false){\r\n this._viewModalFrame.modal('show');\r\n setModalFormZIndex(this.id); \r\n setFirstFormControlToFocus(this.id);\r\n } \r\n }\r\n \r\n // \r\n}\r\n","import { global, setFirstFormControlToFocus } from \"./Common/saop-common\";\r\nimport { SaopUtils } from \"./Core/saop-utils\";\r\nimport { SaopTogglePanel } from \"./Components/saop-toggle-panel\";\r\nimport { SaopInputMask } from \"./Components/saop-inputmask\";\r\nimport { SaopCheckboxSwitch } from \"./Components/saop-checkbox-switch\";\r\nimport { SaopMultiselect } from \"./Components/saop-multiselect\";\r\nimport { SaopViewSpinner } from './Components/saop-view-spinner';\r\nimport { SaopRightSidebar } from './Components/saop-right-sidebar';\r\nimport { SaopCalendar } from \"./Components/saop-calendar\";\r\nimport { MenuSidebar } from \"./Components/saop-menu-sidebar\";\r\nimport { SaopMessageDlg } from \"./Components/saop-message-dlg\";\r\nimport { SaopPopupDialog } from './Components/saop-popup-dialog'\r\nimport { SaopFloatingLabel } from \"./Components/saop-floating-label\";\r\nimport { SaopRegView } from \"./REG/saop-regUra-view\";\r\nimport { SaopRegUraDanView } from \"./REG/saop-regUraDan-view\"\r\nimport { SaopRegUraDogodekView } from \"./REG/saop-regUraDogodek-view\";\r\nimport { SaopRegAbsenceEventsView } from \"./REG/saop-regAbsenceEvents-view\";\r\nimport { SaopRegTodayEventsView } from \"./REG/saop-regTodayEvents-view\";\r\nimport { SaopDashboardView } from \"./Dashboard/saop-dashboard-view\";\r\nimport { SaopRegAttendanceView } from './REG/saop-regAttendance-view';\r\nimport { SaopAbsenceConfirmationView } from './AbsenceConfirmation/saop-absenceConfirmation-view';\r\nimport { SaopAbsenceConfirmationPendingView } from \"./AbsenceConfirmation/saop-absenceConfirmation-pending-view\";\r\nimport { SaopAbsenceConfirmationProcessedView } from \"./AbsenceConfirmation/saop-absenceConfirmation-processed-view\";\r\nimport { SaopAbsenceConfirmationCalendarView } from \"./AbsenceConfirmation/saop-absenceConfirmationCalendar-view\";\r\nimport { SaopSplDocumentView } from \"./SPLDocument/saop-splDocument-view\";\r\nimport { SaopAbsenceConfirmationDetailsEvents } from \"./AbsenceConfirmation/saop-absenceConfirmation-details-events\";\r\nimport { SaopAbsenceConfirmationPartiallyApproveView } from \"./AbsenceConfirmation/saop-absenceConfirmation-partially-approve-view\";\r\nimport { OPNPotniNalogiGrid } from \"./OPN/OPNPotniNalogi-grid\";\r\nimport { OPNPotniNalogiArhivGrid } from \"./OPN/OPNPotniNalogiArhiv-grid\";\r\nimport { OPNPotniNalogiAllGrid } from \"./OPN/OPNPotniNalogiAll-grid\";\r\nimport { SaopSettingsView } from \"./Settings/saop-settings-view\";\r\nimport { SaopRegAbsenceMainView } from \"./REG/saop-regAbsenceMain-view\";\r\nimport { SaopOrganigramView } from \"./Organization/saop-organigram-view\";\r\nimport { SaopRegAttendanceAllEmployeesView } from './REG/saop-regAttendanceAllEmployees-view';\r\nimport { SaopChangePwdView } from './Account/saop-change-pwd-view';\r\nimport { NDKInternalOrders } from \"./NDK/NDKInternalOrders\";\r\nimport { NDKInternalOrderEditForm } from \"./NDK/NDKInternalOrderEditForm\";\r\nimport { KeEployeeLeaveListGrid } from './AbsenceConfirmation/saop-employeeLeaveList-grid'\r\nimport { KEMyGrades } from './KE/KEMyGrades';\r\nimport { KEMyGradeDetails } from './KE/KEMyGradeDetails';\r\nimport { KEGradesPeriod } from './KE/KEGradesPeriod';\r\nimport { SaopGoogleMaps } from './Components/saop-googlemaps';\r\nimport { SaopRegAttendanceAllEmployeesAnalysisView } from \"./REG/saop-regAttendanceAllEmployeesAnalysis-view\";\r\nimport { LIKVCakalnaVrstaGrid } from \"./LIKV/LIKVCakalnaVrsta-grid\";\r\nimport { LIKVCakalnaVrstaView } from \"./LIKV/LIKVCakalnaVrsta-view\";\r\nimport { SaopAppSettingsView } from \"./AppSettings/saop-appsettings-view\";\r\nimport { LIKVCakalnaVrstaArhivGrid } from \"./LIKV/LIKVCakalnaVrstaArhiv-grid\";\r\nimport { SaopRegAttendanceAllEmployeesExcessHoursGrid } from \"./REG/saop-regAttendanceAllEmployeesExcessHours-grid\";\r\nimport { LIKVNivojiPotrjevanjaGrid } from \"./LIKV/LIKVNivojiPotrjevanja-grid\";\r\n\r\n/*import { extend } from \"jquery\";*/\r\n\r\nexport function checkCompatibility(): boolean {\r\n global.ConsoleLogDegug(\"checkCompatibility\");\r\n let utils = new SaopUtils();\r\n return utils.checkCompatibility();\r\n}\r\n\r\nexport function initClientLogModeValue() {\r\n global.debugMode = global.GetClientLogModeStorageValue();\r\n}\r\n\r\nexport function initSiteBaseUrlValue() {\r\n global.siteBaseUrl = global.getSiteBaseUrl()\r\n}\r\n\r\nexport function initializeSiteJS() {\r\n global.ConsoleLogDegug(\"initializeSiteJS\");\r\n //new MenuSidebar().init();\r\n new SaopTogglePanel().init();\r\n\r\n document.addEventListener('keydown', function (e) {\r\n if (e.ctrlKey && e.altKey && e.keyCode == 79) {\r\n // CTRL + ALT + O\r\n global.SetClientLogModeStorageValue();\r\n global.debugMode = global.GetClientLogModeStorageValue();\r\n }\r\n });\r\n\r\n global.setHelpLink();\r\n}\r\n\r\nexport function setFirstControlToFocus(formId: string) {\r\n setFirstFormControlToFocus(formId);\r\n}\r\n\r\nexport class SaopTogglePanelEx extends SaopTogglePanel{};\r\n\r\nexport class SaopInputMaskEx extends SaopInputMask{};\r\n\r\nexport class SaopCheckboxSwitchEx extends SaopCheckboxSwitch{};\r\n\r\nexport class SaopMultiselectEx extends SaopMultiselect{};\r\n\r\nexport class SaopCalendarEx extends SaopCalendar{};\r\n\r\nexport class SaopMessageDlgEx extends SaopMessageDlg{};\r\n\r\nexport class SaopPopupDialogEx extends SaopPopupDialog{};\r\n\r\nexport class SaopRegViewEx extends SaopRegView{};\r\n\r\nexport class SaopRegUraDanViewEx extends SaopRegUraDanView{};\r\n\r\nexport class SaopRegUraDogodekViewEx extends SaopRegUraDogodekView{};\r\n\r\nexport class SaopRegAbsenceEventsViewEx extends SaopRegAbsenceEventsView { };\r\n\r\nexport class SaopRegTodayEventsViewEx extends SaopRegTodayEventsView { };\r\n\r\nexport class SaopDashboardViewEx extends SaopDashboardView { };\r\n\r\nexport class SaopViewSpinnerEX extends SaopViewSpinner { };\r\n\r\nexport class SaopRightSidebarEx extends SaopRightSidebar { };\r\n\r\nexport class SaopRegAttendanceViewEx extends SaopRegAttendanceView { };\r\n\r\nexport class SaopAbsenceConfirmationViewEx extends SaopAbsenceConfirmationView { };\r\n\r\nexport class SaopAbsenceConfirmationPendingViewEx extends SaopAbsenceConfirmationPendingView { }; \r\n\r\nexport class SaopAbsenceConfirmationProcessedViewEx extends SaopAbsenceConfirmationProcessedView { };\r\n\r\nexport class SaopAbsenceConfirmationCalendarViewEx extends SaopAbsenceConfirmationCalendarView { };\r\n\r\nexport class SaopSplDocumentViewEx extends SaopSplDocumentView { };\r\n\r\nexport class SaopAbsenceConfirmationDetailsEventsEx extends SaopAbsenceConfirmationDetailsEvents { };\r\n\r\nexport class SaopAbsenceConfirmationPartiallyApproveViewEx extends SaopAbsenceConfirmationPartiallyApproveView { };\r\n\r\nexport class OPNPotniNalogiGridEx extends OPNPotniNalogiGrid { };\r\n\r\nexport class OPNPotniNalogiGridArhivEx extends OPNPotniNalogiArhivGrid { };\r\n\r\nexport class OPNPotniNalogiAllGridEx extends OPNPotniNalogiAllGrid { };\r\n\r\nexport class SaopFloatingLabelEx extends SaopFloatingLabel { };\r\n\r\nexport class SaopSettingsViewEx extends SaopSettingsView { };\r\n\r\nexport class SaopRegAbsenceMainViewEx extends SaopRegAbsenceMainView { };\r\n\r\nexport class SaopOrganigramViewEx extends SaopOrganigramView { };\r\n\r\nexport class SaopRegAttendanceAllEmployeesViewEx extends SaopRegAttendanceAllEmployeesView { };\r\n\r\nexport class SaopChangePwdViewEx extends SaopChangePwdView { };\r\n\r\nexport class NDKInternalOrdersEx extends NDKInternalOrders { };\r\n\r\nexport class NDKInternalOrderEditFormEx extends NDKInternalOrderEditForm { };\r\n\r\nexport class KeEployeeLeaveListGridEx extends KeEployeeLeaveListGrid { };\r\n\r\nexport class KEMyGradesEx extends KEMyGrades { }\r\n\r\nexport class KEMyGradeDetailsEx extends KEMyGradeDetails { };\r\n\r\nexport class KEGradesPeriodEx extends KEGradesPeriod { };\r\n\r\nexport class SaopGoogleMapsEx extends SaopGoogleMaps { };\r\n\r\nexport class SaopRegAttendanceAllEmployeesAnalysisViewEx extends SaopRegAttendanceAllEmployeesAnalysisView { };\r\n\r\nexport class LIKVCakalnaVrstaGridEx extends LIKVCakalnaVrstaGrid {};\r\n\r\nexport class LIKVCakalnaVrstaViewEx extends LIKVCakalnaVrstaView {};\r\n\r\nexport class SaopAppSettingsViewEx extends SaopAppSettingsView {};\r\n\r\nexport class LIKVCakalnaVrstaGridArhivEx extends LIKVCakalnaVrstaArhivGrid { };\r\n\r\nexport class SaopRegAttendanceAllEmployeesExcessHoursGridEx extends SaopRegAttendanceAllEmployeesExcessHoursGrid { };\r\n\r\nexport class mojInfoMenuSidebarEx extends MenuSidebar { };\r\n\r\nexport class LIKVNivojiPotrjevanjaGridEx extends LIKVNivojiPotrjevanjaGrid { };\r\n//","import { global, getRelativeSiteURL, getSiteAbsoluteURL, isEmpty, isUnDefined } from \"../Common/saop-common\";\r\nimport { SaopViewForm } from \"../Core/saop-view-form\";\r\nimport { SaopMultiselect } from \"../Components/saop-multiselect\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\n\r\nexport class OPNSelectPassengersView extends SaopViewForm {\r\n private _selectZaposleni: SaopMultiselect;\r\n\r\n constructor(viewId:string,libName:string = \"\"){\r\n global.ConsoleLogDegug(\"OPNPotniNalogiGoggleMapsView\");\r\n super(viewId,libName);\r\n this.setDictionary(); \r\n this.addRecordEndpoint = \"\";\r\n this.editRecordEndpoint = \"TravelOrder/GetSelectPassengersView\";\r\n this.deleteRecordEndpoint = \"\"; \r\n this.fullScreen = true;\r\n this.fullTitle = this.translationService.translate(\"Nov vnos: Sopotnik\");\r\n this.fullScreen = false;\r\n //\r\n this.afterViewShowSuccess = this.afterViewShowSuccessExt.bind(this); \r\n //\r\n this._selectZaposleni = new SaopMultiselect(libName+\"._selectZaposleni\",{selectAll:false,selectAllOption:false,inputWidthPX:'260px'});\r\n this._selectZaposleni.afterChangeCommonEvent = this.refreshSelectedEmployeesList.bind(this);\r\n }\r\n\r\n setDictionary(){\r\n let dictionary:string[] = [\"Nov vnos: Sopotnik\"];\r\n this.setTerminologyList(dictionary);\r\n} \r\n\r\n public bindRemoveButtonEvents ():void{\r\n let _this = this;\r\n //\r\n $(this.id).find('.saop-remove-item-event').off('click');\r\n $(this.id).find('.saop-remove-item-event').bind('click', \r\n function(row) {\r\n global.ConsoleLogDegug(\".saop-remove-item-event.click\");\r\n // //\r\n let _btnRemove = row.currentTarget;\r\n let _sifrazaposleni = _btnRemove.getAttribute(\"data-sifrazaposleni\");\r\n //\r\n _this._selectZaposleni.unsetSelectValues([_sifrazaposleni]);\r\n } \r\n ); \r\n\r\n }\r\n\r\n public afterViewShowSuccessExt(sender:any):void{\r\n global.ConsoleLogDegug(this.id + \".afterViewShowSuccessExt()\");\r\n this._selectZaposleni.init(\"#opnModel_SelectedEmployees\", \"Zaposleni\"); \r\n } \r\n \r\n public refreshSelectedEmployeesList():void {\r\n global.ConsoleLogDegug(\"regreshSelectedEmployeesList\");\r\n\r\n let _selectedEmployeesList = $(this.id).find(\"#opnModel_SelectedEmployees\").val() as [any];\r\n //\r\n $(this.id).find(\"#SelectedEmployeesList\").val(_selectedEmployeesList);\r\n //\r\n var myJsonString = JSON.stringify(_selectedEmployeesList);\r\n this.refreshLinksData(myJsonString);\r\n //\r\n }\r\n\r\n refreshLinksData(jsonEmployeesList:string):void {\r\n global.ConsoleLogDegug(\"refreshLinksData\");\r\n let _this = this;\r\n\r\n let _data = this.getData();\r\n Object.assign(_data, {\"jsonEmployeesList\":jsonEmployeesList});\r\n\r\n let _saopServicesCore = new SaopServicesCore();\r\n _saopServicesCore.afterDone = function(response){\r\n $(_this.id).find(\"#SelectedEmployeesListAjax\").html(response);\r\n _this.bindRemoveButtonEvents();\r\n };\r\n _saopServicesCore.ExecuteAction({\r\n action:\"TravelOrder/GetLinks\" \r\n ,data: _data\r\n ,type:\"GET\"\r\n }); \r\n }\r\n\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","//! moment.js\n//! version : 2.30.1\n//! authors : Tim Wood, Iskren Chernev, Moment.js contributors\n//! license : MIT\n//! momentjs.com\n\n;(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n global.moment = factory()\n}(this, (function () { 'use strict';\n\n var hookCallback;\n\n function hooks() {\n return hookCallback.apply(null, arguments);\n }\n\n // This is done to register the method called with moment()\n // without creating circular dependencies.\n function setHookCallback(callback) {\n hookCallback = callback;\n }\n\n function isArray(input) {\n return (\n input instanceof Array ||\n Object.prototype.toString.call(input) === '[object Array]'\n );\n }\n\n function isObject(input) {\n // IE8 will treat undefined and null as object if it wasn't for\n // input != null\n return (\n input != null &&\n Object.prototype.toString.call(input) === '[object Object]'\n );\n }\n\n function hasOwnProp(a, b) {\n return Object.prototype.hasOwnProperty.call(a, b);\n }\n\n function isObjectEmpty(obj) {\n if (Object.getOwnPropertyNames) {\n return Object.getOwnPropertyNames(obj).length === 0;\n } else {\n var k;\n for (k in obj) {\n if (hasOwnProp(obj, k)) {\n return false;\n }\n }\n return true;\n }\n }\n\n function isUndefined(input) {\n return input === void 0;\n }\n\n function isNumber(input) {\n return (\n typeof input === 'number' ||\n Object.prototype.toString.call(input) === '[object Number]'\n );\n }\n\n function isDate(input) {\n return (\n input instanceof Date ||\n Object.prototype.toString.call(input) === '[object Date]'\n );\n }\n\n function map(arr, fn) {\n var res = [],\n i,\n arrLen = arr.length;\n for (i = 0; i < arrLen; ++i) {\n res.push(fn(arr[i], i));\n }\n return res;\n }\n\n function extend(a, b) {\n for (var i in b) {\n if (hasOwnProp(b, i)) {\n a[i] = b[i];\n }\n }\n\n if (hasOwnProp(b, 'toString')) {\n a.toString = b.toString;\n }\n\n if (hasOwnProp(b, 'valueOf')) {\n a.valueOf = b.valueOf;\n }\n\n return a;\n }\n\n function createUTC(input, format, locale, strict) {\n return createLocalOrUTC(input, format, locale, strict, true).utc();\n }\n\n function defaultParsingFlags() {\n // We need to deep clone this object.\n return {\n empty: false,\n unusedTokens: [],\n unusedInput: [],\n overflow: -2,\n charsLeftOver: 0,\n nullInput: false,\n invalidEra: null,\n invalidMonth: null,\n invalidFormat: false,\n userInvalidated: false,\n iso: false,\n parsedDateParts: [],\n era: null,\n meridiem: null,\n rfc2822: false,\n weekdayMismatch: false,\n };\n }\n\n function getParsingFlags(m) {\n if (m._pf == null) {\n m._pf = defaultParsingFlags();\n }\n return m._pf;\n }\n\n var some;\n if (Array.prototype.some) {\n some = Array.prototype.some;\n } else {\n some = function (fun) {\n var t = Object(this),\n len = t.length >>> 0,\n i;\n\n for (i = 0; i < len; i++) {\n if (i in t && fun.call(this, t[i], i, t)) {\n return true;\n }\n }\n\n return false;\n };\n }\n\n function isValid(m) {\n var flags = null,\n parsedParts = false,\n isNowValid = m._d && !isNaN(m._d.getTime());\n if (isNowValid) {\n flags = getParsingFlags(m);\n parsedParts = some.call(flags.parsedDateParts, function (i) {\n return i != null;\n });\n isNowValid =\n flags.overflow < 0 &&\n !flags.empty &&\n !flags.invalidEra &&\n !flags.invalidMonth &&\n !flags.invalidWeekday &&\n !flags.weekdayMismatch &&\n !flags.nullInput &&\n !flags.invalidFormat &&\n !flags.userInvalidated &&\n (!flags.meridiem || (flags.meridiem && parsedParts));\n if (m._strict) {\n isNowValid =\n isNowValid &&\n flags.charsLeftOver === 0 &&\n flags.unusedTokens.length === 0 &&\n flags.bigHour === undefined;\n }\n }\n if (Object.isFrozen == null || !Object.isFrozen(m)) {\n m._isValid = isNowValid;\n } else {\n return isNowValid;\n }\n return m._isValid;\n }\n\n function createInvalid(flags) {\n var m = createUTC(NaN);\n if (flags != null) {\n extend(getParsingFlags(m), flags);\n } else {\n getParsingFlags(m).userInvalidated = true;\n }\n\n return m;\n }\n\n // Plugins that add properties should also add the key here (null value),\n // so we can properly clone ourselves.\n var momentProperties = (hooks.momentProperties = []),\n updateInProgress = false;\n\n function copyConfig(to, from) {\n var i,\n prop,\n val,\n momentPropertiesLen = momentProperties.length;\n\n if (!isUndefined(from._isAMomentObject)) {\n to._isAMomentObject = from._isAMomentObject;\n }\n if (!isUndefined(from._i)) {\n to._i = from._i;\n }\n if (!isUndefined(from._f)) {\n to._f = from._f;\n }\n if (!isUndefined(from._l)) {\n to._l = from._l;\n }\n if (!isUndefined(from._strict)) {\n to._strict = from._strict;\n }\n if (!isUndefined(from._tzm)) {\n to._tzm = from._tzm;\n }\n if (!isUndefined(from._isUTC)) {\n to._isUTC = from._isUTC;\n }\n if (!isUndefined(from._offset)) {\n to._offset = from._offset;\n }\n if (!isUndefined(from._pf)) {\n to._pf = getParsingFlags(from);\n }\n if (!isUndefined(from._locale)) {\n to._locale = from._locale;\n }\n\n if (momentPropertiesLen > 0) {\n for (i = 0; i < momentPropertiesLen; i++) {\n prop = momentProperties[i];\n val = from[prop];\n if (!isUndefined(val)) {\n to[prop] = val;\n }\n }\n }\n\n return to;\n }\n\n // Moment prototype object\n function Moment(config) {\n copyConfig(this, config);\n this._d = new Date(config._d != null ? config._d.getTime() : NaN);\n if (!this.isValid()) {\n this._d = new Date(NaN);\n }\n // Prevent infinite loop in case updateOffset creates new moment\n // objects.\n if (updateInProgress === false) {\n updateInProgress = true;\n hooks.updateOffset(this);\n updateInProgress = false;\n }\n }\n\n function isMoment(obj) {\n return (\n obj instanceof Moment || (obj != null && obj._isAMomentObject != null)\n );\n }\n\n function warn(msg) {\n if (\n hooks.suppressDeprecationWarnings === false &&\n typeof console !== 'undefined' &&\n console.warn\n ) {\n console.warn('Deprecation warning: ' + msg);\n }\n }\n\n function deprecate(msg, fn) {\n var firstTime = true;\n\n return extend(function () {\n if (hooks.deprecationHandler != null) {\n hooks.deprecationHandler(null, msg);\n }\n if (firstTime) {\n var args = [],\n arg,\n i,\n key,\n argLen = arguments.length;\n for (i = 0; i < argLen; i++) {\n arg = '';\n if (typeof arguments[i] === 'object') {\n arg += '\\n[' + i + '] ';\n for (key in arguments[0]) {\n if (hasOwnProp(arguments[0], key)) {\n arg += key + ': ' + arguments[0][key] + ', ';\n }\n }\n arg = arg.slice(0, -2); // Remove trailing comma and space\n } else {\n arg = arguments[i];\n }\n args.push(arg);\n }\n warn(\n msg +\n '\\nArguments: ' +\n Array.prototype.slice.call(args).join('') +\n '\\n' +\n new Error().stack\n );\n firstTime = false;\n }\n return fn.apply(this, arguments);\n }, fn);\n }\n\n var deprecations = {};\n\n function deprecateSimple(name, msg) {\n if (hooks.deprecationHandler != null) {\n hooks.deprecationHandler(name, msg);\n }\n if (!deprecations[name]) {\n warn(msg);\n deprecations[name] = true;\n }\n }\n\n hooks.suppressDeprecationWarnings = false;\n hooks.deprecationHandler = null;\n\n function isFunction(input) {\n return (\n (typeof Function !== 'undefined' && input instanceof Function) ||\n Object.prototype.toString.call(input) === '[object Function]'\n );\n }\n\n function set(config) {\n var prop, i;\n for (i in config) {\n if (hasOwnProp(config, i)) {\n prop = config[i];\n if (isFunction(prop)) {\n this[i] = prop;\n } else {\n this['_' + i] = prop;\n }\n }\n }\n this._config = config;\n // Lenient ordinal parsing accepts just a number in addition to\n // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.\n // TODO: Remove \"ordinalParse\" fallback in next major release.\n this._dayOfMonthOrdinalParseLenient = new RegExp(\n (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +\n '|' +\n /\\d{1,2}/.source\n );\n }\n\n function mergeConfigs(parentConfig, childConfig) {\n var res = extend({}, parentConfig),\n prop;\n for (prop in childConfig) {\n if (hasOwnProp(childConfig, prop)) {\n if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {\n res[prop] = {};\n extend(res[prop], parentConfig[prop]);\n extend(res[prop], childConfig[prop]);\n } else if (childConfig[prop] != null) {\n res[prop] = childConfig[prop];\n } else {\n delete res[prop];\n }\n }\n }\n for (prop in parentConfig) {\n if (\n hasOwnProp(parentConfig, prop) &&\n !hasOwnProp(childConfig, prop) &&\n isObject(parentConfig[prop])\n ) {\n // make sure changes to properties don't modify parent config\n res[prop] = extend({}, res[prop]);\n }\n }\n return res;\n }\n\n function Locale(config) {\n if (config != null) {\n this.set(config);\n }\n }\n\n var keys;\n\n if (Object.keys) {\n keys = Object.keys;\n } else {\n keys = function (obj) {\n var i,\n res = [];\n for (i in obj) {\n if (hasOwnProp(obj, i)) {\n res.push(i);\n }\n }\n return res;\n };\n }\n\n var defaultCalendar = {\n sameDay: '[Today at] LT',\n nextDay: '[Tomorrow at] LT',\n nextWeek: 'dddd [at] LT',\n lastDay: '[Yesterday at] LT',\n lastWeek: '[Last] dddd [at] LT',\n sameElse: 'L',\n };\n\n function calendar(key, mom, now) {\n var output = this._calendar[key] || this._calendar['sameElse'];\n return isFunction(output) ? output.call(mom, now) : output;\n }\n\n function zeroFill(number, targetLength, forceSign) {\n var absNumber = '' + Math.abs(number),\n zerosToFill = targetLength - absNumber.length,\n sign = number >= 0;\n return (\n (sign ? (forceSign ? '+' : '') : '-') +\n Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) +\n absNumber\n );\n }\n\n var formattingTokens =\n /(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,\n localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g,\n formatFunctions = {},\n formatTokenFunctions = {};\n\n // token: 'M'\n // padded: ['MM', 2]\n // ordinal: 'Mo'\n // callback: function () { this.month() + 1 }\n function addFormatToken(token, padded, ordinal, callback) {\n var func = callback;\n if (typeof callback === 'string') {\n func = function () {\n return this[callback]();\n };\n }\n if (token) {\n formatTokenFunctions[token] = func;\n }\n if (padded) {\n formatTokenFunctions[padded[0]] = function () {\n return zeroFill(func.apply(this, arguments), padded[1], padded[2]);\n };\n }\n if (ordinal) {\n formatTokenFunctions[ordinal] = function () {\n return this.localeData().ordinal(\n func.apply(this, arguments),\n token\n );\n };\n }\n }\n\n function removeFormattingTokens(input) {\n if (input.match(/\\[[\\s\\S]/)) {\n return input.replace(/^\\[|\\]$/g, '');\n }\n return input.replace(/\\\\/g, '');\n }\n\n function makeFormatFunction(format) {\n var array = format.match(formattingTokens),\n i,\n length;\n\n for (i = 0, length = array.length; i < length; i++) {\n if (formatTokenFunctions[array[i]]) {\n array[i] = formatTokenFunctions[array[i]];\n } else {\n array[i] = removeFormattingTokens(array[i]);\n }\n }\n\n return function (mom) {\n var output = '',\n i;\n for (i = 0; i < length; i++) {\n output += isFunction(array[i])\n ? array[i].call(mom, format)\n : array[i];\n }\n return output;\n };\n }\n\n // format date using native date object\n function formatMoment(m, format) {\n if (!m.isValid()) {\n return m.localeData().invalidDate();\n }\n\n format = expandFormat(format, m.localeData());\n formatFunctions[format] =\n formatFunctions[format] || makeFormatFunction(format);\n\n return formatFunctions[format](m);\n }\n\n function expandFormat(format, locale) {\n var i = 5;\n\n function replaceLongDateFormatTokens(input) {\n return locale.longDateFormat(input) || input;\n }\n\n localFormattingTokens.lastIndex = 0;\n while (i >= 0 && localFormattingTokens.test(format)) {\n format = format.replace(\n localFormattingTokens,\n replaceLongDateFormatTokens\n );\n localFormattingTokens.lastIndex = 0;\n i -= 1;\n }\n\n return format;\n }\n\n var defaultLongDateFormat = {\n LTS: 'h:mm:ss A',\n LT: 'h:mm A',\n L: 'MM/DD/YYYY',\n LL: 'MMMM D, YYYY',\n LLL: 'MMMM D, YYYY h:mm A',\n LLLL: 'dddd, MMMM D, YYYY h:mm A',\n };\n\n function longDateFormat(key) {\n var format = this._longDateFormat[key],\n formatUpper = this._longDateFormat[key.toUpperCase()];\n\n if (format || !formatUpper) {\n return format;\n }\n\n this._longDateFormat[key] = formatUpper\n .match(formattingTokens)\n .map(function (tok) {\n if (\n tok === 'MMMM' ||\n tok === 'MM' ||\n tok === 'DD' ||\n tok === 'dddd'\n ) {\n return tok.slice(1);\n }\n return tok;\n })\n .join('');\n\n return this._longDateFormat[key];\n }\n\n var defaultInvalidDate = 'Invalid date';\n\n function invalidDate() {\n return this._invalidDate;\n }\n\n var defaultOrdinal = '%d',\n defaultDayOfMonthOrdinalParse = /\\d{1,2}/;\n\n function ordinal(number) {\n return this._ordinal.replace('%d', number);\n }\n\n var defaultRelativeTime = {\n future: 'in %s',\n past: '%s ago',\n s: 'a few seconds',\n ss: '%d seconds',\n m: 'a minute',\n mm: '%d minutes',\n h: 'an hour',\n hh: '%d hours',\n d: 'a day',\n dd: '%d days',\n w: 'a week',\n ww: '%d weeks',\n M: 'a month',\n MM: '%d months',\n y: 'a year',\n yy: '%d years',\n };\n\n function relativeTime(number, withoutSuffix, string, isFuture) {\n var output = this._relativeTime[string];\n return isFunction(output)\n ? output(number, withoutSuffix, string, isFuture)\n : output.replace(/%d/i, number);\n }\n\n function pastFuture(diff, output) {\n var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\n return isFunction(format) ? format(output) : format.replace(/%s/i, output);\n }\n\n var aliases = {\n D: 'date',\n dates: 'date',\n date: 'date',\n d: 'day',\n days: 'day',\n day: 'day',\n e: 'weekday',\n weekdays: 'weekday',\n weekday: 'weekday',\n E: 'isoWeekday',\n isoweekdays: 'isoWeekday',\n isoweekday: 'isoWeekday',\n DDD: 'dayOfYear',\n dayofyears: 'dayOfYear',\n dayofyear: 'dayOfYear',\n h: 'hour',\n hours: 'hour',\n hour: 'hour',\n ms: 'millisecond',\n milliseconds: 'millisecond',\n millisecond: 'millisecond',\n m: 'minute',\n minutes: 'minute',\n minute: 'minute',\n M: 'month',\n months: 'month',\n month: 'month',\n Q: 'quarter',\n quarters: 'quarter',\n quarter: 'quarter',\n s: 'second',\n seconds: 'second',\n second: 'second',\n gg: 'weekYear',\n weekyears: 'weekYear',\n weekyear: 'weekYear',\n GG: 'isoWeekYear',\n isoweekyears: 'isoWeekYear',\n isoweekyear: 'isoWeekYear',\n w: 'week',\n weeks: 'week',\n week: 'week',\n W: 'isoWeek',\n isoweeks: 'isoWeek',\n isoweek: 'isoWeek',\n y: 'year',\n years: 'year',\n year: 'year',\n };\n\n function normalizeUnits(units) {\n return typeof units === 'string'\n ? aliases[units] || aliases[units.toLowerCase()]\n : undefined;\n }\n\n function normalizeObjectUnits(inputObject) {\n var normalizedInput = {},\n normalizedProp,\n prop;\n\n for (prop in inputObject) {\n if (hasOwnProp(inputObject, prop)) {\n normalizedProp = normalizeUnits(prop);\n if (normalizedProp) {\n normalizedInput[normalizedProp] = inputObject[prop];\n }\n }\n }\n\n return normalizedInput;\n }\n\n var priorities = {\n date: 9,\n day: 11,\n weekday: 11,\n isoWeekday: 11,\n dayOfYear: 4,\n hour: 13,\n millisecond: 16,\n minute: 14,\n month: 8,\n quarter: 7,\n second: 15,\n weekYear: 1,\n isoWeekYear: 1,\n week: 5,\n isoWeek: 5,\n year: 1,\n };\n\n function getPrioritizedUnits(unitsObj) {\n var units = [],\n u;\n for (u in unitsObj) {\n if (hasOwnProp(unitsObj, u)) {\n units.push({ unit: u, priority: priorities[u] });\n }\n }\n units.sort(function (a, b) {\n return a.priority - b.priority;\n });\n return units;\n }\n\n var match1 = /\\d/, // 0 - 9\n match2 = /\\d\\d/, // 00 - 99\n match3 = /\\d{3}/, // 000 - 999\n match4 = /\\d{4}/, // 0000 - 9999\n match6 = /[+-]?\\d{6}/, // -999999 - 999999\n match1to2 = /\\d\\d?/, // 0 - 99\n match3to4 = /\\d\\d\\d\\d?/, // 999 - 9999\n match5to6 = /\\d\\d\\d\\d\\d\\d?/, // 99999 - 999999\n match1to3 = /\\d{1,3}/, // 0 - 999\n match1to4 = /\\d{1,4}/, // 0 - 9999\n match1to6 = /[+-]?\\d{1,6}/, // -999999 - 999999\n matchUnsigned = /\\d+/, // 0 - inf\n matchSigned = /[+-]?\\d+/, // -inf - inf\n matchOffset = /Z|[+-]\\d\\d:?\\d\\d/gi, // +00:00 -00:00 +0000 -0000 or Z\n matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi, // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/, // 123456789 123456789.123\n // any word (or two) characters or numbers including two/three word month in arabic.\n // includes scottish gaelic two word and hyphenated months\n matchWord =\n /[0-9]{0,256}['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFF07\\uFF10-\\uFFEF]{1,256}|[\\u0600-\\u06FF\\/]{1,256}(\\s*?[\\u0600-\\u06FF]{1,256}){1,2}/i,\n match1to2NoLeadingZero = /^[1-9]\\d?/, // 1-99\n match1to2HasZero = /^([1-9]\\d|\\d)/, // 0-99\n regexes;\n\n regexes = {};\n\n function addRegexToken(token, regex, strictRegex) {\n regexes[token] = isFunction(regex)\n ? regex\n : function (isStrict, localeData) {\n return isStrict && strictRegex ? strictRegex : regex;\n };\n }\n\n function getParseRegexForToken(token, config) {\n if (!hasOwnProp(regexes, token)) {\n return new RegExp(unescapeFormat(token));\n }\n\n return regexes[token](config._strict, config._locale);\n }\n\n // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\n function unescapeFormat(s) {\n return regexEscape(\n s\n .replace('\\\\', '')\n .replace(\n /\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g,\n function (matched, p1, p2, p3, p4) {\n return p1 || p2 || p3 || p4;\n }\n )\n );\n }\n\n function regexEscape(s) {\n return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n }\n\n function absFloor(number) {\n if (number < 0) {\n // -0 -> 0\n return Math.ceil(number) || 0;\n } else {\n return Math.floor(number);\n }\n }\n\n function toInt(argumentForCoercion) {\n var coercedNumber = +argumentForCoercion,\n value = 0;\n\n if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n value = absFloor(coercedNumber);\n }\n\n return value;\n }\n\n var tokens = {};\n\n function addParseToken(token, callback) {\n var i,\n func = callback,\n tokenLen;\n if (typeof token === 'string') {\n token = [token];\n }\n if (isNumber(callback)) {\n func = function (input, array) {\n array[callback] = toInt(input);\n };\n }\n tokenLen = token.length;\n for (i = 0; i < tokenLen; i++) {\n tokens[token[i]] = func;\n }\n }\n\n function addWeekParseToken(token, callback) {\n addParseToken(token, function (input, array, config, token) {\n config._w = config._w || {};\n callback(input, config._w, config, token);\n });\n }\n\n function addTimeToArrayFromToken(token, input, config) {\n if (input != null && hasOwnProp(tokens, token)) {\n tokens[token](input, config._a, config, token);\n }\n }\n\n function isLeapYear(year) {\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n }\n\n var YEAR = 0,\n MONTH = 1,\n DATE = 2,\n HOUR = 3,\n MINUTE = 4,\n SECOND = 5,\n MILLISECOND = 6,\n WEEK = 7,\n WEEKDAY = 8;\n\n // FORMATTING\n\n addFormatToken('Y', 0, 0, function () {\n var y = this.year();\n return y <= 9999 ? zeroFill(y, 4) : '+' + y;\n });\n\n addFormatToken(0, ['YY', 2], 0, function () {\n return this.year() % 100;\n });\n\n addFormatToken(0, ['YYYY', 4], 0, 'year');\n addFormatToken(0, ['YYYYY', 5], 0, 'year');\n addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n // PARSING\n\n addRegexToken('Y', matchSigned);\n addRegexToken('YY', match1to2, match2);\n addRegexToken('YYYY', match1to4, match4);\n addRegexToken('YYYYY', match1to6, match6);\n addRegexToken('YYYYYY', match1to6, match6);\n\n addParseToken(['YYYYY', 'YYYYYY'], YEAR);\n addParseToken('YYYY', function (input, array) {\n array[YEAR] =\n input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);\n });\n addParseToken('YY', function (input, array) {\n array[YEAR] = hooks.parseTwoDigitYear(input);\n });\n addParseToken('Y', function (input, array) {\n array[YEAR] = parseInt(input, 10);\n });\n\n // HELPERS\n\n function daysInYear(year) {\n return isLeapYear(year) ? 366 : 365;\n }\n\n // HOOKS\n\n hooks.parseTwoDigitYear = function (input) {\n return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n };\n\n // MOMENTS\n\n var getSetYear = makeGetSet('FullYear', true);\n\n function getIsLeapYear() {\n return isLeapYear(this.year());\n }\n\n function makeGetSet(unit, keepTime) {\n return function (value) {\n if (value != null) {\n set$1(this, unit, value);\n hooks.updateOffset(this, keepTime);\n return this;\n } else {\n return get(this, unit);\n }\n };\n }\n\n function get(mom, unit) {\n if (!mom.isValid()) {\n return NaN;\n }\n\n var d = mom._d,\n isUTC = mom._isUTC;\n\n switch (unit) {\n case 'Milliseconds':\n return isUTC ? d.getUTCMilliseconds() : d.getMilliseconds();\n case 'Seconds':\n return isUTC ? d.getUTCSeconds() : d.getSeconds();\n case 'Minutes':\n return isUTC ? d.getUTCMinutes() : d.getMinutes();\n case 'Hours':\n return isUTC ? d.getUTCHours() : d.getHours();\n case 'Date':\n return isUTC ? d.getUTCDate() : d.getDate();\n case 'Day':\n return isUTC ? d.getUTCDay() : d.getDay();\n case 'Month':\n return isUTC ? d.getUTCMonth() : d.getMonth();\n case 'FullYear':\n return isUTC ? d.getUTCFullYear() : d.getFullYear();\n default:\n return NaN; // Just in case\n }\n }\n\n function set$1(mom, unit, value) {\n var d, isUTC, year, month, date;\n\n if (!mom.isValid() || isNaN(value)) {\n return;\n }\n\n d = mom._d;\n isUTC = mom._isUTC;\n\n switch (unit) {\n case 'Milliseconds':\n return void (isUTC\n ? d.setUTCMilliseconds(value)\n : d.setMilliseconds(value));\n case 'Seconds':\n return void (isUTC ? d.setUTCSeconds(value) : d.setSeconds(value));\n case 'Minutes':\n return void (isUTC ? d.setUTCMinutes(value) : d.setMinutes(value));\n case 'Hours':\n return void (isUTC ? d.setUTCHours(value) : d.setHours(value));\n case 'Date':\n return void (isUTC ? d.setUTCDate(value) : d.setDate(value));\n // case 'Day': // Not real\n // return void (isUTC ? d.setUTCDay(value) : d.setDay(value));\n // case 'Month': // Not used because we need to pass two variables\n // return void (isUTC ? d.setUTCMonth(value) : d.setMonth(value));\n case 'FullYear':\n break; // See below ...\n default:\n return; // Just in case\n }\n\n year = value;\n month = mom.month();\n date = mom.date();\n date = date === 29 && month === 1 && !isLeapYear(year) ? 28 : date;\n void (isUTC\n ? d.setUTCFullYear(year, month, date)\n : d.setFullYear(year, month, date));\n }\n\n // MOMENTS\n\n function stringGet(units) {\n units = normalizeUnits(units);\n if (isFunction(this[units])) {\n return this[units]();\n }\n return this;\n }\n\n function stringSet(units, value) {\n if (typeof units === 'object') {\n units = normalizeObjectUnits(units);\n var prioritized = getPrioritizedUnits(units),\n i,\n prioritizedLen = prioritized.length;\n for (i = 0; i < prioritizedLen; i++) {\n this[prioritized[i].unit](units[prioritized[i].unit]);\n }\n } else {\n units = normalizeUnits(units);\n if (isFunction(this[units])) {\n return this[units](value);\n }\n }\n return this;\n }\n\n function mod(n, x) {\n return ((n % x) + x) % x;\n }\n\n var indexOf;\n\n if (Array.prototype.indexOf) {\n indexOf = Array.prototype.indexOf;\n } else {\n indexOf = function (o) {\n // I know\n var i;\n for (i = 0; i < this.length; ++i) {\n if (this[i] === o) {\n return i;\n }\n }\n return -1;\n };\n }\n\n function daysInMonth(year, month) {\n if (isNaN(year) || isNaN(month)) {\n return NaN;\n }\n var modMonth = mod(month, 12);\n year += (month - modMonth) / 12;\n return modMonth === 1\n ? isLeapYear(year)\n ? 29\n : 28\n : 31 - ((modMonth % 7) % 2);\n }\n\n // FORMATTING\n\n addFormatToken('M', ['MM', 2], 'Mo', function () {\n return this.month() + 1;\n });\n\n addFormatToken('MMM', 0, 0, function (format) {\n return this.localeData().monthsShort(this, format);\n });\n\n addFormatToken('MMMM', 0, 0, function (format) {\n return this.localeData().months(this, format);\n });\n\n // PARSING\n\n addRegexToken('M', match1to2, match1to2NoLeadingZero);\n addRegexToken('MM', match1to2, match2);\n addRegexToken('MMM', function (isStrict, locale) {\n return locale.monthsShortRegex(isStrict);\n });\n addRegexToken('MMMM', function (isStrict, locale) {\n return locale.monthsRegex(isStrict);\n });\n\n addParseToken(['M', 'MM'], function (input, array) {\n array[MONTH] = toInt(input) - 1;\n });\n\n addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {\n var month = config._locale.monthsParse(input, token, config._strict);\n // if we didn't find a month name, mark the date as invalid.\n if (month != null) {\n array[MONTH] = month;\n } else {\n getParsingFlags(config).invalidMonth = input;\n }\n });\n\n // LOCALES\n\n var defaultLocaleMonths =\n 'January_February_March_April_May_June_July_August_September_October_November_December'.split(\n '_'\n ),\n defaultLocaleMonthsShort =\n 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/,\n defaultMonthsShortRegex = matchWord,\n defaultMonthsRegex = matchWord;\n\n function localeMonths(m, format) {\n if (!m) {\n return isArray(this._months)\n ? this._months\n : this._months['standalone'];\n }\n return isArray(this._months)\n ? this._months[m.month()]\n : this._months[\n (this._months.isFormat || MONTHS_IN_FORMAT).test(format)\n ? 'format'\n : 'standalone'\n ][m.month()];\n }\n\n function localeMonthsShort(m, format) {\n if (!m) {\n return isArray(this._monthsShort)\n ? this._monthsShort\n : this._monthsShort['standalone'];\n }\n return isArray(this._monthsShort)\n ? this._monthsShort[m.month()]\n : this._monthsShort[\n MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'\n ][m.month()];\n }\n\n function handleStrictParse(monthName, format, strict) {\n var i,\n ii,\n mom,\n llc = monthName.toLocaleLowerCase();\n if (!this._monthsParse) {\n // this is not used\n this._monthsParse = [];\n this._longMonthsParse = [];\n this._shortMonthsParse = [];\n for (i = 0; i < 12; ++i) {\n mom = createUTC([2000, i]);\n this._shortMonthsParse[i] = this.monthsShort(\n mom,\n ''\n ).toLocaleLowerCase();\n this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();\n }\n }\n\n if (strict) {\n if (format === 'MMM') {\n ii = indexOf.call(this._shortMonthsParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf.call(this._longMonthsParse, llc);\n return ii !== -1 ? ii : null;\n }\n } else {\n if (format === 'MMM') {\n ii = indexOf.call(this._shortMonthsParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._longMonthsParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf.call(this._longMonthsParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._shortMonthsParse, llc);\n return ii !== -1 ? ii : null;\n }\n }\n }\n\n function localeMonthsParse(monthName, format, strict) {\n var i, mom, regex;\n\n if (this._monthsParseExact) {\n return handleStrictParse.call(this, monthName, format, strict);\n }\n\n if (!this._monthsParse) {\n this._monthsParse = [];\n this._longMonthsParse = [];\n this._shortMonthsParse = [];\n }\n\n // TODO: add sorting\n // Sorting makes sure if one month (or abbr) is a prefix of another\n // see sorting in computeMonthsParse\n for (i = 0; i < 12; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, i]);\n if (strict && !this._longMonthsParse[i]) {\n this._longMonthsParse[i] = new RegExp(\n '^' + this.months(mom, '').replace('.', '') + '$',\n 'i'\n );\n this._shortMonthsParse[i] = new RegExp(\n '^' + this.monthsShort(mom, '').replace('.', '') + '$',\n 'i'\n );\n }\n if (!strict && !this._monthsParse[i]) {\n regex =\n '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n }\n // test the regex\n if (\n strict &&\n format === 'MMMM' &&\n this._longMonthsParse[i].test(monthName)\n ) {\n return i;\n } else if (\n strict &&\n format === 'MMM' &&\n this._shortMonthsParse[i].test(monthName)\n ) {\n return i;\n } else if (!strict && this._monthsParse[i].test(monthName)) {\n return i;\n }\n }\n }\n\n // MOMENTS\n\n function setMonth(mom, value) {\n if (!mom.isValid()) {\n // No op\n return mom;\n }\n\n if (typeof value === 'string') {\n if (/^\\d+$/.test(value)) {\n value = toInt(value);\n } else {\n value = mom.localeData().monthsParse(value);\n // TODO: Another silent failure?\n if (!isNumber(value)) {\n return mom;\n }\n }\n }\n\n var month = value,\n date = mom.date();\n\n date = date < 29 ? date : Math.min(date, daysInMonth(mom.year(), month));\n void (mom._isUTC\n ? mom._d.setUTCMonth(month, date)\n : mom._d.setMonth(month, date));\n return mom;\n }\n\n function getSetMonth(value) {\n if (value != null) {\n setMonth(this, value);\n hooks.updateOffset(this, true);\n return this;\n } else {\n return get(this, 'Month');\n }\n }\n\n function getDaysInMonth() {\n return daysInMonth(this.year(), this.month());\n }\n\n function monthsShortRegex(isStrict) {\n if (this._monthsParseExact) {\n if (!hasOwnProp(this, '_monthsRegex')) {\n computeMonthsParse.call(this);\n }\n if (isStrict) {\n return this._monthsShortStrictRegex;\n } else {\n return this._monthsShortRegex;\n }\n } else {\n if (!hasOwnProp(this, '_monthsShortRegex')) {\n this._monthsShortRegex = defaultMonthsShortRegex;\n }\n return this._monthsShortStrictRegex && isStrict\n ? this._monthsShortStrictRegex\n : this._monthsShortRegex;\n }\n }\n\n function monthsRegex(isStrict) {\n if (this._monthsParseExact) {\n if (!hasOwnProp(this, '_monthsRegex')) {\n computeMonthsParse.call(this);\n }\n if (isStrict) {\n return this._monthsStrictRegex;\n } else {\n return this._monthsRegex;\n }\n } else {\n if (!hasOwnProp(this, '_monthsRegex')) {\n this._monthsRegex = defaultMonthsRegex;\n }\n return this._monthsStrictRegex && isStrict\n ? this._monthsStrictRegex\n : this._monthsRegex;\n }\n }\n\n function computeMonthsParse() {\n function cmpLenRev(a, b) {\n return b.length - a.length;\n }\n\n var shortPieces = [],\n longPieces = [],\n mixedPieces = [],\n i,\n mom,\n shortP,\n longP;\n for (i = 0; i < 12; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, i]);\n shortP = regexEscape(this.monthsShort(mom, ''));\n longP = regexEscape(this.months(mom, ''));\n shortPieces.push(shortP);\n longPieces.push(longP);\n mixedPieces.push(longP);\n mixedPieces.push(shortP);\n }\n // Sorting makes sure if one month (or abbr) is a prefix of another it\n // will match the longer piece.\n shortPieces.sort(cmpLenRev);\n longPieces.sort(cmpLenRev);\n mixedPieces.sort(cmpLenRev);\n\n this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n this._monthsShortRegex = this._monthsRegex;\n this._monthsStrictRegex = new RegExp(\n '^(' + longPieces.join('|') + ')',\n 'i'\n );\n this._monthsShortStrictRegex = new RegExp(\n '^(' + shortPieces.join('|') + ')',\n 'i'\n );\n }\n\n function createDate(y, m, d, h, M, s, ms) {\n // can't just apply() to create a date:\n // https://stackoverflow.com/q/181348\n var date;\n // the date constructor remaps years 0-99 to 1900-1999\n if (y < 100 && y >= 0) {\n // preserve leap years using a full 400 year cycle, then reset\n date = new Date(y + 400, m, d, h, M, s, ms);\n if (isFinite(date.getFullYear())) {\n date.setFullYear(y);\n }\n } else {\n date = new Date(y, m, d, h, M, s, ms);\n }\n\n return date;\n }\n\n function createUTCDate(y) {\n var date, args;\n // the Date.UTC function remaps years 0-99 to 1900-1999\n if (y < 100 && y >= 0) {\n args = Array.prototype.slice.call(arguments);\n // preserve leap years using a full 400 year cycle, then reset\n args[0] = y + 400;\n date = new Date(Date.UTC.apply(null, args));\n if (isFinite(date.getUTCFullYear())) {\n date.setUTCFullYear(y);\n }\n } else {\n date = new Date(Date.UTC.apply(null, arguments));\n }\n\n return date;\n }\n\n // start-of-first-week - start-of-year\n function firstWeekOffset(year, dow, doy) {\n var // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n fwd = 7 + dow - doy,\n // first-week day local weekday -- which local weekday is fwd\n fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;\n\n return -fwdlw + fwd - 1;\n }\n\n // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday\n function dayOfYearFromWeeks(year, week, weekday, dow, doy) {\n var localWeekday = (7 + weekday - dow) % 7,\n weekOffset = firstWeekOffset(year, dow, doy),\n dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,\n resYear,\n resDayOfYear;\n\n if (dayOfYear <= 0) {\n resYear = year - 1;\n resDayOfYear = daysInYear(resYear) + dayOfYear;\n } else if (dayOfYear > daysInYear(year)) {\n resYear = year + 1;\n resDayOfYear = dayOfYear - daysInYear(year);\n } else {\n resYear = year;\n resDayOfYear = dayOfYear;\n }\n\n return {\n year: resYear,\n dayOfYear: resDayOfYear,\n };\n }\n\n function weekOfYear(mom, dow, doy) {\n var weekOffset = firstWeekOffset(mom.year(), dow, doy),\n week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,\n resWeek,\n resYear;\n\n if (week < 1) {\n resYear = mom.year() - 1;\n resWeek = week + weeksInYear(resYear, dow, doy);\n } else if (week > weeksInYear(mom.year(), dow, doy)) {\n resWeek = week - weeksInYear(mom.year(), dow, doy);\n resYear = mom.year() + 1;\n } else {\n resYear = mom.year();\n resWeek = week;\n }\n\n return {\n week: resWeek,\n year: resYear,\n };\n }\n\n function weeksInYear(year, dow, doy) {\n var weekOffset = firstWeekOffset(year, dow, doy),\n weekOffsetNext = firstWeekOffset(year + 1, dow, doy);\n return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;\n }\n\n // FORMATTING\n\n addFormatToken('w', ['ww', 2], 'wo', 'week');\n addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n // PARSING\n\n addRegexToken('w', match1to2, match1to2NoLeadingZero);\n addRegexToken('ww', match1to2, match2);\n addRegexToken('W', match1to2, match1to2NoLeadingZero);\n addRegexToken('WW', match1to2, match2);\n\n addWeekParseToken(\n ['w', 'ww', 'W', 'WW'],\n function (input, week, config, token) {\n week[token.substr(0, 1)] = toInt(input);\n }\n );\n\n // HELPERS\n\n // LOCALES\n\n function localeWeek(mom) {\n return weekOfYear(mom, this._week.dow, this._week.doy).week;\n }\n\n var defaultLocaleWeek = {\n dow: 0, // Sunday is the first day of the week.\n doy: 6, // The week that contains Jan 6th is the first week of the year.\n };\n\n function localeFirstDayOfWeek() {\n return this._week.dow;\n }\n\n function localeFirstDayOfYear() {\n return this._week.doy;\n }\n\n // MOMENTS\n\n function getSetWeek(input) {\n var week = this.localeData().week(this);\n return input == null ? week : this.add((input - week) * 7, 'd');\n }\n\n function getSetISOWeek(input) {\n var week = weekOfYear(this, 1, 4).week;\n return input == null ? week : this.add((input - week) * 7, 'd');\n }\n\n // FORMATTING\n\n addFormatToken('d', 0, 'do', 'day');\n\n addFormatToken('dd', 0, 0, function (format) {\n return this.localeData().weekdaysMin(this, format);\n });\n\n addFormatToken('ddd', 0, 0, function (format) {\n return this.localeData().weekdaysShort(this, format);\n });\n\n addFormatToken('dddd', 0, 0, function (format) {\n return this.localeData().weekdays(this, format);\n });\n\n addFormatToken('e', 0, 0, 'weekday');\n addFormatToken('E', 0, 0, 'isoWeekday');\n\n // PARSING\n\n addRegexToken('d', match1to2);\n addRegexToken('e', match1to2);\n addRegexToken('E', match1to2);\n addRegexToken('dd', function (isStrict, locale) {\n return locale.weekdaysMinRegex(isStrict);\n });\n addRegexToken('ddd', function (isStrict, locale) {\n return locale.weekdaysShortRegex(isStrict);\n });\n addRegexToken('dddd', function (isStrict, locale) {\n return locale.weekdaysRegex(isStrict);\n });\n\n addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {\n var weekday = config._locale.weekdaysParse(input, token, config._strict);\n // if we didn't get a weekday name, mark the date as invalid\n if (weekday != null) {\n week.d = weekday;\n } else {\n getParsingFlags(config).invalidWeekday = input;\n }\n });\n\n addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n week[token] = toInt(input);\n });\n\n // HELPERS\n\n function parseWeekday(input, locale) {\n if (typeof input !== 'string') {\n return input;\n }\n\n if (!isNaN(input)) {\n return parseInt(input, 10);\n }\n\n input = locale.weekdaysParse(input);\n if (typeof input === 'number') {\n return input;\n }\n\n return null;\n }\n\n function parseIsoWeekday(input, locale) {\n if (typeof input === 'string') {\n return locale.weekdaysParse(input) % 7 || 7;\n }\n return isNaN(input) ? null : input;\n }\n\n // LOCALES\n function shiftWeekdays(ws, n) {\n return ws.slice(n, 7).concat(ws.slice(0, n));\n }\n\n var defaultLocaleWeekdays =\n 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n defaultWeekdaysRegex = matchWord,\n defaultWeekdaysShortRegex = matchWord,\n defaultWeekdaysMinRegex = matchWord;\n\n function localeWeekdays(m, format) {\n var weekdays = isArray(this._weekdays)\n ? this._weekdays\n : this._weekdays[\n m && m !== true && this._weekdays.isFormat.test(format)\n ? 'format'\n : 'standalone'\n ];\n return m === true\n ? shiftWeekdays(weekdays, this._week.dow)\n : m\n ? weekdays[m.day()]\n : weekdays;\n }\n\n function localeWeekdaysShort(m) {\n return m === true\n ? shiftWeekdays(this._weekdaysShort, this._week.dow)\n : m\n ? this._weekdaysShort[m.day()]\n : this._weekdaysShort;\n }\n\n function localeWeekdaysMin(m) {\n return m === true\n ? shiftWeekdays(this._weekdaysMin, this._week.dow)\n : m\n ? this._weekdaysMin[m.day()]\n : this._weekdaysMin;\n }\n\n function handleStrictParse$1(weekdayName, format, strict) {\n var i,\n ii,\n mom,\n llc = weekdayName.toLocaleLowerCase();\n if (!this._weekdaysParse) {\n this._weekdaysParse = [];\n this._shortWeekdaysParse = [];\n this._minWeekdaysParse = [];\n\n for (i = 0; i < 7; ++i) {\n mom = createUTC([2000, 1]).day(i);\n this._minWeekdaysParse[i] = this.weekdaysMin(\n mom,\n ''\n ).toLocaleLowerCase();\n this._shortWeekdaysParse[i] = this.weekdaysShort(\n mom,\n ''\n ).toLocaleLowerCase();\n this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();\n }\n }\n\n if (strict) {\n if (format === 'dddd') {\n ii = indexOf.call(this._weekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else if (format === 'ddd') {\n ii = indexOf.call(this._shortWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n }\n } else {\n if (format === 'dddd') {\n ii = indexOf.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._shortWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else if (format === 'ddd') {\n ii = indexOf.call(this._shortWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf.call(this._minWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._shortWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n }\n }\n }\n\n function localeWeekdaysParse(weekdayName, format, strict) {\n var i, mom, regex;\n\n if (this._weekdaysParseExact) {\n return handleStrictParse$1.call(this, weekdayName, format, strict);\n }\n\n if (!this._weekdaysParse) {\n this._weekdaysParse = [];\n this._minWeekdaysParse = [];\n this._shortWeekdaysParse = [];\n this._fullWeekdaysParse = [];\n }\n\n for (i = 0; i < 7; i++) {\n // make the regex if we don't have it already\n\n mom = createUTC([2000, 1]).day(i);\n if (strict && !this._fullWeekdaysParse[i]) {\n this._fullWeekdaysParse[i] = new RegExp(\n '^' + this.weekdays(mom, '').replace('.', '\\\\.?') + '$',\n 'i'\n );\n this._shortWeekdaysParse[i] = new RegExp(\n '^' + this.weekdaysShort(mom, '').replace('.', '\\\\.?') + '$',\n 'i'\n );\n this._minWeekdaysParse[i] = new RegExp(\n '^' + this.weekdaysMin(mom, '').replace('.', '\\\\.?') + '$',\n 'i'\n );\n }\n if (!this._weekdaysParse[i]) {\n regex =\n '^' +\n this.weekdays(mom, '') +\n '|^' +\n this.weekdaysShort(mom, '') +\n '|^' +\n this.weekdaysMin(mom, '');\n this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n }\n // test the regex\n if (\n strict &&\n format === 'dddd' &&\n this._fullWeekdaysParse[i].test(weekdayName)\n ) {\n return i;\n } else if (\n strict &&\n format === 'ddd' &&\n this._shortWeekdaysParse[i].test(weekdayName)\n ) {\n return i;\n } else if (\n strict &&\n format === 'dd' &&\n this._minWeekdaysParse[i].test(weekdayName)\n ) {\n return i;\n } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {\n return i;\n }\n }\n }\n\n // MOMENTS\n\n function getSetDayOfWeek(input) {\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n\n var day = get(this, 'Day');\n if (input != null) {\n input = parseWeekday(input, this.localeData());\n return this.add(input - day, 'd');\n } else {\n return day;\n }\n }\n\n function getSetLocaleDayOfWeek(input) {\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\n return input == null ? weekday : this.add(input - weekday, 'd');\n }\n\n function getSetISODayOfWeek(input) {\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n\n // behaves the same as moment#day except\n // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\n // as a setter, sunday should belong to the previous week.\n\n if (input != null) {\n var weekday = parseIsoWeekday(input, this.localeData());\n return this.day(this.day() % 7 ? weekday : weekday - 7);\n } else {\n return this.day() || 7;\n }\n }\n\n function weekdaysRegex(isStrict) {\n if (this._weekdaysParseExact) {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n computeWeekdaysParse.call(this);\n }\n if (isStrict) {\n return this._weekdaysStrictRegex;\n } else {\n return this._weekdaysRegex;\n }\n } else {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n this._weekdaysRegex = defaultWeekdaysRegex;\n }\n return this._weekdaysStrictRegex && isStrict\n ? this._weekdaysStrictRegex\n : this._weekdaysRegex;\n }\n }\n\n function weekdaysShortRegex(isStrict) {\n if (this._weekdaysParseExact) {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n computeWeekdaysParse.call(this);\n }\n if (isStrict) {\n return this._weekdaysShortStrictRegex;\n } else {\n return this._weekdaysShortRegex;\n }\n } else {\n if (!hasOwnProp(this, '_weekdaysShortRegex')) {\n this._weekdaysShortRegex = defaultWeekdaysShortRegex;\n }\n return this._weekdaysShortStrictRegex && isStrict\n ? this._weekdaysShortStrictRegex\n : this._weekdaysShortRegex;\n }\n }\n\n function weekdaysMinRegex(isStrict) {\n if (this._weekdaysParseExact) {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n computeWeekdaysParse.call(this);\n }\n if (isStrict) {\n return this._weekdaysMinStrictRegex;\n } else {\n return this._weekdaysMinRegex;\n }\n } else {\n if (!hasOwnProp(this, '_weekdaysMinRegex')) {\n this._weekdaysMinRegex = defaultWeekdaysMinRegex;\n }\n return this._weekdaysMinStrictRegex && isStrict\n ? this._weekdaysMinStrictRegex\n : this._weekdaysMinRegex;\n }\n }\n\n function computeWeekdaysParse() {\n function cmpLenRev(a, b) {\n return b.length - a.length;\n }\n\n var minPieces = [],\n shortPieces = [],\n longPieces = [],\n mixedPieces = [],\n i,\n mom,\n minp,\n shortp,\n longp;\n for (i = 0; i < 7; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, 1]).day(i);\n minp = regexEscape(this.weekdaysMin(mom, ''));\n shortp = regexEscape(this.weekdaysShort(mom, ''));\n longp = regexEscape(this.weekdays(mom, ''));\n minPieces.push(minp);\n shortPieces.push(shortp);\n longPieces.push(longp);\n mixedPieces.push(minp);\n mixedPieces.push(shortp);\n mixedPieces.push(longp);\n }\n // Sorting makes sure if one weekday (or abbr) is a prefix of another it\n // will match the longer piece.\n minPieces.sort(cmpLenRev);\n shortPieces.sort(cmpLenRev);\n longPieces.sort(cmpLenRev);\n mixedPieces.sort(cmpLenRev);\n\n this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n this._weekdaysShortRegex = this._weekdaysRegex;\n this._weekdaysMinRegex = this._weekdaysRegex;\n\n this._weekdaysStrictRegex = new RegExp(\n '^(' + longPieces.join('|') + ')',\n 'i'\n );\n this._weekdaysShortStrictRegex = new RegExp(\n '^(' + shortPieces.join('|') + ')',\n 'i'\n );\n this._weekdaysMinStrictRegex = new RegExp(\n '^(' + minPieces.join('|') + ')',\n 'i'\n );\n }\n\n // FORMATTING\n\n function hFormat() {\n return this.hours() % 12 || 12;\n }\n\n function kFormat() {\n return this.hours() || 24;\n }\n\n addFormatToken('H', ['HH', 2], 0, 'hour');\n addFormatToken('h', ['hh', 2], 0, hFormat);\n addFormatToken('k', ['kk', 2], 0, kFormat);\n\n addFormatToken('hmm', 0, 0, function () {\n return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n });\n\n addFormatToken('hmmss', 0, 0, function () {\n return (\n '' +\n hFormat.apply(this) +\n zeroFill(this.minutes(), 2) +\n zeroFill(this.seconds(), 2)\n );\n });\n\n addFormatToken('Hmm', 0, 0, function () {\n return '' + this.hours() + zeroFill(this.minutes(), 2);\n });\n\n addFormatToken('Hmmss', 0, 0, function () {\n return (\n '' +\n this.hours() +\n zeroFill(this.minutes(), 2) +\n zeroFill(this.seconds(), 2)\n );\n });\n\n function meridiem(token, lowercase) {\n addFormatToken(token, 0, 0, function () {\n return this.localeData().meridiem(\n this.hours(),\n this.minutes(),\n lowercase\n );\n });\n }\n\n meridiem('a', true);\n meridiem('A', false);\n\n // PARSING\n\n function matchMeridiem(isStrict, locale) {\n return locale._meridiemParse;\n }\n\n addRegexToken('a', matchMeridiem);\n addRegexToken('A', matchMeridiem);\n addRegexToken('H', match1to2, match1to2HasZero);\n addRegexToken('h', match1to2, match1to2NoLeadingZero);\n addRegexToken('k', match1to2, match1to2NoLeadingZero);\n addRegexToken('HH', match1to2, match2);\n addRegexToken('hh', match1to2, match2);\n addRegexToken('kk', match1to2, match2);\n\n addRegexToken('hmm', match3to4);\n addRegexToken('hmmss', match5to6);\n addRegexToken('Hmm', match3to4);\n addRegexToken('Hmmss', match5to6);\n\n addParseToken(['H', 'HH'], HOUR);\n addParseToken(['k', 'kk'], function (input, array, config) {\n var kInput = toInt(input);\n array[HOUR] = kInput === 24 ? 0 : kInput;\n });\n addParseToken(['a', 'A'], function (input, array, config) {\n config._isPm = config._locale.isPM(input);\n config._meridiem = input;\n });\n addParseToken(['h', 'hh'], function (input, array, config) {\n array[HOUR] = toInt(input);\n getParsingFlags(config).bigHour = true;\n });\n addParseToken('hmm', function (input, array, config) {\n var pos = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos));\n array[MINUTE] = toInt(input.substr(pos));\n getParsingFlags(config).bigHour = true;\n });\n addParseToken('hmmss', function (input, array, config) {\n var pos1 = input.length - 4,\n pos2 = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos1));\n array[MINUTE] = toInt(input.substr(pos1, 2));\n array[SECOND] = toInt(input.substr(pos2));\n getParsingFlags(config).bigHour = true;\n });\n addParseToken('Hmm', function (input, array, config) {\n var pos = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos));\n array[MINUTE] = toInt(input.substr(pos));\n });\n addParseToken('Hmmss', function (input, array, config) {\n var pos1 = input.length - 4,\n pos2 = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos1));\n array[MINUTE] = toInt(input.substr(pos1, 2));\n array[SECOND] = toInt(input.substr(pos2));\n });\n\n // LOCALES\n\n function localeIsPM(input) {\n // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\n // Using charAt should be more compatible.\n return (input + '').toLowerCase().charAt(0) === 'p';\n }\n\n var defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i,\n // Setting the hour should keep the time, because the user explicitly\n // specified which hour they want. So trying to maintain the same hour (in\n // a new timezone) makes sense. Adding/subtracting hours does not follow\n // this rule.\n getSetHour = makeGetSet('Hours', true);\n\n function localeMeridiem(hours, minutes, isLower) {\n if (hours > 11) {\n return isLower ? 'pm' : 'PM';\n } else {\n return isLower ? 'am' : 'AM';\n }\n }\n\n var baseConfig = {\n calendar: defaultCalendar,\n longDateFormat: defaultLongDateFormat,\n invalidDate: defaultInvalidDate,\n ordinal: defaultOrdinal,\n dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,\n relativeTime: defaultRelativeTime,\n\n months: defaultLocaleMonths,\n monthsShort: defaultLocaleMonthsShort,\n\n week: defaultLocaleWeek,\n\n weekdays: defaultLocaleWeekdays,\n weekdaysMin: defaultLocaleWeekdaysMin,\n weekdaysShort: defaultLocaleWeekdaysShort,\n\n meridiemParse: defaultLocaleMeridiemParse,\n };\n\n // internal storage for locale config files\n var locales = {},\n localeFamilies = {},\n globalLocale;\n\n function commonPrefix(arr1, arr2) {\n var i,\n minl = Math.min(arr1.length, arr2.length);\n for (i = 0; i < minl; i += 1) {\n if (arr1[i] !== arr2[i]) {\n return i;\n }\n }\n return minl;\n }\n\n function normalizeLocale(key) {\n return key ? key.toLowerCase().replace('_', '-') : key;\n }\n\n // pick the locale from the array\n // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each\n // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root\n function chooseLocale(names) {\n var i = 0,\n j,\n next,\n locale,\n split;\n\n while (i < names.length) {\n split = normalizeLocale(names[i]).split('-');\n j = split.length;\n next = normalizeLocale(names[i + 1]);\n next = next ? next.split('-') : null;\n while (j > 0) {\n locale = loadLocale(split.slice(0, j).join('-'));\n if (locale) {\n return locale;\n }\n if (\n next &&\n next.length >= j &&\n commonPrefix(split, next) >= j - 1\n ) {\n //the next array item is better than a shallower substring of this one\n break;\n }\n j--;\n }\n i++;\n }\n return globalLocale;\n }\n\n function isLocaleNameSane(name) {\n // Prevent names that look like filesystem paths, i.e contain '/' or '\\'\n // Ensure name is available and function returns boolean\n return !!(name && name.match('^[^/\\\\\\\\]*$'));\n }\n\n function loadLocale(name) {\n var oldLocale = null,\n aliasedRequire;\n // TODO: Find a better way to register and load all the locales in Node\n if (\n locales[name] === undefined &&\n typeof module !== 'undefined' &&\n module &&\n module.exports &&\n isLocaleNameSane(name)\n ) {\n try {\n oldLocale = globalLocale._abbr;\n aliasedRequire = require;\n aliasedRequire('./locale/' + name);\n getSetGlobalLocale(oldLocale);\n } catch (e) {\n // mark as not found to avoid repeating expensive file require call causing high CPU\n // when trying to find en-US, en_US, en-us for every format call\n locales[name] = null; // null means not found\n }\n }\n return locales[name];\n }\n\n // This function will load locale and then set the global locale. If\n // no arguments are passed in, it will simply return the current global\n // locale key.\n function getSetGlobalLocale(key, values) {\n var data;\n if (key) {\n if (isUndefined(values)) {\n data = getLocale(key);\n } else {\n data = defineLocale(key, values);\n }\n\n if (data) {\n // moment.duration._locale = moment._locale = data;\n globalLocale = data;\n } else {\n if (typeof console !== 'undefined' && console.warn) {\n //warn user if arguments are passed but the locale could not be set\n console.warn(\n 'Locale ' + key + ' not found. Did you forget to load it?'\n );\n }\n }\n }\n\n return globalLocale._abbr;\n }\n\n function defineLocale(name, config) {\n if (config !== null) {\n var locale,\n parentConfig = baseConfig;\n config.abbr = name;\n if (locales[name] != null) {\n deprecateSimple(\n 'defineLocaleOverride',\n 'use moment.updateLocale(localeName, config) to change ' +\n 'an existing locale. moment.defineLocale(localeName, ' +\n 'config) should only be used for creating a new locale ' +\n 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'\n );\n parentConfig = locales[name]._config;\n } else if (config.parentLocale != null) {\n if (locales[config.parentLocale] != null) {\n parentConfig = locales[config.parentLocale]._config;\n } else {\n locale = loadLocale(config.parentLocale);\n if (locale != null) {\n parentConfig = locale._config;\n } else {\n if (!localeFamilies[config.parentLocale]) {\n localeFamilies[config.parentLocale] = [];\n }\n localeFamilies[config.parentLocale].push({\n name: name,\n config: config,\n });\n return null;\n }\n }\n }\n locales[name] = new Locale(mergeConfigs(parentConfig, config));\n\n if (localeFamilies[name]) {\n localeFamilies[name].forEach(function (x) {\n defineLocale(x.name, x.config);\n });\n }\n\n // backwards compat for now: also set the locale\n // make sure we set the locale AFTER all child locales have been\n // created, so we won't end up with the child locale set.\n getSetGlobalLocale(name);\n\n return locales[name];\n } else {\n // useful for testing\n delete locales[name];\n return null;\n }\n }\n\n function updateLocale(name, config) {\n if (config != null) {\n var locale,\n tmpLocale,\n parentConfig = baseConfig;\n\n if (locales[name] != null && locales[name].parentLocale != null) {\n // Update existing child locale in-place to avoid memory-leaks\n locales[name].set(mergeConfigs(locales[name]._config, config));\n } else {\n // MERGE\n tmpLocale = loadLocale(name);\n if (tmpLocale != null) {\n parentConfig = tmpLocale._config;\n }\n config = mergeConfigs(parentConfig, config);\n if (tmpLocale == null) {\n // updateLocale is called for creating a new locale\n // Set abbr so it will have a name (getters return\n // undefined otherwise).\n config.abbr = name;\n }\n locale = new Locale(config);\n locale.parentLocale = locales[name];\n locales[name] = locale;\n }\n\n // backwards compat for now: also set the locale\n getSetGlobalLocale(name);\n } else {\n // pass null for config to unupdate, useful for tests\n if (locales[name] != null) {\n if (locales[name].parentLocale != null) {\n locales[name] = locales[name].parentLocale;\n if (name === getSetGlobalLocale()) {\n getSetGlobalLocale(name);\n }\n } else if (locales[name] != null) {\n delete locales[name];\n }\n }\n }\n return locales[name];\n }\n\n // returns locale data\n function getLocale(key) {\n var locale;\n\n if (key && key._locale && key._locale._abbr) {\n key = key._locale._abbr;\n }\n\n if (!key) {\n return globalLocale;\n }\n\n if (!isArray(key)) {\n //short-circuit everything else\n locale = loadLocale(key);\n if (locale) {\n return locale;\n }\n key = [key];\n }\n\n return chooseLocale(key);\n }\n\n function listLocales() {\n return keys(locales);\n }\n\n function checkOverflow(m) {\n var overflow,\n a = m._a;\n\n if (a && getParsingFlags(m).overflow === -2) {\n overflow =\n a[MONTH] < 0 || a[MONTH] > 11\n ? MONTH\n : a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH])\n ? DATE\n : a[HOUR] < 0 ||\n a[HOUR] > 24 ||\n (a[HOUR] === 24 &&\n (a[MINUTE] !== 0 ||\n a[SECOND] !== 0 ||\n a[MILLISECOND] !== 0))\n ? HOUR\n : a[MINUTE] < 0 || a[MINUTE] > 59\n ? MINUTE\n : a[SECOND] < 0 || a[SECOND] > 59\n ? SECOND\n : a[MILLISECOND] < 0 || a[MILLISECOND] > 999\n ? MILLISECOND\n : -1;\n\n if (\n getParsingFlags(m)._overflowDayOfYear &&\n (overflow < YEAR || overflow > DATE)\n ) {\n overflow = DATE;\n }\n if (getParsingFlags(m)._overflowWeeks && overflow === -1) {\n overflow = WEEK;\n }\n if (getParsingFlags(m)._overflowWeekday && overflow === -1) {\n overflow = WEEKDAY;\n }\n\n getParsingFlags(m).overflow = overflow;\n }\n\n return m;\n }\n\n // iso 8601 regex\n // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)\n var extendedIsoRegex =\n /^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([+-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,\n basicIsoRegex =\n /^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d|))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([+-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,\n tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/,\n isoDates = [\n ['YYYYYY-MM-DD', /[+-]\\d{6}-\\d\\d-\\d\\d/],\n ['YYYY-MM-DD', /\\d{4}-\\d\\d-\\d\\d/],\n ['GGGG-[W]WW-E', /\\d{4}-W\\d\\d-\\d/],\n ['GGGG-[W]WW', /\\d{4}-W\\d\\d/, false],\n ['YYYY-DDD', /\\d{4}-\\d{3}/],\n ['YYYY-MM', /\\d{4}-\\d\\d/, false],\n ['YYYYYYMMDD', /[+-]\\d{10}/],\n ['YYYYMMDD', /\\d{8}/],\n ['GGGG[W]WWE', /\\d{4}W\\d{3}/],\n ['GGGG[W]WW', /\\d{4}W\\d{2}/, false],\n ['YYYYDDD', /\\d{7}/],\n ['YYYYMM', /\\d{6}/, false],\n ['YYYY', /\\d{4}/, false],\n ],\n // iso time formats and regexes\n isoTimes = [\n ['HH:mm:ss.SSSS', /\\d\\d:\\d\\d:\\d\\d\\.\\d+/],\n ['HH:mm:ss,SSSS', /\\d\\d:\\d\\d:\\d\\d,\\d+/],\n ['HH:mm:ss', /\\d\\d:\\d\\d:\\d\\d/],\n ['HH:mm', /\\d\\d:\\d\\d/],\n ['HHmmss.SSSS', /\\d\\d\\d\\d\\d\\d\\.\\d+/],\n ['HHmmss,SSSS', /\\d\\d\\d\\d\\d\\d,\\d+/],\n ['HHmmss', /\\d\\d\\d\\d\\d\\d/],\n ['HHmm', /\\d\\d\\d\\d/],\n ['HH', /\\d\\d/],\n ],\n aspNetJsonRegex = /^\\/?Date\\((-?\\d+)/i,\n // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3\n rfc2822 =\n /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\\d{4}))$/,\n obsOffsets = {\n UT: 0,\n GMT: 0,\n EDT: -4 * 60,\n EST: -5 * 60,\n CDT: -5 * 60,\n CST: -6 * 60,\n MDT: -6 * 60,\n MST: -7 * 60,\n PDT: -7 * 60,\n PST: -8 * 60,\n };\n\n // date from iso format\n function configFromISO(config) {\n var i,\n l,\n string = config._i,\n match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n allowTime,\n dateFormat,\n timeFormat,\n tzFormat,\n isoDatesLen = isoDates.length,\n isoTimesLen = isoTimes.length;\n\n if (match) {\n getParsingFlags(config).iso = true;\n for (i = 0, l = isoDatesLen; i < l; i++) {\n if (isoDates[i][1].exec(match[1])) {\n dateFormat = isoDates[i][0];\n allowTime = isoDates[i][2] !== false;\n break;\n }\n }\n if (dateFormat == null) {\n config._isValid = false;\n return;\n }\n if (match[3]) {\n for (i = 0, l = isoTimesLen; i < l; i++) {\n if (isoTimes[i][1].exec(match[3])) {\n // match[2] should be 'T' or space\n timeFormat = (match[2] || ' ') + isoTimes[i][0];\n break;\n }\n }\n if (timeFormat == null) {\n config._isValid = false;\n return;\n }\n }\n if (!allowTime && timeFormat != null) {\n config._isValid = false;\n return;\n }\n if (match[4]) {\n if (tzRegex.exec(match[4])) {\n tzFormat = 'Z';\n } else {\n config._isValid = false;\n return;\n }\n }\n config._f = dateFormat + (timeFormat || '') + (tzFormat || '');\n configFromStringAndFormat(config);\n } else {\n config._isValid = false;\n }\n }\n\n function extractFromRFC2822Strings(\n yearStr,\n monthStr,\n dayStr,\n hourStr,\n minuteStr,\n secondStr\n ) {\n var result = [\n untruncateYear(yearStr),\n defaultLocaleMonthsShort.indexOf(monthStr),\n parseInt(dayStr, 10),\n parseInt(hourStr, 10),\n parseInt(minuteStr, 10),\n ];\n\n if (secondStr) {\n result.push(parseInt(secondStr, 10));\n }\n\n return result;\n }\n\n function untruncateYear(yearStr) {\n var year = parseInt(yearStr, 10);\n if (year <= 49) {\n return 2000 + year;\n } else if (year <= 999) {\n return 1900 + year;\n }\n return year;\n }\n\n function preprocessRFC2822(s) {\n // Remove comments and folding whitespace and replace multiple-spaces with a single space\n return s\n .replace(/\\([^()]*\\)|[\\n\\t]/g, ' ')\n .replace(/(\\s\\s+)/g, ' ')\n .replace(/^\\s\\s*/, '')\n .replace(/\\s\\s*$/, '');\n }\n\n function checkWeekday(weekdayStr, parsedInput, config) {\n if (weekdayStr) {\n // TODO: Replace the vanilla JS Date object with an independent day-of-week check.\n var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),\n weekdayActual = new Date(\n parsedInput[0],\n parsedInput[1],\n parsedInput[2]\n ).getDay();\n if (weekdayProvided !== weekdayActual) {\n getParsingFlags(config).weekdayMismatch = true;\n config._isValid = false;\n return false;\n }\n }\n return true;\n }\n\n function calculateOffset(obsOffset, militaryOffset, numOffset) {\n if (obsOffset) {\n return obsOffsets[obsOffset];\n } else if (militaryOffset) {\n // the only allowed military tz is Z\n return 0;\n } else {\n var hm = parseInt(numOffset, 10),\n m = hm % 100,\n h = (hm - m) / 100;\n return h * 60 + m;\n }\n }\n\n // date and time from ref 2822 format\n function configFromRFC2822(config) {\n var match = rfc2822.exec(preprocessRFC2822(config._i)),\n parsedArray;\n if (match) {\n parsedArray = extractFromRFC2822Strings(\n match[4],\n match[3],\n match[2],\n match[5],\n match[6],\n match[7]\n );\n if (!checkWeekday(match[1], parsedArray, config)) {\n return;\n }\n\n config._a = parsedArray;\n config._tzm = calculateOffset(match[8], match[9], match[10]);\n\n config._d = createUTCDate.apply(null, config._a);\n config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n\n getParsingFlags(config).rfc2822 = true;\n } else {\n config._isValid = false;\n }\n }\n\n // date from 1) ASP.NET, 2) ISO, 3) RFC 2822 formats, or 4) optional fallback if parsing isn't strict\n function configFromString(config) {\n var matched = aspNetJsonRegex.exec(config._i);\n if (matched !== null) {\n config._d = new Date(+matched[1]);\n return;\n }\n\n configFromISO(config);\n if (config._isValid === false) {\n delete config._isValid;\n } else {\n return;\n }\n\n configFromRFC2822(config);\n if (config._isValid === false) {\n delete config._isValid;\n } else {\n return;\n }\n\n if (config._strict) {\n config._isValid = false;\n } else {\n // Final attempt, use Input Fallback\n hooks.createFromInputFallback(config);\n }\n }\n\n hooks.createFromInputFallback = deprecate(\n 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +\n 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +\n 'discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.',\n function (config) {\n config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));\n }\n );\n\n // Pick the first defined of two or three arguments.\n function defaults(a, b, c) {\n if (a != null) {\n return a;\n }\n if (b != null) {\n return b;\n }\n return c;\n }\n\n function currentDateArray(config) {\n // hooks is actually the exported moment object\n var nowValue = new Date(hooks.now());\n if (config._useUTC) {\n return [\n nowValue.getUTCFullYear(),\n nowValue.getUTCMonth(),\n nowValue.getUTCDate(),\n ];\n }\n return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];\n }\n\n // convert an array to a date.\n // the array should mirror the parameters below\n // note: all values past the year are optional and will default to the lowest possible value.\n // [year, month, day , hour, minute, second, millisecond]\n function configFromArray(config) {\n var i,\n date,\n input = [],\n currentDate,\n expectedWeekday,\n yearToUse;\n\n if (config._d) {\n return;\n }\n\n currentDate = currentDateArray(config);\n\n //compute day of the year from weeks and weekdays\n if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {\n dayOfYearFromWeekInfo(config);\n }\n\n //if the day of the year is set, figure out what it is\n if (config._dayOfYear != null) {\n yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);\n\n if (\n config._dayOfYear > daysInYear(yearToUse) ||\n config._dayOfYear === 0\n ) {\n getParsingFlags(config)._overflowDayOfYear = true;\n }\n\n date = createUTCDate(yearToUse, 0, config._dayOfYear);\n config._a[MONTH] = date.getUTCMonth();\n config._a[DATE] = date.getUTCDate();\n }\n\n // Default to current date.\n // * if no year, month, day of month are given, default to today\n // * if day of month is given, default month and year\n // * if month is given, default only year\n // * if year is given, don't default anything\n for (i = 0; i < 3 && config._a[i] == null; ++i) {\n config._a[i] = input[i] = currentDate[i];\n }\n\n // Zero out whatever was not defaulted, including time\n for (; i < 7; i++) {\n config._a[i] = input[i] =\n config._a[i] == null ? (i === 2 ? 1 : 0) : config._a[i];\n }\n\n // Check for 24:00:00.000\n if (\n config._a[HOUR] === 24 &&\n config._a[MINUTE] === 0 &&\n config._a[SECOND] === 0 &&\n config._a[MILLISECOND] === 0\n ) {\n config._nextDay = true;\n config._a[HOUR] = 0;\n }\n\n config._d = (config._useUTC ? createUTCDate : createDate).apply(\n null,\n input\n );\n expectedWeekday = config._useUTC\n ? config._d.getUTCDay()\n : config._d.getDay();\n\n // Apply timezone offset from input. The actual utcOffset can be changed\n // with parseZone.\n if (config._tzm != null) {\n config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n }\n\n if (config._nextDay) {\n config._a[HOUR] = 24;\n }\n\n // check for mismatching day of week\n if (\n config._w &&\n typeof config._w.d !== 'undefined' &&\n config._w.d !== expectedWeekday\n ) {\n getParsingFlags(config).weekdayMismatch = true;\n }\n }\n\n function dayOfYearFromWeekInfo(config) {\n var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow, curWeek;\n\n w = config._w;\n if (w.GG != null || w.W != null || w.E != null) {\n dow = 1;\n doy = 4;\n\n // TODO: We need to take the current isoWeekYear, but that depends on\n // how we interpret now (local, utc, fixed offset). So create\n // a now version of current config (take local/utc/offset flags, and\n // create now).\n weekYear = defaults(\n w.GG,\n config._a[YEAR],\n weekOfYear(createLocal(), 1, 4).year\n );\n week = defaults(w.W, 1);\n weekday = defaults(w.E, 1);\n if (weekday < 1 || weekday > 7) {\n weekdayOverflow = true;\n }\n } else {\n dow = config._locale._week.dow;\n doy = config._locale._week.doy;\n\n curWeek = weekOfYear(createLocal(), dow, doy);\n\n weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);\n\n // Default to current week.\n week = defaults(w.w, curWeek.week);\n\n if (w.d != null) {\n // weekday -- low day numbers are considered next week\n weekday = w.d;\n if (weekday < 0 || weekday > 6) {\n weekdayOverflow = true;\n }\n } else if (w.e != null) {\n // local weekday -- counting starts from beginning of week\n weekday = w.e + dow;\n if (w.e < 0 || w.e > 6) {\n weekdayOverflow = true;\n }\n } else {\n // default to beginning of week\n weekday = dow;\n }\n }\n if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {\n getParsingFlags(config)._overflowWeeks = true;\n } else if (weekdayOverflow != null) {\n getParsingFlags(config)._overflowWeekday = true;\n } else {\n temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);\n config._a[YEAR] = temp.year;\n config._dayOfYear = temp.dayOfYear;\n }\n }\n\n // constant that refers to the ISO standard\n hooks.ISO_8601 = function () {};\n\n // constant that refers to the RFC 2822 form\n hooks.RFC_2822 = function () {};\n\n // date from string and format string\n function configFromStringAndFormat(config) {\n // TODO: Move this to another part of the creation flow to prevent circular deps\n if (config._f === hooks.ISO_8601) {\n configFromISO(config);\n return;\n }\n if (config._f === hooks.RFC_2822) {\n configFromRFC2822(config);\n return;\n }\n config._a = [];\n getParsingFlags(config).empty = true;\n\n // This array is used to make a Date, either with `new Date` or `Date.UTC`\n var string = '' + config._i,\n i,\n parsedInput,\n tokens,\n token,\n skipped,\n stringLength = string.length,\n totalParsedInputLength = 0,\n era,\n tokenLen;\n\n tokens =\n expandFormat(config._f, config._locale).match(formattingTokens) || [];\n tokenLen = tokens.length;\n for (i = 0; i < tokenLen; i++) {\n token = tokens[i];\n parsedInput = (string.match(getParseRegexForToken(token, config)) ||\n [])[0];\n if (parsedInput) {\n skipped = string.substr(0, string.indexOf(parsedInput));\n if (skipped.length > 0) {\n getParsingFlags(config).unusedInput.push(skipped);\n }\n string = string.slice(\n string.indexOf(parsedInput) + parsedInput.length\n );\n totalParsedInputLength += parsedInput.length;\n }\n // don't parse if it's not a known token\n if (formatTokenFunctions[token]) {\n if (parsedInput) {\n getParsingFlags(config).empty = false;\n } else {\n getParsingFlags(config).unusedTokens.push(token);\n }\n addTimeToArrayFromToken(token, parsedInput, config);\n } else if (config._strict && !parsedInput) {\n getParsingFlags(config).unusedTokens.push(token);\n }\n }\n\n // add remaining unparsed input length to the string\n getParsingFlags(config).charsLeftOver =\n stringLength - totalParsedInputLength;\n if (string.length > 0) {\n getParsingFlags(config).unusedInput.push(string);\n }\n\n // clear _12h flag if hour is <= 12\n if (\n config._a[HOUR] <= 12 &&\n getParsingFlags(config).bigHour === true &&\n config._a[HOUR] > 0\n ) {\n getParsingFlags(config).bigHour = undefined;\n }\n\n getParsingFlags(config).parsedDateParts = config._a.slice(0);\n getParsingFlags(config).meridiem = config._meridiem;\n // handle meridiem\n config._a[HOUR] = meridiemFixWrap(\n config._locale,\n config._a[HOUR],\n config._meridiem\n );\n\n // handle era\n era = getParsingFlags(config).era;\n if (era !== null) {\n config._a[YEAR] = config._locale.erasConvertYear(era, config._a[YEAR]);\n }\n\n configFromArray(config);\n checkOverflow(config);\n }\n\n function meridiemFixWrap(locale, hour, meridiem) {\n var isPm;\n\n if (meridiem == null) {\n // nothing to do\n return hour;\n }\n if (locale.meridiemHour != null) {\n return locale.meridiemHour(hour, meridiem);\n } else if (locale.isPM != null) {\n // Fallback\n isPm = locale.isPM(meridiem);\n if (isPm && hour < 12) {\n hour += 12;\n }\n if (!isPm && hour === 12) {\n hour = 0;\n }\n return hour;\n } else {\n // this is not supposed to happen\n return hour;\n }\n }\n\n // date from string and array of format strings\n function configFromStringAndArray(config) {\n var tempConfig,\n bestMoment,\n scoreToBeat,\n i,\n currentScore,\n validFormatFound,\n bestFormatIsValid = false,\n configfLen = config._f.length;\n\n if (configfLen === 0) {\n getParsingFlags(config).invalidFormat = true;\n config._d = new Date(NaN);\n return;\n }\n\n for (i = 0; i < configfLen; i++) {\n currentScore = 0;\n validFormatFound = false;\n tempConfig = copyConfig({}, config);\n if (config._useUTC != null) {\n tempConfig._useUTC = config._useUTC;\n }\n tempConfig._f = config._f[i];\n configFromStringAndFormat(tempConfig);\n\n if (isValid(tempConfig)) {\n validFormatFound = true;\n }\n\n // if there is any input that was not parsed add a penalty for that format\n currentScore += getParsingFlags(tempConfig).charsLeftOver;\n\n //or tokens\n currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;\n\n getParsingFlags(tempConfig).score = currentScore;\n\n if (!bestFormatIsValid) {\n if (\n scoreToBeat == null ||\n currentScore < scoreToBeat ||\n validFormatFound\n ) {\n scoreToBeat = currentScore;\n bestMoment = tempConfig;\n if (validFormatFound) {\n bestFormatIsValid = true;\n }\n }\n } else {\n if (currentScore < scoreToBeat) {\n scoreToBeat = currentScore;\n bestMoment = tempConfig;\n }\n }\n }\n\n extend(config, bestMoment || tempConfig);\n }\n\n function configFromObject(config) {\n if (config._d) {\n return;\n }\n\n var i = normalizeObjectUnits(config._i),\n dayOrDate = i.day === undefined ? i.date : i.day;\n config._a = map(\n [i.year, i.month, dayOrDate, i.hour, i.minute, i.second, i.millisecond],\n function (obj) {\n return obj && parseInt(obj, 10);\n }\n );\n\n configFromArray(config);\n }\n\n function createFromConfig(config) {\n var res = new Moment(checkOverflow(prepareConfig(config)));\n if (res._nextDay) {\n // Adding is smart enough around DST\n res.add(1, 'd');\n res._nextDay = undefined;\n }\n\n return res;\n }\n\n function prepareConfig(config) {\n var input = config._i,\n format = config._f;\n\n config._locale = config._locale || getLocale(config._l);\n\n if (input === null || (format === undefined && input === '')) {\n return createInvalid({ nullInput: true });\n }\n\n if (typeof input === 'string') {\n config._i = input = config._locale.preparse(input);\n }\n\n if (isMoment(input)) {\n return new Moment(checkOverflow(input));\n } else if (isDate(input)) {\n config._d = input;\n } else if (isArray(format)) {\n configFromStringAndArray(config);\n } else if (format) {\n configFromStringAndFormat(config);\n } else {\n configFromInput(config);\n }\n\n if (!isValid(config)) {\n config._d = null;\n }\n\n return config;\n }\n\n function configFromInput(config) {\n var input = config._i;\n if (isUndefined(input)) {\n config._d = new Date(hooks.now());\n } else if (isDate(input)) {\n config._d = new Date(input.valueOf());\n } else if (typeof input === 'string') {\n configFromString(config);\n } else if (isArray(input)) {\n config._a = map(input.slice(0), function (obj) {\n return parseInt(obj, 10);\n });\n configFromArray(config);\n } else if (isObject(input)) {\n configFromObject(config);\n } else if (isNumber(input)) {\n // from milliseconds\n config._d = new Date(input);\n } else {\n hooks.createFromInputFallback(config);\n }\n }\n\n function createLocalOrUTC(input, format, locale, strict, isUTC) {\n var c = {};\n\n if (format === true || format === false) {\n strict = format;\n format = undefined;\n }\n\n if (locale === true || locale === false) {\n strict = locale;\n locale = undefined;\n }\n\n if (\n (isObject(input) && isObjectEmpty(input)) ||\n (isArray(input) && input.length === 0)\n ) {\n input = undefined;\n }\n // object construction must be done this way.\n // https://github.com/moment/moment/issues/1423\n c._isAMomentObject = true;\n c._useUTC = c._isUTC = isUTC;\n c._l = locale;\n c._i = input;\n c._f = format;\n c._strict = strict;\n\n return createFromConfig(c);\n }\n\n function createLocal(input, format, locale, strict) {\n return createLocalOrUTC(input, format, locale, strict, false);\n }\n\n var prototypeMin = deprecate(\n 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',\n function () {\n var other = createLocal.apply(null, arguments);\n if (this.isValid() && other.isValid()) {\n return other < this ? this : other;\n } else {\n return createInvalid();\n }\n }\n ),\n prototypeMax = deprecate(\n 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',\n function () {\n var other = createLocal.apply(null, arguments);\n if (this.isValid() && other.isValid()) {\n return other > this ? this : other;\n } else {\n return createInvalid();\n }\n }\n );\n\n // Pick a moment m from moments so that m[fn](other) is true for all\n // other. This relies on the function fn to be transitive.\n //\n // moments should either be an array of moment objects or an array, whose\n // first element is an array of moment objects.\n function pickBy(fn, moments) {\n var res, i;\n if (moments.length === 1 && isArray(moments[0])) {\n moments = moments[0];\n }\n if (!moments.length) {\n return createLocal();\n }\n res = moments[0];\n for (i = 1; i < moments.length; ++i) {\n if (!moments[i].isValid() || moments[i][fn](res)) {\n res = moments[i];\n }\n }\n return res;\n }\n\n // TODO: Use [].sort instead?\n function min() {\n var args = [].slice.call(arguments, 0);\n\n return pickBy('isBefore', args);\n }\n\n function max() {\n var args = [].slice.call(arguments, 0);\n\n return pickBy('isAfter', args);\n }\n\n var now = function () {\n return Date.now ? Date.now() : +new Date();\n };\n\n var ordering = [\n 'year',\n 'quarter',\n 'month',\n 'week',\n 'day',\n 'hour',\n 'minute',\n 'second',\n 'millisecond',\n ];\n\n function isDurationValid(m) {\n var key,\n unitHasDecimal = false,\n i,\n orderLen = ordering.length;\n for (key in m) {\n if (\n hasOwnProp(m, key) &&\n !(\n indexOf.call(ordering, key) !== -1 &&\n (m[key] == null || !isNaN(m[key]))\n )\n ) {\n return false;\n }\n }\n\n for (i = 0; i < orderLen; ++i) {\n if (m[ordering[i]]) {\n if (unitHasDecimal) {\n return false; // only allow non-integers for smallest unit\n }\n if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {\n unitHasDecimal = true;\n }\n }\n }\n\n return true;\n }\n\n function isValid$1() {\n return this._isValid;\n }\n\n function createInvalid$1() {\n return createDuration(NaN);\n }\n\n function Duration(duration) {\n var normalizedInput = normalizeObjectUnits(duration),\n years = normalizedInput.year || 0,\n quarters = normalizedInput.quarter || 0,\n months = normalizedInput.month || 0,\n weeks = normalizedInput.week || normalizedInput.isoWeek || 0,\n days = normalizedInput.day || 0,\n hours = normalizedInput.hour || 0,\n minutes = normalizedInput.minute || 0,\n seconds = normalizedInput.second || 0,\n milliseconds = normalizedInput.millisecond || 0;\n\n this._isValid = isDurationValid(normalizedInput);\n\n // representation for dateAddRemove\n this._milliseconds =\n +milliseconds +\n seconds * 1e3 + // 1000\n minutes * 6e4 + // 1000 * 60\n hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978\n // Because of dateAddRemove treats 24 hours as different from a\n // day when working around DST, we need to store them separately\n this._days = +days + weeks * 7;\n // It is impossible to translate months into days without knowing\n // which months you are are talking about, so we have to store\n // it separately.\n this._months = +months + quarters * 3 + years * 12;\n\n this._data = {};\n\n this._locale = getLocale();\n\n this._bubble();\n }\n\n function isDuration(obj) {\n return obj instanceof Duration;\n }\n\n function absRound(number) {\n if (number < 0) {\n return Math.round(-1 * number) * -1;\n } else {\n return Math.round(number);\n }\n }\n\n // compare two arrays, return the number of differences\n function compareArrays(array1, array2, dontConvert) {\n var len = Math.min(array1.length, array2.length),\n lengthDiff = Math.abs(array1.length - array2.length),\n diffs = 0,\n i;\n for (i = 0; i < len; i++) {\n if (\n (dontConvert && array1[i] !== array2[i]) ||\n (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))\n ) {\n diffs++;\n }\n }\n return diffs + lengthDiff;\n }\n\n // FORMATTING\n\n function offset(token, separator) {\n addFormatToken(token, 0, 0, function () {\n var offset = this.utcOffset(),\n sign = '+';\n if (offset < 0) {\n offset = -offset;\n sign = '-';\n }\n return (\n sign +\n zeroFill(~~(offset / 60), 2) +\n separator +\n zeroFill(~~offset % 60, 2)\n );\n });\n }\n\n offset('Z', ':');\n offset('ZZ', '');\n\n // PARSING\n\n addRegexToken('Z', matchShortOffset);\n addRegexToken('ZZ', matchShortOffset);\n addParseToken(['Z', 'ZZ'], function (input, array, config) {\n config._useUTC = true;\n config._tzm = offsetFromString(matchShortOffset, input);\n });\n\n // HELPERS\n\n // timezone chunker\n // '+10:00' > ['10', '00']\n // '-1530' > ['-15', '30']\n var chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\n function offsetFromString(matcher, string) {\n var matches = (string || '').match(matcher),\n chunk,\n parts,\n minutes;\n\n if (matches === null) {\n return null;\n }\n\n chunk = matches[matches.length - 1] || [];\n parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n minutes = +(parts[1] * 60) + toInt(parts[2]);\n\n return minutes === 0 ? 0 : parts[0] === '+' ? minutes : -minutes;\n }\n\n // Return a moment from input, that is local/utc/zone equivalent to model.\n function cloneWithOffset(input, model) {\n var res, diff;\n if (model._isUTC) {\n res = model.clone();\n diff =\n (isMoment(input) || isDate(input)\n ? input.valueOf()\n : createLocal(input).valueOf()) - res.valueOf();\n // Use low-level api, because this fn is low-level api.\n res._d.setTime(res._d.valueOf() + diff);\n hooks.updateOffset(res, false);\n return res;\n } else {\n return createLocal(input).local();\n }\n }\n\n function getDateOffset(m) {\n // On Firefox.24 Date#getTimezoneOffset returns a floating point.\n // https://github.com/moment/moment/pull/1871\n return -Math.round(m._d.getTimezoneOffset());\n }\n\n // HOOKS\n\n // This function will be called whenever a moment is mutated.\n // It is intended to keep the offset in sync with the timezone.\n hooks.updateOffset = function () {};\n\n // MOMENTS\n\n // keepLocalTime = true means only change the timezone, without\n // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->\n // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\n // +0200, so we adjust the time as needed, to be valid.\n //\n // Keeping the time actually adds/subtracts (one hour)\n // from the actual represented time. That is why we call updateOffset\n // a second time. In case it wants us to change the offset again\n // _changeInProgress == true case, then we have to adjust, because\n // there is no such time in the given timezone.\n function getSetOffset(input, keepLocalTime, keepMinutes) {\n var offset = this._offset || 0,\n localAdjust;\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n if (input != null) {\n if (typeof input === 'string') {\n input = offsetFromString(matchShortOffset, input);\n if (input === null) {\n return this;\n }\n } else if (Math.abs(input) < 16 && !keepMinutes) {\n input = input * 60;\n }\n if (!this._isUTC && keepLocalTime) {\n localAdjust = getDateOffset(this);\n }\n this._offset = input;\n this._isUTC = true;\n if (localAdjust != null) {\n this.add(localAdjust, 'm');\n }\n if (offset !== input) {\n if (!keepLocalTime || this._changeInProgress) {\n addSubtract(\n this,\n createDuration(input - offset, 'm'),\n 1,\n false\n );\n } else if (!this._changeInProgress) {\n this._changeInProgress = true;\n hooks.updateOffset(this, true);\n this._changeInProgress = null;\n }\n }\n return this;\n } else {\n return this._isUTC ? offset : getDateOffset(this);\n }\n }\n\n function getSetZone(input, keepLocalTime) {\n if (input != null) {\n if (typeof input !== 'string') {\n input = -input;\n }\n\n this.utcOffset(input, keepLocalTime);\n\n return this;\n } else {\n return -this.utcOffset();\n }\n }\n\n function setOffsetToUTC(keepLocalTime) {\n return this.utcOffset(0, keepLocalTime);\n }\n\n function setOffsetToLocal(keepLocalTime) {\n if (this._isUTC) {\n this.utcOffset(0, keepLocalTime);\n this._isUTC = false;\n\n if (keepLocalTime) {\n this.subtract(getDateOffset(this), 'm');\n }\n }\n return this;\n }\n\n function setOffsetToParsedOffset() {\n if (this._tzm != null) {\n this.utcOffset(this._tzm, false, true);\n } else if (typeof this._i === 'string') {\n var tZone = offsetFromString(matchOffset, this._i);\n if (tZone != null) {\n this.utcOffset(tZone);\n } else {\n this.utcOffset(0, true);\n }\n }\n return this;\n }\n\n function hasAlignedHourOffset(input) {\n if (!this.isValid()) {\n return false;\n }\n input = input ? createLocal(input).utcOffset() : 0;\n\n return (this.utcOffset() - input) % 60 === 0;\n }\n\n function isDaylightSavingTime() {\n return (\n this.utcOffset() > this.clone().month(0).utcOffset() ||\n this.utcOffset() > this.clone().month(5).utcOffset()\n );\n }\n\n function isDaylightSavingTimeShifted() {\n if (!isUndefined(this._isDSTShifted)) {\n return this._isDSTShifted;\n }\n\n var c = {},\n other;\n\n copyConfig(c, this);\n c = prepareConfig(c);\n\n if (c._a) {\n other = c._isUTC ? createUTC(c._a) : createLocal(c._a);\n this._isDSTShifted =\n this.isValid() && compareArrays(c._a, other.toArray()) > 0;\n } else {\n this._isDSTShifted = false;\n }\n\n return this._isDSTShifted;\n }\n\n function isLocal() {\n return this.isValid() ? !this._isUTC : false;\n }\n\n function isUtcOffset() {\n return this.isValid() ? this._isUTC : false;\n }\n\n function isUtc() {\n return this.isValid() ? this._isUTC && this._offset === 0 : false;\n }\n\n // ASP.NET json date format regex\n var aspNetRegex = /^(-|\\+)?(?:(\\d*)[. ])?(\\d+):(\\d+)(?::(\\d+)(\\.\\d*)?)?$/,\n // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\n // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\n // and further modified to allow for strings containing both week and day\n isoRegex =\n /^(-|\\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;\n\n function createDuration(input, key) {\n var duration = input,\n // matching against regexp is expensive, do it on demand\n match = null,\n sign,\n ret,\n diffRes;\n\n if (isDuration(input)) {\n duration = {\n ms: input._milliseconds,\n d: input._days,\n M: input._months,\n };\n } else if (isNumber(input) || !isNaN(+input)) {\n duration = {};\n if (key) {\n duration[key] = +input;\n } else {\n duration.milliseconds = +input;\n }\n } else if ((match = aspNetRegex.exec(input))) {\n sign = match[1] === '-' ? -1 : 1;\n duration = {\n y: 0,\n d: toInt(match[DATE]) * sign,\n h: toInt(match[HOUR]) * sign,\n m: toInt(match[MINUTE]) * sign,\n s: toInt(match[SECOND]) * sign,\n ms: toInt(absRound(match[MILLISECOND] * 1000)) * sign, // the millisecond decimal point is included in the match\n };\n } else if ((match = isoRegex.exec(input))) {\n sign = match[1] === '-' ? -1 : 1;\n duration = {\n y: parseIso(match[2], sign),\n M: parseIso(match[3], sign),\n w: parseIso(match[4], sign),\n d: parseIso(match[5], sign),\n h: parseIso(match[6], sign),\n m: parseIso(match[7], sign),\n s: parseIso(match[8], sign),\n };\n } else if (duration == null) {\n // checks for null or undefined\n duration = {};\n } else if (\n typeof duration === 'object' &&\n ('from' in duration || 'to' in duration)\n ) {\n diffRes = momentsDifference(\n createLocal(duration.from),\n createLocal(duration.to)\n );\n\n duration = {};\n duration.ms = diffRes.milliseconds;\n duration.M = diffRes.months;\n }\n\n ret = new Duration(duration);\n\n if (isDuration(input) && hasOwnProp(input, '_locale')) {\n ret._locale = input._locale;\n }\n\n if (isDuration(input) && hasOwnProp(input, '_isValid')) {\n ret._isValid = input._isValid;\n }\n\n return ret;\n }\n\n createDuration.fn = Duration.prototype;\n createDuration.invalid = createInvalid$1;\n\n function parseIso(inp, sign) {\n // We'd normally use ~~inp for this, but unfortunately it also\n // converts floats to ints.\n // inp may be undefined, so careful calling replace on it.\n var res = inp && parseFloat(inp.replace(',', '.'));\n // apply sign while we're at it\n return (isNaN(res) ? 0 : res) * sign;\n }\n\n function positiveMomentsDifference(base, other) {\n var res = {};\n\n res.months =\n other.month() - base.month() + (other.year() - base.year()) * 12;\n if (base.clone().add(res.months, 'M').isAfter(other)) {\n --res.months;\n }\n\n res.milliseconds = +other - +base.clone().add(res.months, 'M');\n\n return res;\n }\n\n function momentsDifference(base, other) {\n var res;\n if (!(base.isValid() && other.isValid())) {\n return { milliseconds: 0, months: 0 };\n }\n\n other = cloneWithOffset(other, base);\n if (base.isBefore(other)) {\n res = positiveMomentsDifference(base, other);\n } else {\n res = positiveMomentsDifference(other, base);\n res.milliseconds = -res.milliseconds;\n res.months = -res.months;\n }\n\n return res;\n }\n\n // TODO: remove 'name' arg after deprecation is removed\n function createAdder(direction, name) {\n return function (val, period) {\n var dur, tmp;\n //invert the arguments, but complain about it\n if (period !== null && !isNaN(+period)) {\n deprecateSimple(\n name,\n 'moment().' +\n name +\n '(period, number) is deprecated. Please use moment().' +\n name +\n '(number, period). ' +\n 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'\n );\n tmp = val;\n val = period;\n period = tmp;\n }\n\n dur = createDuration(val, period);\n addSubtract(this, dur, direction);\n return this;\n };\n }\n\n function addSubtract(mom, duration, isAdding, updateOffset) {\n var milliseconds = duration._milliseconds,\n days = absRound(duration._days),\n months = absRound(duration._months);\n\n if (!mom.isValid()) {\n // No op\n return;\n }\n\n updateOffset = updateOffset == null ? true : updateOffset;\n\n if (months) {\n setMonth(mom, get(mom, 'Month') + months * isAdding);\n }\n if (days) {\n set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);\n }\n if (milliseconds) {\n mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);\n }\n if (updateOffset) {\n hooks.updateOffset(mom, days || months);\n }\n }\n\n var add = createAdder(1, 'add'),\n subtract = createAdder(-1, 'subtract');\n\n function isString(input) {\n return typeof input === 'string' || input instanceof String;\n }\n\n // type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | void; // null | undefined\n function isMomentInput(input) {\n return (\n isMoment(input) ||\n isDate(input) ||\n isString(input) ||\n isNumber(input) ||\n isNumberOrStringArray(input) ||\n isMomentInputObject(input) ||\n input === null ||\n input === undefined\n );\n }\n\n function isMomentInputObject(input) {\n var objectTest = isObject(input) && !isObjectEmpty(input),\n propertyTest = false,\n properties = [\n 'years',\n 'year',\n 'y',\n 'months',\n 'month',\n 'M',\n 'days',\n 'day',\n 'd',\n 'dates',\n 'date',\n 'D',\n 'hours',\n 'hour',\n 'h',\n 'minutes',\n 'minute',\n 'm',\n 'seconds',\n 'second',\n 's',\n 'milliseconds',\n 'millisecond',\n 'ms',\n ],\n i,\n property,\n propertyLen = properties.length;\n\n for (i = 0; i < propertyLen; i += 1) {\n property = properties[i];\n propertyTest = propertyTest || hasOwnProp(input, property);\n }\n\n return objectTest && propertyTest;\n }\n\n function isNumberOrStringArray(input) {\n var arrayTest = isArray(input),\n dataTypeTest = false;\n if (arrayTest) {\n dataTypeTest =\n input.filter(function (item) {\n return !isNumber(item) && isString(input);\n }).length === 0;\n }\n return arrayTest && dataTypeTest;\n }\n\n function isCalendarSpec(input) {\n var objectTest = isObject(input) && !isObjectEmpty(input),\n propertyTest = false,\n properties = [\n 'sameDay',\n 'nextDay',\n 'lastDay',\n 'nextWeek',\n 'lastWeek',\n 'sameElse',\n ],\n i,\n property;\n\n for (i = 0; i < properties.length; i += 1) {\n property = properties[i];\n propertyTest = propertyTest || hasOwnProp(input, property);\n }\n\n return objectTest && propertyTest;\n }\n\n function getCalendarFormat(myMoment, now) {\n var diff = myMoment.diff(now, 'days', true);\n return diff < -6\n ? 'sameElse'\n : diff < -1\n ? 'lastWeek'\n : diff < 0\n ? 'lastDay'\n : diff < 1\n ? 'sameDay'\n : diff < 2\n ? 'nextDay'\n : diff < 7\n ? 'nextWeek'\n : 'sameElse';\n }\n\n function calendar$1(time, formats) {\n // Support for single parameter, formats only overload to the calendar function\n if (arguments.length === 1) {\n if (!arguments[0]) {\n time = undefined;\n formats = undefined;\n } else if (isMomentInput(arguments[0])) {\n time = arguments[0];\n formats = undefined;\n } else if (isCalendarSpec(arguments[0])) {\n formats = arguments[0];\n time = undefined;\n }\n }\n // We want to compare the start of today, vs this.\n // Getting start-of-today depends on whether we're local/utc/offset or not.\n var now = time || createLocal(),\n sod = cloneWithOffset(now, this).startOf('day'),\n format = hooks.calendarFormat(this, sod) || 'sameElse',\n output =\n formats &&\n (isFunction(formats[format])\n ? formats[format].call(this, now)\n : formats[format]);\n\n return this.format(\n output || this.localeData().calendar(format, this, createLocal(now))\n );\n }\n\n function clone() {\n return new Moment(this);\n }\n\n function isAfter(input, units) {\n var localInput = isMoment(input) ? input : createLocal(input);\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(units) || 'millisecond';\n if (units === 'millisecond') {\n return this.valueOf() > localInput.valueOf();\n } else {\n return localInput.valueOf() < this.clone().startOf(units).valueOf();\n }\n }\n\n function isBefore(input, units) {\n var localInput = isMoment(input) ? input : createLocal(input);\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(units) || 'millisecond';\n if (units === 'millisecond') {\n return this.valueOf() < localInput.valueOf();\n } else {\n return this.clone().endOf(units).valueOf() < localInput.valueOf();\n }\n }\n\n function isBetween(from, to, units, inclusivity) {\n var localFrom = isMoment(from) ? from : createLocal(from),\n localTo = isMoment(to) ? to : createLocal(to);\n if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) {\n return false;\n }\n inclusivity = inclusivity || '()';\n return (\n (inclusivity[0] === '('\n ? this.isAfter(localFrom, units)\n : !this.isBefore(localFrom, units)) &&\n (inclusivity[1] === ')'\n ? this.isBefore(localTo, units)\n : !this.isAfter(localTo, units))\n );\n }\n\n function isSame(input, units) {\n var localInput = isMoment(input) ? input : createLocal(input),\n inputMs;\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(units) || 'millisecond';\n if (units === 'millisecond') {\n return this.valueOf() === localInput.valueOf();\n } else {\n inputMs = localInput.valueOf();\n return (\n this.clone().startOf(units).valueOf() <= inputMs &&\n inputMs <= this.clone().endOf(units).valueOf()\n );\n }\n }\n\n function isSameOrAfter(input, units) {\n return this.isSame(input, units) || this.isAfter(input, units);\n }\n\n function isSameOrBefore(input, units) {\n return this.isSame(input, units) || this.isBefore(input, units);\n }\n\n function diff(input, units, asFloat) {\n var that, zoneDelta, output;\n\n if (!this.isValid()) {\n return NaN;\n }\n\n that = cloneWithOffset(input, this);\n\n if (!that.isValid()) {\n return NaN;\n }\n\n zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;\n\n units = normalizeUnits(units);\n\n switch (units) {\n case 'year':\n output = monthDiff(this, that) / 12;\n break;\n case 'month':\n output = monthDiff(this, that);\n break;\n case 'quarter':\n output = monthDiff(this, that) / 3;\n break;\n case 'second':\n output = (this - that) / 1e3;\n break; // 1000\n case 'minute':\n output = (this - that) / 6e4;\n break; // 1000 * 60\n case 'hour':\n output = (this - that) / 36e5;\n break; // 1000 * 60 * 60\n case 'day':\n output = (this - that - zoneDelta) / 864e5;\n break; // 1000 * 60 * 60 * 24, negate dst\n case 'week':\n output = (this - that - zoneDelta) / 6048e5;\n break; // 1000 * 60 * 60 * 24 * 7, negate dst\n default:\n output = this - that;\n }\n\n return asFloat ? output : absFloor(output);\n }\n\n function monthDiff(a, b) {\n if (a.date() < b.date()) {\n // end-of-month calculations work correct when the start month has more\n // days than the end month.\n return -monthDiff(b, a);\n }\n // difference in months\n var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()),\n // b is in (anchor - 1 month, anchor + 1 month)\n anchor = a.clone().add(wholeMonthDiff, 'months'),\n anchor2,\n adjust;\n\n if (b - anchor < 0) {\n anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');\n // linear across the month\n adjust = (b - anchor) / (anchor - anchor2);\n } else {\n anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');\n // linear across the month\n adjust = (b - anchor) / (anchor2 - anchor);\n }\n\n //check for negative zero, return zero if negative zero\n return -(wholeMonthDiff + adjust) || 0;\n }\n\n hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\n hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n\n function toString() {\n return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n }\n\n function toISOString(keepOffset) {\n if (!this.isValid()) {\n return null;\n }\n var utc = keepOffset !== true,\n m = utc ? this.clone().utc() : this;\n if (m.year() < 0 || m.year() > 9999) {\n return formatMoment(\n m,\n utc\n ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'\n : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'\n );\n }\n if (isFunction(Date.prototype.toISOString)) {\n // native implementation is ~50x faster, use it when we can\n if (utc) {\n return this.toDate().toISOString();\n } else {\n return new Date(this.valueOf() + this.utcOffset() * 60 * 1000)\n .toISOString()\n .replace('Z', formatMoment(m, 'Z'));\n }\n }\n return formatMoment(\n m,\n utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'\n );\n }\n\n /**\n * Return a human readable representation of a moment that can\n * also be evaluated to get a new moment which is the same\n *\n * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects\n */\n function inspect() {\n if (!this.isValid()) {\n return 'moment.invalid(/* ' + this._i + ' */)';\n }\n var func = 'moment',\n zone = '',\n prefix,\n year,\n datetime,\n suffix;\n if (!this.isLocal()) {\n func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';\n zone = 'Z';\n }\n prefix = '[' + func + '(\"]';\n year = 0 <= this.year() && this.year() <= 9999 ? 'YYYY' : 'YYYYYY';\n datetime = '-MM-DD[T]HH:mm:ss.SSS';\n suffix = zone + '[\")]';\n\n return this.format(prefix + year + datetime + suffix);\n }\n\n function format(inputString) {\n if (!inputString) {\n inputString = this.isUtc()\n ? hooks.defaultFormatUtc\n : hooks.defaultFormat;\n }\n var output = formatMoment(this, inputString);\n return this.localeData().postformat(output);\n }\n\n function from(time, withoutSuffix) {\n if (\n this.isValid() &&\n ((isMoment(time) && time.isValid()) || createLocal(time).isValid())\n ) {\n return createDuration({ to: this, from: time })\n .locale(this.locale())\n .humanize(!withoutSuffix);\n } else {\n return this.localeData().invalidDate();\n }\n }\n\n function fromNow(withoutSuffix) {\n return this.from(createLocal(), withoutSuffix);\n }\n\n function to(time, withoutSuffix) {\n if (\n this.isValid() &&\n ((isMoment(time) && time.isValid()) || createLocal(time).isValid())\n ) {\n return createDuration({ from: this, to: time })\n .locale(this.locale())\n .humanize(!withoutSuffix);\n } else {\n return this.localeData().invalidDate();\n }\n }\n\n function toNow(withoutSuffix) {\n return this.to(createLocal(), withoutSuffix);\n }\n\n // If passed a locale key, it will set the locale for this\n // instance. Otherwise, it will return the locale configuration\n // variables for this instance.\n function locale(key) {\n var newLocaleData;\n\n if (key === undefined) {\n return this._locale._abbr;\n } else {\n newLocaleData = getLocale(key);\n if (newLocaleData != null) {\n this._locale = newLocaleData;\n }\n return this;\n }\n }\n\n var lang = deprecate(\n 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',\n function (key) {\n if (key === undefined) {\n return this.localeData();\n } else {\n return this.locale(key);\n }\n }\n );\n\n function localeData() {\n return this._locale;\n }\n\n var MS_PER_SECOND = 1000,\n MS_PER_MINUTE = 60 * MS_PER_SECOND,\n MS_PER_HOUR = 60 * MS_PER_MINUTE,\n MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR;\n\n // actual modulo - handles negative numbers (for dates before 1970):\n function mod$1(dividend, divisor) {\n return ((dividend % divisor) + divisor) % divisor;\n }\n\n function localStartOfDate(y, m, d) {\n // the date constructor remaps years 0-99 to 1900-1999\n if (y < 100 && y >= 0) {\n // preserve leap years using a full 400 year cycle, then reset\n return new Date(y + 400, m, d) - MS_PER_400_YEARS;\n } else {\n return new Date(y, m, d).valueOf();\n }\n }\n\n function utcStartOfDate(y, m, d) {\n // Date.UTC remaps years 0-99 to 1900-1999\n if (y < 100 && y >= 0) {\n // preserve leap years using a full 400 year cycle, then reset\n return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS;\n } else {\n return Date.UTC(y, m, d);\n }\n }\n\n function startOf(units) {\n var time, startOfDate;\n units = normalizeUnits(units);\n if (units === undefined || units === 'millisecond' || !this.isValid()) {\n return this;\n }\n\n startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;\n\n switch (units) {\n case 'year':\n time = startOfDate(this.year(), 0, 1);\n break;\n case 'quarter':\n time = startOfDate(\n this.year(),\n this.month() - (this.month() % 3),\n 1\n );\n break;\n case 'month':\n time = startOfDate(this.year(), this.month(), 1);\n break;\n case 'week':\n time = startOfDate(\n this.year(),\n this.month(),\n this.date() - this.weekday()\n );\n break;\n case 'isoWeek':\n time = startOfDate(\n this.year(),\n this.month(),\n this.date() - (this.isoWeekday() - 1)\n );\n break;\n case 'day':\n case 'date':\n time = startOfDate(this.year(), this.month(), this.date());\n break;\n case 'hour':\n time = this._d.valueOf();\n time -= mod$1(\n time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),\n MS_PER_HOUR\n );\n break;\n case 'minute':\n time = this._d.valueOf();\n time -= mod$1(time, MS_PER_MINUTE);\n break;\n case 'second':\n time = this._d.valueOf();\n time -= mod$1(time, MS_PER_SECOND);\n break;\n }\n\n this._d.setTime(time);\n hooks.updateOffset(this, true);\n return this;\n }\n\n function endOf(units) {\n var time, startOfDate;\n units = normalizeUnits(units);\n if (units === undefined || units === 'millisecond' || !this.isValid()) {\n return this;\n }\n\n startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;\n\n switch (units) {\n case 'year':\n time = startOfDate(this.year() + 1, 0, 1) - 1;\n break;\n case 'quarter':\n time =\n startOfDate(\n this.year(),\n this.month() - (this.month() % 3) + 3,\n 1\n ) - 1;\n break;\n case 'month':\n time = startOfDate(this.year(), this.month() + 1, 1) - 1;\n break;\n case 'week':\n time =\n startOfDate(\n this.year(),\n this.month(),\n this.date() - this.weekday() + 7\n ) - 1;\n break;\n case 'isoWeek':\n time =\n startOfDate(\n this.year(),\n this.month(),\n this.date() - (this.isoWeekday() - 1) + 7\n ) - 1;\n break;\n case 'day':\n case 'date':\n time = startOfDate(this.year(), this.month(), this.date() + 1) - 1;\n break;\n case 'hour':\n time = this._d.valueOf();\n time +=\n MS_PER_HOUR -\n mod$1(\n time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),\n MS_PER_HOUR\n ) -\n 1;\n break;\n case 'minute':\n time = this._d.valueOf();\n time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1;\n break;\n case 'second':\n time = this._d.valueOf();\n time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1;\n break;\n }\n\n this._d.setTime(time);\n hooks.updateOffset(this, true);\n return this;\n }\n\n function valueOf() {\n return this._d.valueOf() - (this._offset || 0) * 60000;\n }\n\n function unix() {\n return Math.floor(this.valueOf() / 1000);\n }\n\n function toDate() {\n return new Date(this.valueOf());\n }\n\n function toArray() {\n var m = this;\n return [\n m.year(),\n m.month(),\n m.date(),\n m.hour(),\n m.minute(),\n m.second(),\n m.millisecond(),\n ];\n }\n\n function toObject() {\n var m = this;\n return {\n years: m.year(),\n months: m.month(),\n date: m.date(),\n hours: m.hours(),\n minutes: m.minutes(),\n seconds: m.seconds(),\n milliseconds: m.milliseconds(),\n };\n }\n\n function toJSON() {\n // new Date(NaN).toJSON() === null\n return this.isValid() ? this.toISOString() : null;\n }\n\n function isValid$2() {\n return isValid(this);\n }\n\n function parsingFlags() {\n return extend({}, getParsingFlags(this));\n }\n\n function invalidAt() {\n return getParsingFlags(this).overflow;\n }\n\n function creationData() {\n return {\n input: this._i,\n format: this._f,\n locale: this._locale,\n isUTC: this._isUTC,\n strict: this._strict,\n };\n }\n\n addFormatToken('N', 0, 0, 'eraAbbr');\n addFormatToken('NN', 0, 0, 'eraAbbr');\n addFormatToken('NNN', 0, 0, 'eraAbbr');\n addFormatToken('NNNN', 0, 0, 'eraName');\n addFormatToken('NNNNN', 0, 0, 'eraNarrow');\n\n addFormatToken('y', ['y', 1], 'yo', 'eraYear');\n addFormatToken('y', ['yy', 2], 0, 'eraYear');\n addFormatToken('y', ['yyy', 3], 0, 'eraYear');\n addFormatToken('y', ['yyyy', 4], 0, 'eraYear');\n\n addRegexToken('N', matchEraAbbr);\n addRegexToken('NN', matchEraAbbr);\n addRegexToken('NNN', matchEraAbbr);\n addRegexToken('NNNN', matchEraName);\n addRegexToken('NNNNN', matchEraNarrow);\n\n addParseToken(\n ['N', 'NN', 'NNN', 'NNNN', 'NNNNN'],\n function (input, array, config, token) {\n var era = config._locale.erasParse(input, token, config._strict);\n if (era) {\n getParsingFlags(config).era = era;\n } else {\n getParsingFlags(config).invalidEra = input;\n }\n }\n );\n\n addRegexToken('y', matchUnsigned);\n addRegexToken('yy', matchUnsigned);\n addRegexToken('yyy', matchUnsigned);\n addRegexToken('yyyy', matchUnsigned);\n addRegexToken('yo', matchEraYearOrdinal);\n\n addParseToken(['y', 'yy', 'yyy', 'yyyy'], YEAR);\n addParseToken(['yo'], function (input, array, config, token) {\n var match;\n if (config._locale._eraYearOrdinalRegex) {\n match = input.match(config._locale._eraYearOrdinalRegex);\n }\n\n if (config._locale.eraYearOrdinalParse) {\n array[YEAR] = config._locale.eraYearOrdinalParse(input, match);\n } else {\n array[YEAR] = parseInt(input, 10);\n }\n });\n\n function localeEras(m, format) {\n var i,\n l,\n date,\n eras = this._eras || getLocale('en')._eras;\n for (i = 0, l = eras.length; i < l; ++i) {\n switch (typeof eras[i].since) {\n case 'string':\n // truncate time\n date = hooks(eras[i].since).startOf('day');\n eras[i].since = date.valueOf();\n break;\n }\n\n switch (typeof eras[i].until) {\n case 'undefined':\n eras[i].until = +Infinity;\n break;\n case 'string':\n // truncate time\n date = hooks(eras[i].until).startOf('day').valueOf();\n eras[i].until = date.valueOf();\n break;\n }\n }\n return eras;\n }\n\n function localeErasParse(eraName, format, strict) {\n var i,\n l,\n eras = this.eras(),\n name,\n abbr,\n narrow;\n eraName = eraName.toUpperCase();\n\n for (i = 0, l = eras.length; i < l; ++i) {\n name = eras[i].name.toUpperCase();\n abbr = eras[i].abbr.toUpperCase();\n narrow = eras[i].narrow.toUpperCase();\n\n if (strict) {\n switch (format) {\n case 'N':\n case 'NN':\n case 'NNN':\n if (abbr === eraName) {\n return eras[i];\n }\n break;\n\n case 'NNNN':\n if (name === eraName) {\n return eras[i];\n }\n break;\n\n case 'NNNNN':\n if (narrow === eraName) {\n return eras[i];\n }\n break;\n }\n } else if ([name, abbr, narrow].indexOf(eraName) >= 0) {\n return eras[i];\n }\n }\n }\n\n function localeErasConvertYear(era, year) {\n var dir = era.since <= era.until ? +1 : -1;\n if (year === undefined) {\n return hooks(era.since).year();\n } else {\n return hooks(era.since).year() + (year - era.offset) * dir;\n }\n }\n\n function getEraName() {\n var i,\n l,\n val,\n eras = this.localeData().eras();\n for (i = 0, l = eras.length; i < l; ++i) {\n // truncate time\n val = this.clone().startOf('day').valueOf();\n\n if (eras[i].since <= val && val <= eras[i].until) {\n return eras[i].name;\n }\n if (eras[i].until <= val && val <= eras[i].since) {\n return eras[i].name;\n }\n }\n\n return '';\n }\n\n function getEraNarrow() {\n var i,\n l,\n val,\n eras = this.localeData().eras();\n for (i = 0, l = eras.length; i < l; ++i) {\n // truncate time\n val = this.clone().startOf('day').valueOf();\n\n if (eras[i].since <= val && val <= eras[i].until) {\n return eras[i].narrow;\n }\n if (eras[i].until <= val && val <= eras[i].since) {\n return eras[i].narrow;\n }\n }\n\n return '';\n }\n\n function getEraAbbr() {\n var i,\n l,\n val,\n eras = this.localeData().eras();\n for (i = 0, l = eras.length; i < l; ++i) {\n // truncate time\n val = this.clone().startOf('day').valueOf();\n\n if (eras[i].since <= val && val <= eras[i].until) {\n return eras[i].abbr;\n }\n if (eras[i].until <= val && val <= eras[i].since) {\n return eras[i].abbr;\n }\n }\n\n return '';\n }\n\n function getEraYear() {\n var i,\n l,\n dir,\n val,\n eras = this.localeData().eras();\n for (i = 0, l = eras.length; i < l; ++i) {\n dir = eras[i].since <= eras[i].until ? +1 : -1;\n\n // truncate time\n val = this.clone().startOf('day').valueOf();\n\n if (\n (eras[i].since <= val && val <= eras[i].until) ||\n (eras[i].until <= val && val <= eras[i].since)\n ) {\n return (\n (this.year() - hooks(eras[i].since).year()) * dir +\n eras[i].offset\n );\n }\n }\n\n return this.year();\n }\n\n function erasNameRegex(isStrict) {\n if (!hasOwnProp(this, '_erasNameRegex')) {\n computeErasParse.call(this);\n }\n return isStrict ? this._erasNameRegex : this._erasRegex;\n }\n\n function erasAbbrRegex(isStrict) {\n if (!hasOwnProp(this, '_erasAbbrRegex')) {\n computeErasParse.call(this);\n }\n return isStrict ? this._erasAbbrRegex : this._erasRegex;\n }\n\n function erasNarrowRegex(isStrict) {\n if (!hasOwnProp(this, '_erasNarrowRegex')) {\n computeErasParse.call(this);\n }\n return isStrict ? this._erasNarrowRegex : this._erasRegex;\n }\n\n function matchEraAbbr(isStrict, locale) {\n return locale.erasAbbrRegex(isStrict);\n }\n\n function matchEraName(isStrict, locale) {\n return locale.erasNameRegex(isStrict);\n }\n\n function matchEraNarrow(isStrict, locale) {\n return locale.erasNarrowRegex(isStrict);\n }\n\n function matchEraYearOrdinal(isStrict, locale) {\n return locale._eraYearOrdinalRegex || matchUnsigned;\n }\n\n function computeErasParse() {\n var abbrPieces = [],\n namePieces = [],\n narrowPieces = [],\n mixedPieces = [],\n i,\n l,\n erasName,\n erasAbbr,\n erasNarrow,\n eras = this.eras();\n\n for (i = 0, l = eras.length; i < l; ++i) {\n erasName = regexEscape(eras[i].name);\n erasAbbr = regexEscape(eras[i].abbr);\n erasNarrow = regexEscape(eras[i].narrow);\n\n namePieces.push(erasName);\n abbrPieces.push(erasAbbr);\n narrowPieces.push(erasNarrow);\n mixedPieces.push(erasName);\n mixedPieces.push(erasAbbr);\n mixedPieces.push(erasNarrow);\n }\n\n this._erasRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n this._erasNameRegex = new RegExp('^(' + namePieces.join('|') + ')', 'i');\n this._erasAbbrRegex = new RegExp('^(' + abbrPieces.join('|') + ')', 'i');\n this._erasNarrowRegex = new RegExp(\n '^(' + narrowPieces.join('|') + ')',\n 'i'\n );\n }\n\n // FORMATTING\n\n addFormatToken(0, ['gg', 2], 0, function () {\n return this.weekYear() % 100;\n });\n\n addFormatToken(0, ['GG', 2], 0, function () {\n return this.isoWeekYear() % 100;\n });\n\n function addWeekYearFormatToken(token, getter) {\n addFormatToken(0, [token, token.length], 0, getter);\n }\n\n addWeekYearFormatToken('gggg', 'weekYear');\n addWeekYearFormatToken('ggggg', 'weekYear');\n addWeekYearFormatToken('GGGG', 'isoWeekYear');\n addWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n // ALIASES\n\n // PARSING\n\n addRegexToken('G', matchSigned);\n addRegexToken('g', matchSigned);\n addRegexToken('GG', match1to2, match2);\n addRegexToken('gg', match1to2, match2);\n addRegexToken('GGGG', match1to4, match4);\n addRegexToken('gggg', match1to4, match4);\n addRegexToken('GGGGG', match1to6, match6);\n addRegexToken('ggggg', match1to6, match6);\n\n addWeekParseToken(\n ['gggg', 'ggggg', 'GGGG', 'GGGGG'],\n function (input, week, config, token) {\n week[token.substr(0, 2)] = toInt(input);\n }\n );\n\n addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n week[token] = hooks.parseTwoDigitYear(input);\n });\n\n // MOMENTS\n\n function getSetWeekYear(input) {\n return getSetWeekYearHelper.call(\n this,\n input,\n this.week(),\n this.weekday() + this.localeData()._week.dow,\n this.localeData()._week.dow,\n this.localeData()._week.doy\n );\n }\n\n function getSetISOWeekYear(input) {\n return getSetWeekYearHelper.call(\n this,\n input,\n this.isoWeek(),\n this.isoWeekday(),\n 1,\n 4\n );\n }\n\n function getISOWeeksInYear() {\n return weeksInYear(this.year(), 1, 4);\n }\n\n function getISOWeeksInISOWeekYear() {\n return weeksInYear(this.isoWeekYear(), 1, 4);\n }\n\n function getWeeksInYear() {\n var weekInfo = this.localeData()._week;\n return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n }\n\n function getWeeksInWeekYear() {\n var weekInfo = this.localeData()._week;\n return weeksInYear(this.weekYear(), weekInfo.dow, weekInfo.doy);\n }\n\n function getSetWeekYearHelper(input, week, weekday, dow, doy) {\n var weeksTarget;\n if (input == null) {\n return weekOfYear(this, dow, doy).year;\n } else {\n weeksTarget = weeksInYear(input, dow, doy);\n if (week > weeksTarget) {\n week = weeksTarget;\n }\n return setWeekAll.call(this, input, week, weekday, dow, doy);\n }\n }\n\n function setWeekAll(weekYear, week, weekday, dow, doy) {\n var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),\n date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);\n\n this.year(date.getUTCFullYear());\n this.month(date.getUTCMonth());\n this.date(date.getUTCDate());\n return this;\n }\n\n // FORMATTING\n\n addFormatToken('Q', 0, 'Qo', 'quarter');\n\n // PARSING\n\n addRegexToken('Q', match1);\n addParseToken('Q', function (input, array) {\n array[MONTH] = (toInt(input) - 1) * 3;\n });\n\n // MOMENTS\n\n function getSetQuarter(input) {\n return input == null\n ? Math.ceil((this.month() + 1) / 3)\n : this.month((input - 1) * 3 + (this.month() % 3));\n }\n\n // FORMATTING\n\n addFormatToken('D', ['DD', 2], 'Do', 'date');\n\n // PARSING\n\n addRegexToken('D', match1to2, match1to2NoLeadingZero);\n addRegexToken('DD', match1to2, match2);\n addRegexToken('Do', function (isStrict, locale) {\n // TODO: Remove \"ordinalParse\" fallback in next major release.\n return isStrict\n ? locale._dayOfMonthOrdinalParse || locale._ordinalParse\n : locale._dayOfMonthOrdinalParseLenient;\n });\n\n addParseToken(['D', 'DD'], DATE);\n addParseToken('Do', function (input, array) {\n array[DATE] = toInt(input.match(match1to2)[0]);\n });\n\n // MOMENTS\n\n var getSetDayOfMonth = makeGetSet('Date', true);\n\n // FORMATTING\n\n addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n // PARSING\n\n addRegexToken('DDD', match1to3);\n addRegexToken('DDDD', match3);\n addParseToken(['DDD', 'DDDD'], function (input, array, config) {\n config._dayOfYear = toInt(input);\n });\n\n // HELPERS\n\n // MOMENTS\n\n function getSetDayOfYear(input) {\n var dayOfYear =\n Math.round(\n (this.clone().startOf('day') - this.clone().startOf('year')) / 864e5\n ) + 1;\n return input == null ? dayOfYear : this.add(input - dayOfYear, 'd');\n }\n\n // FORMATTING\n\n addFormatToken('m', ['mm', 2], 0, 'minute');\n\n // PARSING\n\n addRegexToken('m', match1to2, match1to2HasZero);\n addRegexToken('mm', match1to2, match2);\n addParseToken(['m', 'mm'], MINUTE);\n\n // MOMENTS\n\n var getSetMinute = makeGetSet('Minutes', false);\n\n // FORMATTING\n\n addFormatToken('s', ['ss', 2], 0, 'second');\n\n // PARSING\n\n addRegexToken('s', match1to2, match1to2HasZero);\n addRegexToken('ss', match1to2, match2);\n addParseToken(['s', 'ss'], SECOND);\n\n // MOMENTS\n\n var getSetSecond = makeGetSet('Seconds', false);\n\n // FORMATTING\n\n addFormatToken('S', 0, 0, function () {\n return ~~(this.millisecond() / 100);\n });\n\n addFormatToken(0, ['SS', 2], 0, function () {\n return ~~(this.millisecond() / 10);\n });\n\n addFormatToken(0, ['SSS', 3], 0, 'millisecond');\n addFormatToken(0, ['SSSS', 4], 0, function () {\n return this.millisecond() * 10;\n });\n addFormatToken(0, ['SSSSS', 5], 0, function () {\n return this.millisecond() * 100;\n });\n addFormatToken(0, ['SSSSSS', 6], 0, function () {\n return this.millisecond() * 1000;\n });\n addFormatToken(0, ['SSSSSSS', 7], 0, function () {\n return this.millisecond() * 10000;\n });\n addFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n return this.millisecond() * 100000;\n });\n addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n return this.millisecond() * 1000000;\n });\n\n // PARSING\n\n addRegexToken('S', match1to3, match1);\n addRegexToken('SS', match1to3, match2);\n addRegexToken('SSS', match1to3, match3);\n\n var token, getSetMillisecond;\n for (token = 'SSSS'; token.length <= 9; token += 'S') {\n addRegexToken(token, matchUnsigned);\n }\n\n function parseMs(input, array) {\n array[MILLISECOND] = toInt(('0.' + input) * 1000);\n }\n\n for (token = 'S'; token.length <= 9; token += 'S') {\n addParseToken(token, parseMs);\n }\n\n getSetMillisecond = makeGetSet('Milliseconds', false);\n\n // FORMATTING\n\n addFormatToken('z', 0, 0, 'zoneAbbr');\n addFormatToken('zz', 0, 0, 'zoneName');\n\n // MOMENTS\n\n function getZoneAbbr() {\n return this._isUTC ? 'UTC' : '';\n }\n\n function getZoneName() {\n return this._isUTC ? 'Coordinated Universal Time' : '';\n }\n\n var proto = Moment.prototype;\n\n proto.add = add;\n proto.calendar = calendar$1;\n proto.clone = clone;\n proto.diff = diff;\n proto.endOf = endOf;\n proto.format = format;\n proto.from = from;\n proto.fromNow = fromNow;\n proto.to = to;\n proto.toNow = toNow;\n proto.get = stringGet;\n proto.invalidAt = invalidAt;\n proto.isAfter = isAfter;\n proto.isBefore = isBefore;\n proto.isBetween = isBetween;\n proto.isSame = isSame;\n proto.isSameOrAfter = isSameOrAfter;\n proto.isSameOrBefore = isSameOrBefore;\n proto.isValid = isValid$2;\n proto.lang = lang;\n proto.locale = locale;\n proto.localeData = localeData;\n proto.max = prototypeMax;\n proto.min = prototypeMin;\n proto.parsingFlags = parsingFlags;\n proto.set = stringSet;\n proto.startOf = startOf;\n proto.subtract = subtract;\n proto.toArray = toArray;\n proto.toObject = toObject;\n proto.toDate = toDate;\n proto.toISOString = toISOString;\n proto.inspect = inspect;\n if (typeof Symbol !== 'undefined' && Symbol.for != null) {\n proto[Symbol.for('nodejs.util.inspect.custom')] = function () {\n return 'Moment<' + this.format() + '>';\n };\n }\n proto.toJSON = toJSON;\n proto.toString = toString;\n proto.unix = unix;\n proto.valueOf = valueOf;\n proto.creationData = creationData;\n proto.eraName = getEraName;\n proto.eraNarrow = getEraNarrow;\n proto.eraAbbr = getEraAbbr;\n proto.eraYear = getEraYear;\n proto.year = getSetYear;\n proto.isLeapYear = getIsLeapYear;\n proto.weekYear = getSetWeekYear;\n proto.isoWeekYear = getSetISOWeekYear;\n proto.quarter = proto.quarters = getSetQuarter;\n proto.month = getSetMonth;\n proto.daysInMonth = getDaysInMonth;\n proto.week = proto.weeks = getSetWeek;\n proto.isoWeek = proto.isoWeeks = getSetISOWeek;\n proto.weeksInYear = getWeeksInYear;\n proto.weeksInWeekYear = getWeeksInWeekYear;\n proto.isoWeeksInYear = getISOWeeksInYear;\n proto.isoWeeksInISOWeekYear = getISOWeeksInISOWeekYear;\n proto.date = getSetDayOfMonth;\n proto.day = proto.days = getSetDayOfWeek;\n proto.weekday = getSetLocaleDayOfWeek;\n proto.isoWeekday = getSetISODayOfWeek;\n proto.dayOfYear = getSetDayOfYear;\n proto.hour = proto.hours = getSetHour;\n proto.minute = proto.minutes = getSetMinute;\n proto.second = proto.seconds = getSetSecond;\n proto.millisecond = proto.milliseconds = getSetMillisecond;\n proto.utcOffset = getSetOffset;\n proto.utc = setOffsetToUTC;\n proto.local = setOffsetToLocal;\n proto.parseZone = setOffsetToParsedOffset;\n proto.hasAlignedHourOffset = hasAlignedHourOffset;\n proto.isDST = isDaylightSavingTime;\n proto.isLocal = isLocal;\n proto.isUtcOffset = isUtcOffset;\n proto.isUtc = isUtc;\n proto.isUTC = isUtc;\n proto.zoneAbbr = getZoneAbbr;\n proto.zoneName = getZoneName;\n proto.dates = deprecate(\n 'dates accessor is deprecated. Use date instead.',\n getSetDayOfMonth\n );\n proto.months = deprecate(\n 'months accessor is deprecated. Use month instead',\n getSetMonth\n );\n proto.years = deprecate(\n 'years accessor is deprecated. Use year instead',\n getSetYear\n );\n proto.zone = deprecate(\n 'moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/',\n getSetZone\n );\n proto.isDSTShifted = deprecate(\n 'isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information',\n isDaylightSavingTimeShifted\n );\n\n function createUnix(input) {\n return createLocal(input * 1000);\n }\n\n function createInZone() {\n return createLocal.apply(null, arguments).parseZone();\n }\n\n function preParsePostFormat(string) {\n return string;\n }\n\n var proto$1 = Locale.prototype;\n\n proto$1.calendar = calendar;\n proto$1.longDateFormat = longDateFormat;\n proto$1.invalidDate = invalidDate;\n proto$1.ordinal = ordinal;\n proto$1.preparse = preParsePostFormat;\n proto$1.postformat = preParsePostFormat;\n proto$1.relativeTime = relativeTime;\n proto$1.pastFuture = pastFuture;\n proto$1.set = set;\n proto$1.eras = localeEras;\n proto$1.erasParse = localeErasParse;\n proto$1.erasConvertYear = localeErasConvertYear;\n proto$1.erasAbbrRegex = erasAbbrRegex;\n proto$1.erasNameRegex = erasNameRegex;\n proto$1.erasNarrowRegex = erasNarrowRegex;\n\n proto$1.months = localeMonths;\n proto$1.monthsShort = localeMonthsShort;\n proto$1.monthsParse = localeMonthsParse;\n proto$1.monthsRegex = monthsRegex;\n proto$1.monthsShortRegex = monthsShortRegex;\n proto$1.week = localeWeek;\n proto$1.firstDayOfYear = localeFirstDayOfYear;\n proto$1.firstDayOfWeek = localeFirstDayOfWeek;\n\n proto$1.weekdays = localeWeekdays;\n proto$1.weekdaysMin = localeWeekdaysMin;\n proto$1.weekdaysShort = localeWeekdaysShort;\n proto$1.weekdaysParse = localeWeekdaysParse;\n\n proto$1.weekdaysRegex = weekdaysRegex;\n proto$1.weekdaysShortRegex = weekdaysShortRegex;\n proto$1.weekdaysMinRegex = weekdaysMinRegex;\n\n proto$1.isPM = localeIsPM;\n proto$1.meridiem = localeMeridiem;\n\n function get$1(format, index, field, setter) {\n var locale = getLocale(),\n utc = createUTC().set(setter, index);\n return locale[field](utc, format);\n }\n\n function listMonthsImpl(format, index, field) {\n if (isNumber(format)) {\n index = format;\n format = undefined;\n }\n\n format = format || '';\n\n if (index != null) {\n return get$1(format, index, field, 'month');\n }\n\n var i,\n out = [];\n for (i = 0; i < 12; i++) {\n out[i] = get$1(format, i, field, 'month');\n }\n return out;\n }\n\n // ()\n // (5)\n // (fmt, 5)\n // (fmt)\n // (true)\n // (true, 5)\n // (true, fmt, 5)\n // (true, fmt)\n function listWeekdaysImpl(localeSorted, format, index, field) {\n if (typeof localeSorted === 'boolean') {\n if (isNumber(format)) {\n index = format;\n format = undefined;\n }\n\n format = format || '';\n } else {\n format = localeSorted;\n index = format;\n localeSorted = false;\n\n if (isNumber(format)) {\n index = format;\n format = undefined;\n }\n\n format = format || '';\n }\n\n var locale = getLocale(),\n shift = localeSorted ? locale._week.dow : 0,\n i,\n out = [];\n\n if (index != null) {\n return get$1(format, (index + shift) % 7, field, 'day');\n }\n\n for (i = 0; i < 7; i++) {\n out[i] = get$1(format, (i + shift) % 7, field, 'day');\n }\n return out;\n }\n\n function listMonths(format, index) {\n return listMonthsImpl(format, index, 'months');\n }\n\n function listMonthsShort(format, index) {\n return listMonthsImpl(format, index, 'monthsShort');\n }\n\n function listWeekdays(localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n }\n\n function listWeekdaysShort(localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n }\n\n function listWeekdaysMin(localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n }\n\n getSetGlobalLocale('en', {\n eras: [\n {\n since: '0001-01-01',\n until: +Infinity,\n offset: 1,\n name: 'Anno Domini',\n narrow: 'AD',\n abbr: 'AD',\n },\n {\n since: '0000-12-31',\n until: -Infinity,\n offset: 1,\n name: 'Before Christ',\n narrow: 'BC',\n abbr: 'BC',\n },\n ],\n dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n ordinal: function (number) {\n var b = number % 10,\n output =\n toInt((number % 100) / 10) === 1\n ? 'th'\n : b === 1\n ? 'st'\n : b === 2\n ? 'nd'\n : b === 3\n ? 'rd'\n : 'th';\n return number + output;\n },\n });\n\n // Side effect imports\n\n hooks.lang = deprecate(\n 'moment.lang is deprecated. Use moment.locale instead.',\n getSetGlobalLocale\n );\n hooks.langData = deprecate(\n 'moment.langData is deprecated. Use moment.localeData instead.',\n getLocale\n );\n\n var mathAbs = Math.abs;\n\n function abs() {\n var data = this._data;\n\n this._milliseconds = mathAbs(this._milliseconds);\n this._days = mathAbs(this._days);\n this._months = mathAbs(this._months);\n\n data.milliseconds = mathAbs(data.milliseconds);\n data.seconds = mathAbs(data.seconds);\n data.minutes = mathAbs(data.minutes);\n data.hours = mathAbs(data.hours);\n data.months = mathAbs(data.months);\n data.years = mathAbs(data.years);\n\n return this;\n }\n\n function addSubtract$1(duration, input, value, direction) {\n var other = createDuration(input, value);\n\n duration._milliseconds += direction * other._milliseconds;\n duration._days += direction * other._days;\n duration._months += direction * other._months;\n\n return duration._bubble();\n }\n\n // supports only 2.0-style add(1, 's') or add(duration)\n function add$1(input, value) {\n return addSubtract$1(this, input, value, 1);\n }\n\n // supports only 2.0-style subtract(1, 's') or subtract(duration)\n function subtract$1(input, value) {\n return addSubtract$1(this, input, value, -1);\n }\n\n function absCeil(number) {\n if (number < 0) {\n return Math.floor(number);\n } else {\n return Math.ceil(number);\n }\n }\n\n function bubble() {\n var milliseconds = this._milliseconds,\n days = this._days,\n months = this._months,\n data = this._data,\n seconds,\n minutes,\n hours,\n years,\n monthsFromDays;\n\n // if we have a mix of positive and negative values, bubble down first\n // check: https://github.com/moment/moment/issues/2166\n if (\n !(\n (milliseconds >= 0 && days >= 0 && months >= 0) ||\n (milliseconds <= 0 && days <= 0 && months <= 0)\n )\n ) {\n milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\n days = 0;\n months = 0;\n }\n\n // The following code bubbles up values, see the tests for\n // examples of what that means.\n data.milliseconds = milliseconds % 1000;\n\n seconds = absFloor(milliseconds / 1000);\n data.seconds = seconds % 60;\n\n minutes = absFloor(seconds / 60);\n data.minutes = minutes % 60;\n\n hours = absFloor(minutes / 60);\n data.hours = hours % 24;\n\n days += absFloor(hours / 24);\n\n // convert days to months\n monthsFromDays = absFloor(daysToMonths(days));\n months += monthsFromDays;\n days -= absCeil(monthsToDays(monthsFromDays));\n\n // 12 months -> 1 year\n years = absFloor(months / 12);\n months %= 12;\n\n data.days = days;\n data.months = months;\n data.years = years;\n\n return this;\n }\n\n function daysToMonths(days) {\n // 400 years have 146097 days (taking into account leap year rules)\n // 400 years have 12 months === 4800\n return (days * 4800) / 146097;\n }\n\n function monthsToDays(months) {\n // the reverse of daysToMonths\n return (months * 146097) / 4800;\n }\n\n function as(units) {\n if (!this.isValid()) {\n return NaN;\n }\n var days,\n months,\n milliseconds = this._milliseconds;\n\n units = normalizeUnits(units);\n\n if (units === 'month' || units === 'quarter' || units === 'year') {\n days = this._days + milliseconds / 864e5;\n months = this._months + daysToMonths(days);\n switch (units) {\n case 'month':\n return months;\n case 'quarter':\n return months / 3;\n case 'year':\n return months / 12;\n }\n } else {\n // handle milliseconds separately because of floating point math errors (issue #1867)\n days = this._days + Math.round(monthsToDays(this._months));\n switch (units) {\n case 'week':\n return days / 7 + milliseconds / 6048e5;\n case 'day':\n return days + milliseconds / 864e5;\n case 'hour':\n return days * 24 + milliseconds / 36e5;\n case 'minute':\n return days * 1440 + milliseconds / 6e4;\n case 'second':\n return days * 86400 + milliseconds / 1000;\n // Math.floor prevents floating point math errors here\n case 'millisecond':\n return Math.floor(days * 864e5) + milliseconds;\n default:\n throw new Error('Unknown unit ' + units);\n }\n }\n }\n\n function makeAs(alias) {\n return function () {\n return this.as(alias);\n };\n }\n\n var asMilliseconds = makeAs('ms'),\n asSeconds = makeAs('s'),\n asMinutes = makeAs('m'),\n asHours = makeAs('h'),\n asDays = makeAs('d'),\n asWeeks = makeAs('w'),\n asMonths = makeAs('M'),\n asQuarters = makeAs('Q'),\n asYears = makeAs('y'),\n valueOf$1 = asMilliseconds;\n\n function clone$1() {\n return createDuration(this);\n }\n\n function get$2(units) {\n units = normalizeUnits(units);\n return this.isValid() ? this[units + 's']() : NaN;\n }\n\n function makeGetter(name) {\n return function () {\n return this.isValid() ? this._data[name] : NaN;\n };\n }\n\n var milliseconds = makeGetter('milliseconds'),\n seconds = makeGetter('seconds'),\n minutes = makeGetter('minutes'),\n hours = makeGetter('hours'),\n days = makeGetter('days'),\n months = makeGetter('months'),\n years = makeGetter('years');\n\n function weeks() {\n return absFloor(this.days() / 7);\n }\n\n var round = Math.round,\n thresholds = {\n ss: 44, // a few seconds to seconds\n s: 45, // seconds to minute\n m: 45, // minutes to hour\n h: 22, // hours to day\n d: 26, // days to month/week\n w: null, // weeks to month\n M: 11, // months to year\n };\n\n // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\n function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n }\n\n function relativeTime$1(posNegDuration, withoutSuffix, thresholds, locale) {\n var duration = createDuration(posNegDuration).abs(),\n seconds = round(duration.as('s')),\n minutes = round(duration.as('m')),\n hours = round(duration.as('h')),\n days = round(duration.as('d')),\n months = round(duration.as('M')),\n weeks = round(duration.as('w')),\n years = round(duration.as('y')),\n a =\n (seconds <= thresholds.ss && ['s', seconds]) ||\n (seconds < thresholds.s && ['ss', seconds]) ||\n (minutes <= 1 && ['m']) ||\n (minutes < thresholds.m && ['mm', minutes]) ||\n (hours <= 1 && ['h']) ||\n (hours < thresholds.h && ['hh', hours]) ||\n (days <= 1 && ['d']) ||\n (days < thresholds.d && ['dd', days]);\n\n if (thresholds.w != null) {\n a =\n a ||\n (weeks <= 1 && ['w']) ||\n (weeks < thresholds.w && ['ww', weeks]);\n }\n a = a ||\n (months <= 1 && ['M']) ||\n (months < thresholds.M && ['MM', months]) ||\n (years <= 1 && ['y']) || ['yy', years];\n\n a[2] = withoutSuffix;\n a[3] = +posNegDuration > 0;\n a[4] = locale;\n return substituteTimeAgo.apply(null, a);\n }\n\n // This function allows you to set the rounding function for relative time strings\n function getSetRelativeTimeRounding(roundingFunction) {\n if (roundingFunction === undefined) {\n return round;\n }\n if (typeof roundingFunction === 'function') {\n round = roundingFunction;\n return true;\n }\n return false;\n }\n\n // This function allows you to set a threshold for relative time strings\n function getSetRelativeTimeThreshold(threshold, limit) {\n if (thresholds[threshold] === undefined) {\n return false;\n }\n if (limit === undefined) {\n return thresholds[threshold];\n }\n thresholds[threshold] = limit;\n if (threshold === 's') {\n thresholds.ss = limit - 1;\n }\n return true;\n }\n\n function humanize(argWithSuffix, argThresholds) {\n if (!this.isValid()) {\n return this.localeData().invalidDate();\n }\n\n var withSuffix = false,\n th = thresholds,\n locale,\n output;\n\n if (typeof argWithSuffix === 'object') {\n argThresholds = argWithSuffix;\n argWithSuffix = false;\n }\n if (typeof argWithSuffix === 'boolean') {\n withSuffix = argWithSuffix;\n }\n if (typeof argThresholds === 'object') {\n th = Object.assign({}, thresholds, argThresholds);\n if (argThresholds.s != null && argThresholds.ss == null) {\n th.ss = argThresholds.s - 1;\n }\n }\n\n locale = this.localeData();\n output = relativeTime$1(this, !withSuffix, th, locale);\n\n if (withSuffix) {\n output = locale.pastFuture(+this, output);\n }\n\n return locale.postformat(output);\n }\n\n var abs$1 = Math.abs;\n\n function sign(x) {\n return (x > 0) - (x < 0) || +x;\n }\n\n function toISOString$1() {\n // for ISO strings we do not use the normal bubbling rules:\n // * milliseconds bubble up until they become hours\n // * days do not bubble at all\n // * months bubble up until they become years\n // This is because there is no context-free conversion between hours and days\n // (think of clock changes)\n // and also not between days and months (28-31 days per month)\n if (!this.isValid()) {\n return this.localeData().invalidDate();\n }\n\n var seconds = abs$1(this._milliseconds) / 1000,\n days = abs$1(this._days),\n months = abs$1(this._months),\n minutes,\n hours,\n years,\n s,\n total = this.asSeconds(),\n totalSign,\n ymSign,\n daysSign,\n hmsSign;\n\n if (!total) {\n // this is the same as C#'s (Noda) and python (isodate)...\n // but not other JS (goog.date)\n return 'P0D';\n }\n\n // 3600 seconds -> 60 minutes -> 1 hour\n minutes = absFloor(seconds / 60);\n hours = absFloor(minutes / 60);\n seconds %= 60;\n minutes %= 60;\n\n // 12 months -> 1 year\n years = absFloor(months / 12);\n months %= 12;\n\n // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n s = seconds ? seconds.toFixed(3).replace(/\\.?0+$/, '') : '';\n\n totalSign = total < 0 ? '-' : '';\n ymSign = sign(this._months) !== sign(total) ? '-' : '';\n daysSign = sign(this._days) !== sign(total) ? '-' : '';\n hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';\n\n return (\n totalSign +\n 'P' +\n (years ? ymSign + years + 'Y' : '') +\n (months ? ymSign + months + 'M' : '') +\n (days ? daysSign + days + 'D' : '') +\n (hours || minutes || seconds ? 'T' : '') +\n (hours ? hmsSign + hours + 'H' : '') +\n (minutes ? hmsSign + minutes + 'M' : '') +\n (seconds ? hmsSign + s + 'S' : '')\n );\n }\n\n var proto$2 = Duration.prototype;\n\n proto$2.isValid = isValid$1;\n proto$2.abs = abs;\n proto$2.add = add$1;\n proto$2.subtract = subtract$1;\n proto$2.as = as;\n proto$2.asMilliseconds = asMilliseconds;\n proto$2.asSeconds = asSeconds;\n proto$2.asMinutes = asMinutes;\n proto$2.asHours = asHours;\n proto$2.asDays = asDays;\n proto$2.asWeeks = asWeeks;\n proto$2.asMonths = asMonths;\n proto$2.asQuarters = asQuarters;\n proto$2.asYears = asYears;\n proto$2.valueOf = valueOf$1;\n proto$2._bubble = bubble;\n proto$2.clone = clone$1;\n proto$2.get = get$2;\n proto$2.milliseconds = milliseconds;\n proto$2.seconds = seconds;\n proto$2.minutes = minutes;\n proto$2.hours = hours;\n proto$2.days = days;\n proto$2.weeks = weeks;\n proto$2.months = months;\n proto$2.years = years;\n proto$2.humanize = humanize;\n proto$2.toISOString = toISOString$1;\n proto$2.toString = toISOString$1;\n proto$2.toJSON = toISOString$1;\n proto$2.locale = locale;\n proto$2.localeData = localeData;\n\n proto$2.toIsoString = deprecate(\n 'toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)',\n toISOString$1\n );\n proto$2.lang = lang;\n\n // FORMATTING\n\n addFormatToken('X', 0, 0, 'unix');\n addFormatToken('x', 0, 0, 'valueOf');\n\n // PARSING\n\n addRegexToken('x', matchSigned);\n addRegexToken('X', matchTimestamp);\n addParseToken('X', function (input, array, config) {\n config._d = new Date(parseFloat(input) * 1000);\n });\n addParseToken('x', function (input, array, config) {\n config._d = new Date(toInt(input));\n });\n\n //! moment.js\n\n hooks.version = '2.30.1';\n\n setHookCallback(createLocal);\n\n hooks.fn = proto;\n hooks.min = min;\n hooks.max = max;\n hooks.now = now;\n hooks.utc = createUTC;\n hooks.unix = createUnix;\n hooks.months = listMonths;\n hooks.isDate = isDate;\n hooks.locale = getSetGlobalLocale;\n hooks.invalid = createInvalid;\n hooks.duration = createDuration;\n hooks.isMoment = isMoment;\n hooks.weekdays = listWeekdays;\n hooks.parseZone = createInZone;\n hooks.localeData = getLocale;\n hooks.isDuration = isDuration;\n hooks.monthsShort = listMonthsShort;\n hooks.weekdaysMin = listWeekdaysMin;\n hooks.defineLocale = defineLocale;\n hooks.updateLocale = updateLocale;\n hooks.locales = listLocales;\n hooks.weekdaysShort = listWeekdaysShort;\n hooks.normalizeUnits = normalizeUnits;\n hooks.relativeTimeRounding = getSetRelativeTimeRounding;\n hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;\n hooks.calendarFormat = getCalendarFormat;\n hooks.prototype = proto;\n\n // currently HTML5 input type only supports 24-hour formats\n hooks.HTML5_FMT = {\n DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // \n DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // \n DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // \n DATE: 'YYYY-MM-DD', // \n TIME: 'HH:mm', // \n TIME_SECONDS: 'HH:mm:ss', // \n TIME_MS: 'HH:mm:ss.SSS', // \n WEEK: 'GGGG-[W]WW', // \n MONTH: 'YYYY-MM', // \n };\n\n return hooks;\n\n})));\n"],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJUeXBlU2NyaXB0cy9BYnNlbmNlQ29uZmlybWF0aW9uL3Nhb3AtYWJzZW5jZUNvbmZpcm1hdGlvbi1kZXRhaWxzLWV2ZW50cy50cyIsIlR5cGVTY3JpcHRzL0Fic2VuY2VDb25maXJtYXRpb24vc2FvcC1hYnNlbmNlQ29uZmlybWF0aW9uLWRldGFpbHMtdmlldy50cyIsIlR5cGVTY3JpcHRzL0Fic2VuY2VDb25maXJtYXRpb24vc2FvcC1hYnNlbmNlQ29uZmlybWF0aW9uLXBhcnRpYWxseS1hcHByb3ZlLXZpZXcudHMiLCJUeXBlU2NyaXB0cy9BYnNlbmNlQ29uZmlybWF0aW9uL3Nhb3AtYWJzZW5jZUNvbmZpcm1hdGlvbi1wZW5kaW5nLXZpZXcudHMiLCJUeXBlU2NyaXB0cy9BYnNlbmNlQ29uZmlybWF0aW9uL3Nhb3AtYWJzZW5jZUNvbmZpcm1hdGlvbi1wcm9jZXNzZWQtdmlldy50cyIsIlR5cGVTY3JpcHRzL0Fic2VuY2VDb25maXJtYXRpb24vc2FvcC1hYnNlbmNlQ29uZmlybWF0aW9uLXJlamVjdC12aWV3LnRzIiwiVHlwZVNjcmlwdHMvQWJzZW5jZUNvbmZpcm1hdGlvbi9zYW9wLWFic2VuY2VDb25maXJtYXRpb24tdmlldy50cyIsIlR5cGVTY3JpcHRzL0Fic2VuY2VDb25maXJtYXRpb24vc2FvcC1hYnNlbmNlQ29uZmlybWF0aW9uQ2FsZW5kYXItdmlldy50cyIsIlR5cGVTY3JpcHRzL0Fic2VuY2VDb25maXJtYXRpb24vc2FvcC1lbXBsb3llZUxlYXZlQ2FsZW5kYXItdmlldy50cyIsIlR5cGVTY3JpcHRzL0Fic2VuY2VDb25maXJtYXRpb24vc2FvcC1lbXBsb3llZUxlYXZlTGlzdC1ncmlkLnRzIiwiVHlwZVNjcmlwdHMvQWNjb3VudC9zYW9wLWNoYW5nZS1wd2Qtdmlldy50cyIsIlR5cGVTY3JpcHRzL0FwcFNldHRpbmdzL3Nhb3AtYXBwc2V0dGluZ3Mtdmlldy50cyIsIlR5cGVTY3JpcHRzL0NvbW1vbi9zYW9wLWNvbW1vbi50cyIsIlR5cGVTY3JpcHRzL0NvbXBvbmVudHMvc2FvcC1UcmVlVGFibGUudHMiLCJUeXBlU2NyaXB0cy9Db21wb25lbnRzL3Nhb3AtYXR0YWNobWVudC1saXN0LnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLWNhbGVuZGFyLnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLWNoZWNrYm94LXN3aXRjaC50cyIsIlR5cGVTY3JpcHRzL0NvbXBvbmVudHMvc2FvcC1leHBvcnQudHMiLCJUeXBlU2NyaXB0cy9Db21wb25lbnRzL3Nhb3AtZmxvYXRpbmctbGFiZWwudHMiLCJUeXBlU2NyaXB0cy9Db21wb25lbnRzL3Nhb3AtZ29vZ2xlbWFwcy50cyIsIlR5cGVTY3JpcHRzL0NvbXBvbmVudHMvc2FvcC1ncmlkLWZpbHRlci1Vbml0T3JnLnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLWdyaWQtZmlsdGVyLnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLWdyaWQudHMiLCJUeXBlU2NyaXB0cy9Db21wb25lbnRzL3Nhb3AtaW5wdXQtd2ZsLnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLWlucHV0bWFzay50cyIsIlR5cGVTY3JpcHRzL0NvbXBvbmVudHMvc2FvcC1tZW51LXNpZGViYXIudHMiLCJUeXBlU2NyaXB0cy9Db21wb25lbnRzL3Nhb3AtbWVzc2FnZS1iYW5uZXIudHMiLCJUeXBlU2NyaXB0cy9Db21wb25lbnRzL3Nhb3AtbWVzc2FnZS1kbGcudHMiLCJUeXBlU2NyaXB0cy9Db21wb25lbnRzL3Nhb3AtbXVsdGlzZWxlY3QudHMiLCJUeXBlU2NyaXB0cy9Db21wb25lbnRzL3Nhb3AtcG9wb3Zlci50cyIsIlR5cGVTY3JpcHRzL0NvbXBvbmVudHMvc2FvcC1wb3B1cC1kaWFsb2cudHMiLCJUeXBlU2NyaXB0cy9Db21wb25lbnRzL3Nhb3AtcmlnaHQtc2lkZWJhci50cyIsIlR5cGVTY3JpcHRzL0NvbXBvbmVudHMvc2FvcC1zZWxlY3QtZHJvcGRvd24udHMiLCJUeXBlU2NyaXB0cy9Db21wb25lbnRzL3Nhb3Atc2VsZWN0LW1vbnRoLXllYXIudHMiLCJUeXBlU2NyaXB0cy9Db21wb25lbnRzL3Nhb3Atc2VsZWN0LXdmbC50cyIsIlR5cGVTY3JpcHRzL0NvbXBvbmVudHMvc2FvcC1zZWxlY3RpemUtc2VsZWN0LXRvb2x0aXAudHMiLCJUeXBlU2NyaXB0cy9Db21wb25lbnRzL3Nhb3Atc2VsZWN0aXplLXNlbGVjdC13LnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLXNpZnJhbnRpLnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLXRvZ2dsZS1wYW5lbC50cyIsIlR5cGVTY3JpcHRzL0NvbXBvbmVudHMvc2FvcC11cGxvYWQtZmlsZXMudHMiLCJUeXBlU2NyaXB0cy9Db21wb25lbnRzL3Nhb3Atdmlldy1zcGlubmVyLnRzIiwiVHlwZVNjcmlwdHMvQ29yZS9zYW9wLXNlcnZpY2VzLWNvcmUudHMiLCJUeXBlU2NyaXB0cy9Db3JlL3Nhb3AtdHJhbnNsYXRlLnRzIiwiVHlwZVNjcmlwdHMvQ29yZS9zYW9wLXV0aWxzLnRzIiwiVHlwZVNjcmlwdHMvQ29yZS9zYW9wLXZpZXctZm9ybS1iaW5kaW5ncy50cyIsIlR5cGVTY3JpcHRzL0NvcmUvc2FvcC12aWV3LWZvcm0udHMiLCJUeXBlU2NyaXB0cy9EYXNoYm9hcmQvc2FvcC1kYXNoYm9hcmQtTElLQ29uZmlybWF0aW9uLXZpZXcudHMiLCJUeXBlU2NyaXB0cy9EYXNoYm9hcmQvc2FvcC1kYXNoYm9hcmQtYWJzZW5jZS1jb25maXJtYXRpb24tdmlldy50cyIsIlR5cGVTY3JpcHRzL0Rhc2hib2FyZC9zYW9wLWRhc2hib2FyZC1hYnNlbmNlcy12aWV3LnRzIiwiVHlwZVNjcmlwdHMvRGFzaGJvYXJkL3Nhb3AtZGFzaGJvYXJkLWVtcGxveWVlUHJlc2VuY2Utdmlldy50cyIsIlR5cGVTY3JpcHRzL0Rhc2hib2FyZC9zYW9wLWRhc2hib2FyZC1pbnRlcm5hbE9yZGVyLXZpZXcudHMiLCJUeXBlU2NyaXB0cy9EYXNoYm9hcmQvc2FvcC1kYXNoYm9hcmQtbXlHcmFkZXMtdmlldy50cyIsIlR5cGVTY3JpcHRzL0Rhc2hib2FyZC9zYW9wLWRhc2hib2FyZC10b2RheUV2ZW50cy12aWV3LnRzIiwiVHlwZVNjcmlwdHMvRGFzaGJvYXJkL3Nhb3AtZGFzaGJvYXJkLXRyYXZlbE9yZGVyLXZpZXcudHMiLCJUeXBlU2NyaXB0cy9EYXNoYm9hcmQvc2FvcC1kYXNoYm9hcmQtdmlldy50cyIsIlR5cGVTY3JpcHRzL0tFL0tFQWxsRW1wbG95ZWVzR3JhZGVzLXZpZXcudHMiLCJUeXBlU2NyaXB0cy9LRS9LRUVtcGxveWVlR3JhZGVzRWRpdC12aWV3LnRzIiwiVHlwZVNjcmlwdHMvS0UvS0VHcmFkZUNyaXRlcmlvbi50cyIsIlR5cGVTY3JpcHRzL0tFL0tFR3JhZGVQZXJpb2QtZ3JpZC50cyIsIlR5cGVTY3JpcHRzL0tFL0tFR3JhZGVQZXJpb2Qtdmlldy50cyIsIlR5cGVTY3JpcHRzL0tFL0tFR3JhZGVzUGVyaW9kLnRzIiwiVHlwZVNjcmlwdHMvS0UvS0VNeUdyYWRlLXZpZXcudHMiLCJUeXBlU2NyaXB0cy9LRS9LRU15R3JhZGVEZXRhaWxzLnRzIiwiVHlwZVNjcmlwdHMvS0UvS0VNeUdyYWRlcy1ncmlkLnRzIiwiVHlwZVNjcmlwdHMvS0UvS0VNeUdyYWRlcy50cyIsIlR5cGVTY3JpcHRzL0xJS1YvTElLVkNha2FsbmFWcnN0YS1Db21tZW50LnRzIiwiVHlwZVNjcmlwdHMvTElLVi9MSUtWQ2FrYWxuYVZyc3RhLUNvbW1lbnRDb25maXJtLnRzIiwiVHlwZVNjcmlwdHMvTElLVi9MSUtWQ2FrYWxuYVZyc3RhLWdyaWQudHMiLCJUeXBlU2NyaXB0cy9MSUtWL0xJS1ZDYWthbG5hVnJzdGEtdmlldy50cyIsIlR5cGVTY3JpcHRzL0xJS1YvTElLVkNha2FsbmFWcnN0YUFyaGl2LWdyaWQudHMiLCJUeXBlU2NyaXB0cy9MSUtWL0xJS1ZOaXZvamlQb3RyamV2YW5qYS1ncmlkLnRzIiwiVHlwZVNjcmlwdHMvTElLVi9MSUtWTml2b2ppUG90cmpldmFuamEtbW9kYWwudHMiLCJUeXBlU2NyaXB0cy9OREsvTkRLSW50ZXJuYWxPcmRlckVkaXRGb3JtLnRzIiwiVHlwZVNjcmlwdHMvTkRLL05ES0ludGVybmFsT3JkZXJzLUFjdGl2ZS1ncmlkLnRzIiwiVHlwZVNjcmlwdHMvTkRLL05ES0ludGVybmFsT3JkZXJzLUFyY2hpdmVkLWdyaWQudHMiLCJUeXBlU2NyaXB0cy9OREsvTkRLSW50ZXJuYWxPcmRlcnMtdmlldy50cyIsIlR5cGVTY3JpcHRzL05ESy9OREtJbnRlcm5hbE9yZGVycy50cyIsIlR5cGVTY3JpcHRzL09QTi9PUE5OYWxvZ2Utc2VsZWN0LnRzIiwiVHlwZVNjcmlwdHMvT1BOL09QTk5hbG9nZS12aWV3LnRzIiwiVHlwZVNjcmlwdHMvT1BOL09QTlBvdG5pTmFsb2dpLWdyaWQudHMiLCJUeXBlU2NyaXB0cy9PUE4vT1BOUG90bmlOYWxvZ2ktdmlldy50cyIsIlR5cGVTY3JpcHRzL09QTi9PUE5Qb3RuaU5hbG9naUFsbC1ncmlkLnRzIiwiVHlwZVNjcmlwdHMvT1BOL09QTlBvdG5pTmFsb2dpQXJoaXYtZ3JpZC50cyIsIlR5cGVTY3JpcHRzL09QTi9PUE5Qb3RuaU5hbG9naUdvZ2dsZU1hcHMtdmlldy50cyIsIlR5cGVTY3JpcHRzL09QTi9PUE5SZWxhY2lqZS1zZWxlY3QudHMiLCJUeXBlU2NyaXB0cy9PUE4vT1BOUmVsYWNpamUtdmlldy50cyIsIlR5cGVTY3JpcHRzL09yZ2FuaXphdGlvbi9zYW9wLW9yZ2FuaWdyYW0tdmlldy50cyIsIlR5cGVTY3JpcHRzL1JFRy9zYW9wLXJlZy1rZVphcERvcHVzdGktdmlldy50cyIsIlR5cGVTY3JpcHRzL1JFRy9zYW9wLXJlZ0Fic2VuY2VDYWxlbmRhckV2ZW50cy12aWV3LnRzIiwiVHlwZVNjcmlwdHMvUkVHL3Nhb3AtcmVnQWJzZW5jZUV2ZW50cy12aWV3LnRzIiwiVHlwZVNjcmlwdHMvUkVHL3Nhb3AtcmVnQWJzZW5jZU1haW4tdmlldy50cyIsIlR5cGVTY3JpcHRzL1JFRy9zYW9wLXJlZ0F0dGVuZGFuY2Utdmlldy50cyIsIlR5cGVTY3JpcHRzL1JFRy9zYW9wLXJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXMtdmlldy50cyIsIlR5cGVTY3JpcHRzL1JFRy9zYW9wLXJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNBbmFseXNpcy12aWV3LnRzIiwiVHlwZVNjcmlwdHMvUkVHL3Nhb3AtcmVnQXR0ZW5kYW5jZUFsbEVtcGxveWVlc0V4Y2Vzc0hvdXJzLWdyaWQudHMiLCJUeXBlU2NyaXB0cy9SRUcvc2FvcC1yZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzRXhjZXNzSG91cnMtdmlldy50cyIsIlR5cGVTY3JpcHRzL1JFRy9zYW9wLXJlZ0N1cnJlbnRFdmVudC12aWV3LnRzIiwiVHlwZVNjcmlwdHMvUkVHL3Nhb3AtcmVnVG9kYXlFdmVudHMtdmlldy50cyIsIlR5cGVTY3JpcHRzL1JFRy9zYW9wLXJlZ1VyYS1kZXRhaWxzLXRhYmxlLXZpZXcudHMiLCJUeXBlU2NyaXB0cy9SRUcvc2FvcC1yZWdVcmEtdmlldy50cyIsIlR5cGVTY3JpcHRzL1JFRy9zYW9wLXJlZ1VyYURhbi12aWV3LnRzIiwiVHlwZVNjcmlwdHMvUkVHL3Nhb3AtcmVnVXJhRG9nb2Rlay12aWV3LnRzIiwiVHlwZVNjcmlwdHMvUkVHL3Nhb3AtcmVnVXJhRG9nb2Rla0RlbGV0ZS12aWV3LnRzIiwiVHlwZVNjcmlwdHMvUkVHL3Nhb3AtcmVnVXJhRG9nb2Rla0RlbGV0ZU9uZS12aWV3LnRzIiwiVHlwZVNjcmlwdHMvU1BMRG9jdW1lbnQvc2FvcC1zcGxEb2N1bWVudC12aWV3LnRzIiwiVHlwZVNjcmlwdHMvU2V0dGluZ3Mvc2FvcC1zZXR0aW5ncy12aWV3LnRzIiwiVHlwZVNjcmlwdHMvY29yZS9zYW9wLXNlcnZpY2VzLWNvcmUudHMiLCJUeXBlU2NyaXB0cy9jb3JlL3Nhb3Atdmlldy1mb3JtLnRzIiwiVHlwZVNjcmlwdHMvbWFpbi50cyIsIlR5cGVTY3JpcHRzL29wbi9PUE5TZWxlY3RQYXNzZW5nZXJzLXZpZXcudHMiLCJub2RlX21vZHVsZXMvbW9tZW50L21vbWVudC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0FDQUM7QUFDRCxJQUFBLGdCQUFBLFFBQUEsdUJBQUEsQ0FBQTtBQUVBLElBQUEsdUJBQUEsUUFBQSw0QkFBQSxDQUFBO0FBQ0EsSUFBQSxvREFBQSxRQUFBLG1EQUFBLENBQUE7QUFDQSxJQUFBLHlDQUFBLFFBQUEsNkRBQUEsQ0FBQTtBQUNBLElBQUEsbUJBQUEsUUFBQSx3QkFBQSxDQUFBO0FBQ0EsSUFBQSxxQkFBQSxRQUFBLGdDQUFBLENBQUE7O0lBRWEsb0M7QUFjVCxrREFBWSxNQUFaLEVBQWdEO0FBQUEsWUFBcEIsT0FBb0IsdUVBQUYsRUFBRTs7QUFBQTs7QUFDNUMsYUFBSyxPQUFMLEdBQWUsTUFBZjtBQUNBLGFBQUssUUFBTCxHQUFnQixPQUFoQjtBQUNBLGFBQUssYUFBTCxHQUFxQixpQ0FBckI7QUFDQSxhQUFLLFlBQUwsR0FBb0IsaUNBQXBCO0FBQ0EsYUFBSyx1QkFBTCxHQUErQiwyQ0FBL0I7QUFDQSxhQUFLLHNCQUFMLEdBQThCLHNDQUE5QjtBQUNBLGFBQUssYUFBTCxHQUFxQixpQ0FBckI7QUFDQSxhQUFLLGlCQUFMLEdBQXlCLElBQUkscUJBQUEsZ0JBQUosRUFBekI7QUFFQSxhQUFLLGlDQUFMLEdBQXlDLElBQUksdUNBQUEsaUNBQUosQ0FBc0MsS0FBSyxhQUEzQyxFQUEwRCxLQUFLLFFBQUwsR0FBZ0Isb0NBQTFFLENBQXpDO0FBQ0EsYUFBSyxpQ0FBTCxDQUF1QyxXQUF2QyxHQUFxRCxLQUFLLFdBQUwsQ0FBaUIsSUFBakIsQ0FBc0IsSUFBdEIsQ0FBckQ7QUFFQSxhQUFLLDJDQUFMLEdBQW1ELElBQUksa0RBQUEsMkNBQUosQ0FBZ0QsS0FBSyx1QkFBckQsRUFBOEUsS0FBSyxRQUFMLEdBQWdCLDhDQUE5RixDQUFuRDtBQUNBLGFBQUssMkNBQUwsQ0FBaUQsV0FB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QUFBLFFBQUEsZ0NBQUEsQ0FBQTtBQUNBLElBQUEsbUJBQUEsUUFBQSw2QkFBQSxDQUFBO0FBQ0EsSUFBQSx5QkFBQSxRQUFBLG1DQUFBLENBQUE7QUFDQSxJQUFBLHFCQUFBLFFBQUEsK0JBQUEsQ0FBQTtBQUNBLElBQUEsc0JBQUEsUUFBQSxnQ0FBQSxDQUFBO0FBQ0EsSUFBQSx1QkFBQSxRQUFBLGlDQUFBLENBQUE7QUFDQSxJQUFBLGtCQUFBLFFBQUEsNEJBQUEsQ0FBQTtBQUNBLElBQUEsc0JBQUEsUUFBQSxnQ0FBQSxDQUFBO0FBQ0EsSUFBQSxxQkFBQSxRQUFBLCtCQUFBLENBQUE7QUFDQSxJQUFBLHNCQUFBLFFBQUEsZ0NBQUEsQ0FBQTtBQUNBLElBQUEsd0JBQUEsUUFBQSxrQ0FBQSxDQUFBO0FBQ0EsSUFBQSxxQkFBQSxRQUFBLHdCQUFBLENBQUE7QUFDQSxJQUFBLHdCQUFBLFFBQUEsMkJBQUEsQ0FBQTtBQUNBLElBQUEsNEJBQUEsUUFBQSwrQkFBQSxDQUFBO0FBQ0EsSUFBQSwrQkFBQSxRQUFBLGtDQUFBLENBQUE7QUFDQSxJQUFBLDZCQUFBLFFBQUEsZ0NBQUEsQ0FBQTtBQUNBLElBQUEsd0JBQUEsUUFBQSxpQ0FBQSxDQUFBO0FBQ0EsSUFBQSw0QkFBQSxRQUFBLCtCQUFBLENBQUE7QUFDQSxJQUFBLGtDQUFBLFFBQUEscURBQUEsQ0FBQTtBQUNBLElBQUEsMENBQUEsUUFBQSw2REFBQSxDQUFBO0FBQ0EsSUFBQSw0Q0FBQSxRQUFBLCtEQUFBLENBQUE7QUFDQSxJQUFBLDBDQUFBLFFBQUEsNkRBQUEsQ0FBQTtBQUNBLElBQUEsMEJBQUEsUUFBQSxxQ0FBQSxDQUFBO0FBQ0EsSUFBQSw0Q0FBQSxRQUFBLCtEQUFBLENBQUE7QUFDQSxJQUFBLG9EQUFBLFFBQUEsdUVBQUEsQ0FBQTtBQUNBLElBQUEsd0JBQUEsUUFBQSwyQkFBQSxDQUFBO0FBQ0EsSUFBQSw2QkFBQSxRQUFBLGdDQUFBLENBQUE7QUFDQSxJQUFBLDJCQUFBLFFBQUEsOEJBQUEsQ0FBQTtBQUNBLElBQUEsdUJBQUEs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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsIu+7vy8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9AdHlwZXMvYWxlcnRpZnkvaW5kZXguZC50c1wiIC8+XHJcbmltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFdmU3VibWl0UmVzdWx0IH0gZnJvbSBcIi4uL2NvcmUvc2FvcC12aWV3LWZvcm1cIjtcclxuaW1wb3J0IHsgU2FvcFNlcnZpY2VzQ29yZSB9IGZyb20gXCIuLi9jb3JlL3Nhb3Atc2VydmljZXMtY29yZVwiO1xyXG5pbXBvcnQgeyBTYW9wQWJzZW5jZUNvbmZpcm1hdGlvblBhcnRpYWxseUFwcHJvdmVWaWV3IH0gZnJvbSBcIi4vc2FvcC1hYnNlbmNlQ29uZmlybWF0aW9uLXBhcnRpYWxseS1hcHByb3ZlLXZpZXdcIjtcclxuaW1wb3J0IHsgU2FvcEFic2VuY2VDb25maXJtYXRpb25SZWplY3RWaWV3IH0gZnJvbSBcIi4uL0Fic2VuY2VDb25maXJtYXRpb24vc2FvcC1hYnNlbmNlQ29uZmlybWF0aW9uLXJlamVjdC12aWV3XCI7XHJcbmltcG9ydCB7IFNhb3BUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9Db3JlL3Nhb3AtdHJhbnNsYXRlJztcclxuaW1wb3J0IHsgU2FvcE1lc3NhZ2VEbGcsIFNhb3BNc2dEbGdCdXR0b24gfSBmcm9tICcuLi9Db21wb25lbnRzL3Nhb3AtbWVzc2FnZS1kbGcnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BBYnNlbmNlQ29uZmlybWF0aW9uRGV0YWlsc0V2ZW50cyB7XHJcbiAgICBwcml2YXRlIF92aWV3SWQ6IHN0cmluZ1xyXG4gICAgcHJpdmF0ZSBfbGliTmFtZTogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfcmVqZWN0Vmlld0lkOiBzdHJpbmdcclxuICAgIHByaXZhdGUgX3JlamVjdEJ0bklkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9wYXJ0aWFsbHlBcHByb3ZlVmlld0lkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9wYXJ0aWFsbHlBcHByb3ZlQnRuSWQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgX2FwcHJvdmVCdG5JZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfc2FvcFNlcnZpY2VzQ29yZTogU2FvcFNlcnZpY2VzQ29yZTtcclxuICAgIHByaXZhdGUgc2FvcEFic2VuY2VDb25maXJtYXRpb25SZWplY3RWaWV3OiBTYW9wQWJzZW5jZUNvbmZpcm1hdGlvblJlamVjdFZpZXc7XHJcbiAgICBwcml2YXRlIHNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUGFydGlhbGx5QXBwcm92ZVZpZXc6IFNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUGFydGlhbGx5QXBwcm92ZVZpZXc7XHJcbiAgICBwcml2YXRlIHNhb3BNZXNzYWdlRGxnOiBTYW9wTWVzc2FnZURsZztcclxuICAgIHByaXZhdGUgX3RyYW5zbGF0aW9uU2VydmljZTogU2FvcFRyYW5zbGF0aW9uU2VydmljZTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih2aWV3SWQ6IHN0cmluZywgbGliTmFtZTogc3RyaW5nID0gXCJcIikge1xyXG4gICAgICAgIHRoaXMuX3ZpZXdJZCA9IHZpZXdJZDtcclxuICAgICAgICB0aGlzLl9saWJOYW1lID0gbGliTmFtZTtcclxuICAgICAgICB0aGlzLl9yZWplY3RWaWV3SWQgPSBcIiNhYnNlbmNlQ29uZmlybWF0aW9uUmVqZWN0VmlldzBcIjtcclxuICAgICAgICB0aGlzLl9yZWplY3RCdG5JZCA9IFwiI2RldGFpbHNLZVBsYW5Eb3B1c3RvdlphdnJuaUJ0blwiO1xyXG4gICAgICAgIHRoaXMuX3BhcnRpYWxseUFwcHJvdmVWaWV3SWQgPSBcIiNhYnNlbmNlQ29uZmlybWF0aW9uUGFydGlhbGx5QXBwcm92ZVZpZXcwXCI7XHJcbiAgICAgICAgdGhpcy5fcGFydGlhbGx5QXBwcm92ZUJ0bklkID0gXCIjZGV0YWlsc0tlUGxhbkRvcHVzdG92RGVsbm9Qb3RyZGlCdG5cIjtcclxuICAgICAgICB0aGlzLl9hcHByb3ZlQnRuSWQgPSBcIiNkZXRhaWxzS2VQbGFuRG9wdXN0b3ZQb3RyZGlCdG5cIjtcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zYW9wQWJzZW5jZUNvbmZpcm1hdGlvblJlamVjdFZpZXcgPSBuZXcgU2FvcEFic2VuY2VDb25maXJtYXRpb25SZWplY3RWaWV3KHRoaXMuX3JlamVjdFZpZXdJZCwgdGhpcy5fbGliTmFtZSArIFwiLnNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUmVqZWN0Vmlld1wiKTtcclxuICAgICAgICB0aGlzLnNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUmVqZWN0Vmlldy5yZWZyZXNoRGF0YSA9IHRoaXMucmVmcmVzaERhdGEuYmluZCh0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5zYW9wQWJzZW5jZUNvbmZpcm1hdGlvblBhcnRpYWxseUFwcHJvdmVWaWV3ID0gbmV3IFNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUGFydGlhbGx5QXBwcm92ZVZpZXcodGhpcy5fcGFydGlhbGx5QXBwcm92ZVZpZXdJZCwgdGhpcy5fbGliTmFtZSArIFwiLnNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUGFydGlhbGx5QXBwcm92ZVZpZXdcIik7XHJcbiAgICAgICAgdGhpcy5zYW9wQWJzZW5jZUNvbmZpcm1hdGlvblBhcnRpYWxseUFwcHJvdmVWaWV3LnJlZnJlc2hEYXRhID0gdGhpcy5yZWZyZXNoRGF0YS5iaW5kKHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLnNhb3BNZXNzYWdlRGxnID0gbmV3IFNhb3BNZXNzYWdlRGxnKHsgZGF0YTogbnVsbCwgcGFyZW50OiBudWxsIH0pXHJcbiAgICAgICAgdGhpcy5fdHJhbnNsYXRpb25TZXJ2aWNlID0gbmV3IFNhb3BUcmFuc2xhdGlvblNlcnZpY2UoKTsgXHJcbiAgICAgICAgdGhpcy5zZXRUZXJtaW5vbG9neUxpc3QoKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRUZXJtaW5vbG9neUxpc3QoKSB7XHJcbiAgICAgICAgbGV0IGRpY3Rpb25hcnk6IHN0cmluZ1tdID0gW1wiUG90cmRpXCJcclxuICAgICAgICAgICAgLCBcIlBvem9yLCDFoXRldmlsbyBkbmkgcHJlZGxhZ2FuZWdhIGRvcHVzdGEgamUgdmXEjWplIGtvdCDFoXRldmlsbyBkbmksIGtpIGdhIGltYSB6YXBvc2xlbmkgbmEgcmF6cG9sYWdvLiDFvWVsaXRlIG5hZGFsamV2YXRpP1wiXHJcbiAgICAgICAgICAgICwgXCJQb3pvciwgdnBpc2FubyDFoXRldmlsbyB1ciBwcmVkbGFnYW5lZ2Ega29yacWhxI1lbmphIGplIHZlxI1qZSBvZCDFoXRldmlsYSB1ciwga2kgamloIGltYXRlIG5hIHJhenBvbGFnby4gQWxpIMW+ZWxpdGUgbmFkYWxqZXZhdGk/XCJcclxuICAgICAgICAgICAgLCBcIsW9ZWxpbSBuYWRhbGpldmF0aVwiXHJcbiAgICAgICAgXTtcclxuICAgICAgICB0aGlzLl90cmFuc2xhdGlvblNlcnZpY2Uuc2V0VHJhbnNsYXRpb25zTGlzdChkaWN0aW9uYXJ5KTtcclxuICAgIH0gICAgIFxyXG5cclxuICAgIGluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BBYnNlbmNlQ29uZmlybWF0aW9uRGV0YWlsc0V2ZW50cy5pbml0XCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgICQodGhpcy5fcmVqZWN0QnRuSWQpLmNsaWNrKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgX3RoaXMuc2hvd1JlamVjdFZpZXcoX3RoaXMuX3JlamVjdEJ0bklkKTsgICBcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJCh0aGlzLl9hcHByb3ZlQnRuSWQpLmNsaWNrKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgbGV0IG9wb3pvcmlsb1N0ciA9ICQoXCIjUHJla29yYWNpdGV2T2Rzb3Rub3N0aU9wb3pvcmlsb1wiKS52YWwoKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICBsZXQgb3Bvem9yaWxvID0gb3Bvem9yaWxvU3RyID09PSBcIlwiID8gZmFsc2UgOiB0cnVlO1xyXG5cclxuICAgICAgICAgICAgaWYgKG9wb3pvcmlsbykge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuc2hvd0FwcHJvdmVBbGVydChvcG96b3JpbG9TdHIudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5hcHByb3ZlKF90aGlzLl9hcHByb3ZlQnRuSWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQodGhpcy5fcGFydGlhbGx5QXBwcm92ZUJ0bklkKS5jbGljayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIF90aGlzLnNob3dQYXJ0aWFsbHlBcHByb3ZlVmlldyhfdGhpcy5fcGFydGlhbGx5QXBwcm92ZUJ0bklkKVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dSZWplY3RWaWV3KGVsZW1lbnRJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BBYnNlbmNlQ29uZmlybWF0aW9uRGV0YWlsc0V2ZW50cy5zaG93UmVqZWN0Vmlld1wiKTtcclxuXHJcbiAgICAgICAgbGV0IGVsZW1lbnRDdHJsID0gJChlbGVtZW50SWQpO1xyXG4gICAgICAgIGxldCBsZXRvID0gZWxlbWVudEN0cmwuZGF0YShcImxldG9cIik7XHJcbiAgICAgICAgbGV0IHNpZnJhWmFwb3NsZW5pID0gZWxlbWVudEN0cmwuZGF0YShcInNpZnJhemFwb3NsZW5pXCIpO1xyXG4gICAgICAgIGxldCB6YXBvcmVkbmFTdGV2aWxrYSA9IGVsZW1lbnRDdHJsLmRhdGEoXCJ6YXBvcmVkbmFzdGV2aWxrYVwiKTtcclxuICAgICAgICBsZXQgdGl0bGUgPSBlbGVtZW50Q3RybC5kYXRhKFwiZm9ybXRpdGxlXCIpO1xyXG5cclxuICAgICAgICB0aGlzLnNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUmVqZWN0Vmlldy50aXRsZSA9IHRpdGxlO1xyXG4gICAgICAgIHRoaXMuc2FvcEFic2VuY2VDb25maXJtYXRpb25SZWplY3RWaWV3LmVkaXRSZWNvcmQoeyBsZXRvOiBsZXRvLCBzaWZyYVphcG9zbGVuaTogc2lmcmFaYXBvc2xlbmksIHphcG9yZWRuYVN0ZXZpbGthOiB6YXBvcmVkbmFTdGV2aWxrYSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhcHByb3ZlKGVsZW1lbnRJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BBYnNlbmNlQ29uZmlybWF0aW9uRGV0YWlsc0V2ZW50cy5hcHByb3ZlXCIpO1xyXG5cclxuICAgICAgICBsZXQgZWxlbWVudEN0cmwgPSAkKGVsZW1lbnRJZCk7XHJcbiAgICAgICAgbGV0IGxldG8gPSBlbGVtZW50Q3RybC5kYXRhKFwibGV0b1wiKTtcclxuICAgICAgICBsZXQgc2lmcmFaYXBvc2xlbmkgPSBlbGVtZW50Q3RybC5kYXRhKFwic2lmcmF6YXBvc2xlbmlcIik7XHJcbiAgICAgICAgbGV0IHphcG9yZWRuYVN0ZXZpbGthID0gZWxlbWVudEN0cmwuZGF0YShcInphcG9yZWRuYXN0ZXZpbGthXCIpO1xyXG5cclxuICAgICAgICBsZXQgZGF0YSA9IHsgbGV0bzogbGV0bywgc2lmcmFaYXBvc2xlbmk6IHNpZnJhWmFwb3NsZW5pLCB6YXBvcmVkbmFTdGV2aWxrYTogemFwb3JlZG5hU3Rldmlsa2EgfTtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKGRhdGEpO1xyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuYWxlcnRNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAkKFwiI2Fic2VuY2VDb25maXJtYXRpb25EZXRhaWxzVmlldzBcIikubW9kYWwoJ3RvZ2dsZScpOyBcclxuICAgICAgICAgICAgICAgIGFsZXJ0aWZ5Lm1lc3NhZ2UocmVzcG9uc2UuYWxlcnRNZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnZpZXdDb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAkKFwiI21lc3NhZ2VCYW5uZXJcIikuaHRtbChyZXNwb25zZS52aWV3Q29udGVudCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5yZWZyZXNoRGF0YSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246IFwiQWJzZW5jZUNvbmZpcm1hdGlvbi9Db25maXJtQXBwcm92ZWRcIlxyXG4gICAgICAgICAgICAsIGRhdGE6IGRhdGFcclxuICAgICAgICAgICAgLCB0eXBlOiBcIlBPU1RcIlxyXG4gICAgICAgICAgICAsIHNwaW5uZXJEaXZJZDogXCIjYWJzZW5jZUNvbmZpcm1hdGlvblBlbmRpbmdMb2FkaW5nXCJcclxuICAgICAgICB9KTsgICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHNob3dQYXJ0aWFsbHlBcHByb3ZlVmlldyhlbGVtZW50SWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wQWJzZW5jZUNvbmZpcm1hdGlvbkRldGFpbHNFdmVudHMuc2hvd1BhcnRpYWxseUFwcHJvdmVWaWV3XCIpO1xyXG5cclxuICAgICAgICBsZXQgZWxlbWVudEN0cmwgPSAkKGVsZW1lbnRJZCk7XHJcbiAgICAgICAgbGV0IGxldG8gPSBlbGVtZW50Q3RybC5kYXRhKFwibGV0b1wiKTtcclxuICAgICAgICBsZXQgc2lmcmFaYXBvc2xlbmkgPSBlbGVtZW50Q3RybC5kYXRhKFwic2lmcmF6YXBvc2xlbmlcIik7XHJcbiAgICAgICAgbGV0IHphcG9yZWRuYVN0ZXZpbGthID0gZWxlbWVudEN0cmwuZGF0YShcInphcG9yZWRuYXN0ZXZpbGthXCIpO1xyXG4gICAgICAgIGxldCB0aXRsZSA9IGVsZW1lbnRDdHJsLmRhdGEoXCJmb3JtdGl0bGVcIik7XHJcblxyXG4gICAgICAgIHRoaXMuc2FvcEFic2VuY2VDb25maXJtYXRpb25QYXJ0aWFsbHlBcHByb3ZlVmlldy50aXRsZSA9IHRpdGxlO1xyXG4gICAgICAgIHRoaXMuc2FvcEFic2VuY2VDb25maXJtYXRpb25QYXJ0aWFsbHlBcHByb3ZlVmlldy5lZGl0UmVjb3JkKHsgbGV0bzogbGV0bywgc2lmcmFaYXBvc2xlbmk6IHNpZnJhWmFwb3NsZW5pLCB6YXBvcmVkbmFTdGV2aWxrYTogemFwb3JlZG5hU3Rldmlsa2EgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd0FwcHJvdmVBbGVydChzaWZyYVZyc3RlRG9nb2RrYTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BBYnNlbmNlQ29uZmlybWF0aW9uRGV0YWlsc0V2ZW50cy5zaG93QXBwcm92ZUFsZXJ0XCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIGxldCB0aXRsZSA9IHRoaXMuX3RyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJQb3RyZGlcIik7XHJcblxyXG4gICAgICAgIGxldCBtZXNzYWdlID0gXCJcIjtcclxuICAgICAgICBpZiAoc2lmcmFWcnN0ZURvZ29ka2EgPT0gJ3QnKSB7XHJcbiAgICAgICAgICAgIG1lc3NhZ2UgPSB0aGlzLl90cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiUG96b3IsIMWhdGV2aWxvIGRuaSBwcmVkbGFnYW5lZ2EgZG9wdXN0YSBqZSB2ZcSNamUga290IMWhdGV2aWxvIGRuaSwga2kgZ2EgaW1hIHphcG9zbGVuaSBuYSByYXpwb2xhZ28uIMW9ZWxpdGUgbmFkYWxqZXZhdGk/XCIpOyBcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2lmcmFWcnN0ZURvZ29ka2EgPT0gJ2snKSB7XHJcbiAgICAgICAgICAgIG1lc3NhZ2UgPSB0aGlzLl90cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiUG96b3IsIHZwaXNhbm8gxaF0ZXZpbG8gdXIgcHJlZGxhZ2FuZWdhIGtvcmnFocSNZW5qYSBqZSB2ZcSNamUgb2QgxaF0ZXZpbGEgdXIsIGtpIGppaCBpbWF0ZSBuYSByYXpwb2xhZ28uIEFsaSDFvmVsaXRlIG5hZGFsamV2YXRpP1wiKTsgXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBtZXNzYWdlID0gXHJcbiAgICAgICAgYFxyXG4gICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nLWJvdHRvbToxNXB4O1wiPlxyXG4gICAgICAgICAgICAke21lc3NhZ2V9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIDxpbnB1dCBkYXRhLXZhbD1cInRydWVcIiBcclxuICAgICAgICAgICAgaWQ9XCJjaGVja19BcHByb3ZlXCIgXHJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiIFxyXG4gICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIiBcclxuICAgICAgICAgIHZhbHVlPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYW9wLXR4dC01XCIgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDEwcHhcIj4ke190aGlzLl90cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwixb1lbGltIG5hZGFsamV2YXRpXCIpfTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBgOyAgICAgICAgICAgICAgICBcclxuXHJcbiAgICAgICAgX3RoaXMuc2FvcE1lc3NhZ2VEbGcuYWZ0ZXJTaG93ID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICQoXCIjYnRuQWxlcnRZZXNcIikucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTtcclxuICAgICAgICAgICAgJChcIiNjaGVja19BcHByb3ZlXCIpLm9mZihcImNoYW5nZVwiKTtcclxuICAgICAgICAgICAgJChcIiNjaGVja19BcHByb3ZlXCIpLm9uKFwiY2hhbmdlXCIsXHJcbiAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZigkKCcjY2hlY2tfQXBwcm92ZScpLmlzKFwiOmNoZWNrZWRcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJChcIiNidG5BbGVydFllc1wiKS5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKFwiI2J0bkFsZXJ0WWVzXCIpLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIF90aGlzLnNhb3BNZXNzYWdlRGxnLm9uWWVzID0gX3RoaXMucHJvY2VlZFllcy5iaW5kKF90aGlzKTtcclxuICAgICAgICBfdGhpcy5zYW9wTWVzc2FnZURsZy5vbk5vID0gX3RoaXMucHJvY2VlZE5vLmJpbmQoX3RoaXMpO1xyXG4gICAgICAgIF90aGlzLnNhb3BNZXNzYWdlRGxnLlNob3cobWVzc2FnZSwgdGl0bGUsIDEsIFtTYW9wTXNnRGxnQnV0dG9uLm1iWWVzLCBTYW9wTXNnRGxnQnV0dG9uLm1iTm9dKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm9jZWVkWWVzKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJhcHByb3ZlLnByb2NlZWRZZXNcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICAkKF90aGlzLl9hcHByb3ZlQnRuSWQpLmF0dHIoJ3R5cGUnLCAnc3VibWl0Jyk7XHJcbiAgICAgICAgJChfdGhpcy5fYXBwcm92ZUJ0bklkKS5hdHRyKCdkYXRhLW1vZGFsJywgJ2Rpc21pc3MnKTtcclxuXHJcbiAgICAgICAgJChcIiNQcmVrb3JhY2l0ZXZPZHNvdG5vc3RpT3Bvem9yaWxvXCIpLnZhbCgnJylcclxuXHJcbiAgICAgICAgJChfdGhpcy5fYXBwcm92ZUJ0bklkKS50cmlnZ2VyKFwiY2xpY2tcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvY2VlZE5vKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJhcHByb3ZlLnByb2NlZWROb1wiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlZnJlc2hEYXRhKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wQWJzZW5jZUNvbmZpcm1hdGlvbkRldGFpbHNFdmVudHMucmVmcmVzaERhdGFcIik7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoRm9ybURhdGFFeHRlbmRlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hGb3JtRGF0YUV4dGVuZGVkKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wQWJzZW5jZUNvbmZpcm1hdGlvbkRldGFpbHNFdmVudHMucmVmcmVzaEZvcm1EYXRhRXh0ZW5kZWRcIik7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BWaWV3Rm9ybSB9IGZyb20gXCIuLi9Db3JlL3Nhb3Atdmlldy1mb3JtXCI7XHJcbmltcG9ydCB7IFNhb3BBYnNlbmNlQ29uZmlybWF0aW9uRGV0YWlsc0V2ZW50cyB9IGZyb20gXCIuL3Nhb3AtYWJzZW5jZUNvbmZpcm1hdGlvbi1kZXRhaWxzLWV2ZW50c1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BBYnNlbmNlQ29uZmlybWF0aW9uRGV0YWlsc1ZpZXcgZXh0ZW5kcyBTYW9wVmlld0Zvcm0ge1xyXG4gICAgcHJpdmF0ZSBzYW9wQWJzZW5jZUNvbmZpcm1hdGlvbkRldGFpbHNFdmVudHM6IFNhb3BBYnNlbmNlQ29uZmlybWF0aW9uRGV0YWlsc0V2ZW50cztcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih2aWV3SWQ6IHN0cmluZywgbGliTmFtZTogc3RyaW5nID0gXCJcIikge1xyXG4gICAgICAgIHN1cGVyKHZpZXdJZCwgbGliTmFtZSk7XHJcbiAgICAgICAgdGhpcy5zZXREaWN0aW9uYXJ5KCk7ICAgXHJcbiAgICAgICAgdGhpcy5hZGRSZWNvcmRFbmRwb2ludCA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5lZGl0UmVjb3JkRW5kcG9pbnQgPSBcIkFic2VuY2VDb25maXJtYXRpb24vR2V0RGV0YWlsc1wiO1xyXG4gICAgICAgIHRoaXMuZGVsZXRlUmVjb3JkRW5kcG9pbnQgPSBcIlwiO1xyXG5cclxuICAgICAgICB0aGlzLnNhb3BBYnNlbmNlQ29uZmlybWF0aW9uRGV0YWlsc0V2ZW50cyA9IG5ldyBTYW9wQWJzZW5jZUNvbmZpcm1hdGlvbkRldGFpbHNFdmVudHMoXCJcIiwgbGliTmFtZSArIFwiLnNhb3BBYnNlbmNlQ29uZmlybWF0aW9uRGV0YWlsc0V2ZW50c1wiKTtcclxuICAgICAgICB0aGlzLnNhb3BBYnNlbmNlQ29uZmlybWF0aW9uRGV0YWlsc0V2ZW50cy5yZWZyZXNoRm9ybURhdGFFeHRlbmRlZCA9IHRoaXMucmVmcmVzaEZvcm1EYXRhLmJpbmQodGhpcyk7XHJcbiAgICB9ICBcclxuXHJcbiAgICBzZXREaWN0aW9uYXJ5KCkge1xyXG4gICAgICAgIHRoaXMuc2V0VGVybWlub2xvZ3lMaXN0KCk7XHJcbiAgICB9ICBcclxuXHJcbiAgICBzaG93Rm9ybShkYXRhOiBhbnksIHRpdGxlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcEFic2VuY2VDb25maXJtYXRpb25EZXRhaWxzVmlldy5zaG93Rm9ybVwiKTtcclxuXHJcbiAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlO1xyXG4gICAgICAgIHRoaXMucmVjb3JkRGV0YWlscyhkYXRhKTtcclxuXHJcbiAgICAgICAgdGhpcy52aWV3U2hvd0NvbXBsZXRlID0gdGhpcy5pbml0Rm9ybS5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRGb3JtKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wQWJzZW5jZUNvbmZpcm1hdGlvbkRldGFpbHNWaWV3LmluaXRGb3JtXCIpO1xyXG4gICAgICAgIHRoaXMuc2FvcEFic2VuY2VDb25maXJtYXRpb25EZXRhaWxzRXZlbnRzLmluaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlZnJlc2hGb3JtRGF0YSgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcEFic2VuY2VDb25maXJtYXRpb25EZXRhaWxzVmlldy5yZWZyZXNoRm9ybURhdGFcIik7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoRGF0YUV4dGVuZGVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaERhdGFFeHRlbmRlZCgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcEFic2VuY2VDb25maXJtYXRpb25EZXRhaWxzVmlldy5yZWZyZXNoRGF0YUV4dGVuZGVkXCIpO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuIiwi77u/aW1wb3J0IHsgU2FvcFZpZXdGb3JtIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC12aWV3LWZvcm1cIjtcclxuaW1wb3J0IHsgZ2xvYmFsLCBjb252ZXJ0U3RyaW5nMkRhdGUgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcEFic2VuY2VDb25maXJtYXRpb25QYXJ0aWFsbHlBcHByb3ZlVmlldyBleHRlbmRzIFNhb3BWaWV3Rm9ybSB7XHJcbiAgICBwcml2YXRlIF9wb3RyamVub09kSWQ6IHN0cmluZ1xyXG4gICAgcHJpdmF0ZSBfcG90cmplbm9Eb0lkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9wb3RyamVub0RuaUlkOiBzdHJpbmc7XHJcblxyXG4gICAgY29uc3RydWN0b3Iodmlld0lkOiBzdHJpbmcsIGxpYk5hbWU6IHN0cmluZyA9IFwiXCIpIHtcclxuICAgICAgICBzdXBlcih2aWV3SWQsIGxpYk5hbWUpO1xyXG4gICAgICAgIHRoaXMuc2V0RGljdGlvbmFyeSgpOyAgXHJcbiAgICAgICAgdGhpcy5hZGRSZWNvcmRFbmRwb2ludCA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5lZGl0UmVjb3JkRW5kcG9pbnQgPSBcIkFic2VuY2VDb25maXJtYXRpb24vR2V0UGFydGlhbGx5QXBwcm92ZUZvcm1cIjtcclxuICAgICAgICB0aGlzLmRlbGV0ZVJlY29yZEVuZHBvaW50ID0gXCJcIjtcclxuXHJcbiAgICAgICAgdGhpcy5fcG90cmplbm9PZElkID0gXCIjUG90cmplbm9PZFwiO1xyXG4gICAgICAgIHRoaXMuX3BvdHJqZW5vRG9JZCA9IFwiI1BvdHJqZW5vRG9cIjtcclxuICAgICAgICB0aGlzLl9wb3RyamVub0RuaUlkID0gXCIjUG90cmplbm9EbmlcIjtcclxuICAgIH1cclxuXHJcbiAgICBzZXREaWN0aW9uYXJ5KCkge1xyXG4gICAgICAgIHRoaXMuc2V0VGVybWlub2xvZ3lMaXN0KCk7IFxyXG4gICAgfSAgXHJcblxyXG4gICAgaW5pdFZpZXcoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUGFydGlhbGx5QXBwcm92ZVZpZXcuaW5pdFZpZXdcIik7XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdENvbnRyb2xzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNWcnN0YURvcHVzdGFLb21wZW56YWNpamEoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgdmFyIHZyc3RhRG9wdXN0YSA9ICQoXCIjVnJzdGFEb3B1c3RhIG9wdGlvbjpzZWxlY3RlZFwiKS52YWwoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHZyc3RhRG9wdXN0YSA9PSAnSycgfHwgdnJzdGFEb3B1c3RhID09ICdWJyA/IHRydWUgOiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0Q29udHJvbHMoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUGFydGlhbGx5QXBwcm92ZVZpZXcuaW5pdENvbnRyb2xzXCIpO1xyXG4gICAgICAgIGNvbnN0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgJCh0aGlzLl9wb3RyamVub09kSWQpLm9uKCdjaGFuZ2VEYXRlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoX3RoaXMuaXNWcnN0YURvcHVzdGFLb21wZW56YWNpamEoKSkge1xyXG4gICAgICAgICAgICAgICAgJChfdGhpcy5fcG90cmplbm9Eb0lkKS5kYXRlcGlja2VyKCd1cGRhdGUnLCAkKF90aGlzLl9wb3RyamVub09kSWQpLmRhdGVwaWNrZXIoJ2dldEZvcm1hdHRlZERhdGUnKSk7XHJcbiAgICAgICAgICAgICAgICAkKF90aGlzLl9wb3RyamVub0RuaUlkKS52YWwoXCIxXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQodGhpcy5fcG90cmplbm9Eb0lkKS5vbignY2hhbmdlRGF0ZScsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKCFfdGhpcy5pc1Zyc3RhRG9wdXN0YUtvbXBlbnphY2lqYSgpKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZGF0dW1PZCA9IGNvbnZlcnRTdHJpbmcyRGF0ZSgkKF90aGlzLl9wb3RyamVub09kSWQpLmRhdGVwaWNrZXIoJ2dldEZvcm1hdHRlZERhdGUnKSwgXCJkZC5tbS55eXl5XCIpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGRhdHVtRG8gPSBjb252ZXJ0U3RyaW5nMkRhdGUoJChfdGhpcy5fcG90cmplbm9Eb0lkKS5kYXRlcGlja2VyKCdnZXRGb3JtYXR0ZWREYXRlJyksIFwiZGQubW0ueXl5eVwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgZGlmZiA9IE1hdGguYWJzKGRhdHVtT2QuZ2V0VGltZSgpIC0gZGF0dW1Eby5nZXRUaW1lKCkpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGRpZmZEYXlzID0gTWF0aC5jZWlsKGRpZmYgLyAoMTAwMCAqIDM2MDAgKiAyNCkpICsgMTsgXHJcblxyXG4gICAgICAgICAgICAgICAgJChfdGhpcy5fcG90cmplbm9EbmlJZCkudmFsKGRpZmZEYXlzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuIiwi77u/Ly8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9hbGVydGlmeS9pbmRleC5kLnRzXCIgLz5cclxuaW1wb3J0IHsgZmlsdGVyVGFibGVSb3dzLCBnbG9iYWwsIGlzVW5EZWZpbmVkLCBpc0VtcHR5IH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wU2VydmljZXNDb3JlIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC1zZXJ2aWNlcy1jb3JlXCI7XHJcbmltcG9ydCB7IFNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUHJvY2Vzc2VkVmlldyB9IGZyb20gXCIuL3Nhb3AtYWJzZW5jZUNvbmZpcm1hdGlvbi1wcm9jZXNzZWQtdmlld1wiO1xyXG5pbXBvcnQgeyBTYW9wQWJzZW5jZUNvbmZpcm1hdGlvblJlamVjdFZpZXcgfSBmcm9tIFwiLi9zYW9wLWFic2VuY2VDb25maXJtYXRpb24tcmVqZWN0LXZpZXdcIjtcclxuaW1wb3J0IHsgU2FvcEFic2VuY2VDb25maXJtYXRpb25QYXJ0aWFsbHlBcHByb3ZlVmlldyB9IGZyb20gXCIuL3Nhb3AtYWJzZW5jZUNvbmZpcm1hdGlvbi1wYXJ0aWFsbHktYXBwcm92ZS12aWV3XCI7XHJcbmltcG9ydCB7IFNhb3BBYnNlbmNlQ29uZmlybWF0aW9uRGV0YWlsc1ZpZXcgfSBmcm9tIFwiLi9zYW9wLWFic2VuY2VDb25maXJtYXRpb24tZGV0YWlscy12aWV3XCI7XHJcbmltcG9ydCB7IFNhb3BNZXNzYWdlQmFubmVyIH0gZnJvbSAnLi4vQ29tcG9uZW50cy9zYW9wLW1lc3NhZ2UtYmFubmVyJztcclxuaW1wb3J0IHsgU2FvcFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJy4uL0NvcmUvc2FvcC10cmFuc2xhdGUnO1xyXG5pbXBvcnQgeyBTYW9wTWVzc2FnZURsZywgU2FvcE1zZ0RsZ0J1dHRvbiB9IGZyb20gJy4uL0NvbXBvbmVudHMvc2FvcC1tZXNzYWdlLWRsZyc7XHJcbmltcG9ydCB7IFNhb3BXZWJHcmlkVW5pdE9yZ0ZpbHRlciB9IGZyb20gXCIuLi9Db21wb25lbnRzL3Nhb3AtZ3JpZC1maWx0ZXItVW5pdE9yZ1wiO1xyXG5cclxuY2xhc3MgS2VQbGFuRG9wdXN0b3ZQSyB7XHJcbiAgICBsZXRvOiBudW1iZXI7XHJcbiAgICBzaWZyYVphcG9zbGVuaTogc3RyaW5nOyBcclxuICAgIHphcG9yZWRuYVN0ZXZpbGthOiBudW1iZXI7XHJcbn1cclxuXHJcbmNsYXNzIERhdGFDb2x1bW5BdHRyaWJ1dGVzIGV4dGVuZHMgS2VQbGFuRG9wdXN0b3ZQSyB7XHJcbiAgICB0aXRsZTogc3RyaW5nO1xyXG59XHJcblxyXG5jbGFzcyBBdXRvU2hvd0Fic2VuY2VEZXRhaWxzRGF0YSBleHRlbmRzIEtlUGxhbkRvcHVzdG92UEsge1xyXG4gICAgaGFzUEtWYWx1ZTogYm9vbGVhbjtcclxuICAgIHZhbGlkOiBib29sZWFuO1xyXG4gICAgaW52YWxpZE1lc3NhZ2U6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUGVuZGluZ1ZpZXcge1xyXG4gICAgcHJpdmF0ZSBfdmlld0lkOiBzdHJpbmdcclxuICAgIHByaXZhdGUgX2xpYk5hbWU6IHN0cmluZztcclxuICAgIHByaXZhdGUgX3JlamVjdFZpZXdJZDogc3RyaW5nXHJcbiAgICBwcml2YXRlIF9wYXJ0aWFsbHlBcHByb3ZlVmlld0lkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9kZXRhaWxzVmlld0lkOiBzdHJpbmdcclxuICAgIHByaXZhdGUgX3Nhb3BTZXJ2aWNlc0NvcmU6IFNhb3BTZXJ2aWNlc0NvcmU7XHJcbiAgICBwcml2YXRlIF9zZWFyY2hBbGxGaWVsZHNWYWx1ZUlkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9zZWxlY3RPcmdGaWx0ZXI6IFNhb3BXZWJHcmlkVW5pdE9yZ0ZpbHRlcjtcclxuICAgIHByaXZhdGUgX3RhYmxlSWQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgX2F1dG9TaG93QWJzZW5jZURldGFpbHNJZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfYXV0b1Nob3dBYnNlbmNlRGV0YWlsc0ludmFsaWRNZXNzYWdlSWQ6IHN0cmluZztcclxuXHJcblxyXG4gICAgcHJpdmF0ZSBzYW9wQWJzZW5jZUNvbmZpcm1hdGlvblJlamVjdFZpZXc6IFNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUmVqZWN0VmlldztcclxuICAgIHByaXZhdGUgc2FvcEFic2VuY2VDb25maXJtYXRpb25QYXJ0aWFsbHlBcHByb3ZlVmlldzogU2FvcEFic2VuY2VDb25maXJtYXRpb25QYXJ0aWFsbHlBcHByb3ZlVmlldztcclxuICAgIHByaXZhdGUgc2FvcEFic2VuY2VDb25maXJtYXRpb25EZXRhaWxzVmlldzogU2FvcEFic2VuY2VDb25maXJtYXRpb25EZXRhaWxzVmlldztcclxuICAgIHByaXZhdGUgc2FvcE1lc3NhZ2VCYW5uZXI6IFNhb3BNZXNzYWdlQmFubmVyO1xyXG5cclxuICAgIHByaXZhdGUgc2FvcE1lc3NhZ2VEbGc6IFNhb3BNZXNzYWdlRGxnO1xyXG4gICAgcHJpdmF0ZSBfdHJhbnNsYXRpb25TZXJ2aWNlOiBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHZpZXdJZDogc3RyaW5nLCBsaWJOYW1lOiBzdHJpbmcgPSBcIlwiKSB7XHJcbiAgICAgICAgdGhpcy5fdmlld0lkID0gdmlld0lkO1xyXG4gICAgICAgIHRoaXMuX2xpYk5hbWUgPSBsaWJOYW1lO1xyXG4gICAgICAgIHRoaXMuX3JlamVjdFZpZXdJZCA9IFwiI2Fic2VuY2VDb25maXJtYXRpb25SZWplY3RWaWV3MFwiO1xyXG4gICAgICAgIHRoaXMuX3BhcnRpYWxseUFwcHJvdmVWaWV3SWQgPSBcIiNhYnNlbmNlQ29uZmlybWF0aW9uUGFydGlhbGx5QXBwcm92ZVZpZXcwXCI7XHJcbiAgICAgICAgdGhpcy5fZGV0YWlsc1ZpZXdJZCA9IFwiI2Fic2VuY2VDb25maXJtYXRpb25EZXRhaWxzVmlldzBcIjtcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgICAgICB0aGlzLl9zZWFyY2hBbGxGaWVsZHNWYWx1ZUlkID0gXCIjT2Rzb3Rub3N0aUNha2Fqb2NlU2VhcmNoVmFsdWVcIjtcclxuXHJcbiAgICAgICAgdGhpcy5fc2VsZWN0T3JnRmlsdGVyID0gbmV3IFNhb3BXZWJHcmlkVW5pdE9yZ0ZpbHRlcihsaWJOYW1lLCBcIlBlbmRpbmdcIik7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0T3JnRmlsdGVyLmZpbHRlclphcG9zbGVuaVRhYmxlUm93cyA9IHRoaXMuZmlsdGVyWmFwb3NsZW5pVGFibGVSb3dzLmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuX3RhYmxlSWQgPSBcIiNhYnNlbmNlQ29uZmlybWF0aW9uUGVuZGluZ1RhYmxlXCI7XHJcbiAgICAgICAgdGhpcy5fYXV0b1Nob3dBYnNlbmNlRGV0YWlsc0lkID0gXCIjYXV0b1Nob3dBYnNlbmNlRGV0YWlsc1wiO1xyXG4gICAgICAgIHRoaXMuX2F1dG9TaG93QWJzZW5jZURldGFpbHNJbnZhbGlkTWVzc2FnZUlkID0gXCIjYXV0b1Nob3dBYnNlbmNlRGV0YWlsc0ludmFsaWRNZXNzYWdlXCI7XHJcblxyXG4gICAgICAgIHRoaXMuc2FvcEFic2VuY2VDb25maXJtYXRpb25SZWplY3RWaWV3ID0gbmV3IFNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUmVqZWN0Vmlldyh0aGlzLl9yZWplY3RWaWV3SWQsIHRoaXMuX2xpYk5hbWUgKyBcIi5zYW9wQWJzZW5jZUNvbmZpcm1hdGlvblJlamVjdFZpZXdcIik7XHJcbiAgICAgICAgdGhpcy5zYW9wQWJzZW5jZUNvbmZpcm1hdGlvblJlamVjdFZpZXcucmVmcmVzaERhdGEgPSB0aGlzLnJlZnJlc2hEYXRhLmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuc2FvcEFic2VuY2VDb25maXJtYXRpb25QYXJ0aWFsbHlBcHByb3ZlVmlldyA9IG5ldyBTYW9wQWJzZW5jZUNvbmZpcm1hdGlvblBhcnRpYWxseUFwcHJvdmVWaWV3KHRoaXMuX3BhcnRpYWxseUFwcHJvdmVWaWV3SWQsIHRoaXMuX2xpYk5hbWUgKyBcIi5zYW9wQWJzZW5jZUNvbmZpcm1hdGlvblBhcnRpYWxseUFwcHJvdmVWaWV3XCIpO1xyXG4gICAgICAgIHRoaXMuc2FvcEFic2VuY2VDb25maXJtYXRpb25QYXJ0aWFsbHlBcHByb3ZlVmlldy5yZWZyZXNoRGF0YSA9IHRoaXMucmVmcmVzaERhdGEuYmluZCh0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5zYW9wQWJzZW5jZUNvbmZpcm1hdGlvbkRldGFpbHNWaWV3ID0gbmV3IFNhb3BBYnNlbmNlQ29uZmlybWF0aW9uRGV0YWlsc1ZpZXcodGhpcy5fZGV0YWlsc1ZpZXdJZCwgdGhpcy5fbGliTmFtZSArIFwiLnNhb3BBYnNlbmNlQ29uZmlybWF0aW9uRGV0YWlsc1ZpZXdcIik7XHJcbiAgICAgICAgdGhpcy5zYW9wQWJzZW5jZUNvbmZpcm1hdGlvbkRldGFpbHNWaWV3LnJlZnJlc2hEYXRhRXh0ZW5kZWQgPSB0aGlzLnJlZnJlc2hEYXRhLmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuc2FvcE1lc3NhZ2VCYW5uZXIgPSBuZXcgU2FvcE1lc3NhZ2VCYW5uZXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zYW9wTWVzc2FnZURsZyA9IG5ldyBTYW9wTWVzc2FnZURsZyh7IGRhdGE6IG51bGwsIHBhcmVudDogbnVsbCB9KVxyXG4gICAgICAgIHRoaXMuX3RyYW5zbGF0aW9uU2VydmljZSA9IG5ldyBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlKCk7XHJcbiAgICAgICAgdGhpcy5zZXRUZXJtaW5vbG9neUxpc3QoKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRUZXJtaW5vbG9neUxpc3QoKSB7XHJcbiAgICAgICAgbGV0IGRpY3Rpb25hcnk6IHN0cmluZ1tdID0gW1wiUG90cmRpXCJcclxuICAgICAgICAgICAgLCBcIlBvem9yLCDFoXRldmlsbyBkbmkgcHJlZGxhZ2FuZWdhIGRvcHVzdGEgamUgdmXEjWplIGtvdCDFoXRldmlsbyBkbmksIGtpIGdhIGltYSB6YXBvc2xlbmkgbmEgcmF6cG9sYWdvLiDFvWVsaXRlIG5hZGFsamV2YXRpP1wiXHJcbiAgICAgICAgICAgICwgXCJQb3pvciwgdnBpc2FubyDFoXRldmlsbyB1ciBwcmVkbGFnYW5lZ2Ega29yacWhxI1lbmphIGplIHZlxI1qZSBvZCDFoXRldmlsYSB1ciwga2kgamloIGltYXRlIG5hIHJhenBvbGFnby4gQWxpIMW+ZWxpdGUgbmFkYWxqZXZhdGk/XCJcclxuICAgICAgICAgICAgLCBcIsW9ZWxpbSBuYWRhbGpldmF0aVwiXHJcbiAgICAgICAgXTtcclxuICAgICAgICB0aGlzLl90cmFuc2xhdGlvblNlcnZpY2Uuc2V0VHJhbnNsYXRpb25zTGlzdChkaWN0aW9uYXJ5KTtcclxuICAgIH0gICBcclxuXHJcbiAgICBpbml0VmlldygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcEFic2VuY2VDb25maXJtYXRpb25QZW5kaW5nVmlldy5pbml0Vmlld1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0Q29udHJvbHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0Q29udHJvbHMoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUGVuZGluZ1ZpZXcuaW5pdENvbnRyb2xzXCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgICQodGhpcy5fc2VhcmNoQWxsRmllbGRzVmFsdWVJZCkua2V5dXAoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBsZXQgZmlsdGVyVmFsID0gU3RyaW5nKCQoX3RoaXMuX3NlYXJjaEFsbEZpZWxkc1ZhbHVlSWQpLnZhbCgpKTtcclxuICAgICAgICAgICAgZmlsdGVyVGFibGVSb3dzKGZpbHRlclZhbCwgX3RoaXMuX3RhYmxlSWQpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLl9zZWxlY3RPcmdGaWx0ZXIuaW5pdEZpbHRlckNvbnRyb2xzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYmluZEdyaWRFdmVudHMoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUGVuZGluZ1ZpZXcuYmluZEdyaWRFdmVudHNcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgJChcIi5idG5SZWplY3RLRVBsYW5Eb3B1c3RvdlwiKS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAkKFwiLmJ0blJlamVjdEtFUGxhbkRvcHVzdG92XCIpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChyb3cpIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUHJvY2Vzc2VkVmlldy5idG5EZXRhaWxzS0VQbGFuRG9wdXN0b3YuY2xpY2tcIik7XHJcbiAgICAgICAgICAgIGxldCBsZXRvID0gcm93LnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWxldG9cIik7XHJcbiAgICAgICAgICAgIGxldCBzaWZyYVphcG9zbGVuaSA9IHJvdy50YXJnZXQuZ2V0QXR0cmlidXRlKFwiZGF0YS1zaWZyYXphcG9zbGVuaVwiKTtcclxuICAgICAgICAgICAgbGV0IHphcG9yZWRuYVN0ZXZpbGthID0gcm93LnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXphcG9yZWRuYXN0ZXZpbGthXCIpO1xyXG4gICAgICAgICAgICBsZXQgdGl0bGUgPSByb3cudGFyZ2V0LmdldEF0dHJpYnV0ZShcImRhdGEtZm9ybXRpdGxlXCIpO1xyXG5cclxuICAgICAgICAgICAgX3RoaXMuc2hvd1JlamVjdEZvcm0oeyBsZXRvOiBsZXRvLCBzaWZyYVphcG9zbGVuaTogc2lmcmFaYXBvc2xlbmksIHphcG9yZWRuYVN0ZXZpbGthOiB6YXBvcmVkbmFTdGV2aWxrYSB9LCB0aXRsZSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQoXCIuYnRuUGFydGlhbGx5QXBwcm92ZUtFUGxhbkRvcHVzdG92XCIpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICQoXCIuYnRuUGFydGlhbGx5QXBwcm92ZUtFUGxhbkRvcHVzdG92XCIpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChyb3cpIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUHJvY2Vzc2VkVmlldy5idG5QYXJ0aWFsbHlBcHByb3ZlS0VQbGFuRG9wdXN0b3YuY2xpY2tcIik7XHJcbiAgICAgICAgICAgIGxldCBsZXRvID0gcm93LnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWxldG9cIik7XHJcbiAgICAgICAgICAgIGxldCBzaWZyYVphcG9zbGVuaSA9IHJvdy50YXJnZXQuZ2V0QXR0cmlidXRlKFwiZGF0YS1zaWZyYXphcG9zbGVuaVwiKTtcclxuICAgICAgICAgICAgbGV0IHphcG9yZWRuYVN0ZXZpbGthID0gcm93LnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXphcG9yZWRuYXN0ZXZpbGthXCIpO1xyXG4gICAgICAgICAgICBsZXQgdGl0bGUgPSByb3cudGFyZ2V0LmdldEF0dHJpYnV0ZShcImRhdGEtZm9ybXRpdGxlXCIpO1xyXG5cclxuICAgICAgICAgICAgX3RoaXMuc2hvd1BhcnRpYWxseUFwcHJvdmVBYnNlbmNlKHsgbGV0bzogbGV0bywgc2lmcmFaYXBvc2xlbmk6IHNpZnJhWmFwb3NsZW5pLCB6YXBvcmVkbmFTdGV2aWxrYTogemFwb3JlZG5hU3Rldmlsa2EgfSwgdGl0bGUpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkKFwiLmJ0bkFwcHJvdmVLRVBsYW5Eb3B1c3RvdlwiKS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAkKFwiLmJ0bkFwcHJvdmVLRVBsYW5Eb3B1c3RvdlwiKS5vbignY2xpY2snLCBmdW5jdGlvbiAocm93KSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wQWJzZW5jZUNvbmZpcm1hdGlvblByb2Nlc3NlZFZpZXcuYnRuQXBwcm92ZUtFUGxhbkRvcHVzdG92LmNsaWNrXCIpO1xyXG4gICAgICAgICAgICBsZXQgbGV0byA9IHJvdy50YXJnZXQuZ2V0QXR0cmlidXRlKFwiZGF0YS1sZXRvXCIpO1xyXG4gICAgICAgICAgICBsZXQgc2lmcmFaYXBvc2xlbmkgPSByb3cudGFyZ2V0LmdldEF0dHJpYnV0ZShcImRhdGEtc2lmcmF6YXBvc2xlbmlcIik7XHJcbiAgICAgICAgICAgIGxldCB6YXBvcmVkbmFTdGV2aWxrYSA9IHJvdy50YXJnZXQuZ2V0QXR0cmlidXRlKFwiZGF0YS16YXBvcmVkbmFzdGV2aWxrYVwiKTtcclxuICAgICAgICAgICAgbGV0IHNpZnJhVnJzdGVEb2dvZGthID0gcm93LnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXNpZnJhdnJzdGVkb2dvZGthXCIpO1xyXG4gICAgICAgICAgICBfdGhpcy5zaG93QXBwcm92ZUFsZXJ0KHsgbGV0bzogbGV0bywgc2lmcmFaYXBvc2xlbmk6IHNpZnJhWmFwb3NsZW5pLCB6YXBvcmVkbmFTdGV2aWxrYTogemFwb3JlZG5hU3Rldmlsa2EsIHNpZnJhVnJzdGVEb2dvZGthOiBzaWZyYVZyc3RlRG9nb2RrYSB9KTsgXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQoXCJib2R5XCIpLm9mZihcImNsaWNrXCIsIFwiI2Fic2VuY2VDb25maXJtYXRpb25QZW5kaW5nVGFibGUgdGQ6bm90KC50ZC1hY3Rpb24pXCIpO1xyXG4gICAgICAgICQoXCJib2R5XCIpLm9uKFwiY2xpY2tcIiwgXCIjYWJzZW5jZUNvbmZpcm1hdGlvblBlbmRpbmdUYWJsZSB0ZDpub3QoLnRkLWFjdGlvbilcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgZGF0YUNvbHVtbiA9ICQodGhpcykuY2xvc2VzdChcInRyXCIpLmZpbmQoXCJ0ZFwiKS5lcSgwKTtcclxuICAgICAgICAgICAgbGV0IGRhdGFWYWx1ZXMgPSBfdGhpcy5nZXRUYWJsZURhdGFDb2x1bW5WYWx1ZXMoZGF0YUNvbHVtbik7XHJcbiAgICAgICAgICAgIF90aGlzLnNhb3BBYnNlbmNlQ29uZmlybWF0aW9uRGV0YWlsc1ZpZXcuc2hvd0Zvcm0oeyBsZXRvOiBkYXRhVmFsdWVzLmxldG8sIHNpZnJhWmFwb3NsZW5pOiBkYXRhVmFsdWVzLnNpZnJhWmFwb3NsZW5pLCB6YXBvcmVkbmFTdGV2aWxrYTogZGF0YVZhbHVlcy56YXBvcmVkbmFTdGV2aWxrYSB9LCBkYXRhVmFsdWVzLnRpdGxlKTsgXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VGFibGVEYXRhQ29sdW1uVmFsdWVzKGRhdGFDb2x1bW46IEpRdWVyeTxIVE1MVGFibGVDZWxsRWxlbWVudD4pOiBEYXRhQ29sdW1uQXR0cmlidXRlcyB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUGVuZGluZ1ZpZXcuZ2V0VGFibGVEYXRhQ29sdW1uVmFsdWVzXCIpO1xyXG5cclxuICAgICAgICBsZXQgZGF0YVZhbHVlcyA9IG5ldyBEYXRhQ29sdW1uQXR0cmlidXRlcygpO1xyXG5cclxuICAgICAgICBkYXRhVmFsdWVzLmxldG8gPSBwYXJzZUludChkYXRhQ29sdW1uLmF0dHIoXCJkYXRhLWxldG9cIikpO1xyXG4gICAgICAgIGRhdGFWYWx1ZXMuc2lmcmFaYXBvc2xlbmkgPSBkYXRhQ29sdW1uLmF0dHIoXCJkYXRhLXNpZnJhemFwb3NsZW5pXCIpO1xyXG4gICAgICAgIGRhdGFWYWx1ZXMuemFwb3JlZG5hU3Rldmlsa2EgPSBwYXJzZUludChkYXRhQ29sdW1uLmF0dHIoXCJkYXRhLXphcG9yZWRuYXN0ZXZpbGthXCIpKTtcclxuICAgICAgICBkYXRhVmFsdWVzLnRpdGxlID0gZGF0YUNvbHVtbi5hdHRyKFwiZGF0YS1mb3JtdGl0bGVcIik7XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhVmFsdWVzO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dSZWplY3RGb3JtKGRhdGE6IGFueSwgdGl0bGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wQWJzZW5jZUNvbmZpcm1hdGlvblBlbmRpbmdWaWV3LnNob3dSZWplY3RGb3JtXCIpO1xyXG5cclxuICAgICAgICB0aGlzLnNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUmVqZWN0Vmlldy50aXRsZSA9IHRpdGxlO1xyXG4gICAgICAgIHRoaXMuc2FvcEFic2VuY2VDb25maXJtYXRpb25SZWplY3RWaWV3LmVkaXRSZWNvcmQoZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd1BhcnRpYWxseUFwcHJvdmVBYnNlbmNlKGRhdGE6IGFueSwgdGl0bGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wQWJzZW5jZUNvbmZpcm1hdGlvblBlbmRpbmdWaWV3LnNob3dQYXJ0aWFsbHlBcHByb3ZlQWJzZW5jZVwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5zYW9wQWJzZW5jZUNvbmZpcm1hdGlvblBhcnRpYWxseUFwcHJvdmVWaWV3LnRpdGxlID0gdGl0bGU7XHJcbiAgICAgICAgdGhpcy5zYW9wQWJzZW5jZUNvbmZpcm1hdGlvblBhcnRpYWxseUFwcHJvdmVWaWV3LmVkaXRSZWNvcmQoZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwcm92ZUFic2VuY2UoZGF0YTogYW55KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUGVuZGluZ1ZpZXcuYXBwcm92ZUFic2VuY2VcIik7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhkYXRhKTtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuYWxlcnRNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICBhbGVydGlmeS5tZXNzYWdlKHJlc3BvbnNlLmFsZXJ0TWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgX3RoaXMucmVmcmVzaERhdGEoKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjogXCJBYnNlbmNlQ29uZmlybWF0aW9uL0NvbmZpcm1BcHByb3ZlZFwiXHJcbiAgICAgICAgICAgICwgZGF0YTogZGF0YVxyXG4gICAgICAgICAgICAsIHR5cGU6IFwiUE9TVFwiXHJcbiAgICAgICAgICAgICwgc3Bpbm5lckRpdklkOiBcIiNhYnNlbmNlQ29uZmlybWF0aW9uUGVuZGluZ0xvYWRpbmdcIlxyXG4gICAgICAgIH0pOyAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgc2hvd0FwcHJvdmVBbGVydChkYXRhOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcEFic2VuY2VDb25maXJtYXRpb25QZW5kaW5nVmlldy5zaG93QXBwcm92ZUFsZXJ0XCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzID09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBfdGhpcy5fdHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIlBvdHJkaVwiKTs7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuc2lmcmFWcnN0ZURvZ29ka2EudG9Mb3dlckNhc2UoKSA9PSAndCcpIHtcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gX3RoaXMuX3RyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJQb3pvciwgxaF0ZXZpbG8gZG5pIHByZWRsYWdhbmVnYSBkb3B1c3RhIGplIHZlxI1qZSBrb3QgxaF0ZXZpbG8gZG5pLCBraSBnYSBpbWEgemFwb3NsZW5pIG5hIHJhenBvbGFnby4gxb1lbGl0ZSBuYWRhbGpldmF0aT9cIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChkYXRhLnNpZnJhVnJzdGVEb2dvZGthLnRvTG93ZXJDYXNlKCkgPT0gJ2snKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IF90aGlzLl90cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiUG96b3IsIHZwaXNhbm8gxaF0ZXZpbG8gdXIgcHJlZGxhZ2FuZWdhIGtvcmnFocSNZW5qYSBqZSB2ZcSNamUgb2QgxaF0ZXZpbGEgdXIsIGtpIGppaCBpbWF0ZSBuYSByYXpwb2xhZ28uIEFsaSDFvmVsaXRlIG5hZGFsamV2YXRpP1wiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gXHJcbiAgICAgICAgICAgICAgICBgXHJcbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZy1ib3R0b206MTVweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAke21lc3NhZ2V9XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBkYXRhLXZhbD1cInRydWVcIiBcclxuICAgICAgICAgICAgICAgICAgICBpZD1cImNoZWNrX0FwcHJvdmVcIiBcclxuICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIiBcclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIiBcclxuICAgICAgICAgICAgICAgICAgdmFsdWU9XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2FvcC10eHQtNVwiIHN0eWxlPVwicGFkZGluZy1sZWZ0OiAxMHB4XCI+JHtfdGhpcy5fdHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIsW9ZWxpbSBuYWRhbGpldmF0aVwiKX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIGA7ICAgICAgICAgICAgICAgIFxyXG5cclxuICAgICAgICAgICAgICAgIF90aGlzLnNhb3BNZXNzYWdlRGxnLmFmdGVyU2hvdyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICQoXCIjYnRuQWxlcnRZZXNcIikucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAkKFwiI2NoZWNrX0FwcHJvdmVcIikub2ZmKFwiY2hhbmdlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICQoXCIjY2hlY2tfQXBwcm92ZVwiKS5vbihcImNoYW5nZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCQoJyNjaGVja19BcHByb3ZlJykuaXMoXCI6Y2hlY2tlZFwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoXCIjYnRuQWxlcnRZZXNcIikucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoXCIjYnRuQWxlcnRZZXNcIikucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5zYW9wTWVzc2FnZURsZy5vblllcyA9IF90aGlzLmFwcHJvdmVBYnNlbmNlLmJpbmQoX3RoaXMsIGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuc2FvcE1lc3NhZ2VEbGcub25ObyA9IF90aGlzLnByb2NlZWROby5iaW5kKF90aGlzKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLnNhb3BNZXNzYWdlRGxnLlNob3cobWVzc2FnZSwgdGl0bGUsIDEsIFtTYW9wTXNnRGxnQnV0dG9uLm1iWWVzLCBTYW9wTXNnRGxnQnV0dG9uLm1iTm9dKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5hcHByb3ZlQWJzZW5jZShkYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOiBcIkFic2VuY2VDb25maXJtYXRpb24vQ29uZmlybUFwcHJvdmVkQWxlcnRcIlxyXG4gICAgICAgICAgICAsIGRhdGE6IGRhdGFcclxuICAgICAgICAgICAgLCB0eXBlOiBcIkdFVFwiXHJcbiAgICAgICAgICAgICwgc3Bpbm5lckRpdklkOiBcIiNhYnNlbmNlQ29uZmlybWF0aW9uUGVuZGluZ0xvYWRpbmdcIlxyXG4gICAgICAgIH0pOyAgXHJcbiAgICB9XHJcblxyXG4gICAgcHJvY2VlZE5vKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJhcHByb3ZlLnByb2NlZWROb1wiKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSByZWZyZXNoRGF0YSgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcEFic2VuY2VDb25maXJtYXRpb25QZW5kaW5nVmlldy5yZWZyZXNoRGF0YVwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWZyZXNoRGF0YUV4dGVybmFsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdGEgbWV0b2RhIHNlIGxhaGtvIG92ZXJyaWRlIHogZHJ1Z28gbWV0b2RvIChucHIuIHYgRGFzaGJvYXJkQWJzZW5jZUNvbmZpcm1hdGlvblZpZXcpXHJcbiAgICByZWZyZXNoRGF0YUV4dGVybmFsKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wQWJzZW5jZUNvbmZpcm1hdGlvblBlbmRpbmdWaWV3LnJlZnJlc2hEYXRhRXh0ZXJuYWxcIik7XHJcblxyXG4gICAgICAgIHRoaXMucmVmcmVzaEJhc2VEYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaEJhc2VEYXRhKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wQWJzZW5jZUNvbmZpcm1hdGlvblBlbmRpbmdWaWV3LnJlZnJlc2hCYXNlRGF0YVwiKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgZGF0YSA9IG51bGw7XHJcblxyXG4gICAgICAgIC8vIHByZWJlcmVtb1xyXG4gICAgICAgIGxldCBhdXRvU2hvd0RldGFpbHNWYWx1ZXMgPSB0aGlzLmdldEF1dG9TaG93QWJzZW5jZURldGFpbHNWYWx1ZXMoKTtcclxuICAgICAgICBpZiAoYXV0b1Nob3dEZXRhaWxzVmFsdWVzICE9IG51bGwpIHtcclxuICAgICAgICAgICAgZGF0YSA9IHsgeWVhcjogYXV0b1Nob3dEZXRhaWxzVmFsdWVzLmxldG8sIHNlcXVlbmNlTnVtYmVyOiBhdXRvU2hvd0RldGFpbHNWYWx1ZXMuemFwb3JlZG5hU3Rldmlsa2EsIGVtcGxveWVlSWQ6IGF1dG9TaG93RGV0YWlsc1ZhbHVlcy5zaWZyYVphcG9zbGVuaSB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgJChcIiNhYnNlbmNlQ29uZmlybWF0aW9uUGVuZGluZ1wiKS5odG1sKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgX3RoaXMuYmluZEdyaWRFdmVudHMoKTtcclxuICAgICAgICAgICAgX3RoaXMuY2hlY2tBdXRvU2hvd0Fic2VuY2VEZXRhaWxzKCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246IFwiQWJzZW5jZUNvbmZpcm1hdGlvbi9HZXRQZW5kaW5nQWJzZW5jZXNcIlxyXG4gICAgICAgICAgICAsIGRhdGE6IGRhdGFcclxuICAgICAgICAgICAgLCB0eXBlOiBcIkdFVFwiXHJcbiAgICAgICAgICAgICwgc3Bpbm5lckRpdklkOiBcIiNhYnNlbmNlQ29uZmlybWF0aW9uUGVuZGluZ0xvYWRpbmdcIlxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrQXV0b1Nob3dBYnNlbmNlRGV0YWlscygpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcEFic2VuY2VDb25maXJtYXRpb25QZW5kaW5nVmlldy5jaGVja0F1dG9TaG93QWJzZW5jZURldGFpbHNcIik7XHJcblxyXG4gICAgICAgIC8vIHByZWJlcmVtbyBwb2RhdGtlIGl6IGhpZGRlbiBpbnB1dCBlbGVtZW50YVxyXG4gICAgICAgIGxldCBhdXRvU2hvd0Fic2VuY2VEZXRhaWxzVmFsdWVzID0gdGhpcy5nZXRBdXRvU2hvd0Fic2VuY2VEZXRhaWxzVmFsdWVzKCk7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhhdXRvU2hvd0Fic2VuY2VEZXRhaWxzVmFsdWVzKTtcclxuXHJcbiAgICAgICAgLy8gcmVzZXRyaWFtbyB2cmVkbm9zdGksIGRhIHNlIG5lIGJpIG9rbm8gemEgZGV0YWlscyBwb25vdm5vIHBvamF2aWxvLCBrbyBzZSBpenZlZGUgcmVmcmVzaCBwb2RhdGtvdlxyXG4gICAgICAgIHRoaXMucmVzZXRBdXRvU2hvd0Fic2VuY2VEZXRhaWxzVmFsdWVzKCk7XHJcblxyXG4gICAgICAgIGlmIChhdXRvU2hvd0Fic2VuY2VEZXRhaWxzVmFsdWVzICE9IG51bGwgJiYgYXV0b1Nob3dBYnNlbmNlRGV0YWlsc1ZhbHVlcy5oYXNQS1ZhbHVlKSB7XHJcbiAgICAgICAgICAgIGlmICghYXV0b1Nob3dBYnNlbmNlRGV0YWlsc1ZhbHVlcy52YWxpZCkge1xyXG4gICAgICAgICAgICAgICAgLy9uaSB2ZWxqYXZuYSwgbW9yYW1vIHByaWthemF0aSBvYnZlc3RpbG8gbmEgcHJlZ2xlZHVcclxuICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlczogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goYXV0b1Nob3dBYnNlbmNlRGV0YWlsc1ZhbHVlcy5pbnZhbGlkTWVzc2FnZSlcclxuICAgICAgICAgICAgICAgIHRoaXMuc2FvcE1lc3NhZ2VCYW5uZXIuc2hvdyhtZXNzYWdlcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBwb2lzY2VtbyBwb2RhdGVrIGl6IHBlbmRpbmcgYWJzZW5jZSB0YWJlbGUgaW4gY2Ugb2JzdGFqYSwgcHJpa2F6ZW1vIGRldGFpbHMgZm9ybVxyXG4gICAgICAgICAgICAgICAgdmFyIHRhYmxlLCB0ciwgaTtcclxuICAgICAgICAgICAgICAgIHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5fdGFibGVJZC5yZXBsYWNlKFwiI1wiLCBcIlwiKSk7XHJcbiAgICAgICAgICAgICAgICB0ciA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidHJcIik7XHJcbiAgICAgICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHRhYmxlIHJvd3MsIGFuZCBoaWRlIHRob3NlIHdobyBkb24ndCBtYXRjaCB0aGUgc2VhcmNoIHF1ZXJ5XHJcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdHIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YUNvbHVtbiA9ICQodHJbaV0pLmZpbmQoXCJ0ZFwiKS5lcSgwKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVW5EZWZpbmVkKGRhdGFDb2x1bW4pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhVmFsdWVzID0gdGhpcy5nZXRUYWJsZURhdGFDb2x1bW5WYWx1ZXMoZGF0YUNvbHVtbik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wYXJlQWJzZW5jZURldGFpbHNWYWx1ZXNBbmRUYWJsZURhdGFWYWx1ZXMoYXV0b1Nob3dBYnNlbmNlRGV0YWlsc1ZhbHVlcywgZGF0YVZhbHVlcykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2FvcEFic2VuY2VDb25maXJtYXRpb25EZXRhaWxzVmlldy5zaG93Rm9ybSh7IGxldG86IGRhdGFWYWx1ZXMubGV0bywgc2lmcmFaYXBvc2xlbmk6IGRhdGFWYWx1ZXMuc2lmcmFaYXBvc2xlbmksIHphcG9yZWRuYVN0ZXZpbGthOiBkYXRhVmFsdWVzLnphcG9yZWRuYVN0ZXZpbGthIH0sIGRhdGFWYWx1ZXMudGl0bGUpOyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldEF1dG9TaG93QWJzZW5jZURldGFpbHNWYWx1ZXMoKTogQXV0b1Nob3dBYnNlbmNlRGV0YWlsc0RhdGEge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wQWJzZW5jZUNvbmZpcm1hdGlvblBlbmRpbmdWaWV3LmdldEF1dG9TaG93QWJzZW5jZURldGFpbHNWYWx1ZXNcIik7XHJcblxyXG4gICAgICAgIGxldCBkYXRhVmFsdWVzID0gbmV3IEF1dG9TaG93QWJzZW5jZURldGFpbHNEYXRhKCk7XHJcblxyXG4gICAgICAgIGxldCBkYXRhRWxlbWVudCA9ICQodGhpcy5fYXV0b1Nob3dBYnNlbmNlRGV0YWlsc0lkKTtcclxuICAgICAgICBpZiAoZGF0YUVsZW1lbnQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBkYXRhVmFsdWVzID0gZGF0YUVsZW1lbnQuZGF0YSgnZGV0YWlscycpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGRhdGFWYWx1ZXMgIT0gbnVsbCAmJiBkYXRhVmFsdWVzLmludmFsaWRNZXNzYWdlID09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIC8vIG5pIG5vYmVuaWggbmFwYWssIGtpIGJpIGppaCBsYWhrbyB2cm5pbCBcIkluZGV4XCIgYWN0aW9uXHJcbiAgICAgICAgICAgICAgICAvLyBwcmV2ZXJpbW8sIMSNZSBqZSBrYWogemFwaXNhbm8gdiBfcGVuZGluZ0Zvcm0uY3NodG1sXHJcbiAgICAgICAgICAgICAgICAvLyB2cmVkbm9zdCBzZSBwb3N0YXZpIHYgXCJHZXRQZW5kaW5nQWJzZW5jZXNcIiBhY3Rpb25cclxuICAgICAgICAgICAgICAgIGxldCBkYXRhUGVuZGluZ0ludmFsaWRNZXNzYWdlRWxlbWVudCA9ICQodGhpcy5fYXV0b1Nob3dBYnNlbmNlRGV0YWlsc0ludmFsaWRNZXNzYWdlSWQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRhdGFQZW5kaW5nSW52YWxpZE1lc3NhZ2VFbGVtZW50ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaW52TWVzc2FnZSA9IGRhdGFQZW5kaW5nSW52YWxpZE1lc3NhZ2VFbGVtZW50LmRhdGEoJ2ludmFsaWRtZXNzYWdlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGludk1lc3NhZ2UgIT0gbnVsbCAmJiBpbnZNZXNzYWdlICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVZhbHVlcy52YWxpZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhVmFsdWVzLmludmFsaWRNZXNzYWdlID0gaW52TWVzc2FnZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhVmFsdWVzXHJcbiAgICB9XHJcblxyXG4gICAgcmVzZXRBdXRvU2hvd0Fic2VuY2VEZXRhaWxzVmFsdWVzKCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wQWJzZW5jZUNvbmZpcm1hdGlvblBlbmRpbmdWaWV3LnJlc2V0QXV0b1Nob3dBYnNlbmNlRGV0YWlsc1ZhbHVlc1wiKTtcclxuXHJcbiAgICAgICAgbGV0IGRhdGFFbGVtZW50ID0gJCh0aGlzLl9hdXRvU2hvd0Fic2VuY2VEZXRhaWxzSWQpO1xyXG4gICAgICAgIGlmIChkYXRhRWxlbWVudCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGRhdGFFbGVtZW50LmRhdGEoJ2RldGFpbHMnLCBudWxsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBkYXRhUGVuZGluZ0ludmFsaWRNZXNzYWdlRWxlbWVudCA9ICQodGhpcy5fYXV0b1Nob3dBYnNlbmNlRGV0YWlsc0ludmFsaWRNZXNzYWdlSWQpO1xyXG4gICAgICAgIGlmIChkYXRhUGVuZGluZ0ludmFsaWRNZXNzYWdlRWxlbWVudCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGRhdGFQZW5kaW5nSW52YWxpZE1lc3NhZ2VFbGVtZW50LmRhdGEoJ2ludmFsaWRtZXNzYWdlJywgbnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGNlIHN0YSBlbmFrYSwgdnJuZSB0cnVlLCBzaWNlciBmYWxzZVxyXG4gICAgY29tcGFyZUFic2VuY2VEZXRhaWxzVmFsdWVzQW5kVGFibGVEYXRhVmFsdWVzKGFic2VuY2VEZXRhaWxzVmFsdWVzOiBBdXRvU2hvd0Fic2VuY2VEZXRhaWxzRGF0YSwgdGFibGVEYXRhVmFsdWVzOiBEYXRhQ29sdW1uQXR0cmlidXRlcyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmIChhYnNlbmNlRGV0YWlsc1ZhbHVlcy5sZXRvID09PSB0YWJsZURhdGFWYWx1ZXMubGV0byAmJiBhYnNlbmNlRGV0YWlsc1ZhbHVlcy56YXBvcmVkbmFTdGV2aWxrYSA9PT0gdGFibGVEYXRhVmFsdWVzLnphcG9yZWRuYVN0ZXZpbGthICYmIGFic2VuY2VEZXRhaWxzVmFsdWVzLnNpZnJhWmFwb3NsZW5pID09PSB0YWJsZURhdGFWYWx1ZXMuc2lmcmFaYXBvc2xlbmkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGZpbHRlclphcG9zbGVuaVRhYmxlUm93cyhmaWx0ZXJaYXBvc2xlbmk6IHN0cmluZykge1xyXG4gICAgICAgIC8vIERlY2xhcmUgdmFyaWFibGVzXHJcbiAgICAgICAgdmFyIHRhYmxlLCB0ciwgX3Jvd0lkLCBpLCB0eHRWYWx1ZTtcclxuICAgICAgICB0YWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWJzZW5jZUNvbmZpcm1hdGlvblBlbmRpbmdUYWJsZVwiKTtcclxuICAgICAgICB0ciA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidHJcIik7XHJcbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0YWJsZSByb3dzLCBhbmQgaGlkZSB0aG9zZSB3aG8gZG9uJ3QgbWF0Y2ggdGhlIHNlYXJjaCBxdWVyeVxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0ci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBfcm93SWQgPSBudWxsO1xyXG4gICAgICAgICAgICBsZXQgX3RySWQgPSAkKHRyW2ldKS5hdHRyKFwiZGF0YS1zaWZyYS16YXBvc2xlbmlcIik7XHJcbiAgICAgICAgICAgIGlmICghaXNVbkRlZmluZWQoX3RySWQpKSB7XHJcbiAgICAgICAgICAgICAgICBfcm93SWQgPSBfdHJJZC50b1N0cmluZygpXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChfcm93SWQpIHtcclxuICAgICAgICAgICAgICAgIHR4dFZhbHVlID0gX3Jvd0lkLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNFbXB0eShmaWx0ZXJaYXBvc2xlbmkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJCh0cltpXSkuYWRkQ2xhc3MoXCJlbGVtZW50LWhpZGRlblwiKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyWmFwb3NsZW5pLnRvVXBwZXJDYXNlKCkuaW5kZXhPZih0eHRWYWx1ZSkgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICQodHJbaV0pLnJlbW92ZUNsYXNzKFwiZWxlbWVudC1oaWRkZW5cIik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICQodHJbaV0pLmFkZENsYXNzKFwiZWxlbWVudC1oaWRkZW5cIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG4iLCLvu78vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL2FsZXJ0aWZ5L2luZGV4LmQudHNcIiAvPlxyXG5pbXBvcnQgeyBmaWx0ZXJUYWJsZVJvd3MsIGdsb2JhbCwgaXNFbXB0eSwgaXNVbkRlZmluZWQgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BTZXJ2aWNlc0NvcmUgfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXNlcnZpY2VzLWNvcmVcIjtcclxuaW1wb3J0IHsgU2FvcEFic2VuY2VDb25maXJtYXRpb25EZXRhaWxzVmlldyB9IGZyb20gXCIuL3Nhb3AtYWJzZW5jZUNvbmZpcm1hdGlvbi1kZXRhaWxzLXZpZXdcIjtcclxuaW1wb3J0IHsgU2FvcFBvcG92ZXIgfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLXBvcG92ZXJcIjtcclxuaW1wb3J0IHsgU2FvcFdlYkdyaWRVbml0T3JnRmlsdGVyIH0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC1ncmlkLWZpbHRlci1Vbml0T3JnXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcEFic2VuY2VDb25maXJtYXRpb25Qcm9jZXNzZWRWaWV3IHtcclxuICAgIHByaXZhdGUgX3ZpZXdJZDogc3RyaW5nXHJcbiAgICBwcml2YXRlIF9saWJOYW1lOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9kZXRhaWxzVmlld0lkOiBzdHJpbmdcclxuICAgIHByaXZhdGUgX3Nhb3BTZXJ2aWNlc0NvcmU6IFNhb3BTZXJ2aWNlc0NvcmU7XHJcbiAgICBwcml2YXRlIF9sZXRvSWQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgX2xldG9Nb2JpbGVGaWx0ZXJJZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfcG90cmplbmlDaGVja0JveElkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9wb3RyamVuaUNoZWNrQm94TW9iaWxlRmlsdGVySWQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgX3ByZWtsaWNhbmlDaGVja0JveElkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9wcmVrbGljYW5pQ2hlY2tCb3hNb2JpbGVGaWx0ZXJJZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfc2VhcmNoQWxsRmllbGRzVmFsdWVJZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfc2VsZWN0T3JnRmlsdGVyOiBTYW9wV2ViR3JpZFVuaXRPcmdGaWx0ZXI7XHJcbiAgICBwcml2YXRlIF90YWJsZUlkOiBzdHJpbmc7XHJcblxyXG4gICAgcHJpdmF0ZSBzYW9wQWJzZW5jZUNvbmZpcm1hdGlvbkRldGFpbHNWaWV3OiBTYW9wQWJzZW5jZUNvbmZpcm1hdGlvbkRldGFpbHNWaWV3O1xyXG4gICAgcHJpdmF0ZSBfc2FvcFBvcG92ZXI6IFNhb3BQb3BvdmVyO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHZpZXdJZDogc3RyaW5nLCBsaWJOYW1lOiBzdHJpbmcgPSBcIlwiKSB7XHJcbiAgICAgICAgdGhpcy5fdmlld0lkID0gdmlld0lkO1xyXG4gICAgICAgIHRoaXMuX2xpYk5hbWUgPSBsaWJOYW1lO1xyXG4gICAgICAgIHRoaXMuX2RldGFpbHNWaWV3SWQgPSBcIiNhYnNlbmNlQ29uZmlybWF0aW9uRGV0YWlsc1ZpZXcwXCI7XHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcblxyXG4gICAgICAgIC8vIGRlc2t0b3AgZmlsdGVyIGh0bWwgZWxlbWVudHNcclxuICAgICAgICB0aGlzLl9sZXRvSWQgPSBcIiNMZXRvXCI7XHJcbiAgICAgICAgdGhpcy5fcG90cmplbmlDaGVja0JveElkID0gXCIjY2Jwb3RyamVuaUNoZWNrQm94XCI7XHJcbiAgICAgICAgdGhpcy5fcHJla2xpY2FuaUNoZWNrQm94SWQgPSBcIiNjYnByZWtsaWNhbmlDaGVja0JveFwiO1xyXG4gICAgICAgIC8vIG1vYmlsZSBmaWx0ZXIgaHRtbCBlbGVtZW50c1xyXG4gICAgICAgIHRoaXMuX2xldG9Nb2JpbGVGaWx0ZXJJZCA9IFwiI2xldG9GaWx0ZXJcIjtcclxuICAgICAgICB0aGlzLl9wb3RyamVuaUNoZWNrQm94TW9iaWxlRmlsdGVySWQgPVwiI2NicG90cmplbmlDaGVja0JveEZpbHRlclwiXHJcbiAgICAgICAgdGhpcy5fcHJla2xpY2FuaUNoZWNrQm94TW9iaWxlRmlsdGVySWQgPSBcIiNjYnByZWtsaWNhbmlDaGVja0JveEZpbHRlclwiO1xyXG5cclxuICAgICAgICB0aGlzLl9zZWFyY2hBbGxGaWVsZHNWYWx1ZUlkID0gXCIjT2Rzb3Rub3N0aU9iZGVsYW5lU2VhcmNoVmFsdWVcIjtcclxuXHJcbiAgICAgICAgdGhpcy5fc2VsZWN0T3JnRmlsdGVyID0gbmV3IFNhb3BXZWJHcmlkVW5pdE9yZ0ZpbHRlcihsaWJOYW1lLCBcIlByb2Nlc3NlZFwiKTtcclxuICAgICAgICB0aGlzLl9zZWxlY3RPcmdGaWx0ZXIuZmlsdGVyWmFwb3NsZW5pVGFibGVSb3dzID0gdGhpcy5maWx0ZXJaYXBvc2xlbmlUYWJsZVJvd3MuYmluZCh0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5fdGFibGVJZCA9IFwiI2Fic2VuY2VDb25maXJtYXRpb25Qcm9jZXNzZWRUYWJsZVwiO1xyXG4gICAgICAgIHRoaXMuc2FvcEFic2VuY2VDb25maXJtYXRpb25EZXRhaWxzVmlldyA9IG5ldyBTYW9wQWJzZW5jZUNvbmZpcm1hdGlvbkRldGFpbHNWaWV3KHRoaXMuX2RldGFpbHNWaWV3SWQsIHRoaXMuX2xpYk5hbWUgKyBcIi5zYW9wQWJzZW5jZUNvbmZpcm1hdGlvbkRldGFpbHNWaWV3XCIpO1xyXG4gICAgICAgIHRoaXMuc2FvcEFic2VuY2VDb25maXJtYXRpb25EZXRhaWxzVmlldy5yZWZyZXNoRGF0YUV4dGVuZGVkID0gdGhpcy5yZWZyZXNoVGFibGVEYXRhLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5fc2FvcFBvcG92ZXIgPSBuZXcgU2FvcFBvcG92ZXIoKTtcclxuICAgICAgICB0aGlzLl9zYW9wUG9wb3Zlci5hZnRlclBvcG92ZXJTaG93ID0gdGhpcy5hZnRlclBvcG92ZXJNb2JpbGVGaWx0ZXJTaG93LmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdFZpZXcoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUHJvY2Vzc2VkVmlldy5pbml0Vmlld1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2FvcFBvcG92ZXIuYmluZFBvcG92ZXJFdmVudHMoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0Q29udHJvbHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0Q29udHJvbHMoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUHJvY2Vzc2VkVmlldy5pbml0Q29udHJvbHNcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgJCh0aGlzLl9zZWFyY2hBbGxGaWVsZHNWYWx1ZUlkKS5rZXl1cChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGxldCBmaWx0ZXJWYWwgPSBTdHJpbmcoJChfdGhpcy5fc2VhcmNoQWxsRmllbGRzVmFsdWVJZCkudmFsKCkpO1xyXG4gICAgICAgICAgICBmaWx0ZXJUYWJsZVJvd3MoZmlsdGVyVmFsLCBfdGhpcy5fdGFibGVJZCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3NlbGVjdE9yZ0ZpbHRlci5pbml0RmlsdGVyQ29udHJvbHMoKTsgICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIGJpbmRHcmlkRXZlbnRzKCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wQWJzZW5jZUNvbmZpcm1hdGlvblByb2Nlc3NlZFZpZXcuYmluZEdyaWRFdmVudHNcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgIFxyXG4gICAgICAgICQoXCIuYnRuRGV0YWlsc0tFUGxhbkRvcHVzdG92XCIpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICQoXCIuYnRuRGV0YWlsc0tFUGxhbkRvcHVzdG92XCIpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChyb3cpIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUHJvY2Vzc2VkVmlldy5idG5EZXRhaWxzS0VQbGFuRG9wdXN0b3YuY2xpY2tcIik7XHJcbiAgICAgICAgICAgIGxldCBsZXRvID0gcm93LnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWxldG9cIik7XHJcbiAgICAgICAgICAgIGxldCBzaWZyYVphcG9zbGVuaSA9IHJvdy50YXJnZXQuZ2V0QXR0cmlidXRlKFwiZGF0YS1zaWZyYXphcG9zbGVuaVwiKTtcclxuICAgICAgICAgICAgbGV0IHphcG9yZWRuYVN0ZXZpbGthID0gcm93LnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXphcG9yZWRuYXN0ZXZpbGthXCIpO1xyXG4gICAgICAgICAgICBsZXQgdGl0bGUgPSByb3cudGFyZ2V0LmdldEF0dHJpYnV0ZShcImRhdGEtZm9ybXRpdGxlXCIpO1xyXG5cclxuICAgICAgICAgICAgX3RoaXMuc2hvd1JlY29yZERldGFpbHMoeyBsZXRvOiBsZXRvLCBzaWZyYVphcG9zbGVuaTogc2lmcmFaYXBvc2xlbmksIHphcG9yZWRuYVN0ZXZpbGthOiB6YXBvcmVkbmFTdGV2aWxrYSB9LCB0aXRsZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd1JlY29yZERldGFpbHMoZGV0YWlsc0RhdGE6IGFueSwgdGl0bGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wQWJzZW5jZUNvbmZpcm1hdGlvblByb2Nlc3NlZFZpZXcuc2hvd1JlY29yZERldGFpbHNcIik7XHJcblxyXG4gICAgICAgIHRoaXMuc2FvcEFic2VuY2VDb25maXJtYXRpb25EZXRhaWxzVmlldy5zaG93Rm9ybShkZXRhaWxzRGF0YSwgdGl0bGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hEYXRhKHBhcmFtczogYW55ID0gbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wQWJzZW5jZUNvbmZpcm1hdGlvblByb2Nlc3NlZFZpZXcucmVmcmVzaERhdGFcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgJChcIiNhYnNlbmNlQ29uZmlybWF0aW9uUHJvY2Vzc2VkXCIpLmh0bWwocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICBfdGhpcy5iaW5kR3JpZEV2ZW50cygpO1xyXG4gICAgICAgICAgICBfdGhpcy5fc2FvcFBvcG92ZXIuYmluZFBvcG92ZXJFdmVudHMoKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjogXCJBYnNlbmNlQ29uZmlybWF0aW9uL0dldFByb2Nlc3NlZEFic2VuY2VzXCJcclxuICAgICAgICAgICAgLCBkYXRhOiBwYXJhbXNcclxuICAgICAgICAgICAgLCB0eXBlOiBcIkdFVFwiXHJcbiAgICAgICAgICAgICwgc3Bpbm5lckRpdklkOiBcIiNhYnNlbmNlQ29uZmlybWF0aW9uUHJvY2Vzc2VkTG9hZGluZ1wiXHJcbiAgICAgICAgfSk7ICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaFRhYmxlRGF0YSgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcEFic2VuY2VDb25maXJtYXRpb25Qcm9jZXNzZWRWaWV3LnJlZnJlc2hUYWJsZURhdGFcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgZmlsdGVyVmFsdWVzID0gdGhpcy5nZXRGaWx0ZXJWYWx1ZXMoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgJChcIiNhYnNlbmNlQ29uZmlybWF0aW9uUHJvY2Vzc2VkVGFibGVEaXZcIikuaHRtbChyZXNwb25zZSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgZmlsdGVyVmFsID0gU3RyaW5nKCQoX3RoaXMuX3NlYXJjaEFsbEZpZWxkc1ZhbHVlSWQpLnZhbCgpKTtcclxuICAgICAgICAgICAgZmlsdGVyVGFibGVSb3dzKGZpbHRlclZhbCwgX3RoaXMuX3RhYmxlSWQpO1xyXG5cclxuICAgICAgICAgICAgX3RoaXMuZmlsdGVyWmFwb3NsZW5pVGFibGVSb3dzKCQoX3RoaXMuX3NlbGVjdE9yZ0ZpbHRlci5fc2VsZWN0WmFwb3NsZW5pSWQpLnZhbCgpLnRvU3RyaW5nKCkpO1xyXG5cclxuICAgICAgICAgICAgX3RoaXMuYmluZEdyaWRFdmVudHMoKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjogXCJBYnNlbmNlQ29uZmlybWF0aW9uL0dldFByb2Nlc3NlZEFic2VuY2VzVGFibGVcIlxyXG4gICAgICAgICAgICAsIGRhdGE6IGZpbHRlclZhbHVlc1xyXG4gICAgICAgICAgICAsIHR5cGU6IFwiR0VUXCJcclxuICAgICAgICAgICAgLCBzcGlubmVyRGl2SWQ6IFwiI2Fic2VuY2VDb25maXJtYXRpb25Qcm9jZXNzZWRMb2FkaW5nXCJcclxuICAgICAgICB9KTsgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIC8vIMSNZSBqZSB0aXAgPSBcIk1cIiwgYmVyZW1lIHZyZWRuc290aSBpeiBIVE1MIG1vYmlsZSBlbGVtZW50b3Ygc2ljZXIgaXogZGVza3RvcCBlbGVtZW50b3ZcclxuICAgIGdldEZpbHRlclZhbHVlcyh0aXA6IHN0cmluZyA9IFwiXCIpOiBhbnkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wQWJzZW5jZUNvbmZpcm1hdGlvblByb2Nlc3NlZFZpZXcuZ2V0RmlsdGVyVmFsdWVzXCIpO1xyXG5cclxuICAgICAgICBsZXQgcG90cmplbmkgPSB0cnVlO1xyXG4gICAgICAgIGxldCBwb3RyamVuaUNoZWNrQm94ID0gJCh0aGlzLl9wb3RyamVuaUNoZWNrQm94SWQpO1xyXG4gICAgICAgIGlmICh0aXAgPT0gXCJNXCIpIHtcclxuICAgICAgICAgICAgcG90cmplbmlDaGVja0JveCA9ICQoXCJkaXYucG9wb3Zlci5zaG93XCIpLmZpbmQodGhpcy5fcG90cmplbmlDaGVja0JveE1vYmlsZUZpbHRlcklkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHBvdHJqZW5pQ2hlY2tCb3gubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGlmIChwb3RyamVuaUNoZWNrQm94LmlzKFwiOmNoZWNrZWRcIikpIHtcclxuICAgICAgICAgICAgICAgIHBvdHJqZW5pID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHBvdHJqZW5pID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBwcmVrbGljYW5pID0gdHJ1ZTtcclxuICAgICAgICBsZXQgcHJla2xpY2FuaUNoZWNrQm94ID0gJCh0aGlzLl9wcmVrbGljYW5pQ2hlY2tCb3hJZCk7XHJcbiAgICAgICAgaWYgKHRpcCA9PSBcIk1cIikge1xyXG4gICAgICAgICAgICBwcmVrbGljYW5pQ2hlY2tCb3ggPSAkKFwiZGl2LnBvcG92ZXIuc2hvd1wiKS5maW5kKHRoaXMuX3ByZWtsaWNhbmlDaGVja0JveE1vYmlsZUZpbHRlcklkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByZWtsaWNhbmlDaGVja0JveC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgaWYgKHByZWtsaWNhbmlDaGVja0JveC5pcyhcIjpjaGVja2VkXCIpKSB7XHJcbiAgICAgICAgICAgICAgICBwcmVrbGljYW5pID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHByZWtsaWNhbmkgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGxldG8gPSBudWxsO1xyXG4gICAgICAgIGxldCBsZXRvSW5wdXQgPSAkKHRoaXMuX2xldG9JZClcclxuICAgICAgICBpZiAodGlwID09IFwiTVwiKSB7XHJcbiAgICAgICAgICAgIGxldG9JbnB1dCA9ICQoXCJkaXYucG9wb3Zlci5zaG93XCIpLmZpbmQodGhpcy5fbGV0b01vYmlsZUZpbHRlcklkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGxldG9TdHIgPSBTdHJpbmcobGV0b0lucHV0LnZhbCgpKTtcclxuICAgICAgICBpZiAobGV0b1N0ci5sZW5ndGggPT0gNCB8fCBsZXRvU3RyLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIGlmIChsZXRvU3RyLmxlbmd0aCA9PSA0KSB7XHJcbiAgICAgICAgICAgICAgICBsZXRvID0gK2xldG9TdHI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7IGxldG86IGxldG8sIHBvdHJqZW5pOiBwb3RyamVuaSwgcHJla2xpY2FuaTogcHJla2xpY2FuaSB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGtvcGlyYW5qZSBmaWx0ZXIgdnJlZG5vc3RpIGl6IGh0bWwgZWxlbWVudGkgemEgbW9iaWxlIHYgaHRtbCBlbGVtZW50ZSB6YSBkZXNrdG9wIHByZWdsZWRcclxuICAgIGNvcHlGaWx0ZXJWYWx1ZXMoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUHJvY2Vzc2VkVmlldy5jb3B5RmlsdGVyVmFsdWVzXCIpO1xyXG5cclxuICAgICAgICAvLyBwcmlkb2JpbW8gdnJlZG5vc3RpIGl6IEhUTUwgbW9iaWxlIGVsZW1lbnRvdlxyXG4gICAgICAgIGxldCBmaWx0ZXJWYWx1ZXMgPSB0aGlzLmdldEZpbHRlclZhbHVlcyhcIk1cIik7XHJcblxyXG4gICAgICAgICQodGhpcy5fcG90cmplbmlDaGVja0JveElkKS5wcm9wKCdjaGVja2VkJywgZmlsdGVyVmFsdWVzLnBvdHJqZW5pKTtcclxuICAgICAgICAkKHRoaXMuX3ByZWtsaWNhbmlDaGVja0JveElkKS5wcm9wKCdjaGVja2VkJywgZmlsdGVyVmFsdWVzLnByZWtsaWNhbmkpO1xyXG4gICAgICAgICQodGhpcy5fbGV0b0lkKS52YWwoZmlsdGVyVmFsdWVzLmxldG8pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIMSNZSBqZSB0aXAgPSBcIk1cIiwgamUgcHJpc2VsIGtsaWMgaXogbW9iaWxlIGZpbHRlciBwb3BvdmVyIG9rbmFcclxuICAgIGZpbHRlcnNDaGFuZ2VkKHRpcDogc3RyaW5nID0gXCJcIik6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wQWJzZW5jZUNvbmZpcm1hdGlvblByb2Nlc3NlZFZpZXcuZmlsdGVyc0NoYW5nZWRcIik7XHJcblxyXG4gICAgICAgIGxldCBmaWx0ZXJWYWx1ZXMgPSB0aGlzLmdldEZpbHRlclZhbHVlcyh0aXApO1xyXG5cclxuICAgICAgICAvLyB6YXBpc2VtbyB2cmVkbm9zdGkgdHVkaSB2IGRydWdpIGZpbHRlclxyXG4gICAgICAgIC8vIGNlIGplIHRpcCA9IFwiTVwiIChtb2JpbGUpLCBzZSB6YXBpc2UgdnJlZG5vc3RpIGZpbHRyb3YgdiBodG1sIGVsZW1lbnRvdiB6YSBkZXNrdG9wIHByZWdsZWQgaW4gb2JyYXRub1xyXG4gICAgICAgIC8vIHBvdGVtIHNlIHByaSBwcmlrYXp1IGZpbHRyaXJhbmloIHBvZGF0a292IHVwb3N0ZXZham8gdnJlZG5vc3RpIGl6IGRlc2tvdHAgaHRtbCBlbGVtZW50b3ZcclxuICAgICAgICBpZiAodGlwID09IFwiTVwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29weUZpbHRlclZhbHVlcygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gbGV0byBuZSBzbWUgYml0aSBudWxsXHJcbiAgICAgICAgaWYgKGZpbHRlclZhbHVlcy5sZXRvICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoVGFibGVEYXRhKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFmdGVyUG9wb3Zlck1vYmlsZUZpbHRlclNob3coKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUHJvY2Vzc2VkVmlldy5hZnRlclBvcG92ZXJNb2JpbGVGaWx0ZXJTaG93XCIpO1xyXG5cclxuICAgICAgICAvLyBnZXQgZmlsdGVyIHZhbHVlcyBmcm9tIGRlc2t0b3AgaHRtbCBlbGVtZW50c1xyXG4gICAgICAgIGxldCBmaWx0ZXJWYWx1ZXMgPSB0aGlzLmdldEZpbHRlclZhbHVlcygpO1xyXG5cclxuICAgICAgICAvLyB3cml0ZSBmaWx0ZXIgdmFsdWVzIHRvIHBvcG92ZXIgaHRtbCBlbGVtZW50cyB3aGVuIGl0cyBzaG93ZW5cclxuXHJcbiAgICAgICAgdmFyIGxldG9JbnB1dCA9ICQoXCJkaXYucG9wb3Zlci5zaG93XCIpLmZpbmQodGhpcy5fbGV0b01vYmlsZUZpbHRlcklkKTtcclxuICAgICAgICBsZXRvSW5wdXQudmFsKGZpbHRlclZhbHVlcy5sZXRvKTtcclxuXHJcbiAgICAgICAgdmFyIHBvdHJqZW5pQ2hlY2tCb3ggPSAkKFwiZGl2LnBvcG92ZXIuc2hvd1wiKS5maW5kKHRoaXMuX3BvdHJqZW5pQ2hlY2tCb3hNb2JpbGVGaWx0ZXJJZCk7XHJcbiAgICAgICAgcG90cmplbmlDaGVja0JveC5wcm9wKCdjaGVja2VkJywgZmlsdGVyVmFsdWVzLnBvdHJqZW5pKTtcclxuXHJcbiAgICAgICAgdmFyIHByZWtsaWNhbmlDaGVja0JveCA9ICQoXCJkaXYucG9wb3Zlci5zaG93XCIpLmZpbmQodGhpcy5fcHJla2xpY2FuaUNoZWNrQm94TW9iaWxlRmlsdGVySWQpO1xyXG4gICAgICAgIHByZWtsaWNhbmlDaGVja0JveC5wcm9wKCdjaGVja2VkJywgZmlsdGVyVmFsdWVzLnByZWtsaWNhbmkpO1xyXG5cclxuICAgICAgICAvLyBwcmlrYXppIGZpbHRlciBva25vXHJcbiAgICAgICAgdmFyIGZpbHRlckJvZHkgPSAkKFwiZGl2LnBvcG92ZXIuc2hvd1wiKS5maW5kKFwiI3BvcE92ZXJQcm9jZXNzZWRGaWx0ZXJCb2R5XCIpO1xyXG4gICAgICAgIGZpbHRlckJvZHkuc2hvdygpO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbHRlclphcG9zbGVuaVRhYmxlUm93cyhmaWx0ZXJaYXBvc2xlbmk6IHN0cmluZykge1xyXG4gICAgICAgIC8vIERlY2xhcmUgdmFyaWFibGVzXHJcbiAgICAgICAgdmFyIHRhYmxlLCB0ciwgX3Jvd0lkLCBpLCB0eHRWYWx1ZTtcclxuICAgICAgICB0YWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWJzZW5jZUNvbmZpcm1hdGlvblByb2Nlc3NlZFRhYmxlXCIpO1xyXG4gICAgICAgIHRyID0gdGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0clwiKTtcclxuICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHRhYmxlIHJvd3MsIGFuZCBoaWRlIHRob3NlIHdobyBkb24ndCBtYXRjaCB0aGUgc2VhcmNoIHF1ZXJ5XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIF9yb3dJZCA9IG51bGw7XHJcbiAgICAgICAgICAgIGxldCBfdHJJZCA9ICQodHJbaV0pLmF0dHIoXCJkYXRhLXNpZnJhLXphcG9zbGVuaVwiKTtcclxuICAgICAgICAgICAgaWYgKCFpc1VuRGVmaW5lZChfdHJJZCkpIHtcclxuICAgICAgICAgICAgICAgIF9yb3dJZCA9IF90cklkLnRvU3RyaW5nKClcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKF9yb3dJZCkge1xyXG4gICAgICAgICAgICAgICAgdHh0VmFsdWUgPSBfcm93SWQudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgIGlmIChpc0VtcHR5KGZpbHRlclphcG9zbGVuaSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAkKHRyW2ldKS5hZGRDbGFzcyhcImVsZW1lbnQtaGlkZGVuXCIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWx0ZXJaYXBvc2xlbmkudG9VcHBlckNhc2UoKS5pbmRleE9mKHR4dFZhbHVlKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJCh0cltpXSkucmVtb3ZlQ2xhc3MoXCJlbGVtZW50LWhpZGRlblwiKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJCh0cltpXSkuYWRkQ2xhc3MoXCJlbGVtZW50LWhpZGRlblwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IFNhb3BWaWV3Rm9ybSB9IGZyb20gXCIuLi9Db3JlL3Nhb3Atdmlldy1mb3JtXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcEFic2VuY2VDb25maXJtYXRpb25SZWplY3RWaWV3IGV4dGVuZHMgU2FvcFZpZXdGb3JtIHtcclxuICAgIGNvbnN0cnVjdG9yKHZpZXdJZDogc3RyaW5nLCBsaWJOYW1lOiBzdHJpbmcgPSBcIlwiKSB7XHJcbiAgICAgICAgc3VwZXIodmlld0lkLCBsaWJOYW1lKTtcclxuICAgICAgICB0aGlzLnNldERpY3Rpb25hcnkoKTsgIFxyXG4gICAgICAgIHRoaXMuYWRkUmVjb3JkRW5kcG9pbnQgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuZWRpdFJlY29yZEVuZHBvaW50ID0gXCJBYnNlbmNlQ29uZmlybWF0aW9uL0dldFJlamVjdGVkRm9ybVwiO1xyXG4gICAgICAgIHRoaXMuZGVsZXRlUmVjb3JkRW5kcG9pbnQgPSBcIlwiO1xyXG4gICAgfSAgIFxyXG5cclxuICAgIHNldERpY3Rpb25hcnkoKSB7XHJcbiAgICAgICAgdGhpcy5zZXRUZXJtaW5vbG9neUxpc3QoKTtcclxuICAgIH0gIFxyXG59XHJcblxyXG5cclxuIiwi77u/Ly8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9hbGVydGlmeS9pbmRleC5kLnRzXCIgLz5cclxuaW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wQWJzZW5jZUNvbmZpcm1hdGlvblBlbmRpbmdWaWV3IH0gZnJvbSBcIi4vc2FvcC1hYnNlbmNlQ29uZmlybWF0aW9uLXBlbmRpbmctdmlld1wiO1xyXG5pbXBvcnQgeyBTYW9wQWJzZW5jZUNvbmZpcm1hdGlvblByb2Nlc3NlZFZpZXcgfSBmcm9tIFwiLi9zYW9wLWFic2VuY2VDb25maXJtYXRpb24tcHJvY2Vzc2VkLXZpZXdcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wQWJzZW5jZUNvbmZpcm1hdGlvblZpZXcge1xyXG4gICAgcHJpdmF0ZSBfbGliTmFtZTpzdHJpbmc7XHJcbiAgICBcclxuICAgIHB1YmxpYyBzYW9wQWJzZW5jZUNvbmZpcm1hdGlvblBlbmRpbmdWaWV3OiBTYW9wQWJzZW5jZUNvbmZpcm1hdGlvblBlbmRpbmdWaWV3O1xyXG4gICAgcHVibGljIHNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUHJvY2Vzc2VkVmlldzogU2FvcEFic2VuY2VDb25maXJtYXRpb25Qcm9jZXNzZWRWaWV3O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHZpZXdJZDogc3RyaW5nLCBsaWJOYW1lOiBzdHJpbmcgPSBcIlwiKSB7XHJcbiAgICAgICAgdGhpcy5fbGliTmFtZSA9IGxpYk5hbWU7XHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLnNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUGVuZGluZ1ZpZXcgPSBuZXcgU2FvcEFic2VuY2VDb25maXJtYXRpb25QZW5kaW5nVmlldyh2aWV3SWQsIHRoaXMuX2xpYk5hbWUgKyBcIi5zYW9wQWJzZW5jZUNvbmZpcm1hdGlvblBlbmRpbmdWaWV3XCIpXHJcbiAgICAgICAgdGhpcy5zYW9wQWJzZW5jZUNvbmZpcm1hdGlvblBlbmRpbmdWaWV3LnJlZnJlc2hEYXRhRXh0ZXJuYWwgPSB0aGlzLnJlZnJlc2hBbGxEYXRhLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zYW9wQWJzZW5jZUNvbmZpcm1hdGlvblByb2Nlc3NlZFZpZXcgPSBuZXcgU2FvcEFic2VuY2VDb25maXJtYXRpb25Qcm9jZXNzZWRWaWV3KHZpZXdJZCwgdGhpcy5fbGliTmFtZSArIFwiLnNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUHJvY2Vzc2VkVmlld1wiKVxyXG4gICAgfVxyXG5cclxuICAgIGluaXRWaWV3KCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wQWJzZW5jZUNvbmZpcm1hdGlvblZpZXcuaW5pdFZpZXdcIik7XHJcblxyXG4gICAgICAgIC8vIGZvcm0gbmltYSBzaWRlYmFyIHJpZ2h0LCB6YXRvIHNlIGRvZGFuIGNsYXNzLCBkYSBidG4gbmkgdmlkZW4gdHVkaSB2IG1vYmlsZSB2ZXJ6aWppXHJcbiAgICAgICAgJChcIiNidG5TaG93U2lkZWJhcnJcIikuYWRkQ2xhc3MoXCJkLW5vbmUtbW9iaWxlXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHNlIHVwb3JhYmkgdiBpbml0IG1ldG9kaSB2IEFic2VuY2VDb25maXJtYXRpb24gaW5kZXggY3NodG1sIGRhdG90ZWtpXHJcbiAgICByZWZyZXNoQWxsRGF0YSgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcEFic2VuY2VDb25maXJtYXRpb25WaWV3LnJlZnJlc2hBbGxEYXRhXCIpO1xyXG4gICAgICAgIHRoaXMuc2FvcEFic2VuY2VDb25maXJtYXRpb25QZW5kaW5nVmlldy5yZWZyZXNoQmFzZURhdGEoKTtcclxuICAgICAgICB0aGlzLnNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUHJvY2Vzc2VkVmlldy5yZWZyZXNoRGF0YSgpO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuIiwi77u/aW1wb3J0IHsgZ2xvYmFsLCBpc0VtcHR5LCBpc1VuRGVmaW5lZCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFNlcnZpY2VzQ29yZSB9IGZyb20gXCIuLi9Db3JlL3Nhb3Atc2VydmljZXMtY29yZVwiO1xyXG5pbXBvcnQgeyBTYW9wQ2FsZW5kYXIsU2FvcENhbGVuZGFyTmF2aWdhdGlvbiB9IGZyb20gXCIuLi9Db21wb25lbnRzL3Nhb3AtY2FsZW5kYXJcIjtcclxuaW1wb3J0IHsgU2FvcEFic2VuY2VDb25maXJtYXRpb25EZXRhaWxzVmlldyB9IGZyb20gXCIuL3Nhb3AtYWJzZW5jZUNvbmZpcm1hdGlvbi1kZXRhaWxzLXZpZXdcIjtcclxuaW1wb3J0IHsgU2FvcFJlZ0tlWmFwRG9wdXN0aVZpZXcgfSBmcm9tIFwiLi4vUkVHL3Nhb3AtcmVnLWtlWmFwRG9wdXN0aS12aWV3XCI7XHJcbmltcG9ydCB7IFNhb3BNdWx0aXNlbGVjdCwgU2FvcE11bHRpc2VsZWN0T3B0aW9ucyB9IGZyb20gXCIuLi9Db21wb25lbnRzL3Nhb3AtbXVsdGlzZWxlY3RcIjtcclxuaW1wb3J0IHsgU2FvcFBvcG92ZXIgfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLXBvcG92ZXJcIjtcclxuaW1wb3J0IHsgU2FvcEVtcGxveWVlTGVhdmVDYWxlbmRhciB9IGZyb20gXCIuLi9BYnNlbmNlQ29uZmlybWF0aW9uL3Nhb3AtZW1wbG95ZWVMZWF2ZUNhbGVuZGFyLXZpZXdcIjtcclxuaW1wb3J0IHsgU2FvcFdlYkdyaWRVbml0T3JnRmlsdGVyIH0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC1ncmlkLWZpbHRlci1Vbml0T3JnXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcEFic2VuY2VDb25maXJtYXRpb25DYWxlbmRhclZpZXcgZXh0ZW5kcyBTYW9wQ2FsZW5kYXIge1xyXG4gICAgcHJpdmF0ZSBfbGlibmFtZTogc3RyaW5nOyBcclxuXHJcbiAgICBwcml2YXRlIHNhb3BBYnNlbmNlQ29uZmlybWF0aW9uRGV0YWlsc1ZpZXc6IFNhb3BBYnNlbmNlQ29uZmlybWF0aW9uRGV0YWlsc1ZpZXc7XHJcbiAgICBwcml2YXRlIHNhb3BSZWdLZVphcERvcHVzdGlWaWV3OiBTYW9wUmVnS2VaYXBEb3B1c3RpVmlldztcclxuICAgIHByaXZhdGUgX2xhc3RDZWxsSWQgOnN0cmluZztcclxuICAgIHByaXZhdGUgX2xhc3RDYXRlZ29yeUlkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9zYW9wTGVmdFNpZGVBZGRpdGlvbmFsQ29udHJvbHNTZXJ2aWNlc0NvcmU6IFNhb3BTZXJ2aWNlc0NvcmU7XHJcbiAgICBwcml2YXRlIF9zYW9wUmlnaHRTaWRlQWRkaXRpb25hbENvbnRyb2xzU2VydmljZXNDb3JlOiBTYW9wU2VydmljZXNDb3JlO1xyXG5cclxuICAgIHByaXZhdGUgX3Nhb3BQb3BvdmVyRmlsdGVyOiBTYW9wUG9wb3ZlcjtcclxuXHJcbiAgICBwcml2YXRlIF9zYW9wUmVnS2VaYXBEb3B1c3RpVmlldzogU2FvcEVtcGxveWVlTGVhdmVDYWxlbmRhcjtcclxuXHJcbiAgICBwcml2YXRlIF9zZWxlY3RPcmdEZXNrdG9wRmlsdGVyOiBTYW9wV2ViR3JpZFVuaXRPcmdGaWx0ZXI7XHJcbiAgICBwcml2YXRlIF9zZWxlY3RPcmdNb2JpbGVGaWx0ZXI6IFNhb3BXZWJHcmlkVW5pdE9yZ0ZpbHRlcjtcclxuICAgIC8vXHJcbiAgICBjb25zdHJ1Y3RvcihsaWJOYW1lOiBzdHJpbmcgPSBcIlwiKSB7XHJcbiAgICAgICAgc3VwZXIobGliTmFtZSk7XHJcbiAgICAgICAgdGhpcy5fbGlibmFtZSA9IGxpYk5hbWU7XHJcbiAgICAgICAgdGhpcy5zYW9wQWJzZW5jZUNvbmZpcm1hdGlvbkRldGFpbHNWaWV3ID0gbmV3IFNhb3BBYnNlbmNlQ29uZmlybWF0aW9uRGV0YWlsc1ZpZXcoXCIjYWJzZW5jZUNvbmZpcm1hdGlvbkRldGFpbHNWaWV3MFwiLCBsaWJOYW1lICsgXCIuc2FvcEFic2VuY2VDb25maXJtYXRpb25EZXRhaWxzVmlld1wiKTtcclxuICAgICAgICB0aGlzLnNhb3BBYnNlbmNlQ29uZmlybWF0aW9uRGV0YWlsc1ZpZXcucmVmcmVzaERhdGFFeHRlbmRlZCA9IHRoaXMucmVmcmVzaERhdGFBZnRlclVwZGF0ZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2FvcFJlZ0tlWmFwRG9wdXN0aVZpZXcgPSBuZXcgU2FvcFJlZ0tlWmFwRG9wdXN0aVZpZXcoXCIjcmVnS2VaYXBEb3B1c3RpVmlldzBcIiwgbGliTmFtZSArIFwiLnNhb3BSZWdLZVphcERvcHVzdGlWaWV3XCIpO1xyXG4gICAgICAgIHRoaXMuc2FvcFJlZ0tlWmFwRG9wdXN0aVZpZXcucmVmcmVzaERhdGEgPSB0aGlzLnJlZnJlc2hEYXRhQWZ0ZXJVcGRhdGUuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLl9zYW9wTGVmdFNpZGVBZGRpdGlvbmFsQ29udHJvbHNTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgICAgIHRoaXMuX3Nhb3BSaWdodFNpZGVBZGRpdGlvbmFsQ29udHJvbHNTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG5cclxuICAgICAgICB0aGlzLl9zYW9wUG9wb3ZlckZpbHRlciA9IG5ldyBTYW9wUG9wb3ZlcignLmRheWdyaWQtZXZlbnQnKTtcclxuICAgICAgICB0aGlzLl9zYW9wUG9wb3ZlckZpbHRlci5hZnRlclBvcG92ZXJTaG93ID0gdGhpcy5hZnRlclBvcG92ZXJNb2JpbGVGaWx0ZXJTaG93LmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuX3Nhb3BSZWdLZVphcERvcHVzdGlWaWV3ID0gbmV3IFNhb3BFbXBsb3llZUxlYXZlQ2FsZW5kYXIoJyNrZUVtcGxveWVlTGVhdmVDYWxlbmRhcjAnLCBsaWJOYW1lICsgXCIuc2FvcFJlZ0tlWmFwRG9wdXN0aVZpZXdcIik7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdFZpZXcoKSB7XHJcbiAgICAgICAgc3VwZXIuaW5pdFZpZXcoe2NvbnRyb2xsZXI6XCJBYnNlbmNlQ29uZmlybWF0aW9uXCIsYWN0aW9uOlwiQ2FsZW5kYXJcIixwYXJ0aWFsUmVuZGVyOnRydWV9KTtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcucG9wb3ZlckxpbmsnLCBmdW5jdGlvbiAoZTphbnkpIHtcclxuICAgICAgICAgICAgbGV0IF9wb3BvdmVySWQgPSBcIiNcIitlLnRhcmdldC5pZDtcclxuICAgICAgICAgICAgbGV0IF9jYXRlZ29yeUlkID0gXCIjXCIrJChfcG9wb3ZlcklkKS5hdHRyKFwiZGF0YS1jYXRlZ29yeUlkXCIpO1xyXG4gICAgICAgICAgICBsZXQgX2NlbGxJZCA9IFwiI1wiKyQoX3BvcG92ZXJJZCkuYXR0cihcImRhdGEtY2VsbElkXCIpO1xyXG4gICAgICAgICAgICBsZXQgX2xpbmsgPSAkKF9wb3BvdmVySWQpLmF0dHIoXCJsaW5rXCIpO1xyXG4gICAgICAgICAgICBjb25zdCBfZGF0YSA9IEpTT04ucGFyc2UoX2xpbmspO1xyXG4gICAgICAgICAgICBfdGhpcy5zaG93UmVjb3JkRGV0YWlscyhfY2F0ZWdvcnlJZCxfY2VsbElkLF9kYXRhKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgJy5jYXRlZ29yeUxpbmsnLCBmdW5jdGlvbiAoZTogYW55KSB7XHJcbiAgICAgICAgICAgIGxldCBfbGluayA9ICQoXCIjXCIgKyBlLnRhcmdldC5pZCkuYXR0cihcImxpbmtcIik7XHJcbiAgICAgICAgICAgIGlmIChfbGluayA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgX2RhdGEgPSBKU09OLnBhcnNlKF9saW5rKTtcclxuXHJcbiAgICAgICAgICAgIF90aGlzLnNob3dFbXBsb3llZUxlYXZlQ2FsZW5kYXIoX2RhdGEuc2lmcmFaYXBvc2xlbmksIF9kYXRhLm5heml2WmFwb3NsZW5pKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgJyNidG5BZGRDb25maXJtZWRBYnNlbmNlJywgZnVuY3Rpb24gKGU6IGFueSkge1xyXG4gICAgICAgICAgICBsZXQgZWxlbWVudEN0cmwgPSAkKFwiI1wiICsgZS50YXJnZXQuaWQpO1xyXG4gICAgICAgICAgICBsZXQgZm9ybVRpdGxlID0gZWxlbWVudEN0cmwuZGF0YShcImZvcm10aXRsZVwiKTtcclxuICAgICAgICAgICAgX3RoaXMuc2hvd0FkZEFic2VuY2VGb3JtKGZvcm1UaXRsZSwgXCJcIik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIGRvZGFtbyBDc3MgdiBjYXRlZ29yaWVzRGl2IHphIHBvdHJlYmUgcmVzcG9uc2l2ZVxyXG4gICAgICAgIGxldCBjYXRlZ29yaWVzRGl2ID0gJChcIiNjYXRlZ29yaWVzRGl2XCIpO1xyXG4gICAgICAgIGlmIChjYXRlZ29yaWVzRGl2ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgbGV0IGN1c3RvbUNzcyA9IFwiZC1ub25lLW1vYmlsZVwiO1xyXG4gICAgICAgICAgICBpZiAoIWNhdGVnb3JpZXNEaXYuaGFzQ2xhc3MoY3VzdG9tQ3NzKSkge1xyXG4gICAgICAgICAgICAgICAgY2F0ZWdvcmllc0Rpdi5hZGRDbGFzcyhjdXN0b21Dc3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBwcmlrYXplbW8gZG9kYXRuZSBoZWFkZXIgY29udHJvbGUgemEgQWJzZW5jZUNvbmZpcm1hdGlvbiBrb2xlZGFyLCBrZXIgamUgU2FvcENhbGVuZGFyIHNwbG9zbmEga29udHJvbGFcclxuICAgICAgICB0aGlzLnNob3dBYnNlbmNlQ29uZmlybWF0aW9uQ2FsZW5kYXJMZWZ0U2lkZUFkZGl0aW9uYWxDb250cm9scygpO1xyXG4gICAgICAgIHRoaXMuc2hvd0Fic2VuY2VDb25maXJtYXRpb25DYWxlbmRhclJpZ2h0U2lkZUFkZGl0aW9uYWxDb250cm9scygpO1xyXG5cclxuICAgICAgICB0aGlzLnNldFRhYmxlVGRXaWR0aCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGJpbmREaXZzKCl7XHJcbiAgICAgICAgc3VwZXIuYmluZERpdnMoKTtcclxuICAgICAgICB0aGlzLmZvcm1EYXRhLmFkZENsYXNzKFwiYWJzZW5jZXMtY2FsZW5kYXJcIik7XHJcbiAgICAgICAgdGhpcy5mb3JtRGF0YS5hZGRDbGFzcyhcInRhYmxlLWNvbHVtbi1ob2xkZXJcIik7XHJcbiAgICAgICAgdGhpcy5mb3JtRGF0YS5hZGRDbGFzcyhcInNhb3AtdGFibGUtZml4aGVhZFwiKTtcclxuICAgICAgICAvLyBcclxuICAgIH1cclxuXHJcbiAgICBzaG93UmVjb3JkRGV0YWlscyhjYXRlZ29yeUlkOnN0cmluZyxjZWxsSWQ6c3RyaW5nLGRldGFpbHNEYXRhOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9sYXN0Q2VsbElkID0gY2VsbElkO1xyXG4gICAgICAgIHRoaXMuX2xhc3RDYXRlZ29yeUlkID0gY2F0ZWdvcnlJZDtcclxuICAgICAgICB0aGlzLnNhb3BBYnNlbmNlQ29uZmlybWF0aW9uRGV0YWlsc1ZpZXcuc2hvd0Zvcm0oZGV0YWlsc0RhdGEsIGRldGFpbHNEYXRhLm5heml2WmFwb3NsZW5pKTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93QWRkQWJzZW5jZUZvcm0odGl0bGU6IHN0cmluZywgc2lmcmFaYXBvc2xlbmk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wQWJzZW5jZUNvbmZpcm1hdGlvbkNhbGVuZGFyVmlldy5zaG93QWRkQWJzZW5jZUZvcm1cIik7XHJcbiAgICAgICAgdGhpcy5zYW9wUmVnS2VaYXBEb3B1c3RpVmlldy50aXRsZSA9IHRpdGxlO1xyXG4gICAgICAgIHRoaXMuc2FvcFJlZ0tlWmFwRG9wdXN0aVZpZXcuYWRkUmVjb3JkKHsgc2VsZWN0U2lmcmFaYXBvc2xlbmk6IHRydWUsIHNpZnJhWmFwb3NsZW5pOiBzaWZyYVphcG9zbGVuaSwgYXZ0b21hdHNrYVBvdHJkaXRldjogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoRGF0YUFmdGVyVXBkYXRlKCl7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoRGF0YShTYW9wQ2FsZW5kYXJOYXZpZ2F0aW9uLnJlZnJlc2hUYWJsZURhdGEsdGhpcy5fbGFzdENhdGVnb3J5SWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFmdGVyUmVmcmVzaFRhYmxlRGF0YShlOmFueSl7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BBYnNlbmNlQ29uZmlybWF0aW9uQ2FsZW5kYXJWaWV3LmFmdGVyUmVmcmVzaFRhYmxlRGF0YVwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5iaW5kRGl2cygpO1xyXG4gICAgICAgIHRoaXMuc2V0VGFibGVUZFdpZHRoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd0Fic2VuY2VDb25maXJtYXRpb25DYWxlbmRhclJpZ2h0U2lkZUFkZGl0aW9uYWxDb250cm9scygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIHRoaXMuX3Nhb3BSaWdodFNpZGVBZGRpdGlvbmFsQ29udHJvbHNTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICQoXCIjXCIgKyBfdGhpcy5nZXRIZWFkZXJDb250cm9sR3JvdXBJZCgpKS5hcHBlbmQocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICBfdGhpcy5fc2FvcFBvcG92ZXJGaWx0ZXIuYmluZFBvcG92ZXJFdmVudHMoKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX3Nhb3BSaWdodFNpZGVBZGRpdGlvbmFsQ29udHJvbHNTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjogXCJBYnNlbmNlQ29uZmlybWF0aW9uL0dldENhbGVuZGFyUmlnaHRTaWRlQWRkaXRpb25hbENvbnRyb2xzXCJcclxuICAgICAgICAgICAgLCBkYXRhOiBudWxsXHJcbiAgICAgICAgICAgICwgdHlwZTogXCJHRVRcIlxyXG4gICAgICAgICAgICAsIHNwaW5uZXJEaXZJZDogXCIjY2FsZW5kYXJGb3JtSGVhZGVyQ29udHJvbEdyb3VwTG9hZGluZ1wiXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd0Fic2VuY2VDb25maXJtYXRpb25DYWxlbmRhckxlZnRTaWRlQWRkaXRpb25hbENvbnRyb2xzKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgdGhpcy5fc2FvcExlZnRTaWRlQWRkaXRpb25hbENvbnRyb2xzU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAkKFwiI1wiICsgX3RoaXMuZ2V0SGVhZGVyQ29udHJvbEdyb3VwSWQoKSkucHJlcGVuZChyZXNwb25zZSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBvcHRpb25zOiBTYW9wTXVsdGlzZWxlY3RPcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0QWxsOiBmYWxzZVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgX3RoaXMuX3NlbGVjdE9yZ0Rlc2t0b3BGaWx0ZXIgPSBuZXcgU2FvcFdlYkdyaWRVbml0T3JnRmlsdGVyKF90aGlzLl9saWJuYW1lLCBcIkRlc2t0b3BcIik7XHJcbiAgICAgICAgICAgIF90aGlzLl9zZWxlY3RPcmdEZXNrdG9wRmlsdGVyLmZpbHRlclphcG9zbGVuaVRhYmxlUm93cyA9IF90aGlzLmNhdGVnb3JpZXNGaWx0ZXIuYmluZChfdGhpcyk7XHJcbiAgICAgICAgICAgIF90aGlzLl9zZWxlY3RPcmdEZXNrdG9wRmlsdGVyLmluaXRGaWx0ZXJDb250cm9scygpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fc2FvcExlZnRTaWRlQWRkaXRpb25hbENvbnRyb2xzU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246IFwiQWJzZW5jZUNvbmZpcm1hdGlvbi9HZXRDYWxlbmRhckxlZnRTaWRlQWRkaXRpb25hbENvbnRyb2xzXCJcclxuICAgICAgICAgICAgLCBkYXRhOiBudWxsXHJcbiAgICAgICAgICAgICwgdHlwZTogXCJHRVRcIlxyXG4gICAgICAgICAgICAsIHNwaW5uZXJEaXZJZDogXCIjY2FsZW5kYXJGb3JtSGVhZGVyQ29udHJvbEdyb3VwTG9hZGluZ1wiXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZmlsdGVyU2VsZWN0U2t1cGluYURhdGEoZWxlbWVudDogYW55KSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BBYnNlbmNlQ29uZmlybWF0aW9uQ2FsZW5kYXJWaWV3LmZpbHRlclNlbGVjdFNrdXBpbmFEYXRhXCIpO1xyXG5cclxuICAgICAgICAvLyBwcmViZXJlbW8sIGthdGVyZSBzaWZyZSB6YXBvc2xlbmloIHNvZGlqbyB2IGl6YnJhbmUgc2t1cGluZVxyXG4gICAgICAgIGxldCBpemJyYW5lU2t1cGluZSA9IDxzdHJpbmc+KGVsZW1lbnQudmFsKCkudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgbGV0IGl6YnJhbmVTaWZyZVphcG9zbGVuaWg6IHN0cmluZ1tdID0gbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKGl6YnJhbmVTa3VwaW5lICE9IG51bGwgJiYgaXpicmFuZVNrdXBpbmUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgaXpicmFuZVNpZnJlWmFwb3NsZW5paFN0ciA9IHRoaXMuZ2V0U2VsZXN0ZWRFbXBsb3llZXNJZHMoaXpicmFuZVNrdXBpbmUpO1xyXG4gICAgICAgICAgICBpemJyYW5lU2lmcmVaYXBvc2xlbmloID0gaXpicmFuZVNpZnJlWmFwb3NsZW5paFN0ci5zcGxpdChcIixcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fc2VsZWN0T3JnRGVza3RvcEZpbHRlci5fc2VsZWN0WmFwb3NsZW5pICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0T3JnRGVza3RvcEZpbHRlci5fc2VsZWN0WmFwb3NsZW5pLnNldFNlbGVjdFZhbHVlcyhpemJyYW5lU2lmcmVaYXBvc2xlbmloKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZmlsdGVyVGFibGVSb3dzKGZpbHRlclNrdXBpbmE6IHN0cmluZywgZmlsdGVyWmFwb3NsZW5pOiBzdHJpbmcpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcEFic2VuY2VDb25maXJtYXRpb25DYWxlbmRhclZpZXcuZmlsdGVyVGFibGVSb3dzXCIpO1xyXG5cclxuICAgICAgICAvLyBEZWNsYXJlIHZhcmlhYmxlc1xyXG4gICAgICAgIHZhciB0YWJsZSwgdHIsIF9yb3dJZCwgaSwgdHh0VmFsdWU7XHJcbiAgICAgICAgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInNhb3AtY2FsZW5kYXItdGFibGVcIik7XHJcbiAgICAgICAgdHIgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRyXCIpO1xyXG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGFibGUgcm93cywgYW5kIGhpZGUgdGhvc2Ugd2hvIGRvbid0IG1hdGNoIHRoZSBzZWFyY2ggcXVlcnlcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdHIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgX3Jvd0lkID0gbnVsbDtcclxuICAgICAgICAgICAgbGV0IF90cklkID0gJCh0cltpXSkuYXR0cihcImRhdGEtc2lmcmEtemFwb3NsZW5pXCIpO1xyXG4gICAgICAgICAgICBpZiAoIWlzVW5EZWZpbmVkKF90cklkKSkge1xyXG4gICAgICAgICAgICAgICAgX3Jvd0lkID0gX3RySWQudG9TdHJpbmcoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChfcm93SWQpIHtcclxuICAgICAgICAgICAgICAgIHR4dFZhbHVlID0gX3Jvd0lkLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNFbXB0eShmaWx0ZXJaYXBvc2xlbmkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJbaV0uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWx0ZXJaYXBvc2xlbmkudG9VcHBlckNhc2UoKS5pbmRleE9mKHR4dFZhbHVlKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZmlsdGVyWmFwb3NsZW5pIGplIGl6cG9sbmplbiwgcHJldmVyaSBzZSBmaWx0ZXJTa3VwaW5hXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFTa3VwaW5hID0gU3RyaW5nKCQodHJbaV0pLmRhdGEoXCJzaWZyYWVub3Rlb3Jnc3RydWt0dXJlXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyU2t1cGluYS50b1VwcGVyQ2FzZSgpLmluZGV4T2YoZGF0YVNrdXBpbmEudG9VcHBlckNhc2UoKSkgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cltpXS5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyW2ldLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyW2ldLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRTZWxlc3RlZEVtcGxveWVlc0lkcyhpemJyYW5lU2t1cGluZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcEFic2VuY2VDb25maXJtYXRpb25DYWxlbmRhclZpZXcuZ2V0U2VsZXN0ZWRFbXBsb3llZXNJZHNcIik7XHJcblxyXG4gICAgICAgIGxldCBzZWxlY3RlZEVtcGxveWVlc0lkczogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICBsZXQgYXJyYXlJemJyYW5lU2t1cGluZSA9IGl6YnJhbmVTa3VwaW5lLnNwbGl0KCcsJyk7XHJcbiAgICAgICAgZm9yICh2YXIgaW5kID0gMDsgaW5kIDwgYXJyYXlJemJyYW5lU2t1cGluZS5sZW5ndGg7IGluZCsrKSB7XHJcbiAgICAgICAgICAgIGlmIChhcnJheUl6YnJhbmVTa3VwaW5lW2luZF0gIT0gbnVsbCAmJiBhcnJheUl6YnJhbmVTa3VwaW5lW2luZF0ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gcHJlYmVyZW1vIHNlem5hbSB6YXBvc2xlbmloIGl6IGhpZGRlbiB0ZXh0IGh0bWwgZWxlbWVudG92XHJcbiAgICAgICAgICAgICAgICBsZXQgaGlkZGV0VGV4dEh0bWxJZCA9IFwiI3NpZnJhRW5vdGVPcmdTdHJ1a3R1cmVcIiArIGFycmF5SXpicmFuZVNrdXBpbmVbaW5kXS50cmltKCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgdmFsdSA9ICQoaGlkZGV0VGV4dEh0bWxJZCkudmFsKCk7XHJcbiAgICAgICAgICAgICAgICB2YWx1ID0gdmFsdS50b1N0cmluZygpLnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbXBsb3llZXNJZHMgPSBzZWxlY3RlZEVtcGxveWVlc0lkcyArIHZhbHU7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kIDwgKGFycmF5SXpicmFuZVNrdXBpbmUubGVuZ3RoIC0gMSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEVtcGxveWVlc0lkcyA9IHNlbGVjdGVkRW1wbG95ZWVzSWRzICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgICB9IFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzZWxlY3RlZEVtcGxveWVlc0lkcztcclxuICAgIH1cclxuXHJcbiAgICBhZnRlclBvcG92ZXJNb2JpbGVGaWx0ZXJTaG93KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BBYnNlbmNlQ29uZmlybWF0aW9uQ2FsZW5kYXJWaWV3LmFmdGVyUG9wb3Zlck1vYmlsZUZpbHRlclNob3dcIik7XHJcblxyXG4gICAgICAgIGxldCBhdHJDb250ZW50ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBvcG92ZXItY29udGVudFwiKTtcclxuICAgICAgICAvLyBwcmV2ZXJpbW8gxI1lIGplIHBvcHVwIGNhbGVuZGFyIGZpbHRlclxyXG4gICAgICAgIGlmIChhdHJDb250ZW50ID09PSBcIiNwb3BPdmVyQ2FsZW5kYXJGaWx0ZXJcIikge1xyXG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RPcmdNb2JpbGVGaWx0ZXIgPSBuZXcgU2FvcFdlYkdyaWRVbml0T3JnRmlsdGVyKHRoaXMuX2xpYm5hbWUsIFwiTW9iaWxlXCIsIFwiLnBvcG92ZXJcIik7XHJcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdE9yZ01vYmlsZUZpbHRlci5maWx0ZXJaYXBvc2xlbmlUYWJsZVJvd3MgPSB0aGlzLmNhdGVnb3JpZXNGaWx0ZXIuYmluZCh0aGlzKTtcclxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0T3JnTW9iaWxlRmlsdGVyLmluaXRGaWx0ZXJDb250cm9scygpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RTa3VwaW5hTW9iaWxlRmlsdGVyVmFsdWVzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdE9yZ01vYmlsZUZpbHRlci5fc2VsZWN0U2t1cGluYS5hZnRlckNoYW5nZUNvbW1vbkV2ZW50ID0gdGhpcy5zZWxlY3RTa3VwaW5hTW9iaWxlRmlsdGVyQ2hhbmdlZC5iaW5kKHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RDYXRlZ29yeU1vYmlsZUZpbHRlclZhbHVlcygpO1xyXG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RPcmdNb2JpbGVGaWx0ZXIuX3NlbGVjdFphcG9zbGVuaS5hZnRlckNoYW5nZUNvbW1vbkV2ZW50ID0gdGhpcy5zZWxlY3RDYXRlZ29yeU1vYmlsZUZpbHRlckNoYW5nZWQuYmluZCh0aGlzKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGRvZGFtbyBjdXN0b20gY3NzIHphIGZpbHRlclxyXG4gICAgICAgICAgICBsZXQgZmlsdGVyUG9wb3ZlckRpdiA9ICQoXCJkaXYucG9wb3Zlci5zaG93XCIpO1xyXG4gICAgICAgICAgICBpZiAoZmlsdGVyUG9wb3ZlckRpdiAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY3VzdG9tQ3NzID0gXCJjYWxlbmRhci1maWx0ZXJcIjtcclxuICAgICAgICAgICAgICAgIGlmICghZmlsdGVyUG9wb3ZlckRpdi5oYXNDbGFzcyhjdXN0b21Dc3MpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyUG9wb3ZlckRpdi5hZGRDbGFzcyhjdXN0b21Dc3MpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBkb2RhbW8gY3VzdG9tIGNzcyB6YSBmaWx0ZXJcclxuICAgICAgICAgICAgbGV0IGZpbHRlclBvcG92ZXJCb2R5RGl2ID0gJChcImRpdi5wb3BvdmVyLnNob3dcIikuZmluZChcImRpdi5wb3BvdmVyLWJvZHlcIik7XHJcbiAgICAgICAgICAgIGlmIChmaWx0ZXJQb3BvdmVyQm9keURpdiAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY3VzdG9tQ3NzID0gXCJjYWxlbmRhci1maWx0ZXItYm9keVwiO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXJQb3BvdmVyQm9keURpdi5oYXNDbGFzcyhjdXN0b21Dc3MpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyUG9wb3ZlckJvZHlEaXYuYWRkQ2xhc3MoY3VzdG9tQ3NzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAvLyBwcmlrYXppIGZpbHRlciBva25vXHJcbiAgICAgICAgICAgIGxldCBmaWx0ZXJCb2R5ID0gJChcImRpdi5wb3BvdmVyLnNob3dcIikuZmluZChcIiNwb3BPdmVyQ2FsZW5kYXJGaWx0ZXJCb2R5XCIpO1xyXG4gICAgICAgICAgICBmaWx0ZXJCb2R5LnNob3coKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0U2VsZWN0U2t1cGluYU1vYmlsZUZpbHRlclZhbHVlcygpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcEFic2VuY2VDb25maXJtYXRpb25DYWxlbmRhclZpZXcuc2V0U2VsZWN0U2t1cGluYU1vYmlsZUZpbHRlclZhbHVlc1wiKTtcclxuXHJcbiAgICAgICAgbGV0IHNrdXBpbmUgPSA8c3RyaW5nW10+KHRoaXMuX3NlbGVjdE9yZ0Rlc2t0b3BGaWx0ZXIuX3NlbGVjdFNrdXBpbmEuc2VsZWN0ZWRDQi52YWwoKSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3NlbGVjdE9yZ01vYmlsZUZpbHRlci5fc2VsZWN0U2t1cGluYS5zZXRTZWxlY3RWYWx1ZXMoc2t1cGluZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0U2VsZWN0Q2F0ZWdvcnlNb2JpbGVGaWx0ZXJWYWx1ZXMoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BBYnNlbmNlQ29uZmlybWF0aW9uQ2FsZW5kYXJWaWV3LnNldFNlbGVjdENhdGVnb3J5TW9iaWxlRmlsdGVyVmFsdWVzXCIpO1xyXG5cclxuICAgICAgICBsZXQgemFwb3NsZW5pID0gPHN0cmluZ1tdPih0aGlzLl9zZWxlY3RPcmdEZXNrdG9wRmlsdGVyLl9zZWxlY3RaYXBvc2xlbmkuc2VsZWN0ZWRDQi52YWwoKSk7XHJcblxyXG4gICAgICAgIHZhciB2b2RqYSA9ICQoXCIjQWRtaW5JRFwiKS52YWwoKS50b1N0cmluZygpO1xyXG4gICAgICAgIGlmICh2b2RqYSAhPT0gbnVsbCAmJiB2b2RqYSAhPT0gJycgJiYgemFwb3NsZW5pLmluZGV4T2Yodm9kamEpID09PSAtMSkge1xyXG4gICAgICAgICAgICB6YXBvc2xlbmkucHVzaCh2b2RqYSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9zZWxlY3RPcmdNb2JpbGVGaWx0ZXIuX3NlbGVjdFphcG9zbGVuaS5zZXRTZWxlY3RWYWx1ZXMoemFwb3NsZW5pKTtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RTa3VwaW5hTW9iaWxlRmlsdGVyQ2hhbmdlZChlbGVtZW50OiBhbnkpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcEFic2VuY2VDb25maXJtYXRpb25DYWxlbmRhclZpZXcuc2VsZWN0U2t1cGluYU1vYmlsZUZpbHRlckNoYW5nZWRcIik7XHJcblxyXG4gICAgICAgIC8vIHNocmFuaW1vIHZyZWRub3N0aSB2IGRlc2t0b3AgbXVsdGlTZWxlY3RTa3VwaW5hIGVsZW1lbnRcclxuICAgICAgICAvLyBhdnRvbWF0c2tvIHNlIGJvZG8gbmFzdGF2aWxpIHR1ZGkgemFwb3NsZW5pIHYgZGVza3RvcCBmaWx0ZXIgZWxlbWVudHVcclxuICAgICAgICBsZXQgaXpicmFuZVNrdXBpbmUgPSA8c3RyaW5nW10+KHRoaXMuX3NlbGVjdE9yZ01vYmlsZUZpbHRlci5fc2VsZWN0U2t1cGluYS5zZWxlY3RlZENCLnZhbCgpKTtcclxuICAgICAgICB0aGlzLl9zZWxlY3RPcmdEZXNrdG9wRmlsdGVyLl9zZWxlY3RTa3VwaW5hLnNldFNlbGVjdFZhbHVlcyhpemJyYW5lU2t1cGluZSk7XHJcblxyXG4gICAgICAgIC8vIHByZWJlcmVtbyBvem5hY2VuZSB6YXBvc2xlbmUgdiBkZXNrdG9wIGZpbHRlciBlbGVtZW50dVxyXG4gICAgICAgIC8vIGluIG5hc3RhdmltbyB0dWRpIHphcG9zbGVuZSB2IG1vYmlsZSBmaWx0ZXIgZWxlbWVudHVcclxuICAgICAgICB0aGlzLnNldFNlbGVjdENhdGVnb3J5TW9iaWxlRmlsdGVyVmFsdWVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0Q2F0ZWdvcnlNb2JpbGVGaWx0ZXJDaGFuZ2VkKGVsZW1lbnQ6IGFueSkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wQWJzZW5jZUNvbmZpcm1hdGlvbkNhbGVuZGFyVmlldy5zZWxlY3RDYXRlZ29yeU1vYmlsZUZpbHRlckNoYW5nZWRcIik7XHJcblxyXG4gICAgICAgIC8vIHNocmFuaW1vIHZyZWRub3N0aSB2IGRlc2t0b3AgQ2F0ZWdvcnkgZWxlbWVudFxyXG4gICAgICAgIGxldCBpemJyYW5pWmFwb3NsZW5pID0gPHN0cmluZ1tdPih0aGlzLl9zZWxlY3RPcmdNb2JpbGVGaWx0ZXIuX3NlbGVjdFphcG9zbGVuaS5zZWxlY3RlZENCLnZhbCgpKTtcclxuICAgICAgICB0aGlzLl9zZWxlY3RPcmdEZXNrdG9wRmlsdGVyLl9zZWxlY3RaYXBvc2xlbmkuc2V0U2VsZWN0VmFsdWVzKGl6YnJhbmlaYXBvc2xlbmkpO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dFbXBsb3llZUxlYXZlQ2FsZW5kYXIoc2lmcmFaYXBvc2xlbmk6IHN0cmluZywgbmF6aXZaYXBvc2xlbmk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wQWJzZW5jZUNvbmZpcm1hdGlvbkNhbGVuZGFyVmlldy5zaG93U2FvcEFic2VuY2VDb25maXJtYXRpb25DYWxlbmRhclZpZXdcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX3Nhb3BSZWdLZVphcERvcHVzdGlWaWV3Ll9zaWZyYVphcG9zbGVuaSA9IHNpZnJhWmFwb3NsZW5pO1xyXG4gICAgICAgIHRoaXMuX3Nhb3BSZWdLZVphcERvcHVzdGlWaWV3Ll9uYXppdlphcG9zbGVuaSA9IG5heml2WmFwb3NsZW5pO1xyXG4gICAgICAgIHRoaXMuX3Nhb3BSZWdLZVphcERvcHVzdGlWaWV3LnNldEZ1bGxUaXRsZSgpO1xyXG4gICAgICAgIHRoaXMuX3Nhb3BSZWdLZVphcERvcHVzdGlWaWV3LnJlY29yZERldGFpbHMoeyBzaWZyYVphcG9zbGVuaTogc2lmcmFaYXBvc2xlbmkgfSk7XHJcbiAgICAgICAgdGhpcy5fc2FvcFJlZ0tlWmFwRG9wdXN0aVZpZXcuU2V0VG9GdWxsU2NyZWVuKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZmlsdGVyRGF0YShlbGVtZW50OiBhbnkpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcENhbGVuZGFyLmZpbHRlckRhdGFcIik7XHJcbiAgICAgICAgdGhpcy5leHRlcm5hbEZpbHRlckRhdGEoZWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXh0ZXJuYWwgbWV0b2RhIHphIGZpbHRlciwga2kgbGFoa28gbmFkb21lc3RpIHRoaXMuY2F0ZWdvcmllc0ZpbHRlciBtZXRvZG9cclxuICAgIGV4dGVybmFsRmlsdGVyRGF0YShlbGVtZW50OiBhbnkpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcENhbGVuZGFyLmV4dGVybmFsRmlsdGVyRGF0YS1kZWZhdWx0XCIpO1xyXG4gICAgICAgIC8vIGtsaWNlIGRlZmF1bHQgbWV0b2RvXHJcbiAgICAgICAgdGhpcy5jYXRlZ29yaWVzRmlsdGVyKGVsZW1lbnQudmFsKCkudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2F0ZWdvcmllc0ZpbHRlcihmaWx0ZXI6IHN0cmluZyA9IFwiXCIpIHtcclxuICAgICAgICAvLyBEZWNsYXJlIHZhcmlhYmxlc1xyXG4gICAgICAgIHZhciB0YWJsZSwgdHIsIF9yb3dJZCwgaSwgdHh0VmFsdWU7XHJcbiAgICAgICAgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInNhb3AtY2FsZW5kYXItdGFibGVcIik7XHJcbiAgICAgICAgdHIgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRyXCIpO1xyXG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGFibGUgcm93cywgYW5kIGhpZGUgdGhvc2Ugd2hvIGRvbid0IG1hdGNoIHRoZSBzZWFyY2ggcXVlcnlcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdHIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgX3Jvd0lkID0gbnVsbDtcclxuICAgICAgICAgICAgbGV0IF90cklkID0gJCh0cltpXSkuYXR0cihcImlkXCIpO1xyXG4gICAgICAgICAgICBpZiAoIWlzVW5EZWZpbmVkKF90cklkKSkge1xyXG4gICAgICAgICAgICAgICAgX3Jvd0lkID0gX3RySWQudG9TdHJpbmcoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChfcm93SWQpIHtcclxuICAgICAgICAgICAgICAgIHR4dFZhbHVlID0gX3Jvd0lkLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNFbXB0eShmaWx0ZXIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJbaV0uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWx0ZXIudG9VcHBlckNhc2UoKS5pbmRleE9mKHR4dFZhbHVlKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJbaV0uc3R5bGUuZGlzcGxheSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyW2ldLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IFNhb3BWaWV3Rm9ybSB9IGZyb20gXCIuLi9jb3JlL3Nhb3Atdmlldy1mb3JtXCI7XHJcbmltcG9ydCB7IFNhb3BTZXJ2aWNlc0NvcmUgfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXNlcnZpY2VzLWNvcmVcIjtcclxuaW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vQ29yZS9zYW9wLXRyYW5zbGF0ZSc7XHJcbmltcG9ydCB7IFNhb3BSaWdodFNpZGViYXIsIFNhb3BSaWdodFNpZGViYXJWaWV3IH0gZnJvbSAnLi4vQ29tcG9uZW50cy9zYW9wLXJpZ2h0LXNpZGViYXInO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BFbXBsb3llZUxlYXZlQ2FsZW5kYXIgZXh0ZW5kcyBTYW9wVmlld0Zvcm0ge1xyXG4gICAgcHJpdmF0ZSBfc2FvcFNlcnZpY2VzQ29yZTogU2FvcFNlcnZpY2VzQ29yZTtcclxuICAgIHByaXZhdGUgX3llYXJDYXB0aW9uOiBzdHJpbmcgPSBcInllYXJDYXB0aW9uXCI7XHJcbiAgICBwcml2YXRlIF9idG5QcmV2aW91c0lkOiBzdHJpbmcgPSBcImJ0blllYXJQcmV2aW91c1wiO1xyXG4gICAgcHJpdmF0ZSBfYnRuTmV4dElkOiBzdHJpbmcgPSBcImJ0blllYXJOZXh0XCI7XHJcbiAgICBwdWJsaWMgX3NpZnJhWmFwb3NsZW5pOiAgc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBfbmF6aXZaYXBvc2xlbmk6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgcmlnaHRTaWRlYmFyOiBTYW9wUmlnaHRTaWRlYmFyO1xyXG5cclxuICAgIHByaXZhdGUgX3RyYW5zbGF0aW9uU2VydmljZTogU2FvcFRyYW5zbGF0aW9uU2VydmljZTtcclxuICAgIC8vXHJcbiAgICBjb25zdHJ1Y3Rvcih2aWV3SWQ6IHN0cmluZywgbGliTmFtZTogc3RyaW5nID0gXCJcIikge1xyXG4gICAgICAgIHN1cGVyKHZpZXdJZCwgbGliTmFtZSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3RyYW5zbGF0aW9uU2VydmljZSA9IG5ldyBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlKCk7XHJcbiAgICAgICAgdGhpcy5zZXRUZXJtaW5vbG9neUxpc3QoKTtcclxuXHJcbiAgICAgICAgdGhpcy5hZGRSZWNvcmRFbmRwb2ludCA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5lZGl0UmVjb3JkRW5kcG9pbnQgPSBcIkFic2VuY2VDb25maXJtYXRpb24vRW1wbG95ZWVBYnNlbmNlc0NhbGVuZGFyUGFydGlhbFwiO1xyXG4gICAgICAgIHRoaXMuZGVsZXRlUmVjb3JkRW5kcG9pbnQgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuZnVsbFNjcmVlbiA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG5cclxuICAgICAgICB0aGlzLmFmdGVyVmlld1Nob3dTdWNjZXNzID0gdGhpcy5pbml0VmlldztcclxuICAgICAgICB0aGlzLmFmdGVyU3VibWl0U3VjY2VzcyA9IHRoaXMuaW5pdFZpZXc7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGluaXRSaWdodFNpZGViYXIoKSB7XHJcbiAgICAgICAgdGhpcy5yaWdodFNpZGViYXIgPSBuZXcgU2FvcFJpZ2h0U2lkZWJhcigpO1xyXG4gICAgICAgIHRoaXMucmlnaHRTaWRlYmFyLmJpbmRDYXJvdXNlbERpdihcIiNyaWdodC1zaWRlYmFyLWFqYXhcIiwgU2FvcFJpZ2h0U2lkZWJhclZpZXcuQWJzZW5jZSk7XHJcbiAgICAgICAgdGhpcy5yaWdodFNpZGViYXIucmVmcmVzaE9kc290bm9zdGlFbXBsb3llZVN1bW1hcnkodGhpcy5fc2lmcmFaYXBvc2xlbmksIFwiI2RvcHVzdFphS29yaXNjZW5qZVN1bW1hcnlcIiwgXCIjdXJlWmFLb3Jpc2NlbmplU3VtbWFyeVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRUZXJtaW5vbG9neUxpc3QoKSB7XHJcbiAgICAgICAgbGV0IGRpY3Rpb25hcnk6IHN0cmluZ1tdID0gW1wiUHJlZ2xlZCBvZHNvdG5vc3RpXCJdO1xyXG4gICAgICAgIHRoaXMuX3RyYW5zbGF0aW9uU2VydmljZS5zZXRUcmFuc2xhdGlvbnNMaXN0KGRpY3Rpb25hcnkpO1xyXG4gICAgfSAgIFxyXG5cclxuICAgIGluaXRWaWV3KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaW5pdFJpZ2h0U2lkZWJhcigpO1xyXG4gICAgICAgIHRoaXMuTG9hZFZpZXdFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgTG9hZFZpZXdFdmVudHMoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BFbXBsb3llZUxlYXZlQ2FsZW5kYXIuYmluZEdyaWRFdmVudHNcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgX3RoaXMuZnVsbFRpdGxlID0gX3RoaXMuX3RyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJQcmVnbGVkIG9kc290bm9zdGlcIikgKyBcIjogIFwiICsgX3RoaXMuX3NpZnJhWmFwb3NsZW5pICsgXCIgLSBcIiArIF90aGlzLl9uYXppdlphcG9zbGVuaTtcclxuXHJcbiAgICAgICAgJChcIiNcIiArIHRoaXMuX2J0blByZXZpb3VzSWQpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICQoXCIjXCIgKyB0aGlzLl9idG5QcmV2aW91c0lkKS5jbGljayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wRW1wbG95ZWVMZWF2ZUNhbGVuZGFyLmJ0blByZXZpb3VzLmNsaWNrXCIpO1xyXG4gICAgICAgICAgICBsZXQgbGV0byA9IF90aGlzLmdldEN1cnJlbnRDYWxlbmRhclllYXIoKSAtIDE7XHJcbiAgICAgICAgICAgIF90aGlzLnJlZnJlc2hDYWxlbmRhckFsbE1vbnRoc0RhdGEobGV0byk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQoXCIjXCIgKyB0aGlzLl9idG5OZXh0SWQpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICQoXCIjXCIgKyB0aGlzLl9idG5OZXh0SWQpLmNsaWNrKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BFbXBsb3llZUxlYXZlQ2FsZW5kYXIuYnRuTmV4dC5jbGlja1wiKTtcclxuICAgICAgICAgICAgbGV0IGxldG8gPSBfdGhpcy5nZXRDdXJyZW50Q2FsZW5kYXJZZWFyKCkgKyAxO1xyXG4gICAgICAgICAgICBfdGhpcy5yZWZyZXNoQ2FsZW5kYXJBbGxNb250aHNEYXRhKGxldG8pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkKCdbcmVsPVwidG9vbHRpcENhbGVuZGFyRGF5RGV0YWlsc1wiXScpLnBvcG92ZXIoe1xyXG4gICAgICAgICAgICBjb250ZW50OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcEVtcGxveWVlTGVhdmVDYWxlbmRhci50b29sdGlwQ2FsZW5kYXJEYXlEZXRhaWxzLnBvcG92ZXJcIik7XHJcbiAgICAgICAgICAgICAgICB2YXIgY29udGVudCA9ICQodGhpcykuYXR0cihcImRhdGEtcG9wb3Zlci1jb250ZW50XCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoY29udGVudCkuY2hpbGRyZW4oXCIucG9wb3Zlci1ib2R5XCIpLmh0bWwoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hDYWxlbmRhckFsbE1vbnRoc0RhdGEobGV0bzogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BFbXBsb3llZUxlYXZlQ2FsZW5kYXIucmVmcmVzaENhbGVuZGFyQWxsTW9udGhzRGF0YVwiKTtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAkKFwiI3JlZ0VtcGxveWVlQWJzZW5jZUNhbGVuZGFyXCIpLmh0bWwocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICBfdGhpcy5Mb2FkVmlld0V2ZW50cygpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOiBcIkFic2VuY2VDb25maXJtYXRpb24vRW1wbG95ZWVBYnNlbmNlc1llYXJDYWxlbmRhclBhcnRpYWxcIlxyXG4gICAgICAgICAgICAsIHR5cGU6IFwiR0VUXCJcclxuICAgICAgICAgICAgLCBkYXRhOiB7IGxldG86IGxldG8sIHNpZnJhWmFwb3NsZW5pOiB0aGlzLl9zaWZyYVphcG9zbGVuaSB9XHJcbiAgICAgICAgICAgICwgc3Bpbm5lckRpdklkOiBcIiNzYW9wTG9hZGluZ1wiXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q3VycmVudENhbGVuZGFyWWVhcigpOiBudW1iZXIge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wRW1wbG95ZWVMZWF2ZUNhbGVuZGFyLmdldEN1cnJlbnRDYWxlbmRhclllYXJcIik7XHJcbiAgICAgICAgcmV0dXJuICQoXCIjXCIgKyB0aGlzLl95ZWFyQ2FwdGlvbikuZGF0YShcInllYXJcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldEZ1bGxUaXRsZSgpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy5mdWxsVGl0bGUgPSB0aGlzLl90cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiUHJlZ2xlZCBvZHNvdG5vc3RpXCIpICsgXCI6ICBcIiArIHRoaXMuX3NpZnJhWmFwb3NsZW5pICsgXCIgLSBcIiArIHRoaXMuX25heml2WmFwb3NsZW5pO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuIiwi77u/aW1wb3J0IHsgZ2xvYmFsLCBpc0VtcHR5LCBpc1VuRGVmaW5lZCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFdlYkdyaWQsIFNhb3BXZWJHcmlkUHJvcGVydGllcywgU2FvcFdlYkdyaWRUb29sYmFyLCBTYW9wV2ViR3JpZFRvb2xiYXJCdXR0b24sIFNhb3BXZWJEYXRhVGFibGUgfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLWdyaWRcIjtcclxuaW1wb3J0IHsgU2FvcEVtcGxveWVlTGVhdmVDYWxlbmRhciB9IGZyb20gXCIuLi9BYnNlbmNlQ29uZmlybWF0aW9uL3Nhb3AtZW1wbG95ZWVMZWF2ZUNhbGVuZGFyLXZpZXdcIjtcclxuaW1wb3J0IHsgU2FvcFdlYkdyaWRVbml0T3JnRmlsdGVyIH0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC1ncmlkLWZpbHRlci1Vbml0T3JnXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgS2VFcGxveWVlTGVhdmVMaXN0R3JpZCB7XHJcbiAgICBwcml2YXRlIGxpYk5hbWU6IHN0cmluZztcclxuICAgIHByaXZhdGUgX21haW5Gb3JtRGl2OiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gICAgcHJpdmF0ZSBfc2VhcmNoVmFsdWU6IEpRdWVyeTxIVE1MRWxlbWVudD47XHJcblxyXG4gICAgcHJpdmF0ZSBfc2VsZWN0T3JnRmlsdGVyOiBTYW9wV2ViR3JpZFVuaXRPcmdGaWx0ZXI7XHJcblxyXG4gICAgLy9cclxuICAgIHB1YmxpYyB3ZWJHcmlkMTogU2FvcFdlYkdyaWQ7XHJcblxyXG4gICAgcHJpdmF0ZSBfc2FvcFJlZ0tlWmFwRG9wdXN0aVZpZXc6IFNhb3BFbXBsb3llZUxlYXZlQ2FsZW5kYXI7XHJcblxyXG4gICAgY29uc3RydWN0b3IobGliTmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5saWJOYW1lID0gbGliTmFtZTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2FvcFJlZ0tlWmFwRG9wdXN0aVZpZXcgPSBuZXcgU2FvcEVtcGxveWVlTGVhdmVDYWxlbmRhcignI2tlRW1wbG95ZWVMZWF2ZUNhbGVuZGFyMCcsIGxpYk5hbWUgKyBcIi5zYW9wUmVnS2VaYXBEb3B1c3RpVmlld1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2VsZWN0T3JnRmlsdGVyID0gbmV3IFNhb3BXZWJHcmlkVW5pdE9yZ0ZpbHRlcihsaWJOYW1lLCBcIlwiKTtcclxuICAgICAgICB0aGlzLl9zZWxlY3RPcmdGaWx0ZXIuZmlsdGVyWmFwb3NsZW5pVGFibGVSb3dzID0gdGhpcy5maWx0ZXJaYXBvc2xlbmlUYWJsZVJvd3MuYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0VmlldygpIHtcclxuICAgICAgICB0aGlzLl9tYWluRm9ybURpdiA9ICQoXCIjS2VFbXBsb3llZUxlYXZlTGlzdEJyb3dzZUZvcm1cIik7XHJcbiAgICAgICAgdGhpcy5pbml0V2ViR3JpZDEoKTtcclxuICAgICAgICB0aGlzLl9zZWFyY2hWYWx1ZSA9IHRoaXMuX21haW5Gb3JtRGl2LmZpbmQoXCIjU2VhcmNoVmFsdWVcIik7XHJcbiAgICAgICAgdGhpcy5pbml0RmlsdGVyQ29udHJvbHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0V2ViR3JpZDEoKXtcclxuICAgICAgICBsZXQgd2dJZCA9IFwiI0tlRW1wbG95ZWVMZWF2ZUxpc3RcIjtcclxuICAgICAgICBsZXQgY2FwdGlvblRvb2xiYXIgPSAkKHdnSWQpLmF0dHIoXCJjYXB0aW9uLXRvb2xiYXJcIik7XHJcbiAgICAgICAgbGV0IHRvb2xiYXJJdGVtc1RlbXBsYXRlSWQgPSAkKHdnSWQpLmF0dHIoXCJ0b29sYmFyLWl0ZW1zLXRlbXBsYXRlSWRcIik7XHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLndlYkdyaWQxID0gbmV3IFNhb3BXZWJHcmlkKHRoaXMubGliTmFtZStcIi53ZWJHcmlkMVwiKTtcclxuICAgICAgICBsZXQgZ3JpZFByb3BlcnRpZXM6IFNhb3BXZWJHcmlkUHJvcGVydGllcztcclxuICAgICAgICBsZXQgZ3JpZFRvb2xiYXI6U2FvcFdlYkdyaWRUb29sYmFyO1xyXG4gICAgICAgIGxldCB0b29sYmFyQnV0dG9uczpTYW9wV2ViR3JpZFRvb2xiYXJCdXR0b25bXSA9IFtdO1xyXG4gICAgICAgIGxldCBkYXRhVGFibGU6U2FvcFdlYkRhdGFUYWJsZTtcclxuICAgICAgICAvL1xyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgZ3JpZFRvb2xiYXIgPSB7IGNhcHRpb246IGNhcHRpb25Ub29sYmFyLCBidXR0b25zOiB0b29sYmFyQnV0dG9ucywgaXRlbXNUZW1wbGF0ZUlkOiB0b29sYmFySXRlbXNUZW1wbGF0ZUlkIH07XHJcblxyXG4gICAgICAgIGRhdGFUYWJsZSA9IHsgZW5hYmxlZDogdHJ1ZSB9XHJcblxyXG4gICAgICAgIGdyaWRQcm9wZXJ0aWVzID0ge1xyXG4gICAgICAgICAgICBncmlkSWQ6IHdnSWRcclxuICAgICAgICAgICAgLCB0b2dnbGVQYW5lbDogeyBlbmFibGVkOiBmYWxzZSB9XHJcbiAgICAgICAgICAgICwgdG9vbGJhcjogZ3JpZFRvb2xiYXJcclxuICAgICAgICAgICAgLCBkYXRhVGFibGU6IGRhdGFUYWJsZVxyXG4gICAgICAgICAgICAsIGNzczogXCJtYXgtaGVpZ2h0LUtlRW1wbG95ZWVMZWF2ZUxpc3RcIlxyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLndlYkdyaWQxLmluaXQoZ3JpZFByb3BlcnRpZXMpO1xyXG5cclxuICAgICAgICAkKGRvY3VtZW50KS5vbignY2xpY2snLCAnLmNhdGVnb3J5TGluaycsIGZ1bmN0aW9uIChlOiBhbnkpIHtcclxuICAgICAgICAgICAgbGV0IF9saW5rID0gJChcIiNcIiArIGUudGFyZ2V0LmlkKS5hdHRyKFwibGlua1wiKTtcclxuICAgICAgICAgICAgaWYgKF9saW5rID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgX2RhdGEgPSBKU09OLnBhcnNlKF9saW5rKTtcclxuICAgICAgICAgICAgX3RoaXMuc2hvd0VtcGxveWVlTGVhdmVDYWxlbmRhcihfZGF0YS5zaWZyYVphcG9zbGVuaSwgX2RhdGEubmF6aXZaYXBvc2xlbmkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRGaWx0ZXJDb250cm9scygpOiB2b2lkIHtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMuX3NlYXJjaFZhbHVlLmtleXVwKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgbGV0IG9UYWJsZSA9IF90aGlzLndlYkdyaWQxLmRhdGFUYWJsZTtcclxuICAgICAgICAgICAgb1RhYmxlLnNlYXJjaCgkKHRoaXMpLnZhbCgpLnRvU3RyaW5nKCkpLmRyYXcoKSA7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3NlbGVjdE9yZ0ZpbHRlci5pbml0RmlsdGVyQ29udHJvbHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93RW1wbG95ZWVMZWF2ZUNhbGVuZGFyKHNpZnJhWmFwb3NsZW5pOiBzdHJpbmcsIG5heml2WmFwb3NsZW5pOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiS2VFcGxveWVlTGVhdmVMaXN0R3JpZC5zaG93U2FvcEFic2VuY2VDb25maXJtYXRpb25DYWxlbmRhclZpZXdcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX3Nhb3BSZWdLZVphcERvcHVzdGlWaWV3Ll9zaWZyYVphcG9zbGVuaSA9IHNpZnJhWmFwb3NsZW5pO1xyXG4gICAgICAgIHRoaXMuX3Nhb3BSZWdLZVphcERvcHVzdGlWaWV3Ll9uYXppdlphcG9zbGVuaSA9IG5heml2WmFwb3NsZW5pO1xyXG4gICAgICAgIHRoaXMuX3Nhb3BSZWdLZVphcERvcHVzdGlWaWV3LnNldEZ1bGxUaXRsZSgpO1xyXG4gICAgICAgIHRoaXMuX3Nhb3BSZWdLZVphcERvcHVzdGlWaWV3LnJlY29yZERldGFpbHMoeyBzaWZyYVphcG9zbGVuaTogc2lmcmFaYXBvc2xlbml9KTtcclxuICAgICAgICB0aGlzLl9zYW9wUmVnS2VaYXBEb3B1c3RpVmlldy5TZXRUb0Z1bGxTY3JlZW4oKTtcclxuICAgIH1cclxuXHJcbiAgICBmaWx0ZXJaYXBvc2xlbmlUYWJsZVJvd3MoZmlsdGVyWmFwb3NsZW5pOiBzdHJpbmcpIHtcclxuICAgICAgICAvLyBEZWNsYXJlIHZhcmlhYmxlc1xyXG4gICAgICAgIHZhciB0YWJsZSwgdHIsIF9yb3dJZCwgaSwgdHh0VmFsdWU7XHJcbiAgICAgICAgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIktlRW1wbG95ZWVMZWF2ZUxpc3RcIik7XHJcbiAgICAgICAgdHIgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRyXCIpO1xyXG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGFibGUgcm93cywgYW5kIGhpZGUgdGhvc2Ugd2hvIGRvbid0IG1hdGNoIHRoZSBzZWFyY2ggcXVlcnlcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdHIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgX3Jvd0lkID0gbnVsbDtcclxuICAgICAgICAgICAgbGV0IF90cklkID0gJCh0cltpXSkuYXR0cihcImRhdGEtc2lmcmEtemFwb3NsZW5pXCIpO1xyXG4gICAgICAgICAgICBpZiAoIWlzVW5EZWZpbmVkKF90cklkKSkge1xyXG4gICAgICAgICAgICAgICAgX3Jvd0lkID0gX3RySWQudG9TdHJpbmcoKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoX3Jvd0lkKSB7XHJcbiAgICAgICAgICAgICAgICB0eHRWYWx1ZSA9IF9yb3dJZC50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzRW1wdHkoZmlsdGVyWmFwb3NsZW5pKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICQodHJbaV0pLmFkZENsYXNzKFwiZWxlbWVudC1oaWRkZW5cIik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbHRlclphcG9zbGVuaS50b1VwcGVyQ2FzZSgpLmluZGV4T2YodHh0VmFsdWUpID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAkKHRyW2ldKS5yZW1vdmVDbGFzcyhcImVsZW1lbnQtaGlkZGVuXCIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAkKHRyW2ldKS5hZGRDbGFzcyhcImVsZW1lbnQtaGlkZGVuXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFNlcnZpY2VzQ29yZSwgU2FvcFNlcnZpY2VzQ29yZVJlc3BvbnNlIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC1zZXJ2aWNlcy1jb3JlXCI7XHJcbmltcG9ydCB7IFNhb3BUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9Db3JlL3Nhb3AtdHJhbnNsYXRlJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcFBhc3N3b3JkQ3JpdGVyaWFzIHtcclxuICAgIHB3ZENoZWNrOmJvb2xlYW47XHJcbiAgICBwd2RMZW5ndGhDaGVjazpib29sZWFuO1xyXG4gICAgcHdkTGVuZ3RoU2V0dGluZzpudW1iZXI7XHJcbiAgICBwd2RDb21wbGV4aXR5Q2hlY2sgOmJvb2xlYW47XHJcbiAgICBwd2RNaW5MZW5ndGggOmJvb2xlYW47XHJcbiAgICBwd2RDb250YWluc1VwcGVyQ2FzZSA6Ym9vbGVhbjtcclxuICAgIHB3ZENvbnRhaW5zTG93ZXJDYXNlIDpib29sZWFuO1xyXG4gICAgcHdkQ29udGFpbnNOdW1iZXJzIDpib29sZWFuO1xyXG4gICAgcHdkQ29udGFpbnNTcGVjaWFsQ2hhcnMgOmJvb2xlYW47XHJcbiAgICBwd2ROb3RDb250YWluc1VzZXJEYXRhIDpib29sZWFuO1xyXG4gICAgcHdkSGlzdG9yeUNoZWNrOmJvb2xlYW47XHJcbiAgICBwd2ROb3RVc2VkWWV0IDpib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcENoYW5nZVB3ZFZpZXcge1xyXG4gICAgLy9cclxuICAgIHByaXZhdGUgX3RyYW5zbGF0aW9uU2VydmljZTogU2FvcFRyYW5zbGF0aW9uU2VydmljZTtcclxuICAgIHByaXZhdGUgX2NoYW5nZVBhc3N3b3JkRm9ybSA6SlF1ZXJ5PEhUTUxFbGVtZW50PjsgXHJcblxyXG4gICAgY29uc3RydWN0b3Iodmlld0lkOnN0cmluZyxsaWJOYW1lOnN0cmluZyA9IFwiXCIpIHtcclxuICAgICAgICB0aGlzLl9jaGFuZ2VQYXNzd29yZEZvcm0gPSAkKHZpZXdJZCk7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNsYXRpb25TZXJ2aWNlID0gbmV3IFNhb3BUcmFuc2xhdGlvblNlcnZpY2UoKTtcclxuICAgICAgICB0aGlzLnNldFRlcm1pbm9sb2d5TGlzdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFRlcm1pbm9sb2d5TGlzdCgpe1xyXG4gICAgICAgIGxldCBfdGVybWlub2xvZ3k6IHN0cmluZ1tdID0gWyd2c2FqIHswfSB6bmFrb3YnXTtcclxuICAgICAgICB0aGlzLl90cmFuc2xhdGlvblNlcnZpY2Uuc2V0VHJhbnNsYXRpb25zTGlzdChfdGVybWlub2xvZ3kpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRWaWV3KCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wQ2hhbmdlUHdkVmlldy5pbml0Vmlld1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy5iaW5kVmlld0V2ZW50cygpOyAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuY2hlY2tQYXNzd29yZFN0cmVuZ3RoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYmluZFZpZXdFdmVudHMoKXtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcENoYW5nZVB3ZFZpZXcuYmluZEdyaWRFdmVudHNcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICAvL1xyXG4gICAgICAgIGxldCBfTmV3UGFzc3dvcmQgPSB0aGlzLl9jaGFuZ2VQYXNzd29yZEZvcm0uZmluZChcIiNOZXdQYXNzd29yZFwiKTtcclxuICAgICAgICBfTmV3UGFzc3dvcmQub2ZmKFwiY2hhbmdlXCIpO1xyXG4gICAgICAgIF9OZXdQYXNzd29yZC5vbignY2hhbmdlJywgZnVuY3Rpb24gKHJvdykge1xyXG4gICAgICAgICAgICBfdGhpcy5jaGVja1Bhc3N3b3JkU3RyZW5ndGgoKTtcclxuICAgICAgICB9KTsgICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBmc2V0UHdkQ2xhc3MoY29uZGl0aW9uOmJvb2xlYW4sIGRpdklkOnN0cmluZyk6dm9pZCB7XHJcbiAgICAgICAgbGV0IG9rU3RhdHVzQ3NzID0gXCJsZWZ0IHNhb3AtY2wtZ3JlZW4gc2FvcC1pbWctY2hlY2stbWFyay1zb2xpZCBzaS1zXCI7XHJcbiAgICAgICAgbGV0IHdhcnJpbmdTdGF0dXNDc3MgPSBcImxlZnQgc2FvcC1jbC1yZWQgc2FvcC1pbWctY2xvc2Utc29saWQgc2ktc1wiOyAgICAgICAgXHJcbiAgICAgICAgbGV0IF90YXJnZXREaXYgPSB0aGlzLl9jaGFuZ2VQYXNzd29yZEZvcm0uZmluZChkaXZJZCk7XHJcblxyXG4gICAgICAgIF90YXJnZXREaXYucmVtb3ZlQXR0ciggXCJjbGFzc1wiICk7XHJcbiAgICAgICAgLy8gX3RhcmdldERpdi5yZW1vdmVDbGFzcyhmdW5jdGlvbigpe1xyXG4gICAgICAgIC8vICAgICByZXR1cm4gJCh0aGlzKS5hdHRyKCBcImNsYXNzXCIgKTtcclxuICAgICAgICAvLyB9KTtcclxuXHJcbiAgICAgICAgaWYgKGNvbmRpdGlvbiA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIF90YXJnZXREaXYuYWRkQ2xhc3Mob2tTdGF0dXNDc3MpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIF90YXJnZXREaXYuYWRkQ2xhc3Mod2FycmluZ1N0YXR1c0Nzcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNldFB3ZENvbXBsZXhpdHlEaXZWYWwoc2FvcFBhc3N3b3JkQ3JpdGVyaWFzOlNhb3BQYXNzd29yZENyaXRlcmlhcyk6dm9pZHtcclxuICAgICAgICB0aGlzLmZzZXRQd2RDbGFzcyhzYW9wUGFzc3dvcmRDcml0ZXJpYXMucHdkTWluTGVuZ3RoLFwiI3B3ZE1pbkxlbmd0aFwiKTtcclxuICAgICAgICB0aGlzLmZzZXRQd2RDbGFzcyhzYW9wUGFzc3dvcmRDcml0ZXJpYXMucHdkQ29udGFpbnNVcHBlckNhc2UsXCIjcHdkQ29udGFpbnNVcHBlckNhc2VcIik7XHJcbiAgICAgICAgdGhpcy5mc2V0UHdkQ2xhc3Moc2FvcFBhc3N3b3JkQ3JpdGVyaWFzLnB3ZENvbnRhaW5zTG93ZXJDYXNlLFwiI3B3ZENvbnRhaW5zTG93ZXJDYXNlXCIpO1xyXG4gICAgICAgIHRoaXMuZnNldFB3ZENsYXNzKHNhb3BQYXNzd29yZENyaXRlcmlhcy5wd2RDb250YWluc051bWJlcnMsXCIjcHdkQ29udGFpbnNOdW1iZXJzXCIpO1xyXG4gICAgICAgIHRoaXMuZnNldFB3ZENsYXNzKHNhb3BQYXNzd29yZENyaXRlcmlhcy5wd2RDb250YWluc1NwZWNpYWxDaGFycyxcIiNwd2RDb250YWluc1NwZWNpYWxDaGFyc1wiKTtcclxuICAgICAgICB0aGlzLmZzZXRQd2RDbGFzcyhzYW9wUGFzc3dvcmRDcml0ZXJpYXMucHdkTm90Q29udGFpbnNVc2VyRGF0YSxcIiNwd2ROb3RDb250YWluc1VzZXJEYXRhXCIpO1xyXG4gICAgICAgIHRoaXMuZnNldFB3ZENsYXNzKHNhb3BQYXNzd29yZENyaXRlcmlhcy5wd2ROb3RVc2VkWWV0LFwiI3B3ZE5vdFVzZWRZZXRcIik7XHJcbiAgICAgICAgLy9cclxuXHJcbiAgICAgICAgbGV0IF9wd2RDaGVja0RpdiA9IHRoaXMuX2NoYW5nZVBhc3N3b3JkRm9ybS5maW5kKFwiI3B3ZENoZWNrXCIpO1xyXG4gICAgICAgIGlmIChfcHdkQ2hlY2tEaXYubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpZiAoc2FvcFBhc3N3b3JkQ3JpdGVyaWFzLnB3ZENoZWNrID09IGZhbHNlKXtcclxuICAgICAgICAgICAgICAgIF9wd2RDaGVja0Rpdi5yZW1vdmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IF9wd2RIaXN0b3J5Q2hlY2tEaXYgPSB0aGlzLl9jaGFuZ2VQYXNzd29yZEZvcm0uZmluZChcIiNwd2RIaXN0b3J5Q2hlY2tcIik7XHJcbiAgICAgICAgaWYgKF9wd2RIaXN0b3J5Q2hlY2tEaXYubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpZiAoc2FvcFBhc3N3b3JkQ3JpdGVyaWFzLnB3ZEhpc3RvcnlDaGVjayA9PSBmYWxzZSl7XHJcbiAgICAgICAgICAgICAgICBfcHdkSGlzdG9yeUNoZWNrRGl2LnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgX3B3ZENvbXBsZXhpdHlEaXYgPSB0aGlzLl9jaGFuZ2VQYXNzd29yZEZvcm0uZmluZChcIiNwd2RDb21wbGV4aXR5XCIpO1xyXG4gICAgICAgIGlmIChfcHdkQ29tcGxleGl0eURpdi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGlmIChzYW9wUGFzc3dvcmRDcml0ZXJpYXMucHdkQ29tcGxleGl0eUNoZWNrID09IGZhbHNlKXtcclxuICAgICAgICAgICAgICAgIF9wd2RDb21wbGV4aXR5RGl2LnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgX3B3ZExlbmd0aENoZWNrRGl2ID0gdGhpcy5fY2hhbmdlUGFzc3dvcmRGb3JtLmZpbmQoXCIjcHdkTGVuZ3RoQ2hlY2tcIik7XHJcbiAgICAgICAgaWYgKF9wd2RMZW5ndGhDaGVja0Rpdi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCBfcHdkTGVuZ3RoU2V0dGluZ0RpdiA9IHRoaXMuX2NoYW5nZVBhc3N3b3JkRm9ybS5maW5kKFwiI3B3ZExlbmd0aFNldHRpbmdcIik7XHJcbiAgICAgICAgICAgIGlmIChzYW9wUGFzc3dvcmRDcml0ZXJpYXMucHdkTGVuZ3RoQ2hlY2sgPT0gZmFsc2Upe1xyXG4gICAgICAgICAgICAgICAgX3B3ZExlbmd0aENoZWNrRGl2LnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGV0IF9wd2RMZW5ndGhTZXR0aW5nQ2FwdGlvbiA9IHRoaXMuX3RyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJ2c2FqIHswfSB6bmFrb3ZcIikucmVwbGFjZShcInswfVwiLHNhb3BQYXNzd29yZENyaXRlcmlhcy5wd2RMZW5ndGhTZXR0aW5nLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgX3B3ZExlbmd0aFNldHRpbmdEaXYuaHRtbChfcHdkTGVuZ3RoU2V0dGluZ0NhcHRpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNoZWNrUGFzc3dvcmRTdHJlbmd0aCgpOnZvaWR7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgX25ld1Bhc3N3b3JkID0gdGhpcy5fY2hhbmdlUGFzc3dvcmRGb3JtLmZpbmQoXCIjTmV3UGFzc3dvcmRcIik7XHJcbiAgICAgICAgbGV0IF9wYXNzd29yZCA9IF9uZXdQYXNzd29yZC52YWwoKTtcclxuXHJcbiAgICAgICAgbGV0IGRhdGEgPSB7cGFzc3dvcmQ6IF9wYXNzd29yZH07XHJcblxyXG4gICAgICAgIGxldCBfc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7IFxyXG4gICAgICAgIF9zYW9wU2VydmljZXNDb3JlLmFmdGVyU3VjY2VzcyA9IGZ1bmN0aW9uIChyZXNwb25zZTpTYW9wU2VydmljZXNDb3JlUmVzcG9uc2UpIHtcclxuICAgICAgICAgICBsZXQgX3Nhb3BQYXNzd29yZENyaXRlcmlhcyA9IHJlc3BvbnNlLmRhdGEgYXMgU2FvcFBhc3N3b3JkQ3JpdGVyaWFzO1xyXG4gICAgICAgICAgIF90aGlzLnNldFB3ZENvbXBsZXhpdHlEaXZWYWwoX3Nhb3BQYXNzd29yZENyaXRlcmlhcyk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBfc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOiBcIlNldHRpbmdzL0NoZWNrUGFzc3dvcmRTdHJlbmd0aFwiXHJcbiAgICAgICAgICAgICwgZGF0YTogZGF0YVxyXG4gICAgICAgICAgICAsIHR5cGU6IFwiUE9TVFwiXHJcbiAgICAgICAgfSk7IFxyXG4gICAgfVxyXG4gICAgLy9cclxufVxyXG5cclxuXHJcbiIsIu+7vy8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9AdHlwZXMvYWxlcnRpZnkvaW5kZXguZC50c1wiIC8+XHJcbmltcG9ydCB7IGdsb2JhbCwgcmVsb2RlQ3VycmVudFBhZ2UgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BWaWV3Rm9ybSB9IGZyb20gXCIuLi9jb3JlL3Nhb3Atdmlldy1mb3JtXCI7XHJcbmltcG9ydCB7IE9QTlJlbGFjaWplU2VsZWN0IH0gZnJvbSBcIi4uL09QTi9PUE5SZWxhY2lqZS1zZWxlY3RcIjtcclxuaW1wb3J0IHsgT1BOTmFsb2dlU2VsZWN0IH0gZnJvbSBcIi4uL09QTi9PUE5OYWxvZ2Utc2VsZWN0XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcEFwcFNldHRpbmdzVmlldyBleHRlbmRzIFNhb3BWaWV3Rm9ybSB7IFxyXG4gICAgLy9wcml2YXRlIF92aWV3Rm9ybTpTYW9wVmlld0Zvcm07XHJcbiAgICBwdWJsaWMgX29wblJlbGFjaWplU2VsZWN0Ok9QTlJlbGFjaWplU2VsZWN0O1xyXG4gICAgcHVibGljIF9vcG5OYWxvZ2VTZWxlY3Q6T1BOTmFsb2dlU2VsZWN0O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHZpZXdJZDpzdHJpbmcsbGliTmFtZTpzdHJpbmcgPSBcIlwiKXtcclxuICAgICAgICBzdXBlcih2aWV3SWQsbGliTmFtZSk7XHJcbiAgICAgICAgLy90aGlzLnRpdGxlID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiXCIpO1xyXG4gICAgICAgIHRoaXMuYWRkUmVjb3JkRW5kcG9pbnQgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuZWRpdFJlY29yZEVuZHBvaW50ID0gXCJcIjtcclxuICAgICAgICB0aGlzLmRlbGV0ZVJlY29yZEVuZHBvaW50ID0gXCJcIjsgICAgICAgICAgXHJcbiAgICAgICAgLy8gIFxyXG4gICAgICAgIHRoaXMuX29wblJlbGFjaWplU2VsZWN0ID0gbmV3IE9QTlJlbGFjaWplU2VsZWN0KHRoaXMuX2xpYk5hbWUrXCIuX29wblJlbGFjaWplU2VsZWN0XCIse2lucHV0V2lkdGhQWDpcIjM2MHB4XCJ9KTtcclxuICAgICAgICB0aGlzLl9vcG5OYWxvZ2VTZWxlY3QgPSBuZXcgT1BOTmFsb2dlU2VsZWN0KHRoaXMuX2xpYk5hbWUrXCIuX29wbk5hbG9nZVNlbGVjdFwiLHtpbnB1dFdpZHRoUFg6XCIzNjBweFwifSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RGljdGlvbmFyeSgpe1xyXG4gICAgICAgIGxldCBkaWN0aW9uYXJ5OnN0cmluZ1tdID0gW1wiTmFzdGF2aXR2ZVwiXTtcclxuICAgICAgICB0aGlzLnNldFRlcm1pbm9sb2d5TGlzdChkaWN0aW9uYXJ5KTtcclxuICAgIH0gIFxyXG5cclxuICAgIGluaXRWaWV3KCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wQXBwU2V0dGluZ3NWaWV3LmluaXRWaWV3XCIpO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy5fb3BuUmVsYWNpamVTZWxlY3QuaW5pdChcIiNTZXR0aW5nc09QTl9Qcml2emV0YVNpZnJhUmVsYWNpamVcIik7XHJcbiAgICAgICAgdGhpcy5fb3BuTmFsb2dlU2VsZWN0LmluaXQoXCIjU2V0dGluZ3NPUE5fUHJpdnpldGFTaWZyYU5hbG9nZVwiKTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMuYmluZFZpZXdFdmVudHMoKTsgICBcclxuICAgICAgICB0aGlzLnNldFdlYkRvZGFqYW5qZVBuWmFTb3BvdG5pa2EoKTtcclxuICAgIH1cclxuXHJcbiAgICBiaW5kVmlld0V2ZW50cygpe1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wQXBwU2V0dGluZ3NWaWV3LmJpbmRFdmVudHNcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICAvL1xyXG4gICAgICAgICQoXCIuc2FvcC1zaWRlYmFyLWNvbnRhaW5lciAuc2FvcC1zYi1pdGVtXCIpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICQoXCIuc2FvcC1zaWRlYmFyLWNvbnRhaW5lciAuc2FvcC1zYi1pdGVtXCIpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgIGxldCBfY3VycmVudFRhcmdldCA9IGUuY3VycmVudFRhcmdldC5pZDtcclxuICAgICAgICAgICAgdmFyIGl0ZW0gPSAkKCcjJytfY3VycmVudFRhcmdldCk7XHJcblxyXG4gICAgICAgICAgICAkKFwiLnNhb3Atc2lkZWJhci1jb250YWluZXIgLnNhb3Atc2ItaXRlbS1zZWxlY3RlZFwiKS5yZW1vdmVDbGFzcyhcInNhb3Atc2ItaXRlbS1zZWxlY3RlZFwiKTsvLyd1bi1jb2xvcicgcHJldmlvdXMgaXRlbVxyXG5cclxuICAgICAgICAgICAgaXRlbS5hZGRDbGFzcyhcInNhb3Atc2ItaXRlbS1zZWxlY3RlZFwiKTsvL2NvbG9yIGl0ZW1cclxuXHJcbiAgICAgICAgICAgIGlmIChfY3VycmVudFRhcmdldCA9PSBcIkFwcFNldHRpbmdzQ29tbW9uXCIpIHtcclxuICAgICAgICAgICAgICAgICQoXCIjQXBwU2V0dGluZ3NDb21tb25QYW5cIikuY3NzKFwiZGlzcGxheVwiLCBcIlwiKTtcclxuICAgICAgICAgICAgICAgICQoXCIjQXBwU2V0dGluZ3NSRUdQYW5cIikuY3NzKFwiZGlzcGxheVwiLCBcIm5vbmVcIik7XHJcbiAgICAgICAgICAgICAgICAkKFwiI0FwcFNldHRpbmdzS0VQYW5cIikuY3NzKFwiZGlzcGxheVwiLCBcIm5vbmVcIik7XHJcbiAgICAgICAgICAgICAgICAkKFwiI0FwcFNldHRpbmdzT1BOUGFuXCIpLmNzcyhcImRpc3BsYXlcIiwgXCJub25lXCIpO1xyXG4gICAgICAgICAgICB9IFxyXG4gICAgICAgICAgICBlbHNlIGlmIChfY3VycmVudFRhcmdldCA9PSBcIkFwcFNldHRpbmdzUkVHXCIpIHtcclxuICAgICAgICAgICAgICAgICQoXCIjQXBwU2V0dGluZ3NDb21tb25QYW5cIikuY3NzKFwiZGlzcGxheVwiLCBcIm5vbmVcIik7XHJcbiAgICAgICAgICAgICAgICAkKFwiI0FwcFNldHRpbmdzUkVHUGFuXCIpLmNzcyhcImRpc3BsYXlcIiwgXCJcIik7XHJcbiAgICAgICAgICAgICAgICAkKFwiI0FwcFNldHRpbmdzS0VQYW5cIikuY3NzKFwiZGlzcGxheVwiLCBcIm5vbmVcIik7XHJcbiAgICAgICAgICAgICAgICAkKFwiI0FwcFNldHRpbmdzT1BOUGFuXCIpLmNzcyhcImRpc3BsYXlcIiwgXCJub25lXCIpOyAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChfY3VycmVudFRhcmdldCA9PSBcIkFwcFNldHRpbmdzS0VcIikge1xyXG4gICAgICAgICAgICAgICAgJChcIiNBcHBTZXR0aW5nc0NvbW1vblBhblwiKS5jc3MoXCJkaXNwbGF5XCIsIFwibm9uZVwiKTtcclxuICAgICAgICAgICAgICAgICQoXCIjQXBwU2V0dGluZ3NSRUdQYW5cIikuY3NzKFwiZGlzcGxheVwiLCBcIm5vbmVcIik7XHJcbiAgICAgICAgICAgICAgICAkKFwiI0FwcFNldHRpbmdzS0VQYW5cIikuY3NzKFwiZGlzcGxheVwiLCBcIlwiKTtcclxuICAgICAgICAgICAgICAgICQoXCIjQXBwU2V0dGluZ3NPUE5QYW5cIikuY3NzKFwiZGlzcGxheVwiLCBcIm5vbmVcIik7ICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChfY3VycmVudFRhcmdldCA9PSBcIkFwcFNldHRpbmdzT1BOXCIpIHtcclxuICAgICAgICAgICAgICAgICQoXCIjQXBwU2V0dGluZ3NDb21tb25QYW5cIikuY3NzKFwiZGlzcGxheVwiLCBcIm5vbmVcIik7XHJcbiAgICAgICAgICAgICAgICAkKFwiI0FwcFNldHRpbmdzUkVHUGFuXCIpLmNzcyhcImRpc3BsYXlcIiwgXCJub25lXCIpO1xyXG4gICAgICAgICAgICAgICAgJChcIiNBcHBTZXR0aW5nc0tFUGFuXCIpLmNzcyhcImRpc3BsYXlcIiwgXCJub25lXCIpO1xyXG4gICAgICAgICAgICAgICAgJChcIiNBcHBTZXR0aW5nc09QTlBhblwiKS5jc3MoXCJkaXNwbGF5XCIsIFwiXCIpOyAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pOyAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgJChcIiNoZWFkZXJDbG9zZUJ1dHRvblwiKS5jbGljayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICQoXCIjYnRuQ2FuY2VsXCIpLmNsaWNrKCk7XHJcbiAgICAgICAgfSk7ICAgICAgICBcclxuXHJcbiAgICAgICAgJCgnI1NldHRpbmdzT1BOX1dlYkRvZGFqYW5qZVNvcG90bmlrYScpLmNoYW5nZShmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgX3RoaXMuc2V0V2ViRG9kYWphbmplUG5aYVNvcG90bmlrYSgpO1xyXG4gICAgICAgIH0pOyAgICAgICAgXHJcbiAgXHJcbiAgICAgICAgJCgnI1NldHRpbmdzT1BOX1dlYkVtYWlsT2J2ZXNjYW5qZScpLmNoYW5nZShmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgX3RoaXMuc2V0V2ViRW1haWxaYU9idmVzY2FuamUoKTtcclxuICAgICAgICB9KTsgICAgICAgICAgIFxyXG5cclxuICAgIH1cclxuXHJcbiAgICBzZXRXZWJEb2RhamFuamVQblphU29wb3RuaWthKCk6dm9pZCB7XHJcbiAgICAgICAgaWYoJCgnI1NldHRpbmdzT1BOX1dlYkRvZGFqYW5qZVNvcG90bmlrYScpLmlzKFwiOmNoZWNrZWRcIikpIHtcclxuICAgICAgICAgICAgJChcIiNXZWJEb2RhamFuamVQblphU29wb3RuaWthR3JvdXBcIikuY3NzKFwiZGlzcGxheVwiLFwiZmxleFwiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAkKFwiI1NldHRpbmdzT1BOX1dlYkRvZGFqYW5qZVBuWmFTb3BvdG5pa2FcIikucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcclxuICAgICAgICAgICAgJChcIiNXZWJEb2RhamFuamVQblphU29wb3RuaWthR3JvdXBcIikuY3NzKFwiZGlzcGxheVwiLFwibm9uZVwiKTsgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgfSAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgc2V0V2ViRW1haWxaYU9idmVzY2FuamUoKTp2b2lkIHtcclxuICAgICAgICBpZigkKCcjU2V0dGluZ3NPUE5fV2ViRW1haWxPYnZlc2NhbmplJykuaXMoXCI6Y2hlY2tlZFwiKSkge1xyXG4gICAgICAgICAgICAkKFwiI1dlYkVtYWlsWmFPYnZlc2NhbmplR3JvdXBcIikuY3NzKFwidmlzaWJpbGl0eVwiLFwidW5zZXRcIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgJChcIiNXZWJFbWFpbFphT2J2ZXNjYW5qZUdyb3VwXCIpLmNzcyhcInZpc2liaWxpdHlcIixcImhpZGRlblwiKTsgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgfSAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgLy9cclxufVxyXG5cclxuXHJcbiIsIu+7v1xyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgZ2xvYmFsIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgZGVidWdNb2RlOiBib29sZWFuO1xyXG4gICAgcHVibGljIHN0YXRpYyBzaXRlQmFzZVVybDogc3RyaW5nO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgQ29uc29sZUxvZ0RlZ3VnKG1lc3NhZ2U6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmRlYnVnTW9kZSkgY29uc29sZS5sb2cobWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBHZXRDbGllbnRMb2dNb2RlU3RvcmFnZUtleVZhbHVlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIFwiU2FvcE1vakluZm8uZ2xvYmFsQ2xpZW50TG9nTW9kZVZhbFwiO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgR2V0Q2xpZW50TG9nTW9kZVN0b3JhZ2VWYWx1ZSgpOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgZGVidWdNb2RlRGVmYXVsdFZhbHVlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHZhciBkZWJ1Z01vZGVTdHJpbmdWYWwgPSBSZWFkVmFyaWFibGVGcm9tU3RvcmFnZShnbG9iYWwuR2V0Q2xpZW50TG9nTW9kZVN0b3JhZ2VLZXlWYWx1ZSgpKTtcclxuXHJcbiAgICAgICAgbGV0IGRlYnVnTW9kZVZhbCA9IGRlYnVnTW9kZURlZmF1bHRWYWx1ZTtcclxuICAgICAgICBpZiAoZGVidWdNb2RlU3RyaW5nVmFsKSB7XHJcbiAgICAgICAgICAgIGRlYnVnTW9kZVZhbCA9IGRlYnVnTW9kZVN0cmluZ1ZhbCA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZGVidWdNb2RlVmFsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgU2V0Q2xpZW50TG9nTW9kZVN0b3JhZ2VWYWx1ZSgpOiB2b2lkIHtcclxuICAgICAgICBsZXQgbG9nTW9kZSA9IHRoaXMuR2V0Q2xpZW50TG9nTW9kZVN0b3JhZ2VWYWx1ZSgpO1xyXG4gICAgICAgIFdyaXRlVmFyaWFibGVUb1N0b3JhZ2UoZ2xvYmFsLkdldENsaWVudExvZ01vZGVTdG9yYWdlS2V5VmFsdWUoKSwgIWxvZ01vZGUpO1xyXG5cclxuICAgICAgICBhbGVydGlmeS5tZXNzYWdlKFwiQ2xpZW50IGxvZyBtb2RlIGVuYWJsZWQ6IFwiICsgIWxvZ01vZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0U2l0ZUJhc2VVcmwoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gJChcIiNzaXRlQmFzZVVybFwiKS52YWwoKSBhcyBzdHJpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBzZXRIZWxwTGluaygpOiB2b2lkIHtcclxuICAgICAgICAvL25hc3RhdmkgaGVscCBsaW5rLCB2IG9kdmlzbm9zdGkgb2QgbG9rYWxpemFjaWplXHJcbiAgICAgICAgbGV0IHN2Z0hlbHA6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYW9wLWhlbHAnKTtcclxuXHJcbiAgICAgICAgaWYoc3ZnSGVscCAhPSBudWxsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbGV0IGxhbmd1YWdlID0gc3ZnSGVscC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWxhbmd1YWdlXCIpO1xyXG5cclxuICAgICAgICAgICAgLy9wb8SNYWthbW8gZGEgc2UgZ25lc3pkZW5pIG9iamVrdCBuYWxvxb5pXHJcbiAgICAgICAgICAgIHN2Z0hlbHAuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHN2Z0hlbHAuY29udGVudERvY3VtZW50ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgc3ZnSGVscExpbmsgPSBzdmdIZWxwLmNvbnRlbnREb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInNhb3AtaGVscC1saW5rXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1VuRGVmaW5lZChzdmdIZWxwTGluaykgPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmd1YWdlID09IFwiaHJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZnSGVscExpbmsuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCBcImh0dHA6Ly9oZWxwLnNhb3AuaHIvaHIvbW9qaW5mb1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChsYW5ndWFnZSA9PSBcInNyXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2Z0hlbHBMaW5rLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgXCJodHRwOi8vd3d3LnNhb3AucnMvaWNlbnRlci8xMDAvdXB1dHN0dmEtemEtdXBvdHJlYnUvXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZnSGVscExpbmsuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCBcImh0dHBzOi8vc2ktaWNlbnRlci5rbm93bGVkZ2Vvd2wuY29tL2hlbHAvbW9qaW5mby1uYXZvZGlsYS16YS11cG9yYWJvLXByZW5vdmxqZW5lZ2EtcG9ydGFsYVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvL3phcmFkaSBicmFza2FsbmlrIC0gbW96aWxsYSBmaXJlZm94IC0gaXpnbGVkYSwgZGEgamUgb2JqZWN0ICcnbG9hZGVkJycgcHJlZGVuIG11IGRvZGFtbyBvbiBsb2FkZWRcclxuICAgICAgICAgICAgaWYoJCgnI3Nhb3AtaGVscC1saW5rJykgIT0gbnVsbClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ2xvYWQnKTtcclxuICAgICAgICAgICAgICAgIHN2Z0hlbHAuZGlzcGF0Y2hFdmVudChldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREYXRlKGRhdGU6IERhdGUsIGZvcm1hdDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHRvMiA9IChuOiBudW1iZXIpOiBzdHJpbmcgPT4gKChNYXRoLmFicyhuKSA8IDEwID8gJzAnIDogJycpICsgTWF0aC5hYnMobikpO1xyXG4gICAgcmV0dXJuIGZvcm1hdC5yZXBsYWNlKC9beWRtaF0rL2dpLCAobWF0Y2g6IHN0cmluZyk6IHN0cmluZyA9PiB7XHJcbiAgICAgICAgc3dpdGNoIChtYXRjaCkge1xyXG4gICAgICAgICAgICBjYXNlICd5eXl5JzogcmV0dXJuIGRhdGUuZ2V0RnVsbFllYXIoKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICBjYXNlICdkJzogcmV0dXJuIGRhdGUuZ2V0RGF0ZSgpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIGNhc2UgJ2RkJzogcmV0dXJuIHRvMihkYXRlLmdldERhdGUoKSk7XHJcbiAgICAgICAgICAgIGNhc2UgJ20nOiByZXR1cm4gKGRhdGUuZ2V0TW9udGgoKSArIDEpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIGNhc2UgJ21tJzogcmV0dXJuIHRvMihkYXRlLmdldE1vbnRoKCkgKyAxKTtcclxuICAgICAgICAgICAgY2FzZSAnSCc6IHJldHVybiBkYXRlLmdldEhvdXJzKCkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgY2FzZSAnSEgnOiByZXR1cm4gdG8yKGRhdGUuZ2V0SG91cnMoKSk7XHJcbiAgICAgICAgICAgIGNhc2UgJ01NJzogcmV0dXJuIHRvMihkYXRlLmdldE1pbnV0ZXMoKSk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2g7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0U3RyaW5nMkRhdGUoc3RyaW5nRGF0ZTogc3RyaW5nLCBmb3JtYXQ6IHN0cmluZyk6IERhdGUge1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImNvbnZlcnRTdHJpbmcyRGF0ZVwiKTtcclxuXHJcbiAgICBzd2l0Y2ggKGZvcm1hdCkge1xyXG4gICAgICAgIGNhc2UgXCJkZC5tbS55eXl5XCI6XHJcbiAgICAgICAgICAgIGxldCBkYXkgPSBzdHJpbmdEYXRlLnN1YnN0cmluZygwLCAyKTtcclxuICAgICAgICAgICAgbGV0IG1vbnRoID0gc3RyaW5nRGF0ZS5zdWJzdHJpbmcoMywgNSk7XHJcbiAgICAgICAgICAgIGxldCB5ZWFyID0gc3RyaW5nRGF0ZS5zdWJzdHJpbmcoNiwgMTApO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCt5ZWFyLCArbW9udGggLSAxLCArZGF5KTtcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRNb2RhbEZvcm1aSW5kZXgobW9kYWxGb3JtSWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInNldE1vZGFsRm9ybVpJbmRleFwiKTtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJtb2RhbEZvcm1JZDpcIiArIG1vZGFsRm9ybUlkKTtcclxuICAgIHZhciB6SW5kZXggPSAxMDUwICsgKDEwICogJCgnLm1vZGFsOnZpc2libGUnKS5sZW5ndGgpO1xyXG5cclxuICAgICQobW9kYWxGb3JtSWQpLmNzcygnei1pbmRleCcsIHpJbmRleCk7XHJcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAkKCcubW9kYWwtYmFja2Ryb3AnKS5ub3QoJy5tb2RhbC1zdGFjaycpLmNzcygnei1pbmRleCcsIHpJbmRleCAtIDEpLmFkZENsYXNzKCdtb2RhbC1zdGFjaycpO1xyXG4gICAgfSwgMCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5KHN0cjogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gKCFzdHIgfHwgc3RyLmxlbmd0aCA9PT0gMCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1VuRGVmaW5lZChfb2JqOiBhbnkpIHtcclxuICAgIHJldHVybiAoIV9vYmogfHwgX29iaiA9PT0gbnVsbCB8fCB0eXBlb2YgX29iaiA9PT0gXCJ1bmRlZmluZWRcIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc05vdFNldChfb2JqOiBhbnkpIHtcclxuICAgIHJldHVybiAoX29iaiA9PT0gbnVsbCB8fCB0eXBlb2YgX29iaiA9PT0gXCJ1bmRlZmluZWRcIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBSZWFkVmFyaWFibGVGcm9tU3RvcmFnZSh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0odmFyaWFibGVOYW1lKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIFdyaXRlVmFyaWFibGVUb1N0b3JhZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHZhcmlhYmxlTmFtZSwgdmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyVGFibGVSb3dzKGZpbHRlclZhbDogc3RyaW5nLCBpZFRhYmxlRWxlbWVudDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiZmlsdGVyVGFibGVSb3dzXCIpO1xyXG5cclxuICAgIGxldCB2YWwgPSAkLnRyaW0oZmlsdGVyVmFsKS5yZXBsYWNlKC8gKy9nLCAnICcpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBsZXQgcm93cyA9ICQoaWRUYWJsZUVsZW1lbnQgKyBcIiB0cjpoYXModGQpXCIpO1xyXG5cclxuICAgIHJvd3Muc2hvdygpLmZpbHRlcihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIF90ZXh0ID0gJCh0aGlzKS50ZXh0KCkucmVwbGFjZSgvXFxzKy9nLCAnICcpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgcmV0dXJuICF+X3RleHQuaW5kZXhPZih2YWwpO1xyXG4gICAgfSkuaGlkZSgpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0Rmlyc3RGb3JtQ29udHJvbFRvRm9jdXMoZm9ybUlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzZXRGaXJzdEZvcm1Db250cm9sVG9Gb2N1c1wiKTtcclxuXHJcbiAgICAvLyBicmV6IHRpbWVvdXQgZnVua2NpamUgZm9jdXMgbmUgZGVsYSA6KFxyXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIGZpcnN0Rm9ybUNvbnRyb2wgPSAkKGZvcm1JZCArIFwiIC5mb3JtLWNvbnRyb2w6dmlzaWJsZTpub3QoOmRpc2FibGVkKTpmaXJzdFwiKTtcclxuICAgICAgICBpZiAoZmlyc3RGb3JtQ29udHJvbCkge1xyXG4gICAgICAgICAgICBmaXJzdEZvcm1Db250cm9sLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSwgNTAwKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlbGF0aXZlU2l0ZVVSTChjb250cm9sbGVyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbGV0IF91cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcclxuICAgIGxldCBpQyA9IF91cmwuaW5kZXhPZihjb250cm9sbGVyKTtcclxuICAgIGlmIChpQyA+IDApIHtcclxuICAgICAgICByZXR1cm4gX3VybC5zdWJzdHJpbmcoMCwgaUMpICsgY29udHJvbGxlcjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2l0ZUFic29sdXRlVVJMKHJlbGF0aXZlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCBjb250cm9sbGVyID0gcmVsYXRpdmVQYXRoLnNwbGl0KFwiL1wiKVswXTtcclxuICAgIGxldCBtZXRob2QgPSByZWxhdGl2ZVBhdGgucmVwbGFjZShjb250cm9sbGVyLCBcIlwiKS5yZXBsYWNlKFwiLy9cIiwgXCJcIik7XHJcblxyXG4gICAgLy8gxI1lIHJlbGF0aXZlIHBhdGggxb5lIHZzZWJ1amUgaHR0cCwgZ2EgbmUgZG9kYW1vXHJcbiAgICBpZiAocmVsYXRpdmVQYXRoLmluZGV4T2YoXCJodHRwXCIpID49IDApIHtcclxuICAgICAgICByZXR1cm4gcmVsYXRpdmVQYXRoO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBnbG9iYWwuc2l0ZUJhc2VVcmwgKyBcIi9cIiArIGNvbnRyb2xsZXIgKyBtZXRob2Q7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZWxvZGVDdXJyZW50UGFnZSgpOiB2b2lkIHtcclxuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcclxufSIsIu+7vy8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9AdHlwZXMvZGF0YS10YWJsZXMvdHlwZXMuZC50c1wiIC8+XHJcbmltcG9ydCB7IGlzVW5EZWZpbmVkLCBnbG9iYWwsIGZvcm1hdERhdGUgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9Db3JlL3Nhb3AtdHJhbnNsYXRlJztcclxuXHJcblxyXG5kZWNsYXJlIGdsb2JhbCB7XHJcbiAgaW50ZXJmYWNlIEpRdWVyeSB7XHJcbiAgICB0cmVlVGFibGUob3B0cz86IGFueSk6YW55O1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wVHJlZVRhYmxlUGFyYW1zIHtcclxuICBpZDpzdHJpbmc7XHJcbiAgdXJsOnN0cmluZ1xyXG4gIGNvbHVtbnM6IGFueTtcclxuICBvcmRlcjphbnk7XHJcbn0gXHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFRyZWVUYWJsZSB7XHJcbiAgcHJpdmF0ZSBfdHJhbnNsYXRpb25TZXJ2aWNlOiBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlO1xyXG5cclxuICBwdWJsaWMgbGliTmFtZTogc3RyaW5nOyAgXHJcblxyXG4gIGNvbnN0cnVjdG9yKGxpYk5hbWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5saWJOYW1lID0gbGliTmFtZTtcclxuICAgIHRoaXMuX3RyYW5zbGF0aW9uU2VydmljZSA9IG5ldyBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlKCk7XHJcbiAgfSAgXHJcblxyXG4gIHNldFRlcm1pbm9sb2d5TGlzdCgpe1xyXG4gICAgbGV0IF90ZXJtaW5vbG9neTogc3RyaW5nW10gPSBbJ05pIHBvZGF0a292IHphIHByaWthei4nLCdVcmVqYW5qZSBzdG9scGNldicsJ1BvbmFzdGF2aSBzdG9scGNlJywnU2hyYW5pJywnUHJla2xpxI1pJ107XHJcbiAgICB0aGlzLl90cmFuc2xhdGlvblNlcnZpY2Uuc2V0VHJhbnNsYXRpb25zTGlzdChfdGVybWlub2xvZ3kpO1xyXG4gIH1cclxuXHJcbiAgaW5pdChwYXJhbXM6U2FvcFRyZWVUYWJsZVBhcmFtcykge1xyXG5cclxuICAgIGxldCBfTXNnX2VtcHR5VGFibGUgPSB0aGlzLl90cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiTmkgcG9kYXRrb3YgemEgcHJpa2F6LlwiKVxyXG5cclxuICAgICQocGFyYW1zLmlkKS50cmVlVGFibGUoe1xyXG4gICAgICBhamF4OiB7XHJcbiAgICAgICAgdXJsOiBwYXJhbXMudXJsXHJcbiAgICAgICAgLHR5cGU6XCJHRVRcIixcclxuICAgICAgICBkYXRhU3JjOicnXHJcbiAgICAgIH0sXHJcbiAgICAgIG9yZGVyQ2VsbHNUb3A6IGZhbHNlLFxyXG4gICAgICBcInBhZ2luZ1wiOiBmYWxzZSxcclxuICAgICAgXCJhdXRvV2lkdGhcIjogdHJ1ZSwgICAgIFxyXG4gICAgICBcImNvbGxhcHNlZFwiOiBmYWxzZSxcclxuICAgICAgXCJvcmRlcmluZ1wiOiBmYWxzZSxcclxuICAgICAgXCJvcmRlcmFibGVcIjogZmFsc2UsXHJcbiAgICAgIFwiY29sdW1uc1wiOiBwYXJhbXMuY29sdW1ucyxcclxuICAgICAgaW5pdENvbXBsZXRlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgJChwYXJhbXMuaWQrXCJfZmlsdGVyXCIpLnJlbW92ZSgpO1xyXG4gICAgICAgICQocGFyYW1zLmlkK1wiX2luZm9cIikucmVtb3ZlKCk7ICBcclxuICAgICAgICAkKHBhcmFtcy5pZCtcIl9sZW5ndGhcIikucmVtb3ZlKCk7ICBcclxuICAgICAgICAkKHBhcmFtcy5pZCtcIl9wYWdpbmF0ZVwiKS5yZW1vdmUoKTsgIFxyXG4gICAgICAgICQocGFyYW1zLmlkKS5jc3MoJ3dpZHRoJywgJycpO1xyXG4gICAgICAgIC8vXHJcbiAgICAgIH0gICAgICBcclxuICAgICAgLG9yZGVyOiBwYXJhbXMub3JkZXJcclxuICAgICAgLGxhbmd1YWdlIDoge2VtcHR5VGFibGU6X01zZ19lbXB0eVRhYmxlLHplcm9SZWNvcmRzOl9Nc2dfZW1wdHlUYWJsZX1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwsIGlzRW1wdHksIGlzVW5EZWZpbmVkIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wU2VydmljZXNDb3JlIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC1zZXJ2aWNlcy1jb3JlXCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNhb3BBdHRhY2htZW50TGlzdFBhcmFtcyB7XHJcbiAgICB2YWxpZGF0aW9uRmluZ2VycHJpbnRDb250cm9sbGVyOiBzdHJpbmcsXHJcbiAgICB2YWxpZGF0aW9uRmluZ2VycHJpbnRBY3Rpb246IHN0cmluZyxcclxuICAgIHZhbGlkYXRpb25GaW5nZXJwcmludEJhbm5lckRpdklkOiBzdHJpbmcsXHJcbiAgICB2YWxpZGF0aW9uQ29udHJvbGxlcjogc3RyaW5nLFxyXG4gICAgdmFsaWRhdGlvbkFjdGlvbjogc3RyaW5nLFxyXG4gICAgdmFsaWRhdGlvbkJhbm5lckRpdklkOiBzdHJpbmcsXHJcbiAgICBkb3dubG9hZENvbnRyb2xsZXI6IHN0cmluZyxcclxuICAgIGRvd25sb2FkQWN0aW9uOiBzdHJpbmcsXHJcbiAgICBkZWxldGVkQXR0YWNobWVudExpc3RJZD86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BBdHRhY2htZW50TGlzdCB7XHJcbiAgICBwcml2YXRlIF9jbGliTmFtZTogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfdmlld0lkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9wYXJhbXM6IFNhb3BBdHRhY2htZW50TGlzdFBhcmFtcztcclxuICAgIHByaXZhdGUgX3ZhbGlkYXRpb25CYW5uZXI6IEpRdWVyeTxIVE1MRWxlbWVudD47XHJcblxyXG4gICAgY29uc3RydWN0b3Iodmlld0lkOiBzdHJpbmcsIGxpYk5hbWU6IHN0cmluZyA9IFwiXCIpe1xyXG4gICAgICAgIHRoaXMuX2NsaWJOYW1lID0gbGliTmFtZTtcclxuICAgICAgICB0aGlzLl92aWV3SWQgPSB2aWV3SWQ7XHJcbiAgICB9IFxyXG5cclxuICAgIGluaXRDb21wb25lbnQocGFyYW1zOiBTYW9wQXR0YWNobWVudExpc3RQYXJhbXMpeyBcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcEF0dGFjaG1lbnRMaXN0LmluaXRDb21wb25lbnRcIik7XHJcbiAgICAgICAgdGhpcy5fcGFyYW1zID0gcGFyYW1zO1xyXG5cclxuICAgICAgICB0aGlzLmluaXRXZWJDb250cm9scygpXHJcblxyXG4gICAgICAgIHRoaXMuaW5pdFdlYkdyaWRMaXN0bmVycygpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRXZWJDb250cm9scygpOiB2b2lkIHtcclxuICAgICAgICAvLyBzcHJhem5pbW8gaHRtbCBlbGVtZW50LCBraSB2c2VidWplIElEIHByaXBvbmssIGtpIHNlIGppaCB6YnJpc2UsIFxyXG4gICAgICAgIC8vIHNlIGppaCBtb3JhLCBjZSBzZSBpenZlZGUgcG9zdCB2YWxpZGFjaWphIGVkaXQgZm9ybWEgaW4gc28gbmFwYWtlIG5hIGVkaXQgZm9ybXVcclxuICAgICAgICBpZiAoIWlzVW5EZWZpbmVkKHRoaXMuX3BhcmFtcy5kZWxldGVkQXR0YWNobWVudExpc3RJZCkgJiYgIWlzRW1wdHkodGhpcy5fcGFyYW1zLmRlbGV0ZWRBdHRhY2htZW50TGlzdElkKSkge1xyXG4gICAgICAgICAgICBsZXQgZWxlbWVudCA9ICQodGhpcy5fcGFyYW1zLmRlbGV0ZWRBdHRhY2htZW50TGlzdElkKTtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LnZhbChcIlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpbml0V2ViR3JpZExpc3RuZXJzKCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wQXR0YWNobWVudExpc3QuaW5pdFdlYkdyaWRMaXN0bmVyc1wiKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgJCh0aGlzLl92aWV3SWQgKyBcIiAuYXR0YWNobWVudF9kb3dubG9hZFwiKS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAkKHRoaXMuX3ZpZXdJZCArIFwiIC5hdHRhY2htZW50X2Rvd25sb2FkXCIpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BBdHRhY2htZW50TGlzdC5hdHRhY2htZW50X2Rvd25sb2FkLmNsaWNrXCIpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGlkRG9rdW1lbnRhID0gdGhpcy5nZXRBdHRyaWJ1dGUoXCJkYXRhLWlkZG9rdW1lbnRhXCIpO1xyXG4gICAgICAgICAgICBsZXQgZmluZ2VycHJpbnQgPSB0aGlzLmdldEF0dHJpYnV0ZShcImRhdGEtaWRkb2t1bWVudGFmaW5nZXJwcmludFwiKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghaXNVbkRlZmluZWQoaWREb2t1bWVudGEpICYmICFpc0VtcHR5KGlkRG9rdW1lbnRhKSkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuZG93bmxvYWRWYWxpZGF0ZUF0dGFjaG1lbnRGaW5nZXJQcmludChpZERva3VtZW50YSwgZmluZ2VycHJpbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQodGhpcy5fdmlld0lkICsgXCIgLmF0dGFjaG1lbnRfZGVsZXRlXCIpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICQodGhpcy5fdmlld0lkICsgXCIgLmF0dGFjaG1lbnRfZGVsZXRlXCIpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BBdHRhY2htZW50TGlzdC5hdHRhY2htZW50X2RlbGV0ZS5jbGlja1wiKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBpZERva3VtZW50YSA9IHRoaXMuZ2V0QXR0cmlidXRlKFwiZGF0YS1pZGRva3VtZW50YVwiKTtcclxuICAgICAgICAgICAgbGV0IGZpbmdlclByaW50ID0gdGhpcy5nZXRBdHRyaWJ1dGUoXCJkYXRhLWlkZG9rdW1lbnRhZmluZ2VycHJpbnRcIik7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWlzVW5EZWZpbmVkKGlkRG9rdW1lbnRhKSAmJiAhaXNFbXB0eShpZERva3VtZW50YSkpIHtcclxuICAgICAgICAgICAgICAgIGxldCBodG1sRGVsZXRlRWxlbWVudCA9ICQodGhpcykuY2xvc2VzdChcInRyXCIpWzBdO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuZGVsZXRlVmFsaWRhdGVBdHRhY2htZW50RmluZ2VyUHJpbnQoaHRtbERlbGV0ZUVsZW1lbnQsIGlkRG9rdW1lbnRhLCBmaW5nZXJQcmludCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBkb3dubG9hZFZhbGlkYXRlQXR0YWNobWVudEZpbmdlclByaW50KGlkRG9rdW1lbnRhOiBzdHJpbmcsIGZpbmdlclByaW50OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcEF0dGFjaG1lbnRMaXN0LmRvd25sb2FkVmFsaWRhdGVBdHRhY2htZW50RmluZ2VyUHJpbnRcIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgbGV0IHBhcmFtcyA9IHsgZG9jdW1lbnRJRDogaWREb2t1bWVudGEsIGZpbmdlclByaW50OiBmaW5nZXJQcmludCB9O1xyXG4gICAgICAgIHRoaXMuX3ZhbGlkYXRpb25CYW5uZXIgPSAkKHRoaXMuX3BhcmFtcy52YWxpZGF0aW9uRmluZ2VycHJpbnRCYW5uZXJEaXZJZCk7XHJcblxyXG4gICAgICAgIGxldCBzYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyA9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuX3ZhbGlkYXRpb25CYW5uZXIuaHRtbChyZXNwb25zZS52aWV3Q29udGVudCk7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5fdmFsaWRhdGlvbkJhbm5lci5mb2N1cygpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gbmkgbmFwYWtlLCB2YWxpZGF0ZSBwcmlwb25rb1xyXG4gICAgICAgICAgICBfdGhpcy5kb3dubG9hZFZhbGlkYXRlQXR0YWNobWVudChpZERva3VtZW50YSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246IHRoaXMuX3BhcmFtcy52YWxpZGF0aW9uRmluZ2VycHJpbnRDb250cm9sbGVyICsgXCIvXCIgKyB0aGlzLl9wYXJhbXMudmFsaWRhdGlvbkZpbmdlcnByaW50QWN0aW9uXHJcbiAgICAgICAgICAgICwgZGF0YTogcGFyYW1zXHJcbiAgICAgICAgICAgICwgdHlwZTogXCJQT1NUXCJcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBkb3dubG9hZFZhbGlkYXRlQXR0YWNobWVudChpZERva3VtZW50YTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BBdHRhY2htZW50TGlzdC5kb3dubG9hZFZhbGlkYXRlQXR0YWNobWVudFwiKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgcGFyYW1zID0geyBkb2N1bWVudElEOiBpZERva3VtZW50YSB9O1xyXG4gICAgICAgIHRoaXMuX3ZhbGlkYXRpb25CYW5uZXIgPSAkKHRoaXMuX3BhcmFtcy52YWxpZGF0aW9uQmFubmVyRGl2SWQpO1xyXG5cclxuICAgICAgICBsZXQgc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MgPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLl92YWxpZGF0aW9uQmFubmVyLmh0bWwocmVzcG9uc2Uudmlld0NvbnRlbnQpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuX3ZhbGlkYXRpb25CYW5uZXIuZm9jdXMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIG5pIG5hcGFrZSwgZG93bmxvYWQgcHJpcG9ua29cclxuICAgICAgICAgICAgX3RoaXMuZG93bmxvYWRBdHRhY2htZW50KGlkRG9rdW1lbnRhKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHNhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjogdGhpcy5fcGFyYW1zLnZhbGlkYXRpb25Db250cm9sbGVyICsgXCIvXCIgKyB0aGlzLl9wYXJhbXMudmFsaWRhdGlvbkFjdGlvblxyXG4gICAgICAgICAgICAsIGRhdGE6IHBhcmFtc1xyXG4gICAgICAgICAgICAsIHR5cGU6IFwiUE9TVFwiXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZG93bmxvYWRBdHRhY2htZW50KGlkRG9rdW1lbnRhOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcEF0dGFjaG1lbnRMaXN0LmRvd25sb2FkQXR0YWNobWVudFwiKTtcclxuXHJcbiAgICAgICAgbGV0IHBhcmFtcyA9IHsgZG9jdW1lbnRJRDogaWREb2t1bWVudGEgfTtcclxuICAgICAgICBsZXQgc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQmxvYkFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjogdGhpcy5fcGFyYW1zLmRvd25sb2FkQ29udHJvbGxlciArIFwiL1wiICsgdGhpcy5fcGFyYW1zLmRvd25sb2FkQWN0aW9uXHJcbiAgICAgICAgICAgICwgZGF0YTogcGFyYW1zXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZGVsZXRlVmFsaWRhdGVBdHRhY2htZW50RmluZ2VyUHJpbnQoaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBpZERva3VtZW50YTogc3RyaW5nLCBmaW5nZXJQcmludDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BBdHRhY2htZW50TGlzdC5kZWxldGVWYWxpZGF0ZUF0dGFjaG1lbnRGaW5nZXJQcmludFwiKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgcGFyYW1zID0geyBkb2N1bWVudElEOiBpZERva3VtZW50YSwgZmluZ2VyUHJpbnQ6IGZpbmdlclByaW50IH07XHJcbiAgICAgICAgdGhpcy5fdmFsaWRhdGlvbkJhbm5lciA9ICQodGhpcy5fcGFyYW1zLnZhbGlkYXRpb25GaW5nZXJwcmludEJhbm5lckRpdklkKTtcclxuXHJcbiAgICAgICAgbGV0IHNhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgICAgIHNhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzID09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5fdmFsaWRhdGlvbkJhbm5lci5odG1sKHJlc3BvbnNlLnZpZXdDb250ZW50KTtcclxuICAgICAgICAgICAgICAgIF90aGlzLl92YWxpZGF0aW9uQmFubmVyLmZvY3VzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBuaSBuYXBha2VcclxuICAgICAgICAgICAgX3RoaXMuZGVsZXRlVmFsaWRhdGVBdHRhY2htZW50KGh0bWxFbGVtZW50LCBpZERva3VtZW50YSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246IHRoaXMuX3BhcmFtcy52YWxpZGF0aW9uRmluZ2VycHJpbnRDb250cm9sbGVyICsgXCIvXCIgKyB0aGlzLl9wYXJhbXMudmFsaWRhdGlvbkZpbmdlcnByaW50QWN0aW9uXHJcbiAgICAgICAgICAgICwgZGF0YTogcGFyYW1zXHJcbiAgICAgICAgICAgICwgdHlwZTogXCJQT1NUXCJcclxuICAgICAgICB9KTsgICBcclxuICAgIH1cclxuXHJcbiAgICBkZWxldGVWYWxpZGF0ZUF0dGFjaG1lbnQoaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBpZERva3VtZW50YTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BBdHRhY2htZW50TGlzdC5kZWxldGVWYWxpZGF0ZUF0dGFjaG1lbnRcIik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LnJlbW92ZSgpO1xyXG5cclxuICAgICAgICBpZiAoIWlzVW5EZWZpbmVkKHRoaXMuX3BhcmFtcy5kZWxldGVkQXR0YWNobWVudExpc3RJZCkgJiYgIWlzRW1wdHkodGhpcy5fcGFyYW1zLmRlbGV0ZWRBdHRhY2htZW50TGlzdElkKSkge1xyXG4gICAgICAgICAgICAvLyBpZCBkb2t1bWVudGEgZG9kYW1vIHYgc2V6bmFtIGJyaXNhbmloIHByaXBvbmssXHJcbiAgICAgICAgICAgIC8vIGRhIHNlIGxhaGtvIHByaSBzaHJhbmpldmFuam51IGRva3VtZW50YShrb21wb25lbnRhIGplIGxhaGtvIG5hIGVkaXQgZm9ybWFoKSBsYWhrbyBuYSBzZXJ2ZXJqdSBwb2JyaXNlam8gXHJcbiAgICAgICAgICAgIGxldCBlbGVtZW50ID0gJCh0aGlzLl9wYXJhbXMuZGVsZXRlZEF0dGFjaG1lbnRMaXN0SWQpO1xyXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGxldCBlbGVtZXRWYWx1ZSA9IGVsZW1lbnQudmFsKCkgKyBcIixcIiArIGlkRG9rdW1lbnRhO1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC52YWwoZWxlbWV0VmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCwgaXNFbXB0eSwgaXNVbkRlZmluZWQgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BTZXJ2aWNlc0NvcmUgfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXNlcnZpY2VzLWNvcmVcIjtcclxuaW1wb3J0IHsgU2FvcE11bHRpc2VsZWN0IH0gZnJvbSBcIi4vc2FvcC1tdWx0aXNlbGVjdFwiO1xyXG5pbXBvcnQgeyBTYW9wUG9wb3ZlciB9IGZyb20gXCIuLi9Db21wb25lbnRzL3Nhb3AtcG9wb3ZlclwiO1xyXG5cclxuZXhwb3J0IGVudW0gU2FvcENhbGVuZGFyTmF2aWdhdGlvbiB7XHJcbiAgICByZWZyZXNoQ2VsbCA9IC0xXHJcbiAgICAsIHJlZnJlc2hUYWJsZURhdGEgPSAwXHJcbiAgICAsIGdvdG9QcmV2aW91cyA9IDFcclxuICAgICwgZ290b05leHQgPSAyXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcENhbGVuZGFyUGFyYW1zIHtcclxuICAgIGNvbnRyb2xsZXI6c3RyaW5nLFxyXG4gICAgYWN0aW9uOnN0cmluZyxcclxuICAgIHBhcnRpYWxSZW5kZXI/OmJvb2xlYW5cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BDYWxlbmRhciB7XHJcbiAgICBwcml2YXRlIF9saWJOYW1lOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9wYXJhbXM6U2FvcENhbGVuZGFyUGFyYW1zO1xyXG4gICAgcHJpdmF0ZSBfc2FvcFNlcnZpY2VzQ29yZTogU2FvcFNlcnZpY2VzQ29yZTtcclxuICAgIHByaXZhdGUgX2Zvcm1GcmFtZTogSlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIHByaXZhdGUgX2Zvcm1EYXRhOiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gICAgcHJpdmF0ZSBfbW9udGhDYXB0aW9uOiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gICAgcHJpdmF0ZSBfYnRuUHJldmlvdXM6IEpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgICBwcml2YXRlIF9idG5OZXh0OiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gICAgXHJcbiAgICBwcml2YXRlIF9zYW9wUG9wb3ZlcjogU2FvcFBvcG92ZXI7XHJcbiAgICAvL1xyXG4gICAgZ2V0IGZvcm1EYXRhKCk6IEpRdWVyeTxIVE1MRWxlbWVudD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9mb3JtRGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihsaWJOYW1lOiBzdHJpbmcgPSBcIlwiKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BDYWxlbmRhclwiKTtcclxuICAgICAgICB0aGlzLl9saWJOYW1lID0gbGliTmFtZTtcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgICAgICB0aGlzLl9zYW9wUG9wb3ZlciA9IG5ldyBTYW9wUG9wb3ZlcignZGF5LWNvbnRhaW5lci1ldmVudCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRWaWV3KHBhcmFtczpTYW9wQ2FsZW5kYXJQYXJhbXMpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcENhbGVuZGFyLmluaXRWaWV3XCIpO1xyXG4gICAgICAgICQoXCIjc2FvcC1jYWxlbmRhci1mb3JtXCIpLmhpZGUoKTtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMuX3BhcmFtcyA9IHBhcmFtcztcclxuICAgICAgICB0aGlzLmJpbmREaXZzKCk7XHJcbiAgICAgICAgLy90aGlzLmluaXRNdWx0aVNlbGVjdCgpO1xyXG5cclxuICAgICAgICAkKHdpbmRvdykucmVzaXplKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgX3RoaXMuc2V0VGFibGVIZWlndGgoKTtcclxuICAgICAgICAgICAgX3RoaXMuc2V0VGFibGVUZFdpZHRoKCk7XHJcbiAgICAgICAgfSkucmVzaXplKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3Nhb3BQb3BvdmVyLmJpbmRQb3BvdmVyRXZlbnRzKCk7XHJcblxyXG4gICAgICAgICQoXCIjc2FvcC1jYWxlbmRhci1mb3JtXCIpLnNob3coKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRUYWJsZUhlaWd0aCgpe1xyXG4gICAgICAgIHZhciBib2R5aGVpZ2h0ID0gJChkb2N1bWVudCkuaGVpZ2h0KCk7XHJcbiAgICAgICAgJChcIiNzYW9wLWNhbGVuZGFyLWRhdGFcIikuaGVpZ2h0KGJvZHloZWlnaHQtMjUwKTsgICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHNldFRhYmxlVGRXaWR0aCgpIHtcclxuICAgICAgICAkKFwiLmRheWdyaWQtZXZlbnRcIikuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIC8vIEdldCB0aGUgd2lkdGggb2YgdGhlIHBhcmVudCBlbGVtZW50XHJcbiAgICAgICAgICAgIHZhciBwYXJlbnRXaWR0aCA9ICQodGhpcykucGFyZW50KCkub3V0ZXJXaWR0aCh0cnVlKTtcclxuICAgICAgICAgICAgaWYgKHBhcmVudFdpZHRoIDw9IDUzKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRXaWR0aCA9IDUzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIEdldCB0aGUgd2lkdGggb2YgdGhlIGN1cnJlbnQgZWxlbWVudFxyXG4gICAgICAgICAgICB2YXIgd2lkdGggPSAkKHRoaXMpLndpZHRoKCk7XHJcbiAgICAgICAgICAgIC8vIERpdmlkZSB0aGUgd2lkdGggYnkgNTNcclxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IE51bWJlcigkKHRoaXMpLmF0dHIoJ2RhdGEtZGF5cy1udW0nKSk7XHJcbiAgICAgICAgICAgIC8vIFNldCB0aGUgbmV3IHdpZHRoIGZvciB0aGUgY3VycmVudCBlbGVtZW50XHJcbiAgICAgICAgICAgICQodGhpcykud2lkdGgocmVzdWx0ICogcGFyZW50V2lkdGgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGJpbmREaXZzKCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wQ2FsZW5kYXIuYmluZERpdnNcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLl9mb3JtRnJhbWUgPSAkKFwiI3Nhb3AtY2FsZW5kYXItZm9ybVwiKTtcclxuICAgICAgICB0aGlzLl9mb3JtRGF0YSA9IHRoaXMuX2Zvcm1GcmFtZS5maW5kKFwiI3Nhb3AtY2FsZW5kYXItZGF0YVwiKTtcclxuICAgICAgICB0aGlzLl9tb250aENhcHRpb24gPSAkKFwiI21vbnRoQ2FwdGlvblwiKTtcclxuICAgICAgICB0aGlzLl9idG5QcmV2aW91cyA9IHRoaXMuX2Zvcm1GcmFtZS5maW5kKFwiI2J0blByZXZpb3VzXCIpO1xyXG4gICAgICAgIHRoaXMuX2J0bk5leHQgPSB0aGlzLl9mb3JtRnJhbWUuZmluZChcIiNidG5OZXh0XCIpO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy5fYnRuUHJldmlvdXMub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgdGhpcy5fYnRuUHJldmlvdXMuY2xpY2soZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcENhbGVuZGFyLl9idG5QcmV2aW91c1wiKTtcclxuICAgICAgICAgICAgX3RoaXMucmVmcmVzaERhdGEoU2FvcENhbGVuZGFyTmF2aWdhdGlvbi5nb3RvUHJldmlvdXMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX2J0bk5leHQub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgdGhpcy5fYnRuTmV4dC5jbGljayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wQ2FsZW5kYXIuX2J0bk5leHRcIik7XHJcbiAgICAgICAgICAgIF90aGlzLnJlZnJlc2hEYXRhKFNhb3BDYWxlbmRhck5hdmlnYXRpb24uZ290b05leHQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGJpbmRDYXB0aW9ucygpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcENhbGVuZGFyLmJpbmRDYXB0aW9uc1wiKTtcclxuICAgICAgICB0aGlzLl9mb3JtRGF0YSA9IHRoaXMuX2Zvcm1GcmFtZS5maW5kKFwiI3Nhb3AtY2FsZW5kYXItZGF0YVwiKTtcclxuICAgICAgICBsZXQgZGF0YVBlcmlvZENhcHRpb24gPSB0aGlzLl9mb3JtRGF0YS5hdHRyKFwiZGF0YS1wZXJpb2RDYXB0aW9uXCIpO1xyXG4gICAgICAgIGxldCBkYXRhWWVhciA9IHRoaXMuX2Zvcm1EYXRhLmF0dHIoXCJkYXRhLXllYXJcIik7ICAgICAgICBcclxuICAgICAgICB0aGlzLl9tb250aENhcHRpb24uaHRtbChkYXRhUGVyaW9kQ2FwdGlvbitcIiBcIitkYXRhWWVhcik7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaERhdGEoYWN0aW9uOiBTYW9wQ2FsZW5kYXJOYXZpZ2F0aW9uLGNlbGxJZD86c3RyaW5nKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BDYWxlbmRhci5yZWZyZXNoRGF0YVwiKTtcclxuICAgICAgICBsZXQgZGF0YVllYXIgPSB0aGlzLl9mb3JtRGF0YS5hdHRyKFwiZGF0YS15ZWFyXCIpO1xyXG4gICAgICAgIGxldCBkYXRhTW9udGggPSB0aGlzLl9mb3JtRGF0YS5hdHRyKFwiZGF0YS1tb250aFwiKTtcclxuICAgICAgICBsZXQgYWN0aW9uTSA9IFNhb3BDYWxlbmRhck5hdmlnYXRpb24ucmVmcmVzaFRhYmxlRGF0YS50b1N0cmluZygpO1xyXG4gICAgICAgIGlmIChhY3Rpb24gPT0gU2FvcENhbGVuZGFyTmF2aWdhdGlvbi5nb3RvUHJldmlvdXMpIHtcclxuICAgICAgICAgICAgYWN0aW9uTSA9IFNhb3BDYWxlbmRhck5hdmlnYXRpb24uZ290b1ByZXZpb3VzLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gU2FvcENhbGVuZGFyTmF2aWdhdGlvbi5nb3RvTmV4dCkge1xyXG4gICAgICAgICAgICBhY3Rpb25NID0gU2FvcENhbGVuZGFyTmF2aWdhdGlvbi5nb3RvTmV4dC50b1N0cmluZygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWN0aW9uID09IFNhb3BDYWxlbmRhck5hdmlnYXRpb24ucmVmcmVzaFRhYmxlRGF0YSB8fCB0aGlzLl9wYXJhbXMucGFydGlhbFJlbmRlciA9PSBudWxsIHx8IHRoaXMuX3BhcmFtcy5wYXJ0aWFsUmVuZGVyID09IHRydWUpe1xyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hUYWJsZURhdGFBamF4Q2FsbChkYXRhWWVhciwgZGF0YU1vbnRoLCBhY3Rpb25NLCBjZWxsSWQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gXCIuLi9cIit0aGlzLl9wYXJhbXMuY29udHJvbGxlcitcIi9cIit0aGlzLl9wYXJhbXMuYWN0aW9uK1wiP3BlcmlvZFlZWVk9XCIgKyBkYXRhWWVhciArIFwiJnBlcmlvZE1NPVwiK2RhdGFNb250aCtcIiZwZXJpb2RBY3Rpb249XCIrYWN0aW9uTTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaFRhYmxlRGF0YUFqYXhDYWxsKHBlcmlvZFllYXI6IHN0cmluZywgcGVyaW9kTW9udGg6IHN0cmluZywgYWN0aW9uTTogc3RyaW5nLCBjZWxsSWQ/OnN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wQ2FsZW5kYXIucmVmcmVzaFRhYmxlRGF0YUFqYXhDYWxsXCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgaWYoIWlzRW1wdHkoY2VsbElkKSkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMucmVmcmVzaENlbGxEYXRhKHJlc3BvbnNlLGNlbGxJZCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAkKFwiI3Nhb3AtY2FsZW5kYXItZGF0YVwiKS5wYXJlbnQoKS5odG1sKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLmJpbmRDYXB0aW9ucygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF90aGlzLl9zYW9wUG9wb3Zlci5iaW5kUG9wb3ZlckV2ZW50cygpO1xyXG4gICAgICAgICAgICBfdGhpcy5zZXRUYWJsZUhlaWd0aCgpO1xyXG4gICAgICAgICAgICBfdGhpcy5zZXRUYWJsZVRkV2lkdGgoKTtcclxuICAgICAgICAgICAgLy9fdGhpcy5maWx0ZXJEYXRhKF90aGlzLl9tdWx0aVNlbGVjdENhdGVnb3J5LnNlbGVjdGVkQ0IpO1xyXG4gICAgICAgICAgICBfdGhpcy5hZnRlclJlZnJlc2hUYWJsZURhdGEocmVzcG9uc2UpOyBcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjogXCJcIit0aGlzLl9wYXJhbXMuY29udHJvbGxlcitcIi9cIit0aGlzLl9wYXJhbXMuYWN0aW9uK1wiP3BlcmlvZFlZWVk9XCIgKyBwZXJpb2RZZWFyICsgXCImcGVyaW9kTU09XCIgKyBwZXJpb2RNb250aCArIFwiJnBlcmlvZEFjdGlvbj1cIiArIGFjdGlvbk0gKyBcIiZwYXJ0aWFsPXRydWVcIlxyXG4gICAgICAgICAgICAsIHR5cGU6IFwiR0VUXCJcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhZnRlclJlZnJlc2hUYWJsZURhdGEoZTogYW55KSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BDYWxlbmRhci5hZnRlclJlZnJlc2hUYWJsZURhdGFcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaENlbGxEYXRhKGh0bWxSZXNwb25zZTpzdHJpbmcsZWxlbWVudElkOnN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wQ2FsZW5kYXIucmVmcmVzaENlbGxEYXRhXCIpO1xyXG4gICAgICAgIGxldCBfZG9jdW1lbnQgPSAkKGh0bWxSZXNwb25zZSk7XHJcbiAgICAgICAgbGV0IF9jZWxsID0gX2RvY3VtZW50LmZpbmQoZWxlbWVudElkKTtcclxuICAgICAgICAkKGVsZW1lbnRJZCkucmVwbGFjZVdpdGgoX2NlbGwpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vZmlsdGVyRGF0YShlbGVtZW50OiBhbnkpIHtcclxuICAgIC8vICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wQ2FsZW5kYXIuZmlsdGVyRGF0YVwiKTtcclxuICAgIC8vICAgIHRoaXMuZXh0ZXJuYWxGaWx0ZXJEYXRhKGVsZW1lbnQpO1xyXG4gICAgLy99XHJcblxyXG4gICAgLy8vLyBleHRlcm5hbCBtZXRvZGEgemEgZmlsdGVyLCBraSBsYWhrbyBuYWRvbWVzdGkgdGhpcy5jYXRlZ29yaWVzRmlsdGVyIG1ldG9kb1xyXG4gICAgLy9leHRlcm5hbEZpbHRlckRhdGEoZWxlbWVudDogYW55KSB7XHJcbiAgICAvLyAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcENhbGVuZGFyLmV4dGVybmFsRmlsdGVyRGF0YS1kZWZhdWx0XCIpO1xyXG4gICAgLy8gICAgLy8ga2xpY2UgZGVmYXVsdCBtZXRvZG9cclxuICAgIC8vICAgIHRoaXMuY2F0ZWdvcmllc0ZpbHRlcihlbGVtZW50LnZhbCgpLnRvU3RyaW5nKCkpO1xyXG4gICAgLy99XHJcblxyXG4gICAgLy9pbml0TXVsdGlTZWxlY3QoKSB7XHJcbiAgICAvLyAgICB0aGlzLl9tdWx0aVNlbGVjdENhdGVnb3J5ID0gbmV3IFNhb3BNdWx0aXNlbGVjdCgpO1xyXG4gICAgLy8gICAgdGhpcy5fbXVsdGlTZWxlY3RDYXRlZ29yeS5hZnRlckNoYW5nZUNvbW1vbkV2ZW50ID0gdGhpcy5maWx0ZXJEYXRhLmJpbmQodGhpcyk7XHJcbiAgICAvLyAgICB0aGlzLl9tdWx0aVNlbGVjdENhdGVnb3J5LmluaXQoXCIjQ2F0ZWdvcmllc1wiLCBcIlphcG9zbGVuaSB6YSBwcmlrYXpcIik7XHJcbiAgICAvL31cclxuXHJcbiAgICAvL2NhdGVnb3JpZXNGaWx0ZXIoZmlsdGVyOiBzdHJpbmcgPSBcIlwiKSB7XHJcbiAgICAvLyAgICAvLyBEZWNsYXJlIHZhcmlhYmxlc1xyXG4gICAgLy8gICAgdmFyIHRhYmxlLCB0ciwgX3Jvd0lkLCBpLCB0eHRWYWx1ZTtcclxuICAgIC8vICAgIHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzYW9wLWNhbGVuZGFyLXRhYmxlXCIpO1xyXG4gICAgLy8gICAgdHIgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRyXCIpO1xyXG4gICAgLy8gICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0YWJsZSByb3dzLCBhbmQgaGlkZSB0aG9zZSB3aG8gZG9uJ3QgbWF0Y2ggdGhlIHNlYXJjaCBxdWVyeVxyXG4gICAgLy8gICAgZm9yIChpID0gMDsgaSA8IHRyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAvLyAgICAgICAgX3Jvd0lkID0gbnVsbDtcclxuICAgIC8vICAgICAgICBsZXQgX3RySWQgPSAkKHRyW2ldKS5hdHRyKFwiaWRcIik7XHJcbiAgICAvLyAgICAgICAgaWYgKCFpc1VuRGVmaW5lZChfdHJJZCkpIHtcclxuICAgIC8vICAgICAgICAgICAgX3Jvd0lkID0gX3RySWQudG9TdHJpbmcoKVxyXG4gICAgLy8gICAgICAgIH0gXHJcbiAgICAvLyAgICAgICAgaWYgKF9yb3dJZCkge1xyXG4gICAgLy8gICAgICAgICAgICB0eHRWYWx1ZSA9IF9yb3dJZC50b1VwcGVyQ2FzZSgpO1xyXG4gICAgLy8gICAgICAgICAgICBpZiAoaXNFbXB0eShmaWx0ZXIpKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICB0cltpXS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAvLyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyLnRvVXBwZXJDYXNlKCkuaW5kZXhPZih0eHRWYWx1ZSkgPiAtMSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgdHJbaV0uc3R5bGUuZGlzcGxheSA9IFwiXCI7XHJcbiAgICAvLyAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICB0cltpXS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAvLyAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICB9XHJcbiAgICAvLyAgICB9XHJcbiAgICAvL31cclxuXHJcbiAgICBnZXRIZWFkZXJDb250cm9sR3JvdXBJZCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBcInNhb3AtY2FsZW5kYXItZm9ybS1oZWFkZXItY29udHJvbC1ncm91cFwiO1xyXG4gICAgfVxyXG4gICAgLy9cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcENoZWNrYm94U3dpdGNoIHtcclxuXHJcbiAgICBpbml0KHBhcmVudEVsZW1lbnQ6IHN0cmluZyA9IFwiXCIpIHtcclxuICAgICAgICB0aGlzLmNoZWNrYm94U3dpdGNoT25DbGljayhwYXJlbnRFbGVtZW50KTtcclxuICAgICAgICB0aGlzLnN3aXRjaExhYmVsT25DbGljayhwYXJlbnRFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBjaGVja2JveFN3aXRjaE9uQ2xpY2socGFyZW50RWxlbWVudDogc3RyaW5nKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInNhb3Atc3dpdGNoLWNoZWNrYm94Li4uXCIpO1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzYW9wLXN3aXRjaC1jaGVja2JveCBwYXJlbnRFbGVtZW50OiBcIiArIHBhcmVudEVsZW1lbnQpO1xyXG5cclxuICAgICAgICBsZXQgX2ZyYW1lID0gJChcIlwiICsgcGFyZW50RWxlbWVudCArIFwiICo+LnNhb3Atc3dpdGNoLWNoZWNrYm94XCIpO1xyXG4gICAgICAgIF9mcmFtZS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICBfZnJhbWUuY2xpY2soZnVuY3Rpb24gKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICAgICAgbGV0IF9jaGVja0JveCA9IGV2ZW50LnRhcmdldDtcclxuICAgICAgICAgICAgbGV0IF9hdHJQYXJlbnQgPSBcIiNcIiskKF9jaGVja0JveCkuYXR0cihcImZvclwiKTtcclxuICAgICAgICAgICAgbGV0IF9jaGVja0JveFAgPSAkKFwiXCIgKyBwYXJlbnRFbGVtZW50ICsgXCIgKj5cIiArIF9hdHJQYXJlbnQpO1xyXG4gICAgICAgICAgICBsZXQgX2xhYmVsMSA9IF9jaGVja0JveFAuZmluZChcIiNzYW9wLXN3aXRjaC1sYWJlbDFcIik7XHJcbiAgICAgICAgICAgIGxldCBfbGFiZWwyID0gX2NoZWNrQm94UC5maW5kKFwiI3Nhb3Atc3dpdGNoLWxhYmVsMlwiKTtcclxuICAgICAgICAgICAgaWYgKF9jaGVja0JveC5jaGVja2VkKSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY2hlY2tlZFwiKTtcclxuICAgICAgICAgICAgICAgIF9sYWJlbDEucmVtb3ZlQ2xhc3MoJ3N3aXRjaC1sYWJlbC1vbicpO1xyXG4gICAgICAgICAgICAgICAgX2xhYmVsMS5hZGRDbGFzcygnc3dpdGNoLWxhYmVsLW9mZicpO1xyXG4gICAgICAgICAgICAgICAgX2xhYmVsMi5yZW1vdmVDbGFzcygnc3dpdGNoLWxhYmVsLW9mZicpO1xyXG4gICAgICAgICAgICAgICAgX2xhYmVsMi5hZGRDbGFzcygnc3dpdGNoLWxhYmVsLW9uJyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwidW5jaGVja2VkXCIpO1xyXG4gICAgICAgICAgICAgICAgX2xhYmVsMS5yZW1vdmVDbGFzcygnc3dpdGNoLWxhYmVsLW9mZicpO1xyXG4gICAgICAgICAgICAgICAgX2xhYmVsMS5hZGRDbGFzcygnc3dpdGNoLWxhYmVsLW9uJyk7XHJcbiAgICAgICAgICAgICAgICBfbGFiZWwyLnJlbW92ZUNsYXNzKCdzd2l0Y2gtbGFiZWwtb24nKTtcclxuICAgICAgICAgICAgICAgIF9sYWJlbDIuYWRkQ2xhc3MoJ3N3aXRjaC1sYWJlbC1vZmYnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaExhYmVsT25DbGljayhwYXJlbnRFbGVtZW50OiBzdHJpbmcpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic2FvcC1zd2l0Y2gtbGFiZWwuLi5cIik7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInNhb3Atc3dpdGNoLWxhYmVsIHBhcmVudEVsZW1lbnQ6IFwiICsgcGFyZW50RWxlbWVudCk7XHJcblxyXG4gICAgICAgIGxldCBfZnJhbWUgPSAkKFwiXCIgKyBwYXJlbnRFbGVtZW50ICsgXCIgKj4uc2FvcC1zd2l0Y2gtbGFiZWxcIik7XHJcbiAgICAgICAgX2ZyYW1lLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgIF9mcmFtZS5jbGljayhmdW5jdGlvbiAoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgICAgICBsZXQgX3N3aXRjaExhYmVsID0gZXZlbnQudGFyZ2V0O1xyXG4gICAgICAgICAgICBsZXQgX2F0ckNoZWNrQm94ID0gXCIjXCIrJChfc3dpdGNoTGFiZWwpLmF0dHIoXCJmb3JcIik7XHJcbiAgICAgICAgICAgIGxldCBfY2hlY2tCb3ggPSAkKF9hdHJDaGVja0JveCk7XHJcbiAgICAgICAgICAgICQoX2NoZWNrQm94KS5wcm9wKCAnY2hlY2tlZCcsICdmbGFzZScpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vXHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/aW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BFeHBvcnQge1xyXG4gICAgcHJpdmF0ZSBfbGliTmFtZTogc3RyaW5nO1xyXG4gICAgLy9cclxuICAgIFxyXG4gICAgY29uc3RydWN0b3IobGliTmFtZTogc3RyaW5nID0gXCJcIikge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wRXhwb3J0XCIpO1xyXG4gICAgICAgIHRoaXMuX2xpYk5hbWUgPSBsaWJOYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBleHBvcnREYXRhMkNzdihkYXRhOiBzdHJpbmdbXVtdLCBmaWxlTmFtZTogc3RyaW5nID0gXCJFeHBvcnREYXRhLmNzdlwiKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BFeHBvcnQuZXhwb3J0RGF0YTJDc3ZcIik7XHJcblxyXG4gICAgICAgIGxldCBjc3YgPSB0aGlzLmFycmF5VG9Dc3YoZGF0YSk7XHJcblxyXG4gICAgICAgIHRoaXMuZG93bmxvYWRCbG9iKFwiXFx1RkVGRlwiICsgY3N2LCBmaWxlTmFtZSwgJ3RleHQvY3N2O2NoYXJzZXQ9dXRmLTg7Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGV4cG9ydFRhYmxlRGF0YTJDc3YodGFibGVTZWxlY3Rvcjogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nID0gXCJFeHBvcnREYXRhLmNzdlwiKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BFeHBvcnQuZXhwb3J0VGFibGVEYXRhMkNzdlwiKTtcclxuXHJcbiAgICAgICAgbGV0IGRhdGEgPSB0aGlzLmdldFRhYmxlRGF0YSh0YWJsZVNlbGVjdG9yKTtcclxuXHJcbiAgICAgICAgdGhpcy5leHBvcnREYXRhMkNzdihkYXRhLCBmaWxlTmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhcnJheVRvQ3N2KGRhdGE6IHN0cmluZ1tdW10sIGNzdkRlbGltaXRlcjogc3RyaW5nID0gXCI7XCIpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcEV4cG9ydC5hcnJheVRvQ3N2XCIpO1xyXG5cclxuICAgICAgICBsZXQgY3N2RGF0YSA9IGRhdGEubWFwKHJvdyA9PlxyXG4gICAgICAgICAgICByb3dcclxuICAgICAgICAgICAgICAgIC5tYXAoU3RyaW5nKSAgLy8gY29udmVydCBldmVyeSB2YWx1ZSB0byBTdHJpbmdcclxuICAgICAgICAgICAgICAgIC5tYXAodiA9PiB2LnJlcGxhY2UoJ1wiJywgJ1wiXCInKSkgIC8vIGVzY2FwZSBkb3VibGUgY29sb25zXHJcbiAgICAgICAgICAgICAgICAubWFwKHYgPT4gYFwiJHt2fVwiYCkgIC8vIHF1b3RlIGl0XHJcbiAgICAgICAgICAgICAgICAuam9pbihjc3ZEZWxpbWl0ZXIpICAvLyBjb21tYS1zZXBhcmF0ZWRcclxuICAgICAgICApLmpvaW4oJ1xcclxcbicpOyAgLy8gcm93cyBzdGFydGluZyBvbiBuZXcgbGluZXNcclxuXHJcbiAgICAgICAgcmV0dXJuIGNzdkRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBkb3dubG9hZEJsb2IoY29udGVudDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nLCBjb250ZW50VHlwZTogc3RyaW5nKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BFeHBvcnQuZG93bmxvYWRCbG9iXCIpO1xyXG5cclxuICAgICAgICAvLyBDcmVhdGUgYSBibG9iXHJcbiAgICAgICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbY29udGVudF0sIHsgdHlwZTogY29udGVudFR5cGUgfSk7XHJcbiAgICAgICAgdmFyIHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcblxyXG4gICAgICAgIC8vIENyZWF0ZSBhIGxpbmsgdG8gZG93bmxvYWQgaXRcclxuICAgICAgICB2YXIgcG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgICAgIHBvbS5ocmVmID0gdXJsO1xyXG4gICAgICAgIHBvbS5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgZmlsZW5hbWUpO1xyXG4gICAgICAgIHBvbS5jbGljaygpO1xyXG4gICAgICAgIHBvbS5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFRhYmxlRGF0YSh0YWJsZVNlbGVjdG9yOiBzdHJpbmcpOiBzdHJpbmdbXVtdIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcEV4cG9ydC5nZXRUYWJsZURhdGFcIik7XHJcblxyXG4gICAgICAgIGxldCByZXN1bHQ6IHN0cmluZ1tdW10gPSBbXTtcclxuXHJcbiAgICAgICAgLy8gbmFqcHJlaiBkb2RhbW8gaGVhZGVyamVcclxuICAgICAgICBsZXQgaGVhZGVyUm93OiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICAgIGxldCB0ZWRlbkNhcHRpb25oZWFkZXJEaXZzID0gJCh0YWJsZVNlbGVjdG9yICsgJyB0aGVhZCB0ciB0aDpub3QoLmVsZW1lbnQtaGlkZGVuKSBkaXYuc2FvcC10YWJsZS1oZWFkZXItY2FwdGlvbicpO1xyXG4gICAgICAgIHRlZGVuQ2FwdGlvbmhlYWRlckRpdnMuZWFjaChmdW5jdGlvbiAoaW5kZXgsIGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgaGVhZGVyUm93LnB1c2goZWxlbWVudC5pbm5lclRleHQudHJpbSgpKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXN1bHQucHVzaChoZWFkZXJSb3cpO1xyXG5cclxuICAgICAgICAvLyBkb2RhbW8gdnJzdGljZSB6IHBvZGF0a2lcclxuICAgICAgICBsZXQgdGFibGVSb3dzID0gJCh0YWJsZVNlbGVjdG9yICsgJyB0Ym9keSB0cjpub3QoLmVsZW1lbnQtaGlkZGVuKScpOyBcclxuICAgICAgICB0YWJsZVJvd3MuZWFjaChmdW5jdGlvbiAoaW5kZXgsIHJvd0VsZW1lbnQpIHtcclxuICAgICAgICAgICAgLy8gemEgdnNha28gdnJzdGljbyBwb2lzY2VtbyBwb2RhdGtlIGl6IHN0b3BjZXYgdnJzdGljZVxyXG4gICAgICAgICAgICBsZXQgb25lUm93RGF0YTogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICAgICAgJChyb3dFbGVtZW50KS5maW5kKCd0ZDpub3QoLmVsZW1lbnQtaGlkZGVuKScpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBjb2xFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICBvbmVSb3dEYXRhLnB1c2goY29sRWxlbWVudC5pbm5lclRleHQudHJpbSgpKVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG9uZVJvd0RhdGEpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wRmxvYXRpbmdMYWJlbCB7XHJcblxyXG4gICAgaW5pdCgpIHtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIC8vJCgnLmhhcy1mbG9hdC1sYWJlbCA+IC5mb3JtLWNvbnRyb2wnKS5vZmYoXCJmb2N1c1wiLF90aGlzLnNhb3BJbnB1dE9uRm9jdXMpO1xyXG4gICAgICAgIC8vJCgnLmhhcy1mbG9hdC1sYWJlbCA+IC5mb3JtLWNvbnRyb2wnKS5vbihcImZvY3VzXCIsX3RoaXMuc2FvcElucHV0T25Gb2N1cyk7XHJcbiAgICAgICAgJCgnLmhhcy1mbG9hdC1sYWJlbCA+IC5mb3JtLWNvbnRyb2w6bm90KFtyZWFkb25seT1cInJlYWRvbmx5XCJdKScpLm9mZihcImZvY3VzXCIsIF90aGlzLnNhb3BJbnB1dE9uRm9jdXMpO1xyXG4gICAgICAgICQoJy5oYXMtZmxvYXQtbGFiZWwgPiAuZm9ybS1jb250cm9sOm5vdChbcmVhZG9ubHk9XCJyZWFkb25seVwiXSknKS5vbihcImZvY3VzXCIsIF90aGlzLnNhb3BJbnB1dE9uRm9jdXMpO1xyXG5cclxuICAgICAgICAkKCcuaGFzLWZsb2F0LWxhYmVsID4gLmZvcm0tY29udHJvbCcpLm9mZihcImJsdXJcIixfdGhpcy5zYW9wSW5wdXRPbkJsdXIpO1xyXG4gICAgICAgICQoJy5oYXMtZmxvYXQtbGFiZWwgPiAuZm9ybS1jb250cm9sJykub24oXCJibHVyXCIsX3RoaXMuc2FvcElucHV0T25CbHVyKTtcclxuICAgIFxyXG4gICAgICAgICQoJy5oYXMtZmxvYXQtbGFiZWwgPiAuZm9ybS1jb250cm9sJykub2ZmKFwiZm9jdXNvdXRcIixfdGhpcy5zYW9wSW5wdXRPbkNoYW5nZSk7XHJcbiAgICAgICAgJCgnLmhhcy1mbG9hdC1sYWJlbCA+IC5mb3JtLWNvbnRyb2wnKS5vbihcImZvY3Vzb3V0XCIsX3RoaXMuc2FvcElucHV0T25DaGFuZ2UpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBzYW9wSW5wdXRPbkNoYW5nZShlOmFueSkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzYW9wLWZsb2F0aW5nLWxhYmVsLi4uc2FvcElucHV0T25DaGFuZ2VcIik7XHJcbiAgICAgICAgbGV0IGh0bWxFbGVtZW50ID0gZS50YXJnZXQ7XHJcbiAgICAgICAgbGV0IF9ub2RlID0gJChcIiNcIitodG1sRWxlbWVudC5pZCk7XHJcbiAgICAgICAgaWYgKF9ub2RlLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICBsZXQgX3BhcmVudE4gPSBfbm9kZS5wYXJlbnQoKTtcclxuICAgICAgICAgICAgaWYgKF9wYXJlbnROLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICAgICAgX3BhcmVudE4ucmVtb3ZlQ2xhc3MoXCJzYW9wLWVycm9yLWlucHV0XCIpO1xyXG4gICAgICAgICAgICAgICAgbGV0IF9sYWJlbCA9IF9wYXJlbnROLmZpbmQoXCIudGV4dC1kYW5nZXJcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoX2xhYmVsLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICAgICAgICAgIF9sYWJlbC5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0gICAgXHJcblxyXG4gICAgc2FvcElucHV0T25Gb2N1cyhlOmFueSkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzYW9wLWZsb2F0aW5nLWxhYmVsLi4uXCIpO1xyXG4gICAgICAgIC8vYmFydmFuamUgXCJmbG9hdGluZyBsYWJlbFwiXHJcbiAgICAgICAgbGV0IGh0bWxFbGVtZW50ID0gZS50YXJnZXQ7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuc2FvcC1mbG9hdGluZy1sYWJlbCcpLmNsYXNzTGlzdC5hZGQoXCJzYW9wLXR4dC1wcmltYXJ5XCIpO1xyXG4gICAgfVxyXG4gICAgICAgIFxyXG4gICAgc2FvcElucHV0T25CbHVyKGU6YW55KSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInNhb3AtZmxvYXRpbmctbGFiZWwuLi5cIik7XHJcbiAgICAgICAgLy9iYXJ2YW5qZSBcImZsb2F0aW5nIGxhYmVsXCIgb24gaW5wdXQgYmx1ciAoZm9jdXMgbG9zdCkgbmF6YWogdiBzaXZvIChyZW1vdmUgcmF6cmVkIFwic2FvcC10eHQtcHJpbWFyeVwiKVxyXG4gICAgICAgIGxldCBodG1sRWxlbWVudCA9IGUudGFyZ2V0O1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvcignLnNhb3AtZmxvYXRpbmctbGFiZWwnKS5jbGFzc0xpc3QucmVtb3ZlKFwic2FvcC10eHQtcHJpbWFyeVwiKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgc2V0Q2FwdGlvbkFzUmVxdWlyZWQobGFiZWxJZDpzdHJpbmcscmVxdWlyZWQ6Ym9vbGVhbik6dm9pZHtcclxuICAgICAgICBsZXQgX2VsZW1lbnQgPSAkKGxhYmVsSWQpO1xyXG4gICAgICAgIGxldCBfZWxlbWVudFZhbCA9IF9lbGVtZW50LnRleHQoKS50b1N0cmluZygpO1xyXG4gICAgICAgIF9lbGVtZW50VmFsID0gX2VsZW1lbnRWYWwucmVwbGFjZShcIipcIixcIlwiKTtcclxuICAgICAgICBpZiAocmVxdWlyZWQpIHtcclxuICAgICAgICAgICAgX2VsZW1lbnQudGV4dChfZWxlbWVudFZhbCtcIipcIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgX2VsZW1lbnQudGV4dChfZWxlbWVudFZhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSAgXHJcblxyXG4gICAgc2V0VmFsaWRhdGlvbkVycm9yQnlJZChsYWJlbElkOnN0cmluZywgdmFsTWVzc2FnZTpzdHJpbmcpOnZvaWR7XHJcbiAgICAgICAgbGV0IF9pbnB1dEVsZW1lbnQgPSAkKGxhYmVsSWQpWzBdIGFzIEhUTUxJbnB1dEVsZW1lbnQ7IC8vaW5wdXRcclxuICAgICAgICB0aGlzLnNldFZhbGlkYXRpb25FcnJvcihfaW5wdXRFbGVtZW50LCB2YWxNZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRWYWxpZGF0aW9uRXJyb3IoaW5wdXRFbGVtZW50OkhUTUxJbnB1dEVsZW1lbnQsIHZhbE1lc3NhZ2U6c3RyaW5nKTp2b2lke1xyXG4gICAgICAgIGxldCBfaW5wdXRFbGVtZW50ID0gJChpbnB1dEVsZW1lbnQpO1xyXG4gICAgICAgIGxldCBfc3BhbkVsZW1lbnQgPSBfaW5wdXRFbGVtZW50LnBhcmVudCgpOyAvL2hhcy1mbG9hdC1sYWJlbFxyXG4gICAgICAgIGlmIChfc3BhbkVsZW1lbnQuaGFzQ2xhc3MoXCJzYW9wLWVycm9yLWlucHV0XCIpID09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGxldCBfcGxhY2Vob2xkZXIgPSBfaW5wdXRFbGVtZW50LmF0dHIoXCJwbGFjZWhvbGRlclwiKTtcclxuICAgICAgICAgICAgX3NwYW5FbGVtZW50LmFkZENsYXNzKFwic2FvcC1lcnJvci1pbnB1dFwiKTtcclxuICAgICAgICAgICAgaWYgKF9pbnB1dEVsZW1lbnQuaGFzQ2xhc3MoXCJpbnB1dC12YWxpZGF0aW9uLWVycm9yXCIpID09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBfaW5wdXRFbGVtZW50LmFkZENsYXNzKFwiaW5wdXQtdmFsaWRhdGlvbi1lcnJvclwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgX21lc3NhZ2UgPSB2YWxNZXNzYWdlLnJlcGxhY2UoXCJ7MH1cIixfcGxhY2Vob2xkZXIpO1xyXG4gICAgICAgICAgICBfc3BhbkVsZW1lbnQuYXBwZW5kKCc8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXIgc2FvcC10eHQtN1wiPicrX21lc3NhZ2UrJzwvZGl2PicpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9ub2RlX21vZHVsZXMvQHR5cGVzL2dvb2dsZS5tYXBzL2luZGV4LmQudHNcIi8+XHJcbmltcG9ydCB7IGdsb2JhbCAsaXNVbkRlZmluZWQgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BNZXNzYWdlQmFubmVyIH0gZnJvbSAnLi4vQ29tcG9uZW50cy9zYW9wLW1lc3NhZ2UtYmFubmVyJztcclxuaW1wb3J0IHsgU2FvcEZsb2F0aW5nTGFiZWwgfSBmcm9tICcuLi9Db21wb25lbnRzL3Nhb3AtZmxvYXRpbmctbGFiZWwnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BHb29nbGVNYXBzIHtcclxuICAgIHByaXZhdGUgX3Nhb3BGbG9hdGluZ0xhYmVsOlNhb3BGbG9hdGluZ0xhYmVsID0gbmV3IFNhb3BGbG9hdGluZ0xhYmVsKCk7XHJcbiAgICBwcml2YXRlIF9yb3V0ZXMgOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9tc2dSZXF1cmVkIDpzdHJpbmc7IFxyXG4gICAgcHJpdmF0ZSBfdmlld0VsZW1lbnQgOiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gICAgLy8jIyNcclxuICAgIHByaXZhdGUgX2dlb2NvZGVyID0gbmV3IGdvb2dsZS5tYXBzLkdlb2NvZGVyKCk7IFxyXG4gICAgcHJpdmF0ZSBfbWFwOmdvb2dsZS5tYXBzLk1hcDtcclxuICAgIHByaXZhdGUgX21hcmtlcjpnb29nbGUubWFwcy5NYXJrZXI7XHJcbiAgICBwcml2YXRlIF9kaXJlY3Rpb25zRGlzcGxheSA9IG5ldyBnb29nbGUubWFwcy5EaXJlY3Rpb25zUmVuZGVyZXIoKTsgICAgICAgICAgIFxyXG4gICAgcHJpdmF0ZSBfZGlyZWN0aW9uc1NlcnZpY2UgPSBuZXcgZ29vZ2xlLm1hcHMuRGlyZWN0aW9uc1NlcnZpY2UoKTsgIFxyXG4gICAgLy9cclxuICAgIHByaXZhdGUgX3Nhb3BNZXNzYWdlQmFubmVyOiBTYW9wTWVzc2FnZUJhbm5lcjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihsaWJOYW1lOiBzdHJpbmcgPSBcIlwiKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BHb29nbGVNYXBzLmNvbnN0cnVjdG9yXCIpOyAgXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0RmllbGRBdXRvY29tcGxldGUoZWxlbWVudElzOnN0cmluZyxjb3VudHJ5Q29kZTpzdHJpbmcpOnZvaWR7XHJcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBhdXRvY29tcGxldGUgb2JqZWN0LCByZXN0cmljdGluZyB0aGUgc2VhcmNoIHRvIGdlb2dyYXBoaWNhbFxyXG4gICAgICAgIC8vIGxvY2F0aW9uIHR5cGVzLiAgIFxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgX2lucHV0RmllbGQgPSAkKGVsZW1lbnRJcylbMF0gYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgICBsZXQgX2lucHV0RmllbGRBdXRvY29tcGxldGUgPSBuZXcgZ29vZ2xlLm1hcHMucGxhY2VzLkF1dG9jb21wbGV0ZShcclxuICAgICAgICAgIF9pbnB1dEZpZWxkLCB7XHJcbiAgICAgICAgICAgIGZpZWxkczogW1wiZm9ybWF0dGVkX2FkZHJlc3NcIiwgXCJnZW9tZXRyeVwiLCBcIm5hbWVcIl0sXHJcbiAgICAgICAgICAgIHN0cmljdEJvdW5kczogZmFsc2UsXHJcbiAgICAgICAgICAgIC8vIHR5cGVzOiBbJ2dlb2NvZGUnXSxcclxuICAgICAgICAgICAgLy8gZmllbGRzOiBbXCJuYW1lXCIsIFwiYWRkcmVzc19jb21wb25lbnRcIiwgXCJmb3JtYXR0ZWRfYWRkcmVzc1wiLCBcImdlb21ldHJ5LmxvY2F0aW9uXCJdLFxyXG4gICAgICAgICAgICAvLyBjb21wb25lbnRSZXN0cmljdGlvbnM6IHsgJ2NvdW50cnknOiBbJ3NpJywnaHInXSB9LFxyXG4gICAgICAgICAgIH0pO1xyXG4gICAgICAgIC8vIC8vIFNldCBpbml0aWFsIHJlc3RyaWN0IHRvIHRoZSBncmVhdGVyIGxpc3Qgb2YgY291bnRyaWVzLlxyXG4gICAgICAgIC8vIF9pbnB1dEZpZWxkQXV0b2NvbXBsZXRlLnNldENvbXBvbmVudFJlc3RyaWN0aW9ucyh7XHJcbiAgICAgICAgLy8gICAgICdjb3VudHJ5JzogW1wic2lcIixcImhyXCJdXHJcbiAgICAgICAgLy8gfSk7XHJcblxyXG4gICAgICAgX2lucHV0RmllbGRBdXRvY29tcGxldGUuYWRkTGlzdGVuZXIoJ3BsYWNlX2NoYW5nZWQnLCBmdW5jdGlvbigpIHtcclxuICAgICAgICBfdGhpcy5yZWZyZXNoTWFwKCk7XHJcbiAgICAgICB9LmJpbmQodGhpcykpO1xyXG5cclxuICAgICAgIGlmIChpc1VuRGVmaW5lZCh0aGlzLl9tYXApID09IGZhbHNlKSB7XHJcbiAgICAgICAgX2lucHV0RmllbGRBdXRvY29tcGxldGUuYmluZFRvKFwiYm91bmRzXCIsIHRoaXMuX21hcCk7XHJcbiAgICAgICB9ICAgICBcclxuXHJcbiAgICB9ICAgIFxyXG5cclxuICAgIGdldExvY2F0aW9uKCk6dm9pZCB7XHJcbiAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgIGlmIChuYXZpZ2F0b3IuZ2VvbG9jYXRpb24pIHtcclxuICAgICAgICAvL25hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oKHBvc2l0aW9uOiBhbnkpID0+IF90aGlzLnNob3dQb3NpdGlvbihwb3NpdGlvbikpO1xyXG4gICAgICAgIC8vbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbigocG9zaXRpb246IEdlb2xvY2F0aW9uUG9zaXRpb24pID0+IGNvbnNvbGUubG9nKHBvc2l0aW9uLmNvb3Jkcy5sYXRpdHVkZSkpO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbigocG9zaXRpb246IEdlb2xvY2F0aW9uUG9zaXRpb24pID0+IG5ldyBnb29nbGUubWFwcy5MYXRMbmcocG9zaXRpb24uY29vcmRzLmxhdGl0dWRlLCBwb3NpdGlvbi5jb29yZHMubG9uZ2l0dWRlKSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYWxlcnQoXCJHZW9sb2NhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYnJvd3Nlci5cIik7XHJcbiAgICAgIH1cclxuICAgIH0gICAgXHJcbiAgICBcclxuICAgIHNob3dQb3NpdGlvbihwb3NpdGlvbjphbnkpIHtcclxuICAgICAgdmFyIGxhdCA9IHBvc2l0aW9uLmNvb3Jkcy5sYXRpdHVkZTtcclxuICAgICAgdmFyIGxuZyA9IHBvc2l0aW9uLmNvb3Jkcy5sb25naXR1ZGU7XHJcbiAgICAgIHRoaXMuX21hcC5zZXRDZW50ZXIobmV3IGdvb2dsZS5tYXBzLkxhdExuZyhsYXQsIGxuZykpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0VmlldygpOnZvaWQge1xyXG4gICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcEdvb2dsZU1hcHMuaW5pdFZpZXdcIik7ICBcclxuICAgICAgLy9cclxuICAgICAgdGhpcy5fdmlld0VsZW1lbnQgPSAkKCcjR29vZ2xlTWFwc1JvdXRlcycpOyBcclxuICAgICAgdGhpcy5fbXNnUmVxdXJlZCA9IHRoaXMuX3ZpZXdFbGVtZW50LmZpbmQoJyNtc2dSZXF1cmVkJykudGV4dCgpO1xyXG4gICAgICAvL1xyXG4gICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICB3aW5kb3cub25yZXNpemUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgX3RoaXMuc2V0Um93SGVpZ2h0KCk7XHJcbiAgICAgIH07ICAgICAgICBcclxuICAgICAgdGhpcy5zZXRSb3dIZWlnaHQoKTtcclxuICAgICAgLy9cclxuICAgICAgdGhpcy5fc2FvcE1lc3NhZ2VCYW5uZXIgPSBuZXcgU2FvcE1lc3NhZ2VCYW5uZXIoKTsgIFxyXG4gICAgICAvL1xyXG4gICAgICB2YXIgYWRkcmVzcyA9IFwiU2xvdmVuaWphXCI7XHJcbiAgICAgIC8vIyMjXHJcbiAgICAgIHRoaXMuX2dlb2NvZGVyLmdlb2NvZGUoIHsgJ2FkZHJlc3MnOiBhZGRyZXNzLCBsYW5ndWFnZTonc2wnfSwgZnVuY3Rpb24ocmVzdWx0czphbnksIHN0YXR1czphbnkpIHtcclxuICAgICAgICAgIGlmIChzdGF0dXMgPT0gZ29vZ2xlLm1hcHMuR2VvY29kZXJTdGF0dXMuT0spXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgbGV0IF9tYXBfY2FudmFzID0gX3RoaXMuX3ZpZXdFbGVtZW50LmZpbmQoJyNtYXBfY2FudmFzJylbMF07XHJcblxyXG4gICAgICAgICAgICAgIGxldCBfbGF0ID0gcmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbjtcclxuICAgICAgICAgICAgICB2YXIgbXlPcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgICB6b29tOiAxMCxcclxuICAgICAgICAgICAgICAgICAgY2VudGVyOiBfbGF0XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBfdGhpcy5fbWFwID0gbmV3IGdvb2dsZS5tYXBzLk1hcChfbWFwX2NhbnZhcywgbXlPcHRpb25zKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gY29uc3QgbXlMYXRMbmcgPSB7IGxhdDogNDUuOTUzNjYyLCBsbmc6IDEzLjY0ODIzNyB9O1xyXG5cclxuICAgICAgICAgICAgICAvLyBfdGhpcy5fbWFya2VyID0gbmV3IGdvb2dsZS5tYXBzLk1hcmtlcihcclxuICAgICAgICAgICAgICAvLyAgIHtcclxuICAgICAgICAgICAgICAvLyAgICAgcG9zaXRpb246IG15TGF0TG5nLFxyXG4gICAgICAgICAgICAgIC8vICAgICBtYXA6IF90aGlzLl9tYXBcclxuICAgICAgICAgICAgICAvLyAgIH0gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgLy8gKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gX3RoaXMuX21hcmtlci5zZXRQb3NpdGlvbihyZXN1bHRzWzBdLmdlb21ldHJ5LmxvY2F0aW9uKTtcclxuICAgICAgICAgICAgICAvLyBfdGhpcy5fbWFya2VyLnNldE1hcChfdGhpcy5fbWFwKTtcclxuXHJcbiAgICAgICAgICAgICAgX3RoaXMuX2RpcmVjdGlvbnNEaXNwbGF5LnNldE1hcChfdGhpcy5fbWFwKTsgICAgXHJcbiAgICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICAvL1xyXG4gICAgICAvL3RoaXMuZ2V0TG9jYXRpb24oKTtcclxuICAgICAgLy9cclxuICAgICAgdGhpcy5Mb2FkVmlld0V2ZW50cygpOyAgXHJcbiAgICAgIC8vdGhpcy5pbml0QXV0b2NvbXBsZXRlKCk7ICBcclxuICAgIH1cclxuICAgICAgXHJcbiAgICBwcml2YXRlIHNldFJvd0hlaWdodCgpOnZvaWQge1xyXG4gICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic2V0Um93SGVpZ2h0Li4uXCIpO1xyXG4gICAgICAvL2xldCBfaGVpZ2h0ID0gJCgnI2dyaWQtdG9vbGJhci1wcm9jZXNzZWQnKS5oZWlnaHQoKTtcclxuICAgICAgbGV0IHJlbWFpbmluZ19oZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSAyMDA7XHJcbiAgICAgIHRoaXMuX3ZpZXdFbGVtZW50LmZpbmQoJyNHb29nbGVNYXBzUm91dGVzUm93JykuaGVpZ2h0KHJlbWFpbmluZ19oZWlnaHQpOyAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBMb2FkVmlld0V2ZW50cygpOnZvaWQge1xyXG4gICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcEdvb2dsZU1hcHMuTG9hZFZpZXdFdmVudHNcIik7ICBcclxuICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgIC8vRG9kYWogbmFzbG92IG5hIHNlem5hbVxyXG4gICAgICBsZXQgX2J0bkFkZFdheXBvaW50ID0gdGhpcy5fdmlld0VsZW1lbnQuZmluZCgnI2J0bkFkZFdheXBvaW50Jyk7XHJcbiAgICAgIF9idG5BZGRXYXlwb2ludC5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgX2J0bkFkZFdheXBvaW50Lm9uKFwiY2xpY2tcIixfdGhpcy5hZGRXYXlwb2ludC5iaW5kKF90aGlzKSk7XHJcbiAgIFxyXG4gICAgICAvL0Z1bmtjaWphLCBraSBzZSBwcmlrbGnEjWUgb2Iga2xpa3UgZ3VtYmEgemEgc2xlZGVuamUgcG90aVxyXG4gICAgICBsZXQgX2J0bkNhbGN1bGF0ZURpc3RhbmNlID0gdGhpcy5fdmlld0VsZW1lbnQuZmluZCgnI2J0bkNhbGN1bGF0ZURpc3RhbmNlJyk7XHJcbiAgICAgIF9idG5DYWxjdWxhdGVEaXN0YW5jZS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgX2J0bkNhbGN1bGF0ZURpc3RhbmNlLm9uKFwiY2xpY2tcIixfdGhpcy5jYWxjdWxhdGVEaXN0YW5jZS5iaW5kKF90aGlzKSk7XHJcblxyXG4gICAgICBsZXQgX2NiY2hrU3RhcnRFcXVhbEVuZCA9IHRoaXMuX3ZpZXdFbGVtZW50LmZpbmQoJyNjYmNoa1N0YXJ0RXF1YWxFbmQnKTtcclxuICAgICAgX2NiY2hrU3RhcnRFcXVhbEVuZC5vZmYoXCJjaGFuZ2VcIik7XHJcbiAgICAgIF9jYmNoa1N0YXJ0RXF1YWxFbmQub24oXCJjaGFuZ2VcIixfdGhpcy5vbmNiY2hrU3RhcnRFcXVhbEVuZENoYW5nZS5iaW5kKF90aGlzKSk7ICAgICAgXHJcblxyXG4gICAgICB0aGlzLm9uU29ydGFibGVDaGFuZ2UoKTtcclxuICAgICAgXHJcbiAgICB9O1xyXG5cclxuICAgIHB1YmxpYyBkZWxheSh0aW1lOm51bWJlcik6YW55IHtcclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCB0aW1lKSk7XHJcbiAgICB9ICAgIFxyXG5cclxuICAgIHByaXZhdGUgZ2V0TmV4dElkKCk6c3RyaW5ne1xyXG4gICAgICBsZXQgX2lkID0gRGF0ZS5ub3coKS50b1N0cmluZygpO1xyXG4gICAgICBsZXQgX2UgPSB0aGlzLl92aWV3RWxlbWVudC5maW5kKCcjd2F5cG9pbnRfJytfaWQpO1xyXG4gICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcEdvb2dsZU1hcHMuZ2V0TmV4dElkOlwiKycjd2F5cG9pbnRfJytfaWQpOyAgXHJcbiAgICAgIHdoaWxlIChfZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BHb29nbGVNYXBzLmdldE5leHRJZDpcIisnI3dheXBvaW50XycrX2lkKyc6ZHVwbGljYXRlJyk7XHJcbiAgICAgICAgX2lkID0gRGF0ZS5ub3coKS50b1N0cmluZygpO1xyXG4gICAgICAgIF9lID0gdGhpcy5fdmlld0VsZW1lbnQuZmluZCgnI3dheXBvaW50XycrX2lkKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gX2lkO1xyXG4gICAgfSBcclxuXHJcbiAgICBwdWJsaWMgYWRkV2F5cG9pbnQod2F5cG9pbnREZXNjcmlwdGlvbjpzdHJpbmcgPSBcIlwiKTp2b2lke1xyXG4gICAgICAvL2NvbnRyb2xfcGFuZWxcclxuICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BHb29nbGVNYXBzLmFkZFdheXBvaW50XCIpOyAgXHJcbiAgICAgIGxldCBfY29udHJvbF9wYW5lbCA9IHRoaXMuX3ZpZXdFbGVtZW50LmZpbmQoJyNjb250cm9sX3BhbmVsJyk7ICAgICAgICBcclxuICAgICAgbGV0IF93YXlwb2ludFRlbXBsYXRlID0gX2NvbnRyb2xfcGFuZWwuZmluZCgnI3dheXBvaW50VGVtcGxhdGUnKTtcclxuICAgICAgbGV0IF93YXlwb2ludCA9IF93YXlwb2ludFRlbXBsYXRlLmZpbmQoJyN3YXlwb2ludCcpO1xyXG4gICAgICBpZiAoX2NvbnRyb2xfcGFuZWwubGVuZ3RoID4gMCAmJiBfd2F5cG9pbnRUZW1wbGF0ZS5sZW5ndGggPiAwICYmIF93YXlwb2ludC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbGV0IF9wbGFjZWhvbGRlclRleHQgPSBfd2F5cG9pbnQuYXR0cihcInBsYWNlaG9sZGVyXCIpO1xyXG4gICAgICAgIC8vbGV0IF9sZW5ndGggPSBfY29udHJvbF9wYW5lbC5jaGlsZHJlbigpLmxlbmd0aCsxO1xyXG4gICAgICAgIGxldCBfd3BJZCA9IHRoaXMuZ2V0TmV4dElkKCk7ICAgIFxyXG4gICAgICAgIGxldCBfY2xvbmVJZCA9IFwid2F5cG9pbnRfXCIgKyBfd3BJZC50b1N0cmluZygpO1xyXG4gICAgICAgIC8vdGhpcy5kZWxheSgxMDApO1xyXG4gICAgICAgIGxldCBfaW5wdXRDbG9uZSA9IFxyXG4gICAgICAgIF93YXlwb2ludFRlbXBsYXRlXHJcbiAgICAgICAgLmNsb25lKClcclxuICAgICAgICAuaHRtbChmdW5jdGlvbihpLCBvbGRIVE1MKSB7XHJcbiAgICAgICAgICBsZXQgX25ld1RleHQgPSBvbGRIVE1MLnJlcGxhY2UoL3dheXBvaW50L2csX2Nsb25lSWQpO1xyXG4gICAgICAgICAgdmFyIHJlZ2V4ID0gbmV3IFJlZ0V4cChfcGxhY2Vob2xkZXJUZXh0LCAnZycpO1xyXG4gICAgICAgICAgX25ld1RleHQgPSBfbmV3VGV4dC5yZXBsYWNlKHJlZ2V4LF9wbGFjZWhvbGRlclRleHQrX3dwSWQudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICByZXR1cm4gX25ld1RleHQ7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIF9pbnB1dENsb25lLmF0dHIoXCJpZFwiLFwid2F5cG9pbnRfXCIrX3dwSWQudG9TdHJpbmcoKStcIl9yb3dcIik7XHJcbiAgICAgICAgX2lucHV0Q2xvbmUuYXR0cihcImRlbGV0ZS1pZFwiLFwid2F5cG9pbnRfXCIrX3dwSWQudG9TdHJpbmcoKStcIl9kZWxcIik7XHJcbiAgICAgICAgX2lucHV0Q2xvbmUuY3NzKFwiZGlzcGxheVwiLFwiZmxleFwiKTtcclxuXHJcbiAgICAgICAgX2NvbnRyb2xfcGFuZWwuYXBwZW5kKF9pbnB1dENsb25lKTtcclxuXHJcbiAgICAgICAgLy9sZXQgX3dheXBvaW50X2RlbCA9IF9jb250cm9sX3BhbmVsLmZpbmQoXCIjd2F5cG9pbnRfXCIrX2xlbmd0aC50b1N0cmluZygpK1wiX2RlbFwiKTtcclxuICAgICAgICAvLyBpZiAoX3dheXBvaW50X2RlbC5sZW5ndGggPiAwKXtcclxuICAgICAgICAvLyAgIF93YXlwb2ludF9kZWwuY3NzKFwiZGlzcGxheVwiLFwiYmxvY2tcIik7XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICBsZXQgX3dheXBvaW50Q2xvbmUgPSBfY29udHJvbF9wYW5lbC5maW5kKFwiI3dheXBvaW50X1wiK193cElkLnRvU3RyaW5nKCkrXCJcIik7XHJcbiAgICAgICAgaWYgKF93YXlwb2ludENsb25lLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHRoaXMuaW5pdEZpZWxkQXV0b2NvbXBsZXRlKFwiI1wiK193YXlwb2ludENsb25lWzBdLmlkLFwic2lcIik7IFxyXG4gICAgICAgICAgaWYgKHdheXBvaW50RGVzY3JpcHRpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBfd2F5cG9pbnRDbG9uZS52YWwod2F5cG9pbnREZXNjcmlwdGlvbi50cmltKCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vXHJcbiAgICAgIHRoaXMuX3Nhb3BGbG9hdGluZ0xhYmVsLmluaXQoKTtcclxuICAgICAgdGhpcy5vblNvcnRhYmxlQ2hhbmdlKCk7XHJcbiAgICAgIHRoaXMuZ2V0Um91dGVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFJvdXRlcygpOmFueXtcclxuICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BHb29nbGVNYXBzLmdldFJvdXRlc1wiKTsgIFxyXG4gICAgICB0aGlzLl9yb3V0ZXMgPSBcIlwiO1xyXG5cclxuICAgICAgbGV0IF9saXN0ID0gdGhpcy5nZXRXYXlwb2ludHMoKTtcclxuICAgICAgbGV0IF9pID0gMDtcclxuICAgICAgZm9yKHZhciBfaW5kZXggaW4gX2xpc3QpXHJcbiAgICAgIHsgXHJcbiAgICAgICAgICBsZXQgX2VsZW1lbnQgPSBfbGlzdFtfaW5kZXhdIGFzIEhUTUxJbnB1dEVsZW1lbnQgO1xyXG4gICAgICAgICAgbGV0IF9sYWJsZUlkID0gXCIjbGJsXCIrX2VsZW1lbnQuaWQ7XHJcbiAgICAgICAgICBsZXQgX2xhYmVsQ2FwdGlvbiA9IFwiXCI7XHJcbiAgICAgICAgICBpZiAoX2kgPT0gMSkge1xyXG4gICAgICAgICAgICBfbGFiZWxDYXB0aW9uID0gXCJaYcSNZXRuYSBsb2thY2lqYSpcIjtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoX2kgPT0gMikge1xyXG4gICAgICAgICAgICBfbGFiZWxDYXB0aW9uID0gXCJDaWxqKlwiO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgX2xhYmVsQ2FwdGlvbiA9IFwiQ2lsalwiKyhfaS0xKS50b1N0cmluZygpK1wiKlwiOyAgXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAkKF9sYWJsZUlkKS50ZXh0KF9sYWJlbENhcHRpb24pO1xyXG4gICAgICAgICAgLy9jb25zb2xlLmxvZyhcInZhbDpcIitfZWxlbWVudC52YWx1ZSk7ICBcclxuICAgICAgICAgIC8vY29uc29sZS5sb2coJChcIiNcIitfZWxlbWVudC5pZCkudmFsKCkpOyBcclxuICAgICAgICAgIGxldCBfd3AgPSBfZWxlbWVudC52YWx1ZS5yZXBsYWNlKCcsIFNsb3ZlbmlqYScsJycpO1xyXG4gICAgICAgICAgX3dwID0gX3dwLnJlcGxhY2UoJywgU2xvdmVuaWEnLCcnKS50cmltKCk7XHJcbiAgICAgICAgICAvL1xyXG5cclxuXHJcbiAgICAgICAgICBpZiAoX2VsZW1lbnQudmFsdWUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fcm91dGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICBfd3AgPSBcIjsgXCIrX3dwXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fcm91dGVzID0gdGhpcy5fcm91dGVzICtfd3AgO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgX2kgPSBfaSArIDE7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLl9yb3V0ZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFdheXBvaW50cygpOiBIVE1MRWxlbWVudFtdIHtcclxuICAgICAgdmFyIF9yZXN1bHQgOiBIVE1MRWxlbWVudFtdID0gW107XHJcbiAgICAgIGxldCBfY29udHJvbF9wYW5lbCA9ICQoJyNHb29nbGVNYXBzUm91dGVzJykuZmluZCgnI2NvbnRyb2xfcGFuZWwnKTsgICAgXHJcbiAgICAgIF9jb250cm9sX3BhbmVsLmNoaWxkcmVuKCkuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IF9pbnB1dCA9ICQodGhpcykuZmluZChcIjppbnB1dFwiKTtcclxuICAgICAgICBpZiAoX2lucHV0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGlmIChfaW5wdXRbMF0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBfcmVzdWx0LnB1c2goX2lucHV0WzBdKTsgICAgICAgICAgICBcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gX3Jlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVsZXRlV2F5cG9pbnQoZTphbnkpOnZvaWR7XHJcbiAgICAgIGxldCBfY29udHJvbF9wYW5lbCA9ICQoJyNHb29nbGVNYXBzUm91dGVzJykuZmluZCgnI2NvbnRyb2xfcGFuZWwnKTsgICBcclxuXHJcbiAgICAgIGlmIChfY29udHJvbF9wYW5lbC5jaGlsZHJlbigpLmxlbmd0aCA9PSAzKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgX2J0bkRlbCA9ICQoZSBhcyBIVE1MRWxlbWVudCk7XHJcbiAgICAgIGxldCBfcm93SWQgPSBfYnRuRGVsLmF0dHIoXCJyb3ctaWRcIik7XHJcblxyXG4gICAgICBpZiAoX3Jvd0lkICE9IFwid2F5cG9pbnRUZW1wbGF0ZVwiKSB7XHJcbiAgICAgICAgbGV0IF9yb3cgPSAkKFwiI1wiK19yb3dJZCk7XHJcbiAgICAgICAgaWYgKF9yb3cubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgX3Jvdy5yZW1vdmUoKTtcclxuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlRGlzdGFuY2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2FsY3VsYXRlRGlzdGFuY2UoKTp2b2lke1xyXG4gICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcEdvb2dsZU1hcHMuY2FsY3VsYXRlRGlzdGFuY2VcIik7ICBcclxuICAgICAgdGhpcy5nZXRSb3V0ZXMoKTtcclxuICAgICAgLy9cclxuICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgbGV0IF9zdGFydFdheXBvaW50ID0gXCJcIjtcclxuICAgICAgbGV0IF9lbmRXYXlwb2ludCA9IFwiXCI7XHJcbiAgICAgIGxldCBfd2F5cG9pbnRzOmFueSA9IFtdO1xyXG4gICAgICBsZXQgX3ZhbGlkYXRpb25FcnJvcnM6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICBcclxuICAgICAgbGV0IF9saXN0ID0gdGhpcy5nZXRXYXlwb2ludHMoKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgX2xpc3QubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgX2VsZW1lbnQgPSBfbGlzdFtpXSBhcyBIVE1MSW5wdXRFbGVtZW50IDtcclxuICAgICAgICBpZiAoX2VsZW1lbnQudmFsdWUubGVuZ3RoID4gMCApIHtcclxuICAgICAgICAgIGlmIChpID09IDEpIHtcclxuICAgICAgICAgICAgX3N0YXJ0V2F5cG9pbnQgPSBfZWxlbWVudC52YWx1ZTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSBfbGlzdC5sZW5ndGgtMSkge1xyXG4gICAgICAgICAgICBfZW5kV2F5cG9pbnQgPSBfZWxlbWVudC52YWx1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIF93YXlwb2ludHMucHVzaCh7bG9jYXRpb246X2VsZW1lbnQudmFsdWUsc3RvcG92ZXI6dHJ1ZX0pOyAgICAgICAgICAgIFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBfdmFsaWRhdGlvbkVycm9ycyA9IHRydWU7IFxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBlbHNlIGlmKF9lbGVtZW50LmlkICE9IFwid2F5cG9pbnRcIiApIHtcclxuICAgICAgICAvLyAgIHRoaXMuX3Nhb3BGbG9hdGluZ0xhYmVsLnNldFZhbGlkYXRpb25FcnJvcihfZWxlbWVudCx0aGlzLl9tc2dSZXF1cmVkKTtcclxuICAgICAgICAvLyAgIF92YWxpZGF0aW9uRXJyb3JzID0gdHJ1ZTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChfdmFsaWRhdGlvbkVycm9ycyA9PSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5fZGlyZWN0aW9uc0Rpc3BsYXkuc2V0KCdkaXJlY3Rpb25zJywgbnVsbCk7IDsgXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBfZG9ibGVEaXN0YW5jZSA9IGZhbHNlO1xyXG4gICAgICBsZXQgX2NiY2hrU3RhcnRFcXVhbEVuZCA9ICQoJyNHb29nbGVNYXBzUm91dGVzJykuZmluZChcIiNjYmNoa1N0YXJ0RXF1YWxFbmRcIik7XHJcbiAgICAgIGlmIChfY2JjaGtTdGFydEVxdWFsRW5kLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBpZiAoX2NiY2hrU3RhcnRFcXVhbEVuZC5pcyhcIjpjaGVja2VkXCIpKXtcclxuICAgICAgICAgIF9kb2JsZURpc3RhbmNlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChfZG9ibGVEaXN0YW5jZSkge1xyXG4gICAgICAgIF93YXlwb2ludHMucHVzaCh7bG9jYXRpb246X2VuZFdheXBvaW50LHN0b3BvdmVyOnRydWV9KTsgXHJcbiAgICAgICAgX2VuZFdheXBvaW50ID0gX3N0YXJ0V2F5cG9pbnQ7ICAgIFxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoX3N0YXJ0V2F5cG9pbnQubGVuZ3RoID4gMCAmJiBfd2F5cG9pbnRzLmxlbmd0aCA+IDAgJiYgX3dheXBvaW50c1swXS5sb2NhdGlvbi5sZW5ndGggPiAwICkge1xyXG4gICAgICAgIHZhciByZXF1ZXN0Omdvb2dsZS5tYXBzLkRpcmVjdGlvbnNSZXF1ZXN0ID0ge1xyXG4gICAgICAgICAgb3JpZ2luOiBfc3RhcnRXYXlwb2ludCxcclxuICAgICAgICAgIGRlc3RpbmF0aW9uOiBfZW5kV2F5cG9pbnQsXHJcbiAgICAgICAgICB3YXlwb2ludHM6IF93YXlwb2ludHMsXHJcbiAgICAgICAgICBvcHRpbWl6ZVdheXBvaW50czogZmFsc2UsXHJcbiAgICAgICAgICB0cmF2ZWxNb2RlOiBnb29nbGUubWFwcy5UcmF2ZWxNb2RlLkRSSVZJTkdcclxuICAgICAgICB9O1xyXG4gIFxyXG4gICAgICAgIHRoaXMucmVuZGVyRGlyZWN0aW9uc1JlcXVlc3QocmVxdWVzdCk7XHJcbiAgICAgIH1cclxuXHJcblxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVuZGVyRGlyZWN0aW9uc1JlcXVlc3QocmVxdWVzdDpnb29nbGUubWFwcy5EaXJlY3Rpb25zUmVxdWVzdCl7XHJcbiAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wR29vZ2xlTWFwcy5yZW5kZXJEaXJlY3Rpb25zUmVxdWVzdFwiKTsgICAgICAgIFxyXG4gICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcEdvb2dsZU1hcHMucmVxdWVzdDogXCIrSlNPTi5zdHJpbmdpZnkocmVxdWVzdCkpOyAgICAgXHJcbiAgICAgIC8vbmFyZWRpIHphaHRldm9cclxuICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgX3RoaXMuX2RpcmVjdGlvbnNTZXJ2aWNlLnJvdXRlKHJlcXVlc3QsIGZ1bmN0aW9uKHJlc3BvbnNlOmFueSwgc3RhdHVzOmFueSkge1xyXG4gICAgICAgIGlmIChzdGF0dXMgPT0gZ29vZ2xlLm1hcHMuRGlyZWN0aW9uc1N0YXR1cy5PSykge1xyXG4gICAgICAgICAgICBfdGhpcy5fZGlyZWN0aW9uc0Rpc3BsYXkuc2V0RGlyZWN0aW9ucyhyZXNwb25zZSk7IC8vIMSMZSBzZSB1c3BlxaFubyB2cm5lLCB1cG9kb2JpIHplbWxqZXZpZFxyXG4gICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICB2YXIgcm91dGVzID0gcmVzcG9uc2Uucm91dGVzO1xyXG4gICAgICAgICAgICB2YXIgZGlzdGFuY2VzID0gW107ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvdXRlcy5sZW5ndGg7IGkrKykge1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciBkaXN0YW5jZSA9IDA7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJvdXRlc1tpXS5sZWdzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gZGlzdGFuY2UgKyAxO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgX3Jvb3REaXN0ID0gcm91dGVzW2ldLmxlZ3Nbal0uZGlzdGFuY2UudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gX3Jvb3REaXN0ICsgZGlzdGFuY2U7XHJcbiAgICAgICAgICAgICAgICAgIC8vZm9yIGVhY2ggJ2xlZycocm91dGUgYmV0d2VlbiB0d28gd2F5cG9pbnRzKSB3ZSBnZXQgdGhlIGRpc3RhbmNlIGFuZCBhZGQgaXQgdG8gXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL0NvbnZlcnQgaW50byBraWxvbWV0ZXJcclxuICAgICAgICAgICAgICAgIGRpc3RhbmNlcy5wdXNoKGRpc3RhbmNlIC8gMTAwMCk7XHJcbiAgICAgICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICAgICAgdmFyIG1heERpc3RhbmNlID0gZGlzdGFuY2VzLnNvcnQoZnVuY3Rpb24oYSwgYikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhIC0gYjtcclxuICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgIC8vRGlzcGxheSBkaXN0YW5jZSBoYXZpbmcgaGlnaGVzdCB2YWx1ZS5cclxuICAgICAgICAgICAgICAgICAgdmFyIG91dHB1dERpdiA9ICQoJyNHb29nbGVNYXBzUm91dGVzJykuZmluZCgnI2Rpc3RhbmNlJyk7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBfX2Rpc3RhbmNlID0gTWF0aC5yb3VuZChtYXhEaXN0YW5jZVtyb3V0ZXMubGVuZ3RoIC0gMV0pO1xyXG4gICAgICAgICAgICAgICAgICAvLyBpZiAoX2RvYmxlRGlzdGFuY2UpIHtcclxuICAgICAgICAgICAgICAgICAgLy8gICBfX2Rpc3RhbmNlID0gX19kaXN0YW5jZSAqIDI7XHJcbiAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgb3V0cHV0RGl2LnZhbChfX2Rpc3RhbmNlKTtcclxuICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgIH0gXHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAvL2FsZXJ0KCdOZWthaiDigIvigItqZSDFoWxvIG5hcm9iZSwgcHJldmVyaXRlIG5hc2xvdmUuJyk7XHJcbiAgICAgICAgICBsZXQgbWVzc2FnZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICAgICAgICBtZXNzYWdlcy5wdXNoKFwiUHJpxaFsbyBqZSBkbyBuYXBha2UgcHJpIGlza2FuanUgcG90aVwiKVxyXG4gICAgICAgICAgX3RoaXMuX3Nhb3BNZXNzYWdlQmFubmVyLnNob3cobWVzc2FnZXMpOyAgICAgICAgICAgICAgICBcclxuICAgICAgICB9XHJcbiAgICAgIH0pOyBcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVmcmVzaE1hcCgpe1xyXG4gICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcEdvb2dsZU1hcHMucmVmcmVzaE1hcFwiKTtcclxuICAgICAgdGhpcy5kZWxheSgxMDAwKS50aGVuKCgpID0+ICQoJyNHb29nbGVNYXBzUm91dGVzJykuZmluZCgnI2J0bkNhbGN1bGF0ZURpc3RhbmNlJykuY2xpY2soKSk7ICAgICBcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbG9hZFJvdXRlc0xpc3QoKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuX3ZpZXdFbGVtZW50ID0gJCgnI0dvb2dsZU1hcHNSb3V0ZXMnKTsgXHJcbiAgICAgIGxldCBfcm91dGVzTGlzdCA9IHRoaXMuX3ZpZXdFbGVtZW50LmZpbmQoJyNSb3V0ZXNMaXN0Jyk7XHJcbiAgICAgIGxldCBfcm91dGVzTGlzdFN0cmluZyA9IF9yb3V0ZXNMaXN0LnZhbCgpIGFzIHN0cmluZztcclxuICAgICAgXHJcbiAgICAgIGlmIChfcm91dGVzTGlzdFN0cmluZy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbGV0IF9yb3V0ZXNBcnJheSA9IF9yb3V0ZXNMaXN0U3RyaW5nLnNwbGl0KFwiO1wiKTtcclxuICAgICAgICB0aGlzLmxvYWRXYXlwb2ludHMoX3JvdXRlc0FycmF5KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmxvYWRXYXlwb2ludHMobnVsbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbG9hZFdheXBvaW50cyhsaXN0OnN0cmluZ1tdKTp2b2lkIHtcclxuICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BHb29nbGVNYXBzLmxvYWRXYXlwb2ludHNcIik7XHJcbiAgICAgIHRoaXMuX3ZpZXdFbGVtZW50ID0gJCgnI0dvb2dsZU1hcHNSb3V0ZXMnKTsgXHJcbiAgICAgIGxldCBfYWxsV2F5cG9pbnRzID0gdGhpcy5fdmlld0VsZW1lbnQuZmluZChcIltkZWxldGUtaWRdXCIpO1xyXG4gICAgICBfYWxsV2F5cG9pbnRzLnJlbW92ZSgpO1xyXG4gICAgICAvL1xyXG4gICAgICBsZXQgX2Rpc3RhbmNlID0gdGhpcy5fdmlld0VsZW1lbnQuZmluZCgnI2Rpc3RhbmNlJyk7XHJcbiAgICAgIGlmIChfZGlzdGFuY2UubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIF9kaXN0YW5jZS52YWwoXCJcIik7XHJcbiAgICAgIH0gICAgICBcclxuICAgICAgLy9cclxuICAgICAgdGhpcy5fdmlld0VsZW1lbnQuZmluZChcIiNzdGFydHBvaW50XCIpLnZhbChcIlwiKTtcclxuICAgICAgdGhpcy5fdmlld0VsZW1lbnQuZmluZChcIiN3YXlwb2ludFwiKS52YWwoXCJcIik7XHJcbiAgICAgIC8vXHJcbiAgICAgIGxldCBfaW5pdFN0YXJ0RW5kV2F5cG9pbnQgPSBmYWxzZTtcclxuICAgICAgaWYgKGxpc3QgPT0gbnVsbCkge1xyXG4gICAgICAgIF9pbml0U3RhcnRFbmRXYXlwb2ludCA9IHRydWU7XHJcbiAgICAgICAgbGlzdCA9IFtdO1xyXG4gICAgICAgIGxpc3QucHVzaChcIlwiKTtcclxuICAgICAgICBsaXN0LnB1c2goXCJcIik7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IF9lbGVtZW50T3JkZXIgPSAwO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAobGlzdFtpXS5sZW5ndGggPiAwIHx8IF9pbml0U3RhcnRFbmRXYXlwb2ludCkge1xyXG4gICAgICAgICAgLy8gaWYgKF9lbGVtZW50T3JkZXIgPT0gMCkge1xyXG4gICAgICAgICAgLy8gICB0aGlzLl92aWV3RWxlbWVudC5maW5kKFwiI3N0YXJ0cG9pbnRcIikudmFsKGxpc3RbaV0pOyAgXHJcbiAgICAgICAgICAvLyB9IGVsc2UgaWYgKF9lbGVtZW50T3JkZXIgPT0gMSkge1xyXG4gICAgICAgICAgLy8gICB0aGlzLl92aWV3RWxlbWVudC5maW5kKFwiI3dheXBvaW50XCIpLnZhbChsaXN0W2ldKTsgIFxyXG4gICAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAgICAgIHRoaXMuYWRkV2F5cG9pbnQobGlzdFtpXSk7XHJcbiAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICBfZWxlbWVudE9yZGVyID0gX2VsZW1lbnRPcmRlciArIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vXHJcbiAgICAgIHRoaXMucmVmcmVzaE1hcCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXREaXN0YW5jZSgpOnN0cmluZ3tcclxuICAgICAgdGhpcy5fdmlld0VsZW1lbnQgPSAkKCcjR29vZ2xlTWFwc1JvdXRlcycpOyBcclxuICAgICAgbGV0IF9kaXN0YW5jZVN0cmluZyA9ICB0aGlzLl92aWV3RWxlbWVudC5maW5kKCcjZGlzdGFuY2UnKS52YWwoKSBhcyBzdHJpbmc7XHJcbiAgICAgIHJldHVybiBfZGlzdGFuY2VTdHJpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9ubW91c2VvdmVyV2F5cG9pbnQoZTphbnkpOnZvaWR7XHJcbiAgICAgIHRoaXMuX3ZpZXdFbGVtZW50ID0gJCgnI0dvb2dsZU1hcHNSb3V0ZXMnKTsgXHJcbiAgICAgIGxldCBfY29udHJvbF9wYW5lbCA9ICQoJyNHb29nbGVNYXBzUm91dGVzJykuZmluZCgnI2NvbnRyb2xfcGFuZWwnKTsgICBcclxuXHJcbiAgICAgIGlmIChfY29udHJvbF9wYW5lbC5jaGlsZHJlbigpLmxlbmd0aCA9PSAzKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgX3dheXBvaW50Um93ID0gJChlKTsgIFxyXG4gICAgICBsZXQgX2RlbGV0ZUJ1dHRvbklkID0gX3dheXBvaW50Um93LmF0dHIoXCJkZWxldGUtaWRcIik7XHJcbiAgICAgICQoJyMnK19kZWxldGVCdXR0b25JZCkuY3NzKFwiZGlzcGxheVwiLFwiYmxvY2tcIik7XHJcbiAgICB9ICAgIFxyXG5cclxuICAgIHB1YmxpYyBvbm1vdXNlb3V0V2F5cG9pbnRGb2N1cyhlOmFueSk6dm9pZHtcclxuICAgICAgdGhpcy5fdmlld0VsZW1lbnQgPSAkKCcjR29vZ2xlTWFwc1JvdXRlcycpOyBcclxuICAgICAgbGV0IF9jb250cm9sX3BhbmVsID0gJCgnI0dvb2dsZU1hcHNSb3V0ZXMnKS5maW5kKCcjY29udHJvbF9wYW5lbCcpOyAgIFxyXG5cclxuICAgICAgaWYgKF9jb250cm9sX3BhbmVsLmNoaWxkcmVuKCkubGVuZ3RoID09IDMpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBfd2F5cG9pbnRSb3cgPSAkKGUpOyAgXHJcbiAgICAgIGxldCBfZGVsZXRlQnV0dG9uSWQgPSBfd2F5cG9pbnRSb3cuYXR0cihcImRlbGV0ZS1pZFwiKTtcclxuICAgICAgJCgnIycrX2RlbGV0ZUJ1dHRvbklkKS5jc3MoXCJkaXNwbGF5XCIsXCJub25lXCIpO1xyXG4gICAgfSAgXHJcblxyXG4gICAgcHJpdmF0ZSBvbmNiY2hrU3RhcnRFcXVhbEVuZENoYW5nZShlOmFueSk6dm9pZCB7XHJcbiAgICAgIC8vIGlmIChlLmN1cnJlbnRUYXJnZXQuY2hlY2tlZCkge1xyXG4gICAgICAvLyAgIGFsZXJ0KCdjaGVja2VkJyk7XHJcbiAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgIC8vICAgYWxlcnQoJ25vdCBjaGVja2VkJyk7XHJcbiAgICAgIC8vIH1cclxuICAgICAgdGhpcy5jYWxjdWxhdGVEaXN0YW5jZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Tb3J0YWJsZUNoYW5nZSgpOnZvaWQge1xyXG4gICAgICB0aGlzLl92aWV3RWxlbWVudC5maW5kKCcjY29udHJvbF9wYW5lbCcpLnNvcnRhYmxlKHtheGlzOid5JyxzdG9wOnRoaXMuY2FsY3VsYXRlRGlzdGFuY2UuYmluZCh0aGlzKX0pOyAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIC8vXHJcbn1cclxuIiwi77u/aW1wb3J0IHsgZ2xvYmFsLCBpc0VtcHR5LCBpc1VuRGVmaW5lZCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcE11bHRpc2VsZWN0LCBTYW9wTXVsdGlzZWxlY3RPcHRpb25zIH0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC1tdWx0aXNlbGVjdFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BXZWJHcmlkVW5pdE9yZ0ZpbHRlciB7XHJcbiAgICBwcml2YXRlIGxpYk5hbWU6IHN0cmluZztcclxuXHJcbiAgICBwdWJsaWMgX3NlbGVjdFNrdXBpbmFJZDogc3RyaW5nO1xyXG4gICAgcHVibGljIF9zZWxlY3RaYXBvc2xlbmlJZDogc3RyaW5nO1xyXG5cclxuICAgIHB1YmxpYyBfc2VsZWN0U2t1cGluYTogU2FvcE11bHRpc2VsZWN0O1xyXG4gICAgcHVibGljIF9zZWxlY3RaYXBvc2xlbmk6IFNhb3BNdWx0aXNlbGVjdDtcclxuXHJcbiAgICBwdWJsaWMgaXpicmFuaVphcG9zbGVuaTogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihsaWJOYW1lOiBzdHJpbmcsIG9yZ1VuaXRGaWx0ZXJJZDogc3RyaW5nID0gXCJcIiwgcGFyZW50RGl2OiBzdHJpbmcgPSBcIlwiKSB7XHJcbiAgICAgICAgdGhpcy5saWJOYW1lID0gbGliTmFtZTtcclxuXHJcbiAgICAgICAgaWYgKCFpc0VtcHR5KHBhcmVudERpdikpIHsgcGFyZW50RGl2ID0gcGFyZW50RGl2ICsgXCIgXCI7IH1cclxuXHJcbiAgICAgICAgdGhpcy5fc2VsZWN0U2t1cGluYUlkID0gcGFyZW50RGl2ICsgXCIjT3JnVW5pdEZpbHRlclwiICsgb3JnVW5pdEZpbHRlcklkO1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdFphcG9zbGVuaUlkID0gcGFyZW50RGl2ICsgXCIjRW1wbG95ZWVzRmlsdGVyXCIgKyBvcmdVbml0RmlsdGVySWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdEZpbHRlckNvbnRyb2xzKCk6IHZvaWQge1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnM6IFNhb3BNdWx0aXNlbGVjdE9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIHNlbGVjdEFsbDogZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdFNrdXBpbmEgPSBuZXcgU2FvcE11bHRpc2VsZWN0KHRoaXMubGliTmFtZSwgb3B0aW9ucyk7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0U2t1cGluYS5hZnRlckNoYW5nZUNvbW1vbkV2ZW50ID0gX3RoaXMuZmlsdGVyU2VsZWN0U2t1cGluYURhdGEuYmluZChfdGhpcyk7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0U2t1cGluYS5pbml0KHRoaXMuX3NlbGVjdFNrdXBpbmFJZCwgXCJTa3VwaW5hIHphIHByaWthelwiKTtcclxuICAgICAgICB2YXIgZGF0YSA9IF90aGlzLl9zZWxlY3RTa3VwaW5hLnNlbGVjdGVkQ0JbMF0uZ2V0QXR0cmlidXRlKFwiZGF0YS1kZWZhdWx0XCIpO1xyXG4gICAgICAgIHZhciB2YWxBcnIgPSBkYXRhLnNwbGl0KFwiLFwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2VsZWN0WmFwb3NsZW5pID0gbmV3IFNhb3BNdWx0aXNlbGVjdCgpO1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdFphcG9zbGVuaS5hZnRlckNoYW5nZUNvbW1vbkV2ZW50ID0gdGhpcy5maWx0ZXJUYWJsZVJvd3MuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLl9zZWxlY3RaYXBvc2xlbmkuaW5pdCh0aGlzLl9zZWxlY3RaYXBvc2xlbmlJZCwgXCJaYXBvc2xlbmkgemEgcHJpa2F6XCIpO1xyXG5cclxuICAgICAgICB0aGlzLl9zZWxlY3RTa3VwaW5hLnNldFNlbGVjdFZhbHVlcyh2YWxBcnIpO1xyXG5cclxuICAgICAgICB2YXIgdm9kamEgPSB0aGlzLl9zZWxlY3RaYXBvc2xlbmkuc2VsZWN0ZWRDQlswXS5nZXRBdHRyaWJ1dGUoXCJkYXRhLWRlZmF1bHRcIik7XHJcbiAgICAgICAgdmFsQXJyID0gdGhpcy5fc2VsZWN0WmFwb3NsZW5pLnNlbGVjdGVkQ0IudmFsKCk7XHJcbiAgICAgICAgaWYgKHZvZGphICE9PSAnJyAmJiBkYXRhLmluZGV4T2Yodm9kamEpID09PSAtMSkge1xyXG4gICAgICAgICAgICB2YWxBcnIucHVzaCh2b2RqYSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3NlbGVjdFphcG9zbGVuaS5zZXRTZWxlY3RWYWx1ZXModmFsQXJyKTtcclxuICAgIH1cclxuXHJcbiAgICBmaWx0ZXJTZWxlY3RTa3VwaW5hRGF0YShlbGVtZW50OiBhbnkpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKHRoaXMubGliTmFtZSArIFwiLmZpbHRlclNlbGVjdFNrdXBpbmFEYXRhXCIpO1xyXG5cclxuICAgICAgICAvLyBwcmViZXJlbW8sIGthdGVyZSBzaWZyZSB6YXBvc2xlbmloIHNvZGlqbyB2IGl6YnJhbmUgc2t1cGluZVxyXG4gICAgICAgIGxldCBpemJyYW5lU2t1cGluZSA9IDxzdHJpbmc+KGVsZW1lbnQudmFsKCkudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgbGV0IGl6YnJhbmVTaWZyZVphcG9zbGVuaWg6IHN0cmluZ1tdID0gbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKGl6YnJhbmVTa3VwaW5lICE9IG51bGwgJiYgaXpicmFuZVNrdXBpbmUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgaXpicmFuZVNpZnJlWmFwb3NsZW5paFN0ciA9IHRoaXMuZ2V0U2VsZXN0ZWRFbXBsb3llZXNJZHMoaXpicmFuZVNrdXBpbmUpO1xyXG4gICAgICAgICAgICBpemJyYW5lU2lmcmVaYXBvc2xlbmloID0gaXpicmFuZVNpZnJlWmFwb3NsZW5paFN0ci5zcGxpdChcIixcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fc2VsZWN0WmFwb3NsZW5pICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0WmFwb3NsZW5pLnNldFNlbGVjdFZhbHVlcyhpemJyYW5lU2lmcmVaYXBvc2xlbmloKTtcclxuICAgICAgICAgICAgdGhpcy5pemJyYW5pWmFwb3NsZW5pID0gdGhpcy5fc2VsZWN0WmFwb3NsZW5pLnNlbGVjdGVkQ0IudmFsKCkudG9TdHJpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZmlsdGVyVGFibGVSb3dzKCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcodGhpcy5saWJOYW1lICsgXCIuZmlsdGVyVGFibGVSb3dzXCIpO1xyXG5cclxuICAgICAgICAvLyBmaWx0ZXIgZ2xlZGUgbmEgaXpicmFuZSBzaWZyZSB6YXBvc2xlbmloXHJcbiAgICAgICAgaWYgKHRoaXMuX3NlbGVjdFphcG9zbGVuaSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlclNlbGVjdFphcG9zbGVuaURhdGEodGhpcy5fc2VsZWN0WmFwb3NsZW5pLnNlbGVjdGVkQ0IpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmaWx0ZXJTZWxlY3RaYXBvc2xlbmlEYXRhKGVsZW1lbnQ6IGFueSkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcodGhpcy5saWJOYW1lICsgXCIuZmlsdGVyU2VsZWN0WmFwb3NsZW5pRGF0YVwiKTtcclxuXHJcbiAgICAgICAgLy8gcHJlYmVyZW1vLCBrYXRlcmUgc2lmcmUgemFwb3NsZW5paCBzb2Rpam8gdiBpemJyYW5lIHNrdXBpbmVcclxuICAgICAgICBsZXQgaXpicmFuZVNpZnJlWmFwb3NsZW5paCA9IDxzdHJpbmc+KGVsZW1lbnQudmFsKCkudG9TdHJpbmcoKSk7XHJcblxyXG4gICAgICAgIC8vIGZpbHRlciB2cnN0aWNcclxuICAgICAgICB0aGlzLmZpbHRlclphcG9zbGVuaVRhYmxlUm93cyhpemJyYW5lU2lmcmVaYXBvc2xlbmloKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgZ2V0U2VsZXN0ZWRFbXBsb3llZXNJZHMoaXpicmFuZVNrdXBpbmU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1Zyh0aGlzLmxpYk5hbWUgKyBcIi5nZXRTZWxlc3RlZEVtcGxveWVlc0lkc1wiKTtcclxuXHJcbiAgICAgICAgbGV0IHNlbGVjdGVkRW1wbG95ZWVzSWRzOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIGxldCBhcnJheUl6YnJhbmVTa3VwaW5lID0gaXpicmFuZVNrdXBpbmUuc3BsaXQoJywnKTtcclxuICAgICAgICBmb3IgKHZhciBpbmQgPSAwOyBpbmQgPCBhcnJheUl6YnJhbmVTa3VwaW5lLmxlbmd0aDsgaW5kKyspIHtcclxuICAgICAgICAgICAgaWYgKGFycmF5SXpicmFuZVNrdXBpbmVbaW5kXSAhPSBudWxsICYmIGFycmF5SXpicmFuZVNrdXBpbmVbaW5kXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBwcmViZXJlbW8gc2V6bmFtIHphcG9zbGVuaWggaXogaGlkZGVuIHRleHQgaHRtbCBlbGVtZW50b3ZcclxuICAgICAgICAgICAgICAgIGxldCBoaWRkZXRUZXh0SHRtbElkID0gXCIjc2lmcmFFbm90ZU9yZ1N0cnVrdHVyZVwiICsgYXJyYXlJemJyYW5lU2t1cGluZVtpbmRdLnRyaW0oKTtcclxuICAgICAgICAgICAgICAgIGxldCB2YWx1ID0gJChoaWRkZXRUZXh0SHRtbElkKS52YWwoKTtcclxuICAgICAgICAgICAgICAgIHZhbHUgPSB2YWx1LnRvU3RyaW5nKCkudHJpbSgpXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEVtcGxveWVlc0lkcyA9IHNlbGVjdGVkRW1wbG95ZWVzSWRzICsgdmFsdTtcclxuICAgICAgICAgICAgICAgIGlmIChpbmQgPCAoYXJyYXlJemJyYW5lU2t1cGluZS5sZW5ndGggLSAxKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRW1wbG95ZWVzSWRzID0gc2VsZWN0ZWRFbXBsb3llZXNJZHMgKyBcIixcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc2VsZWN0ZWRFbXBsb3llZXNJZHM7XHJcbiAgICB9XHJcblxyXG4gICAgZmlsdGVyWmFwb3NsZW5pVGFibGVSb3dzKGZpbHRlclphcG9zbGVuaTogc3RyaW5nKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1Zyh0aGlzLmxpYk5hbWUgKyBcIi5maWx0ZXJaYXBvc2xlbmlUYWJsZVJvd3NcIik7XHJcblxyXG4gICAgICAgIC8vLy8gRGVjbGFyZSB2YXJpYWJsZXNcclxuICAgICAgICAvL3ZhciB0YWJsZSwgdHIsIF9yb3dJZCwgaSwgdHh0VmFsdWU7XHJcbiAgICAgICAgLy90YWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuX3RhYmxlTmFtZSk7XHJcbiAgICAgICAgLy90ciA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidHJcIik7XHJcbiAgICAgICAgLy8vLyBMb29wIHRocm91Z2ggYWxsIHRhYmxlIHJvd3MsIGFuZCBoaWRlIHRob3NlIHdobyBkb24ndCBtYXRjaCB0aGUgc2VhcmNoIHF1ZXJ5XHJcbiAgICAgICAgLy9mb3IgKGkgPSAwOyBpIDwgdHIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAvLyAgICBfcm93SWQgPSBudWxsO1xyXG4gICAgICAgIC8vICAgIGxldCBfdHJJZCA9ICQodHJbaV0pLmF0dHIoXCJkYXRhLXNpZnJhLXphcG9zbGVuaVwiKTtcclxuICAgICAgICAvLyAgICBpZiAoIWlzVW5EZWZpbmVkKF90cklkKSkge1xyXG4gICAgICAgIC8vICAgICAgICBfcm93SWQgPSBfdHJJZC50b1N0cmluZygpXHJcbiAgICAgICAgLy8gICAgfVxyXG5cclxuICAgICAgICAvLyAgICBpZiAoX3Jvd0lkKSB7XHJcbiAgICAgICAgLy8gICAgICAgIHR4dFZhbHVlID0gX3Jvd0lkLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgLy8gICAgICAgIGlmIChpc0VtcHR5KGZpbHRlclphcG9zbGVuaSkpIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICQodHJbaV0pLmFkZENsYXNzKFwiZWxlbWVudC1oaWRkZW5cIik7XHJcbiAgICAgICAgLy8gICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyWmFwb3NsZW5pLnRvVXBwZXJDYXNlKCkuaW5kZXhPZih0eHRWYWx1ZSkgPiAtMSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgJCh0cltpXSkucmVtb3ZlQ2xhc3MoXCJlbGVtZW50LWhpZGRlblwiKTtcclxuICAgICAgICAvLyAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICQodHJbaV0pLmFkZENsYXNzKFwiZWxlbWVudC1oaWRkZW5cIik7XHJcbiAgICAgICAgLy8gICAgICAgIH1cclxuICAgICAgICAvLyAgICB9XHJcbiAgICAgICAgLy99XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/Ly8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9kYXRhLXRhYmxlcy90eXBlcy5kLnRzXCIgLz5cclxuaW1wb3J0IHsgU2FvcElucHV0V0ZMLFNhb3BJbnB1dFdGTFByb3BlcnRpZXMgfSBmcm9tICcuL3Nhb3AtaW5wdXQtd2ZsJ1xyXG5pbXBvcnQgeyBTYW9wc2VsZWN0V0ZMIH0gZnJvbSAnLi9zYW9wLXNlbGVjdC13ZmwnXHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFdlYkdyaWRGaWx0ZXIge1xyXG4gIHB1YmxpYyBpZDpzdHJpbmcgPSBcIndnZjFcIjtcclxuICBwdWJsaWMgbW9kYWxGaWx0ZXJBcnJheTogYW55ID0gW107XHJcbiAgLy9UaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBjb250ZW50IGluc2lkZSB0aGUgZmlsdGVyIG1vZGFsXHJcbiAgY29uZmlnRmlsdGVyKGxpYk5hbWU6c3RyaW5nLGh0bWxUYWJsZTogYW55LCBjb2xBcnJheTogYW55KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciB0YWJsZU5hbWUgPSBodG1sVGFibGVbMF0uaWQ7XHJcbiAgICAgIHZhciBjb2x1bW5zID0gaHRtbFRhYmxlLmFwaSgpLmNvbHVtbnMoKTtcclxuICAgICAgJC5lYWNoKGNvbEFycmF5LCBmdW5jdGlvbiAoaSwgYXJnKSB7XHJcbiAgICAgICAgbGV0IF9jb2xObyA9IGFyZy50b1N0cmluZygpO1xyXG4gICAgICAgICQoJyMnICsgdGFibGVOYW1lICsgJyB0aDplcSgnICsgX2NvbE5vICsgJyknKS5hdHRyKFwiaWRcIixcImNvbHVtbi1oZWFkZXItXCIrIF9jb2xObyArXCJcIik7XHJcbiAgICAgICAgJCgnIycgKyB0YWJsZU5hbWUgKyAnIHRoOmVxKCcgKyBfY29sTm8gKyAnKScpLmFwcGVuZCgnPHNwYW4gaWQ9XCJjb2x1bW4taGVhZGVyLScrIF9jb2xObyArJy1maWx0ZXJcIiBjbGFzcz1cInNhb3AtaW1nLWZpbHRlciBzaS14c1wiIG9uY2xpY2s9XCInK2xpYk5hbWUrJy53ZWJHcmlkRmlsdGVyLnNob3dGaWx0ZXIoZXZlbnQsXFwnJyArIHRhYmxlTmFtZSArICdfJyArIF9jb2xObyArICdcXCcpO1wiPjwvc3Bhbj4nKTtcclxuICAgICAgICAkKCcjJyArIHRhYmxlTmFtZSArICcgdGg6ZXEoJyArIF9jb2xObyArICcpJykuYXBwZW5kKFwiPHNwYW4gaWQ9J2NvbHVtbi1oZWFkZXItXCIrIF9jb2xObyArXCItc29ydCcgY2xhc3M9Jyc+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9zcGFuPlwiKTtcclxuICAgICAgICAkKCcjJyArIHRhYmxlTmFtZSArICcgdGg6ZXEoJyArIF9jb2xObyArICcpJykuYXBwZW5kKFwiPGRpdiBpZD0nY29sdW1uLWhlYWRlci1cIisgX2NvbE5vICtcIi1zaXplcic+XCIpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHZhciB0ZW1wbGF0ZSA9XHJcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJtb2RhbEZpbHRlclwiPicgK1xyXG4gICAgICAgICc8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPicgK1xyXG4gICAgICAgICd7MH08L2Rpdj4nICtcclxuICAgICAgICAnPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPicgK1xyXG4gICAgICAgICc8YSBocmVmPVwiIyFcIiBvbmNsaWNrPVwiJytsaWJOYW1lKycud2ViR3JpZEZpbHRlci5wZXJmb3JtRmlsdGVyKHRoaXMsIHsxfSwgXFwnezJ9XFwnKTtcIiAgY2xhc3M9XCIgYnRuIHJpZ2h0IHdhdmVzLWVmZmVjdCB3YXZlcy1saWdodFwiPlYgcmVkdTwvYT4nICsgICAgICAgIFxyXG4gICAgICAgICc8YSBocmVmPVwiIyFcIiBvbmNsaWNrPVwiJytsaWJOYW1lKycud2ViR3JpZEZpbHRlci5jbGVhckZpbHRlcih0aGlzLCB7MX0sIFxcJ3syfVxcJyk7XCIgIGNsYXNzPVwiIGJ0biBsZWZ0IHdhdmVzLWVmZmVjdCB3YXZlcy1saWdodFwiPlpicmnFoWk8L2E+JyArXHJcbiAgICAgICAgJzxhIGhyZWY9XCIjIVwiIG9uY2xpY2s9XCInK2xpYk5hbWUrJy53ZWJHcmlkRmlsdGVyLmhpZGVGaWx0ZXIoKTtcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIGNsYXNzPVwiIGJ0biBsZWZ0IHdhdmVzLWVmZmVjdCB3YXZlcy1saWdodFwiPlByZWtsacSNaTwvYT4nICtcclxuICAgICAgICAnPC9kaXY+JyArXHJcbiAgICAgICAgJzwvZGl2Pic7XHJcblxyXG4gICAgICAkLmVhY2goY29sQXJyYXksIGZ1bmN0aW9uIChpbmRleDogYW55LCB2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgY29sdW1ucy5ldmVyeShmdW5jdGlvbiAoaTogYW55KSB7XHJcbiAgICAgICAgICBpZiAodmFsdWUgPT09IGkpIHtcclxuICAgICAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMsIFxyXG4gICAgICAgICAgICBjb250ZW50ID0gJyc7Ly8nPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmaWx0ZXJTZWFyY2hUZXh0XCIgb25rZXl1cD1cImZpbHRlclZhbHVlcyh0aGlzKVwiIC8+IDxici8+JztcclxuICAgICAgICAgICAgdmFyIGNvbHVtbk5hbWUgPSAkKHRoaXMuaGVhZGVyKCkpLnRleHQoKS5yZXBsYWNlKC9cXHMrL2csIFwiX1wiKTtcclxuICAgICAgICAgICAgdmFyIGRpc3RpbmN0QXJyYXk6IGFueVtdID0gW107XHJcbiAgICAgICAgICAgIGNvbHVtbi5kYXRhKCkuZWFjaChmdW5jdGlvbiAoZDogc3RyaW5nLCBqOiBhbnkpIHtcclxuICAgICAgICAgICAgICBpZiAoZGlzdGluY3RBcnJheS5pbmRleE9mKGQpID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaWQgPSB0YWJsZU5hbWUgKyBcIl9cIiArIGNvbHVtbk5hbWUgKyBcIl9cIiArIGo7IC8vIG9uY2hhbmdlPVwiZm9ybWF0VmFsdWVzKHRoaXMsJyArIHZhbHVlICsgJyk7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50ICs9ICc8ZGl2PjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiB2YWx1ZT1cIicgKyBkICsgJ1wiICBpZD1cIicgKyBpZCArICdcIi8+PGxhYmVsIGZvcj1cIicgKyBpZCArICdcIj4gJyArIGQgKyAnPC9sYWJlbD48L2Rpdj4nO1xyXG4gICAgICAgICAgICAgICAgZGlzdGluY3RBcnJheS5wdXNoKGQpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7IFxyXG4gICAgICAgICAgICB2YXIgbmV3VGVtcGxhdGUgPSAkKHRlbXBsYXRlLnJlcGxhY2UoJ3swfScsIGNvbnRlbnQpLnJlcGxhY2UoJ3sxfScsIHZhbHVlKS5yZXBsYWNlKCd7MX0nLCB2YWx1ZSkucmVwbGFjZSgnezJ9JywgdGFibGVOYW1lKS5yZXBsYWNlKCd7Mn0nLCB0YWJsZU5hbWUpKTtcclxuICAgICAgICAgICAgJCgnYm9keScpLmFwcGVuZChuZXdUZW1wbGF0ZSk7XHJcbiAgICAgICAgICAgIF90aGlzLm1vZGFsRmlsdGVyQXJyYXlbdGFibGVOYW1lICsgXCJfXCIgKyB2YWx1ZV0gPSBuZXdUZW1wbGF0ZTtcclxuICAgICAgICAgICAgY29udGVudCA9ICcnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0sIDUwKTtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgLy9Vc2VyIHRvIHNob3cgdGhlIGZpbHRlciBtb2RhbFxyXG4gIHNob3dGaWx0ZXIoZTogYW55LCBpbmRleDogYW55KSB7XHJcbiAgICAkKCcubW9kYWxGaWx0ZXInKS5oaWRlKCk7XHJcbiAgICAkKHRoaXMubW9kYWxGaWx0ZXJBcnJheVtpbmRleF0pLmNzcyh7IGxlZnQ6IDAsIHRvcDogMCB9KTtcclxuICAgIHZhciB0aCA9ICQoZS50YXJnZXQpLnBhcmVudCgpO1xyXG4gICAgdmFyIHBvcyA9IHRoLm9mZnNldCgpO1xyXG4gICAgbGV0IGFycmF5SXRlbSA9IHRoaXMubW9kYWxGaWx0ZXJBcnJheVtpbmRleF07XHJcbiAgICAvLyQodGhpcy5tb2RhbEZpbHRlckFycmF5W2luZGV4XSkud2lkdGgodGgud2lkdGgoKSAqIDAuNzUpO1xyXG4gICAgJChhcnJheUl0ZW0pLmNzcyh7ICdsZWZ0JzogcG9zLmxlZnQsICd0b3AnOiBwb3MudG9wLCAnbWluLXdpZHRoJzoodGgud2lkdGgoKSAqIDAuNzUpIH0pO1xyXG4gICAgJChhcnJheUl0ZW0pLnNob3coKTtcclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVUYWJsZUhlYWRlclN0YXR1cyh0YWJsZUlkOnN0cmluZyxjb2x1bW5JZDpzdHJpbmcsYWN0aXZlRmlsdGVyOmJvb2xlYW4pe1xyXG4gICAgbGV0IF9jb2xGaWx0ZXJJZCA9IGNvbHVtbklkK1wiLWZpbHRlclwiO1xyXG4gICAgbGV0IF9jb2xGaWx0ZXIgPSAkKHRhYmxlSWQpLmZpbmQoX2NvbEZpbHRlcklkKVswXTtcclxuICAgIGxldCBfY29sRmlsdGVyQXRyID0gX2NvbEZpbHRlci5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKTtcclxuICAgIGlmKGFjdGl2ZUZpbHRlcil7XHJcbiAgICAgICAgX2NvbEZpbHRlckF0ci5yZXBsYWNlKFwic2FvcC1pbWctZmlsdGVyXCIsIFwic2FvcC1pbWctZmlsdGVyIHNhb3AtY2wtYmx1ZVwiKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgX2NvbEZpbHRlckF0ci5yZXBsYWNlKFwic2FvcC1pbWctZmlsdGVyIHNhb3AtY2wtYmx1ZVwiLCBcInNhb3AtaW1nLWZpbHRlclwiKTtcclxuICAgXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL1RoaXMgZnVuY3Rpb24gaXMgdG8gdXNlIHRoZSBzZWFyY2hib3ggdG8gZmlsdGVyIHRoZSBjaGVja2JveFxyXG4gIGZpbHRlclZhbHVlcyhub2RlOiBhbnkpIHtcclxuICAgIHZhciBzZWFyY2hTdHJpbmcgPSAkKG5vZGUpLnZhbCgpLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKS50cmltKCk7XHJcbiAgICB2YXIgcm9vdE5vZGUgPSAkKG5vZGUpLnBhcmVudCgpO1xyXG4gICAgaWYgKHNlYXJjaFN0cmluZyA9PSAnJykge1xyXG4gICAgICByb290Tm9kZS5maW5kKCdkaXYnKS5zaG93KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByb290Tm9kZS5maW5kKFwiZGl2XCIpLmhpZGUoKTtcclxuICAgICAgcm9vdE5vZGUuZmluZChcImRpdjpjb250YWlucygnXCIgKyBzZWFyY2hTdHJpbmcgKyBcIicpXCIpLnNob3coKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vRXhlY3V0ZSB0aGUgZmlsdGVyIG9uIHRoZSB0YWJsZSBmb3IgYSBnaXZlbiBjb2x1bW5cclxuICBwZXJmb3JtRmlsdGVyKG5vZGU6IGFueSwgaTogYW55LCB0YWJsZUlkOiBhbnkpIHtcclxuICAgIHZhciByb290Tm9kZSA9ICQobm9kZSkucGFyZW50KCkucGFyZW50KCk7XHJcbiAgICB2YXIgc2VhcmNoU3RyaW5nID0gJycsIGNvdW50ZXIgPSAwO1xyXG5cclxuICAgIHJvb3ROb2RlLmZpbmQoJ2lucHV0OmNoZWNrYm94JykuZWFjaChmdW5jdGlvbiAoaW5kZXg6IGFueSwgY2hlY2tib3g6IGFueSkge1xyXG4gICAgICBpZiAoY2hlY2tib3guY2hlY2tlZCkge1xyXG4gICAgICAgIHNlYXJjaFN0cmluZyArPSAoY291bnRlciA9PSAwKSA/IGNoZWNrYm94LnZhbHVlIDogJ3wnICsgY2hlY2tib3gudmFsdWU7XHJcbiAgICAgICAgY291bnRlcisrO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBsZXQgX2NvbElkID0gXCIjY29sdW1uLWhlYWRlci1cIitpLnRvU3RyaW5nKCk7XHJcbiAgICBpZihjb3VudGVyID4gMCl7XHJcbiAgICAgIHRoaXMudXBkYXRlVGFibGVIZWFkZXJTdGF0dXMoJyMnICt0YWJsZUlkLF9jb2xJZCx0cnVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudXBkYXRlVGFibGVIZWFkZXJTdGF0dXMoJyMnICt0YWJsZUlkLF9jb2xJZCxmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgJCgnIycgKyB0YWJsZUlkKS5EYXRhVGFibGUoKS5jb2x1bW4oaSkuc2VhcmNoKFxyXG4gICAgICBzZWFyY2hTdHJpbmcsXHJcbiAgICAgIHRydWUsIGZhbHNlXHJcbiAgICApLmRyYXcoKTtcclxuICAgIHJvb3ROb2RlLmhpZGUoKTtcclxuICB9XHJcblxyXG4gIC8vUmVtb3ZlcyB0aGUgZmlsdGVyIGZyb20gdGhlIHRhYmxlIGZvciBhIGdpdmVuIGNvbHVtblxyXG4gIGNsZWFyRmlsdGVyKG5vZGU6IGFueSwgaTogYW55LCB0YWJsZUlkOiBhbnkpIHtcclxuICAgIHZhciByb290Tm9kZSA9ICQobm9kZSkucGFyZW50KCkucGFyZW50KCk7XHJcbiAgICByb290Tm9kZS5maW5kKFwiLmZpbHRlclNlYXJjaFRleHRcIikudmFsKCcnKTtcclxuICAgIHJvb3ROb2RlLmZpbmQoJ2lucHV0OmNoZWNrYm94JykuZWFjaChmdW5jdGlvbiAoaW5kZXg6IGFueSwgY2hlY2tib3g6IGFueSkge1xyXG4gICAgICBjaGVja2JveC5jaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICQoY2hlY2tib3gpLnBhcmVudCgpLnNob3coKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGxldCBfY29sSWQgPSBcIiNjb2x1bW4taGVhZGVyLVwiK2kudG9TdHJpbmcoKTtcclxuICAgIHRoaXMudXBkYXRlVGFibGVIZWFkZXJTdGF0dXMoJyMnICt0YWJsZUlkLF9jb2xJZCxmYWxzZSk7XHJcblxyXG4gICAgJCgnIycgKyB0YWJsZUlkKS5EYXRhVGFibGUoKS5jb2x1bW4oaSkuc2VhcmNoKFxyXG4gICAgICAnJyxcclxuICAgICAgdHJ1ZSwgZmFsc2VcclxuICAgICkuZHJhdygpO1xyXG4gICAgcm9vdE5vZGUuaGlkZSgpO1xyXG4gIH1cclxuXHJcbiAgaGlkZUZpbHRlcihub2RlOiBhbnksIGk6IGFueSwgdGFibGVJZDogYW55KSB7XHJcbiAgICAkKCcubW9kYWxGaWx0ZXInKS5oaWRlKCk7XHJcbiAgfVxyXG5cclxuICBzZXRSZXNpemVFdmVudChncmlkSWQ6c3RyaW5nKXtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICB2YXIgX3RhYmxlRGl2ID0gJChcInRhYmxlXCIrZ3JpZElkK1wiIHRoXCIpIGFzIGFueTtcclxuICAgIHZhciB0aEhlaWdodCA9ICQoXCJ0YWJsZVwiK2dyaWRJZCtcIiB0aDpmaXJzdFwiKS5oZWlnaHQoKTtcclxuXHRfdGFibGVEaXYucmVzaXphYmxlKHtcclxuICAgICAgaGFuZGxlczogXCJlXCIsXHJcblx0ICBtaW5IZWlnaHQ6IHRoSGVpZ2h0LFxyXG4gICAgICBtYXhIZWlnaHQ6IHRoSGVpZ2h0LFxyXG4gICAgICBtaW5XaWR0aDogNDAsXHJcbiAgICAgIHN0YXJ0OiBmdW5jdGlvbiAoZXZlbnQ6IGFueSwgdWk6IGFueSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwicmVzaXplIHN0YXJ0XCIpO1xyXG4gICAgICB9LFxyXG4gICAgICBzdG9wOiBmdW5jdGlvbiAoZXZlbnQ6IGFueSwgdWk6IGFueSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwicmVzaXplIHN0b3BcIik7XHJcbiAgICAgIH0sXHJcblx0ICByZXNpemU6IGZ1bmN0aW9uIChldmVudDphbnksIHVpOmFueSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwicmVzaXplLi4uXCIpO1xyXG4gICAgICAgIHZhciBzaXplcmlkID0gXCIjXCIgKyAkKGV2ZW50LnRhcmdldCkuYXR0cihcImlkXCIpICsgXCItc2l6ZXJcIjtcclxuICAgICAgICAkKHNpemVyaWQpLndpZHRoKHVpLnNpemUud2lkdGgpO1xyXG5cdCAgfVxyXG5cdH0pOyAgICBcclxuXHJcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgX3RoaXMuc2V0VGFibGVDb2x1bW5zTWluQ29sdW1uc1dpZHRoKGdyaWRJZCk7XHJcbiAgICB9LCAxMDAwKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRUYWJsZUNvbHVtbnNNaW5Db2x1bW5zV2lkdGgoZ3JpZElkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBjb2xzV2lkdGggPSB0aGlzLmdldFRhYmxlQ29sdW1uc1dpZHRoKGdyaWRJZCk7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xzV2lkdGgubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGluZCA9IGkgKyAxO1xyXG4gICAgICBsZXQgX2NvbCA9ICQoZ3JpZElkICsgXCIgdHIgdGg6bnRoLWNoaWxkKFwiICsgaW5kICsgXCIpXCIpO1xyXG4gICAgICBsZXQgX3NldFcgPSAhX2NvbC5oYXNDbGFzcyhcIm5vLXNvcnRcIik7XHJcbiAgICAgIC8vaWYgKF9zZXRXKXtcclxuICAgICAgICAkKGdyaWRJZCArIFwiIHRyIHRoOm50aC1jaGlsZChcIiArIGluZCArIFwiKVwiKS5jc3MoeyBcIm1pbi13aWR0aFwiOiBjb2xzV2lkdGhbaV0gKyBcInB4XCIgfSk7XHJcbiAgICAgICAgJChncmlkSWQgKyBcIiB0ciB0ZDpudGgtY2hpbGQoXCIgKyBpbmQgKyBcIilcIikuY3NzKHsgXCJtaW4td2lkdGhcIjogY29sc1dpZHRoW2ldICsgXCJweFwiIH0pO1xyXG4gICAgICAvL31cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0VGFibGVDb2x1bW5zV2lkdGgoZ3JpZElkOiBzdHJpbmcpOiBudW1iZXJbXSB7XHJcbiAgICBsZXQgY29sV2lkdGg6IG51bWJlcltdID0gW107XHJcbiAgICAkKGdyaWRJZCArICcgdHI6bnRoLWNoaWxkKDEpID4gdGQnKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgY29sV2lkdGgucHVzaCgkKHRoaXMpLm91dGVyV2lkdGgoKSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBwcmV2ZXJpbW8sIMSNZSBqZSBrYWogemFwaXNvdi4gQ2UgbmksIG1vcmFtbyB2emV0aSB2cnN0aWNvIHogaW1lbmkgc3RvbHBjZXZcclxuICAgIGlmIChjb2xXaWR0aC5sZW5ndGggPD0gMSkge1xyXG4gICAgICBjb2xXaWR0aCA9IFtdO1xyXG5cclxuICAgICAgJChncmlkSWQgKyAnIHRyOm50aC1jaGlsZCgxKSA+IHRoJykuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgY29sV2lkdGgucHVzaCgkKHRoaXMpLm91dGVyV2lkdGgoKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjb2xXaWR0aFxyXG4gIH1cclxuXHJcbiAgc2V0U29ydEVsZW1lbnRFdmVudChncmlkSWQ6IHN0cmluZyk6dm9pZHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAkKGdyaWRJZCkub24oJ2NsaWNrJywgJ3RoJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICBfdGhpcy5zZXRTb3J0RWxlbWVudChncmlkSWQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIFxyXG4gIHNldFNvcnRFbGVtZW50KGdyaWRJZDogc3RyaW5nKTp2b2lkIHtcclxuICAgICAgJChcIlwiICsgZ3JpZElkICsgXCIgdGhlYWQ6Zmlyc3QgdGhcIikuZWFjaChmdW5jdGlvbiAoaSwgdGgpIHtcclxuICAgICAgICBsZXQgX2NvbCA9ICQodGgpO1xyXG4gICAgICAgIGxldCBfY29sSWQgPSBcIiNcIitfY29sLmF0dHIoJ2lkJyk7XHJcbiAgICAgICAgLy9sZXQgX3NvcnRUeXBlID0gX2NvbC5hdHRyKFwiY29sdW1uLXNvcnRcIik7XHJcbiAgICAgICAgbGV0IF9jb2xJY29uSWRVcCA9IF9jb2xJZCtcIi1pY29uLXVwXCI7XHJcbiAgICAgICAgbGV0IF9jb2xJY29uSWQgPSBfY29sSWQrXCItaWNvblwiO1xyXG4gICAgICAgIGxldCBfY29sSWNvblVwRWxlbWVudCA9ICQoZ3JpZElkKycgJytfY29sSWNvbklkVXApO1xyXG4gICAgICAgIGxldCBfY29sSWNvbkVsZW1lbnQgPSAkKGdyaWRJZCsnICcrX2NvbEljb25JZCk7XHJcbiAgICAgICAgbGV0IGNscyA9ICQodGgpLmF0dHIoJ2NsYXNzJyk7XHJcblxyXG4gICAgICAgIC8vaWYgKF9zb3J0VHlwZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICBpZiAoY2xzICE9IG51bGwgJiYgY2xzLmluZGV4T2YoXCJuby1zb3J0XCIpID49IDApIHtcclxuICAgICAgICAgICAgX2NvbEljb25VcEVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy1kb3duXCIpO1xyXG4gICAgICAgICAgICBfY29sSWNvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy11cFwiKTtcclxuICAgICAgICAgICAgX2NvbEljb25FbGVtZW50LnJlbW92ZUNsYXNzKFwic2FvcC1pbWctYXJyb3ctZG93blwiKTsgICAgICAgICBcclxuICAgICAgICAgICAgX2NvbEljb25FbGVtZW50LnJlbW92ZUNsYXNzKFwic2FvcC1jbC1ibHVlXCIpOyAgICAgICAgICAgICBcclxuICAgICAgICAgIH0gICAgICAgICAgXHJcbiAgICAgICAgICBlbHNlIGlmIChjbHMgIT0gbnVsbCAmJiBjbHMuaW5kZXhPZihcInNvcnRpbmdfYXNjXCIpID49IDApIHtcclxuICAgICAgICAgICAgX2NvbEljb25VcEVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy1kb3duXCIpO1xyXG4gICAgICAgICAgICBfY29sSWNvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy1kb3duXCIpO1xyXG4gICAgICAgICAgICBfY29sSWNvbkVsZW1lbnQuYWRkQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy11cCBzYW9wLWNsLWJsdWVcIik7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGNscyAhPSBudWxsICYmIGNscy5pbmRleE9mKFwic29ydGluZ19kZXNjXCIpID49IDApIHtcclxuICAgICAgICAgICAgX2NvbEljb25VcEVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy1kb3duXCIpO1xyXG4gICAgICAgICAgICBfY29sSWNvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy11cFwiKTtcclxuICAgICAgICAgICAgX2NvbEljb25FbGVtZW50LmFkZENsYXNzKFwic2FvcC1pbWctYXJyb3ctZG93biBzYW9wLWNsLWJsdWVcIik7ICAgICAgICAgICAgXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBfY29sSWNvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy11cFwiKTtcclxuICAgICAgICAgICAgX2NvbEljb25FbGVtZW50LnJlbW92ZUNsYXNzKFwic2FvcC1pbWctYXJyb3ctZG93blwiKTsgICAgICAgICBcclxuICAgICAgICAgICAgX2NvbEljb25FbGVtZW50LnJlbW92ZUNsYXNzKFwic2FvcC1jbC1ibHVlXCIpOyAgIFxyXG4gICAgICAgICAgICBfY29sSWNvbkVsZW1lbnQuYWRkQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy11cFwiKTtcclxuICAgICAgICAgICAgX2NvbEljb25VcEVsZW1lbnQuYWRkQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy1kb3duXCIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIC8vfVxyXG4gICAgICB9KTtcclxuICB9IFxyXG5cclxuICBjb25maWdTaW1wbGVGaWx0ZXIoZGF0YVRhYmxlOiBhbnkpOnZvaWQge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCB0YWJsZUlkID0gXCIjXCIrZGF0YVRhYmxlWzBdLmlkO1xyXG4gICAgbGV0IF9pQ291bnQgPSAwO1xyXG4gICAgdmFyIF9maWx0ZXJFbmFibGUgPSBmYWxzZTtcclxuICAgIGxldCBfdGhfY29sdW1ucyA9ICQodGFibGVJZCkuZmluZCgndGgnKTtcclxuICAgIF90aF9jb2x1bW5zLmVhY2goIFxyXG4gICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgX2lDb3VudCA9IF9pQ291bnQgKyAxO1xyXG4gICAgICAgIGxldCBfZWxlbWVudCA9ICQodGhpcyk7XHJcbiAgICAgICAgbGV0IF9maWx0ZXJUeXBlID0gX2VsZW1lbnQuYXR0cihcImNvbHVtbi1maWx0ZXJcIik7ICAgXHJcbiAgICAgICAgbGV0IF9ub3NvcnQgPSBfZWxlbWVudC5oYXNDbGFzcyhcIm5vLXNvcnRcIik7XHJcbiAgICAgICAgbGV0IF9ub1Jlc2l6ZSA9IF9lbGVtZW50Lmhhc0NsYXNzKFwibm8tcmVzaXplXCIpO1xyXG4gICAgICAgIGxldCBfYWN0aW9uQ29sdW1uID0gX2VsZW1lbnQuaGFzQ2xhc3MoXCJzYW9wLXRhYmxlLXRoLWxhc3RcIik7XHJcbiAgICAgICAgbGV0IF9kdF9jaGVja2JveGVzX2NlbGwgPSBfZWxlbWVudC5oYXNDbGFzcyhcImR0LWNoZWNrYm94ZXMtY2VsbFwiKTtcclxuICAgICAgICBfZWxlbWVudC5hdHRyKFwiaWRcIixcImNvbHVtbi1oZWFkZXItXCIrIF9pQ291bnQgK1wiXCIpO1xyXG4gICAgICAgIF9lbGVtZW50LmNzcyhcIm91dGxpbmVcIixcIm5vbmVcIik7XHJcbiAgICAgICAgbGV0IGNvbF90aXRsZSA9IF9lbGVtZW50LnRleHQoKTtcclxuICAgICAgICAvL2xldCBjb2xfbWF4X3dpZHRoID0gY29sX3RpdGxlLmxlbmd0aCAqIDc7XHJcbiAgICAgICAgaWYgKF9kdF9jaGVja2JveGVzX2NlbGwgIT0gbnVsbCAmJiBfZHRfY2hlY2tib3hlc19jZWxsID09IHRydWUpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgX2VsZW1lbnQudGV4dChcIlwiKTtcclxuXHJcbiAgICAgICAgLy9fZWxlbWVudC5hcHBlbmQoXCI8ZGl2IGNsYXNzPSdzYW9wLXRhYmxlLWhlYWRlci1jYXB0aW9uIHNhb3AtdGFibGUtdGV4dC10cnVuY2F0ZScgaWQ9J2NvbHVtbi1oZWFkZXItXCIrIF9pQ291bnQgK1wiLWNhcHRpb24nIHN0eWxlPSdtYXgtd2lkdGg6XCIrY29sX21heF93aWR0aC50b1N0cmluZygpK1wicHggIWltcG9ydGFudDsnPlwiK2NvbF90aXRsZStcIjwvZGl2PlwiKTtcclxuICAgICAgICBfZWxlbWVudC5hcHBlbmQoXCI8ZGl2IGNsYXNzPSdzYW9wLXRhYmxlLWhlYWRlci1jYXB0aW9uIHNhb3AtdGFibGUtdGV4dC10cnVuY2F0ZScgaWQ9J2NvbHVtbi1oZWFkZXItXCIrIF9pQ291bnQgK1wiLWNhcHRpb24nPlwiK2NvbF90aXRsZStcIjwvZGl2PlwiKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoX2ZpbHRlclR5cGUgIT0gbnVsbCAmJiBfZmlsdGVyVHlwZS50b0xvd2VyQ2FzZSgpID09IFwidGV4dFwiKXtcclxuICAgICAgICAgIF9maWx0ZXJFbmFibGUgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoX2ZpbHRlclR5cGUgIT0gbnVsbCAmJiBfZmlsdGVyVHlwZS50b0xvd2VyQ2FzZSgpID09IFwiZHJvcGRvd25cIil7XHJcbiAgICAgICAgICBfZmlsdGVyRW5hYmxlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChfYWN0aW9uQ29sdW1uICE9IG51bGwgJiYgX2FjdGlvbkNvbHVtbiA9PSB0cnVlKXtcclxuICAgICAgICAgIF9ub3NvcnQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKF9ub3NvcnQgPT0gbnVsbCB8fF9ub3NvcnQgPT0gZmFsc2Upe1xyXG4gICAgICAgICAgX2VsZW1lbnQuYXBwZW5kKFwiPGRpdiBpZD0nY29sdW1uLWhlYWRlci1cIisgX2lDb3VudCArXCItaWNvbicgc3R5bGU9J2Zsb2F0OiByaWdodDtoZWlnaHQ6IDIwcHg7d2lkdGg6IDIwcHg7ZGlzcGxheTogaW5saW5lLWZsZXg7YWxpZ24taXRlbXM6IGNlbnRlcjsnPlwiKTtcclxuICAgICAgICAgIF9lbGVtZW50LmFwcGVuZChcIjxkaXYgaWQ9J2NvbHVtbi1oZWFkZXItXCIrIF9pQ291bnQgK1wiLWljb24tdXAnIHN0eWxlPSdmbG9hdDogcmlnaHQ7aGVpZ2h0OiAyMHB4O3dpZHRoOiA1cHg7ZGlzcGxheTogaW5saW5lLWZsZXg7YWxpZ24taXRlbXM6IGNlbnRlcjsnPlwiKTsgICAgICAgIFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKF9ub1Jlc2l6ZSA9PSBudWxsIHx8X25vUmVzaXplID09IGZhbHNlKXtcclxuICAgICAgICAgIF9lbGVtZW50LmFwcGVuZChcIjxkaXYgaWQ9J2NvbHVtbi1oZWFkZXItXCIrIF9pQ291bnQgK1wiLXNpemVyJz5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIGlmIChfZmlsdGVyRW5hYmxlKSB7XHJcbiAgICAgICQodGFibGVJZCsnIHRoZWFkIHRyJylcclxuICAgICAgLmNsb25lKHRydWUpXHJcbiAgICAgIC5hZGRDbGFzcygnZmlsdGVycycpXHJcbiAgICAgIC5hcHBlbmRUbyh0YWJsZUlkKycgdGhlYWQnKTtcclxuXHJcbiAgICAgIC8vIFNldHVwIC0gYWRkIGEgdGV4dCBpbnB1dCB0byBlYWNoIGZvb3RlciBjZWxsXHJcbiAgICAgIGxldCBfZmlsdGVycyA9ICQodGFibGVJZCkuZmluZCgnLmZpbHRlcnMnKTtcclxuICAgICAgbGV0IF9maWx0ZXJzX3RoID0gX2ZpbHRlcnMuZmluZCgndGgnKTtcclxuICAgICAgX2lDb3VudCA9IDA7XHJcbiAgICAgIF9maWx0ZXJzX3RoLmVhY2goIFxyXG4gICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIF9pQ291bnQgPSBfaUNvdW50ICsgMTtcclxuICAgICAgICAgIGxldCBfZWxlbWVudCA9ICQodGhpcyk7XHJcbiAgICAgICAgICBfZWxlbWVudC5vZmYoKTtcclxuXHJcbiAgICAgICAgICBfZWxlbWVudC5odG1sKFwiXCIpO1xyXG5cclxuICAgICAgICAgIGxldCBfZmlsdGVyVHlwZSA9IF9lbGVtZW50LmF0dHIoXCJjb2x1bW4tZmlsdGVyXCIpO1xyXG5cclxuICAgICAgICAgIHdoaWxlKF9lbGVtZW50WzBdLmF0dHJpYnV0ZXMubGVuZ3RoID4gMClcclxuICAgICAgICAgIF9lbGVtZW50WzBdLnJlbW92ZUF0dHJpYnV0ZShfZWxlbWVudFswXS5hdHRyaWJ1dGVzWzBdLm5hbWUpO1xyXG5cclxuICAgICAgICAgIGxldCBfY29sSWQgPSBcImNvbF9cIitfaUNvdW50LnRvU3RyaW5nKCk7ICAgICAgICBcclxuICAgICAgICAgIF9lbGVtZW50LmF0dHIoXCJpZFwiLF9jb2xJZCk7XHJcbiAgICAgICAgICBsZXQgX2lucHV0SWQgPSBfY29sSWQrXCJfZmlsdGVyXCI7ICAgICAgICBcclxuICAgICAgICAgIGxldCB0aXRsZSA9IF9lbGVtZW50LnRleHQoKTtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgaWYgKF9maWx0ZXJUeXBlICE9IG51bGwgJiYgX2ZpbHRlclR5cGUudG9Mb3dlckNhc2UoKSA9PSBcInRleHRcIil7XHJcbiAgICAgICAgICAgIGxldCBfaW5wdXRFID0gbmV3IFNhb3BJbnB1dFdGTCh7aWQ6X2lucHV0SWQsY2FwdGlvbjp0aXRsZSxwbGFjZWhvbGRlcjp0aXRsZX0pLmdldElubmVySHRtbCgpO1xyXG4gICAgICAgICAgICBfZWxlbWVudC5odG1sKF9pbnB1dEUpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChfZmlsdGVyVHlwZSAhPSBudWxsICYmIF9maWx0ZXJUeXBlLnRvTG93ZXJDYXNlKCkgPT0gXCJkcm9wZG93blwiKXtcclxuICAgICAgICAgICAgbGV0IF9zZWxlY3RJZCA9IF9jb2xJZCtcIl9zZWxlY3RcIjsgICBcclxuICAgICAgICAgICAgbGV0IHNlbGVjdEh0bWwgPSBuZXcgU2FvcHNlbGVjdFdGTCh7aWQ6X3NlbGVjdElkLGNhcHRpb246XCJcIixwbGFjZWhvbGRlcjpcIlwifSkuZ2V0SW5uZXJIdG1sKCk7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3QgPSAkKHNlbGVjdEh0bWwpOyAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvL1xyXG5cclxuICAgICAgICAgICAgbGV0IF9pbmRleCA9IF9pQ291bnQ7XHJcbiAgICAgICAgICAgIF9pbmRleCA9IF9pbmRleCAtIDE7XHJcblxyXG4gICAgICAgICAgICBkYXRhVGFibGUuRGF0YVRhYmxlKClcclxuICAgICAgICAgICAgLmNvbHVtbihfaW5kZXgrJzp2aXNpYmxlJylcclxuICAgICAgICAgICAgLmRhdGEoKVxyXG4gICAgICAgICAgICAudW5pcXVlKClcclxuICAgICAgICAgICAgLnNvcnQoKVxyXG4gICAgICAgICAgICAuZWFjaChmdW5jdGlvbiAoZDphbnksIGo6YW55KSB7XHJcbiAgICAgICAgICAgICAgaWYgKGQubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICBsZXQgX2NvbnRlbnQgPSBkO1xyXG4gICAgICAgICAgICAgICAgbGV0IF9maXJzdENoYXIgPSBfY29udGVudFswXTtcclxuICAgICAgICAgICAgICAgIGlmIChfZmlyc3RDaGFyLmNoYXJDb2RlQXQoMCkgPiAxMDAwKSB7X2NvbnRlbnQgPSBfY29udGVudC5yZXBsYWNlKF9maXJzdENoYXIrXCIgXCIsXCJcIik7fVxyXG4gICAgICAgICAgICAgICAgc2VsZWN0LmZpbmQoJ3NlbGVjdCcpLmxhc3QoKS5hcHBlbmQoJzxvcHRpb24gdmFsdWU9XCInICsgZCArICdcIj4nICsgX2NvbnRlbnQgKyAnPC9vcHRpb24+Jyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIF9lbGVtZW50LmFwcGVuZChzZWxlY3QpO1xyXG4gICAgICAgICAgfSAgICBcclxuICAgICAgICB9IFxyXG4gICAgICApO1xyXG5cclxuICAgICAgLy8gQXBwbHkgdGhlIGZpbHRlclxyXG4gICAgICAkKHRhYmxlSWQrXCIgdGhlYWQgaW5wdXRcIikub24oICdrZXl1cCBjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgICAgbGV0IF9pbmRleCA9ICQodGhpcykucGFyZW50KCkucGFyZW50KCkuaW5kZXgoKTtcclxuICAgICAgICBkYXRhVGFibGUuRGF0YVRhYmxlKClcclxuICAgICAgICAgICAgLmNvbHVtbihfaW5kZXgrJzp2aXNpYmxlJylcclxuICAgICAgICAgICAgLnNlYXJjaCggdGFyZ2V0LnZhbHVlIClcclxuICAgICAgICAgICAgLmRyYXcoKTtcclxuXHJcbiAgICAgICAgLy92YXIgdmFsID0gJC5mbi5kYXRhVGFibGUudXRpbC5lc2NhcGVSZWdleCh0YXJnZXQudmFsdWUpO1xyXG4gICAgICAgIC8vZGF0YVRhYmxlLkRhdGFUYWJsZSgpLnNlYXJjaCh2YWwgPyAnXicgKyB2YWwgKyAnJCcgOiAnJywgdHJ1ZSwgZmFsc2UpLmRyYXcoKTtcclxuXHJcbiAgICAgIH0gKTsgICAgXHJcbiBcclxuICAgICAgLy8gQXBwbHkgdGhlIGRyb3Bkb3duIGZpbHRlclxyXG4gICAgICAkKHRhYmxlSWQrXCIgdGhlYWQgc2VsZWN0XCIpLm9uKCAnY2hhbmdlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICAgIGxldCBfaW5kZXggPSAkKHRoaXMpLnBhcmVudCgpLnBhcmVudCgpLmluZGV4KCk7XHJcbiAgICAgICAgdmFyIHZhbCA9ICQuZm4uZGF0YVRhYmxlLnV0aWwuZXNjYXBlUmVnZXgodGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICBkYXRhVGFibGUuRGF0YVRhYmxlKClcclxuICAgICAgICAgICAgLmNvbHVtbihfaW5kZXgrJzp2aXNpYmxlJylcclxuICAgICAgICAgICAgLnNlYXJjaCh2YWwgPyAnXicgKyB2YWwgKyAnJCcgOiAnJywgdHJ1ZSwgZmFsc2UpXHJcbiAgICAgICAgICAgIC5kcmF3KCk7XHJcbiAgICAgIH0gKTsgIFxyXG5cclxuICAgICAgLy9cclxuICAgIH1cclxuXHJcblxyXG4gIH1cclxuXHJcbiAgY29uZmlnU2ltcGxlU29ydChncmlkSWQ6IHN0cmluZyk6dm9pZCB7XHJcbiAgICB0aGlzLnNldFNvcnRFbGVtZW50KGdyaWRJZCk7XHJcbiAgICB0aGlzLnNldFNvcnRFbGVtZW50RXZlbnQoZ3JpZElkKTtcclxuICB9XHJcblxyXG4gIC8vXHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/Ly8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9kYXRhLXRhYmxlcy90eXBlcy5kLnRzXCIgLz5cclxuaW1wb3J0IHsgaXNVbkRlZmluZWQsIGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFdlYkdyaWRGaWx0ZXIgfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLWdyaWQtZmlsdGVyXCI7XHJcbmltcG9ydCB7IERhdGFUYWJsZXMgfSBmcm9tIFwiLi4vQHR5cGVzL2RhdGEtdGFibGVzL3R5cGVzXCI7XHJcbmltcG9ydCB7IFNhb3BUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9Db3JlL3Nhb3AtdHJhbnNsYXRlJztcclxuLy8gZnVuY3Rpb24gc3RhdHVzRm9ybWF0dGVyKHJvdzogbnVtYmVyLCBjZWxsOiBudW1iZXIsIHZhbHVlOiBhbnksIGNvbHVtbkRlZjogU2xpY2suQ29sdW1uPFNsaWNrLlNsaWNrRGF0YT4sIGRhdGFDb250ZXh0OiBTbGljay5TbGlja0RhdGEpIHtcclxuLy8gICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PT0gXCJcIikge1xyXG4vLyAgICAgcmV0dXJuIFwiLVwiO1xyXG4vLyAgIH0gZWxzZSBpZiAodmFsdWUgPCA1MCkge1xyXG4vLyAgICAgcmV0dXJuIFwiPHNwYW4gc3R5bGU9J2NvbG9yOnJlZDtmb250LXdlaWdodDpib2xkOyc+XCIgKyB2YWx1ZSArIFwiJTwvc3Bhbj5cIjtcclxuLy8gICB9IGVsc2Uge1xyXG4vLyAgICAgcmV0dXJuIFwiPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz5cIiArIHZhbHVlICsgXCIlPC9zcGFuPlwiO1xyXG4vLyAgIH1cclxuLy8gfVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wV2ViR3JpZFRvb2xiYXIge1xyXG4gIGlkPzpzdHJpbmcsXHJcbiAgY2FwdGlvbjpzdHJpbmcsXHJcbiAgYnV0dG9ucz86U2FvcFdlYkdyaWRUb29sYmFyQnV0dG9uW11cclxuICBpdGVtc1RlbXBsYXRlSWQ/OiBzdHJpbmc7XHJcbn0gXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNhb3BXZWJHcmlkVG9vbGJhckJ1dHRvbiB7XHJcbiAgaWQ6c3RyaW5nLFxyXG4gIGNhcHRpb24gOnN0cmluZywgIFxyXG4gIGNsYXNzPyA6c3RyaW5nLFxyXG4gIGF0dHJpYnV0ZXM/OnN0cmluZyxcclxuICBvbkNsaWNrRXZlbnQ/OnN0cmluZyxcclxuICB0ZW1wbGF0ZT86IHN0cmluZztcclxufSBcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcFdlYkdyaWRUb2dnbGVQYW5lbCB7XHJcbiAgZW5hYmxlZDpib29sZWFuXHJcbn0gXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNhb3BXZWJHcmlkUHJvcGVydGllcyB7XHJcbiAgZ3JpZElkOnN0cmluZ1xyXG4gICxjc3M/OnN0cmluZ1xyXG4gICx0b2dnbGVQYW5lbD86U2FvcFdlYkdyaWRUb2dnbGVQYW5lbFxyXG4gICx0b29sYmFyPzpTYW9wV2ViR3JpZFRvb2xiYXIgIFxyXG4gICxkYXRhVGFibGU/OlNhb3BXZWJEYXRhVGFibGVcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wV2ViRGF0YVRhYmxlIHtcclxuICBlbmFibGVkOmJvb2xlYW5cclxuICAsY29sdW1uRGVmc1NldHRpbmdzPzogRGF0YVRhYmxlcy5Db2x1bW5EZWZzU2V0dGluZ3NbXVxyXG4gICxvcmRlcmluZz86Ym9vbGVhblxyXG4gICxjb2x1bW5zPzphbnlbXVxyXG4gICxkYXRhPzogYW55XHJcbiAgLG9yZGVyPzogQXJyYXk8KG51bWJlciB8IHN0cmluZyk+IHwgQXJyYXk8QXJyYXk8KG51bWJlciB8IHN0cmluZyk+PlxyXG4gICxjb2xSZXNpemVPbmx5Pzpib29sZWFuIFxyXG4gICxjb2xTZXR0aW5ncz86Ym9vbGVhbiBcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wV2ViR3JpZENvbERpYWxvZ1Byb3BlcnRpZXMge1xyXG4gIGRpYWxvZ0lkOnN0cmluZ1xyXG4gIGJ0blJlc2V0Q29sSWQ6c3RyaW5nXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wV2ViR3JpZCB7XHJcbiAgcHJpdmF0ZSBfcHJvcGVydGllczpTYW9wV2ViR3JpZFByb3BlcnRpZXNcclxuICBwcml2YXRlIF90YWJsZURpdjpIVE1MVGFibGVFbGVtZW50O1xyXG4gIHByaXZhdGUgX3RyYW5zbGF0aW9uU2VydmljZTogU2FvcFRyYW5zbGF0aW9uU2VydmljZTtcclxuICBwcml2YXRlIF9kaWFsb2c6YW55O1xyXG4gIHByaXZhdGUgX2NvbERpYWxvZ1Byb3BlcnRpZXMgOiBTYW9wV2ViR3JpZENvbERpYWxvZ1Byb3BlcnRpZXM7XHJcbiAgcHJpdmF0ZSBfc2F2ZVN0YXRlOmJvb2xlYW4gPSBmYWxzZTtcclxuICAvL1xyXG4gIHB1YmxpYyBsaWJOYW1lOiBzdHJpbmc7ICBcclxuICBwdWJsaWMgd2ViR3JpZEZpbHRlcjpTYW9wV2ViR3JpZEZpbHRlcjtcclxuICBwdWJsaWMgZGF0YVRhYmxlOiBEYXRhVGFibGVzLkFwaTxhbnk+O1xyXG4gIHB1YmxpYyBtYXJrZWRDb2x1bW5DaGVja2JveDogSlF1ZXJ5PEhUTUxJbnB1dEVsZW1lbnQ+O1xyXG5cclxuICBjb25zdHJ1Y3RvcihsaWJOYW1lOiBzdHJpbmcpIHtcclxuICAgIHRoaXMubGliTmFtZSA9IGxpYk5hbWU7XHJcbiAgICB0aGlzLndlYkdyaWRGaWx0ZXIgPSBuZXcgU2FvcFdlYkdyaWRGaWx0ZXIoKTtcclxuICAgIHRoaXMuX3RyYW5zbGF0aW9uU2VydmljZSA9IG5ldyBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlKCk7XHJcbiAgICB0aGlzLl9jb2xEaWFsb2dQcm9wZXJ0aWVzID0gIHtcclxuICAgICAgZGlhbG9nSWQ6XCJcIlxyXG4gICAgICAsYnRuUmVzZXRDb2xJZDpcIlwiXHJcbiAgICB9O1xyXG4gICAgdGhpcy5zZXRUZXJtaW5vbG9neUxpc3QoKTtcclxuICB9ICBcclxuXHJcbiAgc2V0VGVybWlub2xvZ3lMaXN0KCl7XHJcbiAgICBsZXQgX3Rlcm1pbm9sb2d5OiBzdHJpbmdbXSA9IFsnTmkgcG9kYXRrb3YgemEgcHJpa2F6LicsJ1VyZWphbmplIHN0b2xwY2V2JywnUG9uYXN0YXZpIHN0b2xwY2UnLCdTaHJhbmknLCdQcmVrbGnEjWknXTtcclxuICAgIHRoaXMuX3RyYW5zbGF0aW9uU2VydmljZS5zZXRUcmFuc2xhdGlvbnNMaXN0KF90ZXJtaW5vbG9neSk7XHJcbiAgfVxyXG5cclxuICAvL1xyXG4gIGluaXQoZ3JpZFByb3A6U2FvcFdlYkdyaWRQcm9wZXJ0aWVzKSB7XHJcbiAgICB0aGlzLl9wcm9wZXJ0aWVzID0gZ3JpZFByb3A7XHJcbiAgICB0aGlzLl90YWJsZURpdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZ3JpZFByb3AuZ3JpZElkKSBhcyBIVE1MVGFibGVFbGVtZW50O1xyXG4gICAgLy9cclxuICAgIGxldCBfdG9nZ2xlUGFuZWxEZWZhdWx0ID0ge2VuYWJsZWQ6dHJ1ZX07XHJcbiAgICBncmlkUHJvcC50b2dnbGVQYW5lbCA9IHsuLi5fdG9nZ2xlUGFuZWxEZWZhdWx0LCAuLi5ncmlkUHJvcC50b2dnbGVQYW5lbH1cclxuICAgIGlmIChpc1VuRGVmaW5lZChncmlkUHJvcC50b2dnbGVQYW5lbCkpe1xyXG4gICAgICBncmlkUHJvcC50b2dnbGVQYW5lbCA9IF90b2dnbGVQYW5lbERlZmF1bHQ7XHJcbiAgICB9ICAgICAgXHJcbiAgICAvL1xyXG5cclxuICAgIHRoaXMud2ViR3JpZEZpbHRlci5pZCA9IGdyaWRQcm9wLmdyaWRJZCtcImZpbHRlclwiO1xyXG4gICAgdGhpcy5nZW5lcmF0ZUh0bWxUYWJsZSgpO1xyXG4gICAgdGhpcy5hZGRHcmlkVG9vbGJhcigpO1xyXG4gICAgLy8gZGV0IGRlZmF1bHRzXHJcbiAgICBsZXQgX01zZ19lbXB0eVRhYmxlID0gdGhpcy5fdHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIk5pIHBvZGF0a292IHphIHByaWthei5cIilcclxuXHJcbiAgICBsZXQgX2RhdGFUYWJsZURlZiA9IHtlbmFibGVkOnRydWUsb3JkZXJpbmc6dHJ1ZSxjb2xSZW9yZGVyOmZhbHNlLGNvbFNldHRpbmdzOmZhbHNlfTtcclxuICAgIGdyaWRQcm9wLmRhdGFUYWJsZSA9IHsuLi5fZGF0YVRhYmxlRGVmLCAuLi5ncmlkUHJvcC5kYXRhVGFibGV9XHJcblxyXG4gICAgaWYgKGlzVW5EZWZpbmVkKGdyaWRQcm9wLmRhdGFUYWJsZSkpe1xyXG4gICAgICBncmlkUHJvcC5kYXRhVGFibGUgPSBncmlkUHJvcC5kYXRhVGFibGU7XHJcbiAgICB9ICAgIFxyXG5cclxuICAgIGxldCBfY29sdW1uRGVmc1NldHRpbmdzRGVmOkRhdGFUYWJsZXMuQ29sdW1uRGVmc1NldHRpbmdzW10gPSBbe29yZGVyYWJsZTogdHJ1ZSwgdGFyZ2V0czogIFwibm8tc29ydFwifV07XHJcbiAgICBpZiAoaXNVbkRlZmluZWQoZ3JpZFByb3AuZGF0YVRhYmxlLmNvbHVtbkRlZnNTZXR0aW5ncykpe1xyXG4gICAgICBncmlkUHJvcC5kYXRhVGFibGUuY29sdW1uRGVmc1NldHRpbmdzID0gX2NvbHVtbkRlZnNTZXR0aW5nc0RlZjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGdyaWRQcm9wLmRhdGFUYWJsZS5jb2x1bW5EZWZzU2V0dGluZ3MgPSBBcnJheS5mcm9tKG5ldyBTZXQoWy4uLl9jb2x1bW5EZWZzU2V0dGluZ3NEZWYsLi4uZ3JpZFByb3AuZGF0YVRhYmxlLmNvbHVtbkRlZnNTZXR0aW5nc10pKTtcclxuICAgIH0gICAgXHJcblxyXG4gICAgLy9cclxuICAgIFxyXG4gICAgLy9cclxuICAgIGlmICghaXNVbkRlZmluZWQodGhpcy5fcHJvcGVydGllcy5kYXRhVGFibGUpIFxyXG4gICAgICAmJiB0aGlzLl9wcm9wZXJ0aWVzLmRhdGFUYWJsZS5lbmFibGVkXHJcbiAgICAgICl7XHJcbiAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgIC8vXHJcbiAgICAgIGxldCBfY29sUmVvcmRlciA9IHt9O1xyXG4gICAgICBfY29sUmVvcmRlciA9IHtcclxuICAgICAgICBhbGxvd1Jlb3JkZXI6dGhpcy5fcHJvcGVydGllcy5kYXRhVGFibGUuY29sUmVzaXplT25seVxyXG4gICAgICAgICxhbGxvd1Jlc2l6ZTp0aGlzLl9wcm9wZXJ0aWVzLmRhdGFUYWJsZS5jb2xSZXNpemVPbmx5XHJcbiAgICAgIH07XHJcbiAgICAgIC8vXHJcbiAgICAgIHRoaXMuX3NhdmVTdGF0ZSA9IHRoaXMuX3Byb3BlcnRpZXMuZGF0YVRhYmxlLmNvbFJlc2l6ZU9ubHkgfHx0aGlzLl9wcm9wZXJ0aWVzLmRhdGFUYWJsZS5jb2xTZXR0aW5ncztcclxuICAgICAgLy9cclxuICAgICAgaWYgKHRoaXMuX3NhdmVTdGF0ZSA9PSBmYWxzZSkge1xyXG4gICAgICAgIHRoaXMuZGF0YVRhYmxlID0gXHJcbiAgICAgICAgICAkKGdyaWRQcm9wLmdyaWRJZCkuRGF0YVRhYmxlKFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBcInBhZ2luZ1wiOiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgLCBcInNlYXJjaGluZ1wiOiB0cnVlXHJcbiAgICAgICAgICAgICAgICAsXCJhdXRvV2lkdGhcIjogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgLG9yZGVyQ2VsbHNUb3A6IHRydWVcclxuICAgICAgICAgICAgICAgIC8vLCBcImRvbVwiOiBcIlJsZnJ0aXBcIlxyXG4gICAgICAgICAgICAgICAgLCBpbml0Q29tcGxldGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGdyaWRQcm9wLmRhdGFUYWJsZS5vcmRlcmluZyl7XHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMud2ViR3JpZEZpbHRlci5jb25maWdTaW1wbGVGaWx0ZXIodGhpcyk7ICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMud2ViR3JpZEZpbHRlci5jb25maWdTaW1wbGVTb3J0KF90aGlzLl9wcm9wZXJ0aWVzLmdyaWRJZCk7ICAgXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgLy9pZighaXNVbkRlZmluZWQoX3RoaXMuX3Byb3BlcnRpZXMuZGF0YVRhYmxlLmZpbHRlcnMpKSB7XHJcbiAgICAgICAgICAgICAgICAgIC8vICAgX3RoaXMud2ViR3JpZEZpbHRlci5jb25maWdGaWx0ZXIoX3RoaXMubGliTmFtZSx0aGlzLCBfdGhpcy5fcHJvcGVydGllcy5kYXRhVGFibGUuZmlsdGVycyk7XHJcbiAgICAgICAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLG9yZGVyOiBfdGhpcy5fcHJvcGVydGllcy5kYXRhVGFibGUub3JkZXJcclxuICAgICAgICAgICAgICAgIC8vICxhamF4OiBmdW5jdGlvbiAoZGF0YSwgY2FsbGJhY2ssIHNldHRpbmdzKSB7XHJcbiAgICAgICAgICAgICAgICAvLyAgIGNhbGxiYWNrKHsgZGF0YTogZGF0YSB9KSAvL3JlbG9hZHMgZGF0YSBcclxuICAgICAgICAgICAgICAgIC8vIH0gXHJcbiAgICAgICAgICAgICAgICAsY29sdW1uRGVmczogX3RoaXMuX3Byb3BlcnRpZXMuZGF0YVRhYmxlLmNvbHVtbkRlZnNTZXR0aW5ncyBcclxuICAgICAgICAgICAgICAgICxvcmRlcmluZyA6IGdyaWRQcm9wLmRhdGFUYWJsZS5vcmRlcmluZyBcclxuICAgICAgICAgICAgICAgICxsYW5ndWFnZSA6IHtlbXB0eVRhYmxlOl9Nc2dfZW1wdHlUYWJsZSx6ZXJvUmVjb3JkczpfTXNnX2VtcHR5VGFibGV9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICk7ICAgIFxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgJChncmlkUHJvcC5ncmlkSWQrXCJfZmlsdGVyXCIpLnJlbW92ZSgpO1xyXG4gICAgICAgICQoZ3JpZFByb3AuZ3JpZElkK1wiX2luZm9cIikucmVtb3ZlKCk7IFxyXG4gICAgICAgIHRoaXMud2ViR3JpZEZpbHRlci5zZXRSZXNpemVFdmVudCh0aGlzLl9wcm9wZXJ0aWVzLmdyaWRJZCk7XHJcbiAgICAgICAgLy9cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLmRhdGFUYWJsZSA9IFxyXG4gICAgICAgICQoZ3JpZFByb3AuZ3JpZElkKS5EYXRhVGFibGUoXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgXCJwYWdpbmdcIjogZmFsc2VcclxuICAgICAgICAgICAgICAsXCJzZWFyY2hpbmdcIjogdHJ1ZVxyXG4gICAgICAgICAgICAgIC8vLFwiYXV0b1dpZHRoXCI6IHRydWVcclxuICAgICAgICAgICAgICAvLyxzY3JvbGxYOiB0cnVlXHJcbiAgICAgICAgICAgICAgLG9yZGVyQ2VsbHNUb3A6IHRydWVcclxuICAgICAgICAgICAgICAsY29sUmVvcmRlcjogX2NvbFJlb3JkZXJcclxuICAgICAgICAgICAgICAvLywgXCJkb21cIjogXCJCZnJ0aXBcIlxyXG4gICAgICAgICAgICAgICwgc3RhdGVTYXZlOiB0aGlzLl9zYXZlU3RhdGVcclxuICAgICAgICAgICAgICAsIGluaXRDb21wbGV0ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGdyaWRQcm9wLmRhdGFUYWJsZS5vcmRlcmluZyl7XHJcbiAgICAgICAgICAgICAgICAgIF90aGlzLndlYkdyaWRGaWx0ZXIuY29uZmlnU2ltcGxlRmlsdGVyKHRoaXMpOyAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICBfdGhpcy53ZWJHcmlkRmlsdGVyLmNvbmZpZ1NpbXBsZVNvcnQoX3RoaXMuX3Byb3BlcnRpZXMuZ3JpZElkKTsgICBcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIGlmKCFpc1VuRGVmaW5lZChfdGhpcy5fcHJvcGVydGllcy5kYXRhVGFibGUuZmlsdGVycykpIHtcclxuICAgICAgICAgICAgICAgIC8vICAgX3RoaXMud2ViR3JpZEZpbHRlci5jb25maWdGaWx0ZXIoX3RoaXMubGliTmFtZSx0aGlzLCBfdGhpcy5fcHJvcGVydGllcy5kYXRhVGFibGUuZmlsdGVycyk7XHJcbiAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIC8vLHN0YXRlU2F2ZUNhbGxiYWNrIDogX3RoaXMuZ3JpZENvbFNpemUuc3RhdGVTYXZlQ2FsbGJhY2suYmluZChfdGhpcy5ncmlkQ29sU2l6ZSlcclxuICAgICAgICAgICAgICAsb3JkZXI6IF90aGlzLl9wcm9wZXJ0aWVzLmRhdGFUYWJsZS5vcmRlclxyXG4gICAgICAgICAgICAgIC8vICxhamF4OiBmdW5jdGlvbiAoZGF0YSwgY2FsbGJhY2ssIHNldHRpbmdzKSB7XHJcbiAgICAgICAgICAgICAgLy8gICBjYWxsYmFjayh7IGRhdGE6IGRhdGEgfSkgLy9yZWxvYWRzIGRhdGEgXHJcbiAgICAgICAgICAgICAgLy8gfSBcclxuICAgICAgICAgICAgICAsY29sdW1uRGVmczogZ3JpZFByb3AuZGF0YVRhYmxlLmNvbHVtbkRlZnNTZXR0aW5ncyBcclxuICAgICAgICAgICAgICAsb3JkZXJpbmcgOiBncmlkUHJvcC5kYXRhVGFibGUub3JkZXJpbmcgXHJcbiAgICAgICAgICAgICAgLGxhbmd1YWdlIDoge2VtcHR5VGFibGU6X01zZ19lbXB0eVRhYmxlLHplcm9SZWNvcmRzOl9Nc2dfZW1wdHlUYWJsZX0gICAgXHJcbiAgICAgICAgICAgICAgLy8gLGJ1dHRvbnM6IFsgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgLy8gICB7XHJcbiAgICAgICAgICAgICAgLy8gICBleHRlbmQ6ICdwZGZIdG1sNScsXHJcbiAgICAgICAgICAgICAgLy8gICBvcmllbnRhdGlvbjogJ2xhbmRzY2FwZScsXHJcbiAgICAgICAgICAgICAgLy8gICBwYWdlU2l6ZTogJ0xFR0FMJ1xyXG4gICAgICAgICAgICAgIC8vICAgfVxyXG4gICAgICAgICAgICAgIC8vIF0gXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICk7ICAgIFxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgJChncmlkUHJvcC5ncmlkSWQrXCJfZmlsdGVyXCIpLnJlbW92ZSgpO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgJChncmlkUHJvcC5ncmlkSWQrXCJfaW5mb1wiKS5yZW1vdmUoKTsgXHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLnNldFJlc2l6YWJsZUNvbHVtbigpO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy5pbml0RXZlbnRMaXN0bmVycygpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vXHJcblxyXG4gICAgfVxyXG4gICBcclxuICAgIC8vXHJcblxyXG4gIH1cclxuXHJcbiAgYWRkVG9vbGJhckJ1dHRvbnMoZ3JpZFBhbmVsOiBKUXVlcnk8SFRNTEVsZW1lbnQ+LGJ1dHRvbnM6U2FvcFdlYkdyaWRUb29sYmFyQnV0dG9uW10pe1xyXG4gICAgaWYoaXNVbkRlZmluZWQoYnV0dG9ucykgPT0gZmFsc2Upe1xyXG4gICAgICBidXR0b25zLmZvckVhY2goX2J1dHRvbiA9PiB7XHJcbiAgICAgICAgdmFyIGJ1dHRvblRlbXBsYXRlID0gXHJcbiAgICAgICAgYFxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtYXV0byBteS1hdXRvXCIgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6MjFweDtcIj5cclxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gc2FvcC1idXR0b24tcHJpbWFyeSBteC1hdXRvIGQtYmxvY2tcIiBpZD1cIiR7X2J1dHRvbi5pZH1cIiB0eXBlPVwic3VibWl0XCIgb25jbGljaz1cIiR7X2J1dHRvbi5vbkNsaWNrRXZlbnR9XCIgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6MTBweDtcIj48c3BhbiBjbGFzcz1cInNhb3AtaW1nLXBsdXNcIj48L3NwYW4+JHtfYnV0dG9uLmNhcHRpb259PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+ICAgIFxyXG4gICAgICAgIGA7XHJcblxyXG4gICAgICAgIGlmIChfYnV0dG9uLnRlbXBsYXRlICE9IG51bGwpIHtcclxuICAgICAgICAgIGJ1dHRvblRlbXBsYXRlID0gX2J1dHRvbi50ZW1wbGF0ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdyaWRQYW5lbC5maW5kKFwiI3Rvb2xiYXJCdXR0b25zXCIpLmFwcGVuZChidXR0b25UZW1wbGF0ZSk7ICAgICAgXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2VuZXJhdGVIdG1sVGFibGUoKSB7XHJcbiAgICB0aGlzLmdlbmVyYXRlVGFibGVCb2R5KCk7ICAgICAgICBcclxuICAgIHRoaXMuZ2VuZXJhdGVUYWJsZUhlYWQoKTtcclxuICB9XHJcblxyXG4gIGdlbmVyYXRlVGFibGVIZWFkKCkge1xyXG4gICAgaWYgKCFpc1VuRGVmaW5lZCh0aGlzLl9wcm9wZXJ0aWVzLmRhdGFUYWJsZSkpe1xyXG4gICAgICBpZighaXNVbkRlZmluZWQodGhpcy5fcHJvcGVydGllcy5kYXRhVGFibGUuY29sdW1ucykpe1xyXG4gICAgICAgIGxldCB0aGVhZCA9IHRoaXMuX3RhYmxlRGl2LmNyZWF0ZVRIZWFkKCk7XHJcbiAgICAgICAgbGV0IHJvdyA9IHRoZWFkLmluc2VydFJvdygpO1xyXG4gICAgICAgIGZvciAobGV0IGtleSBvZiB0aGlzLl9wcm9wZXJ0aWVzLmRhdGFUYWJsZS5jb2x1bW5zKSB7XHJcbiAgICAgICAgICBsZXQgdGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGhcIik7XHJcbiAgICAgICAgICBsZXQgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGtleS5uYW1lKTtcclxuICAgICAgICAgIHRoLmFwcGVuZENoaWxkKHRleHQpO1xyXG4gICAgICAgICAgcm93LmFwcGVuZENoaWxkKHRoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgZ2VuZXJhdGVUYWJsZUJvZHkoKSB7XHJcbiAgICBpZiAoIWlzVW5EZWZpbmVkKHRoaXMuX3Byb3BlcnRpZXMuZGF0YVRhYmxlKSl7XHJcbiAgICAgIGlmICghaXNVbkRlZmluZWQodGhpcy5fcHJvcGVydGllcy5kYXRhVGFibGUuZGF0YSkpe1xyXG4gICAgICAgIGZvciAobGV0IGVsZW1lbnQgb2YgdGhpcy5fcHJvcGVydGllcy5kYXRhVGFibGUuZGF0YSkge1xyXG4gICAgICAgICAgbGV0IHJvdyA9IHRoaXMuX3RhYmxlRGl2Lmluc2VydFJvdygpO1xyXG4gICAgICAgICAgZm9yIChsZXQga2V5IGluIGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgbGV0IGNlbGwgPSByb3cuaW5zZXJ0Q2VsbCgpO1xyXG4gICAgICAgICAgICBsZXQgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGVsZW1lbnRba2V5XSk7XHJcbiAgICAgICAgICAgIGNlbGwuYXBwZW5kQ2hpbGQodGV4dCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRHcmlkVG9vbGJhcigpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgZ3JpZFBhbmVsOiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gICAgbGV0IF9jc3MgPSBpc1VuRGVmaW5lZCh0aGlzLl9wcm9wZXJ0aWVzLmNzcykgPT0gZmFsc2UgPyB0aGlzLl9wcm9wZXJ0aWVzLmNzcyA6XCJcIjtcclxuXHJcbiAgICBsZXQgZ3JpZFBhbmVsVGVtcGxhdGUgPSBgXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNhb3AtdGFibGUtZml4aGVhZCAke19jc3N9XCI+XHJcbiAgICAgICAgICA8dGFibGUgaWQ9XCIjc2xpY2tHcmlkI1wiPjwvdGFibGU+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICBgO1xyXG4gICAgaWYgKCFpc1VuRGVmaW5lZCh0aGlzLl9wcm9wZXJ0aWVzLnRvb2xiYXIpKSB7XHJcbiAgICAgIGlmIChpc1VuRGVmaW5lZCh0aGlzLl9wcm9wZXJ0aWVzLnRvb2xiYXIuaWQpKSB7XHJcbiAgICAgICAgdGhpcy5fcHJvcGVydGllcy50b29sYmFyLmlkID0gdGhpcy5fcHJvcGVydGllcy5ncmlkSWQrXCJUQlwiO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBncmlkVG9nZ2xlUGFuZWwgPSBgYDtcclxuICAgICAgbGV0IGdyaWRUb2dnbGVQYW5lbENsYXNzID0gXCJcIjtcclxuICAgICAgbGV0IGdyaWRCb3JkZXJCb3R0b20gPSBcIlwiO1xyXG4gICAgICBpZih0aGlzLl9wcm9wZXJ0aWVzLnRvZ2dsZVBhbmVsLmVuYWJsZWQpIHtcclxuICAgICAgICBncmlkVG9nZ2xlUGFuZWxDbGFzcyA9IFwiY29sbGFwc2Ugc2hvd1wiO1xyXG4gICAgICAgIGdyaWRCb3JkZXJCb3R0b20gPSBcInNhb3AtYm9yZGVyLWJvdHRvbVwiO1xyXG5cclxuICAgICAgICBncmlkVG9nZ2xlUGFuZWwgPSBcclxuICAgICAgICAgIGBcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYW9wLWZvcm0tcGFuZWwtaGVhZGluZyBzYW9wLXRvZ2dsZS1wYW5lbFwiPlxyXG4gICAgICAgICAgICA8cCBjbGFzcz1cInNhb3AtdHh0LTMgbS0wXCIgZGF0YS10b2dnbGU9XCJjb2xsYXBzZVwiIGFyaWEtZXhwYW5kZWQ9XCJ0cnVlXCIgZGF0YS10YXJnZXQ9XCIjY29sbGFwc2Uke3RoaXMuX3Byb3BlcnRpZXMudG9vbGJhci5pZH1cIj5cclxuICAgICAgICAgICAgJHt0aGlzLl9wcm9wZXJ0aWVzLnRvb2xiYXIuY2FwdGlvbn0gPHNwYW4gY2xhc3M9XCJzYW9wLWltZy1kb3duIHNpLW0gc2FvcC10b2dnbGUtYXJyb3cgcmlnaHRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgYDsgICAgICBcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IF90b29sYmFySXRlbXMgPSBgYDtcclxuICAgICAgaWYgKCFpc1VuRGVmaW5lZCh0aGlzLl9wcm9wZXJ0aWVzLnRvb2xiYXIuaXRlbXNUZW1wbGF0ZUlkKSl7XHJcbiAgICAgICAgbGV0IF90b29sYmFySXRlbXNUZW1wbGF0ZSA9ICQodGhpcy5fcHJvcGVydGllcy50b29sYmFyLml0ZW1zVGVtcGxhdGVJZCk7XHJcbiAgICAgICAgaWYgKF90b29sYmFySXRlbXNUZW1wbGF0ZS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgIF90b29sYmFySXRlbXMgPSBfdG9vbGJhckl0ZW1zVGVtcGxhdGUuaHRtbCgpO1xyXG4gICAgICAgICAgX3Rvb2xiYXJJdGVtc1RlbXBsYXRlLnJlbW92ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IF9idG5TZXR0aW5ncyA9IGBgO1xyXG4gICAgICBpZiAodGhpcy5fcHJvcGVydGllcy5kYXRhVGFibGUuY29sU2V0dGluZ3MgPT0gdHJ1ZSB8fCB0aGlzLl9wcm9wZXJ0aWVzLmRhdGFUYWJsZS5jb2xSZXNpemVPbmx5ID09IHRydWUpIHtcclxuICAgICAgICBfYnRuU2V0dGluZ3MgPSBcclxuICAgICAgICBgXHJcbiAgICAgICAgICA8ZGl2IGlkPVwiZ3JpZFNldHRpbmdzXCIgc3R5bGU9XCJmbG9hdDpyaWdodDsgcG9zaXRpb246IHJlbGF0aXZlOyB0b3A6IC0yNXB4OyBsZWZ0OiAtMjBweDsgd2lkdGg6NXB4OyBwYWRkaW5nLXRvcDo1cHg7XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGRyb3BsZWZ0IHBvc2l0aW9uLXN0YXRpYyBzaG93XCIgcm9sZT1cImdyb3VwXCI+IFxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuIHAtMCBzYW9wLXRvZ2dsZS1wYW5lbCBhbGlnbi1taWRkbGVcIiBpZD1cIiR7dGhpcy5fcHJvcGVydGllcy5ncmlkSWR9X0Ryb3Bkb3duTWVudVwiIGRhdGEtdG9nZ2xlPVwiZHJvcGRvd25cIiBkYXRhLWJvdW5kYXJ5PVwid2luZG93XCIgYXJpYS1oYXNwb3B1cD1cInRydWVcIiBhcmlhLWV4cGFuZGVkPVwidHJ1ZVwiPiBcclxuICAgICAgICAgICAgICA8ZGl2PiBcclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZC1ibG9jayBzYW9wLWltZy1zZXR0aW5ncyBzaS14c1wiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiPiBcclxuICAgICAgICAgICAgICAgIDwvc3Bhbj4gXHJcbiAgICAgICAgICAgICAgPC9kaXY+IFxyXG4gICAgICAgICAgICA8L2Rpdj4gXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgZGF0YS10b2dnbGU9XCJkcm9wZG93blwiIGRhdGEtYm91bmRhcnk9XCJ3aW5kb3dcIiBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiIGFyaWEtZXhwYW5kZWQ9IFwiZmFsc2VcIiBhcmlhLWxhYmVsbGVkYnk9XCIke3RoaXMuX3Byb3BlcnRpZXMuZ3JpZElkfV9Ecm9wZG93bk1lbnVcIj4gXHJcbiAgICAgICAgYDtcclxuICAgICAgICBpZiAodGhpcy5fcHJvcGVydGllcy5kYXRhVGFibGUuY29sU2V0dGluZ3MgPT0gdHJ1ZSl7XHJcbiAgICAgICAgICBfYnRuU2V0dGluZ3MgPSBfYnRuU2V0dGluZ3MgKyAgYDxkaXYgY2xhc3M9XCJkcm9wZG93bi1pdGVtIHNhb3AtdHh0LTQgc2FvcC10ZXh0LWxpbmsgZ3JpZENvbFNldHRpbmdzXCI+JHtfdGhpcy5fdHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIlVyZWphbmplIHN0b2xwY2V2XCIpfTwvZGl2PmA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9wcm9wZXJ0aWVzLmRhdGFUYWJsZS5jb2xSZXNpemVPbmx5ID09IHRydWUpe1xyXG4gICAgICAgICAgX2J0blNldHRpbmdzID0gX2J0blNldHRpbmdzICsgIGA8ZGl2IGNsYXNzPVwiZHJvcGRvd24taXRlbSBzYW9wLXR4dC00IHNhb3AtdGV4dC1saW5rIGdyaWRSZXNzZXRDb2xTZXR0aW5nc1wiPiR7X3RoaXMuX3RyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJQb25hc3Rhdmkgc3RvbHBjZVwiKX08L2Rpdj5gO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9fYnRuU2V0dGluZ3MgPSBfYnRuU2V0dGluZ3MgKyAgYDxkaXYgY2xhc3M9XCJkcm9wZG93bi1pdGVtIHNhb3AtdHh0LTQgc2FvcC10ZXh0LWxpbmsgZ3JpZEV4cG9ydFRvUERGXCI+JHtfdGhpcy5fdHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIkl6dm96aSB2IFBERlwiKX08L2Rpdj5gO1xyXG5cclxuICAgICAgICBfYnRuU2V0dGluZ3MgPSBfYnRuU2V0dGluZ3MgKyAgICBcclxuICAgICAgICBgXHJcbiAgICAgICAgICAgIDwvZGl2PiBcclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PiAgICAgICAgIFxyXG4gICAgICAgIGA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuX2NvbERpYWxvZ1Byb3BlcnRpZXMuYnRuUmVzZXRDb2xJZCA9IHRoaXMuX3Byb3BlcnRpZXMuZ3JpZElkLnJlcGxhY2UoXCIjXCIsXCJidG5cIikrXCJSZXNldENvbFwiO1xyXG4gICAgICBsZXQgX2RpYWxvZ0hUTUwgPSBgYDtcclxuICAgICAgX2RpYWxvZ0hUTUwgPSBcclxuICAgICAgYFxyXG4gICAgICA8c3R5bGU+XHJcbiAgICAgICAgLnVpLWRpYWxvZyB7XHJcbiAgICAgICAgICAgIHotaW5kZXg6MTAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICAudWktd2lkZ2V0LWhlYWRlciB7XHJcbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNGQ0ZDRkM7XHJcbiAgICAgICAgICBib3JkZXI6MXB4IHNvbGlkICNkZWUyZTYhaW1wb3J0YW50O1xyXG4gICAgICAgICAgbWFyZ2luOjEwcHg7ICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC51aS1kaWFsb2ctdGl0bGUge1xyXG4gICAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcclxuICAgICAgICAgIGZvbnQtc2l6ZTogMThweDtcclxuICAgICAgICAgIGxpbmUtaGVpZ2h0OiAyNHB4OyBcclxuICAgICAgICAgIGZvbnQtZmFtaWx5OidPcGVuIHNhbnMnO1xyXG4gICAgICAgIH1cclxuICAgICAgICAudWktZGlhbG9nIC51aS1kaWFsb2ctYnV0dG9ucGFuZSBidXR0b24ge1xyXG4gICAgICAgICAgZm9udC1mYW1pbHk6J09wZW4gc2Fucyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC51aS1kaWFsb2ctdGl0bGViYXItY2xvc2Uge1xyXG4gICAgICAgICAgY29udGVudDogXCJcXFxcZTkxMVwiO1xyXG4gICAgICAgICAgZGlzcGxheTpub25lO1xyXG4gICAgICAgIH1cclxuICAgICAgICAudWktc29ydGFibGUge1xyXG4gICAgICAgICAgcGFkZGluZzowcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC51aS1zb3J0YWJsZSBsaSB7XHJcbiAgICAgICAgICBtYXJnaW46IDEwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC51aS1kaWFsb2cgLnVpLWRpYWxvZy1idXR0b25wYW5lIHsgXHJcbiAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICAgICAgICBtYXJnaW46MHB4O1xyXG4gICAgICAgICAgcGFkZGluZzowcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC51aS1kaWFsb2cgLnVpLWRpYWxvZy1idXR0b25wYW5lIC51aS1kaWFsb2ctYnV0dG9uc2V0IHsgXHJcbiAgICAgICAgICAgIGZsb2F0OiBub25lO1xyXG4gICAgICAgIH0gICAgXHJcbiAgICAgICAgbGk6Om1hcmtlciB7XHJcbiAgICAgICAgICBjb250ZW50OlwiXCJcclxuICAgICAgICB9ICAgICAgICAgICAgICAgXHJcbiAgICAgIDwvc3R5bGU+ICAgICAgXHJcbiAgICAgXHJcbiAgICAgIDxkaXYgaWQ9XCJkaWFsb2dcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIiB0aXRsZT1cIiR7X3RoaXMuX3RyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJVcmVqYW5qZSBzdG9scGNldlwiKX1cIj5cclxuICAgICAgICA8b2wgaWQ9XCJzb3J0YWJsZVwiPjwvb2w+XHJcbiAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmctbGVmdDoxMHB4O1wiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4gc2FvcC10ZXh0LWxpbmsgc2FvcC10ZXh0LWxpbmstYmx1ZSBzYW9wLXR4dC01IG0tMCBwLTBcIiBpZD1cIiR7dGhpcy5fY29sRGlhbG9nUHJvcGVydGllcy5idG5SZXNldENvbElkfVwiIHRhYmluZGV4PVwiMFwiIHR5cGU9XCJidXR0b25cIj4ke190aGlzLl90cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiUG9uYXN0YXZpIHN0b2xwY2VcIil9PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PiAgICAgIFxyXG4gICAgICBgO1xyXG5cclxuICAgICAgZ3JpZFBhbmVsVGVtcGxhdGUgPSBgXHJcbiAgICAgICAgJHtfZGlhbG9nSFRNTH1cclxuICAgICAgICA8ZGl2IGlkPVwiJHt0aGlzLl9wcm9wZXJ0aWVzLnRvb2xiYXIuaWR9XCIgY2xhc3M9XCJwYW5lbCBwYW5lbC1kZWZhdWx0ICR7Z3JpZEJvcmRlckJvdHRvbX1cIiBzdHlsZT1cIm1pbi1oZWlnaHQ6MTUwcHg7XCI+XHJcbiAgICAgICAgICAke2dyaWRUb2dnbGVQYW5lbH1cclxuICAgICAgICAgIDxkaXYgaWQ9XCJjb2xsYXBzZSR7dGhpcy5fcHJvcGVydGllcy50b29sYmFyLmlkfVwiIGNsYXNzPVwic2FvcC1mb3JtLXBhbmVsLWJvZHkgJHtncmlkVG9nZ2xlUGFuZWxDbGFzc31cIj5cclxuICAgICAgICAgICAgJHtfYnRuU2V0dGluZ3N9XHJcbiAgICAgICAgICAgIDxkaXYgaWQ9XCJncmlkLXRvb2xiYXJcIiBjbGFzcz1cInNhb3AtdGFibGUtdG9vbGJhclwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgaWQ9XCJ0b29sYmFyQnV0dG9uc1wiIGNsYXNzPVwicm93IG1yLTAgbWwtMCBqdXN0aWZ5LWNvbnRlbnQtc3RhcnRcIiBzdHlsZT1cImhlaWdodDoxMDAlO1wiPlxyXG4gICAgICAgICAgICAgICR7X3Rvb2xiYXJJdGVtc31cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYW9wLXRhYmxlLWZpeGhlYWQgJHtfY3NzfVwiPlxyXG4gICAgICAgICAgICAgIDx0YWJsZSBpZD1cIiNzbGlja0dyaWQjXCI+PC90YWJsZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgYDtcclxuICAgIH1cclxuICAgIGdyaWRQYW5lbFRlbXBsYXRlID0gZ3JpZFBhbmVsVGVtcGxhdGUucmVwbGFjZShcIiNzbGlja0dyaWQjXCIsdGhpcy5fcHJvcGVydGllcy5ncmlkSWQucmVwbGFjZShcIiNcIixcIlwiKSk7XHJcbiAgICBncmlkUGFuZWwgPSAkKGdyaWRQYW5lbFRlbXBsYXRlKTtcclxuICAgIGlmICghaXNVbkRlZmluZWQodGhpcy5fcHJvcGVydGllcy50b29sYmFyKSkge1xyXG4gICAgICB0aGlzLmFkZFRvb2xiYXJCdXR0b25zKGdyaWRQYW5lbCx0aGlzLl9wcm9wZXJ0aWVzLnRvb2xiYXIuYnV0dG9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IF90YWJsZUh0bWwgPSB0aGlzLl90YWJsZURpdjtcclxuXHJcbiAgICAkKHRoaXMuX3Byb3BlcnRpZXMuZ3JpZElkKS5yZXBsYWNlV2l0aChncmlkUGFuZWwpO1xyXG5cclxuICAgICQodGhpcy5fcHJvcGVydGllcy5ncmlkSWQpLnJlcGxhY2VXaXRoKF90YWJsZUh0bWwpO1xyXG4gIH1cclxuXHJcbiAgcmVmcmVzaERhdGEoZGF0YTphbnkpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICB0aGlzLmRhdGFUYWJsZS5jbGVhcigpO1xyXG4gICAgZGF0YS5lYWNoKGZ1bmN0aW9uKCBpbmRleDphbnksIHRyOnN0cmluZyApIHtcclxuICAgICAgX3RoaXMuZGF0YVRhYmxlLnJvdy5hZGQoJCh0cikpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmRhdGFUYWJsZS5kcmF3KCk7ICAgIFxyXG4gIH1cclxuXHJcbiAgcmVvcmRlckNvbHVtbnMoaHRtbENvbnRlbnQ6c3RyaW5nKTpKUXVlcnk8SFRNTEVsZW1lbnQ+e1xyXG4gICAgbGV0IG9yZGVyID0gdGhpcy5kYXRhVGFibGUuY29sUmVvcmRlci5HZXRDdXJyZW50T3JkZXIoKTtcclxuICAgIC8vIyMjXHJcbiAgICBsZXQgcm93cyA9ICQoaHRtbENvbnRlbnQpLmZpbmQoJ3Rib2R5ID4gdHInKTtcclxuICAgIGxldCBfdGJvZHlOZXcgPSAgJChodG1sQ29udGVudCkuZmluZCgndGJvZHknKS5jbG9uZSgpO1xyXG4gICAgX3Rib2R5TmV3ID0gX3Rib2R5TmV3LmVtcHR5KCk7XHJcblxyXG4gICAgLy8kKCdib2R5JykuYXBwZW5kKCAkKGh0bWxDb250ZW50KS5maW5kKCd0Ym9keScpLmNsb25lKCkpO1xyXG5cclxuICAgIHJvd3MuZWFjaChmdW5jdGlvbihpbmRleDphbnksdHI6YW55KSB7XHJcbiAgICAgIGxldCBjb2xzID0galF1ZXJ5KHRoaXMpLmNoaWxkcmVuKCd0ZCcpO1xyXG4gICAgICBsZXQgX25ld1RyID0gJCh0cikuY2xvbmUoKS5lbXB0eSgpO1xyXG4gICAgICBmb3IgKGxldCBfb3JkZXIgb2Ygb3JkZXIpIHtcclxuICAgICAgICBfbmV3VHIuYXBwZW5kKGNvbHMuZXEoX29yZGVyKSk7XHJcbiAgICAgIH1cclxuICAgICAgX3Rib2R5TmV3LmFwcGVuZChfbmV3VHIpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8kKCdib2R5JykuYXBwZW5kKF90Ym9keU5ldyk7XHJcbiAgICBcclxuICAgIHJldHVybiBfdGJvZHlOZXc7XHJcbiAgfSAgXHJcblxyXG4gIHJlcGxhY2VHcmlkUm93cyhodG1sQ29udGVudDpzdHJpbmcpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICB0aGlzLmRhdGFUYWJsZS5jbGVhcigpO1xyXG4gICAgLy9cclxuICAgIGxldCBfdGJvZHlOZXc7XHJcbiAgICBpZiAodGhpcy5fc2F2ZVN0YXRlKXtcclxuICAgICAgX3Rib2R5TmV3ID1fdGhpcy5yZW9yZGVyQ29sdW1ucyhodG1sQ29udGVudCk7XHJcbiAgICAgIF90Ym9keU5ldy5maW5kKFwidHJcIikuZWFjaChcclxuICAgICAgICBmdW5jdGlvbihpbmRleDphbnksdHI6YW55KSB7XHJcbiAgICAgICAgICBfdGhpcy5kYXRhVGFibGUucm93LmFkZCgkKHRyKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICApOyAgICAgICAgXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBfdGJvZHlOZXcgPSAkKGh0bWxDb250ZW50KTtcclxuICAgICAgJCh0aGlzLl9wcm9wZXJ0aWVzLmdyaWRJZCtcIiA+IHRib2R5ID4gdHJcIiwgJChodG1sQ29udGVudCkpLmVhY2goXHJcbiAgICAgICAgZnVuY3Rpb24oaW5kZXg6YW55LHRyOmFueSkge1xyXG4gICAgICAgICAgX3RoaXMuZGF0YVRhYmxlLnJvdy5hZGQoJCh0cikpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTsgICAgICBcclxuICAgIH0gICBcclxuICAgIC8vdGhpcy5kYXRhVGFibGUuY29sUmVvcmRlci5vcmRlcihbMCwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMSwgMTAsIDExXSk7XHJcbiAgICB0aGlzLmRhdGFUYWJsZS5kcmF3KGZhbHNlKTsgICAgXHJcbiAgfSAgXHJcblxyXG4gIHNldFRhYmVsRm9vdGhlcigpOnZvaWQge1xyXG4gICAgJCh0aGlzLl9wcm9wZXJ0aWVzLmdyaWRJZCsnIGJvZHknKSAgXHJcbiAgfVxyXG5cclxuICBpbml0V2ViR3JpZENvbHVtbkNoZWNrYm94QmluZENsaWNrRXZlbnQoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgdGhpcy5tYXJrZWRDb2x1bW5DaGVja2JveCA9IG51bGw7XHJcblxyXG4gICAgaWYgKGlzVW5EZWZpbmVkKHRoaXMuX3RhYmxlRGl2KSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgJChcIiNcIiArIHRoaXMuX3RhYmxlRGl2LmlkICsgXCIgLnNhb3AtdGQtaW5wdXQtY2hlY2tib3hcIikub2ZmKFwiY2hhbmdlXCIpO1xyXG4gICAgJChcIiNcIiArIHRoaXMuX3RhYmxlRGl2LmlkICsgXCIgLnNhb3AtdGQtaW5wdXQtY2hlY2tib3hcIikub24oJ2NoYW5nZScsIGZ1bmN0aW9uIChyb3cpIHtcclxuICAgICAgX3RoaXMubWFya2VkQ29sdW1uQ2hlY2tib3ggPSAkKFwiI1wiICsgX3RoaXMuX3RhYmxlRGl2LmlkICsgXCIgI1wiICsgcm93LmN1cnJlbnRUYXJnZXQuaWQpO1xyXG5cclxuICAgICAgLy8gb2R6bmFjaW1vIHZzZSBvc3RhbGUgY2hlY2tib3hlXHJcbiAgICAgICQoXCIjXCIgKyBfdGhpcy5fdGFibGVEaXYuaWQgKyBcIiBpbnB1dC5zYW9wLXRkLWlucHV0LWNoZWNrYm94Om5vdCgjXCIgKyByb3cuY3VycmVudFRhcmdldC5pZCArIFwiKVwiKS5lYWNoKFxyXG4gICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICQoXCIjXCIgKyBfdGhpcy5fdGFibGVEaXYuaWQgKyBcIiAjXCIgKyB0aGlzLmlkKS5wcm9wKFwiY2hlY2tlZFwiLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICBfdGhpcy5hZnRlckNvbHVtbkNoZWNrYm94Q2hhbmdlZCgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhZnRlckNvbHVtbkNoZWNrYm94Q2hhbmdlZCgpOiB2b2lkIHtcclxuXHJcbiAgfVxyXG5cclxuICBtYXJrU2VsZWN0ZWRSb3coc2VsZWN0ZWRSb3c6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAvLyBvZHN0cmFuaW1vIGNzcyBcInNlbGVjdGVkX3Jvd1wiIGl6IHZzZWggdnJzdGljIFxyXG4gICAgJCh0aGlzLl9wcm9wZXJ0aWVzLmdyaWRJZCArIFwiID4gdGJvZHkgPiB0clwiKS5lYWNoKFxyXG4gICAgICBmdW5jdGlvbiAoaW5kZXg6IGFueSwgdHI6IGFueSkge1xyXG4gICAgICAgICQodHIpLnJlbW92ZUNsYXNzKFwic2FvcC10YWJsZS1zZWxlY3RlZC1yb3dcIik7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICAvLyBkb2RhbW8gY3NzIFwic2VsZWN0ZWRfcm93XCIgaXpicmFuaSB2cnN0aWNpXHJcbiAgICAkKHNlbGVjdGVkUm93KS5hZGRDbGFzcyhcInNhb3AtdGFibGUtc2VsZWN0ZWQtcm93XCIpO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VsZWN0ZWRSb3dzKGNvbElEOm51bWJlciA9IDApOnN0cmluZ1tdIHtcclxuICAgIGxldCBfcmVzdWx0IDogc3RyaW5nW10gPSBbXTtcclxuICAgIGxldCByb3dzX3NlbGVjdGVkID0gIHRoaXMuZGF0YVRhYmxlLmNvbHVtbihjb2xJRCkuY2hlY2tib3hlcy5zZWxlY3RlZCgpO1xyXG4gICAgaWYgKHJvd3Nfc2VsZWN0ZWQgIT0gbnVsbCkge1xyXG4gICAgICAkLmVhY2gocm93c19zZWxlY3RlZCwgZnVuY3Rpb24oaW5kZXg6YW55LCByb3dJZDphbnkpe1xyXG4gICAgICAgIF9yZXN1bHQucHVzaChyb3dJZCk7XHJcbiAgICAgIH0pICBcclxuICAgIH1cclxuICAgIHJldHVybiBfcmVzdWx0OyBcclxuICB9XHJcblxyXG4gIGdldFNlbGVjdGVkUm93c1YyKCk6c3RyaW5nW10ge1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImdldFNlbGVjdGVkUm93c1YyXCIpO1xyXG4gICAgbGV0IF9yZXN1bHQgOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgJCh0aGlzLl9wcm9wZXJ0aWVzLmdyaWRJZCtcIiB0ciB0ZC5kdC1jaGVja2JveGVzLWNlbGwgaW5wdXRbdHlwZT0nY2hlY2tib3gnXS5kdC1jaGVja2JveGVzXCIpLmVhY2goZnVuY3Rpb24gKGluZGV4OmFueSwgZTphbnkpIHtcclxuICAgICAgICBsZXQgY2hlY2tlZCA9ICQodGhpcykuaXMoXCI6Y2hlY2tlZFwiKTtcclxuICAgICAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICAgICAgICBfcmVzdWx0LnB1c2goaW5kZXgpO1xyXG4gICAgICAgIH1cclxuICAgIH0pOyAgIFxyXG4gICAgcmV0dXJuIF9yZXN1bHQ7ICAgXHJcbiAgfVxyXG5cclxuICBzZWxlY3RBbGxSb3dzKCk6dm9pZCB7XHJcbiAgICB0aGlzLmRhdGFUYWJsZS5jb2x1bW4oMCkuY2hlY2tib3hlcy5zZWxlY3QoKTtcclxuICB9ICBcclxuXHJcbiAgZGVzZWxlY3RBbGxSb3dzKCk6dm9pZCB7XHJcbiAgICB0aGlzLmRhdGFUYWJsZS5jb2x1bW4oMCkuY2hlY2tib3hlcy5kZXNlbGVjdCgpO1xyXG4gIH0gIFxyXG5cclxuICBzZXREZWZhdWx0Q29sdW1uc1N0YXRlKCk6dm9pZHtcclxuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuX3Byb3BlcnRpZXMuZ3JpZElkKTtcclxuICAgIC8vXHJcbiAgICBsZXQgX2luc3RhbmNlSUQgPSBcIkRhdGFUYWJsZXNfXCIrdGhpcy5fcHJvcGVydGllcy5ncmlkSWQucmVwbGFjZShcIiNcIixcIlwiKStcIl9cIitsb2NhdGlvbi5wYXRobmFtZTtcclxuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKF9pbnN0YW5jZUlEKTsgICAgIFxyXG4gICAgLy9cclxuICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xyXG4gIH1cclxuXHJcbiAgY3JlYXRlRGlhbG9nKCk6dm9pZCB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IGR0ID0gdGhpcy5kYXRhVGFibGUgYXMgYW55O1xyXG5cclxuICAgIHZhciB1bCA9ICQoJyNzb3J0YWJsZScpLnNvcnRhYmxlKHtheGlzOid5J30pO1xyXG4gICAgdWwuZW1wdHkoKTtcclxuXHJcbiAgICAkLmVhY2goZHQuY29sUmVvcmRlci5vcmRlcigpLCBmdW5jdGlvbiAoaWR4LCB2YWwpIHtcclxuICAgICAgdmFyIGNvbCA9IGR0LmNvbHVtbihpZHgpO1xyXG4gICAgICBsZXQgX3RoID0gY29sLmhlYWRlcigpO1xyXG4gICAgICBsZXQgX2lzVmlzaWJsZSA9IHRydWU7XHJcbiAgICAgIGxldCBfY2xhc3NOYW1lID0gX3RoLmNsYXNzTmFtZS50b0xvd2VyQ2FzZSgpIGFzIHN0cmluZztcclxuICAgICAgaWYgKHNjcmVlbi53aWR0aCA+IDQwMCl7XHJcbiAgICAgICAgaWYgKF9jbGFzc05hbWUuaW5jbHVkZXMoXCJkLW5vbmUtZGVza3RvcFwiLnRvTG93ZXJDYXNlKCkpKXtcclxuICAgICAgICAgIF9pc1Zpc2libGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKF9jbGFzc05hbWUuaW5jbHVkZXMoXCJkLW5vbmUtbW9iaWxlXCIudG9Mb3dlckNhc2UoKSkpe1xyXG4gICAgICAgICAgX2lzVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIH0gICAgICAgIFxyXG4gICAgICB9XHJcbiAgICAgXHJcbiAgICAgIGxldCBfZmllbGRDYXB0aW9uID0gXCI/XCI7XHJcbiAgICAgIGlmIChfdGguY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIF9maWVsZENhcHRpb24gPSBfdGguZmlyc3RDaGlsZC5pbm5lclRleHQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgX2ZpZWxkQ2FwdGlvbiA9IF90aC5pbm5lclRleHQ7XHJcbiAgICAgIH1cclxuICAgICAgX2ZpZWxkQ2FwdGlvbiA9IF9maWVsZENhcHRpb24udHJpbSgpO1xyXG4gICAgICBcclxuICAgICAgbGV0IF9jaGVja2VkID0gJyBjaGVja2VkJzsgICAgICBcclxuICAgICAgaWYgKF9pc1Zpc2libGUgPT0gZmFsc2UpIHtcclxuICAgICAgICBfZmllbGRDYXB0aW9uID0gXCJcIjtcclxuICAgICAgICBfY2hlY2tlZCA9ICcnO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBcclxuICAgICAgbGV0IF9kaXNwbGF5ID0gXCJcIjtcclxuICAgICAgaWYgKF9maWVsZENhcHRpb24ubGVuZ3RoID09IDApe1xyXG4gICAgICAgIF9kaXNwbGF5ID0gXCJkaXNwbGF5Om5vbmU7XCI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBfdWwgPSBcclxuICAgICAgICAnPGxpIHN0eWxlPVwiJytfZGlzcGxheSsnXCIgZGF0YS1zb3J0PVwiJyArIHZhbCArICdcIj4nXHJcbiAgICAgICAgKyc8c3BhbiBjbGFzcz1cXFwic2FvcC1pbWctZ3JpcCBzaS1zXFxcIiBzdHlsZT1cXFwibWFyZ2luLXJpZ2h0OjEwcHg7IGN1cnNvcjogZ3JhYjsgZm9udC1zaXplOjE2cHg7XFxcIj48L3NwYW4+J1xyXG4gICAgICAgICsnPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIHZhbHVlPVwiJyArIF9maWVsZENhcHRpb24gKyAnXCInIFxyXG4gICAgICAgICsgKGNvbC52aXNpYmxlKCkgPyBfY2hlY2tlZCA6ICcnKSArICc+Jm5ic3A7J1xyXG4gICAgICAgICsnPHNwYW4gc3R5bGU9XCJjdXJzb3I6Z3JhYlwiPicgKyBfZmllbGRDYXB0aW9uICsgJzwvc3Bhbj4nXHJcbiAgICAgICAgKyc8L2xpPic7XHJcblxyXG4gICAgICB1bC5hcHBlbmQoX3VsKTsgICAgICBcclxuICAgIH0pOyBcclxuXHJcbiAgICB0aGlzLnVwZGF0ZURpYWxvZygpOyAgICBcclxuICAgIHRoaXMuX2RpYWxvZy5kaWFsb2coJ29wZW4nKTtcclxuXHJcbiAgICBsZXQgX2J0blJlc2V0Q29sID0gJChcIiNcIit0aGlzLl9jb2xEaWFsb2dQcm9wZXJ0aWVzLmJ0blJlc2V0Q29sSWQpO1xyXG4gICAgX2J0blJlc2V0Q29sLm9mZihcImNsaWNrXCIsX3RoaXMuc2V0RGVmYXVsdENvbHVtbnNTdGF0ZS5iaW5kKF90aGlzKSk7XHJcbiAgICBfYnRuUmVzZXRDb2wub24oXCJjbGlja1wiLF90aGlzLnNldERlZmF1bHRDb2x1bW5zU3RhdGUuYmluZChfdGhpcykpOyAgICAgICAgICAgICAgXHJcblxyXG4gIH1cclxuXHJcbiAgdXBkYXRlRGlhbG9nKCk6dm9pZCB7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHZhciB1bCA9ICQoJyNzb3J0YWJsZScpLnNvcnRhYmxlKCk7XHJcblxyXG4gICAgdGhpcy5fZGlhbG9nID0gJCgnI2RpYWxvZycpLmRpYWxvZyh7XHJcbiAgICAgIG1vZGFsOiB0cnVlLFxyXG4gICAgICBhdXRvT3BlbjogZmFsc2UsXHJcbiAgICAgIGJ1dHRvbnM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICB0ZXh0OiB0aGlzLl90cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKCdTaHJhbmknKSxcclxuICAgICAgICAgIGNsYXNzOiBcImJ0biBzYW9wLWJ1dHRvbi1wcmltYXJ5XCIsXHJcbiAgICAgICAgICBjbGljazogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBsZXQgZHQgPSBfdGhpcy5kYXRhVGFibGUgYXMgYW55O1xyXG5cclxuICAgICAgICAgICAgdmFyIGNvbHMgPSB1bC5zb3J0YWJsZSgndG9BcnJheScsIHsgYXR0cmlidXRlOiAnZGF0YS1zb3J0JyB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIC8vXHJcbiAgICAgICAgICAgIC8vIGR0LmNvbHVtbnMoKS5oZWFkZXIoKS5lYWNoKGZ1bmN0aW9uKHZhbHVlOmFueSwgaW5kZXg6YW55KXtcclxuICAgICAgICAgICAgLy8gICBpZiAoICQodmFsdWUpLmhhc0NsYXNzKCduby1zb3J0JykgKSB7XHJcbiAgICAgICAgICAgIC8vICAgICAgLy8gU2V0IGNvbHVtbiB3aWR0aCBoZXJlXHJcbiAgICAgICAgICAgIC8vICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZygndmFsdWU6Jyt2YWx1ZSk7XHJcbiAgICAgICAgICAgIC8vICAgICAgY29scy51bnNoaWZ0KGluZGV4LnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAvLyAgIH1cclxuICAgICAgICAgICAgLy8gfSkgICAgICAgXHJcbiAgICAgICAgICAgIC8vIC8vXHJcblxyXG4gICAgICAgICAgICAvLyBjb2xzLnVuc2hpZnQoXCIwXCIpO1xyXG4gICAgICAgICAgICAvLyBjb2xzLnB1c2goXCIxMFwiKTtcclxuXHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoY29scyk7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoZHQuY29sUmVvcmRlci50cmFuc3Bvc2UoIGNvbHMgKSk7XHJcbiAgICAgICAgICAgIGNvbHMgPSBkdC5jb2xSZW9yZGVyLnRyYW5zcG9zZSggQXJyYXkuZnJvbShjb2xzLm1hcChOdW1iZXIpKSApO1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKGR0LmNvbFJlb3JkZXIudHJhbnNwb3NlKCBjb2xzICkpO1xyXG4gICAgICAgICAgICBkdC5jb2xSZW9yZGVyLm9yZGVyKGNvbHMpO1xyXG5cclxuICAgICAgICAgICAgdmFyIHNob3cgPSAkKCcjc29ydGFibGUgbGkgPiBpbnB1dDpjaGVja2VkJykubWFwKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnRFbGVtZW50LmRhdGFzZXQuc29ydDtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgc2hvdzEgPSBBcnJheS5mcm9tKEFycmF5LmZyb20oc2hvdywgaXRlbSA9PiBOdW1iZXIoaXRlbSkpKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHNob3cxLnVuc2hpZnQoMCk7XHJcbiAgICAgICAgICAgIC8vIHNob3cxLnB1c2goMTApOyAgICAgICAgICAgICAgICBcclxuXHJcbiAgICAgICAgICAgIHNob3cxID0gZHQuY29sUmVvcmRlci50cmFuc3Bvc2UoIHNob3cxICk7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoc2hvdzEpO1xyXG4gICAgICAgICAgICBkdC5jb2x1bW5zKCBzaG93MSApLnZpc2libGUodHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAvL3ZhciBoaWRlID0gJChjb2xzKS5ub3Qoc2hvdyk7XHJcbiAgICAgICAgICAgIHZhciBoaWRlID0gY29scy5maWx0ZXIoKHg6YW55KSA9PiBzaG93MS5pbmRleE9mKHgpPT09LTEpO1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKGhpZGUpO1xyXG4gICAgICAgICAgICBkdC5jb2x1bW5zKCBoaWRlICkudmlzaWJsZShmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAkKHRoaXMpLmRpYWxvZygnY2xvc2UnKTtcclxuXHJcbiAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaWQ6XCJidG5DYW5jZWxcIixcclxuICAgICAgICAgIHRleHQ6IF90aGlzLl90cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiUHJla2xpxI1pXCIpLFxyXG4gICAgICAgICAgY2xhc3M6IFwiYnRuIHNhb3AtYnV0dG9uLXNlY29uZGFyeVwiLFxyXG4gICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAkKHRoaXMpLmRpYWxvZygnY2xvc2UnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCAgICAgICAgXHJcbiAgICAgIF0sXHJcbiAgICAgIGNsb3NlOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAvL2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQuYmx1cigpOyAgICBcclxuICAgICAgfSBcclxuICAgIH0pOyAgICBcclxuXHJcbiAgfVxyXG5cclxuICBpbml0RXZlbnRMaXN0bmVycygpOnZvaWR7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgaWYgKHRoaXMuX3Byb3BlcnRpZXMuZGF0YVRhYmxlLmNvbFJlc2l6ZU9ubHkgPT0gdHJ1ZSl7XHJcbiAgICAgIGxldCBfYnRuU2V0dGluZ3MgPSAkKFwiI1wiK3RoaXMuX3Byb3BlcnRpZXMudG9vbGJhci5pZCtcIlwiKS5maW5kKFwiLmdyaWRSZXNzZXRDb2xTZXR0aW5nc1wiKTtcclxuICAgICAgX2J0blNldHRpbmdzLm9mZihcImNsaWNrXCIsX3RoaXMuc2V0RGVmYXVsdENvbHVtbnNTdGF0ZS5iaW5kKF90aGlzKSk7XHJcbiAgICAgIF9idG5TZXR0aW5ncy5vbihcImNsaWNrXCIsX3RoaXMuc2V0RGVmYXVsdENvbHVtbnNTdGF0ZS5iaW5kKF90aGlzKSk7ICAgIFxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX3Byb3BlcnRpZXMuZGF0YVRhYmxlLmNvbFNldHRpbmdzID09IHRydWUpe1xyXG4gICAgICAvL1xyXG4gICAgICBsZXQgX2J0blNldFNldHRpbmdzID0gJChcIiNcIit0aGlzLl9wcm9wZXJ0aWVzLnRvb2xiYXIuaWQrXCJcIikuZmluZChcIi5ncmlkQ29sU2V0dGluZ3NcIik7XHJcbiAgICAgIF9idG5TZXRTZXR0aW5ncy5vZmYoXCJjbGlja1wiLF90aGlzLmNyZWF0ZURpYWxvZy5iaW5kKF90aGlzKSk7XHJcbiAgICAgIF9idG5TZXRTZXR0aW5ncy5vbihcImNsaWNrXCIsX3RoaXMuY3JlYXRlRGlhbG9nLmJpbmQoX3RoaXMpKTsgICAgICAgXHJcbiAgICAgIC8vICAgICAgIFxyXG4gICAgfVxyXG4gICAgLy9cclxuICAgIC8vIGxldCBfZ3JpZEV4cG9ydFRvUERGID0gJChcIiNcIit0aGlzLl9wcm9wZXJ0aWVzLnRvb2xiYXIuaWQrXCJcIikuZmluZChcIi5ncmlkRXhwb3J0VG9QREZcIik7XHJcbiAgICAvLyBfZ3JpZEV4cG9ydFRvUERGLm9mZihcImNsaWNrXCIsX3RoaXMuZXhwb3J0VG9QZGYuYmluZChfdGhpcykpO1xyXG4gICAgLy8gX2dyaWRFeHBvcnRUb1BERi5vbihcImNsaWNrXCIsX3RoaXMuZXhwb3J0VG9QZGYuYmluZChfdGhpcykpOyAgICAgICAgICAgXHJcbiAgfVxyXG5cclxuICBzZXRSZXNpemFibGVDb2x1bW4oKTp2b2lke1xyXG4gICAgLy9hZGQgcGhhbnRvbSBjb2x1bW4gaW4gY2FzZSBvZiBoaWRkZW4gY29sdW1uc1xyXG4gICAgJCh0aGlzLl9wcm9wZXJ0aWVzLmdyaWRJZCsnIHRyJykuZmluZChcInRoOmxhc3RcIikucmVtb3ZlQ2xhc3MoXCJzYW9wLXRhYmxlLXRoLWxhc3RcIik7XHJcbiAgICAkKHRoaXMuX3Byb3BlcnRpZXMuZ3JpZElkKycgdHInKS5maW5kKFwidGg6bGFzdFwiKS5hZGRDbGFzcyhcInNhb3AtdGFibGUtdGgtbGFzdC1yZXNcIik7XHJcbiAgfVxyXG5cclxuICAvL1xyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v1xyXG5leHBvcnQgaW50ZXJmYWNlIFNhb3BJbnB1dFdGTFByb3BlcnRpZXMge1xyXG4gICAgaWQ6c3RyaW5nO1xyXG4gICAgcGxhY2Vob2xkZXI6c3RyaW5nO1xyXG4gICAgY2FwdGlvbjpzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wSW5wdXRXRkwge1xyXG4gICAgcHJpdmF0ZSBfaW5wdXRUZW1wbGF0ZTpzdHJpbmc7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0aWVzOlNhb3BJbnB1dFdGTFByb3BlcnRpZXMpIHtcclxuICAgICAgICB0aGlzLl9pbnB1dFRlbXBsYXRlID0gXHJcbiAgICAgICAgYFxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2FvcC1jb2wtZmlsdGVyLWdyb3VwXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBhdXRvY29tcGxldGU9XCJvZmZcIiBjbGFzcz1cImZvcm0tY29udHJvbCBzaGFkb3ctbm9uZSBzYW9wLWNvbnRyb2wgc2FvcC1jb250cm9sLWxpc3RCb3ggc2FvcC1jb2wtZmlsdGVyLWlucHV0XCIgc3R5bGU9XCJ3aWR0aDpjYWxjKDEwMCUgLSAxMHB4KSAhaW1wb3J0YW50O1wiIGlkPVwiJHtwcm9wZXJ0aWVzLmlkfVwiIG5hbWU9XCIke3Byb3BlcnRpZXMuaWR9XCIgcGxhY2Vob2xkZXI9XCIke3Byb3BlcnRpZXMucGxhY2Vob2xkZXJ9XCIgdGFiaW5kZXg9XCIwXCIgdHlwZT1cInRleHRcIiB2YWx1ZT1cIlwiPlxyXG4gICAgICAgICAgICA8aSBpZD1cInNlYXJjaEljb25cIiBjbGFzcz1cInNhb3AtaW1nLXNlYXJjaCBzaS1zIGZvcm0tY29udHJvbC1mZWVkYmFja1wiIHN0eWxlPVwiY3Vyc29yOnBvaW50ZXI7dG9wOjVweDtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OiBjYWxjKDEwMCUgLSA0MHB4KSAhaW1wb3J0YW50O1wiLz5cclxuICAgICAgICA8L3NwYW4+ICAgICAgICBcclxuICAgICAgICBgOyAgICAgICAgICAgICAgXHJcbiAgICAgICAgLy8gdGhpcy5faW5wdXRUZW1wbGF0ZSA9IFxyXG4gICAgICAgIC8vIGBcclxuICAgICAgICAvLyA8c3BhbiBjbGFzcz1cImhhcy1mbG9hdC1sYWJlbFwiPlxyXG4gICAgICAgIC8vICAgICA8aW5wdXQgYXV0b2NvbXBsZXRlPVwib2ZmXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2hhZG93LW5vbmUgc2FvcC1jb250cm9sIHNhb3AtY29udHJvbC1saXN0Qm94XCIgZGF0YS1pbnB1dG1hc2stYWxpYXM9XCJkZC5tbS55eXl5IGhoOm1tXCIgaWQ9XCIke3Byb3BlcnRpZXMuaWR9XCIgbmFtZT1cIiR7cHJvcGVydGllcy5pZH1cIiBwbGFjZWhvbGRlcj1cIiR7cHJvcGVydGllcy5wbGFjZWhvbGRlcn1cIiB0YWJpbmRleD1cIjBcIiB0eXBlPVwidGV4dFwiIHZhbHVlPVwiXCIgZGlzYWJsZWQ9XCJcIj5cclxuICAgICAgICAvLyAgICAgPGxhYmVsIGNsYXNzPVwic2FvcC1mbG9hdGluZy1sYWJlbCBzYW9wLXR4dC03XCIgZm9yPVwiJHtwcm9wZXJ0aWVzLmlkfVwiPiR7cHJvcGVydGllcy5jYXB0aW9ufTwvbGFiZWw+XHJcbiAgICAgICAgLy8gICAgIDxpIGlkPVwiY2FsZW5kYXJJY29uXCIgY2xhc3M9XCJzYW9wLWltZy1jYWxlbmRhciBzaS1zIGZvcm0tY29udHJvbC1mZWVkYmFja1wiIHN0eWxlPVwiY3Vyc29yOnBvaW50ZXI7bGVmdDoyMzBweDt0b3A6NXB4O3Bvc2l0aW9uOmFic29sdXRlO1wiLz5cclxuICAgICAgICAvLyA8L3NwYW4+ICAgICAgICBcclxuICAgICAgICAvLyBgOyAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RWxlbWVudCgpOkpRdWVyeTxIVE1MRWxlbWVudD57XHJcbiAgICAgICAgbGV0IF9lbGVtZW50ID0gJCh0aGlzLl9pbnB1dFRlbXBsYXRlKTtcclxuICAgICAgICByZXR1cm4gX2VsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SW5uZXJIdG1sKCk6c3RyaW5ne1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pbnB1dFRlbXBsYXRlO1xyXG4gICAgfVxyXG5cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v1xyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL2Jvb3RzdHJhcC1kYXRldGltZXBpY2tlci9pbmRleC5kLnRzXCIgLz5cclxuaW1wb3J0IHsgY29udmVydFN0cmluZzJEYXRlLCBnbG9iYWwsaXNFbXB0eSB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wSW5wdXRNYXNrIHtcclxuXHJcbiAgICBpbml0KCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wSW5wdXRNYXNrLmluaXQuLi5cIik7XHJcbiAgICAgICAgdmFyIGlucHV0RGl2cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCdpbnB1dFtkYXRhLWlucHV0bWFzay1hbGlhc10nKTtcclxuICAgICAgICBJbnB1dG1hc2soKS5tYXNrKGlucHV0RGl2cyk7XHJcblxyXG4gICAgICAgICQoXCIuc2FvcC1kZWNpbWFsLTJcIikuaW5wdXRtYXNrKHtcclxuICAgICAgICAgICAgJ2FsaWFzJzogJ2RlY2ltYWwnLFxyXG4gICAgICAgICAgICAncmFkaXhQb2ludCc6ICcsJyxcclxuICAgICAgICAgICAgJ2RpZ2l0cyc6IDIsXHJcbiAgICAgICAgICAgICdkaWdpdHNPcHRpb25hbCc6IGZhbHNlLFxyXG4gICAgICAgICAgICAncGxhY2Vob2xkZXInOiAnMCwwMCdcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJChcIi5zYW9wLWRlY2ltYWwtM1wiKS5pbnB1dG1hc2soe1xyXG4gICAgICAgICAgICAnYWxpYXMnOiAnZGVjaW1hbCcsXHJcbiAgICAgICAgICAgICdyYWRpeFBvaW50JzogJywnLFxyXG4gICAgICAgICAgICAnZGlnaXRzJzogMyxcclxuICAgICAgICAgICAgJ2RpZ2l0c09wdGlvbmFsJzogZmFsc2UsXHJcbiAgICAgICAgICAgICdwbGFjZWhvbGRlcic6ICcwLDAwMCdcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaW5wdXREaXZzLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJlbGVtZW50LmluaXQuLi4uLi4uLi4uLi4uLi4uLi4uLi4uXCIgKyBlbGVtZW50LmlkKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgICAgIGxldCBzcGFuRGl2OmFueTtcclxuICAgICAgICAgICAgbGV0IGVsZW1lbnRBdHJyID0gJChlbGVtZW50KS5hdHRyKFwiZGF0YS1pbnB1dG1hc2stYWxpYXNcIik7XHJcbiAgICAgICAgICAgIGlmIChpc0VtcHR5KGVsZW1lbnRBdHJyKSkge3JldHVybjt9O1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKGVsZW1lbnRBdHJyKTtcclxuICAgICAgICAgICAgc3BhbkRpdiA9ICQoZWxlbWVudCkucGFyZW50KCk7XHJcbiAgICAgICAgICAgIGlmIChzcGFuRGl2ID09PSBudWxsKSB7IHJldHVybjt9O1xyXG4gICAgICAgICAgICBpZiAoc3BhbkRpdi5oYXNDbGFzcyhcImhhcy1mbG9hdC1sYWJlbFwiKT09PWZhbHNlKSB7IHJldHVybjt9O1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKHNwYW5EaXYuZ2V0KDApLmlkKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBsYW5ndWFnZUF0cnIgPSAoU3RyaW5nKSgkKFwiI3NpdGVMYW5ndWFnZVwiKS52YWwoKSk7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJsYW5ndWFnZTpcIitsYW5ndWFnZUF0cnIpO1xyXG4gICAgICAgICAgICBsYW5ndWFnZUF0cnIgPSBpc0VtcHR5KGxhbmd1YWdlQXRycikgPyBcInNsXCIgOmxhbmd1YWdlQXRycjtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImxhbmd1YWdlOlwiK2xhbmd1YWdlQXRycik7XHJcblxyXG4gICAgICAgICAgICBpZiAoZWxlbWVudEF0cnIgPT09IFwiaGg6bW06c3NcIikge1xyXG4gICAgICAgICAgICAgICAgbGV0IGljb25CdG4gPSAkKHNwYW5EaXYpLmZpbmQoXCIjdGltZUljb25cIik7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY2xvY2suLi5cIik7XHJcblxyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImNsb2NrLmZvY3VzLmluaXQ6XCIgKyBlbGVtZW50LmlkKTtcclxuICAgICAgICAgICAgICAgICQoZWxlbWVudCkuZm9jdXMoZnVuY3Rpb24gKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY2FsbC5jbG9jay5mb2N1czpcIiArIGV2ZW50LnRhcmdldC5pZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNlIGplIGJpbCBmb2t1c2lyYW4geiB0YWIsIGRhbW8gbWFsaSB0aW1lb3V0LCBrZXIgZHJ1Z2FjZSBuZSBkZWxhXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRpbWVPdXQgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy53YXNUYWJQcmVzc2VkKGV2ZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lT3V0ID0gMjAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbnB1dEN0cmw6IEhUTUxJbnB1dEVsZW1lbnQgPSBldmVudC50YXJnZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmlucHV0U2VsZWN0QWxsVGV4dChpbnB1dEN0cmwpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sIHRpbWVPdXQpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImNsb2NrLmJsdXIuaW5pdDpcIiArIGVsZW1lbnQuaWQpO1xyXG4gICAgICAgICAgICAgICAgJChlbGVtZW50KS5ibHVyKGZ1bmN0aW9uIChldmVudDogYW55KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImNhbGwuY2xvY2suYmx1cjpcIiArIGV2ZW50LnRhcmdldC5pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRyb2xWYWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29udHJvbFZhbHVlLmluY2x1ZGVzKFwiaFwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xWYWx1ZSA9IGNvbnRyb2xWYWx1ZS5yZXBsYWNlKFwibW1cIiwgXCIwMFwiKTtcclxuICAgICAgICAgICAgICAgICAgICBjb250cm9sVmFsdWUgPSBjb250cm9sVmFsdWUucmVwbGFjZShcIm1cIiwgXCIwXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xWYWx1ZSA9IGNvbnRyb2xWYWx1ZS5yZXBsYWNlKFwic3NcIiwgXCIwMFwiKTtcclxuICAgICAgICAgICAgICAgICAgICBjb250cm9sVmFsdWUgPSBjb250cm9sVmFsdWUucmVwbGFjZShcInNcIiwgXCIwXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9IGNvbnRyb2xWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBwcm96aW1vIGlucHV0IGV2ZW4sIGtlciBzbW8gdnBpc2FsaSBub3ZvIHZyZWRub3N0IFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBuZXcgRXZlbnQoXCJpbnB1dFwiKTtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC50YXJnZXQuZGlzcGF0Y2hFdmVudChlKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjbG9jay5jbGljay5pbml0OlwiICsgZWxlbWVudC5pZCk7XHJcbiAgICAgICAgICAgICAgICAkKGljb25CdG4pLmNsaWNrKGZ1bmN0aW9uIChldmVudDogYW55KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImNsb2NrSWNvbi5jbGlja2VkOlwiICsgZWxlbWVudC5pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGN0cmxJbnB1dEN0cmwgPSAkKGVsZW1lbnQpLmdldCgwKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIGN0cmxJbnB1dEN0cmwuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRBdHJyID09PSBcImRkLm1tLnl5eXlcIlxyXG4gICAgICAgICAgICAgICAgLy8gfHwgZWxlbWVudEF0cnIgPT09IFwiZGQubW0ueXl5eSBoaDptbVwiIFxyXG4gICAgICAgICAgICAgICAgLy8gfHwgZWxlbWVudEF0cnIgPT09IFwiZGQubW0ueXl5eSBoaDptbTpzc1wiXHJcbiAgICAgICAgICAgICkge1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBpY29uQnRuID0gJChzcGFuRGl2KS5maW5kKFwiI2NhbGVuZGFySWNvblwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY2FsZW5kYXIuLi5cIik7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGRhdGVwaWNrZXJTdGFydERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCQoZWxlbWVudCkuYXR0cihcImRhdGEtZW5hYmxlLXNlbGVjdC1wYXN0ZGF0ZXNcIikgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCgkKGVsZW1lbnQpLmF0dHIoXCJkYXRhLWVuYWJsZS1zZWxlY3QtcGFzdGRhdGVzXCIpKS50b0xvd2VyQ2FzZSgpID09ICd0cnVlJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRlcGlja2VyU3RhcnREYXRlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCQoZWxlbWVudCkuYXR0cihcImRhdGEtbWluLXN0YXJ0LWRhdGVcIikgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGVwaWNrZXJTdGFydERhdGUxID0gJChlbGVtZW50KS5hdHRyKFwiZGF0YS1taW4tc3RhcnQtZGF0ZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICBkYXRlcGlja2VyU3RhcnREYXRlID0gY29udmVydFN0cmluZzJEYXRlKGRhdGVwaWNrZXJTdGFydERhdGUxLCBcImRkLm1tLnl5eXlcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGRhdGVwaWNrZXJFbmREYXRlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmICgkKGVsZW1lbnQpLmF0dHIoXCJkYXRhLW1heC1lbmQtZGF0ZVwiKSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBkYXRlcGlja2VyRW5kRGF0ZSA9ICQoZWxlbWVudCkuYXR0cihcImRhdGEtbWF4LWVuZC1kYXRlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGVwaWNrZXJFbmREYXRlID0gY29udmVydFN0cmluZzJEYXRlKGRhdGVwaWNrZXJFbmREYXRlLCBcImRkLm1tLnl5eXlcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgJChlbGVtZW50KS5kYXRlcGlja2VyKHtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydERhdGU6IGRhdGVwaWNrZXJTdGFydERhdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kRGF0ZTogZGF0ZXBpY2tlckVuZERhdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgYXV0b2Nsb3NlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIGtleWJvYXJkTmF2aWdhdGlvbjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgd2Vla1N0YXJ0OiAxLFxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdDogXCJkZC5tbS55eXl5XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U6IGxhbmd1YWdlQXRycixcclxuICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbjogXCJib3R0b20gcmlnaHRcIixcclxuICAgICAgICAgICAgICAgICAgICBzaG93T25Gb2N1czpmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIC8vZm9yY2VQYXJzZTpmYWxzZSxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICQoZWxlbWVudCkuZm9jdXMoZnVuY3Rpb24gKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY2FsZW5kYXIuLi5mb2N1czpcIiArIGV2ZW50LnRhcmdldC5pZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNlIGplIGJpbCBmb2t1c2lyYW4geiB0YWIsIGRhbW8gbWFsaSB0aW1lb3V0LCBrZXIgZHJ1Z2FjZSBuZSBkZWxhXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRpbWVPdXQgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy53YXNUYWJQcmVzc2VkKGV2ZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lT3V0ID0gMjAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbnB1dEN0cmw6IEhUTUxJbnB1dEVsZW1lbnQgPSBldmVudC50YXJnZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmlucHV0U2VsZWN0QWxsVGV4dChpbnB1dEN0cmwpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sIHRpbWVPdXQpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgJChpY29uQnRuKS5jbGljayhmdW5jdGlvbigpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImNhbGVuZGFyLi4uY2xpY2tcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGVwaWNrZXJJbnB1dEN0cmwgPSAkKGVsZW1lbnQpLmdldCgwKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIC8vZGF0ZXBpY2tlcklucHV0Q3RybC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgICQoZWxlbWVudCkuZGF0ZXBpY2tlcihcInNob3dcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuaW5wdXRTZWxlY3RBbGxUZXh0KGRhdGVwaWNrZXJJbnB1dEN0cmwpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRBdHJyID09PSBcImRkLm1tLnl5eXkgaGg6bW1cIikge1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImRhdGV0aW1lcGlja2VyIGhoOm1tIC4uLlwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgaWNvbkJ0biA9ICQoc3BhbkRpdikuZmluZChcIiNjYWxlbmRhckljb25cIik7XHJcbiAgICAgICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICAgICAgJChlbGVtZW50KVxyXG4gICAgICAgICAgICAgICAgICAgIC5iaW5kKCdrZXlkb3duJyxmdW5jdGlvbihlKXtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAuZGF0ZXRpbWVwaWNrZXIoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6ICdERC5NTS5ZWVlZIEg6bW0nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGU6IGxhbmd1YWdlQXRycixcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1RvZGF5QnV0dG9uOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICQoZWxlbWVudCkub24oXCJkcC5jaGFuZ2VcIiwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoXCJEYXRlVGltZVBpY2tlclwiKS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgJChlbGVtZW50KS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGVwaWNrZXJJbnB1dEN0cmwgPSAkKGVsZW1lbnQpLmdldCgwKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGVwaWNrZXJJbnB1dEN0cmwuc2V0U2VsZWN0aW9uUmFuZ2UoMTEsMTYsXCJmb3J3YXJkXCIpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgJChlbGVtZW50KS5vZmYoXCJmb2N1c1wiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAkKGljb25CdG4pLmNsaWNrKGZ1bmN0aW9uKClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLmRhdGEoXCJEYXRlVGltZVBpY2tlclwiKS5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudEF0cnIgPT09IFwiZGQubW0ueXl5eSBoaDptbTpzc1wiKSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiZGF0ZXRpbWVwaWNrZXIgaGg6bW06c3MgLi4uXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBpY29uQnRuID0gJChzcGFuRGl2KS5maW5kKFwiI2NhbGVuZGFySWNvblwiKTtcclxuICAgICAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgICAgICAkKGVsZW1lbnQpXHJcbiAgICAgICAgICAgICAgICAgICAgLmJpbmQoJ2tleWRvd24nLGZ1bmN0aW9uKGUpe1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIC5kYXRldGltZXBpY2tlcih7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogJ0RELk1NLllZWVkgSDptbTpzcycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZTogbGFuZ3VhZ2VBdHJyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93VG9kYXlCdXR0b246IHRydWVcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLm9mZihcImZvY3VzXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vICQoZWxlbWVudCkub24oXCJkcC5jaGFuZ2VcIiwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vICAgICAkKHRoaXMpLmRhdGEoXCJEYXRlVGltZVBpY2tlclwiKS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgLy9cclxuICAgICAgICAgICAgICAgIC8vICAgICAkKGVsZW1lbnQpLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgdmFyIGRhdGVwaWNrZXJJbnB1dEN0cmwgPSAkKGVsZW1lbnQpLmdldCgwKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIHZhciBkYXRlcGlja2VySW5wdXRDdHJsU3RyTGVuZ3RoID0gZGF0ZXBpY2tlcklucHV0Q3RybC52YWx1ZS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgZGF0ZXBpY2tlcklucHV0Q3RybC5zZXRTZWxlY3Rpb25SYW5nZSgxMSwzKTsgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgLy8gfSk7ICAgICAgICAgICAgICAgICAgXHJcblxyXG4gICAgICAgICAgICAgICAgJChlbGVtZW50KS5jbGljayhmdW5jdGlvbigpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgJChlbGVtZW50KS5kYXRhKFwiRGF0ZVRpbWVQaWNrZXJcIikuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8kKGVsZW1lbnQpLm9mZihcImtleWRvd25cIik7XHJcbiAgICAgICAgICAgICAgICAvLyAub24oJ2RwLmhpZGUnLCBmdW5jdGlvbihlKXtcclxuICAgICAgICAgICAgICAgIC8vICAgICBjb25zb2xlLmxvZygnZHAuaGlkZScpO1xyXG4gICAgICAgICAgICAgICAgLy8gICB9KSAgIFxyXG4gICAgICAgICAgICAgICAgLy8gLm9uKCdkcC5zaG93JywgZnVuY3Rpb24oZSl7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgY29uc29sZS5sb2coJ2RwLnNob3cnKTtcclxuICAgICAgICAgICAgICAgIC8vIH0pOyAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgICAgICAkKGljb25CdG4pLmNsaWNrKGZ1bmN0aW9uKClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY2FsZW5kYXIuLi5jbGlja1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoJChkb2N1bWVudCkuZmluZChcIi5kYXRlcGlja2VyLWRyb3Bkb3duXCIpLmlzKFwiOnZpc2libGVcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLmRhdGEoXCJEYXRlVGltZVBpY2tlclwiKS5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyAkKGVsZW1lbnQpLmZvY3VzKGZ1bmN0aW9uIChldmVudDogYW55KSB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgJChlbGVtZW50KS5kYXRhKFwiRGF0ZVRpbWVQaWNrZXJcIikuaGlkZSgpOyAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyB9KTsgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIm5vdCBpbXBsZW1lbnRlZC4uLlwiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0TXVsdGlEYXRlU2VsZWN0RGF0ZXBpY2tlcigpO1xyXG5cclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiaW5pdElucHV0cy4uLmRvbmVcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0TXVsdGlEYXRlU2VsZWN0RGF0ZXBpY2tlcigpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcElucHV0TWFzay5pbml0TXVsdGlEYXRlU2VsZWN0RGF0ZXBpY2tlci4uLlwiKTtcclxuXHJcbiAgICAgICAgdmFyIGlucHV0RGl2cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCdpbnB1dFtkYXRhLWl6Ym9yLXZlYy1kbmldJyk7XHJcblxyXG4gICAgICAgIGlucHV0RGl2cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiZWxlbWVudC5pbml0Li4uLi4uLi4uLi4uLi4uLi4uLi4uLlwiICsgZWxlbWVudC5pZCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgc3BhbkRpdjogYW55O1xyXG4gICAgICAgICAgICBzcGFuRGl2ID0gJChlbGVtZW50KS5wYXJlbnQoKTtcclxuICAgICAgICAgICAgaWYgKHNwYW5EaXYgPT09IG51bGwpIHsgcmV0dXJuOyB9O1xyXG4gICAgICAgICAgICBpZiAoc3BhbkRpdi5oYXNDbGFzcyhcImhhcy1mbG9hdC1sYWJlbFwiKSA9PT0gZmFsc2UpIHsgcmV0dXJuOyB9O1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKHNwYW5EaXYuZ2V0KDApLmlkKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBsYW5ndWFnZUF0cnIgPSAoU3RyaW5nKSgkKFwiI3NpdGVMYW5ndWFnZVwiKS52YWwoKSk7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJsYW5ndWFnZTpcIiArIGxhbmd1YWdlQXRycik7XHJcbiAgICAgICAgICAgIGxhbmd1YWdlQXRyciA9IGlzRW1wdHkobGFuZ3VhZ2VBdHJyKSA/IFwic2xcIiA6IGxhbmd1YWdlQXRycjtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImxhbmd1YWdlOlwiICsgbGFuZ3VhZ2VBdHJyKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBpY29uQnRuID0gJChzcGFuRGl2KS5maW5kKFwiI2NhbGVuZGFySWNvblwiKTtcclxuXHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjYWxlbmRhci4uLlwiKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBkYXRlcGlja2VyU3RhcnREYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgaWYgKCQoZWxlbWVudCkuYXR0cihcImRhdGEtZW5hYmxlLXNlbGVjdC1wYXN0ZGF0ZXNcIikgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoKCQoZWxlbWVudCkuYXR0cihcImRhdGEtZW5hYmxlLXNlbGVjdC1wYXN0ZGF0ZXNcIikpLnRvTG93ZXJDYXNlKCkgPT0gJ3RydWUnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0ZXBpY2tlclN0YXJ0RGF0ZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICgkKGVsZW1lbnQpLmF0dHIoXCJkYXRhLW1pbi1zdGFydC1kYXRlXCIpICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGRhdGVwaWNrZXJTdGFydERhdGUxID0gJChlbGVtZW50KS5hdHRyKFwiZGF0YS1taW4tc3RhcnQtZGF0ZVwiKTtcclxuICAgICAgICAgICAgICAgIGRhdGVwaWNrZXJTdGFydERhdGUgPSBjb252ZXJ0U3RyaW5nMkRhdGUoZGF0ZXBpY2tlclN0YXJ0RGF0ZTEsIFwiZGQubW0ueXl5eVwiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGRhdGVwaWNrZXJFbmREYXRlID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKCQoZWxlbWVudCkuYXR0cihcImRhdGEtbWF4LWVuZC1kYXRlXCIpICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgZGF0ZXBpY2tlckVuZERhdGUgPSAkKGVsZW1lbnQpLmF0dHIoXCJkYXRhLW1heC1lbmQtZGF0ZVwiKTtcclxuICAgICAgICAgICAgICAgIGRhdGVwaWNrZXJFbmREYXRlID0gY29udmVydFN0cmluZzJEYXRlKGRhdGVwaWNrZXJFbmREYXRlLCBcImRkLm1tLnl5eXlcIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICQoZWxlbWVudCkuZGF0ZXBpY2tlcih7XHJcbiAgICAgICAgICAgICAgICBzdGFydERhdGU6IGRhdGVwaWNrZXJTdGFydERhdGUsXHJcbiAgICAgICAgICAgICAgICBlbmREYXRlOiBkYXRlcGlja2VyRW5kRGF0ZSxcclxuICAgICAgICAgICAgICAgIGF1dG9jbG9zZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBtdWx0aWRhdGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBrZXlib2FyZE5hdmlnYXRpb246IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgd2Vla1N0YXJ0OiAxLFxyXG4gICAgICAgICAgICAgICAgZm9ybWF0OiBcImRkLm1tLnl5eXlcIixcclxuICAgICAgICAgICAgICAgIGxhbmd1YWdlOiBsYW5ndWFnZUF0cnIsXHJcbiAgICAgICAgICAgICAgICBvcmllbnRhdGlvbjogXCJib3R0b20gcmlnaHRcIlxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICQoaWNvbkJ0bikuY2xpY2soZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImNhbGVuZGFyLi4uY2xpY2tcIik7XHJcbiAgICAgICAgICAgICAgICB2YXIgZGF0ZXBpY2tlcklucHV0Q3RybCA9ICQoZWxlbWVudCkuZ2V0KDApIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICB2YXIgZGF0ZXBpY2tlcklucHV0Q3RybFN0ckxlbmd0aCA9IGRhdGVwaWNrZXJJbnB1dEN0cmwudmFsdWUubGVuZ3RoICogMjtcclxuICAgICAgICAgICAgICAgIGRhdGVwaWNrZXJJbnB1dEN0cmwuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGRhdGVwaWNrZXJJbnB1dEN0cmwuc2V0U2VsZWN0aW9uUmFuZ2UoZGF0ZXBpY2tlcklucHV0Q3RybFN0ckxlbmd0aCwgZGF0ZXBpY2tlcklucHV0Q3RybFN0ckxlbmd0aClcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcElucHV0TWFzay5pbml0TXVsdGlEYXRlU2VsZWN0RGF0ZXBpY2tlci4uLmRvbmVcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbnB1dFNlbGVjdEFsbFRleHQoaW5wdXRDdHJsOiBIVE1MSW5wdXRFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BJbnB1dE1hc2suaW5wdXRTZWxlY3RBbGxUZXh0Li4uXCIpO1xyXG5cclxuICAgICAgICBpbnB1dEN0cmwuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgaW5wdXRDdHJsLnZhbHVlLmxlbmd0aCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB3YXNUYWJQcmVzc2VkKGV2ZW50OiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcElucHV0TWFzay53YXNUYWJQcmVzc2VkLi4uXCIpO1xyXG5cclxuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGxldCBjb2RlID0gKGV2ZW50LmtleUNvZGUgPyBldmVudC5rZXlDb2RlIDogZXZlbnQud2hpY2gpO1xyXG4gICAgICAgIGlmIChjb2RlID09IDkpIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BQb3BvdmVyIH0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC1wb3BvdmVyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTWVudVNpZGViYXIge1xyXG5cclxuICAgIHByb3RlY3RlZCBfY29sbEVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gICAgcHJvdGVjdGVkIF9leHBFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgX21lbnVTaWRlYmFyUG9wb3ZlcjogU2FvcFBvcG92ZXI7XHJcblxyXG4gICAgaW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTWVudVNpZGViYXIuaW5pdC4uLlwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fY29sbEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNvbGxhcHNlLWljb24tY29sbFwiKTtcclxuICAgICAgICB0aGlzLl9leHBFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb2xsYXBzZS1pY29uLWV4cFwiKTtcclxuICAgICAgICBpZiAodGhpcy5fY29sbEVsZW1lbnQgIT0gbnVsbCkgdGhpcy5fY29sbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIGlmICh0aGlzLl9leHBFbGVtZW50ICE9IG51bGwpIHRoaXMuX2V4cEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgLy8gRXhwYW5kIGljb24gY2xpY2tcclxuICAgICAgICAkKFwiI2NvbGxhcHNlLWljb24tZXhwXCIpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICQoXCIjY29sbGFwc2UtaWNvbi1leHBcIikub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTWVudVNpZGViYXIuY29sbGFwc2UtaWNvbi1leHAuY2xpY2tcIik7XHJcblxyXG4gICAgICAgICAgICBfdGhpcy5fbWVudVNpZGViYXJQb3BvdmVyLmVuYWJsZVBvcG92ZXIoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gQ29sbGFwc2UgaWNvbiBjbGlja1xyXG4gICAgICAgICQoXCIjY29sbGFwc2UtaWNvbi1jb2xsXCIpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICQoXCIjY29sbGFwc2UtaWNvbi1jb2xsXCIpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk1lbnVTaWRlYmFyLmNvbGxhcHNlLWljb24tY29sbC5jbGlja1wiKTtcclxuXHJcbiAgICAgICAgICAgIF90aGlzLl9tZW51U2lkZWJhclBvcG92ZXIuZGlzYWJsZVBvcG92ZXIoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gQ29sbGFwc2UgY2xpY2tcclxuICAgICAgICAkKCdbZGF0YS10b2dnbGU9c2lkZWJhci1jb2xhcHNlXScpLmNsaWNrKFxyXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5zaWRlYmFyQ29sbGFwc2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vbWVudSBpdGVtIGNsaWNrXHJcbiAgICAgICAgJChcIi5zYW9wLWJnLWl0ZW1cIikuY2xpY2soXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIC8vc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcInNhb3AtbWVudS1wcmV2aW91cy1pdGVtLWlkXCIsIHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJzYW9wLW1lbnUtaXRlbS1pZFwiKSk7XHJcbiAgICAgICAgICAgICAgICAvL3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oXCJzYW9wLW1lbnUtaXRlbS1pZFwiLCB0aGlzLmlkKTtcclxuICAgICAgICAgICAgICAgIC8vc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcInNhb3AtbWVudS1zdWJpdGVtLWlkXCIsIFwiMFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIClcclxuXHJcbiAgICAgICAgLy9tZW51IHN1Yi1pdGVtIGNsaWNrXHJcbiAgICAgICAgLy8kKFwiLnNhb3AtYmctc3ViaXRlbVwiKS5jbGljayhcclxuICAgICAgICAvLyAgICBmdW5jdGlvbigpe1xyXG4gICAgICAgIC8vICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwic2FvcC1tZW51LXN1Yml0ZW0taWRcIiwgdGhpcy5pZCk7XHJcbiAgICAgICAgLy8gICAgfVxyXG4gICAgICAgIC8vKVxyXG5cclxuICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtZW51LXNpZGViYXJcIikgIT0gbnVsbClcclxuICAgICAgICAgICAgdGhpcy5HZXRTZXNzaW9uU3RvcmFnZVZhbHVlcygpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5EZWxldGVTZXNzaW9uU3RvcmFnZVZhbHVlcygpO1xyXG5cclxuICAgICAgICB0aGlzLmluaXRNZW51U2lkZWJhclBvcG92ZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc2lkZWJhckNvbGxhcHNlKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJNZW51U2lkZWJhci5zaWRlYmFyQ29sbGFwc2VcIik7XHJcbiAgICAgICAgJCgnI21lbnVUb3BJY29uTGFyZ2UnKS50b2dnbGVDbGFzcygnZC1ub25lJyk7XHJcbiAgICAgICAgJCgnI21lbnVUb3BJY29uU21hbGwnKS50b2dnbGVDbGFzcygnZC1ub25lJyk7XHJcbiAgICAgICAgJCgnLnNpZGViYXItbWVudS1jYXB0aW9uJykudG9nZ2xlQ2xhc3MoJ2Qtbm9uZScpO1xyXG4gICAgICAgICQoJyNzaWRlYmFyLWNvbnRhaW5lcicpLnRvZ2dsZUNsYXNzKCdzaWRlYmFyLWV4cGFuZGVkIHNpZGViYXItY29sbGFwc2VkJyk7XHJcbiAgICAgICAgJCgnLnNhb3AtYmctc3ViaXRlbXMnKS50b2dnbGVDbGFzcygnZC1ub25lJyk7XHJcbiAgICAgICAgJCgnI21lbnVDbG9zZUJ1dHRvbicpLnRvZ2dsZUNsYXNzKCdkLW5vbmUnKTtcclxuICAgICAgICB2YXIgU2VwYXJhdG9yVGl0bGUgPSAkKCcjc2lkZWJhci1jb250YWluZXInKTtcclxuICAgICAgICBpZiAoU2VwYXJhdG9yVGl0bGUuaGFzQ2xhc3MoJ3NpZGViYXItY29sbGFwc2VkJykpIHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcInNhb3AtbWVudS1zaWRlYmFyLWV4cGFuZGVkXCIsIFwidHJ1ZVwiKVxyXG4gICAgICAgICAgICB0aGlzLl9jb2xsRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xyXG4gICAgICAgICAgICB0aGlzLl9leHBFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwic2FvcC1tZW51LXNpZGViYXItZXhwYW5kZWRcIiwgXCJmYWxzZVwiKVxyXG4gICAgICAgICAgICB0aGlzLl9jb2xsRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgICAgIHRoaXMuX2V4cEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG1lbnVJdGVtQ29sbGFwc2UoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk1lbnVTaWRlYmFyLm1lbnVJdGVtQ29sbGFwc2VcIik7XHJcbiAgICAgICAgLy92YXIgcHJldmlvdXNJdGVtSUQgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwic2FvcC1tZW51LWl0ZW0taWRcIik7XHJcbiAgICAgICAgLy92YXIgaXRlbUlEID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcInNhb3AtbWVudS1pdGVtLWlkXCIpO1xyXG4gICAgICAgIC8vdmFyIHN1Yml0ZW1zSUQgPSBpdGVtSUQrXCItY29sbGFwc2VcIjtcclxuICAgICAgICAvL3ZhciBzdWJpdGVtSUQgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwic2FvcC1tZW51LXN1Yml0ZW0taWRcIik7XHJcblxyXG4gICAgICAgIC8vdmFyIHByZXZpb3VzID0gJChcIiNcIiArIHByZXZpb3VzSXRlbUlEKTtcclxuICAgICAgICAvL3ZhciBpdGVtID0gJCgnIycraXRlbUlEKTtcclxuICAgICAgICAvL3ZhciBzdWJpdGVtcyA9ICQoXCIjXCIgKyBzdWJpdGVtc0lEKTtcclxuICAgICAgICAvL3ZhciBzdWJpdGVtID0gJChcIiNcIitzdWJpdGVtc0lEK1wiPiNcIitzdWJpdGVtSUQpO1xyXG5cclxuICAgICAgICAvL3ByZXZpb3VzLnJlbW92ZUNsYXNzKFwic2FvcC1iZy1pdGVtLXNlbGVjdGVkXCIpOy8vJ3VuLWNvbG9yJyBwcmV2aW91cyBpdGVtXHJcbiAgICAgICAgLy9wcmV2aW91c1swXS5zZXRBdHRyaWJ1dGUoXCJhcmlhLWV4cGFuZGVkXCIsIFwiZmFsc2VcIik7XHJcbiAgICAgICAgLy9pdGVtWzBdLnNldEF0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIiwgXCJ0cnVlXCIpO1xyXG4gICAgICAgIC8vaXRlbS5hZGRDbGFzcyhcInNhb3AtYmctaXRlbS1zZWxlY3RlZFwiKTsvL2NvbG9yIGl0ZW1cclxuICAgICAgICAvL3N1Yml0ZW1zLmFkZENsYXNzKCdzaG93Jyk7Ly9leHBhbmQgY29sbGFwc2VcclxuICAgICAgICAvL3N1Yml0ZW0uYWRkQ2xhc3MoXCJzYW9wLWJnLXN1Yml0ZW0tc2VsZWN0ZWRcIik7Ly9jb2xvciBzdWJpdGVtXHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIEdldFNlc3Npb25TdG9yYWdlVmFsdWVzKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJNZW51U2lkZWJhci5HZXRTZXNzaW9uU3RvcmFnZVZhbHVlc1wiKTtcclxuICAgICAgICAvL2RlZmF1bHRzXHJcbiAgICAgICAgLy9pZiAoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcInNhb3AtbWVudS1pdGVtLWlkXCIpID09IG51bGwpIHtcclxuICAgICAgICAgICAgLy9zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwic2FvcC1tZW51LXNpZGViYXItZXhwYW5kZWRcIiwgbnVsbCk7XHJcbiAgICAgICAgLy8gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcInNhb3AtbWVudS1wcmV2aW91cy1pdGVtLWlkXCIsIG51bGwpO1xyXG4gICAgICAgIC8vICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oXCJzYW9wLW1lbnUtaXRlbS1pZFwiLCBcIm5hbWl6amVcIik7XHJcbiAgICAgICAgLy8gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcInNhb3AtbWVudS1zdWJpdGVtLWlkXCIsIFwiMFwiKTtcclxuICAgICAgICAvL31cclxuXHJcbiAgICAgICAgLy9zaWRlYmFyIGV4cGFuZGVkL2NvbnRyYWN0ZWRcclxuICAgICAgICBpZiAoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcInNhb3AtbWVudS1zaWRlYmFyLWV4cGFuZGVkXCIpID09IFwidHJ1ZVwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2lkZWJhckNvbGxhcHNlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3NlbGVjdGVkLW1lbnUgaXRlbVxyXG4gICAgICAgIHRoaXMubWVudUl0ZW1Db2xsYXBzZSgpXHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIERlbGV0ZVNlc3Npb25TdG9yYWdlVmFsdWVzKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJNZW51U2lkZWJhci5EZWxldGVTZXNzaW9uU3RvcmFnZVZhbHVlc1wiKTtcclxuXHJcbiAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShcInNhb3AtbWVudS1zaWRlYmFyLWV4cGFuZGVkXCIpO1xyXG4gICAgICAgIC8vc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShcInNhb3AtbWVudS1wcmV2aW91cy1pdGVtLWlkXCIpO1xyXG4gICAgICAgIC8vc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShcInNhb3AtbWVudS1pdGVtLWlkXCIpO1xyXG4gICAgICAgIC8vc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShcInNhb3AtbWVudS1zdWJpdGVtLWlkXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRNZW51U2lkZWJhclBvcG92ZXIoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk1lbnVTaWRlYmFyLmluaXRNZW51U2lkZWJhclBvcG92ZXJcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX21lbnVTaWRlYmFyUG9wb3ZlciA9IG5ldyBTYW9wUG9wb3ZlcihcIi5tZW51LXBvcHVwXCIpO1xyXG4gICAgICAgIHRoaXMuX21lbnVTaWRlYmFyUG9wb3Zlci5pbml0U2VsZkNvbnRhaW5lclBvcG92ZXIoKTtcclxuICAgICAgICB0aGlzLl9tZW51U2lkZWJhclBvcG92ZXIuZGlzYWJsZVBvcG92ZXIoKTtcclxuXHJcbiAgICAgICAgdmFyIGVsZW1lbnRWaXNpYmxlID0gJChcIiNjb2xsYXBzZS1pY29uLWNvbGxcIikuaXMoJzp2aXNpYmxlJyk7XHJcbiAgICAgICAgaWYgKGVsZW1lbnRWaXNpYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21lbnVTaWRlYmFyUG9wb3Zlci5lbmFibGVQb3BvdmVyKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fbWVudVNpZGViYXJQb3BvdmVyLmRpc2FibGVQb3BvdmVyKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxufVxyXG5cclxuXHJcblxyXG4iLCLvu79cclxuZXhwb3J0IGNsYXNzIFNhb3BNZXNzYWdlQmFubmVyIHtcclxuICAgIHByaXZhdGUgX21lc3NhZ2VzRGl2SWQ6IHN0cmluZyA9IFwiI21lc3NhZ2VzRGl2SWRcIjtcclxuICAgIHByaXZhdGUgX21lc3NhZ2VCYW5uZXJJZDogc3RyaW5nID0gXCIjc2FvcE1lc3NhZ2VCYW5uZXIxXCI7XHJcblxyXG4gICAgc2hvdyhtZXNzYWdlczogc3RyaW5nW10pIHtcclxuXHJcbiAgICAgICAgbGV0IGh0bWxNZXNzYWdlU3RyaW5nID0gXCI8dWw+XCI7XHJcbiAgICAgICAgbWVzc2FnZXMuZm9yRWFjaCgobWVzc2FnZSkgPT4ge1xyXG4gICAgICAgICAgICBodG1sTWVzc2FnZVN0cmluZyA9IGh0bWxNZXNzYWdlU3RyaW5nICsgXCI8bGk+XCIgKyBtZXNzYWdlICsgXCI8L2xpPlwiO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGh0bWxNZXNzYWdlU3RyaW5nID0gaHRtbE1lc3NhZ2VTdHJpbmcgKyBcIjwvdWw+XCI7XHJcblxyXG4gICAgICAgICQodGhpcy5fbWVzc2FnZXNEaXZJZCkuaHRtbChodG1sTWVzc2FnZVN0cmluZyk7XHJcbiAgICAgICAgJCh0aGlzLl9tZXNzYWdlQmFubmVySWQpLnJlbW92ZUNsYXNzKCdtZXNzYWdlLWJhbm5lci1oaWRlJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCwgc2V0TW9kYWxGb3JtWkluZGV4LGlzRW1wdHksaXNVbkRlZmluZWQgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcblxyXG5leHBvcnQgZW51bSBTYW9wTXNnRGxnVHlwZSB7XHJcbiAgICBtdEluZm9ybWF0aW9uID0gMVxyXG4gICAgLG10V2FybmluZyA9IDJcclxuICAgICxtdEVycm9yID0gM1xyXG4gICAgLy8sIG10Q29uZmlybWF0aW9uLCBtdEN1c3RvbVxyXG59XHJcblxyXG5leHBvcnQgZW51bSBTYW9wTXNnRGxnQnV0dG9uIHtcclxuICAgIG1iTm9uZSA9IDBcclxuICAgICxtYk9LID0gMVxyXG4gICAgLG1iQ2FuY2VsID0gMlxyXG4gICAgLG1iWWVzID0gM1xyXG4gICAgLG1iTm8gPSA0XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcE1zZ0RsZ0V2ZW50IHtcclxuICAgIHBhcmVudDphbnk7XHJcbiAgICBkYXRhOmFueTtcclxufVxyXG5cclxudHlwZSBTYW9wTXNnRGxnQnV0dG9ucyA9IEFycmF5PFNhb3BNc2dEbGdCdXR0b24+O1xyXG5cclxuXHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcE1lc3NhZ2VEbGcge1xyXG4gICAgcHJpdmF0ZSBfc2VuZGVyOlNhb3BNc2dEbGdFdmVudDtcclxuICAgIHByaXZhdGUgX21vZGFsUGFyZW50OmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIC8vXHJcbiAgICBwdWJsaWMgb25PazogKHNlbmRlcjphbnkpID0+IGFueSA9IG51bGw7XHJcbiAgICBwdWJsaWMgb25DYW5jZWw6IChzZW5kZXI6YW55KSA9PiBhbnkgPSBudWxsO1xyXG4gICAgcHVibGljIG9uWWVzOiAoc2VuZGVyOmFueSkgPT4gYW55ID0gbnVsbDtcclxuICAgIHB1YmxpYyBvbk5vOiAoc2VuZGVyOmFueSkgPT4gYW55ID0gbnVsbDtcclxuICAgIHB1YmxpYyBvbkhpZGU6IChzZW5kZXI6YW55KSA9PiBhbnkgPSBudWxsO1xyXG4gICAgcHVibGljIGFmdGVyU2hvdzogKHNlbmRlcjphbnkpID0+IGFueSA9IG51bGw7XHJcblxyXG4gICAgY29uc3RydWN0b3Ioc2VuZGVyOlNhb3BNc2dEbGdFdmVudCl7XHJcbiAgICAgICAgdGhpcy5fc2VuZGVyID0gc2VuZGVyO1xyXG4gICAgfVxyXG5cclxuICAgIFNob3coTXNnOnN0cmluZyxUaXRsZTpzdHJpbmcsRGxnVHlwZTpTYW9wTXNnRGxnVHlwZSA9IFNhb3BNc2dEbGdUeXBlLm10SW5mb3JtYXRpb24sQnV0dG9uczpTYW9wTXNnRGxnQnV0dG9ucyA9IFtTYW9wTXNnRGxnQnV0dG9uLm1iT0tdKTpTYW9wTXNnRGxnQnV0dG9ue1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJtZXNzYWdlOlwiK01zZyk7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInRpdGxlOlwiK1RpdGxlKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLl9tb2RhbFBhcmVudCA9ICQoXCJib2R5XCIpLmhhc0NsYXNzKFwibW9kYWwtb3BlblwiKTtcclxuXHJcbiAgICAgICAgbGV0IHRpdGxlRGl2ID0gJCgnI2FsZXJ0LW1vZGFsLXRpdGxlLWRpdicpO1xyXG4gICAgICAgIGxldCBib2R5VGFnID0gJCgnI2FsZXJ0LW1vZGFsLWJvZHknKTtcclxuXHJcbiAgICAgICAgaWYgKERsZ1R5cGUgPT0gU2FvcE1zZ0RsZ1R5cGUubXRJbmZvcm1hdGlvbil7XHJcbiAgICAgICAgICAgICQoXCIjYWxlcnQtbW9kYWwtdGl0bGUtZGl2XCIpLmNzcyhcImJhY2tncm91bmQtY29sb3JcIixcIndoaXRlXCIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoRGxnVHlwZSA9PSBTYW9wTXNnRGxnVHlwZS5tdEVycm9yKSB7XHJcbiAgICAgICAgICAgICQoXCIjYWxlcnQtbW9kYWwtdGl0bGUtZGl2XCIpLmNzcyhcImJhY2tncm91bmQtY29sb3JcIixcIiNEODJDMjVcIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgJChcIiNhbGVydC1tb2RhbC10aXRsZS1kaXZcIikuY3NzKFwiYmFja2dyb3VuZC1jb2xvclwiLFwic2lsdmVyXCIpOyAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFpc0VtcHR5KFRpdGxlKSl7XHJcbiAgICAgICAgICAgIHRpdGxlRGl2Lmh0bWwoVGl0bGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBib2R5VGFnLmh0bWwoTXNnKTtcclxuXHJcbiAgICAgICAgaWYgKEJ1dHRvbnMgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgbGV0IF9lbGVtZW50X21iT0sgPSBCdXR0b25zLmZpbmQoZWxlbWVudCA9PiBlbGVtZW50ID09PSBTYW9wTXNnRGxnQnV0dG9uLm1iT0spO1xyXG4gICAgICAgICAgICBpZiAoaXNVbkRlZmluZWQoX2VsZW1lbnRfbWJPSykpIHtcclxuICAgICAgICAgICAgICAgICQoXCIjYnRuQWxlcnRPS1wiKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICQoXCIjYnRuQWxlcnRPS1wiKS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAgICAgICAgICQoXCIjYnRuQWxlcnRPS1wiKS5jbGljayhcclxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNVbkRlZmluZWQoX3RoaXMub25Paykpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMub25PayhfdGhpcy5fc2VuZGVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2FvcE1zZ0RsZ0J1dHRvbi5tYk9LO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICk7ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgIGxldCBfZWxlbWVudF9tYkNhbmNlbCA9IEJ1dHRvbnMuZmluZChlbGVtZW50ID0+IGVsZW1lbnQgPT09IFNhb3BNc2dEbGdCdXR0b24ubWJDYW5jZWwpO1xyXG4gICAgICAgICAgICBpZiAoaXNVbkRlZmluZWQoX2VsZW1lbnRfbWJDYW5jZWwpKSB7XHJcbiAgICAgICAgICAgICAgICAkKFwiI2J0bkFsZXJ0Q2FuY2VsXCIpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgJChcIiNidG5BbGVydENhbmNlbFwiKS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAgICAgICAgICQoXCIjYnRuQWxlcnRDYW5jZWxcIikuY2xpY2soXHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVW5EZWZpbmVkKF90aGlzLm9uQ2FuY2VsKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5vbkNhbmNlbChfdGhpcy5fc2VuZGVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2FvcE1zZ0RsZ0J1dHRvbi5tYkNhbmNlbDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICApOyAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgbGV0IF9lbGVtZW50X21iWWVzID0gQnV0dG9ucy5maW5kKGVsZW1lbnQgPT4gZWxlbWVudCA9PT0gU2FvcE1zZ0RsZ0J1dHRvbi5tYlllcyk7XHJcbiAgICAgICAgICAgIGlmIChpc1VuRGVmaW5lZChfZWxlbWVudF9tYlllcykpIHtcclxuICAgICAgICAgICAgICAgICQoXCIjYnRuQWxlcnRZZXNcIikucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAkKFwiI2J0bkFsZXJ0WWVzXCIpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICAgICAgICAgJChcIiNidG5BbGVydFllc1wiKS5jbGljayhcclxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNVbkRlZmluZWQoX3RoaXMub25ZZXMpKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLm9uWWVzKF90aGlzLl9zZW5kZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTYW9wTXNnRGxnQnV0dG9uLm1iWWVzO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICk7ICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfSAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICBsZXQgX2VsZW1lbnRfbWJObyA9IEJ1dHRvbnMuZmluZChlbGVtZW50ID0+IGVsZW1lbnQgPT09IFNhb3BNc2dEbGdCdXR0b24ubWJObyk7XHJcbiAgICAgICAgICAgIGlmIChpc1VuRGVmaW5lZChfZWxlbWVudF9tYk5vKSkge1xyXG4gICAgICAgICAgICAgICAgJChcIiNidG5BbGVydE5vXCIpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgJChcIiNidG5BbGVydE5vXCIpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICAgICAgICAgJChcIiNidG5BbGVydE5vXCIpLmNsaWNrKFxyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1VuRGVmaW5lZChfdGhpcy5vbk5vKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5vbk5vKF90aGlzLl9zZW5kZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTYW9wTXNnRGxnQnV0dG9uLm1iTm87XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgKTsgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9ICAgICAgICAgICAgIFxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICQoXCIjYnRuQWxlcnRPS1wiKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgJChcIiNidG5BbGVydENhbmNlbFwiKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgJChcIiNidG5BbGVydFllc1wiKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgJChcIiNidG5BbGVydE5vXCIpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gU2FvcE1zZ0RsZ0J1dHRvbi5tYk5vbmU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAkKCcjYWxlcnQtbW9kYWwnKS5vbignaGlkZGVuLmJzLm1vZGFsJywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgJChcIiNhbGVydC1tb2RhbC1idG4tb2tcIikudW5iaW5kKFwiY2xpY2tcIik7XHJcbiAgICAgICAgICAgICQodGhpcykubW9kYWwoJ2Rpc3Bvc2UnKTtcclxuICAgICAgICAgICAgaWYgKCFpc1VuRGVmaW5lZChfdGhpcy5vbkhpZGUpKXtcclxuICAgICAgICAgICAgICAgIF90aGlzLm9uSGlkZShfdGhpcy5fc2VuZGVyKTtcclxuICAgICAgICAgICAgfSAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5fbW9kYWxQYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgICQoXCJib2R5XCIpLmFkZENsYXNzKFwibW9kYWwtb3BlblwiKTtcclxuICAgICAgICAgICAgfSAgICBcclxuICAgICAgICB9KVxyXG4gICAgXHJcbiAgICAgICAgJCgnI2FsZXJ0LW1vZGFsJykubW9kYWwoJ3Nob3cnKTtcclxuICAgICAgICBzZXRNb2RhbEZvcm1aSW5kZXgoJyNhbGVydC1tb2RhbCcpOyBcclxuXHJcbiAgICAgICAgaWYgKCFpc1VuRGVmaW5lZChfdGhpcy5hZnRlclNob3cpKXtcclxuICAgICAgICAgICAgX3RoaXMuYWZ0ZXJTaG93KF90aGlzLl9zZW5kZXIpO1xyXG4gICAgICAgIH0gICAgICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIC8vXHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu78vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL2Jvb3RzdHJhcC1tdWx0aXNlbGVjdC9pbmRleC5kLnRzXCIgLz5cclxuaW1wb3J0IHsgU2FvcFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJy4uL0NvcmUvc2FvcC10cmFuc2xhdGUnO1xyXG5cclxuaW1wb3J0IHsgZ2xvYmFsLGlzRW1wdHksIGlzTm90U2V0LCBpc1VuRGVmaW5lZCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcE11bHRpc2VsZWN0UGFyYW1zIHtcclxuICAgIHRhcmdldDpzdHJpbmcsXHJcbiAgICBzZWxlY3RBbGw/OmJvb2xlYW5cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wTXVsdGlzZWxlY3RPcHRpb25zIHtcclxuICAgIHRlbXBsYXRlc0J1dHRvbj86IHN0cmluZyxcclxuICAgIHNlbGVjdEFsbD86Ym9vbGVhbixcclxuICAgIHNlbGVjdEFsbE9wdGlvbj86Ym9vbGVhbixcclxuICAgIGlucHV0V2lkdGhQWD86c3RyaW5nXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0T3B0aW9uIHtcclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbiAgICB0ZXh0OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wTXVsdGlzZWxlY3Qge1xyXG4gICAgcHJpdmF0ZSBfbGliTmFtZTpzdHJpbmc7XHJcbiAgICBwcml2YXRlIF90cmFuc2xhdGlvblNlcnZpY2U6IFNhb3BUcmFuc2xhdGlvblNlcnZpY2U7XHJcbiAgICBwdWJsaWMgX3RhcmdldDpzdHJpbmc7XHJcbiAgICBwdWJsaWMgX2NhcHRpb246IHN0cmluZyA9IFwiU2t1cGluYVwiO1xyXG4gICAgcHJpdmF0ZSBfbXVsdGlTZWxlY3RPYmplY3Q6IGFueTtcclxuICAgIHByaXZhdGUgX29wdGlvbnM6IFNhb3BNdWx0aXNlbGVjdE9wdGlvbnM7XHJcbiAgICAvL1xyXG4gICAgcHVibGljIG1zQ29udGFpbmVyOkpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgICBwdWJsaWMgbXNCdXR0b246IEpRdWVyeTxIVE1MQnV0dG9uRWxlbWVudD47XHJcblxyXG4gICAgcHVibGljIG1zQ29udGFpbmVyTGFiZWw6SlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIHB1YmxpYyBzZWxlY3RlZENCOmFueTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihsaWJOYW1lOnN0cmluZyA9IFwiXCIsIG9wdGlvbnM6U2FvcE11bHRpc2VsZWN0T3B0aW9ucyA9IG51bGwpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcE11bHRpc2VsZWN0XCIpO1xyXG4gICAgICAgIHRoaXMuX3RyYW5zbGF0aW9uU2VydmljZSA9IG5ldyBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlKCk7XHJcbiAgICAgICAgdGhpcy5zZXRPcHRpb25zKG9wdGlvbnMpO1xyXG4gICAgfSBcclxuXHJcbiAgICBzZXRPcHRpb25zKG9wdGlvbnM6IFNhb3BNdWx0aXNlbGVjdE9wdGlvbnMpOiB2b2lkIHtcclxuICAgICAgICAvLyBmaXJzdCBzZXQgZGVmYXVsdCBvcHRpb25zXHJcblxyXG4gICAgICAgIGxldCBfdGVtcGxhdGVzQnV0dG9uID0gJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibXVsdGlzZWxlY3QgZHJvcGRvd24tdG9nZ2xlIHByLTBcIiBkYXRhLXRvZ2dsZT1cImRyb3Bkb3duXCI+PHNwYW4gY2xhc3M9XCJtdWx0aXNlbGVjdC1zZWxlY3RlZC10ZXh0XCI+PC9zcGFuPjxzcGFuIGNsYXNzPVwic2FvcC1pbWctZG93biBzaS1zIGZsb2F0LXJpZ2h0XCI+PC9zcGFuPjwvYnV0dG9uPic7XHJcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IHt9O1xyXG4gICAgICAgIHRoaXMuX29wdGlvbnMudGVtcGxhdGVzQnV0dG9uID0gX3RlbXBsYXRlc0J1dHRvbjtcclxuICAgICAgICB0aGlzLl9vcHRpb25zLmlucHV0V2lkdGhQWCA9ICcyMDBweCc7XHJcbiAgICAgICAgdGhpcy5fb3B0aW9ucy5zZWxlY3RBbGwgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX29wdGlvbnMuc2VsZWN0QWxsT3B0aW9uID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKG9wdGlvbnMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoaXNOb3RTZXQob3B0aW9ucy50ZW1wbGF0ZXNCdXR0b24pID09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vcHRpb25zLnRlbXBsYXRlc0J1dHRvbiA9IG9wdGlvbnMudGVtcGxhdGVzQnV0dG9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChpc05vdFNldChvcHRpb25zLnNlbGVjdEFsbCkgPT0gZmFsc2Upe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5zZWxlY3RBbGwgPSBvcHRpb25zLnNlbGVjdEFsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaXNOb3RTZXQob3B0aW9ucy5zZWxlY3RBbGxPcHRpb24pID09IGZhbHNlKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMuc2VsZWN0QWxsT3B0aW9uID0gb3B0aW9ucy5zZWxlY3RBbGxPcHRpb247XHJcbiAgICAgICAgICAgIH0gICAgICAgICBcclxuICAgICAgICAgICAgLy8gICBcclxuICAgICAgICAgICAgaWYgKGlzTm90U2V0KG9wdGlvbnMuaW5wdXRXaWR0aFBYKSA9PSBmYWxzZSl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vcHRpb25zLmlucHV0V2lkdGhQWCA9IG9wdGlvbnMuaW5wdXRXaWR0aFBYO1xyXG4gICAgICAgICAgICB9ICBcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHNldFRlcm1pbm9sb2d5TGlzdCgpIHtcclxuICAgICAgICBsZXQgX3Rlcm1pbm9sb2d5OiBzdHJpbmdbXSA9IFsnScWhxI1pJywgJ1ZzaScsICdJemJlcmkgcHJpa2F6YW5lJywgJ2l6YnJhbmloJ107XHJcbiAgICAgICAgaWYgKCFpc0VtcHR5KHRoaXMuX2NhcHRpb24pKSB7XHJcbiAgICAgICAgICAgIF90ZXJtaW5vbG9neSA9IFsnScWhxI1pJywgJ1ZzaScsICdJemJlcmkgcHJpa2F6YW5lJywgJ2l6YnJhbmloJywgdGhpcy5fY2FwdGlvbl07XHJcbiAgICAgICAgfSBcclxuICAgICAgICB0aGlzLl90cmFuc2xhdGlvblNlcnZpY2Uuc2V0VHJhbnNsYXRpb25zTGlzdChfdGVybWlub2xvZ3kpO1xyXG4gICAgfVxyXG5cclxuICAgIGJpbmREaXYoZWxlbWV0OmFueSl7XHJcbiAgICAgICAgdGhpcy5tc0NvbnRhaW5lciA9ICQoZWxlbWV0LiRjb250YWluZXIpO1xyXG4gICAgICAgIHRoaXMubXNCdXR0b24gPSAkKGVsZW1ldC4kYnV0dG9uKTtcclxuICAgICAgICB0aGlzLm1zQ29udGFpbmVyTGFiZWwgPSB0aGlzLm1zQ29udGFpbmVyLmZpbmQoXCIjY29udGFpbmVyTGFiZWxcIik7XHJcbiAgICAgICAgLy90aGlzLnNlbGVjdGVkQ0IgPSBlbGVtZXQuJHNlbGVjdDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDQi52YWwoKS5sZW5ndGgpe1xyXG4gICAgICAgICAgICB0aGlzLnNldE1zRmxvYXRpbmdMYWJlbChmYWxzZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRNc0Zsb2F0aW5nTGFiZWwodHJ1ZSk7XHJcbiAgICAgICAgfSAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgc2V0TXNGbG9hdGluZ0xhYmVsKGlzRW1wcnk6Ym9vbGVhbil7XHJcbiAgICAgICAgaWYgKGlzRW1wcnkpe1xyXG4gICAgICAgICAgICB0aGlzLm1zQ29udGFpbmVyTGFiZWwuYWRkQ2xhc3MoJ21zLWZsb2F0LWxhYmVsLWVtcHR5Jyk7XHJcbiAgICAgICAgICAgIHRoaXMubXNDb250YWluZXJMYWJlbC5yZW1vdmVDbGFzcygnbXMtZmxvYXQtbGFiZWwtc2VsZWN0ZWQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm1zQ29udGFpbmVyTGFiZWwucmVtb3ZlQ2xhc3MoJ21zLWZsb2F0LWxhYmVsLWVtcHR5Jyk7XHJcbiAgICAgICAgICAgIHRoaXMubXNDb250YWluZXJMYWJlbC5hZGRDbGFzcygnbXMtZmxvYXQtbGFiZWwtc2VsZWN0ZWQnKTsgICAgICAgICAgICBcclxuICAgICAgICB9ICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBvbkluaXRpYWxpemVkQ29udHJvbChlbGVtZW50OiBhbnkpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcE11bHRpc2VsZWN0Lm9uSW5pdGlhbGl6ZWRDb250cm9sXCIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZENCLmhhc0NsYXNzKFwiaW5wdXQtdmFsaWRhdGlvbi1lcnJvclwiKSkge1xyXG4gICAgICAgICAgICB0aGlzLm1zQnV0dG9uLmFkZENsYXNzKFwic2FvcC1lcnJvci1pbnB1dFwiKTtcclxuICAgICAgICAgICAgdGhpcy5tc0NvbnRhaW5lckxhYmVsLmFkZENsYXNzKFwic2FvcC1lcnJvci1pbnB1dC10ZXh0XCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gZG9kYW1vIHN0aWNreSBjc3MgemEgcHJ2aSBlbGVtZW50XHJcbiAgICAgICAgdGhpcy5hZGRTdGlja3lDbGFzcygpO1xyXG5cclxuICAgICAgICB0aGlzLmFmdGVySW5pdGlhbGl6ZWRDb250cm9sKGVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZFN0aWNreUNsYXNzKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wTXVsdGlzZWxlY3QuYWRkU3RpY2t5Q2xhc3NcIik7XHJcblxyXG4gICAgICAgIGxldCBzZXpuYW0gPSB0aGlzLm1zQ29udGFpbmVyLmZpbmQoXCJidXR0b24ubXVsdGlzZWxlY3Qtb3B0aW9uLmRyb3Bkb3duLWl0ZW1cIikuZWFjaChmdW5jdGlvbiAoaW5kZXg6IG51bWJlciwgZWxlbTogYW55KSB7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3RJdGVtID0gJChlbGVtKTtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdEl0ZW0udGV4dCgpID09PSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RJdGVtLmFkZENsYXNzKFwic2FvcC1tdWx0aXNlbGVjdC1pdGVtLXN0aWNreVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pOyAgICAgICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIGluaXQodGFyZ2V0OiBzdHJpbmcgPSBcIlwiLCBjYXB0aW9uID0gXCJcIiApe1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wTXVsdGlzZWxlY3QuaW5pdFwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fdGFyZ2V0ID0gdGFyZ2V0O1xyXG4gICAgICAgIHRoaXMuX2NhcHRpb24gPSBjYXB0aW9uO1xyXG5cclxuICAgICAgICAvLyBwb2lzY2VtbyBwcmV2b2RlICh0dWRpIHphIHRoaXMuX2NhcHRpb24pXHJcbiAgICAgICAgdGhpcy5zZXRUZXJtaW5vbG9neUxpc3QoKTtcclxuXHJcbiAgICAgICAgaWYgKGlzRW1wdHkodGFyZ2V0KSkge3RhcmdldCA9IFwiLnNhb3AtbXVsdGlzZWxlY3RcIjt9XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDQiA9ICQodGFyZ2V0KTtcclxuXHJcbiAgICAgICAgLy8gYWxpIGltYSBzZWxlY3RlZENCIGRhdGEtY2FwdGlvblxyXG4gICAgICAgIGxldCBzZWxlY3RDYXB0aW9uID0gXCJcIjtcclxuICAgICAgICBpZiAoIWlzRW1wdHkodGhpcy5fY2FwdGlvbikpIHtcclxuICAgICAgICAgICAgc2VsZWN0Q2FwdGlvbiA9IHRoaXMuX3RyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUodGhpcy5fY2FwdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBkYXRhQ2FwdGlvbiA9IHRoaXMuc2VsZWN0ZWRDQi5hdHRyKFwiZGF0YS1jYXB0aW9uXCIpO1xyXG4gICAgICAgIGlmICghaXNFbXB0eShkYXRhQ2FwdGlvbikpIHtcclxuICAgICAgICAgICAgc2VsZWN0Q2FwdGlvbiA9IGRhdGFDYXB0aW9uO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgJCh0YXJnZXQpLm11bHRpc2VsZWN0KHtcclxuICAgICAgICAgICAgbWF4SGVpZ2h0OiAzNTAsICBcclxuICAgICAgICAgICAgZW5hYmxlRmlsdGVyaW5nOiB0cnVlLFxyXG4gICAgICAgICAgICBpbmNsdWRlU2VsZWN0QWxsT3B0aW9uOiBfdGhpcy5fb3B0aW9ucy5zZWxlY3RBbGxPcHRpb24sXHJcbiAgICAgICAgICAgIGVuYWJsZUNhc2VJbnNlbnNpdGl2ZUZpbHRlcmluZzogdHJ1ZSxcclxuICAgICAgICAgICAgZW5hYmxlRnVsbFZhbHVlRmlsdGVyaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgZmlsdGVyUGxhY2Vob2xkZXI6IHRoaXMuX3RyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJJxaHEjWlcIiksXHJcbiAgICAgICAgICAgIG5vblNlbGVjdGVkVGV4dDogJycsXHJcbiAgICAgICAgICAgIGFsbFNlbGVjdGVkVGV4dDp0aGlzLl90cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiVnNpXCIpLFxyXG4gICAgICAgICAgICBzZWxlY3RBbGxUZXh0OnRoaXMuX3RyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJJemJlcmkgcHJpa2F6YW5lXCIpLFxyXG4gICAgICAgICAgICBuU2VsZWN0ZWRUZXh0OnRoaXMuX3RyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJpemJyYW5paFwiKSxcclxuICAgICAgICAgICAgaW5jbHVkZUZpbHRlckNsZWFyQnRuOiB0cnVlLFxyXG4gICAgICAgICAgICBkaXNhYmxlSWZFbXB0eTogZmFsc2UsXHJcbiAgICAgICAgICAgIG51bWJlckRpc3BsYXllZDogMixcclxuICAgICAgICAgICAgYnV0dG9uV2lkdGg6IF90aGlzLl9vcHRpb25zLmlucHV0V2lkdGhQWCxcclxuICAgICAgICAgICAgYnV0dG9uQ2xhc3MgOidzYW9wLWNvbnRyb2wgZm9ybS1jb250cm9sIHNoYWRvdy1ub25lIG1zLWltYWdlLWRvd24gcHItMCcsXHJcbiAgICAgICAgICAgIGJ1dHRvbkNvbnRhaW5lcjogJzxkaXYgaWQ9XCJzZWxlY3RlZC1wYXJlbnRzLWNvbnRhaW5lclwiPjxsYWJlbCBpZCA9XCJjb250YWluZXJMYWJlbFwiIGNsYXNzPVwibXMtZmxvYXQtbGFiZWwgbXMtZmxvYXQtbGFiZWwtc2VsZWN0ZWQgc2FvcC10eHQtN1wiIGZvcj1cIk5hbWVcIj4nK3NlbGVjdENhcHRpb24rJzwvbGFiZWw+PC9kaXY+JyxcclxuICAgICAgICAgICAgb25TZWxlY3RBbGw6IGZ1bmN0aW9uIChzZWxlY3RlZE9wdGlvbnM6IEpRdWVyeSkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuYmluZERpdih0aGlzKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLmFmdGVyU2VsZWN0QWxsKHNlbGVjdGVkT3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5hZnRlckNoYW5nZUNvbW1vbkV2ZW50KHRoaXMuJHNlbGVjdCk7XHJcbiAgICAgICAgICAgIH0sICAgICAgICBcclxuICAgICAgICAgICAgb25EZXNlbGVjdEFsbDogZnVuY3Rpb24oc2VsZWN0ZWRPcHRpb25zOkpRdWVyeSl7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5iaW5kRGl2KHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuYWZ0ZXJEZXNlbGVjdEFsbChzZWxlY3RlZE9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuYWZ0ZXJDaGFuZ2VDb21tb25FdmVudCh0aGlzLiRzZWxlY3QpO1xyXG4gICAgICAgICAgICB9LCAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBvbkNoYW5nZTogZnVuY3Rpb24ob3B0aW9uOiBKUXVlcnksIGNoZWNrZWQ6IGJvb2xlYW4pe1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuYmluZERpdih0aGlzKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLmFmdGVyQ2hhbmdlKG9wdGlvbiwgY2hlY2tlZCk7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5hZnRlckNoYW5nZUNvbW1vbkV2ZW50KHRoaXMuJHNlbGVjdCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG9uSW5pdGlhbGl6ZWQ6IGZ1bmN0aW9uICgkc2VsZWN0LCAkY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5fbXVsdGlTZWxlY3RPYmplY3QgPSB0aGlzO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuYmluZERpdih0aGlzKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLm9uSW5pdGlhbGl6ZWRDb250cm9sKHRoaXMpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBvbkRyb3Bkb3duSGlkZTogZnVuY3Rpb24gKGV2ZW50OiBFdmVudCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IF9tdWx0aXNlbGVjdF9zZWFyY2ggPSBfdGhpcy5tc0NvbnRhaW5lci5maW5kKFwiLm11bHRpc2VsZWN0LXNlYXJjaFwiKTtcclxuICAgICAgICAgICAgICAgIGlmIChfbXVsdGlzZWxlY3Rfc2VhcmNoLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBfbXVsdGlzZWxlY3Rfc2VhcmNoLnZhbCgnJykudHJpZ2dlcigna2V5ZG93bicpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZXM6IHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbjogdGhpcy5fb3B0aW9ucy50ZW1wbGF0ZXNCdXR0b24sXHJcbiAgICAgICAgICAgICAgICBmaWx0ZXI6ICc8bGkgY2xhc3M9XCJtdWx0aXNlbGVjdC1pdGVtIG11bHRpc2VsZWN0LWZpbHRlclwiPjxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBtYi0zXCI+PGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sIG11bHRpc2VsZWN0LXNlYXJjaFwiIHR5cGU9XCJ0ZXh0XCIgLz48ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtcHJlcGVuZFwiPjxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtdGV4dCBzYW9wLWltZy1zZWFyY2ggc2kteHNcIj48L3NwYW4+PC9kaXY+PC9kaXY+PC9saT4nXHJcbiAgICAgICAgICAgIH0gICAgICAgICAgICBcclxuICAgICAgICB9KVxyXG4gICAgICAgIC8vLm11bHRpc2VsZWN0KCdzZWxlY3RBbGwnLCBmYWxzZSwgdHJ1ZSlcclxuICAgICAgICAubXVsdGlzZWxlY3QoJ3VwZGF0ZUJ1dHRvblRleHQnKTtcclxuICAgICAgICA7ICBcclxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5zZWxlY3RBbGwgPT0gbnVsbCB8fCB0aGlzLl9vcHRpb25zLnNlbGVjdEFsbCA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICQodGFyZ2V0KS5tdWx0aXNlbGVjdCgnc2VsZWN0QWxsJywgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFmdGVyU2VsZWN0QWxsKHNlbGVjdGVkT3B0aW9uczpKUXVlcnkpe1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBhZnRlckRlc2VsZWN0QWxsKHNlbGVjdGVkT3B0aW9uczpKUXVlcnkpe1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBhZnRlckNoYW5nZShvcHRpb246IEpRdWVyeSwgY2hlY2tlZDogYm9vbGVhbil7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGFmdGVyQ2hhbmdlQ29tbW9uRXZlbnQoZWxlbWVudDphbnkpe1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBhZnRlckluaXRpYWxpemVkQ29udHJvbChlbGVtZW50OiBhbnkpe1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wTXVsdGlzZWxlY3QuYWZ0ZXJJbml0aWFsaXplZENvbnRyb2xcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc2VsZWN0VmFsdWVzIHZyZWRub3N0aVxyXG4gICAgc2V0U2VsZWN0VmFsdWVzKHNlbGVjdFZhbHVlczogc3RyaW5nW10pOiB2b2lkIHtcclxuICAgICAgICAvLyBvZHpuYWNpbW8gdnNlIHphcG9zbGVuZVxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDQi5tdWx0aXNlbGVjdCgnZGVzZWxlY3RBbGwnKTtcclxuXHJcbiAgICAgICAgaWYgKHNlbGVjdFZhbHVlcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIC8vIG96bmFjaW1vIGl6YnJhbmVcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENCLm11bHRpc2VsZWN0KCdzZWxlY3QnLCBzZWxlY3RWYWx1ZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlbGVjdGVkQ0IubXVsdGlzZWxlY3QoJ3JlZnJlc2gnKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX211bHRpU2VsZWN0T2JqZWN0ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5iaW5kRGl2KHRoaXMuX211bHRpU2VsZWN0T2JqZWN0KTtcclxuICAgICAgICAgICAgdGhpcy5hZnRlckNoYW5nZUNvbW1vbkV2ZW50KHRoaXMuX211bHRpU2VsZWN0T2JqZWN0LiRzZWxlY3QpO1xyXG4gICAgICAgIH0gXHJcbiAgICB9XHJcblxyXG4gICAgLy8gc2VsZWN0VmFsdWVzIHZyZWRub3N0aVxyXG4gICAgdW5zZXRTZWxlY3RWYWx1ZXMoc2VsZWN0VmFsdWVzOiBzdHJpbmdbXSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChzZWxlY3RWYWx1ZXMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAvLyBvem5hY2ltbyBpemJyYW5lXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDQi5tdWx0aXNlbGVjdCgnZGVzZWxlY3QnLCBzZWxlY3RWYWx1ZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlbGVjdGVkQ0IubXVsdGlzZWxlY3QoJ3JlZnJlc2gnKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX211bHRpU2VsZWN0T2JqZWN0ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5iaW5kRGl2KHRoaXMuX211bHRpU2VsZWN0T2JqZWN0KTtcclxuICAgICAgICAgICAgdGhpcy5hZnRlckNoYW5nZUNvbW1vbkV2ZW50KHRoaXMuX211bHRpU2VsZWN0T2JqZWN0LiRzZWxlY3QpO1xyXG4gICAgICAgIH0gXHJcbiAgICB9ICAgIFxyXG5cclxuICAgIGNsZWFySHRtbE9wdGlvbnMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZENCXHJcbiAgICAgICAgICAgIC5maW5kKCdvcHRpb24nKVxyXG4gICAgICAgICAgICAucmVtb3ZlKClcclxuICAgICAgICAgICAgLmVuZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlYnVpbGQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZENCLm11bHRpc2VsZWN0KCdyZWJ1aWxkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaEh0bWxPcHRpb25zKG9wdGlvbkxpc3Q6IFNlbGVjdE9wdGlvbltdLCBzZWxlY3RBbGw6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIHRoaXMuY2xlYXJIdG1sT3B0aW9ucygpO1xyXG4gICAgICAgIGlmIChvcHRpb25MaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgb3B0aW9uTGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4gX3RoaXMuc2VsZWN0ZWRDQi5hcHBlbmQoJzxvcHRpb24gdmFsdWU9XCInICsgZWxlbWVudC52YWx1ZSArICdcIj4nICsgZWxlbWVudC50ZXh0ICsgJzwvb3B0aW9uPicpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkKCk7XHJcbiAgICAgICAgdGhpcy5hZGRTdGlja3lDbGFzcygpO1xyXG5cclxuICAgICAgICBpZiAoc2VsZWN0QWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDQi5tdWx0aXNlbGVjdCgnc2VsZWN0QWxsJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZENCLnZhbCgpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRNc0Zsb2F0aW5nTGFiZWwoZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRNc0Zsb2F0aW5nTGFiZWwodHJ1ZSk7XHJcbiAgICAgICAgICAgIH0gICAgXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy9cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFBvcG92ZXIge1xyXG4gICAgcHJpdmF0ZSBfcXVlcnlTZWxlY3Rvcjogc3RyaW5nO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHF1ZXJ5U2VsZWN0b3I6IHN0cmluZyA9IFwiW2RhdGEtdG9nZ2xlPXBvcG92ZXJdXCIpIHtcclxuICAgICAgICB0aGlzLl9xdWVyeVNlbGVjdG9yID0gcXVlcnlTZWxlY3RvcjtcclxuICAgIH1cclxuXHJcbiAgICBiaW5kUG9wb3ZlckV2ZW50cygpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFBvcG92ZXIuYmluZFBvcG92ZXJFdmVudHNcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgJChcIltkYXRhLXRvZ2dsZT1wb3BvdmVyXVwiKS5wb3BvdmVyKHtcclxuICAgICAgICAgICAgaHRtbDogdHJ1ZSxcclxuICAgICAgICAgICAgc2FuaXRpemU6IGZhbHNlLFxyXG4gICAgICAgICAgICB0cmlnZ2VyOiAnY2xpY2snLFxyXG4gICAgICAgICAgICBjb250ZW50OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgY29udGVudCA9ICQodGhpcykuYXR0cihcImRhdGEtcG9wb3Zlci1jb250ZW50XCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoY29udGVudCkuY2hpbGRyZW4oXCIucG9wb3Zlci1ib2R5XCIpLmh0bWwoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkKCdodG1sJykub24oJ21vdXNldXAnLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwibW91c2V1cCFcIik7XHJcbiAgICAgICAgICAgIGlmICghJChlLnRhcmdldCkuY2xvc2VzdCgnLnBvcG92ZXInKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJtb3VzZXVwLnBvcG92ZXIhXCIpO1xyXG4gICAgICAgICAgICAgICAgJCgnLnBvcG92ZXInKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwibW91c2V1cC5wb3BvdmVyLmhpZGUhXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vJCh0aGlzLnByZXZpb3VzU2libGluZykucG9wb3ZlcignaGlkZScpO1xyXG4gICAgICAgICAgICAgICAgICAgICQoX3RoaXMuX3F1ZXJ5U2VsZWN0b3IpLnBvcG92ZXIoJ2hpZGUnKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIHdoZW4gcG9wb3ZlcidzIGNvbnRlbnQgaXMgc2hvd25cclxuICAgICAgICAkKFwiW2RhdGEtdG9nZ2xlPXBvcG92ZXJdXCIpLm9uKCdzaG93bi5icy5wb3BvdmVyJywgZnVuY3Rpb24gKGU6IGFueSkge1xyXG4gICAgICAgICAgICAvLyBzZXQgd2hhdCBoYXBwZW5zIHdoZW4gdXNlciBjbGlja3Mgb24gdGhlIGJ1dHRvblxyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic2V0IVwiKTtcclxuXHJcbiAgICAgICAgICAgIF90aGlzLmFmdGVyUG9wb3ZlclNob3codGhpcyk7XHJcblxyXG4gICAgICAgICAgICAkKFwiLnBvcG92ZXJMaW5rXCIpLm9mZignY2xpY2snKTtcclxuICAgICAgICAgICAgJChcIi5wb3BvdmVyTGlua1wiKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwicG9wb3ZlckxpbmsgY2xpY2tlZCEhIVwiKTtcclxuICAgICAgICAgICAgICAgICQoXCJbZGF0YS10b2dnbGU9cG9wb3Zlcl1cIikucG9wb3ZlcignaGlkZScpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICQoXCIucG9wb3ZlckNsb3NlXCIpLm9mZignY2xpY2snKTtcclxuICAgICAgICAgICAgJChcIi5wb3BvdmVyQ2xvc2VcIikub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIkNsb3NlIHBvcG92ZXIgY2xpY2tlZCEhIVwiKTtcclxuICAgICAgICAgICAgICAgICQoXCJbZGF0YS10b2dnbGU9cG9wb3Zlcl1cIikucG9wb3ZlcignaGlkZScpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgYWZ0ZXJQb3BvdmVyU2hvdyhlbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUG9wb3Zlci5hZnRlclBvcG92ZXJTaG93XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRTZWxmQ29udGFpbmVyUG9wb3ZlcigpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFBvcG92ZXIuaW5pdFNlbGZDb250YWluZXJQb3BvdmVyXCIpO1xyXG5cclxuICAgICAgICAkKHRoaXMuX3F1ZXJ5U2VsZWN0b3IpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBsZXQgJGVsZW0gPSAkKHRoaXMpO1xyXG4gICAgICAgICAgICBsZXQgZWxlbSA9IHRoaXM7XHJcbiAgICAgICAgICAgICRlbGVtLnBvcG92ZXIoe1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyOiBlbGVtLFxyXG4gICAgICAgICAgICAgICAgc2FuaXRpemU6IGZhbHNlXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGVuYWJsZVBvcG92ZXIoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BQb3BvdmVyLmVuYWJsZVBvcG92ZXJcIik7XHJcblxyXG4gICAgICAgICQodGhpcy5fcXVlcnlTZWxlY3RvcikuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGxldCAkZWxlbSA9ICQodGhpcyk7XHJcbiAgICAgICAgICAgICRlbGVtLnBvcG92ZXIoJ2VuYWJsZScpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGRpc2FibGVQb3BvdmVyKCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUG9wb3Zlci5kaXNhYmxlUG9wb3ZlclwiKTtcclxuXHJcbiAgICAgICAgJCh0aGlzLl9xdWVyeVNlbGVjdG9yKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgbGV0ICRlbGVtID0gJCh0aGlzKTtcclxuICAgICAgICAgICAgJGVsZW0ucG9wb3ZlcignZGlzYWJsZScpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IHNldE1vZGFsRm9ybVpJbmRleCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wUG9wdXBEaWFsb2dPcHRpb25zIHtcclxuICAgIHRpdGxlOiBzdHJpbmc7XHJcbiAgICBib2R5OiBzdHJpbmc7XHJcbiAgICBzaG93Q2FuY2VsQnV0dG9uOiBib29sZWFuO1xyXG4gICAgY29uZmlybUJ1dHRvbkNhcHRpb246IHN0cmluZztcclxuICAgIGNhbmNlbEJ1dHRvbkNhcHRpb246IHN0cmluZztcclxuICAgIGNvbmZpcm1BY3Rpb246IHN0cmluZztcclxuICAgIGNvbmZpcm1BY3Rpb25kYXRhOiBvYmplY3Q7XHJcbiAgICBvblN1Y2Nlc3M6IChwYXJhbXM6YW55KSA9PiBhbnk7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLnRpdGxlID0gXCJcIjtcclxuICAgICAgICB0aGlzLmJvZHkgPSBcImJvZHkgdGV4dFwiO1xyXG4gICAgICAgIHRoaXMuc2hvd0NhbmNlbEJ1dHRvbiA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5jb25maXJtQnV0dG9uQ2FwdGlvbiA9IFwiT2tcIjtcclxuICAgICAgICB0aGlzLmNhbmNlbEJ1dHRvbkNhcHRpb24gPSBcIkNhbmNlbFwiO1xyXG4gICAgICAgIHRoaXMuY29uZmlybUFjdGlvbiA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5jb25maXJtQWN0aW9uZGF0YSA9IHt9O1xyXG4gICAgICAgIHRoaXMub25TdWNjZXNzID0gbnVsbDtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BQb3B1cERpYWxvZyB7XHJcbiAgICBwcml2YXRlIF9vcHRpb25zOlNhb3BQb3B1cERpYWxvZ09wdGlvbnM7XHJcblxyXG5cclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6U2FvcFBvcHVwRGlhbG9nT3B0aW9ucykge1xyXG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgfSAgICBcclxuICAgIFxyXG4gICAgc2F2ZShjYWxsYmFjazogKG46IG51bWJlcikgPT4gYW55KSA6IHZvaWQge1xyXG4gICAgICAgIGNhbGxiYWNrKDQyKTtcclxuICAgIH1cclxuXHJcbiAgICBTaG93TG9hZGluZ1Nhb3AoKSB7XHJcbiAgICAgICAgdmFyIG9iaiA9ICQoXCIjc2FvcExvYWRpbmdcIik7XHJcbiAgICAgICAgaWYgKG9iai5sZW5ndGgpXHJcbiAgICAgICAgICAgIG9iai5zaG93KCk7XHJcbiAgICB9XHJcblxyXG4gICAgSGlkZUxvYWRpbmdTYW9wKCkge1xyXG4gICAgICAgIHZhciBvYmogPSAkKFwiI3Nhb3BMb2FkaW5nXCIpO1xyXG4gICAgICAgIGlmIChvYmoubGVuZ3RoKVxyXG4gICAgICAgICAgICBvYmouaGlkZSgpO1xyXG4gICAgfSAgICBcclxuXHJcbiAgICBTaG93UG9wdXBEaWFsb2coKTp2b2lkIHtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIC8vIERpc3BsYXkgaW5mbyBtZXNzYWdlIHRvIHRoZSB1c2VyIGluIGEgbW9kYWxcclxuICAgICAgICBsZXQgdGl0bGVEaXYgPSAkKCcjaW5mby1tb2RhbC10aXRsZS1kaXYnKTtcclxuICAgICAgICBsZXQgdGl0bGVIID0gJCgnI2luZm8tbW9kYWwtdGl0bGUnKTtcclxuICAgICAgICBsZXQgY29uZmlybUJ1dHRvbiA9ICQoJyNpbmZvLW1vZGFsLWJ0bi1vaycpO1xyXG4gICAgICAgIGxldCBjYW5jZWxCdXR0b24gPSAkKCcjaW5mby1tb2RhbC1idG4tY2FuY2VsJyk7XHJcblxyXG4gICAgICAgIGNhbmNlbEJ1dHRvbi5odG1sKHRoaXMuX29wdGlvbnMuY2FuY2VsQnV0dG9uQ2FwdGlvbik7XHJcblxyXG4gICAgICAgIC8vIHNob3cgb3IgaGlkZSBoZWFkZXIgZGl2IGJhc2VkIG9uIHRpdGxlIHByb3BlcnR5XHJcbiAgICAgICAgdGl0bGVEaXYuY3NzKFwiZGlzcGxheVwiLCBcIlwiKTtcclxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy50aXRsZSkge1xyXG4gICAgICAgICAgICB0aXRsZUguaHRtbCh0aGlzLl9vcHRpb25zLnRpdGxlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRpdGxlRGl2LmNzcyhcImRpc3BsYXlcIiwgXCJub25lXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuY29uZmlybUJ1dHRvbkNhcHRpb24pe1xyXG4gICAgICAgICAgICBjb25maXJtQnV0dG9uLmh0bWwodGhpcy5fb3B0aW9ucy5jb25maXJtQnV0dG9uQ2FwdGlvbik7XHJcbiAgICAgICAgICAgIGNvbmZpcm1CdXR0b24uY3NzKFwiZGlzcGxheVwiLCBcIlwiKTsgICAgICAgICAgICBcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25maXJtQnV0dG9uLmNzcyhcImRpc3BsYXlcIiwgXCJub25lXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuc2hvd0NhbmNlbEJ1dHRvbikge1xyXG4gICAgICAgICAgICBjYW5jZWxCdXR0b24uaHRtbCh0aGlzLl9vcHRpb25zLmNhbmNlbEJ1dHRvbkNhcHRpb24pO1xyXG4gICAgICAgICAgICBjYW5jZWxCdXR0b24uY3NzKFwiZGlzcGxheVwiLCBcIlwiKTsgICAgICAgICAgICBcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjYW5jZWxCdXR0b24uY3NzKFwiZGlzcGxheVwiLCBcIm5vbmVcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAkKCcjaW5mby1tb2RhbC1ib2R5JykuaHRtbCh0aGlzLl9vcHRpb25zLmJvZHkpO1xyXG5cclxuICAgICAgICAkKFwiI2luZm8tbW9kYWwtYnRuLW9rXCIpLmNsaWNrKFxyXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5wb3B1cERpYWxvZ0NvbmZpcm0oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgICQoJyNpbmZvLW1vZGFsJykub24oJ2hpZGRlbi5icy5tb2RhbCcsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICQoXCIjaW5mby1tb2RhbC1idG4tb2tcIikudW5iaW5kKFwiY2xpY2tcIik7XHJcbiAgICAgICAgICAgICQodGhpcykubW9kYWwoJ2Rpc3Bvc2UnKTtcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICAkKCcjaW5mby1tb2RhbCcpLm1vZGFsKCdzaG93Jyk7XHJcbiAgICAgICAgc2V0TW9kYWxGb3JtWkluZGV4KCcjaW5mby1tb2RhbCcpO1xyXG4gICAgfSAgICBcclxuXHJcbiAgICBwb3B1cERpYWxvZ0NvbmZpcm0oKSB7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgY2FuY2VsQnV0dG9uID0gJCgnI2luZm8tbW9kYWwtYnRuLWNhbmNlbCcpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5jb25maXJtQWN0aW9uICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgICQuYWpheCh7XHJcbiAgICAgICAgICAgICAgICB1cmw6IHRoaXMuX29wdGlvbnMuY29uZmlybUFjdGlvbixcclxuICAgICAgICAgICAgICAgIHR5cGU6IFwiUE9TVFwiLFxyXG4gICAgICAgICAgICAgICAgZGF0YTogdGhpcy5fb3B0aW9ucy5jb25maXJtQWN0aW9uZGF0YSxcclxuICAgICAgICAgICAgICAgIGJlZm9yZVNlbmQ6IGZ1bmN0aW9uICgpIHsgX3RoaXMuU2hvd0xvYWRpbmdTYW9wKCk7IH0sXHJcbiAgICAgICAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gKCkgeyBfdGhpcy5IaWRlTG9hZGluZ1Nhb3AoKTsgfSxcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjbG9zZSBkaWFsb2dcclxuICAgICAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b24udHJpZ2dlcihcImNsaWNrXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZihfdGhpcy5fb3B0aW9ucy5vblN1Y2Nlc3MgIT09IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5fb3B0aW9ucy5vblN1Y2Nlc3MocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjbG9zZSBkaWFsb2dcclxuICAgICAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b24udHJpZ2dlcihcImNsaWNrXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGFsZXJ0KHJlc3BvbnNlLnJlc3BvbnNlSlNPTi5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvL2Nsb3NlIGRpYWxvZ1xyXG4gICAgICAgICAgICBjYW5jZWxCdXR0b24udHJpZ2dlcihcImNsaWNrXCIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMub25TdWNjZXNzICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMub25TdWNjZXNzKG51bGwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vXHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BTZXJ2aWNlc0NvcmUgfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXNlcnZpY2VzLWNvcmVcIjtcclxuaW1wb3J0IHsgT2Jkb2JqZWZpbHRlclZhbHVlcyB9IGZyb20gXCIuLi9Db21wb25lbnRzL3Nhb3Atc2VsZWN0LW1vbnRoLXllYXJcIjtcclxuXHJcbmV4cG9ydCBlbnVtIFNhb3BSaWdodFNpZGViYXJWaWV3IHtcclxuICAgIERhc2hib2FyZCA9IDBcclxuICAgICxBYnNlbmNlID0gMVxyXG4gICAgLEF0dGVuZGFuY2VEYXkgPSAyXHJcbiAgICAsQXR0ZW5kYW5jZU1vbnRoID0gMyAgICBcclxuICAgICxUcmF2ZWxPcmRlcnMgPSA0XHJcbiAgICAsIEludGVybmFsT3JkZXJzID0gNVxyXG4gICAgLCBBYnNlbmNlQ2FsZW5kYXIgPSA2XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wUmlnaHRTaWRlYmFyIHtcclxuICAgIHByaXZhdGUgX3Nhb3BTZXJ2aWNlc0NvcmU6IFNhb3BTZXJ2aWNlc0NvcmU7XHJcbiAgICBwcml2YXRlIF9zYW9wU2VydmljZXNDb3JlQWx0ZXJuYXRpdmU6IFNhb3BTZXJ2aWNlc0NvcmU7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZUFsdGVybmF0aXZlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgYmluZENhcm91c2VsRGl2KGNvbnRlbnRJZDpzdHJpbmcsdmlldzpTYW9wUmlnaHRTaWRlYmFyVmlldyl7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSaWdodFNpZGViYXIuYmluZERpdlwiKTsgXHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbihyZXNwb25zZSl7XHJcbiAgICAgICAgICAgICQoY29udGVudElkKS5odG1sKHJlc3BvbnNlKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjpcIlJpZ2h0U2lkZUJhci9HZXRDYXJvdXNlbFZpZXc/dmlldz1cIit2aWV3LnRvU3RyaW5nKClcclxuICAgICAgICAgICAgLGRhdGE6bnVsbFxyXG4gICAgICAgICAgICAsdHlwZTpcIkdFVFwiXHJcbiAgICAgICAgICAgICxzcGlubmVyRGl2SWQ6XCIjc2FvcExvYWRpbmdTaWRlYmFyclwiXHJcbiAgICAgICAgICAgICxhc3luYzpmYWxzZVxyXG4gICAgICAgIH0pOyAgICAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaERvcHVzdFphS29yaXNjZW5qZVN1bW1hcnkoY29udGVudElkOiBzdHJpbmcsIHNwaW5uZXJEaXZJZDogc3RyaW5nID0gXCIjc2FvcExvYWRpbmdTaWRlYmFyclwiKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSaWdodFNpZGViYXIucmVmcmVzaERvcHVzdFphS29yaXNjZW5qZVN1bW1hcnlcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24ocmVzcG9uc2Upe1xyXG4gICAgICAgICAgICAkKGNvbnRlbnRJZCkuaHRtbChyZXNwb25zZSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246XCJSaWdodFNpZGVCYXIvRG9wdXN0WmFLb3Jpc2NlbmplU3VtbWFyeVBhcnRpYWxcIlxyXG4gICAgICAgICAgICAsZGF0YTpudWxsXHJcbiAgICAgICAgICAgICx0eXBlOlwiR0VUXCJcclxuICAgICAgICAgICAgLHNwaW5uZXJEaXZJZDogc3Bpbm5lckRpdklkXHJcbiAgICAgICAgfSk7ICAgICAgICBcclxuICAgIH1cclxuXHJcblxyXG4gICAgcmVmcmVzaFVyZVphS29yaXNjZW5qZVN1bW1hcnkoY29udGVudElkOiBzdHJpbmcsIHNwaW5uZXJEaXZJZDogc3RyaW5nID0gXCIjc2FvcExvYWRpbmdTaWRlYmFyclwiKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSaWdodFNpZGViYXIucmVmcmVzaFVyZVphS29yaXNjZW5qZVN1bW1hcnlcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24ocmVzcG9uc2Upe1xyXG4gICAgICAgICAgICAkKGNvbnRlbnRJZCkuaHRtbChyZXNwb25zZSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246XCJSaWdodFNpZGVCYXIvVXJlWmFLb3Jpc2NlbmplU3VtbWFyeVBhcnRpYWxcIlxyXG4gICAgICAgICAgICAsZGF0YTpudWxsXHJcbiAgICAgICAgICAgICx0eXBlOlwiR0VUXCJcclxuICAgICAgICAgICAgLHNwaW5uZXJEaXZJZDogc3Bpbm5lckRpdklkXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaE9kc290bm9zdGlFbXBsb3llZVN1bW1hcnkoc2lmcmFaYXBvbHNlbmk6IHN0cmluZywgY29udGVudERvcHVzdElkOiBzdHJpbmcsIGNvbnRlbnRVcmVJZDogc3RyaW5nLCBzcGlubmVyRGl2SWQ6IHN0cmluZyA9IFwiI3Nhb3BMb2FkaW5nU2lkZWJhcnJcIik6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmlnaHRTaWRlYmFyLnJlZnJlc2hPZHNvdG5vc3RpRW1wbG95ZWVTdW1tYXJ5XCIpO1xyXG5cclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAkKGNvbnRlbnREb3B1c3RJZCkuaHRtbChyZXNwb25zZSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246IFwiUmlnaHRTaWRlQmFyL0RvcHVzdFphS29yaXNjZW5qZUVtcGxveWVlU3VtbWFyeVBhcnRpYWxcIlxyXG4gICAgICAgICAgICAsIGRhdGE6IHtcclxuICAgICAgICAgICAgICAgIHNpZnJhWmFwb2xzZW5pOiBzaWZyYVphcG9sc2VuaVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICwgdHlwZTogXCJHRVRcIlxyXG4gICAgICAgICAgICAsIHNwaW5uZXJEaXZJZDogc3Bpbm5lckRpdklkXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmVBbHRlcm5hdGl2ZS5hZnRlckRvbmUgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgJChjb250ZW50VXJlSWQpLmh0bWwocmVzcG9uc2UpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZUFsdGVybmF0aXZlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246IFwiUmlnaHRTaWRlQmFyL1VyZVphS29yaXNjZW5qZUVtcGxveWVlU3VtbWFyeVBhcnRpYWxcIlxyXG4gICAgICAgICAgICAsIGRhdGE6IHtcclxuICAgICAgICAgICAgICAgIHNpZnJhWmFwb2xzZW5pOiBzaWZyYVphcG9sc2VuaVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICwgdHlwZTogXCJHRVRcIlxyXG4gICAgICAgICAgICAsIHNwaW5uZXJEaXZJZDogc3Bpbm5lckRpdklkXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaE9kc290bm9zdGlTdW1tYXJ5KGNvbnRlbnREb3B1c3RJZDogc3RyaW5nLCBjb250ZW50VXJlSWQ6IHN0cmluZywgc3Bpbm5lckRpdklkOiBzdHJpbmcgPSBcIiNzYW9wTG9hZGluZ1NpZGViYXJyXCIpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJpZ2h0U2lkZWJhci5yZWZyZXNoT2Rzb3Rub3N0aVN1bW1hcnlcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICQoY29udGVudERvcHVzdElkKS5odG1sKHJlc3BvbnNlKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjogXCJSaWdodFNpZGVCYXIvRG9wdXN0WmFLb3Jpc2NlbmplU3VtbWFyeVBhcnRpYWxcIlxyXG4gICAgICAgICAgICAsIHR5cGU6IFwiR0VUXCJcclxuICAgICAgICAgICAgLCBzcGlubmVyRGl2SWQ6IHNwaW5uZXJEaXZJZFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlQWx0ZXJuYXRpdmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICQoY29udGVudFVyZUlkKS5odG1sKHJlc3BvbnNlKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmVBbHRlcm5hdGl2ZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOiBcIlJpZ2h0U2lkZUJhci9VcmVaYUtvcmlzY2VuamVTdW1tYXJ5UGFydGlhbFwiXHJcbiAgICAgICAgICAgICwgdHlwZTogXCJHRVRcIlxyXG4gICAgICAgICAgICAsIHNwaW5uZXJEaXZJZDogc3Bpbm5lckRpdklkXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHJlZnJlc2hSZWdVcmFEb2dvZGtpU3VtbWFyeShjb250ZW50SWQ6IHN0cmluZywgc2VsZWN0ZWRNb250aFllYXI6IE9iZG9iamVmaWx0ZXJWYWx1ZXMsIHNwaW5uZXJEaXZJZDpzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJpZ2h0U2lkZWJhci5yZWZyZXNoUmVnVXJhRG9nb2RraVN1bW1hcnlcIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgbGV0IHBhcmFtcyA9IHsgbGV0bzogc2VsZWN0ZWRNb250aFllYXIubGV0bywgbWVzZWM6IHNlbGVjdGVkTW9udGhZZWFyLm1lc2VjIH07XHJcblxyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24ocmVzcG9uc2Upe1xyXG4gICAgICAgICAgICAkKGNvbnRlbnRJZCkuaHRtbChyZXNwb25zZSk7XHJcbiAgICAgICAgICAgIF90aGlzLnNldEhlaWdodCgpO1xyXG4gICAgICAgICAgICB3aW5kb3cub25yZXNpemUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5zZXRIZWlnaHQoKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjpcIlJpZ2h0U2lkZUJhci9SZWdVcmFEb2dvZGtpU3VtbWFyeVBhcnRpYWxcIlxyXG4gICAgICAgICAgICAsZGF0YTpwYXJhbXNcclxuICAgICAgICAgICAgLHR5cGU6XCJHRVRcIlxyXG4gICAgICAgICAgICAsc3Bpbm5lckRpdklkOnNwaW5uZXJEaXZJZFxyXG4gICAgICAgICAgICAvLyxzcGlubmVyRGl2SWQ6XCIjc2FvcExvYWRpbmdTaWRlYmFyclwiXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaFJlZ09QTlBvdG5pTmFsb2dpU3VtbWFyeShjb250ZW50SWQ6IHN0cmluZywgc3Bpbm5lckRpdklkOnN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmlnaHRTaWRlYmFyLnJlZnJlc2hSZWdPUE5Qb3RuaU5hbG9naVN1bW1hcnlcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24ocmVzcG9uc2Upe1xyXG4gICAgICAgICAgICAkKGNvbnRlbnRJZCkuaHRtbChyZXNwb25zZSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246XCJUcmF2ZWxPcmRlci9UcmF2ZWxPcmRlcnNTdW1tYXJ5XCJcclxuICAgICAgICAgICAgLGRhdGE6bnVsbFxyXG4gICAgICAgICAgICAsdHlwZTpcIkdFVFwiXHJcbiAgICAgICAgICAgICxzcGlubmVyRGl2SWQ6c3Bpbm5lckRpdklkXHJcbiAgICAgICAgICAgIC8vLHNwaW5uZXJEaXZJZDpcIiNzYW9wTG9hZGluZ1NpZGViYXJyXCJcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoTmRrSW50ZXJuYWxPcmRlcnNTdW1tYXJ5KGNvbnRlbnRJZDogc3RyaW5nLCBzcGlubmVyRGl2SWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmlnaHRTaWRlYmFyLnJlZnJlc2hOZGtJbnRlcm5hbE9yZGVyc1N1bW1hcnlcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICQoY29udGVudElkKS5odG1sKHJlc3BvbnNlKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjogXCJSaWdodFNpZGVCYXIvSW50ZXJuYWxPcmRlcnNTdW1tYXJ5XCJcclxuICAgICAgICAgICAgLCBkYXRhOiBudWxsXHJcbiAgICAgICAgICAgICwgdHlwZTogXCJHRVRcIlxyXG4gICAgICAgICAgICAsIHNwaW5uZXJEaXZJZDogc3Bpbm5lckRpdklkXHJcbiAgICAgICAgICAgIC8vLHNwaW5uZXJEaXZJZDpcIiNzYW9wTG9hZGluZ1NpZGViYXJyXCJcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRIZWlnaHQoKSB7XHJcbiAgICAgICAgdmFyIGhlYWRlciA9ICQoXCIjc2l0ZS1oZWFkZXJcIikuaGVpZ2h0KCk7XHJcbiAgICAgICAgdmFyIGZvb3RlciA9ICQoXCIjc2l0ZS1mb290ZXJcIikuaGVpZ2h0KCk7XHJcbiAgICAgICAgJChcIiNyZWctc3VtbWFyeS1jb250YWluZXJcIikuaGVpZ2h0KHdpbmRvdy5pbm5lckhlaWdodCAtIGhlYWRlciAtIGZvb3RlciAtIDEwNik7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vXHJcbn1cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCwgaXNFbXB0eSwgaXNVbkRlZmluZWQgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BNdWx0aXNlbGVjdCwgU2FvcE11bHRpc2VsZWN0T3B0aW9ucyB9IGZyb20gXCIuLi9Db21wb25lbnRzL3Nhb3AtbXVsdGlzZWxlY3RcIjtcclxuaW1wb3J0IHsgU2FvcFNlcnZpY2VzQ29yZSwgU2FvcFNlcnZpY2VzQ29yZVBhcmFtcyB9IGZyb20gXCIuLi9Db3JlL3Nhb3Atc2VydmljZXMtY29yZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BTZWxlY3REcm9wRG93bkl0ZW0ge1xyXG4gICAgcHVibGljIGtleTogc3RyaW5nO1xyXG4gICAgcHVibGljIHZhbHVlOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wU2VsZWN0RHJvcERvd25JdGVtcyB7XHJcbiAgICBwdWJsaWMgZG93bkl0ZW1zOltTYW9wU2VsZWN0RHJvcERvd25JdGVtP10gPSBbXTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BTZWxlY3REcm9wRG93biBleHRlbmRzIFNhb3BNdWx0aXNlbGVjdHtcclxuICAgIC8vXHJcbiAgICBwdWJsaWMgZHJvcERvd25Db250YWluZXJJZDpzdHJpbmc7IFxyXG4gICAgcHVibGljIG1zRHJvcERvd25Db250YWluZXI6SlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIC8vXHJcbiAgICBwdWJsaWMgbXNBZGRCdXR0b246IEpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgICBwdWJsaWMgbXNFZGl0QnV0dG9uOiBKUXVlcnk8SFRNTEVsZW1lbnQ+OyAgICBcclxuICAgIC8vXHJcblxyXG4gICAgY29uc3RydWN0b3IobGliTmFtZTpzdHJpbmcgPSBcIlwiLCBvcHRpb25zOlNhb3BNdWx0aXNlbGVjdE9wdGlvbnMgPSBudWxsKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BNdWx0aXNlbGVjdFwiKTtcclxuICAgICAgICBpZiAob3B0aW9ucyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7dGVtcGxhdGVzQnV0dG9uOlwiXCJ9O1xyXG4gICAgICAgIH0gXHJcblxyXG4gICAgICAgIGlmIChpc1VuRGVmaW5lZChvcHRpb25zLnRlbXBsYXRlc0J1dHRvbikgfHwgb3B0aW9ucy50ZW1wbGF0ZXNCdXR0b24ubGVuZ3RoID09IDApe1xyXG4gICAgICAgICAgICBvcHRpb25zLnRlbXBsYXRlc0J1dHRvbiA9ICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm11bHRpc2VsZWN0IGRyb3Bkb3duLXRvZ2dsZSBwci0wXCIgZGF0YS10b2dnbGU9XCJkcm9wZG93blwiPjxzcGFuIGNsYXNzPVwibXVsdGlzZWxlY3Qtc2VsZWN0ZWQtdGV4dFwiPjwvc3Bhbj48c3BhbiBjbGFzcz1cInNhb3AtaW1nLWRvd24gc2ktcyBmbG9hdC1yaWdodFwiPjwvc3Bhbj48c3BhbiBjbGFzcz1cInNhb3AtaW1nLWNsb3NlIHNpLXMgZmxvYXQtcmlnaHRcIiBzdHlsZT1cIiBoZWlnaHQ6IDVweDsgd2lkdGg6IDEwcHg7IGZvbnQtc2l6ZTogMTVweDsgbWFyZ2luLXRvcDogNXB4O1wiPjwvc3Bhbj48L2J1dHRvbj4nOyAgICBcclxuICAgICAgICB9ICAgICAgICBcclxuXHJcbiAgICAgICAgc3VwZXIobGliTmFtZSxvcHRpb25zKTtcclxuICAgIH0gXHJcblxyXG4gICAgaW5pdCh0YXJnZXQ6IHN0cmluZyA9IFwiXCIsIGNhcHRpb24gPSBcIlwiICl7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLmRyb3BEb3duQ29udGFpbmVySWQgPSB0YXJnZXQrXCJfRHJvcERvd25Db250YWluZXJcIjtcclxuICAgICAgICB0aGlzLm1zRHJvcERvd25Db250YWluZXIgPSAkKHRoaXMuZHJvcERvd25Db250YWluZXJJZCk7XHJcbiAgICAgICAgaWYgKHRoaXMubXNEcm9wRG93bkNvbnRhaW5lci5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMubXNBZGRCdXR0b24gPSB0aGlzLm1zRHJvcERvd25Db250YWluZXIuZmluZChcIi5zYW9wLWltZy1wbHVzXCIpO1xyXG4gICAgICAgICAgICB0aGlzLm1zRWRpdEJ1dHRvbiA9IHRoaXMubXNEcm9wRG93bkNvbnRhaW5lci5maW5kKFwiLnNhb3AtaW1nLWVkaXRcIik7XHJcbiAgICAgICAgfSBcclxuICAgICAgICAvLyAgICAgICAgXHJcbiAgICAgICAgc3VwZXIuaW5pdCh0YXJnZXQsIGNhcHRpb24pO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy5iaW5kRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGJpbmRFdmVudHMgKCk6dm9pZHtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIGlmICh0aGlzLm1zRHJvcERvd25Db250YWluZXIubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAkKHRoaXMuZHJvcERvd25Db250YWluZXJJZCtcIiAuc2FvcC1pbWctY2xvc2VcIikub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgICAgICQodGhpcy5kcm9wRG93bkNvbnRhaW5lcklkK1wiIC5zYW9wLWltZy1jbG9zZVwiKS5vbihcImNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcE11bHRpc2VsZWN0LmNsZWFyLmNsaWNrXCIpO1xyXG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5tc0Ryb3BEb3duQ29udGFpbmVyLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLm1zRHJvcERvd25Db250YWluZXIuZmluZCgnaW5wdXRbdHlwZT1cInJhZGlvXCJdJykucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5tc0Ryb3BEb3duQ29udGFpbmVyLmZpbmQoJy5tdWx0aXNlbGVjdC1zZWxlY3RlZC10ZXh0JykuaHRtbChcIlwiKTtcclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5zZXRNc0Zsb2F0aW5nTGFiZWwodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnNlbGVjdGVkQ0IubXVsdGlzZWxlY3QoJ2Rlc2VsZWN0QWxsJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pOyAgICAgICAgICAgICBcclxuICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgdGhpcy5tc0FkZEJ1dHRvbi5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAgICAgdGhpcy5tc0FkZEJ1dHRvbi5vbihcImNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcE11bHRpc2VsZWN0Lm1zQWRkQnV0dG9uLmNsaWNrXCIpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMub25BZGRCdG5DbGljayhlKTtcclxuICAgICAgICAgICAgfSk7ICBcclxuICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgdGhpcy5tc0VkaXRCdXR0b24ub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgICAgIHRoaXMubXNFZGl0QnV0dG9uLm9uKFwiY2xpY2tcIiwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wTXVsdGlzZWxlY3QubXNFZGl0QnV0dG9uLmNsaWNrXCIpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMub25FZGl0QnRuQ2xpY2soZSk7XHJcbiAgICAgICAgICAgIH0pOyAgICAgICBcclxuICAgICAgICAgICAgLy8gICAgIFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXRNc0Zsb2F0aW5nTGFiZWwoaXNFbXByeTpib29sZWFuKXtcclxuICAgICAgICBzdXBlci5zZXRNc0Zsb2F0aW5nTGFiZWwoaXNFbXByeSk7XHJcbiAgICAgICAgaWYgKGlzRW1wcnkpe1xyXG4gICAgICAgICAgICBpZiAodGhpcy5tc0Ryb3BEb3duQ29udGFpbmVyLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubXNBZGRCdXR0b24uY3NzKFwiZGlzcGxheVwiLFwidW5zZXRcIik7IFxyXG4gICAgICAgICAgICAgICAgdGhpcy5tc0VkaXRCdXR0b24uY3NzKFwiZGlzcGxheVwiLFwibm9uZVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7ICAgICAgICBcclxuICAgICAgICAgICAgaWYgKHRoaXMubXNEcm9wRG93bkNvbnRhaW5lci5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1zQWRkQnV0dG9uLmNzcyhcImRpc3BsYXlcIixcIm5vbmVcIik7IFxyXG4gICAgICAgICAgICAgICAgdGhpcy5tc0VkaXRCdXR0b24uY3NzKFwiZGlzcGxheVwiLFwidW5zZXRcIik7ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9ICAgICAgICAgICBcclxuICAgICAgICB9ICAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQWRkQnRuQ2xpY2soc2VuZGVyOmFueSk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwib25BZGRCdG5DbGljay4uLlwiKTtcclxuICAgIH0gIFxyXG5cclxuICAgIHB1YmxpYyBvbkVkaXRCdG5DbGljayhzZW5kZXI6YW55KTp2b2lke1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJvbkVkaXRCdG5DbGljay4uLlwiKTtcclxuICAgIH0gIFxyXG5cclxuICAgIGluaXRBbGwodGFyZ2V0Q2xhc3M6IHN0cmluZyA9IFwiXCIpe1xyXG4gICAgICAgICB2YXIgX21zTGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcuc2FvcC1kcm9wZG93bnNlbGVjdCcpO1xyXG5cclxuICAgICAgICAgX21zTGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICBsZXQgX2lucHV0ID0gbmV3IFNhb3BNdWx0aXNlbGVjdCgpO1xyXG4gICAgICAgICAgICBsZXQgX2lkID0gXCIjXCIrZWxlbWVudC5pZDtcclxuICAgICAgICAgICAgX2lucHV0LmluaXQoX2lkKTtcclxuICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RHJvcERvd25JdGVtc0RhdGEoX3BhcmFtczpTYW9wU2VydmljZXNDb3JlUGFyYW1zLCBzZWxlY3RWYWw6c3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImdldERyb3BEb3duSXRlbXNEYXRhXCIpO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICBcclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICBfdGhpcy5yZWZyZXNoRHJvcERvd25TZWxlY3QocmVzcG9uc2UsIHNlbGVjdFZhbCk7XHJcbiAgICAgICAgfTtcclxuICAgIFxyXG4gICAgICAgIHNhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjogX3BhcmFtcy5hY3Rpb25cclxuICAgICAgICAgICAgLCBkYXRhOiBfcGFyYW1zLmRhdGFcclxuICAgICAgICAgICAgLCB0eXBlOiBfcGFyYW1zLnR5cGVcclxuICAgICAgICB9KTsgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaERyb3BEb3duU2VsZWN0KGRyb3BEb3duOlthbnldLCBzZWxlY3RWYWw6c3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IHNlbGVjdERpdlRlbXBsYXRlID0gXCJcIjtcclxuXHJcbiAgICAgICAgLy9sZXQgX3NpZnJhUmVsYWNpamUgPSB0aGlzLnNlbGVjdGVkQ0IudmFsKCk7XHJcblxyXG4gICAgICAgIGRyb3BEb3duLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZS5rZXkgPT0gc2VsZWN0VmFsKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3REaXZUZW1wbGF0ZSA9IHNlbGVjdERpdlRlbXBsYXRlICsgXCJcXG5cIiArIFwiPG9wdGlvbiBzZWxlY3RlZD1cXFwic2VsZWN0ZWRcXFwiIHZhbHVlPVxcXCJcIit2YWx1ZS5rZXkrXCJcXFwiPlwiK3ZhbHVlLmtleStcIiAtIFwiK3ZhbHVlLnZhbHVlK1wiPC9vcHRpb24+XCJcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdERpdlRlbXBsYXRlID0gc2VsZWN0RGl2VGVtcGxhdGUgKyBcIlxcblwiICsgXCI8b3B0aW9uIHZhbHVlPVxcXCJcIit2YWx1ZS5rZXkrXCJcXFwiPlwiK3ZhbHVlLmtleStcIiAtIFwiK3ZhbHVlLnZhbHVlK1wiPC9vcHRpb24+XCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICB9KTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLnNlbGVjdGVkQ0IuaHRtbChzZWxlY3REaXZUZW1wbGF0ZSk7XHJcblxyXG4gICAgICAgIGxldCBfc2VsZWN0RGl2ID0gdGhpcy5zZWxlY3RlZENCLmNsb25lKCk7XHJcblxyXG4gICAgICAgIHRoaXMubXNEcm9wRG93bkNvbnRhaW5lci5maW5kKFwiI2ZMYWJlbFwiKS5odG1sKF9zZWxlY3REaXYpO1xyXG5cclxuICAgICAgICB0aGlzLmluaXQodGhpcy5fdGFyZ2V0LCB0aGlzLl9jYXB0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvL1xyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7vy8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9AdHlwZXMvYm9vdHN0cmFwLW11bHRpc2VsZWN0L2luZGV4LmQudHNcIiAvPlxyXG5pbXBvcnQgeyBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vQ29yZS9zYW9wLXRyYW5zbGF0ZSc7XHJcbmltcG9ydCB7IGdsb2JhbCxpc0VtcHR5LCBpc1VuRGVmaW5lZCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFBvcG92ZXIgfSBmcm9tICcuL3Nhb3AtcG9wb3Zlcic7XHJcblxyXG5leHBvcnQgY2xhc3MgT2Jkb2JqZWZpbHRlclZhbHVlcyB7XHJcbiAgICBsZXRvOiBudW1iZXI7XHJcbiAgICBtZXNlYzogbnVtYmVyO1xyXG4gICAgbWVzZWNOYXppdjogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFNlbGVjdE1vbnRoWWVhciB7XHJcbiAgICBwcml2YXRlIF92aWV3SWQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgX2NvbnRyb2xJZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfbGliTmFtZTogc3RyaW5nO1xyXG5cclxuICAgIHByaXZhdGUgX29iZG9iamVJZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfY2FsZW5kYXJJY29uSWQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgX29iZG9iamVGaWx0ZXJMZXRvSWQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgX29iZG9iamVGaWx0ZXJNZXNlY0lkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9vYmRvYmplQ3VycmVudEJ0bklkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9wb3BPdmVyT2Jkb2JqZUJvZHlJZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfcHJldmlvdXNNb250aEJ0bklkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9uZXh0TW9udGhCdG5JZDogc3RyaW5nO1xyXG5cclxuICAgIHByaXZhdGUgX3RyYW5zbGF0aW9uU2VydmljZTogU2FvcFRyYW5zbGF0aW9uU2VydmljZTtcclxuICAgIHByaXZhdGUgX3Nhb3BQb3BvdmVyOiBTYW9wUG9wb3ZlcjtcclxuXHJcbiAgICBwdWJsaWMgX3JlZnJlc2hpbmdSZWNvcmRzSW5Qcm9ncmVzczogYm9vbGVhbjtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih2aWV3SWQ6IHN0cmluZywgY29udHJvbElkOiBzdHJpbmcsIGxpYk5hbWU6IHN0cmluZyA9IFwiXCIpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlbGVjdE1vbnRoWWVhclwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fdmlld0lkID0gdmlld0lkO1xyXG4gICAgICAgIHRoaXMuX2NvbnRyb2xJZCA9IGNvbnRyb2xJZDtcclxuICAgICAgICB0aGlzLl9saWJOYW1lID0gbGliTmFtZTtcclxuXHJcbiAgICAgICAgdGhpcy5fcmVmcmVzaGluZ1JlY29yZHNJblByb2dyZXNzID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fb2Jkb2JqZUlkID0gXCIjT2Jkb2JqZVwiO1xyXG4gICAgICAgIHRoaXMuX2NhbGVuZGFySWNvbklkID0gXCIjY2FsZW5kYXJJY29uXCI7XHJcbiAgICAgICAgdGhpcy5fb2Jkb2JqZUZpbHRlckxldG9JZCA9IFwiI2xldG9PYmRvYmplXCI7XHJcbiAgICAgICAgdGhpcy5fb2Jkb2JqZUZpbHRlck1lc2VjSWQgPSBcIiNNZXNlY1N0cmluZ1wiO1xyXG4gICAgICAgIHRoaXMuX29iZG9iamVDdXJyZW50QnRuSWQgPSBcIiNjdXJyZW50TW9udGhCdG5GaWx0ZXJcIjtcclxuICAgICAgICB0aGlzLl9wb3BPdmVyT2Jkb2JqZUJvZHlJZCA9IFwiI3BvcE92ZXJPYmRvYmplQm9keVwiO1xyXG4gICAgICAgIHRoaXMuX3ByZXZpb3VzTW9udGhCdG5JZCA9IFwiI3ByZXZpb3VzTW9udGhCdG5GaWx0ZXJcIjtcclxuICAgICAgICB0aGlzLl9uZXh0TW9udGhCdG5JZCA9IFwiI25leHRNb250aEJ0bkZpbHRlclwiO1xyXG5cclxuICAgICAgICB0aGlzLl90cmFuc2xhdGlvblNlcnZpY2UgPSBuZXcgU2FvcFRyYW5zbGF0aW9uU2VydmljZSgpO1xyXG5cclxuICAgICAgICB0aGlzLl9zYW9wUG9wb3ZlciA9IG5ldyBTYW9wUG9wb3ZlcigpO1xyXG4gICAgICAgIHRoaXMuX3Nhb3BQb3BvdmVyLmFmdGVyUG9wb3ZlclNob3cgPSB0aGlzLmFmdGVyUG9wb3ZlclNob3cuYmluZCh0aGlzKTsgXHJcbiAgICB9IFxyXG5cclxuICAgIHByaXZhdGUgYWZ0ZXJQb3BvdmVyU2hvdygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlbGVjdE1vbnRoWWVhci5hZnRlclBvcG92ZXJTaG93XCIpO1xyXG5cclxuICAgICAgICBsZXQgb2Jkb2JqZURhdGEgPSB0aGlzLmdldE9iZG9iamVEYXRhQXR0cmlidXRlcyh0aGlzLl9vYmRvYmplSWQpO1xyXG5cclxuICAgICAgICAvLyBvc3ZlemltbyB2cmVkbm9zdGkgZmlsdHJvdiBpeiBkYXRhIGF0dHJpYnV0ZXNcclxuICAgICAgICB0aGlzLnNldE9iZG9iamVGaWx0ZXJWYWx1ZXMob2Jkb2JqZURhdGEpO1xyXG5cclxuICAgICAgICAvLyBwcmlrYXppIG9rbm9cclxuICAgICAgICB2YXIgZmlsdGVyQm9keSA9ICQoXCJkaXYucG9wb3Zlci5zaG93XCIpLmZpbmQodGhpcy5fcG9wT3Zlck9iZG9iamVCb2R5SWQpO1xyXG4gICAgICAgIGZpbHRlckJvZHkuc2hvdygpO1xyXG5cclxuICAgICAgICAvLyBiaW5kIHBvcHVwIGV2ZW50c1xyXG4gICAgICAgIHRoaXMuYmluZFBvcHVwRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRPYmRvYmplRGF0YUF0dHJpYnV0ZXMoaWQ6IHN0cmluZyk6IE9iZG9iamVmaWx0ZXJWYWx1ZXMge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0TW9udGhZZWFyLmdldE9iZG9iamVEYXRhQXR0cmlidXRlc1wiKTtcclxuXHJcbiAgICAgICAgbGV0IG9iZG9iamVFbGVtZW50ID0gJCh0aGlzLl9vYmRvYmplSWQpO1xyXG5cclxuICAgICAgICBsZXQgZGF0YUF0dHJpYnV0ZXMgPSBuZXcgT2Jkb2JqZWZpbHRlclZhbHVlcygpO1xyXG4gICAgICAgIGRhdGFBdHRyaWJ1dGVzLmxldG8gPSBwYXJzZUludChvYmRvYmplRWxlbWVudC5hdHRyKFwiZGF0YS1sZXRvXCIpKTtcclxuICAgICAgICBkYXRhQXR0cmlidXRlcy5tZXNlYyA9IHBhcnNlSW50KG9iZG9iamVFbGVtZW50LmF0dHIoXCJkYXRhLW1lc2VjXCIpKTtcclxuICAgICAgICBkYXRhQXR0cmlidXRlcy5tZXNlY05heml2ID0gb2Jkb2JqZUVsZW1lbnQuYXR0cihcImRhdGEtbWVzZWMtbmF6aXZcIik7XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhQXR0cmlidXRlcztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldE9iZG9iamVGaWx0ZXJWYWx1ZXMoZmlsdGVyVmFsdWVzOiBPYmRvYmplZmlsdGVyVmFsdWVzKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZWxlY3RNb250aFllYXIuc2V0T2Jkb2JqZUZpbHRlclZhbHVlc1wiKTtcclxuXHJcbiAgICAgICAgbGV0IG9sZGZpbHRlclZhbHVlcyA9IHRoaXMuZ2V0T2Jkb2JqZWZpbHRlclZhbHVlcygpO1xyXG5cclxuICAgICAgICAvLyBsZXRvXHJcbiAgICAgICAgaWYgKG9sZGZpbHRlclZhbHVlcy5sZXRvICE9IGZpbHRlclZhbHVlcy5sZXRvKSB7XHJcbiAgICAgICAgICAgIGxldCBsZXRvRWxlbWVudCA9ICQoXCJkaXYucG9wb3Zlci5zaG93XCIpLmZpbmQodGhpcy5fb2Jkb2JqZUZpbHRlckxldG9JZCk7XHJcbiAgICAgICAgICAgIGlmIChsZXRvRWxlbWVudC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGxldG9FbGVtZW50LnZhbChmaWx0ZXJWYWx1ZXMubGV0byk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIG1lc2VjXHJcbiAgICAgICAgaWYgKG9sZGZpbHRlclZhbHVlcy5tZXNlYyAhPSBmaWx0ZXJWYWx1ZXMubWVzZWMpIHtcclxuICAgICAgICAgICAgbGV0IG1lc2VjRWxlbWVudCA9ICQoXCJkaXYucG9wb3Zlci5zaG93XCIpLmZpbmQodGhpcy5fb2Jkb2JqZUZpbHRlck1lc2VjSWQpO1xyXG4gICAgICAgICAgICBpZiAobWVzZWNFbGVtZW50Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgbWVzZWNFbGVtZW50LnZhbChmaWx0ZXJWYWx1ZXMubWVzZWMudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRPYmRvYmplZmlsdGVyVmFsdWVzKCk6IE9iZG9iamVmaWx0ZXJWYWx1ZXMge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0TW9udGhZZWFyLmdldE9iZG9iamVmaWx0ZXJWYWx1ZXNcIik7XHJcblxyXG4gICAgICAgIGxldCBmaWx0ZXJWYWx1ZXMgPSBuZXcgT2Jkb2JqZWZpbHRlclZhbHVlcygpO1xyXG4gICAgICAgIGZpbHRlclZhbHVlcy5sZXRvID0gbnVsbDtcclxuICAgICAgICBmaWx0ZXJWYWx1ZXMubWVzZWMgPSBudWxsO1xyXG4gICAgICAgIGZpbHRlclZhbHVlcy5tZXNlY05heml2ID0gXCJcIjtcclxuXHJcbiAgICAgICAgLy8gZG9sb2NpbW8gbGV0b1xyXG4gICAgICAgIGxldCBsZXRvRWxlbWVudCA9ICQoXCJkaXYucG9wb3Zlci5zaG93XCIpLmZpbmQodGhpcy5fb2Jkb2JqZUZpbHRlckxldG9JZCk7XHJcbiAgICAgICAgaWYgKGxldG9FbGVtZW50Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICBsZXQgbGV0b1N0ciA9IFN0cmluZyhsZXRvRWxlbWVudC52YWwoKSk7XHJcbiAgICAgICAgICAgIGlmIChsZXRvU3RyLmxlbmd0aCA9PSA0IHx8IGxldG9TdHIubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgIGlmIChsZXRvU3RyLmxlbmd0aCA9PSA0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyVmFsdWVzLmxldG8gPSArbGV0b1N0cjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gZG9sb2NpbW8gbWVzZWNcclxuICAgICAgICBsZXQgbWVzZWNFbGVtZW50ID0gJChcImRpdi5wb3BvdmVyLnNob3dcIikuZmluZCh0aGlzLl9vYmRvYmplRmlsdGVyTWVzZWNJZCk7XHJcbiAgICAgICAgaWYgKG1lc2VjRWxlbWVudC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgbGV0IHNlbE1lc2VjTmF6aXYgPSAkKG1lc2VjRWxlbWVudCkuZmluZChcIjpzZWxlY3RlZFwiKS50ZXh0KCk7XHJcbiAgICAgICAgICAgIGxldCBzZWxNZXNlYyA9ICQobWVzZWNFbGVtZW50KS5maW5kKFwiOnNlbGVjdGVkXCIpLnZhbCgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFpc05hTigrc2VsTWVzZWMpKSB7XHJcbiAgICAgICAgICAgICAgICBmaWx0ZXJWYWx1ZXMubWVzZWMgPSArc2VsTWVzZWNcclxuICAgICAgICAgICAgICAgIGZpbHRlclZhbHVlcy5tZXNlY05heml2ID0gc2VsTWVzZWNOYXppdlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmlsdGVyVmFsdWVzO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYmluZFBvcHVwRXZlbnRzKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0TW9udGhZZWFyLmJpbmRQb3B1cEV2ZW50c1wiKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgJChcImRpdi5wb3BvdmVyLnNob3cgXCIgKyB0aGlzLl9wb3BPdmVyT2Jkb2JqZUJvZHlJZCArIFwiIFwiICsgdGhpcy5fb2Jkb2JqZUN1cnJlbnRCdG5JZCkub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgJChcImRpdi5wb3BvdmVyLnNob3cgXCIgKyB0aGlzLl9wb3BPdmVyT2Jkb2JqZUJvZHlJZCArIFwiIFwiICsgdGhpcy5fb2Jkb2JqZUN1cnJlbnRCdG5JZCkub24oJ2NsaWNrJywgZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgX3RoaXMub2Jkb2JqZUN1cnJlbnRDbGljaygpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkKFwiZGl2LnBvcG92ZXIuc2hvdyBcIiArIHRoaXMuX3BvcE92ZXJPYmRvYmplQm9keUlkICsgXCIgXCIgKyB0aGlzLl9wcmV2aW91c01vbnRoQnRuSWQpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICQoXCJkaXYucG9wb3Zlci5zaG93IFwiICsgdGhpcy5fcG9wT3Zlck9iZG9iamVCb2R5SWQgKyBcIiBcIiArIHRoaXMuX3ByZXZpb3VzTW9udGhCdG5JZCkub24oJ2NsaWNrJywgZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgX3RoaXMub2Jkb2JqZWZpbHRlcnNNb250aFN0ZXBDaGFuZ2UoLTEpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkKFwiZGl2LnBvcG92ZXIuc2hvdyBcIiArIHRoaXMuX3BvcE92ZXJPYmRvYmplQm9keUlkICsgXCIgXCIgKyB0aGlzLl9uZXh0TW9udGhCdG5JZCkub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgJChcImRpdi5wb3BvdmVyLnNob3cgXCIgKyB0aGlzLl9wb3BPdmVyT2Jkb2JqZUJvZHlJZCArIFwiIFwiICsgdGhpcy5fbmV4dE1vbnRoQnRuSWQpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIF90aGlzLm9iZG9iamVmaWx0ZXJzTW9udGhTdGVwQ2hhbmdlKDEpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkKFwiZGl2LnBvcG92ZXIuc2hvdyBcIiArIHRoaXMuX3BvcE92ZXJPYmRvYmplQm9keUlkICsgXCIgXCIgKyB0aGlzLl9vYmRvYmplRmlsdGVyTWVzZWNJZCkub2ZmKFwiY2hhbmdlXCIpO1xyXG4gICAgICAgICQoXCJkaXYucG9wb3Zlci5zaG93IFwiICsgdGhpcy5fcG9wT3Zlck9iZG9iamVCb2R5SWQgKyBcIiBcIiArIHRoaXMuX29iZG9iamVGaWx0ZXJNZXNlY0lkKS5vbignY2hhbmdlJywgZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgX3RoaXMub2Jkb2JqZWZpbHRlcnNDaGFuZ2VkKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQoXCJkaXYucG9wb3Zlci5zaG93IFwiICsgdGhpcy5fcG9wT3Zlck9iZG9iamVCb2R5SWQgKyBcIiBcIiArIHRoaXMuX29iZG9iamVGaWx0ZXJMZXRvSWQpLm9mZihcImNoYW5nZVwiKTtcclxuICAgICAgICAkKFwiZGl2LnBvcG92ZXIuc2hvdyBcIiArIHRoaXMuX3BvcE92ZXJPYmRvYmplQm9keUlkICsgXCIgXCIgKyB0aGlzLl9vYmRvYmplRmlsdGVyTGV0b0lkKS5vbignY2hhbmdlJywgZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgX3RoaXMub2Jkb2JqZWZpbHRlcnNDaGFuZ2VkKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQoXCJkaXYucG9wb3Zlci5zaG93IFwiICsgdGhpcy5fcG9wT3Zlck9iZG9iamVCb2R5SWQgKyBcIiBcIiArIHRoaXMuX29iZG9iamVGaWx0ZXJMZXRvSWQpLm9mZihcImtleXVwXCIpO1xyXG4gICAgICAgICQoXCJkaXYucG9wb3Zlci5zaG93IFwiICsgdGhpcy5fcG9wT3Zlck9iZG9iamVCb2R5SWQgKyBcIiBcIiArIHRoaXMuX29iZG9iamVGaWx0ZXJMZXRvSWQpLm9uKCdrZXl1cCcsIGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIF90aGlzLm9iZG9iamVmaWx0ZXJzQ2hhbmdlZCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0KCl7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZWxlY3RNb250aFllYXIuaW5pdFwiKTtcclxuXHJcbiAgICAgICAgLy8gcG9pc2NlbW8gcHJldm9kZVxyXG4gICAgICAgIHRoaXMuc2V0VGVybWlub2xvZ3lMaXN0KCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3Nhb3BQb3BvdmVyLmJpbmRQb3BvdmVyRXZlbnRzKCk7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0T2Jkb2JqZVRleHQodGhpcy5fb2Jkb2JqZUlkKVxyXG5cclxuXHJcbiAgICAgICAgLy8gYmluZCBldmVudHNcclxuICAgICAgICB0aGlzLmJpbmRFdmVudHMoKTtcclxuXHJcbiAgICAgICAgdGhpcy5hZnRlckluaXRpYWxpemVkQ29udHJvbCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldFRlcm1pbm9sb2d5TGlzdCgpOiB2b2lkIHtcclxuICAgICAgICBsZXQgX3Rlcm1pbm9sb2d5OiBzdHJpbmdbXSA9IFsnScWhxI1pJ107XHJcbiAgICAgICAgdGhpcy5fdHJhbnNsYXRpb25TZXJ2aWNlLnNldFRyYW5zbGF0aW9uc0xpc3QoX3Rlcm1pbm9sb2d5KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldE9iZG9iamVUZXh0KGlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlbGVjdE1vbnRoWWVhci5zZXRPYmRvYmplVGV4dFwiKTtcclxuXHJcbiAgICAgICAgbGV0IG9iZG9iamVFbGVtZW50ID0gJCh0aGlzLl9vYmRvYmplSWQpO1xyXG5cclxuICAgICAgICBsZXQgbWVzZWNOYXppdiA9IG9iZG9iamVFbGVtZW50LmF0dHIoXCJkYXRhLW1lc2VjLW5heml2XCIpO1xyXG4gICAgICAgIGxldCBsZXRvID0gb2Jkb2JqZUVsZW1lbnQuYXR0cihcImRhdGEtbGV0b1wiKTtcclxuXHJcbiAgICAgICAgb2Jkb2JqZUVsZW1lbnQudmFsKG1lc2VjTmF6aXYgKyBcIiBcIiArIGxldG8pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYmluZEV2ZW50cygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlbGVjdE1vbnRoWWVhci5iaW5kRXZlbnRzXCIpO1xyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICAkKHRoaXMuX3ZpZXdJZCArIFwiIFwiICsgdGhpcy5fY29udHJvbElkICsgXCIgXCIgKyB0aGlzLl9vYmRvYmplSWQpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICQodGhpcy5fdmlld0lkICsgXCIgXCIgKyB0aGlzLl9jb250cm9sSWQgKyBcIiBcIiArIHRoaXMuX29iZG9iamVJZCkub24oJ2NsaWNrJywgZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgX3RoaXMub2Jkb2JqZUNsaWNrKCk7XHJcbiAgICAgICAgfSk7IFxyXG5cclxuICAgICAgICAkKHRoaXMuX3ZpZXdJZCArIFwiIFwiICsgdGhpcy5fY29udHJvbElkICsgXCIgXCIgKyB0aGlzLl9vYmRvYmplQ3VycmVudEJ0bklkKS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAkKHRoaXMuX3ZpZXdJZCArIFwiIFwiICsgdGhpcy5fY29udHJvbElkICsgXCIgXCIgKyB0aGlzLl9vYmRvYmplQ3VycmVudEJ0bklkKS5vbignY2xpY2snLCBmdW5jdGlvbiAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICBfdGhpcy5vYmRvYmplQ3VycmVudENsaWNrKCk7XHJcbiAgICAgICAgfSk7IFxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb2Jkb2JqZUNsaWNrKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0TW9udGhZZWFyLm9iZG9iamVDbGlja1wiKTtcclxuICAgICAgICAkKHRoaXMuX2NhbGVuZGFySWNvbklkKS50cmlnZ2VyKFwiY2xpY2tcIik7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgb2Jkb2JqZUN1cnJlbnRDbGljaygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlbGVjdE1vbnRoWWVhci5vYmRvYmplQ3VycmVudENsaWNrXCIpO1xyXG5cclxuICAgICAgICBsZXQgY3VycmVudE1vbnRoRmlsdGVyVmFsdWVzID0gbmV3IE9iZG9iamVmaWx0ZXJWYWx1ZXMoKTtcclxuXHJcbiAgICAgICAgY3VycmVudE1vbnRoRmlsdGVyVmFsdWVzLmxldG8gPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7XHJcbiAgICAgICAgY3VycmVudE1vbnRoRmlsdGVyVmFsdWVzLm1lc2VjID0gbmV3IERhdGUoKS5nZXRNb250aCgpICsgMTtcclxuICAgICAgICBjdXJyZW50TW9udGhGaWx0ZXJWYWx1ZXMubWVzZWNOYXppdiA9IHRoaXMuZ2V0TW9udGhOYW1lKGN1cnJlbnRNb250aEZpbHRlclZhbHVlcy5tZXNlYyk7XHJcblxyXG4gICAgICAgIC8vIHphcGlzZW1vIHZyZWRub3N0IHYgZmlsdGVyIGxldG9cclxuICAgICAgICB0aGlzLnNldE9iZG9iamVGaWx0ZXJWYWx1ZXMoY3VycmVudE1vbnRoRmlsdGVyVmFsdWVzKTtcclxuXHJcbiAgICAgICAgLy8gb3N2ZXppbW8gb2Jkb2JqZSBlbGVtZW50IHogbm92aW1pIHBvZGF0a2lcclxuICAgICAgICB0aGlzLnNldE9iZG9iamVEYXRhQXR0cmlidXRlcyh0aGlzLl9vYmRvYmplSWQsIGN1cnJlbnRNb250aEZpbHRlclZhbHVlcyk7XHJcblxyXG4gICAgICAgIHRoaXMubW9udGhZZWFyVmFsdWVzQ2hhbmdlZChjdXJyZW50TW9udGhGaWx0ZXJWYWx1ZXMubGV0bywgY3VycmVudE1vbnRoRmlsdGVyVmFsdWVzLm1lc2VjKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldE1vbnRoTmFtZShtb250aDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlbGVjdE1vbnRoWWVhci5nZXRNb250aE5hbWVcIik7XHJcblxyXG4gICAgICAgIGxldCBtZXNlY0VsZW1lbnQgPSAkKFwiZGl2LnBvcG92ZXIuc2hvd1wiKS5maW5kKHRoaXMuX29iZG9iamVGaWx0ZXJNZXNlY0lkKTtcclxuICAgICAgICBpZiAobWVzZWNFbGVtZW50Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gJChtZXNlY0VsZW1lbnQpLmZpbmQoXCIgb3B0aW9uW3ZhbHVlID0gJ1wiICsgbW9udGggKyBcIiddXCIpLnRleHQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0T2Jkb2JqZURhdGFBdHRyaWJ1dGVzKGlkOiBzdHJpbmcsIHZhbHVlczogT2Jkb2JqZWZpbHRlclZhbHVlcyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0TW9udGhZZWFyLnNldE9iZG9iamVEYXRhQXR0cmlidXRlc1wiKTtcclxuXHJcbiAgICAgICAgbGV0IG9iZG9iamVFbGVtZW50ID0gJChpZCk7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZXMubGV0byAhPSBudWxsICYmIHZhbHVlcy5tZXNlYyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9iZG9iamVFbGVtZW50LmF0dHIoXCJkYXRhLWxldG9cIiwgdmFsdWVzLmxldG8pO1xyXG4gICAgICAgICAgICBvYmRvYmplRWxlbWVudC5hdHRyKFwiZGF0YS1tZXNlY1wiLCB2YWx1ZXMubWVzZWMpO1xyXG4gICAgICAgICAgICBvYmRvYmplRWxlbWVudC5hdHRyKFwiZGF0YS1tZXNlYy1uYXppdlwiLCB2YWx1ZXMubWVzZWNOYXppdik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNldE9iZG9iamVUZXh0KHRoaXMuX29iZG9iamVJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIG5hIHBvcG92ZXIgZmlsdHJ1IHphIG9iZG9iamUgcG9taWsgemEgZW4gbWVzZWMgbmFwcmVqLCBuYXphalxyXG4gICAgcHJpdmF0ZSBvYmRvYmplZmlsdGVyc01vbnRoU3RlcENoYW5nZShzdGVwOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fcmVmcmVzaGluZ1JlY29yZHNJblByb2dyZXNzID09IHRydWUpIHtcclxuICAgICAgICAgICAgLy8gcG90ZWthIHBvc3RvcGVrIG9zdmV6ZXZhbmphIHBvZGF0a292LCBub3ZpIHphaHRldmVrIG5pIGRvdm9samVuIFxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlbGVjdE1vbnRoWWVhci5vYmRvYmplZmlsdGVyc01vbnRoU3RlcENoYW5nZVwiKTtcclxuXHJcbiAgICAgICAgLy8gcHJlYmVyZW1vIHZyZWRub3N0aSBsZXRvIGluIG1lc2VjXHJcbiAgICAgICAgbGV0IGZpbHRlclZhbHVlcyA9IHRoaXMuZ2V0T2Jkb2JqZWZpbHRlclZhbHVlcygpO1xyXG5cclxuICAgICAgICBsZXQgbmV3RmlsdGVyVmFsdWVzID0gbmV3IE9iZG9iamVmaWx0ZXJWYWx1ZXMoKTtcclxuICAgICAgICBuZXdGaWx0ZXJWYWx1ZXMubWVzZWMgPSBmaWx0ZXJWYWx1ZXMubWVzZWMgKyBzdGVwO1xyXG4gICAgICAgIG5ld0ZpbHRlclZhbHVlcy5sZXRvID0gZmlsdGVyVmFsdWVzLmxldG87XHJcbiAgICAgICAgaWYgKG5ld0ZpbHRlclZhbHVlcy5tZXNlYyA9PSAxMykge1xyXG4gICAgICAgICAgICAvLyB6YSBkZWNlbWJlciBqZSBqYW51YXJcclxuICAgICAgICAgICAgbmV3RmlsdGVyVmFsdWVzLm1lc2VjID0gMTtcclxuICAgICAgICAgICAgbmV3RmlsdGVyVmFsdWVzLmxldG8gPSBuZXdGaWx0ZXJWYWx1ZXMubGV0byArIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKG5ld0ZpbHRlclZhbHVlcy5tZXNlYyA9PSAwKSB7XHJcbiAgICAgICAgICAgIC8vIHByZWQgamFudWFyamVtIGplIGRlY2VtYmVyXHJcbiAgICAgICAgICAgIG5ld0ZpbHRlclZhbHVlcy5tZXNlYyA9IDEyO1xyXG4gICAgICAgICAgICBuZXdGaWx0ZXJWYWx1ZXMubGV0byA9IG5ld0ZpbHRlclZhbHVlcy5sZXRvIC0gMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHBvaXNjZW1vIHNlIG5heml2IG1lc2VjYVxyXG4gICAgICAgIG5ld0ZpbHRlclZhbHVlcy5tZXNlY05heml2ID0gdGhpcy5nZXRNb250aE5hbWUobmV3RmlsdGVyVmFsdWVzLm1lc2VjKTtcclxuXHJcbiAgICAgICAgLy8gemFwaXNlbW8gbm92byB2cmVkbm9zdCB2IGZpbHRlciBsZXRvXHJcbiAgICAgICAgdGhpcy5zZXRPYmRvYmplRmlsdGVyVmFsdWVzKG5ld0ZpbHRlclZhbHVlcyk7XHJcblxyXG4gICAgICAgIC8vIG9zdmV6aW1vIG9iZG9iamUgZWxlbWVudCB6IG5vdmltaSBwb2RhdGtpXHJcbiAgICAgICAgdGhpcy5zZXRPYmRvYmplRGF0YUF0dHJpYnV0ZXModGhpcy5fb2Jkb2JqZUlkLCBuZXdGaWx0ZXJWYWx1ZXMpO1xyXG5cclxuICAgICAgICB0aGlzLm1vbnRoWWVhclZhbHVlc0NoYW5nZWQobmV3RmlsdGVyVmFsdWVzLmxldG8sIG5ld0ZpbHRlclZhbHVlcy5tZXNlYyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdnJlZG5vc3RpIHYgZmlsdHJ1IGxldG8sIG1lc2VjIHNvIHNlIHNwcmVtZW5pbGVcclxuICAgIHByaXZhdGUgb2Jkb2JqZWZpbHRlcnNDaGFuZ2VkKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0TW9udGhZZWFyLm9iZG9iamVmaWx0ZXJzQ2hhbmdlZFwiKTtcclxuXHJcbiAgICAgICAgLy8gcHJlYmVyZW1vIHZyZWRub3N0aSBsZXRvIGluIG1lc2VjXHJcbiAgICAgICAgbGV0IGZpbHRlclZhbHVlcyA9IHRoaXMuZ2V0T2Jkb2JqZWZpbHRlclZhbHVlcygpO1xyXG5cclxuICAgICAgICAvLyBvc3ZlemltbyBvYmRvYmplIGVsZW1lbnQgeiBub3ZpbWkgcG9kYXRraVxyXG4gICAgICAgIHRoaXMuc2V0T2Jkb2JqZURhdGFBdHRyaWJ1dGVzKHRoaXMuX29iZG9iamVJZCwgZmlsdGVyVmFsdWVzKTtcclxuXHJcbiAgICAgICAgdGhpcy5tb250aFllYXJWYWx1ZXNDaGFuZ2VkKGZpbHRlclZhbHVlcy5sZXRvLCBmaWx0ZXJWYWx1ZXMubWVzZWMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbW9udGhZZWFyVmFsdWVzQ2hhbmdlZChsZXRvOiBudW1iZXIsIG1lc2VjOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fcmVmcmVzaGluZ1JlY29yZHNJblByb2dyZXNzID09IHRydWUpIHtcclxuICAgICAgICAgICAgLy8gcG90ZWthIHBvc3RvcGVrIG9zdmV6ZXZhbmphIHBvZGF0a292LCBub3ZpIHphaHRldmVrIG5pIGRvdm9samVuIFxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaXNVbkRlZmluZWQobGV0bykgfHwgaXNVbkRlZmluZWQobGV0bykpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZWxlY3RNb250aFllYXIubW9udGhZZWFyVmFsdWVzQ2hhbmdlZFwiKTtcclxuXHJcbiAgICAgICAgLy8gZGlzYWJsZSBrb250cm9sZSwga2VyIHNlIGl6dmFqYSByZWZyZXNoXHJcbiAgICAgICAgdGhpcy5lbmFibGVEaXNhYmxlT2Jkb2JqZUZpbHRlcnModHJ1ZSk7XHJcblxyXG4gICAgICAgIHRoaXMuYWZ0ZXJNb250aFllYXJWYWx1ZXNDaGFuZ2VkKGxldG8sIG1lc2VjKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGVuYWJsZURpc2FibGVPYmRvYmplRmlsdGVycyhkaXNhYmxlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzQW5hbHlzaXNWaWV3LmVuYWJsZURpc2FibGVPYmRvYmplRmlsdGVyc1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcmVmcmVzaGluZ1JlY29yZHNJblByb2dyZXNzID0gZGlzYWJsZTtcclxuXHJcbiAgICAgICAgLy8gbGV0b1xyXG4gICAgICAgIGxldCBsZXRvRWxlbWVudCA9ICQoXCJkaXYucG9wb3Zlci5zaG93XCIpLmZpbmQodGhpcy5fb2Jkb2JqZUZpbHRlckxldG9JZCk7XHJcbiAgICAgICAgaWYgKGxldG9FbGVtZW50Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICBsZXRvRWxlbWVudC5wcm9wKFwiZGlzYWJsZWRcIiwgZGlzYWJsZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBtZXNlY1xyXG4gICAgICAgIGxldCBtZXNlY0VsZW1lbnQgPSAkKFwiZGl2LnBvcG92ZXIuc2hvd1wiKS5maW5kKHRoaXMuX29iZG9iamVGaWx0ZXJNZXNlY0lkKTtcclxuICAgICAgICBpZiAobWVzZWNFbGVtZW50Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICBtZXNlY0VsZW1lbnQucHJvcChcImRpc2FibGVkXCIsIGRpc2FibGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gZ3VtYiB0cmVudXRuaVxyXG4gICAgICAgIGxldCBfb2Jkb2JqZUN1cnJlbnRCdG5FbGVtZW50ID0gJChcImRpdi5wb3BvdmVyLnNob3dcIikuZmluZCh0aGlzLl9vYmRvYmplQ3VycmVudEJ0bklkKTtcclxuICAgICAgICBpZiAoX29iZG9iamVDdXJyZW50QnRuRWxlbWVudC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgX29iZG9iamVDdXJyZW50QnRuRWxlbWVudC5wcm9wKFwiZGlzYWJsZWRcIiwgZGlzYWJsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgICAvLyB6YSBleHRlcm5pIGJpbmQgZXZlbnRcclxuICAgIHB1YmxpYyBhZnRlckluaXRpYWxpemVkQ29udHJvbChlbGVtZW50OiBhbnkpOiB2b2lke1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0TW9udGhZZWFyLmFmdGVySW5pdGlhbGl6ZWRDb250cm9sXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRTZWxlY3RlZE1vbnRoWWVhcigpOiBPYmRvYmplZmlsdGVyVmFsdWVzIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlbGVjdE1vbnRoWWVhci5nZXRTZWxlY3RlZE1vbnRoWWVhclwiKTtcclxuXHJcbiAgICAgICAgLy8gcHJlYmVyZW1vIHZyZWRub3N0aSBsZXRvIGluIG1lc2VjXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2Jkb2JqZURhdGFBdHRyaWJ1dGVzKHRoaXMuX29iZG9iamVJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gemEgZXh0ZXJuaSBiaW5kIGV2ZW50XHJcbiAgICBwdWJsaWMgYWZ0ZXJNb250aFllYXJWYWx1ZXNDaGFuZ2VkKGxldG86IG51bWJlciwgbWVzZWM6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0TW9udGhZZWFyLmFmdGVyTW9udGhZZWFyVmFsdWVzQ2hhbmdlZFwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB6YSBleHRlcm5pIHVwb3JhYm9cclxuICAgIHB1YmxpYyBzZXRSZWZyZXNoaW5nUmVjb3Jkc0NvbXBsZXRlKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0TW9udGhZZWFyLnNldFJlZnJlc2hpbmdSZWNvcmRzQ29tcGxldGVcIik7XHJcblxyXG4gICAgICAgIC8vIGVuYWJsZSBrb250cm9sZSwga2VyIHNlIGplIHJlZnJlc2gga29uY2FsXHJcbiAgICAgICAgdGhpcy5lbmFibGVEaXNhYmxlT2Jkb2JqZUZpbHRlcnMoZmFsc2UpO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v1xyXG5leHBvcnQgaW50ZXJmYWNlIFNhb3BJbnB1dFdGTFByb3BlcnRpZXMge1xyXG4gICAgaWQ6c3RyaW5nO1xyXG4gICAgcGxhY2Vob2xkZXI6c3RyaW5nO1xyXG4gICAgY2FwdGlvbjpzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wc2VsZWN0V0ZMIHtcclxuICAgIHByaXZhdGUgX2lucHV0VGVtcGxhdGU6c3RyaW5nO1xyXG4gICAgY29uc3RydWN0b3IocHJvcGVydGllczpTYW9wSW5wdXRXRkxQcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgdGhpcy5faW5wdXRUZW1wbGF0ZSA9IFxyXG4gICAgICAgIGBcclxuICAgICAgICA8c3BhbiBjbGFzcz1cImhhcy1mbG9hdC1sYWJlbCBzYW9wLWRyb3Bkb3duIHNlbGVjdEVsZW1lbnRcIj5cclxuICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbCBzaGFkb3ctbm9uZSBzYW9wLWNvbnRyb2wgc2FvcC1jaGlsZC1zZWxlY3RcIiBkYXRhLWNob3Nlbj1cIlRcIiBpZD1cIiR7cHJvcGVydGllcy5pZH1cIiBuYW1lPVwiJHtwcm9wZXJ0aWVzLmlkfVwiIHRhYmluZGV4PVwiMFwiIHN0eWxlPVwiaGVpZ2h0OiAzMHB4O3BhZGRpbmc6IDAuMDc1cmVtIDAuNzVyZW07XCI+XHJcbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCIvPlxyXG4gICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic2FvcC1mbG9hdGluZy1sYWJlbFwiIGZvcj1cIiR7cHJvcGVydGllcy5pZH1cIj4ke3Byb3BlcnRpZXMuY2FwdGlvbn08L2xhYmVsPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cInNlbGVjdC1kcm9wZG93biBzYW9wLWltZy1kb3duIHNpLXNcIi8+XHJcbiAgICAgICAgPC9zcGFuPiAgICAgXHJcbiAgICAgICAgYDsgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIGdldEVsZW1lbnQoKTpKUXVlcnk8SFRNTEVsZW1lbnQ+e1xyXG4gICAgICAgIGxldCBfZWxlbWVudCA9ICQodGhpcy5faW5wdXRUZW1wbGF0ZSk7XHJcbiAgICAgICAgcmV0dXJuIF9lbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGdldElubmVySHRtbCgpOnN0cmluZ3tcclxuICAgICAgICByZXR1cm4gdGhpcy5faW5wdXRUZW1wbGF0ZTtcclxuICAgIH1cclxuXHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu78vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL3Nhb3AtY29yZS9zYW9wU2VsZWN0aXplU2VsZWN0LmQudHNcIiAvPlxyXG5cclxuaW1wb3J0IHsgZ2xvYmFsLCBnZXRSZWxhdGl2ZVNpdGVVUkwsIGdldFNpdGVBYnNvbHV0ZVVSTCwgaXNFbXB0eSwgaXNVbkRlZmluZWQgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFNlbGVjdGl6ZVNlbGVjdFRvb2xUaXAge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZWxlY3RpemVTZWxlY3RUb29sVGlwLmNvbnN0cnVjdG9yXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBJbml0VG9vbHR5cGUoc2VsZWN0b3JOYW1lOiBzdHJpbmcgPSBcIltkYXRhLXNlbGVjdGFibGVdXCIpOiB2b2lkIHtcclxuICAgICAgICAkKGRvY3VtZW50KS5vZmYoXCJtb3VzZWVudGVyXCIsIHNlbGVjdG9yTmFtZSwgKGUpID0+IHRoaXMuU2V0VG9vbHR5cGUoZSkpO1xyXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKFwibW91c2VlbnRlclwiLCBzZWxlY3Rvck5hbWUsIChlKSA9PiB0aGlzLlNldFRvb2x0eXBlKGUpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgU2V0VG9vbHR5cGUoZTogYW55KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9ICQoZS5jdXJyZW50VGFyZ2V0KTtcclxuICAgICAgICBlbGVtZW50LnRvb2x0aXAoe1xyXG4gICAgICAgICAgICBwbGFjZW1lbnQ6ICd0b3AnLFxyXG4gICAgICAgICAgICB0aXRsZTogZWxlbWVudC5maW5kKCdzcGFuJykudGV4dCgpLnRyaW0oKSxcclxuICAgICAgICB9KS50b29sdGlwKCdzaG93Jyk7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu78vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL3Nhb3AtY29yZS9zYW9wU2VsZWN0aXplU2VsZWN0LmQudHNcIiAvPlxyXG5cclxuaW1wb3J0IHsgZ2xvYmFsLCBnZXRSZWxhdGl2ZVNpdGVVUkwsIGdldFNpdGVBYnNvbHV0ZVVSTCwgaXNFbXB0eSwgaXNVbkRlZmluZWQgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFNlbGVjdGl6ZVNlbGVjdFdyYXBlciB7XHJcbiAgICBwcml2YXRlIF92aWV3SWQgOiBzdHJpbmc7ICAgIFxyXG4gICAgcHJpdmF0ZSBfbGliTmFtZSA6IHN0cmluZztcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih2aWV3SWQ6IHN0cmluZyA9IFwiXCIsbGliTmFtZTogc3RyaW5nID0gXCJcIikge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0aXplU2VsZWN0V3JhcGVyLmNvbnN0cnVjdG9yXCIpO1xyXG4gICAgICAgIHRoaXMuX3ZpZXdJZCA9IHZpZXdJZDtcclxuICAgICAgICB0aGlzLl9saWJOYW1lID0gbGliTmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaW5pdEFsbChjbGFzc05hbWU6c3RyaW5nID0gXCIuc2VsZWN0aXplU2VsZWN0XCIpOnZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0aXplU2VsZWN0V3JhcGVyLmluaXRBbGxcIik7XHJcbiAgICAgICAgdmFyIGFsbERpdnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihjbGFzc05hbWUpO1xyXG5cclxuICAgICAgICBhbGxEaXZzLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJlbGVtZW50LmluaXQuLi4uLi4uLi4uLi4uLi4uLi4uLi4uXCIgKyBlbGVtZW50LmlkKTtcclxuICAgICAgICAgICAgaWYgKGlzRW1wdHkoZWxlbWVudC5pZCkgPT0gZmFsc2Upe1xyXG4gICAgICAgICAgICAgICAgbGV0IF9lbGVtZW50SWQgPSBcIiNcIitlbGVtZW50LmlkO1xyXG4gICAgICAgICAgICAgICAgbGV0IF9zYW9wU2VsZWN0aXplU2VsZWN0ID0gbmV3IGljU2FvcENvcmUuU2FvcFNlbGVjdGl6ZVNlbGVjdEV4KHRoaXMuX3ZpZXdJZCxfZWxlbWVudElkLHRoaXMuX2xpYk5hbWUpO1xyXG4gICAgICAgICAgICAgICAgX3Nhb3BTZWxlY3RpemVTZWxlY3QuaW5pdENvbnRyb2xCeUh0bWwoZWxlbWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL1xyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9AdHlwZXMvYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyL2luZGV4LmQudHNcIiAvPlxyXG5pbXBvcnQgeyBjb252ZXJ0U3RyaW5nMkRhdGUsIGdsb2JhbCxpc0VtcHR5IH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BTaWZyYW50aSB7XHJcblxyXG4gICAgaW5pdCgpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNpZnJhbnRpLmluaXQuLi5cIik7XHJcbiAgICAgICAgdmFyIGlucHV0RGl2cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCdpbnB1dFtkYXRhLXNhb3BTaWZyYW50aS1pbnB1dG1hc2tdJyk7XHJcblxyXG4gICAgICAgIGlucHV0RGl2cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiZWxlbWVudC5pbml0Li4uLi4uLi4uLi4uLi4uLi4uLi4uLlwiICsgZWxlbWVudC5pZCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgICAgICBsZXQgZWxlbWVudEF0cnIgPSAkKGVsZW1lbnQpLmF0dHIoXCJkYXRhLXNhb3BTaWZyYW50aS1pbnB1dG1hc2tcIik7XHJcbiAgICAgICAgICAgIGlmIChpc0VtcHR5KGVsZW1lbnRBdHJyKSkge3JldHVybjt9O1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKGVsZW1lbnRBdHJyKTtcclxuICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgY29uc3QgYXJ0cnJBcnJheSA9IGVsZW1lbnRBdHJyLnNwbGl0KFwiI1wiKTtcclxuICAgICAgICAgICAgbGV0IF9pbnB1dFR5cGUgPSBhcnRyckFycmF5WzJdO1xyXG4gICAgICAgICAgICBsZXQgX21hc2tMZW5ndGggPSBwYXJzZUludChhcnRyckFycmF5WzNdKTtcclxuICAgICAgICAgICAgaWYgKF9tYXNrTGVuZ3RoLnRvU3RyaW5nKCkgIT0gYXJ0cnJBcnJheVszXSkge1xyXG4gICAgICAgICAgICAgICAgX21hc2tMZW5ndGggPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBfaW5wdXRMZWFkaW5nQ2hhciA9IGFydHJyQXJyYXlbNF07XHJcbiAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgIGlmIChfaW5wdXRUeXBlID09IFwiTlwiKSB7XHJcbiAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLmF0dHIoXCJ0eXBlXCIsXCJ0ZXh0XCIpO1xyXG4gICAgICAgICAgICAgICAgJChlbGVtZW50KS5vbigna2V5cHJlc3MnLCBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBhbGxvd2VkQ2hhcnMgPScxMjM0NTY3ODkwJztcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaHIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGV2ZW50LndoaWNoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dlZENoYXJzLmluZGV4T2YoY2hyKSA8IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pOyBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICBsZXQgX3JlYWRvbmx5QXRyciA9ICQoZWxlbWVudCkuYXR0cigncmVhZG9ubHknKTtcclxuICAgICAgICAgICAgbGV0IF9yZWFkb25seSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoaXNFbXB0eShfcmVhZG9ubHlBdHJyKSA9PSBmYWxzZSAmJiBfcmVhZG9ubHlBdHJyID09IFwicmVhZG9ubHlcIil7XHJcbiAgICAgICAgICAgICAgICBfcmVhZG9ubHkgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgIGxldCBfZGlzYWJsZWRBdHJyID0gJChlbGVtZW50KS5hdHRyKCdkaXNhYmxlZCcpO1xyXG4gICAgICAgICAgICBsZXQgX2Rpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmIChpc0VtcHR5KF9kaXNhYmxlZEF0cnIpID09IGZhbHNlICYmIF9kaXNhYmxlZEF0cnIgPT0gXCJkaXNhYmxlZFwiKXtcclxuICAgICAgICAgICAgICAgIF9kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH0gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgJChlbGVtZW50KS5vZmYoXCJmb2N1c291dFwiKTtcclxuICAgICAgICAgICAgaWYgKF9yZWFkb25seSA9PSBmYWxzZSAmJiBfbWFza0xlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICQoZWxlbWVudCkuYXR0cignbWF4bGVuZ3RoJyxfbWFza0xlbmd0aC50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgICQoZWxlbWVudCkub24oXCJmb2N1c291dFwiLCBmdW5jdGlvbiAoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb250cm9sVmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbFZhbHVlID0gX2lucHV0TGVhZGluZ0NoYXIucmVwZWF0KF9tYXNrTGVuZ3RoKStjb250cm9sVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbFZhbHVlID0gY29udHJvbFZhbHVlLnN1YnN0cmluZyhjb250cm9sVmFsdWUubGVuZ3RoIC0gX21hc2tMZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9IGNvbnRyb2xWYWx1ZTtcclxuICAgICAgICAgICAgICAgIH0pOyBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiaW5pdElucHV0cy4uLmRvbmVcIik7XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/aW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BUb2dnbGVQYW5lbCB7XHJcblxyXG4gICAgaW5pdCgpOnZvaWR7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUb2dnbGVQYW5lbC5pbml0Li4uXCIpO1xyXG4gICAgICAgIHRoaXMuc2V0Q2xpY2tFdmVudE9uRnJhbWUoXCJib2R5XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldENsaWNrRXZlbnRPbkZyYW1lKGZyYW1lTmFtZTpzdHJpbmcgPSBcImJvZHlcIik6dm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUb2dnbGVQYW5lbC5zZXRDbGlja0V2ZW50T25GcmFtZS4uLlwiKTtcclxuXHJcbiAgICAgICAgbGV0IF9mcmFtZSA9ICQoXCJcIitmcmFtZU5hbWUrXCIgKj4gLnNhb3AtdG9nZ2xlLXBhbmVsXCIpO1xyXG4gICAgICAgIF9mcmFtZS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICBfZnJhbWUuY2xpY2soZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAvL25hIGtsaWsgc2UgcHXFocSNaWNhIG9icm5lIGdvciAvIGRvbFxyXG4gICAgICAgICAgICB2YXIgYXJyb3dEaXYgPSAkKHRoaXMpLmZpbmQoXCIuc2FvcC10b2dnbGUtYXJyb3dcIik7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycm93RGl2Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXJyb3dEaXZbaV0uY2xhc3NMaXN0LmNvbnRhaW5zKFwic2FvcC1pbWctZG93blwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFycm93RGl2W2ldLmNsYXNzTGlzdC5yZW1vdmUoXCJzYW9wLWltZy1kb3duXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGFycm93RGl2W2ldLmNsYXNzTGlzdC5hZGQoXCJzYW9wLWltZy11cFwiKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyb3dEaXZbaV0uY2xhc3NMaXN0LnJlbW92ZShcInNhb3AtaW1nLXVwXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGFycm93RGl2W2ldLmNsYXNzTGlzdC5hZGQoXCJzYW9wLWltZy1kb3duXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwsIGdldFJlbGF0aXZlU2l0ZVVSTCwgZ2V0U2l0ZUFic29sdXRlVVJMLCBpc0VtcHR5LCBpc1VuRGVmaW5lZCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFNlcnZpY2VzQ29yZSB9IGZyb20gXCIuLi9Db3JlL3Nhb3Atc2VydmljZXMtY29yZVwiO1xyXG5pbXBvcnQgeyBTYW9wVmlld0Zvcm1CaW5kaW5ncyB9IGZyb20gXCIuLi9Db3JlL3Nhb3Atdmlldy1mb3JtLWJpbmRpbmdzXCI7XHJcbmltcG9ydCB7IFNhb3BXZlN1Ym1pdFJlc3VsdCB9IGZyb20gXCIuLi9Db3JlL3Nhb3Atdmlldy1mb3JtXCI7XHJcblxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wVXBsb2FkRmlsZXNQYXJhbXMge1xyXG4gICAgY29udHJvbGxlcjpzdHJpbmcsXHJcbiAgICBhY3Rpb246c3RyaW5nLFxyXG4gICAgdmFsaWRhdGVBamF4Pzpib29sZWFuLFxyXG4gICAgZm9ybUlkPzpzdHJpbmcsXHJcbiAgICB2YWxpZGF0aW9uRGl2SWQ/OnN0cmluZyxcclxuICAgIGFsbG93U2VsZWN0TXVsdGlGaWxlcz86IGJvb2xlYW5cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BVcGxvYWRGaWxlcyBleHRlbmRzIFNhb3BWaWV3Rm9ybUJpbmRpbmdzIHtcclxuICAgIHByaXZhdGUgX2NsaWJOYW1lOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9zaXRlVXJsOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9wYXJhbXM6U2FvcFVwbG9hZEZpbGVzUGFyYW1zO1xyXG4gICAgcHJpdmF0ZSBfcG9wdXBWaWV3SWQ6c3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfcG9wdXBWaWV3OkpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgICBwcml2YXRlIF9wb3B1cFZpZXdUaXRsZTpKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gICAgcHJpdmF0ZSBfdmlld01vZGFsQm9keTpKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gICAgcHJpdmF0ZSBfYnRuU2F2ZTpKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gICAgcHJpdmF0ZSBfYnRuQ2FuY2VsOkpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgICBwcml2YXRlIF92YWxpZGF0aW9uczpKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gICAgcHJpdmF0ZSBjb250ZW50RWxlbWVudElkID0gXCIuc2FvcC1tb2RhbC1ib2R5LWVsZW1lbnRcIjsgXHJcbiAgICBwcml2YXRlIF9zYW9wU2VydmljZXNDb3JlOiBTYW9wU2VydmljZXNDb3JlO1xyXG4gICAgcHJpdmF0ZSBfZmlsZXNDb3VudDpudW1iZXIgPSAwO1xyXG4gICAgLy9cclxuICAgIHB1YmxpYyB2aWV3VGl0bGU6c3RyaW5nID0gXCJVcGxvYWRcIjtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih2aWV3SWQ6c3RyaW5nLGxpYk5hbWU6c3RyaW5nID0gXCJcIil7XHJcbiAgICAgICAgc3VwZXIoXCIjdXBsb2FkU3BsRG9jdW1lbnRzVmlld1wiLGxpYk5hbWUpO1xyXG4gICAgICAgIHRoaXMuX2NsaWJOYW1lID0gbGliTmFtZTtcclxuICAgICAgICB0aGlzLl9wb3B1cFZpZXdJZCA9IHZpZXdJZDtcclxuICAgICAgICB0aGlzLm9uRXJyb3JDYWxsYmFjayA9IG51bGw7IFxyXG4gICAgICAgIHRoaXMub25GYWlsdXJlQ2FsbGJhY2sgPSBudWxsOyBcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgIH0gXHJcblxyXG4gICAgaW5pdENvbXBvbmVudChwYXJhbXM6U2FvcFVwbG9hZEZpbGVzUGFyYW1zKXsgLy8gdXNlIHRoaXMgbWV0aG9kIGluIGNhc2Ugb2Ygbm8gbW9kYWwgd2luZG93XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImluaXRDb21wb25lbnRcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLl9wYXJhbXMgPSBwYXJhbXM7XHJcbiAgICAgICAgdGhpcy5fc2l0ZVVybCA9IGdldFNpdGVBYnNvbHV0ZVVSTCh0aGlzLl9wYXJhbXMuY29udHJvbGxlcik7ICBcclxuICAgICAgICB0aGlzLmluaXRJbnB1dENvbnRyb2wodGhpcy5fcGFyYW1zLmFsbG93U2VsZWN0TXVsdGlGaWxlcyk7XHJcbiAgICAgICAgdGhpcy5iaW5kRm9ybUNvbnRyb2xzRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdFZpZXcocGFyYW1zOlNhb3BVcGxvYWRGaWxlc1BhcmFtcykgeyAvLyB1c2UgdGhpcyBtZXRob2QgaW4gY2FzZSBvZiBtb2RhbCB3aW5kb3dcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiaW5pdFZpZXdcIik7XHJcbiAgICAgICAgdGhpcy5fcGFyYW1zID0gcGFyYW1zO1xyXG4gICAgICAgIHRoaXMuX3NpdGVVcmwgPSBnZXRSZWxhdGl2ZVNpdGVVUkwodGhpcy5fcGFyYW1zLmNvbnRyb2xsZXIpO1xyXG4gICAgICAgIHRoaXMuaW5pdElucHV0Q29udHJvbCh0aGlzLl9wYXJhbXMuYWxsb3dTZWxlY3RNdWx0aUZpbGVzKTtcclxuICAgICAgICB0aGlzLmJpbmRQb3B1cENvbnRyb2xzKCk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJWaWV3KCk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdElucHV0Q29udHJvbChhbGxvd1NlbGVjdE11bHRpRmlsZXM6IGJvb2xlYW4pIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFVwbG9hZEZpbGVzLmluaXRJbnB1dENvbnRyb2xcIik7XHJcbiAgICAgICAgbGV0IGlucHV0RWxlbWVudCA9ICQoJy5jdXN0b20tZmlsZSBpbnB1dCcpO1xyXG5cclxuICAgICAgICAvLyBwbyBkZWZhdWx0aSBvbW9nb8SNYSBpemJvciBtdWx0aSBkYXRvdGVrXHJcbiAgICAgICAgaWYgKGFsbG93U2VsZWN0TXVsdGlGaWxlcyA9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICBpbnB1dEVsZW1lbnQucmVtb3ZlQXR0cihcIm11bHRpcGxlXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBiaW5kUG9wdXBDb250cm9scygpe1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVXBsb2FkRmlsZXMuYmluZENvbnRyb2xzXCIpO1xyXG4gICAgICAgIHRoaXMuX3BvcHVwVmlldyA9ICQodGhpcy5fcG9wdXBWaWV3SWQpO1xyXG4gICAgICAgIHRoaXMuX3BvcHVwVmlld1RpdGxlID0gJChcIlwiK3RoaXMuX3BvcHVwVmlld0lkK1wiICo+ICNleGFtcGxlTW9kYWxMb25nVGl0bGVcIik7XHJcbiAgICAgICAgdmFyIGNvbnRlbnRTZWwgPSB0aGlzLl9wb3B1cFZpZXdJZCArIFwiIFwiICsgdGhpcy5jb250ZW50RWxlbWVudElkO1xyXG4gICAgICAgIHRoaXMuX3ZpZXdNb2RhbEJvZHkgPSAkKGNvbnRlbnRTZWwpOyAgICAgICAgIFxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy5fcG9wdXBWaWV3VGl0bGUuaHRtbCh0aGlzLnZpZXdUaXRsZSk7XHJcbiAgICAgICAgLy9cclxuICAgIH1cclxuXHJcbiAgICBiaW5kRm9ybUNvbnRyb2xzKCl7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BVcGxvYWRGaWxlcy5iaW5kRm9ybUNvbnRyb2xzXCIpO1xyXG4gICAgICAgIHRoaXMuYmluZEZvcm1BamF4RXZlbnRzKHtjb250cm9sbGVyOlwiU1BMRG9jdW1lbnRcIixhY3Rpb246XCJVcGxvYWREb2N1bWVudHNcIn0pOyAgICAgICAgICAgIFxyXG4gICAgICAgIHRoaXMuX2J0blNhdmUgPSB0aGlzLl9mb3JtRnJhbWUuZmluZChcIiNidG5Pa1wiKTtcclxuICAgICAgICB0aGlzLl9idG5DYW5jZWwgPSB0aGlzLl9mb3JtRnJhbWUuZmluZChcIiNidG5DYW5jZWxcIik7XHJcbiAgICAgICAgdGhpcy5fdmFsaWRhdGlvbnMgPSAkKFwiI3VwbG9hZEZpbGVzVmFsaWRhdGlvbnNBamF4XCIpOyAgXHJcbiAgICAgICAgdGhpcy5iaW5kRm9ybUNvbnRyb2xzRXZlbnRzKCk7ICAgICBcclxuICAgIH1cclxuXHJcbiAgICBiaW5kRm9ybUNvbnRyb2xzRXZlbnRzKCl7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BVcGxvYWRGaWxlcy5iaW5kRm9ybUNvbnRyb2xzRXZlbnRzXCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgJCgnLmN1c3RvbS1maWxlIGlucHV0Jykub2ZmKFwiY2hhbmdlXCIpO1xyXG4gICAgICAgICQoJy5jdXN0b20tZmlsZSBpbnB1dCcpLmNoYW5nZShmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBfdGhpcy5yZWZyZXNoRmlsZUxpc3QoPEhUTUxJbnB1dEVsZW1lbnQ+ZS50YXJnZXQpO1xyXG4gICAgICAgIH0pOyAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaEZpbGVMaXN0KGlucHV0RWxlbWVudDogSFRNTElucHV0RWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVXBsb2FkRmlsZXMucmVmcmVzaEZpbGVMaXN0XCIpO1xyXG5cclxuICAgICAgICBsZXQgZmlsZXMgPSBpbnB1dEVsZW1lbnQuZmlsZXM7XHJcbiAgICAgICAgdmFyIGZpbGVfbGlzdCA9IFwiXCI7XHJcblxyXG4gICAgICAgIHRoaXMuX2ZpbGVzQ291bnQgPSBmaWxlcy5sZW5ndGg7XHJcbiAgICAgICAgaWYgKHRoaXMuX2ZpbGVzQ291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgIGZpbGVfbGlzdCA9IFwiPGRpdj5cIjtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGZpbGVFbGVtZW50ID0gXCI8ZGl2IHN0eWxlPSdkaXNwbGF5OiBmbGV4Oyc+XCI7XHJcbiAgICAgICAgICAgICAgICBmaWxlRWxlbWVudCA9IGZpbGVFbGVtZW50ICsgXCI8ZGl2IHN0eWxlPSdtYXJnaW46IGF1dG87IG1hcmdpbi1sZWZ0OiAwcHg7Jz5cIiArIGZpbGVzW2ldLm5hbWUgKyBcIjwvZGl2PlwiO1xyXG4gICAgICAgICAgICAgICAgZmlsZUVsZW1lbnQgPSBmaWxlRWxlbWVudCArIFwiPGRpdiBjbGFzcz0nc2FvcC1pY29uLXBvaW50ZXIgc2FvcC1pbWctdHJhc2ggc2ktcyBzYW9wLWNsLXJlZCcgZGF0YS1maWxlLW5hbWU9J1wiICsgZmlsZXNbaV0ubmFtZSArIFwiJyBvbmNsaWNrID0gXCIgKyB0aGlzLl9jbGliTmFtZSArIFwiLnJlbW92ZUZpbGUodGhpcyk+PC9kaXY+XCI7XHJcbiAgICAgICAgICAgICAgICBmaWxlRWxlbWVudCA9IGZpbGVFbGVtZW50ICsgXCI8L2Rpdj5cIjtcclxuICAgICAgICAgICAgICAgIGZpbGVfbGlzdCA9IGZpbGVfbGlzdCArIGZpbGVFbGVtZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZpbGVfbGlzdCA9IGZpbGVfbGlzdCArIFwiPC9kaXY+XCJcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICQoJ2Rpdi5jdXN0b20tZmlsZS1saXN0JykucmVtb3ZlQ2xhc3MoXCJkLW5vbmVcIik7XHJcbiAgICAgICAgJCgnZGl2LmN1c3RvbS1maWxlLWxpc3QnKS5hZGRDbGFzcyhcImQtYmxvY2tcIik7XHJcblxyXG4gICAgICAgICQoJy5jdXN0b20tZmlsZS1saXN0JykuaHRtbChmaWxlX2xpc3QpO1xyXG5cclxuICAgICAgICB0aGlzLmFmdGVyUmVmcmVzaEZpbGVzTGlzdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUZpbGUoZGl2RWxlbWVudDogYW55KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BVcGxvYWRGaWxlcy5yZW1vdmVGaWxlXCIpO1xyXG4gICAgICAgIGxldCBmaWxlTmFtZSA9IGRpdkVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1maWxlLW5hbWVcIik7XHJcblxyXG4gICAgICAgIGxldCBpbnB1dEVsZW1lbnRTZWxlY3RvciA9IFwiLmN1c3RvbS1maWxlIGlucHV0XCI7XHJcbiAgICAgICAgaWYgKCFpc0VtcHR5KHRoaXMuX3BhcmFtcy5mb3JtSWQpKSB7XHJcbiAgICAgICAgICAgIGlucHV0RWxlbWVudFNlbGVjdG9yID0gdGhpcy5fcGFyYW1zLmZvcm1JZCArIFwiIFwiICsgaW5wdXRFbGVtZW50U2VsZWN0b3I7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgaW5wdXRFbGVtZW50ID0gPEhUTUxJbnB1dEVsZW1lbnQ+JChpbnB1dEVsZW1lbnRTZWxlY3RvcilbMF07XHJcbiAgICAgICAgbGV0IGZpbGVzID0gaW5wdXRFbGVtZW50LmZpbGVzXHJcblxyXG4gICAgICAgIGNvbnN0IGR0ID0gbmV3IERhdGFUcmFuc2ZlcigpO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChmaWxlc1tpXS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGZpbGVOYW1lLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGR0Lml0ZW1zLmFkZChmaWxlc1tpXSk7IFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpbnB1dEVsZW1lbnQuZmlsZXMgPSBkdC5maWxlcztcclxuICAgICAgICB0aGlzLnJlZnJlc2hGaWxlTGlzdChpbnB1dEVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFmdGVyUmVmcmVzaEZpbGVzTGlzdCgpe1xyXG5cclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJWaWV3KCl7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uKHJlc3BvbnNlKXtcclxuICAgICAgICAgICAgX3RoaXMuX3ZpZXdNb2RhbEJvZHkuaHRtbChyZXNwb25zZSk7XHJcbiAgICAgICAgICAgIF90aGlzLmJpbmRGb3JtQ29udHJvbHMoKTtcclxuICAgICAgICAgICAgX3RoaXMuX3BvcHVwVmlldy5tb2RhbCgnc2hvdycpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOiB0aGlzLl9zaXRlVXJsK1wiL1wiK3RoaXMuX3BhcmFtcy5hY3Rpb25cclxuICAgICAgICAgICAgLHR5cGU6XCJHRVRcIlxyXG4gICAgICAgIH0pOyAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgb25TdWJtaXRTdWNjZXNzKGRhdGE6IFNhb3BXZlN1Ym1pdFJlc3VsdCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVXBsb2FkRmlsZXMub25TdWJtaXRTdWNjZXNzXCIpO1xyXG4gICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgYWxlcnRpZnkubWVzc2FnZShkYXRhLmFsZXJ0TWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwVmlldy5tb2RhbCgnaGlkZScpO1xyXG4gICAgICAgICAgICAvLyBqdXN0IGluIGNhc2U6IG9kc3RyYW5pLCDEjWUgamUgxaFlIHZlZG5vIHZpZG5vLCBhdnRvbWF0c2tvIHNlIG5lIHphcHJlIHZlZG5vIDooXHJcbiAgICAgICAgICAgICQoJy5tb2RhbC1iYWNrZHJvcCcpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAkKGRvY3VtZW50LmJvZHkpLnJlbW92ZUNsYXNzKFwibW9kYWwtb3BlblwiKTsgICAgICAgICAgICBcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgLy9hbGVydGlmeS5lcnJvcihkYXRhLmFsZXJ0TWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZhbGlkYXRpb25zLmh0bWwoZGF0YS52aWV3Q29udGVudCk7XHJcbiAgICAgICAgICAgIC8vdGhpcy5fYnRuU2F2ZS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJ0cnVlXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFmdGVyU3VibWl0U3VjY2VzcyhkYXRhKTtcclxuICAgIH0gICAgXHJcblxyXG4gICAgcHVibGljIGFmdGVyU3VibWl0U3VjY2VzcyhyZXN1bHQ6IFNhb3BXZlN1Ym1pdFJlc3VsdCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVXBsb2FkRmlsZXMuYWZ0ZXJFeGVjdXRlU3VjY2Vzc1wiKTtcclxuICAgIH0gICAgICAgIFxyXG5cclxuICAgIGFqYXhWYWxpZGF0ZSgpOmJvb2xlYW57XHJcbiAgICAgICAgaWYgKHRoaXMuX2ZpbGVzQ291bnQgPD0gMCkgeyByZXR1cm47IH1cclxuICAgICAgICBpZiAoKHRoaXMuX3BhcmFtcy52YWxpZGF0ZUFqYXggPT0gbnVsbCkgfHwgKHRoaXMuX3BhcmFtcy52YWxpZGF0ZUFqYXggPT0gZmFsc2UpIHx8IGlzRW1wdHkodGhpcy5fcGFyYW1zLnZhbGlkYXRpb25EaXZJZCkgfHwgaXNFbXB0eSh0aGlzLl9wYXJhbXMuZm9ybUlkKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgbGV0IF9yZXN1bHQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX3ZhbGlkYXRpb25zID0gJCh0aGlzLl9wYXJhbXMudmFsaWRhdGlvbkRpdklkKTsgIFxyXG5cclxuICAgICAgICBsZXQgX2Zvcm1FID0gJCh0aGlzLl9wYXJhbXMuZm9ybUlkKVswXTtcclxuICAgICAgICBsZXQgX2Zvcm0gPSAoPEhUTUxGb3JtRWxlbWVudD5fZm9ybUUpO1xyXG4gICAgICAgIHZhciBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShfZm9ybSk7XHJcblxyXG4gICAgICAgICQuYWpheCh7XHJcbiAgICAgICAgICAgIHVybDogdGhpcy5fc2l0ZVVybCtcIi9cIit0aGlzLl9wYXJhbXMuYWN0aW9uLFxyXG4gICAgICAgICAgICB0eXBlOiAnUE9TVCcsXHJcbiAgICAgICAgICAgIGRhdGE6IGZvcm1EYXRhLFxyXG4gICAgICAgICAgICBhc3luYzogZmFsc2UsXHJcbiAgICAgICAgICAgIGNhY2hlOiBmYWxzZSxcclxuICAgICAgICAgICAgY29udGVudFR5cGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBwcm9jZXNzRGF0YTogZmFsc2UsXHJcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGE6IFNhb3BXZlN1Ym1pdFJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInN1Y2Nlc3NcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5zdWNjZXNzID09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3ZhbGlkYXRpb25zLmh0bWwoZGF0YS52aWV3Q29udGVudCk7ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl92YWxpZGF0aW9ucy5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIF9yZXN1bHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTsgICAgICAgIFxyXG4gICAgICAgICAgcmV0dXJuIF9yZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy9cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BWaWV3U3Bpbm5lciB7XHJcblxyXG4gIGdlbmVyYXRlU3Bpbm5lckRpdihzcGlubmVySWQ6IHN0cmluZyA9ICcjc2FvcExvYWRpbmcnKTogc3RyaW5nIHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJnZW5lcmF0ZVNwaW5uZXJEaXYgXCIgKyBzcGlubmVySWQpO1xyXG4gICAgbGV0IHNwaW5uckRpdiA9XHJcbiAgICAgICc8ZGl2IGlkPVwiJyArIHNwaW5uZXJJZCArICdcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgY2xhc3M9XCJcIj4gJ1xyXG4gICAgICArICdcdDxkaXYgaWQ9XCInICsgc3Bpbm5lcklkICsgJ1NwaW5uZXJCYWNrZ3JvdW5nXCIgY2xhc3M9XCJzcGlubmVyLWJhY2tncm91bmQgXCIvPiAnXHJcbiAgICAgICsgJ1x0PGRpdiBpZD1cIicgKyBzcGlubmVySWQgKyAnU3Bpbm5lclwiIGNsYXNzPVwic3Bpbm5lciBzcGlubmVyLWNlbnRlci1kYXNoYm9hcmRTaWRlYmFyclwiPiAnXHJcbiAgICAgICsgJ1x0XHQ8ZGl2IGNsYXNzPVwic3Bpbm5lci1ibGFkZVwiLz4gJ1xyXG4gICAgICArICdcdFx0PGRpdiBjbGFzcz1cInNwaW5uZXItYmxhZGVcIi8+ICdcclxuICAgICAgKyAnXHRcdDxkaXYgY2xhc3M9XCJzcGlubmVyLWJsYWRlXCIvPiAnXHJcbiAgICAgICsgJ1x0XHQ8ZGl2IGNsYXNzPVwic3Bpbm5lci1ibGFkZVwiLz4gJ1xyXG4gICAgICArICdcdFx0PGRpdiBjbGFzcz1cInNwaW5uZXItYmxhZGVcIi8+ICdcclxuICAgICAgKyAnXHRcdDxkaXYgY2xhc3M9XCJzcGlubmVyLWJsYWRlXCIvPiAnXHJcbiAgICAgICsgJ1x0XHQ8ZGl2IGNsYXNzPVwic3Bpbm5lci1ibGFkZVwiLz4gJ1xyXG4gICAgICArICdcdFx0PGRpdiBjbGFzcz1cInNwaW5uZXItYmxhZGVcIi8+ICdcclxuICAgICAgKyAnXHRcdDxkaXYgY2xhc3M9XCJzcGlubmVyLWJsYWRlXCIvPiAnXHJcbiAgICAgICsgJ1x0XHQ8ZGl2IGNsYXNzPVwic3Bpbm5lci1ibGFkZVwiLz4gJ1xyXG4gICAgICArICdcdFx0PGRpdiBjbGFzcz1cInNwaW5uZXItYmxhZGVcIi8+ICdcclxuICAgICAgKyAnXHRcdDxkaXYgY2xhc3M9XCJzcGlubmVyLWJsYWRlXCIvPiAnXHJcbiAgICAgICsgJ1x0PC9kaXY+ICdcclxuICAgICAgKyAnPC9kaXY+ICc7XHJcblxyXG4gICAgcmV0dXJuIHNwaW5uckRpdjtcclxuICB9XHJcblxyXG4gIHNob3dMb2FkaW5nU2FvcChlbGVtZW50SWQ6IHN0cmluZyA9IFwiI3Nhb3BMb2FkaW5nXCIpIHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzaG93TG9hZGluZ1Nhb3AgXCIgKyBlbGVtZW50SWQpO1xyXG4gICAgdmFyIG9iaiA9ICQoZWxlbWVudElkKTtcclxuICAgIGlmIChvYmoubGVuZ3RoKSB7XHJcbiAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTaG93Li4uIFwiKTtcclxuICAgICAgb2JqLnNob3coKTtcclxuICAgICAgLy9zZXRNb2RhbEZvcm1aSW5kZXgoZWxlbWVudElkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhpZGVMb2FkaW5nU2FvcChlbGVtZW50SWQ6IHN0cmluZyA9IFwiI3Nhb3BMb2FkaW5nXCIpIHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJoaWRlTG9hZGluZ1Nhb3AgXCIgKyBlbGVtZW50SWQpO1xyXG4gICAgdmFyIG9iaiA9ICQoZWxlbWVudElkKTtcclxuICAgIGlmIChvYmoubGVuZ3RoKVxyXG4gICAgICBvYmouaGlkZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gc2hvd0xvYWRpbmdTYW9wKGVsZW1lbnRJZDogc3RyaW5nID0gXCJcIikge1xyXG4gIC8vICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInNob3dMb2FkaW5nU2FvcCBcIiArIGVsZW1lbnRJZCk7XHJcbiAgLy8gICBpZiAoIWlzRW1wdHkoZWxlbWVudElkKSkge1xyXG4gIC8vICAgICBsZXQgZWxlbWVudERpdiA9ICQoZWxlbWVudElkKTtcclxuICAvLyAgICAgaWYgKGVsZW1lbnREaXYubGVuZ3RoKSB7XHJcbiAgLy8gICAgICAgbGV0IHNwaW5uZXJJRCA9IGVsZW1lbnRJZCArIFwiTG9hZGluZ1wiO1xyXG4gIC8vICAgICAgIHNwaW5uZXJJRCA9IHNwaW5uZXJJRC5yZXBsYWNlKFwiI1wiLFwiXCIpO1xyXG4gIC8vICAgICAgIGxldCBzcGlubmVyRGl2ID0gJChzcGlubmVySUQpO1xyXG4gIC8vICAgICAgIGlmICghc3Bpbm5lckRpdi5sZW5ndGgpIHtcclxuICAvLyAgICAgICAgIGxldCBfZGl2ID0gdGhpcy5nZW5lcmF0ZVNwaW5uZXJEaXYoc3Bpbm5lcklEKTtcclxuICAvLyAgICAgICAgIGVsZW1lbnREaXYuYXBwZW5kKF9kaXYpO1xyXG4gIC8vICAgICAgICAgc3Bpbm5lckRpdiA9ICQoc3Bpbm5lcklEKTtcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgc3Bpbm5lckRpdi5zaG93KCk7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIC8vIGhpZGVMb2FkaW5nU2FvcChlbGVtZW50SWQ6IHN0cmluZyA9IFwiXCIpIHtcclxuICAvLyAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJoaWRlTG9hZGluZ1Nhb3AgXCIgKyBlbGVtZW50SWQpO1xyXG4gIC8vICAgaWYgKCFpc0VtcHR5KGVsZW1lbnRJZCkpIHtcclxuICAvLyAgICAgbGV0IGVsZW1lbnREaXYgPSAkKGVsZW1lbnRJZCk7XHJcbiAgLy8gICAgIGlmIChlbGVtZW50RGl2Lmxlbmd0aCkge1xyXG4gIC8vICAgICAgIGxldCBzcGlubmVySUQgPSBlbGVtZW50SWQgKyBcIkxvYWRpbmdcIjtcclxuICAvLyAgICAgICBsZXQgc3Bpbm5lckRpdiA9ICQoc3Bpbm5lcklEKTtcclxuICAvLyAgICAgICBpZiAoIXNwaW5uZXJEaXYubGVuZ3RoKSB7XHJcbiAgLy8gICAgICAgICBlbGVtZW50RGl2LmFwcGVuZCh0aGlzLmdlbmVyYXRlU3Bpbm5lckRpdihzcGlubmVySUQpKTtcclxuICAvLyAgICAgICAgIHNwaW5uZXJEaXYgPSAkKHNwaW5uZXJJRCk7XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICAgIHNwaW5uZXJEaXYuaGlkZSgpO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG4gIC8vIC8vXHJcbn1cclxuIiwi77u/aW1wb3J0IHsgZ2xvYmFsLGlzRW1wdHksZ2V0U2l0ZUFic29sdXRlVVJMLCBpc1VuRGVmaW5lZCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFZpZXdTcGlubmVyIH0gZnJvbSAnLi4vQ29tcG9uZW50cy9zYW9wLXZpZXctc3Bpbm5lcidcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcFNlcnZpY2VzQ29yZVBhcmFtcyB7XHJcbiAgYWN0aW9uOnN0cmluZztcclxuICBhc3luYz86Ym9vbGVhblxyXG4gIHR5cGU/OnN0cmluZztcclxuICBkYXRhPzphbnk7XHJcbiAgc3Bpbm5lckRpdklkPzpzdHJpbmc7XHJcbiAgLy8gY29udGVudFR5cGU/OiBzdHJpbmcgfCBmYWxzZSB8IHVuZGVmaW5lZDtcclxuICAvLyBkYXRhVHlwZT86ICd4bWwnIHwgJ2h0bWwnIHwgJ3NjcmlwdCcgfCAnanNvbicgfCAnanNvbnAnIHwgJ3RleHQnIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIC8vIHByb2Nlc3NEYXRhPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcclxufVxyXG5cclxuZXhwb3J0IGVudW0gU2FvcFNlcnZpY2VzQ29yZVJlc3VsdCB7XHJcbiAgc3VjY2VzcyA9IDFcclxuICAsIGVycm9yID0gMlxyXG59XHJcblxyXG5leHBvcnQgZW51bSBTYW9wU2VydmljZXNDb3JlSFRUUFJlc3VsdFN0YXR1c0NvZGUge1xyXG4gIG9rID0gMjAwLFxyXG4gIHVuYXV0aG9yaXplZCA9IDQwMSxcclxuICBpbnRlcm5hbFNlcnZlckVycm9yID0gNTAwXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcFNlcnZpY2VzQ29yZVJlc3BvbnNlIHtcclxuICByZXNwb25zZTogU2FvcFNlcnZpY2VzQ29yZVJlc3VsdDtcclxuICBkYXRhOiBhbnk7XHJcbn07XHJcblxyXG4vLyBmdW5jdGlvbiBzeW5jRGVsYXkobWlsbGlzZWNvbmRzOmFueSl7XHJcbi8vICAgdmFyIHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbi8vICAgdmFyIGVuZD0wO1xyXG4vLyAgIHdoaWxlKCAoZW5kLXN0YXJ0KSA8IG1pbGxpc2Vjb25kcyl7XHJcbi8vICAgICAgIGVuZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4vLyAgIH1cclxuLy8gIH1cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wU2VydmljZXNDb3JlIHtcclxuICBwcml2YXRlIF9zYW9wVmlld1NwaW5uZXI6U2FvcFZpZXdTcGlubmVyID0gbmV3IFNhb3BWaWV3U3Bpbm5lcigpO1xyXG4gIHByaXZhdGUgX3BhcmFtczpTYW9wU2VydmljZXNDb3JlUGFyYW1zO1xyXG4gIHByaXZhdGUgX2RlZmF1bHRQYXJhbXM6U2FvcFNlcnZpY2VzQ29yZVBhcmFtcztcclxuICAvLyAgXHJcbiAgLy9wdWJsaWMgX3Jlc3VsdDpTYW9wU2VydmljZXNDb3JlUmVzcG9uc2UgPSB7cmVzcG9uc2U6bnVsbCxkYXRhOm51bGx9OyAgXHJcblxyXG4gIGNvbnN0cnVjdG9yKCl7XHJcbiAgICB0aGlzLl9kZWZhdWx0UGFyYW1zID0ge1xyXG4gICAgICBhY3Rpb246XCJcIlxyXG4gICAgICAsdHlwZTpcIkdFVFwiXHJcbiAgICAgICxhc3luYzp0cnVlXHJcbiAgICAgICxkYXRhOm51bGxcclxuICAgICAgLHNwaW5uZXJEaXZJZDpcIlwiXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkRvbmUocmVzdWx0OmFueSl7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5vbkRvbmVcIik7XHJcbiAgICB0aGlzLmFmdGVyRG9uZShyZXN1bHQpO1xyXG4gICAgLy90aGlzLl9zYW9wVmlld1NwaW5uZXIuaGlkZUxvYWRpbmdTYW9wKHRoaXMuX3BhcmFtcy5zcGlubmVyRGl2SWQpOyAgICAgIFxyXG4gIH1cclxuXHJcbiAgYWZ0ZXJEb25lKHJlc3VsdDphbnkpOnZvaWR7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmVcIik7XHJcbiAgfSAgXHJcblxyXG4gIHByaXZhdGUgb25TdWNjZXNzKHJlc3VsdDphbnkpOnZvaWR7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5zdWNjZXNzXCIpO1xyXG4gICAgbGV0IF9yZXN1bHQ6U2FvcFNlcnZpY2VzQ29yZVJlc3BvbnNlID0ge3Jlc3BvbnNlOm51bGwsZGF0YTpudWxsfTsgXHJcbiAgICBpZiAodHlwZW9mIHJlc3VsdC5zdWNjZXNzID09PSBcInVuZGVmaW5lZFwiIHx8IHJlc3VsdC5zdWNjZXNzID09PSBudWxsKSB7XHJcbiAgICAgIF9yZXN1bHQucmVzcG9uc2UgPSBTYW9wU2VydmljZXNDb3JlUmVzdWx0LnN1Y2Nlc3M7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBfcmVzdWx0LnJlc3BvbnNlID0gcmVzdWx0LnN1Y2Nlc3MgPT0gdHJ1ZSA/IFNhb3BTZXJ2aWNlc0NvcmVSZXN1bHQuc3VjY2VzcyA6IFNhb3BTZXJ2aWNlc0NvcmVSZXN1bHQuZXJyb3I7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIF9yZXN1bHQuZGF0YSA9IHJlc3VsdDtcclxuICAgIHRoaXMuYWZ0ZXJTdWNjZXNzKF9yZXN1bHQpO1xyXG4gIH1cclxuXHJcbiAgYWZ0ZXJTdWNjZXNzKHJlc3VsdDphbnkpOnZvaWR7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5hZnRlclN1Y2Nlc3NcIik7XHJcbiAgfSAgXHJcblxyXG4gIHByaXZhdGUgb25FcnJvcihyZXN1bHQ6YW55KTp2b2lke1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZXJ2aWNlc0NvcmUuZXJyb3JcIik7XHJcbiAgICBcclxuICAgIGlmIChyZXN1bHQuc3RhdHVzID09IFNhb3BTZXJ2aWNlc0NvcmVIVFRQUmVzdWx0U3RhdHVzQ29kZS51bmF1dGhvcml6ZWQpIHtcclxuICAgICAgLy8gcmVkaXJlY3QgdG8gbG9naW5cclxuICAgICAgdGhpcy51bkF1dGhvcml6ZWRSZWRpcmVjdFRvTG9naW5QYWdlKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVzdWx0LnN0YXR1cyA9IFNhb3BTZXJ2aWNlc0NvcmVIVFRQUmVzdWx0U3RhdHVzQ29kZS5pbnRlcm5hbFNlcnZlckVycm9yICYmICFpc1VuRGVmaW5lZChyZXN1bHQucmVzcG9uc2VUZXh0KSkge1xyXG4gICAgICBhbGVydChcIkludGVybmFsIGVycm9yIVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgX3Jlc3VsdDpTYW9wU2VydmljZXNDb3JlUmVzcG9uc2UgPSB7cmVzcG9uc2U6bnVsbCxkYXRhOm51bGx9OyBcclxuICAgIF9yZXN1bHQucmVzcG9uc2UgPSBTYW9wU2VydmljZXNDb3JlUmVzdWx0LmVycm9yO1xyXG4gICAgX3Jlc3VsdC5kYXRhID0gcmVzdWx0O1xyXG4gICAgdGhpcy5hZnRlckVycm9yKF9yZXN1bHQpO1xyXG4gIH1cclxuXHJcbiAgYWZ0ZXJFcnJvcihyZXN1bHQ6YW55KTp2b2lke1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJTdWNjZXNzXCIpO1xyXG4gIH0gXHJcblxyXG4gIEV4ZWN1dGVBY3Rpb24ocGFyYW1zOlNhb3BTZXJ2aWNlc0NvcmVQYXJhbXMpOnZvaWQge1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvblwiKTtcclxuICAgIGxldCBvcHRpb25zID0geyAuLi50aGlzLl9kZWZhdWx0UGFyYW1zLCAuLi5wYXJhbXMgfTtcclxuICAgIHBhcmFtcyA9IG9wdGlvbnM7XHJcbiAgICB0aGlzLl9wYXJhbXMgPSBwYXJhbXM7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IF9hamF4QWN0aW9uID0gZ2V0U2l0ZUFic29sdXRlVVJMKHBhcmFtcy5hY3Rpb24pO1xyXG5cclxuICAgIC8vQFVybC5BY3Rpb24oXCJjcmVhckNhbXBNYW51YWxcIiwgXCJEUFNcIilcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAkLmFqYXgoe1xyXG4gICAgICAgIGFzeW5jOiBwYXJhbXMuYXN5bmMsXHJcbiAgICAgICAgdXJsOiBfYWpheEFjdGlvbixcclxuICAgICAgICB0eXBlOiAhaXNFbXB0eShwYXJhbXMudHlwZSkgPyBwYXJhbXMudHlwZSA6IFwiUE9TVFwiLFxyXG4gICAgICAgIGRhdGE6IHBhcmFtcy5kYXRhLFxyXG4gICAgICAgIC8vIGNvbnRlbnRUeXBlOiBwYXJhbXMuY29udGVudFR5cGUgPT0gbnVsbCA/ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgnIDogcGFyYW1zLmNvbnRlbnRUeXBlLFxyXG4gICAgICAgIC8vIGRhdGFUeXBlOiBwYXJhbXMudHlwZSA9PSBudWxsID8gJ0ludGVsbGlnZW50IEd1ZXNzICh4bWwsIGpzb24sIHNjcmlwdCwgb3IgaHRtbCknIDogcGFyYW1zLnR5cGUsICBcclxuICAgICAgICAvLyBwcm9jZXNzRGF0YSA6IHBhcmFtcy5wcm9jZXNzRGF0YSA9PSBudWxsID8gdHJ1ZSA6IHBhcmFtcy5wcm9jZXNzRGF0YSwgXHJcbiAgICAgICAgYmVmb3JlU2VuZDogZnVuY3Rpb24gKCkgeyBfdGhpcy5fc2FvcFZpZXdTcGlubmVyLnNob3dMb2FkaW5nU2FvcChwYXJhbXMuc3Bpbm5lckRpdklkKTsgfSxcclxuICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gKCkgeyBfdGhpcy5fc2FvcFZpZXdTcGlubmVyLmhpZGVMb2FkaW5nU2FvcChwYXJhbXMuc3Bpbm5lckRpdklkKTsgfSxcclxuICAgICAgICBzdWNjZXNzOiB0aGlzLm9uU3VjY2Vzcy5iaW5kKF90aGlzKSxcclxuICAgICAgICBlcnJvcjogdGhpcy5vbkVycm9yLmJpbmQoX3RoaXMpXHJcbiAgICAgIH0pLmRvbmUoZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJEb25lLi4uXCIpO1xyXG4gICAgICAgIF90aGlzLm9uRG9uZShyZXN1bHQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGNhdGNoKGVycikge1xyXG4gICAgICBhbGVydChcIkludGVybmFsIGVycm9yIVwiKTtcclxuICAgIH0gICAgXHJcblxyXG4gIFxyXG4gIH1cclxuXHJcbiAgRXhlY3V0ZUJsb2JBY3Rpb24ocGFyYW1zOiBTYW9wU2VydmljZXNDb3JlUGFyYW1zKTogdm9pZCB7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQmxvYkFjdGlvblwiKTtcclxuICAgIGxldCBvcHRpb25zID0geyAuLi50aGlzLl9kZWZhdWx0UGFyYW1zLCAuLi5wYXJhbXMgfTtcclxuICAgIHBhcmFtcyA9IG9wdGlvbnM7XHJcbiAgICB0aGlzLl9wYXJhbXMgPSBwYXJhbXM7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IF9hamF4QWN0aW9uID0gZ2V0U2l0ZUFic29sdXRlVVJMKHBhcmFtcy5hY3Rpb24pO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgICQuYWpheCh7XHJcbiAgICAgICAgdHlwZTogXCJQT1NUXCIsXHJcbiAgICAgICAgdXJsOiBfYWpheEFjdGlvbixcclxuICAgICAgICBkYXRhOiBwYXJhbXMuZGF0YSxcclxuICAgICAgICB4aHJGaWVsZHM6IHtcclxuICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InIC8vIHRvIGF2b2lkIGJpbmFyeSBkYXRhIGJlaW5nIG1hbmdsZWQgb24gY2hhcnNldCBjb252ZXJzaW9uXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoYmxvYiwgc3RhdHVzLCB4aHIpIHtcclxuICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGEgZmlsZW5hbWVcclxuICAgICAgICAgICAgdmFyIGZpbGVuYW1lID0gXCJcIjtcclxuICAgICAgICAgICAgdmFyIGRpc3Bvc2l0aW9uID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uJyk7XHJcbiAgICAgICAgICAgIGlmIChkaXNwb3NpdGlvbiAmJiBkaXNwb3NpdGlvbi5pbmRleE9mKCdhdHRhY2htZW50JykgIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZmlsZW5hbWVSZWdleCA9IC9maWxlbmFtZVteOz1cXG5dKj0oKFsnXCJdKS4qP1xcMnxbXjtcXG5dKikvO1xyXG4gICAgICAgICAgICAgICAgdmFyIG1hdGNoZXMgPSBmaWxlbmFtZVJlZ2V4LmV4ZWMoZGlzcG9zaXRpb24pO1xyXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMgIT0gbnVsbCAmJiBtYXRjaGVzWzFdKSBmaWxlbmFtZSA9IG1hdGNoZXNbMV0ucmVwbGFjZSgvWydcIl0vZywgJycpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL2lmICh0eXBlb2Ygd2luZG93Lm5hdmlnYXRvci5tc1NhdmVCbG9iICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAvLyAgICAvLyBJRSB3b3JrYXJvdW5kIGZvciBcIkhUTUw3MDA3OiBPbmUgb3IgbW9yZSBibG9iIFVSTHMgd2VyZSByZXZva2VkIGJ5IGNsb3NpbmcgdGhlIGJsb2IgZm9yIHdoaWNoIHRoZXkgd2VyZSBjcmVhdGVkLiBUaGVzZSBVUkxzIHdpbGwgbm8gbG9uZ2VyIHJlc29sdmUgYXMgdGhlIGRhdGEgYmFja2luZyB0aGUgVVJMIGhhcyBiZWVuIGZyZWVkLlwiXHJcbiAgICAgICAgICAgIC8vICAgIHdpbmRvdy5uYXZpZ2F0b3IubXNTYXZlQmxvYihibG9iLCBmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgIC8vfSBlbHNlXHJcbiAgICAgICAgICAgIC8ve1xyXG4gICAgICAgICAgICB2YXIgVVJMID0gd2luZG93LlVSTCB8fCB3aW5kb3cud2Via2l0VVJMO1xyXG4gICAgICAgICAgICB2YXIgZG93bmxvYWRVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGZpbGVuYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAvLyB1c2UgSFRNTDUgYVtkb3dubG9hZF0gYXR0cmlidXRlIHRvIHNwZWNpZnkgZmlsZW5hbWVcclxuICAgICAgICAgICAgICAgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XHJcbiAgICAgICAgICAgICAgICAvLyBzYWZhcmkgZG9lc24ndCBzdXBwb3J0IHRoaXMgeWV0XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGEuZG93bmxvYWQgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBkb3dubG9hZFVybDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYS5ocmVmID0gZG93bmxvYWRVcmw7XHJcbiAgICAgICAgICAgICAgICAgICAgYS5kb3dubG9hZCA9IGZpbGVuYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYS5jbGljaygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBkb3dubG9hZFVybDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IFVSTC5yZXZva2VPYmplY3RVUkwoZG93bmxvYWRVcmwpOyB9LCAxMDApOyAvLyBjbGVhbnVwXHJcbiAgICAgICAgICAgIC8vfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IHRoaXMub25FcnJvci5iaW5kKF90aGlzKVxyXG4gICAgICAgIH0pLmRvbmUoZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIkRvbmUuLi5cIik7XHJcbiAgICAgICAgICBfdGhpcy5vbkRvbmUocmVzdWx0KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGFsZXJ0KFwiSW50ZXJuYWwgZXJyb3IhXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuICBwdWJsaWMgaGFuZGxlU3VibWl0RXJyb3IocmVzcG9uc2U6IGFueSk6IHZvaWQge1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZXJ2aWNlc0NvcmUuSGFuZGxlU3VibWl0RXJyb3JcIik7XHJcblxyXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSBTYW9wU2VydmljZXNDb3JlSFRUUFJlc3VsdFN0YXR1c0NvZGUudW5hdXRob3JpemVkKSB7XHJcbiAgICAgICAgdGhpcy51bkF1dGhvcml6ZWRSZWRpcmVjdFRvTG9naW5QYWdlKCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGRpc3BsYXkgZXJyb3JcclxuICAgIGNvbnNvbGUubG9nKFwicmVzcG9uc2VcIiwgcmVzcG9uc2UpO1xyXG4gICAgYWxlcnQocmVzcG9uc2Uuc3RhdHVzVGV4dCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdW5BdXRob3JpemVkUmVkaXJlY3RUb0xvZ2luUGFnZSgpOiB2b2lkIHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VydmljZXNDb3JlLnJlZGlyZWN0VG9Mb2dpblBhZ2VcIik7XHJcblxyXG4gICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xyXG4gIH1cclxuIFxyXG4gIC8vXHJcbn1cclxuIiwi77u/aW1wb3J0IHsgZ2xvYmFsLCBpc0VtcHR5LCBpc1VuRGVmaW5lZCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFNlcnZpY2VzQ29yZSB9IGZyb20gXCIuLi9Db3JlL3Nhb3Atc2VydmljZXMtY29yZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BUcmFuc2xhdGlvbiB7XHJcbiAgcHVibGljIGtleTogc3RyaW5nID0gXCIjXCI7XHJcbiAgcHVibGljIHRyYW5zbGF0aW9uOiBzdHJpbmcgPSBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFRyYW5zbGF0aW9ucyB7XHJcbiAgcHVibGljIHRyYW5zbGF0aW9uc0xpc3Q6W1Nhb3BUcmFuc2xhdGlvbj9dID0gW107XHJcbn1cclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNhb3BUcmFuc2xhdGlvblNlcnZpY2VQYXJhbXMge1xyXG4gIGNvbnRyb2xsZXI6c3RyaW5nLFxyXG4gIGFjdGlvbjpzdHJpbmcsXHJcbn1cclxuXHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFRyYW5zbGF0aW9uU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBfcGFyYW1zOlNhb3BUcmFuc2xhdGlvblNlcnZpY2VQYXJhbXM7XHJcbiAgcHJpdmF0ZSBfc2FvcFNlcnZpY2VzQ29yZTogU2FvcFNlcnZpY2VzQ29yZTtcclxuICAvL1xyXG4gIHB1YmxpYyBfdGVybWlub2xvZ3k6U2FvcFRyYW5zbGF0aW9ucztcclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKHBhcmFtczpTYW9wVHJhbnNsYXRpb25TZXJ2aWNlUGFyYW1zID0gbnVsbCl7XHJcbiAgICBpZighaXNVbkRlZmluZWQocGFyYW1zKSl7XHJcbiAgICAgIHRoaXMuX3BhcmFtcyA9IHBhcmFtcztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3BhcmFtcyA9IHtjb250cm9sbGVyOlwiVHJhbnNsYXRpb25cIixhY3Rpb246XCJHZXRUcmFuc2xhdGlvbnNcIn07XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgdGhpcy5fdGVybWlub2xvZ3kgPSBuZXcgU2FvcFRyYW5zbGF0aW9ucygpO1xyXG4gIH1cclxuICBcclxuICBzZXRUcmFuc2xhdGlvbnNMaXN0KHRyYW5zbGF0aW9uczpzdHJpbmdbXSk6YW55e1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHRyYW5zbGF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICBfdGhpcy5fdGVybWlub2xvZ3kudHJhbnNsYXRpb25zTGlzdC5wdXNoKHtrZXk6dmFsdWUsdHJhbnNsYXRpb246dmFsdWV9KTsgIFxyXG4gICAgfSk7ICAgXHJcbiAgICByZXR1cm4gdGhpcy5nZXRUcmFuc2xhdGlvbnModGhpcy5fdGVybWlub2xvZ3kpO1xyXG4gIH1cclxuXHJcbiAgZ2V0VHJhbnNsYXRpb25zKHRyYW5zbGF0aW9uczpTYW9wVHJhbnNsYXRpb25zKTphbnl7XHJcbiAgICBsZXQganNvbkRhdGEgPSBKU09OLnN0cmluZ2lmeSh0cmFuc2xhdGlvbnMpO1xyXG4gICAgbGV0IF9kYXRhID0ge2pzb25JbnB1dDpqc29uRGF0YX07XHJcbiAgICBsZXQgX3Jlc3BvbnNlOmFueTtcclxuICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgIF9yZXNwb25zZSA9IHJlc3BvbnNlO1xyXG4gICAgfTtcclxuICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgYWN0aW9uOiB0aGlzLl9wYXJhbXMuY29udHJvbGxlcitcIi9cIit0aGlzLl9wYXJhbXMuYWN0aW9uK1wiXCJcclxuICAgICAgICAsIHR5cGU6IFwiUE9TVFwiXHJcbiAgICAgICAgLCBkYXRhOiBfZGF0YVxyXG4gICAgICAgICwgYXN5bmM6IGZhbHNlXHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3Rlcm1pbm9sb2d5LnRyYW5zbGF0aW9uc0xpc3QgPSBfcmVzcG9uc2UudHJhbnNsYXRpb25zTGlzdDtcclxuICAgIHJldHVybiBfcmVzcG9uc2U7XHJcbiAgfVxyXG5cclxuICB0cmFuc2xhdGUoa2V5OnN0cmluZyk6c3RyaW5ne1xyXG4gICAgbGV0IF90ciA9IHRoaXMuX3Rlcm1pbm9sb2d5LnRyYW5zbGF0aW9uc0xpc3QuZmluZChlID0+IGUua2V5ID09IGtleSkgYXMgYW55O1xyXG4gICAgaWYgKGlzVW5EZWZpbmVkKF90cikpIHsgXHJcbiAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gX3RyLnRyYW5zbGF0aW9uO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy9cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu78vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL3R5cGluZ3MuZC50c1wiIC8+XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFV0aWxzIHtcclxuICAgIGNoZWNrQ29tcGF0aWJpbGl0eSgpOmJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBTYW9wQ29tbW9uLmNoZWNrQ29tcGF0aWJpbGl0eSgpO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/aW1wb3J0IHsgZ2xvYmFsLCBzZXRNb2RhbEZvcm1aSW5kZXgsIGlzRW1wdHksIGlzVW5EZWZpbmVkLGdldFJlbGF0aXZlU2l0ZVVSTCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcFZpZXdGb3JtQmluZGluZ3NQYXJhbXN0ZXJzIHtcclxuICAgIGNvbnRyb2xsZXI6c3RyaW5nO1xyXG4gICAgYWN0aW9uOnN0cmluZztcclxufSBcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wVmlld0Zvcm1CaW5kaW5ncyB7XHJcbiAgICBwdWJsaWMgaWQ6c3RyaW5nO1xyXG4gICAgcHVibGljIF9mb3JtRnJhbWU6SlF1ZXJ5PEhUTUxFbGVtZW50PjsgICAgXHJcbiAgICAvL1xyXG4gICAgcHJpdmF0ZSBfbGliTmFtZTpzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9GYlBhcmFtczpTYW9wVmlld0Zvcm1CaW5kaW5nc1BhcmFtc3RlcnM7XHJcbiAgICBwcml2YXRlIF93ZWJzaXRlVXJsOnN0cmluZztcclxuICAgIC8vXHJcbiAgICBwdWJsaWMgb25TdWNjY2Vzc0NhbGxiYWNrOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIG9uRXJyb3JDYWxsYmFjazogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBvbkZhaWx1cmVDYWxsYmFjazogc3RyaW5nID0gXCJcIjsgICAgXHJcbiAgICAvL1xyXG4gICAgIFxyXG4gICAgY29uc3RydWN0b3Iodmlld0lkOnN0cmluZyxsaWJOYW1lOnN0cmluZyA9IFwiXCIpe1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVmlld0Zvcm1CaW5kaW5ncy4uLlwiKTtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwidmlld0lkOlwiK3ZpZXdJZCk7XHJcbiAgICAgICAgdGhpcy5pZCA9IHZpZXdJZDtcclxuICAgICAgICB0aGlzLl9saWJOYW1lID0gbGliTmFtZTtcclxuICAgICAgICB0aGlzLm9uU3VjY2Nlc3NDYWxsYmFjayA9IGxpYk5hbWUrXCIub25TdWJtaXRTdWNjZXNzKGRhdGEsXCIrbGliTmFtZStcIik7XCI7XHJcbiAgICAgICAgdGhpcy5vbkVycm9yQ2FsbGJhY2sgPSBsaWJOYW1lICsgXCIub25TdWJtaXRFcnJvcihkYXRhLFwiICsgbGliTmFtZSArIFwiKTtcIjsgXHJcbiAgICAgICAgdGhpcy5vbkZhaWx1cmVDYWxsYmFjayA9IGxpYk5hbWUgKyBcIi5vblN1Ym1pdEZhaWx1cmUoeGhyLFwiICsgbGliTmFtZSArIFwiKTtcIjsgXHJcbiAgICAgICAgLy8gIFxyXG4gICAgfSBcclxuXHJcbiAgICBwdWJsaWMgYmluZEZvcm1BamF4RXZlbnRzKHBhcmFtczpTYW9wVmlld0Zvcm1CaW5kaW5nc1BhcmFtc3RlcnMgPSBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImJpbmRWaWV3RXZlbnRzXCIpO1xyXG4gICAgICAgIHRoaXMuX0ZiUGFyYW1zID0gcGFyYW1zO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy5fZm9ybUZyYW1lID0gJCh0aGlzLmlkKTtcclxuICAgICAgICBpZiAodGhpcy5fZm9ybUZyYW1lID09IG51bGwpIHsgY29uc29sZS5sb2codGhpcy5pZCtcIiBub3QgZm91bmQhXCIpO307ICAgICAgICBcclxuICAgICAgICAvL1xyXG4gICAgICAgIGlmKHRoaXMuX0ZiUGFyYW1zICE9IG51bGwpe1xyXG4gICAgICAgICAgICB0aGlzLl93ZWJzaXRlVXJsID0gZ2V0UmVsYXRpdmVTaXRlVVJMKHRoaXMuX0ZiUGFyYW1zLmNvbnRyb2xsZXIpO1xyXG4gICAgICAgICAgICBpZihpc0VtcHR5KHRoaXMuX0ZiUGFyYW1zLmNvbnRyb2xsZXIpID09IGZhbHNlKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1GcmFtZS5hdHRyKFwiYXNwLWNvbnRyb2xsZXJcIiwgdGhpcy5fRmJQYXJhbXMuY29udHJvbGxlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoaXNFbXB0eSh0aGlzLl9GYlBhcmFtcy5hY3Rpb24pID09IGZhbHNlKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1GcmFtZS5hdHRyKFwiYXNwLWFjdGlvblwiLCB0aGlzLl9GYlBhcmFtcy5hY3Rpb24pO1xyXG4gICAgICAgICAgICB9ICBcclxuICAgICAgICAgICAgaWYoaXNFbXB0eSh0aGlzLl9GYlBhcmFtcy5hY3Rpb24pID09IGZhbHNlKXtcclxuICAgICAgICAgICAgICAgIHZhciBfYWN0aW9uID0gdGhpcy5fd2Vic2l0ZVVybCtcIi9cIit0aGlzLl9GYlBhcmFtcy5hY3Rpb247XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtRnJhbWUuYXR0cihcImFjdGlvblwiLCBfYWN0aW9uKTtcclxuICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMub25TdWNjY2Vzc0NhbGxiYWNrICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Zvcm1GcmFtZS5hdHRyKFwiZGF0YS1hamF4LXN1Y2Nlc3NcIiwgdGhpcy5vblN1Y2NjZXNzQ2FsbGJhY2spO1xyXG4gICAgICAgIH0gICAgICAgIFxyXG4gICAgICAgIGlmICh0aGlzLm9uU3VjY2Nlc3NDYWxsYmFjayAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLl9mb3JtRnJhbWUuYXR0cihcImRhdGEtYWpheC1zdWNjZXNzXCIsIHRoaXMub25TdWNjY2Vzc0NhbGxiYWNrKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub25FcnJvckNhbGxiYWNrICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Zvcm1GcmFtZS5hdHRyKFwiZGF0YS1hamF4LWVycm9yXCIsIHRoaXMub25FcnJvckNhbGxiYWNrKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub25GYWlsdXJlQ2FsbGJhY2sgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5fZm9ybUZyYW1lLmF0dHIoXCJkYXRhLWFqYXgtZmFpbHVyZVwiLCB0aGlzLm9uRmFpbHVyZUNhbGxiYWNrKTtcclxuICAgICAgICB9XHJcbiAgICB9ICAgIFxyXG5cclxuICAgIC8vICBcclxufVxyXG4iLCLvu78vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL2FsZXJ0aWZ5L2luZGV4LmQudHNcIiAvPlxyXG5pbXBvcnQgeyBnbG9iYWwsIHNldE1vZGFsRm9ybVpJbmRleCwgaXNFbXB0eSwgaXNVbkRlZmluZWQsIHNldEZpcnN0Rm9ybUNvbnRyb2xUb0ZvY3VzLGdldFNpdGVBYnNvbHV0ZVVSTCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFNlcnZpY2VzQ29yZSxTYW9wU2VydmljZXNDb3JlUGFyYW1zLCBTYW9wU2VydmljZXNDb3JlUmVzcG9uc2UsIFNhb3BTZXJ2aWNlc0NvcmVSZXN1bHQgfSBmcm9tICcuL3Nhb3Atc2VydmljZXMtY29yZSdcclxuaW1wb3J0IHsgU2FvcE1lc3NhZ2VEbGcsIFNhb3BNc2dEbGdCdXR0b24gfSBmcm9tICcuLi9Db21wb25lbnRzL3Nhb3AtbWVzc2FnZS1kbGcnO1xyXG5pbXBvcnQgeyBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vQ29yZS9zYW9wLXRyYW5zbGF0ZSc7XHJcbmltcG9ydCB7U2FvcEZsb2F0aW5nTGFiZWwgfSBmcm9tICcuLi9Db21wb25lbnRzL3Nhb3AtZmxvYXRpbmctbGFiZWwnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEVycm9yIHtcclxuICAgIHB1YmxpYyBDb2RlOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgTWVzc2FnZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgZW51bSBTYW9wV2ZBY3Rpb24ge1xyXG4gICAgd2ZhTm9uZSA9IDBcclxuICAgICx3ZmFBZGRSZWNvcmQgPSAxXHJcbiAgICAsd2ZhRWRpdFJlY29yZCA9IDJcclxuICAgICx3ZmFEZWxldGVSZWNvcmQgPSAzXHJcbiAgICAsd2ZhUmVjb3JkRGVzdGFpbHMgPSA0XHJcbiAgICAsd2ZhQ3VzdG9tSHRtbCA9IDVcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wV2ZTdWJtaXRSZXN1bHQge1xyXG4gICAgc3VjY2Vzczpib29sZWFuO1xyXG4gICAgdmlld0NvbnRlbnQ6c3RyaW5nO1xyXG4gICAgcmVkaXJlY3RUbzpzdHJpbmc7XHJcbiAgICBhbGVydE1lc3NhZ2U6IHN0cmluZztcclxuICAgIGRhdGE6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BWaWV3Rm9ybSB7XHJcbiAgICBwcml2YXRlIF92aWV3TW9kYWxGcmFtZTpKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gICAgcHJpdmF0ZSBfdmlld01vZGFsQm9keTpKUXVlcnk8SFRNTEVsZW1lbnQ+OyAgICBcclxuICAgIHByaXZhdGUgX3ZpZXdfdGl0bGU6SlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIHByaXZhdGUgX3ZpZXdfYnRuT2s6SlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIHByaXZhdGUgX3ZpZXdfYnRuQ2FuY2VsOkpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgICBwcml2YXRlIF9zZXJ2aWNlc1BhcmFtczpTYW9wU2VydmljZXNDb3JlUGFyYW1zID0ge2FjdGlvbjpudWxsLGRhdGE6bnVsbCx0eXBlOlwiUE9TVFwifTtcclxuICAgIHByaXZhdGUgX3Rlcm1pbm9sb2d5OiBzdHJpbmdbXTtcclxuICAgIHByaXZhdGUgX3ByZXBhcmVWaWV3OmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX2RhdGE6YW55O1xyXG4gICAgcHJpdmF0ZSBfbW9kYWxQYXJlbnQ6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLy9cclxuICAgIHB1YmxpYyBfbGliTmFtZTpzdHJpbmc7ICAgIFxyXG4gICAgcHVibGljIHNhb3BTZXJ2aWNlc0NvcmU6U2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICBwdWJsaWMgdHJhbnNsYXRpb25TZXJ2aWNlOlNhb3BUcmFuc2xhdGlvblNlcnZpY2U7XHJcbiAgICBwdWJsaWMgY29udGVudEVsZW1lbnRJZCA9IFwiLnNhb3AtbW9kYWwtYm9keS1lbGVtZW50XCI7ICAgIFxyXG4gICAgcHVibGljIGFkZFJlY29yZEVuZHBvaW50OiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIGVkaXRSZWNvcmRFbmRwb2ludDogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBkZWxldGVSZWNvcmRFbmRwb2ludDogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBzYW9wRmxvYXRpbmdMYWJlbDogU2FvcEZsb2F0aW5nTGFiZWw7XHJcbiAgICAvL1xyXG4gICAgcHVibGljIG9uU3VjY2Nlc3NDYWxsYmFjazogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBvbkVycm9yQ2FsbGJhY2s6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgb25GYWlsdXJlQ2FsbGJhY2s6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAvLyAgICBcclxuICAgIHB1YmxpYyBpZDpzdHJpbmc7XHJcbiAgICBwdWJsaWMgdGl0bGU6c3RyaW5nO1xyXG4gICAgcHVibGljIGZ1bGxUaXRsZTpzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIGZ1bGxTY3JlZW46Ym9vbGVhbiA9IGZhbHNlOyBcclxuICAgIC8vXHJcbiAgICBwdWJsaWMgb25DbG9zZTogKHBhcmFtczphbnkpID0+IGFueSA9IG51bGw7XHJcbiAgICBwdWJsaWMgb25TdWJtaXQ6IChwYXJhbXM6YW55KSA9PiBhbnkgPSBudWxsO1xyXG4gICAgcHVibGljIG9uRXJyb3I6IChwYXJhbXM6YW55KSA9PiBhbnkgPSBudWxsOyAgXHJcbiAgICBcclxuICAgIGNvbnN0cnVjdG9yKHZpZXdJZDpzdHJpbmcsbGliTmFtZTpzdHJpbmcgPSBcIlwiKXtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFZpZXdGb3JtLi4uXCIpO1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJ2aWV3SWQ6XCIrdmlld0lkKTtcclxuICAgICAgICB0aGlzLmlkID0gdmlld0lkO1xyXG4gICAgICAgIHRoaXMuX2xpYk5hbWUgPSBsaWJOYW1lO1xyXG4gICAgICAgIHRoaXMub25TdWNjY2Vzc0NhbGxiYWNrID0gbGliTmFtZStcIi5vblN1Ym1pdFN1Y2Nlc3MoZGF0YSxcIitsaWJOYW1lK1wiKTtcIjtcclxuICAgICAgICB0aGlzLm9uRXJyb3JDYWxsYmFjayA9IGxpYk5hbWUgKyBcIi5vblN1Ym1pdEVycm9yKGRhdGEsXCIgKyBsaWJOYW1lICsgXCIpO1wiOyBcclxuICAgICAgICB0aGlzLm9uRmFpbHVyZUNhbGxiYWNrID0gbGliTmFtZSArIFwiLm9uU3VibWl0RmFpbHVyZSh4aHIsXCIgKyBsaWJOYW1lICsgXCIpO1wiOyBcclxuICAgICAgICB0aGlzLnRyYW5zbGF0aW9uU2VydmljZSA9IG5ldyBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlKCk7XHJcbiAgICAgICAgdGhpcy5zYW9wRmxvYXRpbmdMYWJlbCA9IG5ldyBTYW9wRmxvYXRpbmdMYWJlbCgpO1xyXG4gICAgICAgIC8vICBcclxuICAgIH1cclxuXHJcbiAgICBnZXREYXRhKCk6YW55IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0VGVybWlub2xvZ3lMaXN0KGRpY3Rpb25hcnk6IHN0cmluZ1tdID0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuX3Rlcm1pbm9sb2d5ID0gW1wiVXJlZGlcIixcIk5vdiB2bm9zXCIsXCJQb2Ryb2Jub3N0aVwiLFwiQnJpc2FuamVcIl07XHJcbiAgICAgICAgaWYgKGRpY3Rpb25hcnkgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5vbG9neSA9IHRoaXMuX3Rlcm1pbm9sb2d5LmNvbmNhdChkaWN0aW9uYXJ5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50cmFuc2xhdGlvblNlcnZpY2Uuc2V0VHJhbnNsYXRpb25zTGlzdCh0aGlzLl90ZXJtaW5vbG9neSk7XHJcbiAgICB9ICAgICBcclxuXHJcbiAgICBwdWJsaWMgb25CdG5Pa0NsaWNrKHNlbmRlcjphbnkpOnZvaWR7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIm9uQnRuT2tDbGljay4uLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25CdG5DYW5jZWwoc2VuZGVyOmFueSk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwib25CdG5DYW5jZWwuLi5cIik7XHJcbiAgICB9ICAgIFxyXG5cclxuICAgIHB1YmxpYyBiZWZvcmVWaWV3U2hvdyhzZW5kZXI6YW55KTp2b2lke1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcodGhpcy5pZCtcIi5iZWZvcmVWaWV3U2hvdygpXCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuX3ZpZXdNb2RhbEZyYW1lID0gJCh0aGlzLmlkKTtcclxuICAgICAgICBpZiAodGhpcy5fdmlld01vZGFsRnJhbWUgPT0gbnVsbCkgeyBjb25zb2xlLmxvZyh0aGlzLmlkK1wiIG5vdCBmb3VuZCFcIik7fTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIHZhciBjb250ZW50U2VsID0gdGhpcy5pZCArIFwiIFwiICsgdGhpcy5jb250ZW50RWxlbWVudElkO1xyXG4gICAgICAgIHRoaXMuX3ZpZXdNb2RhbEJvZHkgPSAkKGNvbnRlbnRTZWwpOyAgIFxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZnRlclZpZXdTaG93KHNlbmRlcjphbnksd2ZBY3Rpb246U2FvcFdmQWN0aW9uKTp2b2lke1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcodGhpcy5pZCtcIi5hZnRlclZpZXdTaG93KClcIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIHRoaXMuYmluZFZpZXdFdmVudHMoc2VuZGVyKTtcclxuXHJcbiAgICAgICAgLy8gbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICAvLyB0aGlzLl92aWV3X2J0bk9rID0gJChcIlwiK3RoaXMuaWQrXCIgKj4gI2J0bk9rXCIpO1xyXG4gICAgICAgIC8vIHRoaXMuX3ZpZXdfYnRuQ2FuY2VsID0gJChcIlwiK3RoaXMuaWQrXCIgKj4gI2J0bkNhbmNlbFwiKTtcclxuICAgICAgICAvLyB0aGlzLl92aWV3X3RpdGxlID0gJChcIlwiK3RoaXMuaWQrXCIgKj4gI2V4YW1wbGVNb2RhbExvbmdUaXRsZVwiKTtcclxuICAgICAgICAvL1xyXG5cclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiYWZ0ZXJWaWV3U2hvdyB0aXRsZTpcIisgdGhpcy50aXRsZSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmZ1bGxUaXRsZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGl0bGUgPSB0aGlzLmZ1bGxUaXRsZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghaXNFbXB0eSh0aGlzLnRpdGxlKSl7XHJcbiAgICAgICAgICAgIGxldCBfdGl0bGUgPSBcIlwiO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mdWxsVGl0bGUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgX3RpdGxlID0gdGhpcy50aXRsZTtcclxuICAgICAgICAgICAgfWVsc2UgaWYgKHdmQWN0aW9uID09IFNhb3BXZkFjdGlvbi53ZmFBZGRSZWNvcmQpe1xyXG4gICAgICAgICAgICAgICAgX3RpdGxlID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiTm92IHZub3NcIikrXCI6IFwiK3RoaXMudGl0bGU7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYUVkaXRSZWNvcmQpe1xyXG4gICAgICAgICAgICAgICAgX3RpdGxlID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiVXJlZGlcIikrXCI6IFwiK3RoaXMudGl0bGU7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYVJlY29yZERlc3RhaWxzKXsgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBfdGl0bGUgPSB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJQb2Ryb2Jub3N0aVwiKStcIjogXCIrdGhpcy50aXRsZTtcclxuICAgICAgICAgICAgfSBcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImFmdGVyVmlld1Nob3cgX3RpdGxlOlwiKyBfdGl0bGUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fdmlld190aXRsZS5odG1sKF90aXRsZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHdmQWN0aW9uID09IFNhb3BXZkFjdGlvbi53ZmFBZGRSZWNvcmQpe1xyXG4gICAgICAgICAgICAgICAgbGV0IGRlZmF1bHRUaXRsZUFkZCA9ICQoXCJcIit0aGlzLmlkK1wiICo+ICNhZGRUaXRsZVwiKS52YWwoKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmlld190aXRsZS5odG1sKGRlZmF1bHRUaXRsZUFkZCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZGVmYXVsdFRpdGxlRWRpdCA9ICQoXCJcIit0aGlzLmlkK1wiICo+ICNlZGl0VGl0bGVcIikudmFsKCkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdfdGl0bGUuaHRtbChkZWZhdWx0VGl0bGVFZGl0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy52aWV3U2hvd0NvbXBsZXRlKHNlbmRlciwgd2ZBY3Rpb24pO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgLy8gdGhpcy5fdmlld19idG5Pay5jbGljayhcclxuICAgICAgICAvLyAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIC8vICAgICAgICAgX3RoaXMub25CdG5Pa0NsaWNrKHNlbmRlcik7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyApO1xyXG5cclxuICAgICAgICAvLyB0aGlzLl92aWV3X2J0bkNhbmNlbC5jbGljayhcclxuICAgICAgICAvLyAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIC8vICAgICAgICAgX3RoaXMub25CdG5DYW5jZWwoc2VuZGVyKTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vICk7ICAgICAgICBcclxuICAgIFxyXG4gICAgICAgIC8vdGhpcy5iaW5kVmlld0V2ZW50cygpO1xyXG5cclxuICAgICAgICB0aGlzLl9tb2RhbFBhcmVudCA9ICQoXCJib2R5XCIpLmhhc0NsYXNzKFwibW9kYWwtb3BlblwiKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3ByZXBhcmVWaWV3ID09IGZhbHNlKXtcclxuICAgICAgICAgICAgdGhpcy5fdmlld01vZGFsRnJhbWUubW9kYWwoJ3Nob3cnKTtcclxuICAgICAgICAgICAgc2V0TW9kYWxGb3JtWkluZGV4KHRoaXMuaWQpOyBcclxuICAgICAgICAgICAgc2V0Rmlyc3RGb3JtQ29udHJvbFRvRm9jdXModGhpcy5pZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy5hZnRlclZpZXdTaG93U3VjY2VzcyhzZW5kZXIpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWZ0ZXJWaWV3U2hvd1N1Y2Nlc3Moc2VuZGVyOmFueSk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKHRoaXMuaWQgKyBcIi5hZnRlclZpZXdTaG93U3VjY2VzcygpXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB2aWV3U2hvd0NvbXBsZXRlKHNlbmRlcjogYW55LCB3ZkFjdGlvbjogU2FvcFdmQWN0aW9uKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1Zyh0aGlzLmlkICsgXCIudmlld1Nob3dDb21wbGV0ZSgpXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB2aWV3U2hvd25Db21wbGV0ZShzZW5kZXI6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcodGhpcy5pZCArIFwiLnZpZXdTaG93bkNvbXBsZXRlKClcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGJpbmRWaWV3RXZlbnRzKHNlbmRlcjphbnkpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiYmluZFZpZXdFdmVudHNcIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgbGV0IGRpdkZvcm0gPSB0aGlzLl92aWV3TW9kYWxGcmFtZS5maW5kKFwiZm9ybVwiKTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLl92aWV3X2J0bk9rID0gJChcIlwiK3RoaXMuaWQrXCIgKj4gI2J0bk9rXCIpO1xyXG4gICAgICAgIHRoaXMuX3ZpZXdfYnRuQ2FuY2VsID0gJChcIlwiK3RoaXMuaWQrXCIgKj4gI2J0bkNhbmNlbFwiKTtcclxuICAgICAgICB0aGlzLl92aWV3X3RpdGxlID0gJChcIlwiK3RoaXMuaWQrXCIgKj4gI2V4YW1wbGVNb2RhbExvbmdUaXRsZVwiKTsgICAgICAgIFxyXG5cclxuICAgICAgICB0aGlzLl92aWV3X2J0bk9rLmNsaWNrKFxyXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5vbkJ0bk9rQ2xpY2soc2VuZGVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMuX3ZpZXdfYnRuQ2FuY2VsLmNsaWNrKFxyXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5vbkJ0bkNhbmNlbChzZW5kZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTsgIFxyXG5cclxuICAgICAgICBpZiAodGhpcy5vblN1Y2NjZXNzQ2FsbGJhY2sgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgZGl2Rm9ybS5hdHRyKFwiZGF0YS1hamF4LXN1Y2Nlc3NcIiwgdGhpcy5vblN1Y2NjZXNzQ2FsbGJhY2spO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5vbkVycm9yQ2FsbGJhY2sgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgZGl2Rm9ybS5hdHRyKFwiZGF0YS1hamF4LWVycm9yXCIsIHRoaXMub25FcnJvckNhbGxiYWNrKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub25GYWlsdXJlQ2FsbGJhY2sgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgZGl2Rm9ybS5hdHRyKFwiZGF0YS1hamF4LWZhaWx1cmVcIiwgdGhpcy5vbkZhaWx1cmVDYWxsYmFjayk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuX3ZpZXdNb2RhbEZyYW1lLm9uKCdoaWRkZW4uYnMubW9kYWwnLCBmdW5jdGlvbiAoZSkgeyAgICAgXHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5fbW9kYWxQYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgICQoXCJib2R5XCIpLmFkZENsYXNzKFwibW9kYWwtb3BlblwiKTtcclxuICAgICAgICAgICAgfSAgICBcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICB0aGlzLl92aWV3TW9kYWxGcmFtZS5vbignc2hvd24uYnMubW9kYWwnLCBmdW5jdGlvbihlKSB7IFxyXG4gICAgICAgICAgICBfdGhpcy52aWV3U2hvd25Db21wbGV0ZShlKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5zYW9wRmxvYXRpbmdMYWJlbC5pbml0KCk7ICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlbmRlckVycm9yc0Jhbm5lcihlcnJvcnM6RXJyb3JbXSk6U2FvcFNlcnZpY2VzQ29yZVJlc3BvbnNlIHtcclxuICAgICAgICBsZXQgcmVzdWx0OlNhb3BTZXJ2aWNlc0NvcmVSZXNwb25zZTtcclxuICAgICAgICByZXN1bHQgPSB7cmVzcG9uc2U6U2FvcFNlcnZpY2VzQ29yZVJlc3VsdC5lcnJvcixkYXRhOm51bGx9OyBcclxuICAgICAgICAvL1xyXG4gICAgICAgIGxldCBqc29uRGF0YSA9IEpTT04uc3RyaW5naWZ5KGVycm9ycyk7XHJcbiAgICAgICAgbGV0IF9kYXRhID0ge2pzb25JbnB1dDpqc29uRGF0YX07ICAgICAgICBcclxuICAgICAgICAvL1xyXG4gICAgICAgIGxldCBfc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICAgICAgX3Nhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJTdWNjZXNzID0gZnVuY3Rpb24gKHJlc3BvbnNlOlNhb3BTZXJ2aWNlc0NvcmVSZXNwb25zZSkge1xyXG4gICAgICAgICAgICByZXN1bHQgPSByZXNwb25zZTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIF9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246IFwiRXJyb3JzL1JlbmRlckVycm9yc0Jhbm5lclwiXHJcbiAgICAgICAgICAgICwgdHlwZTogXCJQT1NUXCJcclxuICAgICAgICAgICAgLCBkYXRhOiBfZGF0YVxyXG4gICAgICAgICAgICAsIGFzeW5jOiBmYWxzZVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZW5kZXJFcnJvcihlcnJNZXNzYWdlOnN0cmluZyk6dm9pZHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiYWpheC5hZnRlckVycm9yXCIpO1xyXG4gICAgICAgICAgICBsZXQgX2Vycm9yczpFcnJvcltdO1xyXG4gICAgICAgICAgICBfZXJyb3JzID0gW3tDb2RlOlwiXCIsTWVzc2FnZTplcnJNZXNzYWdlfV07ICAgICAgICAgIFxyXG4gICAgICAgICAgICBsZXQgX3BhcmVudFZpZXcgPSAkKHRoaXMuaWQpLnBhcmVudCgpO1xyXG4gICAgICAgICAgICBsZXQgX2Vycm9yQmFubmVySWQgPSB0aGlzLmlkK1wiRXJyb3JCYW5uZXJcIjtcclxuICAgICAgICAgICAgbGV0IF92aWV3X2Jhbm5lciA9IF9wYXJlbnRWaWV3LmZpbmQoX2Vycm9yQmFubmVySWQpO1xyXG4gICAgICAgICAgICBpZiAoIGlzVW5EZWZpbmVkKF92aWV3X2Jhbm5lcikgfHwgX3ZpZXdfYmFubmVyLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBfcGFyZW50Vmlldy5hcHBlbmQoXCI8ZGl2IGlkPVwiICsgX2Vycm9yQmFubmVySWQucmVwbGFjZShcIiNcIixcIlwiKSArIFwiPjwvZGl2PlwiKTtcclxuICAgICAgICAgICAgICAgIF92aWV3X2Jhbm5lciA9IF9wYXJlbnRWaWV3LmZpbmQoX2Vycm9yQmFubmVySWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBfYmFubmVyUmVzdWx0ID0gdGhpcy5yZW5kZXJFcnJvcnNCYW5uZXIoX2Vycm9ycyk7XHJcbiAgICAgICAgICAgIF92aWV3X2Jhbm5lci5odG1sKF9iYW5uZXJSZXN1bHQuZGF0YS52aWV3Q29udGVudCk7ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaChlcnIpIHtcclxuICAgICAgICAgICAgYWxlcnQoZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgIH0gIFxyXG4gICAgfVxyXG4gICAgLy9wdWJsaWMgbG9hZFZpZXdCb2R5KHdmQWN0aW9uOlNhb3BXZkFjdGlvbixkYXRhOmFueSxzZW5kZXI6YW55KTpTYW9wU2VydmljZXNDb3JlUmVzdWx0e1xyXG4gICAgcHVibGljIGxvYWRWaWV3Qm9keSh3ZkFjdGlvbjpTYW9wV2ZBY3Rpb24sZGF0YTphbnksc2VuZGVyOmFueSk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwibG9hZFZpZXdCb2R5XCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5iZWZvcmVWaWV3U2hvdyhzZW5kZXIpO1xyXG5cclxuICAgICAgICBpZiAod2ZBY3Rpb24gIT0gU2FvcFdmQWN0aW9uLndmYUN1c3RvbUh0bWwpIHtcclxuICAgICAgICAgICAgbGV0IF9hamF4QWN0aW9uID0gd2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYUFkZFJlY29yZCA/IHRoaXMuYWRkUmVjb3JkRW5kcG9pbnQgOiB0aGlzLmVkaXRSZWNvcmRFbmRwb2ludDtcclxuICAgICAgICAgICAgLy9fYWpheEFjdGlvbiA9IGdldFNpdGVBYnNvbHV0ZVVSTChfYWpheEFjdGlvbik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9zZXJ2aWNlc1BhcmFtcyA9IHthY3Rpb246X2FqYXhBY3Rpb24sZGF0YTpkYXRhLHR5cGU6XCJQT1NUXCJ9O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zYW9wU2VydmljZXNDb3JlLmFmdGVyU3VjY2VzcyA9IGZ1bmN0aW9uKF9hamF4UmVzdWx0KXtcclxuICAgICAgICAgICAgICAgIGlmIChfYWpheFJlc3VsdC5yZXNwb25zZSA9PSBTYW9wU2VydmljZXNDb3JlUmVzdWx0LnN1Y2Nlc3Mpe1xyXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJhamF4LnN1Y2Nlc3NcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3ZpZXdNb2RhbEJvZHkuaHRtbChfYWpheFJlc3VsdC5kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5hZnRlclZpZXdTaG93KHNlbmRlcix3ZkFjdGlvbik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJhamF4LmVycm9yXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgoaXNVbkRlZmluZWQoX2FqYXhSZXN1bHQuZGF0YSkgJiYgaXNVbkRlZmluZWQoX2FqYXhSZXN1bHQuZGF0YS5hbGVydE1lc3NhZ2UpKSA9PSBmYWxzZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnJlbmRlckVycm9yKF9hamF4UmVzdWx0LmRhdGEuYWxlcnRNZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKF9hamF4UmVzdWx0LmRhdGEucmVzcG9uc2VKU09OICYmIF9hamF4UmVzdWx0LmRhdGEucmVzcG9uc2VKU09OLm1lc3NhZ2Upe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGVydGlmeS5lcnJvcihfYWpheFJlc3VsdC5kYXRhLnJlc3BvbnNlSlNPTi5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfTtcclxuICAgIFxyXG4gICAgICAgICAgICB0aGlzLnNhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJFcnJvciA9IGZ1bmN0aW9uKF9hamF4UmVzdWx0KXtcclxuICAgIC8vIyMjXHJcbiAgICAgICAgICAgICAgICBpZiAoKGlzVW5EZWZpbmVkKF9hamF4UmVzdWx0LmRhdGEpICYmIGlzVW5EZWZpbmVkKF9hamF4UmVzdWx0LmRhdGEuYWxlcnRNZXNzYWdlKSkgPT0gZmFsc2Upe1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnJlbmRlckVycm9yKF9hamF4UmVzdWx0LmRhdGEuYWxlcnRNZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWxlcnQoXCJJbnRlcm5hbCBlcnJvciFcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICBcclxuICAgICAgICAgICAgdGhpcy5zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24odGhpcy5fc2VydmljZXNQYXJhbXMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghaXNVbkRlZmluZWQoZGF0YSkgJiYgIWlzVW5EZWZpbmVkKGRhdGEuaHRtbCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdNb2RhbEJvZHkuaHRtbChkYXRhLmh0bWwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF90aGlzLmFmdGVyVmlld1Nob3coc2VuZGVyLHdmQWN0aW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSAgICBcclxuXHJcbiAgICBwdWJsaWMgYWZ0ZXJTdWJtaXRTdWNjZXNzKHJlc3VsdDogU2FvcFdmU3VibWl0UmVzdWx0KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInN1Ym1pdC5hZnRlckV4ZWN1dGVTdWNjZXNzXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblN1Ym1pdFN1Y2Nlc3NDb21wbGV0ZShyZXN1bHQ6IFNhb3BXZlN1Ym1pdFJlc3VsdCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzdWJtaXQub25TdWJtaXRTdWNjZXNzQ29tcGxldGVcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uU3VibWl0RXJyb3IocmVzdWx0OiBTYW9wV2ZTdWJtaXRSZXN1bHQpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic3VibWl0Lm9uU3VibWl0RXJyb3JcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uU3VibWl0RmFpbHVyZShyZXN1bHQ6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzdWJtaXQub25TdWJtaXRGYWlsdXJlXCIpO1xyXG4gICAgICAgIHZhciBzYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLmhhbmRsZVN1Ym1pdEVycm9yKHJlc3VsdCk7XHJcbiAgICB9XHJcbiBcclxuICAgIHB1YmxpYyBvblN1Ym1pdFN1Y2Nlc3MocmVzdWx0OiBTYW9wV2ZTdWJtaXRSZXN1bHQpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic3VibWl0Lm9uRXhlY3V0ZVN1Y2Nlc3NcIik7XHJcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzdWJtaXQuc3VjY2Vzc1wiKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdNb2RhbEZyYW1lLm1vZGFsKCdoaWRlJyk7XHJcblxyXG4gICAgICAgICAgICAvLyBqdXN0IGluIGNhc2U6IG9kc3RyYW5pLCDEjWUgamUgxaFlIHZlZG5vIHZpZG5vLCBhdnRvbWF0c2tvIHNlIG5lIHphcHJlIHZlZG5vIDooXHJcbiAgICAgICAgICAgICQoJy5tb2RhbC1iYWNrZHJvcCcpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAkKGRvY3VtZW50LmJvZHkpLnJlbW92ZUNsYXNzKFwibW9kYWwtb3BlblwiKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQuYWxlcnRNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICBhbGVydGlmeS5tZXNzYWdlKHJlc3VsdC5hbGVydE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9ICBcclxuXHJcbiAgICAgICAgICAgIGlmICghaXNVbkRlZmluZWQodGhpcy5yZWZyZXNoRGF0YSkpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoRGF0YShyZXN1bHQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9uU3VibWl0U3VjY2Vzc0NvbXBsZXRlKHJlc3VsdCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInN1Ym1pdC5lcnJvclwiKTtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInJlbG9hZCB2aWV3IGZvcm1cIik7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdNb2RhbEJvZHkuaHRtbChyZXN1bHQudmlld0NvbnRlbnQpO1xyXG4gICAgICAgICAgICB0aGlzLmJpbmRWaWV3RXZlbnRzKHJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWZ0ZXJTdWJtaXRTdWNjZXNzKHJlc3VsdCk7XHJcbiAgICB9ICAgIFxyXG5cclxuICAgIHB1YmxpYyBvbkRlbGV0ZVJlY29yZChkZWxldGVEYXRhOmFueSk6dm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIm9uRGVsZXRlUmVjb3JkXCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5fc2VydmljZXNQYXJhbXMgPSB7YWN0aW9uOnRoaXMuZGVsZXRlUmVjb3JkRW5kcG9pbnQsZGF0YTpkZWxldGVEYXRhLHR5cGU6XCJQT1NUXCJ9O1xyXG5cclxuICAgICAgICB0aGlzLnNhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJTdWNjZXNzID0gZnVuY3Rpb24oX2FqYXhSZXN1bHQpe1xyXG4gICAgICAgICAgICBpZiAoX2FqYXhSZXN1bHQucmVzcG9uc2UgPT0gU2FvcFNlcnZpY2VzQ29yZVJlc3VsdC5zdWNjZXNzKXtcclxuICAgICAgICAgICAgICAgIGFsZXJ0aWZ5Lm1lc3NhZ2UoX2FqYXhSZXN1bHQuZGF0YS5hbGVydE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpc1VuRGVmaW5lZChfdGhpcy5yZWZyZXNoRGF0YSkpe1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnJlZnJlc2hEYXRhKGRlbGV0ZURhdGEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYWxlcnRpZnkuZXJyb3IoX2FqYXhSZXN1bHQuZGF0YS5hbGVydE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnNhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih0aGlzLl9zZXJ2aWNlc1BhcmFtcyk7XHJcblxyXG4gICAgICAgIC8vIGxldCBfYWpheFJlc3VsdCA9IHRoaXMuc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHRoaXMuX3NlcnZpY2VzUGFyYW1zKTtcclxuICAgICAgICAvLyBpZiAoX2FqYXhSZXN1bHQucmVzcG9uc2UgPT0gU2FvcFNlcnZpY2VzQ29yZVJlc3VsdC5zdWNjZXNzKXtcclxuICAgICAgICAvLyAgICAgYWxlcnRpZnkubWVzc2FnZShfYWpheFJlc3VsdC5kYXRhLmFsZXJ0TWVzc2FnZSk7XHJcbiAgICAgICAgLy8gICAgIGlmICghaXNVbkRlZmluZWQodGhpcy5yZWZyZXNoRGF0YSkpe1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5yZWZyZXNoRGF0YShkZWxldGVEYXRhKTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgIGFsZXJ0aWZ5LmVycm9yKF9hamF4UmVzdWx0LmRhdGEuYWxlcnRNZXNzYWdlKTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gcmV0dXJuIF9hamF4UmVzdWx0LnJlc3BvbnNlO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBwdWJsaWMgcmVmcmVzaERhdGEoc2VuZGVyOmFueSk6dm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInJlZnJlc2hEYXRhXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkZWxldGVSZWNvcmQodGl0bGU6c3RyaW5nLG1lc3NhZ2U6c3RyaW5nLGRlbGV0ZURhdGE6YW55KTp2b2lke1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJkZWxldGVSZWNvcmQuYmVnaW5cIik7XHJcbiAgICAgICAgbGV0IHNhb3BNZXNzYWdlRGxnID0gbmV3IFNhb3BNZXNzYWdlRGxnKGRlbGV0ZURhdGEpICBcclxuICAgICAgICBzYW9wTWVzc2FnZURsZy5vblllcyA9IHRoaXMub25EZWxldGVSZWNvcmQuYmluZCh0aGlzKTtcclxuICAgICAgICBzYW9wTWVzc2FnZURsZy5TaG93KG1lc3NhZ2UsdGl0bGUsMSxbU2FvcE1zZ0RsZ0J1dHRvbi5tYlllcyxTYW9wTXNnRGxnQnV0dG9uLm1iTm9dKTtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiZGVsZXRlUmVjb3JkLmVuZFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkUmVjb3JkKGRhdGE6YW55LHNlbmRlcjphbnkgPSBudWxsKTp2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiYWRkUmVjb3JkXCIpO1xyXG4gICAgICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xyXG4gICAgICAgIGxldCBfcmVzdWx0ID0gdGhpcy5sb2FkVmlld0JvZHkoU2FvcFdmQWN0aW9uLndmYUFkZFJlY29yZCxkYXRhLHNlbmRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGVkaXRSZWNvcmQoZGF0YTphbnksc2VuZGVyOmFueSA9IG51bGwpOnZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJlZGl0UmVjb3JkXCIpO1xyXG4gICAgICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMubG9hZFZpZXdCb2R5KFNhb3BXZkFjdGlvbi53ZmFFZGl0UmVjb3JkLGRhdGEsc2VuZGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVjb3JkRGV0YWlscyhkYXRhOmFueSxzZW5kZXI6YW55ID0gbnVsbCk6dm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImVkaXRSZWNvcmRcIik7XHJcbiAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy5sb2FkVmlld0JvZHkoU2FvcFdmQWN0aW9uLndmYVJlY29yZERlc3RhaWxzLGRhdGEsc2VuZGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY3VzdG9uSHRtbEJvZHkoZGF0YTphbnksc2VuZGVyOmFueSA9IG51bGwpOnZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjdXN0b25IdG1sQm9keVwiKTtcclxuICAgICAgICB0aGlzLl9kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLmxvYWRWaWV3Qm9keShTYW9wV2ZBY3Rpb24ud2ZhQ3VzdG9tSHRtbCxkYXRhLHNlbmRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHVibGljIHJlY29yZFByZXZpZXcoZGF0YTphbnksc2VuZGVyOmFueSA9IG51bGwpOnZvaWQge1xyXG4gICAgLy8gICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJlZGl0UmVjb3JkXCIpO1xyXG4gICAgLy8gICAgIHRoaXMubG9hZFZpZXdCb2R5KFNhb3BXZkFjdGlvbi53ZmFQcmVwYXJlVmlldyxkYXRhLHNlbmRlcik7XHJcbiAgICAvLyB9ICAgIFxyXG5cclxuICAgIHB1YmxpYyBzaG93Vmlld0Zvcm0od2ZBY3Rpb246U2FvcFdmQWN0aW9uLGRhdGE6YW55LHNlbmRlcjphbnkgPSBudWxsKTp2b2lke1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzaG93Vmlld0Zvcm1cIik7XHJcbiAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgaWYgKHdmQWN0aW9uID09IFNhb3BXZkFjdGlvbi53ZmFBZGRSZWNvcmQpIHtcclxuICAgICAgICAgICAgdGhpcy5hZGRSZWNvcmQoZGF0YSxzZW5kZXIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAod2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYUVkaXRSZWNvcmQpIHtcclxuICAgICAgICAgICAgdGhpcy5lZGl0UmVjb3JkKGRhdGEsc2VuZGVyKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHdmQWN0aW9uID09IFNhb3BXZkFjdGlvbi53ZmFSZWNvcmREZXN0YWlscykgeyAgXHJcbiAgICAgICAgICAgIHRoaXMucmVjb3JkRGV0YWlscyhkYXRhLHNlbmRlcik7ICAgICAgICAgIFxyXG4gICAgICAgIH0gZWxzZSBpZiAod2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYUN1c3RvbUh0bWwpIHtcclxuICAgICAgICAgICAgdGhpcy5jdXN0b25IdG1sQm9keShkYXRhLHNlbmRlcik7ICAgICAgICAgIFxyXG4gICAgICAgIH0gICAgICAgIFxyXG4gICAgICAgIHRoaXMuU2V0VG9GdWxsU2NyZWVuKCk7ICAgICAgXHJcbiAgICB9ICBcclxuXHJcbiAgICBwdWJsaWMgcHJlcGFyZVZpZXdGb3JtKHdmQWN0aW9uOlNhb3BXZkFjdGlvbixkYXRhOmFueSxzZW5kZXI6YW55ID0gbnVsbCk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic2hvd1ZpZXdGb3JtXCIpO1xyXG4gICAgICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMuX3ByZXBhcmVWaWV3ID0gdHJ1ZTtcclxuICAgICAgICBpZiAod2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYUFkZFJlY29yZCkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZFJlY29yZChkYXRhLHNlbmRlcik7XHJcbiAgICAgICAgfSBlbHNlIGlmICh3ZkFjdGlvbiA9PSBTYW9wV2ZBY3Rpb24ud2ZhRWRpdFJlY29yZCkge1xyXG4gICAgICAgICAgICB0aGlzLmVkaXRSZWNvcmQoZGF0YSxzZW5kZXIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAod2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYVJlY29yZERlc3RhaWxzKSB7ICBcclxuICAgICAgICAgICAgdGhpcy5yZWNvcmREZXRhaWxzKGRhdGEsc2VuZGVyKTsgICAgICAgICAgXHJcbiAgICAgICAgfSBlbHNlIGlmICh3ZkFjdGlvbiA9PSBTYW9wV2ZBY3Rpb24ud2ZhQ3VzdG9tSHRtbCkge1xyXG4gICAgICAgICAgICB0aGlzLmN1c3Rvbkh0bWxCb2R5KGRhdGEsc2VuZGVyKTsgICAgICAgICAgXHJcbiAgICAgICAgfSBcclxuXHJcbiAgICAgICAgdGhpcy5TZXRUb0Z1bGxTY3JlZW4oKTsgICAgICBcclxuICAgIH0gIFxyXG5cclxuICAgIHB1YmxpYyBTZXRUb0Z1bGxTY3JlZW4oKXtcclxuICAgICAgICBpZiAodGhpcy5mdWxsU2NyZWVuICl7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdNb2RhbEZyYW1lLmFkZENsYXNzKFwic2FvcC1tb2RhbC1mdWxsc2NyZWVuLWZvcm1cIik7XHJcbiAgICAgICAgICAgIGxldCBfZGlhbG9nRGl2ID0gdGhpcy5fdmlld01vZGFsRnJhbWUuZmluZChcIi5tb2RhbC1kaWFsb2dcIik7XHJcbiAgICAgICAgICAgIF9kaWFsb2dEaXYucmVtb3ZlQ2xhc3MoJ21vZGFsLWRpYWxvZy1jZW50ZXJlZCcpO1xyXG4gICAgICAgICAgICBfZGlhbG9nRGl2LmFkZENsYXNzKCdtb2RhbC1mdWxsc2NyZWVuJyk7XHJcbiAgICAgICAgICAgIF9kaWFsb2dEaXYucmVtb3ZlQXR0cignc3R5bGUnKTtcclxuICAgIFxyXG4gICAgICAgICAgICBsZXQgX2NvbnRlbnQgPSB0aGlzLl92aWV3TW9kYWxGcmFtZS5maW5kKFwiLm1vZGFsLWNvbnRlbnRcIik7XHJcbiAgICAgICAgICAgIF9jb250ZW50LnJlbW92ZUF0dHIoJ2NsYXNzJyk7XHJcbiAgICAgICAgICAgIF9jb250ZW50LmFkZENsYXNzKCdtb2RhbC1jb250ZW50Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWZyZXNoRWxlbWVudERhdGEoaHRtbENvbnRlbnQ6c3RyaW5nLGVsZW1lbnRJZDpzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwicmVmcmVzaEVsZW1lbnREYXRhXCIpO1xyXG4gICAgICAgIGxldCBfZG9jdW1lbnQgPSAkKGh0bWxDb250ZW50KTtcclxuICAgICAgICBsZXQgX2NlbGwgPSBfZG9jdW1lbnQuZmluZChlbGVtZW50SWQpO1xyXG4gICAgICAgICQoZWxlbWVudElkKS5yZXBsYWNlV2l0aChfY2VsbCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICBwdWJsaWMgQ2xvc2VWaWV3Rm9ybSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl92aWV3TW9kYWxGcmFtZS5tb2RhbCgnaGlkZScpO1xyXG4gICAgICAgIC8vIGp1c3QgaW4gY2FzZTogb2RzdHJhbmksIMSNZSBqZSDFoWUgdmVkbm8gdmlkbm8sIGF2dG9tYXRza28gc2UgbmUgemFwcmUgdmVkbm8gOihcclxuICAgICAgICAkKCcubW9kYWwtYmFja2Ryb3AnKS5yZW1vdmUoKTtcclxuICAgICAgICAkKGRvY3VtZW50LmJvZHkpLnJlbW92ZUNsYXNzKFwibW9kYWwtb3BlblwiKTsgICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaG93TW9kYWwoKTp2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fcHJlcGFyZVZpZXcgPT0gZmFsc2Upe1xyXG4gICAgICAgICAgICB0aGlzLl92aWV3TW9kYWxGcmFtZS5tb2RhbCgnc2hvdycpO1xyXG4gICAgICAgICAgICBzZXRNb2RhbEZvcm1aSW5kZXgodGhpcy5pZCk7IFxyXG4gICAgICAgICAgICBzZXRGaXJzdEZvcm1Db250cm9sVG9Gb2N1cyh0aGlzLmlkKTtcclxuICAgICAgICB9ICAgICAgICBcclxuICAgIH1cclxuICAgXHJcbiAgICAvLyAgXHJcbn1cclxuIiwiaW1wb3J0IHsgTElLVkNha2FsbmFWcnN0YUdyaWQgfSBmcm9tIFwiLi4vTElLVi9MSUtWQ2FrYWxuYVZyc3RhLWdyaWRcIjtcclxuaW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wU2VydmljZXNDb3JlIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC1zZXJ2aWNlcy1jb3JlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkTElLVkNvbmZpcm1hdGlvblZpZXcge1xyXG4gICAgcHJpdmF0ZSBfbGliTmFtZTpzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9zYW9wU2VydmljZXNDb3JlOiBTYW9wU2VydmljZXNDb3JlO1xyXG4gICAgcHJpdmF0ZSBsaWt2Q2FrYWxuYVZyc3RhR3JpZDogTElLVkNha2FsbmFWcnN0YUdyaWQ7XHJcbiAgICAvL1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGxpYk5hbWU6IHN0cmluZyA9IFwiXCIpIHtcclxuICAgICAgICB0aGlzLl9saWJOYW1lID0gbGliTmFtZTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgICAgIHRoaXMubGlrdkNha2FsbmFWcnN0YUdyaWQgPSBuZXcgTElLVkNha2FsbmFWcnN0YUdyaWQobGliTmFtZSArXCIubGlrdkNha2FsbmFWcnN0YUdyaWRcIik7XHJcbiAgICAgICAgdGhpcy5saWt2Q2FrYWxuYVZyc3RhR3JpZC5yZWZyZXNoRGF0YSA9IHRoaXMucmVmcmVzaEdyaWREYXRhLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaEdyaWREYXRhKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJEYXNoYm9hcmRMSUtWQ29uZmlybWF0aW9uVmlldy5yZWZyZXNoR3JpZERhdGFcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uKHJlc3BvbnNlKXtcclxuICAgICAgICAgICAgbGV0IF9ncmlkID0gJChyZXNwb25zZSkuZmluZChcIiNMSUtWQ2FrYWxuYVZyc3RhR3JpZFwiKVswXTtcclxuICAgICAgICAgICAgJChfZ3JpZCkuZmluZChcIiNkdC1jaGVja2JveGVzLWNlbGxcIikuaGlkZTtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgICBsZXQgX2JvZHkgPSAkKF9ncmlkKS5maW5kKFwiI0xJS1ZDYWthbG5hVnJzdGFHcmlkQm9keUFqYXhcIik7IC8vcG9pc2NlbSB0Ym9keVxyXG4gICAgICAgICAgIC8vICQoX2JvZHkpLmZpbmQoXCJ0cjpmaXJzdFwiKS5odG1sKCdsYWxhbGEnKTtcclxuICAgICAgICAgICAgJChfYm9keSkuZmluZChcInRyXCIpLmVhY2goZnVuY3Rpb24oKSB7IC8vemEgdnNhayB0ciB2IHBydmVtIHRkIHBvYnJpc2VtIHZhbHVlXHJcbiAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoXCJ0ZDplcSgwKVwiKS5odG1sKCcnKTtcclxuICAgICAgICAgICAgICAgIC8vICQodGhpcykuZmluZChcIi5MSUtWQ2FrYWxuYVZyc3RhR3JpZF9jb25maXJtXCIpLmh0bWwoJycpO1xyXG4gICAgICAgICAgICAgICAgLy8gJCh0aGlzKS5maW5kKFwiLkxJS1ZDYWthbG5hVnJzdGFHcmlkX2RlbnlcIikuaHRtbCgnJyk7XHJcbiAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoXCIudGQtaWNvbi1jb2xcIikuaHRtbCgnJyk7ICAgICBcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICQoXCIjY2FyZDYgLmNhcmQtYm9keVwiKS5odG1sKF9ncmlkKTtcclxuICAgICAgICAgICAgX3RoaXMubGlrdkNha2FsbmFWcnN0YUdyaWQuX2Rhc2hib2FyZCA9IHRydWU7XHJcbiAgICAgICAgICAgIF90aGlzLmxpa3ZDYWthbG5hVnJzdGFHcmlkLmluaXRWaWV3KCk7ICAgICAgICAgICAgXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246XCJEYXNoYm9hcmQvTElLVkNvbmZpcm1hdGlvblBhcnRpYWxcIlxyXG4gICAgICAgICAgICAsdHlwZTpcIkdFVFwiXHJcbiAgICAgICAgICAgICxzcGlubmVyRGl2SWQ6XCIjc2FvcExvYWRpbmdjYXJkNlwiXHJcbiAgICAgICAgfSk7ICAgXHJcbiAgICB9ICAgIFxyXG4gICBcclxuICAgIC8vXHJcbn0iLCLvu78vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL2FsZXJ0aWZ5L2luZGV4LmQudHNcIiAvPlxyXG5pbXBvcnQgeyBTYW9wQWJzZW5jZUNvbmZpcm1hdGlvblBlbmRpbmdWaWV3IH0gZnJvbSBcIi4uL0Fic2VuY2VDb25maXJtYXRpb24vc2FvcC1hYnNlbmNlQ29uZmlybWF0aW9uLXBlbmRpbmctdmlld1wiO1xyXG5pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BTZXJ2aWNlc0NvcmUgfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXNlcnZpY2VzLWNvcmVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmRBYnNlbmNlQ29uZmlybWF0aW9uVmlldyB7XHJcbiAgICBwcml2YXRlIF9saWJOYW1lOnN0cmluZztcclxuICAgIHByaXZhdGUgX3Nhb3BTZXJ2aWNlc0NvcmU6IFNhb3BTZXJ2aWNlc0NvcmU7XHJcbiAgICBwcml2YXRlIGFic2VuY2VDb25maXJtYXRpb25QZW5kaW5nVmlldzogU2FvcEFic2VuY2VDb25maXJtYXRpb25QZW5kaW5nVmlldztcclxuICAgIC8vXHJcblxyXG4gICAgY29uc3RydWN0b3IobGliTmFtZTogc3RyaW5nID0gXCJcIikge1xyXG4gICAgICAgIHRoaXMuX2xpYk5hbWUgPSBsaWJOYW1lO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICAgICAgdGhpcy5hYnNlbmNlQ29uZmlybWF0aW9uUGVuZGluZ1ZpZXcgPSBuZXcgU2FvcEFic2VuY2VDb25maXJtYXRpb25QZW5kaW5nVmlldyhcIlwiLCBsaWJOYW1lICtcIi5hYnNlbmNlQ29uZmlybWF0aW9uUGVuZGluZ1ZpZXdcIik7XHJcbiAgICAgICAgdGhpcy5hYnNlbmNlQ29uZmlybWF0aW9uUGVuZGluZ1ZpZXcucmVmcmVzaERhdGFFeHRlcm5hbCA9IHRoaXMucmVmcmVzaEdyaWREYXRhLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaEdyaWREYXRhKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJEYXNoYm9hcmRBYnNlbmNlQ29uZmlybWF0aW9uVmlldy5yZWZyZXNoR3JpZERhdGFcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uKHJlc3BvbnNlKXtcclxuICAgICAgICAgICAgJChcIiNjYXJkMyAuY2FyZC1ib2R5XCIpLmh0bWwocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICBfdGhpcy5hYnNlbmNlQ29uZmlybWF0aW9uUGVuZGluZ1ZpZXcuYmluZEdyaWRFdmVudHMoKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjpcIkRhc2hib2FyZC9BYnNlbmNlQ29uZmlybWF0aW9uUGFydGlhbFwiXHJcbiAgICAgICAgICAgICx0eXBlOlwiR0VUXCJcclxuICAgICAgICAgICAgLHNwaW5uZXJEaXZJZDpcIiNzYW9wTG9hZGluZ2NhcmQzXCJcclxuICAgICAgICB9KTsgICBcclxuICAgIH0gICAgXHJcbiAgIFxyXG4gICAgLy9cclxufVxyXG5cclxuXHJcbiIsIu+7vy8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9AdHlwZXMvYWxlcnRpZnkvaW5kZXguZC50c1wiIC8+XHJcbmltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFNlcnZpY2VzQ29yZSB9IGZyb20gXCIuLi9Db3JlL3Nhb3Atc2VydmljZXMtY29yZVwiO1xyXG5pbXBvcnQgeyBTYW9wUmlnaHRTaWRlYmFyIH0gZnJvbSAnLi4vQ29tcG9uZW50cy9zYW9wLXJpZ2h0LXNpZGViYXInO1xyXG5pbXBvcnQgeyBTYW9wUmVnQWJzZW5jZUV2ZW50c1ZpZXcgfSBmcm9tICcuLi9SRUcvc2FvcC1yZWdBYnNlbmNlRXZlbnRzLXZpZXcnO1xyXG5cclxuZXhwb3J0IGNsYXNzIERhc2hib2FyZEFic2VuY2VzVmlldyB7XHJcbiAgICBwcml2YXRlIF9saWJOYW1lOnN0cmluZztcclxuICAgIHByaXZhdGUgX3Nhb3BTZXJ2aWNlc0NvcmUgOlNhb3BTZXJ2aWNlc0NvcmU7XHJcbiAgICAvL1xyXG4gICAgcHVibGljIHJlZ0Fic2VuY2VFdmVudHNWaWV3OlNhb3BSZWdBYnNlbmNlRXZlbnRzVmlldztcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihsaWJOYW1lOiBzdHJpbmcgPSBcIlwiKSB7XHJcbiAgICAgICAgdGhpcy5fbGliTmFtZSA9IGxpYk5hbWU7XHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgICAgICB0aGlzLnJlZ0Fic2VuY2VFdmVudHNWaWV3ID0gbmV3IFNhb3BSZWdBYnNlbmNlRXZlbnRzVmlldyhcIiNyZWdLZVphcERvcHVzdGlWaWV3MFwiLGxpYk5hbWUrXCIucmVnQWJzZW5jZUV2ZW50c1ZpZXdcIik7XHJcbiAgICAgICAgdGhpcy5yZWdBYnNlbmNlRXZlbnRzVmlldy5yZWZyZXNoRGF0YSA9IHRoaXMucmVmcmVzaEdyaWREYXRhLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaEdyaWREYXRhKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJEYXNoYm9hcmRDYXJkMi5yZWZyZXNoR3JpZERhdGFcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uKHJlc3BvbnNlKXtcclxuICAgICAgICAgICAgJChcIiNjYXJkMiAuY2FyZC1ib2R5XCIpLmh0bWwocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICBfdGhpcy5yZWdBYnNlbmNlRXZlbnRzVmlldy5iaW5kR3JpZEV2ZW50cygpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOlwiRGFzaGJvYXJkL0Fic2VuY2VQYXJ0aWFsXCJcclxuICAgICAgICAgICAgLHR5cGU6XCJHRVRcIlxyXG4gICAgICAgICAgICAsc3Bpbm5lckRpdklkOlwiI3Nhb3BMb2FkaW5nY2FyZDJcIlxyXG4gICAgICAgIH0pOyAgIFxyXG5cclxuICAgICAgICBsZXQgX3Nhb3BSaWdodFNpZGViYXI6IFNhb3BSaWdodFNpZGViYXIgPSBuZXcgU2FvcFJpZ2h0U2lkZWJhcigpO1xyXG4gICAgICAgIF9zYW9wUmlnaHRTaWRlYmFyLnJlZnJlc2hEb3B1c3RaYUtvcmlzY2VuamVTdW1tYXJ5KFwiI2RvcHVzdFphS29yaXNjZW5qZVN1bW1hcnlcIik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgbGV0IF9zYW9wUmlnaHRTaWRlYmFyVXJlOiBTYW9wUmlnaHRTaWRlYmFyID0gbmV3IFNhb3BSaWdodFNpZGViYXIoKTtcclxuICAgICAgICBfc2FvcFJpZ2h0U2lkZWJhclVyZS5yZWZyZXNoVXJlWmFLb3Jpc2NlbmplU3VtbWFyeShcIiN1cmVaYUtvcmlzY2VuamVTdW1tYXJ5XCIpO1xyXG4gICAgfSAgICBcclxuICAgXHJcbiAgICAvL1xyXG59XHJcblxyXG5cclxuIiwi77u/aW1wb3J0IHsgZmlsdGVyVGFibGVSb3dzLCBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BTZXJ2aWNlc0NvcmUgfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXNlcnZpY2VzLWNvcmVcIjtcclxuaW1wb3J0IHsgU2FvcEZsb2F0aW5nTGFiZWwgfSBmcm9tICcuLi9Db21wb25lbnRzL3Nhb3AtZmxvYXRpbmctbGFiZWwnO1xyXG5cclxuZXhwb3J0IGNsYXNzIERhc2hib2FyZEVtcGxveWVlUHJlc2VuY2VWaWV3IHtcclxuICAgIHByaXZhdGUgX2xpYk5hbWU6c3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfc2FvcFNlcnZpY2VzQ29yZTogU2FvcFNlcnZpY2VzQ29yZTtcclxuXHJcbiAgICBwcml2YXRlIF9zYW9wRmxvYXRpbmdMYWJlbDogU2FvcEZsb2F0aW5nTGFiZWwgPSBuZXcgU2FvcEZsb2F0aW5nTGFiZWwoKTtcclxuXHJcbiAgICBwcml2YXRlIGRpdklkOiBzdHJpbmcgPSBcIiNjYXJkOFwiO1xyXG5cclxuICAgIHByaXZhdGUgX3NlYXJjaFZhbHVlSWQ6IHN0cmluZyA9IFwiI0VtcGxveWVlUHJlc2VuY2VTZWFyY2hWYWx1ZVwiO1xyXG4gICAgcHJpdmF0ZSBfc2VhcmNoVmFsdWU6IEpRdWVyeTxIVE1MRWxlbWVudD47XHJcblxyXG4gICAgY29uc3RydWN0b3IobGliTmFtZTogc3RyaW5nID0gXCJcIikge1xyXG4gICAgICAgIHRoaXMuX2xpYk5hbWUgPSBsaWJOYW1lO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaEdyaWREYXRhKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJEYXNoYm9hcmRFbXBsb3llZVByZXNlbmNlVmlldy5yZWZyZXNoR3JpZERhdGFcIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbihyZXNwb25zZSl7XHJcbiAgICAgICAgICAgICQoXCIjY2FyZDggLmNhcmQtYm9keVwiKS5odG1sKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgX3RoaXMuX3Nhb3BGbG9hdGluZ0xhYmVsLmluaXQoKTtcclxuICAgICAgICAgICAgX3RoaXMuaW5pdEZpbHRlckNvbnRyb2xzKCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246XCJEYXNoYm9hcmQvRW1wbG95ZWVQcmVzZW5jZVBhcnRpYWxcIlxyXG4gICAgICAgICAgICAsdHlwZTpcIkdFVFwiXHJcbiAgICAgICAgICAgICxzcGlubmVyRGl2SWQ6XCIjc2FvcExvYWRpbmdjYXJkOFwiXHJcbiAgICAgICAgfSk7XHJcbiAgICB9ICBcclxuXHJcbiAgICBpbml0RmlsdGVyQ29udHJvbHMoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIkRhc2hib2FyZEVtcGxveWVlUHJlc2VuY2VWaWV3LmluaXRGaWx0ZXJDb250cm9sc1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2VhcmNoVmFsdWUgPSAkKHRoaXMuZGl2SWQpLmZpbmQodGhpcy5fc2VhcmNoVmFsdWVJZCk7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgdGhpcy5fc2VhcmNoVmFsdWUub2ZmKFwia2V5dXBcIik7XHJcbiAgICAgICAgdGhpcy5fc2VhcmNoVmFsdWUub24oXCJrZXl1cFwiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIF90aGlzLmV4ZWN1dGVGaWx0ZXJTZWFyY2goJCh0aGlzKS52YWwoKS50b1N0cmluZygpKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgZXhlY3V0ZUZpbHRlclNlYXJjaChzZWFyY2hWYWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJEYXNoYm9hcmRFbXBsb3llZVByZXNlbmNlVmlldy5leGVjdXRlRmlsdGVyU2VhcmNoXCIpO1xyXG5cclxuICAgICAgICBmaWx0ZXJUYWJsZVJvd3Moc2VhcmNoVmFsLCB0aGlzLmRpdklkKTtcclxuICAgIH1cclxuICAgIC8vXHJcbn1cclxuXHJcblxyXG4iLCLvu78vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL2FsZXJ0aWZ5L2luZGV4LmQudHNcIiAvPlxyXG5pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BTZXJ2aWNlc0NvcmUgfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXNlcnZpY2VzLWNvcmVcIjtcclxuaW1wb3J0IHsgU2FvcFJpZ2h0U2lkZWJhciB9IGZyb20gJy4uL0NvbXBvbmVudHMvc2FvcC1yaWdodC1zaWRlYmFyJztcclxuaW1wb3J0IHsgTkRLSW50ZXJuYWxPcmRlcnNBY3RpdmVHcmlkLCBOREtJbnRlcm5hbE9yZGVyc0FjdGl2ZUdyaWRPcHRpb25zIH0gZnJvbSBcIi4uL05ESy9OREtJbnRlcm5hbE9yZGVycy1BY3RpdmUtZ3JpZFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIERhc2hib2FyZEludGVybmFsT3JkZXJWaWV3IHtcclxuICAgIHByaXZhdGUgX2xpYk5hbWU6c3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfc2FvcFNlcnZpY2VzQ29yZTogU2FvcFNlcnZpY2VzQ29yZTtcclxuICAgIHByaXZhdGUgX2FkZEludGVybmFsT3JkZXJJZDogc3RyaW5nID0gXCIjYWRkSW50ZXJuYWxPcmRlclwiO1xyXG4gICAgLy9cclxuICAgIHB1YmxpYyBuZGtJbnRlcm5hbE9yZGVyc0FjdGl2ZUdyaWQ6IE5ES0ludGVybmFsT3JkZXJzQWN0aXZlR3JpZDtcclxuICAgIHB1YmxpYyByaWdodFNpZGViYXI6IFNhb3BSaWdodFNpZGViYXI7XHJcblxyXG4gICAgY29uc3RydWN0b3IobGliTmFtZTogc3RyaW5nID0gXCJcIikge1xyXG4gICAgICAgIHRoaXMuX2xpYk5hbWUgPSBsaWJOYW1lO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcblxyXG4gICAgICAgIGxldCBncmlkT3B0aW9ucyA9IG5ldyBOREtJbnRlcm5hbE9yZGVyc0FjdGl2ZUdyaWRPcHRpb25zKCk7XHJcbiAgICAgICAgZ3JpZE9wdGlvbnMuZGFzaGJvYXJkID0gdHJ1ZTtcclxuICAgICAgICBncmlkT3B0aW9ucy5zaG93VG9vbGJhciA9IGZhbHNlO1xyXG4gICAgICAgIGdyaWRPcHRpb25zLnNob3dGaWx0ZXIgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm5ka0ludGVybmFsT3JkZXJzQWN0aXZlR3JpZCA9IG5ldyBOREtJbnRlcm5hbE9yZGVyc0FjdGl2ZUdyaWQodGhpcy5fbGliTmFtZSArIFwiLm5ka0ludGVybmFsT3JkZXJzQWN0aXZlR3JpZFwiLCBncmlkT3B0aW9ucyk7XHJcbiAgICAgICAgdGhpcy5uZGtJbnRlcm5hbE9yZGVyc0FjdGl2ZUdyaWQuYWZ0ZXJSZWZyZXNoRGF0YUFmdGVyRWRpdFZpZXdFeHRlcm5hbCA9IHRoaXMuYWZ0ZXJSZWZyZXNoRGF0YUFmdGVyRWRpdFZpZXcuYmluZCh0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5yaWdodFNpZGViYXIgPSBuZXcgU2FvcFJpZ2h0U2lkZWJhcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hHcmlkRGF0YSgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiRGFzaGJvYXJkSW50ZXJuYWxPcmRlclZpZXcucmVmcmVzaEdyaWREYXRhXCIpO1xyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24ocmVzcG9uc2Upe1xyXG4gICAgICAgICAgICAkKFwiI2NhcmQ0IC5jYXJkLWJvZHlcIikuaHRtbChyZXNwb25zZSk7XHJcbiAgICAgICAgICAgIF90aGlzLm5ka0ludGVybmFsT3JkZXJzQWN0aXZlR3JpZC5pbml0VmlldygpO1xyXG4gICAgICAgICAgICBfdGhpcy5iaW5kQWRkRXZlbnQoKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjpcIkRhc2hib2FyZC9JbnRlcm5hbE9yZGVyUGFydGlhbFwiXHJcbiAgICAgICAgICAgICx0eXBlOlwiR0VUXCJcclxuICAgICAgICAgICAgLHNwaW5uZXJEaXZJZDpcIiNzYW9wTG9hZGluZ2NhcmQ0XCJcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5yaWdodFNpZGViYXIucmVmcmVzaE5ka0ludGVybmFsT3JkZXJzU3VtbWFyeShcIiNuZGtJbnRlcm5hbE9yZGVyc1N1bW1hcnlcIiwgXCIjc2FvcExvYWRpbmdTaWRlYmFyclwiKTtcclxuICAgIH0gIFxyXG5cclxuICAgIGFmdGVyUmVmcmVzaERhdGFBZnRlckVkaXRWaWV3KCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJEYXNoYm9hcmRJbnRlcm5hbE9yZGVyVmlldy5hZnRlclJlZnJlc2hEYXRhQWZ0ZXJFZGl0Vmlld1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy5yaWdodFNpZGViYXIucmVmcmVzaE5ka0ludGVybmFsT3JkZXJzU3VtbWFyeShcIiNuZGtJbnRlcm5hbE9yZGVyc1N1bW1hcnlcIiwgXCIjc2FvcExvYWRpbmdTaWRlYmFyclwiKTtcclxuICAgIH1cclxuXHJcbiAgICBiaW5kQWRkRXZlbnQoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIkRhc2hib2FyZEludGVybmFsT3JkZXJWaWV3LmJpbmRHcmlkRXZlbnRzXCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgICQodGhpcy5fYWRkSW50ZXJuYWxPcmRlcklkKS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAkKHRoaXMuX2FkZEludGVybmFsT3JkZXJJZCkub24oJ2NsaWNrJywgZnVuY3Rpb24gKHJvdykge1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiRGFzaGJvYXJkSW50ZXJuYWxPcmRlclZpZXcuX2FkZEludGVybmFsT3JkZXIuY2xpY2tcIik7XHJcbiAgICAgICAgICAgIF90aGlzLm5ka0ludGVybmFsT3JkZXJzQWN0aXZlR3JpZC5hZGRSZWNvcmQoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgXHJcbiAgICAvL1xyXG59XHJcblxyXG5cclxuIiwi77u/Ly8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9hbGVydGlmeS9pbmRleC5kLnRzXCIgLz5cclxuaW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wU2VydmljZXNDb3JlIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC1zZXJ2aWNlcy1jb3JlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkTXlHcmFkZXNWaWV3IHtcclxuICAgIHByaXZhdGUgX2xpYk5hbWU6c3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfc2FvcFNlcnZpY2VzQ29yZTogU2FvcFNlcnZpY2VzQ29yZTtcclxuICAgIHByaXZhdGUgX2plRW5hU2lmcmFPY2VuT2Jkb2JqYUlkOiBzdHJpbmcgPSBcIiNoaWRkZW5KZUVuYVNpZnJhT2Nlbk9iZG9iamFcIjsgXHJcbiAgICBwcml2YXRlIF9uYXppdk9jZW5PYmRvYmphSWQ6IHN0cmluZyA9IFwiI2hpZGRlbk5heml2T2Nlbk9iZG9iamFcIjsgXHJcbiAgICBwcml2YXRlIF9jYXJkSWQ6IHN0cmluZyA9IFwiI2NhcmQ1XCI7XHJcbiAgICAvL1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGxpYk5hbWU6IHN0cmluZyA9IFwiXCIpIHtcclxuICAgICAgICB0aGlzLl9saWJOYW1lID0gbGliTmFtZTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hHcmlkRGF0YSgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiRGFzaGJvYXJkTXlHcmFkZXNWaWV3LnJlZnJlc2hHcmlkRGF0YVwiKTtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24ocmVzcG9uc2Upe1xyXG4gICAgICAgICAgICAkKFwiI2NhcmQ1IC5jYXJkLWJvZHlcIikuaHRtbChyZXNwb25zZSk7XHJcbiAgICAgICAgICAgIF90aGlzLmluaXQoKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjpcIkRhc2hib2FyZC9NeUdyYWRlc1BhcnRpYWxcIlxyXG4gICAgICAgICAgICAsdHlwZTpcIkdFVFwiXHJcbiAgICAgICAgICAgICxzcGlubmVyRGl2SWQ6XCIjc2FvcExvYWRpbmdjYXJkNVwiXHJcbiAgICAgICAgfSk7ICAgXHJcbiAgICB9ICAgIFxyXG5cclxuICAgIGluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIkRhc2hib2FyZE15R3JhZGVzVmlldy5pbml0XCIpO1xyXG5cclxuICAgICAgICBsZXQgamVFbmFTaWZyYU9jZW5PYmRvYmphU3RyID0gJCh0aGlzLl9jYXJkSWQgKyBcIiBcIiArIHRoaXMuX2plRW5hU2lmcmFPY2VuT2Jkb2JqYUlkKS52YWwoKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgbGV0IGplRW5hU2lmcmFPY2VuT2Jkb2JqYSA9IGplRW5hU2lmcmFPY2VuT2Jkb2JqYVN0ciA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgICAgaWYgKGplRW5hU2lmcmFPY2VuT2Jkb2JqYSkge1xyXG4gICAgICAgICAgICBsZXQgbmF6aXZPY2VuT2Jkb2JqYSA9ICQodGhpcy5fY2FyZElkICsgXCIgXCIgKyB0aGlzLl9uYXppdk9jZW5PYmRvYmphSWQpLnZhbCgpLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgY2FyZEhlYWRlckVsZW1lbnQgPSAkKHRoaXMuX2NhcmRJZCArIFwiIC5jYXJkLWhlYWRlciBhLmNhcmQtbGlua1wiKTtcclxuICAgICAgICAgICAgbGV0IGNhcmRIZWFkZXJUZXh0ID0gY2FyZEhlYWRlckVsZW1lbnQudGV4dCgpLnRyaW0oKS5yZXBsYWNlKFwiXFxuXCIsIFwiXCIpO1xyXG5cclxuICAgICAgICAgICAgY2FyZEhlYWRlckVsZW1lbnQudGV4dChjYXJkSGVhZGVyVGV4dCArIFwiOiBcIiArIG5heml2T2Nlbk9iZG9iamEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vXHJcbn1cclxuXHJcblxyXG4iLCLvu78vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL2FsZXJ0aWZ5L2luZGV4LmQudHNcIiAvPlxyXG5pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BTZXJ2aWNlc0NvcmUgfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXNlcnZpY2VzLWNvcmVcIjtcclxuaW1wb3J0IHsgU2FvcFJpZ2h0U2lkZWJhciB9IGZyb20gJy4uL0NvbXBvbmVudHMvc2FvcC1yaWdodC1zaWRlYmFyJztcclxuaW1wb3J0IHsgU2FvcFJlZ1RvZGF5RXZlbnRzVmlldyB9IGZyb20gJy4uL1JFRy9zYW9wLXJlZ1RvZGF5RXZlbnRzLXZpZXcnXHJcbmltcG9ydCB7IE9iZG9iamVmaWx0ZXJWYWx1ZXMgfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLXNlbGVjdC1tb250aC15ZWFyXCI7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIERhc2hib2FyZFRvZGF5RXZlbnRzVmlldyB7XHJcbiAgICBwcml2YXRlIF9saWJOYW1lOnN0cmluZztcclxuICAgIHByaXZhdGUgX3Nhb3BTZXJ2aWNlc0NvcmUgOlNhb3BTZXJ2aWNlc0NvcmU7XHJcbiAgICAvL1xyXG4gICAgcHVibGljIHJlZ1RvZGF5RXZlbnRzVmlldzogU2FvcFJlZ1RvZGF5RXZlbnRzVmlldztcclxuICAgIC8vIFxyXG4gICAgcHVibGljIGFkZEVuYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihsaWJOYW1lOiBzdHJpbmcgPSBcIlwiKSB7XHJcbiAgICAgICAgdGhpcy5fbGliTmFtZSA9IGxpYk5hbWU7XHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMucmVnVG9kYXlFdmVudHNWaWV3ID0gbmV3IFNhb3BSZWdUb2RheUV2ZW50c1ZpZXcoXCIjcmVnRG9nb2Rla1ZpZXcwXCIsdGhpcy5fbGliTmFtZStcIi5yZWdUb2RheUV2ZW50c1ZpZXdcIik7XHJcbiAgICAgICAgdGhpcy5yZWdUb2RheUV2ZW50c1ZpZXcuaW5pdENsb2NrKCk7XHJcbiAgICAgICAgdGhpcy5yZWdUb2RheUV2ZW50c1ZpZXcucmVmcmVzaERhdGEgPSB0aGlzLnJlZnJlc2hHcmlkRGF0YS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMucmVnVG9kYXlFdmVudHNWaWV3LnJlZ0N1cnJlbnRFdmVudFZpZXcuYWZ0ZXJTdWJtaXRTdWNjZXNzID0gdGhpcy5yZWZyZXNoR3JpZERhdGEuYmluZCh0aGlzKTsgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaEdyaWREYXRhKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJEYXNoYm9hcmRDYXJkMS5yZWZyZXNoVG9kYXlFdmVudERhdGFcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbihyZXNwb25zZSl7XHJcbiAgICAgICAgICAgICQoXCIjY2FyZDEgLmNhcmQtYm9keVwiKS5odG1sKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgX3RoaXMucmVnVG9kYXlFdmVudHNWaWV3LnJlZ0N1cnJlbnRFdmVudFZpZXcuYmluZEZvcm1BamF4RXZlbnRzKCk7XHJcbiAgICAgICAgICAgIF90aGlzLnJlZ1RvZGF5RXZlbnRzVmlldy5iaW5kR3JpZEV2ZW50cygpOyBcclxuICAgICAgICAgICAgX3RoaXMuZW5hYmxlQWRkKCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246XCJEYXNoYm9hcmQvVG9kYXlFdmVudFBhcnRpYWxcIlxyXG4gICAgICAgICAgICAsdHlwZTpcIkdFVFwiXHJcbiAgICAgICAgICAgICxzcGlubmVyRGl2SWQ6XCIjc2FvcExvYWRpbmdjYXJkMVwiXHJcbiAgICAgICAgfSk7ICAgICAgICBcclxuXHJcbiAgICAgICAgbGV0IF9zYW9wUmlnaHRTaWRlYmFyOiBTYW9wUmlnaHRTaWRlYmFyID0gbmV3IFNhb3BSaWdodFNpZGViYXIoKTtcclxuICAgICAgICBsZXQgb2Jkb2JqZWZpbHRlclZhbHVlczogT2Jkb2JqZWZpbHRlclZhbHVlcyA9IG5ldyBPYmRvYmplZmlsdGVyVmFsdWVzKCk7XHJcbiAgICAgICAgX3Nhb3BSaWdodFNpZGViYXIucmVmcmVzaFJlZ1VyYURvZ29ka2lTdW1tYXJ5KFwiI3JlZ1VyYURvZ29ka2lTdW1tYXJ5XCIsIG9iZG9iamVmaWx0ZXJWYWx1ZXMsXCIjc2FvcExvYWRpbmdSZWdVcmFNb250aEV2ZW50c1NpZGViYXJyXCIpO1xyXG4gICAgfSAgICBcclxuXHJcbiAgICBlbmFibGVBZGQoKTogdm9pZCB7XHJcbiAgICAgICAgdmFyIHZhbCA9ICQoXCIjUmVnVXJhRG9nb2Rla0Jyb3dzZVZpZXdNb2RlbF9BZGRFbmFibGVkXCIpLnZhbCgpO1xyXG4gICAgICAgIHZhciBlbCA9ICQoXCIjcmVnVXJhRG9nb2Rla0FkZFJlY29yZFwiKTtcclxuICAgICAgICBpZiAoZWwubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGVsLnByb3AoXCJkaXNhYmxlZFwiLCB2YWwudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpPT09XCJmYWxzZVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvL1xyXG59XHJcblxyXG5cclxuIiwi77u/Ly8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9hbGVydGlmeS9pbmRleC5kLnRzXCIgLz5cclxuaW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wU2VydmljZXNDb3JlIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC1zZXJ2aWNlcy1jb3JlXCI7XHJcbmltcG9ydCB7IFNhb3BSaWdodFNpZGViYXIgfSBmcm9tICcuLi9Db21wb25lbnRzL3Nhb3AtcmlnaHQtc2lkZWJhcic7XHJcbmltcG9ydCB7IE9QTlBvdG5pTmFsb2dpR3JpZCwgT1BOUG90bmlOYWxvZ2lHcmlkT3B0aW9ucyB9IGZyb20gXCIuLi9PUE4vT1BOUG90bmlOYWxvZ2ktZ3JpZFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIERhc2hib2FyZFRyYXZlbE9yZGVyVmlldyB7XHJcbiAgICBwcml2YXRlIF9saWJOYW1lOnN0cmluZztcclxuICAgIHByaXZhdGUgX3Nhb3BTZXJ2aWNlc0NvcmU6IFNhb3BTZXJ2aWNlc0NvcmU7XHJcbiAgICBwcml2YXRlIF9hZGRUcmF2ZWxPcmRlcklkOiBzdHJpbmcgPSBcIiNhZGRUcmF2ZWxPcmRlclwiO1xyXG4gICAgLy9cclxuICAgIHB1YmxpYyBvcG5Qb3RuaU5hbG9naUdyaWQ6IE9QTlBvdG5pTmFsb2dpR3JpZDtcclxuICAgIHB1YmxpYyByaWdodFNpZGViYXI6IFNhb3BSaWdodFNpZGViYXI7XHJcblxyXG4gICAgY29uc3RydWN0b3IobGliTmFtZTogc3RyaW5nID0gXCJcIikge1xyXG4gICAgICAgIHRoaXMuX2xpYk5hbWUgPSBsaWJOYW1lO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcblxyXG4gICAgICAgIGxldCBncmlkT3B0aW9ucyA9IG5ldyBPUE5Qb3RuaU5hbG9naUdyaWRPcHRpb25zKCk7XHJcbiAgICAgICAgZ3JpZE9wdGlvbnMuZGFzaGJvYXJkID0gdHJ1ZTtcclxuICAgICAgICBncmlkT3B0aW9ucy5zaG93VG9vbGJhciA9IGZhbHNlO1xyXG4gICAgICAgIGdyaWRPcHRpb25zLnNob3dGaWx0ZXIgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm9wblBvdG5pTmFsb2dpR3JpZCA9IG5ldyBPUE5Qb3RuaU5hbG9naUdyaWQodGhpcy5fbGliTmFtZSArIFwiLm9wblBvdG5pTmFsb2dpR3JpZFwiLCBncmlkT3B0aW9ucyk7XHJcbiAgICAgICAgdGhpcy5vcG5Qb3RuaU5hbG9naUdyaWQuYWZ0ZXJSZWZyZXNoRGF0YUFmdGVyRWRpdFZpZXdFeHRlcm5hbCA9IHRoaXMuYWZ0ZXJSZWZyZXNoRGF0YUFmdGVyRWRpdFZpZXcuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLm9wblBvdG5pTmFsb2dpR3JpZC5yZWZyZXNoRGF0YSA9IHRoaXMucmVmcmVzaEdyaWREYXRhLmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMucmlnaHRTaWRlYmFyID0gbmV3IFNhb3BSaWdodFNpZGViYXIoKTtcclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoR3JpZERhdGEoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIkRhc2hib2FyZFRyYXZlbE9yZGVyVmlldy5yZWZyZXNoR3JpZERhdGFcIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbihyZXNwb25zZSl7XHJcbiAgICAgICAgICAgICQoXCIjY2FyZDcgLmNhcmQtYm9keVwiKS5odG1sKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgLy9fdGhpcy5vcG5Qb3RuaU5hbG9naUdyaWQuaW5pdFZpZXcoKTtcclxuICAgICAgICAgICAgLy9fdGhpcy5vcG5Qb3RuaU5hbG9naUdyaWQuaW5pdFdlYkdyaWQxKCk7XHJcbiAgICAgICAgICAgIF90aGlzLm9wblBvdG5pTmFsb2dpR3JpZC5pbml0V2ViR3JpZDFMaXN0bmVycygpO1xyXG4gICAgICAgICAgICBfdGhpcy5vcG5Qb3RuaU5hbG9naUdyaWQuaW5pdEVkaXRWaWV3KCk7XHJcbiAgICAgICAgICAgIF90aGlzLmJpbmRBZGRFdmVudCgpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOlwiRGFzaGJvYXJkL1RyYXZlbE9yZGVyUGFydGlhbFwiXHJcbiAgICAgICAgICAgICx0eXBlOlwiR0VUXCJcclxuICAgICAgICAgICAgLHNwaW5uZXJEaXZJZDpcIiNzYW9wTG9hZGluZ2NhcmQ3XCJcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5yaWdodFNpZGViYXIucmVmcmVzaFJlZ09QTlBvdG5pTmFsb2dpU3VtbWFyeShcIiNvcG5Qb3RuaU5hbG9naVN1bW1hcnlcIiwgXCIjc2FvcExvYWRpbmdTaWRlYmFyclwiKTtcclxuICAgIH0gIFxyXG5cclxuICAgIGFmdGVyUmVmcmVzaERhdGFBZnRlckVkaXRWaWV3KCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJEYXNoYm9hcmRUcmF2ZWxPcmRlclZpZXcuYWZ0ZXJSZWZyZXNoRGF0YUFmdGVyRWRpdFZpZXdcIik7XHJcblxyXG4gICAgICAgIHRoaXMucmlnaHRTaWRlYmFyLnJlZnJlc2hSZWdPUE5Qb3RuaU5hbG9naVN1bW1hcnkoXCIjb3BuUG90bmlOYWxvZ2lTdW1tYXJ5XCIsIFwiI3Nhb3BMb2FkaW5nU2lkZWJhcnJcIik7XHJcbiAgICB9XHJcblxyXG4gICAgYmluZEFkZEV2ZW50KCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJEYXNoYm9hcmRUcmF2ZWxPcmRlclZpZXcuYmluZEdyaWRFdmVudHNcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgJCh0aGlzLl9hZGRUcmF2ZWxPcmRlcklkKS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAkKHRoaXMuX2FkZFRyYXZlbE9yZGVySWQpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChyb3cpIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIkRhc2hib2FyZFRyYXZlbE9yZGVyVmlldy5fYWRkVHJhdmVsT3JkZXIuY2xpY2tcIik7XHJcbiAgICAgICAgICAgIF90aGlzLm9wblBvdG5pTmFsb2dpR3JpZC5hZGRSZWNvcmQoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgXHJcbiAgICAvL1xyXG59XHJcblxyXG5cclxuIiwi77u/Ly8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9hbGVydGlmeS9pbmRleC5kLnRzXCIgLz5cclxuaW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBEYXNoYm9hcmRUb2RheUV2ZW50c1ZpZXcgfSBmcm9tICcuL3Nhb3AtZGFzaGJvYXJkLXRvZGF5RXZlbnRzLXZpZXcnO1xyXG5pbXBvcnQgeyBEYXNoYm9hcmRBYnNlbmNlc1ZpZXcgfSBmcm9tICcuL3Nhb3AtZGFzaGJvYXJkLWFic2VuY2VzLXZpZXcnO1xyXG5pbXBvcnQgeyBEYXNoYm9hcmRBYnNlbmNlQ29uZmlybWF0aW9uVmlldyB9IGZyb20gJy4vc2FvcC1kYXNoYm9hcmQtYWJzZW5jZS1jb25maXJtYXRpb24tdmlldyc7XHJcbmltcG9ydCB7IFNhb3BSaWdodFNpZGViYXIsIFNhb3BSaWdodFNpZGViYXJWaWV3IH0gZnJvbSAnLi4vQ29tcG9uZW50cy9zYW9wLXJpZ2h0LXNpZGViYXInO1xyXG5pbXBvcnQgeyBEYXNoYm9hcmRUcmF2ZWxPcmRlclZpZXcgfSBmcm9tICcuL3Nhb3AtZGFzaGJvYXJkLXRyYXZlbE9yZGVyLXZpZXcnO1xyXG5pbXBvcnQgeyBEYXNoYm9hcmRJbnRlcm5hbE9yZGVyVmlldyB9IGZyb20gXCIuL3Nhb3AtZGFzaGJvYXJkLWludGVybmFsT3JkZXItdmlld1wiO1xyXG5pbXBvcnQgeyBEYXNoYm9hcmRNeUdyYWRlc1ZpZXcgfSBmcm9tIFwiLi9zYW9wLWRhc2hib2FyZC1teUdyYWRlcy12aWV3XCI7XHJcbmltcG9ydCB7IERhc2hib2FyZExJS1ZDb25maXJtYXRpb25WaWV3IH0gZnJvbSBcIi4vc2FvcC1kYXNoYm9hcmQtTElLQ29uZmlybWF0aW9uLXZpZXdcIjtcclxuaW1wb3J0IHsgRGFzaGJvYXJkRW1wbG95ZWVQcmVzZW5jZVZpZXcgfSBmcm9tIFwiLi9zYW9wLWRhc2hib2FyZC1lbXBsb3llZVByZXNlbmNlLXZpZXdcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wRGFzaGJvYXJkVmlldyB7XHJcbiAgICBwcml2YXRlIF9saWJOYW1lOnN0cmluZztcclxuICAgIHByaXZhdGUgX2NhcmQxOkpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgICBwcml2YXRlIF9jYXJkMjogSlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIHByaXZhdGUgX2NhcmQzOiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gICAgcHJpdmF0ZSBfY2FyZDQ6IEpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgICBwcml2YXRlIF9jYXJkNTogSlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIHByaXZhdGUgX2NhcmQ2OiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gICAgcHJpdmF0ZSBfY2FyZDc6IEpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgICBwcml2YXRlIF9jYXJkODogSlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuXHJcbiAgICAvL1xyXG4gICAgcHVibGljIGRhc2hib2FyZFRvZGF5RXZlbnRzOkRhc2hib2FyZFRvZGF5RXZlbnRzVmlldztcclxuICAgIHB1YmxpYyBkYXNoYm9hcmRBYnNlbmNlczogRGFzaGJvYXJkQWJzZW5jZXNWaWV3O1xyXG4gICAgcHVibGljIGRhc2hib2FyZEFic2VuY2VDb25maXJtYXRpb25WaWV3OiBEYXNoYm9hcmRBYnNlbmNlQ29uZmlybWF0aW9uVmlldztcclxuICAgIHB1YmxpYyBkYXNoYm9hcmRUcmF2ZWxPcmRlclZpZXc6IERhc2hib2FyZFRyYXZlbE9yZGVyVmlldztcclxuICAgIHB1YmxpYyBkYXNoYm9hcmRJbnRlcm5hbE9yZGVyVmlldzogRGFzaGJvYXJkSW50ZXJuYWxPcmRlclZpZXc7XHJcbiAgICBwdWJsaWMgZGFzaGJvYXJkTXlHcmFkZXNWaWV3OiBEYXNoYm9hcmRNeUdyYWRlc1ZpZXc7XHJcbiAgICBwdWJsaWMgZGFzaGJvYXJkTElLVkNvbmZpcm1hdGlvblZpZXc6IERhc2hib2FyZExJS1ZDb25maXJtYXRpb25WaWV3O1xyXG4gICAgcHVibGljIGRhc2hib2FyZEVtcGxveWVlUHJlc2VuY2VWaWV3OiBEYXNoYm9hcmRFbXBsb3llZVByZXNlbmNlVmlldztcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihsaWJOYW1lOiBzdHJpbmcgPSBcIlwiKSB7XHJcbiAgICAgICAgdGhpcy5fbGliTmFtZSA9IGxpYk5hbWU7XHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLmRhc2hib2FyZFRvZGF5RXZlbnRzID0gbmV3IERhc2hib2FyZFRvZGF5RXZlbnRzVmlldyh0aGlzLl9saWJOYW1lICsgXCIuZGFzaGJvYXJkVG9kYXlFdmVudHNcIik7XHJcbiAgICAgICAgdGhpcy5kYXNoYm9hcmRBYnNlbmNlcyA9IG5ldyBEYXNoYm9hcmRBYnNlbmNlc1ZpZXcodGhpcy5fbGliTmFtZSArIFwiLmRhc2hib2FyZEFic2VuY2VzXCIpO1xyXG4gICAgICAgIHRoaXMuZGFzaGJvYXJkQWJzZW5jZUNvbmZpcm1hdGlvblZpZXcgPSBuZXcgRGFzaGJvYXJkQWJzZW5jZUNvbmZpcm1hdGlvblZpZXcodGhpcy5fbGliTmFtZSArIFwiLmRhc2hib2FyZEFic2VuY2VDb25maXJtYXRpb25WaWV3XCIpO1xyXG4gICAgICAgIHRoaXMuZGFzaGJvYXJkVHJhdmVsT3JkZXJWaWV3ID0gbmV3IERhc2hib2FyZFRyYXZlbE9yZGVyVmlldyh0aGlzLl9saWJOYW1lICsgXCIuZGFzaGJvYXJkVHJhdmVsT3JkZXJWaWV3XCIpO1xyXG4gICAgICAgIHRoaXMuZGFzaGJvYXJkSW50ZXJuYWxPcmRlclZpZXcgPSBuZXcgRGFzaGJvYXJkSW50ZXJuYWxPcmRlclZpZXcodGhpcy5fbGliTmFtZSArIFwiLmRhc2hib2FyZEludGVybmFsT3JkZXJWaWV3XCIpO1xyXG4gICAgICAgIHRoaXMuZGFzaGJvYXJkTXlHcmFkZXNWaWV3ID0gbmV3IERhc2hib2FyZE15R3JhZGVzVmlldyh0aGlzLl9saWJOYW1lICsgXCIuZGFzaGJvYXJkTXlHcmFkZXNWaWV3XCIpO1xyXG4gICAgICAgIHRoaXMuZGFzaGJvYXJkTElLVkNvbmZpcm1hdGlvblZpZXcgPSBuZXcgRGFzaGJvYXJkTElLVkNvbmZpcm1hdGlvblZpZXcodGhpcy5fbGliTmFtZSArIFwiLmRhc2hib2FyZExJS1ZDb25maXJtYXRpb25WaWV3XCIpO1xyXG4gICAgICAgIHRoaXMuZGFzaGJvYXJkRW1wbG95ZWVQcmVzZW5jZVZpZXcgPSBuZXcgRGFzaGJvYXJkRW1wbG95ZWVQcmVzZW5jZVZpZXcodGhpcy5fbGliTmFtZSArIFwiLmRhc2hib2FyZEVtcGxveWVlQXR0ZW5kYW5jZVZpZXdcIik7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdERhc2hib2FyZFZpZXcoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImluaXREYXNoYm9hcmRWaWV3XCIpO1xyXG4gICAgICAgIHRoaXMuX2NhcmQxID0gJChcIiNjYXJkMVwiKTtcclxuICAgICAgICB0aGlzLl9jYXJkMiA9ICQoXCIjY2FyZDJcIik7XHJcbiAgICAgICAgdGhpcy5fY2FyZDMgPSAkKFwiI2NhcmQzXCIpO1xyXG4gICAgICAgIHRoaXMuX2NhcmQ0ID0gJChcIiNjYXJkNFwiKTtcclxuICAgICAgICB0aGlzLl9jYXJkNSA9ICQoXCIjY2FyZDVcIik7XHJcbiAgICAgICAgdGhpcy5fY2FyZDYgPSAkKFwiI2NhcmQ2XCIpOyAgICAgICBcclxuICAgICAgICB0aGlzLl9jYXJkNyA9ICQoXCIjY2FyZDdcIik7IFxyXG4gICAgICAgIHRoaXMuX2NhcmQ4ID0gJChcIiNjYXJkOFwiKTtcclxuXHJcbiAgICAgICAgJChcIiNzaXRlLW1haW5cIikuYWRkQ2xhc3MoXCJzaXRlLW1haW4td2l0aC1mb3JtU2lkZWJhcnJcIik7XHJcblxyXG4gICAgICAgIGxldCBfcmlnaHRTaWRlYmFyOiBTYW9wUmlnaHRTaWRlYmFyID0gbmV3IFNhb3BSaWdodFNpZGViYXIoKTtcclxuICAgICAgICBfcmlnaHRTaWRlYmFyLmJpbmRDYXJvdXNlbERpdihcIiNyaWdodC1zaWRlYmFyLWFqYXhcIiwgU2FvcFJpZ2h0U2lkZWJhclZpZXcuRGFzaGJvYXJkKTtcclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoQWxsRGF0YSgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcERhc2hib2FyZFZpZXcucmVmcmVzaEFsbERhdGFcIik7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NhcmQxLmxlbmd0aCl7XHJcbiAgICAgICAgICAgIHRoaXMuZGFzaGJvYXJkVG9kYXlFdmVudHMucmVmcmVzaEdyaWREYXRhKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9jYXJkMi5sZW5ndGgpe1xyXG4gICAgICAgICAgICB0aGlzLmRhc2hib2FyZEFic2VuY2VzLnJlZnJlc2hHcmlkRGF0YSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fY2FyZDMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGFzaGJvYXJkQWJzZW5jZUNvbmZpcm1hdGlvblZpZXcucmVmcmVzaEdyaWREYXRhKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9jYXJkNC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5kYXNoYm9hcmRJbnRlcm5hbE9yZGVyVmlldy5yZWZyZXNoR3JpZERhdGEoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9jYXJkNS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5kYXNoYm9hcmRNeUdyYWRlc1ZpZXcucmVmcmVzaEdyaWREYXRhKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fY2FyZDYubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGFzaGJvYXJkTElLVkNvbmZpcm1hdGlvblZpZXcucmVmcmVzaEdyaWREYXRhKCk7XHJcbiAgICAgICAgfSAgICAgICBcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NhcmQ3Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmRhc2hib2FyZFRyYXZlbE9yZGVyVmlldy5yZWZyZXNoR3JpZERhdGEoKTtcclxuICAgICAgICB9ICAgICAgICBcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NhcmQ4Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmRhc2hib2FyZEVtcGxveWVlUHJlc2VuY2VWaWV3LnJlZnJlc2hHcmlkRGF0YSgpO1xyXG4gICAgICAgIH0gICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIC8vXHJcbn1cclxuXHJcblxyXG4iLCLvu79pbXBvcnQgeyBmaWx0ZXJUYWJsZVJvd3MsIGdsb2JhbCwgaXNVbkRlZmluZWQgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BXZWJEYXRhVGFibGUsIFNhb3BXZWJHcmlkLCBTYW9wV2ViR3JpZFByb3BlcnRpZXMsIFNhb3BXZWJHcmlkVG9vbGJhciwgU2FvcFdlYkdyaWRUb29sYmFyQnV0dG9uIH0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC1ncmlkXCI7XHJcbmltcG9ydCB7IFNhb3BNZXNzYWdlRGxnLCBTYW9wTXNnRGxnQnV0dG9uIH0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC1tZXNzYWdlLWRsZ1wiO1xyXG5pbXBvcnQgeyBTYW9wU2VydmljZXNDb3JlIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC1zZXJ2aWNlcy1jb3JlXCI7XHJcbmltcG9ydCB7IFNhb3BUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXRyYW5zbGF0ZVwiO1xyXG5pbXBvcnQgeyBTYW9wVmlld0Zvcm0sIFNhb3BXZkFjdGlvbiB9IGZyb20gXCIuLi9Db3JlL3Nhb3Atdmlldy1mb3JtXCI7XHJcbmltcG9ydCB7IEtFRW1wbG95ZWVHcmFkZXNFZGl0VmlldyB9IGZyb20gXCIuL0tFRW1wbG95ZWVHcmFkZXNFZGl0LXZpZXdcIjtcclxuXHJcbmNsYXNzIEVtcGxveWVlR3JhZGVzRGF0YSB7XHJcbiAgICBzaWZyYU9jZW5PYmRvYmphOiBzdHJpbmc7XHJcbiAgICBzaWZyYW9jZW5vYmRvYmphRmluZ2VycHJpbnQ6IHN0cmluZztcclxuICAgIHNpZnJhWmFwb3NsZW5pOiBzdHJpbmc7XHJcbiAgICBpc09jZW5PYmRvYmphU3RhdHVzQWN0aXZlOiBib29sZWFuO1xyXG4gICAgZmluZ2VycHJpbnQ6IHN0cmluZztcclxuICAgIGZvcm1UaXRsZTogc3RyaW5nXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBLRUFsbEVtcGxveWVlc0dyYWRlc1ZpZXcgZXh0ZW5kcyBTYW9wVmlld0Zvcm0ge1xyXG4gICAgcHJpdmF0ZSB2aWV3SWQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgbGliTmFtZTogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfbG9hZGluZ1NwaW5uZXJJZDogc3RyaW5nID0gXCJhbGxFbXBsb3llZXNHcmFkZXNGb3JtTG9hZGluZ1wiO1xyXG4gICAgcHJpdmF0ZSBfYnV0dG9uQ2xvc2VJZDogc3RyaW5nID0gXCJidG5DbG9zZVwiO1xyXG4gICAgcHJpdmF0ZSBkaXZJZDogc3RyaW5nID0gXCIjYWxsRW1wbG95ZWVzR3JhZGVzRm9ybVwiO1xyXG4gICAgcHJpdmF0ZSB3ZWJHcmlkSWQ6IHN0cmluZyA9IFwiI2FsbEVtcGxveWVlc0dyYWRlc0dyaWRcIjtcclxuICAgIHByaXZhdGUgd2ViR3JpZFJvd3NCb2R5SWQ6IHN0cmluZyA9IFwiI2FsbEVtcGxveWVlc0dyYWRlc0dyaWRCb2R5QWpheFwiO1xyXG4gICAgcHJpdmF0ZSBfbWFzc1Zub3NCdG5JZDogc3RyaW5nID0gXCIjZWRpdE1hc3NBbGxFbXBsb3llZXNHcmFkZXNcIjtcclxuICAgIHByaXZhdGUgX2NvbENoZWNrYm94QWxsSWQ6IHN0cmluZyA9IFwiI2NvbENoZWNrYm94QWxsXCI7XHJcbiAgICBwcml2YXRlIF9rZUVtcGxveWVlR3JhZGVzRWRpdFZpZXc6IEtFRW1wbG95ZWVHcmFkZXNFZGl0VmlldztcclxuICAgIHB1YmxpYyB3ZWJHcmlkOiBTYW9wV2ViR3JpZDtcclxuICAgIHB1YmxpYyBmb3JtVHJhbnNsYXRpb25TZXJ2aWNlOiBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlO1xyXG5cclxuICAgIHByaXZhdGUgX3NlYXJjaFZhbHVlSWQ6IHN0cmluZyA9IFwiI0FsbEVtcGxveWVlc0dyYWRlc1RhYmxlU2VhcmNoVmFsdWVcIjtcclxuICAgIHByaXZhdGUgX21haW5Gb3JtRGl2OiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gICAgcHJpdmF0ZSBfc2VhcmNoVmFsdWU6IEpRdWVyeTxIVE1MRWxlbWVudD47XHJcblxyXG4gICAgY29uc3RydWN0b3Iodmlld0lkOnN0cmluZyxsaWJOYW1lOnN0cmluZyA9IFwiXCIpe1xyXG4gICAgICAgIHN1cGVyKHZpZXdJZCwgbGliTmFtZSk7XHJcblxyXG4gICAgICAgIHRoaXMudmlld0lkID0gdmlld0lkO1xyXG4gICAgICAgIHRoaXMubGliTmFtZSA9IGxpYk5hbWU7IFxyXG5cclxuICAgICAgICB0aGlzLnNldERpY3Rpb25hcnkoKTsgXHJcbiAgICAgICAgdGhpcy50aXRsZSA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5hZGRSZWNvcmRFbmRwb2ludCA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5lZGl0UmVjb3JkRW5kcG9pbnQgPSBcIktlQWxsRW1wbG95ZWVzR3JhZGVzQWRtaW5pc3RyYXRpb24vR2V0QWxsRW1wbG95ZWVzR3JhZGVzXCI7XHJcbiAgICAgICAgdGhpcy5kZWxldGVSZWNvcmRFbmRwb2ludCA9IFwiXCI7IFxyXG5cclxuICAgICAgICB0aGlzLmZvcm1UcmFuc2xhdGlvblNlcnZpY2UgPSBuZXcgU2FvcFRyYW5zbGF0aW9uU2VydmljZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldERpY3Rpb25hcnkoKXtcclxuICAgICAgICB0aGlzLnNldFRlcm1pbm9sb2d5TGlzdCgpO1xyXG4gICAgfSBcclxuXHJcbiAgICBwdWJsaWMgYWZ0ZXJWaWV3U2hvd1N1Y2Nlc3Moc2VuZGVyOmFueSk6dm9pZHtcclxuICAgICAgICB0aGlzLkxvYWRWaWV3RXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIExvYWRWaWV3RXZlbnRzICgpOnZvaWR7XHJcbiAgICAgICAgbGV0IF92aWV3RGl2ID0gJCh0aGlzLmlkKTtcclxuICAgICAgICBpZiAoX3ZpZXdEaXYubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzaG93Rm9ybShkYXRhOiBhbnksIGZ1bGxUaXRsZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIktFQWxsRW1wbG95ZWVzR3JhZGVzVmlldy5zaG93Rm9ybVwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5mdWxsVGl0bGUgPSBmdWxsVGl0bGU7XHJcbiAgICAgICAgdGhpcy5yZWNvcmREZXRhaWxzKGRhdGEpO1xyXG4gICAgICAgIHRoaXMuU2V0VG9GdWxsU2NyZWVuKCk7IFxyXG5cclxuICAgICAgICB0aGlzLnZpZXdTaG93Q29tcGxldGUgPSB0aGlzLmluaXRGb3JtLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdEZvcm0oKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIktFQWxsRW1wbG95ZWVzR3JhZGVzVmlldy5pbml0Rm9ybVwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fbWFpbkZvcm1EaXYgPSAkKHRoaXMuZGl2SWQpO1xyXG5cclxuICAgICAgICAvLyBwcmV2YWphbmplXHJcbiAgICAgICAgdGhpcy5zZXRGb3JtVGVybWlub2xvZ3lMaXN0KCk7XHJcblxyXG4gICAgICAgIC8vIGluaXQgZ3JpZCBcclxuICAgICAgICB0aGlzLmdldFdlYkdyaWRUb29sYmFyQW5kSW5pdFdlYkdyaWQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0RWRpdFZpZXcoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldEZvcm1UZXJtaW5vbG9neUxpc3QoKSB7XHJcbiAgICAgICAgbGV0IHRlcm1pbm9sb2d5ID0gW1wiTWFzb3ZuaSB2bm9zXCJdO1xyXG5cclxuICAgICAgICB0aGlzLmZvcm1UcmFuc2xhdGlvblNlcnZpY2Uuc2V0VHJhbnNsYXRpb25zTGlzdCh0ZXJtaW5vbG9neSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRXZWJHcmlkVG9vbGJhckFuZEluaXRXZWJHcmlkKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJLRUFsbEVtcGxveWVlc0dyYWRlc1ZpZXcuZ2V0V2ViR3JpZFRvb2xiYXJBbmRJbml0V2ViR3JpZFwiKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgaXNTdGF0dXNBY3RpdmUgPSB0aGlzLl9tYWluRm9ybURpdi5hdHRyKFwiZGF0YS1pc29jZW5vYmRvYmphc3RhdHVzYWN0aXZlXCIpO1xyXG4gICAgICAgIGxldCBpc09jZW5PYmRvYmphU3RhdHVzQWN0aXZlID0gaXNTdGF0dXNBY3RpdmUgPT09IFwiVHJ1ZVwiID8gdHJ1ZSA6IGZhbHNlO1xyXG5cclxuICAgICAgICBsZXQgcGFyYW1zID0geyBqYXZhc2NyaXB0S25qaXpuaWNhOiBfdGhpcy5saWJOYW1lLCBJc09jZW5PYmRvYmphU3RhdHVzQWN0aXZlOiBpc09jZW5PYmRvYmphU3RhdHVzQWN0aXZlIH07XHJcblxyXG4gICAgICAgIGxldCBzYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICBfdGhpcy5pbml0V2ViR3JpZChyZXNwb25zZSk7XHJcbiAgICAgICAgICAgIF90aGlzLmluaXRGaWx0ZXJDb250cm9scygpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOiBcIktlQWxsRW1wbG95ZWVzR3JhZGVzQWRtaW5pc3RyYXRpb24vR2V0VGFibGVUb29sYmFyXCJcclxuICAgICAgICAgICAgLCBkYXRhOiBwYXJhbXNcclxuICAgICAgICAgICAgLCB0eXBlOiBcIkdFVFwiXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0V2ViR3JpZCh0b29sYmFyVGVtcGxhdGU6IHN0cmluZyA9IFwiXCIpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiS0VBbGxFbXBsb3llZXNHcmFkZXNWaWV3LmluaXRXZWJHcmlkXCIpO1xyXG5cclxuICAgICAgICBsZXQgY2FwdGlvblRvb2xiYXIgPSAkKHRoaXMud2ViR3JpZElkKS5hdHRyKFwiY2FwdGlvbi10b29sYmFyXCIpO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy53ZWJHcmlkID0gbmV3IFNhb3BXZWJHcmlkKHRoaXMubGliTmFtZSArIFwiLndlYkdyaWRcIik7XHJcbiAgICAgICAgdGhpcy53ZWJHcmlkLmFmdGVyQ29sdW1uQ2hlY2tib3hDaGFuZ2VkID0gdGhpcy53ZWJHcmlkQWZ0ZXJDb2x1bW5DaGVja2JveENoYW5nZWQuYmluZCh0aGlzKTtcclxuICAgICAgICBsZXQgZ3JpZFByb3BlcnRpZXM6IFNhb3BXZWJHcmlkUHJvcGVydGllcztcclxuICAgICAgICBsZXQgZ3JpZFRvb2xiYXI6IFNhb3BXZWJHcmlkVG9vbGJhcjtcclxuICAgICAgICBsZXQgdG9vbGJhckJ1dHRvbnM6IFNhb3BXZWJHcmlkVG9vbGJhckJ1dHRvbltdID0gW107XHJcbiAgICAgICAgbGV0IGRhdGFUYWJsZTogU2FvcFdlYkRhdGFUYWJsZTtcclxuXHJcbiAgICAgICAgdG9vbGJhckJ1dHRvbnMucHVzaCh7IGlkOiBcIlwiLCBjYXB0aW9uOiBcIlwiLCB0ZW1wbGF0ZTogdG9vbGJhclRlbXBsYXRlIH0pO1xyXG4gICAgICAgIGdyaWRUb29sYmFyID0geyBpZDogXCJzYW9wV2ViR3JpZFRCMVwiLCBjYXB0aW9uOiBjYXB0aW9uVG9vbGJhciwgYnV0dG9uczogdG9vbGJhckJ1dHRvbnMgfTtcclxuXHJcbiAgICAgICAgZGF0YVRhYmxlID0geyBlbmFibGVkOiB0cnVlLCBvcmRlcmluZzogdHJ1ZSB9O1xyXG5cclxuICAgICAgICBncmlkUHJvcGVydGllcyA9IHtcclxuICAgICAgICAgICAgZ3JpZElkOiB0aGlzLndlYkdyaWRJZFxyXG4gICAgICAgICAgICAsIHRvZ2dsZVBhbmVsOiB7IGVuYWJsZWQ6IGZhbHNlIH1cclxuICAgICAgICAgICAgLCB0b29sYmFyOiBncmlkVG9vbGJhclxyXG4gICAgICAgICAgICAsIGRhdGFUYWJsZTogZGF0YVRhYmxlXHJcbiAgICAgICAgfTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMud2ViR3JpZC5pbml0KGdyaWRQcm9wZXJ0aWVzKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0V2ViR3JpZExpc3RuZXJzKCk7XHJcblxyXG4gICAgICAgICQodGhpcy5kaXZJZCkuc2hvdygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdEZpbHRlckNvbnRyb2xzKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJLRUFsbEVtcGxveWVlc0dyYWRlc1ZpZXcuaW5pdEZpbHRlckNvbnRyb2xzXCIpO1xyXG5cclxuICAgICAgICB0aGlzLl9zZWFyY2hWYWx1ZSA9IHRoaXMuX21haW5Gb3JtRGl2LmZpbmQodGhpcy5fc2VhcmNoVmFsdWVJZCk7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgdGhpcy5fc2VhcmNoVmFsdWUub2ZmKFwia2V5dXBcIik7XHJcbiAgICAgICAgdGhpcy5fc2VhcmNoVmFsdWUub24oXCJrZXl1cFwiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIF90aGlzLmV4ZWN1dGVGaWx0ZXJTZWFyY2goJCh0aGlzKS52YWwoKS50b1N0cmluZygpKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGV4ZWN1dGVGaWx0ZXJTZWFyY2goc2VhcmNoVmFsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiS0VBbGxFbXBsb3llZXNHcmFkZXNWaWV3LmV4ZWN1dGVGaWx0ZXJTZWFyY2hcIik7XHJcblxyXG4gICAgICAgIC8vIHRvbGUgbmkgZGVsb3ZhbG86IGtvIHNlIGplIHNwcmVtZW5pbG8gbGV0bywgamUgc2UgdmVkbm8gZmlsdHJpcmFsIHN0YXJlIHBvZGF0a2Ugb2QgcHJlanNuamVnYSBsZXRhXHJcbiAgICAgICAgLy9sZXQgb1RhYmxlID0gdGhpcy53ZWJHcmlkLmRhdGFUYWJsZTtcclxuICAgICAgICAvL29UYWJsZS5zZWFyY2goc2VhcmNoVmFsKS5kcmF3KCk7XHJcblxyXG4gICAgICAgIGZpbHRlclRhYmxlUm93cyhzZWFyY2hWYWwsIHRoaXMuZGl2SWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVmcmVzaEFsbEVtcGxveWVlc0dyYWRlc0dyaWRSb3dzRGF0YShzZW5kZXI6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJLRUFsbEVtcGxveWVlc0dyYWRlc1ZpZXcucmVmcmVzaEFsbEVtcGxveWVlc0dyYWRlc0dyaWRSb3dzRGF0YVwiKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgcGFyYW1zID0geyBzaWZyYU9jZW5PYmRvYmphOiBzZW5kZXIuZGF0YXNpZnJhb2Nlbm9iZG9iamEsIGlzU3RhdHVzQWN0aXZlOiBzZW5kZXIuZGF0YWlzc3RhdHVzYWN0aXZlLCBmaW5nZXJwcmludDogc2VuZGVyLmRhdGFzaWZyYW9jZW5vYmRvYmphZmluZ2VycHJpbnQsIHNlbGVjdGVkU2lmcmFaYXBvc2xlbmk6IHNlbmRlci5kYXRhc2VsZWN0ZWRzaWZyYXphcG9zbGVuaSB9O1xyXG5cclxuICAgICAgICBsZXQgc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgX3RoaXMucmVmcmVzaEdyaWRSb3dzRGF0YShyZXNwb25zZSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246IFwiS2VBbGxFbXBsb3llZXNHcmFkZXNBZG1pbmlzdHJhdGlvbi9HZXRBbGxFbXBsb3llZXNHcmFkZXNUYWJsZVJvd3NcIlxyXG4gICAgICAgICAgICAsIGRhdGE6IHBhcmFtc1xyXG4gICAgICAgICAgICAsIHR5cGU6IFwiR0VUXCJcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlZnJlc2hHcmlkUm93c0RhdGEoaHRtbENvbnRlbnQ6IHN0cmluZykge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJLRUFsbEVtcGxveWVlc0dyYWRlc1ZpZXcucmVmcmVzaEdyaWRSb3dzRGF0YVwiKTtcclxuXHJcbiAgICAgICAgaWYgKCQodGhpcy53ZWJHcmlkSWQpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAkKHRoaXMud2ViR3JpZFJvd3NCb2R5SWQpLmh0bWwoaHRtbENvbnRlbnQpO1xyXG4gICAgICAgICAgICB0aGlzLmluaXRXZWJHcmlkTGlzdG5lcnMoKTtcclxuICAgICAgICAgICAgaWYgKCFpc1VuRGVmaW5lZCh0aGlzLl9zZWFyY2hWYWx1ZSkgJiYgdGhpcy5fc2VhcmNoVmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmV4ZWN1dGVGaWx0ZXJTZWFyY2godGhpcy5fc2VhcmNoVmFsdWUudmFsKCkudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0V2ViR3JpZExpc3RuZXJzKCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJLRUFsbEVtcGxveWVlc0dyYWRlc1ZpZXcuaW5pdFdlYkdyaWRMaXN0bmVyc1wiKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgLy8gcHJpa2F6IGVkaXQgc2NyZWVuIGtvIGtsaWtuZSBuYSB2cnN0aWNvXHJcbiAgICAgICAgJChcImJvZHlcIikub2ZmKFwiY2xpY2tcIiwgdGhpcy52aWV3SWQgKyBcIiBcIiArIHRoaXMud2ViR3JpZElkICsgXCIgdHIgdGQ6bm90KC50ZC1hY3Rpb24sLnRkLWFjdGlvbi1jaGVja2JveClcIik7XHJcbiAgICAgICAgJChcImJvZHlcIikub24oXCJjbGlja1wiLCB0aGlzLnZpZXdJZCArIFwiIFwiICsgdGhpcy53ZWJHcmlkSWQgKyBcIiB0ciB0ZDpub3QoLnRkLWFjdGlvbiwudGQtYWN0aW9uLWNoZWNrYm94KVwiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZFJvdyA9IDxIVE1MRWxlbWVudD4kKHRoaXMpLmNsb3Nlc3QoXCJ0clwiKVswXTtcclxuICAgICAgICAgICAgbGV0IGRhdGEgPSBfdGhpcy5nZXREYXRhQXR0cmlidXRlKHNlbGVjdGVkUm93KTtcclxuXHJcbiAgICAgICAgICAgIC8vIGJhcnZhbmplIG96bmFjZW5lIHZyc3RyaWNlXHJcbiAgICAgICAgICAgIF90aGlzLndlYkdyaWQubWFya1NlbGVjdGVkUm93KHNlbGVjdGVkUm93KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChkYXRhLmlzT2Nlbk9iZG9iamFTdGF0dXNBY3RpdmUgJiYgIWlzVW5EZWZpbmVkKGRhdGEuc2lmcmFPY2VuT2Jkb2JqYSkgJiYgIWlzVW5EZWZpbmVkKGRhdGEuc2lmcmFaYXBvc2xlbmkpKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5fa2VFbXBsb3llZUdyYWRlc0VkaXRWaWV3LnRpdGxlID0gZGF0YS5mb3JtVGl0bGU7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5fa2VFbXBsb3llZUdyYWRlc0VkaXRWaWV3LnNob3dWaWV3Rm9ybShTYW9wV2ZBY3Rpb24ud2ZhRWRpdFJlY29yZCwgeyBzaWZyYU9jZW5PYmRvYmphOiBkYXRhLnNpZnJhT2Nlbk9iZG9iamEsIHNpZnJhT2Nlbk9iZG9iamFGaW5nZXJwcmludDogZGF0YS5zaWZyYW9jZW5vYmRvYmphRmluZ2VycHJpbnQsIHNpZnJhWmFwb3NsZW5pTGlzdDogZGF0YS5zaWZyYVphcG9zbGVuaSwgaXNPY2VuT2Jkb2JqYVN0YXR1c0FjdGl2ZTogZGF0YS5pc09jZW5PYmRvYmphU3RhdHVzQWN0aXZlLCBmaW5nZXJwcmludExpc3Q6IGRhdGEuZmluZ2VycHJpbnQgfSwgbnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gcHJpa2F6IGVkaXQgc2NyZWVuIGtvIGtsaWtuZSBuYSBhY3Rpb24gc3RvbHBlY1xyXG4gICAgICAgICQoXCJib2R5XCIpLm9mZihcImNsaWNrXCIsIHRoaXMudmlld0lkICsgXCIgXCIgKyB0aGlzLndlYkdyaWRJZCArIFwiIHRyIC50ZC1hY3Rpb24gLktFQWxsRW1wbG95ZWVzR3JhZGVzR3JpZF9lZGl0XCIpO1xyXG4gICAgICAgICQoXCJib2R5XCIpLm9uKFwiY2xpY2tcIiwgdGhpcy52aWV3SWQgKyBcIiBcIiArIHRoaXMud2ViR3JpZElkICsgXCIgdHIgLnRkLWFjdGlvbiAuS0VBbGxFbXBsb3llZXNHcmFkZXNHcmlkX2VkaXRcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBsZXQgc2VsZWN0ZWRSb3cgPSA8SFRNTEVsZW1lbnQ+JCh0aGlzKS5jbG9zZXN0KFwidHJcIilbMF07XHJcbiAgICAgICAgICAgIGxldCBkYXRhID0gX3RoaXMuZ2V0RGF0YUF0dHJpYnV0ZShzZWxlY3RlZFJvdyk7XHJcblxyXG4gICAgICAgICAgICAvLyBiYXJ2YW5qZSBvem5hY2VuZSB2cnN0cmljZVxyXG4gICAgICAgICAgICBfdGhpcy53ZWJHcmlkLm1hcmtTZWxlY3RlZFJvdyhzZWxlY3RlZFJvdyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZGF0YS5pc09jZW5PYmRvYmphU3RhdHVzQWN0aXZlICYmICFpc1VuRGVmaW5lZChkYXRhLnNpZnJhT2Nlbk9iZG9iamEpICYmICFpc1VuRGVmaW5lZChkYXRhLnNpZnJhWmFwb3NsZW5pKSkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuX2tlRW1wbG95ZWVHcmFkZXNFZGl0Vmlldy50aXRsZSA9IGRhdGEuZm9ybVRpdGxlO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuX2tlRW1wbG95ZWVHcmFkZXNFZGl0Vmlldy5zaG93Vmlld0Zvcm0oU2FvcFdmQWN0aW9uLndmYUVkaXRSZWNvcmQsIHsgc2lmcmFPY2VuT2Jkb2JqYTogZGF0YS5zaWZyYU9jZW5PYmRvYmphLCBzaWZyYU9jZW5PYmRvYmphRmluZ2VycHJpbnQ6IGRhdGEuc2lmcmFvY2Vub2Jkb2JqYUZpbmdlcnByaW50LCBzaWZyYVphcG9zbGVuaUxpc3Q6IGRhdGEuc2lmcmFaYXBvc2xlbmksIGlzT2Nlbk9iZG9iamFTdGF0dXNBY3RpdmU6IGRhdGEuaXNPY2VuT2Jkb2JqYVN0YXR1c0FjdGl2ZSwgZmluZ2VycHJpbnRMaXN0OiBkYXRhLmZpbmdlcnByaW50IH0sIG51bGwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQoXCJib2R5XCIpLm9mZihcImNsaWNrXCIsIHRoaXMudmlld0lkICsgXCIgXCIgKyB0aGlzLndlYkdyaWRJZCArIFwiIHRyIC5zYW9wLXRkLWlucHV0LWNoZWNrYm94XCIpO1xyXG4gICAgICAgICQoXCJib2R5XCIpLm9uKFwiY2xpY2tcIiwgdGhpcy52aWV3SWQgKyBcIiBcIiArIHRoaXMud2ViR3JpZElkICsgXCIgdHIgLnNhb3AtdGQtaW5wdXQtY2hlY2tib3hcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBfdGhpcy53ZWJHcmlkQWZ0ZXJDb2x1bW5DaGVja2JveENoYW5nZWQoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJChcImJvZHlcIikub2ZmKFwiY2xpY2tcIiwgdGhpcy52aWV3SWQgKyBcIiBcIiArIHRoaXMuX2NvbENoZWNrYm94QWxsSWQpO1xyXG4gICAgICAgICQoXCJib2R5XCIpLm9uKFwiY2xpY2tcIiwgdGhpcy52aWV3SWQgKyBcIiBcIiArIHRoaXMuX2NvbENoZWNrYm94QWxsSWQsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgX3RoaXMud2ViR3JpZEFmdGVyQ29sdW1uQ2hlY2tib3hBbGxDaGFuZ2VkKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQodGhpcy52aWV3SWQgKyBcIiBcIiArIHRoaXMuX2NvbENoZWNrYm94QWxsSWQpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XHJcbiAgICAgICAgJCh0aGlzLnZpZXdJZCArIFwiIFwiICsgX3RoaXMuX21hc3NWbm9zQnRuSWQpLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IEVtcGxveWVlR3JhZGVzRGF0YSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIktFQWxsRW1wbG95ZWVzR3JhZGVzVmlldy5nZXREYXRhQXR0cmlidXRlXCIpO1xyXG5cclxuICAgICAgICBsZXQgZGF0YSA9IG5ldyBFbXBsb3llZUdyYWRlc0RhdGEoKTtcclxuXHJcbiAgICAgICAgZGF0YS5zaWZyYU9jZW5PYmRvYmphID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXNpZnJhb2Nlbm9iZG9iamFcIik7XHJcbiAgICAgICAgZGF0YS5zaWZyYW9jZW5vYmRvYmphRmluZ2VycHJpbnQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtc2lmcmFvY2Vub2Jkb2JqYWZpbmdlcnByaW50XCIpO1xyXG4gICAgICAgIGRhdGEuc2lmcmFaYXBvc2xlbmkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtc2lmcmF6YXBvc2xlbmlcIik7XHJcbiAgICAgICAgbGV0IGlzU3RhdHVzQWN0aXZlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWlzb2Nlbm9iZG9iamFzdGF0dXNhY3RpdmVcIik7XHJcbiAgICAgICAgZGF0YS5pc09jZW5PYmRvYmphU3RhdHVzQWN0aXZlID0gaXNTdGF0dXNBY3RpdmUgPT09IFwiVHJ1ZVwiID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgIGRhdGEuZmluZ2VycHJpbnQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtZmluZ2VycHJpbnRcIik7XHJcbiAgICAgICAgZGF0YS5mb3JtVGl0bGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtZm9ybXRpdGxlXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0RWRpdFZpZXcoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIktFQWxsRW1wbG95ZWVzR3JhZGVzVmlldy5pbml0RWRpdFZpZXdcIik7XHJcblxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuX2tlRW1wbG95ZWVHcmFkZXNFZGl0VmlldyA9IG5ldyBLRUVtcGxveWVlR3JhZGVzRWRpdFZpZXcoXCIja2VHcmFkZXNBZG1pbmlzdHJhdGlvblZpZXcwMDNcIiwgdGhpcy5saWJOYW1lICsgXCIuX2tlRW1wbG95ZWVHcmFkZXNFZGl0Vmlld1wiKTtcclxuICAgICAgICB0aGlzLl9rZUVtcGxveWVlR3JhZGVzRWRpdFZpZXcuZnVsbFNjcmVlbiA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fa2VFbXBsb3llZUdyYWRlc0VkaXRWaWV3LnJlZnJlc2hEYXRhID0gdGhpcy5yZWZyZXNoQWxsRW1wbG95ZWVzR3JhZGVzR3JpZFJvd3NEYXRhLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgd2ViR3JpZEFmdGVyQ29sdW1uQ2hlY2tib3hDaGFuZ2VkKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJLRUFsbEVtcGxveWVlc0dyYWRlc1ZpZXcud2ViR3JpZEFmdGVyQ29sdW1uQ2hlY2tib3hDaGFuZ2VkXCIpO1xyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICAvLyBkaXNhYmxlZCBtYXNzIHZub3MgZ3VtYmFcclxuICAgICAgICAkKF90aGlzLnZpZXdJZCArIFwiIFwiICsgX3RoaXMuX21hc3NWbm9zQnRuSWQpLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7XHJcblxyXG4gICAgICAgIC8vIGFsaSBqZSBrYWtzZW4gY2hlY2tvYnggb3puYWNlbj8gRGEgbmFzdGF2aW1vIGd1bWIgemEgbWFzb3ZubyBrcGlyYW5qZSBlbmFibGVkXHJcbiAgICAgICAgJCh0aGlzLnZpZXdJZCArIFwiIFwiICsgdGhpcy53ZWJHcmlkSWQgKyBcIiB0ciB0ZCBpbnB1dC5zYW9wLXRkLWlucHV0LWNoZWNrYm94XCIpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBsZXQgY2hlY2tlZCA9ICQodGhpcykuaXMoXCI6Y2hlY2tlZFwiKTtcclxuICAgICAgICAgICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgICAgICAgICAgICQoX3RoaXMudmlld0lkICsgXCIgXCIgKyBfdGhpcy5fbWFzc1Zub3NCdG5JZCkucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGVkaXRNYXNzRGF0YSgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiS0VBbGxFbXBsb3llZXNHcmFkZXNWaWV3LmVkaXRNYXNzRGF0YVwiKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgc2V6bmFtU2lmcmFaYXBvc2xlbmk6IHN0cmluZ1tdID0gW107XHJcbiAgICAgICAgbGV0IHNlem5hbUZpbmdlcnByaW50OiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICAgIGxldCBkYXRhU2lmcmFPY2VuT2Jkb2JqYTogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICBsZXQgZGF0YVNpZnJhb2Nlbm9iZG9iamFGaW5nZXJwcmludDogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICBsZXQgZGF0YUlzT2Nlbk9iZG9iamFTdGF0dXNBY3RpdmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLy9wb2lzY2VtbyB2c2Ugb3puYWNlbmUgc2lmcmUgemFwb3NsZW5paFxyXG4gICAgICAgICQodGhpcy52aWV3SWQgKyBcIiBcIiArIHRoaXMud2ViR3JpZElkICsgXCIgdHIgdGQgaW5wdXQuc2FvcC10ZC1pbnB1dC1jaGVja2JveFwiKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgbGV0IGNoZWNrZWQgPSAkKHRoaXMpLmlzKFwiOmNoZWNrZWRcIik7XHJcbiAgICAgICAgICAgIGlmIChjaGVja2VkKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRSb3cgPSA8SFRNTEVsZW1lbnQ+JCh0aGlzKS5jbG9zZXN0KFwidHJcIilbMF07XHJcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IF90aGlzLmdldERhdGFBdHRyaWJ1dGUoc2VsZWN0ZWRSb3cpO1xyXG5cclxuICAgICAgICAgICAgICAgIGRhdGFTaWZyYU9jZW5PYmRvYmphID0gZGF0YS5zaWZyYU9jZW5PYmRvYmphO1xyXG4gICAgICAgICAgICAgICAgZGF0YVNpZnJhb2Nlbm9iZG9iamFGaW5nZXJwcmludCA9IGRhdGEuc2lmcmFvY2Vub2Jkb2JqYUZpbmdlcnByaW50O1xyXG4gICAgICAgICAgICAgICAgZGF0YUlzT2Nlbk9iZG9iamFTdGF0dXNBY3RpdmUgPSBkYXRhLmlzT2Nlbk9iZG9iamFTdGF0dXNBY3RpdmU7XHJcblxyXG4gICAgICAgICAgICAgICAgc2V6bmFtU2lmcmFaYXBvc2xlbmkucHVzaChkYXRhLnNpZnJhWmFwb3NsZW5pKTtcclxuICAgICAgICAgICAgICAgIHNlem5hbUZpbmdlcnByaW50LnB1c2goZGF0YS5maW5nZXJwcmludCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKHNlem5hbVNpZnJhWmFwb3NsZW5pLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgX3RoaXMuX2tlRW1wbG95ZWVHcmFkZXNFZGl0Vmlldy50aXRsZSA9IHRoaXMuZm9ybVRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJNYXNvdm5pIHZub3NcIik7XHJcbiAgICAgICAgICAgIF90aGlzLl9rZUVtcGxveWVlR3JhZGVzRWRpdFZpZXcuc2hvd1ZpZXdGb3JtKFNhb3BXZkFjdGlvbi53ZmFFZGl0UmVjb3JkLCB7IHNpZnJhT2Nlbk9iZG9iamE6IGRhdGFTaWZyYU9jZW5PYmRvYmphLCBzaWZyYU9jZW5PYmRvYmphRmluZ2VycHJpbnQ6IGRhdGFTaWZyYW9jZW5vYmRvYmphRmluZ2VycHJpbnQsIHNpZnJhWmFwb3NsZW5pTGlzdDogc2V6bmFtU2lmcmFaYXBvc2xlbmkudG9TdHJpbmcoKSwgaXNPY2VuT2Jkb2JqYVN0YXR1c0FjdGl2ZTogZGF0YUlzT2Nlbk9iZG9iamFTdGF0dXNBY3RpdmUsIGZpbmdlcnByaW50TGlzdDogc2V6bmFtRmluZ2VycHJpbnQudG9TdHJpbmcoKSB9LCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICB9IFxyXG5cclxuICAgIHdlYkdyaWRBZnRlckNvbHVtbkNoZWNrYm94QWxsQ2hhbmdlZCgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiS0VBbGxFbXBsb3llZXNHcmFkZXNWaWV3LndlYkdyaWRBZnRlckNvbHVtbkNoZWNrYm94QWxsQ2hhbmdlZFwiKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgbGV0IGFsbENoZWNrYm94Q2hlY2tlZCA9ICQodGhpcy52aWV3SWQgKyBcIiBcIiArIHRoaXMuX2NvbENoZWNrYm94QWxsSWQpLmlzKFwiOmNoZWNrZWRcIik7XHJcbiAgICAgICAgJChfdGhpcy52aWV3SWQgKyBcIiBcIiArIF90aGlzLl9tYXNzVm5vc0J0bklkKS5wcm9wKCdkaXNhYmxlZCcsICFhbGxDaGVja2JveENoZWNrZWQpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIG5hc3RhdmltbyB2cmVkbm9zdGkgdnNlaCBjaGVja2JveG92XHJcbiAgICAgICAgJCh0aGlzLnZpZXdJZCArIFwiIFwiICsgdGhpcy53ZWJHcmlkSWQgKyBcIiB0ciB0ZCBpbnB1dC5zYW9wLXRkLWlucHV0LWNoZWNrYm94XCIpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAkKHRoaXMpLnByb3AoJ2NoZWNrZWQnLCBhbGxDaGVja2JveENoZWNrZWQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFZpZXdGb3JtIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC12aWV3LWZvcm1cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBLRUVtcGxveWVlR3JhZGVzRWRpdFZpZXcgZXh0ZW5kcyBTYW9wVmlld0Zvcm0ge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHZpZXdJZDpzdHJpbmcsbGliTmFtZTpzdHJpbmcgPSBcIlwiKXtcclxuICAgICAgICBzdXBlcih2aWV3SWQsIGxpYk5hbWUpO1xyXG4gICAgICAgIHRoaXMuc2V0RGljdGlvbmFyeSgpOyBcclxuICAgICAgICB0aGlzLnRpdGxlID0gXCJcIjtcclxuICAgICAgICB0aGlzLmFkZFJlY29yZEVuZHBvaW50ID0gXCJcIjtcclxuICAgICAgICB0aGlzLmVkaXRSZWNvcmRFbmRwb2ludCA9IFwiS2VBbGxFbXBsb3llZXNHcmFkZXNBZG1pbmlzdHJhdGlvbi9FZGl0RW1wbG95ZWVHcmFkZXNcIjtcclxuICAgICAgICB0aGlzLmRlbGV0ZVJlY29yZEVuZHBvaW50ID0gXCJcIjsgXHJcbiAgICB9XHJcblxyXG4gICAgc2V0RGljdGlvbmFyeSgpe1xyXG4gICAgICAgIHRoaXMuc2V0VGVybWlub2xvZ3lMaXN0KCk7XHJcbiAgICB9IFxyXG5cclxuICAgIHB1YmxpYyBhZnRlclZpZXdTaG93U3VjY2VzcyhzZW5kZXI6YW55KTp2b2lke1xyXG4gICAgICAgIHRoaXMuTG9hZFZpZXdFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgTG9hZFZpZXdFdmVudHMgKCk6dm9pZHtcclxuICAgICAgICBsZXQgX3ZpZXdEaXYgPSAkKHRoaXMuaWQpO1xyXG4gICAgICAgIGlmIChfdmlld0Rpdi5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNob3dGb3JtKGRhdGE6IGFueSwgdGl0bGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJLRUVtcGxveWVlR3JhZGVzRWRpdFZpZXcuc2hvd0Zvcm1cIik7XHJcblxyXG4gICAgICAgIHRoaXMudGl0bGUgPSB0aXRsZTtcclxuICAgICAgICB0aGlzLmVkaXRSZWNvcmQoZGF0YSk7XHJcbiAgICAgICAgdGhpcy5TZXRUb0Z1bGxTY3JlZW4oKTsgXHJcblxyXG4gICAgICAgIHRoaXMudmlld1Nob3dDb21wbGV0ZSA9IHRoaXMuaW5pdEZvcm0uYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0Rm9ybSgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiS0VFbXBsb3llZUdyYWRlc0VkaXRWaWV3LmluaXRGb3JtXCIpO1xyXG4gICAgfVxyXG4gIC8vXHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/aW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wV2ViRGF0YVRhYmxlLCBTYW9wV2ViR3JpZCwgU2FvcFdlYkdyaWRQcm9wZXJ0aWVzLCBTYW9wV2ViR3JpZFRvb2xiYXIsIFNhb3BXZWJHcmlkVG9vbGJhckJ1dHRvbiB9IGZyb20gXCIuLi9Db21wb25lbnRzL3Nhb3AtZ3JpZFwiO1xyXG5pbXBvcnQgeyBTYW9wU2VydmljZXNDb3JlIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC1zZXJ2aWNlcy1jb3JlXCI7XHJcblxyXG5jbGFzcyBEYXRhQXR0cmlidXRlcyB7XHJcbiAgICBzaWZyYUtyaXRlcmlqYTogc3RyaW5nO1xyXG4gICAgb3Bpczogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgS0VHcmFkZUNyaXRlcmlvbiB7XHJcbiAgICBwcml2YXRlIF92aWV3SWQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgX2xpYk5hbWU6IHN0cmluZztcclxuICAgIHByaXZhdGUgX3NwaW5uZXJEaXZJZDogc3RyaW5nXHJcblxyXG4gICAgcHJpdmF0ZSB3ZWJHcmlkSWQ6IHN0cmluZyA9IFwiI2dyYWRlc0NyaXRlcmlvbkdyaWRcIjtcclxuICAgIHByaXZhdGUgX3Jvd0RldGFpbHNQcmVmaXhJZDogc3RyaW5nID0gXCIjZGV0YWlsUm93XCI7XHJcbiAgICBwcml2YXRlIF9yb3dEZXRhaWxzRGl2UHJlZml4SWQ6IHN0cmluZyA9IFwiI2RldGFpbFJvd0RpdlwiO1xyXG5cclxuICAgIHB1YmxpYyB3ZWJHcmlkOiBTYW9wV2ViR3JpZDtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih2aWV3SWQ6IHN0cmluZywgbGliTmFtZTogc3RyaW5nID0gXCJcIiwgc3Bpbm5lckRpdklkOiBzdHJpbmcgPSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5fdmlld0lkID0gdmlld0lkO1xyXG4gICAgICAgIHRoaXMuX2xpYk5hbWUgPSBsaWJOYW1lOyBcclxuICAgICAgICB0aGlzLl9zcGlubmVyRGl2SWQgPSBzcGlubmVyRGl2SWQ7XHJcbiAgICB9ICBcclxuXHJcbiAgICBpbml0KCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJLRUdyYWRlQ3JpdGVyaW9uLmluaXRcIik7XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdFdlYkdyaWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0V2ViR3JpZCgpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiS0VHcmFkZUNyaXRlcmlvbi5pbml0V2ViR3JpZFwiKTtcclxuXHJcbiAgICAgICAgdGhpcy53ZWJHcmlkID0gbmV3IFNhb3BXZWJHcmlkKHRoaXMuX2xpYk5hbWUgKyBcIi53ZWJHcmlkXCIpO1xyXG4gICAgICAgIGxldCBncmlkUHJvcGVydGllczogU2FvcFdlYkdyaWRQcm9wZXJ0aWVzO1xyXG4gICAgICAgIGxldCBkYXRhVGFibGU6IFNhb3BXZWJEYXRhVGFibGU7XHJcblxyXG4gICAgICAgIGRhdGFUYWJsZSA9IHsgZW5hYmxlZDogdHJ1ZSwgb3JkZXJpbmc6IGZhbHNlIH07XHJcblxyXG4gICAgICAgIGdyaWRQcm9wZXJ0aWVzID0ge1xyXG4gICAgICAgICAgICBncmlkSWQ6IHRoaXMud2ViR3JpZElkXHJcbiAgICAgICAgICAgICwgZGF0YVRhYmxlOiBkYXRhVGFibGVcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy53ZWJHcmlkLmluaXQoZ3JpZFByb3BlcnRpZXMpO1xyXG5cclxuICAgICAgICB0aGlzLmluaXRXZWJHcmlkTGlzdG5lcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0V2ViR3JpZExpc3RuZXJzKCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJLRUdyYWRlQ3JpdGVyaW9uLmluaXRXZWJHcmlkTGlzdG5lcnNcIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIC8vIHByaWtheiBkb2dvZGtvdiB6YXBvc2xlbmVnYSBwbyB2cnN0aSBkb2dvZGtvdiAoc3VtIHVyZSlcclxuICAgICAgICAkKFwiYm9keVwiKS5vZmYoXCJjbGlja1wiLCB0aGlzLl92aWV3SWQgKyBcIiBcIiArIHRoaXMud2ViR3JpZElkICsgXCIgdHIuc2FvcC10YWJsZS1yb3ctbWFzdGVyIHRkLnRkLWFjdGlvbi1kZXRhaWxzXCIpO1xyXG4gICAgICAgICQoXCJib2R5XCIpLm9uKFwiY2xpY2tcIiwgdGhpcy5fdmlld0lkICsgXCIgXCIgKyB0aGlzLndlYkdyaWRJZCArIFwiIHRyLnNhb3AtdGFibGUtcm93LW1hc3RlciB0ZC50ZC1hY3Rpb24tZGV0YWlsc1wiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZFJvdyA9ICQodGhpcykuY2xvc2VzdChcInRyXCIpO1xyXG4gICAgICAgICAgICBsZXQgYWN0aW9uRGV0YWlsc0NvbHVtbiA9IHNlbGVjdGVkUm93LmZpbmQoXCJ0ZFwiKS5lcSgwKTtcclxuICAgICAgICAgICAgbGV0IGRhdGFBdHRyaWJ1dGVzVmFsdWVzID0gX3RoaXMuZ2V0RGF0YUF0dHJpYnV0ZXNWYWx1ZXMoc2VsZWN0ZWRSb3cpO1xyXG5cclxuICAgICAgICAgICAgX3RoaXMuc2hvd0hpZGVEZXRhaWxzU3ViVGFibGUoc2VsZWN0ZWRSb3csIGFjdGlvbkRldGFpbHNDb2x1bW4sIGRhdGFBdHRyaWJ1dGVzVmFsdWVzKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXREYXRhQXR0cmlidXRlc1ZhbHVlcyhyb3c6IEpRdWVyeTxIVE1MVGFibGVSb3dFbGVtZW50Pik6IERhdGFBdHRyaWJ1dGVzIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiS0VHcmFkZUNyaXRlcmlvbi5nZXREYXRhQXR0cmlidXRlc1ZhbHVlc1wiKTtcclxuXHJcbiAgICAgICAgbGV0IGRhdGFWYWx1ZXMgPSBuZXcgRGF0YUF0dHJpYnV0ZXMoKTtcclxuICAgICAgICBcclxuICAgICAgICBkYXRhVmFsdWVzLnNpZnJhS3JpdGVyaWphID0gcm93LmF0dHIoXCJkYXRhLXNpZnJha3JpdGVyaWphXCIpO1xyXG4gICAgICAgIGRhdGFWYWx1ZXMub3BpcyA9IHJvdy5hdHRyKFwiZGF0YS1vcGlzXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gZGF0YVZhbHVlcztcclxuICAgIH1cclxuXHJcbiAgICBzaG93SGlkZURldGFpbHNTdWJUYWJsZShzZWxlY3RlZFJvdzogSlF1ZXJ5PEhUTUxUYWJsZVJvd0VsZW1lbnQ+LCBhY3Rpb25EZXRhaWxzQ29sdW1uOiBKUXVlcnk8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+LCBkYXRhQXR0cmlidXRlc1ZhbHVlczogRGF0YUF0dHJpYnV0ZXMpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiS0VHcmFkZUNyaXRlcmlvbi5zaG93SGlkZURldGFpbHNTdWJUYWJsZVwiKTtcclxuXHJcbiAgICAgICAgbGV0IGljb25FbGVtZW50ID0gYWN0aW9uRGV0YWlsc0NvbHVtbi5maW5kKFwic3BhblwiKTtcclxuXHJcbiAgICAgICAgbGV0IHJvd0RldGFpbHNJZCA9IHRoaXMuX3Jvd0RldGFpbHNQcmVmaXhJZCArIGRhdGFBdHRyaWJ1dGVzVmFsdWVzLnNpZnJhS3JpdGVyaWphO1xyXG4gICAgICAgIGxldCByb3dEZXRhaWxzSWRFbGVtZW50ID0gJCh0aGlzLl92aWV3SWQgKyBcIiBcIiArIHJvd0RldGFpbHNJZCk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5pc0RldGFpbHNTdWJUYWJsZVNob3dlZChpY29uRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgLy8gc2hvdyBkZXRhaWxzIHN1YnRhYmxlXHJcbiAgICAgICAgICAgIC8vIHByZXZlcmltLCDEjWUgdGFiZWxhIHplIG9ic3RhamFcclxuICAgICAgICAgICAgbGV0IGRldGFpbFJvd0RpdklkID0gdGhpcy5fcm93RGV0YWlsc0RpdlByZWZpeElkICsgZGF0YUF0dHJpYnV0ZXNWYWx1ZXMuc2lmcmFLcml0ZXJpamE7XHJcbiAgICAgICAgICAgIGxldCBkZXRhaWxSb3dUYWJsZUVsZW1lbnQgPSAkKHRoaXMuX3ZpZXdJZCArIFwiIFwiICsgZGV0YWlsUm93RGl2SWQgKyBcIiB0YWJsZVwiKTtcclxuICAgICAgICAgICAgaWYgKGRldGFpbFJvd1RhYmxlRWxlbWVudC5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gdGFiZWxlIG5pLCBncmVtbyBuYSBzZXJ2ZXIgcG8gcG9kYXRrZSB6YSBwcmlrYXpcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0RGV0YWlsc1N1YlRhYmxlKGRldGFpbFJvd0RpdklkLCBkYXRhQXR0cmlidXRlc1ZhbHVlcy5vcGlzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcHJpa2F6aS9za3JpaiBib3R0b20gYm9yZGVyXHJcbiAgICAgICAgc2VsZWN0ZWRSb3cudG9nZ2xlQ2xhc3MoXCJzYW9wLXRhYmxlLXJvdy1ib3JkZXItYm90dG9tLW5vbmVcIilcclxuXHJcbiAgICAgICAgLy8gcHJpa2F6aS9za3JpaiBkZXRhaWxzIHRhYmVsb1xyXG4gICAgICAgIHJvd0RldGFpbHNJZEVsZW1lbnQudG9nZ2xlQ2xhc3MoXCJzYW9wLXRhYmxlLXJvdy1oaWRkZW5cIik7XHJcbiAgICAgICAgcm93RGV0YWlsc0lkRWxlbWVudC50b2dnbGVDbGFzcyhcInNhb3AtdGFibGUtcm93LXNob3dlZFwiKTtcclxuXHJcbiAgICAgICAgLy8gc3ByZW1lbWJhIGlrb25lXHJcbiAgICAgICAgaWNvbkVsZW1lbnQudG9nZ2xlQ2xhc3MoXCJzYW9wLWltZy1yaWdodFwiKTtcclxuICAgICAgICBpY29uRWxlbWVudC50b2dnbGVDbGFzcyhcInNhb3AtaW1nLWRvd25cIik7XHJcbiAgICB9XHJcblxyXG4gICAgaXNEZXRhaWxzU3ViVGFibGVTaG93ZWQoaWNvbkVsZW1lbnQ6IEpRdWVyeTxIVE1MU3BhbkVsZW1lbnQ+KTogYm9vbGVhbiB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIktFR3JhZGVDcml0ZXJpb24uaXNEZXRhaWxzU3ViVGFibGVTaG93ZWRcIik7XHJcblxyXG4gICAgICAgIHJldHVybiBpY29uRWxlbWVudC5oYXNDbGFzcyhcInNhb3AtaW1nLWRvd25cIik7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RGV0YWlsc1N1YlRhYmxlKGRldGFpbFJvd0RpdklkOiBzdHJpbmcsIG9waXM6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJLRUdyYWRlQ3JpdGVyaW9uLmdldERldGFpbHNTdWJUYWJsZVwiKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICAgICAgbGV0IHBhcmFtcyA9IHsgb3Bpczogb3BpcyB9O1xyXG5cclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAkKF90aGlzLl92aWV3SWQgKyBcIiBcIiArIGRldGFpbFJvd0RpdklkKS5odG1sKHJlc3BvbnNlKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHNhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjogXCJLZUdyYWRlQ3JpdGVyaW9uL0dldEdyYWRlQ3JpdGVyaW9uVGFibGVSb3dEZXRhaWxzXCJcclxuICAgICAgICAgICAgLCBkYXRhOiBwYXJhbXNcclxuICAgICAgICAgICAgLCB0eXBlOiBcIkdFVFwiXHJcbiAgICAgICAgICAgICwgc3Bpbm5lckRpdklkOiBfdGhpcy5fc3Bpbm5lckRpdklkXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/Ly8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9hbGVydGlmeS9pbmRleC5kLnRzXCIgLz5cclxuaW1wb3J0IHsgZmlsdGVyVGFibGVSb3dzLCBnbG9iYWwsIGlzVW5EZWZpbmVkIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wV2ViR3JpZCxTYW9wV2ViR3JpZFByb3BlcnRpZXMsU2FvcFdlYkdyaWRUb29sYmFyLFNhb3BXZWJHcmlkVG9vbGJhckJ1dHRvbixTYW9wV2ViRGF0YVRhYmxlfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLWdyaWRcIjtcclxuaW1wb3J0IHsgU2FvcFNlcnZpY2VzQ29yZSB9IGZyb20gXCIuLi9Db3JlL3Nhb3Atc2VydmljZXMtY29yZVwiO1xyXG5pbXBvcnQgeyBLRUdyYWRlUGVyaW9kVmlldyB9IGZyb20gXCIuL0tFR3JhZGVQZXJpb2Qtdmlld1wiO1xyXG5pbXBvcnQgeyBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC10cmFuc2xhdGVcIjtcclxuaW1wb3J0IHsgS0VBbGxFbXBsb3llZXNHcmFkZXNWaWV3IH0gZnJvbSBcIi4vS0VBbGxFbXBsb3llZXNHcmFkZXMtdmlld1wiO1xyXG5cclxuY2xhc3MgR3JhZGVzUGVyaW9kRGF0YSB7XHJcbiAgICBzaWZyYU9jZW5PYmRvYmphOiBzdHJpbmc7XHJcbiAgICBpc1N0YXR1c0FjdGl2ZTogYm9vbGVhbjtcclxuICAgIGZpbmdlcnByaW50OiBzdHJpbmc7XHJcbiAgICBmb3JtVGl0bGU6IHN0cmluZztcclxufVxyXG5cclxuY2xhc3MgR3JhZGVzVmlld1NlbmRlckRhdGEge1xyXG4gICAgYWxlcnRNZXNzYWdlOiBzdHJpbmc7XHJcbiAgICByZWRpcmVjdFRvOiBzdHJpbmc7XHJcbiAgICBzZWxlY3RlZFNpZnJhT2Nlbk9iZG9iamE6IHN0cmluZztcclxuICAgIHN1Y2Nlc3M6IGJvb2xlYW47XHJcbiAgICB2aWV3Q29udGVudDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgS0VHcmFkZXNQZXJpb2RHcmlkT3B0aW9ucyB7XHJcbiAgICBzaG93VG9vbGJhcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBzaG93RmlsdGVyOiBib29sZWFuID0gdHJ1ZTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEtFR3JhZGVzUGVyaW9kR3JpZCB7XHJcbiAgICBwcml2YXRlIGxpYk5hbWU6IHN0cmluZztcclxuICAgIHByaXZhdGUgX2dyaWRPcHRpb25zOiBLRUdyYWRlc1BlcmlvZEdyaWRPcHRpb25zO1xyXG4gICAgLy9cclxuICAgIHByaXZhdGUgZGl2SWQ6IHN0cmluZyA9IFwiI2dyYWRlc1BlcmlvZERpdlwiO1xyXG4gICAgcHJpdmF0ZSB3ZWJHcmlkSWQ6IHN0cmluZyA9IFwiI2dyYWRlc1BlcmlvZEdyaWRcIjtcclxuICAgIHByaXZhdGUgd2ViR3JpZEFrdGl2bmFSb3dzQm9keUlkOiBzdHJpbmcgPSBcIiNncmFkZXNQZXJpb2RHcmlkQm9keUFqYXhcIjtcclxuICAgIHB1YmxpYyB3ZWJHcmlkOiBTYW9wV2ViR3JpZDtcclxuICAgIHB1YmxpYyBrZUdyYWRlUGVyaW9kVmlldzogS0VHcmFkZVBlcmlvZFZpZXc7XHJcbiAgICBwdWJsaWMga2VBbGxFbXBsb3llZXNHcmFkZXNWaWV3OiBLRUFsbEVtcGxveWVlc0dyYWRlc1ZpZXc7XHJcbiAgICBwdWJsaWMgZm9ybVRyYW5zbGF0aW9uU2VydmljZTogU2FvcFRyYW5zbGF0aW9uU2VydmljZTtcclxuICAgIHByaXZhdGUgX3NlYXJjaFZhbHVlSWQ6IHN0cmluZyA9IFwiI0dyYWRlc1BlcmlvZFNlYXJjaFZhbHVlXCI7XHJcbiAgICBwcml2YXRlIF9tYWluRm9ybURpdjogSlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIHByaXZhdGUgX3NlYXJjaFZhbHVlOiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGxpYk5hbWU6IHN0cmluZywgZ3JpZE9wdGlvbnM6IEtFR3JhZGVzUGVyaW9kR3JpZE9wdGlvbnMgPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKGlzVW5EZWZpbmVkKGdyaWRPcHRpb25zKSkge1xyXG4gICAgICAgICAgICBncmlkT3B0aW9ucyA9IG5ldyBLRUdyYWRlc1BlcmlvZEdyaWRPcHRpb25zKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2dyaWRPcHRpb25zID0gZ3JpZE9wdGlvbnM7XHJcblxyXG4gICAgICAgIHRoaXMubGliTmFtZSA9IGxpYk5hbWU7ICBcclxuICAgICAgICB0aGlzLmZvcm1UcmFuc2xhdGlvblNlcnZpY2UgPSBuZXcgU2FvcFRyYW5zbGF0aW9uU2VydmljZSgpO1xyXG4gICAgfSAgXHJcblxyXG4gICAgaW5pdFZpZXcoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIktFR3JhZGVzUGVyaW9kR3JpZC5pbml0Vmlld1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fbWFpbkZvcm1EaXYgPSAkKHRoaXMuZGl2SWQpO1xyXG5cclxuICAgICAgICAvLyBwcmV2YWphbmplXHJcbiAgICAgICAgdGhpcy5zZXRGb3JtVGVybWlub2xvZ3lMaXN0KCk7XHJcblxyXG4gICAgICAgIC8vIHJlZnJlc2ggZ3JpZCBkYXRhXHJcbiAgICAgICAgdGhpcy5yZWZyZXNoR3JhZGVzUGVyaW9kR3JpZERhdGEoKTtcclxuXHJcbiAgICAgICAgLy8gaW5pdCBlZGl0IHZpZXdcclxuICAgICAgICB0aGlzLmluaXRFZGl0VmlldygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0Rm9ybVRlcm1pbm9sb2d5TGlzdCgpIHtcclxuICAgICAgICBsZXQgdGVybWlub2xvZ3kgPSBbXCJaYXByaVwiXTtcclxuXHJcbiAgICAgICAgdGhpcy5mb3JtVHJhbnNsYXRpb25TZXJ2aWNlLnNldFRyYW5zbGF0aW9uc0xpc3QodGVybWlub2xvZ3kpO1xyXG4gICAgfSAgICAgXHJcblxyXG4gICAgaW5pdEVkaXRWaWV3KCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJLRUdyYWRlc1BlcmlvZEdyaWQuaW5pdEVkaXRWaWV3XCIpO1xyXG5cclxuICAgICAgICB0aGlzLmtlR3JhZGVQZXJpb2RWaWV3ID0gbmV3IEtFR3JhZGVQZXJpb2RWaWV3KFwiI2tlR3JhZGVzQWRtaW5pc3RyYXRpb25WaWV3MDAxXCIsIHRoaXMubGliTmFtZSArIFwiLmtlR3JhZGVQZXJpb2RWaWV3XCIpO1xyXG4gICAgICAgIHRoaXMua2VHcmFkZVBlcmlvZFZpZXcuZnVsbFNjcmVlbiA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5rZUdyYWRlUGVyaW9kVmlldy5yZWZyZXNoRGF0YSA9IHRoaXMucmVmcmVzaERhdGFBZnRlckVkaXRWaWV3LmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMua2VBbGxFbXBsb3llZXNHcmFkZXNWaWV3ID0gbmV3IEtFQWxsRW1wbG95ZWVzR3JhZGVzVmlldyhcIiNrZUdyYWRlc0FkbWluaXN0cmF0aW9uVmlldzAwMlwiLCB0aGlzLmxpYk5hbWUgKyBcIi5rZUFsbEVtcGxveWVlc0dyYWRlc1ZpZXdcIilcclxuICAgICAgICB0aGlzLmtlQWxsRW1wbG95ZWVzR3JhZGVzVmlldy5mdWxsU2NyZWVuID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoRGF0YUFmdGVyRWRpdFZpZXcoc2VuZGVyOiBHcmFkZXNWaWV3U2VuZGVyRGF0YSk6IHZvaWQgeyBcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiS0VHcmFkZXNQZXJpb2RHcmlkLnJlZnJlc2hEYXRhQWZ0ZXJFZGl0Vmlld1wiKTtcclxuXHJcbiAgICAgICAgLy8gb3N2ZXppIHNlIHRhYmVsYVxyXG4gICAgICAgIHRoaXMucmVmcmVzaEdyYWRlc1BlcmlvZEdyaWREYXRhKHRydWUsIHNlbmRlci5zZWxlY3RlZFNpZnJhT2Nlbk9iZG9iamEpO1xyXG4gICAgICAgIC8vIGtsaWNlIHNlIGV4dGVybmFsIG1ldG9kYSwgZGEgc2UgbGFoa28gb3N2ZXppam8gc2UgZHJ1Z2kgcG9kYXRraSBucHIuIHJpZ2h0IHN1bW1hcnkgZGF0YVxyXG4gICAgICAgIHRoaXMuYWZ0ZXJSZWZyZXNoRGF0YUFmdGVyRWRpdFZpZXdFeHRlcm5hbChzZW5kZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZnRlclJlZnJlc2hEYXRhQWZ0ZXJFZGl0Vmlld0V4dGVybmFsKHNlbmRlcjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIktFR3JhZGVzUGVyaW9kR3JpZC5hZnRlclJlZnJlc2hEYXRhQWZ0ZXJFZGl0Vmlld0V4dGVybmFsXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hHcmFkZXNQZXJpb2RHcmlkRGF0YShzYW1vVnJzdGljZTogYm9vbGVhbiA9IGZhbHNlLCBzZWxlY3RlZFNpZnJhT2Nlbk9iZG9iamE6IHN0cmluZyA9IFwiXCIpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiS0VHcmFkZXNQZXJpb2RHcmlkLnJlZnJlc2hHcmFkZXNQZXJpb2RHcmlkRGF0YVwiKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgcGFyYW1zID0geyBzYW1vVnJzdGljZTogc2Ftb1Zyc3RpY2UsIHNlbGVjdGVkU2lmcmFPY2VuT2Jkb2JqYTogc2VsZWN0ZWRTaWZyYU9jZW5PYmRvYmphIH07XHJcblxyXG4gICAgICAgIGxldCBzYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICBfdGhpcy5yZWZyZXNoR3JpZERhdGEocmVzcG9uc2UpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOlwiS2VHcmFkZXNBZG1pbmlzdHJhdGlvbi9HZXRHcmFkZXNQZXJpb2RUYWJsZVwiIFxyXG4gICAgICAgICAgICAsZGF0YTpwYXJhbXNcclxuICAgICAgICAgICAgLHR5cGU6XCJHRVRcIlxyXG4gICAgICAgIH0pOyAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaEdyaWREYXRhKGh0bWxDb250ZW50OiBzdHJpbmcpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiS0VHcmFkZXNQZXJpb2RHcmlkLnJlZnJlc2hHcmlkRGF0YVwiKTtcclxuXHJcbiAgICAgICAgaWYgKCQodGhpcy53ZWJHcmlkSWQpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAkKHRoaXMud2ViR3JpZEFrdGl2bmFSb3dzQm9keUlkKS5odG1sKGh0bWxDb250ZW50KTtcclxuICAgICAgICAgICAgdGhpcy5pbml0V2ViR3JpZExpc3RuZXJzKCk7XHJcbiAgICAgICAgICAgIGlmICghaXNVbkRlZmluZWQodGhpcy5fc2VhcmNoVmFsdWUpICYmIHRoaXMuX3NlYXJjaFZhbHVlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5leGVjdXRlRmlsdGVyU2VhcmNoKHRoaXMuX3NlYXJjaFZhbHVlLnZhbCgpLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAkKHRoaXMuZGl2SWQpLmh0bWwoaHRtbENvbnRlbnQpO1xyXG4gICAgICAgICAgICB0aGlzLmdldFdlYkdyaWRUb29sYmFyQW5kSW5pdFdlYkdyaWQoKTsgXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFdlYkdyaWRUb29sYmFyQW5kSW5pdFdlYkdyaWQoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIktFR3JhZGVzUGVyaW9kR3JpZC5nZXRXZWJHcmlkVG9vbGJhckFuZEluaXRXZWJHcmlkXCIpO1xyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIGxldCBwYXJhbXMgPSB7IGphdmFzY3JpcHRLbmppem5pY2E6IF90aGlzLmxpYk5hbWUgfTtcclxuXHJcbiAgICAgICAgbGV0IHNhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgICAgIHNhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIF90aGlzLmluaXRXZWJHcmlkKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgX3RoaXMuaW5pdEZpbHRlckNvbnRyb2xzKCk7ICBcclxuICAgICAgICB9O1xyXG4gICAgICAgIHNhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjogXCJLZUdyYWRlc0FkbWluaXN0cmF0aW9uL0dldFRhYmxlVG9vbGJhclwiXHJcbiAgICAgICAgICAgICwgZGF0YTogcGFyYW1zXHJcbiAgICAgICAgICAgICwgdHlwZTogXCJHRVRcIlxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRXZWJHcmlkKHRvb2xiYXJUZW1wbGF0ZTogc3RyaW5nID0gXCJcIikge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJLRUdyYWRlc1BlcmlvZEdyaWQuaW5pdFdlYkdyaWRcIik7XHJcblxyXG4gICAgICAgIGxldCBjYXB0aW9uVG9vbGJhciA9ICQodGhpcy53ZWJHcmlkSWQpLmF0dHIoXCJjYXB0aW9uLXRvb2xiYXJcIik7XHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLndlYkdyaWQgPSBuZXcgU2FvcFdlYkdyaWQodGhpcy5saWJOYW1lICsgXCIud2ViR3JpZFwiKTtcclxuICAgICAgICBsZXQgZ3JpZFByb3BlcnRpZXM6IFNhb3BXZWJHcmlkUHJvcGVydGllcztcclxuICAgICAgICBsZXQgZ3JpZFRvb2xiYXI6IFNhb3BXZWJHcmlkVG9vbGJhcjtcclxuICAgICAgICBsZXQgdG9vbGJhckJ1dHRvbnM6IFNhb3BXZWJHcmlkVG9vbGJhckJ1dHRvbltdID0gW107XHJcbiAgICAgICAgbGV0IGRhdGFUYWJsZTogU2FvcFdlYkRhdGFUYWJsZTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIGlmICh0aGlzLl9ncmlkT3B0aW9ucy5zaG93VG9vbGJhcikge1xyXG4gICAgICAgICAgICB0b29sYmFyQnV0dG9ucy5wdXNoKHsgaWQ6IFwiXCIsIGNhcHRpb246IFwiXCIsIHRlbXBsYXRlOiB0b29sYmFyVGVtcGxhdGUgfSk7XHJcbiAgICAgICAgICAgIGdyaWRUb29sYmFyID0geyBpZDogXCJzYW9wV2ViR3JpZFRCMVwiLCBjYXB0aW9uOiBjYXB0aW9uVG9vbGJhciwgYnV0dG9uczogdG9vbGJhckJ1dHRvbnMgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRhdGFUYWJsZSA9IHsgZW5hYmxlZDogdHJ1ZSwgb3JkZXJpbmc6IHRydWV9O1xyXG5cclxuICAgICAgICBncmlkUHJvcGVydGllcyA9IHtcclxuICAgICAgICAgICAgZ3JpZElkOiB0aGlzLndlYkdyaWRJZFxyXG4gICAgICAgICAgICAsIHRvZ2dsZVBhbmVsOiB7IGVuYWJsZWQ6IGZhbHNlIH1cclxuICAgICAgICAgICAgLCB0b29sYmFyOiBncmlkVG9vbGJhclxyXG4gICAgICAgICAgICAsIGRhdGFUYWJsZTogZGF0YVRhYmxlXHJcbiAgICAgICAgfTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMud2ViR3JpZC5pbml0KGdyaWRQcm9wZXJ0aWVzKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0V2ViR3JpZExpc3RuZXJzKCk7XHJcblxyXG4gICAgICAgICQodGhpcy5kaXZJZCkuc2hvdygpO1xyXG5cclxuICAgICAgICAvL3RoaXMuc2V0RGFzaGJvYXJkU3BlY2lmaWNWaWV3KCk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdFdlYkdyaWRMaXN0bmVycygpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiS0VHcmFkZXNQZXJpb2RHcmlkLmluaXRXZWJHcmlkTGlzdG5lcnNcIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIC8vIHByaWtheiBmdWxsIHNjcmVlbiBrbyBrbGlrbmUgbmEgdnJzdGljb1xyXG4gICAgICAgICQoXCJib2R5XCIpLm9mZihcImNsaWNrXCIsIHRoaXMud2ViR3JpZElkICsgXCIgdHIgdGQ6bm90KC50ZC1hY3Rpb24sLnRkLWFjdGlvbi1jaGVja2JveClcIik7XHJcbiAgICAgICAgJChcImJvZHlcIikub24oXCJjbGlja1wiLCB0aGlzLndlYkdyaWRJZCArIFwiIHRyIHRkOm5vdCgudGQtYWN0aW9uLC50ZC1hY3Rpb24tY2hlY2tib3gpXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgbGV0IHNlbGVjdGVkUm93ID0gPEhUTUxFbGVtZW50PiQodGhpcykuY2xvc2VzdChcInRyXCIpWzBdO1xyXG4gICAgICAgICAgICBsZXQgZGF0YSA9IF90aGlzLmdldEdyYWRlUGVyaW9kRGF0YUF0dHJpYnV0ZShzZWxlY3RlZFJvdyk7XHJcblxyXG4gICAgICAgICAgICAvLyBiYXJ2YW5qZSBvem5hY2VuZSB2cnN0cmljZVxyXG4gICAgICAgICAgICBfdGhpcy53ZWJHcmlkLm1hcmtTZWxlY3RlZFJvdyhzZWxlY3RlZFJvdyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWlzVW5EZWZpbmVkKGRhdGEuc2lmcmFPY2VuT2Jkb2JqYSkpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLnNob3dSZWNvcmREZXRhaWxzKHsgc2lmcmFPY2VuT2Jkb2JqYTogZGF0YS5zaWZyYU9jZW5PYmRvYmphLCBpc1N0YXR1c0FjdGl2ZTogZGF0YS5pc1N0YXR1c0FjdGl2ZSwgZmluZ2VycHJpbnQ6IGRhdGEuZmluZ2VycHJpbnQgfSwgZGF0YS5mb3JtVGl0bGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIHByaWtheiBvY2VuXHJcbiAgICAgICAgLy/EjWUgc2UgbmFyZWRpIHogXCIkKFwiYm9keVwiKS5vZmYoXCJjbGlja1wiLCB0aGlzLndlYkdyaWRJZCArIFwiIHRyIC50ZC1hY3Rpb24gLmJ0blZzaVphcG9zbGVuaVByaWthek9jZW5cIik7XCJcclxuICAgICAgICAvLyBzbyB0ZcW+YXZlLCBrZXIgc2UgZXZlbnQgMnggaXp2ZWRlICh2ZXJqZXRubywga2VyIGplIG5hcmVqZW5vIHogZ3VtYm9tIGluIG5lIHogZGl2IGluIGlrb25vIHYgbmplbSlcclxuICAgICAgICAkKHRoaXMud2ViR3JpZElkICsgXCIgdHIgLnRkLWFjdGlvbiAuYnRuVnNpWmFwb3NsZW5pUHJpa2F6T2NlblwiKS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAkKHRoaXMud2ViR3JpZElkICsgXCIgdHIgLnRkLWFjdGlvbiAuYnRuVnNpWmFwb3NsZW5pUHJpa2F6T2NlblwiKS5vbignY2xpY2snLCBmdW5jdGlvbiAocm93KSB7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZFJvdyA9IDxIVE1MRWxlbWVudD4kKHRoaXMpLmNsb3Nlc3QoXCJ0clwiKVswXTtcclxuICAgICAgICAgICAgbGV0IGRhdGEgPSBfdGhpcy5nZXRHcmFkZVBlcmlvZERhdGFBdHRyaWJ1dGUoc2VsZWN0ZWRSb3cpO1xyXG5cclxuICAgICAgICAgICAgLy8gYmFydmFuamUgb3puYWNlbmUgdnJzdHJpY2VcclxuICAgICAgICAgICAgX3RoaXMud2ViR3JpZC5tYXJrU2VsZWN0ZWRSb3coc2VsZWN0ZWRSb3cpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGJhc2VUaXRsZSA9ICQodGhpcykuYXR0cihcImRhdGEtZWRpdG9jZW5ldGl0bGVcIik7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWlzVW5EZWZpbmVkKGRhdGEuc2lmcmFPY2VuT2Jkb2JqYSkpIHtcclxuICAgICAgICAgICAgICAgIGxldCBmdWxsVGl0bGUgPSBiYXNlVGl0bGUgKyBcIjogXCIgKyBkYXRhLmZvcm1UaXRsZTtcclxuICAgICAgICAgICAgICAgIF90aGlzLnNob3dBbGxFbXBsb3llZXNHcmFkZXMoeyBzaWZyYU9jZW5PYmRvYmphOiBkYXRhLnNpZnJhT2Nlbk9iZG9iamEsIGlzU3RhdHVzQWN0aXZlOiBkYXRhLmlzU3RhdHVzQWN0aXZlLCBmaW5nZXJwcmludDogZGF0YS5maW5nZXJwcmludCB9LCBmdWxsVGl0bGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7ICAgXHJcblxyXG4gICAgfVxyXG5cclxuICAgIGluaXRGaWx0ZXJDb250cm9scygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiS0VHcmFkZXNQZXJpb2RHcmlkLmluaXRGaWx0ZXJDb250cm9sc1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2VhcmNoVmFsdWUgPSB0aGlzLl9tYWluRm9ybURpdi5maW5kKHRoaXMuX3NlYXJjaFZhbHVlSWQpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIHRoaXMuX3NlYXJjaFZhbHVlLm9mZihcImtleXVwXCIpO1xyXG4gICAgICAgIHRoaXMuX3NlYXJjaFZhbHVlLm9uKFwia2V5dXBcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBfdGhpcy5leGVjdXRlRmlsdGVyU2VhcmNoKCQodGhpcykudmFsKCkudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhlY3V0ZUZpbHRlclNlYXJjaChzZWFyY2hWYWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJLRUdyYWRlc1BlcmlvZEdyaWQuZXhlY3V0ZUZpbHRlclNlYXJjaFwiKTtcclxuXHJcbiAgICAgICAgLy8gdG9sZSBuaSBkZWxvdmFsbzoga28gc2UgamUgc3ByZW1lbmlsbyBsZXRvLCBqZSBzZSB2ZWRubyBmaWx0cmlyYWwgc3RhcmUgcG9kYXRrZSBvZCBwcmVqc25qZWdhIGxldGFcclxuICAgICAgICAvL2xldCBvVGFibGUgPSB0aGlzLndlYkdyaWQuZGF0YVRhYmxlO1xyXG4gICAgICAgIC8vb1RhYmxlLnNlYXJjaChzZWFyY2hWYWwpLmRyYXcoKTtcclxuXHJcbiAgICAgICAgZmlsdGVyVGFibGVSb3dzKHNlYXJjaFZhbCwgdGhpcy5kaXZJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0R3JhZGVQZXJpb2REYXRhQXR0cmlidXRlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogR3JhZGVzUGVyaW9kRGF0YSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIktFR3JhZGVzUGVyaW9kR3JpZC5nZXRHcmFkZVBlcmlvZERhdGFBdHRyaWJ1dGVcIik7XHJcblxyXG4gICAgICAgIGxldCBkYXRhID0gbmV3IEdyYWRlc1BlcmlvZERhdGEoKTtcclxuXHJcbiAgICAgICAgZGF0YS5zaWZyYU9jZW5PYmRvYmphID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXNpZnJhb2Nlbm9iZG9iamFcIik7XHJcbiAgICAgICAgZGF0YS5maW5nZXJwcmludCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1maW5nZXJwcmludFwiKTtcclxuICAgICAgICBkYXRhLmZvcm1UaXRsZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1mb3JtdGl0bGVcIik7XHJcbiAgICAgICAgbGV0IGlzU3RhdHVzQWN0aXZlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWlzc3RhdHVzYWN0aXZlXCIpO1xyXG4gICAgICAgIGRhdGEuaXNTdGF0dXNBY3RpdmUgPSBpc1N0YXR1c0FjdGl2ZSA9PT0gXCJUcnVlXCIgPyB0cnVlIDogZmFsc2U7XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dSZWNvcmREZXRhaWxzKGRldGFpbHNEYXRhOiBhbnksIHRpdGxlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiS0VHcmFkZXNQZXJpb2RHcmlkLnNob3dSZWNvcmREZXRhaWxzXCIpO1xyXG5cclxuICAgICAgICB0aGlzLmtlR3JhZGVQZXJpb2RWaWV3LnNob3dGb3JtKGRldGFpbHNEYXRhLCB0aXRsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd0FsbEVtcGxveWVlc0dyYWRlcyhkYXRhOiBhbnksIGZ1bGxUaXRsZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIktFR3JhZGVzUGVyaW9kR3JpZC5zaG93QWxsRW1wbG95ZWVzR3JhZGVzXCIpO1xyXG5cclxuICAgICAgICB0aGlzLmtlQWxsRW1wbG95ZWVzR3JhZGVzVmlldy5zaG93Rm9ybShkYXRhLCBmdWxsVGl0bGUpO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCwgaXNVbkRlZmluZWQgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BNZXNzYWdlRGxnLCBTYW9wTXNnRGxnQnV0dG9uIH0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC1tZXNzYWdlLWRsZ1wiO1xyXG5pbXBvcnQgeyBTYW9wU2VydmljZXNDb3JlIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC1zZXJ2aWNlcy1jb3JlXCI7XHJcbmltcG9ydCB7IFNhb3BUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXRyYW5zbGF0ZVwiO1xyXG5pbXBvcnQgeyBTYW9wVmlld0Zvcm0gfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXZpZXctZm9ybVwiO1xyXG5pbXBvcnQgeyBLRUFsbEVtcGxveWVlc0dyYWRlc1ZpZXcgfSBmcm9tIFwiLi9LRUFsbEVtcGxveWVlc0dyYWRlcy12aWV3XCI7XHJcbmltcG9ydCB7IEtFR3JhZGVDcml0ZXJpb24gfSBmcm9tIFwiLi9LRUdyYWRlQ3JpdGVyaW9uXCI7XHJcblxyXG5jbGFzcyBHcmFkZXNQZXJpb2REZXRhaWxzRGF0YSB7XHJcbiAgICBzaWZyYU9jZW5PYmRvYmphOiBzdHJpbmc7XHJcbiAgICBpc1N0YXR1c0FjdGl2ZTogYm9vbGVhbjtcclxuICAgIGZpbmdlcnByaW50OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBLRUdyYWRlUGVyaW9kVmlldyBleHRlbmRzIFNhb3BWaWV3Rm9ybSB7XHJcbiAgICBwcml2YXRlIHZpZXdJZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBsaWJOYW1lOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9sb2FkaW5nU3Bpbm5lcklkOiBzdHJpbmcgPSBcImdyYWRlUGVyaW9kRGV0YWlsc0xvYWRpbmdcIjtcclxuICAgIHByaXZhdGUgX2J1dHRvbkNsb3NlSWQ6IHN0cmluZyA9IFwiYnRuQ2xvc2VcIjtcclxuICAgIHByaXZhdGUgX2tlR3JhZGVDcml0ZXJpb246IEtFR3JhZGVDcml0ZXJpb247XHJcbiAgICBwdWJsaWMga2VBbGxFbXBsb3llZXNHcmFkZXNWaWV3OiBLRUFsbEVtcGxveWVlc0dyYWRlc1ZpZXc7XHJcbiAgICBwdWJsaWMgZm9ybVRyYW5zbGF0aW9uU2VydmljZTogU2FvcFRyYW5zbGF0aW9uU2VydmljZTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih2aWV3SWQ6c3RyaW5nLGxpYk5hbWU6c3RyaW5nID0gXCJcIil7XHJcbiAgICAgICAgc3VwZXIodmlld0lkLCBsaWJOYW1lKTtcclxuXHJcbiAgICAgICAgdGhpcy52aWV3SWQgPSB2aWV3SWQ7XHJcbiAgICAgICAgdGhpcy5saWJOYW1lID0gbGliTmFtZTsgXHJcblxyXG4gICAgICAgIHRoaXMuc2V0RGljdGlvbmFyeSgpOyBcclxuICAgICAgICB0aGlzLnRpdGxlID0gXCJcIjtcclxuICAgICAgICB0aGlzLmFkZFJlY29yZEVuZHBvaW50ID0gXCJcIjtcclxuICAgICAgICB0aGlzLmVkaXRSZWNvcmRFbmRwb2ludCA9IFwiS2VHcmFkZS9HZXRHcmFkZVBlcmlvZERldGFpbHNcIjtcclxuICAgICAgICB0aGlzLmRlbGV0ZVJlY29yZEVuZHBvaW50ID0gXCJcIjsgXHJcblxyXG4gICAgICAgIHRoaXMuX2tlR3JhZGVDcml0ZXJpb24gPSBuZXcgS0VHcmFkZUNyaXRlcmlvbih2aWV3SWQsIGxpYk5hbWUgKyBcIi5fa2VHcmFkZUNyaXRlcmlvblwiLCBcIiNcIiArIHRoaXMuX2xvYWRpbmdTcGlubmVySWQpO1xyXG4gICAgICAgIHRoaXMuZm9ybVRyYW5zbGF0aW9uU2VydmljZSA9IG5ldyBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RGljdGlvbmFyeSgpe1xyXG4gICAgICAgIHRoaXMuc2V0VGVybWlub2xvZ3lMaXN0KCk7XHJcbiAgICB9IFxyXG5cclxuICAgIHB1YmxpYyBhZnRlclZpZXdTaG93U3VjY2VzcyhzZW5kZXI6YW55KTp2b2lke1xyXG4gICAgICAgIHRoaXMuTG9hZFZpZXdFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgTG9hZFZpZXdFdmVudHMgKCk6dm9pZHtcclxuICAgICAgICBsZXQgX3ZpZXdEaXYgPSAkKHRoaXMuaWQpO1xyXG4gICAgICAgIGlmIChfdmlld0Rpdi5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNob3dGb3JtKGRhdGE6IGFueSwgdGl0bGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJLRUdyYWRlUGVyaW9kVmlldy5zaG93Rm9ybVwiKTtcclxuXHJcbiAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlO1xyXG4gICAgICAgIHRoaXMucmVjb3JkRGV0YWlscyhkYXRhKTtcclxuICAgICAgICB0aGlzLlNldFRvRnVsbFNjcmVlbigpOyBcclxuXHJcbiAgICAgICAgdGhpcy52aWV3U2hvd0NvbXBsZXRlID0gdGhpcy5pbml0Rm9ybS5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRGb3JtKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJLRUdyYWRlUGVyaW9kVmlldy5pbml0Rm9ybVwiKTtcclxuXHJcbiAgICAgICAgLy8gcHJldmFqYW5qZVxyXG4gICAgICAgIHRoaXMuc2V0Rm9ybVRlcm1pbm9sb2d5TGlzdCgpO1xyXG5cclxuICAgICAgICB0aGlzLl9rZUdyYWRlQ3JpdGVyaW9uLmluaXQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5rZUFsbEVtcGxveWVlc0dyYWRlc1ZpZXcgPSBuZXcgS0VBbGxFbXBsb3llZXNHcmFkZXNWaWV3KFwiI2tlR3JhZGVzQWRtaW5pc3RyYXRpb25WaWV3MDAyXCIsIHRoaXMubGliTmFtZSArIFwiLmtlQWxsRW1wbG95ZWVzR3JhZGVzVmlld1wiKVxyXG4gICAgICAgIHRoaXMua2VBbGxFbXBsb3llZXNHcmFkZXNWaWV3LmZ1bGxTY3JlZW4gPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLmluaXRFdmVudExpc3RuZXJzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRGb3JtVGVybWlub2xvZ3lMaXN0KCkge1xyXG4gICAgICAgIGxldCB0ZXJtaW5vbG9neSA9IFtcIk9wb3pvcmlsb1wiLCBcIkFsaSBzdGUgcHJlcHJpxI1hbmksIGRhIMW+ZWxpdGUgbmFkYWxqZXZhdGk/IMSMZSBqZSBvY2VuamV2YW5qZSB6YWtsanXEjWVubyBvY2VuIG5pIG1vZ2/EjWUgdmXEjSB1cmVqYXRpLlwiXTtcclxuXHJcbiAgICAgICAgdGhpcy5mb3JtVHJhbnNsYXRpb25TZXJ2aWNlLnNldFRyYW5zbGF0aW9uc0xpc3QodGVybWlub2xvZ3kpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRFdmVudExpc3RuZXJzKCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJLRUdyYWRlUGVyaW9kVmlldy5pbml0RXZlbnRMaXN0bmVyc1wiKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgLy8gcHJpa2F6IGZ1bGwgc2NyZWVuIGtvIGtsaWtuZSBuYSB2cnN0aWNvXHJcbiAgICAgICAgJChcImJvZHlcIikub2ZmKFwiY2xpY2tcIiwgdGhpcy52aWV3SWQgKyBcIiAjY29uY2x1ZGVHcmFkZVBlcmlvZFwiKTtcclxuICAgICAgICAkKFwiYm9keVwiKS5vbihcImNsaWNrXCIsIHRoaXMudmlld0lkICsgXCIgI2NvbmNsdWRlR3JhZGVQZXJpb2RcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBsZXQgZGF0YSA9IF90aGlzLmdldERhdGFBdHRyaWJ1dGUoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghaXNVbkRlZmluZWQoZGF0YS5zaWZyYU9jZW5PYmRvYmphKSkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuc2hvd0NvbmNsdWRlR3JhZGVQZXJpb2REaWFsb2coZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJChcImJvZHlcIikub2ZmKFwiY2xpY2tcIiwgdGhpcy52aWV3SWQgKyBcIiAjYnRuT2NlbmVcIik7XHJcbiAgICAgICAgJChcImJvZHlcIikub24oXCJjbGlja1wiLCB0aGlzLnZpZXdJZCArIFwiICNidG5PY2VuZVwiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGxldCBkYXRhID0gX3RoaXMuZ2V0RGF0YUF0dHJpYnV0ZSgpO1xyXG4gICAgICAgICAgICB2YXIgYmFzZVRpdGxlID0gJCh0aGlzKS5hdHRyKFwiZGF0YS1lZGl0b2NlbmV0aXRsZVwiKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghaXNVbkRlZmluZWQoZGF0YS5zaWZyYU9jZW5PYmRvYmphKSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGZ1bGxUaXRsZSA9IGJhc2VUaXRsZSArIFwiOiBcIiArIF90aGlzLnRpdGxlO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuc2hvd0FsbEVtcGxveWVlc0dyYWRlcyh7IHNpZnJhT2Nlbk9iZG9iamE6IGRhdGEuc2lmcmFPY2VuT2Jkb2JqYSwgaXNTdGF0dXNBY3RpdmU6IGRhdGEuaXNTdGF0dXNBY3RpdmUsIGZpbmdlcnByaW50OiBkYXRhLmZpbmdlcnByaW50IH0sIGZ1bGxUaXRsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXREYXRhQXR0cmlidXRlKCk6IEdyYWRlc1BlcmlvZERldGFpbHNEYXRhIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiS0VHcmFkZVBlcmlvZFZpZXcuZ2V0RGF0YUF0dHJpYnV0ZVwiKTtcclxuXHJcbiAgICAgICAgbGV0IGRhdGEgPSBuZXcgR3JhZGVzUGVyaW9kRGV0YWlsc0RhdGEoKTtcclxuXHJcbiAgICAgICAgZGF0YS5zaWZyYU9jZW5PYmRvYmphID0gJCh0aGlzLnZpZXdJZCArIFwiICNoaWRkZW5TaWZyYU9jZW5PYmRvYmphXCIpLnZhbCgpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgZGF0YS5maW5nZXJwcmludCA9ICQodGhpcy52aWV3SWQgKyBcIiAjaGlkZGVuRmluZ2VycHJpbnRcIikudmFsKCkudG9TdHJpbmcoKTtcclxuICAgICAgICBsZXQgaXNTdGF0dXNBY3RpdmUgPSAkKHRoaXMudmlld0lkICsgXCIgI2hpZGRlbklzU3RhdHVzQWN0aXZlXCIpLnZhbCgpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBkYXRhLmlzU3RhdHVzQWN0aXZlID0gaXNTdGF0dXNBY3RpdmUgPT09IFwidHJ1ZVwiID8gdHJ1ZSA6IGZhbHNlO1xyXG5cclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93Q29uY2x1ZGVHcmFkZVBlcmlvZERpYWxvZyhkYXRhOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiS0VHcmFkZVBlcmlvZFZpZXcuc2hvd0NvbmNsdWRlR3JhZGVQZXJpb2REaWFsb2dcIik7XHJcblxyXG4gICAgICAgIGxldCB0aXRsZSA9IHRoaXMuZm9ybVRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJPcG96b3JpbG9cIik7XHJcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0aGlzLmZvcm1UcmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiQWxpIHN0ZSBwcmVwcmnEjWFuaSwgZGEgxb5lbGl0ZSBuYWRhbGpldmF0aT8gxIxlIGplIG9jZW5qZXZhbmplIHpha2xqdcSNZW5vIG9jZW4gbmkgbW9nb8SNZSB2ZcSNIHVyZWphdGkuXCIpO1xyXG5cclxuICAgICAgICBsZXQgc2FvcE1lc3NhZ2VEbGcgPSBuZXcgU2FvcE1lc3NhZ2VEbGcoZGF0YSlcclxuICAgICAgICBzYW9wTWVzc2FnZURsZy5vblllcyA9IHRoaXMuY29uY2x1ZGVHcmFkZVBlcmlvZC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHNhb3BNZXNzYWdlRGxnLlNob3cobWVzc2FnZSwgdGl0bGUsIDEsIFtTYW9wTXNnRGxnQnV0dG9uLm1iWWVzLCBTYW9wTXNnRGxnQnV0dG9uLm1iTm9dKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25jbHVkZUdyYWRlUGVyaW9kKGRhdGE6IEdyYWRlc1BlcmlvZERldGFpbHNEYXRhKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIktFR3JhZGVQZXJpb2RWaWV3LmNvbmNsdWRlR3JhZGVQZXJpb2RcIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgbGV0IHBhcmFtcyA9IHsgc2lmcmFPY2VuT2Jkb2JqYTogZGF0YS5zaWZyYU9jZW5PYmRvYmphLCBpc1N0YXR1c0FjdGl2ZTogZGF0YS5pc1N0YXR1c0FjdGl2ZSwgZmluZ2VycHJpbnQ6IGRhdGEuZmluZ2VycHJpbnQgfTtcclxuXHJcbiAgICAgICAgbGV0IHNhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgICAgIHNhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgICAgICBhbGVydGlmeS5tZXNzYWdlKHJlc3BvbnNlLmFsZXJ0TWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAvLyB6YXByZW1vIG9rbm9cclxuICAgICAgICAgICAgICAgICQoX3RoaXMudmlld0lkICsgXCIgI1wiICsgX3RoaXMuX2J1dHRvbkNsb3NlSWQpLmNsaWNrKCk7XHJcbiAgICAgICAgICAgICAgICAvLyBwb2tsaWNlIHNlIG1ldG9kbywgZGEgc2UgbGFoa28gdiBleHRlbmRlZCBrbGFzdSBpenZlZGUgb3N2ZXppdGV2IGdyaWRhXHJcbiAgICAgICAgICAgICAgICBfdGhpcy5yZWZyZXNoRGF0YShyZXNwb25zZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhbGVydGlmeS5lcnJvcihyZXNwb25zZS5hbGVydE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246IFwiS2VHcmFkZS9Db25jbHVkZUdyYWRlUGVyaW9kXCJcclxuICAgICAgICAgICAgLCBkYXRhOiBwYXJhbXNcclxuICAgICAgICAgICAgLCB0eXBlOiBcIlBPU1RcIlxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dBbGxFbXBsb3llZXNHcmFkZXMoZGF0YTogYW55LCBmdWxsVGl0bGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJLRUdyYWRlUGVyaW9kVmlldy5zaG93QWxsRW1wbG95ZWVzR3JhZGVzXCIpO1xyXG5cclxuICAgICAgICB0aGlzLmtlQWxsRW1wbG95ZWVzR3JhZGVzVmlldy5zaG93Rm9ybShkYXRhLCBmdWxsVGl0bGUpO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgS0VHcmFkZXNQZXJpb2RHcmlkIH0gZnJvbSBcIi4vS0VHcmFkZVBlcmlvZC1ncmlkXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgS0VHcmFkZXNQZXJpb2Qge1xyXG4gICAgcHJpdmF0ZSBsaWJOYW1lOiBzdHJpbmc7XHJcblxyXG4gICAgcHJpdmF0ZSBrZUdyYWRlc1BlcmlvZEdyaWQ6IEtFR3JhZGVzUGVyaW9kR3JpZDtcclxuICAgIFxyXG4gICAgY29uc3RydWN0b3IobGliTmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5saWJOYW1lID0gbGliTmFtZTsgXHJcblxyXG4gICAgICAgIHRoaXMua2VHcmFkZXNQZXJpb2RHcmlkID0gbmV3IEtFR3JhZGVzUGVyaW9kR3JpZCh0aGlzLmxpYk5hbWUgKyBcIi5rZUdyYWRlc1BlcmlvZEdyaWRcIik7XHJcbiAgICAgICAgdGhpcy5rZUdyYWRlc1BlcmlvZEdyaWQuYWZ0ZXJSZWZyZXNoRGF0YUFmdGVyRWRpdFZpZXdFeHRlcm5hbCA9IHRoaXMucmVmcmVzaERhdGFBZnRlckVkaXRWaWV3LmJpbmQodGhpcyk7XHJcbiAgICB9ICBcclxuXHJcbiAgICBpbml0VmlldygpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiS0VHcmFkZXNQZXJpb2QuaW5pdFZpZXdcIik7XHJcblxyXG4gICAgICAgIHRoaXMua2VHcmFkZXNQZXJpb2RHcmlkLmluaXRWaWV3KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaERhdGFBZnRlckVkaXRWaWV3KCk6IHZvaWQgeyBcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiS0VHcmFkZXNQZXJpb2QucmVmcmVzaERhdGFBZnRlckVkaXRWaWV3XCIpO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFZpZXdGb3JtIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC12aWV3LWZvcm1cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBLRU15R3JhZGVWaWV3IGV4dGVuZHMgU2FvcFZpZXdGb3JtIHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih2aWV3SWQ6c3RyaW5nLGxpYk5hbWU6c3RyaW5nID0gXCJcIil7XHJcbiAgICAgICAgc3VwZXIodmlld0lkLCBsaWJOYW1lKTtcclxuICAgICAgICB0aGlzLnNldERpY3Rpb25hcnkoKTsgXHJcbiAgICAgICAgdGhpcy50aXRsZSA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5hZGRSZWNvcmRFbmRwb2ludCA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5lZGl0UmVjb3JkRW5kcG9pbnQgPSBcIktlR3JhZGUvR2V0R3JhZGVEZXRhaWxzXCI7XHJcbiAgICAgICAgdGhpcy5kZWxldGVSZWNvcmRFbmRwb2ludCA9IFwiXCI7IFxyXG4gICAgfVxyXG5cclxuICAgIHNldERpY3Rpb25hcnkoKXtcclxuICAgICAgICB0aGlzLnNldFRlcm1pbm9sb2d5TGlzdCgpO1xyXG4gICAgfSBcclxuXHJcbiAgICBwdWJsaWMgYWZ0ZXJWaWV3U2hvd1N1Y2Nlc3Moc2VuZGVyOmFueSk6dm9pZHtcclxuICAgICAgICB0aGlzLkxvYWRWaWV3RXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIExvYWRWaWV3RXZlbnRzICgpOnZvaWR7XHJcbiAgICAgICAgbGV0IF92aWV3RGl2ID0gJCh0aGlzLmlkKTtcclxuICAgICAgICBpZiAoX3ZpZXdEaXYubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzaG93Rm9ybShkYXRhOiBhbnksIHRpdGxlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiS0VNeUdyYWRlVmlldy5zaG93Rm9ybVwiKTtcclxuXHJcbiAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlO1xyXG4gICAgICAgIHRoaXMucmVjb3JkRGV0YWlscyhkYXRhKTtcclxuICAgICAgICB0aGlzLlNldFRvRnVsbFNjcmVlbigpOyBcclxuXHJcbiAgICAgICAgdGhpcy52aWV3U2hvd0NvbXBsZXRlID0gdGhpcy5pbml0Rm9ybS5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRGb3JtKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJLRU15R3JhZGVWaWV3LmluaXRGb3JtXCIpO1xyXG4gICAgfVxyXG4gIC8vXHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/aW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBLRUdyYWRlQ3JpdGVyaW9uIH0gZnJvbSBcIi4vS0VHcmFkZUNyaXRlcmlvblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEtFTXlHcmFkZURldGFpbHMge1xyXG4gICAgcHJpdmF0ZSB2aWV3SWQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgbGliTmFtZTogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfbG9hZGluZ1NwaW5uZXJJZDogc3RyaW5nID0gXCJncmFkZURldGFpbHNMb2FkaW5nXCI7XHJcbiAgICBwcml2YXRlIF9rZUdyYWRlQ3JpdGVyaW9uOiBLRUdyYWRlQ3JpdGVyaW9uO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHZpZXdJZDogc3RyaW5nLCBsaWJOYW1lOiBzdHJpbmcgPSBcIlwiKSB7XHJcbiAgICAgICAgdGhpcy52aWV3SWQgPSB2aWV3SWQ7XHJcbiAgICAgICAgdGhpcy5saWJOYW1lID0gbGliTmFtZTsgXHJcblxyXG4gICAgICAgIHRoaXMuX2tlR3JhZGVDcml0ZXJpb24gPSBuZXcgS0VHcmFkZUNyaXRlcmlvbih2aWV3SWQsIGxpYk5hbWUgKyBcIi5fa2VHcmFkZUNyaXRlcmlvblwiLCBcIiNcIiArIHRoaXMuX2xvYWRpbmdTcGlubmVySWQpO1xyXG4gICAgfSAgXHJcblxyXG4gICAgaW5pdFZpZXcoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIktFTXlHcmFkZURldGFpbHMuaW5pdFZpZXdcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX2tlR3JhZGVDcml0ZXJpb24uaW5pdCgpO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7vy8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9AdHlwZXMvYWxlcnRpZnkvaW5kZXguZC50c1wiIC8+XHJcbmltcG9ydCB7IGZpbHRlclRhYmxlUm93cywgZ2xvYmFsLCBpc1VuRGVmaW5lZCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFdlYkdyaWQsU2FvcFdlYkdyaWRQcm9wZXJ0aWVzLFNhb3BXZWJHcmlkVG9vbGJhcixTYW9wV2ViR3JpZFRvb2xiYXJCdXR0b24sU2FvcFdlYkRhdGFUYWJsZX0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC1ncmlkXCI7XHJcbmltcG9ydCB7IFNhb3BTZXJ2aWNlc0NvcmUgfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXNlcnZpY2VzLWNvcmVcIjtcclxuaW1wb3J0IHsgS0VNeUdyYWRlVmlldyB9IGZyb20gXCIuL0tFTXlHcmFkZS12aWV3XCI7XHJcbmltcG9ydCB7IFNhb3BUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXRyYW5zbGF0ZVwiO1xyXG5cclxuY2xhc3MgTXlHcmFkZURhdGEge1xyXG4gICAgc2lmcmFPY2VuT2Jkb2JqYTogc3RyaW5nO1xyXG4gICAgc2lmcmFaYXBvc2xlbmk6IHN0cmluZztcclxuICAgIGZpbmdlcnByaW50OiBzdHJpbmc7XHJcbiAgICBmb3JtVGl0bGU6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEtFTXlHcmFkZXNHcmlkT3B0aW9ucyB7XHJcbiAgICBzaG93VG9vbGJhcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBzaG93RmlsdGVyOiBib29sZWFuID0gdHJ1ZTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEtFTXlHcmFkZXNHcmlkIHtcclxuICAgIHByaXZhdGUgbGliTmFtZTogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfZ3JpZE9wdGlvbnM6IEtFTXlHcmFkZXNHcmlkT3B0aW9ucztcclxuICAgIC8vXHJcbiAgICBwcml2YXRlIGRpdklkOiBzdHJpbmcgPSBcIiNteUdyYWRlc0RpdlwiO1xyXG4gICAgcHJpdmF0ZSB3ZWJHcmlkSWQ6IHN0cmluZyA9IFwiI215R3JhZGVzR3JpZFwiO1xyXG4gICAgcHJpdmF0ZSB3ZWJHcmlkQWt0aXZuYVJvd3NCb2R5SWQ6IHN0cmluZyA9IFwiI215R3JhZGVzR3JpZEJvZHlBamF4XCI7XHJcbiAgICBwdWJsaWMgd2ViR3JpZDogU2FvcFdlYkdyaWQ7XHJcbiAgICBwdWJsaWMga2VNeUdyYWRlVmlldzogS0VNeUdyYWRlVmlldztcclxuICAgIHB1YmxpYyBmb3JtVHJhbnNsYXRpb25TZXJ2aWNlOiBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlO1xyXG4gICAgcHJpdmF0ZSBfc2VhcmNoVmFsdWVJZDogc3RyaW5nID0gXCIjTXlHcmFkZXNTZWFyY2hWYWx1ZVwiO1xyXG4gICAgcHJpdmF0ZSBfbWFpbkZvcm1EaXY6IEpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgICBwcml2YXRlIF9zZWFyY2hWYWx1ZTogSlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihsaWJOYW1lOiBzdHJpbmcsIGdyaWRPcHRpb25zOiBLRU15R3JhZGVzR3JpZE9wdGlvbnMgPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKGlzVW5EZWZpbmVkKGdyaWRPcHRpb25zKSkge1xyXG4gICAgICAgICAgICBncmlkT3B0aW9ucyA9IG5ldyBLRU15R3JhZGVzR3JpZE9wdGlvbnMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZ3JpZE9wdGlvbnMgPSBncmlkT3B0aW9ucztcclxuXHJcbiAgICAgICAgdGhpcy5saWJOYW1lID0gbGliTmFtZTsgIFxyXG4gICAgICAgIHRoaXMuZm9ybVRyYW5zbGF0aW9uU2VydmljZSA9IG5ldyBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlKCk7XHJcbiAgICB9ICBcclxuXHJcbiAgICBpbml0VmlldygpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiS0VNeUdyYWRlc0dyaWQuaW5pdFZpZXdcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX21haW5Gb3JtRGl2ID0gJCh0aGlzLmRpdklkKTtcclxuXHJcbiAgICAgICAgLy8gcHJldmFqYW5qZVxyXG4gICAgICAgIHRoaXMuc2V0Rm9ybVRlcm1pbm9sb2d5TGlzdCgpO1xyXG5cclxuICAgICAgICAvLyByZWZyZXNoIGFjdGl2ZSBpbnRlcm5hbCBvcmRlcnNcclxuICAgICAgICB0aGlzLnJlZnJlc2hNeUdyYWRlc0dyaWREYXRhKCk7XHJcblxyXG4gICAgICAgIC8vIGluaXQgZWRpdCB2aWV3XHJcbiAgICAgICAgdGhpcy5pbml0RWRpdFZpZXcoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldEZvcm1UZXJtaW5vbG9neUxpc3QoKSB7XHJcbiAgICAgICAgbGV0IHRlcm1pbm9sb2d5ID0gW1wiSW50ZXJubyBuYXJvxI1pbG8gemEga29waXJhbmplIG5pIGl6YnJhbm8uXCJdO1xyXG5cclxuICAgICAgICB0aGlzLmZvcm1UcmFuc2xhdGlvblNlcnZpY2Uuc2V0VHJhbnNsYXRpb25zTGlzdCh0ZXJtaW5vbG9neSk7XHJcbiAgICB9ICAgICBcclxuXHJcbiAgICBpbml0RWRpdFZpZXcoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIktFTXlHcmFkZXNHcmlkLmluaXRFZGl0Vmlld1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy5rZU15R3JhZGVWaWV3ID0gbmV3IEtFTXlHcmFkZVZpZXcoXCIja2VNeUdyYWRlVmlldzAwMVwiLCB0aGlzLmxpYk5hbWUgKyBcIi5rZU15R3JhZGVWaWV3XCIpO1xyXG4gICAgICAgIHRoaXMua2VNeUdyYWRlVmlldy5mdWxsU2NyZWVuID0gdHJ1ZTtcclxuICAgICAgICAvL3RoaXMua2VNeUdyYWRlVmlldy5yZWZyZXNoRGF0YSA9IHRoaXMucmVmcmVzaERhdGFBZnRlckVkaXRWaWV3LmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbWV0b2RhIHNlIGl6dmVkZSBwbyBlZGl0LCBhZGQgYWxpIGRlbGV0ZSBtZXRvZGkgdiB0aGlzLm5ka0ludGVybmFsT3JkZXJzVmlld1xyXG4gICAgcmVmcmVzaERhdGFBZnRlckVkaXRWaWV3KHNlbmRlcjogYW55KTogdm9pZCB7IFxyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJLRU15R3JhZGVzR3JpZC5yZWZyZXNoRGF0YUFmdGVyRWRpdFZpZXdcIik7XHJcblxyXG4gICAgICAgIC8vIG9zdmV6aSBzZSB0YWJlbGFcclxuICAgICAgICB0aGlzLnJlZnJlc2hNeUdyYWRlc0dyaWREYXRhKCk7XHJcbiAgICAgICAgLy8ga2xpY2Ugc2UgZXh0ZXJuYWwgbWV0b2RhLCBkYSBzZSBsYWhrbyBvc3ZlemlqbyBzZSBkcnVnaSBwb2RhdGtpIG5wci4gcmlnaHQgc3VtbWFyeSBkYXRhXHJcbiAgICAgICAgdGhpcy5hZnRlclJlZnJlc2hEYXRhQWZ0ZXJFZGl0Vmlld0V4dGVybmFsKHNlbmRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFmdGVyUmVmcmVzaERhdGFBZnRlckVkaXRWaWV3RXh0ZXJuYWwoc2VuZGVyOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiS0VNeUdyYWRlc0dyaWQuYWZ0ZXJSZWZyZXNoRGF0YUFmdGVyRWRpdFZpZXdFeHRlcm5hbFwiKTtcclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoTXlHcmFkZXNHcmlkRGF0YSgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiS0VNeUdyYWRlc0dyaWQucmVmcmVzaE15R3JhZGVzR3JpZERhdGFcIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIGxldCBzYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICBfdGhpcy5yZWZyZXNoR3JpZERhdGEocmVzcG9uc2UpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOlwiS2VHcmFkZXMvR2V0TXlHcmFkZXNUYWJsZVwiIFxyXG4gICAgICAgICAgICAsZGF0YTpudWxsXHJcbiAgICAgICAgICAgICx0eXBlOlwiR0VUXCJcclxuICAgICAgICB9KTsgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hHcmlkRGF0YShodG1sQ29udGVudDogc3RyaW5nKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIktFTXlHcmFkZXNHcmlkLnJlZnJlc2hHcmlkRGF0YVwiKTtcclxuXHJcbiAgICAgICAgaWYgKCQodGhpcy53ZWJHcmlkSWQpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAkKHRoaXMud2ViR3JpZEFrdGl2bmFSb3dzQm9keUlkKS5odG1sKGh0bWxDb250ZW50KTtcclxuICAgICAgICAgICAgdGhpcy5pbml0V2ViR3JpZExpc3RuZXJzKCk7XHJcbiAgICAgICAgICAgIGlmICghaXNVbkRlZmluZWQodGhpcy5fc2VhcmNoVmFsdWUpICYmIHRoaXMuX3NlYXJjaFZhbHVlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5leGVjdXRlRmlsdGVyU2VhcmNoKHRoaXMuX3NlYXJjaFZhbHVlLnZhbCgpLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAkKHRoaXMuZGl2SWQpLmh0bWwoaHRtbENvbnRlbnQpO1xyXG4gICAgICAgICAgICB0aGlzLmdldFdlYkdyaWRUb29sYmFyQW5kSW5pdFdlYkdyaWQoKTsgXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFdlYkdyaWRUb29sYmFyQW5kSW5pdFdlYkdyaWQoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIktFTXlHcmFkZXNHcmlkLmdldFdlYkdyaWRUb29sYmFyQW5kSW5pdFdlYkdyaWRcIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgbGV0IHBhcmFtcyA9IHsgamF2YXNjcmlwdEtuaml6bmljYTogX3RoaXMubGliTmFtZSB9O1xyXG5cclxuICAgICAgICBsZXQgc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgX3RoaXMuaW5pdFdlYkdyaWQocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICBfdGhpcy5pbml0RmlsdGVyQ29udHJvbHMoKTsgIFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOiBcIktlR3JhZGVzL0dldFRhYmxlVG9vbGJhclwiXHJcbiAgICAgICAgICAgICwgZGF0YTogcGFyYW1zXHJcbiAgICAgICAgICAgICwgdHlwZTogXCJHRVRcIlxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRXZWJHcmlkKHRvb2xiYXJUZW1wbGF0ZTogc3RyaW5nID0gXCJcIikge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJLRU15R3JhZGVzR3JpZC5pbml0V2ViR3JpZFwiKTtcclxuXHJcbiAgICAgICAgbGV0IGNhcHRpb25Ub29sYmFyID0gJCh0aGlzLndlYkdyaWRJZCkuYXR0cihcImNhcHRpb24tdG9vbGJhclwiKTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMud2ViR3JpZCA9IG5ldyBTYW9wV2ViR3JpZCh0aGlzLmxpYk5hbWUgKyBcIi53ZWJHcmlkXCIpO1xyXG4gICAgICAgIGxldCBncmlkUHJvcGVydGllczogU2FvcFdlYkdyaWRQcm9wZXJ0aWVzO1xyXG4gICAgICAgIGxldCBncmlkVG9vbGJhcjogU2FvcFdlYkdyaWRUb29sYmFyO1xyXG4gICAgICAgIGxldCB0b29sYmFyQnV0dG9uczogU2FvcFdlYkdyaWRUb29sYmFyQnV0dG9uW10gPSBbXTtcclxuICAgICAgICBsZXQgZGF0YVRhYmxlOiBTYW9wV2ViRGF0YVRhYmxlO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgaWYgKHRoaXMuX2dyaWRPcHRpb25zLnNob3dUb29sYmFyKSB7XHJcbiAgICAgICAgICAgIHRvb2xiYXJCdXR0b25zLnB1c2goeyBpZDogXCJcIiwgY2FwdGlvbjogXCJcIiwgdGVtcGxhdGU6IHRvb2xiYXJUZW1wbGF0ZSB9KTtcclxuICAgICAgICAgICAgZ3JpZFRvb2xiYXIgPSB7IGlkOiBcInNhb3BXZWJHcmlkVEIxXCIsIGNhcHRpb246IGNhcHRpb25Ub29sYmFyLCBidXR0b25zOiB0b29sYmFyQnV0dG9ucyB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGF0YVRhYmxlID0geyBlbmFibGVkOiB0cnVlLCBvcmRlcmluZzogdHJ1ZX07XHJcblxyXG4gICAgICAgIGdyaWRQcm9wZXJ0aWVzID0ge1xyXG4gICAgICAgICAgICBncmlkSWQ6IHRoaXMud2ViR3JpZElkXHJcbiAgICAgICAgICAgICwgdG9nZ2xlUGFuZWw6IHsgZW5hYmxlZDogZmFsc2UgfVxyXG4gICAgICAgICAgICAsIHRvb2xiYXI6IGdyaWRUb29sYmFyXHJcbiAgICAgICAgICAgICwgZGF0YVRhYmxlOiBkYXRhVGFibGVcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy53ZWJHcmlkLmluaXQoZ3JpZFByb3BlcnRpZXMpO1xyXG5cclxuICAgICAgICB0aGlzLmluaXRXZWJHcmlkTGlzdG5lcnMoKTtcclxuXHJcbiAgICAgICAgJCh0aGlzLmRpdklkKS5zaG93KCk7XHJcblxyXG4gICAgICAgIC8vdGhpcy5zZXREYXNoYm9hcmRTcGVjaWZpY1ZpZXcoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0V2ViR3JpZExpc3RuZXJzKCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJLRU15R3JhZGVzR3JpZC5pbml0V2ViR3JpZExpc3RuZXJzXCIpO1xyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICAvLyBwcmlrYXogZnVsbCBzY3JlZW4ga28ga2xpa25lIG5hIHZyc3RpY29cclxuICAgICAgICAkKFwiYm9keVwiKS5vZmYoXCJjbGlja1wiLCB0aGlzLndlYkdyaWRJZCArIFwiIHRyIHRkOm5vdCgudGQtYWN0aW9uLC50ZC1hY3Rpb24tY2hlY2tib3gpXCIpO1xyXG4gICAgICAgICQoXCJib2R5XCIpLm9uKFwiY2xpY2tcIiwgdGhpcy53ZWJHcmlkSWQgKyBcIiB0ciB0ZDpub3QoLnRkLWFjdGlvbiwudGQtYWN0aW9uLWNoZWNrYm94KVwiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZFJvdyA9IDxIVE1MRWxlbWVudD4kKHRoaXMpLmNsb3Nlc3QoXCJ0clwiKVswXTtcclxuICAgICAgICAgICAgbGV0IGRhdGEgPSBfdGhpcy5nZXRNeUdyYWRlRGF0YUF0dHJpYnV0ZShzZWxlY3RlZFJvdyk7XHJcblxyXG4gICAgICAgICAgICAvLyBiYXJ2YW5qZSBvem5hY2VuZSB2cnN0cmljZVxyXG4gICAgICAgICAgICBfdGhpcy53ZWJHcmlkLm1hcmtTZWxlY3RlZFJvdyhzZWxlY3RlZFJvdyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWlzVW5EZWZpbmVkKGRhdGEuc2lmcmFPY2VuT2Jkb2JqYSkgJiYgIWlzVW5EZWZpbmVkKGRhdGEuc2lmcmFaYXBvc2xlbmkpKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5zaG93UmVjb3JkRGV0YWlscyh7IHNpZnJhT2Nlbk9iZG9iamE6IGRhdGEuc2lmcmFPY2VuT2Jkb2JqYSwgc2lmcmFaYXBvc2xlbmk6IGRhdGEuc2lmcmFaYXBvc2xlbmksIGZpbmdlcnByaW50OiBkYXRhLmZpbmdlcnByaW50IH0sIGRhdGEuZm9ybVRpdGxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRGaWx0ZXJDb250cm9scygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiS0VNeUdyYWRlc0dyaWQuaW5pdEZpbHRlckNvbnRyb2xzXCIpO1xyXG5cclxuICAgICAgICB0aGlzLl9zZWFyY2hWYWx1ZSA9IHRoaXMuX21haW5Gb3JtRGl2LmZpbmQodGhpcy5fc2VhcmNoVmFsdWVJZCk7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgdGhpcy5fc2VhcmNoVmFsdWUub2ZmKFwia2V5dXBcIik7XHJcbiAgICAgICAgdGhpcy5fc2VhcmNoVmFsdWUub24oXCJrZXl1cFwiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIF90aGlzLmV4ZWN1dGVGaWx0ZXJTZWFyY2goJCh0aGlzKS52YWwoKS50b1N0cmluZygpKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBleGVjdXRlRmlsdGVyU2VhcmNoKHNlYXJjaFZhbDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIktFTXlHcmFkZXNHcmlkLmV4ZWN1dGVGaWx0ZXJTZWFyY2hcIik7XHJcblxyXG4gICAgICAgIC8vIHRvbGUgbmkgZGVsb3ZhbG86IGtvIHNlIGplIHNwcmVtZW5pbG8gbGV0bywgamUgc2UgdmVkbm8gZmlsdHJpcmFsIHN0YXJlIHBvZGF0a2Ugb2QgcHJlanNuamVnYSBsZXRhXHJcbiAgICAgICAgLy9sZXQgb1RhYmxlID0gdGhpcy53ZWJHcmlkLmRhdGFUYWJsZTtcclxuICAgICAgICAvL29UYWJsZS5zZWFyY2goc2VhcmNoVmFsKS5kcmF3KCk7XHJcblxyXG4gICAgICAgIGZpbHRlclRhYmxlUm93cyhzZWFyY2hWYWwsIHRoaXMuZGl2SWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE15R3JhZGVEYXRhQXR0cmlidXRlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogTXlHcmFkZURhdGEge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJLRU15R3JhZGVzR3JpZC5nZXRNeUdyYWRlRGF0YUF0dHJpYnV0ZVwiKTtcclxuXHJcbiAgICAgICAgbGV0IGRhdGEgPSBuZXcgTXlHcmFkZURhdGEoKTtcclxuXHJcbiAgICAgICAgZGF0YS5zaWZyYU9jZW5PYmRvYmphID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXNpZnJhb2Nlbm9iZG9iamFcIik7XHJcbiAgICAgICAgZGF0YS5zaWZyYVphcG9zbGVuaSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1zaWZyYXphcG9zbGVuaVwiKTtcclxuICAgICAgICBkYXRhLmZpbmdlcnByaW50ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWZpbmdlcnByaW50XCIpO1xyXG4gICAgICAgIGRhdGEuZm9ybVRpdGxlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWZvcm10aXRsZVwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd1JlY29yZERldGFpbHMoZGV0YWlsc0RhdGE6IGFueSwgdGl0bGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJLRU15R3JhZGVzR3JpZC5zaG93UmVjb3JkRGV0YWlsc1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy5rZU15R3JhZGVWaWV3LnNob3dGb3JtKGRldGFpbHNEYXRhLCB0aXRsZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/aW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBLRU15R3JhZGVzR3JpZCB9IGZyb20gXCIuL0tFTXlHcmFkZXMtZ3JpZFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEtFTXlHcmFkZXMge1xyXG4gICAgcHJpdmF0ZSBsaWJOYW1lOiBzdHJpbmc7XHJcblxyXG4gICAgcHJpdmF0ZSBrZU15R3JhZGVzR3JpZDogS0VNeUdyYWRlc0dyaWQ7XHJcbiAgICBcclxuICAgIGNvbnN0cnVjdG9yKGxpYk5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMubGliTmFtZSA9IGxpYk5hbWU7IFxyXG5cclxuICAgICAgICB0aGlzLmtlTXlHcmFkZXNHcmlkID0gbmV3IEtFTXlHcmFkZXNHcmlkKHRoaXMubGliTmFtZSArIFwiLmtlTXlHcmFkZXNHcmlkXCIpO1xyXG4gICAgICAgIHRoaXMua2VNeUdyYWRlc0dyaWQuYWZ0ZXJSZWZyZXNoRGF0YUFmdGVyRWRpdFZpZXdFeHRlcm5hbCA9IHRoaXMucmVmcmVzaERhdGFBZnRlckVkaXRWaWV3LmJpbmQodGhpcyk7XHJcbiAgICB9ICBcclxuXHJcbiAgICBpbml0VmlldygpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiS0VNeUdyYWRlcy5pbml0Vmlld1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy5rZU15R3JhZGVzR3JpZC5pbml0VmlldygpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hEYXRhQWZ0ZXJFZGl0VmlldygpOiB2b2lkIHsgXHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIktFTXlHcmFkZXMucmVmcmVzaERhdGFBZnRlckVkaXRWaWV3XCIpO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsImltcG9ydCB7IGdsb2JhbCwgZ2V0UmVsYXRpdmVTaXRlVVJMLCBnZXRTaXRlQWJzb2x1dGVVUkwsIGlzRW1wdHksIGlzVW5EZWZpbmVkIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wVmlld0Zvcm0gfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXZpZXctZm9ybVwiO1xyXG5pbXBvcnQgeyBTYW9wVXBsb2FkRmlsZXMgfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLXVwbG9hZC1maWxlc1wiO1xyXG5pbXBvcnQgeyBTYW9wQXR0YWNobWVudExpc3QgfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLWF0dGFjaG1lbnQtbGlzdFwiO1xyXG5pbXBvcnQgeyBPUE5Qb3RuaU5hbG9naUdvZ2dsZU1hcHNWaWV3IH0gZnJvbSBcIi4uL09QTi9PUE5Qb3RuaU5hbG9naUdvZ2dsZU1hcHMtdmlld1wiO1xyXG5pbXBvcnQgeyBTYW9wTWVzc2FnZURsZywgU2FvcE1zZ0RsZ0J1dHRvbiB9IGZyb20gJy4uL0NvbXBvbmVudHMvc2FvcC1tZXNzYWdlLWRsZyc7XHJcbmltcG9ydCB7IFNhb3BTZXJ2aWNlc0NvcmUgfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXNlcnZpY2VzLWNvcmVcIjtcclxuaW1wb3J0IHsgU2FvcEZsb2F0aW5nTGFiZWwgfSBmcm9tICcuLi9Db21wb25lbnRzL3Nhb3AtZmxvYXRpbmctbGFiZWwnO1xyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBMSUtWQ2FrYWxuYVZyc3RhQ29tbWVudCBleHRlbmRzIFNhb3BWaWV3Rm9ybSB7XHJcbiAgICBwcml2YXRlIF9mb3JtSWQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgX3Nhb3BGbG9hdGluZ0xhYmVsOiBTYW9wRmxvYXRpbmdMYWJlbCA9IG5ldyBTYW9wRmxvYXRpbmdMYWJlbCgpO1xyXG5cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih2aWV3SWQ6IHN0cmluZywgbGliTmFtZTogc3RyaW5nID0gXCJcIikge1xyXG4gICAgICAgIHN1cGVyKHZpZXdJZCwgbGliTmFtZSk7XHJcbiAgICAgICAgdGhpcy5zZXREaWN0aW9uYXJ5KCk7XHJcbiAgICAgICAgdGhpcy50aXRsZSA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIlphdnJuaSBkb2t1bWVudFwiKTtcclxuICAgICAgICB0aGlzLmZ1bGxUaXRsZSA9IHRoaXMudGl0bGU7XHJcbiAgICAgICAgdGhpcy5hZGRSZWNvcmRFbmRwb2ludCA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5lZGl0UmVjb3JkRW5kcG9pbnQgPSBcIkxpa3ZDb25maXJtYXRpb25zL0FkZENvbW1lbnRcIjtcclxuICAgICAgICB0aGlzLmRlbGV0ZVJlY29yZEVuZHBvaW50ID0gXCJcIjtcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMuYWZ0ZXJWaWV3U2hvd1N1Y2Nlc3MgPSB0aGlzLmluaXRWaWV3O1xyXG4gICAgICAgIHRoaXMuYWZ0ZXJTdWJtaXRTdWNjZXNzID0gdGhpcy5pbml0VmlldztcclxuICAgICAgICAvL1xyXG4gICAgfVxyXG5cclxuICAgIHNldERpY3Rpb25hcnkoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIkxJS1ZDYWthbG5hVnJzdGFDb21tZW50LnNldERpY3Rpb25hcnlcIik7XHJcbiAgICAgICAgbGV0IGRpY3Rpb25hcnk6IHN0cmluZ1tdID0gW1wiUG90cmpldmFuamU6IHByZWpldGkgcmHEjXVuXCIsIFwiUmF6bG9nIHphdnJuaXR2ZSBqZSBvYnZlemVuIHBvZGF0ZWsuXCIsXCJaYXZybmkgZG9rdW1lbnRcIl07XHJcbiAgICAgICAgdGhpcy5zZXRUZXJtaW5vbG9neUxpc3QoZGljdGlvbmFyeSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBpbml0VmlldygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTElLVkNha2FsbmFWcnN0YUNvbW1lbnQuaW5pdFZpZXdcIik7XHJcbiAgICAgICAgdGhpcy5Mb2FkVmlld0V2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBMb2FkVmlld0V2ZW50cygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTElLVkNha2FsbmFWcnN0YUNvbW1lbnQuTG9hZFZpZXdFdmVudHNcIik7XHJcbiAgICAgICAgbGV0IF92aWV3RGl2ID0gJCh0aGlzLmlkKTtcclxuICAgICAgICBpZiAoX3ZpZXdEaXYubGVuZ3RoID09IDApIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5fZm9ybUlkID0gXCIjbWFpbkxpa3ZDYWthbG5hVnJzdGFDb21tZW50XCI7XHJcblxyXG4gICAgICAgICQoXCIjQWRkQ29tbWVudFZpZXdcIikuZmluZChcIiNidG5EZW55XCIpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICQoXCIjQWRkQ29tbWVudFZpZXdcIikuZmluZChcIiNidG5EZW55XCIpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChyb3cpIHtcclxuICAgICAgICAgICAgX3RoaXMub25EZW55Q2xpY2soKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25EZW55Q2xpY2soKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIkxJS1ZDYWthbG5hVnJzdGFDb21tZW50Lm9uRGVueUNsaWNrXCIpO1xyXG4gICAgICAgIGxldCBfa29tZW50YXIgPSAkKFwiI0FkZENvbW1lbnRWaWV3XCIpLmZpbmQoXCIjS29tZW50YXJcIilbMF0gYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgICBsZXQgX2tvbWVudGFyVGV4dCA9IF9rb21lbnRhci52YWx1ZTtcclxuICAgICAgICBpZiAodGhpcy5vblZhbGlkZWF0ZUtvbWVudGFyKF9rb21lbnRhcikpIHtcclxuXHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJMSUtWQ2FrYWxuYVZyc3RhQ29tbWVudC5vbkRlbnlDbGljay5zdWJtaXRcIik7XHJcbiAgICAgICAgICAgIHRoaXMuQ2xvc2VWaWV3Rm9ybSgpO1xyXG4gICAgICAgICAgICAkKFwiI0xpa3ZDb25maXJtYXRpb25zRWRpdFZpZXdcIikuZmluZChcIiNkZXNrdG9wS29tZW50YXJcIikudmFsKF9rb21lbnRhclRleHQpO1xyXG4gICAgICAgICAgICAkKFwiI0xpa3ZDb25maXJtYXRpb25zRWRpdFZpZXdcIikuZmluZChcIiNtb2JpbGVLb21lbnRhclwiKS52YWwoX2tvbWVudGFyVGV4dCk7XHJcbiAgICAgICAgICAgICQoXCIjTGlrdkNvbmZpcm1hdGlvbnNFZGl0Vmlld1wiKS5maW5kKFwiI1N0YXR1c1wiKS52YWwoMSk7XHJcbiAgICAgICAgICAgICQoXCIjTGlrdkNvbmZpcm1hdGlvbnNFZGl0Vmlld1wiKS5zdWJtaXQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uVmFsaWRlYXRlS29tZW50YXIoa29tZW50YXI6IEhUTUxJbnB1dEVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTElLVkNha2FsbmFWcnN0YUNvbW1lbnQub25WYWxpZGVhdGVLb21lbnRhclwiKTtcclxuXHJcbiAgICAgICAgbGV0IF9rb21lbnRhclRleHQgPSBrb21lbnRhci52YWx1ZTtcclxuICAgICAgICBpZiAoX2tvbWVudGFyVGV4dC5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICBsZXQgX21zZ1JlcXVyZWQgPSB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJSYXpsb2cgemF2cm5pdHZlIGplIG9idmV6ZW4gcG9kYXRlay5cIik7XHJcbiAgICAgICAgICAgIHRoaXMuX3Nhb3BGbG9hdGluZ0xhYmVsLnNldFZhbGlkYXRpb25FcnJvcihrb21lbnRhciwgX21zZ1JlcXVyZWQpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vXHJcbn1cclxuXHJcbiIsImltcG9ydCB7IGdsb2JhbCwgZ2V0UmVsYXRpdmVTaXRlVVJMLCBnZXRTaXRlQWJzb2x1dGVVUkwsIGlzRW1wdHksIGlzVW5EZWZpbmVkIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wVmlld0Zvcm0gfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXZpZXctZm9ybVwiO1xyXG5pbXBvcnQgeyBTYW9wVXBsb2FkRmlsZXMgfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLXVwbG9hZC1maWxlc1wiO1xyXG5pbXBvcnQgeyBTYW9wQXR0YWNobWVudExpc3QgfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLWF0dGFjaG1lbnQtbGlzdFwiO1xyXG5pbXBvcnQgeyBPUE5Qb3RuaU5hbG9naUdvZ2dsZU1hcHNWaWV3IH0gZnJvbSBcIi4uL09QTi9PUE5Qb3RuaU5hbG9naUdvZ2dsZU1hcHMtdmlld1wiO1xyXG5pbXBvcnQgeyBTYW9wTWVzc2FnZURsZywgU2FvcE1zZ0RsZ0J1dHRvbiB9IGZyb20gJy4uL0NvbXBvbmVudHMvc2FvcC1tZXNzYWdlLWRsZyc7XHJcbmltcG9ydCB7IFNhb3BTZXJ2aWNlc0NvcmUgfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXNlcnZpY2VzLWNvcmVcIjtcclxuaW1wb3J0IHsgU2FvcEZsb2F0aW5nTGFiZWwgfSBmcm9tICcuLi9Db21wb25lbnRzL3Nhb3AtZmxvYXRpbmctbGFiZWwnO1xyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBMSUtWQ2FrYWxuYVZyc3RhQ29tbWVudENvbmZpcm0gZXh0ZW5kcyBTYW9wVmlld0Zvcm0ge1xyXG4gIHByaXZhdGUgX2Zvcm1JZDpzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfc2FvcEZsb2F0aW5nTGFiZWw6U2FvcEZsb2F0aW5nTGFiZWwgPSBuZXcgU2FvcEZsb2F0aW5nTGFiZWwoKTtcclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKHZpZXdJZDpzdHJpbmcsbGliTmFtZTpzdHJpbmcgPSBcIlwiKXtcclxuICAgIHN1cGVyKHZpZXdJZCxsaWJOYW1lKTtcclxuICAgIHRoaXMuc2V0RGljdGlvbmFyeSgpOyAgXHJcbiAgICB0aGlzLnRpdGxlID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiUG90cmRpIGRva3VtZW50XCIpO1xyXG4gICAgdGhpcy5mdWxsVGl0bGUgPSB0aGlzLnRpdGxlO1xyXG4gICAgdGhpcy5hZGRSZWNvcmRFbmRwb2ludCA9IFwiXCI7XHJcbiAgICB0aGlzLmVkaXRSZWNvcmRFbmRwb2ludCA9IFwiTGlrdkNvbmZpcm1hdGlvbnMvQWRkQ29tbWVudENvbmZpcm1cIjtcclxuICAgIHRoaXMuZGVsZXRlUmVjb3JkRW5kcG9pbnQgPSBcIlwiOyBcclxuICAgIC8vXHJcbiAgICB0aGlzLmFmdGVyVmlld1Nob3dTdWNjZXNzID0gdGhpcy5pbml0VmlldztcclxuICAgIHRoaXMuYWZ0ZXJTdWJtaXRTdWNjZXNzID0gdGhpcy5pbml0VmlldztcclxuICAgIC8vXHJcbiAgfVxyXG5cclxuICBzZXREaWN0aW9uYXJ5KCl7XHJcbiAgICAgIGxldCBkaWN0aW9uYXJ5OnN0cmluZ1tdID0gW1wiUG90cmpldmFuamU6IHByZWpldGkgcmHEjXVuXCIsXCJSYXpsb2cgemF2cm5pdHZlIGplIG9idmV6ZW4gcG9kYXRlay5cIixcIlBvdHJkaSBkb2t1bWVudFwiXTtcclxuICAgICAgdGhpcy5zZXRUZXJtaW5vbG9neUxpc3QoZGljdGlvbmFyeSk7XHJcbiAgfSBcclxuXHJcblxyXG4gIHB1YmxpYyBpbml0VmlldygpOnZvaWR7XHJcbiAgICB0aGlzLkxvYWRWaWV3RXZlbnRzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgTG9hZFZpZXdFdmVudHMgKCk6dm9pZHtcclxuICAgIGxldCBfdmlld0RpdiA9ICQodGhpcy5pZCk7XHJcbiAgICBpZiAoX3ZpZXdEaXYubGVuZ3RoID09IDApIHtyZXR1cm47fVxyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICB0aGlzLl9mb3JtSWQgPSBcIiNtYWluTGlrdkNha2FsbmFWcnN0YUNvbW1lbnRDb25maXJtXCI7XHJcblxyXG4gICAgJChcIiNBZGRDb21tZW50Q29uZmlybVZpZXdcIikuZmluZChcIiNidG5Db25maXJtXCIpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgJChcIiNBZGRDb21tZW50Q29uZmlybVZpZXdcIikuZmluZChcIiNidG5Db25maXJtXCIpLm9uKCdjbGljaycsIGZ1bmN0aW9uKHJvdyl7XHJcbiAgICAgIF90aGlzLm9uQ29uZmlybUNsaWNrKCk7XHJcbiAgICB9KTsgICAgICAgXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Db25maXJtQ2xpY2sgKCk6IHZvaWR7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTElLVkNha2FsbmFWcnN0YUNvbW1lbnRDb25maXJtLm9uQ29uZmlybUNsaWNrXCIpOyAgICBcclxuICAgIGxldCBfa29tZW50YXIgPSAgJChcIiNBZGRDb21tZW50Q29uZmlybVZpZXdcIikuZmluZChcIiNLb21lbnRhclwiKVswXSBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgbGV0IF9rb21lbnRhclRleHQgPSAgX2tvbWVudGFyLnZhbHVlO1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIkxJS1ZDYWthbG5hVnJzdGFDb21tZW50Lm9uQ29uZmlybUNsaWNrLnN1Ym1pdFwiKTsgICAgXHJcbiAgICB0aGlzLkNsb3NlVmlld0Zvcm0oKTtcclxuICAgICQoXCIjTGlrdkNvbmZpcm1hdGlvbnNFZGl0Vmlld1wiKS5maW5kKFwiI2Rlc2t0b3BLb21lbnRhclwiKS52YWwoX2tvbWVudGFyVGV4dCk7XHJcbiAgICAkKFwiI0xpa3ZDb25maXJtYXRpb25zRWRpdFZpZXdcIikuZmluZChcIiNtb2JpbGVLb21lbnRhclwiKS52YWwoX2tvbWVudGFyVGV4dCk7ICAgICAgICAgICAgXHJcbiAgICAkKFwiI0xpa3ZDb25maXJtYXRpb25zRWRpdFZpZXdcIikuZmluZChcIiNTdGF0dXNcIikudmFsKDApO1xyXG4gICAgJChcIiNMaWt2Q29uZmlybWF0aW9uc0VkaXRWaWV3XCIpLnN1Ym1pdCgpOyBcclxuICB9XHJcbiAgLy9cclxufVxyXG5cclxuIiwiaW1wb3J0IHsgZ2xvYmFsLCBzZXRNb2RhbEZvcm1aSW5kZXgsIGdldFJlbGF0aXZlU2l0ZVVSTCwgZ2V0U2l0ZUFic29sdXRlVVJMLCBpc1VuRGVmaW5lZCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFdlYkdyaWQsU2FvcFdlYkdyaWRQcm9wZXJ0aWVzLFNhb3BXZWJHcmlkVG9vbGJhcixTYW9wV2ViR3JpZFRvb2xiYXJCdXR0b24sU2FvcFdlYkRhdGFUYWJsZX0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC1ncmlkXCI7XHJcbmltcG9ydCB7IFNhb3BTZXJ2aWNlc0NvcmUgfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXNlcnZpY2VzLWNvcmVcIjtcclxuaW1wb3J0IHsgTElLVkNha2FsbmFWcnN0YVZpZXcgfSBmcm9tIFwiLi4vTElLVi9MSUtWQ2FrYWxuYVZyc3RhLXZpZXdcIjtcclxuaW1wb3J0IHsgU2FvcFdmQWN0aW9uIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC12aWV3LWZvcm1cIjtcclxuaW1wb3J0IHsgTElLVkNha2FsbmFWcnN0YUNvbW1lbnQgfSBmcm9tIFwiLi4vTElLVi9MSUtWQ2FrYWxuYVZyc3RhLUNvbW1lbnRcIjtcclxuaW1wb3J0IHsgTElLVkNha2FsbmFWcnN0YUNvbW1lbnRDb25maXJtIH0gZnJvbSBcIi4uL0xJS1YvTElLVkNha2FsbmFWcnN0YS1Db21tZW50Q29uZmlybVwiO1xyXG5pbXBvcnQgeyBTYW9wTXVsdGlzZWxlY3QgfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLW11bHRpc2VsZWN0XCI7XHJcbmltcG9ydCB7IFNhb3BQb3BvdmVyIH0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC1wb3BvdmVyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTElLVkNha2FsbmFWcnN0YUdyaWQge1xyXG4gICAgcHJpdmF0ZSBsaWJOYW1lOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9zYW9wU2VydmljZXNDb3JlOiBTYW9wU2VydmljZXNDb3JlO1xyXG4gICAgcHJpdmF0ZSBfbWFpbkZvcm1EaXY6IEpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgICBwcml2YXRlIF9zZWFyY2hWYWx1ZTogSlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIHByaXZhdGUgX3NlYXJjaFZhbHVlMTogSlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIHByaXZhdGUgX3NlbGVjdGVkUm93Tm86IG51bWJlcjtcclxuICAgIHByaXZhdGUgX3ByZXZJRFZyc3RlOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9wcmV2SUQ6IHN0cmluZzsgICAgXHJcbiAgICBwcml2YXRlIF9uZXh0SURWcnN0ZTogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfbmV4dElEOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9saWt2Q2FrYWxuYVZyc3RhQ29tbWVudDogTElLVkNha2FsbmFWcnN0YUNvbW1lbnQ7XHJcbiAgICBwcml2YXRlIF9saWt2Q2FrYWxuYVZyc3RhQ29tbWVudENvbmZpcm06IExJS1ZDYWthbG5hVnJzdGFDb21tZW50Q29uZmlybTtcclxuICAgIC8vXHJcbiAgICBwdWJsaWMgd2ViR3JpZDE6IFNhb3BXZWJHcmlkO1xyXG4gICAgcHVibGljIF9MSUtWQ2FrYWxuYVZyc3RhVmlldzogTElLVkNha2FsbmFWcnN0YVZpZXc7XHJcbiAgICBwcml2YXRlIF92cnN0YURva3VtZW50YTogU2FvcE11bHRpc2VsZWN0O1xyXG4gICAgcHJpdmF0ZSBfdnJzdGFEb2t1bWVudGFNb2JpbGU6IFNhb3BNdWx0aXNlbGVjdDtcclxuICAgIHByaXZhdGUgX3Zyc3RhRG9rdW1lbnRhRGl2SWQ6IHN0cmluZztcclxuICAgIHB1YmxpYyBfZGFzaGJvYXJkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9zYW9wUG9wb3ZlckZpbHRlcjogU2FvcFBvcG92ZXI7XHJcbiAgICBwcml2YXRlIF9pemJyYW5hVnJzdGFEb2t1bWVudGE6IHN0cmluZztcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihsaWJOYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmxpYk5hbWUgPSBsaWJOYW1lO1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy5fTElLVkNha2FsbmFWcnN0YVZpZXcgPSBuZXcgTElLVkNha2FsbmFWcnN0YVZpZXcoXCIjTElLVkNha2FsbmFWcnN0YVZpZXcwMDFcIiwgdGhpcy5saWJOYW1lICsgXCIuX0xJS1ZDYWthbG5hVnJzdGFWaWV3XCIpO1xyXG4gICAgICAgIHRoaXMuX0xJS1ZDYWthbG5hVnJzdGFWaWV3LnJlZnJlc2hEYXRhID0gdGhpcy5vbkxJS1ZpZERvY3VtZW50Q29tcGxldGUuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLl9MSUtWQ2FrYWxuYVZyc3RhVmlldy5mdWxsU2NyZWVuID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9MSUtWQ2FrYWxuYVZyc3RhVmlldy5Nb3ZlVG9OZXh0ID0gdGhpcy5Nb3ZlVG9OZXh0RXh0LmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5fTElLVkNha2FsbmFWcnN0YVZpZXcuTW92ZVRvUHJldmlvdXMgPSB0aGlzLk1vdmVUb1ByZXZpb3VzRXh0LmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5fTElLVkNha2FsbmFWcnN0YVZpZXcuQ29uZmlybUFuZE1vdmVUb05leHQgPSB0aGlzLkNvbmZpcm1BbmRNb3ZlVG9OZXh0RXh0LmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5fTElLVkNha2FsbmFWcnN0YVZpZXcuRGVueUFuZE1vdmVUb05leHQgPSB0aGlzLkRlbnlBbmRNb3ZlVG9OZXh0RXh0LmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5fbGlrdkNha2FsbmFWcnN0YUNvbW1lbnQgPSBuZXcgTElLVkNha2FsbmFWcnN0YUNvbW1lbnQoXCIjTElLVkNha2FsbmFWcnN0YVZpZXcwMDJcIiwgbGliTmFtZSk7XHJcbiAgICAgICAgdGhpcy5fbGlrdkNha2FsbmFWcnN0YUNvbW1lbnRDb25maXJtID0gbmV3IExJS1ZDYWthbG5hVnJzdGFDb21tZW50Q29uZmlybShcIiNMSUtWQ2FrYWxuYVZyc3RhVmlldzAwM1wiLCBsaWJOYW1lKTtcclxuICAgICAgICAvLyAgICAgICAgdGhpcy5fbGlrdkNha2FsbmFWcnN0YUNvbW1lbnQub25EZW55Q2xpY2sgPSB0aGlzLm9uRGVueUNsaWNrLmJpbmQodGhpcyk7XHJcbiAgICAgICAgLy8gICAgICAgIHRoaXMuX3Zyc3RhRG9rdW1lbnRhRGl2SWQgPSBcIiNWcnN0YURva3VtZW50YURpdlwiOyAgXHJcbiAgICAgICAgdGhpcy5fc2FvcFBvcG92ZXJGaWx0ZXIgPSBuZXcgU2FvcFBvcG92ZXIoKTtcclxuICAgICAgICB0aGlzLl9zYW9wUG9wb3ZlckZpbHRlci5hZnRlclBvcG92ZXJTaG93ID0gdGhpcy5hZnRlclBvcG92ZXJNb2JpbGVGaWx0ZXJTaG93LmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdFZpZXcoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIkxJS1ZDYWthbG5hVnJzdGFHcmlkLmluaXRWaWV3XCIpO1xyXG4gICAgICAgIHRoaXMuX25leHRJRFZyc3RlID0gJyc7XHJcbiAgICAgICAgdGhpcy5fbmV4dElEID0gJyc7XHJcbiAgICAgICAgdGhpcy5fbWFpbkZvcm1EaXYgPSAkKFwiI0xJS1ZDYWthbG5hVnJzdGFHcmlkQnJvd3NlRm9ybVwiKTtcclxuICAgICAgICB0aGlzLmluaXRXZWJHcmlkMSgpO1xyXG4gICAgICAgIHRoaXMuaW5pdFdlYkdyaWQxTGlzdG5lcnMoKTtcclxuICAgICAgICB0aGlzLl9zZWFyY2hWYWx1ZSA9IHRoaXMuX21haW5Gb3JtRGl2LmZpbmQoXCIjU2VhcmNoVmFsdWVcIik7XHJcbiAgICAgICAgdGhpcy5fc2VhcmNoVmFsdWUxID0gdGhpcy5fbWFpbkZvcm1EaXYuZmluZChcIiNTZWFyY2hWYWx1ZTFcIik7XHJcbiAgICAgICAgdGhpcy5pbml0RmlsdGVyQ29udHJvbHMoKTtcclxuICAgICAgICAvLyAgICAgICAgdGhpcy5pbml0VnJzdGFEb2t1bWVudGEoKTsgICAgXHJcbiAgICAgICAgdGhpcy5fc2FvcFBvcG92ZXJGaWx0ZXIuYmluZFBvcG92ZXJFdmVudHMoKTtcclxuICAgICAgICB0aGlzLnNldEdsb2JhbENvbmZpcm1EZW55QnV0dG9uc0VuYWJsZURpc2FibGUoKTtcclxuICAgICAgICB0aGlzLl9tYWluRm9ybURpdi5zaG93KCk7XHJcbiAgICAgICAgdGhpcy5zZXRNb2JpbGVWaWV3KCk7XHJcbiAgICAgICAgdGhpcy5zZXRDaGVja2JveEVuYWJsZWREaXNhYmxlZCgpO1xyXG4gICAgICAgIHRoaXMuZWRpdFJvd0Zyb21EYXNoYm9hcmQoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0V2ViR3JpZDEoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIkxJS1ZDYWthbG5hVnJzdGFHcmlkLlwiKTtcclxuICAgICAgICBsZXQgd2dJZCA9IFwiI0xJS1ZDYWthbG5hVnJzdGFHcmlkXCI7XHJcbiAgICAgICAgbGV0IGNhcHRpb25Ub29sYmFyID0gJCh3Z0lkKS5hdHRyKFwiY2FwdGlvbi10b29sYmFyXCIpO1xyXG4gICAgICAgIGxldCB0b29sYmFySXRlbXNUZW1wbGF0ZUlkID0gJCh3Z0lkKS5hdHRyKFwidG9vbGJhci1pdGVtcy10ZW1wbGF0ZUlkXCIpO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy53ZWJHcmlkMSA9IG5ldyBTYW9wV2ViR3JpZCh0aGlzLmxpYk5hbWUgKyBcIi53ZWJHcmlkMVwiKTtcclxuICAgICAgICBsZXQgZ3JpZFByb3BlcnRpZXM6IFNhb3BXZWJHcmlkUHJvcGVydGllcztcclxuICAgICAgICBsZXQgZ3JpZFRvb2xiYXI6IFNhb3BXZWJHcmlkVG9vbGJhcjtcclxuICAgICAgICBsZXQgdG9vbGJhckJ1dHRvbnM6IFNhb3BXZWJHcmlkVG9vbGJhckJ1dHRvbltdID0gW107XHJcbiAgICAgICAgbGV0IGRhdGFUYWJsZTogU2FvcFdlYkRhdGFUYWJsZTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIGlmICghdGhpcy5fZGFzaGJvYXJkKSB7XHJcbiAgICAgICAgICAgIGdyaWRUb29sYmFyID0geyBpZDogXCJzYW9wV2ViR3JpZFRCMVwiLCBjYXB0aW9uOiBjYXB0aW9uVG9vbGJhciwgYnV0dG9uczogdG9vbGJhckJ1dHRvbnMsIGl0ZW1zVGVtcGxhdGVJZDogdG9vbGJhckl0ZW1zVGVtcGxhdGVJZCB9O1xyXG5cclxuICAgICAgICAgICAgZGF0YVRhYmxlID0geyBlbmFibGVkOiB0cnVlLCBjb2x1bW5EZWZzU2V0dGluZ3M6IFt7IHRhcmdldHM6IDAsIGNoZWNrYm94ZXM6IHsgc2VsZWN0Um93OiB0cnVlIH0gfV0sY29sU2V0dGluZ3M6dHJ1ZSB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBncmlkUHJvcGVydGllcyA9IHtcclxuICAgICAgICAgICAgZ3JpZElkOiB3Z0lkXHJcbiAgICAgICAgICAgICwgdG9nZ2xlUGFuZWw6IHsgZW5hYmxlZDogZmFsc2UgfVxyXG4gICAgICAgICAgICAsIHRvb2xiYXI6IGdyaWRUb29sYmFyXHJcbiAgICAgICAgICAgICwgZGF0YVRhYmxlOiBkYXRhVGFibGVcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy53ZWJHcmlkMS5pbml0KGdyaWRQcm9wZXJ0aWVzKTtcclxuICAgICAgICBpZiAodGhpcy5fZGFzaGJvYXJkKSB7XHJcbiAgICAgICAgICAgICQod2dJZCArIFwiX3dyYXBwZXJcIikuYWRkQ2xhc3MoXCJzYW9wLXRhYmxlLWRhc2hib2FyZCBzYW9wLXRhYmxlLWRhc2hib2FyZC1vZHNvdG5vc3RcIik7XHJcbiAgICAgICAgICAgICQod2dJZCArIFwiX3dyYXBwZXJcIikuY3NzKCdvdmVyZmxvdy14JywgJ2hpZGRlbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgJCh3Z0lkICsgXCJfd3JhcHBlclwiKS5jc3MoJ21heC1oZWlnaHQnLCAnY2FsYygxMDB2aCAtIDM1MHB4KScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgTW92ZVRvTmV4dEV4dChjbG9zZTogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIkxJS1ZDYWthbG5hVnJzdGFHcmlkLk1vdmVUb05leHRFeHRcIik7XHJcblxyXG4gICAgICAgIGxldCBfaWRWcnN0ZSA9IHRoaXMuX25leHRJRFZyc3RlO1xyXG4gICAgICAgIGxldCBfaWQgPSB0aGlzLl9uZXh0SURcclxuICAgICAgICB0aGlzLlN0b3JlUHJldkFuZE5leHRSb3dEYXRhKHRoaXMuX25leHRJRFZyc3RlLCB0aGlzLl9uZXh0SUQpO1xyXG4gICAgICAgIGxldCBfcm93ID0gJChcInRyW2RhdGEtSURWcnN0ZT0nXCIgKyBfaWRWcnN0ZSArIFwiJ11cIikuZmlsdGVyKFwidHJbZGF0YS1JRD0nXCIgKyBfaWQgKyBcIiddXCIpO1xyXG5cclxuICAgICAgICBpZiAoX3Jvdy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkUm93Tm8gPSBfcm93LmluZGV4KCk7IC8vIGhlcmUgd2Ugc3RvcmUgdGhlIElEIG9mIHRoZSBjdXJyZW50IHJvdyAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICBsZXQgX2lkVnJzdGUgPSBfcm93LmF0dHIoXCJkYXRhLWlkdnJzdGVcIik7XHJcbiAgICAgICAgICAgIGxldCBfaWQgPSBfcm93LmF0dHIoXCJkYXRhLWlkXCIpO1xyXG4gICAgICAgICAgICBsZXQgX3Zyc3RhRG9rdW1lbnRhID0gX3Jvdy5hdHRyKFwiZGF0YS12cnN0YWRva3VtZW50YVwiKTtcclxuICAgICAgICAgICAgbGV0IF9kb2t1bWVudCA9IF9yb3cuYXR0cihcImRhdGEtZG9rdW1lbnRcIik7XHJcbiAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgIHRoaXMud2ViR3JpZDEubWFya1NlbGVjdGVkUm93KDxIVE1MRWxlbWVudD4oX3JvdylbMF0pO1xyXG4gICAgICAgICAgICB0aGlzLmVkaXRSZWNvcmQoX3Zyc3RhRG9rdW1lbnRhLCBfZG9rdW1lbnQsIF9pZFZyc3RlLCBfaWQpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY2xvc2UpIHtcclxuICAgICAgICAgICAgdGhpcy5fTElLVkNha2FsbmFWcnN0YVZpZXcuQ2xvc2VWaWV3Rm9ybSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgTW92ZVRvUHJldmlvdXNFeHQoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIkxJS1ZDYWthbG5hVnJzdGFHcmlkLlwiKTtcclxuXHJcbiAgICAgICAgbGV0IF9pZFZyc3RlID0gdGhpcy5fcHJldklEVnJzdGU7XHJcbiAgICAgICAgbGV0IF9pZCA9IHRoaXMuX3ByZXZJRFxyXG4gICAgICAgIHRoaXMuU3RvcmVQcmV2QW5kTmV4dFJvd0RhdGEodGhpcy5fcHJldklEVnJzdGUsIHRoaXMuX3ByZXZJRCk7XHJcblxyXG4gICAgICAgIGxldCBfcm93ID0gJChcInRyW2RhdGEtSURWcnN0ZT0nXCIgKyBfaWRWcnN0ZSArIFwiJ11cIikuZmlsdGVyKFwidHJbZGF0YS1JRD0nXCIgKyBfaWQgKyBcIiddXCIpO1xyXG5cclxuICAgICAgICBpZiAoX3Jvdy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkUm93Tm8gPSBfcm93LmluZGV4KCk7IC8vIGhlcmUgd2Ugc3RvcmUgdGhlIElEIG9mIHRoZSBjdXJyZW50IHJvdyAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICBsZXQgX2lkVnJzdGUgPSBfcm93LmF0dHIoXCJkYXRhLWlkdnJzdGVcIik7XHJcbiAgICAgICAgICAgIGxldCBfaWQgPSBfcm93LmF0dHIoXCJkYXRhLWlkXCIpO1xyXG4gICAgICAgICAgICBsZXQgX3Zyc3RhRG9rdW1lbnRhID0gX3Jvdy5hdHRyKFwiZGF0YS12cnN0YWRva3VtZW50YVwiKTtcclxuICAgICAgICAgICAgbGV0IF9kb2t1bWVudCA9IF9yb3cuYXR0cihcImRhdGEtZG9rdW1lbnRcIik7XHJcbiAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgIHRoaXMud2ViR3JpZDEubWFya1NlbGVjdGVkUm93KDxIVE1MRWxlbWVudD4oX3JvdylbMF0pO1xyXG4gICAgICAgICAgICB0aGlzLmVkaXRSZWNvcmQoX3Zyc3RhRG9rdW1lbnRhLCBfZG9rdW1lbnQsIF9pZFZyc3RlLCBfaWQpO1xyXG4gICAgICAgIH0gXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIENvbmZpcm1BbmRNb3ZlVG9OZXh0RXh0KGlkVnJzdGU6IHN0cmluZywgaWQ6IHN0cmluZywga29tZW50YXI6IHN0cmluZywgaWRBa2NpamU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJMSUtWQ2FrYWxuYVZyc3RhR3JpZC5Db25maXJtQW5kTW92ZVRvTmV4dEV4dFwiKTtcclxuICAgICAgICB0aGlzLmNvbmZpcm1SZWNvcmRBbmROZXh0KGlkVnJzdGUsIGlkLCBrb21lbnRhciwgaWRBa2NpamUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBEZW55QW5kTW92ZVRvTmV4dEV4dChpZFZyc3RlOiBzdHJpbmcsIGlkOiBzdHJpbmcsIGtvbWVudGFyOiBzdHJpbmcsIGlkQWtjaWplOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTElLVkNha2FsbmFWcnN0YUdyaWQuXCIpO1xyXG4gICAgICAgIHRoaXMuX2xpa3ZDYWthbG5hVnJzdGFDb21tZW50Lm9uRGVueUNsaWNrID0gdGhpcy5vbkRlbnlBbmROZXh0LmJpbmQodGhpcyk7XHJcbiAgICAgICAgbGV0IF9yZXN1bHQgPSB0aGlzLl9saWt2Q2FrYWxuYVZyc3RhQ29tbWVudC5lZGl0UmVjb3JkKHt9KTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0V2ViR3JpZDFMaXN0bmVycygpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTElLVkNha2FsbmFWcnN0YUdyaWQuaW5pdFdlYkdyaWQxTGlzdG5lcnNcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBpZiAoIXRoaXMuX2Rhc2hib2FyZCkge1xyXG4gICAgICAgICAgICAkKFwiYm9keVwiKS5vZmYoXCJjbGlja1wiLCBcIiNMSUtWQ2FrYWxuYVZyc3RhR3JpZCB0ZDpub3QoLnRkLWFjdGlvbilcIik7XHJcbiAgICAgICAgICAgICQoXCJib2R5XCIpLm9uKFwiY2xpY2tcIiwgXCIjTElLVkNha2FsbmFWcnN0YUdyaWQgdGQ6bm90KC50ZC1hY3Rpb24pXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICBsZXQgX2kgPSAkKHRoaXMpLmNsb3Nlc3QoJ3RyJykuaW5kZXgoKTtcclxuICAgICAgICAgICAgICAgICBfdGhpcy5fc2VsZWN0ZWRSb3dObyA9IF9pOyAvLyBoZXJlIHdlIHN0b3JlIHRoZSBJRCBvZiB0aGUgY3VycmVudCByb3dcclxuICAgICAgICAgICAgICAgIC8vIGxldCBfcm93cyA9ICQoJyNMSUtWQ2FrYWxuYVZyc3RhR3JpZCA+IHRib2R5ID4gdHInKTtcclxuICAgICAgICAgICAgICAgIC8vIGxldCBfcm93ID0gJCgnI0xJS1ZDYWthbG5hVnJzdGFHcmlkID4gdGJvZHkgPiB0cicpLmVxKF9pKTtcclxuICAgICAgICAgICAgICAgIC8vIGxldCBfaWRWcnN0ZVRlc3QgPSBfcm93WzBdLmF0dHJpYnV0ZXNbMV0ubm9kZVZhbHVlO1xyXG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSAkKHRoaXMpLmNsb3Nlc3QoXCJ0clwiKTtcclxuICAgICAgICAgICAgICAgIGxldCBfaWRWcnN0ZSA9IGRhdGEuYXR0cihcImRhdGEtSURWcnN0ZVwiKTtcclxuICAgICAgICAgICAgICAgIGxldCBfaWQgPSBkYXRhLmF0dHIoXCJkYXRhLUlEXCIpO1xyXG4gICAgICAgICAgICAgICAgbGV0IF92cnN0YURva3VtZW50YSA9IGRhdGEuYXR0cihcImRhdGEtdnJzdGFkb2t1bWVudGFcIik7XHJcbiAgICAgICAgICAgICAgICBsZXQgX2Rva3VtZW50ID0gZGF0YS5hdHRyKFwiZGF0YS1kb2t1bWVudFwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIWlzVW5EZWZpbmVkKF9pZFZyc3RlKSAmJiAhaXNVbkRlZmluZWQoX2lkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGJhcnZhbmplIG96bmFjZW5lIHZyc3RyaWNlXHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMud2ViR3JpZDEubWFya1NlbGVjdGVkUm93KDxIVE1MRWxlbWVudD4oZGF0YSlbMF0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5lZGl0UmVjb3JkKF92cnN0YURva3VtZW50YSwgX2Rva3VtZW50LCBfaWRWcnN0ZSwgX2lkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAkKFwiYm9keVwiKS5vZmYoXCJjaGFuZ2VcIiwgXCIjTElLVkNha2FsbmFWcnN0YUdyaWQgdHIgdGguZHQtY2hlY2tib3hlcy1zZWxlY3QtYWxsIGlucHV0W3R5cGU9J2NoZWNrYm94J11cIik7XHJcbiAgICAgICAgICAgICQoXCJib2R5XCIpLm9uKFwiY2hhbmdlXCIsIFwiI0xJS1ZDYWthbG5hVnJzdGFHcmlkIHRyIHRoLmR0LWNoZWNrYm94ZXMtc2VsZWN0LWFsbCBpbnB1dFt0eXBlPSdjaGVja2JveCddXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLnNldEdsb2JhbENvbmZpcm1EZW55QnV0dG9uc0VuYWJsZURpc2FibGUoKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAkKFwiYm9keVwiKS5vZmYoXCJjaGFuZ2VcIiwgXCIjTElLVkNha2FsbmFWcnN0YUdyaWQgdHIgdGQuZHQtY2hlY2tib3hlcy1jZWxsIGlucHV0W3R5cGU9J2NoZWNrYm94J10uZHQtY2hlY2tib3hlc1wiKTtcclxuICAgICAgICAgICAgJChcImJvZHlcIikub24oXCJjaGFuZ2VcIiwgXCIjTElLVkNha2FsbmFWcnN0YUdyaWQgdHIgdGQuZHQtY2hlY2tib3hlcy1jZWxsIGlucHV0W3R5cGU9J2NoZWNrYm94J10uZHQtY2hlY2tib3hlc1wiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5zZXRHbG9iYWxDb25maXJtRGVueUJ1dHRvbnNFbmFibGVEaXNhYmxlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2Rhc2hib2FyZCkge1xyXG4gICAgICAgICAgICAkKFwiYm9keVwiKS5vZmYoXCJjbGlja1wiLCBcIiNMSUtWQ2FrYWxuYVZyc3RhR3JpZCB0ZDpub3QoLnRkLWFjdGlvbilcIik7XHJcbiAgICAgICAgICAgICQoXCJib2R5XCIpLm9uKFwiY2xpY2tcIiwgXCIjTElLVkNha2FsbmFWcnN0YUdyaWQgdGQ6bm90KC50ZC1hY3Rpb24pXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGxldCBfaSA9ICQodGhpcykuY2xvc2VzdCgndHInKS5pbmRleCgpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuX3NlbGVjdGVkUm93Tm8gPSBfaTsgLy8gaGVyZSB3ZSBzdG9yZSB0aGUgSUQgb2YgdGhlIGN1cnJlbnQgcm93XHJcbiAgICAgICAgICAgICAgICAvL3BvYmVyZW1vIHBvZGF0a2VcclxuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gJCh0aGlzKS5jbG9zZXN0KFwidHJcIik7XHJcbiAgICAgICAgICAgICAgICBsZXQgX2lkVnJzdGUgPSBkYXRhLmF0dHIoXCJkYXRhLUlEVnJzdGVcIik7XHJcbiAgICAgICAgICAgICAgICBsZXQgX2lkID0gZGF0YS5hdHRyKFwiZGF0YS1JRFwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIWlzVW5EZWZpbmVkKF9pZFZyc3RlKSAmJiAhaXNVbkRlZmluZWQoX2lkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vbmFyZWRpbW8gcmVkaXJlY3QgbmEga29udHJvbGVyIHMgcGFyYW1ldHJpIGlkdnJzdGUgaW4gaWRcclxuICAgICAgICAgICAgICAgICAgICBsZXQgX2FwcGxpY2F0aW9uQ29kZSA9IHRoaXMuX2l6YnJhbmFWcnN0YURva3VtZW50YTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgX3llYXIgPSAwXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IF9jb250cm9sbGVyID0gXCJMaWt2Q29uZmlybWF0aW9uc1wiO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBfYWN0aW9uID0gXCJJbmRleFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBfcmVsYXRpdmVVUkwgPSBfY29udHJvbGxlciArIFwiL1wiICsgX2FjdGlvbiArIFwiP3llYXIgPVwiICsgX3llYXIgKyBcIiZhcHBsaWNhdGlvbkNvZGVcIiArIF9hcHBsaWNhdGlvbkNvZGUgKyBcIiZpZFZyc3RlPVwiICsgX2lkVnJzdGUgKyBcIiZpZD1cIiArIF9pZDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgX3VybCA9IGdldFNpdGVBYnNvbHV0ZVVSTChfcmVsYXRpdmVVUkwpO1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gX3VybDtcclxuICAgICAgICAgICAgICAgICAgICAvL3dpbmRvdy5sb2NhdGlvbi5ocmVmID0gXCIuLi9cIitfY29udHJvbGxlcitcIi9cIitfYWN0aW9uK1wiP3llYXIgPVwiICsgX3llYXIgKyBcIiZhcHBsaWNhdGlvbkNvZGVcIiArIF9hcHBsaWNhdGlvbkNvZGUgKyAgXCImaWRWcnN0ZT1cIitfaWRWcnN0ZStcIiZpZD1cIitfaWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJChcIi5MSUtWQ2FrYWxuYVZyc3RhR3JpZF9kZW55XCIpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICQoXCIuTElLVkNha2FsbmFWcnN0YUdyaWRfZGVueVwiKS5vbignY2xpY2snLCBmdW5jdGlvbiAocm93KSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJMSUtWQ2FrYWxuYVZyc3RhR3JpZF9kZW55LmNsaWNrXCIpO1xyXG4gICAgICAgICAgICAvLyQoJyNkZXRhaWxzT1BOUG90bmlOYWxvZ2lGb3JtJykucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgIGxldCBfaSA9ICQodGhpcykuY2xvc2VzdCgndHInKS5pbmRleCgpO1xyXG4gICAgICAgICAgICBpZiAoX3RoaXMuX3NlbGVjdGVkUm93Tm8gPT0gbnVsbClcclxuICAgICAgICAgICAgICAgIF90aGlzLl9zZWxlY3RlZFJvd05vID0gX2k7IC8vIGhlcmUgd2Ugc3RvcmUgdGhlIElEIG9mIHRoZSBjdXJyZW50IHJvdyAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGxldCBfYnRuRWRpdCA9IHJvdy5jdXJyZW50VGFyZ2V0O1xyXG4gICAgICAgICAgICBsZXQgYnRuRW5hYmxlZCA9IF9idG5FZGl0LmdldEF0dHJpYnV0ZShcImRhdGEtZW5hYmxlZFwiKTtcclxuICAgICAgICAgICAgaWYgKGJ0bkVuYWJsZWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IFwidHJ1ZVwiKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5fbGlrdkNha2FsbmFWcnN0YUNvbW1lbnQub25EZW55Q2xpY2sgPSBfdGhpcy5vbkRlbnlDbGljay5iaW5kKF90aGlzKTtcclxuICAgICAgICAgICAgICAgIGxldCBfcmVzdWx0ID0gX3RoaXMuX2xpa3ZDYWthbG5hVnJzdGFDb21tZW50LmVkaXRSZWNvcmQoe30pO1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIGxldCBJRFZyc3RlID0gX2J0bkVkaXQuZ2V0QXR0cmlidXRlKFwiZGF0YS1JRFZyc3RlXCIpO1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIGxldCBJRCA9IF9idG5FZGl0LmdldEF0dHJpYnV0ZShcImRhdGEtSURcIik7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgX3RoaXMuZGVueVJlY29yZChJRFZyc3RlLElEKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkKFwiLkxJS1ZDYWthbG5hVnJzdGFHcmlkX2NvbmZpcm1cIikub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgJChcIi5MSUtWQ2FrYWxuYVZyc3RhR3JpZF9jb25maXJtXCIpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChyb3cpIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIkxJS1ZDYWthbG5hVnJzdGFHcmlkX2NvbmZpcm0uY2xpY2tcIik7XHJcbiAgICAgICAgICAgIC8vJCgnI2RldGFpbHNPUE5Qb3RuaU5hbG9naUZvcm0nKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgbGV0IF9pID0gJCh0aGlzKS5jbG9zZXN0KCd0cicpLmluZGV4KCk7XHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5fc2VsZWN0ZWRSb3dObyA9PSBudWxsKVxyXG4gICAgICAgICAgICAgICAgX3RoaXMuX3NlbGVjdGVkUm93Tm8gPSBfaTsgLy8gaGVyZSB3ZSBzdG9yZSB0aGUgSUQgb2YgdGhlIGN1cnJlbnQgcm93ICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgbGV0IF9idG5EZWxldGUgPSByb3cuY3VycmVudFRhcmdldDtcclxuICAgICAgICAgICAgbGV0IGJ0bkVuYWJsZWQgPSBfYnRuRGVsZXRlLmdldEF0dHJpYnV0ZShcImRhdGEtZW5hYmxlZFwiKTtcclxuICAgICAgICAgICAgaWYgKGJ0bkVuYWJsZWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IFwidHJ1ZVwiKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgSURWcnN0ZSA9IF9idG5EZWxldGUuZ2V0QXR0cmlidXRlKFwiZGF0YS1JRFZyc3RlXCIpO1xyXG4gICAgICAgICAgICAgICAgbGV0IElEID0gX2J0bkRlbGV0ZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLUlEXCIpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGtvbWVudGFyID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIGxldCBJREFrY2lqZSA9IFwiLTFcIjtcclxuICAgICAgICAgICAgICAgIF90aGlzLmNvbmZpcm1SZWNvcmQoSURWcnN0ZSwgSUQsIGtvbWVudGFyLCBJREFrY2lqZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9kYXNoYm9hcmQpIHtcclxuICAgICAgICAgICAgbGV0IF9idG5Db25maXJtR2xvYmFsID0gdGhpcy5fbWFpbkZvcm1EaXYuZmluZChcIiNidG5Db25maXJtR2xvYmFsXCIpO1xyXG4gICAgICAgICAgICBfYnRuQ29uZmlybUdsb2JhbC5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAgICAgX2J0bkNvbmZpcm1HbG9iYWwub24oJ2NsaWNrJywgZnVuY3Rpb24gKHJvdykge1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImJ0bkNvbmZpcm1HbG9iYWwuY2xpY2tcIik7XHJcbiAgICAgICAgICAgICAgICAvLyBsZXQgcm93c19zZWxlY3RlZCA9IF90aGlzLndlYkdyaWQxLmdldFNlbGVjdGVkUm93cygpO1xyXG4gICAgICAgICAgICAgICAgLy8gcm93c19zZWxlY3RlZC5mb3JFYWNoKF9lbCA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyAgIC8vY29uc29sZS5sb2coX2VsKTtcclxuICAgICAgICAgICAgICAgIC8vICAgbGV0IF9yb3cgPSAkKCcjTElLVkNha2FsbmFWcnN0YUdyaWQgPiB0Ym9keSA+IHRyJykuZXEoTnVtYmVyKF9lbCkpOyAvLyBoZXJlIHdlIGV4dHJhcG9sYXRlIHRoZSByb3cgZGF0YSBvZiBzZWxlY3RlZCBpbmRleFxyXG4gICAgICAgICAgICAgICAgLy8gICBpZiAoX3Jvdy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgLy9cclxuICAgICAgICAgICAgICAgIC8vICAgICBsZXQgX2lkVnJzdGUgPSBfcm93LmF0dHIoXCJkYXRhLWlkdnJzdGVcIik7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgbGV0IF9pZCA9IF9yb3cuYXR0cihcImRhdGEtaWRcIik7IFxyXG4gICAgICAgICAgICAgICAgLy8gICAgIGxldCBfaWRBa2NpamUgPSBfcm93LmF0dHIoXCJkYXRhLWlkQWtjaWplXCIpOyAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vICAgICAvL1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIC8vY29uc29sZS5sb2coX2lkVnJzdGUpO1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIF90aGlzLmNvbmZpcm1SZWNvcmQoX2lkVnJzdGUsIF9pZCwgX2lkQWtjaWplKTtcclxuICAgICAgICAgICAgICAgIC8vICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIH0pO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuX2xpa3ZDYWthbG5hVnJzdGFDb21tZW50Q29uZmlybS5vbkNvbmZpcm1DbGljayA9IF90aGlzLm9uQ29uZmlybUdsb2JhbENsaWNrLmJpbmQoX3RoaXMpO1xyXG4gICAgICAgICAgICAgICAgbGV0IF9yZXN1bHQgPSBfdGhpcy5fbGlrdkNha2FsbmFWcnN0YUNvbW1lbnRDb25maXJtLmVkaXRSZWNvcmQoe30pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGxldCBfYnRuRGVueUdsb2JhbCA9IHRoaXMuX21haW5Gb3JtRGl2LmZpbmQoXCIjYnRuRGVueUdsb2JhbFwiKTtcclxuICAgICAgICAgICAgX2J0bkRlbnlHbG9iYWwub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgICAgIF9idG5EZW55R2xvYmFsLm9uKCdjbGljaycsIGZ1bmN0aW9uIChyb3cpIHtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJidG5EZW55R2xvYmFsLmNsaWNrXCIpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuX2xpa3ZDYWthbG5hVnJzdGFDb21tZW50Lm9uRGVueUNsaWNrID0gX3RoaXMub25EZW55R2xvYmFsQ2xpY2suYmluZChfdGhpcyk7XHJcbiAgICAgICAgICAgICAgICBsZXQgX3Jlc3VsdCA9IF90aGlzLl9saWt2Q2FrYWxuYVZyc3RhQ29tbWVudC5lZGl0UmVjb3JkKHt9KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgX2J0blN3aXRjaFNpZ25lZXMgPSB0aGlzLl9tYWluRm9ybURpdi5maW5kKFwiI2J0blN3aXRjaFNpZ25lZXNcIik7XHJcbiAgICAgICAgICAgIF9idG5Td2l0Y2hTaWduZWVzLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICAgICBfYnRuU3dpdGNoU2lnbmVlcy5vbignY2xpY2snLCBmdW5jdGlvbiAocm93KSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiYnRuU3dpdGNoU2lnbmVlcy5jbGlja1wiKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLnN3aXRjaFNpZ25lZXMoKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgX2FwcGxpY2F0aW9uRmlsdGVyID0gdGhpcy5fbWFpbkZvcm1EaXYuZmluZChcIiNBcHBsaWNhdGlvbkZpbHRlclwiKTtcclxuICAgICAgICAgICAgaWYgKF9hcHBsaWNhdGlvbkZpbHRlci5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBfYXBwbGljYXRpb25GaWx0ZXIub2ZmKFwiY2hhbmdlXCIpO1xyXG4gICAgICAgICAgICAgICAgX2FwcGxpY2F0aW9uRmlsdGVyLm9uKFwiY2hhbmdlXCIsIF90aGlzLm9uQXBwbGljYXRpb25GaWx0ZXJDaGFuZ2UuYmluZChfdGhpcykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vXHJcbiAgICB9XHJcblxyXG4gICAgY29uZmlybVJlY29yZChpZFZyc3RlOiBzdHJpbmcsIGlkOiBzdHJpbmcsIGtvbWVudGFyOiBzdHJpbmcsIGlkQWtjaWplOiBzdHJpbmcsIGNsb3NlQ29tbWVudFZpZXc6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJMSUtWQ2FrYWxuYVZyc3RhR3JpZC5jb25maXJtUmVjb3JkXCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgLy9cclxuICAgICAgICBsZXQgX2lkVnJzdGUgPSBpZFZyc3RlO1xyXG4gICAgICAgIGxldCBfaWQgPSBpZDtcclxuICAgICAgICBsZXQgX2NvbmZpcm1hdGlvblN0YXR1cyA9IDA7XHJcbiAgICAgICAgbGV0IF9rb21lbnRhciA9IGtvbWVudGFyO1xyXG4gICAgICAgIGxldCBfaWRBa2NpamUgPSBpZEFrY2lqZTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIGxldCBfZGF0YSA9IHsgaWRWcnN0ZTogX2lkVnJzdGUsIGlkOiBfaWQsIGNvbmZpcm1hdGlvblN0YXR1czogX2NvbmZpcm1hdGlvblN0YXR1cywga29tZW50YXI6IF9rb21lbnRhciwgaWRBa2NpamU6IF9pZEFrY2lqZSwgY2FsbGVyOlwiR3JpZFwiIH07XHJcbiAgICAgICAgLy9cclxuICAgICAgICBsZXQgX3VybEFjdGlvbiA9IFwiXCI7XHJcbiAgICAgICAgX3VybEFjdGlvbiA9IFwiTGlrdkNvbmZpcm1hdGlvbnMvU2V0Q29uZmlybWF0aW9uc3RhdHVzR3JpZFwiO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgbGV0IF9zYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgICAgICBfc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmFsZXJ0TWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgYWxlcnRpZnkubWVzc2FnZShyZXNwb25zZS5hbGVydE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uudmlld0NvbnRlbnQpIHtcclxuICAgICAgICAgICAgICAgICQoXCIjbWVzc2FnZUJhbm5lckdyaWRcIikuaHRtbChyZXNwb25zZS52aWV3Q29udGVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGNsb3NlQ29tbWVudFZpZXcpXHJcbiAgICAgICAgICAgICAgICBfdGhpcy5fbGlrdkNha2FsbmFWcnN0YUNvbW1lbnRDb25maXJtLkNsb3NlVmlld0Zvcm0oKTtcclxuXHJcbiAgICAgICAgICAgIF90aGlzLnJlZnJlc2hHcmlkRGF0YSgwKTtcclxuXHJcbiAgICAgICAgfTtcclxuICAgICAgICBfc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOiBfdXJsQWN0aW9uXHJcbiAgICAgICAgICAgICwgZGF0YTogX2RhdGFcclxuICAgICAgICAgICAgLCB0eXBlOiBcIlBPU1RcIlxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbmZpcm1SZWNvcmRBbmROZXh0KGlkVnJzdGU6IHN0cmluZywgaWQ6IHN0cmluZywga29tZW50YXI6IHN0cmluZywgaWRBa2NpamU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJMSUtWQ2FrYWxuYVZyc3RhR3JpZC5jb25maXJtUmVjb3JkQW5kTmV4dFwiKTtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgbGV0IF9pZFZyc3RlID0gaWRWcnN0ZTtcclxuICAgICAgICBsZXQgX2lkID0gaWQ7XHJcbiAgICAgICAgbGV0IF9jb25maXJtYXRpb25TdGF0dXMgPSAwO1xyXG4gICAgICAgIGxldCBfa29tZW50YXIgPSBrb21lbnRhcjtcclxuICAgICAgICBsZXQgX2lkQWtjaWplID0gaWRBa2NpamU7XHJcblxyXG4gICAgICAgIGxldCBfZGF0YSA9IHsgaWRWcnN0ZTogX2lkVnJzdGUsIGlkOiBfaWQsIGNvbmZpcm1hdGlvblN0YXR1czogX2NvbmZpcm1hdGlvblN0YXR1cywga29tZW50YXI6IF9rb21lbnRhciwgaWRBa2NpamU6IF9pZEFrY2lqZSwgY2FsbGVyOlwiRWRpdFwiIH07XHJcbiAgICAgICAgLy9cclxuICAgICAgICBsZXQgX3VybEFjdGlvbiA9IFwiXCI7XHJcbiAgICAgICAgX3VybEFjdGlvbiA9IFwiTGlrdkNvbmZpcm1hdGlvbnMvU2V0Q29uZmlybWF0aW9uc3RhdHVzR3JpZFwiO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgbGV0IF9zYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgICAgICBfc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmFsZXJ0TWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgYWxlcnRpZnkubWVzc2FnZShyZXNwb25zZS5hbGVydE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uudmlld0NvbnRlbnQpIHtcclxuICAgICAgICAgICAgICAgICQoXCIjbWVzc2FnZUJhbm5lckVkaXRcIikuaHRtbChyZXNwb25zZS52aWV3Q29udGVudCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzID09IHRydWUpXHJcbiAgICAgICAgICAgICAgICBfdGhpcy5Nb3ZlVG9OZXh0RXh0KHRydWUpO1xyXG5cclxuICAgICAgICAgICAgX3RoaXMucmVmcmVzaEdyaWREYXRhKDApO1xyXG5cclxuICAgICAgICB9O1xyXG4gICAgICAgIF9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246IF91cmxBY3Rpb25cclxuICAgICAgICAgICAgLCBkYXRhOiBfZGF0YVxyXG4gICAgICAgICAgICAsIHR5cGU6IFwiUE9TVFwiXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZGVueVJlY29yZChpZFZyc3RlOiBzdHJpbmcsIGlkOiBzdHJpbmcsIGtvbWVudGFyOiBzdHJpbmcsIGlkQWtjaWplOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTElLVkNha2FsbmFWcnN0YUdyaWQuZGVueVJlY29yZFwiKTtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgbGV0IF9pZFZyc3RlID0gaWRWcnN0ZTtcclxuICAgICAgICBsZXQgX2lkID0gaWQ7XHJcbiAgICAgICAgbGV0IF9jb25maXJtYXRpb25TdGF0dXMgPSAxO1xyXG4gICAgICAgIGxldCBfa29tZW50YXIgPSBrb21lbnRhcjtcclxuICAgICAgICBsZXQgX2lkQWtjaWplID0gaWRBa2NpamU7XHJcbiAgICAgICAgLy9cclxuICAgICAgICBsZXQgX2RhdGEgPSB7IGlkVnJzdGU6IF9pZFZyc3RlLCBpZDogX2lkLCBjb25maXJtYXRpb25TdGF0dXM6IF9jb25maXJtYXRpb25TdGF0dXMsIGtvbWVudGFyOiBfa29tZW50YXIsIGlkQWtjaWplOiBfaWRBa2NpamUsIGNhbGxlcjpcIkdyaWRcIiAgfTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIGxldCBfdXJsQWN0aW9uID0gXCJcIjtcclxuICAgICAgICBfdXJsQWN0aW9uID0gXCJMaWt2Q29uZmlybWF0aW9ucy9TZXRDb25maXJtYXRpb25zdGF0dXNHcmlkXCI7XHJcbiAgICAgICAgLy9cclxuICAgICAgICBsZXQgX3Nhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgICAgIF9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuYWxlcnRNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICBhbGVydGlmeS5tZXNzYWdlKHJlc3BvbnNlLmFsZXJ0TWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS52aWV3Q29udGVudCkge1xyXG4gICAgICAgICAgICAgICAgJChcIiNtZXNzYWdlQmFubmVyR3JpZFwiKS5odG1sKHJlc3BvbnNlLnZpZXdDb250ZW50KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgX3RoaXMuX2xpa3ZDYWthbG5hVnJzdGFDb21tZW50LkNsb3NlVmlld0Zvcm0oKTtcclxuXHJcbiAgICAgICAgICAgIF90aGlzLnJlZnJlc2hHcmlkRGF0YSgwKTtcclxuXHJcbiAgICAgICAgfTtcclxuICAgICAgICBfc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOiBfdXJsQWN0aW9uXHJcbiAgICAgICAgICAgICwgZGF0YTogX2RhdGFcclxuICAgICAgICAgICAgLCB0eXBlOiBcIlBPU1RcIlxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRGVueUFuZE5leHQoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIkxJS1ZDYWthbG5hVnJzdGFHcmlkLm9uRGVueUFuZE5leHRcIik7XHJcbiAgICAgICAgbGV0IF9pZFZyc3RlRWxlbWVudCA9ICQoJyNMaWt2Q29uZmlybWF0aW9uc0VkaXRWaWV3JykuZmluZChcIiNJRFZyc3RlXCIpO1xyXG4gICAgICAgIGxldCBfaWRWcnN0ZSA9IF9pZFZyc3RlRWxlbWVudC52YWwoKS50b1N0cmluZygpO1xyXG4gICAgICAgIGxldCBfaWRFbGVtZW50ID0gJCgnI0xpa3ZDb25maXJtYXRpb25zRWRpdFZpZXcnKS5maW5kKFwiI0lEXCIpOztcclxuICAgICAgICBsZXQgX2lkID0gX2lkRWxlbWVudC52YWwoKS50b1N0cmluZygpO1xyXG4gICAgICAgIGxldCBfaWRBa2NpamUgPSBcIi0xXCI7XHJcblxyXG4gICAgICAgIGxldCBfa29tZW50YXIgPSAkKFwiI0FkZENvbW1lbnRWaWV3XCIpLmZpbmQoXCIjS29tZW50YXJcIilbMF0gYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgICBpZiAodGhpcy5fbGlrdkNha2FsbmFWcnN0YUNvbW1lbnQub25WYWxpZGVhdGVLb21lbnRhcihfa29tZW50YXIpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVueVJlY29yZEFuZE5leHQoX2lkVnJzdGUsIF9pZCwgX2tvbWVudGFyLnZhbHVlLCBfaWRBa2NpamUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgZGVueVJlY29yZEFuZE5leHQoaWRWcnN0ZTogc3RyaW5nLCBpZDogc3RyaW5nLCBrb21lbnRhcjogc3RyaW5nLCBpZEFrY2lqZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIkxJS1ZDYWthbG5hVnJzdGFHcmlkLmRlbnlSZWNvcmRBbmROZXh0XCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgLy9cclxuICAgICAgICBsZXQgX2lkVnJzdGUgPSBpZFZyc3RlO1xyXG4gICAgICAgIGxldCBfaWQgPSBpZDtcclxuICAgICAgICBsZXQgX2NvbmZpcm1hdGlvblN0YXR1cyA9IDE7XHJcbiAgICAgICAgbGV0IF9rb21lbnRhciA9IGtvbWVudGFyO1xyXG4gICAgICAgIGxldCBfaWRBa2NpamUgPSBpZEFrY2lqZTtcclxuXHJcbiAgICAgICAgbGV0IF9kYXRhID0geyBpZFZyc3RlOiBfaWRWcnN0ZSwgaWQ6IF9pZCwgY29uZmlybWF0aW9uU3RhdHVzOiBfY29uZmlybWF0aW9uU3RhdHVzLCBrb21lbnRhcjogX2tvbWVudGFyLCBpZEFrY2lqZTogX2lkQWtjaWplLCBjYWxsZXI6XCJFZGl0XCIgIH07XHJcbiAgICAgICAgLy9cclxuICAgICAgICBsZXQgX3VybEFjdGlvbiA9IFwiXCI7XHJcbiAgICAgICAgX3VybEFjdGlvbiA9IFwiTGlrdkNvbmZpcm1hdGlvbnMvU2V0Q29uZmlybWF0aW9uc3RhdHVzR3JpZFwiO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgbGV0IF9zYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgICAgICBfc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmFsZXJ0TWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgYWxlcnRpZnkubWVzc2FnZShyZXNwb25zZS5hbGVydE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uudmlld0NvbnRlbnQpIHtcclxuICAgICAgICAgICAgICAgICQoXCIjbWVzc2FnZUJhbm5lckVkaXRcIikuaHRtbChyZXNwb25zZS52aWV3Q29udGVudCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIF90aGlzLl9saWt2Q2FrYWxuYVZyc3RhQ29tbWVudC5DbG9zZVZpZXdGb3JtKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyA9PSB0cnVlKVxyXG4gICAgICAgICAgICAgICAgX3RoaXMuTW92ZVRvTmV4dEV4dCh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIF90aGlzLnJlZnJlc2hHcmlkRGF0YSgwKTtcclxuXHJcbiAgICAgICAgfTtcclxuICAgICAgICBfc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOiBfdXJsQWN0aW9uXHJcbiAgICAgICAgICAgICwgZGF0YTogX2RhdGFcclxuICAgICAgICAgICAgLCB0eXBlOiBcIlBPU1RcIlxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hEYXRhKGh0bWxDb250ZW50OiBzdHJpbmcpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTElLVkNha2FsbmFWcnN0YUdyaWQucmVmcmVzaERhdGFcIik7XHJcbiAgICAgICAgdGhpcy53ZWJHcmlkMS5yZXBsYWNlR3JpZFJvd3MoaHRtbENvbnRlbnQpO1xyXG4gICAgICAgIHRoaXMuaW5pdFdlYkdyaWQxTGlzdG5lcnMoKTtcclxuICAgICAgICB0aGlzLnNldEdsb2JhbENvbmZpcm1EZW55QnV0dG9uc0VuYWJsZURpc2FibGUoKTtcclxuICAgICAgICB0aGlzLnNldENoZWNrYm94RW5hYmxlZERpc2FibGVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaEdyaWREYXRhKHllYXI6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJMSUtWQ2FrYWxuYVZyc3RhR3JpZC5yZWZyZXNoR3JpZERhdGFcIik7XHJcblxyXG4gICAgICAgIC8vICAgICAgICBsZXQgYXBwbGljYXRpb25Db2RlID0gPHN0cmluZz4odGhpcy5fdnJzdGFEb2t1bWVudGEuc2VsZWN0ZWRDQi52YWwoKS50b1N0cmluZygpKTtcclxuICAgICAgICBsZXQgYXBwbGljYXRpb25Db2RlID0gdGhpcy5faXpicmFuYVZyc3RhRG9rdW1lbnRhO1xyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIGxldCBzYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgICAgICBsZXQgcGFyYW1zID0geyB5ZWFyOiB5ZWFyLCBhcHBsaWNhdGlvbkNvZGU6IGFwcGxpY2F0aW9uQ29kZSB9O1xyXG5cclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICBfdGhpcy5yZWZyZXNoRGF0YShyZXNwb25zZSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246IFwiTGlrdkNvbmZpcm1hdGlvbnMvSW5kZXhcIlxyXG4gICAgICAgICAgICAsIGRhdGE6IHBhcmFtc1xyXG4gICAgICAgICAgICAsIHR5cGU6IFwiR0VUXCJcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBlZGl0UmVjb3JkKF92cnN0YURva3VtZW50YTogc3RyaW5nLCBfZG9rdW1lbnQ6IHN0cmluZywgX2lkVnJzdGU6IHN0cmluZywgX2lkOiBzdHJpbmcpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTElLVkNha2FsbmFWcnN0YUdyaWQuZWRpdFJlY29yZFwiKTtcclxuICAgICAgICAvL3ByaWRvYmltbyBpZC1qZSBuYXNsZWRuamUgdnJzdGljZVxyXG4gICAgICAgIHRoaXMuU3RvcmVQcmV2QW5kTmV4dFJvd0RhdGEoX2lkVnJzdGUsIF9pZCk7XHJcbiAgICAgICAgbGV0IF9mdWxsVGl0bGUgPSB0aGlzLl9MSUtWQ2FrYWxuYVZyc3RhVmlldy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiUG90cmpldmFuamVcIikgKyBcIjogXCIgKyBfdnJzdGFEb2t1bWVudGEgKyBcIiBcIiArIF9kb2t1bWVudDtcclxuICAgICAgICB0aGlzLl9MSUtWQ2FrYWxuYVZyc3RhVmlldy5mdWxsVGl0bGUgPSBfZnVsbFRpdGxlO1xyXG4gICAgICAgIHRoaXMuX0xJS1ZDYWthbG5hVnJzdGFWaWV3LnNob3dWaWV3Rm9ybShTYW9wV2ZBY3Rpb24ud2ZhRWRpdFJlY29yZCwgeyBxdWV1ZUlkOiBfaWRWcnN0ZSwgdGhyZWVJZDogX2lkLCBmdWxsVmlldzogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0RmlsdGVyQ29udHJvbHMoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIkxJS1ZDYWthbG5hVnJzdGFHcmlkLmluaXRGaWx0ZXJDb250cm9sc1wiKTtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMuX3NlYXJjaFZhbHVlLmtleXVwKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgbGV0IG9UYWJsZSA9IF90aGlzLndlYkdyaWQxLmRhdGFUYWJsZTtcclxuICAgICAgICAgICAgb1RhYmxlLnNlYXJjaCgkKHRoaXMpLnZhbCgpLnRvU3RyaW5nKCkpLmRyYXcoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl9zZWFyY2hWYWx1ZTEua2V5dXAoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBsZXQgb1RhYmxlID0gX3RoaXMud2ViR3JpZDEuZGF0YVRhYmxlO1xyXG4gICAgICAgICAgICBvVGFibGUuc2VhcmNoKCQodGhpcykudmFsKCkudG9TdHJpbmcoKSkuZHJhdygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRGVueUNsaWNrKCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJMSUtWQ2FrYWxuYVZyc3RhR3JpZC5vbkRlbnlDbGlja1wiKTtcclxuICAgICAgICBsZXQgX3JvdyA9ICQoJyNMSUtWQ2FrYWxuYVZyc3RhR3JpZCA+IHRib2R5ID4gdHInKS5lcSh0aGlzLl9zZWxlY3RlZFJvd05vKTtcclxuICAgICAgICBpZiAoX3Jvdy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCBfa29tZW50YXIgPSAkKFwiI0FkZENvbW1lbnRWaWV3XCIpLmZpbmQoXCIjS29tZW50YXJcIilbMF0gYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2xpa3ZDYWthbG5hVnJzdGFDb21tZW50Lm9uVmFsaWRlYXRlS29tZW50YXIoX2tvbWVudGFyKSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IF9pZFZyc3RlID0gX3Jvdy5hdHRyKFwiZGF0YS1pZHZyc3RlXCIpO1xyXG4gICAgICAgICAgICAgICAgbGV0IF9pZCA9IF9yb3cuYXR0cihcImRhdGEtaWRcIik7XHJcbiAgICAgICAgICAgICAgICBsZXQgX2lkQWtjaWplID0gXCItMVwiO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kZW55UmVjb3JkKF9pZFZyc3RlLCBfaWQsIF9rb21lbnRhci52YWx1ZSwgX2lkQWtjaWplKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkNvbmZpcm1HbG9iYWxDbGljaygpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTElLVkNha2FsbmFWcnN0YUdyaWQub25Db25maXJtR2xvYmFsQ2xpY2tcIik7XHJcbiAgICAgICAgbGV0IHJvd3Nfc2VsZWN0ZWQgPSB0aGlzLndlYkdyaWQxLmdldFNlbGVjdGVkUm93c1YyKCk7XHJcbiAgICAgICAgcm93c19zZWxlY3RlZC5mb3JFYWNoKF9lbCA9PiB7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coX2VsKTtcclxuICAgICAgICAgICAgbGV0IF9yb3cgPSAkKCcjTElLVkNha2FsbmFWcnN0YUdyaWQgPiB0Ym9keSA+IHRyJykuZXEoTnVtYmVyKF9lbCkpOyAvLyBoZXJlIHdlIGV4dHJhcG9sYXRlIHRoZSByb3cgZGF0YSBvZiBzZWxlY3RlZCBpbmRleFxyXG4gICAgICAgICAgICBpZiAoX3Jvdy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICAgICAgbGV0IF9pZFZyc3RlID0gX3Jvdy5hdHRyKFwiZGF0YS1pZHZyc3RlXCIpO1xyXG4gICAgICAgICAgICAgICAgbGV0IF9pZCA9IF9yb3cuYXR0cihcImRhdGEtaWRcIik7XHJcbiAgICAgICAgICAgICAgICBsZXQgX2tvbWVudGFyID0gJChcIiNBZGRDb21tZW50Q29uZmlybVZpZXdcIikuZmluZChcIiNLb21lbnRhclwiKS52YWwoKTtcclxuICAgICAgICAgICAgICAgIGxldCBfaWRBa2NpamUgPSBfcm93LmF0dHIoXCJkYXRhLWlkQWtjaWplXCIpO1xyXG4gICAgICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coX2lkVnJzdGUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maXJtUmVjb3JkKF9pZFZyc3RlLCBfaWQsIF9rb21lbnRhci50b1N0cmluZygpLCBfaWRBa2NpamUsIHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRGVueUdsb2JhbENsaWNrKCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJMSUtWQ2FrYWxuYVZyc3RhR3JpZC5vbkRlbnlHbG9iYWxDbGlja1wiKTtcclxuICAgICAgICBsZXQgcm93c19zZWxlY3RlZCA9IHRoaXMud2ViR3JpZDEuZ2V0U2VsZWN0ZWRSb3dzVjIoKTtcclxuICAgICAgICByb3dzX3NlbGVjdGVkLmZvckVhY2goX2VsID0+IHtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhfZWwpO1xyXG4gICAgICAgICAgICBsZXQgX3JvdyA9ICQoJyNMSUtWQ2FrYWxuYVZyc3RhR3JpZCA+IHRib2R5ID4gdHInKS5lcShOdW1iZXIoX2VsKSk7IC8vIGhlcmUgd2UgZXh0cmFwb2xhdGUgdGhlIHJvdyBkYXRhIG9mIHNlbGVjdGVkIGluZGV4XHJcbiAgICAgICAgICAgIGlmIChfcm93Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGxldCBfa29tZW50YXIgPSAkKFwiI0FkZENvbW1lbnRWaWV3XCIpLmZpbmQoXCIjS29tZW50YXJcIilbMF0gYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9saWt2Q2FrYWxuYVZyc3RhQ29tbWVudC5vblZhbGlkZWF0ZUtvbWVudGFyKF9rb21lbnRhcikpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgX2lkVnJzdGUgPSBfcm93LmF0dHIoXCJkYXRhLWlkdnJzdGVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IF9pZCA9IF9yb3cuYXR0cihcImRhdGEtaWRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IF9pZEFrY2lqZSA9IF9yb3cuYXR0cihcImRhdGEtaWRBa2NpamVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZW55UmVjb3JkKF9pZFZyc3RlLCBfaWQsIF9rb21lbnRhci52YWx1ZSwgX2lkQWtjaWplKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkFwcGxpY2F0aW9uRmlsdGVyQ2hhbmdlKGU6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJMSUtWQ2FrYWxuYVZyc3RhR3JpZC5vbkFwcGxpY2F0aW9uRmlsdGVyQ2hhbmdlXCIpO1xyXG4gICAgICAgIGxldCBfYXBwbGljYXRpb25GaWx0ZXIgPSB0aGlzLl9tYWluRm9ybURpdi5maW5kKFwiI0FwcGxpY2F0aW9uRmlsdGVyXCIpO1xyXG4gICAgICAgIGlmIChfYXBwbGljYXRpb25GaWx0ZXIubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLl9pemJyYW5hVnJzdGFEb2t1bWVudGEgPSBfYXBwbGljYXRpb25GaWx0ZXIudmFsKCkgYXMgc3RyaW5nO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5faXpicmFuYVZyc3RhRG9rdW1lbnRhID09IFwiP1wiKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5faXpicmFuYVZyc3RhRG9rdW1lbnRhID0gXCJcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoR3JpZERhdGEoMCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaW5pdFZyc3RhRG9rdW1lbnRhKCk6IHZvaWQge1xyXG4gICAgLy8gICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTElLVkNha2FsbmFWcnN0YVZpZXcuaW5pdFZyc3RhRG9rdW1lbnRhXCIpO1xyXG5cclxuICAgIC8vICAgdGhpcy5fdnJzdGFEb2t1bWVudGEgPSBuZXcgU2FvcE11bHRpc2VsZWN0KCk7XHJcbiAgICAvLyAgIHRoaXMuX3Zyc3RhRG9rdW1lbnRhLmFmdGVyQ2hhbmdlQ29tbW9uRXZlbnQgPSB0aGlzLmZpbHRlclZyc3RhRG9rdW1lbnRhLmJpbmQodGhpcyk7XHJcbiAgICAvLyAgIC8vIGluaXQgemEgbWV0b2RvIFwiYWZ0ZXJDaGFuZ2VDb21tb25FdmVudFwiLCBkYSBzZSDFvmUgdiBcIl92cnN0YURva3VtZW50YS5pbml0XCIgbWV0b2RpIHNwcm96aSBmaWx0ZXJWcnN0YURva3VtZW50YVxyXG4gICAgLy8gICB0aGlzLl92cnN0YURva3VtZW50YS5pbml0KFwiI1Zyc3RhRG9rdW1lbnRhRmlsdGVyXCIsIFwiVnJzdGEgZG9rdW1lbnRhXCIpO1xyXG4gICAgLy8gICAvLyBwcmlrYXplbW8gc2VsZWN0IGRpdlxyXG4gICAgLy8gICAkKHRoaXMuX3Zyc3RhRG9rdW1lbnRhRGl2SWQpLnNob3coKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBmaWx0ZXJWcnN0YURva3VtZW50YShlbGVtZW50OiBhbnkpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTElLVkNha2FsbmFWcnN0YVZpZXcuZmlsdGVyVnJzdGFEb2t1bWVudGFcIik7XHJcblxyXG4gICAgICAgIHRoaXMucmVmcmVzaEdyaWREYXRhKDApO1xyXG4gICAgfVxyXG5cclxuICAgIGFmdGVyUG9wb3Zlck1vYmlsZUZpbHRlclNob3coZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTElLVkNha2FsbmFWcnN0YVZpZXcuYWZ0ZXJQb3BvdmVyTW9iaWxlRmlsdGVyU2hvd1wiKTtcclxuXHJcbiAgICAgICAgbGV0IGF0ckNvbnRlbnQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtcG9wb3Zlci1jb250ZW50XCIpO1xyXG4gICAgICAgIC8vIHByZXZlcmltbyDEjWUgamUgcG9wdXAgbGlrdiBmaWx0ZXJcclxuICAgICAgICBpZiAoYXRyQ29udGVudCA9PT0gXCIjcG9wT3Zlckxpa3ZGaWx0ZXJcIikge1xyXG5cclxuICAgICAgICAgICAgLy8gdGhpcy5fdnJzdGFEb2t1bWVudGFNb2JpbGUgPSBuZXcgU2FvcE11bHRpc2VsZWN0KCk7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuX3Zyc3RhRG9rdW1lbnRhTW9iaWxlLmluaXQoXCJkaXYucG9wb3Zlci5zaG93ICNWcnN0YURva3VtZW50YUZpbHRlck1vYmlsZVwiLCBcIlZyc3RhIGRva3VtZW50YVwiKTtcclxuICAgICAgICAgICAgLy8gLy8gbWV0b2RhIHRoaXMuc2V0U2VsZWN0U2t1cGluYU1vYmlsZUZpbHRlclZhbHVlcyBzZSBtb3JhIGl6dmVzdGkgcHJlZCB0aGlzLl9zZWxlY3RTa3VwaW5hTW9iaWxlRmlsdGVyLmFmdGVyQ2hhbmdlQ29tbW9uRXZlbnRcclxuICAgICAgICAgICAgLy8gLy8gZGEgc2Ugc2UgbmUgaXp2ZWRlIG1ldG9kYSB0aGlzLnNlbGVjdFNrdXBpbmFNb2JpbGVGaWx0ZXJDaGFuZ2VkLCBrZXIgc2UgdiB0aGlzLnNldFNlbGVjdFNrdXBpbmFNb2JpbGVGaWx0ZXJWYWx1ZXNcclxuICAgICAgICAgICAgLy8gLy8gbmFzdGF2aWpvIHZyZWRub3N0aSB2IGtsYXN1IFNhb3BNdWx0aXNlbGVjdCBpbiBwb3NsZWRpY25vIHNlIGtsaWNlIHR1ZGkgYWZ0ZXJDaGFuZ2VDb21tb25FdmVudCBldmVudFxyXG4gICAgICAgICAgICAvLyB0aGlzLnNldFNlbGVjdFZETW9iaWxlRmlsdGVyVmFsdWVzKCk7ICAgXHJcbiAgICAgICAgICAgIC8vIHRoaXMuX3Zyc3RhRG9rdW1lbnRhTW9iaWxlLmFmdGVyQ2hhbmdlQ29tbW9uRXZlbnQgPSB0aGlzLmZpbHRlclZyc3RhRG9rdW1lbnRhTW9iaWxlQ2hhbmdlZC5iaW5kKHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgbGV0IF9BcHBsaWNhdGlvbkZpbHRlck1vYmlsZSA9ICQoJ2Rpdi5wb3BvdmVyLnNob3cnKS5maW5kKCcjQXBwbGljYXRpb25GaWx0ZXJNb2JpbGUnKTtcclxuICAgICAgICAgICAgaWYgKF9BcHBsaWNhdGlvbkZpbHRlck1vYmlsZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBfQXBwbGljYXRpb25GaWx0ZXJNb2JpbGUub2ZmKFwiY2hhbmdlXCIpO1xyXG4gICAgICAgICAgICAgICAgX0FwcGxpY2F0aW9uRmlsdGVyTW9iaWxlLm9uKFwiY2hhbmdlXCIsIHRoaXMub25BcHBsaWNhdGlvbkZpbHRlck1vYmlsZUNoYW5nZS5iaW5kKHRoaXMpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfQXBwbGljYXRpb25GaWx0ZXJNb2JpbGUudmFsKHRoaXMuX2l6YnJhbmFWcnN0YURva3VtZW50YSkuY2hhbmdlKCk7IC8vcHJvcCgnc2VsZWN0ZWQnLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGRvZGFtbyBjdXN0b20gY3NzIHphIGZpbHRlclxyXG4gICAgICAgICAgICBsZXQgZmlsdGVyUG9wb3ZlckRpdiA9ICQoXCJkaXYucG9wb3Zlci5zaG93XCIpO1xyXG4gICAgICAgICAgICBpZiAoZmlsdGVyUG9wb3ZlckRpdiAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY3VzdG9tQ3NzID0gXCJjYWxlbmRhci1maWx0ZXJcIjtcclxuICAgICAgICAgICAgICAgIGlmICghZmlsdGVyUG9wb3ZlckRpdi5oYXNDbGFzcyhjdXN0b21Dc3MpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyUG9wb3ZlckRpdi5hZGRDbGFzcyhjdXN0b21Dc3MpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBkb2RhbW8gY3VzdG9tIGNzcyB6YSBmaWx0ZXJcclxuICAgICAgICAgICAgbGV0IGZpbHRlclBvcG92ZXJCb2R5RGl2ID0gJChcImRpdi5wb3BvdmVyLnNob3dcIikuZmluZChcImRpdi5wb3BvdmVyLWJvZHlcIik7XHJcbiAgICAgICAgICAgIGlmIChmaWx0ZXJQb3BvdmVyQm9keURpdiAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY3VzdG9tQ3NzID0gXCJjYWxlbmRhci1maWx0ZXItYm9keVwiO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXJQb3BvdmVyQm9keURpdi5oYXNDbGFzcyhjdXN0b21Dc3MpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyUG9wb3ZlckJvZHlEaXYuYWRkQ2xhc3MoY3VzdG9tQ3NzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gcHJpa2F6aSBmaWx0ZXIgb2tub1xyXG4gICAgICAgICAgICBsZXQgZmlsdGVyQm9keSA9ICQoXCJkaXYucG9wb3Zlci5zaG93XCIpLmZpbmQoXCIjcG9wT3Zlckxpa3ZGaWx0ZXJCb2R5XCIpO1xyXG4gICAgICAgICAgICBmaWx0ZXJCb2R5LnNob3coKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0U2VsZWN0VkRNb2JpbGVGaWx0ZXJWYWx1ZXMoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIkxJS1ZDYWthbG5hVnJzdGFWaWV3LnNldFNlbGVjdFZETW9iaWxlRmlsdGVyVmFsdWVzXCIpO1xyXG4gICAgICAgIC8vIHByZWJlcmVtbyB2cmVkbm9zdGkgVkQgaXogZGVza3RvcCBDYXRlZ29yeSBlbGVtZW50XHJcbiAgICAgICAgbGV0IGl6YnJhbmFWcnN0YURva3VtZW50YSA9IDxzdHJpbmdbXT4odGhpcy5fdnJzdGFEb2t1bWVudGEuc2VsZWN0ZWRDQi52YWwoKSk7XHJcbiAgICAgICAgdGhpcy5fdnJzdGFEb2t1bWVudGFNb2JpbGUuc2V0U2VsZWN0VmFsdWVzKGl6YnJhbmFWcnN0YURva3VtZW50YSk7XHJcbiAgICB9XHJcblxyXG4gICAgZmlsdGVyVnJzdGFEb2t1bWVudGFNb2JpbGVDaGFuZ2VkKGVsZW1lbnQ6IGFueSkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJMSUtWQ2FrYWxuYVZyc3RhVmlldy5maWx0ZXJWcnN0YURva3VtZW50YVwiKTtcclxuXHJcbiAgICAgICAgLy8gcHJlYmVyZW1vLCBWRCBpbiBqaWggc2hyYW5pbW8gdiBkZXNrdG9wIENhdGVnb3J5IGVsZW1lbnRcclxuICAgICAgICBsZXQgaXpicmFuYVZyc3RhRG9rdW1lbnRhID0gPHN0cmluZ1tdPihlbGVtZW50LnZhbCgpKTtcclxuICAgICAgICB0aGlzLl92cnN0YURva3VtZW50YS5zZXRTZWxlY3RWYWx1ZXMoaXpicmFuYVZyc3RhRG9rdW1lbnRhKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWZyZXNoR3JpZERhdGEoMCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0R2xvYmFsQ29uZmlybURlbnlCdXR0b25zRW5hYmxlRGlzYWJsZSgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTElLVkNha2FsbmFWcnN0YUdyaWQud2ViR3JpZEFmdGVyQ29sdW1uQ2hlY2tib3hDaGFuZ2VkXCIpO1xyXG5cclxuICAgICAgICBsZXQgX2J0bkNvbmZpcm1HbG9iYWwgPSB0aGlzLl9tYWluRm9ybURpdi5maW5kKFwiI2J0bkNvbmZpcm1HbG9iYWxcIik7XHJcbiAgICAgICAgX2J0bkNvbmZpcm1HbG9iYWwucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTtcclxuICAgICAgICBsZXQgX2J0bkRlbnlHbG9iYWwgPSB0aGlzLl9tYWluRm9ybURpdi5maW5kKFwiI2J0bkRlbnlHbG9iYWxcIik7XHJcbiAgICAgICAgX2J0bkRlbnlHbG9iYWwucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTtcclxuXHJcbiAgICAgICAgJChcIiNMSUtWQ2FrYWxuYVZyc3RhR3JpZCB0ciB0ZC5kdC1jaGVja2JveGVzLWNlbGwgaW5wdXRbdHlwZT0nY2hlY2tib3gnXS5kdC1jaGVja2JveGVzXCIpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBsZXQgY2hlY2tlZCA9ICQodGhpcykuaXMoXCI6Y2hlY2tlZFwiKTtcclxuICAgICAgICAgICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgICAgICAgICAgIF9idG5Db25maXJtR2xvYmFsLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgX2J0bkRlbnlHbG9iYWwucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2hTaWduZWVzKCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJMSUtWQ2FrYWxuYVZyc3RhR3JpZC5zd2l0Y2hTaWduZWVzXCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgbGV0IF9kYXRhID0ge307XHJcbiAgICAgICAgLy9cclxuICAgICAgICBsZXQgX3VybEFjdGlvbiA9IFwiXCI7XHJcbiAgICAgICAgX3VybEFjdGlvbiA9IFwiTGlrdkNvbmZpcm1hdGlvbnMvU3dpdGNoU2lnbmVlc1wiO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgbGV0IF9zYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgICAgICBfc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmFsZXJ0TWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgYWxlcnRpZnkubWVzc2FnZShyZXNwb25zZS5hbGVydE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uudmlld0NvbnRlbnQpIHtcclxuICAgICAgICAgICAgICAgICQoXCIjbWVzc2FnZUJhbm5lclwiKS5odG1sKHJlc3BvbnNlLnZpZXdDb250ZW50KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgX3RoaXMucmVmcmVzaEdyaWREYXRhKDApO1xyXG5cclxuICAgICAgICB9O1xyXG4gICAgICAgIF9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246IF91cmxBY3Rpb25cclxuICAgICAgICAgICAgLCBkYXRhOiBfZGF0YVxyXG4gICAgICAgICAgICAsIHR5cGU6IFwiUE9TVFwiXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkxJS1ZpZERvY3VtZW50Q29tcGxldGUoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIkxJS1ZDYWthbG5hVnJzdGFWaWV3Lm9uRGVueURvY3VtZW50Q29tcGxldGVcIik7XHJcblxyXG4gICAgICAgIHRoaXMucmVmcmVzaEdyaWREYXRhKDApO1xyXG4gICAgfVxyXG5cclxuICAgIHNldENoZWNrYm94RW5hYmxlZERpc2FibGVkKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJMSUtWQ2FrYWxuYVZyc3RhR3JpZC5zZXRDaGVja2JveEVuYWJsZWREaXNhYmxlZFwiKTtcclxuICAgICAgICAkKFwiI0xJS1ZDYWthbG5hVnJzdGFHcmlkIHRyXCIpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBsZXQgX2lkID0gJCh0aGlzKS5hdHRyKFwiZGF0YS1yb3dJRFwiKTtcclxuICAgICAgICAgICAgbGV0IF9yb3cgPSAkKCcjTElLVkNha2FsbmFWcnN0YUdyaWQgPiB0Ym9keSA+IHRyJykuZXEoTnVtYmVyKF9pZCkpO1xyXG4gICAgICAgICAgICBpZiAoX3Jvdy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgX2lkQWtjaWplID0gX3Jvdy5hdHRyKFwiZGF0YS1pZEFrY2lqZVwiKTtcclxuICAgICAgICAgICAgICAgIGxldCBfY2hlY2tib3ggPSBfcm93LmZpbmQoXCJ0ZC5kdC1jaGVja2JveGVzLWNlbGwgaW5wdXRbdHlwZT0nY2hlY2tib3gnXS5kdC1jaGVja2JveGVzXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKF9pZEFrY2lqZSA9PSBcIjJcIilcclxuICAgICAgICAgICAgICAgICAgICBfY2hlY2tib3gucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSlcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICBfY2hlY2tib3gucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQXBwbGljYXRpb25GaWx0ZXJNb2JpbGVDaGFuZ2UoZTogYW55KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIkxJS1ZDYWthbG5hVnJzdGFHcmlkLm9uQXBwbGljYXRpb25GaWx0ZXJNb2JpbGVDaGFuZ2VcIik7XHJcbiAgICAgICAgbGV0IF9hcHBsaWNhdGlvbkZpbHRlciA9ICQoJ2Rpdi5wb3BvdmVyLnNob3cnKS5maW5kKCcjQXBwbGljYXRpb25GaWx0ZXJNb2JpbGUnKTtcclxuICAgICAgICBpZiAoX2FwcGxpY2F0aW9uRmlsdGVyLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5faXpicmFuYVZyc3RhRG9rdW1lbnRhID0gX2FwcGxpY2F0aW9uRmlsdGVyLnZhbCgpIGFzIHN0cmluZztcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2l6YnJhbmFWcnN0YURva3VtZW50YSA9PSBcIj9cIilcclxuICAgICAgICAgICAgICAgIHRoaXMuX2l6YnJhbmFWcnN0YURva3VtZW50YSA9IFwiXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVmcmVzaEdyaWREYXRhKDApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0TW9iaWxlVmlldygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTElLVkNha2FsbmFWcnN0YUdyaWQuc2V0TW9iaWxlVmlld1wiKTtcclxuICAgICAgICBpZiAodGhpcy5pc01vYmlsZVZpZXcoKSkge1xyXG4gICAgICAgICAgICB0aGlzLl9tYWluRm9ybURpdi5maW5kKCcjZ3JpZC10b29sYmFyJykuYWRkQ2xhc3MoXCJtb2JpbGUtZ3JpZHRvb2xiYXJcIik7XHJcbiAgICAgICAgICAgIHRoaXMuX21haW5Gb3JtRGl2LmZpbmQoJyNncmlkdG9vbGJhclJvdycpLmFkZENsYXNzKFwibW9iaWxlLWdyaWR0b29sYmFyUm93XCIpO1xyXG4gICAgICAgICAgICB0aGlzLl9tYWluRm9ybURpdi5maW5kKCcjbW9iaWxlU2VhcmNoVmFsdWVEaXYnKS5hZGRDbGFzcyhcIm1vYmlsZS1TZWFyY2hWYWx1ZURpdlwiKTtcclxuICAgICAgICAgICAgdGhpcy5fbWFpbkZvcm1EaXYuZmluZCgnI21vYmlsZVNlYXJjaFZhbHVlRGl2IC5zYW9wLWltZy1zZWFyY2gnKS5hZGRDbGFzcyhcIm1vYmlsZS1Ecm9wRG93bkltZ1NlYXJjaFwiKTtcclxuICAgICAgICAgICAgdGhpcy5fbWFpbkZvcm1EaXYuZmluZCgnI21vYmlsZURyb3BEb3duRGl2JykuYWRkQ2xhc3MoXCJtb2JpbGUtRHJvcERvd25EaXZcIik7XHJcbiAgICAgICAgICAgIHRoaXMuX21haW5Gb3JtRGl2LmZpbmQoJyNMSUtWQ2FrYWxuYVZyc3RhR3JpZCcpLnRvZ2dsZUNsYXNzKFwidGFibGUtY29sdW1uLWhvbGRlci1sYXN0XCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzTW9iaWxlVmlldygpOiBib29sZWFuIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTElLVkNha2FsbmFWcnN0YUdyaWQuXCIpO1xyXG4gICAgICAgIGxldCBpc01vYmlsZSA9IHRoaXMuX21haW5Gb3JtRGl2LmZpbmQoJyNtb2JpbGVTZWFyY2hWYWx1ZURpdicpLmNzcyhcImRpc3BsYXlcIikgIT0gXCJub25lXCI7XHJcblxyXG4gICAgICAgIHJldHVybiBpc01vYmlsZTtcclxuICAgIH1cclxuXHJcbiAgICBlZGl0Um93RnJvbURhc2hib2FyZCgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTElLVkNha2FsbmFWcnN0YUdyaWQuZWRpdFJvd0Zyb21EYXNoYm9hcmRcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBpZiAoIXRoaXMuX2Rhc2hib2FyZCkge1xyXG4gICAgICAgICAgICAvL3BvYmVyZW1vIHZyc3RpY28ga2kgaW1hIGF0cmlidXQgZGF0YS1yb3dzZWxlY3RlZCA9IHRydWUsIG5hdGF2aW1vIGluZGV4LCBqbyBvem5hY2ltbyBpbiBvZHByZW1vIGVkaXQgZm9ybW9cclxuICAgICAgICAgICAgbGV0IF9yb3dTZWxlY3RlZCA9IFwiVHJ1ZVwiO1xyXG4gICAgICAgICAgICBsZXQgZGF0YSA9ICQoXCJ0cltkYXRhLXJvd3NlbGVjdGVkPSdcIiArIF9yb3dTZWxlY3RlZCArIFwiJ11cIik7XHJcbiAgICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGxldCBfaWRWcnN0ZSA9IGRhdGEuYXR0cihcImRhdGEtSURWcnN0ZVwiKTtcclxuICAgICAgICAgICAgICAgIGxldCBfaWQgPSBkYXRhLmF0dHIoXCJkYXRhLUlEXCIpO1xyXG4gICAgICAgICAgICAgICAgbGV0IF92cnN0YURva3VtZW50YSA9IGRhdGEuYXR0cihcImRhdGEtdnJzdGFkb2t1bWVudGFcIik7XHJcbiAgICAgICAgICAgICAgICBsZXQgX2Rva3VtZW50ID0gZGF0YS5hdHRyKFwiZGF0YS1kb2t1bWVudFwiKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLl9zZWxlY3RlZFJvd05vID0gcGFyc2VJbnQoZGF0YS5hdHRyKFwiZGF0YS1yb3dJRFwiKSk7IC8vIGhlcmUgd2Ugc3RvcmUgdGhlIElEIG9mIHRoZSBjdXJyZW50IHJvd1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghaXNVbkRlZmluZWQoX2lkVnJzdGUpICYmICFpc1VuRGVmaW5lZChfaWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gYmFydmFuamUgb3puYWNlbmUgdnJzdHJpY2VcclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy53ZWJHcmlkMS5tYXJrU2VsZWN0ZWRSb3coPEhUTUxFbGVtZW50PihkYXRhKVswXSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmVkaXRSZWNvcmQoX3Zyc3RhRG9rdW1lbnRhLCBfZG9rdW1lbnQsIF9pZFZyc3RlLCBfaWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgU3RvcmVQcmV2QW5kTmV4dFJvd0RhdGEoX2lkVnJzdGU6c3RyaW5nLCBfaWQ6c3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIkxJS1ZDYWthbG5hVnJzdGFHcmlkLlN0b3JlTmV4dFJvd1wiKTtcclxuICAgICAgICBpZiAoX2lkVnJzdGUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLl9wcmV2SURWcnN0ZSA9IFwiXCI7XHJcbiAgICAgICAgICAgIHRoaXMuX3ByZXZJRCA9IFwiXCI7ICAgICBcclxuICAgICAgICAgICAgdGhpcy5fbmV4dElEVnJzdGUgPSBcIlwiO1xyXG4gICAgICAgICAgICB0aGlzLl9uZXh0SUQgPSBcIlwiOyAgICAgICAgXHJcbiAgICAgICAgICAgIGxldCBfcm93ID0gJChcInRyW2RhdGEtSURWcnN0ZT0nXCIgKyBfaWRWcnN0ZSArIFwiJ11cIikuZmlsdGVyKFwidHJbZGF0YS1JRD0nXCIgKyBfaWQgKyBcIiddXCIpO1xyXG4gICAgICAgICAgICBpZiAoX3Jvdy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgX25leHRUUiA9IF9yb3cubmV4dChcInRyXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKF9uZXh0VFIubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbmV4dElEVnJzdGUgPSBfbmV4dFRSLmF0dHIoXCJkYXRhLWlkdnJzdGVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbmV4dElEID0gX25leHRUUi5hdHRyKFwiZGF0YS1pZFwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCBfcHJldlRSID0gX3Jvdy5wcmV2KFwidHJcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoX3ByZXZUUi5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcmV2SURWcnN0ZSA9IF9wcmV2VFIuYXR0cihcImRhdGEtaWR2cnN0ZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcmV2SUQgPSBfcHJldlRSLmF0dHIoXCJkYXRhLWlkXCIpOyAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0iLCJpbXBvcnQgeyBnbG9iYWwsIGdldFJlbGF0aXZlU2l0ZVVSTCwgZ2V0U2l0ZUFic29sdXRlVVJMLCBpc0VtcHR5LCBpc1VuRGVmaW5lZCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFZpZXdGb3JtLCBTYW9wV2ZBY3Rpb24gfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXZpZXctZm9ybVwiO1xyXG5pbXBvcnQgeyBTYW9wVXBsb2FkRmlsZXMgfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLXVwbG9hZC1maWxlc1wiO1xyXG5pbXBvcnQgeyBTYW9wQXR0YWNobWVudExpc3QgfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLWF0dGFjaG1lbnQtbGlzdFwiO1xyXG5pbXBvcnQgeyBTYW9wU2VydmljZXNDb3JlIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC1zZXJ2aWNlcy1jb3JlXCI7XHJcbmltcG9ydCB7IExJS1ZDYWthbG5hVnJzdGFDb21tZW50IH0gZnJvbSBcIi4uL0xJS1YvTElLVkNha2FsbmFWcnN0YS1Db21tZW50XCI7XHJcbmltcG9ydCB7IExJS1ZOaXZvamlQb3RyamV2YW5qYU1vZGFsIH0gZnJvbSBcIi4uL0xJS1YvTElLVk5pdm9qaVBvdHJqZXZhbmphLW1vZGFsXCI7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIExJS1ZDYWthbG5hVnJzdGFWaWV3IGV4dGVuZHMgU2FvcFZpZXdGb3JtIHtcclxuICBwcml2YXRlIF9mb3JtSWQ6c3RyaW5nO1xyXG4gIHByaXZhdGUgX3ZpZXdJZDogc3RyaW5nXHJcbiAgcHJpdmF0ZSBfc2FvcFVwbG9hZEZpbGVzOlNhb3BVcGxvYWRGaWxlcztcclxuICBwcml2YXRlIF9zYW9wQXR0YWNobWVudExpc3Q6IFNhb3BBdHRhY2htZW50TGlzdDtcclxuICBwcml2YXRlIF9saWt2Tml2b2ppUG90cmpldmFuamFNb2RhbCA6TElLVk5pdm9qaVBvdHJqZXZhbmphTW9kYWw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHZpZXdJZDpzdHJpbmcsbGliTmFtZTpzdHJpbmcgPSBcIlwiKXtcclxuICAgIHN1cGVyKHZpZXdJZCxsaWJOYW1lKTtcclxuICAgIHRoaXMuX3ZpZXdJZCA9IHZpZXdJZDtcclxuICAgIHRoaXMudGl0bGUgPSB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJQb3RuaSBuYWxvZ1wiKTtcclxuICAgIHRoaXMuYWRkUmVjb3JkRW5kcG9pbnQgPSBcIlwiO1xyXG4gICAgdGhpcy5lZGl0UmVjb3JkRW5kcG9pbnQgPSBcIkxpa3ZDb25maXJtYXRpb25zL0VkaXRcIjtcclxuICAgIHRoaXMuZGVsZXRlUmVjb3JkRW5kcG9pbnQgPSBcIlwiOyBcclxuICAgIHRoaXMuX3Nhb3BVcGxvYWRGaWxlcyA9IG5ldyBTYW9wVXBsb2FkRmlsZXModmlld0lkLGxpYk5hbWUpO1xyXG4gICAgdGhpcy5fbGlrdk5pdm9qaVBvdHJqZXZhbmphTW9kYWwgPSBuZXcgTElLVk5pdm9qaVBvdHJqZXZhbmphTW9kYWwoXCIjTElLVkNha2FsbmFWcnN0YVZpZXcwMDRcIiwgbGliTmFtZSk7XHJcbiAgICB0aGlzLl9saWt2Tml2b2ppUG90cmpldmFuamFNb2RhbC5mdWxsU2NyZWVuID0gdHJ1ZTsgIFxyXG4gICAgLy9cclxuICAgIHRoaXMuYWZ0ZXJWaWV3U2hvd1N1Y2Nlc3MgPSB0aGlzLmluaXRWaWV3O1xyXG4gICAgdGhpcy5hZnRlclN1Ym1pdFN1Y2Nlc3MgPSB0aGlzLmluaXRWaWV3O1xyXG4gICAgLy90aGlzLnZpZXdTaG93bkNvbXBsZXRlID0gdGhpcy5zaG93bkNvbXBsZXRlO1xyXG4gICAgdGhpcy5fc2FvcEF0dGFjaG1lbnRMaXN0ID0gbmV3IFNhb3BBdHRhY2htZW50TGlzdChcIiNMaWt2Q2FrYWxuYVZyc3RhQXR0YWNobWVudHNcIiwgbGliTmFtZSArIFwiLl9zYW9wQXR0YWNobWVudExpc3RcIik7XHJcbiAgICB0aGlzLl9zYW9wQXR0YWNobWVudExpc3QuaW5pdENvbXBvbmVudChcclxuICAgICAge1xyXG4gICAgICAgICAgdmFsaWRhdGlvbkZpbmdlcnByaW50Q29udHJvbGxlcjogXCJTUExEb2N1bWVudFwiLFxyXG4gICAgICAgICAgdmFsaWRhdGlvbkZpbmdlcnByaW50QWN0aW9uOiBcIlZhbGlkYXRlQXR0YWNobWVudEZpbmdlclByaW50XCIsXHJcbiAgICAgICAgICB2YWxpZGF0aW9uRmluZ2VycHJpbnRCYW5uZXJEaXZJZDogdmlld0lkICsgXCIgI3VwbG9hZEZpbGVzVmFsaWRhdGlvbnNBamF4XCIsXHJcbiAgICAgICAgICB2YWxpZGF0aW9uQ29udHJvbGxlcjogXCJTUExEb2N1bWVudFwiLFxyXG4gICAgICAgICAgdmFsaWRhdGlvbkFjdGlvbjogXCJWYWxpZGF0ZURvd25sb2FkaW5nRG9jdW1lbnRBdHRhY2htZW50XCIsXHJcbiAgICAgICAgICB2YWxpZGF0aW9uQmFubmVyRGl2SWQ6IHZpZXdJZCArIFwiICN1cGxvYWRGaWxlc1ZhbGlkYXRpb25zQWpheFwiLFxyXG4gICAgICAgICAgZG93bmxvYWRDb250cm9sbGVyOiBcIlNQTERvY3VtZW50XCIsXHJcbiAgICAgICAgICBkb3dubG9hZEFjdGlvbjogXCJEb3dubG9hZERvY3VtZW50QXR0YWNobWVudFwiLFxyXG4gICAgICAgICAgZGVsZXRlZEF0dGFjaG1lbnRMaXN0SWQ6IHZpZXdJZCArIFwiIFwiICsgXCIjUHJpcG9ua2VCcmlzYW5lXCJcclxuICAgICAgfSk7XHJcbiAgICAgIC8vXHJcbiAgICAgIHRoaXMuc2V0RGljdGlvbmFyeSgpOyAgICAgIFxyXG4gIH1cclxuXHJcbiAgc2V0RGljdGlvbmFyeSgpe1xyXG4gICAgbGV0IGRpY3Rpb25hcnk6c3RyaW5nW10gPSBbXCJQb3RyamV2YW5qZVwiXTtcclxuICAgIHRoaXMuc2V0VGVybWlub2xvZ3lMaXN0KGRpY3Rpb25hcnkpO1xyXG4gIH0gXHJcblxyXG4gIC8vIHNob3duQ29tcGxldGUoKTp2b2lke1xyXG4gIC8vICAgY29uc29sZS5sb2coXCJzaG93bkNvbXBsZXRlLi4uXCIpO1xyXG4gIC8vICAgZXZhbChcIkNvbW1vblBvaW50ZXJbJ3Nhb3BQZGZQcmV2aWV3J10uc2V0RGVmYXVsdFNjYWxlKDAuNik7XCIpO1xyXG4gIC8vIH1cclxuXHJcbiAgcHVibGljIGluaXRWaWV3KCk6dm9pZHtcclxuICAgIHRoaXMuTG9hZFZpZXdFdmVudHMoKTtcclxuICAgIHRoaXMuc2V0VGl0bGVDc3MoKTtcclxuICAgIHRoaXMuZW5hYmxlTW9iaWxlS29tZW50YXIoKTtcclxuICAgIHRoaXMuc2V0QXR0YWNobWVudENzcygpO1xyXG4gICAgJCh0aGlzLl92aWV3SWQgKyBcIiAjbGlrdkNvbmZpcm1hdGlvbnNFZGl0TWFpbkRpdlwiKS5zaG93KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgTG9hZFZpZXdFdmVudHMgKCk6dm9pZHtcclxuICAgIGxldCBfdmlld0RpdiA9ICQodGhpcy5pZCk7XHJcbiAgICBpZiAoX3ZpZXdEaXYubGVuZ3RoID09IDApIHtyZXR1cm47fVxyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICB0aGlzLl9mb3JtSWQgPSBcIiNtYWluTGlrdkNha2FsbmFWcnN0YUVkaXRcIjtcclxuICAgIC8vdGhpcy5fc2FvcFVwbG9hZEZpbGVzLmluaXRDb21wb25lbnQoe2NvbnRyb2xsZXI6XCJUcmF2ZWxPcmRlclwiLGFjdGlvbjpcIlZhbGlkYXRlRmlsZXNcIix2YWxpZGF0ZUFqYXg6dHJ1ZSxmb3JtSWQ6dGhpcy5fZm9ybUlkLHZhbGlkYXRpb25EaXZJZDpcIiN1cGxvYWRGaWxlc1ZhbGlkYXRpb25zQWpheFwifSk7XHJcbiAgICB0aGlzLl9zYW9wVXBsb2FkRmlsZXMuYWZ0ZXJSZWZyZXNoRmlsZXNMaXN0ID0gdGhpcy5fc2FvcFVwbG9hZEZpbGVzLmFqYXhWYWxpZGF0ZTtcclxuXHJcbiAgICAkKCcjYnRuT2snKS5vZmYoJ2NsaWNrJyk7XHJcbiAgICAkKCcjYnRuT2snKS5iaW5kKCdjbGljaycsIFxyXG4gICAgICBmdW5jdGlvbigpIHtcclxuICAgICAgICBsZXQgX3Jlc3VsdCA9IF90aGlzLl9zYW9wVXBsb2FkRmlsZXMuYWpheFZhbGlkYXRlKCk7XHJcbiAgICAgICAgcmV0dXJuIF9yZXN1bHQ7ICAgICAgICBcclxuICAgICAgfSAgICAgICAgICBcclxuICAgICk7ICAgIFxyXG5cclxuICAgIC8vIGxldCBidG5DbG9zZSA9ICQoJyNMaWt2Q29uZmlybWF0aW9uc0VkaXRWaWV3JykuZmluZChcIiNidG5DbG9zZVwiKTtcclxuICAgIC8vIGJ0bkNsb3NlLm9mZihcImNsaWNrXCIsX3RoaXMub25DbG9zZVZpZXcpO1xyXG4gICAgLy8gYnRuQ2xvc2Uub24oXCJjbGlja1wiLF90aGlzLm9uQ2xvc2VWaWV3KTsgICBcclxuXHJcbiAgICAkKCcjTElLVkNha2FsbmFWcnN0YVZpZXcwMDEnKS5vbignaGlkZGVuLmJzLm1vZGFsJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICBfdGhpcy5vbkNsb3NlVmlldygpO1xyXG4gICAgfSk7ICAgIFxyXG5cclxuICAgIC8vJCgnLnNhb3AtYXR0YWNobWVudC1lbGVtZW50JykuYmluZCgnY2xpY2snLCB0aGlzLlJlZnJlc2hBdHRhY2htZW50ICApOyAgICAgXHJcbiAgICAkKFwiLnNhb3AtYXR0YWNobWVudC1lbGVtZW50XCIpLm9uKFwiY2xpY2tcIiwgZnVuY3Rpb24gKGU6YW55KSB7XHJcbiAgICAgIHZhciBkYXRhID0gZS5jdXJyZW50VGFyZ2V0O1xyXG4gICAgICBsZXQgX2lkID0gZGF0YS5nZXRBdHRyaWJ1dGUoXCJkYXRhLWRvY0lkXCIpO1xyXG4gICAgICBsZXQgcHJldmlldyA9IDxzdHJpbmc+ZGF0YS5nZXRBdHRyaWJ1dGUoXCJkYXRhLWRvY3ByZXZpZXdcIik7XHJcbiAgICAgIGxldCBkb2NwcmV2aWV3ID0gcHJldmlldyA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgIF90aGlzLnJlZnJlc2hBdHRhY2htZW50KF9pZCwgZG9jcHJldmlldyk7XHJcbiAgICB9KTsgXHJcblxyXG4gICAgJCgnI2J0bk5leHQnKS5vZmYoJ2NsaWNrJyk7XHJcbiAgICAkKFwiI2J0bk5leHRcIikub24oXCJjbGlja1wiLCBmdW5jdGlvbiAoZTphbnkpIHtcclxuICAgICAgICBfdGhpcy5Nb3ZlVG9OZXh0KCk7XHJcbiAgICB9KTsgIFxyXG5cclxuICAgICQoJyNidG5QcmV2aW91cycpLm9mZignY2xpY2snKTtcclxuICAgICQoXCIjYnRuUHJldmlvdXNcIikub24oXCJjbGlja1wiLCBmdW5jdGlvbiAoZTphbnkpIHtcclxuICAgICAgICBfdGhpcy5Nb3ZlVG9QcmV2aW91cygpO1xyXG4gICAgfSk7IFxyXG5cclxuICAgICQoJyNidG5EZW55Jykub2ZmKCdjbGljaycpO1xyXG4gICAgJChcIiNidG5EZW55XCIpLm9uKFwiY2xpY2tcIiwgZnVuY3Rpb24gKGU6YW55KSB7XHJcblxyXG4gICAgICBsZXQgX2lkVnJzdGVFbGVtZW50ID0gJCgnI0xpa3ZDb25maXJtYXRpb25zRWRpdFZpZXcnKS5maW5kKFwiI0lEVnJzdGVcIik7O1xyXG4gICAgICBsZXQgX2lkVnJzdGUgPSBfaWRWcnN0ZUVsZW1lbnQudmFsKCkudG9TdHJpbmcoKTtcclxuXHJcbiAgICAgIGxldCBfaWRFbGVtZW50ID0gJCgnI0xpa3ZDb25maXJtYXRpb25zRWRpdFZpZXcnKS5maW5kKFwiI0lEXCIpOztcclxuICAgICAgbGV0IF9pZCA9IF9pZEVsZW1lbnQudmFsKCkudG9TdHJpbmcoKTtcclxuXHJcbiAgICAgIGxldCBrb21lbnRhckVsZW1lbnQgPSAkKCcjTGlrdkNvbmZpcm1hdGlvbnNFZGl0VmlldycpLmZpbmQoXCIjZGVza3RvcEtvbWVudGFyXCIpO1xyXG4gICAgICBsZXQga29tZW50YXIgPSBrb21lbnRhckVsZW1lbnQudmFsKCk7XHJcbiAgICAgIGlmICgha29tZW50YXJFbGVtZW50LmlzKFwiOnZpc2libGVcIikpIHtcclxuICAgICAgICBrb21lbnRhciA9ICQoJyNMaWt2Q29uZmlybWF0aW9uc0VkaXRWaWV3JykuZmluZChcIiNtb2JpbGVLb21lbnRhclwiKS52YWwoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IF9pZEFrY2lqZSA9IC0xO1xyXG5cclxuICAgICAgICBfdGhpcy5EZW55QW5kTW92ZVRvTmV4dChfaWRWcnN0ZSwgX2lkLCBrb21lbnRhci50b1N0cmluZygpLCBfaWRBa2NpamUudG9TdHJpbmcoKSk7XHJcbiAgICB9KTsgXHJcblxyXG4gICAgJCgnI2J0bkNvbmZpcm0nKS5vZmYoJ2NsaWNrJyk7XHJcbiAgICAkKFwiI2J0bkNvbmZpcm1cIikub24oXCJjbGlja1wiLCBmdW5jdGlvbiAoZTphbnkpIHtcclxuXHJcbiAgICAgIGxldCBfaWRWcnN0ZUVsZW1lbnQgPSAkKCcjTGlrdkNvbmZpcm1hdGlvbnNFZGl0VmlldycpLmZpbmQoXCIjSURWcnN0ZVwiKTs7XHJcbiAgICAgIGxldCBfaWRWcnN0ZSA9IF9pZFZyc3RlRWxlbWVudC52YWwoKS50b1N0cmluZygpO1xyXG5cclxuICAgICAgbGV0IF9pZEVsZW1lbnQgPSAkKCcjTGlrdkNvbmZpcm1hdGlvbnNFZGl0VmlldycpLmZpbmQoXCIjSURcIik7O1xyXG4gICAgICBsZXQgX2lkID0gX2lkRWxlbWVudC52YWwoKS50b1N0cmluZygpO1xyXG5cclxuICAgICAgbGV0IGtvbWVudGFyRWxlbWVudCA9ICQoJyNMaWt2Q29uZmlybWF0aW9uc0VkaXRWaWV3JykuZmluZChcIiNkZXNrdG9wS29tZW50YXJcIik7XHJcbiAgICAgIGxldCBrb21lbnRhciA9IGtvbWVudGFyRWxlbWVudC52YWwoKTtcclxuICAgICAgaWYgKCFrb21lbnRhckVsZW1lbnQuaXMoXCI6dmlzaWJsZVwiKSkge1xyXG4gICAgICAgIGtvbWVudGFyID0gJCgnI0xpa3ZDb25maXJtYXRpb25zRWRpdFZpZXcnKS5maW5kKFwiI21vYmlsZUtvbWVudGFyXCIpLnZhbCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgX2lkQWtjaWplID0gLTE7XHJcblxyXG4gICAgICAgIF90aGlzLkNvbmZpcm1BbmRNb3ZlVG9OZXh0KF9pZFZyc3RlLCBfaWQsIGtvbWVudGFyLnRvU3RyaW5nKCksIF9pZEFrY2lqZS50b1N0cmluZygpKTtcclxuICAgIH0pOyAgICAgXHJcblxyXG4gICAgJCgnI2J0blVuY0RvY3VtZW50cycpLm9mZignY2xpY2snKTtcclxuICAgICQoXCIjYnRuVW5jRG9jdW1lbnRzXCIpLm9uKFwiY2xpY2tcIiwgZnVuY3Rpb24gKGU6YW55KSB7XHJcbiAgICAgIGxldCBfaWRWcnN0ZUVsZW1lbnQgPSAkKCcjTGlrdkNvbmZpcm1hdGlvbnNFZGl0VmlldycpLmZpbmQoXCIjSURWcnN0ZVwiKTs7XHJcbiAgICAgIGxldCBfaWRWcnN0ZSA9IF9pZFZyc3RlRWxlbWVudC52YWwoKS50b1N0cmluZygpO1xyXG4gICAgICBsZXQgX3BhcmFtcyA9IHsgaWRWcnN0ZTogX2lkVnJzdGUgfTtcclxuICAgICAgLy9cclxuICAgICAgX3RoaXMuX2xpa3ZOaXZvamlQb3RyamV2YW5qYU1vZGFsLnNob3dGb3JtKF9wYXJhbXMpOyAgICAgXHJcbiAgICB9KTsgICAgIFxyXG5cclxuICAgICQoJyNidG5VbmNEb2N1bWVudHNNQicpLm9mZignY2xpY2snKTtcclxuICAgICQoXCIjYnRuVW5jRG9jdW1lbnRzTUJcIikub24oXCJjbGlja1wiLCBmdW5jdGlvbiAoZTphbnkpIHtcclxuICAgICAgbGV0IF9pZFZyc3RlRWxlbWVudCA9ICQoJyNMaWt2Q29uZmlybWF0aW9uc0VkaXRWaWV3JykuZmluZChcIiNJRFZyc3RlXCIpOztcclxuICAgICAgbGV0IF9pZFZyc3RlID0gX2lkVnJzdGVFbGVtZW50LnZhbCgpLnRvU3RyaW5nKCk7XHJcbiAgICAgIGxldCBfcGFyYW1zID0geyBpZFZyc3RlOiBfaWRWcnN0ZSB9O1xyXG4gICAgICAvL1xyXG4gICAgICBfdGhpcy5fbGlrdk5pdm9qaVBvdHJqZXZhbmphTW9kYWwuc2hvd0Zvcm0oX3BhcmFtcyk7ICAgICBcclxuICAgIH0pOyAgICAgXHJcblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWZyZXNoSHRtbEF0dGFjaG1lbnQoaHRtbEVsZW1lbnQ6c3RyaW5nKXtcclxuICAgICQoXCIjbGlrdkNvbmZpcm1hdGlvbnNBdHRhY2htZW50XCIpLmh0bWwoaHRtbEVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZnJlc2hBdHRhY2htZW50IChkb2NJRDpzdHJpbmcsIHByZXZpZXc6IGJvb2xlYW4gKTp2b2lkIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgX3BhcmFtcyA9IHsgZG9jdW1lbnRJRDogZG9jSUQsIGRvY3VtZW50UHJldmlldzogcHJldmlldyB9O1xyXG4gICAgbGV0IF9zYW9wU2VydmljZXNDb3JlID0gIG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcblxyXG4gICAgX3Nhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24ocmVzcG9uc2Upe1xyXG4gICAgICBfdGhpcy5yZWZyZXNoSHRtbEF0dGFjaG1lbnQocmVzcG9uc2UpO1xyXG4gICAgfTtcclxuICAgIF9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgIGFjdGlvbjpcIkxpa3ZDb25maXJtYXRpb25zL1JlZnJlc2hBdHRhY2htZW50XCIgXHJcbiAgICAgICAgLGRhdGE6IF9wYXJhbXNcclxuICAgICAgICAsdHlwZTpcIkdFVFwiXHJcbiAgICB9KTsgICAgXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgTW92ZVRvTmV4dCAoKTp2b2lke1xyXG5cclxuICB9XHJcblxyXG4gIHB1YmxpYyBNb3ZlVG9QcmV2aW91cyAoKTp2b2lke1xyXG5cclxuICB9XHJcblxyXG4gIHB1YmxpYyBDb25maXJtQW5kTW92ZVRvTmV4dChpZFZyc3RlOnN0cmluZywgaWQ6c3RyaW5nLCBrb21lbnRhcjogc3RyaW5nLCBpZEFrY2lqZTogc3RyaW5nKTp2b2lke1xyXG5cclxuICB9XHJcblxyXG4gIHB1YmxpYyBEZW55QW5kTW92ZVRvTmV4dChpZFZyc3RlOnN0cmluZywgaWQ6c3RyaW5nLCBrb21lbnRhcjogc3RyaW5nLCBpZEFrY2lqZTogc3RyaW5nKTp2b2lke1xyXG5cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0VGl0bGVDc3MoKTogdm9pZCB7XHJcbiAgICAvLyBzYW1vIGNlIGplIG1vYmlsZSwgc2Ugem1hbmpzYSB2ZWxpa29zdCBuYXNsb3ZhIGVkaXQgZm9ybWVcclxuICAgIGlmICh0aGlzLmlzTW9iaWxlVmlldygpKSB7XHJcbiAgICAgIGxldCB0aXRsZUVsZW1lbnQgPSAkKHRoaXMuX3ZpZXdJZCArIFwiIC5tb2RhbC10aXRsZVwiKTtcclxuICAgICAgdGl0bGVFbGVtZW50LnJlbW92ZUNsYXNzKFwic2FvcC10eHQtMVwiKTtcclxuICAgICAgdGl0bGVFbGVtZW50LmFkZENsYXNzKFwic2FvcC10eHQtM1wiKTtcclxuICAgICAgdGl0bGVFbGVtZW50LmFkZENsYXNzKFwiYWxpZ24tc2VsZi1jZW50ZXJcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzTW9iaWxlVmlldygpOiBib29sZWFuIHtcclxuICAgIGxldCBpc01vYmlsZSA9ICQodGhpcy5fdmlld0lkICsgXCIgI21vYmlsZUJ1dHRvbnNcIikuY3NzKFwiZGlzcGxheVwiKSAhPSBcIm5vbmVcIjtcclxuXHJcbiAgICByZXR1cm4gaXNNb2JpbGU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVuYWJsZU1vYmlsZUtvbWVudGFyKCk6IHZvaWQge1xyXG4gICAgLy8gcG8gZGVmYXVsdHUgamUgbW9iaWxlIGtvbWVudGFyIHRleHQgYXJlYSBrb250cm9sYSBkaXNhYmxlZCwgZGEgc2UgZm9ybSBuZSBwb21ha25lIG5hdnpkb2wgbmEgdGV4dCBhcmVhIGtvbnRyb2xhXHJcbiAgICAvLyBpbiBvc3RhbmUgbmEgdnJodSwgemF0byBnYSBtb3JhbW8gY2V6IG5la2FqIGNhc2EgZW5hYmxlZFxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAkKF90aGlzLl92aWV3SWQgKyBcIiAjbW9iaWxlS29tZW50YXJcIikucHJvcChcImRpc2FibGVkXCIsIGZhbHNlKTtcclxuICAgIH0sIDEwMDApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRBdHRhY2htZW50Q3NzKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNNb2JpbGVWaWV3KCkpIHtcclxuICAgICAgbGV0IGxpa3ZDb25maXJtYXRpb25zQXR0YWNobWVudEVsZW1lbnQgPSAkKHRoaXMuX3ZpZXdJZCArIFwiICNsaWt2Q29uZmlybWF0aW9uc0F0dGFjaG1lbnRcIik7XHJcbiAgICAgIGxpa3ZDb25maXJtYXRpb25zQXR0YWNobWVudEVsZW1lbnQuYWRkQ2xhc3MoXCJtb2JpbGUtbGlrdkNvbmZpcm1hdGlvbnNBdHRhY2htZW50XCIpO1xyXG4gIFxyXG4gICAgICBsZXQgbGlrdkNvbmZpcm1hdGlvbnNBdHRhY2htZW50Um93RWxlbWVudCA9ICQodGhpcy5fdmlld0lkICsgXCIgI2xpa3ZDb25maXJtYXRpb25zQXR0YWNobWVudFJvd1wiKTtcclxuICAgICAgbGV0IGF0dGFjaG1lbnRSb3dDc3MgPSBcIm1vYmlsZS1saWt2Q29uZmlybWF0aW9uc0F0dGFjaG1lbnRSb3dcIjtcclxuICAgICAgaWYgKGxpa3ZDb25maXJtYXRpb25zQXR0YWNobWVudEVsZW1lbnQubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgIGF0dGFjaG1lbnRSb3dDc3MgPSBcIm1vYmlsZS1saWt2Q29uZmlybWF0aW9uc05vQXR0YWNobWVudFJvd1wiO1xyXG4gICAgICB9XHJcbiAgICAgIGxpa3ZDb25maXJtYXRpb25zQXR0YWNobWVudFJvd0VsZW1lbnQuYWRkQ2xhc3MoYXR0YWNobWVudFJvd0Nzcyk7XHJcblxyXG4gICAgICBsZXQgbGlrdkNvbmZpcm1hdGlvbnNOb0F0dGFjaG1lbnQgPSAkKHRoaXMuX3ZpZXdJZCArIFwiICNsaWt2Q29uZmlybWF0aW9uc05vQXR0YWNobWVudFwiKTtcclxuICAgICAgbGlrdkNvbmZpcm1hdGlvbnNOb0F0dGFjaG1lbnQuYWRkQ2xhc3MoXCJtb2JpbGUtbGlrdkNvbmZpcm1hdGlvbnNOb0F0dGFjaG1lbnRcIik7XHJcblxyXG4gICAgICBsZXQgX21vZGFsSGVhZGVyID0gJChcIi5tb2RhbC1oZWFkZXJcIik7XHJcbiAgICAgIF9tb2RhbEhlYWRlci5jc3MoXCJoZWlnaHRcIixcIjIwcHhcIik7XHJcbiAgICAgIF9tb2RhbEhlYWRlci5jc3MoXCJwYWRkaW5nXCIsXCIyMHB4IDIwcHggMjBweCAyMHB4XCIpOyAgICAgICBcclxuICAgICAgX21vZGFsSGVhZGVyLmZpbmQoXCIubW9kYWwtdGl0bGVcIikuY3NzKFwiZm9udC1zaXplXCIsXCIxNHB4XCIpO1xyXG4gICAgICBfbW9kYWxIZWFkZXIuZmluZChcIi5tb2RhbC10aXRsZVwiKS5jc3MoXCJsaW5lLWhlaWdodFwiLFwiMjBweFwiKTtcclxuICAgICAgX21vZGFsSGVhZGVyLmZpbmQoXCIuY2xvc2VcIikuY3NzKFwicGFkZGluZ1wiLFwidW5zZXRcIik7XHJcbiAgICAgIC8vXHJcbiAgICAgIGxldCBfc2FvcEhvcml6b250YWxTY3JvbGxhYmxlID0gJChcIi5zYW9wLWhvcml6b250YWwtc2Nyb2xsYWJsZVwiKTtcclxuICAgICAgX3Nhb3BIb3Jpem9udGFsU2Nyb2xsYWJsZS5maW5kKFwiLnNhb3Atc2Nyb2xsLWNvbFwiKS5jc3MoXCJwYWRkaW5nLXRvcFwiLFwiN3B4XCIpO1xyXG4gICAgICAvL1xyXG4gICAgICAvLyQodGhpcy5fdmlld0lkICsgXCIgLnNhb3AtY29udHJvbC1saXN0Qm94LXdpZGVyIFwiKS5jc3MoXCJoZWlnaHRcIixcIjQ1cHhcIik7XHJcbiAgICAgICQodGhpcy5fdmlld0lkICsgXCIgI0VkaXRJbmZvRG9jIC5zYW9wLW1vZGFsLXJvdyBcIikuY3NzKFwicGFkZGluZy10b3BcIixcIjVweFwiKTtcclxuICAgICAgJCh0aGlzLl92aWV3SWQgKyBcIiAubW9kYWwtZm9vdGVyLWJ1dHRvbnMgXCIpLmNzcyhcInBhZGRpbmdcIixcIjVweCA1cHggNXB4IDVweFwiKTsgXHJcbiAgICAgICQodGhpcy5fdmlld0lkICsgXCIgLnNhb3AtZWRpdC1mb3JtLXBhbmVsLWhlYWRpbmcgXCIpLmNzcyhcInBhZGRpbmctdG9wXCIsXCI3cHhcIik7IFxyXG4gICAgICAvLyBcclxuICAgICAgJCh0aGlzLl92aWV3SWQgKyBcIiAjYXR0YWNobWVudHNNYWluRGl2XCIpLmNzcyhcInBhZGRpbmctbGVmdFwiLFwiMHB4XCIpO1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNsb3NlVmlldygpOnZvaWQge1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIkxJS1ZDYWthbG5hVnJzdGFWaWV3Lm9uQ2xvc2VWaWV3XCIpO1xyXG4gICAgJChcIi5wZGYtdmlldy1jb250YWluZXJcIikucmVtb3ZlKCk7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsImltcG9ydCB7IGdsb2JhbCwgc2V0TW9kYWxGb3JtWkluZGV4LCBpc1VuRGVmaW5lZCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFdlYkdyaWQsU2FvcFdlYkdyaWRQcm9wZXJ0aWVzLFNhb3BXZWJHcmlkVG9vbGJhcixTYW9wV2ViR3JpZFRvb2xiYXJCdXR0b24sU2FvcFdlYkRhdGFUYWJsZX0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC1ncmlkXCI7XHJcbmltcG9ydCB7IFNhb3BTZXJ2aWNlc0NvcmUgfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXNlcnZpY2VzLWNvcmVcIjtcclxuaW1wb3J0IHsgTElLVkNha2FsbmFWcnN0YVZpZXcgfSBmcm9tIFwiLi9MSUtWQ2FrYWxuYVZyc3RhLXZpZXdcIjtcclxuaW1wb3J0IHsgU2FvcFdmQWN0aW9uIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC12aWV3LWZvcm1cIjtcclxuaW1wb3J0IHsgU2FvcE11bHRpc2VsZWN0IH0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC1tdWx0aXNlbGVjdFwiO1xyXG5pbXBvcnQgeyBTYW9wUG9wb3ZlciB9IGZyb20gXCIuLi9Db21wb25lbnRzL3Nhb3AtcG9wb3ZlclwiO1xyXG5pbXBvcnQgeyBEYXRhVGFibGVzIH0gZnJvbSBcIi4uL0B0eXBlcy9kYXRhLXRhYmxlcy90eXBlc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIExJS1ZDYWthbG5hVnJzdGFBcmhpdkdyaWQge1xyXG4gICAgcHJpdmF0ZSBsaWJOYW1lOnN0cmluZztcclxuICAgIHByaXZhdGUgX3Nhb3BTZXJ2aWNlc0NvcmU6IFNhb3BTZXJ2aWNlc0NvcmU7XHJcbiAgICBwcml2YXRlIF9tYWluRm9ybURpdjpKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gICAgcHJpdmF0ZSBfc2VhcmNoVmFsdWU6SlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIHByaXZhdGUgX3NlbGVjdGVkUm93Tm86bnVtYmVyO1xyXG4gIFxyXG4gICAgLy9cclxuICAgIHB1YmxpYyB3ZWJHcmlkMTpTYW9wV2ViR3JpZDtcclxuICAgIHB1YmxpYyBfTElLVkNha2FsbmFWcnN0YVZpZXc6TElLVkNha2FsbmFWcnN0YVZpZXc7XHJcbiAgICBwcml2YXRlIF92cnN0YURva3VtZW50YTogU2FvcE11bHRpc2VsZWN0OyAgXHJcbiAgICBwcml2YXRlIF92cnN0YURva3VtZW50YURpdklkOiBzdHJpbmc7ICAgICBcclxuICAgIHByaXZhdGUgX3Zyc3RhRG9rdW1lbnRhTW9iaWxlOiBTYW9wTXVsdGlzZWxlY3Q7ICAgICBcclxuICAgIHByaXZhdGUgX2l6YnJhbmFWcnN0YURva3VtZW50YTogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfaXpicmFub0xldG86IG51bWJlcjsgXHJcbiAgICBwcml2YXRlIF9zdGF0dXNQb3RyamVuOiBCb29sZWFuO1xyXG4gICAgcHJpdmF0ZSBfc3RhdHVzWmF2cm5qZW46IEJvb2xlYW47IFxyXG4gICAgcHJpdmF0ZSBfc3RhdHVzQnJpc2FuOiBCb29sZWFuO1xyXG4gICAgcHJpdmF0ZSBfc2FvcFBvcG92ZXJGaWx0ZXI6IFNhb3BQb3BvdmVyOyAgICAgICAgIFxyXG4gICAgXHJcbiAgICBjb25zdHJ1Y3RvcihsaWJOYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmxpYk5hbWUgPSBsaWJOYW1lO1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy5fTElLVkNha2FsbmFWcnN0YVZpZXcgPSBuZXcgTElLVkNha2FsbmFWcnN0YVZpZXcoXCIjTElLVkNha2FsbmFWcnN0YVZpZXcwMDFcIix0aGlzLmxpYk5hbWUrXCIuX0xJS1ZDYWthbG5hVnJzdGFWaWV3XCIpO1xyXG4gICAgICAgIHRoaXMuX0xJS1ZDYWthbG5hVnJzdGFWaWV3LmZ1bGxTY3JlZW4gPSB0cnVlOyAgXHJcbiAgICAgICAgdGhpcy5fTElLVkNha2FsbmFWcnN0YVZpZXcuTW92ZVRvTmV4dCA9IHRoaXMuTW92ZVRvTmV4dEV4dC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuX0xJS1ZDYWthbG5hVnJzdGFWaWV3Lk1vdmVUb1ByZXZpb3VzID0gdGhpcy5Nb3ZlVG9QcmV2aW91c0V4dC5iaW5kKHRoaXMpOyAgICAgICAgXHJcbi8vICAgICAgICB0aGlzLl92cnN0YURva3VtZW50YURpdklkID0gXCIjVnJzdGFEb2t1bWVudGFEaXZcIjsgIFxyXG4gICAgICAgIHRoaXMuX2l6YnJhbm9MZXRvID0gMDsgICAgICBcclxuICAgICAgICB0aGlzLl9zdGF0dXNQb3RyamVuID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fc3RhdHVzWmF2cm5qZW4gPSBmYWxzZTsgXHJcbiAgICAgICAgdGhpcy5fc3RhdHVzQnJpc2FuID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fc2FvcFBvcG92ZXJGaWx0ZXIgPSBuZXcgU2FvcFBvcG92ZXIoKTtcclxuICAgICAgICB0aGlzLl9zYW9wUG9wb3ZlckZpbHRlci5hZnRlclBvcG92ZXJTaG93ID0gdGhpcy5hZnRlclBvcG92ZXJNb2JpbGVGaWx0ZXJTaG93LmJpbmQodGhpcyk7ICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgfSAgXHJcbiAgICAgIFxyXG4gICAgICBpbml0Vmlldygpe1xyXG4gICAgICAgIHRoaXMuX21haW5Gb3JtRGl2ID0gJChcIiNMSUtWQ2FrYWxuYVZyc3RhR3JpZEFyY2hpdmVCcm93c2VGb3JtXCIpO1xyXG4gICAgICAgIHRoaXMuaW5pdFdlYkdyaWQxKCk7XHJcbiAgICAgICAgdGhpcy5pbml0V2ViR3JpZDFMaXN0bmVycygpOyAgICBcclxuICAgICAgICB0aGlzLl9zZWFyY2hWYWx1ZSA9IHRoaXMuX21haW5Gb3JtRGl2LmZpbmQoXCIjU2VhcmNoVmFsdWVcIik7ICAgXHJcbiAgICAgICAgdGhpcy5pbml0RmlsdGVyQ29udHJvbHMoKTsgIFxyXG4vLyAgICAgICAgdGhpcy5pbml0VnJzdGFEb2t1bWVudGEoKTsgIFxyXG4gICAgICAgIHRoaXMuX3Nhb3BQb3BvdmVyRmlsdGVyLmJpbmRQb3BvdmVyRXZlbnRzKCk7ICBcclxuICAgICAgICB0aGlzLl9tYWluRm9ybURpdi5zaG93KCk7XHJcbiAgICAgIH0gICAgXHJcbiAgICAgIFxyXG4gICAgICBpbml0V2ViR3JpZDEoKXtcclxuICAgICAgICBsZXQgd2dJZCA9IFwiI0xJS1ZDYWthbG5hVnJzdGFHcmlkQXJjaGl2ZVwiO1xyXG4gICAgICAgIGxldCBjYXB0aW9uVG9vbGJhciA9ICQod2dJZCkuYXR0cihcImNhcHRpb24tdG9vbGJhclwiKTtcclxuICAgICAgICBsZXQgdG9vbGJhckl0ZW1zVGVtcGxhdGVJZCA9ICQod2dJZCkuYXR0cihcInRvb2xiYXItaXRlbXMtdGVtcGxhdGVJZFwiKTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMud2ViR3JpZDEgPSBuZXcgU2FvcFdlYkdyaWQodGhpcy5saWJOYW1lK1wiLndlYkdyaWQxXCIpO1xyXG4gICAgICAgIGxldCBncmlkUHJvcGVydGllczogU2FvcFdlYkdyaWRQcm9wZXJ0aWVzO1xyXG4gICAgICAgIGxldCBncmlkVG9vbGJhcjpTYW9wV2ViR3JpZFRvb2xiYXI7XHJcbiAgICAgICAgbGV0IHRvb2xiYXJCdXR0b25zOlNhb3BXZWJHcmlkVG9vbGJhckJ1dHRvbltdID0gW107XHJcbiAgICAgICAgbGV0IGRhdGFUYWJsZTpTYW9wV2ViRGF0YVRhYmxlO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgZ3JpZFRvb2xiYXIgPSB7aWQ6XCJzYW9wV2ViR3JpZFRCMVwiLGNhcHRpb246Y2FwdGlvblRvb2xiYXIsYnV0dG9uczp0b29sYmFyQnV0dG9ucyxpdGVtc1RlbXBsYXRlSWQ6dG9vbGJhckl0ZW1zVGVtcGxhdGVJZH07XHJcbiAgICAgICBcclxuICAgICAgICBkYXRhVGFibGUgPSB7IGVuYWJsZWQ6dHJ1ZSwgY29sU2V0dGluZ3M6dHJ1ZSB9O1xyXG4gICAgXHJcbiAgICAgICAgZ3JpZFByb3BlcnRpZXMgPSB7XHJcbiAgICAgICAgICAgIGdyaWRJZDp3Z0lkXHJcbiAgICAgICAgICAgICx0b2dnbGVQYW5lbDp7ZW5hYmxlZDpmYWxzZX1cclxuICAgICAgICAgICAgLHRvb2xiYXI6Z3JpZFRvb2xiYXJcclxuICAgICAgICAgICAgLGRhdGFUYWJsZTpkYXRhVGFibGVcclxuICAgICAgICAgIH07ICAgICAgICBcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMud2ViR3JpZDEuaW5pdChncmlkUHJvcGVydGllcyk7ICAgXHJcbiAgICAgICAgbGV0IF9TZWFyY2hWYWx1ZTIgPSAkKCcjY29sbGFwc2VzYW9wV2ViR3JpZFRCMScpLmZpbmQoJyNTZWFyY2hWYWx1ZTInKTtcclxuICAgICAgICBpZiAoX1NlYXJjaFZhbHVlMi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLl9pemJyYW5vTGV0byA9IF9TZWFyY2hWYWx1ZTIudmFsKCkgYXMgbnVtYmVyOyAgICBcclxuICAgICAgICB9IFxyXG4gICAgICAgIGxldCBfYXBwbGljYXRpb25GaWx0ZXIgPSB0aGlzLl9tYWluRm9ybURpdi5maW5kKFwiI0FwcGxpY2F0aW9uRmlsdGVyXCIpOyBcclxuICAgICAgICBpZiAoX2FwcGxpY2F0aW9uRmlsdGVyLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHRoaXMuX2l6YnJhbmFWcnN0YURva3VtZW50YSA9IF9hcHBsaWNhdGlvbkZpbHRlci52YWwoKSBhcyBzdHJpbmc7ICAgIFxyXG4gICAgICAgIH0gIFxyXG5cclxuICAgICAgICAgICQod2dJZCArIFwiX3dyYXBwZXJcIikuY3NzKCdtYXgtaGVpZ2h0JywgJ2NhbGMoMTAwdmggLSAzNTBweCknKTtcclxuICAgICAgfSBcclxuICAgICAgXHJcbiAgICAgIHB1YmxpYyBNb3ZlVG9OZXh0RXh0ICgpOnZvaWR7XHJcbiAgICAgICAgbGV0IF9yb3cgPSAkKCcjTElLVkNha2FsbmFWcnN0YUdyaWRBcmNoaXZlID4gdGJvZHkgPiB0cicpLmVxKHRoaXMuX3NlbGVjdGVkUm93Tm8gKyAxKTsgLy8gaGVyZSB3ZSBleHRyYXBvbGF0ZSB0aGUgcm93IGRhdGEgb2Ygc2VsZWN0ZWQgaW5kZXhcclxuICAgICAgICBpZiAoX3Jvdy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd05vID0gdGhpcy5fc2VsZWN0ZWRSb3dObyArIDE7IC8vIGhlcmUgd2UgaW5jcmVhc2UgdGhlIGluZGV4IG9mIHRoZSBzZWxlY3RlZCByb3dcclxuICAgICAgICAgIC8vXHJcbiAgICAgICAgICBsZXQgX2lkVnJzdGUgPSBfcm93LmF0dHIoXCJkYXRhLWlkdnJzdGVcIik7XHJcbiAgICAgICAgICBsZXQgX2lkID0gX3Jvdy5hdHRyKFwiZGF0YS1pZFwiKTsgXHJcbiAgICAgICAgICBsZXQgX3Zyc3RhRG9rdW1lbnRhID0gX3Jvdy5hdHRyKFwiZGF0YS12cnN0YWRva3VtZW50YVwiKTtcclxuICAgICAgICAgIGxldCBfZG9rdW1lbnQgPSBfcm93LmF0dHIoXCJkYXRhLWRva3VtZW50XCIpO1xyXG4gICAgICAgICAgLy9cclxuICAgICAgICAgIC8vIGJhcnZhbmplIG96bmFjZW5lIHZyc3RyaWNlXHJcbiAgICAgICAgICB0aGlzLndlYkdyaWQxLm1hcmtTZWxlY3RlZFJvdyg8SFRNTEVsZW1lbnQ+KF9yb3cpWzBdKTtcclxuICAgICAgICAgIHRoaXMuZWRpdFJlY29yZChfdnJzdGFEb2t1bWVudGEsX2Rva3VtZW50LF9pZFZyc3RlLF9pZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBwdWJsaWMgTW92ZVRvUHJldmlvdXNFeHQgKCk6dm9pZHtcclxuICAgICAgICBsZXQgX3JvdyA9ICQoJyNMSUtWQ2FrYWxuYVZyc3RhR3JpZEFyY2hpdmUgPiB0Ym9keSA+IHRyJykuZXEodGhpcy5fc2VsZWN0ZWRSb3dObyAtIDEpOyAvLyBoZXJlIHdlIGV4dHJhcG9sYXRlIHRoZSByb3cgZGF0YSBvZiBzZWxlY3RlZCBpbmRleFxyXG4gICAgICAgIGlmIChfcm93Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHRoaXMuX3NlbGVjdGVkUm93Tm8gPSB0aGlzLl9zZWxlY3RlZFJvd05vIC0gMTsgLy8gaGVyZSB3ZSBkZWNyZWFzZSB0aGUgaW5kZXggb2YgdGhlIHNlbGVjdGVkIHJvd1xyXG4gICAgICAgICAgLy9cclxuICAgICAgICAgIGxldCBfaWRWcnN0ZSA9IF9yb3cuYXR0cihcImRhdGEtaWR2cnN0ZVwiKTtcclxuICAgICAgICAgIGxldCBfaWQgPSBfcm93LmF0dHIoXCJkYXRhLWlkXCIpOyBcclxuICAgICAgICAgIGxldCBfdnJzdGFEb2t1bWVudGEgPSBfcm93LmF0dHIoXCJkYXRhLXZyc3RhZG9rdW1lbnRhXCIpO1xyXG4gICAgICAgICAgbGV0IF9kb2t1bWVudCA9IF9yb3cuYXR0cihcImRhdGEtZG9rdW1lbnRcIik7XHJcbiAgICAgICAgICAvL1xyXG4gICAgICAgICAgLy8gYmFydmFuamUgb3puYWNlbmUgdnJzdHJpY2VcclxuICAgICAgICAgIHRoaXMud2ViR3JpZDEubWFya1NlbGVjdGVkUm93KDxIVE1MRWxlbWVudD4oX3JvdylbMF0pO1xyXG4gICAgICAgICAgdGhpcy5lZGl0UmVjb3JkKF92cnN0YURva3VtZW50YSxfZG9rdW1lbnQsX2lkVnJzdGUsX2lkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICBpbml0V2ViR3JpZDFMaXN0bmVycygpIHtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIGxldCBfU2VhcmNoVmFsdWUyID0gJCgnI2NvbGxhcHNlc2FvcFdlYkdyaWRUQjEnKS5maW5kKCcjU2VhcmNoVmFsdWUyJyk7XHJcbiAgICAgICAgaWYgKF9TZWFyY2hWYWx1ZTIubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBfU2VhcmNoVmFsdWUyLm9mZihcImNoYW5nZVwiKTtcclxuICAgICAgICAgICAgX1NlYXJjaFZhbHVlMi5vbihcImNoYW5nZVwiLCBfdGhpcy5vblNlYXJjaFZhbHVlMkNoYW5nZS5iaW5kKF90aGlzKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgX2FwcGxpY2F0aW9uRmlsdGVyID0gdGhpcy5fbWFpbkZvcm1EaXYuZmluZChcIiNBcHBsaWNhdGlvbkZpbHRlclwiKTtcclxuICAgICAgICBpZiAoX2FwcGxpY2F0aW9uRmlsdGVyLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgX2FwcGxpY2F0aW9uRmlsdGVyLm9mZihcImNoYW5nZVwiKTtcclxuICAgICAgICAgICAgX2FwcGxpY2F0aW9uRmlsdGVyLm9uKFwiY2hhbmdlXCIsIF90aGlzLm9uQXBwbGljYXRpb25GaWx0ZXJDaGFuZ2UuYmluZChfdGhpcykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IF9zdGF0UG90cmplbiA9ICQoJyNjb2xsYXBzZXNhb3BXZWJHcmlkVEIxJykuZmluZCgnI3N0YXR1c1BvdHJqZW4nKTtcclxuICAgICAgICBpZiAoX3N0YXRQb3RyamVuLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgX3N0YXRQb3RyamVuLm9mZihcImNoYW5nZVwiKTtcclxuICAgICAgICAgICAgX3N0YXRQb3RyamVuLm9uKFwiY2hhbmdlXCIsIF90aGlzLm9uU3RhdHVzUG90cmplbkNoYW5nZS5iaW5kKF90aGlzKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgX3N0YXRaYXZybmplbiA9ICQoJyNjb2xsYXBzZXNhb3BXZWJHcmlkVEIxJykuZmluZCgnI3N0YXR1c1phdnJuamVuJyk7XHJcbiAgICAgICAgaWYgKF9zdGF0WmF2cm5qZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBfc3RhdFphdnJuamVuLm9mZihcImNoYW5nZVwiKTtcclxuICAgICAgICAgICAgX3N0YXRaYXZybmplbi5vbihcImNoYW5nZVwiLCBfdGhpcy5vblN0YXR1c1phdnJuamVuQ2hhbmdlLmJpbmQoX3RoaXMpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBfc3RhdEJyaXNhbiA9ICQoJyNjb2xsYXBzZXNhb3BXZWJHcmlkVEIxJykuZmluZCgnI3N0YXR1c0JyaXNhbicpO1xyXG4gICAgICAgIGlmIChfc3RhdEJyaXNhbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIF9zdGF0QnJpc2FuLm9mZihcImNoYW5nZVwiKTtcclxuICAgICAgICAgICAgX3N0YXRCcmlzYW4ub24oXCJjaGFuZ2VcIiwgX3RoaXMub25TdGF0dXNCcmlzYW5DaGFuZ2UuYmluZChfdGhpcykpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICQoXCJib2R5XCIpLm9mZihcImNsaWNrXCIsIFwiI0xJS1ZDYWthbG5hVnJzdGFHcmlkQXJjaGl2ZSB0ZDpub3QoLnRkLWFjdGlvbilcIik7XHJcbiAgICAgICAgJChcImJvZHlcIikub24oXCJjbGlja1wiLCBcIiNMSUtWQ2FrYWxuYVZyc3RhR3JpZEFyY2hpdmUgdGQ6bm90KC50ZC1hY3Rpb24pXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgbGV0IF9pID0gJCh0aGlzKS5jbG9zZXN0KCd0cicpLmluZGV4KCk7XHJcbiAgICAgICAgICAgIF90aGlzLl9zZWxlY3RlZFJvd05vID0gX2k7IC8vIGhlcmUgd2Ugc3RvcmUgdGhlIElEIG9mIHRoZSBjdXJyZW50IHJvd1xyXG4gICAgICAgICAgICB2YXIgZGF0YSA9ICQodGhpcykuY2xvc2VzdChcInRyXCIpO1xyXG4gICAgICAgICAgICBsZXQgX2lkVnJzdGUgPSBkYXRhLmF0dHIoXCJkYXRhLUlEVnJzdGVcIik7XHJcbiAgICAgICAgICAgIGxldCBfaWQgPSBkYXRhLmF0dHIoXCJkYXRhLUlEXCIpO1xyXG4gICAgICAgICAgICBsZXQgX3Zyc3RhRG9rdW1lbnRhID0gZGF0YS5hdHRyKFwiZGF0YS12cnN0YWRva3VtZW50YVwiKTtcclxuICAgICAgICAgICAgbGV0IF9kb2t1bWVudCA9IGRhdGEuYXR0cihcImRhdGEtZG9rdW1lbnRcIik7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWlzVW5EZWZpbmVkKF9pZFZyc3RlKSAmJiAhaXNVbkRlZmluZWQoX2lkKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gYmFydmFuamUgb3puYWNlbmUgdnJzdHJpY2VcclxuICAgICAgICAgICAgICAgIF90aGlzLndlYkdyaWQxLm1hcmtTZWxlY3RlZFJvdyg8SFRNTEVsZW1lbnQ+KGRhdGEpWzBdKTtcclxuXHJcbiAgICAgICAgICAgICAgICBfdGhpcy5lZGl0UmVjb3JkKF92cnN0YURva3VtZW50YSwgX2Rva3VtZW50LCBfaWRWcnN0ZSwgX2lkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvL1xyXG4gICAgfSAgICBcclxuICAgICAgXHJcbiAgICAgIHJlZnJlc2hEYXRhKGh0bWxDb250ZW50OnN0cmluZyl7XHJcbiAgICAgICAgdGhpcy53ZWJHcmlkMS5yZXBsYWNlR3JpZFJvd3MoaHRtbENvbnRlbnQpO1xyXG4gICAgICAgIHRoaXMuaW5pdFdlYkdyaWQxTGlzdG5lcnMoKTtcclxuICAgICAgfVxyXG5cclxuICAgIHJlZnJlc2hHcmlkRGF0YSh5ZWFyOiBudW1iZXIsIGFwcGxpY2F0aW9uQ29kZTogc3RyaW5nID0gXCJcIiwgYXJjaGl2ZTogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTElLVkNha2FsbmFWcnN0YUdyaWRBcmNoaXZlLnJlZnJlc2hSb3dzOlwiKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICAgICAgbGV0IF9zdGF0dXNGaWx0ZXIgPSAxMTE7XHJcbiAgICAgICAgaWYgKHRoaXMuX3N0YXR1c1BvdHJqZW4pXHJcbiAgICAgICAgICAgIF9zdGF0dXNGaWx0ZXIgPSBfc3RhdHVzRmlsdGVyICsgMTAwO1xyXG4gICAgICAgIGlmICh0aGlzLl9zdGF0dXNaYXZybmplbiA9PSB0cnVlKVxyXG4gICAgICAgICAgICBfc3RhdHVzRmlsdGVyID0gX3N0YXR1c0ZpbHRlciArIDEwO1xyXG4gICAgICAgIGlmICh0aGlzLl9zdGF0dXNCcmlzYW4gPT0gdHJ1ZSlcclxuICAgICAgICAgICAgX3N0YXR1c0ZpbHRlciA9IF9zdGF0dXNGaWx0ZXIgKyAxO1xyXG4gICAgICAgIGxldCBwYXJhbXMgPSB7IHllYXI6IHllYXIsIGFwcGxpY2F0aW9uQ29kZTogYXBwbGljYXRpb25Db2RlLCBhcmNoaXZlOiBhcmNoaXZlLCBzdGF0dXNGaWx0ZXI6IF9zdGF0dXNGaWx0ZXIgfTtcclxuXHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgX3RoaXMucmVmcmVzaERhdGEocmVzcG9uc2UpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOiBcIkxpa3ZDb25maXJtYXRpb25zL0luZGV4QXJjaGl2ZVwiXHJcbiAgICAgICAgICAgICwgZGF0YTogcGFyYW1zXHJcbiAgICAgICAgICAgICwgdHlwZTogXCJHRVRcIlxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGVkaXRSZWNvcmQoX3Zyc3RhRG9rdW1lbnRhOnN0cmluZyxfZG9rdW1lbnQ6IHN0cmluZyxfaWRWcnN0ZTpzdHJpbmcsX2lkOnN0cmluZyl7XHJcbiAgICAgIGxldCBfZnVsbFRpdGxlID0gdGhpcy5fTElLVkNha2FsbmFWcnN0YVZpZXcudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIlBvdHJqZXZhbmplXCIpICsgXCI6IFwiICsgX3Zyc3RhRG9rdW1lbnRhICsgXCIgXCIgKyBfZG9rdW1lbnQ7XHJcbiAgICAgIHRoaXMuX0xJS1ZDYWthbG5hVnJzdGFWaWV3LmZ1bGxUaXRsZSA9IF9mdWxsVGl0bGU7XHJcbiAgICAgIHRoaXMuX0xJS1ZDYWthbG5hVnJzdGFWaWV3LnNob3dWaWV3Rm9ybShTYW9wV2ZBY3Rpb24ud2ZhRWRpdFJlY29yZCx7IHF1ZXVlSWQ6IF9pZFZyc3RlLCB0aHJlZUlkOiBfaWQsIGFyY2hpdmU6IHRydWUsIGZ1bGxWaWV3OiB0cnVlIH0pOyAgICAgXHJcbiAgICB9ICAgXHJcbiAgXHJcbiAgICBpbml0RmlsdGVyQ29udHJvbHMoKTogdm9pZCB7XHJcbiAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgIHRoaXMuX3NlYXJjaFZhbHVlLmtleXVwKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIGxldCBvVGFibGUgPSBfdGhpcy53ZWJHcmlkMS5kYXRhVGFibGU7XHJcbiAgICAgICAgICBvVGFibGUuc2VhcmNoKCQodGhpcykudmFsKCkudG9TdHJpbmcoKSkuZHJhdygpIDsgICAgICAgICAgIFxyXG4gICAgICB9KTsgICAgXHJcbiAgICB9XHJcblxyXG4gICAgLy8gaW5pdFZyc3RhRG9rdW1lbnRhKCk6IHZvaWQge1xyXG4gICAgLy8gICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTElLVkNha2FsbmFWcnN0YVZpZXcuaW5pdFZyc3RhRG9rdW1lbnRhXCIpO1xyXG4gIFxyXG4gICAgLy8gICB0aGlzLl92cnN0YURva3VtZW50YSA9IG5ldyBTYW9wTXVsdGlzZWxlY3QoKTtcclxuICAgIC8vICAgdGhpcy5fdnJzdGFEb2t1bWVudGEuYWZ0ZXJDaGFuZ2VDb21tb25FdmVudCA9IHRoaXMuZmlsdGVyVnJzdGFEb2t1bWVudGEuYmluZCh0aGlzKTtcclxuICAgIC8vICAgLy8gaW5pdCB6YSBtZXRvZG8gXCJhZnRlckNoYW5nZUNvbW1vbkV2ZW50XCIsIGRhIHNlIMW+ZSB2IFwiX3Zyc3RhRG9rdW1lbnRhLmluaXRcIiBtZXRvZGkgc3Byb3ppIGZpbHRlclZyc3RhRG9rdW1lbnRhXHJcbiAgICAvLyAgIHRoaXMuX3Zyc3RhRG9rdW1lbnRhLmluaXQoXCIjVnJzdGFEb2t1bWVudGFGaWx0ZXJcIiwgXCJWcnN0YSBkb2t1bWVudGFcIik7XHJcbiAgICAvLyAgIC8vIHByaWthemVtbyBzZWxlY3QgZGl2XHJcbiAgICAvLyAgICQodGhpcy5fdnJzdGFEb2t1bWVudGFEaXZJZCkuc2hvdygpO1xyXG4gICAgLy8gfVxyXG4gIFxyXG4gICAgLy8gZmlsdGVyVnJzdGFEb2t1bWVudGEoZWxlbWVudDogYW55KSB7XHJcbiAgICAvLyAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJMSUtWQ2FrYWxuYVZyc3RhVmlldy5maWx0ZXJWcnN0YURva3VtZW50YVwiKTtcclxuICBcclxuICAgIC8vICAgLy8gcHJlYmVyZW1vLCBrYXRlcmUgc2lmcmUgemFwb3NsZW5paCBzb2Rpam8gdiBpemJyYW5lIHNrdXBpbmVcclxuICAgIC8vICAgdGhpcy5faXpicmFuYVZyc3RhRG9rdW1lbnRhID0gPHN0cmluZz4oZWxlbWVudC52YWwoKS50b1N0cmluZygpKTtcclxuICBcclxuICAgIC8vICAgdGhpcy5yZWZyZXNoR3JpZERhdGEodGhpcy5faXpicmFub0xldG8sIHRoaXMuX2l6YnJhbmFWcnN0YURva3VtZW50YSk7XHJcbiAgICAvLyB9ICBcclxuXHJcbiAgICBvblNlYXJjaFZhbHVlMkNoYW5nZShlOmFueSk6dm9pZHtcclxuICAgICAgbGV0IF9TZWFyY2hWYWx1ZTIgPSAkKCcjY29sbGFwc2VzYW9wV2ViR3JpZFRCMScpLmZpbmQoJyNTZWFyY2hWYWx1ZTInKTtcclxuICAgICAgaWYgKF9TZWFyY2hWYWx1ZTIubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMuX2l6YnJhbm9MZXRvID0gX1NlYXJjaFZhbHVlMi52YWwoKSBhcyBudW1iZXI7XHJcbiAgICAgIH0gICAgICBcclxuICAgICAgdGhpcy5yZWZyZXNoR3JpZERhdGEodGhpcy5faXpicmFub0xldG8sIHRoaXMuX2l6YnJhbmFWcnN0YURva3VtZW50YSk7XHJcbiAgICB9ICBcclxuXHJcbiAgICBvbkFwcGxpY2F0aW9uRmlsdGVyQ2hhbmdlKGU6YW55KTp2b2lke1xyXG4gICAgICBsZXQgX2FwcGxpY2F0aW9uRmlsdGVyID0gdGhpcy5fbWFpbkZvcm1EaXYuZmluZChcIiNBcHBsaWNhdGlvbkZpbHRlclwiKTtcclxuICAgICAgaWYgKF9hcHBsaWNhdGlvbkZpbHRlci5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5faXpicmFuYVZyc3RhRG9rdW1lbnRhID0gX2FwcGxpY2F0aW9uRmlsdGVyLnZhbCgpIGFzIHN0cmluZztcclxuICAgICAgICBpZiAodGhpcy5faXpicmFuYVZyc3RhRG9rdW1lbnRhID09IFwiP1wiIClcclxuICAgICAgICAgIHRoaXMuX2l6YnJhbmFWcnN0YURva3VtZW50YSA9IFwiXCI7XHJcbiAgICAgIH0gICAgICBcclxuICAgICAgdGhpcy5yZWZyZXNoR3JpZERhdGEodGhpcy5faXpicmFub0xldG8sIHRoaXMuX2l6YnJhbmFWcnN0YURva3VtZW50YSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25TdGF0dXNQb3RyamVuQ2hhbmdlKGU6YW55KTp2b2lke1xyXG4gICAgICB0aGlzLl9zdGF0dXNQb3RyamVuID0gZmFsc2U7XHJcbiAgICAgIGxldCBfc3RhdFBvdHJqZW4gPSAkKCcjY29sbGFwc2VzYW9wV2ViR3JpZFRCMScpLmZpbmQoJyNzdGF0dXNQb3RyamVuJyk7XHJcbiAgICAgIGlmIChfc3RhdFBvdHJqZW4uaXMoXCI6Y2hlY2tlZFwiKSl7ICBcclxuICAgICAgICB0aGlzLl9zdGF0dXNQb3RyamVuID0gX3N0YXRQb3RyamVuLmlzKFwiOmNoZWNrZWRcIik7XHJcbiAgICAgIH0gICAgICBcclxuICAgICAgdGhpcy5yZWZyZXNoR3JpZERhdGEodGhpcy5faXpicmFub0xldG8sIHRoaXMuX2l6YnJhbmFWcnN0YURva3VtZW50YSk7XHJcbiAgICB9ICBcclxuXHJcbiAgICBvblN0YXR1c1phdnJuamVuQ2hhbmdlKGU6YW55KTp2b2lke1xyXG4gICAgICB0aGlzLl9zdGF0dXNaYXZybmplbiA9IGZhbHNlO1xyXG4gICAgICBsZXQgX3N0YXRaYXZybmplbiA9ICQoJyNjb2xsYXBzZXNhb3BXZWJHcmlkVEIxJykuZmluZCgnI3N0YXR1c1phdnJuamVuJyk7XHJcbiAgICAgIGlmIChfc3RhdFphdnJuamVuLmlzKFwiOmNoZWNrZWRcIikpeyAgXHJcbiAgICAgICAgdGhpcy5fc3RhdHVzWmF2cm5qZW4gPSBfc3RhdFphdnJuamVuLmlzKFwiOmNoZWNrZWRcIik7XHJcbiAgICAgIH0gICAgICBcclxuICAgICAgdGhpcy5yZWZyZXNoR3JpZERhdGEodGhpcy5faXpicmFub0xldG8sIHRoaXMuX2l6YnJhbmFWcnN0YURva3VtZW50YSk7XHJcbiAgICB9IFxyXG5cclxuICAgIG9uU3RhdHVzQnJpc2FuQ2hhbmdlKGU6YW55KTp2b2lke1xyXG4gICAgICB0aGlzLl9zdGF0dXNCcmlzYW4gPSBmYWxzZTtcclxuICAgICAgbGV0IF9zdGF0QnJpc2FuID0gJCgnI2NvbGxhcHNlc2FvcFdlYkdyaWRUQjEnKS5maW5kKCcjc3RhdHVzQnJpc2FuJyk7XHJcbiAgICAgIGlmIChfc3RhdEJyaXNhbi5pcyhcIjpjaGVja2VkXCIpKXsgIFxyXG4gICAgICAgIHRoaXMuX3N0YXR1c0JyaXNhbiA9IF9zdGF0QnJpc2FuLmlzKFwiOmNoZWNrZWRcIik7XHJcbiAgICAgIH0gICAgICBcclxuICAgICAgdGhpcy5yZWZyZXNoR3JpZERhdGEodGhpcy5faXpicmFub0xldG8sIHRoaXMuX2l6YnJhbmFWcnN0YURva3VtZW50YSwgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGFmdGVyUG9wb3Zlck1vYmlsZUZpbHRlclNob3coZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIkxJS1ZDYWthbG5hVnJzdGFWaWV3LmFmdGVyUG9wb3Zlck1vYmlsZUZpbHRlclNob3dcIik7XHJcblxyXG4gICAgICBsZXQgYXRyQ29udGVudCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1wb3BvdmVyLWNvbnRlbnRcIik7XHJcbiAgICAgIC8vIHByZXZlcmltbyDEjWUgamUgcG9wdXAgbGlrdiBmaWx0ZXJcclxuICAgICAgaWYgKGF0ckNvbnRlbnQgPT09IFwiI3BvcE92ZXJMaWt2RmlsdGVyXCIpIHtcclxuXHJcbiAgICAgICAgICAvLyB0aGlzLl92cnN0YURva3VtZW50YU1vYmlsZSA9IG5ldyBTYW9wTXVsdGlzZWxlY3QoKTtcclxuICAgICAgICAgIC8vIHRoaXMuX3Zyc3RhRG9rdW1lbnRhTW9iaWxlLmluaXQoXCJkaXYucG9wb3Zlci5zaG93ICNWcnN0YURva3VtZW50YUZpbHRlck1vYmlsZVwiLCBcIlZyc3RhIGRva3VtZW50YVwiKTtcclxuICAgICAgICAgIC8vIC8vIG1ldG9kYSB0aGlzLnNldFNlbGVjdFNrdXBpbmFNb2JpbGVGaWx0ZXJWYWx1ZXMgc2UgbW9yYSBpenZlc3RpIHByZWQgdGhpcy5fc2VsZWN0U2t1cGluYU1vYmlsZUZpbHRlci5hZnRlckNoYW5nZUNvbW1vbkV2ZW50XHJcbiAgICAgICAgICAvLyAvLyBkYSBzZSBzZSBuZSBpenZlZGUgbWV0b2RhIHRoaXMuc2VsZWN0U2t1cGluYU1vYmlsZUZpbHRlckNoYW5nZWQsIGtlciBzZSB2IHRoaXMuc2V0U2VsZWN0U2t1cGluYU1vYmlsZUZpbHRlclZhbHVlc1xyXG4gICAgICAgICAgLy8gLy8gbmFzdGF2aWpvIHZyZWRub3N0aSB2IGtsYXN1IFNhb3BNdWx0aXNlbGVjdCBpbiBwb3NsZWRpY25vIHNlIGtsaWNlIHR1ZGkgYWZ0ZXJDaGFuZ2VDb21tb25FdmVudCBldmVudFxyXG4gICAgICAgICAgLy8gdGhpcy5zZXRTZWxlY3RWRE1vYmlsZUZpbHRlclZhbHVlcygpOyAgIFxyXG4gICAgICAgICAgLy8gdGhpcy5fdnJzdGFEb2t1bWVudGFNb2JpbGUuYWZ0ZXJDaGFuZ2VDb21tb25FdmVudCA9IHRoaXMuZmlsdGVyVnJzdGFEb2t1bWVudGFNb2JpbGVDaGFuZ2VkLmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgICAgbGV0IF9TZWFyY2hWYWx1ZTJNb2JpbGUgPSAkKCdkaXYucG9wb3Zlci5zaG93JykuZmluZCgnI1NlYXJjaFZhbHVlMk1vYmlsZScpOyAgXHJcbiAgICAgICAgICBpZiAoX1NlYXJjaFZhbHVlMk1vYmlsZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIF9TZWFyY2hWYWx1ZTJNb2JpbGUub2ZmKFwiY2hhbmdlXCIpO1xyXG4gICAgICAgICAgICBfU2VhcmNoVmFsdWUyTW9iaWxlLm9uKFwiY2hhbmdlXCIsdGhpcy5vblNlYXJjaFZhbHVlMk1vYmlsZUNoYW5nZS5iaW5kKHRoaXMpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIF9TZWFyY2hWYWx1ZTJNb2JpbGUudmFsKHRoaXMuX2l6YnJhbm9MZXRvKTtcclxuXHJcbiAgICAgICAgICBsZXQgX0FwcGxpY2F0aW9uRmlsdGVyTW9iaWxlID0gJCgnZGl2LnBvcG92ZXIuc2hvdycpLmZpbmQoJyNBcHBsaWNhdGlvbkZpbHRlck1vYmlsZScpOyAgXHJcbiAgICAgICAgICBpZiAoX0FwcGxpY2F0aW9uRmlsdGVyTW9iaWxlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgX0FwcGxpY2F0aW9uRmlsdGVyTW9iaWxlLm9mZihcImNoYW5nZVwiKTtcclxuICAgICAgICAgICAgX0FwcGxpY2F0aW9uRmlsdGVyTW9iaWxlLm9uKFwiY2hhbmdlXCIsdGhpcy5vbkFwcGxpY2F0aW9uRmlsdGVyTW9iaWxlQ2hhbmdlLmJpbmQodGhpcykpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgX0FwcGxpY2F0aW9uRmlsdGVyTW9iaWxlLnZhbCh0aGlzLl9pemJyYW5hVnJzdGFEb2t1bWVudGEpLmNoYW5nZSgpOyAvL3Byb3AoJ3NlbGVjdGVkJywgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgbGV0IF9zdGF0UG90cmplbk1vYmlsZSA9ICQoXCJkaXYucG9wb3Zlci5zaG93XCIpLmZpbmQoJyNzdGF0dXNQb3RyamVuTW9iaWxlJyk7ICBcclxuICAgICAgICAgIGlmIChfc3RhdFBvdHJqZW5Nb2JpbGUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBfc3RhdFBvdHJqZW5Nb2JpbGUub2ZmKFwiY2hhbmdlXCIpO1xyXG4gICAgICAgICAgICBfc3RhdFBvdHJqZW5Nb2JpbGUub24oXCJjaGFuZ2VcIix0aGlzLm9uU3RhdHVzUG90cmplbk1vYmlsZUNoYW5nZS5iaW5kKHRoaXMpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIF9zdGF0UG90cmplbk1vYmlsZS5wcm9wKCdjaGVja2VkJywgdGhpcy5fc3RhdHVzUG90cmplbik7XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIGxldCBfc3RhdFphdnJuamVuTW9iaWxlID0gJChcImRpdi5wb3BvdmVyLnNob3dcIikuZmluZCgnI3N0YXR1c1phdnJuamVuTW9iaWxlJyk7ICBcclxuICAgICAgICAgIGlmIChfc3RhdFphdnJuamVuTW9iaWxlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgX3N0YXRaYXZybmplbk1vYmlsZS5vZmYoXCJjaGFuZ2VcIik7XHJcbiAgICAgICAgICAgIF9zdGF0WmF2cm5qZW5Nb2JpbGUub24oXCJjaGFuZ2VcIix0aGlzLm9uU3RhdHVzWmF2cm5qZW5Nb2JpbGVDaGFuZ2UuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgICB9ICBcclxuICAgICAgICAgIF9zdGF0WmF2cm5qZW5Nb2JpbGUucHJvcCgnY2hlY2tlZCcsIHRoaXMuX3N0YXR1c1phdnJuamVuKTtcclxuXHJcbiAgICAgICAgICBsZXQgX3N0YXRCcmlzYW5Nb2JpbGUgPSAkKFwiZGl2LnBvcG92ZXIuc2hvd1wiKS5maW5kKCcjc3RhdHVzQnJpc2FuTW9iaWxlJyk7XHJcbiAgICAgICAgICBpZiAoX3N0YXRCcmlzYW5Nb2JpbGUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgX3N0YXRCcmlzYW5Nb2JpbGUub2ZmKFwiY2hhbmdlXCIpO1xyXG4gICAgICAgICAgICAgICAgX3N0YXRCcmlzYW5Nb2JpbGUub24oXCJjaGFuZ2VcIix0aGlzLm9uU3RhdHVzQnJpc2FuTW9iaWxlQ2hhbmdlLmJpbmQodGhpcykpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gZG9kYW1vIGN1c3RvbSBjc3MgemEgZmlsdGVyXHJcbiAgICAgICAgICBsZXQgZmlsdGVyUG9wb3ZlckRpdiA9ICQoXCJkaXYucG9wb3Zlci5zaG93XCIpO1xyXG4gICAgICAgICAgaWYgKGZpbHRlclBvcG92ZXJEaXYgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIGxldCBjdXN0b21Dc3MgPSBcImNhbGVuZGFyLWZpbHRlclwiO1xyXG4gICAgICAgICAgICAgIGlmICghZmlsdGVyUG9wb3ZlckRpdi5oYXNDbGFzcyhjdXN0b21Dc3MpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGZpbHRlclBvcG92ZXJEaXYuYWRkQ2xhc3MoY3VzdG9tQ3NzKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gZG9kYW1vIGN1c3RvbSBjc3MgemEgZmlsdGVyXHJcbiAgICAgICAgICBsZXQgZmlsdGVyUG9wb3ZlckJvZHlEaXYgPSAkKFwiZGl2LnBvcG92ZXIuc2hvd1wiKS5maW5kKFwiZGl2LnBvcG92ZXItYm9keVwiKTtcclxuICAgICAgICAgIGlmIChmaWx0ZXJQb3BvdmVyQm9keURpdiAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGN1c3RvbUNzcyA9IFwiY2FsZW5kYXItZmlsdGVyLWJvZHlcIjtcclxuICAgICAgICAgICAgICBpZiAoIWZpbHRlclBvcG92ZXJCb2R5RGl2Lmhhc0NsYXNzKGN1c3RvbUNzcykpIHtcclxuICAgICAgICAgICAgICAgICAgZmlsdGVyUG9wb3ZlckJvZHlEaXYuYWRkQ2xhc3MoY3VzdG9tQ3NzKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgIFxyXG4gICAgICAgICAgLy8gcHJpa2F6aSBmaWx0ZXIgb2tub1xyXG4gICAgICAgICAgbGV0IGZpbHRlckJvZHkgPSAkKFwiZGl2LnBvcG92ZXIuc2hvd1wiKS5maW5kKFwiI3BvcE92ZXJMaWt2RmlsdGVyQm9keVwiKTtcclxuICAgICAgICAgIGZpbHRlckJvZHkuc2hvdygpO1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuLy8gICBzZXRTZWxlY3RWRE1vYmlsZUZpbHRlclZhbHVlcygpIHtcclxuLy8gICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJMSUtWQ2FrYWxuYVZyc3RhVmlldy5zZXRTZWxlY3RWRE1vYmlsZUZpbHRlclZhbHVlc1wiKTtcclxuLy8gICAgICAgICAvLyBwcmViZXJlbW8gdnJlZG5vc3RpIFZEIGl6IGRlc2t0b3AgQ2F0ZWdvcnkgZWxlbWVudFxyXG4vLyAgICAgIGxldCBpemJyYW5hVnJzdGFEb2t1bWVudGEgPSA8c3RyaW5nW10+KHRoaXMuX3Zyc3RhRG9rdW1lbnRhLnNlbGVjdGVkQ0IudmFsKCkpO1xyXG4vLyAgICAgIHRoaXMuX3Zyc3RhRG9rdW1lbnRhTW9iaWxlLnNldFNlbGVjdFZhbHVlcyhpemJyYW5hVnJzdGFEb2t1bWVudGEpO1xyXG4vLyB9ICBcclxuXHJcbi8vIGZpbHRlclZyc3RhRG9rdW1lbnRhTW9iaWxlQ2hhbmdlZChlbGVtZW50OiBhbnkpIHtcclxuLy8gICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTElLVkNha2FsbmFWcnN0YVZpZXcuZmlsdGVyVnJzdGFEb2t1bWVudGFcIik7XHJcblxyXG4vLyAgIC8vIHByZWJlcmVtbywgVkQgaW4gamloIHNocmFuaW1vIHYgZGVza3RvcCBDYXRlZ29yeSBlbGVtZW50XHJcbi8vICAgbGV0IGl6YnJhbmFWcnN0YURva3VtZW50YSA9IDxzdHJpbmdbXT4oZWxlbWVudC52YWwoKSk7XHJcbi8vICAgdGhpcy5fdnJzdGFEb2t1bWVudGEuc2V0U2VsZWN0VmFsdWVzKGl6YnJhbmFWcnN0YURva3VtZW50YSk7XHJcblxyXG4vLyAgIHRoaXMucmVmcmVzaEdyaWREYXRhKDAsIGl6YnJhbmFWcnN0YURva3VtZW50YS50b1N0cmluZygpKTsgIFxyXG4vLyB9XHJcblxyXG5vblNlYXJjaFZhbHVlMk1vYmlsZUNoYW5nZShlOmFueSk6dm9pZHtcclxuICBsZXQgX1NlYXJjaFZhbHVlMiA9ICQoJ2Rpdi5wb3BvdmVyLnNob3cnKS5maW5kKCcjU2VhcmNoVmFsdWUyTW9iaWxlJyk7XHJcbiAgaWYgKF9TZWFyY2hWYWx1ZTIubGVuZ3RoID4gMCkge1xyXG4gICAgdGhpcy5faXpicmFub0xldG8gPSBfU2VhcmNoVmFsdWUyLnZhbCgpIGFzIG51bWJlcjtcclxuICB9ICAgIFxyXG4gICQoXCIjU2VhcmNoVmFsdWUyXCIpLnZhbCh0aGlzLl9pemJyYW5vTGV0byk7ICAgIFxyXG4gIHRoaXMucmVmcmVzaEdyaWREYXRhKHRoaXMuX2l6YnJhbm9MZXRvLCB0aGlzLl9pemJyYW5hVnJzdGFEb2t1bWVudGEpO1xyXG59ICBcclxuXHJcbm9uQXBwbGljYXRpb25GaWx0ZXJNb2JpbGVDaGFuZ2UoZTphbnkpOnZvaWR7XHJcbiAgbGV0IF9hcHBsaWNhdGlvbkZpbHRlciA9ICQoJ2Rpdi5wb3BvdmVyLnNob3cnKS5maW5kKCcjQXBwbGljYXRpb25GaWx0ZXJNb2JpbGUnKTtcclxuICBpZiAoX2FwcGxpY2F0aW9uRmlsdGVyLmxlbmd0aCA+IDApIHtcclxuICAgIHRoaXMuX2l6YnJhbmFWcnN0YURva3VtZW50YSA9IF9hcHBsaWNhdGlvbkZpbHRlci52YWwoKSBhcyBzdHJpbmc7XHJcbiAgICBpZiAodGhpcy5faXpicmFuYVZyc3RhRG9rdW1lbnRhID09IFwiP1wiIClcclxuICAgICAgdGhpcy5faXpicmFuYVZyc3RhRG9rdW1lbnRhID0gXCJcIjtcclxuICB9ICBcclxuICB0aGlzLnJlZnJlc2hHcmlkRGF0YSh0aGlzLl9pemJyYW5vTGV0bywgdGhpcy5faXpicmFuYVZyc3RhRG9rdW1lbnRhKTtcclxufSAgXHJcblxyXG5vblN0YXR1c1BvdHJqZW5Nb2JpbGVDaGFuZ2UoZTphbnkpOnZvaWR7XHJcbiAgdGhpcy5fc3RhdHVzUG90cmplbiA9IGZhbHNlO1xyXG4gIGxldCBfc3RhdFBvdHJqZW4gPSAkKFwiZGl2LnBvcG92ZXIuc2hvd1wiKS5maW5kKCcjc3RhdHVzUG90cmplbk1vYmlsZScpO1xyXG4gIGlmIChfc3RhdFBvdHJqZW4uaXMoXCI6Y2hlY2tlZFwiKSl7ICBcclxuICAgIHRoaXMuX3N0YXR1c1BvdHJqZW4gPSBfc3RhdFBvdHJqZW4uaXMoXCI6Y2hlY2tlZFwiKTtcclxuICB9IFxyXG4gICQoXCIjc3RhdHVzUG90cmplblwiKS5wcm9wKCdjaGVja2VkJywgdGhpcy5fc3RhdHVzUG90cmplbik7ICAgICBcclxuICB0aGlzLnJlZnJlc2hHcmlkRGF0YSh0aGlzLl9pemJyYW5vTGV0bywgdGhpcy5faXpicmFuYVZyc3RhRG9rdW1lbnRhKTtcclxufSAgXHJcblxyXG5vblN0YXR1c1phdnJuamVuTW9iaWxlQ2hhbmdlKGU6YW55KTp2b2lke1xyXG4gIHRoaXMuX3N0YXR1c1phdnJuamVuID0gZmFsc2U7XHJcbiAgbGV0IF9zdGF0WmF2cm5qZW4gPSAkKFwiZGl2LnBvcG92ZXIuc2hvd1wiKS5maW5kKCcjc3RhdHVzWmF2cm5qZW5Nb2JpbGUnKTsgIFxyXG4gIGlmIChfc3RhdFphdnJuamVuLmlzKFwiOmNoZWNrZWRcIikpeyAgXHJcbiAgICB0aGlzLl9zdGF0dXNaYXZybmplbiA9IF9zdGF0WmF2cm5qZW4uaXMoXCI6Y2hlY2tlZFwiKTtcclxuICB9ICAgICAgXHJcbiAgJChcIiNzdGF0dXNaYXZybmplblwiKS5wcm9wKCdjaGVja2VkJywgdGhpcy5fc3RhdHVzWmF2cm5qZW4pOyAgICBcclxuICB0aGlzLnJlZnJlc2hHcmlkRGF0YSh0aGlzLl9pemJyYW5vTGV0bywgdGhpcy5faXpicmFuYVZyc3RhRG9rdW1lbnRhKTtcclxuICAgIH0gXHJcblxyXG4gICAgb25TdGF0dXNCcmlzYW5Nb2JpbGVDaGFuZ2UoZTogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fc3RhdHVzQnJpc2FuID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IF9zdGF0QnJpc2FuID0gJChcImRpdi5wb3BvdmVyLnNob3dcIikuZmluZCgnI3N0YXR1c0JyaXNhbk1vYmlsZScpO1xyXG4gICAgICAgIGlmIChfc3RhdEJyaXNhbi5pcyhcIjpjaGVja2VkXCIpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0YXR1c0JyaXNhbiA9IF9zdGF0QnJpc2FuLmlzKFwiOmNoZWNrZWRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICQoXCIjc3RhdHVzQnJpc2FuXCIpLnByb3AoJ2NoZWNrZWQnLCB0aGlzLl9zdGF0dXNCcmlzYW4pO1xyXG4gICAgICAgIHRoaXMucmVmcmVzaEdyaWREYXRhKHRoaXMuX2l6YnJhbm9MZXRvLCB0aGlzLl9pemJyYW5hVnJzdGFEb2t1bWVudGEsIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvL1xyXG59IiwiaW1wb3J0IHsgZ2xvYmFsLCBnZXRTaXRlQWJzb2x1dGVVUkwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BXZWJHcmlkLFNhb3BXZWJHcmlkUHJvcGVydGllcyxTYW9wV2ViR3JpZFRvb2xiYXIsU2FvcFdlYkdyaWRUb29sYmFyQnV0dG9uLFNhb3BXZWJEYXRhVGFibGV9IGZyb20gXCIuLi9Db21wb25lbnRzL3Nhb3AtZ3JpZFwiO1xyXG5pbXBvcnQgKiBhcyBtb21lbnQgZnJvbSAnLi4vLi4vbm9kZV9tb2R1bGVzL21vbWVudC9tb21lbnQnO1xyXG5pbXBvcnQgeyBTYW9wVHJlZVRhYmxlLCBTYW9wVHJlZVRhYmxlUGFyYW1zIH0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC1UcmVlVGFibGVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBMSUtWTml2b2ppUG90cmpldmFuamFHcmlkIHtcclxuICAgIHByaXZhdGUgbGliTmFtZTpzdHJpbmc7XHJcbiAgICAvL1xyXG4gICAgcHVibGljIHdlYkdyaWQxOlNhb3BXZWJHcmlkO1xyXG4gICAgcHVibGljIHRyZWVUYWJsZTpTYW9wVHJlZVRhYmxlO1xyXG4gICAgXHJcbiAgICBjb25zdHJ1Y3RvcihsaWJOYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmxpYk5hbWUgPSBsaWJOYW1lO1xyXG4gICAgICAgIC8vXHJcbiAgICAgIH0gIFxyXG4gICAgICBcclxuICAgICAgaW5pdFZpZXcoaWRWcnN0ZTpzdHJpbmcpe1xyXG4gICAgICAgIHZhciBfc2l0ZVVybCA9IGdldFNpdGVBYnNvbHV0ZVVSTChcIkxpa3ZDb25maXJtYXRpb25zXCIpO1xyXG5cclxuICAgICAgICB0aGlzLnRyZWVUYWJsZSAgPSBuZXcgU2FvcFRyZWVUYWJsZShcIlwiKTsgICAgIFxyXG4gICAgICAgIGxldCBfcGFyYW1zOlNhb3BUcmVlVGFibGVQYXJhbXM7XHJcbiAgICAgICAgX3BhcmFtcyA9IHtcclxuICAgICAgICAgIGlkOicjTElLVk5pdm9qaVBvdHJqZXZhbmphR3JpZCdcclxuICAgICAgICAgICx1cmw6IF9zaXRlVXJsKycvR2V0VW5jRG9jdW1lbnRzRGF0YT9pZFZyc3RlPScraWRWcnN0ZVxyXG4gICAgICAgICAgLGNvbHVtbnM6XHJcbiAgICAgICAgICAgIFtcclxuICAgICAgICAgICAgICB7XCJkYXRhXCI6IFwic3RhdHVzXCIsXHJcbiAgICAgICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKGRhdGE6YW55LCB0eXBlOmFueSwgcm93OmFueSl7XHJcbiAgICAgICAgICAgICAgICAgIHZhciBfZGl2ID0gXHJcbiAgICAgICAgICAgICAgICAgIGBcclxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIiBkaXNwbGF5OiBmbGV4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteS1hdXRvIGRvdFN0YXR1c1wiIHN0eWxlPVwiYmFja2dyb3VuZC1wb3NpdGlvbjogbGVmdDtiYWNrZ3JvdW5kLWNvbG9yOiR7cm93W1wiYmFydmFTdGF0dXNhXCJdfVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteS1hdXRvXCIgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6NXB4O1wiPiR7cm93W1wibmF6aXZTdGF0dXNhXCJdfTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj4gICAgXHJcbiAgICAgICAgICAgICAgICAgIGA7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiBfZGl2OyAgICBcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIHtcImRhdGFcIjogXCJuYXppdkFrY2lqZVwiLCBjbGFzc05hbWU6ICdzYW9wLXRhYmxlLXRleHQtdHJ1bmNhdGUgcHItMid9LFxyXG4gICAgICAgICAgICAgIHtcImRhdGFcIjogXCJuYXppdlBvZHBpc25pa1wiLCBjbGFzc05hbWU6ICdzYW9wLXRhYmxlLXRleHQtdHJ1bmNhdGUgcHItMid9LFxyXG4gICAgICAgICAgICAgIHtcImRhdGFcIjogXCJjYXNaYWNldGthXCIsXHJcbiAgICAgICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKGRhdGE6YW55LCB0eXBlOmFueSwgcm93OmFueSl7XHJcbiAgICAgICAgICAgICAgICAgIGlmKGRhdGEgPT0gbnVsbCB8fCB0eXBlID09PSBcInNvcnRcIiB8fCB0eXBlID09PSBcInR5cGVcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiBtb21lbnQoZGF0YSkuZm9ybWF0KFwiREQuTU0uWVlZWVwiKTsgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAge1wiZGF0YVwiOiBcImNhc0tvbmNhXCIsXHJcbiAgICAgICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKGRhdGE6YW55LCB0eXBlOmFueSwgcm93OmFueSl7XHJcbiAgICAgICAgICAgICAgICAgIGlmKGRhdGEgPT0gbnVsbCB8fCB0eXBlID09PSBcInNvcnRcIiB8fCB0eXBlID09PSBcInR5cGVcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiBtb21lbnQoZGF0YSkuZm9ybWF0KFwiREQuTU0uWVlZWVwiKTsgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAge1wiZGF0YVwiOiBcInJva1pha2xqdWNrYVwifSxcclxuICAgICAgICAgICAgICB7XCJkYXRhXCI6IFwibmF6aXZQb3ZlcmplbmlrXCIsIGNsYXNzTmFtZTogJ3Nhb3AtdGFibGUtdGV4dC10cnVuY2F0ZSd9XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgLG9yZGVyOiBbWzEsICdkZXNjJ11dXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnRyZWVUYWJsZS5pbml0KF9wYXJhbXMpO1xyXG4gICAgICB9XHJcbiAgICAvL1xyXG59IiwiaW1wb3J0IHsgZ2xvYmFsLCBnZXRSZWxhdGl2ZVNpdGVVUkwsIGdldFNpdGVBYnNvbHV0ZVVSTCwgaXNFbXB0eSwgaXNVbkRlZmluZWQgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BWaWV3Rm9ybSwgU2FvcFdmQWN0aW9uIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC12aWV3LWZvcm1cIjtcclxuaW1wb3J0ICB7TElLVk5pdm9qaVBvdHJqZXZhbmphR3JpZCB9IGZyb20gXCIuLi9MSUtWL0xJS1ZOaXZvamlQb3RyamV2YW5qYS1ncmlkXCJcclxuXHJcbmV4cG9ydCBjbGFzcyBMSUtWTml2b2ppUG90cmpldmFuamFNb2RhbCBleHRlbmRzIFNhb3BWaWV3Rm9ybSB7XHJcbiAgcHJpdmF0ZSBfbGlrdk5pdm9qaVBvdHJqZXZhbmphR3JpZDpMSUtWTml2b2ppUG90cmpldmFuamFHcmlkO1xyXG5cclxuICBjb25zdHJ1Y3Rvcih2aWV3SWQ6c3RyaW5nLGxpYk5hbWU6c3RyaW5nID0gXCJcIil7XHJcbiAgICBzdXBlcih2aWV3SWQsbGliTmFtZSk7XHJcbiAgICB0aGlzLnNldERpY3Rpb25hcnkoKTsgIFxyXG4gICAgdGhpcy50aXRsZSA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIk5pdm9qaSBwb3RyamV2YW5qYVwiKTtcclxuICAgIHRoaXMuZnVsbFRpdGxlID0gdGhpcy50aXRsZTtcclxuICAgIHRoaXMuYWRkUmVjb3JkRW5kcG9pbnQgPSBcIlwiO1xyXG4gICAgdGhpcy5lZGl0UmVjb3JkRW5kcG9pbnQgPSBcIkxpa3ZDb25maXJtYXRpb25zL0luZGV4VW5jRG9jdW1lbnRzXCI7XHJcbiAgICB0aGlzLmRlbGV0ZVJlY29yZEVuZHBvaW50ID0gXCJcIjsgXHJcbiAgICAvL1xyXG4gICAgdGhpcy5hZnRlclZpZXdTaG93U3VjY2VzcyA9IHRoaXMuaW5pdFZpZXc7XHJcbiAgICB0aGlzLmFmdGVyU3VibWl0U3VjY2VzcyA9IHRoaXMuaW5pdFZpZXc7XHJcbiAgICAvL1xyXG4gIH1cclxuXHJcbiAgc2V0RGljdGlvbmFyeSgpe1xyXG4gICAgICBsZXQgZGljdGlvbmFyeTpzdHJpbmdbXSA9IFtcIk5pdm9qaSBwb3RyamV2YW5qYVwiXTtcclxuICAgICAgdGhpcy5zZXRUZXJtaW5vbG9neUxpc3QoZGljdGlvbmFyeSk7XHJcbiAgfSBcclxuXHJcbiAgcHVibGljIHNob3dGb3JtKGRhdGE6YW55KTp2b2lke1xyXG4gICAgdGhpcy5zaG93Vmlld0Zvcm0oU2FvcFdmQWN0aW9uLndmYUVkaXRSZWNvcmQsIGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXRWaWV3KCk6dm9pZHtcclxuICAgIGxldCBfZGF0YSA9IHRoaXMuZ2V0RGF0YSgpO1xyXG4gICAgdGhpcy5fbGlrdk5pdm9qaVBvdHJqZXZhbmphR3JpZCA9IG5ldyBMSUtWTml2b2ppUG90cmpldmFuamFHcmlkKHRoaXMuX2xpYk5hbWUpO1xyXG4gICAgdGhpcy5fbGlrdk5pdm9qaVBvdHJqZXZhbmphR3JpZC5pbml0VmlldyhfZGF0YS5pZFZyc3RlKTtcclxuICB9XHJcblxyXG4gIC8vXHJcbn1cclxuXHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCwgaXNFbXB0eSwgaXNVbkRlZmluZWQgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BNdWx0aXNlbGVjdCB9IGZyb20gXCIuLi9Db21wb25lbnRzL3Nhb3AtbXVsdGlzZWxlY3RcIjtcclxuaW1wb3J0IHsgU2FvcFVwbG9hZEZpbGVzIH0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC11cGxvYWQtZmlsZXNcIjtcclxuaW1wb3J0IHsgU2FvcEF0dGFjaG1lbnRMaXN0IH0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC1hdHRhY2htZW50LWxpc3RcIjtcclxuXHJcbmNsYXNzIFRpcEludGVybmVnYU5hcm9jaWxhU2VydmlzIHtcclxuICAgIHNpZnJhOiBzdHJpbmc7XHJcbiAgICBuYXppdjogc3RyaW5nO1xyXG4gICAgc2lmcmVWcnN0ZUludGVybmVnYU5hcm9jaWxhU2VydmlzOiBzdHJpbmc7XHJcbn1cclxuXHJcbmNsYXNzIFNpZnJhVnJzdGVJbnRlcm5lZ2FOYXJvY2lsYVByaXBvbmtlIHtcclxuICAgIHNpZnJlVnJzdGVJbnRlcm5lZ2FOYXJvY2lsYTogc3RyaW5nO1xyXG59XHJcblxyXG5jbGFzcyBBcnRpa2VsRW5vdGFNZXJlVmlld01vZGVsIHtcclxuICAgIFNpZnJhQXJ0aWtsYTogc3RyaW5nO1xyXG4gICAgTWVyc2thRW5vdGE6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE5ES0ludGVybmFsT3JkZXJFZGl0Rm9ybSB7XHJcbiAgICBwcml2YXRlIGxpYk5hbWU6IHN0cmluZztcclxuICAgIHByaXZhdGUgX3ZpZXdJZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfZm9ybUlkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF92cnN0YUludGVybmVnYU5hcm9jaWxhSWQ6IHN0cmluZyA9IFwiI1NpZnJhVnJzdGVJbnRlcm5paE5hcm9jaWxcIjtcclxuICAgIHByaXZhdGUgX3RpcEludGVybmVnYU5hcm9jaWxhSWQ6IHN0cmluZyA9IFwiI1RpcEludGVybmVnYU5hcm9jaWxhXCI7XHJcbiAgICBwcml2YXRlIF9zaWZyYUFydGlrbGFEaXZJZDogc3RyaW5nID0gXCIjc2lmcmFBcnRpa2xhRGl2XCI7XHJcbiAgICBwcml2YXRlIF9rb2xpY2luYURpdklkOiBzdHJpbmcgPSBcIiNrb2xpY2luYURpdlwiO1xyXG4gICAgcHJpdmF0ZSBfc2lmcmFOYXByYXZlRGl2SWQ6IHN0cmluZyA9IFwiI3NpZnJhTmFwcmF2ZURpdlwiO1xyXG4gICAgcHJpdmF0ZSBfYXJ0aWtlbE9waXNEaXZJZDogc3RyaW5nID0gXCIjYXJ0aWtlbE9waXNEaXZcIjtcclxuICAgIHByaXZhdGUgX3ByaXBvbmtlQnJpc2FuZUlkOiBzdHJpbmcgPSBcIiNQcmlwb25rZUJyaXNhbmVcIjtcclxuICAgIHByaXZhdGUgX2RhdGFUaXBTZXJ2aXNJbnB1dElkOiBzdHJpbmcgPSBcIiNkYXRhVGlwU2VydmlzSW5wdXRcIjtcclxuICAgIHByaXZhdGUgX21lcnNrYUVub3RhSGlkZGVuSWQ6IHN0cmluZyA9IFwiI0FydGlrZWxFbm90YU1lcmVcIjtcclxuICAgIHByaXZhdGUgX21lcnNrYUVub3RhRGlzcGxheUlkOiBzdHJpbmcgPSBcIiNBcnRpa2VsRW5vdGFNZXJlRGlzcGxheVwiO1xyXG4gICAgcHJpdmF0ZSBfYXJ0aWtlbEVub3RhTWVyZUxpc3RKc29uSWQ6IHN0cmluZyA9IFwiI0FydGlrZWxFbm90YU1lcmVMaXN0SnNvblwiO1xyXG4gICAgcHJpdmF0ZSBfc2VsZWN0QXJ0aWtlbDogU2FvcE11bHRpc2VsZWN0O1xyXG4gICAgcHJpdmF0ZSBfc2VsZWN0TmFwcmF2YTogU2FvcE11bHRpc2VsZWN0O1xyXG4gICAgcHJpdmF0ZSBfc2FvcFVwbG9hZEZpbGVzOiBTYW9wVXBsb2FkRmlsZXM7XHJcbiAgICBwcml2YXRlIF9zYW9wQXR0YWNobWVudExpc3Q6IFNhb3BBdHRhY2htZW50TGlzdDtcclxuICAgIHByaXZhdGUgX3RpcEludGVybmVnYU5hcm9jaWxhU2VydmlzRGF0YTogVGlwSW50ZXJuZWdhTmFyb2NpbGFTZXJ2aXM7XHJcbiAgICBwcml2YXRlIF9zaWZyYVZyc3RlSW50ZXJuZWdhTmFyb2NpbGFQcmlwb25rZUlkOiBzdHJpbmcgPSBcIiN2cnN0ZUludGVybmVnYU5hcm9jaWxhUHJpcG9ua2VJbnB1dFwiO1xyXG4gICAgcHJpdmF0ZSBfc2lmcmFWcnN0ZUludGVybmVnYU5hcm9jaWxhUHJpcG9ua2U6IFNpZnJhVnJzdGVJbnRlcm5lZ2FOYXJvY2lsYVByaXBvbmtlO1xyXG4gICAgcHJpdmF0ZSBfdXBsb2FkQXR0YWNobWVudEVsZW1lbnRJZCA9IFwiI3VwbG9hZEF0dGFjaG1lbnRcIjtcclxuICAgIHByaXZhdGUgX2FydGlrZWxFbm90YU1lcmVWaWV3TW9kZWxMaXN0OiBBcnRpa2VsRW5vdGFNZXJlVmlld01vZGVsW10gPSBbXTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih2aWV3SWQ6IHN0cmluZywgZm9ybUlkOiBzdHJpbmcsIGxpYk5hbWU6IHN0cmluZyA9IFwiXCIpe1xyXG4gICAgICAgIHRoaXMubGliTmFtZSA9IGxpYk5hbWU7IFxyXG4gICAgICAgIHRoaXMuX3ZpZXdJZCA9IHZpZXdJZDtcclxuICAgICAgICB0aGlzLl9mb3JtSWQgPSBmb3JtSWQ7XHJcblxyXG4gICAgICAgIHRoaXMuX3Nhb3BVcGxvYWRGaWxlcyA9IG5ldyBTYW9wVXBsb2FkRmlsZXModmlld0lkLCBsaWJOYW1lICsgXCIuX3Nhb3BVcGxvYWRGaWxlc1wiKTsgXHJcbiAgICAgICAgdGhpcy5fc2FvcEF0dGFjaG1lbnRMaXN0ID0gbmV3IFNhb3BBdHRhY2htZW50TGlzdChcIiNpbnRlcm5hbE9yZGVyc0F0dGFjaG1lbnRzXCIsIGxpYk5hbWUgKyBcIi5fc2FvcEF0dGFjaG1lbnRMaXN0XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk5ES0ludGVybmFsT3JkZXJFZGl0Rm9ybS5pbml0XCIpO1xyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICB0aGlzLl9hcnRpa2VsRW5vdGFNZXJlVmlld01vZGVsTGlzdCA9ICQucGFyc2VKU09OKCQodGhpcy5fdmlld0lkICsgJyAnICsgdGhpcy5fYXJ0aWtlbEVub3RhTWVyZUxpc3RKc29uSWQpLmF0dHIoXCJkYXRhLWFydGlrZWxlbm90YW1lcmVMaXN0XCIpKTtcclxuXHJcbiAgICAgICAgdGhpcy5fdGlwSW50ZXJuZWdhTmFyb2NpbGFTZXJ2aXNEYXRhID0gdGhpcy5nZXRUaXBJbnRlcm5lZ2FOYXJvY2lsYVNlcnZpcygpO1xyXG4gICAgICAgIHRoaXMuX3NpZnJhVnJzdGVJbnRlcm5lZ2FOYXJvY2lsYVByaXBvbmtlID0gdGhpcy5nZXRWcnN0ZUludGVybmVnYU5hcm9jaWxhUHJpcG9ua2UoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2FvcFVwbG9hZEZpbGVzLmluaXRDb21wb25lbnQoeyBjb250cm9sbGVyOiBcIkludGVybmFsT3JkZXJcIiwgYWN0aW9uOiBcIlZhbGlkYXRlRmlsZXNcIiwgdmFsaWRhdGVBamF4OiB0cnVlLCBmb3JtSWQ6IHRoaXMuX2Zvcm1JZCwgdmFsaWRhdGlvbkRpdklkOiB0aGlzLl92aWV3SWQgKyBcIiAjdXBsb2FkRmlsZXNWYWxpZGF0aW9uc0FqYXhcIiwgYWxsb3dTZWxlY3RNdWx0aUZpbGVzOiBmYWxzZSB9KTtcclxuICAgICAgICB0aGlzLl9zYW9wVXBsb2FkRmlsZXMuYWZ0ZXJSZWZyZXNoRmlsZXNMaXN0ID0gdGhpcy5fc2FvcFVwbG9hZEZpbGVzLmFqYXhWYWxpZGF0ZTtcclxuICAgICAgICB0aGlzLl9zYW9wQXR0YWNobWVudExpc3QuaW5pdENvbXBvbmVudChcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFsaWRhdGlvbkZpbmdlcnByaW50Q29udHJvbGxlcjogXCJTUExEb2N1bWVudFwiLFxyXG4gICAgICAgICAgICAgICAgdmFsaWRhdGlvbkZpbmdlcnByaW50QWN0aW9uOiBcIlZhbGlkYXRlQXR0YWNobWVudEZpbmdlclByaW50XCIsXHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0aW9uRmluZ2VycHJpbnRCYW5uZXJEaXZJZDogdGhpcy5fdmlld0lkICsgXCIgI3VwbG9hZEZpbGVzVmFsaWRhdGlvbnNBamF4XCIsXHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ29udHJvbGxlcjogXCJTUExEb2N1bWVudFwiLFxyXG4gICAgICAgICAgICAgICAgdmFsaWRhdGlvbkFjdGlvbjogXCJWYWxpZGF0ZURvd25sb2FkaW5nRG9jdW1lbnRBdHRhY2htZW50XCIsXHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQmFubmVyRGl2SWQ6IHRoaXMuX3ZpZXdJZCArIFwiICN1cGxvYWRGaWxlc1ZhbGlkYXRpb25zQWpheFwiLFxyXG4gICAgICAgICAgICAgICAgZG93bmxvYWRDb250cm9sbGVyOiBcIlNQTERvY3VtZW50XCIsXHJcbiAgICAgICAgICAgICAgICBkb3dubG9hZEFjdGlvbjogXCJEb3dubG9hZERvY3VtZW50QXR0YWNobWVudFwiLFxyXG4gICAgICAgICAgICAgICAgZGVsZXRlZEF0dGFjaG1lbnRMaXN0SWQ6IHRoaXMuX3ZpZXdJZCArIFwiIFwiICsgdGhpcy5fcHJpcG9ua2VCcmlzYW5lSWRcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQodGhpcy5fdmlld0lkICsgJyAjYnRuT2snKS5vZmYoJ2NsaWNrJyk7XHJcbiAgICAgICAgJCh0aGlzLl92aWV3SWQgKyAnICNidG5PaycpLmJpbmQoJ2NsaWNrJyxcclxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IF9yZXN1bHQgPSBfdGhpcy5fc2FvcFVwbG9hZEZpbGVzLmFqYXhWYWxpZGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9yZXN1bHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApOyAgICBcclxuXHJcbiAgICAgICAgLy8gZ2xlZGUgbmEgdnJzdG8gaW50ZXJuZWdhIG5hcm9jaWxhIHNlIGRvZGEvb2RzdHJhbmkgXCJaYWh0ZXZlayB6YSBzZXJ2aXMgbmFwcmF2ZVwiXHJcbiAgICAgICAgdGhpcy52cnN0YUludGVybmVnYU5hcm9jaWxhQ2hhbmdlKClcclxuXHJcbiAgICAgICAgbGV0IHZyc3RhSW50ZXJuZWdhTmFyb2NpbGFFbGVtZW50ID0gJCh0aGlzLl92aWV3SWQgKyBcIiBcIiArIHRoaXMuX3Zyc3RhSW50ZXJuZWdhTmFyb2NpbGFJZCk7XHJcbiAgICAgICAgJCh2cnN0YUludGVybmVnYU5hcm9jaWxhRWxlbWVudCkub2ZmKFwiY2hhbmdlXCIpO1xyXG4gICAgICAgICQodnJzdGFJbnRlcm5lZ2FOYXJvY2lsYUVsZW1lbnQpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIF90aGlzLnZyc3RhSW50ZXJuZWdhTmFyb2NpbGFDaGFuZ2UoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gaW5pY2lhbGl6aXJhbW8gZWxlbWVudGUgZ2xlZGUgbmEgdGlwXHJcbiAgICAgICAgdGhpcy50aXBJbnRlcm5lZ2FOYXJvY2lsYUNoYW5nZSgpO1xyXG5cclxuICAgICAgICBsZXQgdGlwSW50ZXJuZWdhTmFyb2NpbGFFbGVtZW50ID0gJCh0aGlzLl92aWV3SWQgKyBcIiBcIiArIHRoaXMuX3RpcEludGVybmVnYU5hcm9jaWxhSWQpO1xyXG4gICAgICAgICQodGlwSW50ZXJuZWdhTmFyb2NpbGFFbGVtZW50KS5vZmYoXCJjaGFuZ2VcIik7XHJcbiAgICAgICAgJCh0aXBJbnRlcm5lZ2FOYXJvY2lsYUVsZW1lbnQpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAocm93KSB7XHJcbiAgICAgICAgICAgIF90aGlzLnRpcEludGVybmVnYU5hcm9jaWxhQ2hhbmdlKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3NlbGVjdE5hcHJhdmEgPSBuZXcgU2FvcE11bHRpc2VsZWN0KCk7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0TmFwcmF2YS5hZnRlckluaXRpYWxpemVkQ29udHJvbCA9IHRoaXMuYWZ0ZXJJbml0aWFsaXplZENvbnRyb2xTZWxlY3ROYXByYXZhLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0TmFwcmF2YS5pbml0KHRoaXMuX3ZpZXdJZCArIFwiICNzaWZyYU5hcHJhdmVTZWxlY3RcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX3NlbGVjdEFydGlrZWwgPSBuZXcgU2FvcE11bHRpc2VsZWN0KCk7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0QXJ0aWtlbC5hZnRlckluaXRpYWxpemVkQ29udHJvbCA9IHRoaXMuYWZ0ZXJJbml0aWFsaXplZENvbnRyb2xTZWxlY3RBcnRpa2VsLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0QXJ0aWtlbC5pbml0KHRoaXMuX3ZpZXdJZCArIFwiICNzaWZyYUFydGlrbGFTZWxlY3RcIik7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0QXJ0aWtlbC5hZnRlckNoYW5nZUNvbW1vbkV2ZW50ID0gdGhpcy5zaG93QXJ0aWtlbE1lcnNrYUVub3RhLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgYWZ0ZXJJbml0aWFsaXplZENvbnRyb2xTZWxlY3ROYXByYXZhKGVsZW1lbnQ6IGFueSkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJOREtJbnRlcm5hbE9yZGVyRWRpdEZvcm0uYWZ0ZXJJbml0aWFsaXplZENvbnRyb2xTZWxlY3ROYXByYXZhXCIpO1xyXG4gICAgICAgIHRoaXMuaW5pY2lhbGl6ZUVkaXRTZWxlY3RDb250cm9sKHRoaXMuX3NlbGVjdE5hcHJhdmEpO1xyXG4gICAgfVxyXG5cclxuICAgIGFmdGVySW5pdGlhbGl6ZWRDb250cm9sU2VsZWN0QXJ0aWtlbChlbGVtZW50OiBhbnkpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTkRLSW50ZXJuYWxPcmRlckVkaXRGb3JtLmFmdGVySW5pdGlhbGl6ZWRDb250cm9sU2VsZWN0QXJ0aWtlbFwiKTtcclxuICAgICAgICB0aGlzLmluaWNpYWxpemVFZGl0U2VsZWN0Q29udHJvbCh0aGlzLl9zZWxlY3RBcnRpa2VsKTtcclxuICAgIH1cclxuXHJcbiAgICBpbmljaWFsaXplRWRpdFNlbGVjdENvbnRyb2wobXVsdGlTZWxlY3Q6IFNhb3BNdWx0aXNlbGVjdCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJOREtJbnRlcm5hbE9yZGVyRWRpdEZvcm0uaW5pY2lhbGl6ZUVkaXRTZWxlY3RDb250cm9sXCIpO1xyXG5cclxuICAgICAgICBtdWx0aVNlbGVjdC5tc0NvbnRhaW5lci5jc3MoJ3dpZHRoJywgJzI2MHB4Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGlwSW50ZXJuZWdhTmFyb2NpbGFDaGFuZ2UoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk5ES0ludGVybmFsT3JkZXJFZGl0Rm9ybS50aXBJbnRlcm5lZ2FOYXJvY2lsYUNoYW5nZVwiKTtcclxuXHJcbiAgICAgICAgbGV0IHRpcEludGVybmVnYU5hcm9jaWxhRWxlbWVudCA9ICQodGhpcy5fdmlld0lkICsgXCIgXCIgKyB0aGlzLl90aXBJbnRlcm5lZ2FOYXJvY2lsYUlkKTtcclxuICAgICAgICBsZXQgaXpicmFuVGlwID0gPHN0cmluZz50aXBJbnRlcm5lZ2FOYXJvY2lsYUVsZW1lbnQudmFsKCk7XHJcblxyXG4gICAgICAgIGxldCBzaWZyYUFydGlrbGFEaXZFbGVtZW50ID0gJCh0aGlzLl92aWV3SWQgKyBcIiBcIiArIHRoaXMuX3NpZnJhQXJ0aWtsYURpdklkKTtcclxuICAgICAgICBsZXQga29saWNpbmFEaXZFbGVtZW50ID0gJCh0aGlzLl92aWV3SWQgKyBcIiBcIiArIHRoaXMuX2tvbGljaW5hRGl2SWQpO1xyXG4gICAgICAgIGxldCBzaWZyYU5hcHJhdmVEaXZFbGVtZW50ID0gJCh0aGlzLl92aWV3SWQgKyBcIiBcIiArIHRoaXMuX3NpZnJhTmFwcmF2ZURpdklkKTtcclxuICAgICAgICBsZXQgYXJ0aWtlbE9waXNEaXZFbGVtZW50ID0gJCh0aGlzLl92aWV3SWQgKyBcIiBcIiArIHRoaXMuX2FydGlrZWxPcGlzRGl2SWQpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pc1RpcEludGVybmVnYU5hcm9jaWxhT3Bpc25vKGl6YnJhblRpcCkpIHtcclxuICAgICAgICAgICAgc2lmcmFBcnRpa2xhRGl2RWxlbWVudC5oaWRlKCk7XHJcbiAgICAgICAgICAgIGtvbGljaW5hRGl2RWxlbWVudC5oaWRlKCk7XHJcbiAgICAgICAgICAgIHNpZnJhTmFwcmF2ZURpdkVsZW1lbnQuaGlkZSgpO1xyXG4gICAgICAgICAgICBhcnRpa2VsT3Bpc0RpdkVsZW1lbnQuc2hvdygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmlzVGlwSW50ZXJuZWdhTmFyb2NpbGFBcnRpa2VsKGl6YnJhblRpcCkpIHtcclxuICAgICAgICAgICAgc2lmcmFBcnRpa2xhRGl2RWxlbWVudC5zaG93KCk7XHJcbiAgICAgICAgICAgIGtvbGljaW5hRGl2RWxlbWVudC5zaG93KCk7XHJcbiAgICAgICAgICAgIHNpZnJhTmFwcmF2ZURpdkVsZW1lbnQuaGlkZSgpO1xyXG4gICAgICAgICAgICBhcnRpa2VsT3Bpc0RpdkVsZW1lbnQuaGlkZSgpO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5pc1RpcEludGVybmVnYU5hcm9jaWxhU2VydmlzKGl6YnJhblRpcCkpIHtcclxuICAgICAgICAgICAgc2lmcmFBcnRpa2xhRGl2RWxlbWVudC5oaWRlKCk7XHJcbiAgICAgICAgICAgIGtvbGljaW5hRGl2RWxlbWVudC5oaWRlKCk7XHJcbiAgICAgICAgICAgIHNpZnJhTmFwcmF2ZURpdkVsZW1lbnQuc2hvdygpO1xyXG4gICAgICAgICAgICBhcnRpa2VsT3Bpc0RpdkVsZW1lbnQuc2hvdygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgc2lmcmFBcnRpa2xhRGl2RWxlbWVudC5oaWRlKCk7XHJcbiAgICAgICAgICAgIGtvbGljaW5hRGl2RWxlbWVudC5oaWRlKCk7XHJcbiAgICAgICAgICAgIHNpZnJhTmFwcmF2ZURpdkVsZW1lbnQuaGlkZSgpO1xyXG4gICAgICAgICAgICBhcnRpa2VsT3Bpc0RpdkVsZW1lbnQuaGlkZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpc1RpcEludGVybmVnYU5hcm9jaWxhT3Bpc25vKHRpcDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRpcC50b1VwcGVyQ2FzZSgpID09ICdPJyA/IHRydWUgOiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpc1RpcEludGVybmVnYU5hcm9jaWxhQXJ0aWtlbCh0aXA6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aXAudG9VcHBlckNhc2UoKSA9PSAnQScgPyB0cnVlIDogZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaXNUaXBJbnRlcm5lZ2FOYXJvY2lsYVNlcnZpcyh0aXA6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aXAudG9VcHBlckNhc2UoKSA9PSAnUycgPyB0cnVlIDogZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgdnJzdGFJbnRlcm5lZ2FOYXJvY2lsYUNoYW5nZSgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTkRLSW50ZXJuYWxPcmRlckVkaXRGb3JtLnZyc3RhSW50ZXJuZWdhTmFyb2NpbGFDaGFuZ2VcIik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl90aXBJbnRlcm5lZ2FOYXJvY2lsYVNlcnZpc0RhdGEuc2lmcmEgPT0gXCJcIikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgdnJzdGFJbnRlcm5lZ2FOYXJvY2lsYUVsZW1lbnQgPSAkKHRoaXMuX3ZpZXdJZCArIFwiIFwiICsgdGhpcy5fdnJzdGFJbnRlcm5lZ2FOYXJvY2lsYUlkKTtcclxuICAgICAgICBsZXQgaXpicmFuYVZyc3RhID0gPHN0cmluZz52cnN0YUludGVybmVnYU5hcm9jaWxhRWxlbWVudC52YWwoKTtcclxuXHJcbiAgICAgICAgbGV0IHRpcEludGVybmVnYU5hcm9jaWxhSFRNTEVsZW1lbnQgPSA8SFRNTFNlbGVjdEVsZW1lbnQ+ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLl92aWV3SWQgKyBcIiBcIiArIHRoaXMuX3RpcEludGVybmVnYU5hcm9jaWxhSWQpO1xyXG4gICAgICAgIGxldCB0aXBJbnRlcm5lZ2FOYXJvY2lsYUpxdWVyeUVsZW1lbnQgPSAkKHRoaXMuX3ZpZXdJZCArIFwiIFwiICsgdGhpcy5fdGlwSW50ZXJuZWdhTmFyb2NpbGFJZCk7XHJcblxyXG4gICAgICAgIGxldCBqZUl6YnJhbmFWcnN0YVphU2VydmlzID0gdGhpcy5fdGlwSW50ZXJuZWdhTmFyb2NpbGFTZXJ2aXNEYXRhLnNpZnJlVnJzdGVJbnRlcm5lZ2FOYXJvY2lsYVNlcnZpcy5pbmNsdWRlcyhpemJyYW5hVnJzdGEpO1xyXG5cclxuICAgICAgICBpZiAoaXNFbXB0eShpemJyYW5hVnJzdGEpIHx8IGlzVW5EZWZpbmVkKGl6YnJhbmFWcnN0YSkgfHwgaXpicmFuYVZyc3RhID09IFwiP1wiIHx8ICFqZUl6YnJhbmFWcnN0YVphU2VydmlzKSB7XHJcbiAgICAgICAgICAgIC8vIHByYXplbiBpemJvclxyXG4gICAgICAgICAgICAvLyBwcmV2ZXJpbW8sIMSNZSBqZSBzbHVjYWpubyBpemJyYW4gemFodGV2ZWsgemEgc2VydmlzLCBcclxuICAgICAgICAgICAgLy8gcG90ZW0gamUgcG90cmVibm8gdHVkaSBzcHJlbWVuaXRpIGl6YnJhbm8gdnJzdGFJbnRlcm5lZ2FOYXJvY2lsYSBzZWxlY3QgZWxlbWVudFxyXG4gICAgICAgICAgICBsZXQgaXpicmFuVGlwID0gPHN0cmluZz50aXBJbnRlcm5lZ2FOYXJvY2lsYUpxdWVyeUVsZW1lbnQudmFsKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1RpcEludGVybmVnYU5hcm9jaWxhU2VydmlzKGl6YnJhblRpcCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIGl6YnJhbmkgdGlwIGplIHNlcnZpcywgdGlwIGludGVybmVnYSBuYXJvY2lsYSBzZWxlY3QgZWxlbWVudCBwb3N0YXZpbW8gbmEgcHJhemVuIGl6Ym9yXHJcbiAgICAgICAgICAgICAgICAkKHRoaXMuX3ZpZXdJZCArIFwiIFwiICsgdGhpcy5fdGlwSW50ZXJuZWdhTmFyb2NpbGFJZCkudmFsKFwiP1wiKS5jaGFuZ2UoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gcHJldmVyaW1vLCBjZSBqZSB6YWh0ZXZlayB6YSBzZXJ2aXMgdiBzZXpuYW11IHRpcG92IGludGVybmVnYSBuYXJvY2lsYSBpbiBnYSBvZHN0cmFuaW1vXHJcbiAgICAgICAgICAgIGlmICgkKHRoaXMuX3ZpZXdJZCArIFwiIFwiICsgdGhpcy5fdGlwSW50ZXJuZWdhTmFyb2NpbGFJZCArIFwiIG9wdGlvblt2YWx1ZT0nXCIgKyB0aGlzLl90aXBJbnRlcm5lZ2FOYXJvY2lsYVNlcnZpc0RhdGEuc2lmcmEgKyBcIiddXCIpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRpcEludGVybmVnYU5hcm9jaWxhSFRNTEVsZW1lbnQub3B0aW9uc1t0aXBJbnRlcm5lZ2FOYXJvY2lsYUhUTUxFbGVtZW50Lm9wdGlvbnMubGVuZ3RoIC0gMV0gPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBuaSBwcmF6ZW5cclxuICAgICAgICAgICAgLy8gcHJldmVyaW1vLCBjZSBqZSB6YWh0ZXZlayB6YSBzZXJ2aXMgbmkgdiBzZXpuYW11IHRpcG92IGludGVybmVnYSBuYXJvY2lsYSBpbiBnYSBkb2RhbW9cclxuICAgICAgICAgICAgaWYgKCQodGhpcy5fdmlld0lkICsgXCIgXCIgKyB0aGlzLl90aXBJbnRlcm5lZ2FOYXJvY2lsYUlkICsgXCIgb3B0aW9uW3ZhbHVlPSdcIiArIHRoaXMuX3RpcEludGVybmVnYU5hcm9jaWxhU2VydmlzRGF0YS5zaWZyYSArIFwiJ11cIikubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgIGxldCBzZXJ2aXNPcHRpb24gPSBuZXcgT3B0aW9uKHRoaXMuX3RpcEludGVybmVnYU5hcm9jaWxhU2VydmlzRGF0YS5uYXppdiwgdGhpcy5fdGlwSW50ZXJuZWdhTmFyb2NpbGFTZXJ2aXNEYXRhLnNpZnJhKTtcclxuICAgICAgICAgICAgICAgIHRpcEludGVybmVnYU5hcm9jaWxhSFRNTEVsZW1lbnQub3B0aW9uc1t0aXBJbnRlcm5lZ2FOYXJvY2lsYUhUTUxFbGVtZW50Lm9wdGlvbnMubGVuZ3RoXSA9IHNlcnZpc09wdGlvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcHJldmVyaW1vLCBjZSBqZSBpemJyYW5hIHZyc3RhIHphIHByaXBvbmtlXHJcbiAgICAgICAgbGV0IGplSXpicmFuYVZyc3RhWmFQcmlwb25rZSA9IHRoaXMuX3NpZnJhVnJzdGVJbnRlcm5lZ2FOYXJvY2lsYVByaXBvbmtlLnNpZnJlVnJzdGVJbnRlcm5lZ2FOYXJvY2lsYS5pbmNsdWRlcyhpemJyYW5hVnJzdGEpO1xyXG4gICAgICAgIGxldCBhdHRhY2htZW50RWxlbWVudCA9ICQodGhpcy5fdmlld0lkICsgXCIgXCIgKyB0aGlzLl91cGxvYWRBdHRhY2htZW50RWxlbWVudElkKTtcclxuXHJcbiAgICAgICAgaWYgKGlzRW1wdHkoaXpicmFuYVZyc3RhKSB8fCBpc1VuRGVmaW5lZChpemJyYW5hVnJzdGEpIHx8IGl6YnJhbmFWcnN0YSA9PSBcIj9cIiB8fCAhamVJemJyYW5hVnJzdGFaYVByaXBvbmtlKSB7XHJcbiAgICAgICAgICAgIGF0dGFjaG1lbnRFbGVtZW50LmhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGF0dGFjaG1lbnRFbGVtZW50LnNob3coKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VGlwSW50ZXJuZWdhTmFyb2NpbGFTZXJ2aXMoKTogVGlwSW50ZXJuZWdhTmFyb2NpbGFTZXJ2aXMge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJOREtJbnRlcm5hbE9yZGVyRWRpdEZvcm0uZ2V0VGlwSW50ZXJuZWdhTmFyb2NpbGFTZXJ2aXNcIik7XHJcblxyXG4gICAgICAgIGxldCBkYXRhID0gbmV3IFRpcEludGVybmVnYU5hcm9jaWxhU2VydmlzKCk7XHJcbiAgICAgICAgbGV0IGVsZW1lbnQgPSAkKHRoaXMuX3ZpZXdJZCArIFwiIFwiICsgdGhpcy5fZGF0YVRpcFNlcnZpc0lucHV0SWQpO1xyXG5cclxuICAgICAgICBkYXRhID0gZWxlbWVudC5kYXRhKCd0aXBzZXJ2aXMnKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VnJzdGVJbnRlcm5lZ2FOYXJvY2lsYVByaXBvbmtlKCk6IFNpZnJhVnJzdGVJbnRlcm5lZ2FOYXJvY2lsYVByaXBvbmtlIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTkRLSW50ZXJuYWxPcmRlckVkaXRGb3JtLmdldFZyc3RlSW50ZXJuZWdhTmFyb2NpbGFQcmlwb25rZVwiKTtcclxuXHJcbiAgICAgICAgbGV0IGRhdGEgPSBuZXcgU2lmcmFWcnN0ZUludGVybmVnYU5hcm9jaWxhUHJpcG9ua2UoKTtcclxuICAgICAgICBsZXQgZWxlbWVudCA9ICQodGhpcy5fdmlld0lkICsgXCIgXCIgKyB0aGlzLl9zaWZyYVZyc3RlSW50ZXJuZWdhTmFyb2NpbGFQcmlwb25rZUlkKTtcclxuXHJcbiAgICAgICAgZGF0YSA9IGVsZW1lbnQuZGF0YSgndnJzdGVpbnRlcm5lZ2FuYXJvY2lsYXByaXBvbmtlJyk7XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dBcnRpa2VsTWVyc2thRW5vdGEoZWxlbWVudDogYW55KSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk5ES0ludGVybmFsT3JkZXJFZGl0Rm9ybS5zaG93QXJ0aWtlbE1lcnNrYUVub3RhXCIpO1xyXG5cclxuICAgICAgICAvLyBwcmViZXJlbW8sIGthdGVyZSBzaWZyZSB6YXBvc2xlbmloIHNvZGlqbyB2IGl6YnJhbmUgc2t1cGluZVxyXG4gICAgICAgIGxldCBpemJyYW5pQXJ0aWtlbCA9ICg8c3RyaW5nPihlbGVtZW50LnZhbCgpLnRvU3RyaW5nKCkpKS50cmltKCk7XHJcbiAgICAgICAgbGV0IGl6YnJhbmlBcnRpa2VsbE1lcnNrYUVub3RhID0gXCJcIjtcclxuICAgICAgICBpZiAoIWlzRW1wdHkoaXpicmFuaUFydGlrZWwpKSB7XHJcbiAgICAgICAgICAgIC8vIHBvaXNjaSBtZXJza28gZW5vdG8gemEgYXJ0aWtlbFxyXG4gICAgICAgICAgICB0aGlzLl9hcnRpa2VsRW5vdGFNZXJlVmlld01vZGVsTGlzdC5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIml0ZW1cIiwgaXRlbSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5TaWZyYUFydGlrbGEudHJpbSgpID09PSBpemJyYW5pQXJ0aWtlbC50cmltKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpemJyYW5pQXJ0aWtlbGxNZXJza2FFbm90YSA9IGl0ZW0uTWVyc2thRW5vdGE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gemFwaXNpIG1lcnNrbyBlbm90byB2IHRleHQga29udHJvbGVcclxuICAgICAgICAkKHRoaXMuX3ZpZXdJZCArICcgJyArIHRoaXMuX21lcnNrYUVub3RhSGlkZGVuSWQpLnZhbChpemJyYW5pQXJ0aWtlbGxNZXJza2FFbm90YSk7XHJcbiAgICAgICAgJCh0aGlzLl92aWV3SWQgKyAnICcgKyB0aGlzLl9tZXJza2FFbm90YURpc3BsYXlJZCkudmFsKGl6YnJhbmlBcnRpa2VsbE1lcnNrYUVub3RhKTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu78vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL2FsZXJ0aWZ5L2luZGV4LmQudHNcIiAvPlxyXG5pbXBvcnQgeyBmaWx0ZXJUYWJsZVJvd3MsIGdsb2JhbCwgaXNVbkRlZmluZWQsIHNldE1vZGFsRm9ybVpJbmRleCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFdlYkdyaWQsU2FvcFdlYkdyaWRQcm9wZXJ0aWVzLFNhb3BXZWJHcmlkVG9vbGJhcixTYW9wV2ViR3JpZFRvb2xiYXJCdXR0b24sU2FvcFdlYkRhdGFUYWJsZX0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC1ncmlkXCI7XHJcbmltcG9ydCB7IFNhb3BXZkFjdGlvbiB9IGZyb20gXCIuLi9Db3JlL3Nhb3Atdmlldy1mb3JtXCI7XHJcbmltcG9ydCB7IFNhb3BTZXJ2aWNlc0NvcmUgfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXNlcnZpY2VzLWNvcmVcIjtcclxuaW1wb3J0IHsgTkRLSW50ZXJuYWxPcmRlcnNWaWV3IH0gZnJvbSBcIi4vTkRLSW50ZXJuYWxPcmRlcnMtdmlld1wiO1xyXG5pbXBvcnQgeyBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC10cmFuc2xhdGVcIjtcclxuXHJcbmNsYXNzIEludGVybmFOYXJvY2lsYURhdGEge1xyXG4gICAgbGV0b05hcm9jaWxhOiBudW1iZXI7XHJcbiAgICBzdGV2aWxrYU5hcm9jaWxhOiBudW1iZXI7XHJcbiAgICBzdGV2aWxrYVZyc3RpY2U6IG51bWJlcjtcclxuICAgIGRlbGV0ZUZpbmdlcnByaW50OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOREtJbnRlcm5hbE9yZGVyc0FjdGl2ZUdyaWRPcHRpb25zIHtcclxuICAgIGRhc2hib2FyZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgc2hvd1Rvb2xiYXI6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgc2hvd0ZpbHRlcjogYm9vbGVhbiA9IHRydWU7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOREtJbnRlcm5hbE9yZGVyc0FjdGl2ZUdyaWQge1xyXG4gICAgcHJpdmF0ZSBsaWJOYW1lOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9ncmlkT3B0aW9uczogTkRLSW50ZXJuYWxPcmRlcnNBY3RpdmVHcmlkT3B0aW9ucztcclxuICAgIC8vXHJcbiAgICBwcml2YXRlIGJ1dHRvbkNvcHlEaXNhYmxlZERpdklkOiBzdHJpbmcgPSBcIiNjb3B5QWN0aXZlSW50ZXJuYWxPcmRlckRpc2FibGVkRGl2XCI7XHJcbiAgICBwcml2YXRlIGJ1dHRvbkNvcHlEaXZJZDogc3RyaW5nID0gXCIjY29weUFjdGl2ZUludGVybmFsT3JkZXJEaXZcIjtcclxuICAgIHByaXZhdGUgZGl2QWt0aXZuYUlkOiBzdHJpbmcgPSBcIiNpbnRlcm5hTmFyb2NpbGFBa3Rpdm5hRGl2XCI7XHJcbiAgICBwcml2YXRlIHdlYkdyaWRBa3Rpdm5hSWQ6IHN0cmluZyA9IFwiI05ES0ludGVybmFOYXJvY2lsYUFrdGl2bmFHcmlkXCI7XHJcbiAgICBwcml2YXRlIHdlYkdyaWRBa3Rpdm5hUm93c0JvZHlJZDogc3RyaW5nID0gXCIjTkRLSW50ZXJuYU5hcm9jaWxhQWt0aXZuYUdyaWRCb2R5QWpheFwiO1xyXG4gICAgcHVibGljIHdlYkdyaWQ6IFNhb3BXZWJHcmlkO1xyXG4gICAgcHVibGljIG5ka0ludGVybmFsT3JkZXJzVmlldzogTkRLSW50ZXJuYWxPcmRlcnNWaWV3O1xyXG4gICAgcHVibGljIG5ka0ludGVybmFsT3JkZXJzRnVsbFZpZXc6IE5ES0ludGVybmFsT3JkZXJzVmlldztcclxuICAgIHB1YmxpYyBmb3JtVHJhbnNsYXRpb25TZXJ2aWNlOiBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlO1xyXG4gICAgcHJpdmF0ZSBfc2VhcmNoVmFsdWVJZDogc3RyaW5nID0gXCIjQWN0aXZlVGFibGVTZWFyY2hWYWx1ZVwiO1xyXG4gICAgcHJpdmF0ZSBfbWFpbkZvcm1EaXY6IEpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgICBwcml2YXRlIF9zZWFyY2hWYWx1ZTogSlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihsaWJOYW1lOiBzdHJpbmcsIGdyaWRPcHRpb25zOiBOREtJbnRlcm5hbE9yZGVyc0FjdGl2ZUdyaWRPcHRpb25zID0gbnVsbCkge1xyXG4gICAgICAgIGlmIChpc1VuRGVmaW5lZChncmlkT3B0aW9ucykpIHtcclxuICAgICAgICAgICAgZ3JpZE9wdGlvbnMgPSBuZXcgTkRLSW50ZXJuYWxPcmRlcnNBY3RpdmVHcmlkT3B0aW9ucygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9ncmlkT3B0aW9ucyA9IGdyaWRPcHRpb25zO1xyXG5cclxuICAgICAgICB0aGlzLmxpYk5hbWUgPSBsaWJOYW1lOyAgXHJcbiAgICAgICAgdGhpcy5mb3JtVHJhbnNsYXRpb25TZXJ2aWNlID0gbmV3IFNhb3BUcmFuc2xhdGlvblNlcnZpY2UoKTtcclxuICAgIH0gIFxyXG5cclxuICAgIGluaXRWaWV3KCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJOREtJbnRlcm5hbE9yZGVyc0FjdGl2ZUdyaWQuaW5pdFZpZXdcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX21haW5Gb3JtRGl2ID0gJCh0aGlzLmRpdkFrdGl2bmFJZCk7XHJcblxyXG4gICAgICAgIC8vIHByZXZhamFuamVcclxuICAgICAgICB0aGlzLnNldEZvcm1UZXJtaW5vbG9neUxpc3QoKTtcclxuXHJcbiAgICAgICAgLy8gcmVmcmVzaCBhY3RpdmUgaW50ZXJuYWwgb3JkZXJzXHJcbiAgICAgICAgdGhpcy5yZWZyZXNoQWN0aXZlSW50ZXJuYWxPcmRlcnNHcmlkRGF0YSgpO1xyXG5cclxuICAgICAgICAvLyBpbml0IGVkaXQgdmlld1xyXG4gICAgICAgIHRoaXMuaW5pdEVkaXRWaWV3KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRGb3JtVGVybWlub2xvZ3lMaXN0KCkge1xyXG4gICAgICAgIGxldCB0ZXJtaW5vbG9neSA9IFtcIkludGVybm8gbmFyb8SNaWxvIHphIGtvcGlyYW5qZSBuaSBpemJyYW5vLlwiXTtcclxuXHJcbiAgICAgICAgdGhpcy5mb3JtVHJhbnNsYXRpb25TZXJ2aWNlLnNldFRyYW5zbGF0aW9uc0xpc3QodGVybWlub2xvZ3kpO1xyXG4gICAgfSAgICAgXHJcblxyXG4gICAgaW5pdEVkaXRWaWV3KCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJOREtJbnRlcm5hbE9yZGVyc0FjdGl2ZUdyaWQuaW5pdEVkaXRWaWV3XCIpO1xyXG5cclxuICAgICAgICB0aGlzLm5ka0ludGVybmFsT3JkZXJzVmlldyA9IG5ldyBOREtJbnRlcm5hbE9yZGVyc1ZpZXcoXCIjbmRrSW50ZXJuYWxPcmRlcnNWaWV3MDAxXCIsIHRoaXMubGliTmFtZSArIFwiLm5ka0ludGVybmFsT3JkZXJzVmlld1wiKTtcclxuICAgICAgICB0aGlzLm5ka0ludGVybmFsT3JkZXJzVmlldy5yZWZyZXNoRGF0YSA9IHRoaXMucmVmcmVzaERhdGFBZnRlckVkaXRWaWV3LmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMubmRrSW50ZXJuYWxPcmRlcnNGdWxsVmlldyA9IG5ldyBOREtJbnRlcm5hbE9yZGVyc1ZpZXcoXCIjbmRrSW50ZXJuYWxPcmRlcnNWaWV3MDAyXCIsIHRoaXMubGliTmFtZSArIFwiLm5ka0ludGVybmFsT3JkZXJzRnVsbFZpZXdcIik7XHJcbiAgICAgICAgdGhpcy5uZGtJbnRlcm5hbE9yZGVyc0Z1bGxWaWV3LmZ1bGxTY3JlZW4gPSB0cnVlOyAgIFxyXG4gICAgICAgIHRoaXMubmRrSW50ZXJuYWxPcmRlcnNGdWxsVmlldy5yZWZyZXNoRGF0YSA9IHRoaXMucmVmcmVzaERhdGFBZnRlckVkaXRWaWV3LmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbWV0b2RhIHNlIGl6dmVkZSBwbyBlZGl0LCBhZGQgYWxpIGRlbGV0ZSBtZXRvZGkgdiB0aGlzLm5ka0ludGVybmFsT3JkZXJzVmlld1xyXG4gICAgcmVmcmVzaERhdGFBZnRlckVkaXRWaWV3KHNlbmRlcjogYW55KTogdm9pZCB7IFxyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJOREtJbnRlcm5hbE9yZGVyc0FjdGl2ZUdyaWQucmVmcmVzaERhdGFBZnRlckVkaXRWaWV3XCIpO1xyXG5cclxuICAgICAgICAvLyBvc3Zlemkgc2UgdGFiZWxhXHJcbiAgICAgICAgdGhpcy5yZWZyZXNoQWN0aXZlSW50ZXJuYWxPcmRlcnNHcmlkRGF0YSh0cnVlKTtcclxuICAgICAgICAvLyBrbGljZSBzZSBleHRlcm5hbCBtZXRvZGEsIGRhIHNlIGxhaGtvIG9zdmV6aWpvIHNlIGRydWdpIHBvZGF0a2kgbnByLiByaWdodCBzdW1tYXJ5IGRhdGFcclxuICAgICAgICB0aGlzLmFmdGVyUmVmcmVzaERhdGFBZnRlckVkaXRWaWV3RXh0ZXJuYWwoc2VuZGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWZ0ZXJSZWZyZXNoRGF0YUFmdGVyRWRpdFZpZXdFeHRlcm5hbChzZW5kZXI6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJOREtJbnRlcm5hbE9yZGVyc0FjdGl2ZUdyaWQuYWZ0ZXJSZWZyZXNoRGF0YUFmdGVyRWRpdFZpZXdFeHRlcm5hbFwiKTtcclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoQWN0aXZlSW50ZXJuYWxPcmRlcnNHcmlkRGF0YShzYW1vVnJzdGljZTogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk5ES0ludGVybmFsT3JkZXJzQWN0aXZlR3JpZC5yZWZyZXNoQWN0aXZlSW50ZXJuYWxPcmRlcnNHcmlkRGF0YVwiKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgcGFyYW1zID0geyBzYW1vVnJzdGljZTogc2Ftb1Zyc3RpY2UsIGRhc2hib2FyZDogdGhpcy5fZ3JpZE9wdGlvbnMuZGFzaGJvYXJkIH07XHJcblxyXG4gICAgICAgIGxldCBzYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICBfdGhpcy5zZXRDb3B5QnV0dG9uc1Zpc2liaWxpdHkoZmFsc2UpO1xyXG4gICAgICAgICAgICBfdGhpcy5yZWZyZXNoR3JpZERhdGEocmVzcG9uc2UpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOlwiSW50ZXJuYWxPcmRlci9HZXRBY3RpdmVJbnRlcm5hbE9yZGVyc1RhYmxlXCIgXHJcbiAgICAgICAgICAgICxkYXRhOnBhcmFtc1xyXG4gICAgICAgICAgICAsdHlwZTpcIkdFVFwiXHJcbiAgICAgICAgfSk7ICAgICBcclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoR3JpZERhdGEoaHRtbENvbnRlbnQ6IHN0cmluZykge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJOREtJbnRlcm5hbE9yZGVyc0FjdGl2ZUdyaWQucmVmcmVzaEdyaWREYXRhXCIpO1xyXG5cclxuICAgICAgICBpZiAoJCh0aGlzLndlYkdyaWRBa3Rpdm5hSWQpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAkKHRoaXMud2ViR3JpZEFrdGl2bmFSb3dzQm9keUlkKS5odG1sKGh0bWxDb250ZW50KTtcclxuICAgICAgICAgICAgdGhpcy5pbml0V2ViR3JpZExpc3RuZXJzKCk7XHJcbiAgICAgICAgICAgIGlmICghaXNVbkRlZmluZWQodGhpcy5fc2VhcmNoVmFsdWUpICYmIHRoaXMuX3NlYXJjaFZhbHVlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5leGVjdXRlRmlsdGVyU2VhcmNoKHRoaXMuX3NlYXJjaFZhbHVlLnZhbCgpLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAkKHRoaXMuZGl2QWt0aXZuYUlkKS5odG1sKGh0bWxDb250ZW50KTtcclxuICAgICAgICAgICAgdGhpcy5nZXRXZWJHcmlkVG9vbGJhckFuZEluaXRXZWJHcmlkKCk7IFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRXZWJHcmlkVG9vbGJhckFuZEluaXRXZWJHcmlkKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJOREtJbnRlcm5hbE9yZGVyc0FjdGl2ZUdyaWQuZ2V0V2ViR3JpZFRvb2xiYXJBbmRJbml0V2ViR3JpZFwiKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgcGFyYW1zID0geyBqYXZhc2NyaXB0S25qaXpuaWNhOiBfdGhpcy5saWJOYW1lIH07XHJcblxyXG4gICAgICAgIGxldCBzYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICBfdGhpcy5zZXRDb3B5QnV0dG9uc1Zpc2liaWxpdHkoZmFsc2UpO1xyXG4gICAgICAgICAgICBfdGhpcy5pbml0V2ViR3JpZChyZXNwb25zZSk7XHJcbiAgICAgICAgICAgIF90aGlzLmluaXRGaWx0ZXJDb250cm9scygpOyAgXHJcbiAgICAgICAgfTtcclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246IFwiSW50ZXJuYWxPcmRlci9HZXRBY3RpdmVUYWJsZVRvb2xiYXJcIlxyXG4gICAgICAgICAgICAsIGRhdGE6IHBhcmFtc1xyXG4gICAgICAgICAgICAsIHR5cGU6IFwiR0VUXCJcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0V2ViR3JpZCh0b29sYmFyVGVtcGxhdGU6IHN0cmluZyA9IFwiXCIpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTkRLSW50ZXJuYWxPcmRlcnNBY3RpdmVHcmlkLmluaXRXZWJHcmlkXCIpO1xyXG5cclxuICAgICAgICBsZXQgY2FwdGlvblRvb2xiYXIgPSAkKHRoaXMud2ViR3JpZEFrdGl2bmFJZCkuYXR0cihcImNhcHRpb24tdG9vbGJhclwiKTtcclxuICAgICAgICBsZXQgY2FwdGlvbkFkZEJ1dHRvbiA9ICQodGhpcy53ZWJHcmlkQWt0aXZuYUlkKS5hdHRyKFwiY2FwdGlvbi1hZGRCdXR0b25cIik7XHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLndlYkdyaWQgPSBuZXcgU2FvcFdlYkdyaWQodGhpcy5saWJOYW1lICsgXCIud2ViR3JpZFwiKTtcclxuICAgICAgICB0aGlzLndlYkdyaWQuYWZ0ZXJDb2x1bW5DaGVja2JveENoYW5nZWQgPSB0aGlzLndlYkdyaWRBZnRlckNvbHVtbkNoZWNrYm94Q2hhbmdlZC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIGxldCBncmlkUHJvcGVydGllczogU2FvcFdlYkdyaWRQcm9wZXJ0aWVzO1xyXG4gICAgICAgIGxldCBncmlkVG9vbGJhcjogU2FvcFdlYkdyaWRUb29sYmFyO1xyXG4gICAgICAgIGxldCB0b29sYmFyQnV0dG9uczogU2FvcFdlYkdyaWRUb29sYmFyQnV0dG9uW10gPSBbXTtcclxuICAgICAgICBsZXQgZGF0YVRhYmxlOiBTYW9wV2ViRGF0YVRhYmxlO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgaWYgKHRoaXMuX2dyaWRPcHRpb25zLnNob3dUb29sYmFyKSB7XHJcbiAgICAgICAgICAgIHRvb2xiYXJCdXR0b25zLnB1c2goeyBpZDogXCJcIiwgY2FwdGlvbjogXCJcIiwgdGVtcGxhdGU6IHRvb2xiYXJUZW1wbGF0ZSB9KTtcclxuICAgICAgICAgICAgZ3JpZFRvb2xiYXIgPSB7IGlkOiBcInNhb3BXZWJHcmlkVEIxXCIsIGNhcHRpb246IGNhcHRpb25Ub29sYmFyLCBidXR0b25zOiB0b29sYmFyQnV0dG9ucyB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGF0YVRhYmxlID0ge2VuYWJsZWQ6IHRydWV9O1xyXG5cclxuICAgICAgICBncmlkUHJvcGVydGllcyA9IHtcclxuICAgICAgICAgICAgZ3JpZElkOiB0aGlzLndlYkdyaWRBa3Rpdm5hSWRcclxuICAgICAgICAgICAgLCB0b29sYmFyOiBncmlkVG9vbGJhclxyXG4gICAgICAgICAgICAsIGRhdGFUYWJsZTogZGF0YVRhYmxlXHJcbiAgICAgICAgfTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMud2ViR3JpZC5pbml0KGdyaWRQcm9wZXJ0aWVzKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0V2ViR3JpZExpc3RuZXJzKCk7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0RGFzaGJvYXJkU3BlY2lmaWNWaWV3KCk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdFdlYkdyaWRMaXN0bmVycygpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTkRLSW50ZXJuYWxPcmRlcnNBY3RpdmVHcmlkLmluaXRXZWJHcmlkTGlzdG5lcnNcIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIC8vIHByaWtheiBmdWxsIHNjcmVlbiBrbyBrbGlrbmUgbmEgdnJzdGljb1xyXG4gICAgICAgICQoXCJib2R5XCIpLm9mZihcImNsaWNrXCIsIHRoaXMud2ViR3JpZEFrdGl2bmFJZCArIFwiIHRyIHRkOm5vdCgudGQtYWN0aW9uLC50ZC1hY3Rpb24tY2hlY2tib3gpXCIpO1xyXG4gICAgICAgICQoXCJib2R5XCIpLm9uKFwiY2xpY2tcIiwgdGhpcy53ZWJHcmlkQWt0aXZuYUlkICsgXCIgdHIgdGQ6bm90KC50ZC1hY3Rpb24sLnRkLWFjdGlvbi1jaGVja2JveClcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBsZXQgc2VsZWN0ZWRSb3cgPSA8SFRNTEVsZW1lbnQ+JCh0aGlzKS5jbG9zZXN0KFwidHJcIilbMF07XHJcbiAgICAgICAgICAgIGxldCBkYXRhID0gX3RoaXMuZ2V0SW50ZXJuYU5hcm9jaWxhRGF0YUF0dHJpYnV0ZShzZWxlY3RlZFJvdyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWlzVW5EZWZpbmVkKGRhdGEubGV0b05hcm9jaWxhKSAmJiAhaXNVbkRlZmluZWQoZGF0YS5zdGV2aWxrYU5hcm9jaWxhKSAmJiAhaXNVbkRlZmluZWQoZGF0YS5zdGV2aWxrYVZyc3RpY2UpKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5uZGtJbnRlcm5hbE9yZGVyc0Z1bGxWaWV3LnNob3dWaWV3Rm9ybShTYW9wV2ZBY3Rpb24ud2ZhRWRpdFJlY29yZCwgeyBsZXRvTmFyb2NpbGE6IGRhdGEubGV0b05hcm9jaWxhLCBzdGV2aWxrYU5hcm9jaWxhOiBkYXRhLnN0ZXZpbGthTmFyb2NpbGEsIHN0ZXZpbGthVnJzdGljZTogZGF0YS5zdGV2aWxrYVZyc3RpY2UgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJCh0aGlzLndlYkdyaWRBa3Rpdm5hSWQgKyBcIiAuTkRLSW50ZXJuYU5hcm9jaWxhR3JpZF9lZGl0XCIpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICQodGhpcy53ZWJHcmlkQWt0aXZuYUlkICsgXCIgLk5ES0ludGVybmFOYXJvY2lsYUdyaWRfZWRpdFwiKS5vbignY2xpY2snLCBmdW5jdGlvbiAocm93KSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJOREtJbnRlcm5hTmFyb2NpbGFHcmlkX2VkaXQuY2xpY2tcIik7XHJcbiAgICAgICAgICAgIGxldCBfYnRuRWRpdCA9IHJvdy5jdXJyZW50VGFyZ2V0O1xyXG4gICAgICAgICAgICBsZXQgYnRuRW5hYmxlZCA9IF9idG5FZGl0LmdldEF0dHJpYnV0ZShcImRhdGEtZW5hYmxlZFwiKTtcclxuICAgICAgICAgICAgaWYgKGJ0bkVuYWJsZWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IFwidHJ1ZVwiKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IF90aGlzLmdldEludGVybmFOYXJvY2lsYURhdGFBdHRyaWJ1dGUoX2J0bkVkaXQpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMubmRrSW50ZXJuYWxPcmRlcnNGdWxsVmlldy5zaG93Vmlld0Zvcm0oU2FvcFdmQWN0aW9uLndmYUVkaXRSZWNvcmQsIHsgbGV0b05hcm9jaWxhOiBkYXRhLmxldG9OYXJvY2lsYSwgc3Rldmlsa2FOYXJvY2lsYTogZGF0YS5zdGV2aWxrYU5hcm9jaWxhLCBzdGV2aWxrYVZyc3RpY2U6IGRhdGEuc3Rldmlsa2FWcnN0aWNlIH0pOyBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkKHRoaXMud2ViR3JpZEFrdGl2bmFJZCArIFwiIC5OREtJbnRlcm5hTmFyb2NpbGFHcmlkX2RlbGV0ZVwiKS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAkKHRoaXMud2ViR3JpZEFrdGl2bmFJZCArIFwiIC5OREtJbnRlcm5hTmFyb2NpbGFHcmlkX2RlbGV0ZVwiKS5vbignY2xpY2snLCBmdW5jdGlvbiAocm93KSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJOREtJbnRlcm5hTmFyb2NpbGFHcmlkX2RlbGV0ZS5jbGlja1wiKTtcclxuICAgICAgICAgICAgbGV0IF9idG5EZWxldGUgPSByb3cuY3VycmVudFRhcmdldDtcclxuICAgICAgICAgICAgbGV0IGJ0bkVuYWJsZWQgPSBfYnRuRGVsZXRlLmdldEF0dHJpYnV0ZShcImRhdGEtZW5hYmxlZFwiKTtcclxuICAgICAgICAgICAgaWYgKGJ0bkVuYWJsZWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IFwidHJ1ZVwiKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IF90aGlzLmdldEludGVybmFOYXJvY2lsYURhdGFBdHRyaWJ1dGUoX2J0bkRlbGV0ZSk7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5uZGtJbnRlcm5hbE9yZGVyc1ZpZXcuZGVsZXRlUmVjb3JkKHsgbGV0b05hcm9jaWxhOiBkYXRhLmxldG9OYXJvY2lsYSwgc3Rldmlsa2FOYXJvY2lsYTogZGF0YS5zdGV2aWxrYU5hcm9jaWxhLCBzdGV2aWxrYVZyc3RpY2U6IGRhdGEuc3Rldmlsa2FWcnN0aWNlLCBkZWxldGVGaW5nZXJwcmludDogZGF0YS5kZWxldGVGaW5nZXJwcmludCB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLndlYkdyaWQuaW5pdFdlYkdyaWRDb2x1bW5DaGVja2JveEJpbmRDbGlja0V2ZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgd2ViR3JpZEFmdGVyQ29sdW1uQ2hlY2tib3hDaGFuZ2VkKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJOREtJbnRlcm5hbE9yZGVyc0FjdGl2ZUdyaWQud2ViR3JpZEFmdGVyQ29sdW1uQ2hlY2tib3hDaGFuZ2VkXCIpO1xyXG5cclxuICAgICAgICBsZXQgY2hlY2tlZCA9IHRoaXMuZ2V0Q2hlY2tib3hDaGVja1ZhbHVlKHRoaXMud2ViR3JpZC5tYXJrZWRDb2x1bW5DaGVja2JveCk7O1xyXG4gICAgICAgIHRoaXMuc2V0Q29weUJ1dHRvbnNWaXNpYmlsaXR5KGNoZWNrZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldENvcHlCdXR0b25zVmlzaWJpbGl0eShjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk5ES0ludGVybmFsT3JkZXJzQWN0aXZlR3JpZC5zZXRDb3B5QnV0dG9uc1Zpc2liaWxpdHlcIik7XHJcblxyXG4gICAgICAgIGxldCBidXR0b25Db3B5RGlzYWJsZWREaXZFbGVtZW50ID0gdGhpcy5fbWFpbkZvcm1EaXYuZmluZCh0aGlzLmJ1dHRvbkNvcHlEaXNhYmxlZERpdklkKTtcclxuICAgICAgICBsZXQgYnV0dG9uQ29weURpdkVsZW1lbnQgPSB0aGlzLl9tYWluRm9ybURpdi5maW5kKHRoaXMuYnV0dG9uQ29weURpdklkKTtcclxuXHJcbiAgICAgICAgaWYgKGNoZWNrZWQgPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgYnV0dG9uQ29weURpc2FibGVkRGl2RWxlbWVudC5zaG93KCk7XHJcbiAgICAgICAgICAgIGJ1dHRvbkNvcHlEaXZFbGVtZW50LmhpZGUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBidXR0b25Db3B5RGlzYWJsZWREaXZFbGVtZW50LmhpZGUoKTtcclxuICAgICAgICAgICAgYnV0dG9uQ29weURpdkVsZW1lbnQuc2hvdygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRJbnRlcm5hTmFyb2NpbGFEYXRhQXR0cmlidXRlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSW50ZXJuYU5hcm9jaWxhRGF0YSB7XHJcbiAgICAgICAgbGV0IGRhdGEgPSBuZXcgSW50ZXJuYU5hcm9jaWxhRGF0YSgpO1xyXG5cclxuICAgICAgICBkYXRhLmxldG9OYXJvY2lsYSA9IHBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1sZXRvbmFyb2NpbGFcIikpO1xyXG4gICAgICAgIGRhdGEuc3Rldmlsa2FOYXJvY2lsYSA9IHBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1zdGV2aWxrYW5hcm9jaWxhXCIpKTtcclxuICAgICAgICBkYXRhLnN0ZXZpbGthVnJzdGljZSA9IHBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1zdGV2aWxrYXZyc3RpY2VcIikpO1xyXG4gICAgICAgIGRhdGEuZGVsZXRlRmluZ2VycHJpbnQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtZGVsZXRlZmluZ2VycHJpbnRcIik7XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRGaWx0ZXJDb250cm9scygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTkRLSW50ZXJuYWxPcmRlcnNBY3RpdmVHcmlkLmluaXRGaWx0ZXJDb250cm9sc1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2VhcmNoVmFsdWUgPSB0aGlzLl9tYWluRm9ybURpdi5maW5kKHRoaXMuX3NlYXJjaFZhbHVlSWQpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIHRoaXMuX3NlYXJjaFZhbHVlLm9mZihcImtleXVwXCIpO1xyXG4gICAgICAgIHRoaXMuX3NlYXJjaFZhbHVlLm9uKFwia2V5dXBcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBfdGhpcy5leGVjdXRlRmlsdGVyU2VhcmNoKCQodGhpcykudmFsKCkudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhlY3V0ZUZpbHRlclNlYXJjaChzZWFyY2hWYWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJOREtJbnRlcm5hbE9yZGVyc0FjdGl2ZUdyaWQuZXhlY3V0ZUZpbHRlclNlYXJjaFwiKTtcclxuXHJcbiAgICAgICAgLy8gdG9sZSBuaSBkZWxvdmFsbzoga28gc2UgamUgc3ByZW1lbmlsbyBsZXRvLCBqZSBzZSB2ZWRubyBmaWx0cmlyYWwgc3RhcmUgcG9kYXRrZSBvZCBwcmVqc25qZWdhIGxldGFcclxuICAgICAgICAvL2xldCBvVGFibGUgPSB0aGlzLndlYkdyaWQuZGF0YVRhYmxlO1xyXG4gICAgICAgIC8vb1RhYmxlLnNlYXJjaChzZWFyY2hWYWwpLmRyYXcoKTtcclxuXHJcbiAgICAgICAgZmlsdGVyVGFibGVSb3dzKHNlYXJjaFZhbCwgdGhpcy5kaXZBa3Rpdm5hSWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZFJlY29yZCgpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTkRLSW50ZXJuYWxPcmRlcnNBY3RpdmVHcmlkLmFkZFJlY29yZFwiKTtcclxuICAgICAgICB0aGlzLm5ka0ludGVybmFsT3JkZXJzVmlldy5zaG93Vmlld0Zvcm0oU2FvcFdmQWN0aW9uLndmYUFkZFJlY29yZCwgbnVsbCwgbnVsbCk7XHJcbiAgICB9ICBcclxuXHJcbiAgICBjb3B5UmVjb3JkKCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJOREtJbnRlcm5hbE9yZGVyc0FjdGl2ZUdyaWQuY29weVJlY29yZFwiKTtcclxuICAgICAgICB0aGlzLmNvcHlJbnRlcm5hbE9yZGVyKHRoaXMud2ViR3JpZC5tYXJrZWRDb2x1bW5DaGVja2JveCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29weUludGVybmFsT3JkZXIoY2hlY2tib3g6IEpRdWVyeTxIVE1MSW5wdXRFbGVtZW50Pik6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJOREtJbnRlcm5hbE9yZGVyc0FjdGl2ZUdyaWQuY29weUludGVybmFsT3JkZXJcIik7XHJcblxyXG4gICAgICAgIGxldCBjaGVja2VkID0gdGhpcy5nZXRDaGVja2JveENoZWNrVmFsdWUoY2hlY2tib3gpO1xyXG5cclxuICAgICAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICAgICAgICBsZXQgZGF0YSA9IHRoaXMuZ2V0SW50ZXJuYU5hcm9jaWxhRGF0YUF0dHJpYnV0ZShjaGVja2JveFswXSk7XHJcbiAgICAgICAgICAgIHRoaXMubmRrSW50ZXJuYWxPcmRlcnNWaWV3LnNob3dWaWV3Rm9ybShTYW9wV2ZBY3Rpb24ud2ZhQWRkUmVjb3JkLCB7IGxldG9OYXJvY2lsYUlucHV0OiBkYXRhLmxldG9OYXJvY2lsYSwgc3Rldmlsa2FOYXJvY2lsYUlucHV0OiBkYXRhLnN0ZXZpbGthTmFyb2NpbGEsIHN0ZXZpbGthVnJzdGljZUlucHV0OiBkYXRhLnN0ZXZpbGthVnJzdGljZSB9LCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vcG90cmVibm8gaXpicmF0aSB2cnN0aWNvIFwiSW50ZXJubyBuYXJvxI1pbG8gemEga29waXJhbmplIG5pIGl6YnJhbm8uXCJcclxuICAgICAgICAgICAgYWxlcnRpZnkubWVzc2FnZSh0aGlzLmZvcm1UcmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiSW50ZXJubyBuYXJvxI1pbG8gemEga29waXJhbmplIG5pIGl6YnJhbm8uXCIpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q2hlY2tib3hDaGVja1ZhbHVlKGNoZWNrYm94OiBKUXVlcnk8SFRNTElucHV0RWxlbWVudD4pOiBib29sZWFuIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTkRLSW50ZXJuYWxPcmRlcnNBY3RpdmVHcmlkLmdldENoZWNrYm94Q2hlY2tWYWx1ZVwiKTtcclxuXHJcbiAgICAgICAgbGV0IGNoZWNrZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKGlzVW5EZWZpbmVkKGNoZWNrYm94KSkge1xyXG4gICAgICAgICAgICBjaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY2hlY2tlZCA9IGNoZWNrYm94LmlzKCc6Y2hlY2tlZCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGNoZWNrZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RGFzaGJvYXJkU3BlY2lmaWNWaWV3KCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJOREtJbnRlcm5hbE9yZGVyc0FjdGl2ZUdyaWQuc2V0RGFzaGJvYXJkU3BlY2lmaWNWaWV3XCIpO1xyXG5cclxuICAgICAgICBsZXQgaXNEYXNoQk5vYXJkVmlldyA9ICQodGhpcy53ZWJHcmlkQWt0aXZuYUlkKS5hdHRyKFwiZGF0YS1kYXNoYm9hcmR2aWV3XCIpLnRvTG93ZXJDYXNlKCkgPT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XHJcblxyXG4gICAgICAgIGlmIChpc0Rhc2hCTm9hcmRWaWV3KSB7XHJcbiAgICAgICAgICAgICQodGhpcy53ZWJHcmlkQWt0aXZuYUlkICsgXCJfd3JhcHBlclwiKS5hZGRDbGFzcyhcInNhb3AtdGFibGUtZGFzaGJvYXJkLW9kc290bm9zdFwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/aW1wb3J0IHsgZmlsdGVyVGFibGVSb3dzLCBnbG9iYWwsIGlzVW5EZWZpbmVkLCBzZXRNb2RhbEZvcm1aSW5kZXggfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BXZWJHcmlkLFNhb3BXZWJHcmlkUHJvcGVydGllcyxTYW9wV2ViR3JpZFRvb2xiYXIsU2FvcFdlYkdyaWRUb29sYmFyQnV0dG9uLFNhb3BXZWJEYXRhVGFibGV9IGZyb20gXCIuLi9Db21wb25lbnRzL3Nhb3AtZ3JpZFwiO1xyXG5pbXBvcnQgeyBTYW9wU2VydmljZXNDb3JlIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC1zZXJ2aWNlcy1jb3JlXCI7XHJcbmltcG9ydCB7IFNhb3BXZkFjdGlvbiB9IGZyb20gXCIuLi9jb3JlL3Nhb3Atdmlldy1mb3JtXCI7XHJcbmltcG9ydCB7IE5ES0ludGVybmFsT3JkZXJzVmlldyB9IGZyb20gXCIuL05ES0ludGVybmFsT3JkZXJzLXZpZXdcIjtcclxuXHJcbmNsYXNzIEFyY2hpdmVkRmlsdGVyVmFsdWVzIHtcclxuICAgIGxldG9OYXJvY2lsYTogbnVtYmVyO1xyXG59XHJcblxyXG5jbGFzcyBJbnRlcm5hTmFyb2NpbGFEYXRhIHtcclxuICAgIGxldG9OYXJvY2lsYTogbnVtYmVyO1xyXG4gICAgc3Rldmlsa2FOYXJvY2lsYTogbnVtYmVyO1xyXG4gICAgc3Rldmlsa2FWcnN0aWNlOiBudW1iZXI7XHJcbiAgICBkZWxldGVGaW5nZXJwcmludDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTkRLSW50ZXJuYWxPcmRlcnNBcmNoaXZlZEdyaWQge1xyXG4gICAgcHJpdmF0ZSBsaWJOYW1lOiBzdHJpbmc7XHJcblxyXG4gICAgcHJpdmF0ZSBidXR0b25Db3B5RGlzYWJsZWREaXZJZDogc3RyaW5nID0gXCIjY29weUFyY2hpdmVkSW50ZXJuYWxPcmRlckRpc2FibGVkRGl2XCI7XHJcbiAgICBwcml2YXRlIGJ1dHRvbkNvcHlEaXZJZDogc3RyaW5nID0gXCIjY29weUFyY2hpdmVkSW50ZXJuYWxPcmRlckRpdlwiO1xyXG4gICAgcHJpdmF0ZSBkaXZBcmhpdmlyYW5hSWQ6IHN0cmluZyA9IFwiI2ludGVybmFOYXJvY2lsYUFyaGl2aXJhbmFEaXZcIjtcclxuICAgIHByaXZhdGUgd2ViR3JpZEFyaGl2aXJhbmFJZDogc3RyaW5nID0gXCIjTkRLSW50ZXJuYU5hcm9jaWxhQXJoaXZpcmFuYUdyaWRcIjtcclxuICAgIHByaXZhdGUgd2ViR3JpZEFyaGl2aXJhbmFSb3dzQm9keUlkOiBzdHJpbmcgPSBcIiNOREtJbnRlcm5hTmFyb2NpbGFBcmhpdmlyYW5hR3JpZEJvZHlBamF4XCI7XHJcbiAgICBwdWJsaWMgd2ViR3JpZDogU2FvcFdlYkdyaWQ7XHJcbiAgICBwdWJsaWMgbmRrSW50ZXJuYWxPcmRlcnNGdWxsVmlldzogTkRLSW50ZXJuYWxPcmRlcnNWaWV3O1xyXG4gICAgcHVibGljIGxldG9GaWx0ZXJJZDogc3RyaW5nID0gXCIjTGV0b05hcm9jaWxhXCI7XHJcbiAgICBwcml2YXRlIF9zZWFyY2hWYWx1ZUlkOiBzdHJpbmcgPSBcIiNBcmNoaXZlZFRhYmxlU2VhcmNoVmFsdWVcIjtcclxuICAgIHByaXZhdGUgX21haW5Gb3JtRGl2OiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gICAgcHJpdmF0ZSBfc2VhcmNoVmFsdWU6IEpRdWVyeTxIVE1MRWxlbWVudD47XHJcblxyXG4gICAgY29uc3RydWN0b3IobGliTmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5saWJOYW1lID0gbGliTmFtZTsgXHJcbiAgICB9ICBcclxuXHJcbiAgICBpbml0VmlldygpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTkRLSW50ZXJuYWxPcmRlcnNBcmNoaXZlZEdyaWQuaW5pdFZpZXdcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX21haW5Gb3JtRGl2ID0gJCh0aGlzLmRpdkFyaGl2aXJhbmFJZCk7XHJcblxyXG4gICAgICAgIC8vIGFyY2hpdmVkIGludGVybmFsIG9yZGVyc1xyXG4gICAgICAgIHRoaXMucmVmcmVzaEFyY2hpdmVJbnRlcm5hbE9yZGVyc0dyaWREYXRhKCk7XHJcblxyXG4gICAgICAgIC8vIGluaXQgZWRpdCB2aWV3XHJcbiAgICAgICAgdGhpcy5pbml0RWRpdFZpZXcoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0RWRpdFZpZXcoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk5ES0ludGVybmFsT3JkZXJzQXJjaGl2ZWRHcmlkLmluaXRFZGl0Vmlld1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy5uZGtJbnRlcm5hbE9yZGVyc0Z1bGxWaWV3ID0gbmV3IE5ES0ludGVybmFsT3JkZXJzVmlldyhcIiNuZGtJbnRlcm5hbE9yZGVyc1ZpZXcwMDJcIiwgdGhpcy5saWJOYW1lICsgXCIubmRrSW50ZXJuYWxPcmRlcnNGdWxsVmlld1wiKTtcclxuICAgICAgICB0aGlzLm5ka0ludGVybmFsT3JkZXJzRnVsbFZpZXcuZnVsbFNjcmVlbiA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaEFyY2hpdmVJbnRlcm5hbE9yZGVyc0dyaWREYXRhKGxldG9OYXJvY2lsYTogbnVtYmVyID0gbnVsbCwgc2Ftb1Zyc3RpY2U6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJOREtJbnRlcm5hbE9yZGVyc0FyY2hpdmVkR3JpZC5yZWZyZXNoQXJjaGl2ZUludGVybmFsT3JkZXJzR3JpZERhdGFcIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgbGV0IHBhcmFtcyA9IHsgbGV0b05hcm9jaWxhOiBsZXRvTmFyb2NpbGEsIHNhbW9WcnN0aWNlOiBzYW1vVnJzdGljZSB9O1xyXG5cclxuICAgICAgICBsZXQgc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgX3RoaXMuc2V0Q29weUJ1dHRvbnNWaXNpYmlsaXR5KGZhbHNlKTtcclxuICAgICAgICAgICAgX3RoaXMucmVmcmVzaEdyaWREYXRhKHJlc3BvbnNlKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHNhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjogXCJJbnRlcm5hbE9yZGVyL0dldEFyY2hpdmVkSW50ZXJuYWxPcmRlcnNUYWJsZVwiXHJcbiAgICAgICAgICAgICwgZGF0YTogcGFyYW1zXHJcbiAgICAgICAgICAgICwgdHlwZTogXCJHRVRcIlxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hHcmlkRGF0YShodG1sQ29udGVudDogc3RyaW5nKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk5ES0ludGVybmFsT3JkZXJzQXJjaGl2ZWRHcmlkLnJlZnJlc2hHcmlkRGF0YVwiKTtcclxuXHJcbiAgICAgICAgaWYgKCQodGhpcy53ZWJHcmlkQXJoaXZpcmFuYUlkKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgJCh0aGlzLndlYkdyaWRBcmhpdmlyYW5hUm93c0JvZHlJZCkuaHRtbChodG1sQ29udGVudCk7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdFdlYkdyaWRMaXN0bmVycygpO1xyXG4gICAgICAgICAgICB0aGlzLmV4ZWN1dGVGaWx0ZXJTZWFyY2godGhpcy5fc2VhcmNoVmFsdWUudmFsKCkudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAkKHRoaXMuZGl2QXJoaXZpcmFuYUlkKS5odG1sKGh0bWxDb250ZW50KTtcclxuICAgICAgICAgICAgdGhpcy5nZXRXZWJHcmlkVG9vbGJhckFuZEluaXRXZWJHcmlkKCk7IFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRXZWJHcmlkVG9vbGJhckFuZEluaXRXZWJHcmlkKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJOREtJbnRlcm5hbE9yZGVyc0FyY2hpdmVkR3JpZC5nZXRXZWJHcmlkVG9vbGJhckFuZEluaXRXZWJHcmlkXCIpO1xyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIGxldCBwYXJhbXMgPSB7IGphdmFzY3JpcHRLbmppem5pY2E6IF90aGlzLmxpYk5hbWUgfTtcclxuXHJcbiAgICAgICAgbGV0IHNhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgICAgIHNhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIF90aGlzLnNldENvcHlCdXR0b25zVmlzaWJpbGl0eShmYWxzZSk7XHJcbiAgICAgICAgICAgIF90aGlzLmluaXRXZWJHcmlkKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgX3RoaXMuaW5pdEZpbHRlckNvbnRyb2xzKCk7ICAgIFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOiBcIkludGVybmFsT3JkZXIvR2V0QXJjaGl2ZWRUYWJsZVRvb2xiYXJcIlxyXG4gICAgICAgICAgICAsIGRhdGE6IHBhcmFtc1xyXG4gICAgICAgICAgICAsIHR5cGU6IFwiR0VUXCJcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0V2ViR3JpZCh0b29sYmFyVGVtcGxhdGU6IHN0cmluZykge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJOREtJbnRlcm5hbE9yZGVyc0FyY2hpdmVkR3JpZC5pbml0V2ViR3JpZFwiKTtcclxuXHJcbiAgICAgICAgbGV0IGNhcHRpb25Ub29sYmFyID0gJCh0aGlzLndlYkdyaWRBcmhpdmlyYW5hSWQpLmF0dHIoXCJjYXB0aW9uLXRvb2xiYXJcIik7XHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLndlYkdyaWQgPSBuZXcgU2FvcFdlYkdyaWQodGhpcy5saWJOYW1lICsgXCIud2ViR3JpZDJcIik7XHJcbiAgICAgICAgdGhpcy53ZWJHcmlkLmFmdGVyQ29sdW1uQ2hlY2tib3hDaGFuZ2VkID0gdGhpcy53ZWJHcmlkQWZ0ZXJDb2x1bW5DaGVja2JveENoYW5nZWQuYmluZCh0aGlzKTtcclxuICAgICAgICBsZXQgZ3JpZFByb3BlcnRpZXM6IFNhb3BXZWJHcmlkUHJvcGVydGllcztcclxuICAgICAgICBsZXQgZ3JpZFRvb2xiYXI6IFNhb3BXZWJHcmlkVG9vbGJhcjtcclxuICAgICAgICBsZXQgdG9vbGJhckJ1dHRvbnM6IFNhb3BXZWJHcmlkVG9vbGJhckJ1dHRvbltdID0gW107XHJcbiAgICAgICAgbGV0IGRhdGFUYWJsZTogU2FvcFdlYkRhdGFUYWJsZTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIC8vIGlkIGluIGNhcHRpb24gamUgemUgdiB0ZW1wbGF0ZVxyXG4gICAgICAgIHRvb2xiYXJCdXR0b25zLnB1c2goeyBpZDogXCJcIiwgY2FwdGlvbjogXCJcIiwgdGVtcGxhdGU6IHRvb2xiYXJUZW1wbGF0ZSB9KTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIGdyaWRUb29sYmFyID0geyBpZDogXCJzYW9wV2ViR3JpZFRCMlwiLCBjYXB0aW9uOiBjYXB0aW9uVG9vbGJhciwgYnV0dG9uczogdG9vbGJhckJ1dHRvbnMgfTtcclxuXHJcbiAgICAgICAgZGF0YVRhYmxlID0geyBlbmFibGVkOnRydWUgfTtcclxuXHJcbiAgICAgICAgZ3JpZFByb3BlcnRpZXMgPSB7XHJcbiAgICAgICAgICAgIGdyaWRJZDogdGhpcy53ZWJHcmlkQXJoaXZpcmFuYUlkXHJcbiAgICAgICAgICAgICwgdG9vbGJhcjogZ3JpZFRvb2xiYXJcclxuICAgICAgICAgICAgLCBkYXRhVGFibGU6IGRhdGFUYWJsZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLndlYkdyaWQuaW5pdChncmlkUHJvcGVydGllcyk7XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdFdlYkdyaWRMaXN0bmVycygpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRXZWJHcmlkTGlzdG5lcnMoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk5ES0ludGVybmFsT3JkZXJzQXJjaGl2ZWRHcmlkLmluaXRXZWJHcmlkTGlzdG5lcnNcIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIC8vIHByaWtheiByZWFkb25seSBmdWxsIHNjcmVlbiBcclxuICAgICAgICAkKFwiYm9keVwiKS5vZmYoXCJjbGlja1wiLCB0aGlzLndlYkdyaWRBcmhpdmlyYW5hSWQgKyBcIiB0ciB0ZDpub3QoLnRkLWFjdGlvbiwudGQtYWN0aW9uLWNoZWNrYm94KVwiKTtcclxuICAgICAgICAkKFwiYm9keVwiKS5vbihcImNsaWNrXCIsIHRoaXMud2ViR3JpZEFyaGl2aXJhbmFJZCArIFwiIHRyIHRkOm5vdCgudGQtYWN0aW9uLC50ZC1hY3Rpb24tY2hlY2tib3gpXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgbGV0IHNlbGVjdGVkUm93ID0gPEhUTUxFbGVtZW50PiQodGhpcykuY2xvc2VzdChcInRyXCIpWzBdO1xyXG4gICAgICAgICAgICBsZXQgZGF0YSA9IF90aGlzLmdldERhdGFWYWx1ZXMoc2VsZWN0ZWRSb3cpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFpc1VuRGVmaW5lZChkYXRhLmxldG9OYXJvY2lsYSkgJiYgIWlzVW5EZWZpbmVkKGRhdGEuc3Rldmlsa2FOYXJvY2lsYSkgJiYgIWlzVW5EZWZpbmVkKGRhdGEuc3Rldmlsa2FWcnN0aWNlKSkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMubmRrSW50ZXJuYWxPcmRlcnNGdWxsVmlldy5zaG93Vmlld0Zvcm0oU2FvcFdmQWN0aW9uLndmYUVkaXRSZWNvcmQsIHsgbGV0b05hcm9jaWxhOiBkYXRhLmxldG9OYXJvY2lsYSwgc3Rldmlsa2FOYXJvY2lsYTogZGF0YS5zdGV2aWxrYU5hcm9jaWxhLCBzdGV2aWxrYVZyc3RpY2U6IGRhdGEuc3Rldmlsa2FWcnN0aWNlIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMud2ViR3JpZC5pbml0V2ViR3JpZENvbHVtbkNoZWNrYm94QmluZENsaWNrRXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICB3ZWJHcmlkQWZ0ZXJDb2x1bW5DaGVja2JveENoYW5nZWQoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk5ES0ludGVybmFsT3JkZXJzQXJjaGl2ZWRHcmlkLndlYkdyaWRBZnRlckNvbHVtbkNoZWNrYm94Q2hhbmdlZFwiKTtcclxuXHJcbiAgICAgICAgbGV0IGNoZWNrZWQgPSB0aGlzLmdldENoZWNrYm94Q2hlY2tWYWx1ZSh0aGlzLndlYkdyaWQubWFya2VkQ29sdW1uQ2hlY2tib3gpOztcclxuICAgICAgICB0aGlzLnNldENvcHlCdXR0b25zVmlzaWJpbGl0eShjaGVja2VkKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRDb3B5QnV0dG9uc1Zpc2liaWxpdHkoY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJOREtJbnRlcm5hbE9yZGVyc0FyY2hpdmVkR3JpZC5zZXRDb3B5QnV0dG9uc1Zpc2liaWxpdHlcIik7XHJcblxyXG4gICAgICAgIGxldCBidXR0b25Db3B5RGlzYWJsZWREaXZFbGVtZW50ID0gdGhpcy5fbWFpbkZvcm1EaXYuZmluZCh0aGlzLmJ1dHRvbkNvcHlEaXNhYmxlZERpdklkKTtcclxuICAgICAgICBsZXQgYnV0dG9uQ29weURpdkVsZW1lbnQgPSB0aGlzLl9tYWluRm9ybURpdi5maW5kKHRoaXMuYnV0dG9uQ29weURpdklkKTtcclxuXHJcbiAgICAgICAgaWYgKGNoZWNrZWQgPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgYnV0dG9uQ29weURpc2FibGVkRGl2RWxlbWVudC5zaG93KCk7XHJcbiAgICAgICAgICAgIGJ1dHRvbkNvcHlEaXZFbGVtZW50LmhpZGUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBidXR0b25Db3B5RGlzYWJsZWREaXZFbGVtZW50LmhpZGUoKTtcclxuICAgICAgICAgICAgYnV0dG9uQ29weURpdkVsZW1lbnQuc2hvdygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXREYXRhVmFsdWVzKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSW50ZXJuYU5hcm9jaWxhRGF0YSB7XHJcbiAgICAgICAgbGV0IGRhdGEgPSBuZXcgSW50ZXJuYU5hcm9jaWxhRGF0YSgpO1xyXG5cclxuICAgICAgICBkYXRhLmxldG9OYXJvY2lsYSA9IHBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1sZXRvbmFyb2NpbGFcIikpO1xyXG4gICAgICAgIGRhdGEuc3Rldmlsa2FOYXJvY2lsYSA9IHBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1zdGV2aWxrYW5hcm9jaWxhXCIpKTtcclxuICAgICAgICBkYXRhLnN0ZXZpbGthVnJzdGljZSA9IHBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1zdGV2aWxrYXZyc3RpY2VcIikpO1xyXG5cclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0RmlsdGVyQ29udHJvbHMoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk5ES0ludGVybmFsT3JkZXJzQXJjaGl2ZWRHcmlkLmluaXRGaWx0ZXJDb250cm9sc1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2VhcmNoVmFsdWUgPSB0aGlzLl9tYWluRm9ybURpdi5maW5kKHRoaXMuX3NlYXJjaFZhbHVlSWQpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIHRoaXMuX3NlYXJjaFZhbHVlLm9mZihcImtleXVwXCIpO1xyXG4gICAgICAgIHRoaXMuX3NlYXJjaFZhbHVlLm9uKFwia2V5dXBcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBfdGhpcy5leGVjdXRlRmlsdGVyU2VhcmNoKCQodGhpcykudmFsKCkudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhlY3V0ZUZpbHRlclNlYXJjaChzZWFyY2hWYWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJOREtJbnRlcm5hbE9yZGVyc0FyY2hpdmVkR3JpZC5leGVjdXRlRmlsdGVyU2VhcmNoXCIpO1xyXG5cclxuICAgICAgICAvLyB0b2xlIG5pIGRlbG92YWxvOiBrbyBzZSBqZSBzcHJlbWVuaWxvIGxldG8sIGplIHNlIHZlZG5vIGZpbHRyaXJhbCBzdGFyZSBwb2RhdGtlIG9kIHByZWpzbmplZ2EgbGV0YVxyXG4gICAgICAgIC8vbGV0IG9UYWJsZSA9IHRoaXMud2ViR3JpZC5kYXRhVGFibGU7XHJcbiAgICAgICAgLy9vVGFibGUuc2VhcmNoKHNlYXJjaFZhbCkuZHJhdygpO1xyXG5cclxuICAgICAgICBmaWx0ZXJUYWJsZVJvd3Moc2VhcmNoVmFsLCB0aGlzLmRpdkFyaGl2aXJhbmFJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29weUFyY2hpdmVJbnRlcm5hbE9yZGVyKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJOREtJbnRlcm5hbE9yZGVyc0FyY2hpdmVkR3JpZC5jb3B5QXJjaGl2ZUludGVybmFsT3JkZXJcIik7XHJcblxyXG4gICAgICAgIHRoaXMuY29weUFyY2hpdmVJbnRlcm5hbE9yZGVyRXh0ZXJuYWwodGhpcy53ZWJHcmlkLm1hcmtlZENvbHVtbkNoZWNrYm94KTtcclxuICAgIH1cclxuXHJcbiAgICBjb3B5QXJjaGl2ZUludGVybmFsT3JkZXJFeHRlcm5hbChjaGVja2JveDogSlF1ZXJ5PEhUTUxJbnB1dEVsZW1lbnQ+KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk5ES0ludGVybmFsT3JkZXJzQXJjaGl2ZWRHcmlkLmNvcHlBcmNoaXZlSW50ZXJuYWxPcmRlckV4dGVybmFsXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGFyY2hpdmVkRmlsdGVyc0NoYW5nZWQoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk5ES0ludGVybmFsT3JkZXJzQXJjaGl2ZWRHcmlkLmFyY2hpdmVkRmlsdGVyc0NoYW5nZWRcIik7XHJcblxyXG4gICAgICAgIGxldCBhcmNoaXZlZEZpbHRlclZhbHVlcyA9IHRoaXMuZ2V0QXJjaGl2ZWRGaWx0ZXJWYWx1ZXMoKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWZyZXNoQXJjaGl2ZUludGVybmFsT3JkZXJzR3JpZERhdGEoYXJjaGl2ZWRGaWx0ZXJWYWx1ZXMubGV0b05hcm9jaWxhLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBcmNoaXZlZEZpbHRlclZhbHVlcygpOiBBcmNoaXZlZEZpbHRlclZhbHVlcyB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk5ES0ludGVybmFsT3JkZXJzQXJjaGl2ZWRHcmlkLmdldEZpbHRlclZhbHVlc1wiKTtcclxuXHJcbiAgICAgICAgbGV0IGxldG8gPSBudWxsO1xyXG4gICAgICAgIGxldCBsZXRvSW5wdXQgPSAkKHRoaXMubGV0b0ZpbHRlcklkKVxyXG4gICAgICAgIGxldCBsZXRvU3RyID0gU3RyaW5nKGxldG9JbnB1dC52YWwoKSk7XHJcbiAgICAgICAgaWYgKGxldG9TdHIubGVuZ3RoID09IDQgfHwgbGV0b1N0ci5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICBpZiAobGV0b1N0ci5sZW5ndGggPT0gNCkge1xyXG4gICAgICAgICAgICAgICAgbGV0byA9ICtsZXRvU3RyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IEFyY2hpdmVkRmlsdGVyVmFsdWVzKCk7XHJcbiAgICAgICAgcmVzdWx0LmxldG9OYXJvY2lsYSA9IGxldG87XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDaGVja2JveENoZWNrVmFsdWUoY2hlY2tib3g6IEpRdWVyeTxIVE1MSW5wdXRFbGVtZW50Pik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBjaGVja2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmIChpc1VuRGVmaW5lZChjaGVja2JveCkpIHtcclxuICAgICAgICAgICAgY2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNoZWNrZWQgPSBjaGVja2JveC5pcygnOmNoZWNrZWQnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjaGVja2VkO1xyXG4gICAgfVxyXG4gIC8vXHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/aW1wb3J0IHsgU2FvcFZpZXdGb3JtIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC12aWV3LWZvcm1cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBOREtJbnRlcm5hbE9yZGVyc1ZpZXcgZXh0ZW5kcyBTYW9wVmlld0Zvcm0ge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHZpZXdJZDpzdHJpbmcsbGliTmFtZTpzdHJpbmcgPSBcIlwiKXtcclxuICAgICAgICBzdXBlcih2aWV3SWQsIGxpYk5hbWUpO1xyXG4gICAgICAgIHRoaXMuc2V0RGljdGlvbmFyeSgpOyBcclxuICAgICAgICB0aGlzLnRpdGxlID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiSW50ZXJubyBuYXJvxI1pbG9cIik7XHJcbiAgICAgICAgdGhpcy5hZGRSZWNvcmRFbmRwb2ludCA9IFwiSW50ZXJuYWxPcmRlci9DcmVhdGVJbnRlcm5hbE9yZGVyXCI7XHJcbiAgICAgICAgdGhpcy5lZGl0UmVjb3JkRW5kcG9pbnQgPSBcIkludGVybmFsT3JkZXIvRWRpdEludGVybmFsT3JkZXJcIjtcclxuICAgICAgICB0aGlzLmRlbGV0ZVJlY29yZEVuZHBvaW50ID0gXCJJbnRlcm5hbE9yZGVyL0RlbGV0ZUludGVybmFsT3JkZXJcIjsgXHJcbiAgICB9XHJcblxyXG4gICAgc2V0RGljdGlvbmFyeSgpe1xyXG4gICAgICAgIGxldCBkaWN0aW9uYXJ5OiBzdHJpbmdbXSA9IFtcIkludGVybm8gbmFyb8SNaWxvXCIsXCJCcmlzYW5qZVwiLFwiQWxpIHN0ZSBwcmVwcmnEjWFuaSwgZGEgxb5lbGl0ZSBpemJyaXNhdGkgaW50ZXJubyBuYXJvxI1pbG8/XCJdO1xyXG4gICAgICAgIHRoaXMuc2V0VGVybWlub2xvZ3lMaXN0KGRpY3Rpb25hcnkpO1xyXG4gICAgfSBcclxuICBcclxuICAgIHB1YmxpYyBkZWxldGVSZWNvcmQoZGVsZXRlRGF0YTphbnkpOnZvaWR7XHJcbiAgICAgICAgbGV0IGRlbGV0VGl0bGUgPSB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJCcmlzYW5qZVwiKTtcclxuICAgICAgICBsZXQgZGVsZXRlTWVzc2FnZSA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIkFsaSBzdGUgcHJlcHJpxI1hbmksIGRhIMW+ZWxpdGUgaXpicmlzYXRpIGludGVybm8gbmFyb8SNaWxvP1wiKTsgICAgXHJcbiAgICAgICAgc3VwZXIuZGVsZXRlUmVjb3JkKGRlbGV0VGl0bGUsZGVsZXRlTWVzc2FnZSxkZWxldGVEYXRhKTtcclxuICAgIH0gIFxyXG5cclxuICAgIHB1YmxpYyBhZnRlclZpZXdTaG93U3VjY2VzcyhzZW5kZXI6YW55KTp2b2lke1xyXG4gICAgICAgIHRoaXMuTG9hZFZpZXdFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgTG9hZFZpZXdFdmVudHMgKCk6dm9pZHtcclxuICAgICAgICBsZXQgX3ZpZXdEaXYgPSAkKHRoaXMuaWQpO1xyXG4gICAgICAgIGlmIChfdmlld0Rpdi5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAvL1xyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCwgaXNVbkRlZmluZWQsIHNldE1vZGFsRm9ybVpJbmRleCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuLy9pbXBvcnQgeyBTYW9wUmlnaHRTaWRlYmFyLFNhb3BSaWdodFNpZGViYXJWaWV3IH0gZnJvbSAnLi4vQ29tcG9uZW50cy9zYW9wLXJpZ2h0LXNpZGViYXInO1xyXG5pbXBvcnQgeyBOREtJbnRlcm5hbE9yZGVyc0FjdGl2ZUdyaWQgfSBmcm9tIFwiLi9OREtJbnRlcm5hbE9yZGVycy1BY3RpdmUtZ3JpZFwiO1xyXG5pbXBvcnQgeyBOREtJbnRlcm5hbE9yZGVyc0FyY2hpdmVkR3JpZCB9IGZyb20gXCIuL05ES0ludGVybmFsT3JkZXJzLUFyY2hpdmVkLWdyaWRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBOREtJbnRlcm5hbE9yZGVycyB7XHJcbiAgICBwcml2YXRlIGxpYk5hbWU6IHN0cmluZztcclxuXHJcbiAgICBwcml2YXRlIG5ka0ludGVybmFsT3JkZXJzQWN0aXZlR3JpZDogTkRLSW50ZXJuYWxPcmRlcnNBY3RpdmVHcmlkO1xyXG4gICAgcHJpdmF0ZSBuZGtJbnRlcm5hbE9yZGVyc0FyY2hpdmVkR3JpZDogTkRLSW50ZXJuYWxPcmRlcnNBcmNoaXZlZEdyaWQ7XHJcbiAgICAvL3B1YmxpYyByaWdodFNpZGViYXI6IFNhb3BSaWdodFNpZGViYXI7XHJcbiAgICBcclxuICAgIGNvbnN0cnVjdG9yKGxpYk5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMubGliTmFtZSA9IGxpYk5hbWU7IFxyXG5cclxuICAgICAgICB0aGlzLm5ka0ludGVybmFsT3JkZXJzQWN0aXZlR3JpZCA9IG5ldyBOREtJbnRlcm5hbE9yZGVyc0FjdGl2ZUdyaWQodGhpcy5saWJOYW1lICsgXCIubmRrSW50ZXJuYWxPcmRlcnNBY3RpdmVHcmlkXCIpO1xyXG4gICAgICAgIHRoaXMubmRrSW50ZXJuYWxPcmRlcnNBY3RpdmVHcmlkLmFmdGVyUmVmcmVzaERhdGFBZnRlckVkaXRWaWV3RXh0ZXJuYWwgPSB0aGlzLnJlZnJlc2hEYXRhQWZ0ZXJFZGl0Vmlldy5iaW5kKHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLm5ka0ludGVybmFsT3JkZXJzQXJjaGl2ZWRHcmlkID0gbmV3IE5ES0ludGVybmFsT3JkZXJzQXJjaGl2ZWRHcmlkKHRoaXMubGliTmFtZSArIFwiLm5ka0ludGVybmFsT3JkZXJzQXJjaGl2ZWRHcmlkXCIpO1xyXG4gICAgICAgIHRoaXMubmRrSW50ZXJuYWxPcmRlcnNBcmNoaXZlZEdyaWQuY29weUFyY2hpdmVJbnRlcm5hbE9yZGVyRXh0ZXJuYWwgPSB0aGlzLmNvcHlJbnRlcm5hbE9yZGVyLmJpbmQodGhpcyk7XHJcbiAgICB9ICBcclxuXHJcbiAgICBpbml0VmlldygpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTkRLSW50ZXJuYWxPcmRlcnMuaW5pdFZpZXdcIik7XHJcblxyXG4gICAgICAgIC8vIGFjdGl2ZSBpbnRlcm5hbCBvcmRlcnNcclxuICAgICAgICB0aGlzLm5ka0ludGVybmFsT3JkZXJzQWN0aXZlR3JpZC5pbml0VmlldygpO1xyXG5cclxuICAgICAgICAvLyBhcmNoaXZlZCBpbnRlcm5hbCBvcmRlcnNcclxuICAgICAgICB0aGlzLm5ka0ludGVybmFsT3JkZXJzQXJjaGl2ZWRHcmlkLmluaXRWaWV3KCk7XHJcblxyXG4gICAgICAgIC8vIGluaXQgc2lkZWJhciByaWdodFxyXG4gICAgICAgIC8vdGhpcy5pbml0UmlnaHRTaWRlYmFyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9pbml0UmlnaHRTaWRlYmFyKCkge1xyXG4gICAgLy8gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk5ES0ludGVybmFsT3JkZXJzLmluaXRSaWdodFNpZGViYXJcIik7XHJcblxyXG4gICAgLy8gICAgdGhpcy5yaWdodFNpZGViYXIgPSBuZXcgU2FvcFJpZ2h0U2lkZWJhcigpO1xyXG4gICAgLy8gICAgdGhpcy5yaWdodFNpZGViYXIuYmluZENhcm91c2VsRGl2KFwiI3JpZ2h0LXNpZGViYXItYWpheFwiLFNhb3BSaWdodFNpZGViYXJWaWV3LkludGVybmFsT3JkZXJzKTtcclxuICAgIC8vICAgIHRoaXMucmlnaHRTaWRlYmFyLnJlZnJlc2hOZGtJbnRlcm5hbE9yZGVyc1N1bW1hcnkoXCIjbmRrSW50ZXJuYWxPcmRlcnNTdW1tYXJ5XCIsXCIjc2FvcExvYWRpbmdTaWRlYmFyclwiKTsgICAgXHJcbiAgICAvL31cclxuXHJcbiAgICByZWZyZXNoRGF0YUFmdGVyRWRpdFZpZXcoKTogdm9pZCB7IFxyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJOREtJbnRlcm5hbE9yZGVycy5yZWZyZXNoRGF0YUFmdGVyRWRpdFZpZXdcIik7XHJcblxyXG4gICAgICAgIC8vdGhpcy5yaWdodFNpZGViYXIucmVmcmVzaE5ka0ludGVybmFsT3JkZXJzU3VtbWFyeShcIiNuZGtJbnRlcm5hbE9yZGVyc1N1bW1hcnlcIiwgXCIjc2FvcExvYWRpbmdTaWRlYmFyclwiKTsgIFxyXG4gICAgfVxyXG5cclxuICAgIC8vIG1ldG9kYSBpeiBhcmNoaXZlZCBncmlkIGtsYXNhXHJcbiAgICBjb3B5SW50ZXJuYWxPcmRlcihjaGVja2JveDogSlF1ZXJ5PEhUTUxJbnB1dEVsZW1lbnQ+KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk5ES0ludGVybmFsT3JkZXJzLmNvcHlJbnRlcm5hbE9yZGVyXCIpO1xyXG5cclxuICAgICAgICB0aGlzLm5ka0ludGVybmFsT3JkZXJzQWN0aXZlR3JpZC5jb3B5SW50ZXJuYWxPcmRlcihjaGVja2JveCk7XHJcbiAgICB9XHJcbiAgLy9cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwsIGlzVW5EZWZpbmVkLCBpc0VtcHR5IH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wV2ZBY3Rpb24gfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXZpZXctZm9ybVwiO1xyXG5pbXBvcnQgeyBTYW9wTXVsdGlzZWxlY3RPcHRpb25zIH0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC1tdWx0aXNlbGVjdFwiO1xyXG5pbXBvcnQgeyBTYW9wU2VsZWN0RHJvcERvd24gfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLXNlbGVjdC1kcm9wZG93blwiO1xyXG5pbXBvcnQgeyBPUE5OYWxvZ2VWaWV3IH0gZnJvbSBcIi4uL09QTi9PUE5OYWxvZ2Utdmlld1wiO1xyXG5pbXBvcnQgeyBTYW9wU2VydmljZXNDb3JlLCBTYW9wU2VydmljZXNDb3JlUGFyYW1zIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC1zZXJ2aWNlcy1jb3JlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgT1BOTmFsb2dlU2VsZWN0IGV4dGVuZHMgU2FvcFNlbGVjdERyb3BEb3duIHtcclxuICAvLyBwcml2YXRlIF9fdGFyZ2V0OnN0cmluZztcclxuICAvLyBwcml2YXRlIF9fY2FwdGlvbjpzdHJpbmc7ICBcclxuICBwcml2YXRlIF9fbGliTmFtZTpzdHJpbmc7XHJcbiAgcHVibGljIF9vcG5OYWxvZ2VWaWV3Ok9QTk5hbG9nZVZpZXc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGxpYk5hbWU6c3RyaW5nID0gXCJcIiwgb3B0aW9uczpTYW9wTXVsdGlzZWxlY3RPcHRpb25zID0gbnVsbCkge1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk9QTk5hbG9nZVNlbGVjdFwiKTtcclxuICAgIHN1cGVyKGxpYk5hbWUsb3B0aW9ucyk7XHJcbiAgICB0aGlzLl9fbGliTmFtZSA9IGxpYk5hbWU7ICAgXHJcbiAgICAvL1xyXG4gICAgdGhpcy5fb3BuTmFsb2dlVmlldyA9IG5ldyBPUE5OYWxvZ2VWaWV3KFwiI29wblRhc2tzUG9wdXBGb3JtXCIsdGhpcy5fX2xpYk5hbWUgICsgXCIuX29wbk5hbG9nZVZpZXdcIik7XHJcbiAgICB0aGlzLl9vcG5OYWxvZ2VWaWV3LmZ1bGxTY3JlZW4gPSBmYWxzZTsgICBcclxuICAgIHRoaXMuX29wbk5hbG9nZVZpZXcuYWZ0ZXJTdWJtaXRTdWNjZXNzID0gdGhpcy5yZWZyZXNoRGF0YUFmdGVyU3VibWl0LmJpbmQodGhpcyk7ICAgICBcclxuICB9IFxyXG5cclxuICBpbml0KHRhcmdldDogc3RyaW5nID0gXCJcIiwgY2FwdGlvbiA9IFwiXCIgKXtcclxuICAgIC8vIHRoaXMuX3RhcmdldCA9IHRhcmdldDtcclxuICAgIC8vIHRoaXMuX2NhcHRpb24gPSBjYXB0aW9uO1xyXG4gICAgLy9cclxuICAgIGlmICh0YXJnZXQubGVuZ3RoID09IDApe1xyXG4gICAgICB0YXJnZXQgPSBcIlNpZnJhTmFsb2dlXCI7XHJcbiAgICB9XHJcbiAgICBpZiAoY2FwdGlvbi5sZW5ndGggPT0gMCl7XHJcbiAgICAgIGNhcHRpb24gPSBcIk5hbG9nZVwiO1xyXG4gICAgfVxyXG4gICAgc3VwZXIuaW5pdCh0YXJnZXQsIGNhcHRpb24pO1xyXG4gICAgLy9cclxuICB9XHJcblxyXG4gIGFkZFJlY29yZCgpe1xyXG4gICAgbGV0IF9mdWxsVGl0bGUgPSB0aGlzLl9vcG5OYWxvZ2VWaWV3LnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJOYWxvZ2VcIik7XHJcbiAgICB0aGlzLl9vcG5OYWxvZ2VWaWV3LmZ1bGxUaXRsZSA9IF9mdWxsVGl0bGU7XHJcbiAgICB0aGlzLl9vcG5OYWxvZ2VWaWV3LnNob3dWaWV3Rm9ybShTYW9wV2ZBY3Rpb24ud2ZhQWRkUmVjb3JkLHsgfSk7ICAgICBcclxuICB9ICBcclxuXHJcbiAgZWRpdFJlY29yZChfc2lmcmFOYWxvZ2U6c3RyaW5nKXtcclxuICAgIGxldCBfZnVsbFRpdGxlID0gdGhpcy5fb3BuTmFsb2dlVmlldy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiTmFsb2dlXCIpO1xyXG4gICAgdGhpcy5fb3BuTmFsb2dlVmlldy5mdWxsVGl0bGUgPSBfZnVsbFRpdGxlO1xyXG4gICAgdGhpcy5fb3BuTmFsb2dlVmlldy5zaG93Vmlld0Zvcm0oU2FvcFdmQWN0aW9uLndmYUVkaXRSZWNvcmQseyBzaWZyYU5hbG9nZTogX3NpZnJhTmFsb2dlLCBmdWxsVmlldzogZmFsc2UgfSk7ICAgICBcclxuICB9ICBcclxuXHJcbiAgcHVibGljIG9uQWRkQnRuQ2xpY2soc2VuZGVyOmFueSk6dm9pZHtcclxuICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIm9uQWRkQnRuQ2xpY2suLi5TaWZyYUxva2FjaWplXCIpO1xyXG4gICAgICB0aGlzLmFkZFJlY29yZCgpO1xyXG4gIH0gIFxyXG5cclxuICBwdWJsaWMgb25FZGl0QnRuQ2xpY2soc2VuZGVyOmFueSk6dm9pZHtcclxuICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIm9uRWRpdEJ0bkNsaWNrLi4uU2lmcmFMb2thY2lqZVwiKTtcclxuICAgICAgbGV0IF9zaWZyYU5hbG9nZSA9IHRoaXMuc2VsZWN0ZWRDQi52YWwoKTtcclxuICAgICAgdGhpcy5lZGl0UmVjb3JkKF9zaWZyYU5hbG9nZSk7ICAgIFxyXG4gIH0gIFxyXG5cclxuICBwdWJsaWMgcmVmcmVzaERhdGFBZnRlclN1Ym1pdChyZXN1bHQ6IGFueSk6IHZvaWQge1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInN1Ym1pdC5hZnRlckV4ZWN1dGVTdWNjZXNzXCIpO1xyXG4gICAgLy9cclxuICAgIGlmICggKGlzVW5EZWZpbmVkKHJlc3VsdC5zdWNjZXNzKSA9PSBmYWxzZSkgJiYgKHJlc3VsdC5zdWNjZXNzID09IHRydWUpICkge1xyXG4gICAgICBsZXQgX3NpZnJhTmFsb2dlID0gXCJcIjtcclxuICAgICAgaWYgKGlzVW5EZWZpbmVkKHJlc3VsdC5kYXRhKSA9PSBmYWxzZSkge1xyXG4gICAgICAgIGxldCBqc29uRGF0YSA9IEpTT04ucGFyc2UocmVzdWx0LmRhdGEpO1xyXG4gICAgICAgIF9zaWZyYU5hbG9nZSA9IGpzb25EYXRhLlNpZnJhTmFsb2dlO1xyXG4gICAgICB9ICAgIFxyXG4gICAgICAvL1xyXG4gICAgICBsZXQgX3NlcnZpY2VzUGFyYW1zOlNhb3BTZXJ2aWNlc0NvcmVQYXJhbXMgPSB7XHJcbiAgICAgICAgYWN0aW9uOiBcIk9wblRhc2tzL0dldExpc3RcIlxyXG4gICAgICAgICwgZGF0YToge3NpZnJhTmFsb2dlOl9zaWZyYU5hbG9nZX1cclxuICAgICAgICAsIHR5cGU6IFwiR0VUXCJcclxuICAgICAgfTtcclxuICBcclxuICAgICAgdGhpcy5nZXREcm9wRG93bkl0ZW1zRGF0YShfc2VydmljZXNQYXJhbXMsIF9zaWZyYU5hbG9nZSk7XHJcbiAgICB9IFxyXG4gIH1cclxuXHJcbiAgLy9cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCJpbXBvcnQgeyBTYW9wVmlld0Zvcm0gfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXZpZXctZm9ybVwiO1xyXG5pbXBvcnQgeyBTYW9wU2lmcmFudGkgfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLXNpZnJhbnRpXCI7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIE9QTk5hbG9nZVZpZXcgZXh0ZW5kcyBTYW9wVmlld0Zvcm0ge1xyXG4gIHByaXZhdGUgX3Nhb3BTaWZyYW50aTpTYW9wU2lmcmFudGk7XHJcblxyXG4gICAgY29uc3RydWN0b3Iodmlld0lkOnN0cmluZyxsaWJOYW1lOnN0cmluZyA9IFwiXCIpe1xyXG4gICAgICAgIHN1cGVyKHZpZXdJZCxsaWJOYW1lKTtcclxuICAgICAgICB0aGlzLnRpdGxlID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiTmFsb2dlXCIpO1xyXG4gICAgICAgIHRoaXMuYWRkUmVjb3JkRW5kcG9pbnQgPSBcIk9wblRhc2tzL0NyZWF0ZVwiO1xyXG4gICAgICAgIHRoaXMuZWRpdFJlY29yZEVuZHBvaW50ID0gXCJPcG5UYXNrcy9FZGl0XCI7XHJcbiAgICAgICAgLy90aGlzLmRlbGV0ZVJlY29yZEVuZHBvaW50ID0gXCJPcG5UYXNrcy9EZWxldGVcIjsgXHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLl9zYW9wU2lmcmFudGkgPSBuZXcgU2FvcFNpZnJhbnRpKCk7XHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLmFmdGVyVmlld1Nob3dTdWNjZXNzID0gdGhpcy5pbml0VmlldztcclxuICAgICAgICB0aGlzLmFmdGVyU3VibWl0U3VjY2VzcyA9IHRoaXMuaW5pdFZpZXc7ICAgICAgICBcclxuICAgICAgfVxyXG5cclxuXHJcbiAgICAgIHNldERpY3Rpb25hcnkoKXtcclxuICAgICAgICBsZXQgZGljdGlvbmFyeTpzdHJpbmdbXSA9IFtcIk5hbG9nZVwiXTtcclxuICAgICAgICB0aGlzLnNldFRlcm1pbm9sb2d5TGlzdChkaWN0aW9uYXJ5KTtcclxuICAgIH0gXHJcblxyXG4gICAgICBwdWJsaWMgaW5pdFZpZXcoKTp2b2lke1xyXG4gICAgICAgIHRoaXMuc2V0RGljdGlvbmFyeSgpOyAgXHJcbiAgICAgICAgdGhpcy5Mb2FkVmlld0V2ZW50cygpO1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTaWZyYW50aS5pbml0KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHB1YmxpYyBMb2FkVmlld0V2ZW50cyAoKTp2b2lke1xyXG5cclxuICAgICAgfVxyXG5cclxuICAgICAgLy9cclxufSIsIu+7v2ltcG9ydCB7IGdsb2JhbCwgaXNVbkRlZmluZWQsIHNldE1vZGFsRm9ybVpJbmRleCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFdlYkdyaWQsU2FvcFdlYkdyaWRQcm9wZXJ0aWVzLFNhb3BXZWJHcmlkVG9vbGJhcixTYW9wV2ViR3JpZFRvb2xiYXJCdXR0b24sU2FvcFdlYkRhdGFUYWJsZX0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC1ncmlkXCI7XHJcbmltcG9ydCB7IFNhb3BXZkFjdGlvbiB9IGZyb20gXCIuLi9Db3JlL3Nhb3Atdmlldy1mb3JtXCI7XHJcbmltcG9ydCB7IE9QTlBvdG5pTmFsb2dpVmlldyB9IGZyb20gXCIuLi9PUE4vT1BOUG90bmlOYWxvZ2ktdmlld1wiO1xyXG5pbXBvcnQgeyBTYW9wU2VydmljZXNDb3JlIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC1zZXJ2aWNlcy1jb3JlXCI7XHJcbmltcG9ydCB7IFNhb3BSaWdodFNpZGViYXIsU2FvcFJpZ2h0U2lkZWJhclZpZXcgfSBmcm9tICcuLi9Db21wb25lbnRzL3Nhb3AtcmlnaHQtc2lkZWJhcic7XHJcblxyXG5leHBvcnQgY2xhc3MgT1BOUG90bmlOYWxvZ2lHcmlkT3B0aW9ucyB7XHJcbiAgICBkYXNoYm9hcmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHNob3dUb29sYmFyOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHNob3dGaWx0ZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgT1BOUG90bmlOYWxvZ2lHcmlkIHtcclxuICAgIHByaXZhdGUgbGliTmFtZTogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfZ3JpZE9wdGlvbnM6IE9QTlBvdG5pTmFsb2dpR3JpZE9wdGlvbnM7XHJcbiAgICBwcml2YXRlIF9zYW9wU2VydmljZXNDb3JlOiBTYW9wU2VydmljZXNDb3JlO1xyXG4gICAgLy9cclxuICAgIHB1YmxpYyB3ZWJHcmlkMTpTYW9wV2ViR3JpZDtcclxuICAgIHB1YmxpYyBvcG5Qb3RuaU5hbG9naU1pblZpZXc6T1BOUG90bmlOYWxvZ2lWaWV3O1xyXG4gICAgcHVibGljIG9wblBvdG5pTmFsb2dpRnVsbFZpZXc6T1BOUG90bmlOYWxvZ2lWaWV3O1xyXG4gICAgcHVibGljIHJpZ2h0U2lkZWJhcjogU2FvcFJpZ2h0U2lkZWJhcjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihsaWJOYW1lOiBzdHJpbmcsIGdyaWRPcHRpb25zOiBPUE5Qb3RuaU5hbG9naUdyaWRPcHRpb25zID0gbnVsbCkge1xyXG4gICAgICAgIGlmIChpc1VuRGVmaW5lZChncmlkT3B0aW9ucykpIHtcclxuICAgICAgICAgICAgZ3JpZE9wdGlvbnMgPSBuZXcgT1BOUG90bmlOYWxvZ2lHcmlkT3B0aW9ucygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9ncmlkT3B0aW9ucyA9IGdyaWRPcHRpb25zO1xyXG5cclxuICAgICAgICB0aGlzLmxpYk5hbWUgPSBsaWJOYW1lO1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRWaWV3KCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJPUE5Qb3RuaU5hbG9naUdyaWQuaW5pdFZpZXdcIik7XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdFdlYkdyaWQxKCk7XHJcbiAgICAgICAgdGhpcy5pbml0V2ViR3JpZDFMaXN0bmVycygpOyAgXHJcbiAgICAgICAgdGhpcy5pbml0RWRpdFZpZXcoKTtcclxuICAgICAgICB0aGlzLmluaXRSaWdodFNpZGViYXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0UmlnaHRTaWRlYmFyKCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJPUE5Qb3RuaU5hbG9naUdyaWQuaW5pdFJpZ2h0U2lkZWJhclwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5yaWdodFNpZGViYXIgPSBuZXcgU2FvcFJpZ2h0U2lkZWJhcigpO1xyXG4gICAgICAgIHRoaXMucmlnaHRTaWRlYmFyLmJpbmRDYXJvdXNlbERpdihcIiNyaWdodC1zaWRlYmFyLWFqYXhcIixTYW9wUmlnaHRTaWRlYmFyVmlldy5UcmF2ZWxPcmRlcnMpO1xyXG4gICAgICAgIHRoaXMucmlnaHRTaWRlYmFyLnJlZnJlc2hSZWdPUE5Qb3RuaU5hbG9naVN1bW1hcnkoXCIjb3BuUG90bmlOYWxvZ2lTdW1tYXJ5XCIsXCIjc2FvcExvYWRpbmdTaWRlYmFyclwiKTsgICAgXHJcbiAgICB9XHJcblxyXG4gICAgaW5pdFdlYkdyaWQxKCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJPUE5Qb3RuaU5hbG9naUdyaWQuaW5pdFdlYkdyaWQxXCIpO1xyXG5cclxuICAgICAgICBsZXQgd2dJZCA9IFwiI09QTlBvdG5pTmFsb2dpR3JpZFwiO1xyXG4gICAgICAgIGxldCBjYXB0aW9uVG9vbGJhciA9ICQod2dJZCkuYXR0cihcImNhcHRpb24tdG9vbGJhclwiKTtcclxuICAgICAgICBsZXQgY2FwdGlvbkFkZEJ1dHRvbiA9ICQod2dJZCkuYXR0cihcImNhcHRpb24tYWRkQnV0dG9uXCIpOyBcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMud2ViR3JpZDEgPSBuZXcgU2FvcFdlYkdyaWQodGhpcy5saWJOYW1lK1wiLndlYkdyaWQxXCIpO1xyXG4gICAgICAgIGxldCBncmlkUHJvcGVydGllczogU2FvcFdlYkdyaWRQcm9wZXJ0aWVzO1xyXG4gICAgICAgIGxldCBncmlkVG9vbGJhcjpTYW9wV2ViR3JpZFRvb2xiYXI7XHJcbiAgICAgICAgbGV0IHRvb2xiYXJCdXR0b25zOlNhb3BXZWJHcmlkVG9vbGJhckJ1dHRvbltdID0gW107XHJcbiAgICAgICAgbGV0IGRhdGFUYWJsZTpTYW9wV2ViRGF0YVRhYmxlO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdG9vbGJhckJ1dHRvbnMucHVzaCh7aWQ6XCJhZGRUb1wiLGNhcHRpb246Y2FwdGlvbkFkZEJ1dHRvbixvbkNsaWNrRXZlbnQ6dGhpcy5saWJOYW1lK1wiLmFkZFJlY29yZCgpO1wifSk7ICAgICAgICBcclxuICAgICAgICBncmlkVG9vbGJhciA9IHtpZDpcInNhb3BXZWJHcmlkVEIxXCIsY2FwdGlvbjpjYXB0aW9uVG9vbGJhcixidXR0b25zOnRvb2xiYXJCdXR0b25zfTtcclxuICAgXHJcbiAgICAgICAgZGF0YVRhYmxlID0geyBlbmFibGVkOnRydWUsY29sdW1uRGVmc1NldHRpbmdzOlt7b3JkZXJhYmxlOiB0cnVlLCB0YXJnZXRzOiAgXCJuby1zb3J0XCJ9XSxvcmRlcjogW1sgMiwgXCJkZXNjXCIgXSwgWyAzLCBcImRlc2NcIiBdXSxjb2xTZXR0aW5nczp0cnVlfTtcclxuXHJcbiAgICAgICAgZ3JpZFByb3BlcnRpZXMgPSB7XHJcbiAgICAgICAgICAgIGdyaWRJZDp3Z0lkXHJcbiAgICAgICAgICAgICx0b2dnbGVQYW5lbDp7ZW5hYmxlZDpmYWxzZX1cclxuICAgICAgICAgICAgLHRvb2xiYXI6Z3JpZFRvb2xiYXJcclxuICAgICAgICAgICAgLGRhdGFUYWJsZTpkYXRhVGFibGVcclxuICAgICAgICAgICAgfTsgICAgICAgIFxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy53ZWJHcmlkMS5pbml0KGdyaWRQcm9wZXJ0aWVzKTsgICBcclxuICAgIH1cclxuXHJcbiAgICBpbml0V2ViR3JpZDFMaXN0bmVycygpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiT1BOUG90bmlOYWxvZ2lHcmlkLmluaXRXZWJHcmlkMUxpc3RuZXJzXCIpO1xyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgICQoXCJib2R5XCIpLm9mZihcImNsaWNrXCIsIFwiI09QTlBvdG5pTmFsb2dpR3JpZCB0ZDpub3QoLnRkLWFjdGlvbilcIik7XHJcbiAgICAgICAgJChcImJvZHlcIikub24oXCJjbGlja1wiLCBcIiNPUE5Qb3RuaU5hbG9naUdyaWQgdGQ6bm90KC50ZC1hY3Rpb24pXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGRhdGEgPSAkKHRoaXMpLmNsb3Nlc3QoXCJ0clwiKTtcclxuICAgICAgICAgICAgbGV0IGxldG9Qb3RuZWdhTmFsb2dhID0gZGF0YS5hdHRyKFwiZGF0YS1sZXRvXCIpO1xyXG4gICAgICAgICAgICBsZXQgc3Rldmlsa2FQb3RuZWdhTmFsb2dhID0gZGF0YS5hdHRyKFwiZGF0YS1zdGV2aWxrYVwiKTtcclxuICAgICAgICAgICAgX3RoaXMuZWRpdFJlY29yZChsZXRvUG90bmVnYU5hbG9nYSxzdGV2aWxrYVBvdG5lZ2FOYWxvZ2EpO1xyXG4gICAgICAgIH0pOyBcclxuICAgIFxyXG4gICAgICAgICQoXCIuT1BOUG90bmlOYWxvZ2lHcmlkX2VkaXRcIikub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgJChcIi5PUE5Qb3RuaU5hbG9naUdyaWRfZWRpdFwiKS5vbignY2xpY2snLCBmdW5jdGlvbihyb3cpe1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiT1BOUG90bmlOYWxvZ2lHcmlkX2VkaXQuY2xpY2tcIik7XHJcbiAgICAgICAgICAgICQoJyNkZXRhaWxzT1BOUG90bmlOYWxvZ2lGb3JtJykucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgIGxldCBfYnRuRWRpdCA9IHJvdy5jdXJyZW50VGFyZ2V0O1xyXG4gICAgICAgICAgICBsZXQgYnRuRW5hYmxlZCA9IF9idG5FZGl0LmdldEF0dHJpYnV0ZShcImRhdGEtZW5hYmxlZFwiKTtcclxuICAgICAgICAgICAgaWYgKGJ0bkVuYWJsZWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IFwidHJ1ZVwiKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbGV0b1BvdG5lZ2FOYWxvZ2EgPSBfYnRuRWRpdC5nZXRBdHRyaWJ1dGUoXCJkYXRhLUxldG9Qb3RuZWdhTmFsb2dhXCIpO1xyXG4gICAgICAgICAgICAgICAgbGV0IHN0ZXZpbGthUG90bmVnYU5hbG9nYSA9IF9idG5FZGl0LmdldEF0dHJpYnV0ZShcImRhdGEtU3Rldmlsa2FQb3RuZWdhTmFsb2dhXCIpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuZWRpdFJlY29yZChsZXRvUG90bmVnYU5hbG9nYSxzdGV2aWxrYVBvdG5lZ2FOYWxvZ2EpO1xyXG4gICAgICAgICAgICB9ICAgICAgICAgICAgXHJcbiAgICAgICAgfSk7ICAgIFxyXG5cclxuICAgICAgICAkKFwiLk9QTlBvdG5pTmFsb2dpR3JpZF9kZWxldGVcIikub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgJChcIi5PUE5Qb3RuaU5hbG9naUdyaWRfZGVsZXRlXCIpLm9uKCdjbGljaycsIGZ1bmN0aW9uKHJvdyl7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJPUE5Qb3RuaU5hbG9naUdyaWRfZGVsZXRlLmNsaWNrXCIpO1xyXG4gICAgICAgICAgICBsZXQgX2J0bkRlbGV0ZSA9IHJvdy5jdXJyZW50VGFyZ2V0O1xyXG4gICAgICAgICAgICBsZXQgYnRuRW5hYmxlZCA9IF9idG5EZWxldGUuZ2V0QXR0cmlidXRlKFwiZGF0YS1lbmFibGVkXCIpO1xyXG4gICAgICAgICAgICBpZiAoYnRuRW5hYmxlZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT0gXCJ0cnVlXCIpIHtcclxuICAgICAgICAgICAgICAgIGxldCBsZXRvUG90bmVnYU5hbG9nYSA9IF9idG5EZWxldGUuZ2V0QXR0cmlidXRlKFwiZGF0YS1MZXRvUG90bmVnYU5hbG9nYVwiKTtcclxuICAgICAgICAgICAgICAgIGxldCBzdGV2aWxrYVBvdG5lZ2FOYWxvZ2EgPSBfYnRuRGVsZXRlLmdldEF0dHJpYnV0ZShcImRhdGEtU3Rldmlsa2FQb3RuZWdhTmFsb2dhXCIpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMub3BuUG90bmlOYWxvZ2lNaW5WaWV3LmRlbGV0ZVJlY29yZCh7IGxldG9Qb3RuZWdhTmFsb2dhOiBsZXRvUG90bmVnYU5hbG9nYSwgc3Rldmlsa2FQb3RuZWdhTmFsb2dhOiBzdGV2aWxrYVBvdG5lZ2FOYWxvZ2EgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTsgICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIGFkZFJlY29yZCgpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiT1BOUG90bmlOYWxvZ2lHcmlkLmFkZFJlY29yZFwiKTtcclxuXHJcbiAgICAgICAgJCgnI2RldGFpbHNPUE5Qb3RuaU5hbG9naUZ1bGxGb3JtJykucmVtb3ZlKCk7XHJcbiAgICAgICAgdGhpcy5vcG5Qb3RuaU5hbG9naU1pblZpZXcuc2hvd1ZpZXdGb3JtKFNhb3BXZkFjdGlvbi53ZmFBZGRSZWNvcmQsIG51bGwsIG51bGwpO1xyXG4gICAgfSAgXHJcblxyXG4gICAgZWRpdFJlY29yZChsZXRvUG90bmVnYU5hbG9nYTogc3RyaW5nLCBzdGV2aWxrYVBvdG5lZ2FOYWxvZ2E6IHN0cmluZykge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJPUE5Qb3RuaU5hbG9naUdyaWQuZWRpdFJlY29yZFwiKTtcclxuXHJcbiAgICAgICAgbGV0IF9mdWxsVGl0bGUgPSB0aGlzLm9wblBvdG5pTmFsb2dpRnVsbFZpZXcudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIlVyZWRpOiBQb3RuaSBuYWxvZ1wiKStcIiBcIiArbGV0b1BvdG5lZ2FOYWxvZ2ErXCItXCIrc3Rldmlsa2FQb3RuZWdhTmFsb2dhO1xyXG4gICAgICAgIHRoaXMub3BuUG90bmlOYWxvZ2lGdWxsVmlldy5mdWxsVGl0bGUgPSBfZnVsbFRpdGxlO1xyXG4gICAgICAgIHRoaXMub3BuUG90bmlOYWxvZ2lGdWxsVmlldy5zaG93Vmlld0Zvcm0oU2FvcFdmQWN0aW9uLndmYUVkaXRSZWNvcmQseyBsZXRvUG90bmVnYU5hbG9nYTogbGV0b1BvdG5lZ2FOYWxvZ2EsIHN0ZXZpbGthUG90bmVnYU5hbG9nYTogc3Rldmlsa2FQb3RuZWdhTmFsb2dhLCBmdWxsVmlldzogdHJ1ZSB9KTsgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIGluaXRFZGl0VmlldygpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiT1BOUG90bmlOYWxvZ2lHcmlkLmluaXRFZGl0Vmlld1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy5vcG5Qb3RuaU5hbG9naUZ1bGxWaWV3ID0gbmV3IE9QTlBvdG5pTmFsb2dpVmlldyhcIiNvcG5Qb3RuaU5hbG9naVZpZXcwMDFcIix0aGlzLmxpYk5hbWUrXCIub3BuUG90bmlOYWxvZ2lGdWxsVmlld1wiKTtcclxuICAgICAgICB0aGlzLm9wblBvdG5pTmFsb2dpRnVsbFZpZXcuZnVsbFNjcmVlbiA9IHRydWU7ICAgXHJcbiAgICAgICAgdGhpcy5vcG5Qb3RuaU5hbG9naUZ1bGxWaWV3LnJlZnJlc2hEYXRhID0gdGhpcy5yZWZyZXNoR3JpZERhdGEuYmluZCh0aGlzKTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMub3BuUG90bmlOYWxvZ2lNaW5WaWV3ID0gbmV3IE9QTlBvdG5pTmFsb2dpVmlldyhcIiNvcG5Qb3RuaU5hbG9naVZpZXcwMDJcIix0aGlzLmxpYk5hbWUrXCIub3BuUG90bmlOYWxvZ2lNaW5WaWV3XCIpO1xyXG4gICAgICAgIHRoaXMub3BuUG90bmlOYWxvZ2lNaW5WaWV3LmZ1bGxTY3JlZW4gPSBmYWxzZTsgICBcclxuICAgICAgICB0aGlzLm9wblBvdG5pTmFsb2dpTWluVmlldy5yZWZyZXNoRGF0YSA9IHRoaXMucmVmcmVzaEdyaWREYXRhLmJpbmQodGhpcyk7XHJcbiAgICB9IFxyXG5cclxuICAgIHJlZnJlc2hEYXRhKGh0bWxDb250ZW50OiBzdHJpbmcpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiT1BOUG90bmlOYWxvZ2lHcmlkLnJlZnJlc2hEYXRhXCIpO1xyXG5cclxuICAgICAgICBpZighdGhpcy5fZ3JpZE9wdGlvbnMuZGFzaGJvYXJkKVxyXG4gICAgICAgICAgICB0aGlzLndlYkdyaWQxLnJlcGxhY2VHcmlkUm93cyhodG1sQ29udGVudCk7XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdFdlYkdyaWQxTGlzdG5lcnMoKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9ncmlkT3B0aW9ucy5kYXNoYm9hcmQpXHJcbiAgICAgICAgICAgIHRoaXMucmlnaHRTaWRlYmFyLnJlZnJlc2hSZWdPUE5Qb3RuaU5hbG9naVN1bW1hcnkoXCIjb3BuUG90bmlOYWxvZ2lTdW1tYXJ5XCIsXCIjc2FvcExvYWRpbmdTaWRlYmFyclwiKTsgIFxyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hHcmlkRGF0YSgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiT1BOUG90bmlOYWxvZ2lHcmlkLnJlZnJlc2hHcmlkRGF0YVwiKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgLy8jVG9EbyNcclxuICAgICAgICAgICAgLy9fdGhpcy5vcG5Qb3RuaU5hbG9naVZpZXcucmVmcmVzaEVsZW1lbnREYXRhKHJlc3BvbnNlLFwiW2RhdGEtc3Rldmlsa2E9XFxcIjZcXFwiXVwiKTtcclxuICAgICAgICAgICAgX3RoaXMucmVmcmVzaERhdGEocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICAvL190aGlzLndlYkdyaWQxLnJlZnJlc2hEYXRhKCk7XHJcbiAgICAgICAgICAgIC8vX3RoaXMuaW5pdFdlYkdyaWQxTGlzdG5lcnMoKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjogXCJUcmF2ZWxPcmRlci9JbmRleFwiXHJcbiAgICAgICAgICAgICwgZGF0YTogbnVsbFxyXG4gICAgICAgICAgICAsIHR5cGU6IFwiR0VUXCJcclxuICAgICAgICB9KTsgIFxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWZ0ZXJSZWZyZXNoRGF0YUFmdGVyRWRpdFZpZXdFeHRlcm5hbChzZW5kZXI6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJPUE5Qb3RuaU5hbG9naUdyaWQuYWZ0ZXJSZWZyZXNoRGF0YUFmdGVyRWRpdFZpZXdFeHRlcm5hbFwiKTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu78vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL2FsZXJ0aWZ5L2luZGV4LmQudHNcIiAvPlxyXG5pbXBvcnQgeyBnbG9iYWwsIGdldFJlbGF0aXZlU2l0ZVVSTCwgZ2V0U2l0ZUFic29sdXRlVVJMLCBpc0VtcHR5LCBpc1VuRGVmaW5lZCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFZpZXdGb3JtLCBTYW9wV2ZBY3Rpb24gfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXZpZXctZm9ybVwiO1xyXG5pbXBvcnQgeyBTYW9wVXBsb2FkRmlsZXMgfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLXVwbG9hZC1maWxlc1wiO1xyXG5pbXBvcnQgeyBTYW9wQXR0YWNobWVudExpc3QgfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLWF0dGFjaG1lbnQtbGlzdFwiO1xyXG5pbXBvcnQgeyBPUE5Qb3RuaU5hbG9naUdvZ2dsZU1hcHNWaWV3IH0gZnJvbSBcIi4uL09QTi9PUE5Qb3RuaU5hbG9naUdvZ2dsZU1hcHMtdmlld1wiO1xyXG5pbXBvcnQgeyBTYW9wTWVzc2FnZURsZywgU2FvcE1zZ0RsZ0J1dHRvbiB9IGZyb20gJy4uL0NvbXBvbmVudHMvc2FvcC1tZXNzYWdlLWRsZyc7XHJcbi8vaW1wb3J0IHsgU2FvcE11bHRpc2VsZWN0IH0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC1tdWx0aXNlbGVjdFwiO1xyXG5pbXBvcnQgeyBTYW9wU2VydmljZXNDb3JlIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC1zZXJ2aWNlcy1jb3JlXCI7XHJcbmltcG9ydCB7IE9QTlNlbGVjdFBhc3NlbmdlcnNWaWV3IH0gZnJvbSBcIi4uL29wbi9PUE5TZWxlY3RQYXNzZW5nZXJzLXZpZXdcIjtcclxuaW1wb3J0IHsgU2FvcFNlbGVjdGl6ZVNlbGVjdFdyYXBlciB9IGZyb20gXCIuLi9Db21wb25lbnRzL3Nhb3Atc2VsZWN0aXplLXNlbGVjdC13XCI7XHJcbmltcG9ydCB7IFNhb3BTZWxlY3RpemVTZWxlY3RUb29sVGlwIH0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC1zZWxlY3RpemUtc2VsZWN0LXRvb2x0aXBcIjtcclxuaW1wb3J0IHsgU2FvcElucHV0TWFzayB9IGZyb20gXCIuLi9Db21wb25lbnRzL3Nhb3AtaW5wdXRtYXNrXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgT1BOUG90bmlOYWxvZ2lWaWV3IGV4dGVuZHMgU2FvcFZpZXdGb3JtIHtcclxuICBwcml2YXRlIF9mb3JtSWQ6c3RyaW5nO1xyXG4gIHByaXZhdGUgX3Nhb3BBdHRhY2htZW50TGlzdDogU2FvcEF0dGFjaG1lbnRMaXN0O1xyXG4gIHByaXZhdGUgX29wblBvdG5pTmFsb2dpR29nZ2xlTWFwc1ZpZXcgOk9QTlBvdG5pTmFsb2dpR29nZ2xlTWFwc1ZpZXc7XHJcbiAgcHJpdmF0ZSBfb3BuU2VsZWN0UGFzc2VuZ2Vyc1ZpZXc6T1BOU2VsZWN0UGFzc2VuZ2Vyc1ZpZXc7XHJcbiAgcHJpdmF0ZSBfc2FvcFNlbGVjdGl6ZVNlbGVjdFdyYXBlcjpTYW9wU2VsZWN0aXplU2VsZWN0V3JhcGVyO1xyXG4gIHByaXZhdGUgX3Nhb3BTZWxlY3RpemVTZWxlY3RUb29sVGlwOlNhb3BTZWxlY3RpemVTZWxlY3RUb29sVGlwO1xyXG4gIHByaXZhdGUgX3JlbG9hZEF0dGFjaG1lbnRzOmJvb2xlYW4gPSBmYWxzZTtcclxuICAvL1xyXG4gIHB1YmxpYyBzYW9wVXBsb2FkRmlsZXM6U2FvcFVwbG9hZEZpbGVzOyAgXHJcbiAgcHVibGljIF9yZW1vdmVMaW5rRGlhbG9nOlNhb3BWaWV3Rm9ybVxyXG5cclxuICBjb25zdHJ1Y3Rvcih2aWV3SWQ6c3RyaW5nLGxpYk5hbWU6c3RyaW5nID0gXCJcIil7XHJcbiAgICBzdXBlcih2aWV3SWQsbGliTmFtZSk7XHJcbiAgICAvL1xyXG4gICAgdGhpcy5fcmVsb2FkQXR0YWNobWVudHMgPSBmYWxzZTtcclxuICAgIHRoaXMudGl0bGUgPSB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJQb3RuaSBuYWxvZ1wiKTtcclxuICAgIHRoaXMuYWRkUmVjb3JkRW5kcG9pbnQgPSBcIlRyYXZlbE9yZGVyL0NyZWF0ZVRyYXZlbE9yZGVyXCI7XHJcbiAgICB0aGlzLmVkaXRSZWNvcmRFbmRwb2ludCA9IFwiVHJhdmVsT3JkZXIvRWRpdFRyYXZlbE9yZGVyXCI7XHJcbiAgICB0aGlzLmRlbGV0ZVJlY29yZEVuZHBvaW50ID0gXCJUcmF2ZWxPcmRlci9EZWxldGVUcmF2ZWxPcmRlclwiOyBcclxuICAgIHRoaXMuc2FvcFVwbG9hZEZpbGVzID0gbmV3IFNhb3BVcGxvYWRGaWxlcyh2aWV3SWQsbGliTmFtZStcIi5zYW9wVXBsb2FkRmlsZXNcIik7ICBcclxuICAgIHRoaXMuX29wblBvdG5pTmFsb2dpR29nZ2xlTWFwc1ZpZXcgPSBuZXcgT1BOUG90bmlOYWxvZ2lHb2dnbGVNYXBzVmlldyhcIiNvcG5Qb3RuaU5hbG9naVZpZXcwMDNcIixsaWJOYW1lKTtcclxuICAgIHRoaXMuX29wblNlbGVjdFBhc3NlbmdlcnNWaWV3ID0gbmV3IE9QTlNlbGVjdFBhc3NlbmdlcnNWaWV3KFwiI29wblBvdG5pTmFsb2dpVmlldzAwNFwiLGxpYk5hbWUrXCIuX29wblNlbGVjdFBhc3NlbmdlcnNWaWV3XCIpO1xyXG4gICAgdGhpcy5fb3BuU2VsZWN0UGFzc2VuZ2Vyc1ZpZXcub25CdG5Pa0NsaWNrID0gdGhpcy5vbkJ0bk9rQ2xpY2tFeC5iaW5kKHRoaXMpO1xyXG4gICAgdGhpcy5fc2FvcFNlbGVjdGl6ZVNlbGVjdFdyYXBlciA9IG5ldyBTYW9wU2VsZWN0aXplU2VsZWN0V3JhcGVyKHZpZXdJZCxsaWJOYW1lKTtcclxuICAgIHRoaXMuX3Nhb3BTZWxlY3RpemVTZWxlY3RUb29sVGlwID0gbmV3IFNhb3BTZWxlY3RpemVTZWxlY3RUb29sVGlwKCk7XHJcbiAgICAvL1xyXG4gICAgLy90aGlzLl9zZWxlY3RaYXBvc2xlbmkgPSBuZXcgU2FvcE11bHRpc2VsZWN0KGxpYk5hbWUrXCIuX3NlbGVjdFphcG9zbGVuaVwiLHtzZWxlY3RBbGw6ZmFsc2V9KTtcclxuICAgIC8vdGhpcy5fc2VsZWN0WmFwb3NsZW5pLmFmdGVyQ2hhbmdlQ29tbW9uRXZlbnQgPSB0aGlzLnJlZnJlc2hTZWxlY3RlZEVtcGxveWVlc0xpc3QuYmluZCh0aGlzKTtcclxuICAgIC8vXHJcbiAgICB0aGlzLmFmdGVyVmlld1Nob3dTdWNjZXNzID0gdGhpcy5pbml0VmlldztcclxuICAgIHRoaXMuYWZ0ZXJTdWJtaXRTdWNjZXNzID0gdGhpcy5yZWxvYWRWaWV3O1xyXG4gICAgdGhpcy5fc2FvcEF0dGFjaG1lbnRMaXN0ID0gbmV3IFNhb3BBdHRhY2htZW50TGlzdChcIiN0cmF2ZWxPcmRlckF0dGFjaG1lbnRzXCIsIGxpYk5hbWUgKyBcIi5fc2FvcEF0dGFjaG1lbnRMaXN0XCIpO1xyXG4gICAgdGhpcy5fc2FvcEF0dGFjaG1lbnRMaXN0LmluaXRDb21wb25lbnQoXHJcbiAgICAgIHtcclxuICAgICAgICAgIHZhbGlkYXRpb25GaW5nZXJwcmludENvbnRyb2xsZXI6IFwiU1BMRG9jdW1lbnRcIixcclxuICAgICAgICAgIHZhbGlkYXRpb25GaW5nZXJwcmludEFjdGlvbjogXCJWYWxpZGF0ZUF0dGFjaG1lbnRGaW5nZXJQcmludFwiLFxyXG4gICAgICAgICAgdmFsaWRhdGlvbkZpbmdlcnByaW50QmFubmVyRGl2SWQ6IHZpZXdJZCArIFwiICN1cGxvYWRGaWxlc1ZhbGlkYXRpb25zQWpheFwiLFxyXG4gICAgICAgICAgdmFsaWRhdGlvbkNvbnRyb2xsZXI6IFwiU1BMRG9jdW1lbnRcIixcclxuICAgICAgICAgIHZhbGlkYXRpb25BY3Rpb246IFwiVmFsaWRhdGVEb3dubG9hZGluZ0RvY3VtZW50QXR0YWNobWVudFwiLFxyXG4gICAgICAgICAgdmFsaWRhdGlvbkJhbm5lckRpdklkOiB2aWV3SWQgKyBcIiAjdXBsb2FkRmlsZXNWYWxpZGF0aW9uc0FqYXhcIixcclxuICAgICAgICAgIGRvd25sb2FkQ29udHJvbGxlcjogXCJTUExEb2N1bWVudFwiLFxyXG4gICAgICAgICAgZG93bmxvYWRBY3Rpb246IFwiRG93bmxvYWREb2N1bWVudEF0dGFjaG1lbnRcIixcclxuICAgICAgICAgIGRlbGV0ZWRBdHRhY2htZW50TGlzdElkOiB2aWV3SWQgKyBcIiBcIiArIFwiI1ByaXBvbmtlQnJpc2FuZVwiXHJcbiAgICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIHNldERpY3Rpb25hcnkoKXtcclxuICAgICAgbGV0IGRpY3Rpb25hcnk6c3RyaW5nW10gPSBbXCJVcmVkaTogUG90bmkgbmFsb2dcIixcIkJyaXNhbmplXCIsXCJBbGkgc3RlIHByZXByacSNYW5pLCBkYSDFvmVsaXRlIHByZWtsaWNhdGkgZG9nb2Rlaz9cIixcIkFsaSBzdGUgcHJlcHJpxI1hbmksIGRhIMW+ZWxpdGUgaXpicmlzYXRpIGl6YnJhbmVnYSBzb3BvdG5pa2E/XCIsXCJCcmlzYW5qZVwiXTtcclxuICAgICAgdGhpcy5zZXRUZXJtaW5vbG9neUxpc3QoZGljdGlvbmFyeSk7XHJcbiAgfSBcclxuICBcclxuICBwdWJsaWMgZGVsZXRlUmVjb3JkKGRlbGV0ZURhdGE6YW55KTp2b2lke1xyXG4gICAgbGV0IGRlbGV0VGl0bGUgPSB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJCcmlzYW5qZVwiKTtcclxuICAgIGxldCBkZWxldGVNZXNzYWdlID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiQWxpIHN0ZSBwcmVwcmnEjWFuaSwgZGEgxb5lbGl0ZSBwcmVrbGljYXRpIGRvZ29kZWs/XCIpOyAgICBcclxuICAgIHN1cGVyLmRlbGV0ZVJlY29yZChkZWxldFRpdGxlLGRlbGV0ZU1lc3NhZ2UsZGVsZXRlRGF0YSk7XHJcbiAgfSAgXHJcblxyXG4gIHB1YmxpYyBpbml0VmlldygpOnZvaWR7XHJcbiAgICB0aGlzLl9mb3JtSWQgPSAkKHRoaXMuaWQpLmZpbmQoXCJmb3JtXCIpLmF0dHIoXCJJZFwiKTtcclxuXHJcbiAgICBpZiAodGhpcy5fZm9ybUlkLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiZm9ybSBpZCBub3QgZm91bmQgLi4uXCIpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZm9ybUlkID0gXCIjXCIgKyB0aGlzLl9mb3JtSWQ7IFxyXG4gICAgLy8gICAgXHJcbiAgICB0aGlzLkxvYWRWaWV3RXZlbnRzKCk7XHJcbiAgICB0aGlzLl9zYW9wU2VsZWN0aXplU2VsZWN0V3JhcGVyLmluaXRBbGwoXCIuc2VsZWN0aXplU2VsZWN0XCIpO1xyXG4gICAgdGhpcy5fb3BuUG90bmlOYWxvZ2lHb2dnbGVNYXBzVmlldy5wcmVwYXJlVmlldyh0aGlzLmlkLFwiSXpyYcSNdW4gcmVsYWNpamVcIik7XHJcbiAgICBcclxuICAgIGNvbnN0IHNlbGVjdG9yID0gXCIgfiAuc2VsZWN0aXplLWNvbnRyb2xcIiArIFwiIC5zZWxlY3RpemUtZHJvcGRvd24tY29udGVudFwiICsgXCIgW2RhdGEtc2VsZWN0YWJsZV1cIjtcclxuICAgIGNvbnN0IHNlbGVjdG9yMSA9IFwiI1NpZnJhUmVsYWNpamVcIisgc2VsZWN0b3I7XHJcbiAgICB0aGlzLl9zYW9wU2VsZWN0aXplU2VsZWN0VG9vbFRpcC5Jbml0VG9vbHR5cGUoc2VsZWN0b3IxKTtcclxuXHJcbiAgICBjb25zdCBzZWxlY3RvcjIgPSBcIiNTaWZyYU5hbG9nZVwiKyBzZWxlY3RvcjtcclxuICAgIHRoaXMuX3Nhb3BTZWxlY3RpemVTZWxlY3RUb29sVGlwLkluaXRUb29sdHlwZShzZWxlY3RvcjIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbG9hZFZpZXcoKTp2b2lke1xyXG4gICAgdGhpcy5pbml0VmlldygpO1xyXG4gICAgdGhpcy5jb3B5RmlsZXMoXCIjY3VzdG9tRmlsZUJhY2tcIixcIiNjdXN0b21GaWxlXCIsIHRydWUpO1xyXG4gICAgdGhpcy5zZXRGb2N1c09uRXJyb3IoKTtcclxuLy8gICAgdGhpcy5yZW1vdmVBbGxGaWxlcyhcIiNjdXN0b21GaWxlQmFja1wiKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBMb2FkVmlld0V2ZW50cyAoKTp2b2lke1xyXG4gICAgbGV0IF92aWV3RGl2ID0gJCh0aGlzLmlkKTtcclxuICAgIGlmIChfdmlld0Rpdi5sZW5ndGggPT0gMCkge3JldHVybjt9XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIC8vdGhpcy5fZm9ybUlkID0gXCIjZGV0YWlsc09QTlBvdG5pTmFsb2dpRnVsbEZvcm1cIjtcclxuXHJcbiAgICB0aGlzLnNhb3BVcGxvYWRGaWxlcy5pbml0Q29tcG9uZW50KHtjb250cm9sbGVyOlwiVHJhdmVsT3JkZXJcIixhY3Rpb246XCJWYWxpZGF0ZUZpbGVzXCIsdmFsaWRhdGVBamF4OnRydWUsZm9ybUlkOnRoaXMuX2Zvcm1JZCx2YWxpZGF0aW9uRGl2SWQ6XCIjdXBsb2FkRmlsZXNWYWxpZGF0aW9uc0FqYXhcIn0pO1xyXG4gICAgdGhpcy5zYW9wVXBsb2FkRmlsZXMuYWZ0ZXJSZWZyZXNoRmlsZXNMaXN0ID0gdGhpcy5zYW9wVXBsb2FkRmlsZXMuYWpheFZhbGlkYXRlO1xyXG5cclxuICAgICQoJyNidG5PaycpLm9mZignY2xpY2snKTtcclxuICAgICQoJyNidG5PaycpLmJpbmQoJ2NsaWNrJywgXHJcbiAgICAgIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIF90aGlzLmNvcHlGaWxlcyhcIiNjdXN0b21GaWxlXCIsXCIjY3VzdG9tRmlsZUJhY2tcIik7XHJcbiAgICAgICAgbGV0IF9yZXN1bHQgPSBfdGhpcy5zYW9wVXBsb2FkRmlsZXMuYWpheFZhbGlkYXRlKCk7XHJcbiAgICAgICAgcmV0dXJuIF9yZXN1bHQ7ICAgICAgICBcclxuICAgICAgfSAgICAgICAgICBcclxuICAgICk7ICAgIFxyXG5cclxuICAgICQoJyNQcmVkdmlkZW5pQ2FzT2Rob2RhJykub2ZmKCdmb2N1c291dCcsdGhpcy5vbkZvY3VzT3V0UHJlZHZpZGVuaUNhc09kaG9kYS5iaW5kKHRoaXMpKTtcclxuICAgICQoXCIjUHJlZHZpZGVuaUNhc09kaG9kYVwiKS5iaW5kKCdmb2N1c291dCcsdGhpcy5vbkZvY3VzT3V0UHJlZHZpZGVuaUNhc09kaG9kYS5iaW5kKHRoaXMpKTtcclxuXHJcbiAgICAkKCcjU3RhbmplU3RldmNhS29uZWMnKS5vZmYoJ2ZvY3Vzb3V0Jyx0aGlzLm9uRm9jdXNPdXRTdGFuamVTdGV2Y2FLb25lYy5iaW5kKHRoaXMpKTtcclxuICAgICQoXCIjU3RhbmplU3RldmNhS29uZWNcIikuYmluZCgnZm9jdXNvdXQnLHRoaXMub25Gb2N1c091dFN0YW5qZVN0ZXZjYUtvbmVjLmJpbmQodGhpcykpOyAgICBcclxuXHJcbiAgICAkKCcjYnRuQ2hlY2tJbicpLm9mZignY2xpY2snKTtcclxuICAgICQoJyNidG5DaGVja0luJykuYmluZCgnY2xpY2snLCBcclxuICAgICAgZnVuY3Rpb24oZSkge1xyXG4gICAgICAgIF90aGlzLkNoZWNoSW4oKTsgICAgXHJcbiAgICAgIH0gICAgICAgICAgXHJcbiAgICApOyAgXHJcblxyXG4gICAgJCgnI2J0bkNhbmNlbCcpLm9mZignY2xpY2snKTtcclxuICAgICQoJyNidG5DYW5jZWwnKS5iaW5kKCdjbGljaycsIFxyXG4gICAgICBmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgX3RoaXMuQ2FuY2VsVE8oKTsgICAgXHJcbiAgICAgIH0gICAgICAgICAgXHJcbiAgICAgICk7IFxyXG5cclxuICAgICAgJCgnI2J0blN5bmNSRUcnKS5vZmYoJ2NsaWNrJyk7XHJcbiAgICAgICQoJyNidG5TeW5jUkVHJykuYmluZCgnY2xpY2snLFxyXG4gICAgICAgICAgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICBfdGhpcy5TeW5jUkVHKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICk7ICBcclxuXHJcbiAgICAvLyAkKHRoaXMuX2Zvcm1JZCkuc3VibWl0KGZ1bmN0aW9uKGUpe1xyXG4gICAgLy8gICBsZXQgX3NlbmRlciA9IGUudGFyZ2V0O1xyXG4gICAgLy8gICAvLyQoJyNDaGVja0luJykudmFsKCd0cnVlJyk7XHJcbiAgICAvLyB9KTsgICAgXHJcbiAgICBcclxuICAgICQoJyNPZG9icmVuYVVwb3JhYmEnKS5vZmYoJ2NoYW5nZScpO1xyXG4gICAgJCgnI09kb2JyZW5hVXBvcmFiYScpLm9uKCdjaGFuZ2UnLCBfdGhpcy5vbkNoYW5nZU9kb2JyZW5hVXBvcmFiYS5iaW5kKHRoaXMpKTsgXHJcbiAgICAkKCcjT2RvYnJlbmFVcG9yYWJhJykuY2hhbmdlKCk7XHJcblxyXG4gICAgJCgnI1NpZnJhUmVsYWNpamUnKS5vZmYoJ2NoYW5nZScpO1xyXG4gICAgJCgnI1NpZnJhUmVsYWNpamUnKS5vbignY2hhbmdlJywgX3RoaXMub25DaGFuZ2VTaWZyYVJlbGFjaWplLmJpbmQodGhpcykpOyBcclxuICAgICQoJyNTaWZyYVJlbGFjaWplJykuY2hhbmdlKCk7XHJcblxyXG4gICAgJCgnI1NpZnJhTmFsb2dlJykub2ZmKCdjaGFuZ2UnKTtcclxuICAgICQoJyNTaWZyYU5hbG9nZScpLm9uKCdjaGFuZ2UnLCBfdGhpcy5vbkNoYW5nZVNpZnJhTmFsb2dlLmJpbmQodGhpcykpOyBcclxuICAgICQoJyNTaWZyYU5hbG9nZScpLmNoYW5nZSgpO1xyXG5cclxuICAgICQoJyNidG5PcG5Sb3V0ZXMnKS5vZmYoJ2NsaWNrJyk7XHJcbiAgICAkKCcjYnRuT3BuUm91dGVzJykub24oJ2NsaWNrJywgX3RoaXMub25DbGlza2J0bk9wblJvdXRlcy5iaW5kKHRoaXMpKTsgICAgIFxyXG5cclxuICAgICQoJyNidG5BZGRQYXNzZW5nZXInKS5vZmYoJ2NsaWNrJyk7XHJcbiAgICAkKCcjYnRuQWRkUGFzc2VuZ2VyJykub24oJ2NsaWNrJywgX3RoaXMub25CdG5BZGRQYXNzZW5nZXJDbGljay5iaW5kKHRoaXMpKTsgICBcclxuXHJcbiAgICAvL3RoaXMuX3NlbGVjdFphcG9zbGVuaS5pbml0KFwiI1NlbGVjdGVkRW1wbG95ZWVzXCIsIFwiWmFwb3NsZW5pXCIpOyBcclxuXHJcbiAgICB0aGlzLl9zYW9wQXR0YWNobWVudExpc3QuaW5pdFdlYkdyaWRMaXN0bmVycygpO1xyXG5cclxuICAgIHRoaXMuYmluZFJlbW92ZUJ1dHRvbkV2ZW50cygpO1xyXG5cclxuICAgIC8vdGhpcy5sb2FkTGlua3MoKTtcclxuICB9XHJcblxyXG4gIC8vIHB1YmxpYyBsb2FkTGlua3MoKTp2b2lke1xyXG4gIC8vICAgLy8gbGV0IF9zZWxlY3RlZEVtcGxveWVlc0xpc3QgPSAkKHRoaXMuX2Zvcm1JZCkuZmluZChcIiNTZWxlY3RlZEVtcGxveWVlc0xpc3RcIikudmFsKCk7XHJcbiAgLy8gICAvLyBsZXQgX3NlbGVjdGVkRW1wbG95ZWVzQXJyYXkgPSBfc2VsZWN0ZWRFbXBsb3llZXNMaXN0LnRvU3RyaW5nKCkuc3BsaXQoJzsnKTtcclxuICAvLyAgIGxldCBfc2VsZWN0ZWRFbXBsb3llZXNMaXN0ID0gJCh0aGlzLl9mb3JtSWQpLmZpbmQoXCIjU2VsZWN0ZWRFbXBsb3llZXNMaXN0XCIpO1xyXG4gIC8vICAgaWYoX3NlbGVjdGVkRW1wbG95ZWVzTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgLy8gICAgIGxldCBfc2VsZWN0ZWRFbXBsb3llZXNBcnJheSA9IF9zZWxlY3RlZEVtcGxveWVlc0xpc3QudmFsKCkudG9TdHJpbmcoKS5zcGxpdCgnOycpOyAgICBcclxuICAvLyAgICAgdGhpcy5fc2VsZWN0WmFwb3NsZW5pLnNldFNlbGVjdFZhbHVlcyhfc2VsZWN0ZWRFbXBsb3llZXNBcnJheSk7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAgIHB1YmxpYyBDaGVjaEluKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY2hlY2tJbkRpYWxvZygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBDYW5jZWxUTygpOiB2b2lkIHtcclxuICAgICAgICAkKCcjQ2FuY2VsVE8nKS52YWwoJ3RydWUnKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgU3luY1JFRygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU3luY1JFR1wiKTtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICBsZXQgX2xldG9Qb3RuZWdhTmFsb2dhID0gJChcIiNMZXRvUG90bmVnYU5hbG9nYVwiKS52YWwoKTtcclxuICAgICAgICBsZXQgX3N0ZXZpbGthUG90bmVnYU5hbG9nYSA9ICQoXCIjU3Rldmlsa2FQb3RuZWdhTmFsb2dhXCIpLnZhbCgpO1xyXG5cclxuICAgICAgICBsZXQgcGFyYW1zID0geyBsZXRvUG90bmVnYU5hbG9nYTogX2xldG9Qb3RuZWdhTmFsb2dhLCBzdGV2aWxrYVBvdG5lZ2FOYWxvZ2E6IF9zdGV2aWxrYVBvdG5lZ2FOYWxvZ2EgfTtcclxuXHJcbiAgICAgICAgbGV0IF9zYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgICAgICBfc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgJChcIiN0b2Nlbl9jYXNcIikuaHRtbChyZXNwb25zZS52aWV3Q29udGVudCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgYWxlcnRpZnkubWVzc2FnZShyZXNwb25zZS5hbGVydE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAkKCcjYnRuU3luY1JFRycpLm9mZignY2xpY2snKTtcclxuICAgICAgICAgICAgJCgnI2J0blN5bmNSRUcnKS5iaW5kKCdjbGljaycsXHJcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLlN5bmNSRUcoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTsgIFxyXG5cclxuICAgICAgICAgICAgbGV0IHNhb3BJbnB1dE1hc2sgPSBuZXcgU2FvcElucHV0TWFzaygpO1xyXG4gICAgICAgICAgICBzYW9wSW5wdXRNYXNrLmluaXQoKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIF9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246IFwiVHJhdmVsT3JkZXIvU3luY1JFR1wiXHJcbiAgICAgICAgICAgICwgZGF0YTogcGFyYW1zXHJcbiAgICAgICAgICAgICwgdHlwZTogXCJQT1NUXCJcclxuICAgICAgICAgICAgLCBzcGlubmVyRGl2SWQ6IFwiI3Nhb3BMb2FkaW5nXCJcclxuICAgICAgICB9KTsgICAgIFxyXG4gICAgfVxyXG5cclxuICBvbkZvY3VzT3V0UHJlZHZpZGVuaUNhc09kaG9kYShlOmFueSk6dm9pZHtcclxuICAgIGlmKCEkKFwiI1ByZWR2aWRlbmlDYXNQcmlob2RhXCIpLnZhbCgpKSB7XHJcbiAgICAgICQoXCIjUHJlZHZpZGVuaUNhc1ByaWhvZGFcIikudmFsKCQoXCIjUHJlZHZpZGVuaUNhc09kaG9kYVwiKS52YWwoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZU9kb2JyZW5hVXBvcmFiYShlOmFueSk6dm9pZHtcclxuICAgIGxldCBfc2VsZWN0ZWRWYWx1ZSA9IGUudGFyZ2V0LnZhbHVlOyAgXHJcbiAgICBsZXQgX3JlZ2lzdHJza2FTdGV2aWxrYVByZWRsb2dHcm91cCA9ICQoJyNSZWdpc3Ryc2thU3Rldmlsa2FQcmVkbG9nR3JvdXAnKTtcclxuICAgIGlmIChfc2VsZWN0ZWRWYWx1ZSA9PSAnMScpIHtcclxuICAgICAgdGhpcy5zdWdnZXJzdFZlaGljbGUoKTtcclxuICAgICAgX3JlZ2lzdHJza2FTdGV2aWxrYVByZWRsb2dHcm91cC5zaG93KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBfcmVnaXN0cnNrYVN0ZXZpbGthUHJlZGxvZ0dyb3VwLmhpZGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQ2hhbmdlU2lmcmFSZWxhY2lqZShlOmFueSk6dm9pZCB7XHJcbiAgICBsZXQgX3NlbGVjdGVkVmFsdWUgPSBlLnRhcmdldC52YWx1ZTsgIFxyXG4gICAgbGV0IF9wcml2emV0YVNpZnJhUmVsYWNpamUgPSAkKCcjUHJpdnpldGFTaWZyYVJlbGFjaWplJykudmFsKCk7XHJcbiAgICBpZiAoX3NlbGVjdGVkVmFsdWUgPT0gX3ByaXZ6ZXRhU2lmcmFSZWxhY2lqZSkge1xyXG4gICAgICB0aGlzLnNhb3BGbG9hdGluZ0xhYmVsLnNldENhcHRpb25Bc1JlcXVpcmVkKFwiI2xibERvZGF0bmlPcGlzUmVsYWNpamVcIix0cnVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2FvcEZsb2F0aW5nTGFiZWwuc2V0Q2FwdGlvbkFzUmVxdWlyZWQoXCIjbGJsRG9kYXRuaU9waXNSZWxhY2lqZVwiLGZhbHNlKTtcclxuICAgICAgJChcIiNEb2RhdG5pT3Bpc1JlbGFjaWplXCIpLmZvY3Vzb3V0KCk7ICAgICAgXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgb25DaGFuZ2VTaWZyYU5hbG9nZShlOmFueSk6dm9pZHtcclxuICAgIGxldCBfc2VsZWN0ZWRWYWx1ZSA9IGUudGFyZ2V0LnZhbHVlOyAgXHJcbiAgICBsZXQgX3ByaXZ6ZXRhU2lmcmFOYWxvZ2UgPSAkKCcjUHJpdnpldGFTaWZyYU5hbG9nZScpLnZhbCgpO1xyXG4gICAgaWYgKF9zZWxlY3RlZFZhbHVlID09IF9wcml2emV0YVNpZnJhTmFsb2dlKSB7XHJcbiAgICAgIHRoaXMuc2FvcEZsb2F0aW5nTGFiZWwuc2V0Q2FwdGlvbkFzUmVxdWlyZWQoXCIjbGJsRG9kYXRuaU9waXNOYWxvZ2VcIix0cnVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2FvcEZsb2F0aW5nTGFiZWwuc2V0Q2FwdGlvbkFzUmVxdWlyZWQoXCIjbGJsRG9kYXRuaU9waXNOYWxvZ2VcIixmYWxzZSk7XHJcbiAgICAgICQoXCIjRG9kYXRuaU9waXNOYWxvZ2VcIikuZm9jdXNvdXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQ2xpc2tidG5PcG5Sb3V0ZXMoZTphbnkpOnZvaWR7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwib25DbGlza2J0bk9wblJvdXRlcy4uLlwiKTtcclxuICAgIHRoaXMuX29wblBvdG5pTmFsb2dpR29nZ2xlTWFwc1ZpZXcuc2hvd0Zvcm0odGhpcy5pZCk7XHJcbiAgfSAgXHJcblxyXG4gIG9uRm9jdXNPdXRTdGFuamVTdGV2Y2FLb25lYyhlOmFueSk6dm9pZHtcclxuICAgIGxldCBfU3RhbmplU3RldmNhWmFjZXRlayA9IHBhcnNlSW50KCQoXCIjU3RhbmplU3RldmNhWmFjZXRla1wiKS52YWwoKSBhcyBzdHJpbmcpO1xyXG4gICAgbGV0IF9TdGFuamVTdGV2Y2FLb25lYyA9IHBhcnNlSW50KCQoXCIjU3RhbmplU3RldmNhS29uZWNcIikudmFsKCkgYXMgc3RyaW5nKTtcclxuICAgIGxldCBfRGVqYW5za2lLbSA9IF9TdGFuamVTdGV2Y2FLb25lYyAtX1N0YW5qZVN0ZXZjYVphY2V0ZWs7XHJcbiAgICBpZihfRGVqYW5za2lLbSA+IDApIHtcclxuICAgICAgICQoXCIjRGVqYW5za2lLbVwiKS52YWwoX0RlamFuc2tpS20pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgICBwdWJsaWMgY2hlY2tJbkRpYWxvZygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY2hlY2tJbkRpYWxvZ1wiKTtcclxuXHJcbiAgICAgICAgbGV0IFJFR19zeW5jID0gJCgnI1dlYlVza2xhamV2YW5qZVJFRycpLnZhbCgpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSAndHJ1ZSc7XHJcblxyXG4gICAgICAgIGxldCBtZXNzYWdlID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiQWxpIHJlcyDFvmVsaXRlIHpha2xqdcSNaXRpPyBaIHpha2xqdcSNa29tIG5ha25hZG5lIHNwcmVtZW1iZSBuYSBwb3RuZW0gbmFsb2d1IG5lIGJvZG8gdmXEjSBtb8W+bmUuXCIpO1xyXG4gICAgICAgIGlmIChSRUdfc3luYykge1xyXG4gICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZSArIFwiPGJyPjxicj5cIiArIHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIlZuZXNlbiDEjWFzIG9kaG9kYS9wcmlob2RhIHNlIGJvIHByZW5lc2VsIHYgUmVnaXN0cmFjaWpvIHByaXNvdG5vc3RpLCDEjWUgZG9nb2RraSDFvmUgbmlzbyB6YWJlbGXFvmVuaSBpbiBvYmRlbGF2YSBuaSB6YWtsanXEjWVuYS5cIilcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB0aXRsZSA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIlpha2xqdcSNZXZhbmplXCIpO1xyXG4gICAgICAgIGxldCBzYW9wTWVzc2FnZURsZyA9IG5ldyBTYW9wTWVzc2FnZURsZyh7IGRhdGE6IG51bGwsIHBhcmVudDogbnVsbCB9KVxyXG4gICAgICAgIHNhb3BNZXNzYWdlRGxnLm9uWWVzID0gdGhpcy5TdWJtaXRBbmRDaGVjaEluLmJpbmQodGhpcyk7XHJcbiAgICAgICAgc2FvcE1lc3NhZ2VEbGcuU2hvdyhtZXNzYWdlLCB0aXRsZSwgMSwgW1Nhb3BNc2dEbGdCdXR0b24ubWJZZXMsIFNhb3BNc2dEbGdCdXR0b24ubWJOb10pO1xyXG4gICAgfVxyXG5cclxuICBwdWJsaWMgU3VibWl0QW5kQ2hlY2hJbigpOnZvaWQgeyBcclxuICAgICQoJyNDaGVja0luJykudmFsKCd0cnVlJyk7XHJcbiAgICAkKCcjZGV0YWlsc09QTlBvdG5pTmFsb2dpRnVsbEZvcm0nKS5zdWJtaXQoKTtcclxuICB9XHJcblxyXG4gIHJlZnJlc2hMaW5rc0RhdGEoanNvbkVtcGxveWVlc0xpc3Q6c3RyaW5nKTp2b2lkIHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJyZWZyZXNoTGlua3NEYXRhXCIpO1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgX2RhdGEgPSB0aGlzLmdldERhdGEoKTtcclxuICAgIE9iamVjdC5hc3NpZ24oX2RhdGEsIHtcImpzb25FbXBsb3llZXNMaXN0XCI6anNvbkVtcGxveWVlc0xpc3R9KTtcclxuXHJcbiAgICBsZXQgX3Nhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgX3Nhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24ocmVzcG9uc2Upe1xyXG4gICAgICAkKFwiI1NlbGVjdGVkRW1wbG95ZWVzTGlzdEFqYXhcIikuaHRtbChyZXNwb25zZSk7XHJcbiAgICAgIF90aGlzLmJpbmRSZW1vdmVCdXR0b25FdmVudHMoKTtcclxuICAgIH07XHJcbiAgICBfc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICBhY3Rpb246XCJUcmF2ZWxPcmRlci9HZXRMaW5rc1wiIFxyXG4gICAgICAgICxkYXRhOiBfZGF0YVxyXG4gICAgICAgICx0eXBlOlwiR0VUXCJcclxuICAgIH0pOyAgICAgXHJcbiAgfVxyXG5cclxuICBvbkJ0bkFkZFBhc3NlbmdlckNsaWNrKHNlbmRlcjphbnkpOnZvaWQge1xyXG4gICAgY29uc29sZS5sb2coXCJvbkJ0bkFkZFBhc3NlbmdlckNsaWNrXCIpO1xyXG4gICAgbGV0IF9kYXRhID0gdGhpcy5nZXREYXRhKCk7XHJcbiAgICB0aGlzLl9vcG5TZWxlY3RQYXNzZW5nZXJzVmlldy5zaG93Vmlld0Zvcm0oU2FvcFdmQWN0aW9uLndmYVJlY29yZERlc3RhaWxzLCBfZGF0YSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25CdG5Pa0NsaWNrRXgoc2VuZGVyOiBhbnkpOiB2b2lkIHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJvbkJ0bk9rQ2xpY2tFeFwiKTtcclxuICAgIC8vXHJcbiAgICB0aGlzLnJlZnJlc2hMaW5rcyhzZW5kZXIpO1xyXG4gICAgLy9cclxuICAgIHRoaXMuX29wblNlbGVjdFBhc3NlbmdlcnNWaWV3LkNsb3NlVmlld0Zvcm0oKTtcclxuICAgIC8vXHJcbiAgfSAgXHJcblxyXG4gIHB1YmxpYyByZWZyZXNoTGlua3Moc2VuZGVyOiBhbnkpOiB2b2lkIHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJyZWZyZXNoTGlua3NcIik7XHJcbiAgICAvL1xyXG4gICAgbGV0IF9zZWxlY3RlZEVtcGxveWVlc0xpc3QgPSAkKHRoaXMuX2Zvcm1JZCkuZmluZChcIiNTZWxlY3RlZEVtcGxveWVlc0xpc3RcIikudmFsKCkgYXMgc3RyaW5nO1xyXG4gICAgbGV0IF9vcG5Nb2RlbF9TZWxlY3RlZEVtcGxveWVlcyA9ICQodGhpcy5fb3BuU2VsZWN0UGFzc2VuZ2Vyc1ZpZXcuaWQpLmZpbmQoXCIjb3BuTW9kZWxfU2VsZWN0ZWRFbXBsb3llZXNcIikudmFsKCkgYXMgW2FueV07XHJcbiAgICBpZiAoaXNVbkRlZmluZWQoX29wbk1vZGVsX1NlbGVjdGVkRW1wbG95ZWVzKSA9PSBmYWxzZSl7XHJcbiAgICAgIGxldCBfb3BuTW9kZWxfU2VsZWN0ZWRFbXBsb3llZXNEZWxpbWluYXRlZCA9IF9vcG5Nb2RlbF9TZWxlY3RlZEVtcGxveWVlcy5qb2luKFwiO1wiKTtcclxuICAgICAgX3NlbGVjdGVkRW1wbG95ZWVzTGlzdCA9IF9zZWxlY3RlZEVtcGxveWVlc0xpc3QgK1wiO1wiKyBfb3BuTW9kZWxfU2VsZWN0ZWRFbXBsb3llZXNEZWxpbWluYXRlZDtcclxuICAgIH1cclxuICAgIC8vXHJcbiAgICBsZXQgX3NlbGVjdGVkRW1wbG95ZWVzTGlzdERpc3RpbmN0ID0gWy4uLm5ldyBTZXQoX3NlbGVjdGVkRW1wbG95ZWVzTGlzdC5zcGxpdChcIjtcIikpXTtcclxuICAgIF9zZWxlY3RlZEVtcGxveWVlc0xpc3QgPSBfc2VsZWN0ZWRFbXBsb3llZXNMaXN0RGlzdGluY3Quam9pbihcIjtcIik7XHJcbiAgICAvL1xyXG4gICAgJCh0aGlzLl9mb3JtSWQpLmZpbmQoXCIjU2VsZWN0ZWRFbXBsb3llZXNMaXN0XCIpLnZhbChfc2VsZWN0ZWRFbXBsb3llZXNMaXN0KTtcclxuICAgIGxldCBfc2VsZWN0ZWRFbXBsb3llZXNMaXN0QXJyYXkgPSBfc2VsZWN0ZWRFbXBsb3llZXNMaXN0LnNwbGl0KFwiO1wiKTtcclxuICAgIC8vXHJcbiAgICB2YXIgbXlKc29uU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoX3NlbGVjdGVkRW1wbG95ZWVzTGlzdEFycmF5KTtcclxuICAgIHRoaXMucmVmcmVzaExpbmtzRGF0YShteUpzb25TdHJpbmcpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbW92ZUxpbmsoc2lmcmF6YXBvc2xlbmk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInJlbW92ZUxpbms6XCIrc2lmcmF6YXBvc2xlbmkpO1xyXG4gICAgbGV0IF9zZWxlY3RlZEVtcGxveWVlc0xpc3QgPSAkKHRoaXMuX2Zvcm1JZCkuZmluZChcIiNTZWxlY3RlZEVtcGxveWVlc0xpc3RcIikudmFsKCkgYXMgc3RyaW5nO1xyXG4gXHJcbiAgICBsZXQgX3NlbGVjdGVkRW1wbG95ZWVzTGlzdERpc3RpbmN0ID0gWy4uLm5ldyBTZXQoX3NlbGVjdGVkRW1wbG95ZWVzTGlzdC5zcGxpdChcIjtcIikpXTtcclxuICAgIC8vXHJcbiAgICBfc2VsZWN0ZWRFbXBsb3llZXNMaXN0RGlzdGluY3QgPSBfc2VsZWN0ZWRFbXBsb3llZXNMaXN0RGlzdGluY3QuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pIHtcclxuICAgICAgcmV0dXJuIGl0ZW0gIT09IHNpZnJhemFwb3NsZW5pXHJcbiAgICB9KVxyXG4gICAgLy9cclxuICAgIF9zZWxlY3RlZEVtcGxveWVlc0xpc3QgPSBfc2VsZWN0ZWRFbXBsb3llZXNMaXN0RGlzdGluY3Quam9pbihcIjtcIik7XHJcblxyXG4gICAgLy9fc2VsZWN0ZWRFbXBsb3llZXNMaXN0ID0gX3NlbGVjdGVkRW1wbG95ZWVzTGlzdC5yZXBsYWNlKFwiO1wiK3NpZnJhemFwb3NsZW5pLFwiXCIpO1xyXG5cclxuICAgICQodGhpcy5fZm9ybUlkKS5maW5kKFwiI1NlbGVjdGVkRW1wbG95ZWVzTGlzdFwiKS52YWwoX3NlbGVjdGVkRW1wbG95ZWVzTGlzdCk7XHJcbiAgICAvL1xyXG4gICAgdGhpcy5yZWZyZXNoTGlua3Moc2lmcmF6YXBvc2xlbmkpO1xyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyBiaW5kUmVtb3ZlQnV0dG9uRXZlbnRzICgpOnZvaWR7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgLy9cclxuICAgICQodGhpcy5pZCkuZmluZCgnLnNhb3AtcmVtb3ZlLWl0ZW0tZXZlbnQnKS5vZmYoJ2NsaWNrJyk7XHJcbiAgICAkKHRoaXMuaWQpLmZpbmQoJy5zYW9wLXJlbW92ZS1pdGVtLWV2ZW50JykuYmluZCgnY2xpY2snLCBcclxuICAgICAgZnVuY3Rpb24ocm93KSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIi5zYW9wLXJlbW92ZS1pdGVtLWV2ZW50LmNsaWNrXCIpO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgbGV0IF9idG5SZW1vdmUgPSByb3cuY3VycmVudFRhcmdldDtcclxuICAgICAgICBsZXQgX3NpZnJhemFwb3NsZW5pID0gX2J0blJlbW92ZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXNpZnJhemFwb3NsZW5pXCIpO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgX3RoaXMuc2hvd0RlbGV0ZURpYWxvZyhfc2lmcmF6YXBvc2xlbmkpO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgJChfdGhpcy5fb3BuU2VsZWN0UGFzc2VuZ2Vyc1ZpZXcuaWQpLmZpbmQoXCIjb3BuTW9kZWxfU2VsZWN0ZWRFbXBsb3llZXNcIikudmFsKFwiXCIpXHJcbiAgICAgIH0gICAgICAgICAgXHJcbiAgICApOyAgICBcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzaG93RGVsZXRlRGlhbG9nKHNpZnJhemFwb3NsZW5pOiBzdHJpbmcpOnZvaWR7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiZGVsZXRlRGlhbG9nXCIpO1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBtZXNzYWdlID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiQWxpIHN0ZSBwcmVwcmnEjWFuaSwgZGEgxb5lbGl0ZSBpemJyaXNhdGkgaXpicmFuZWdhIHNvcG90bmlrYT9cIik7XHJcbiAgICBsZXQgdGl0bGUgPSB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJCcmlzYW5qZVwiKTtcclxuICAgIGxldCBzYW9wTWVzc2FnZURsZyA9IG5ldyBTYW9wTWVzc2FnZURsZyh7ZGF0YTpudWxsLHBhcmVudDpudWxsfSkgIFxyXG4gICAgc2FvcE1lc3NhZ2VEbGcub25ZZXMgPSB0aGlzLnJlbW92ZUxpbmsuYmluZCh0aGlzLHNpZnJhemFwb3NsZW5pKTtcclxuICAgIHNhb3BNZXNzYWdlRGxnLlNob3cobWVzc2FnZSx0aXRsZSwxLFtTYW9wTXNnRGxnQnV0dG9uLm1iWWVzLFNhb3BNc2dEbGdCdXR0b24ubWJOb10pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN1Z2dlcnN0VmVoaWNsZSgpOnZvaWQge1xyXG4gICAgLy9cclxuICAgIHZhciBfcmVnaXN0cnNrYVN0ZXZpbGthT3NlYm5hUHJlZGxvZyA9ICQodGhpcy5pZCkuZmluZChcIiNSZWdpc3Ryc2thU3Rldmlsa2FPc2VibmFQcmVkbG9nXCIpO1xyXG4gICAgdmFyIF9yZWdpc3Ryc2thU3Rldmlsa2FQcmVkbG9nID0gJCh0aGlzLmlkKS5maW5kKFwiI1JlZ2lzdHJza2FTdGV2aWxrYVByZWRsb2dcIik7XHJcbiAgICBpZiAoX3JlZ2lzdHJza2FTdGV2aWxrYU9zZWJuYVByZWRsb2cubGVuZ3RoID4gMCAmJiBfcmVnaXN0cnNrYVN0ZXZpbGthUHJlZGxvZy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHZhciBfdmF1ZSA9IF9yZWdpc3Ryc2thU3Rldmlsa2FQcmVkbG9nLnZhbCgpIGFzIHN0cmluZztcclxuICAgICAgaWYgKF92YXVlLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgX3JlZ2lzdHJza2FTdGV2aWxrYVByZWRsb2cudmFsKF9yZWdpc3Ryc2thU3Rldmlsa2FPc2VibmFQcmVkbG9nLnZhbCgpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGNvcHlGaWxlcyhpZEZyb206c3RyaW5nLCBpZFRvOnN0cmluZywgcmVmcmVzaExpc3QgOmJvb2xlYW4gPSBmYWxzZSk6dm9pZHtcclxuXHJcbiAgICBsZXQgaW5wdXRFbGVtZW50RnJvbSA9IDxIVE1MSW5wdXRFbGVtZW50PiQoaWRGcm9tKVswXTtcclxuICAgIGxldCBmaWxlc0Zyb20gPSBpbnB1dEVsZW1lbnRGcm9tLmZpbGVzO1xyXG5cclxuICAgIGxldCBpbnB1dEVsZW1lbnRUbyA9IDxIVE1MSW5wdXRFbGVtZW50PiQoaWRUbylbMF07XHJcbiAgICBpbnB1dEVsZW1lbnRUby5maWxlcyA9IGZpbGVzRnJvbTtcclxuICAgIGlmIChyZWZyZXNoTGlzdCkge1xyXG4gICAgICB0aGlzLnNhb3BVcGxvYWRGaWxlcy5yZWZyZXNoRmlsZUxpc3QoaW5wdXRFbGVtZW50VG8pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbW92ZUFsbEZpbGVzKGlkOnN0cmluZyk6dm9pZHtcclxuICAgIGxldCBpbnB1dEVsZW1lbnRGcm9tID0gPEhUTUxJbnB1dEVsZW1lbnQ+JChpZClbMF07XHJcbiAgICBpbnB1dEVsZW1lbnRGcm9tLnZhbHVlID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRGb2N1c09uRXJyb3IoKTp2b2lke1xyXG4gICAgbGV0IF92YWxpZGF0aW9uU3VtbWFyeSA9ICQoXCIjZGV0YWlsc0tlUGxhbkRvcHVzdG92VmFsaWRhdGlvblN1bW1hcnlcIik7XHJcbiAgICBpZiAoX3ZhbGlkYXRpb25TdW1tYXJ5Lmxlbmd0aCA+IDApIHtcclxuICAgICAgJChcIiNkZXRhaWxzS2VQbGFuRG9wdXN0b3ZWYWxpZGF0aW9uU3VtbWFyeVwiKS5maW5kKFwibGlcIikuZm9jdXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICAgcHVibGljIG9uU3VibWl0U3VjY2Vzc0NvbXBsZXRlKHJlc3BvbnNlOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBpZiAocmVzcG9uc2Uudmlld0NvbnRlbnQpIHtcclxuICAgICAgICAgICAgYWxlcnRpZnkubWVzc2FnZShyZXNwb25zZS52aWV3Q29udGVudCk7XHJcbiAgICAgICAgfSAgXHJcbiAgICB9XHJcblxyXG4gIC8vXHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/aW1wb3J0IHsgU2FvcFdlYkdyaWQsU2FvcFdlYkdyaWRQcm9wZXJ0aWVzLFNhb3BXZWJHcmlkVG9vbGJhcixTYW9wV2ViRGF0YVRhYmxlfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLWdyaWRcIjtcclxuaW1wb3J0IHsgU2FvcFNlcnZpY2VzQ29yZSB9IGZyb20gXCIuLi9Db3JlL3Nhb3Atc2VydmljZXMtY29yZVwiO1xyXG5pbXBvcnQgeyBnbG9iYWwsIGlzRW1wdHksIGlzVW5EZWZpbmVkLCBmaWx0ZXJUYWJsZVJvd3MsIGNvbnZlcnRTdHJpbmcyRGF0ZSwgZm9ybWF0RGF0ZSB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBPUE5Qb3RuaU5hbG9naUFsbEdyaWQge1xyXG4gIHByaXZhdGUgd2dJZDpzdHJpbmc7XHJcbiAgcHJpdmF0ZSBsaWJOYW1lOnN0cmluZztcclxuICBwcml2YXRlIF9zYW9wU2VydmljZXNDb3JlOiBTYW9wU2VydmljZXNDb3JlO1xyXG4gIC8vXHJcbiAgcHVibGljIHdlYkdyaWQ6U2FvcFdlYkdyaWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGxpYk5hbWU6IHN0cmluZykge1xyXG4gICAgdGhpcy53Z0lkID0gXCIjT1BOUG90bmlOYWxvZ2lHcmlkQWxsXCI7XHJcbiAgICB0aGlzLmxpYk5hbWUgPSBsaWJOYW1lO1xyXG4gICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgfSAgXHJcblxyXG4gIGluaXRWaWV3KCl7XHJcbiAgICB0aGlzLmluaXRXZWJHcmlkKCk7XHJcbiAgICB0aGlzLmluaXRXZWJHcmlkTGlzdG5lcnMoKTsgIFxyXG4gIH1cclxuXHJcbiAgaW5pdFdlYkdyaWQoKXtcclxuICAgIFxyXG4gICAgbGV0IGNhcHRpb25Ub29sYmFyID0gJCh0aGlzLndnSWQpLmF0dHIoXCJjYXB0aW9uLXRvb2xiYXJcIikhO1xyXG4gICAgLy9cclxuICAgIHRoaXMud2ViR3JpZCA9IG5ldyBTYW9wV2ViR3JpZCh0aGlzLmxpYk5hbWUrXCIud2ViR3JpZFwiKTtcclxuICAgIGxldCBncmlkUHJvcGVydGllczogU2FvcFdlYkdyaWRQcm9wZXJ0aWVzO1xyXG4gICAgbGV0IGdyaWRUb29sYmFyOlNhb3BXZWJHcmlkVG9vbGJhcjtcclxuICAgIGxldCBkYXRhVGFibGU6U2FvcFdlYkRhdGFUYWJsZTtcclxuICAgIGxldCB0b29sYmFySXRlbXNUZW1wbGF0ZUlkID0gJCh0aGlzLndnSWQpLmF0dHIoXCJ0b29sYmFyLWl0ZW1zLXRlbXBsYXRlSWRcIik7XHJcbiAgICAvL1xyXG4gICAgZ3JpZFRvb2xiYXIgPSB7aWQ6XCJzYW9wV2ViR3JpZFRCMVwiLGNhcHRpb246Y2FwdGlvblRvb2xiYXIsIGl0ZW1zVGVtcGxhdGVJZDp0b29sYmFySXRlbXNUZW1wbGF0ZUlkfTtcclxuXHJcbiAgICBkYXRhVGFibGUgPSB7IGVuYWJsZWQ6dHJ1ZSxjb2x1bW5EZWZzU2V0dGluZ3M6W3tvcmRlcmFibGU6IHRydWUsIHRhcmdldHM6ICBcIm5vLXNvcnRcIn1dfTtcclxuXHJcbiAgICBncmlkUHJvcGVydGllcyA9IHtcclxuICAgICAgICBncmlkSWQ6dGhpcy53Z0lkXHJcbiAgICAgICAgLHRvZ2dsZVBhbmVsOntlbmFibGVkOmZhbHNlfVxyXG4gICAgICAgICx0b29sYmFyOmdyaWRUb29sYmFyXHJcbiAgICAgICAgLGRhdGFUYWJsZTpkYXRhVGFibGVcclxuICAgICAgfTsgICAgICAgIFxyXG4gICAgLy9cclxuICAgIHRoaXMud2ViR3JpZC5pbml0KGdyaWRQcm9wZXJ0aWVzKTsgICAgICAgIFxyXG4gIH1cclxuXHJcbiAgaW5pdFdlYkdyaWRMaXN0bmVycygpe1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIC8vXHJcbiAgICBsZXQgX1NlYXJjaFZhbHVlID0gJCgnI2NvbGxhcHNlc2FvcFdlYkdyaWRUQjEnKS5maW5kKCcjU2VhcmNoVmFsdWUnKTsgIFxyXG4gICAgaWYgKF9TZWFyY2hWYWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIF9TZWFyY2hWYWx1ZS5vZmYoXCJjaGFuZ2VcIik7XHJcbiAgICAgIF9TZWFyY2hWYWx1ZS5vbihcImNoYW5nZVwiLF90aGlzLm9uU2VhcmNoVmFsdWUyQ2hhbmdlLmJpbmQoX3RoaXMpKTtcclxuICAgIH1cclxuICAgIC8vXHJcbiAgICAkKFwiYm9keVwiKS5vZmYoXCJjbGlja1wiLCB0aGlzLndnSWQgKyBcIiB0ZC50ZC1hY3Rpb24tZGV0YWlsc1wiKTtcclxuICAgICQoXCJib2R5XCIpLm9uKFwiY2xpY2tcIiwgdGhpcy53Z0lkICsgXCIgdGQudGQtYWN0aW9uLWRldGFpbHNcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGxldCBzZWxlY3RlZFJvdyA9ICQodGhpcykuY2xvc2VzdChcInRyXCIpO1xyXG4gICAgICAgIF90aGlzLnNob3dIaWRlRGV0YWlsc1N1YlRhYmxlKHNlbGVjdGVkUm93KTtcclxuICAgIH0pOyAgICBcclxuICAgICBcclxuICB9XHJcblxyXG4gIHNob3dIaWRlRGV0YWlsc1N1YlRhYmxlKHNlbGVjdGVkUm93OiBKUXVlcnk8SFRNTFRhYmxlUm93RWxlbWVudD4pOiB2b2lkIHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnQXR0ZW5kYW5jZUFsbEVtcGxveWVlc1ZpZXcuc2hvd0hpZGVEZXRhaWxzU3ViVGFibGVcIik7XHJcbiAgICBsZXQgZGF0YV9sZXRvID0gc2VsZWN0ZWRSb3cuYXR0cihcImRhdGEtbGV0b1wiKTtcclxuICAgIGxldCBkYXRhX3N0ZXZpbGthID0gc2VsZWN0ZWRSb3cuYXR0cihcImRhdGEtc3Rldmlsa2FcIik7XHJcbiAgICBsZXQgcm93RGV0YWlsc0lkID0gXCIjZGV0YWlsUm93XCIrZGF0YV9sZXRvK2RhdGFfc3Rldmlsa2E7XHJcbiAgICAvL1xyXG4gICAgbGV0IHJvd0RldGFpbHNJZEVsZW1lbnQgPSAkKHJvd0RldGFpbHNJZCk7XHJcbiAgICAvLyBwcmlrYXppL3NrcmlqIGJvdHRvbSBib3JkZXJcclxuICAgIHNlbGVjdGVkUm93LnRvZ2dsZUNsYXNzKFwic2FvcC10YWJsZS1yb3ctYm9yZGVyLWJvdHRvbS1ub25lXCIpXHJcblxyXG4gICAgLy8gcHJpa2F6aS9za3JpaiBkZXRhaWxzIHRhYmVsb1xyXG4gICAgcm93RGV0YWlsc0lkRWxlbWVudC50b2dnbGVDbGFzcyhcInNhb3AtdGFibGUtcm93LWhpZGRlblwiKTtcclxuICAgIHJvd0RldGFpbHNJZEVsZW1lbnQudG9nZ2xlQ2xhc3MoXCJzYW9wLXRhYmxlLXJvdy1zaG93ZWRcIik7ICAgIFxyXG4gICAgLy8gLy8gc3ByZW1lbWJhIGlrb25lXHJcbiAgICBsZXQgaWNvbkVsZW1lbnQgPSBzZWxlY3RlZFJvdy5maW5kKFwic3BhblwiKTtcclxuICAgIGljb25FbGVtZW50LnRvZ2dsZUNsYXNzKFwic2FvcC1pbWctcmlnaHRcIik7XHJcbiAgICBpY29uRWxlbWVudC50b2dnbGVDbGFzcyhcInNhb3AtaW1nLWRvd25cIik7ICAgIFxyXG5cclxuICB9XHJcblxyXG4gIHJlZnJlc2hEYXRhKGh0bWxDb250ZW50OnN0cmluZyl7XHJcbiAgICB0aGlzLndlYkdyaWQucmVwbGFjZUdyaWRSb3dzKGh0bWxDb250ZW50KTtcclxuICAgIHRoaXMuaW5pdFdlYkdyaWRMaXN0bmVycygpO1xyXG4gIH1cclxuXHJcbiAgcmVmcmVzaEdyaWREYXRhKCk6dm9pZCB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCBfU2VhcmNoVmFsdWUgPSAkKCcjY29sbGFwc2VzYW9wV2ViR3JpZFRCMScpLmZpbmQoJyNTZWFyY2hWYWx1ZScpO1xyXG4gICAgbGV0IF9sZXRvUG90bmVnYU5hbG9nYSA9IFwiXCI7XHJcbiAgICBpZiAoX1NlYXJjaFZhbHVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgX2xldG9Qb3RuZWdhTmFsb2dhID0gX1NlYXJjaFZhbHVlLnZhbCgpIGFzIHN0cmluZztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uKHJlc3BvbnNlKXtcclxuICAgICAgX3RoaXMucmVmcmVzaERhdGEocmVzcG9uc2UpO1xyXG4gICAgfTtcclxuICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgYWN0aW9uOlwiVHJhdmVsT3JkZXIvSW5kZXhBbGxcIiBcclxuICAgICAgICAsZGF0YToge2xldG9Qb3RuZWdhTmFsb2dhIDogX2xldG9Qb3RuZWdhTmFsb2dhfVxyXG4gICAgICAgICx0eXBlOlwiR0VUXCJcclxuICAgIH0pOyAgICAgXHJcbiAgfVxyXG5cclxuICBvblNlYXJjaFZhbHVlMkNoYW5nZShlOmFueSk6dm9pZHtcclxuICAgIHRoaXMucmVmcmVzaEdyaWREYXRhKCk7XHJcbiAgfSAgXHJcblxyXG4gXHJcbiAgLy9cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BXZkFjdGlvbiB9IGZyb20gXCIuLi9Db3JlL3Nhb3Atdmlldy1mb3JtXCI7XHJcbmltcG9ydCB7IFNhb3BXZWJHcmlkLFNhb3BXZWJHcmlkUHJvcGVydGllcyxTYW9wV2ViR3JpZFRvb2xiYXIsU2FvcFdlYkdyaWRUb29sYmFyQnV0dG9uLFNhb3BXZWJEYXRhVGFibGV9IGZyb20gXCIuLi9Db21wb25lbnRzL3Nhb3AtZ3JpZFwiO1xyXG5pbXBvcnQgeyBPUE5Qb3RuaU5hbG9naVZpZXcgfSBmcm9tIFwiLi4vT1BOL09QTlBvdG5pTmFsb2dpLXZpZXdcIjtcclxuaW1wb3J0IHsgU2FvcFNlcnZpY2VzQ29yZSB9IGZyb20gXCIuLi9Db3JlL3Nhb3Atc2VydmljZXMtY29yZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE9QTlBvdG5pTmFsb2dpQXJoaXZHcmlkIHtcclxuICBwcml2YXRlIGxpYk5hbWU6c3RyaW5nO1xyXG4gIHByaXZhdGUgX3Nhb3BTZXJ2aWNlc0NvcmU6IFNhb3BTZXJ2aWNlc0NvcmU7XHJcbiAgLy9cclxuICBwdWJsaWMgd2ViR3JpZDI6U2FvcFdlYkdyaWQ7XHJcbiAgcHVibGljIG9wblBvdG5pTmFsb2dpRnVsbFZpZXc6T1BOUG90bmlOYWxvZ2lWaWV3O1xyXG5cclxuICBjb25zdHJ1Y3RvcihsaWJOYW1lOiBzdHJpbmcpIHtcclxuICAgIHRoaXMubGliTmFtZSA9IGxpYk5hbWU7XHJcbiAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICB9ICBcclxuXHJcbiAgaW5pdFZpZXcoKXtcclxuICAgIHRoaXMuaW5pdFdlYkdyaWQyKCk7XHJcbiAgICB0aGlzLmluaXRXZWJHcmlkMkxpc3RuZXJzKCk7ICBcclxuICAgIHRoaXMuaW5pdEVkaXRWaWV3KCk7XHJcbiAgfVxyXG5cclxuICBlZGl0UmVjb3JkKGxldG9Qb3RuZWdhTmFsb2dhOnN0cmluZywgc3Rldmlsa2FQb3RuZWdhTmFsb2dhOnN0cmluZyl7XHJcbiAgICBsZXQgX2Z1bGxUaXRsZSA9IHRoaXMub3BuUG90bmlOYWxvZ2lGdWxsVmlldy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiVXJlZGk6IFBvdG5pIG5hbG9nXCIpK1wiIFwiICtsZXRvUG90bmVnYU5hbG9nYStcIi1cIitzdGV2aWxrYVBvdG5lZ2FOYWxvZ2E7XHJcbiAgICB0aGlzLm9wblBvdG5pTmFsb2dpRnVsbFZpZXcuZnVsbFRpdGxlID0gX2Z1bGxUaXRsZTtcclxuICAgIHRoaXMub3BuUG90bmlOYWxvZ2lGdWxsVmlldy5zaG93Vmlld0Zvcm0oU2FvcFdmQWN0aW9uLndmYUVkaXRSZWNvcmQseyBsZXRvUG90bmVnYU5hbG9nYTogbGV0b1BvdG5lZ2FOYWxvZ2EsIHN0ZXZpbGthUG90bmVnYU5hbG9nYTogc3Rldmlsa2FQb3RuZWdhTmFsb2dhLCBmdWxsVmlldzogdHJ1ZSB9KTsgICAgIFxyXG4gIH1cclxuXHJcbiAgaW5pdFdlYkdyaWQyKCl7XHJcbiAgICBsZXQgd2dJZCA9IFwiI09QTlBvdG5pTmFsb2dpR3JpZEFyY2hpdmVcIjtcclxuICAgIGxldCBjYXB0aW9uVG9vbGJhciA9ICQod2dJZCkuYXR0cihcImNhcHRpb24tdG9vbGJhclwiKSE7XHJcbiAgICAvL1xyXG4gICAgdGhpcy53ZWJHcmlkMiA9IG5ldyBTYW9wV2ViR3JpZCh0aGlzLmxpYk5hbWUrXCIud2ViR3JpZDJcIik7XHJcbiAgICBsZXQgZ3JpZFByb3BlcnRpZXM6IFNhb3BXZWJHcmlkUHJvcGVydGllcztcclxuICAgIGxldCBncmlkVG9vbGJhcjpTYW9wV2ViR3JpZFRvb2xiYXI7XHJcbiAgICBsZXQgZGF0YVRhYmxlOlNhb3BXZWJEYXRhVGFibGU7XHJcbiAgICBsZXQgdG9vbGJhckl0ZW1zVGVtcGxhdGVJZCA9ICQod2dJZCkuYXR0cihcInRvb2xiYXItaXRlbXMtdGVtcGxhdGVJZFwiKTtcclxuICAgIC8vXHJcbiAgICBncmlkVG9vbGJhciA9IHtpZDpcInNhb3BXZWJHcmlkVEIyXCIsY2FwdGlvbjpjYXB0aW9uVG9vbGJhciwgaXRlbXNUZW1wbGF0ZUlkOnRvb2xiYXJJdGVtc1RlbXBsYXRlSWR9O1xyXG5cclxuICAgIGRhdGFUYWJsZSA9IHsgZW5hYmxlZDp0cnVlLGNvbHVtbkRlZnNTZXR0aW5nczpbe29yZGVyYWJsZTogdHJ1ZSwgdGFyZ2V0czogIFwibm8tc29ydFwifV0sb3JkZXI6IFtbIDIsIFwiZGVzY1wiIF0sIFsgMywgXCJkZXNjXCIgXV0sfTtcclxuXHJcbiAgICBncmlkUHJvcGVydGllcyA9IHtcclxuICAgICAgICBncmlkSWQ6d2dJZFxyXG4gICAgICAgICx0b2dnbGVQYW5lbDp7ZW5hYmxlZDpmYWxzZX1cclxuICAgICAgICAsdG9vbGJhcjpncmlkVG9vbGJhclxyXG4gICAgICAgICxkYXRhVGFibGU6ZGF0YVRhYmxlXHJcbiAgICAgIH07ICAgICAgICBcclxuICAgIC8vXHJcbiAgICB0aGlzLndlYkdyaWQyLmluaXQoZ3JpZFByb3BlcnRpZXMpOyAgICAgICAgXHJcbiAgfVxyXG5cclxuICBpbml0V2ViR3JpZDJMaXN0bmVycygpe1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIC8vXHJcbiAgICBsZXQgX1NlYXJjaFZhbHVlMiA9ICQoJyNjb2xsYXBzZXNhb3BXZWJHcmlkVEIyJykuZmluZCgnI1NlYXJjaFZhbHVlMicpOyAgXHJcbiAgICBpZiAoX1NlYXJjaFZhbHVlMi5sZW5ndGggPiAwKSB7XHJcbiAgICAgIF9TZWFyY2hWYWx1ZTIub2ZmKFwiY2hhbmdlXCIpO1xyXG4gICAgICBfU2VhcmNoVmFsdWUyLm9uKFwiY2hhbmdlXCIsX3RoaXMub25TZWFyY2hWYWx1ZTJDaGFuZ2UuYmluZChfdGhpcykpO1xyXG4gICAgfVxyXG4gICAgLy9cclxuICAgICQoXCJib2R5XCIpLm9mZihcImNsaWNrXCIsIFwiI09QTlBvdG5pTmFsb2dpR3JpZEFyY2hpdmUgdGQ6bm90KC50ZC1hY3Rpb24pXCIpO1xyXG4gICAgJChcImJvZHlcIikub24oXCJjbGlja1wiLCBcIiNPUE5Qb3RuaU5hbG9naUdyaWRBcmNoaXZlIHRkOm5vdCgudGQtYWN0aW9uKVwiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIGRhdGEgPSAkKHRoaXMpLmNsb3Nlc3QoXCJ0clwiKTtcclxuICAgICAgICBsZXQgbGV0b1BvdG5lZ2FOYWxvZ2EgPSBkYXRhLmF0dHIoXCJkYXRhLWxldG9cIikhO1xyXG4gICAgICAgIGxldCBzdGV2aWxrYVBvdG5lZ2FOYWxvZ2EgPSBkYXRhLmF0dHIoXCJkYXRhLXN0ZXZpbGthXCIpITtcclxuICAgICAgICBfdGhpcy5lZGl0UmVjb3JkKGxldG9Qb3RuZWdhTmFsb2dhLHN0ZXZpbGthUG90bmVnYU5hbG9nYSk7XHJcbiAgICB9KTsgXHJcbiAgICBcclxuICAgICQoXCIuT1BOUG90bmlOYWxvZ2lHcmlkQXJjaGl2ZV9lZGl0XCIpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgJChcIi5PUE5Qb3RuaU5hbG9naUdyaWRBcmNoaXZlX2VkaXRcIikub24oJ2NsaWNrJywgZnVuY3Rpb24ocm93KXtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiT1BOUG90bmlOYWxvZ2lHcmlkQXJjaGl2ZV9lZGl0LmNsaWNrXCIpO1xyXG4gICAgICAgICQoJyNkZXRhaWxzT1BOUG90bmlOYWxvZ2lGb3JtJykucmVtb3ZlKCk7XHJcbiAgICAgICAgbGV0IF9idG5FZGl0ID0gcm93LmN1cnJlbnRUYXJnZXQ7XHJcbiAgICAgICAgbGV0IGJ0bkVuYWJsZWQgPSBfYnRuRWRpdC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWVuYWJsZWRcIikhO1xyXG4gICAgICAgIGlmIChidG5FbmFibGVkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBcInRydWVcIikge1xyXG4gICAgICAgICAgICBsZXQgbGV0b1BvdG5lZ2FOYWxvZ2EgPSBfYnRuRWRpdC5nZXRBdHRyaWJ1dGUoXCJkYXRhLUxldG9Qb3RuZWdhTmFsb2dhXCIpITtcclxuICAgICAgICAgICAgbGV0IHN0ZXZpbGthUG90bmVnYU5hbG9nYSA9IF9idG5FZGl0LmdldEF0dHJpYnV0ZShcImRhdGEtU3Rldmlsa2FQb3RuZWdhTmFsb2dhXCIpITtcclxuICAgICAgICAgICAgX3RoaXMuZWRpdFJlY29yZChsZXRvUG90bmVnYU5hbG9nYSxzdGV2aWxrYVBvdG5lZ2FOYWxvZ2EpO1xyXG4gICAgICAgIH0gICAgICAgICAgICBcclxuICAgIH0pOyAgICAgICAgXHJcbiAgfVxyXG5cclxuICBpbml0RWRpdFZpZXcoKXtcclxuICAgIHRoaXMub3BuUG90bmlOYWxvZ2lGdWxsVmlldyA9IG5ldyBPUE5Qb3RuaU5hbG9naVZpZXcoXCIjb3BuUG90bmlOYWxvZ2lWaWV3MDAxXCIsdGhpcy5saWJOYW1lK1wiLm9wblBvdG5pTmFsb2dpRnVsbFZpZXdcIik7XHJcbiAgICB0aGlzLm9wblBvdG5pTmFsb2dpRnVsbFZpZXcuZnVsbFNjcmVlbiA9IHRydWU7ICAgXHJcbiAgICB0aGlzLm9wblBvdG5pTmFsb2dpRnVsbFZpZXcucmVmcmVzaERhdGEgPSB0aGlzLnJlZnJlc2hHcmlkRGF0YS5iaW5kKHRoaXMpO1xyXG4gIH0gXHJcblxyXG4gIHJlZnJlc2hEYXRhKGh0bWxDb250ZW50OnN0cmluZyl7XHJcbiAgICB0aGlzLndlYkdyaWQyLnJlcGxhY2VHcmlkUm93cyhodG1sQ29udGVudCk7XHJcbiAgICB0aGlzLmluaXRXZWJHcmlkMkxpc3RuZXJzKCk7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoR3JpZERhdGEoKTp2b2lkIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IF9TZWFyY2hWYWx1ZTIgPSAkKCcjY29sbGFwc2VzYW9wV2ViR3JpZFRCMicpLmZpbmQoJyNTZWFyY2hWYWx1ZTInKTtcclxuICAgIGxldCBfbGV0b1BvdG5lZ2FOYWxvZ2EgPSBcIlwiO1xyXG4gICAgaWYgKF9TZWFyY2hWYWx1ZTIubGVuZ3RoID4gMCkge1xyXG4gICAgICBfbGV0b1BvdG5lZ2FOYWxvZ2EgPSBfU2VhcmNoVmFsdWUyLnZhbCgpIGFzIHN0cmluZztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uKHJlc3BvbnNlKXtcclxuICAgICAgLy8jVG9EbyNcclxuICAgICAgLy9fdGhpcy5vcG5Qb3RuaU5hbG9naVZpZXcucmVmcmVzaEVsZW1lbnREYXRhKHJlc3BvbnNlLFwiW2RhdGEtc3Rldmlsa2E9XFxcIjZcXFwiXVwiKTtcclxuICAgICAgX3RoaXMucmVmcmVzaERhdGEocmVzcG9uc2UpO1xyXG4gICAgICAvL190aGlzLndlYkdyaWQxLnJlZnJlc2hEYXRhKCk7XHJcbiAgICAgIC8vX3RoaXMuaW5pdFdlYkdyaWQxTGlzdG5lcnMoKTtcclxuICAgIH07XHJcbiAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgIGFjdGlvbjpcIlRyYXZlbE9yZGVyL2luZGV4QXJjaGl2ZVwiIFxyXG4gICAgICAgICxkYXRhOiB7bGV0b1BvdG5lZ2FOYWxvZ2EgOiBfbGV0b1BvdG5lZ2FOYWxvZ2F9XHJcbiAgICAgICAgLHR5cGU6XCJHRVRcIlxyXG4gICAgfSk7ICAgICBcclxuICB9XHJcblxyXG4gIC8vIG9uT2RvYnJlbmFVcG9yYWJhQ2hhbmdlKGU6YW55KTp2b2lke1xyXG4gIC8vICAgbGV0IF9zZWxlY3RlZFZhbHVlID0gZS52YWx1ZTsgIFxyXG4gIC8vICAgbGV0IF9yZWdpc3Ryc2thU3Rldmlsa2FQcmVkbG9nID0gJCgnI1JlZ2lzdHJza2FTdGV2aWxrYVByZWRsb2cnKTtcclxuICAvLyAgIGlmIChfc2VsZWN0ZWRWYWx1ZSA9PSAnMScpIHtcclxuICAvLyAgICAgX3JlZ2lzdHJza2FTdGV2aWxrYVByZWRsb2cuc2hvdygpO1xyXG4gIC8vICAgfSBlbHNlIHtcclxuICAvLyAgICAgX3JlZ2lzdHJza2FTdGV2aWxrYVByZWRsb2cuaGlkZSgpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgb25TZWFyY2hWYWx1ZTJDaGFuZ2UoZTphbnkpOnZvaWR7XHJcbiAgICB0aGlzLnJlZnJlc2hHcmlkRGF0YSgpO1xyXG4gIH0gIFxyXG5cclxuICAvL1xyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCwgZ2V0UmVsYXRpdmVTaXRlVVJMLCBnZXRTaXRlQWJzb2x1dGVVUkwsIGlzRW1wdHksIGlzVW5EZWZpbmVkIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wVmlld0Zvcm0sU2FvcFdmQWN0aW9uIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC12aWV3LWZvcm1cIjtcclxuIGltcG9ydCB7IFNhb3BHb29nbGVNYXBzIH0gIGZyb20gXCIuLi9Db21wb25lbnRzL3Nhb3AtZ29vZ2xlbWFwc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE9QTlBvdG5pTmFsb2dpR29nZ2xlTWFwc1ZpZXcgZXh0ZW5kcyBTYW9wVmlld0Zvcm0ge1xyXG4gIHByaXZhdGUgX3BhcmVudFZpZXdJZDpzdHJpbmc7XHJcbiAgLy9wcml2YXRlIF9zYW9wR29vZ2xlTWFwczpTYW9wR29vZ2xlTWFwcztcclxuXHJcbiAgY29uc3RydWN0b3Iodmlld0lkOnN0cmluZyxsaWJOYW1lOnN0cmluZyA9IFwiXCIpe1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk9QTlBvdG5pTmFsb2dpR29nZ2xlTWFwc1ZpZXdcIik7XHJcbiAgICBzdXBlcih2aWV3SWQsbGliTmFtZSk7XHJcbiAgICB0aGlzLnNldERpY3Rpb25hcnkoKTsgICBcclxuICAgIHRoaXMuYWRkUmVjb3JkRW5kcG9pbnQgPSBcIlwiO1xyXG4gICAgdGhpcy5lZGl0UmVjb3JkRW5kcG9pbnQgPSBcIlRyYXZlbE9yZGVyL0dvb2dsZU1hcHNcIjtcclxuICAgIHRoaXMuZGVsZXRlUmVjb3JkRW5kcG9pbnQgPSBcIlwiOyAgIFxyXG4gICAgdGhpcy5mdWxsU2NyZWVuID0gdHJ1ZTtcclxuICAgIC8vXHJcbiAgICAvL3RoaXMuX3Nhb3BHb29nbGVNYXBzID0gbmV3IFNhb3BHb29nbGVNYXBzKCk7XHJcbiAgICAvL1xyXG4gICAgdGhpcy5vbkJ0bk9rQ2xpY2sgPSB0aGlzLm9uQnRuT2tDbGlja0V4LmJpbmQodGhpcyk7XHJcbiAgICAvL3RoaXMudmlld1Nob3dDb21wbGV0ZSA9IHRoaXMuaW5pdEZvcm0uYmluZCh0aGlzKTsgIFxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXREaWN0aW9uYXJ5KCkge1xyXG4gICAgdGhpcy5zZXRUZXJtaW5vbG9neUxpc3QoKTtcclxuICB9ICBcclxuXHJcbiAgcHJpdmF0ZSBpbml0Rm9ybSgpOiB2b2lkIHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJPUE5Qb3RuaU5hbG9naUdvZ2dsZU1hcHNWaWV3LmluaXRGb3JtXCIpO1xyXG4gICAgLy8gdGhpcy5fc2FvcEdvb2dsZU1hcHMgPSBuZXcgU2FvcEdvb2dsZU1hcHMoKTtcclxuICAgIC8vIHRoaXMuX3Nhb3BHb29nbGVNYXBzLmluaXRWaWV3KCk7XHJcbiAgICB0aGlzLmxvYWRSb3V0ZXNMaXN0KCk7XHJcbiAgfVxyXG5cclxuICBwcmVwYXJlVmlldyhwYXJlbnRWaWV3SWQ6c3RyaW5nLCB0aXRsZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwicHJlcGFyZVZpZXcuc2hvd0Zvcm1cIik7XHJcbiAgICB0aGlzLl9wYXJlbnRWaWV3SWQgPSBwYXJlbnRWaWV3SWQ7XHJcbiAgICB0aGlzLnRpdGxlID0gdGl0bGU7XHJcbiAgICBsZXQgX2dvb2dsZU1hcHNSb3V0ZXNFbGVtZW50ID0gJCgnI0dvb2dsZU1hcHNSb3V0ZXMnKTtcclxuICAgIGlmIChfZ29vZ2xlTWFwc1JvdXRlc0VsZW1lbnQubGVuZ3RoID09IDApe1xyXG4gICAgICB0aGlzLnByZXBhcmVWaWV3Rm9ybShTYW9wV2ZBY3Rpb24ud2ZhUmVjb3JkRGVzdGFpbHMsIG51bGwsIG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2hvd0Zvcm0ocGFyZW50Vmlld0lkOnN0cmluZyk6IHZvaWQge1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk9QTlBvdG5pTmFsb2dpR29nZ2xlTWFwc1ZpZXcuc2hvd0Zvcm1cIik7XHJcbiAgICB0aGlzLl9wYXJlbnRWaWV3SWQgPSBwYXJlbnRWaWV3SWQ7XHJcbiAgICAkKCcjb3BuUG90bmlOYWxvZ2lWaWV3MDAzJykubW9kYWwoJ3Nob3cnKTtcclxuICAgICQoJyNvcG5Qb3RuaU5hbG9naVZpZXcwMDMnKS5maW5kKCcjbWVzc2FnZUJhbm5lcicpLmhpZGUoKTtcclxuICAgIHRoaXMuaW5pdEZvcm0oKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBsb2FkUm91dGVzTGlzdCgpOiB2b2lkIHtcclxuICAgIGxldCBfcm91dGVzTGlzdCA9ICQodGhpcy5fcGFyZW50Vmlld0lkKS5maW5kKCcjRG9kYXRuaU9waXNSZWxhY2lqZScpO1xyXG4gICAgbGV0IF9yb3V0ZXNMaXN0U3RyaW5nID0gX3JvdXRlc0xpc3QudmFsKCkgYXMgc3RyaW5nO1xyXG4gICAgJCgnI0dvb2dsZU1hcHNSb3V0ZXMnKS5maW5kKCcjUm91dGVzTGlzdCcpLnZhbChfcm91dGVzTGlzdFN0cmluZyk7XHJcblxyXG4gICAgJCgnI0dvb2dsZU1hcHNSb3V0ZXMnKS5maW5kKCcjYnRuUm91dGVzTGlzdCcpLmNsaWNrKCk7XHJcbiAgICAvLyBsZXQgc2FvcEdvb2dsZU1hcHMgPSBuZXcgU2FvcEdvb2dsZU1hcHModGhpcy5pZCk7XHJcbiAgICAvLyBpZiAoX3JvdXRlc0xpc3RTdHJpbmcubGVuZ3RoID4gMCkge1xyXG4gICAgLy8gICBsZXQgX3JvdXRlc0FycmF5ID0gX3JvdXRlc0xpc3RTdHJpbmcuc3BsaXQoXCI7XCIpO1xyXG4gICAgLy8gICBzYW9wR29vZ2xlTWFwcy5sb2FkV2F5cG9pbnRzKF9yb3V0ZXNBcnJheSk7XHJcbiAgICAvLyB9IGVsc2Uge1xyXG4gICAgLy8gICBzYW9wR29vZ2xlTWFwcy5sb2FkV2F5cG9pbnRzKG51bGwpO1xyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQnRuT2tDbGlja0V4KHNlbmRlcjogYW55KTogdm9pZCB7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiT1BOUG90bmlOYWxvZ2lHb2dnbGVNYXBzVmlldy5vbkJ0bk9rQ2xpY2tFeFwiKTtcclxuICAgIGxldCBzYW9wR29vZ2xlTWFwcyA9IG5ldyBTYW9wR29vZ2xlTWFwcyh0aGlzLmlkKTtcclxuXHJcbiAgICBsZXQgX3JvdXRlc0xpc3RTdHJpbmcgPSBzYW9wR29vZ2xlTWFwcy5nZXRSb3V0ZXMoKTtcclxuXHJcbiAgICAvL2xldCBfcm91dGVzTGlzdCA9ICQodGhpcy5fcGFyZW50Vmlld0lkKS5maW5kKCcjRG9kYXRuaU9waXNSZWxhY2lqZScpO1xyXG4gICAgbGV0IF9yb3V0ZXNMaXN0ID0gJCgnI0RvZGF0bmlPcGlzUmVsYWNpamUnKTtcclxuICAgICBfcm91dGVzTGlzdC52YWwoX3JvdXRlc0xpc3RTdHJpbmcpO1xyXG4gICAgLy9cclxuICAgICBsZXQgX2Rpc3RhbmNlU3RyaW5nID0gIHNhb3BHb29nbGVNYXBzLmdldERpc3RhbmNlKCk7XHJcbiAgICAgLy8kKHRoaXMuX3BhcmVudFZpZXdJZCkuZmluZCgnI1ByZWR2aWRlbmlLbScpLnZhbChfZGlzdGFuY2VTdHJpbmcpO1xyXG4gICAgICQoJyNQcmVkdmlkZW5pS20nKS52YWwoX2Rpc3RhbmNlU3RyaW5nKTtcclxuICB9ICBcclxuICAvL1xyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCwgaXNVbkRlZmluZWQsIGlzRW1wdHkgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BXZkFjdGlvbiB9IGZyb20gXCIuLi9Db3JlL3Nhb3Atdmlldy1mb3JtXCI7XHJcbmltcG9ydCB7IFNhb3BNdWx0aXNlbGVjdE9wdGlvbnMgfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLW11bHRpc2VsZWN0XCI7XHJcbmltcG9ydCB7IFNhb3BTZWxlY3REcm9wRG93biB9IGZyb20gXCIuLi9Db21wb25lbnRzL3Nhb3Atc2VsZWN0LWRyb3Bkb3duXCI7XHJcbmltcG9ydCB7IE9QTlJlbGFjaWplVmlldyB9IGZyb20gXCIuLi9PUE4vT1BOUmVsYWNpamUtdmlld1wiO1xyXG5pbXBvcnQgeyBTYW9wU2VydmljZXNDb3JlLCBTYW9wU2VydmljZXNDb3JlUGFyYW1zIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC1zZXJ2aWNlcy1jb3JlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgT1BOUmVsYWNpamVTZWxlY3QgZXh0ZW5kcyBTYW9wU2VsZWN0RHJvcERvd24ge1xyXG4gIC8vIHByaXZhdGUgX190YXJnZXQ6c3RyaW5nO1xyXG4gIC8vIHByaXZhdGUgX19jYXB0aW9uOnN0cmluZzsgIFxyXG4gIHByaXZhdGUgX19saWJOYW1lOnN0cmluZztcclxuICBwdWJsaWMgX29wblJlbGFjaWplVmlldzpPUE5SZWxhY2lqZVZpZXc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGxpYk5hbWU6c3RyaW5nID0gXCJcIiwgb3B0aW9uczpTYW9wTXVsdGlzZWxlY3RPcHRpb25zID0gbnVsbCkge1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk9QTlJlbGFjaWplU2VsZWN0XCIpO1xyXG4gICAgc3VwZXIobGliTmFtZSxvcHRpb25zKTtcclxuICAgIHRoaXMuX19saWJOYW1lID0gbGliTmFtZTsgICBcclxuICAgIC8vXHJcbiAgICB0aGlzLl9vcG5SZWxhY2lqZVZpZXcgPSBuZXcgT1BOUmVsYWNpamVWaWV3KFwiI29wblJlbGF0aW9uc1BvcHVwRm9ybVwiLHRoaXMuX19saWJOYW1lICArIFwiLl9vcG5SZWxhY2lqZVZpZXdcIik7XHJcbiAgICB0aGlzLl9vcG5SZWxhY2lqZVZpZXcuZnVsbFNjcmVlbiA9IGZhbHNlOyAgIFxyXG4gICAgdGhpcy5fb3BuUmVsYWNpamVWaWV3LmFmdGVyU3VibWl0U3VjY2VzcyA9IHRoaXMucmVmcmVzaERhdGFBZnRlclN1Ym1pdC5iaW5kKHRoaXMpOyAgICAgXHJcbiAgfSBcclxuXHJcbiAgaW5pdCh0YXJnZXQ6IHN0cmluZyA9IFwiXCIsIGNhcHRpb24gPSBcIlwiICl7XHJcbiAgICAvLyB0aGlzLl90YXJnZXQgPSB0YXJnZXQ7XHJcbiAgICAvLyB0aGlzLl9jYXB0aW9uID0gY2FwdGlvbjtcclxuICAgIC8vXHJcbiAgICBpZiAodGFyZ2V0Lmxlbmd0aCA9PSAwKXtcclxuICAgICAgdGFyZ2V0ID0gXCJTaWZyYVJlbGFjaWplXCI7XHJcbiAgICB9XHJcbiAgICBpZiAoY2FwdGlvbi5sZW5ndGggPT0gMCl7XHJcbiAgICAgIGNhcHRpb24gPSBcIlJlbGFjaWplXCI7XHJcbiAgICB9XHJcbiAgICBzdXBlci5pbml0KHRhcmdldCwgY2FwdGlvbik7XHJcbiAgICAvL1xyXG4gIH1cclxuXHJcbiAgYWRkUmVjb3JkKCl7XHJcbiAgICBsZXQgX2Z1bGxUaXRsZSA9IHRoaXMuX29wblJlbGFjaWplVmlldy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiUmVsYWNpamVcIik7XHJcbiAgICB0aGlzLl9vcG5SZWxhY2lqZVZpZXcuZnVsbFRpdGxlID0gX2Z1bGxUaXRsZTtcclxuICAgIHRoaXMuX29wblJlbGFjaWplVmlldy5zaG93Vmlld0Zvcm0oU2FvcFdmQWN0aW9uLndmYUFkZFJlY29yZCx7IH0pOyAgICAgXHJcbiAgfSAgXHJcblxyXG4gIGVkaXRSZWNvcmQoX3NpZnJhUmVsYWNpamU6c3RyaW5nKXtcclxuICAgIGxldCBfZnVsbFRpdGxlID0gdGhpcy5fb3BuUmVsYWNpamVWaWV3LnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJSZWxhY2lqZVwiKTtcclxuICAgIHRoaXMuX29wblJlbGFjaWplVmlldy5mdWxsVGl0bGUgPSBfZnVsbFRpdGxlO1xyXG4gICAgdGhpcy5fb3BuUmVsYWNpamVWaWV3LnNob3dWaWV3Rm9ybShTYW9wV2ZBY3Rpb24ud2ZhRWRpdFJlY29yZCx7IHNpZnJhUmVsYWNpamU6IF9zaWZyYVJlbGFjaWplLCBmdWxsVmlldzogZmFsc2UgfSk7ICAgICBcclxuICB9ICBcclxuXHJcbiAgcHVibGljIG9uQWRkQnRuQ2xpY2soc2VuZGVyOmFueSk6dm9pZHtcclxuICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIm9uQWRkQnRuQ2xpY2suLi5TaWZyYUxva2FjaWplXCIpO1xyXG4gICAgICB0aGlzLmFkZFJlY29yZCgpO1xyXG4gIH0gIFxyXG5cclxuICBwdWJsaWMgb25FZGl0QnRuQ2xpY2soc2VuZGVyOmFueSk6dm9pZHtcclxuICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIm9uRWRpdEJ0bkNsaWNrLi4uU2lmcmFMb2thY2lqZVwiKTtcclxuICAgICAgbGV0IF9zaWZyYVJlbGFjaWplID0gdGhpcy5zZWxlY3RlZENCLnZhbCgpO1xyXG4gICAgICB0aGlzLmVkaXRSZWNvcmQoX3NpZnJhUmVsYWNpamUpOyAgICBcclxuICB9ICBcclxuXHJcbiAgcHVibGljIHJlZnJlc2hEYXRhQWZ0ZXJTdWJtaXQocmVzdWx0OiBhbnkpOiB2b2lkIHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzdWJtaXQuYWZ0ZXJFeGVjdXRlU3VjY2Vzc1wiKTtcclxuICAgIC8vXHJcbiAgICBpZiAoIChpc1VuRGVmaW5lZChyZXN1bHQuc3VjY2VzcykgPT0gZmFsc2UpICYmIChyZXN1bHQuc3VjY2VzcyA9PSB0cnVlKSApIHtcclxuICAgICAgbGV0IF9zaWZyYVJlbGFjaWplID0gXCJcIjtcclxuICAgICAgaWYgKGlzVW5EZWZpbmVkKHJlc3VsdC5kYXRhKSA9PSBmYWxzZSkge1xyXG4gICAgICAgIGxldCBqc29uRGF0YSA9IEpTT04ucGFyc2UocmVzdWx0LmRhdGEpO1xyXG4gICAgICAgIF9zaWZyYVJlbGFjaWplID0ganNvbkRhdGEuU2lmcmFSZWxhY2lqZTtcclxuICAgICAgfSAgICBcclxuICAgICAgLy9cclxuICAgICAgbGV0IF9zZXJ2aWNlc1BhcmFtczpTYW9wU2VydmljZXNDb3JlUGFyYW1zID0ge1xyXG4gICAgICAgIGFjdGlvbjogXCJPcG5SZWxhdGlvbnMvR2V0TGlzdFwiXHJcbiAgICAgICAgLCBkYXRhOiB7c2lmcmFSZWxhY2lqZTpfc2lmcmFSZWxhY2lqZX1cclxuICAgICAgICAsIHR5cGU6IFwiR0VUXCJcclxuICAgICAgfTtcclxuICBcclxuICAgICAgdGhpcy5nZXREcm9wRG93bkl0ZW1zRGF0YShfc2VydmljZXNQYXJhbXMsIF9zaWZyYVJlbGFjaWplKTtcclxuICAgIH0gXHJcbiAgfVxyXG5cclxuICAvL1xyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsImltcG9ydCB7IFNhb3BWaWV3Rm9ybSB9IGZyb20gXCIuLi9Db3JlL3Nhb3Atdmlldy1mb3JtXCI7XHJcbmltcG9ydCB7IFNhb3BTaWZyYW50aSB9IGZyb20gXCIuLi9Db21wb25lbnRzL3Nhb3Atc2lmcmFudGlcIjtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgT1BOUmVsYWNpamVWaWV3IGV4dGVuZHMgU2FvcFZpZXdGb3JtIHtcclxuICBwcml2YXRlIF9zYW9wU2lmcmFudGk6U2FvcFNpZnJhbnRpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHZpZXdJZDpzdHJpbmcsbGliTmFtZTpzdHJpbmcgPSBcIlwiKXtcclxuICAgICAgICBzdXBlcih2aWV3SWQsbGliTmFtZSk7XHJcbiAgICAgICAgdGhpcy50aXRsZSA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIlJlbGFjaWplXCIpO1xyXG4gICAgICAgIHRoaXMuYWRkUmVjb3JkRW5kcG9pbnQgPSBcIk9wblJlbGF0aW9ucy9DcmVhdGVcIjtcclxuICAgICAgICB0aGlzLmVkaXRSZWNvcmRFbmRwb2ludCA9IFwiT3BuUmVsYXRpb25zL0VkaXRcIjtcclxuICAgICAgICAvL3RoaXMuZGVsZXRlUmVjb3JkRW5kcG9pbnQgPSBcIk9wblJlbGF0aW9ucy9EZWxldGVcIjsgXHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLl9zYW9wU2lmcmFudGkgPSBuZXcgU2FvcFNpZnJhbnRpKCk7XHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLmFmdGVyVmlld1Nob3dTdWNjZXNzID0gdGhpcy5pbml0VmlldztcclxuICAgICAgICB0aGlzLmFmdGVyU3VibWl0U3VjY2VzcyA9IHRoaXMuaW5pdFZpZXc7ICAgICAgICBcclxuICAgICAgfVxyXG5cclxuXHJcbiAgICAgIHNldERpY3Rpb25hcnkoKXtcclxuICAgICAgICBsZXQgZGljdGlvbmFyeTpzdHJpbmdbXSA9IFtcIlJlbGFjaWplXCJdO1xyXG4gICAgICAgIHRoaXMuc2V0VGVybWlub2xvZ3lMaXN0KGRpY3Rpb25hcnkpO1xyXG4gICAgfSBcclxuXHJcbiAgICAgIHB1YmxpYyBpbml0VmlldygpOnZvaWR7XHJcbiAgICAgICAgdGhpcy5zZXREaWN0aW9uYXJ5KCk7ICBcclxuICAgICAgICB0aGlzLkxvYWRWaWV3RXZlbnRzKCk7XHJcbiAgICAgICAgdGhpcy5fc2FvcFNpZnJhbnRpLmluaXQoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcHVibGljIExvYWRWaWV3RXZlbnRzICgpOnZvaWR7XHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgICAvL1xyXG59Iiwi77u/Ly8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9qSFRyZWUvaW5kZXguZC50c1wiIC8+XHJcblxyXG5pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BNdWx0aXNlbGVjdCB9IGZyb20gXCIuLi9Db21wb25lbnRzL3Nhb3AtbXVsdGlzZWxlY3RcIjtcclxuaW1wb3J0IHsgU2FvcFNlcnZpY2VzQ29yZSB9IGZyb20gXCIuLi9Db3JlL3Nhb3Atc2VydmljZXMtY29yZVwiO1xyXG5cclxuY2xhc3MgYXBpUmVzcG9uc2Uge1xyXG4gICAgc3VjY2VzczogYm9vbGVhbjtcclxuICAgIGRhdGE6IGFueTtcclxuICAgIGFsZXJ0TWVzc2FnZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcE9yZ2FuaWdyYW1WaWV3IHtcclxuICAgIHByaXZhdGUgX2xpYk5hbWVQOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9zZWxlY3RFbm90ZU9yZ1N0cnVrdHVyZTogU2FvcE11bHRpc2VsZWN0O1xyXG4gICAgcHJpdmF0ZSBfZW5vdGVPcmdTdHJ1a3R1cmVEaXZJZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfc2VsZWN0WmFwb3NsZW5pOiBTYW9wTXVsdGlzZWxlY3Q7XHJcbiAgICBwcml2YXRlIF96YXBvc2xlbmlEaXZJZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfdHJlZUNoYXJ0RGl2SWQ6IHN0cmluZztcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih2aWV3SWQ6IHN0cmluZywgbGliTmFtZTogc3RyaW5nID0gXCJcIikge1xyXG4gICAgICAgIHRoaXMuX2xpYk5hbWVQID0gbGliTmFtZTtcclxuICAgICAgICB0aGlzLl9lbm90ZU9yZ1N0cnVrdHVyZURpdklkID0gXCIjRW5vdGVPcmdTdHJ1a3R1cmVEaXZcIjtcclxuICAgICAgICB0aGlzLl96YXBvc2xlbmlEaXZJZCA9IFwiI1phcG9zbGVuaURpdlwiO1xyXG4gICAgICAgIHRoaXMuX3RyZWVDaGFydERpdklkID0gXCIjdHJlZUNoYXJ0XCI7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdFZpZXcoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BPcmdhbmlncmFtVmlldy5pbml0Vmlld1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0U2VsZWN0RW5vdGVPcmdTdHJ1a3R1cmUoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0U2VsZWN0WmFwb3NsZW5pKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdFNlbGVjdEVub3RlT3JnU3RydWt0dXJlKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wT3JnYW5pZ3JhbVZpZXcuaW5pdFNlbGVjdEVub3RlT3JnU3RydWt0dXJlXCIpO1xyXG5cclxuICAgICAgICB0aGlzLl9zZWxlY3RFbm90ZU9yZ1N0cnVrdHVyZSA9IG5ldyBTYW9wTXVsdGlzZWxlY3QoKTtcclxuICAgICAgICB0aGlzLl9zZWxlY3RFbm90ZU9yZ1N0cnVrdHVyZS5hZnRlckNoYW5nZUNvbW1vbkV2ZW50ID0gdGhpcy5maWx0ZXJTZWxlY3RFbm90ZU9yZ1N0cnVrdHVyZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIC8vIGluaXQgemEgbWV0b2RvIFwiYWZ0ZXJDaGFuZ2VDb21tb25FdmVudFwiLCBkYSBzZSDFvmUgdiBcIl9zZWxlY3RFbm90ZU9yZ1N0cnVrdHVyZS5pbml0XCIgbWV0b2RpIHNwcm96aSBmaWx0ZXJTZWxlY3RFbm90ZU9yZ1N0cnVrdHVyZVxyXG4gICAgICAgIHRoaXMuX3NlbGVjdEVub3RlT3JnU3RydWt0dXJlLmluaXQoXCIjRW5vdGVPcmdTdHJ1a3R1cmVGaWx0ZXJcIiwgXCJFbm90YSB6YSBwcmlrYXpcIik7XHJcbiAgICAgICAgLy8gcHJpa2F6ZW1vIHNlbGVjdCBkaXZcclxuICAgICAgICAkKHRoaXMuX2Vub3RlT3JnU3RydWt0dXJlRGl2SWQpLnNob3coKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0U2VsZWN0WmFwb3NsZW5pKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wT3JnYW5pZ3JhbVZpZXcuaW5pdFNlbGVjdFphcG9zbGVuaVwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2VsZWN0WmFwb3NsZW5pID0gbmV3IFNhb3BNdWx0aXNlbGVjdCgpO1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdFphcG9zbGVuaS5pbml0KFwiI1phcG9zbGVuaUZpbHRlclwiLCBcIlphcG9zbGVuaVwiKTtcclxuICAgICAgICAvLyBpbml0IHByZWQgbWV0b2RvIFwiYWZ0ZXJDaGFuZ2VDb21tb25FdmVudFwiLCBkYSBzZSBuZSBpenZlZGUgbWV0b2RhIGZpbHRlclNlbGVjdFphcG9zbGVuaVxyXG4gICAgICAgIHRoaXMuX3NlbGVjdFphcG9zbGVuaS5hZnRlckNoYW5nZUNvbW1vbkV2ZW50ID0gdGhpcy5maWx0ZXJTZWxlY3RaYXBvc2xlbmkuYmluZCh0aGlzKTtcclxuICAgICAgICAvLyBwcmlrYXplbW8gc2VsZWN0IGRpdlxyXG4gICAgICAgICQodGhpcy5femFwb3NsZW5pRGl2SWQpLnNob3coKTtcclxuICAgIH1cclxuXHJcbiAgICBmaWx0ZXJTZWxlY3RFbm90ZU9yZ1N0cnVrdHVyZShlbGVtZW50OiBhbnkpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcE9yZ2FuaWdyYW1WaWV3LmZpbHRlclNlbGVjdEVub3RlT3JnU3RydWt0dXJlXCIpO1xyXG5cclxuICAgICAgICAvLyBwcmViZXJlbW8sIGthdGVyZSBzaWZyZSB6YXBvc2xlbmloIHNvZGlqbyB2IGl6YnJhbmUgc2t1cGluZVxyXG4gICAgICAgIGxldCBpemJyYW5lRW5vdGVPcmdTdHJ1a3R1cmUgPSA8c3RyaW5nPihlbGVtZW50LnZhbCgpLnRvU3RyaW5nKCkpO1xyXG5cclxuICAgICAgICB0aGlzLnJlZnJlc2hEYXRhKGl6YnJhbmVFbm90ZU9yZ1N0cnVrdHVyZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZmlsdGVyU2VsZWN0WmFwb3NsZW5pKGVsZW1lbnQ6IGFueSkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wT3JnYW5pZ3JhbVZpZXcuZmlsdGVyU2VsZWN0WmFwb3NsZW5pXCIpO1xyXG5cclxuICAgICAgICAvLyBvZHN0cmFuaW1vIGNzcyBrbGFzIHphIG9icm9ibyB2c2VtIGVsZW1lbnRvbVxyXG4gICAgICAgICQoXCIudHJlZSBsaSAudHJjb250XCIpLnJlbW92ZUNsYXNzKFwic2VsZWN0ZWQtZW1wbG95ZWVcIik7XHJcbiAgICAgICAgJChcIi50cmVlIGxpIC50cmVlLWNoYXJ0LWhlYWRlclwiKS5yZW1vdmVDbGFzcyhcInNlbGVjdGVkLWVtcGxveWVlLWhlYWRlclwiKTtcclxuXHJcbiAgICAgICAgLy8gcHJlYmVyZW1vLCBrYXRlcmUgc2lmcmUgemFwb3NsZW5paCBqZSBpemJyYW5hXHJcbiAgICAgICAgbGV0IGl6YnJhblphcG9zbGVuaSA9IDxzdHJpbmc+KGVsZW1lbnQudmFsKCkudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgaWYgKGl6YnJhblphcG9zbGVuaSAhPSBudWxsICYmIGl6YnJhblphcG9zbGVuaSAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgIC8vIG96bmFjaW1vIHphcG9zbGVuZWdhXHJcbiAgICAgICAgICAgIGxldCB6YXBvc2xlbmlNYWluRWxlbWVudCA9ICQoXCIjXCIgKyBpemJyYW5aYXBvc2xlbmkgKyBcIiAudHJjb250XCIpLmZpcnN0KCk7XHJcbiAgICAgICAgICAgIGxldCB6YXBvc2xlbmlIZWFkZXJFbGVtZW50ID0gJChcIiNcIiArIGl6YnJhblphcG9zbGVuaSArIFwiIC50cmVlLWNoYXJ0LWhlYWRlclwiKS5maXJzdCgpO1xyXG5cclxuICAgICAgICAgICAgLy8gZG9kYW1vIGNzcyBrbGFzIHphIG9icm9ib1xyXG4gICAgICAgICAgICBpZiAoemFwb3NsZW5pTWFpbkVsZW1lbnQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICB6YXBvc2xlbmlNYWluRWxlbWVudC5hZGRDbGFzcyhcInNlbGVjdGVkLWVtcGxveWVlXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIHBvcHJhdmltbyBoZWFkZXIgc3R5bGVcclxuICAgICAgICAgICAgaWYgKHphcG9zbGVuaUhlYWRlckVsZW1lbnQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICB6YXBvc2xlbmlIZWFkZXJFbGVtZW50LmFkZENsYXNzKFwic2VsZWN0ZWQtZW1wbG95ZWUtaGVhZGVyXCIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBwcmV2ZXJpbW8sIGNlIGplIHBvdHJlYmVuIHNjcm9sbFxyXG4gICAgICAgICAgICBsZXQgaXp2ZW5Ib3Jpem9udGFsID0gdGhpcy5jaGVja0hvcml6b250YWxQb3NpdGlvbk9mZnNldCh6YXBvc2xlbmlNYWluRWxlbWVudCk7XHJcbiAgICAgICAgICAgIGxldCBpenZlblZlcnRpY2FsID0gdGhpcy5jaGVja1ZlcnRpY2FsUG9zaXRpb25PZmZzZXQoemFwb3NsZW5pTWFpbkVsZW1lbnQpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGl6dmVuSG9yaXpvbnRhbCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGxlbmd0aCA9IDUwMFxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5fdHJlZUNoYXJ0RGl2SWQpLnNjcm9sbExlZnQoaSAqIDEwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNoZWNrSG9yaXpvbnRhbFBvc2l0aW9uT2Zmc2V0KHphcG9zbGVuaU1haW5FbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaXp2ZW5WZXJ0aWNhbCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGxlbmd0aCA9IDUwMFxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5fdHJlZUNoYXJ0RGl2SWQpLnNjcm9sbFRvcChpICogMTAwKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2hlY2tWZXJ0aWNhbFBvc2l0aW9uT2Zmc2V0KHphcG9zbGVuaU1haW5FbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IFxyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrSG9yaXpvbnRhbFBvc2l0aW9uT2Zmc2V0KGVsZW1lbnQ6IEpRdWVyeTxIVE1MRWxlbWVudD4pOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgdHJlZUNoYXJ0T2Zmc2V0ID0gJChcIiN0cmVlQ2hhcnRcIikub2Zmc2V0KCk7XHJcbiAgICAgICAgbGV0IHcgPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggLSB0cmVlQ2hhcnRPZmZzZXQubGVmdCwgd2luZG93LmlubmVyV2lkdGggLSB0cmVlQ2hhcnRPZmZzZXQubGVmdCB8fCAwKVxyXG5cclxuICAgICAgICBsZXQgbGVmdFBvcyA9IGVsZW1lbnQub2Zmc2V0KCkubGVmdCAtIHRyZWVDaGFydE9mZnNldC5sZWZ0O1xyXG4gICAgICAgIGlmIChsZWZ0UG9zIDwgMCB8fCBsZWZ0UG9zID4gdykge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gbGVmdCBwcmlzdGVqZW1vIHNlIHdpZHRoIGluIHBvbm92bm8gcHJldmVyaW1vLCBjZSBqZSBpenZlZFxyXG4gICAgICAgIGxlZnRQb3MgPSBsZWZ0UG9zICsgZWxlbWVudC53aWR0aCgpO1xyXG4gICAgICAgIGlmIChsZWZ0UG9zIDwgMCB8fCBsZWZ0UG9zID4gdykge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjaGVja1ZlcnRpY2FsUG9zaXRpb25PZmZzZXQoZWxlbWVudDogSlF1ZXJ5PEhUTUxFbGVtZW50Pik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCB0cmVlQ2hhcnRPZmZzZXQgPSAkKFwiI3RyZWVDaGFydFwiKS5vZmZzZXQoKTtcclxuICAgICAgICBsZXQgcGFnZUZvb3RlciA9ICQoXCIjc2l0ZS1mb290ZXJcIik7XHJcbiAgICAgICAgbGV0IGggPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0IC0gdHJlZUNoYXJ0T2Zmc2V0LnRvcCAtIHBhZ2VGb290ZXIuaGVpZ2h0KCksIHdpbmRvdy5pbm5lckhlaWdodCAtIHRyZWVDaGFydE9mZnNldC50b3AgLSBwYWdlRm9vdGVyLmhlaWdodCgpIHx8IDApXHJcbiAgICAgICAgbGV0IGQgPSAkKGRvY3VtZW50KS5zY3JvbGxUb3AoKTtcclxuXHJcbiAgICAgICAgbGV0IHRvcFBvcyA9IGVsZW1lbnQub2Zmc2V0KCkudG9wIC0gdHJlZUNoYXJ0T2Zmc2V0LnRvcDtcclxuICAgICAgICAvL3ZlcnRpY2FsXHJcbiAgICAgICAgaWYgKHRvcFBvcyA8IDAgfHwgdG9wUG9zID4gaCAtIGQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRvcCBwcmlzdGVqZW1vIHNlIGhlaWdodCBpbiBwb25vdm5vIHByZXZlcmltbywgY2UgamUgaXp2ZWRcclxuICAgICAgICB0b3BQb3MgPSB0b3BQb3MgKyBlbGVtZW50LmhlaWdodCgpO1xyXG4gICAgICAgIGlmICh0b3BQb3MgPCAwIHx8IHRvcFBvcyA+IGggLSBkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hEYXRhKGl6YnJhbmVFbm90ZU9yZ1N0cnVrdHVyZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BPcmdhbmlncmFtVmlldy5yZWZyZXNoRGF0YVwiKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgcGFyYW1zID0geyBpemJyYW5lRW5vdGU6IGl6YnJhbmVFbm90ZU9yZ1N0cnVrdHVyZSB9O1xyXG4gICAgICAgIGxldCBzYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuXHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgbGV0IGFwaVJlc3VsdDogYXBpUmVzcG9uc2UgPSByZXNwb25zZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhcGlSZXN1bHQuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgLy8gcG9icmlzZW1vIGRpdlxyXG4gICAgICAgICAgICAgICAgJChcIiN0cmVlQ2hhcnRcIikuaHRtbChcIlwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAkKFwiI3RyZWVDaGFydFwiKS5qSFRyZWUoe1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxUeXBlOiAnb2JqJyxcclxuICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVPYmo6IGFwaVJlc3VsdC5kYXRhLml0ZW1zLFxyXG4gICAgICAgICAgICAgICAgICAgIHpvb21lcjogZmFsc2VcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICQoX3RoaXMuX3RyZWVDaGFydERpdklkKS5zY3JvbGxMZWZ0KDApO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIG9zdmV6aW1vIHNlIHphcG9zbGVuZVxyXG4gICAgICAgICAgICAgICAgX3RoaXMucmVmcmVzaFNlbGVjdFphcG9zbGVuaSg8c3RyaW5nW10+YXBpUmVzdWx0LmRhdGEuc2lmcmFaYXBvc2xlbmlMaXN0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9O1xyXG4gICAgICAgIHNhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjogXCJPcmdhbml6YXRpb24vR2V0T3JnYW5pemF0aW9uQ2hhcnREYXRhXCJcclxuICAgICAgICAgICAgLCBkYXRhOiBwYXJhbXNcclxuICAgICAgICAgICAgLCB0eXBlOiBcIkdFVFwiXHJcbiAgICAgICAgICAgICwgc3Bpbm5lckRpdklkOiBcIiNvcmdhbmlncmFtTG9hZGluZ1wiXHJcbiAgICAgICAgfSk7ICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hTZWxlY3RaYXBvc2xlbmkoc2lmcmFaYXBvc2xlbmlMaXN0OiBzdHJpbmdbXSk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wT3JnYW5pZ3JhbVZpZXcucmVmcmVzaFNlbGVjdFphcG9zbGVuaVwiKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgcGFyYW1zID0geyBzaWZyZVphcG9zbGVuaTogc2lmcmFaYXBvc2xlbmlMaXN0LnRvU3RyaW5nKCkgfTtcclxuICAgICAgICBsZXQgc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcblxyXG4gICAgICAgIHNhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICQoX3RoaXMuX3phcG9zbGVuaURpdklkKS5odG1sKHJlc3BvbnNlKTtcclxuXHJcbiAgICAgICAgICAgIF90aGlzLmluaXRTZWxlY3RaYXBvc2xlbmkoKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHNhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjogXCJPcmdhbml6YXRpb24vR2V0RW1wb3llZXNGaWx0ZXJcIlxyXG4gICAgICAgICAgICAsIGRhdGE6IHBhcmFtc1xyXG4gICAgICAgICAgICAsIHR5cGU6IFwiR0VUXCJcclxuICAgICAgICAgICAgLCBzcGlubmVyRGl2SWQ6IFwiI29yZ2FuaWdyYW1Mb2FkaW5nXCJcclxuICAgICAgICB9KTsgICAgXHJcbiAgICB9XHJcbiAgICAvL1xyXG59XHJcblxyXG5cclxuIiwi77u/aW1wb3J0IHsgU2FvcFZpZXdGb3JtIH0gZnJvbSBcIi4uL2NvcmUvc2FvcC12aWV3LWZvcm1cIjtcclxuaW1wb3J0IHsgU2FvcFdmU3VibWl0UmVzdWx0IH0gZnJvbSBcIi4uL2NvcmUvc2FvcC12aWV3LWZvcm1cIjtcclxuaW1wb3J0IHsgU2FvcE1lc3NhZ2VEbGcsIFNhb3BNc2dEbGdCdXR0b24gfSBmcm9tICcuLi9Db21wb25lbnRzL3Nhb3AtbWVzc2FnZS1kbGcnO1xyXG5pbXBvcnQgeyBnbG9iYWx9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFJlZ0tlWmFwRG9wdXN0aVZpZXcgZXh0ZW5kcyBTYW9wVmlld0Zvcm0ge1xyXG4gICAgY29uc3RydWN0b3Iodmlld0lkOiBzdHJpbmcsIGxpYk5hbWU6IHN0cmluZyA9IFwiXCIpIHtcclxuICAgICAgICBzdXBlcih2aWV3SWQsIGxpYk5hbWUpO1xyXG4gICAgICAgIHRoaXMuc2V0RGljdGlvbmFyeSgpOyAgICAgICAgICAgICAgICBcclxuICAgICAgICB0aGlzLnRpdGxlID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiT2Rzb3Rub3N0XCIpOyAgICAgICAgXHJcbiAgICAgICAgdGhpcy5hZGRSZWNvcmRFbmRwb2ludCA9IFwiS2VaYXBEb3B1c3RpL0NyZWF0ZUtlWmFwRG9wdXN0aVwiO1xyXG4gICAgICAgIHRoaXMuZWRpdFJlY29yZEVuZHBvaW50ID0gXCJcIjtcclxuICAgICAgICB0aGlzLmRlbGV0ZVJlY29yZEVuZHBvaW50ID0gXCJLZVphcERvcHVzdGkvRGVsZXRlS2VaYXBEb3B1c3RpXCI7XHJcbiAgICB9ICBcclxuICAgIFxyXG4gICAgc2V0RGljdGlvbmFyeSgpe1xyXG4gICAgICAgIGxldCBkaWN0aW9uYXJ5OiBzdHJpbmdbXSA9IFtcIk9kc290bm9zdFwiXHJcbiAgICAgICAgICAgICwgXCJBbGkgc3RlIHByZXByacSNYW5pLCBkYSDFvmVsaXRlIGl6YnJpc2F0aSBvZHNvdG5vc3Q/XCJcclxuICAgICAgICAgICAgLCBcIlBvdHJkaVwiXHJcbiAgICAgICAgICAgICwgXCJQb3pvciwgxaF0ZXZpbG8gZG5pIHByZWRsYWdhbmVnYSBkb3B1c3RhIGplIHZlxI1qZSBrb3QgxaF0ZXZpbG8gZG5pLCBraSBnYSBpbWF0ZSBuYSByYXpwb2xhZ28uIMW9ZWxpdGUgbmFkYWxqZXZhdGk/XCJcclxuICAgICAgICAgICAgLCBcIlBvem9yLCB2cGlzYW5vIMWhdGV2aWxvIHVyIHByZWRsYWdhbmVnYSBrb3JpxaHEjWVuamEgamUgdmXEjWplIG9kIMWhdGV2aWxhIHVyLCBraSBqaWggaW1hdGUgbmEgcmF6cG9sYWdvLiBBbGkgxb5lbGl0ZSBuYWRhbGpldmF0aT9cIl07XHJcbiAgICAgICAgdGhpcy5zZXRUZXJtaW5vbG9neUxpc3QoZGljdGlvbmFyeSk7XHJcbiAgICB9ICAgICBcclxuXHJcbiAgICBwdWJsaWMgYWZ0ZXJTdWJtaXRTdWNjZXNzKHJlc3VsdDogU2FvcFdmU3VibWl0UmVzdWx0KTogdm9pZCB7XHJcbiAgICAgICAgbGV0IHByaWthemlPcG96b3JpbG9TdHIgPSByZXN1bHQuYWxlcnRNZXNzYWdlLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgbGV0IHByaWthemlPcG96b3JpbG8gPSBwcmlrYXppT3Bvem9yaWxvU3RyID09IFwiI1ByZWtvcmFjaXRldk9kc290bm9zdGlPcG96b3JpbG9cIiA/IHRydWUgOiBmYWxzZTtcclxuXHJcbiAgICAgICAgbGV0IG9wb3pvcmlsb1N0ciA9ICQoXCIjUHJla29yYWNpdGV2T2Rzb3Rub3N0aU9wb3pvcmlsb1wiKS52YWwoKTsvLyBuZSBvYnN0YWphIHYgcHJpbWVydSBrbyBzZSBkb3B1c3QgZG9kYSBpbiBuaXNvIG5hc3RhdmxqZW5lIHBvdHJlYm5lIG5hc3Rhdml0dmUgemEgYXZ0b21hdHNrbyBwb3RyamV2YW5qZVxyXG4gICAgICAgIGlmIChvcG96b3JpbG9TdHIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBsZXQgb3Bvem9yaWxvID0gb3Bvem9yaWxvU3RyID09PSBcIlwiID8gZmFsc2UgOiB0cnVlO1xyXG5cclxuICAgICAgICAgICAgaWYgKG9wb3pvcmlsbyAmJiBwcmlrYXppT3Bvem9yaWxvKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJQb3RyZGlcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgaWYgKCQoXCIjZWRpdEZvcm1WcnN0YURvcHVzdGFcIikudmFsKCkgPT0gJ1QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIlBvem9yLCDFoXRldmlsbyBkbmkgcHJlZGxhZ2FuZWdhIGRvcHVzdGEgamUgdmXEjWplIGtvdCDFoXRldmlsbyBkbmksIGtpIGdhIGltYXRlIG5hIHJhenBvbGFnby4gxb1lbGl0ZSBuYWRhbGpldmF0aT9cIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICgkKFwiI2VkaXRGb3JtVnJzdGFEb3B1c3RhXCIpLnZhbCgpID09ICdLJykge1xyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJQb3pvciwgdnBpc2FubyDFoXRldmlsbyB1ciBwcmVkbGFnYW5lZ2Ega29yacWhxI1lbmphIGplIHZlxI1qZSBvZCDFoXRldmlsYSB1ciwga2kgamloIGltYXRlIG5hIHJhenBvbGFnby4gQWxpIMW+ZWxpdGUgbmFkYWxqZXZhdGk/XCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxldCBzYW9wTWVzc2FnZURsZyA9IG5ldyBTYW9wTWVzc2FnZURsZyh7IGRhdGE6IG51bGwsIHBhcmVudDogbnVsbCB9KVxyXG4gICAgICAgICAgICAgICAgc2FvcE1lc3NhZ2VEbGcub25ZZXMgPSB0aGlzLnByb2NlZWRZZXMuYmluZCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIHNhb3BNZXNzYWdlRGxnLm9uTm8gPSB0aGlzLnByb2NlZWROby5iaW5kKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgc2FvcE1lc3NhZ2VEbGcuU2hvdyhtZXNzYWdlLCB0aXRsZSwgMSwgW1Nhb3BNc2dEbGdCdXR0b24ubWJZZXMsIFNhb3BNc2dEbGdCdXR0b24ubWJOb10pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBwcm9jZWVkWWVzKGRhdGE6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJDcmVhdGVLZVphcERvcHVzdGkuQWxlcnQucHJvY2VlZFllc1wiKTtcclxuICAgICAgICAkKFwiI1ByZWtvcmFjaXRldk9kc290bm9zdGlPcG96b3JpbG9cIikudmFsKFwiXCIpO1xyXG4gICAgICAgICQoJyNyZWdLZVphcERvcHVzdGlWaWV3JykuZmlyc3QoKS50cmlnZ2VyKFwic3VibWl0XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb2NlZWRObyhkYXRhOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiQ3JlYXRlS2VaYXBEb3B1c3RpLkFsZXJ0LnByb2NlZWROb1wiKTtcclxuICAgICAgICAkKFwiI1ByZWtvcmFjaXRldk9kc290bm9zdGlPcG96b3JpbG9cIikudmFsKFwidHJ1ZVwiKTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbiIsIu+7vy8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9AdHlwZXMvYWxlcnRpZnkvaW5kZXguZC50c1wiIC8+XHJcbmltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFNlcnZpY2VzQ29yZSB9IGZyb20gXCIuLi9Db3JlL3Nhb3Atc2VydmljZXMtY29yZVwiO1xyXG5pbXBvcnQgeyBTYW9wUmlnaHRTaWRlYmFyLFNhb3BSaWdodFNpZGViYXJWaWV3IH0gZnJvbSAnLi4vQ29tcG9uZW50cy9zYW9wLXJpZ2h0LXNpZGViYXInO1xyXG5pbXBvcnQgeyBTYW9wUmVnS2VaYXBEb3B1c3RpVmlldyB9IGZyb20gXCIuL3Nhb3AtcmVnLWtlWmFwRG9wdXN0aS12aWV3XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFJlZ0Fic2VuY2VDYWxlbmRhckV2ZW50c1ZpZXcgZXh0ZW5kcyBTYW9wUmVnS2VaYXBEb3B1c3RpVmlldyB7XHJcbiAgICBwcml2YXRlIF9zYW9wU2VydmljZXNDb3JlIDpTYW9wU2VydmljZXNDb3JlO1xyXG4gICAgcHJpdmF0ZSBfeWVhckNhcHRpb246IHN0cmluZyA9IFwieWVhckNhcHRpb25cIjtcclxuICAgIHByaXZhdGUgX2J0blByZXZpb3VzSWQ6IHN0cmluZyA9IFwiYnRuWWVhclByZXZpb3VzXCI7XHJcbiAgICBwcml2YXRlIF9idG5OZXh0SWQ6IHN0cmluZyA9IFwiYnRuWWVhck5leHRcIjtcclxuICAgIHByaXZhdGUgX2FkZEtFWmFwRG9wdXN0aUlkOiBzdHJpbmcgPSBcImFkZEtFWmFwRG9wdXN0aVZub3NcIjtcclxuXHJcbiAgICBwdWJsaWMgcmlnaHRTaWRlYmFyOiBTYW9wUmlnaHRTaWRlYmFyO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHZpZXdJZDogc3RyaW5nLCBsaWJOYW1lOiBzdHJpbmcgPSBcIlwiKSB7XHJcbiAgICAgICAgc3VwZXIodmlld0lkLCBsaWJOYW1lKTtcclxuICAgICAgICB0aGlzLnJlZnJlc2hEYXRhID0gdGhpcy5yZWZyZXNoQWxsRGF0YS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdFZpZXcoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdBYnNlbmNlQ2FsZW5kYXJFdmVudHNWaWV3LmluaXRWaWV3XCIpO1xyXG4gICAgICAgIHRoaXMuaW5pdFJpZ2h0U2lkZWJhcigpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRSaWdodFNpZGViYXIoKSB7XHJcbiAgICAgICAgdGhpcy5yaWdodFNpZGViYXIgPSBuZXcgU2FvcFJpZ2h0U2lkZWJhcigpO1xyXG4gICAgICAgIHRoaXMucmlnaHRTaWRlYmFyLmJpbmRDYXJvdXNlbERpdihcIiNyaWdodC1zaWRlYmFyLWNhbGVuZGFyXCIsIFNhb3BSaWdodFNpZGViYXJWaWV3LkFic2VuY2VDYWxlbmRhcik7XHJcbiAgICAgICAgdGhpcy5yaWdodFNpZGViYXIucmVmcmVzaE9kc290bm9zdGlTdW1tYXJ5KFwiI2RvcHVzdFphS29yaXNjZW5qZUNhbGVuZGFyU3VtbWFyeVwiLCBcIiN1cmVaYUtvcmlzY2VuamVDYWxlbmRhclN1bW1hcnlcIik7XHJcbiAgICB9XHJcblxyXG4gICAgYmluZEdyaWRFdmVudHMoKXtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0Fic2VuY2VDYWxlbmRhckV2ZW50c1ZpZXcuYmluZEdyaWRFdmVudHNcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgJChcIiNcIiArIHRoaXMuX2J0blByZXZpb3VzSWQpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICQoXCIjXCIgKyB0aGlzLl9idG5QcmV2aW91c0lkKS5jbGljayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnQWJzZW5jZUNhbGVuZGFyRXZlbnRzVmlldy5idG5QcmV2aW91cy5jbGlja1wiKTtcclxuICAgICAgICAgICAgbGV0IGxldG8gPSBfdGhpcy5nZXRDdXJyZW50Q2FsZW5kYXJZZWFyKCkgLSAxO1xyXG4gICAgICAgICAgICBfdGhpcy5yZWZyZXNoQ2FsZW5kYXJBbGxNb250aHNEYXRhKGxldG8pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkKFwiI1wiICsgdGhpcy5fYnRuTmV4dElkKS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAkKFwiI1wiICsgdGhpcy5fYnRuTmV4dElkKS5jbGljayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnQWJzZW5jZUNhbGVuZGFyRXZlbnRzVmlldy5idG5OZXh0LmNsaWNrXCIpO1xyXG4gICAgICAgICAgICBsZXQgbGV0byA9IF90aGlzLmdldEN1cnJlbnRDYWxlbmRhclllYXIoKSArIDE7XHJcbiAgICAgICAgICAgIF90aGlzLnJlZnJlc2hDYWxlbmRhckFsbE1vbnRoc0RhdGEobGV0byk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQoXCIjXCIgKyB0aGlzLl9hZGRLRVphcERvcHVzdGlJZCkub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgJChcIiNcIiArIHRoaXMuX2FkZEtFWmFwRG9wdXN0aUlkKS5vbignY2xpY2snLCBmdW5jdGlvbihyb3cpe1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0Fic2VuY2VDYWxlbmRhckV2ZW50c1ZpZXcuYWRkS0VaYXBEb3B1c3RpVm5vcy5jbGlja1wiKTtcclxuICAgICAgICAgICAgX3RoaXMuYWRkUmVjb3JkKHt9KTtcclxuICAgICAgICB9KTsgICAgICAgICAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaEFsbERhdGEodHJpZ2dlcjogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0Fic2VuY2VDYWxlbmRhckV2ZW50c1ZpZXcucmVmcmVzaEFsbERhdGFcIik7XHJcbiAgICAgICAgbGV0IGxldG8gPSB0aGlzLmdldEN1cnJlbnRDYWxlbmRhclllYXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWZyZXNoQ2FsZW5kYXJBbGxNb250aHNEYXRhKGxldG8pO1xyXG4gICAgICAgIHRoaXMuaW5pdFJpZ2h0U2lkZWJhcigpO1xyXG5cclxuICAgICAgICBpZiAodHJpZ2dlciAmJiB0aGlzLmFmdGVyUmVmcmVzaEFsbERhdGEgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLmFmdGVyUmVmcmVzaEFsbERhdGEoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaENhbGVuZGFyQWxsTW9udGhzRGF0YShsZXRvOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0Fic2VuY2VDYWxlbmRhckV2ZW50c1ZpZXcucmVmcmVzaENhbGVuZGFyQWxsTW9udGhzRGF0YVwiKTtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uKHJlc3BvbnNlKXtcclxuICAgICAgICAgICAgJChcIiNyZWdBYnNlbmNlQ2FsZW5kYXJcIikuaHRtbChyZXNwb25zZSk7XHJcbiAgICAgICAgICAgIF90aGlzLmJpbmRHcmlkRXZlbnRzKCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246XCJSRUdBYnNlbmNlL015QWJzZW5jZXNZZWFyQ2FsZW5kYXJQYXJ0aWFsXCJcclxuICAgICAgICAgICAgLHR5cGU6IFwiR0VUXCJcclxuICAgICAgICAgICAgLGRhdGE6IHsgbGV0bzogbGV0byB9XHJcbiAgICAgICAgICAgICxzcGlubmVyRGl2SWQ6XCIjc2FvcExvYWRpbmdcIlxyXG4gICAgICAgIH0pOyAgICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIC8vcmVmcmVzaFJpZ2h0U2lkZWJhckRhdGEoKTogdm9pZCB7XHJcbiAgICAvLyAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0Fic2VuY2VDYWxlbmRhckV2ZW50c1ZpZXcucmVmcmVzaFJpZ2h0U2lkZWJhckRhdGFcIik7XHJcbiAgICAvLyAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIC8vICAgIGxldCBfc2FvcFJpZ2h0U2lkZWJhckRvcHVzdDogU2FvcFJpZ2h0U2lkZWJhciA9IG5ldyBTYW9wUmlnaHRTaWRlYmFyKCk7XHJcbiAgICAvLyAgICBfc2FvcFJpZ2h0U2lkZWJhckRvcHVzdC5yZWZyZXNoRG9wdXN0WmFLb3Jpc2NlbmplU3VtbWFyeShcIiNteUFic2VuY2VDYWxlbmRhckRvcHVzdFphS29yaXNjZW5qZVN1bW1hcnlcIiwgXCJzYW9wTG9hZGluZ1NpZGViYXJyTXlBYnNlbmNlc0NhbGVuZGFyXCIpO1xyXG5cclxuICAgIC8vICAgIGxldCBfc2FvcFJpZ2h0U2lkZWJhclVyZTogU2FvcFJpZ2h0U2lkZWJhciA9IG5ldyBTYW9wUmlnaHRTaWRlYmFyKCk7XHJcbiAgICAvLyAgICBfc2FvcFJpZ2h0U2lkZWJhclVyZS5yZWZyZXNoVXJlWmFLb3Jpc2NlbmplU3VtbWFyeShcIiNteUFic2VuY2VDYWxlbmRhclVyZVphS29yaXNjZW5qZVN1bW1hcnlcIiwgXCJzYW9wTG9hZGluZ1NpZGViYXJyTXlBYnNlbmNlc0NhbGVuZGFyXCIpO1xyXG4gICAgLy99XHJcblxyXG4gICAgYWZ0ZXJSZWZyZXNoQWxsRGF0YSgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0Fic2VuY2VDYWxlbmRhckV2ZW50c1ZpZXcuYWZ0ZXJSZWZyZXNoQWxsRGF0YVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDdXJyZW50Q2FsZW5kYXJZZWFyKCk6IG51bWJlciB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdBYnNlbmNlQ2FsZW5kYXJFdmVudHNWaWV3LmdldEN1cnJlbnRDYWxlbmRhclllYXJcIik7XHJcbiAgICAgICAgcmV0dXJuICQoXCIjXCIgKyB0aGlzLl95ZWFyQ2FwdGlvbikuZGF0YShcInllYXJcIik7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG4iLCLvu78vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL2FsZXJ0aWZ5L2luZGV4LmQudHNcIiAvPlxyXG5pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BTZXJ2aWNlc0NvcmUgfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXNlcnZpY2VzLWNvcmVcIjtcclxuaW1wb3J0IHsgU2FvcFJpZ2h0U2lkZWJhcixTYW9wUmlnaHRTaWRlYmFyVmlldyB9IGZyb20gJy4uL0NvbXBvbmVudHMvc2FvcC1yaWdodC1zaWRlYmFyJztcclxuaW1wb3J0IHsgU2FvcFJlZ0tlWmFwRG9wdXN0aVZpZXcgfSBmcm9tIFwiLi9zYW9wLXJlZy1rZVphcERvcHVzdGktdmlld1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BSZWdBYnNlbmNlRXZlbnRzVmlldyBleHRlbmRzIFNhb3BSZWdLZVphcERvcHVzdGlWaWV3IHtcclxuICAgIHByaXZhdGUgX3Nhb3BTZXJ2aWNlc0NvcmU6IFNhb3BTZXJ2aWNlc0NvcmU7XHJcblxyXG4gICAgcHVibGljIHJpZ2h0U2lkZWJhcjogU2FvcFJpZ2h0U2lkZWJhcjtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih2aWV3SWQ6IHN0cmluZywgbGliTmFtZTogc3RyaW5nID0gXCJcIikge1xyXG4gICAgICAgIHN1cGVyKHZpZXdJZCwgbGliTmFtZSk7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoRGF0YSA9IHRoaXMucmVmcmVzaEFsbERhdGEuYmluZCh0aGlzKTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRWaWV3KCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnQWJzZW5jZUV2ZW50c1ZpZXcuaW5pdFZpZXdcIik7XHJcbiAgICAgICAgdGhpcy5pbml0UmlnaHRTaWRlYmFyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdFJpZ2h0U2lkZWJhcigpIHtcclxuICAgICAgICB0aGlzLnJpZ2h0U2lkZWJhciA9IG5ldyBTYW9wUmlnaHRTaWRlYmFyKCk7XHJcbiAgICAgICAgdGhpcy5yaWdodFNpZGViYXIuYmluZENhcm91c2VsRGl2KFwiI3JpZ2h0LXNpZGViYXItZG9wdXN0XCIsIFNhb3BSaWdodFNpZGViYXJWaWV3LkFic2VuY2UpO1xyXG4gICAgICAgIHRoaXMucmlnaHRTaWRlYmFyLnJlZnJlc2hPZHNvdG5vc3RpU3VtbWFyeShcIiNkb3B1c3RaYUtvcmlzY2VuamVTdW1tYXJ5XCIsIFwiI3VyZVphS29yaXNjZW5qZVN1bW1hcnlcIik7XHJcbiAgICB9XHJcblxyXG4gICAgYmluZEdyaWRFdmVudHMoKXtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0Fic2VuY2VFdmVudHNWaWV3LmJpbmRHcmlkRXZlbnRzXCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgLy9cclxuICAgICAgICAkKFwiI2FkZEtFWmFwRG9wdXN0aVwiKS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAkKFwiI2FkZEtFWmFwRG9wdXN0aVwiKS5vbignY2xpY2snLCBmdW5jdGlvbihyb3cpe1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0Fic2VuY2VFdmVudHNWaWV3LmFkZEtFWmFwRG9wdXN0aS5jbGlja1wiKTtcclxuICAgICAgICAgICAgX3RoaXMuYWRkUmVjb3JkKHt9KTtcclxuICAgICAgICB9KTsgICAgICAgICBcclxuICAgICAgICAvL1xyXG4gICAgICAgICQoXCIuZGVsZXRlS0VaYXBEb3B1c3RpXCIpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICQoXCIuZGVsZXRlS0VaYXBEb3B1c3RpXCIpLm9uKCdjbGljaycsIGZ1bmN0aW9uKHJvdyl7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnQWJzZW5jZUV2ZW50c1ZpZXcuZGVsZXRlS0VaYXBEb3B1c3RpLmNsaWNrXCIpO1xyXG4gICAgICAgICAgICBsZXQgbGV0byA9IHJvdy50YXJnZXQuZ2V0QXR0cmlidXRlKFwiZGF0YS1sZXRvXCIpO1xyXG4gICAgICAgICAgICBsZXQgemFwb3JlZG5hc3Rldmlsa2EgPSByb3cudGFyZ2V0LmdldEF0dHJpYnV0ZShcImRhdGEtemFwb3JlZG5hc3Rldmlsa2FcIik7XHJcbiAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgIGxldCBkZWxldGVNb2RhbEZvcm1UaXRsZSA9IF90aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJCcmlzYW5qZVwiKTtcclxuICAgICAgICAgICAgbGV0IGRlbGV0ZU1vZGFsRm9ybUJvZHkgPSBfdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiQWxpIHN0ZSBwcmVwcmnEjWFuaSwgZGEgxb5lbGl0ZSBpemJyaXNhdGkgb2Rzb3Rub3N0P1wiKTtcclxuICAgICAgICAgICAgX3RoaXMuZGVsZXRlUmVjb3JkKGRlbGV0ZU1vZGFsRm9ybVRpdGxlLGRlbGV0ZU1vZGFsRm9ybUJvZHkseyBsZXRvOiBsZXRvLCB6YXBvcmVkbmFTdGV2aWxrYTogemFwb3JlZG5hc3Rldmlsa2EgfSk7XHJcbiAgICAgICAgfSk7ICAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaEFsbERhdGEodHJpZ2dlcjogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0Fic2VuY2VFdmVudHNWaWV3LnJlZnJlc2hBbGxEYXRhXCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24ocmVzcG9uc2Upe1xyXG4gICAgICAgICAgICAkKFwiI3JlZ0Fic2VuY2VGb3JtXCIpLmh0bWwocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICBfdGhpcy5iaW5kR3JpZEV2ZW50cygpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOlwiUkVHQWJzZW5jZS9NeUFic2VuY2VzUGFydGlhbFwiXHJcbiAgICAgICAgICAgICx0eXBlOlwiR0VUXCJcclxuICAgICAgICAgICAgLHNwaW5uZXJEaXZJZDpcIiNzYW9wTG9hZGluZ1wiXHJcbiAgICAgICAgfSk7IFxyXG5cclxuICAgICAgICB0aGlzLmluaXRSaWdodFNpZGViYXIoKTtcclxuXHJcbiAgICAgICAgaWYgKHRyaWdnZXIgJiYgdGhpcy5hZnRlclJlZnJlc2hBbGxEYXRhICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5hZnRlclJlZnJlc2hBbGxEYXRhKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFmdGVyUmVmcmVzaEFsbERhdGEoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdBYnNlbmNlQ2FsZW5kYXJFdmVudHNWaWV3LmFmdGVyUmVmcmVzaEFsbERhdGFcIik7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG4iLCLvu78vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL2FsZXJ0aWZ5L2luZGV4LmQudHNcIiAvPlxyXG5pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BSZWdBYnNlbmNlRXZlbnRzVmlldyB9IGZyb20gXCIuL3Nhb3AtcmVnQWJzZW5jZUV2ZW50cy12aWV3XCI7XHJcbmltcG9ydCB7IFNhb3BSZWdBYnNlbmNlQ2FsZW5kYXJFdmVudHNWaWV3IH0gZnJvbSBcIi4vc2FvcC1yZWdBYnNlbmNlQ2FsZW5kYXJFdmVudHMtdmlld1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BSZWdBYnNlbmNlTWFpblZpZXcge1xyXG4gICAgcHVibGljIHJlZ0Fic2VuY2VFdmVudHNWaWV3OiBTYW9wUmVnQWJzZW5jZUV2ZW50c1ZpZXc7XHJcbiAgICBwdWJsaWMgcmVnQWJzZW5jZUNhbGVuZGFyRXZlbnRzVmlldzogU2FvcFJlZ0Fic2VuY2VDYWxlbmRhckV2ZW50c1ZpZXc7XHJcblxyXG4gICAgY29uc3RydWN0b3IobGliTmFtZTogc3RyaW5nID0gXCJcIikge1xyXG4gICAgICAgIHRoaXMucmVnQWJzZW5jZUV2ZW50c1ZpZXcgPSBuZXcgU2FvcFJlZ0Fic2VuY2VFdmVudHNWaWV3KFwiI3JlZ0tlWmFwRG9wdXN0aVZpZXcwXCIsIGxpYk5hbWUgKyBcIi5yZWdBYnNlbmNlRXZlbnRzVmlld1wiKTtcclxuICAgICAgICB0aGlzLnJlZ0Fic2VuY2VFdmVudHNWaWV3LmFmdGVyUmVmcmVzaEFsbERhdGEgPSB0aGlzLmFmdGVyUmVmcmVzaEV2ZW50c0RhdGEuYmluZCh0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWdBYnNlbmNlQ2FsZW5kYXJFdmVudHNWaWV3ID0gbmV3IFNhb3BSZWdBYnNlbmNlQ2FsZW5kYXJFdmVudHNWaWV3KFwiI3JlZ0tlWmFwRG9wdXN0aVZpZXcwXCIsIGxpYk5hbWUgKyBcIi5yZWdBYnNlbmNlQ2FsZW5kYXJFdmVudHNWaWV3XCIpO1xyXG4gICAgICAgIHRoaXMucmVnQWJzZW5jZUNhbGVuZGFyRXZlbnRzVmlldy5hZnRlclJlZnJlc2hBbGxEYXRhID0gdGhpcy5hZnRlclJlZnJlc2hDYWxlbmRhckRhdGEuYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0VmlldygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0Fic2VuY2VNYWluVmlldy5pbml0Vmlld1wiKTtcclxuICAgICAgICAkKFwiI3NpdGUtbWFpblwiKS5hZGRDbGFzcyhcInNpdGUtbWFpbi13aXRoLWZvcm1TaWRlYmFyclwiKTtcclxuICAgICAgICB0aGlzLnJlZ0Fic2VuY2VFdmVudHNWaWV3LnJlZnJlc2hBbGxEYXRhKGZhbHNlKTtcclxuICAgICAgICB0aGlzLnJlZ0Fic2VuY2VDYWxlbmRhckV2ZW50c1ZpZXcucmVmcmVzaEFsbERhdGEoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGFmdGVyUmVmcmVzaEV2ZW50c0RhdGEoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdBYnNlbmNlTWFpblZpZXcuYWZ0ZXJSZWZyZXNoRXZlbnRzRGF0YVwiKTtcclxuICAgICAgICAvLyBwbyByZWZyZXN1IFwiYWJzZW5jZSBldmVudHMgdGFiXCIgcG90cmVibm8gdHVkaSByZWZyZXNoIFwiY2FsZW5kYXIgdGFiXCJcclxuICAgICAgICB0aGlzLnJlZ0Fic2VuY2VDYWxlbmRhckV2ZW50c1ZpZXcucmVmcmVzaEFsbERhdGEoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGFmdGVyUmVmcmVzaENhbGVuZGFyRGF0YSgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0Fic2VuY2VNYWluVmlldy5hZnRlclJlZnJlc2hDYWxlbmRhckRhdGFcIik7XHJcbiAgICAgICAgLy8gcG8gcmVmcmVzdSBcImNhbGVuZGFyIHRhYlwiIHBvdHJlYm5vIHR1ZGkgcmVmcmVzaCBcImFic2VuY2UgZXZlbnRzIHRhYlwiXHJcbiAgICAgICAgdGhpcy5yZWdBYnNlbmNlRXZlbnRzVmlldy5yZWZyZXNoQWxsRGF0YShmYWxzZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BSaWdodFNpZGViYXIsU2FvcFJpZ2h0U2lkZWJhclZpZXcgfSBmcm9tICcuLi9Db21wb25lbnRzL3Nhb3AtcmlnaHQtc2lkZWJhcic7XHJcbmltcG9ydCB7IE9iZG9iamVmaWx0ZXJWYWx1ZXMgfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLXNlbGVjdC1tb250aC15ZWFyXCI7XHJcbmltcG9ydCB7IFNhb3BSZWdUb2RheUV2ZW50c1ZpZXcgfSBmcm9tIFwiLi9zYW9wLXJlZ1RvZGF5RXZlbnRzLXZpZXdcIlxyXG5pbXBvcnQgeyBTYW9wUmVnVmlldyB9IGZyb20gXCIuL3Nhb3AtcmVnVXJhLXZpZXdcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wUmVnQXR0ZW5kYW5jZVZpZXcge1xyXG4gICAgcHVibGljIHJlZ1RvZGF5RXZlbnRzVmlldzpTYW9wUmVnVG9kYXlFdmVudHNWaWV3O1xyXG4gICAgcHVibGljIHJlZ1VyYVZpZXc6U2FvcFJlZ1ZpZXc7XHJcbiAgICBwdWJsaWMgcmlnaHRTaWRlYmFyOiBTYW9wUmlnaHRTaWRlYmFyO1xyXG4gICAgcHVibGljIHJpZ2h0U2lkZWJhcks6IFNhb3BSaWdodFNpZGViYXI7XHJcbiAgICBwdWJsaWMgcmlnaHRNb250aFNpZGViYXI6IFNhb3BSaWdodFNpZGViYXI7XHJcbiAgICBwdWJsaWMgcmlnaHRNb250aFNpZGViYXJLOiBTYW9wUmlnaHRTaWRlYmFyO1xyXG4gICAgLy9cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihsaWJOYW1lOiBzdHJpbmcgPSBcIlwiKSB7XHJcbiAgICAgICAgdGhpcy5yZWdUb2RheUV2ZW50c1ZpZXcgPSBuZXcgU2FvcFJlZ1RvZGF5RXZlbnRzVmlldyhcIiNyZWdEb2dvZGVrVmlldzBcIixsaWJOYW1lK1wiLnJlZ1RvZGF5RXZlbnRzVmlld1wiKTtcclxuICAgICAgICB0aGlzLnJlZ1VyYVZpZXcgPSBuZXcgU2FvcFJlZ1ZpZXcobGliTmFtZStcIi5yZWdVcmFWaWV3XCIpO1xyXG4gICAgICAgIHRoaXMucmlnaHRTaWRlYmFyID0gbmV3IFNhb3BSaWdodFNpZGViYXIoKTtcclxuICAgICAgICB0aGlzLnJpZ2h0U2lkZWJhcksgPSBuZXcgIFNhb3BSaWdodFNpZGViYXIoKTtcclxuICAgICAgICB0aGlzLnJpZ2h0TW9udGhTaWRlYmFyID0gbmV3IFNhb3BSaWdodFNpZGViYXIoKTtcclxuICAgICAgICB0aGlzLnJpZ2h0TW9udGhTaWRlYmFySyA9IG5ldyBTYW9wUmlnaHRTaWRlYmFyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25Jbml0VmlldygpOnZvaWR7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIm9uSW5pdFZpZXdcIik7XHJcbiAgICAgICAgdGhpcy5yZWdUb2RheUV2ZW50c1ZpZXcuaW5pdFZpZXcoKTtcclxuICAgICAgICB0aGlzLnJlZ1VyYVZpZXcuaW5pdFZpZXcoKTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIGxldCBvYmRvYmplZmlsdGVyVmFsdWVzOiBPYmRvYmplZmlsdGVyVmFsdWVzID0gbmV3IE9iZG9iamVmaWx0ZXJWYWx1ZXMoKTtcclxuXHJcbiAgICAgICAgdGhpcy5yaWdodFNpZGViYXIuYmluZENhcm91c2VsRGl2KFwiI3JpZ2h0LXNpZGViYXItZGF5XCIsIFNhb3BSaWdodFNpZGViYXJWaWV3LkF0dGVuZGFuY2VEYXkpO1xyXG4gICAgICAgIHRoaXMucmlnaHRNb250aFNpZGViYXIuYmluZENhcm91c2VsRGl2KFwiI3JpZ2h0LXNpZGViYXItbW9udGhcIiwgU2FvcFJpZ2h0U2lkZWJhclZpZXcuQXR0ZW5kYW5jZU1vbnRoKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWZyZXNoUmlnaHRTaWRlYmFyRGF0YShmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5yZWdUb2RheUV2ZW50c1ZpZXcuYWZ0ZXJSZWZyZXNoRGF0YSA9IHRoaXMuYWZ0ZXJSZWZyZXNoTW9udGhEYXRhLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5yZWdVcmFWaWV3LmFmdGVyUmVmcmVzaERhdGEgPSB0aGlzLmFmdGVyUmVmcmVzaFRvZGF5RGF0YS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMucmVnVXJhVmlldy5vbkNsb3NlVmlldyA9IHRoaXMub25DbG9zZVJlZ1VyYURhblZpZXcuYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBhZnRlclJlZnJlc2hUb2RheURhdGEoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImFmdGVyUmVmcmVzaFRvZGF5RGF0YVwiKTtcclxuICAgICAgICAvLyByZWZyZXNoIFwiRXZpZGVuY2EgcHJpc290bm9zdGkgLSBkYW5hc25qaSBkYW5cIlxyXG4gICAgICAgIHRoaXMucmVnVG9kYXlFdmVudHNWaWV3LnJlZnJlc2hMaXN0RGF0YShmYWxzZSk7XHJcbiAgICAgICAgLy9yZWZyZXNoIHJpZ2h0IHNpZGViYXJcclxuICAgICAgICB0aGlzLnJlZnJlc2hSaWdodFNpZGViYXJEYXRhKHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGFmdGVyUmVmcmVzaE1vbnRoRGF0YSgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiYWZ0ZXJSZWZyZXNoTW9udGhEYXRhXCIpO1xyXG4gICAgICAgIHRoaXMucmVnVXJhVmlldy5yZWZyZXNoUmVnVXJhQnJvd3NlVmlldyhmYWxzZSk7XHJcbiAgICAgICAgLy8gcmVmcmVzaCBcIkV2aWRlbmNhIHByaXNvdG5vc3RpIC0gbWVzZWNuYSBldmlkZW5jYVwiXHJcbiAgICAgICAgdGhpcy5yZWZyZXNoUmlnaHRTaWRlYmFyRGF0YSh0cnVlKTtcclxuICAgIH0gICAgXHJcblxyXG4gICAgcmVmcmVzaFJpZ2h0U2lkZWJhckRhdGEobW9udGhSZWZyZXNoOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IG9iZG9iamVmaWx0ZXJWYWx1ZXM6IE9iZG9iamVmaWx0ZXJWYWx1ZXMgPSBuZXcgT2Jkb2JqZWZpbHRlclZhbHVlcygpO1xyXG5cclxuICAgICAgICAvL3JlZnJlc2ggcmlnaHQgc2lkZWJhclxyXG4gICAgICAgIHRoaXMucmlnaHRTaWRlYmFyLnJlZnJlc2hSZWdVcmFEb2dvZGtpU3VtbWFyeShcIiNyZWdVcmFEb2dvZGtpVXJlU3VtbWFyeVwiLCBvYmRvYmplZmlsdGVyVmFsdWVzLCBcIiNzYW9wTG9hZGluZ1NpZGViYXJyXCIpO1xyXG4gICAgICAgIHRoaXMucmlnaHRTaWRlYmFySy5yZWZyZXNoVXJlWmFLb3Jpc2NlbmplU3VtbWFyeShcIiNyZWdVcmFEb2dvZGtpS29yaXNjZW5qZVN1bW1hcnlcIiwgXCIjc2FvcExvYWRpbmdTaWRlYmFyclwiKTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIGlmIChtb250aFJlZnJlc2gpIHtcclxuICAgICAgICAgICAgb2Jkb2JqZWZpbHRlclZhbHVlcyA9IHRoaXMucmVnVXJhVmlldy5fc2FvcFNlbGVjdE1vbnRoWWVhci5nZXRTZWxlY3RlZE1vbnRoWWVhcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJpZ2h0TW9udGhTaWRlYmFyLnJlZnJlc2hSZWdVcmFEb2dvZGtpU3VtbWFyeShcIiNyZWdVcmFNb250aEV2ZW50c1VyZVN1bW1hcnlcIiwgb2Jkb2JqZWZpbHRlclZhbHVlcywgXCIjc2FvcExvYWRpbmdSZWdVcmFNb250aEV2ZW50c1NpZGViYXJyXCIpO1xyXG4gICAgICAgIHRoaXMucmlnaHRNb250aFNpZGViYXJLLnJlZnJlc2hVcmVaYUtvcmlzY2VuamVTdW1tYXJ5KFwiI3JlZ1VyYU1vbnRoRXZlbnRzS29yaXNjZW5qZVN1bW1hcnlcIiwgXCIjc2FvcExvYWRpbmdSZWdVcmFNb250aEV2ZW50c1NpZGViYXJyXCIpO1xyXG4gICAgICAgIC8vICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hBbGxEYXRhKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJyZWZyZXNoQWxsRGF0YVwiKTtcclxuICAgICAgICAvLyByZWZyZXNoIFwiRXZpZGVuY2EgcHJpc290bm9zdGkgLSBkYW5hc25qaSBkYW5cIlxyXG4gICAgICAgIHRoaXMucmVnVG9kYXlFdmVudHNWaWV3LnJlZnJlc2hMaXN0RGF0YShmYWxzZSk7XHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLnJlZ1VyYVZpZXcucmVmcmVzaFJlZ1VyYUJyb3dzZVZpZXcoZmFsc2UpO1xyXG4gICAgICAgIC8vcmVmcmVzaCByaWdodCBzaWRlYmFyXHJcbiAgICAgICAgdGhpcy5yZWZyZXNoUmlnaHRTaWRlYmFyRGF0YSh0cnVlKTtcclxuICAgIH0gICAgXHJcblxyXG4gICAgb25DbG9zZVJlZ1VyYURhblZpZXcoKTp2b2lke1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnQXR0ZW5kYW5jZVZpZXcub25DbG9zZVJlZ1VyYURhblZpZXdcIik7ICAgIFxyXG4gICAgICAgIHRoaXMucmVmcmVzaEFsbERhdGEoKTtcclxuICAgIH1cclxuXHJcbiAgICAvL1xyXG59XHJcblxyXG5cclxuIiwi77u/aW1wb3J0IHsgZ2xvYmFsLCBpc0VtcHR5LCBpc1VuRGVmaW5lZCwgZmlsdGVyVGFibGVSb3dzLCBjb252ZXJ0U3RyaW5nMkRhdGUsIGZvcm1hdERhdGUgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BTZXJ2aWNlc0NvcmUgfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXNlcnZpY2VzLWNvcmVcIjtcclxuaW1wb3J0IHsgU2FvcFBvcG92ZXIgfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLXBvcG92ZXJcIjtcclxuaW1wb3J0IHsgU2FvcFJlZ1ZpZXcgfSBmcm9tIFwiLi9zYW9wLXJlZ1VyYS12aWV3XCI7XHJcbmltcG9ydCB7IFNhb3BSZWdEZXRhaWxzVGFibGVWaWV3IH0gZnJvbSBcIi4vc2FvcC1yZWdVcmEtZGV0YWlscy10YWJsZS12aWV3XCI7XHJcbmltcG9ydCB7IFNhb3BXZWJHcmlkLFNhb3BXZWJHcmlkUHJvcGVydGllcyxTYW9wV2ViR3JpZFRvb2xiYXIsU2FvcFdlYkRhdGFUYWJsZX0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC1ncmlkXCI7XHJcbmltcG9ydCB7IFNhb3BSZWdVcmFEb2dvZGVrVmlldyB9IGZyb20gXCIuLi9SRUcvc2FvcC1yZWdVcmFEb2dvZGVrLXZpZXdcIjtcclxuaW1wb3J0IHsgU2FvcFJlZ1VyYURvZ29kZWtEZWxldGVWaWV3IH0gZnJvbSBcIi4uL1JFRy9zYW9wLXJlZ1VyYURvZ29kZWtEZWxldGUtdmlld1wiO1xyXG5pbXBvcnQgeyBTYW9wV2ViR3JpZFVuaXRPcmdGaWx0ZXIgfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLWdyaWQtZmlsdGVyLVVuaXRPcmdcIjtcclxuXHJcbmNsYXNzIERhdGFBdHRyaWJ1dGVzIHtcclxuICAgIHNpZnJhWmFwb3NsZW5pOiBzdHJpbmc7XHJcbiAgICBsZXRvOiBudW1iZXI7XHJcbiAgICBtZXNlYzogbnVtYmVyO1xyXG59XHJcblxyXG5jbGFzcyBPYmRvYmplZmlsdGVyVmFsdWVzIHtcclxuICAgIGxldG86IG51bWJlcjtcclxuICAgIG1lc2VjOiBudW1iZXI7XHJcbiAgICBtZXNlY05heml2OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wUmVnQXR0ZW5kYW5jZUFsbEVtcGxveWVlc1ZpZXcge1xyXG4gICAgcHJpdmF0ZSBfbGliTmFtZTogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfcmVmcmVzaGluZ0FsbEVtcGxveWVlc1RhYmxlOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBfdGFibGVJZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfaW5wdXRIaWRkZW5EYXRhSWQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgX3NlYXJjaEFsbEZpZWxkc1ZhbHVlSWQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgX29iZG9iamVJZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfY2FsZW5kYXJJY29uSWQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgX29iZG9iamVGaWx0ZXJMZXRvSWQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgX29iZG9iamVGaWx0ZXJNZXNlY0lkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9vYmRvYmplQ3VycmVudEJ0bklkOiBzdHJpbmdcclxuICAgIHByaXZhdGUgX3Jvd0RldGFpbHNQcmVmaXhJZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfcm93RGV0YWlsc0RpdlByZWZpeElkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9hbGxFbXBsb3llZXNUYWJsZURpdklkOiBzdHJpbmc7IFxyXG4gICAgcHJpdmF0ZSBfYWxsRW1wbG95ZWVzVGFibGVSb3dzSWQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgX21hcmtDb2x1bW5Dc3M6IHN0cmluZztcclxuICAgIHByaXZhdGUgX3NlbGVjdE9yZ0ZpbHRlcjogU2FvcFdlYkdyaWRVbml0T3JnRmlsdGVyO1xyXG4gICAgcHJpdmF0ZSBfc2FvcFBvcG92ZXI6IFNhb3BQb3BvdmVyO1xyXG4gICAgcHJpdmF0ZSBfcmVnVXJhVmlldzogU2FvcFJlZ1ZpZXc7XHJcbiAgICBwcml2YXRlIHNhb3BSZWdEZXRhaWxzVGFibGVWaWV3OiBTYW9wUmVnRGV0YWlsc1RhYmxlVmlldztcclxuICAgIHByaXZhdGUgX2xhc3REYXRhVmFsdWVzOkRhdGFBdHRyaWJ1dGVzO1xyXG4gICAgcHJpdmF0ZSBfcmVnVXJhRG9nb2RlazpTYW9wUmVnVXJhRG9nb2Rla1ZpZXc7ICAgIFxyXG4gICAgcHJpdmF0ZSBfcmVnVXJhRG9nb2Rla0RlbGV0ZVZpZXc6U2FvcFJlZ1VyYURvZ29kZWtEZWxldGVWaWV3OyAgXHJcbiAgICAvL1xyXG4gICAgcHVibGljIHdlYkdyaWQxOlNhb3BXZWJHcmlkO1xyXG4gICAgLy9cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihsaWJOYW1lOiBzdHJpbmcgPSBcIlwiKSB7XHJcbiAgICAgICAgdGhpcy5fbGliTmFtZSA9IGxpYk5hbWU7XHJcbiAgICAgICAgdGhpcy5fcmVmcmVzaGluZ0FsbEVtcGxveWVlc1RhYmxlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fdGFibGVJZCA9IFwiI2F0dGVuZGFuY2VBbGxFbXBsb3llZXNUYWJsZVwiO1xyXG4gICAgICAgIHRoaXMuX2lucHV0SGlkZGVuRGF0YUlkID0gXCIjYWxsRW1wbG95ZWVzVGFibGVIaWRkZW5EYXRhXCI7XHJcbiAgICAgICAgdGhpcy5fc2VhcmNoQWxsRmllbGRzVmFsdWVJZCA9IFwiI1NlYXJjaFZhbHVlXCI7XHJcbiAgICAgICAgdGhpcy5fb2Jkb2JqZUlkID0gXCIjT2Jkb2JqZVwiO1xyXG4gICAgICAgIHRoaXMuX2NhbGVuZGFySWNvbklkID0gXCIjY2FsZW5kYXJJY29uXCI7XHJcbiAgICAgICAgdGhpcy5fb2Jkb2JqZUZpbHRlckxldG9JZCA9IFwiI2xldG9PYmRvYmplXCI7XHJcbiAgICAgICAgdGhpcy5fb2Jkb2JqZUZpbHRlck1lc2VjSWQgPSBcIiNNZXNlY1N0cmluZ1wiO1xyXG4gICAgICAgIHRoaXMuX29iZG9iamVDdXJyZW50QnRuSWQgPSBcIiNjdXJyZW50TW9udGhCdG5GaWx0ZXJcIjtcclxuICAgICAgICB0aGlzLl9yb3dEZXRhaWxzUHJlZml4SWQgPSBcIiNkZXRhaWxSb3dcIjtcclxuICAgICAgICB0aGlzLl9yb3dEZXRhaWxzRGl2UHJlZml4SWQgPSBcIiNkZXRhaWxSb3dEaXZcIjtcclxuICAgICAgICB0aGlzLl9hbGxFbXBsb3llZXNUYWJsZURpdklkID0gXCIjYXR0ZW5kYW5jZUFsbEVtcGxveWVlc1RhYmxlRGl2XCI7XHJcbiAgICAgICAgdGhpcy5fYWxsRW1wbG95ZWVzVGFibGVSb3dzSWQgPSBcIiNhdHRlbmRhbmNlQWxsRW1wbG95ZWVzVGFibGVSb3dzXCI7XHJcbiAgICAgICAgdGhpcy5fbWFya0NvbHVtbkNzcyA9IFwic2FvcC1jb2x1bW4tbWFya1wiO1xyXG5cclxuICAgICAgICB0aGlzLl9zZWxlY3RPcmdGaWx0ZXIgPSBuZXcgU2FvcFdlYkdyaWRVbml0T3JnRmlsdGVyKGxpYk5hbWUsIFwiXCIpO1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdE9yZ0ZpbHRlci5maWx0ZXJaYXBvc2xlbmlUYWJsZVJvd3MgPSB0aGlzLmZpbHRlclphcG9zbGVuaVRhYmxlUm93cy5iaW5kKHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLl9zYW9wUG9wb3ZlciA9IG5ldyBTYW9wUG9wb3ZlcigpO1xyXG4gICAgICAgIHRoaXMuX3Nhb3BQb3BvdmVyLmFmdGVyUG9wb3ZlclNob3cgPSB0aGlzLmFmdGVyUG9wb3ZlclNob3cuYmluZCh0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcmVnVXJhVmlldyA9IG5ldyBTYW9wUmVnVmlldyhsaWJOYW1lICsgXCIuX3JlZ1VyYVZpZXdcIik7XHJcbiAgICAgICAgdGhpcy5zYW9wUmVnRGV0YWlsc1RhYmxlVmlldyA9IG5ldyBTYW9wUmVnRGV0YWlsc1RhYmxlVmlldyhsaWJOYW1lICsgXCIuc2FvcFJlZ0RldGFpbHNUYWJsZVZpZXdcIiwgXCIjcmVnLWdyaWRcIik7XHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLl9yZWdVcmFWaWV3LmFmdGVyUmVmcmVzaERhdGEgPSB0aGlzLmFmdGVyUmVmcmVzaFRvZGF5RGF0YS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuX3JlZ1VyYVZpZXcub25DbG9zZVZpZXcgPSB0aGlzLm9uQ2xvc2VSZWdVcmFEYW5WaWV3LmJpbmQodGhpcyk7ICAgICAgIFxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy5fcmVnVXJhRG9nb2RlayA9IG5ldyBTYW9wUmVnVXJhRG9nb2Rla1ZpZXcoXCIjcmVnRG9nb2Rla1ZpZXcwXCIsbGliTmFtZSArIFwiLl9yZWdVcmFEb2dvZGVrXCIpO1xyXG4gICAgICAgIHRoaXMuX3JlZ1VyYURvZ29kZWsucmVmcmVzaERhdGEgPSB0aGlzLmFmdGVyQWRkRXZlbnRzU3VjY2Vzcy5iaW5kKHRoaXMpO1xyXG4gICAgICAgIC8vIFxyXG4gICAgICAgIHRoaXMuX3JlZ1VyYURvZ29kZWtEZWxldGVWaWV3ID0gbmV3IFNhb3BSZWdVcmFEb2dvZGVrRGVsZXRlVmlldyhcIiNyZWdEb2dvZGVrVmlldzBcIixsaWJOYW1lICsgXCIuX3JlZ1VyYURvZ29kZWtEZWxldGVWaWV3XCIpO1xyXG4gICAgICAgIHRoaXMuX3JlZ1VyYURvZ29kZWtEZWxldGVWaWV3LmFmdGVyRGVsZXRlU3VjY2VzcyA9IHRoaXMuYWZ0ZXJEZWxldGVFdmVudHNTdWNjZXNzLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5fcmVnVXJhRG9nb2Rla0RlbGV0ZVZpZXcuYWZ0ZXJWYWxpZGF0aW9uRXJyb3IgPSB0aGlzLm9uRGVsZXRlVmFsaWRhdGlvbkVycm9yLmJpbmQodGhpcyk7XHJcbiAgICAgICAgXHJcbiAgICB9XHJcblxyXG5cclxuICAgIG9uSW5pdFZpZXcoKTp2b2lke1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnQXR0ZW5kYW5jZUFsbEVtcGxveWVlc1ZpZXcub25Jbml0Vmlld1wiKTtcclxuICAgICAgICB0aGlzLnJlZnJlc2hBbGxEYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdFdlYkdyaWQxKCl7XHJcbiAgICAgICAgbGV0IHdnSWQgPSBcIiNhdHRlbmRhbmNlQWxsRW1wbG95ZWVzVGFibGVcIjtcclxuICAgICAgICBsZXQgY2FwdGlvblRvb2xiYXIgPSAkKHdnSWQpLmF0dHIoXCJjYXB0aW9uLXRvb2xiYXJcIik7XHJcbiAgICAgICAgLy9sZXQgY2FwdGlvbkFkZEJ1dHRvbiA9ICQod2dJZCkuYXR0cihcImNhcHRpb24tYWRkQnV0dG9uXCIpOyBcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMud2ViR3JpZDEgPSBuZXcgU2FvcFdlYkdyaWQodGhpcy5fbGliTmFtZStcIi53ZWJHcmlkMVwiKTtcclxuICAgICAgICBsZXQgZ3JpZFByb3BlcnRpZXM6IFNhb3BXZWJHcmlkUHJvcGVydGllcztcclxuICAgICAgICBsZXQgZ3JpZFRvb2xiYXI6U2FvcFdlYkdyaWRUb29sYmFyO1xyXG4gICAgICAgIC8vbGV0IHRvb2xiYXJCdXR0b25zOlNhb3BXZWJHcmlkVG9vbGJhckJ1dHRvbltdID0gW107XHJcbiAgICAgICAgbGV0IGRhdGFUYWJsZTpTYW9wV2ViRGF0YVRhYmxlO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgLy90b29sYmFyQnV0dG9ucy5wdXNoKHtpZDpcImFkZFRvXCIsY2FwdGlvbjpjYXB0aW9uQWRkQnV0dG9uLG9uQ2xpY2tFdmVudDp0aGlzLmxpYk5hbWUrXCIuYWRkUmVjb3JkKCk7XCJ9KTsgICAgICAgIFxyXG4gICAgICAgIC8vZ3JpZFRvb2xiYXIgPSB7aWQ6XCJzYW9wV2ViR3JpZFRCMVwiLGNhcHRpb246Y2FwdGlvblRvb2xiYXIsYnV0dG9uczp0b29sYmFyQnV0dG9uc307XHJcbiAgICAgICBcclxuICAgICAgICBkYXRhVGFibGUgPSB7ZW5hYmxlZDp0cnVlfTtcclxuICAgIFxyXG4gICAgICAgIGdyaWRQcm9wZXJ0aWVzID0ge1xyXG4gICAgICAgICAgICBncmlkSWQ6d2dJZFxyXG4gICAgICAgICAgICAvLyx0b29sYmFyOmdyaWRUb29sYmFyXHJcbiAgICAgICAgICAgICxkYXRhVGFibGU6ZGF0YVRhYmxlXHJcbiAgICAgICAgICB9OyAgICAgICAgXHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLndlYkdyaWQxLmluaXQoZ3JpZFByb3BlcnRpZXMpOyAgIFxyXG4gICAgICAgICAgXHJcbiAgICAgIH1cclxuXHJcbiAgICByZWZyZXNoQWxsRGF0YSgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNWaWV3LnJlZnJlc2hBbGxEYXRhXCIpO1xyXG5cclxuICAgICAgICB0aGlzLnJlZnJlc2hBbGxFbXBsb3llZXNEYXRhKCk7XHJcbiAgICB9ICBcclxuXHJcbiAgICByZWZyZXNoQWxsRW1wbG95ZWVzRGF0YShwYXJhbXM6IGFueSA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNWaWV3LnJlZnJlc2hBbGxFbXBsb3llZXNEYXRhXCIpO1xyXG4gICAgICAgXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcblxyXG4gICAgICAgIHNhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICQoXCIjYXR0ZW5kYW5jZUFsbEVtcGxveWVlc0Zvcm1cIikuaHRtbChyZXNwb25zZSk7XHJcbiAgICAgICAgICAgIF90aGlzLmluaXRGaWx0ZXJDb250cm9scygpO1xyXG4gICAgICAgICAgICBfdGhpcy5iaW5kR3JpZEV2ZW50cygpO1xyXG4gICAgICAgICAgICBfdGhpcy5zZXRFdmVudEJpbmRpbmdzKCk7XHJcbiAgICAgICAgICAgIC8vIG5hc3RhdmltbyBwcmF6bm8gemFiZWxvIHphIHByaWtheiBtZXNlY25paCBwb2RhdGtvdlxyXG4gICAgICAgICAgICBfdGhpcy5nZXRFbXB0eUVtcGxveWVlTW9udGhEYXRhKCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246IFwiUkVHQXR0ZW5kYW5jZUFsbEVtcGxveWVlcy9HZXRBbGxFbXBsb3llZXNGb3JtXCJcclxuICAgICAgICAgICAgLCBkYXRhOiBwYXJhbXNcclxuICAgICAgICAgICAgLCB0eXBlOiBcIkdFVFwiXHJcbiAgICAgICAgICAgICwgc3Bpbm5lckRpdklkOiBcIiNhdHRlbmRhbmNlQWxsRW1wbG95ZWVzTG9hZGluZ1wiXHJcbiAgICAgICAgfSk7ICAgIFxyXG4gICAgfVxyXG5cclxuICAgIGluaXRGaWx0ZXJDb250cm9scygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNWaWV3LmluaXRGaWx0ZXJDb250cm9sc1wiKTtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMuYnV0dG9uc0JpbmRpbmcoKTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMuc2V0RXZlbnRCaW5kaW5ncygpO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy5fc2VsZWN0T3JnRmlsdGVyLmluaXRGaWx0ZXJDb250cm9scygpO1xyXG5cclxuICAgICAgICAkKHRoaXMuX3NlYXJjaEFsbEZpZWxkc1ZhbHVlSWQpLmtleXVwKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgbGV0IG9UYWJsZSA9IF90aGlzLndlYkdyaWQxLmRhdGFUYWJsZTtcclxuICAgICAgICAgICAgb1RhYmxlLnNlYXJjaCgkKHRoaXMpLnZhbCgpLnRvU3RyaW5nKCkpLmRyYXcoKSA7ICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8kKF90aGlzLndlYkdyaWQxLndlYkdyaWRJZCkuZGF0YVRhYmxlKCkuc2VhcmNoKCQodGhpcykudmFsKCkpLmRyYXcoKSA7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3Nhb3BQb3BvdmVyLmJpbmRQb3BvdmVyRXZlbnRzKCk7XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdE9iZG9iamVDb250cm9sKClcclxuICAgIH1cclxuXHJcbiAgICBmaWx0ZXJBbGxGaWVsZHMoKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGZpbHRlclZhbCA9IFN0cmluZygkKHRoaXMuX3NlYXJjaEFsbEZpZWxkc1ZhbHVlSWQpLnZhbCgpKTtcclxuICAgICAgICBmaWx0ZXJUYWJsZVJvd3MoZmlsdGVyVmFsLCB0aGlzLl90YWJsZUlkKTtcclxuICAgIH1cclxuXHJcbiAgICBjaGVja0FuZE9ubHlTaG93SGlkZURldGFpbHNUYWJsZShtYXN0ZXJSb3dJZDogc3RyaW5nLCBpc1Nob3dEZW1hbmRlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnQXR0ZW5kYW5jZUFsbEVtcGxveWVlc1ZpZXcuY2hlY2tBbmRPbmx5U2hvd0hpZGVEZXRhaWxzVGFibGVcIik7XHJcblxyXG4gICAgICAgIGxldCBzZWxlY3RlZFJvdyA9ICQoXCIjXCIgKyBtYXN0ZXJSb3dJZCk7XHJcbiAgICAgICAgbGV0IGFjdGlvbkRldGFpbHNDb2x1bW4gPSBzZWxlY3RlZFJvdy5maW5kKFwidGRcIikuZXEoMSk7XHJcbiAgICAgICAgbGV0IGRhdGFDb2x1bW4gPSBzZWxlY3RlZFJvdy5maW5kKFwidGRcIikuZXEoMCk7XHJcbiAgICAgICAgbGV0IGRhdGFWYWx1ZXMgPSB0aGlzLmdldERhdGFWYWx1ZXMoZGF0YUNvbHVtbiwgJCh0aGlzLl9vYmRvYmplSWQpKTtcclxuXHJcbiAgICAgICAgLy8gY2UgamUgZGVmaW5pcmFubywgZGEgc28gZGV0YWlscyB2aWRuaSwgcHJpa2F6aSBkZXRhaWxzIHRhYmVsb1xyXG4gICAgICAgIGxldCBpY29uRWxlbWVudCA9IGFjdGlvbkRldGFpbHNDb2x1bW4uZmluZChcInNwYW5cIik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzRGV0YWlsc1N1YlRhYmxlU2hvd2VkKGljb25FbGVtZW50KSkge1xyXG4gICAgICAgICAgICAvLyBwcmlrYXppL3NrcmlqIGRldGFpbHMgdGFiZWxvXHJcbiAgICAgICAgICAgIGxldCByb3dEZXRhaWxzSWQgPSB0aGlzLl9yb3dEZXRhaWxzUHJlZml4SWQgKyBkYXRhVmFsdWVzLnNpZnJhWmFwb3NsZW5pO1xyXG4gICAgICAgICAgICBsZXQgcm93RGV0YWlsc0lkRWxlbWVudCA9ICQocm93RGV0YWlsc0lkKTtcclxuICAgICAgICAgICAgbGV0IGFkZENsYXNzID0gaXNTaG93RGVtYW5kZWQgPyBcInNhb3AtdGFibGUtcm93LXNob3dlZFwiIDogXCJzYW9wLXRhYmxlLXJvdy1oaWRkZW5cIjtcclxuICAgICAgICAgICAgbGV0IHJlbW92ZUNsYXNzID0gaXNTaG93RGVtYW5kZWQgPyBcInNhb3AtdGFibGUtcm93LWhpZGRlblwiIDogXCJzYW9wLXRhYmxlLXJvdy1zaG93ZWRcIjtcclxuICAgICAgICAgICAgcm93RGV0YWlsc0lkRWxlbWVudC5hZGRDbGFzcyhhZGRDbGFzcyk7XHJcbiAgICAgICAgICAgIHJvd0RldGFpbHNJZEVsZW1lbnQucmVtb3ZlQ2xhc3MocmVtb3ZlQ2xhc3MpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpbml0T2Jkb2JqZUNvbnRyb2woKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzVmlldy5pbml0T2Jkb2JqZUNvbnRyb2xcIik7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0T2Jkb2JqZVRleHQodGhpcy5fb2Jkb2JqZUlkKVxyXG4gICAgfVxyXG5cclxuICAgIHNldE9iZG9iamVUZXh0KGlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBsZXQgb2Jkb2JqZUVsZW1lbnQgPSAkKHRoaXMuX29iZG9iamVJZCk7XHJcblxyXG4gICAgICAgIGxldCBtZXNlY05heml2ID0gb2Jkb2JqZUVsZW1lbnQuYXR0cihcImRhdGEtbWVzZWMtbmF6aXZcIik7XHJcbiAgICAgICAgbGV0IGxldG8gPSBvYmRvYmplRWxlbWVudC5hdHRyKFwiZGF0YS1sZXRvXCIpO1xyXG5cclxuICAgICAgICBvYmRvYmplRWxlbWVudC52YWwobWVzZWNOYXppdiArIFwiIFwiICsgbGV0byk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0T2Jkb2JqZURhdGFBdHRyaWJ1dGVzKGlkOiBzdHJpbmcpOiBPYmRvYmplZmlsdGVyVmFsdWVzIHtcclxuICAgICAgICBsZXQgb2Jkb2JqZUVsZW1lbnQgPSAkKHRoaXMuX29iZG9iamVJZCk7XHJcblxyXG4gICAgICAgIGxldCBkYXRhQXR0cmlidXRlcyA9IG5ldyBPYmRvYmplZmlsdGVyVmFsdWVzKCk7XHJcbiAgICAgICAgZGF0YUF0dHJpYnV0ZXMubGV0byA9IHBhcnNlSW50KG9iZG9iamVFbGVtZW50LmF0dHIoXCJkYXRhLWxldG9cIikpO1xyXG4gICAgICAgIGRhdGFBdHRyaWJ1dGVzLm1lc2VjID0gcGFyc2VJbnQob2Jkb2JqZUVsZW1lbnQuYXR0cihcImRhdGEtbWVzZWNcIikpO1xyXG4gICAgICAgIGRhdGFBdHRyaWJ1dGVzLm1lc2VjTmF6aXYgPSBvYmRvYmplRWxlbWVudC5hdHRyKFwiZGF0YS1tZXNlYy1uYXppdlwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGFBdHRyaWJ1dGVzO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBzZXRPYmRvYmplRGF0YUF0dHJpYnV0ZXMoaWQ6IHN0cmluZywgdmFsdWVzOiBPYmRvYmplZmlsdGVyVmFsdWVzKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IG9iZG9iamVFbGVtZW50ID0gJChpZCk7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZXMubGV0byAhPSBudWxsICYmIHZhbHVlcy5tZXNlYyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9iZG9iamVFbGVtZW50LmF0dHIoXCJkYXRhLWxldG9cIiwgdmFsdWVzLmxldG8pO1xyXG4gICAgICAgICAgICBvYmRvYmplRWxlbWVudC5hdHRyKFwiZGF0YS1tZXNlY1wiLCB2YWx1ZXMubWVzZWMpO1xyXG4gICAgICAgICAgICBvYmRvYmplRWxlbWVudC5hdHRyKFwiZGF0YS1tZXNlYy1uYXppdlwiLCB2YWx1ZXMubWVzZWNOYXppdik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNldE9iZG9iamVUZXh0KHRoaXMuX29iZG9iamVJZCk7XHJcbiAgICAgICAgfSBcclxuICAgIH1cclxuXHJcbiAgICBiaW5kR3JpZEV2ZW50cygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNWaWV3LmJpbmRHcmlkRXZlbnRzXCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIC8vIHByaWtheiBkb2dvZGtvdiB6YXBvc2xlbmVnYSBwbyBwb3NhbWV6bmloIGRuZXZpaFxyXG4gICAgICAgICQoXCJib2R5XCIpLm9mZihcImNsaWNrXCIsIHRoaXMuX3RhYmxlSWQgKyBcIiB0ci5zYW9wLXRhYmxlLXJvdy1tYXN0ZXIgdGQ6bm90KC50ZC1hY3Rpb24tZGV0YWlscylcIik7XHJcbiAgICAgICAgJChcImJvZHlcIikub24oXCJjbGlja1wiLCB0aGlzLl90YWJsZUlkICsgXCIgdHIuc2FvcC10YWJsZS1yb3ctbWFzdGVyIHRkOm5vdCgudGQtYWN0aW9uLWRldGFpbHMpXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgbGV0IHNlbGVjdGVkUm93ID0gJCh0aGlzKS5jbG9zZXN0KFwidHJcIik7XHJcbiAgICAgICAgICAgIGxldCBkYXRhQ29sdW1uID0gJCh0aGlzKS5jbG9zZXN0KFwidHJcIikuZmluZChcInRkXCIpLmVxKDApO1xyXG4gICAgICAgICAgICBsZXQgZGF0YVZhbHVlcyA9IF90aGlzLmdldERhdGFWYWx1ZXMoZGF0YUNvbHVtbiwgJChfdGhpcy5fb2Jkb2JqZUlkKSk7XHJcbiAgICAgICAgICAgIF90aGlzLl9sYXN0RGF0YVZhbHVlcyA9IGRhdGFWYWx1ZXM7XHJcbiAgICAgICAgICAgIF90aGlzLmFsbEVtcGxveWVlc1RhYmxlTWFya1JvdyhzZWxlY3RlZFJvdywgZGF0YVZhbHVlcyk7XHJcbiAgICAgICAgICAgIF90aGlzLnJlZnJlc2hFbXBsb3llZU1vbnRoRGF0YShkYXRhVmFsdWVzKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gcHJpa2F6IGRvZ29ka292IHphcG9zbGVuZWdhIHBvIHZyc3RpIGRvZ29ka292IChzdW0gdXJlKVxyXG4gICAgICAgICQoXCJib2R5XCIpLm9mZihcImNsaWNrXCIsIHRoaXMuX3RhYmxlSWQgKyBcIiB0ci5zYW9wLXRhYmxlLXJvdy1tYXN0ZXIgdGQudGQtYWN0aW9uLWRldGFpbHNcIik7XHJcbiAgICAgICAgJChcImJvZHlcIikub24oXCJjbGlja1wiLCB0aGlzLl90YWJsZUlkICsgXCIgdHIuc2FvcC10YWJsZS1yb3ctbWFzdGVyIHRkLnRkLWFjdGlvbi1kZXRhaWxzXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgbGV0IHNlbGVjdGVkUm93ID0gJCh0aGlzKS5jbG9zZXN0KFwidHJcIik7XHJcbiAgICAgICAgICAgIGxldCBhY3Rpb25EZXRhaWxzQ29sdW1uID0gc2VsZWN0ZWRSb3cuZmluZChcInRkXCIpLmVxKDIpO1xyXG4gICAgICAgICAgICBsZXQgZGF0YUNvbHVtbiA9ICQodGhpcykuY2xvc2VzdChcInRyXCIpLmZpbmQoXCJ0ZFwiKS5lcSgwKTtcclxuICAgICAgICAgICAgbGV0IGRhdGFWYWx1ZXMgPSBfdGhpcy5nZXREYXRhVmFsdWVzKGRhdGFDb2x1bW4sICQoX3RoaXMuX29iZG9iamVJZCkpO1xyXG4gICAgICAgICAgICBfdGhpcy5zaG93SGlkZURldGFpbHNTdWJUYWJsZShzZWxlY3RlZFJvdywgYWN0aW9uRGV0YWlsc0NvbHVtbiwgZGF0YVZhbHVlcyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLmluaXRXZWJHcmlkMSgpO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy5iaW5kRHJvcERvd25NZW51RXZlbnRzKCk7ICAgICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYmluZERyb3BEb3duTWVudUV2ZW50cygpOiB2b2lkIHtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgJChcIi5hdHRlbmRhbmNlQWxsRW1wbG95ZWVzRm9ybUNoZWNrSW5cIikub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgJChcIi5hdHRlbmRhbmNlQWxsRW1wbG95ZWVzRm9ybUNoZWNrSW5cIikub24oJ2NsaWNrJywgZnVuY3Rpb24ocm93KXtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImF0dGVuZGFuY2VBbGxFbXBsb3llZXNGb3JtQ2hlY2tJbi5jbGlja1wiKTtcclxuICAgICAgICAgICAgX3RoaXMuYXR0ZW5kYW5jZUFsbEVtcGxveWVlc0Zvcm1DaGVja0luT3V0KHJvdyx0cnVlKTsgICAgICAgICAgXHJcbiAgICAgICAgfSk7ICAgICBcclxuICAgICAgICAkKFwiLmF0dGVuZGFuY2VBbGxFbXBsb3llZXNGb3JtQ2hlY2tPdXRcIikub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgJChcIi5hdHRlbmRhbmNlQWxsRW1wbG95ZWVzRm9ybUNoZWNrT3V0XCIpLm9uKCdjbGljaycsIGZ1bmN0aW9uKHJvdyl7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJhdHRlbmRhbmNlQWxsRW1wbG95ZWVzRm9ybUNoZWNrT3V0LmNsaWNrXCIpO1xyXG4gICAgICAgICAgICBfdGhpcy5hdHRlbmRhbmNlQWxsRW1wbG95ZWVzRm9ybUNoZWNrSW5PdXQocm93LGZhbHNlKTtcclxuICAgICAgICB9KTsgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAvLyAgICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIGdldERhdGFWYWx1ZXMoZGF0YUNvbHVtbjogSlF1ZXJ5PEhUTUxUYWJsZUNlbGxFbGVtZW50PiwgZGF0YUlucHV0OiBKUXVlcnk8SFRNTElucHV0RWxlbWVudD4pOiBEYXRhQXR0cmlidXRlcyB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzVmlldy5nZXREYXRhVmFsdWVzXCIpO1xyXG5cclxuICAgICAgICBsZXQgZGF0YVZhbHVlcyA9IG5ldyBEYXRhQXR0cmlidXRlcygpO1xyXG4gICAgICAgIGlmIChkYXRhQ29sdW1uICE9IG51bGwgJiYgZGF0YUNvbHVtbi5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgZGF0YVZhbHVlcy5zaWZyYVphcG9zbGVuaSA9IGRhdGFDb2x1bW4uYXR0cihcImRhdGEtc2lmcmF6YXBvc2xlbmlcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGRhdGFWYWx1ZXMubGV0byA9IHBhcnNlSW50KGRhdGFJbnB1dC5hdHRyKFwiZGF0YS1sZXRvXCIpKTtcclxuICAgICAgICBkYXRhVmFsdWVzLm1lc2VjID0gcGFyc2VJbnQoZGF0YUlucHV0LmF0dHIoXCJkYXRhLW1lc2VjXCIpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGFWYWx1ZXM7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gb3puYWNpbW8sIG5hIGthdGVybyB2cnN0aWNvIGplIHVwb3JhYm5payBrbGlrbmlsXHJcbiAgICBhbGxFbXBsb3llZXNUYWJsZU1hcmtSb3coc2VsZWN0ZWRSb3c6IEpRdWVyeTxIVE1MVGFibGVSb3dFbGVtZW50PiwgZGF0YVZhbHVlczogRGF0YUF0dHJpYnV0ZXMpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNWaWV3LmFsbEVtcGxveWVlc1RhYmxlTWFya1Jvd1wiKTtcclxuXHJcbiAgICAgICAgLy8gb2R6bmFjaW1vIHZzZSB2cnN0aWNlXHJcbiAgICAgICAgdGhpcy5hbGxFbXBsb3llZXNUYWJsZVVuTWFya1Jvd3MoKTtcclxuXHJcbiAgICAgICAgbGV0IG1hcmtDb2x1bW4gPSBzZWxlY3RlZFJvdy5maW5kKFwidGQuc2FvcC10ZC1tYXJrLXJvd1wiKTtcclxuICAgICAgICBtYXJrQ29sdW1uLmFkZENsYXNzKHRoaXMuX21hcmtDb2x1bW5Dc3MpO1xyXG5cclxuICAgICAgICAvLyBvem5hY2ltbyBzZSBkZXRhaWxzIHJvdyBtYXJrY29sdW1uXHJcbiAgICAgICAgbGV0IHJvd0RldGFpbHNFbGVtZW50ID0gJCh0aGlzLl9yb3dEZXRhaWxzUHJlZml4SWQgKyBkYXRhVmFsdWVzLnNpZnJhWmFwb3NsZW5pKTtcclxuICAgICAgICBsZXQgZGV0YWlsc01hcmtDb2x1bW4gPSByb3dEZXRhaWxzRWxlbWVudC5maW5kKFwidGQuc2FvcC10ZC1tYXJrLXJvd1wiKTtcclxuICAgICAgICBkZXRhaWxzTWFya0NvbHVtbi5hZGRDbGFzcyh0aGlzLl9tYXJrQ29sdW1uQ3NzKTtcclxuICAgIH1cclxuXHJcbiAgICBhbGxFbXBsb3llZXNUYWJsZVVuTWFya1Jvd3MoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzVmlldy5hbGxFbXBsb3llZXNUYWJsZVVuTWFya1Jvd3NcIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgICQodGhpcy5fdGFibGVJZCArIFwiID4gdGJvZHkgPiB0clwiKS5lYWNoKFxyXG4gICAgICAgICAgICBmdW5jdGlvbiAoaW5kZXg6IGFueSwgdHI6IGFueSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IG1hcmtDb2x1bW4gPSAkKHRyKS5maW5kKFwidGRcIikuZXEoMSk7XHJcbiAgICAgICAgICAgICAgICBtYXJrQ29sdW1uLnJlbW92ZUNsYXNzKF90aGlzLl9tYXJrQ29sdW1uQ3NzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gb3N2ZXppbW8gbWVzZWNuZSBwb2RhdGtlIHphIHBvc2FtZXpuZWdhIHphcG9zbGVuZWdhXHJcbiAgICAvLyBjZSBqZSBwYXJhbWV0ZXIgbnVsbCwgc2UgcHJpa2F6ZSBcIkl6YmVyaXRlIHphcG9zbGVuZWdhIHphIHByaWtheiBkb2dvZGtvdlwiIFxyXG4gICAgcmVmcmVzaEVtcGxveWVlTW9udGhEYXRhKGRhdGFWYWx1ZXM6IERhdGFBdHRyaWJ1dGVzKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzVmlldy5yZWZyZXNoRW1wbG95ZWVNb250aERhdGFcIik7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhkYXRhVmFsdWVzKTtcclxuXHJcbiAgICAgICAgaWYgKGRhdGFWYWx1ZXMuc2lmcmFaYXBvc2xlbmkgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIGxldCBwYXJhbXMgPSB7IGxldG86IGRhdGFWYWx1ZXMubGV0bywgbWVzZWM6IGRhdGFWYWx1ZXMubWVzZWMsIHNpZnJhWmFwb3NsZW5pOiBkYXRhVmFsdWVzLnNpZnJhWmFwb3NsZW5pIH07XHJcbiAgICAgICAgbGV0IHNhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG5cclxuICAgICAgICAvL1xyXG4gICAgICAgIGxldCBlbXBsb3llZU5hbWUgPSAkKFwiI2F0dGVuZGFuY2VBbGxFbXBsb3llZXNUYWJsZVJvd3NcIikuZmluZChcIltkYXRhLXNpZnJhLXphcG9zbGVuaT0nXCIgKyBkYXRhVmFsdWVzLnNpZnJhWmFwb3NsZW5pICsgXCInXVwiKS5maW5kKFwiI2VtcGxveWVlTmFtZVwiKS5odG1sKCk7XHJcbiAgICAgICAgJChcIiNhdHRlbmRhbmNlQWxsRW1wbG95ZWVzUmlnaHRTaWRlRGl2XCIpLmZpbmQoXCIjZW1wbG95ZWVOYW1lXCIpLmh0bWwoZW1wbG95ZWVOYW1lKTtcclxuICAgICAgICAvL1xyXG5cclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAkKFwiI3JlZy1ncmlkXCIpLmh0bWwocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICBfdGhpcy5yZWZyZXNoRW1wbG95ZWVNb250aFRhYmxlSHRtbCgpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOiBcIlJFR01vbnRoRXZlbnRzL0dldFJlZ1VyYVRhYmxlVmlldzJcIlxyXG4gICAgICAgICAgICAsIGRhdGE6IHBhcmFtc1xyXG4gICAgICAgICAgICAsIHR5cGU6IFwiR0VUXCJcclxuICAgICAgICAgICAgLCBzcGlubmVyRGl2SWQ6IFwiI3Nhb3BMb2FkaW5nRW1wbG95ZWVNb250aEdyaWRcIlxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHZybmUgcHJhem5vIHRhYmVsbyBtZXNlY25lIHBvZGF0a2UgemEgemFwb3NsZW5lZ2FcclxuICAgIGdldEVtcHR5RW1wbG95ZWVNb250aERhdGEoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzVmlldy5nZXRFbXB0eUVtcGxveWVlTW9udGhEYXRhXCIpO1xyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIGxldCBzYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuXHJcbiAgICAgICAgJChcIiNhdHRlbmRhbmNlQWxsRW1wbG95ZWVzUmlnaHRTaWRlRGl2XCIpLmZpbmQoXCIjZW1wbG95ZWVOYW1lXCIpLmh0bWwoXCJcIik7XHJcblxyXG4gICAgICAgIHNhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICQoXCIjcmVnLWdyaWRcIikuaHRtbChyZXNwb25zZSk7XHJcbiAgICAgICAgICAgIF90aGlzLnJlZnJlc2hFbXBsb3llZU1vbnRoVGFibGVIdG1sKCk7XHJcbiAgICAgICAgICAgIC8vX3RoaXMuYmluZERyb3BEb3duTWVudUV2ZW50cygpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOiBcIlJFR01vbnRoRXZlbnRzL0dldEVtcHR5UmVnVXJhVGFibGVWaWV3XCJcclxuICAgICAgICAgICAgLCB0eXBlOiBcIkdFVFwiXHJcbiAgICAgICAgICAgICwgc3Bpbm5lckRpdklkOiBcIiNzYW9wTG9hZGluZ0VtcGxveWVlTW9udGhHcmlkXCJcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBvc3ZlemltbyB0YWJsZSBodG1sIGVsZW1lbnRlXHJcbiAgICByZWZyZXNoRW1wbG95ZWVNb250aFRhYmxlSHRtbCgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNWaWV3LnJlZnJlc2hFbXBsb3llZU1vbnRoVGFibGVIdG1sXCIpO1xyXG4gICAgICAgIC8vIHJlZnJlc2ggbW9udGggZW1wbG95ZWUgZGF0YSBicmV6IGJpbmQgZXZlbnRzXHJcbiAgICAgICAgbGV0IF9idG5BZGRFdmVudHMgPSAkKFwiI2J0bkFkZEV2ZW50c1wiKTtcclxuICAgICAgICBpZiAoX2J0bkFkZEV2ZW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlZ1VyYVZpZXcucmVmcmVzaFRhYmxlRGF0YSh0cnVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9yZWdVcmFWaWV3LnJlZnJlc2hUYWJsZURhdGEoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gZG9kYW1vIGJpbmQgZXZlbnQgemEgZGV0YWlscyB0YWJlbG9cclxuICAgICAgICB0aGlzLnNhb3BSZWdEZXRhaWxzVGFibGVWaWV3LmJpbmRHcmlkRXZlbnRzKCk7XHJcblxyXG4gICAgICAgIHRoaXMuYmluZERyb3BEb3duTWVudUV2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGlzRGV0YWlsc1N1YlRhYmxlU2hvd2VkKGljb25FbGVtZW50OiBKUXVlcnk8SFRNTFNwYW5FbGVtZW50Pik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnQXR0ZW5kYW5jZUFsbEVtcGxveWVlc1ZpZXcuaXNEZXRhaWxzU3ViVGFibGVTaG93ZWRcIik7XHJcblxyXG4gICAgICAgIHJldHVybiBpY29uRWxlbWVudC5oYXNDbGFzcyhcInNhb3AtaW1nLWRvd25cIik7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd0hpZGVEZXRhaWxzU3ViVGFibGUoc2VsZWN0ZWRSb3c6IEpRdWVyeTxIVE1MVGFibGVSb3dFbGVtZW50PiwgYWN0aW9uRGV0YWlsc0NvbHVtbjogSlF1ZXJ5PEhUTUxUYWJsZUNlbGxFbGVtZW50PiwgZGF0YVZhbHVlczogRGF0YUF0dHJpYnV0ZXMpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNWaWV3LnNob3dIaWRlRGV0YWlsc1N1YlRhYmxlXCIpO1xyXG5cclxuICAgICAgICBsZXQgaWNvbkVsZW1lbnQgPSBhY3Rpb25EZXRhaWxzQ29sdW1uLmZpbmQoXCJzcGFuXCIpO1xyXG5cclxuICAgICAgICBsZXQgcm93RGV0YWlsc0lkID0gdGhpcy5fcm93RGV0YWlsc1ByZWZpeElkICsgZGF0YVZhbHVlcy5zaWZyYVphcG9zbGVuaTtcclxuICAgICAgICBsZXQgcm93RGV0YWlsc0lkRWxlbWVudCA9ICQocm93RGV0YWlsc0lkKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmlzRGV0YWlsc1N1YlRhYmxlU2hvd2VkKGljb25FbGVtZW50KSkge1xyXG4gICAgICAgICAgICAvLyBzaG93IGRldGFpbHMgc3VidGFibGVcclxuICAgICAgICAgICAgLy8gcHJldmVyaW0sIMSNZSB0YWJlbGEgemUgb2JzdGFqYVxyXG4gICAgICAgICAgICBsZXQgZGV0YWlsUm93RGl2SWQgPSB0aGlzLl9yb3dEZXRhaWxzRGl2UHJlZml4SWQgKyBkYXRhVmFsdWVzLnNpZnJhWmFwb3NsZW5pO1xyXG4gICAgICAgICAgICBsZXQgZGV0YWlsUm93VGFibGVFbGVtZW50ID0gJChkZXRhaWxSb3dEaXZJZCArIFwiIHRhYmxlXCIpO1xyXG4gICAgICAgICAgICBpZiAoZGV0YWlsUm93VGFibGVFbGVtZW50Lmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyB0YWJlbGUgbmksIGdyZW1vIG5hIHNlcnZlciBwbyBwb2RhdGtlIHphIHByaWthelxyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXREZXRhaWxzU3ViVGFibGUoZGV0YWlsUm93RGl2SWQsIGRhdGFWYWx1ZXMubGV0bywgZGF0YVZhbHVlcy5tZXNlYywgZGF0YVZhbHVlcy5zaWZyYVphcG9zbGVuaSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHByaWthemkvc2tyaWogYm90dG9tIGJvcmRlclxyXG4gICAgICAgIHNlbGVjdGVkUm93LnRvZ2dsZUNsYXNzKFwic2FvcC10YWJsZS1yb3ctYm9yZGVyLWJvdHRvbS1ub25lXCIpXHJcblxyXG4gICAgICAgIC8vIHByaWthemkvc2tyaWogZGV0YWlscyB0YWJlbG9cclxuICAgICAgICByb3dEZXRhaWxzSWRFbGVtZW50LnRvZ2dsZUNsYXNzKFwic2FvcC10YWJsZS1yb3ctaGlkZGVuXCIpO1xyXG4gICAgICAgIHJvd0RldGFpbHNJZEVsZW1lbnQudG9nZ2xlQ2xhc3MoXCJzYW9wLXRhYmxlLXJvdy1zaG93ZWRcIik7XHJcblxyXG4gICAgICAgIC8vIHNwcmVtZW1iYSBpa29uZVxyXG4gICAgICAgIGljb25FbGVtZW50LnRvZ2dsZUNsYXNzKFwic2FvcC1pbWctcmlnaHRcIik7XHJcbiAgICAgICAgaWNvbkVsZW1lbnQudG9nZ2xlQ2xhc3MoXCJzYW9wLWltZy1kb3duXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldERldGFpbHNTdWJUYWJsZShkZXRhaWxSb3dEaXZJZDogc3RyaW5nLCBsZXRvOiBudW1iZXIsIG1lc2VjOiBudW1iZXIsIHNpZnJhWmFwb3NsZW5pOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNWaWV3LmdldERldGFpbHNTdWJUYWJsZVwiKTtcclxuXHJcbiAgICAgICAgbGV0IHNhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgICAgIGxldCBwYXJhbXMgPSB7IGxldG86IGxldG8sIG1lc2VjOiBtZXNlYywgc2lmcmFaYXBvc2xlbmk6IHNpZnJhWmFwb3NsZW5pIH07XHJcblxyXG4gICAgICAgIHNhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICQoZGV0YWlsUm93RGl2SWQpLmh0bWwocmVzcG9uc2UpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOiBcIlJFR0F0dGVuZGFuY2VBbGxFbXBsb3llZXMvR2V0RW1wbG95ZWVFdmVudHNGb3JtXCJcclxuICAgICAgICAgICAgLCBkYXRhOiBwYXJhbXNcclxuICAgICAgICAgICAgLCB0eXBlOiBcIkdFVFwiXHJcbiAgICAgICAgICAgICwgc3Bpbm5lckRpdklkOiBcIiNhdHRlbmRhbmNlQWxsRW1wbG95ZWVzTG9hZGluZ1wiXHJcbiAgICAgICAgfSk7ICAgIFxyXG4gICAgfVxyXG5cclxuICAgIG9iZG9iamVDbGljaygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNWaWV3Lm9iZG9iamVDbGlja1wiKTtcclxuICAgICAgICAkKHRoaXMuX2NhbGVuZGFySWNvbklkKS50cmlnZ2VyKFwiY2xpY2tcIik7XHJcbiAgICB9XHJcblxyXG4gICAgYWZ0ZXJQb3BvdmVyU2hvdygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNWaWV3LmFmdGVyUG9wb3ZlclNob3dcIik7XHJcblxyXG4gICAgICAgIGxldCBvYmRvYmplRGF0YSA9IHRoaXMuZ2V0T2Jkb2JqZURhdGFBdHRyaWJ1dGVzKHRoaXMuX29iZG9iamVJZCk7XHJcblxyXG4gICAgICAgIC8vIG9zdmV6aW1vIHZyZWRub3N0aSBmaWx0cm92IGl6IGRhdGEgYXR0cmlidXRlc1xyXG4gICAgICAgIHRoaXMuc2V0T2Jkb2JqZUZpbHRlclZhbHVlcyhvYmRvYmplRGF0YSk7XHJcblxyXG4gICAgICAgIC8vIHByaWthemkgb2tub1xyXG4gICAgICAgIHZhciBmaWx0ZXJCb2R5ID0gJChcImRpdi5wb3BvdmVyLnNob3dcIikuZmluZChcIiNwb3BPdmVyT2Jkb2JqZUJvZHlcIik7XHJcbiAgICAgICAgZmlsdGVyQm9keS5zaG93KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8ga2xpayBuYSBndW1iIHRyZW51dG5pIHYgcG9wb3ZlciBmaWx0cnUgemEgb2Jkb2JqZVxyXG4gICAgb2Jkb2JqZUN1cnJlbnRNb250aCgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNWaWV3Lm9iZG9iamVDdXJyZW50TW9udGhcIik7XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50TW9udGhGaWx0ZXJWYWx1ZXMgPSBuZXcgT2Jkb2JqZWZpbHRlclZhbHVlcygpO1xyXG5cclxuICAgICAgICBjdXJyZW50TW9udGhGaWx0ZXJWYWx1ZXMubGV0byA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcclxuICAgICAgICBjdXJyZW50TW9udGhGaWx0ZXJWYWx1ZXMubWVzZWMgPSBuZXcgRGF0ZSgpLmdldE1vbnRoKCkgKyAxO1xyXG4gICAgICAgIGN1cnJlbnRNb250aEZpbHRlclZhbHVlcy5tZXNlY05heml2ID0gdGhpcy5nZXRNb250aE5hbWUoY3VycmVudE1vbnRoRmlsdGVyVmFsdWVzLm1lc2VjKTtcclxuXHJcbiAgICAgICAgLy8gemFwaXNlbW8gdnJlZG5vc3QgdiBmaWx0ZXIgbGV0b1xyXG4gICAgICAgIHRoaXMuc2V0T2Jkb2JqZUZpbHRlclZhbHVlcyhjdXJyZW50TW9udGhGaWx0ZXJWYWx1ZXMpO1xyXG5cclxuICAgICAgICAvLyBvc3ZlemltbyBvYmRvYmplIGVsZW1lbnQgeiBub3ZpbWkgcG9kYXRraVxyXG4gICAgICAgIHRoaXMuc2V0T2Jkb2JqZURhdGFBdHRyaWJ1dGVzKHRoaXMuX29iZG9iamVJZCwgY3VycmVudE1vbnRoRmlsdGVyVmFsdWVzKTtcclxuXHJcbiAgICAgICAgLy8gb3N2ZXppbW8gdGFiZWxvIHBvZGF0a292IHZzZWggemFwb3NsZW5paFxyXG4gICAgICAgIHRoaXMucmVmcmVzaEFsbEVtcGxveWVlc1RhYmxlKGN1cnJlbnRNb250aEZpbHRlclZhbHVlcy5sZXRvLCBjdXJyZW50TW9udGhGaWx0ZXJWYWx1ZXMubWVzZWMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIG5hIHBvcG92ZXIgZmlsdHJ1IHphIG9iZG9iamUgcG9taWsgemEgZW4gbWVzZWMgbmFwcmVqLCBuYXphalxyXG4gICAgb2Jkb2JqZWZpbHRlcnNNb250aFN0ZXBDaGFuZ2Uoc3RlcDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3JlZnJlc2hpbmdBbGxFbXBsb3llZXNUYWJsZSA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIC8vIHBvdGVrYSBwb3N0b3BlayBvc3ZlemV2YW5qYSBwZG9hdGtvdiwgbm92aSB6YWh0ZXZlayBuaSBkb3ZvbGplbiBcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzVmlldy5vYmRvYmplZmlsdGVyc01vbnRoU3RlcENoYW5nZVwiKTtcclxuXHJcbiAgICAgICAgLy8gcHJlYmVyZW1vIHZyZWRub3N0aSBsZXRvIGluIG1lc2VjXHJcbiAgICAgICAgbGV0IGZpbHRlclZhbHVlcyA9IHRoaXMuZ2V0T2Jkb2JqZWZpbHRlclZhbHVlcygpO1xyXG5cclxuICAgICAgICBsZXQgbmV3RmlsdGVyVmFsdWVzID0gbmV3IE9iZG9iamVmaWx0ZXJWYWx1ZXMoKTtcclxuICAgICAgICBuZXdGaWx0ZXJWYWx1ZXMubWVzZWMgPSBmaWx0ZXJWYWx1ZXMubWVzZWMgKyBzdGVwO1xyXG4gICAgICAgIG5ld0ZpbHRlclZhbHVlcy5sZXRvID0gZmlsdGVyVmFsdWVzLmxldG87XHJcbiAgICAgICAgaWYgKG5ld0ZpbHRlclZhbHVlcy5tZXNlYyA9PSAxMykge1xyXG4gICAgICAgICAgICAvLyB6YSBkZWNlbWJlciBqZSBqYW51YXJcclxuICAgICAgICAgICAgbmV3RmlsdGVyVmFsdWVzLm1lc2VjID0gMTtcclxuICAgICAgICAgICAgbmV3RmlsdGVyVmFsdWVzLmxldG8gPSBuZXdGaWx0ZXJWYWx1ZXMubGV0byArIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKG5ld0ZpbHRlclZhbHVlcy5tZXNlYyA9PSAwKSB7XHJcbiAgICAgICAgICAgIC8vIHByZWQgamFudWFyamVtIGplIGRlY2VtYmVyXHJcbiAgICAgICAgICAgIG5ld0ZpbHRlclZhbHVlcy5tZXNlYyA9IDEyO1xyXG4gICAgICAgICAgICBuZXdGaWx0ZXJWYWx1ZXMubGV0byA9IG5ld0ZpbHRlclZhbHVlcy5sZXRvIC0gMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHBvaXNjZW1vIHNlIG5heml2IG1lc2VjYVxyXG4gICAgICAgIG5ld0ZpbHRlclZhbHVlcy5tZXNlY05heml2ID0gdGhpcy5nZXRNb250aE5hbWUobmV3RmlsdGVyVmFsdWVzLm1lc2VjKTtcclxuXHJcbiAgICAgICAgLy8gemFwaXNlbW8gbm92byB2cmVkbm9zdCB2IGZpbHRlciBsZXRvXHJcbiAgICAgICAgdGhpcy5zZXRPYmRvYmplRmlsdGVyVmFsdWVzKG5ld0ZpbHRlclZhbHVlcyk7XHJcblxyXG4gICAgICAgIC8vIG9zdmV6aW1vIG9iZG9iamUgZWxlbWVudCB6IG5vdmltaSBwb2RhdGtpXHJcbiAgICAgICAgdGhpcy5zZXRPYmRvYmplRGF0YUF0dHJpYnV0ZXModGhpcy5fb2Jkb2JqZUlkLCBuZXdGaWx0ZXJWYWx1ZXMpO1xyXG5cclxuICAgICAgICAvLyBvc3ZlemltbyB0YWJlbG8gcG9kYXRrb3YgdnNlaCB6YXBvc2xlbmloXHJcbiAgICAgICAgdGhpcy5yZWZyZXNoQWxsRW1wbG95ZWVzVGFibGUobmV3RmlsdGVyVmFsdWVzLmxldG8sIG5ld0ZpbHRlclZhbHVlcy5tZXNlYyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TW9udGhOYW1lKG1vbnRoOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnQXR0ZW5kYW5jZUFsbEVtcGxveWVlc1ZpZXcuZ2V0TW9udGhOYW1lXCIpO1xyXG5cclxuICAgICAgICBsZXQgbWVzZWNFbGVtZW50ID0gJChcImRpdi5wb3BvdmVyLnNob3dcIikuZmluZCh0aGlzLl9vYmRvYmplRmlsdGVyTWVzZWNJZCk7XHJcbiAgICAgICAgaWYgKG1lc2VjRWxlbWVudC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuICQobWVzZWNFbGVtZW50KS5maW5kKFwiIG9wdGlvblt2YWx1ZSA9ICdcIiArIG1vbnRoICsgXCInXVwiKS50ZXh0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gXCJcIjtcclxuICAgIH1cclxuXHJcbiAgICBlbmFibGVEaXNhYmxlT2Jkb2JqZUZpbHRlcnMoZGlzYWJsZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnQXR0ZW5kYW5jZUFsbEVtcGxveWVlc1ZpZXcuZW5hYmxlRGlzYWJsZU9iZG9iamVGaWx0ZXJzXCIpO1xyXG5cclxuICAgICAgICAvLyBsZXRvXHJcbiAgICAgICAgbGV0IGxldG9FbGVtZW50ID0gJChcImRpdi5wb3BvdmVyLnNob3dcIikuZmluZCh0aGlzLl9vYmRvYmplRmlsdGVyTGV0b0lkKTtcclxuICAgICAgICBpZiAobGV0b0VsZW1lbnQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGxldG9FbGVtZW50LnByb3AoXCJkaXNhYmxlZFwiLCBkaXNhYmxlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIG1lc2VjXHJcbiAgICAgICAgbGV0IG1lc2VjRWxlbWVudCA9ICQoXCJkaXYucG9wb3Zlci5zaG93XCIpLmZpbmQodGhpcy5fb2Jkb2JqZUZpbHRlck1lc2VjSWQpO1xyXG4gICAgICAgIGlmIChtZXNlY0VsZW1lbnQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIG1lc2VjRWxlbWVudC5wcm9wKFwiZGlzYWJsZWRcIiwgZGlzYWJsZSk7XHJcbiAgICAgICAgfSAgXHJcblxyXG4gICAgICAgIC8vIGd1bWIgdHJlbnV0bmlcclxuICAgICAgICBsZXQgX29iZG9iamVDdXJyZW50QnRuRWxlbWVudCA9ICQoXCJkaXYucG9wb3Zlci5zaG93XCIpLmZpbmQodGhpcy5fb2Jkb2JqZUN1cnJlbnRCdG5JZCk7XHJcbiAgICAgICAgaWYgKF9vYmRvYmplQ3VycmVudEJ0bkVsZW1lbnQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIF9vYmRvYmplQ3VycmVudEJ0bkVsZW1lbnQucHJvcChcImRpc2FibGVkXCIsIGRpc2FibGUpO1xyXG4gICAgICAgIH0gXHJcbiAgICB9XHJcblxyXG4gICAgc2V0T2Jkb2JqZUZpbHRlclZhbHVlcyhmaWx0ZXJWYWx1ZXM6IE9iZG9iamVmaWx0ZXJWYWx1ZXMpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNWaWV3LnNldE9iZG9iamVGaWx0ZXJWYWx1ZXNcIik7XHJcblxyXG4gICAgICAgIGxldCBvbGRmaWx0ZXJWYWx1ZXMgPSB0aGlzLmdldE9iZG9iamVmaWx0ZXJWYWx1ZXMoKTtcclxuXHJcbiAgICAgICAgLy8gbGV0b1xyXG4gICAgICAgIGlmIChvbGRmaWx0ZXJWYWx1ZXMubGV0byAhPSBmaWx0ZXJWYWx1ZXMubGV0bykge1xyXG4gICAgICAgICAgICBsZXQgbGV0b0VsZW1lbnQgPSAkKFwiZGl2LnBvcG92ZXIuc2hvd1wiKS5maW5kKHRoaXMuX29iZG9iamVGaWx0ZXJMZXRvSWQpO1xyXG4gICAgICAgICAgICBpZiAobGV0b0VsZW1lbnQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBsZXRvRWxlbWVudC52YWwoZmlsdGVyVmFsdWVzLmxldG8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBtZXNlY1xyXG4gICAgICAgIGlmIChvbGRmaWx0ZXJWYWx1ZXMubWVzZWMgIT0gZmlsdGVyVmFsdWVzLm1lc2VjKSB7XHJcbiAgICAgICAgICAgIGxldCBtZXNlY0VsZW1lbnQgPSAkKFwiZGl2LnBvcG92ZXIuc2hvd1wiKS5maW5kKHRoaXMuX29iZG9iamVGaWx0ZXJNZXNlY0lkKTtcclxuICAgICAgICAgICAgaWYgKG1lc2VjRWxlbWVudC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIG1lc2VjRWxlbWVudC52YWwoZmlsdGVyVmFsdWVzLm1lc2VjLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICB9ICBcclxuICAgICAgICB9IFxyXG4gICAgfVxyXG5cclxuICAgIC8vIHZyZWRub3N0aSB2IGZpbHRydSBsZXRvLCBtZXNlYyBzbyBzZSBzcHJlbWVuaWxlXHJcbiAgICBvYmRvYmplZmlsdGVyc0NoYW5nZWQoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzVmlldy5vYmRvYmplZmlsdGVyc0NoYW5nZWRcIik7XHJcblxyXG4gICAgICAgIC8vIHByZWJlcmVtbyB2cmVkbm9zdGkgbGV0byBpbiBtZXNlY1xyXG4gICAgICAgIGxldCBmaWx0ZXJWYWx1ZXMgPSB0aGlzLmdldE9iZG9iamVmaWx0ZXJWYWx1ZXMoKTtcclxuXHJcbiAgICAgICAgLy8gb3N2ZXppbW8gb2Jkb2JqZSBlbGVtZW50IHogbm92aW1pIHBvZGF0a2lcclxuICAgICAgICB0aGlzLnNldE9iZG9iamVEYXRhQXR0cmlidXRlcyh0aGlzLl9vYmRvYmplSWQsIGZpbHRlclZhbHVlcyk7XHJcblxyXG4gICAgICAgIHRoaXMucmVmcmVzaEFsbEVtcGxveWVlc1RhYmxlKGZpbHRlclZhbHVlcy5sZXRvLCBmaWx0ZXJWYWx1ZXMubWVzZWMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE9iZG9iamVmaWx0ZXJWYWx1ZXMoKTogT2Jkb2JqZWZpbHRlclZhbHVlcyB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzVmlldy5nZXRPYmRvYmplZmlsdGVyVmFsdWVzXCIpO1xyXG5cclxuICAgICAgICBsZXQgZmlsdGVyVmFsdWVzID0gbmV3IE9iZG9iamVmaWx0ZXJWYWx1ZXMoKTtcclxuICAgICAgICBmaWx0ZXJWYWx1ZXMubGV0byA9IG51bGw7XHJcbiAgICAgICAgZmlsdGVyVmFsdWVzLm1lc2VjID0gbnVsbDtcclxuICAgICAgICBmaWx0ZXJWYWx1ZXMubWVzZWNOYXppdiA9IFwiXCI7XHJcblxyXG4gICAgICAgIC8vIGRvbG9jaW1vIGxldG9cclxuICAgICAgICBsZXQgbGV0b0VsZW1lbnQgPSAkKFwiZGl2LnBvcG92ZXIuc2hvd1wiKS5maW5kKHRoaXMuX29iZG9iamVGaWx0ZXJMZXRvSWQpO1xyXG4gICAgICAgIGlmIChsZXRvRWxlbWVudC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgbGV0IGxldG9TdHIgPSBTdHJpbmcobGV0b0VsZW1lbnQudmFsKCkpO1xyXG4gICAgICAgICAgICBpZiAobGV0b1N0ci5sZW5ndGggPT0gNCB8fCBsZXRvU3RyLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobGV0b1N0ci5sZW5ndGggPT0gNCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlclZhbHVlcy5sZXRvID0gK2xldG9TdHI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gZG9sb2NpbW8gbWVzZWNcclxuICAgICAgICBsZXQgbWVzZWNFbGVtZW50ID0gJChcImRpdi5wb3BvdmVyLnNob3dcIikuZmluZCh0aGlzLl9vYmRvYmplRmlsdGVyTWVzZWNJZCk7XHJcbiAgICAgICAgaWYgKG1lc2VjRWxlbWVudC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgbGV0IHNlbE1lc2VjTmF6aXYgPSAkKG1lc2VjRWxlbWVudCkuZmluZChcIjpzZWxlY3RlZFwiKS50ZXh0KCk7XHJcbiAgICAgICAgICAgIGxldCBzZWxNZXNlYyA9ICQobWVzZWNFbGVtZW50KS5maW5kKFwiOnNlbGVjdGVkXCIpLnZhbCgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFpc05hTigrc2VsTWVzZWMpKSB7XHJcbiAgICAgICAgICAgICAgICBmaWx0ZXJWYWx1ZXMubWVzZWMgPSArc2VsTWVzZWNcclxuICAgICAgICAgICAgICAgIGZpbHRlclZhbHVlcy5tZXNlY05heml2ID0gc2VsTWVzZWNOYXppdlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmlsdGVyVmFsdWVzO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hBbGxFbXBsb3llZXNUYWJsZShsZXRvOiBudW1iZXIsIG1lc2VjOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNWaWV3LnJlZnJlc2hBbGxFbXBsb3llZXNUYWJsZVwiKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICAgICAgbGV0IHBhcmFtcyA9IHsgbGV0bzogbGV0bywgbWVzZWM6IG1lc2VjIH07XHJcbiAgICAgICAgdGhpcy5fcmVmcmVzaGluZ0FsbEVtcGxveWVlc1RhYmxlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5lbmFibGVEaXNhYmxlT2Jkb2JqZUZpbHRlcnModGhpcy5fcmVmcmVzaGluZ0FsbEVtcGxveWVlc1RhYmxlKTtcclxuXHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgX3RoaXMud2ViR3JpZDEucmVwbGFjZUdyaWRSb3dzKHJlc3BvbnNlKTtcclxuXHJcbiAgICAgICAgICAgIC8vJChfdGhpcy5fdGFibGVJZCkuaHRtbChyZXNwb25zZSk7XHJcbiAgICAgICAgICAgXHJcbiAgICAgICAgICAgIF90aGlzLl9yZWZyZXNoaW5nQWxsRW1wbG95ZWVzVGFibGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgX3RoaXMuZW5hYmxlRGlzYWJsZU9iZG9iamVGaWx0ZXJzKF90aGlzLl9yZWZyZXNoaW5nQWxsRW1wbG95ZWVzVGFibGUpO1xyXG5cclxuICAgICAgICAgICAgLy8gaXp2ZWRlbW8gc2UgZmlsdGVyIHZyc3RpYyB0YWJlbGUgZ2xlZGUgb3puYWNlbmloIHphcG9zbGVuaWhcclxuICAgICAgICAgICAgbGV0IGl6YnJhbmlaYXBvc2xlbmkgPSA8c3RyaW5nW10+KF90aGlzLl9zZWxlY3RPcmdGaWx0ZXIuX3NlbGVjdFphcG9zbGVuaS5zZWxlY3RlZENCLnZhbCgpKTtcclxuICAgICAgICAgICAgX3RoaXMuX3NlbGVjdE9yZ0ZpbHRlci5fc2VsZWN0WmFwb3NsZW5pLnNldFNlbGVjdFZhbHVlcyhpemJyYW5pWmFwb3NsZW5pKTtcclxuXHJcbiAgICAgICAgICAgIC8vIG5hc3RhdmltbyBwcmF6bm8gemFiZWxvIHphIHByaWtheiBtZXNlY25paCBwb2RhdGtvdlxyXG4gICAgICAgICAgICBfdGhpcy5nZXRFbXB0eUVtcGxveWVlTW9udGhEYXRhKCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246IFwiUkVHQXR0ZW5kYW5jZUFsbEVtcGxveWVlcy9HZXRBbGxFbXBsb3llZXNUYWJsZVwiXHJcbiAgICAgICAgICAgICwgZGF0YTogcGFyYW1zXHJcbiAgICAgICAgICAgICwgdHlwZTogXCJHRVRcIlxyXG4gICAgICAgICAgICAsIHNwaW5uZXJEaXZJZDogXCIjYXR0ZW5kYW5jZUFsbEVtcGxveWVlc0xvYWRpbmdcIlxyXG4gICAgICAgIH0pOyAgICBcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaEVtcGxveWVlUm93KGxldG86IG51bWJlciwgbWVzZWM6IG51bWJlciwgc2lmcmFaYXBvc2xlbmk6IHN0cmluZyA9IFwiXCIpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNWaWV3LnJlZnJlc2hFbXBsb3llZVRhYmxlOlwiK3NpZnJhWmFwb3NsZW5pKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICAgICAgbGV0IHBhcmFtcyA9IHsgbGV0bzogbGV0bywgbWVzZWM6IG1lc2VjLCBzaWZyYVphcG9zbGVuaTogc2lmcmFaYXBvc2xlbmkgfTtcclxuXHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgX3RoaXMucmVmcmVzaEVtcGxveWVlUm93SHRtbChyZXNwb25zZSxzaWZyYVphcG9zbGVuaSk7IFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOiBcIlJFR0F0dGVuZGFuY2VBbGxFbXBsb3llZXMvR2V0QWxsRW1wbG95ZWVzVGFibGVcIlxyXG4gICAgICAgICAgICAsIGRhdGE6IHBhcmFtc1xyXG4gICAgICAgICAgICAsIHR5cGU6IFwiR0VUXCJcclxuICAgICAgICAgICAgLCBzcGlubmVyRGl2SWQ6IFwiI2F0dGVuZGFuY2VBbGxFbXBsb3llZXNMb2FkaW5nXCJcclxuICAgICAgICB9KTsgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlZnJlc2hFbXBsb3llZVJvd0h0bWwoaHRtbFJlc3BvbmU6c3RyaW5nLHNpZnJhWmFwb3NsZW5pOnN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIC8vdmFyIHNvdXJjZV9kb21fbm9kZXMgPSAkKCQucGFyc2VIVE1MKCc8ZGl2PicraHRtbFJlc3BvbmUrJzwvZGl2PicpKTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIGxldCByZXNwb25lTm9kZSA9ICQoaHRtbFJlc3BvbmUpO1xyXG5cclxuICAgICAgICAvL2xldCBzb3VyY2VSb3cgPSByZXNwb25lTm9kZVswXS5vdXRlckhUTUw7XHJcbiAgICAgICAgbGV0IHNvdXJjZVJvdyA9ICQocmVzcG9uZU5vZGVbMl0ub3V0ZXJIVE1MKTtcclxuICAgICAgICAvL2xldCBzb3VyY2VEZXRhaWxzUm93ID0gcmVzcG9uZU5vZGVbMl0ub3V0ZXJIVE1MO1xyXG5cclxuICAgICAgICBsZXQgZGVzdGluYXRpb25Sb3cgPSAkKHRoaXMuX2FsbEVtcGxveWVlc1RhYmxlUm93c0lkICsgXCIgPiBbZGF0YS1zaWZyYS16YXBvc2xlbmk9J1wiICsgc2lmcmFaYXBvc2xlbmkgKyBcIiddXCIpO1xyXG4gICAgICAgIC8vIGRlc3RpbmF0aW9uRGV0YWlsc1JvdyA9ICQodGhpcy5fYWxsRW1wbG95ZWVzVGFibGVSb3dzSWQrXCIgPiAjZGV0YWlsUm93XCIrc2lmcmFaYXBvc2xlbmkpO1wiW2RhdGEtc2lmcmEtemFwb3NsZW5pPSdcIiArIGRhdGFWYWx1ZXMuc2lmcmFaYXBvc2xlbmkgKyBcIiddXCJcclxuICAgICAgICBpZiAoZGVzdGluYXRpb25Sb3cubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgIGxldCBfc291cmNlVGQgPSBzb3VyY2VSb3cuZmluZChcInRkXCIpO1xyXG4gICAgICAgICAgICBsZXQgX2Rlc3RUZCA9IGRlc3RpbmF0aW9uUm93LmZpbmQoXCJ0ZFwiKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIF9kZXN0VGQuZXEoNCkucmVwbGFjZVdpdGgoX3NvdXJjZVRkLmVxKDQpKTtcclxuICAgICAgICAgICAgX2Rlc3RUZC5lcSg1KS5yZXBsYWNlV2l0aChfc291cmNlVGQuZXEoNSkpO1xyXG4gICAgICAgICAgICBfZGVzdFRkLmVxKDYpLnJlcGxhY2VXaXRoKF9zb3VyY2VUZC5lcSg2KSk7XHJcbiAgICAgICAgICAgIF9kZXN0VGQuZXEoNykucmVwbGFjZVdpdGgoX3NvdXJjZVRkLmVxKDcpKTtcclxuICAgICAgICAgICAgX2Rlc3RUZC5lcSg4KS5yZXBsYWNlV2l0aChfc291cmNlVGQuZXEoOCkpO1xyXG4gICAgICAgICAgICBfZGVzdFRkLmVxKDkpLnJlcGxhY2VXaXRoKF9zb3VyY2VUZC5lcSg5KSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFmdGVyUmVmcmVzaFRvZGF5RGF0YSgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiYWZ0ZXJSZWZyZXNoVG9kYXlEYXRhXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xvc2VSZWdVcmFEYW5WaWV3KCk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VWaWV3Lm9uQ2xvc2VSZWdVcmFEYW5WaWV3XCIpOyAgICBcclxuICAgICAgICBpZiAoaXNVbkRlZmluZWQodGhpcy5fbGFzdERhdGFWYWx1ZXMpID09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGxldCBkZXRhaWxSb3dEaXZJZCA9IHRoaXMuX3Jvd0RldGFpbHNEaXZQcmVmaXhJZCArIHRoaXMuX2xhc3REYXRhVmFsdWVzLnNpZnJhWmFwb3NsZW5pO1xyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hFbXBsb3llZVJvdyh0aGlzLl9sYXN0RGF0YVZhbHVlcy5sZXRvLHRoaXMuX2xhc3REYXRhVmFsdWVzLm1lc2VjLHRoaXMuX2xhc3REYXRhVmFsdWVzLnNpZnJhWmFwb3NsZW5pKTtcclxuICAgICAgICAgICAgdGhpcy5nZXREZXRhaWxzU3ViVGFibGUoZGV0YWlsUm93RGl2SWQsdGhpcy5fbGFzdERhdGFWYWx1ZXMubGV0byx0aGlzLl9sYXN0RGF0YVZhbHVlcy5tZXNlYyx0aGlzLl9sYXN0RGF0YVZhbHVlcy5zaWZyYVphcG9zbGVuaSk7XHJcbiAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaEVtcGxveWVlTW9udGhEYXRhKHRoaXMuX2xhc3REYXRhVmFsdWVzKTtcclxuICAgICAgICB9ICAgICAgICBcclxuICAgIH0gXHJcbiAgICBcclxuICAgIHB1YmxpYyBidXR0b25zQmluZGluZygpOnZvaWR7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImJ1dHRvbnNCaW5kaW5nLi4uXCIpO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgX2J0bkFkZEV2ZW50cyA9ICQoXCIjYXR0ZW5kYW5jZUFsbEVtcGxveWVlc0Zvcm1cIikuZmluZChcIiNidG5BZGRFdmVudHNcIik7XHJcbiAgICAgICAgaWYgKF9idG5BZGRFdmVudHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBfYnRuQWRkRXZlbnRzLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICAgICBfYnRuQWRkRXZlbnRzLm9uKFwiY2xpY2tcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImJ0bkFkZEV2ZW50cy5jbGljay4uLlwiKTtcclxuICAgICAgICAgICAgICAgIGxldCBkYXRhVmFsdWVzID0gX3RoaXMuZ2V0RGF0YVZhbHVlcyhudWxsLCAkKF90aGlzLl9vYmRvYmplSWQpKTtcclxuICAgICAgICAgICAgICAgIGxldCBfbGV0byA9IGRhdGFWYWx1ZXMubGV0bztcclxuICAgICAgICAgICAgICAgIGxldCBfbWVzZWMgPSAoXCIwXCIrZGF0YVZhbHVlcy5tZXNlYykuc2xpY2UoLTIpO1xyXG4gICAgICAgICAgICAgICAgbGV0IF9kYXRlU3RhcnQgPSBjb252ZXJ0U3RyaW5nMkRhdGUoXCIwMS5cIitfbWVzZWMrXCIuXCIrX2xldG8sXCJkZC5tbS55eXl5XCIpOyAgIFxyXG4gICAgICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgICAgIGxldCBfdG9kYXkgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgbGV0IF9fdG9kYXlZZWFyID0gX3RvZGF5LmdldEZ1bGxZZWFyKCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgX190b2RheU1vbnRoID0gX3RvZGF5LmdldE1vbnRoKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoX190b2RheVllYXIgPT0gX2RhdGVTdGFydC5nZXRGdWxsWWVhcigpICYmIF9fdG9kYXlNb250aCA9PSBfZGF0ZVN0YXJ0LmdldE1vbnRoKCkgKXtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgX2RhbiA9IChcIjBcIitfdG9kYXkuZ2V0RGF0ZSgpKS5zbGljZSgtMik7XHJcbiAgICAgICAgICAgICAgICAgICAgX2RhdGVTdGFydCA9IGNvbnZlcnRTdHJpbmcyRGF0ZShfZGFuK1wiLlwiK19tZXNlYytcIi5cIitfbGV0byxcImRkLm1tLnl5eXlcIik7ICAgXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIF90aGlzLl9yZWdVcmFEb2dvZGVrLmFkZFJlY29yZCh7IFNlbGVjdGVkRGF5OmZvcm1hdERhdGUoX2RhdGVTdGFydCxcImRkLm1tLnl5eXlcIiksIHNpZnJhWmFwb3NsZW5pOlwiKlwifSk7ICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJlcnJvcjphdHRlbmRhbmNlQWxsRW1wbG95ZWVzRm9ybS5idG5BZGRFdmVudHMgbm90IGZvdW5kLi4uXCIpO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgbGV0IF9idG5EZWxldGVFdmVudHMgPSAkKFwiI2F0dGVuZGFuY2VBbGxFbXBsb3llZXNGb3JtXCIpLmZpbmQoXCIjYnRuRGVsZXRlRXZlbnRzXCIpO1xyXG4gICAgICAgIGlmIChfYnRuRGVsZXRlRXZlbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgX2J0bkRlbGV0ZUV2ZW50cy5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAgICAgX2J0bkRlbGV0ZUV2ZW50cy5vbihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJidG5EZWxldGVFdmVudHMuY2xpY2suLi5cIik7XHJcbiAgICAgICAgICAgICAgICBsZXQgZGF0YVZhbHVlcyA9IF90aGlzLmdldERhdGFWYWx1ZXMobnVsbCwgJChfdGhpcy5fb2Jkb2JqZUlkKSk7XHJcbiAgICAgICAgICAgICAgICBsZXQgX2xldG8gPSBkYXRhVmFsdWVzLmxldG87XHJcbiAgICAgICAgICAgICAgICBsZXQgX21lc2VjID0gKFwiMFwiK2RhdGFWYWx1ZXMubWVzZWMpLnNsaWNlKC0yKTtcclxuICAgICAgICAgICAgICAgIGxldCBfZGF0ZVN0YXJ0ID0gY29udmVydFN0cmluZzJEYXRlKFwiMDEuXCIrX21lc2VjK1wiLlwiK19sZXRvLFwiZGQubW0ueXl5eVwiKTtcclxuICAgICAgICAgICAgICAgIGxldCBfZGF0ZUVuZCA9IGNvbnZlcnRTdHJpbmcyRGF0ZShcIjAxLlwiK19tZXNlYytcIi5cIitfbGV0byxcImRkLm1tLnl5eXlcIik7OyBcclxuICAgICAgICAgICAgICAgIF9kYXRlRW5kID0gbmV3IERhdGUoX2RhdGVFbmQuc2V0TW9udGgoX2RhdGVFbmQuZ2V0TW9udGgoKSArIDEpLTEpO1xyXG4gICAgICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgICAgIF90aGlzLl9yZWdVcmFEb2dvZGVrRGVsZXRlVmlldy5zaG93Rm9ybSh7RGF0ZVN0YXJ0OmZvcm1hdERhdGUoX2RhdGVTdGFydCxcImRkLm1tLnl5eXlcIiksRGF0ZUVuZDpmb3JtYXREYXRlKF9kYXRlRW5kLFwiZGQubW0ueXl5eVwiKX0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yOmF0dGVuZGFuY2VBbGxFbXBsb3llZXNGb3JtLmJ0bkFkZEV2ZW50cyBub3QgZm91bmQuLi5cIik7XHJcbiAgICAgICAgICBcclxuICAgICAgICB9ICAgIFxyXG4gICAgICAgIC8vICAgICAgXHJcbiAgICAgICAgbGV0IF9idG5SZWZyZXNoID0gJChcIiNhdHRlbmRhbmNlQWxsRW1wbG95ZWVzRm9ybVwiKS5maW5kKFwiI2J0blJlZnJlc2hcIik7XHJcbiAgICAgICAgaWYgKF9idG5SZWZyZXNoLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgX2J0blJlZnJlc2gub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgICAgIF9idG5SZWZyZXNoLm9uKFwiY2xpY2tcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImJ0blJlZnJlc2guY2xpY2suLi5cIik7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5yZWZyZXNoRGF0YVdpdGhDdXJyZW50RmlsZXIoKTsgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZXJyb3I6YXR0ZW5kYW5jZUFsbEVtcGxveWVlc0Zvcm0uYnRuUmVmcmVzaCBub3QgZm91bmQuLi5cIik7XHJcbiAgICAgICAgfSAgXHJcbiAgICAgICAgLy9cclxuICAgICAgICBsZXQgX2J0bkNoZWNrSW5BbGwgPSAkKFwiI2F0dGVuZGFuY2VBbGxFbXBsb3llZXNGb3JtXCIpLmZpbmQoXCIuYnRuQ2hlY2tJbkFsbFwiKTtcclxuICAgICAgICBpZiAoX2J0bkNoZWNrSW5BbGwubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBfYnRuQ2hlY2tJbkFsbC5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAgICAgX2J0bkNoZWNrSW5BbGwub24oXCJjbGlja1wiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiQ2hlY2tJbkFsbC5jbGljay4uLlwiKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLmF0dGVuZGFuY2VBbGxFbXBsb3llZXNGb3JtQ2hlY2tJbk91dEFsbCh0cnVlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJlcnJvcjphdHRlbmRhbmNlQWxsRW1wbG95ZWVzRm9ybS5idG5DaGVja0luQWxsIG5vdCBmb3VuZC4uLlwiKTtcclxuICAgICAgICB9ICBcclxuICAgICAgICAvL1xyXG4gICAgICAgIGxldCBfYnRuQ2hlY2tPdXRBbGwgPSAkKFwiI2F0dGVuZGFuY2VBbGxFbXBsb3llZXNGb3JtXCIpLmZpbmQoXCIuYnRuQ2hlY2tPdXRBbGxcIik7XHJcbiAgICAgICAgaWYgKF9idG5DaGVja091dEFsbC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIF9idG5DaGVja091dEFsbC5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAgICAgX2J0bkNoZWNrT3V0QWxsLm9uKFwiY2xpY2tcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImJ0bkNoZWNrT3V0QWxsLmNsaWNrLi4uXCIpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuYXR0ZW5kYW5jZUFsbEVtcGxveWVlc0Zvcm1DaGVja0luT3V0QWxsKGZhbHNlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJlcnJvcjphdHRlbmRhbmNlQWxsRW1wbG95ZWVzRm9ybS5idG5DaGVja091dEFsbCBub3QgZm91bmQuLi5cIik7XHJcbiAgICAgICAgfSAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldFRhYmxlSGVpZ2h0KCk6dm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInNldFRhYmxlSGVpZ2h0Li4uXCIpO1xyXG5cclxuICAgICAgICBsZXQgX2hlaWdodCA9ICQoJyNncmlkLXRvb2xiYXItcHJvY2Vzc2VkJykuaGVpZ2h0KCk7XHJcbiAgICAgICAgbGV0IHJlbWFpbmluZ19oZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSBfaGVpZ2h0IC0gMjQ1O1xyXG4gICAgICAgICQoJyNhdHRlbmRhbmNlQWxsRW1wbG95ZWVzVGFibGVfd3JhcHBlcicpLmNzcyhcImhlaWdodFwiLHJlbWFpbmluZ19oZWlnaHQpOyAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldEV2ZW50QmluZGluZ3MoKTp2b2lke1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzZXRFdmVudEJpbmRpbmdzLi4uXCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIF90aGlzLnNldFRhYmxlSGVpZ2h0KCk7XHJcbiAgICAgICAgd2luZG93Lm9ucmVzaXplID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBfdGhpcy5zZXRUYWJsZUhlaWdodCgpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWZyZXNoRGF0YVdpdGhDdXJyZW50RmlsZXIoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInJlZnJlc2hEYXRhV2l0aEN1cnJlbnRGaWxlci4uLlwiKTtcclxuICAgICAgICBsZXQgZGF0YVZhbHVlcyA9IHRoaXMuZ2V0RGF0YVZhbHVlcyhudWxsLCAkKHRoaXMuX29iZG9iamVJZCkpO1xyXG4gICAgICAgIHRoaXMucmVmcmVzaEFsbEVtcGxveWVlc1RhYmxlKGRhdGFWYWx1ZXMubGV0bywgZGF0YVZhbHVlcy5tZXNlYyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFmdGVyQWRkRXZlbnRzU3VjY2VzcyhyZXN1bHQ6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJhZnRlckFkZEV2ZW50c1N1Y2Nlc3MuLi5cIik7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoRGF0YVdpdGhDdXJyZW50RmlsZXIoKTtcclxuICAgIH0gICAgXHJcbiAgICBcclxuICAgIHB1YmxpYyBhZnRlckRlbGV0ZUV2ZW50c1N1Y2Nlc3MocmVzdWx0OiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiYWZ0ZXJEZWxldGVFdmVudHNTdWNjZXNzLi4uXCIpO1xyXG4gICAgICAgIHRoaXMucmVmcmVzaERhdGFXaXRoQ3VycmVudEZpbGVyKCk7XHJcbiAgICB9IFxyXG5cclxuICAgIHB1YmxpYyBvbkRlbGV0ZVZhbGlkYXRpb25FcnJvcihyZXN1bHQ6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJvbkRlbGV0ZVZhbGlkYXRpb25FcnJvci4uLlwiKTtcclxuICAgICAgICB0aGlzLl9yZWdVcmFEb2dvZGVrRGVsZXRlVmlldy5hZnRlclZpZXdTaG93U3VjY2VzcyhyZXN1bHQpO1xyXG4gICAgfSAgICAgXHJcblxyXG4gICAgcHVibGljIGF0dGVuZGFuY2VBbGxFbXBsb3llZXNGb3JtQ2hlY2tJbk91dChyb3c6YW55LGNoZWNrSW46Ym9vbGVhbik6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiYXR0ZW5kYW5jZUFsbEVtcGxveWVlc0Zvcm1DaGVja0luLmNsaWNrXCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgLy9cclxuICAgICAgICBsZXQgX3N1Yk1lbnUgPSByb3cuY3VycmVudFRhcmdldDsgICBcclxuICAgICAgICBsZXQgX2xldG8gPSBfc3ViTWVudS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXllYXJcIik7XHJcbiAgICAgICAgbGV0IF9tZXNlYyA9IF9zdWJNZW51LmdldEF0dHJpYnV0ZShcImRhdGEtbW9udGhcIik7XHJcbiAgICAgICAgbGV0IF9zaWZyYVphcG9zbGVuaSA9IF9zdWJNZW51LmdldEF0dHJpYnV0ZShcImRhdGEtZW1wbG95ZWVDb2RlXCIpOyAgIFxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgbGV0IF9kYXRhID0geyBsZXRvOiBfbGV0bywgbWVzZWM6IF9tZXNlYywgc2lmcmFaYXBvc2xlbmk6IF9zaWZyYVphcG9zbGVuaSB9O1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgbGV0IF91cmxBY3Rpb24gPSBcIlwiO1xyXG4gICAgICAgIF91cmxBY3Rpb24gPSBjaGVja0luID8gXCJSRUdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzL0NhbGN1bGF0aW9uQ2hlY2tJblwiIDpcIlJFR0F0dGVuZGFuY2VBbGxFbXBsb3llZXMvQ2FsY3VsYXRpb25DaGVja091dFwiOyAgICAgICAgXHJcbiAgICAgICAgLy9cclxuICAgICAgICBsZXQgX3Nhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgICAgIF9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuYWxlcnRNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICBhbGVydGlmeS5tZXNzYWdlKHJlc3BvbnNlLmFsZXJ0TWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS52aWV3Q29udGVudCkge1xyXG4gICAgICAgICAgICAgICAgJChcIiNtZXNzYWdlQmFubmVyXCIpLmh0bWwocmVzcG9uc2Uudmlld0NvbnRlbnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBfdGhpcy5yZWZyZXNoRW1wbG95ZWVSb3cocGFyc2VJbnQoX2xldG8pLHBhcnNlSW50KF9tZXNlYyksX3NpZnJhWmFwb3NsZW5pKTtcclxuXHJcbiAgICAgICAgfTtcclxuICAgICAgICBfc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOiBfdXJsQWN0aW9uXHJcbiAgICAgICAgICAgICwgZGF0YTogX2RhdGFcclxuICAgICAgICAgICAgLCB0eXBlOiBcIlBPU1RcIlxyXG4gICAgICAgICAgICAsIHNwaW5uZXJEaXZJZDogXCIjYXR0ZW5kYW5jZUFsbEVtcGxveWVlc0xvYWRpbmdcIlxyXG4gICAgICAgIH0pOyAgICAgICAgICAgICAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGF0dGVuZGFuY2VBbGxFbXBsb3llZXNGb3JtQ2hlY2tJbk91dEFsbChjaGVja0luOmJvb2xlYW4pOnZvaWR7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImF0dGVuZGFuY2VBbGxFbXBsb3llZXNGb3JtQ2hlY2tJbk91dEFsbC5jbGlja1wiKTtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIGxldCBkYXRhVmFsdWVzID0gdGhpcy5nZXREYXRhVmFsdWVzKG51bGwsICQodGhpcy5fb2Jkb2JqZUlkKSk7XHJcbiAgICAgICAgLy9cclxuICAgICAgICBsZXQgX2RhdGEgPSB7IGxldG86IGRhdGFWYWx1ZXMubGV0bywgbWVzZWM6IGRhdGFWYWx1ZXMubWVzZWMsIHNpZnJhWmFwb3NsZW5pOiBcIlwiIH07XHJcbiAgICAgICAgLy8gICAgICAgIFxyXG4gICAgICAgIGxldCBfdXJsQWN0aW9uID0gXCJcIjtcclxuICAgICAgICBfdXJsQWN0aW9uID0gY2hlY2tJbiA/IFwiUkVHQXR0ZW5kYW5jZUFsbEVtcGxveWVlcy9DYWxjdWxhdGlvbkNoZWNrSW5cIiA6XCJSRUdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzL0NhbGN1bGF0aW9uQ2hlY2tPdXRcIjsgICAgICAgIFxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgbGV0IF9zYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgICAgICBfc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmFsZXJ0TWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgYWxlcnRpZnkubWVzc2FnZShyZXNwb25zZS5hbGVydE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uudmlld0NvbnRlbnQpIHtcclxuICAgICAgICAgICAgICAgICQoXCIjbWVzc2FnZUJhbm5lclwiKS5odG1sKHJlc3BvbnNlLnZpZXdDb250ZW50KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgX3RoaXMucmVmcmVzaERhdGFXaXRoQ3VycmVudEZpbGVyKCk7XHJcblxyXG4gICAgICAgIH07XHJcbiAgICAgICAgX3Nhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjogX3VybEFjdGlvblxyXG4gICAgICAgICAgICAsIGRhdGE6IF9kYXRhXHJcbiAgICAgICAgICAgICwgdHlwZTogXCJQT1NUXCJcclxuICAgICAgICAgICAgLCBzcGlubmVyRGl2SWQ6IFwiI2F0dGVuZGFuY2VBbGxFbXBsb3llZXNMb2FkaW5nXCJcclxuICAgICAgICB9KTsgICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBmaWx0ZXJaYXBvc2xlbmlUYWJsZVJvd3MoZmlsdGVyWmFwb3NsZW5pOiBzdHJpbmcpIHtcclxuICAgICAgICAvLyBEZWNsYXJlIHZhcmlhYmxlc1xyXG4gICAgICAgIHZhciB0YWJsZSwgdHIsIF9yb3dJZCwgaSwgdHh0VmFsdWU7XHJcbiAgICAgICAgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImF0dGVuZGFuY2VBbGxFbXBsb3llZXNUYWJsZVwiKTtcclxuICAgICAgICB0ciA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidHJcIik7XHJcbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0YWJsZSByb3dzLCBhbmQgaGlkZSB0aG9zZSB3aG8gZG9uJ3QgbWF0Y2ggdGhlIHNlYXJjaCBxdWVyeVxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0ci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBfcm93SWQgPSBudWxsO1xyXG4gICAgICAgICAgICBsZXQgX3RySWQgPSAkKHRyW2ldKS5hdHRyKFwiZGF0YS1zaWZyYS16YXBvc2xlbmlcIik7XHJcbiAgICAgICAgICAgIGlmICghaXNVbkRlZmluZWQoX3RySWQpKSB7XHJcbiAgICAgICAgICAgICAgICBfcm93SWQgPSBfdHJJZC50b1N0cmluZygpXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChfcm93SWQpIHtcclxuICAgICAgICAgICAgICAgIHR4dFZhbHVlID0gX3Jvd0lkLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNFbXB0eShmaWx0ZXJaYXBvc2xlbmkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJCh0cltpXSkuYWRkQ2xhc3MoXCJlbGVtZW50LWhpZGRlblwiKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyWmFwb3NsZW5pLnRvVXBwZXJDYXNlKCkuaW5kZXhPZih0eHRWYWx1ZSkgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICQodHJbaV0pLnJlbW92ZUNsYXNzKFwiZWxlbWVudC1oaWRkZW5cIik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICQodHJbaV0pLmFkZENsYXNzKFwiZWxlbWVudC1oaWRkZW5cIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9cclxufVxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCwgaXNFbXB0eSwgaXNVbkRlZmluZWQsIGZpbHRlclRhYmxlUm93cywgY29udmVydFN0cmluZzJEYXRlLCBmb3JtYXREYXRlIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wU2VydmljZXNDb3JlIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC1zZXJ2aWNlcy1jb3JlXCI7XHJcbmltcG9ydCB7IFNhb3BNdWx0aXNlbGVjdCwgU2VsZWN0T3B0aW9uLCBTYW9wTXVsdGlzZWxlY3RPcHRpb25zIH0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC1tdWx0aXNlbGVjdFwiO1xyXG5pbXBvcnQgeyBTYW9wUG9wb3ZlciB9IGZyb20gXCIuLi9Db21wb25lbnRzL3Nhb3AtcG9wb3ZlclwiO1xyXG5pbXBvcnQgeyBTYW9wV2ViR3JpZCxTYW9wV2ViR3JpZFByb3BlcnRpZXMsU2FvcFdlYkdyaWRUb29sYmFyLFNhb3BXZWJEYXRhVGFibGV9IGZyb20gXCIuLi9Db21wb25lbnRzL3Nhb3AtZ3JpZFwiO1xyXG5pbXBvcnQgeyBTYW9wRXhwb3J0IH0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC1leHBvcnRcIjtcclxuaW1wb3J0IHsgU2FvcFdlYkdyaWRVbml0T3JnRmlsdGVyIH0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC1ncmlkLWZpbHRlci1Vbml0T3JnXCI7XHJcbmltcG9ydCB7IFNhb3BUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9Db3JlL3Nhb3AtdHJhbnNsYXRlJztcclxuXHJcbmNsYXNzIE9iZG9iamVmaWx0ZXJWYWx1ZXMge1xyXG4gICAgbGV0bzogbnVtYmVyO1xyXG4gICAgbWVzZWM6IG51bWJlcjtcclxuICAgIG1lc2VjTmF6aXY6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BSZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzQW5hbHlzaXNWaWV3IHtcclxuICAgIHByaXZhdGUgX2xpYk5hbWU6IHN0cmluZztcclxuICAgIHByaXZhdGUgX3JlZnJlc2hpbmdBbGxFbXBsb3llZXNUYWJsZTogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgX3RhYmxlRGl2SWQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgX3RhYmxlSWQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgX3NlYXJjaEFsbEZpZWxkc1ZhbHVlSWQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgX29iZG9iamVJZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfY2FsZW5kYXJJY29uSWQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgX29iZG9iamVGaWx0ZXJMZXRvSWQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgX29iZG9iamVGaWx0ZXJNZXNlY0lkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9vYmRvYmplQ3VycmVudEJ0bklkOiBzdHJpbmdcclxuICAgIHByaXZhdGUgX3RhYmxlUm93c0lkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9zZWxlY3REb2dvZGVrSGlkZGVuSWQ6IHN0cmluZzsgXHJcbiAgICBwcml2YXRlIF9zZWxlY3RPcmdGaWx0ZXI6IFNhb3BXZWJHcmlkVW5pdE9yZ0ZpbHRlcjtcclxuICAgIHByaXZhdGUgX3NlbGVjdERvZ29kZWs6IFNhb3BNdWx0aXNlbGVjdDtcclxuICAgIHByaXZhdGUgX3NlbGVjdFByaWthelBvZGF0a2k6IFNhb3BNdWx0aXNlbGVjdDtcclxuICAgIC8vXHJcbiAgICBwdWJsaWMgdHJhbnNsYXRpb25TZXJ2aWNlOlNhb3BUcmFuc2xhdGlvblNlcnZpY2U7ICAgIFxyXG4gICAgLy9cclxuICAgIHByaXZhdGUgX3Nhb3BQb3BvdmVyOiBTYW9wUG9wb3ZlcjtcclxuICAgIC8vXHJcbiAgICBwdWJsaWMgd2ViR3JpZDE6U2FvcFdlYkdyaWQ7XHJcbiAgICAvL1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGxpYk5hbWU6IHN0cmluZyA9IFwiXCIpIHtcclxuICAgICAgICB0aGlzLl9saWJOYW1lID0gbGliTmFtZTtcclxuICAgICAgICB0aGlzLl9yZWZyZXNoaW5nQWxsRW1wbG95ZWVzVGFibGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl90YWJsZURpdklkID0gXCIjYXR0ZW5kYW5jZUFsbEVtcGxveWVlc0FuYWx5c2lzVGFibGVEaXZcIjtcclxuICAgICAgICB0aGlzLl90YWJsZUlkID0gXCIjYXR0ZW5kYW5jZUFsbEVtcGxveWVlc0FuYWx5c2lzVGFibGVcIjtcclxuICAgICAgICB0aGlzLl9zZWFyY2hBbGxGaWVsZHNWYWx1ZUlkID0gXCIjU2VhcmNoVmFsdWVcIjtcclxuICAgICAgICB0aGlzLl9vYmRvYmplSWQgPSBcIiNPYmRvYmplXCI7XHJcbiAgICAgICAgdGhpcy5fY2FsZW5kYXJJY29uSWQgPSBcIiNjYWxlbmRhckljb25cIjtcclxuICAgICAgICB0aGlzLl9vYmRvYmplRmlsdGVyTGV0b0lkID0gXCIjbGV0b09iZG9iamVcIjtcclxuICAgICAgICB0aGlzLl9vYmRvYmplRmlsdGVyTWVzZWNJZCA9IFwiI01lc2VjU3RyaW5nXCI7XHJcbiAgICAgICAgdGhpcy5fb2Jkb2JqZUN1cnJlbnRCdG5JZCA9IFwiI2N1cnJlbnRNb250aEJ0bkZpbHRlclwiO1xyXG4gICAgICAgIHRoaXMuX3RhYmxlUm93c0lkID0gXCIjYXR0ZW5kYW5jZUFsbEVtcGxveWVlc0FuYWx5c2lzVGFibGVSb3dzXCI7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0RG9nb2Rla0hpZGRlbklkID0gXCIjRXZlbnRzRmlsdGVySGlkZGVuXCI7XHJcblxyXG4gICAgICAgIHRoaXMuX3NlbGVjdE9yZ0ZpbHRlciA9IG5ldyBTYW9wV2ViR3JpZFVuaXRPcmdGaWx0ZXIobGliTmFtZSwgXCJcIik7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0T3JnRmlsdGVyLmZpbHRlclphcG9zbGVuaVRhYmxlUm93cyA9IHRoaXMuZmlsdGVyWmFwb3NsZW5pVGFibGVSb3dzLmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuX3Nhb3BQb3BvdmVyID0gbmV3IFNhb3BQb3BvdmVyKCk7XHJcbiAgICAgICAgdGhpcy5fc2FvcFBvcG92ZXIuYWZ0ZXJQb3BvdmVyU2hvdyA9IHRoaXMuYWZ0ZXJQb3BvdmVyU2hvdy5iaW5kKHRoaXMpOyBcclxuXHJcbiAgICAgICAgdGhpcy50cmFuc2xhdGlvblNlcnZpY2UgPSBuZXcgU2FvcFRyYW5zbGF0aW9uU2VydmljZSgpO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy5zZXREaWN0aW9uYXJ5KCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RGljdGlvbmFyeSgpe1xyXG4gICAgICAgIGxldCBkaWN0aW9uYXJ5OnN0cmluZ1tdID0gW1wiWmJpcm5payB1ciB6YXBvc2xlbmloXCJdO1xyXG4gICAgICAgIHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnNldFRyYW5zbGF0aW9uc0xpc3QoZGljdGlvbmFyeSk7XHJcbiAgICAgIH0gXHJcblxyXG4gICAgb25Jbml0VmlldygpOnZvaWR7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzQW5hbHlzaXNWaWV3Lm9uSW5pdFZpZXdcIik7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoQWxsRGF0YSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRXZWJHcmlkMSgpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNBbmFseXNpc1ZpZXcuaW5pdFdlYkdyaWQxXCIpO1xyXG5cclxuICAgICAgICBsZXQgd2dJZCA9IHRoaXMuX3RhYmxlSWQ7XHJcbiAgICAgICAgbGV0IGNhcHRpb25Ub29sYmFyID0gJCh3Z0lkKS5hdHRyKFwiY2FwdGlvbi10b29sYmFyXCIpO1xyXG4gICAgICAgIC8vbGV0IGNhcHRpb25BZGRCdXR0b24gPSAkKHdnSWQpLmF0dHIoXCJjYXB0aW9uLWFkZEJ1dHRvblwiKTsgXHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLndlYkdyaWQxID0gbmV3IFNhb3BXZWJHcmlkKHRoaXMuX2xpYk5hbWUrXCIud2ViR3JpZDFcIik7XHJcbiAgICAgICAgbGV0IGdyaWRQcm9wZXJ0aWVzOiBTYW9wV2ViR3JpZFByb3BlcnRpZXM7XHJcbiAgICAgICAgbGV0IGdyaWRUb29sYmFyOlNhb3BXZWJHcmlkVG9vbGJhcjtcclxuICAgICAgICAvL2xldCB0b29sYmFyQnV0dG9uczpTYW9wV2ViR3JpZFRvb2xiYXJCdXR0b25bXSA9IFtdO1xyXG4gICAgICAgIGxldCBkYXRhVGFibGU6U2FvcFdlYkRhdGFUYWJsZTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIC8vdG9vbGJhckJ1dHRvbnMucHVzaCh7aWQ6XCJhZGRUb1wiLGNhcHRpb246Y2FwdGlvbkFkZEJ1dHRvbixvbkNsaWNrRXZlbnQ6dGhpcy5saWJOYW1lK1wiLmFkZFJlY29yZCgpO1wifSk7XHJcbiAgICAgICAgLy9ncmlkVG9vbGJhciA9IHtpZDpcInNhb3BXZWJHcmlkVEIxXCIsY2FwdGlvbjpjYXB0aW9uVG9vbGJhcixidXR0b25zOnRvb2xiYXJCdXR0b25zfTtcclxuXHJcbiAgICAgICAgZGF0YVRhYmxlID0ge1xyXG4gICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICAgICAgICBjb2x1bW5EZWZzU2V0dGluZ3M6IFtcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0YXJnZXRzOiA0LFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdudW1lcmljLWNvbW1hJ1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0YXJnZXRzOiBcInNwZWNpYWwtc29ydFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcjogKGRhdGEsIHR5cGUsIHJvdywgbWV0YSkgPT4gdHlwZSA9PT0gJ2Rpc3BsYXknID8gcm93W21ldGEuY29sICsgMV0gOiBkYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdudW1lcmljLWNvbW1hJ1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0YXJnZXRzOiBcInNwZWNpYWwtc29ydC1oaWRkZW5cIixcclxuICAgICAgICAgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfTtcclxuICAgIFxyXG4gICAgICAgIGdyaWRQcm9wZXJ0aWVzID0ge1xyXG4gICAgICAgICAgICBncmlkSWQ6d2dJZFxyXG4gICAgICAgICAgICAvLyx0b29sYmFyOmdyaWRUb29sYmFyXHJcbiAgICAgICAgICAgICwgZGF0YVRhYmxlOiBkYXRhVGFibGVcclxuICAgICAgICAgICAgLCBjc3M6IFwibWF4LWhlaWdodC1hdHRlbmRhbmNlQWxsRW1wbG95ZWVzQW5hbHlzaXNUYWJsZVwiXHJcbiAgICAgICAgICB9OyAgICAgICAgXHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLndlYkdyaWQxLmluaXQoZ3JpZFByb3BlcnRpZXMpOyAgIFxyXG5cclxuICAgICAgICAvLyBmaXggY3NzIHphIHN0b2xwY2UgemEgdGVkbmUsIGRhIGltYWpvIGxhaGtvIG5heml2aSBzdG9scGNldiBkdmUgdnJzdGljaVxyXG4gICAgICAgIGxldCB0ZWRlbkNhcHRpb25oZWFkZXJEaXZzID0gJCh0aGlzLl90YWJsZUlkICsgXCIgdGhlYWQgdHIgdGguc2FvcC10YWJsZS1jb2wtdGVkZW4gZGl2LnNhb3AtdGFibGUtaGVhZGVyLWNhcHRpb25cIik7XHJcbiAgICAgICAgbGV0IGluZEVsZW1lbnQgPSAwXHJcbiAgICAgICAgdGVkZW5DYXB0aW9uaGVhZGVyRGl2cy5lYWNoKGZ1bmN0aW9uIChpbmRleCwgZGl2RWxlbWVudCkge1xyXG4gICAgICAgICAgICBpbmRFbGVtZW50ID0gaW5kRWxlbWVudCArIDE7XHJcbiAgICAgICAgICAgICQoZGl2RWxlbWVudCkucmVtb3ZlQ2xhc3MoXCJzYW9wLXRhYmxlLXRleHQtdHJ1bmNhdGVcIik7XHJcbiAgICAgICAgICAgICQoZGl2RWxlbWVudCkuYWRkQ2xhc3MoXCJzYW9wLXRhYmxlLWNvbC10ZWRlbi1jYXB0aW9uXCIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgcmVmcmVzaEFsbERhdGEoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzQW5hbHlzaXNWaWV3LnJlZnJlc2hBbGxEYXRhXCIpO1xyXG5cclxuICAgICAgICB0aGlzLnJlZnJlc2hBbGxFbXBsb3llZXNEYXRhKCk7XHJcbiAgICB9ICBcclxuXHJcbiAgICByZWZyZXNoQWxsRW1wbG95ZWVzRGF0YShwYXJhbXM6IGFueSA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNBbmFseXNpc1ZpZXcucmVmcmVzaEFsbEVtcGxveWVlc0RhdGFcIik7XHJcbiAgICAgICBcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIGxldCBzYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuXHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgJChcIiNhdHRlbmRhbmNlQWxsRW1wbG95ZWVzQW5hbHlzaXNGb3JtXCIpLmh0bWwocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICBfdGhpcy5pbml0RmlsdGVyQ29udHJvbHMoKTtcclxuICAgICAgICAgICAgX3RoaXMuYmluZEdyaWRFdmVudHMoKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHNhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjogXCJSRUdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzQW5hbHlzaXMvR2V0QWxsRW1wbG95ZWVzQW5hbHlzaXNGb3JtXCJcclxuICAgICAgICAgICAgLCBkYXRhOiBwYXJhbXNcclxuICAgICAgICAgICAgLCB0eXBlOiBcIkdFVFwiXHJcbiAgICAgICAgICAgICwgc3Bpbm5lckRpdklkOiBcIiNhdHRlbmRhbmNlQWxsRW1wbG95ZWVzQW5hbHlzaXNMb2FkaW5nXCJcclxuICAgICAgICB9KTsgICAgXHJcbiAgICB9XHJcblxyXG4gICAgaW5pdEZpbHRlckNvbnRyb2xzKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnQXR0ZW5kYW5jZUFsbEVtcGxveWVlc0FuYWx5c2lzVmlldy5pbml0RmlsdGVyQ29udHJvbHNcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLnNldEV2ZW50QmluZGluZ3MoKTtcclxuICAgICAgICAvL1xyXG5cclxuICAgICAgICB0aGlzLl9zZWxlY3RPcmdGaWx0ZXIuaW5pdEZpbHRlckNvbnRyb2xzKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3NlbGVjdERvZ29kZWsgPSBuZXcgU2FvcE11bHRpc2VsZWN0KCk7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0RG9nb2Rlay5pbml0KFwiI0V2ZW50c0ZpbHRlclwiLCBcIkRvZ29ka2kgemEgcHJpa2F6XCIpO1xyXG4gICAgICAgIC8vIGV2ZW50IGJpbmRpbmcgemEgaW5pdCwgZGEgc2UgdiBpbml0IG1ldG9kaSAoc2UgbmFzdGF2aSBjaGVja2JveGUgbmEgc2VsZWN0IGFsbCkgbmUgaXp2ZWRlIG1ldG9kYSBmaWx0ZXJFdmVudENvbHVtbnMgKG5pIHBvdHJlYmUpXHJcbiAgICAgICAgdGhpcy5fc2VsZWN0RG9nb2Rlay5hZnRlckNoYW5nZUNvbW1vbkV2ZW50ID0gX3RoaXMuZmlsdGVyRXZlbnRDb2x1bW5zLmJpbmQoX3RoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLl9zZWxlY3RQcmlrYXpQb2RhdGtpID0gbmV3IFNhb3BNdWx0aXNlbGVjdCgpO1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdFByaWthelBvZGF0a2kuaW5pdChcIiNQb2RhdGtpRmlsdGVyXCIsIFwiRG9kYXRubyBmaWx0cmlyYW5qZVwiKTtcclxuICAgICAgICAvLyBvZHpuYWNpbW8gdnNlIG9wY2lqZVxyXG4gICAgICAgIGxldCBpemJyYW5pUG9kYXRraTogc3RyaW5nW10gPSBbXTsgXHJcbiAgICAgICAgdGhpcy5fc2VsZWN0UHJpa2F6UG9kYXRraS5zZXRTZWxlY3RWYWx1ZXMoaXpicmFuaVBvZGF0a2kpO1xyXG4gICAgICAgIC8vIGV2ZW50IGJpbmRpbmcgemEgaW5pdCwgZGEgc2UgdiBpbml0IG1ldG9kaSAoc2UgbmFzdGF2aSBjaGVja2JveGUgbmEgc2VsZWN0IGFsbCkgbmUgaXp2ZWRlIG1ldG9kYSBmaWx0ZXJFdmVudENvbHVtbnMgKG5pIHBvdHJlYmUpXHJcbiAgICAgICAgdGhpcy5fc2VsZWN0UHJpa2F6UG9kYXRraS5hZnRlckNoYW5nZUNvbW1vbkV2ZW50ID0gX3RoaXMuZmlsdGVyWmFwb3NsZW5pVGFibGVSb3dzLmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgICQodGhpcy5fc2VhcmNoQWxsRmllbGRzVmFsdWVJZCkua2V5dXAoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBsZXQgb1RhYmxlID0gX3RoaXMud2ViR3JpZDEuZGF0YVRhYmxlO1xyXG4gICAgICAgICAgICBvVGFibGUuc2VhcmNoKCQodGhpcykudmFsKCkudG9TdHJpbmcoKSkuZHJhdygpIDsgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyQoX3RoaXMud2ViR3JpZDEud2ViR3JpZElkKS5kYXRhVGFibGUoKS5zZWFyY2goJCh0aGlzKS52YWwoKSkuZHJhdygpIDtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2FvcFBvcG92ZXIuYmluZFBvcG92ZXJFdmVudHMoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0T2Jkb2JqZUNvbnRyb2woKVxyXG4gICAgfVxyXG5cclxuICAgIC8vZmlsdGVyQWxsRmllbGRzKCk6IHZvaWQge1xyXG4gICAgLy8gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzQW5hbHlzaXNWaWV3LmZpbHRlckFsbEZpZWxkc1wiKTtcclxuXHJcbiAgICAvLyAgICBsZXQgZmlsdGVyVmFsID0gU3RyaW5nKCQodGhpcy5fc2VhcmNoQWxsRmllbGRzVmFsdWVJZCkudmFsKCkpO1xyXG4gICAgLy8gICAgZmlsdGVyVGFibGVSb3dzKGZpbHRlclZhbCwgdGhpcy5fdGFibGVJZCk7XHJcbiAgICAvL31cclxuXHJcbiAgICBpbml0T2Jkb2JqZUNvbnRyb2woKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzQW5hbHlzaXNWaWV3LmluaXRPYmRvYmplQ29udHJvbFwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRPYmRvYmplVGV4dCh0aGlzLl9vYmRvYmplSWQpXHJcbiAgICB9XHJcblxyXG4gICAgc2V0T2Jkb2JqZVRleHQoaWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnQXR0ZW5kYW5jZUFsbEVtcGxveWVlc0FuYWx5c2lzVmlldy5zZXRPYmRvYmplVGV4dFwiKTtcclxuXHJcbiAgICAgICAgbGV0IG9iZG9iamVFbGVtZW50ID0gJCh0aGlzLl9vYmRvYmplSWQpO1xyXG5cclxuICAgICAgICBsZXQgbWVzZWNOYXppdiA9IG9iZG9iamVFbGVtZW50LmF0dHIoXCJkYXRhLW1lc2VjLW5heml2XCIpO1xyXG4gICAgICAgIGxldCBsZXRvID0gb2Jkb2JqZUVsZW1lbnQuYXR0cihcImRhdGEtbGV0b1wiKTtcclxuXHJcbiAgICAgICAgb2Jkb2JqZUVsZW1lbnQudmFsKG1lc2VjTmF6aXYgKyBcIiBcIiArIGxldG8pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE9iZG9iamVEYXRhQXR0cmlidXRlcyhpZDogc3RyaW5nKTogT2Jkb2JqZWZpbHRlclZhbHVlcyB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzQW5hbHlzaXNWaWV3LmdldE9iZG9iamVEYXRhQXR0cmlidXRlc1wiKTtcclxuXHJcbiAgICAgICAgbGV0IG9iZG9iamVFbGVtZW50ID0gJCh0aGlzLl9vYmRvYmplSWQpO1xyXG5cclxuICAgICAgICBsZXQgZGF0YUF0dHJpYnV0ZXMgPSBuZXcgT2Jkb2JqZWZpbHRlclZhbHVlcygpO1xyXG4gICAgICAgIGRhdGFBdHRyaWJ1dGVzLmxldG8gPSBwYXJzZUludChvYmRvYmplRWxlbWVudC5hdHRyKFwiZGF0YS1sZXRvXCIpKTtcclxuICAgICAgICBkYXRhQXR0cmlidXRlcy5tZXNlYyA9IHBhcnNlSW50KG9iZG9iamVFbGVtZW50LmF0dHIoXCJkYXRhLW1lc2VjXCIpKTtcclxuICAgICAgICBkYXRhQXR0cmlidXRlcy5tZXNlY05heml2ID0gb2Jkb2JqZUVsZW1lbnQuYXR0cihcImRhdGEtbWVzZWMtbmF6aXZcIik7XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhQXR0cmlidXRlcztcclxuICAgIH1cclxuICAgIFxyXG4gICAgc2V0T2Jkb2JqZURhdGFBdHRyaWJ1dGVzKGlkOiBzdHJpbmcsIHZhbHVlczogT2Jkb2JqZWZpbHRlclZhbHVlcyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnQXR0ZW5kYW5jZUFsbEVtcGxveWVlc0FuYWx5c2lzVmlldy5zZXRPYmRvYmplRGF0YUF0dHJpYnV0ZXNcIik7XHJcblxyXG4gICAgICAgIGxldCBvYmRvYmplRWxlbWVudCA9ICQoaWQpO1xyXG5cclxuICAgICAgICBpZiAodmFsdWVzLmxldG8gIT0gbnVsbCAmJiB2YWx1ZXMubWVzZWMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvYmRvYmplRWxlbWVudC5hdHRyKFwiZGF0YS1sZXRvXCIsIHZhbHVlcy5sZXRvKTtcclxuICAgICAgICAgICAgb2Jkb2JqZUVsZW1lbnQuYXR0cihcImRhdGEtbWVzZWNcIiwgdmFsdWVzLm1lc2VjKTtcclxuICAgICAgICAgICAgb2Jkb2JqZUVsZW1lbnQuYXR0cihcImRhdGEtbWVzZWMtbmF6aXZcIiwgdmFsdWVzLm1lc2VjTmF6aXYpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZXRPYmRvYmplVGV4dCh0aGlzLl9vYmRvYmplSWQpO1xyXG4gICAgICAgIH0gXHJcbiAgICB9XHJcblxyXG4gICAgYmluZEdyaWRFdmVudHMoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzQW5hbHlzaXNWaWV3LmJpbmRHcmlkRXZlbnRzXCIpO1xyXG5cclxuICAgICAgICB0aGlzLmluaXRXZWJHcmlkMSgpOyAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgb2Jkb2JqZUNsaWNrKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnQXR0ZW5kYW5jZUFsbEVtcGxveWVlc0FuYWx5c2lzVmlldy5vYmRvYmplQ2xpY2tcIik7XHJcbiAgICAgICAgJCh0aGlzLl9jYWxlbmRhckljb25JZCkudHJpZ2dlcihcImNsaWNrXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGFmdGVyUG9wb3ZlclNob3coKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzQW5hbHlzaXNWaWV3LmFmdGVyUG9wb3ZlclNob3dcIik7XHJcblxyXG4gICAgICAgIGxldCBvYmRvYmplRGF0YSA9IHRoaXMuZ2V0T2Jkb2JqZURhdGFBdHRyaWJ1dGVzKHRoaXMuX29iZG9iamVJZCk7XHJcblxyXG4gICAgICAgIC8vIG9zdmV6aW1vIHZyZWRub3N0aSBmaWx0cm92IGl6IGRhdGEgYXR0cmlidXRlc1xyXG4gICAgICAgIHRoaXMuc2V0T2Jkb2JqZUZpbHRlclZhbHVlcyhvYmRvYmplRGF0YSk7XHJcblxyXG4gICAgICAgIC8vIHByaWthemkgb2tub1xyXG4gICAgICAgIHZhciBmaWx0ZXJCb2R5ID0gJChcImRpdi5wb3BvdmVyLnNob3dcIikuZmluZChcIiNwb3BPdmVyT2Jkb2JqZUJvZHlcIik7XHJcbiAgICAgICAgZmlsdGVyQm9keS5zaG93KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8ga2xpayBuYSBndW1iIHRyZW51dG5pIHYgcG9wb3ZlciBmaWx0cnUgemEgb2Jkb2JqZVxyXG4gICAgb2Jkb2JqZUN1cnJlbnRNb250aCgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNBbmFseXNpc1ZpZXcub2Jkb2JqZUN1cnJlbnRNb250aFwiKTtcclxuXHJcbiAgICAgICAgbGV0IGN1cnJlbnRNb250aEZpbHRlclZhbHVlcyA9IG5ldyBPYmRvYmplZmlsdGVyVmFsdWVzKCk7XHJcblxyXG4gICAgICAgIGN1cnJlbnRNb250aEZpbHRlclZhbHVlcy5sZXRvID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpO1xyXG4gICAgICAgIGN1cnJlbnRNb250aEZpbHRlclZhbHVlcy5tZXNlYyA9IG5ldyBEYXRlKCkuZ2V0TW9udGgoKSArIDE7XHJcbiAgICAgICAgY3VycmVudE1vbnRoRmlsdGVyVmFsdWVzLm1lc2VjTmF6aXYgPSB0aGlzLmdldE1vbnRoTmFtZShjdXJyZW50TW9udGhGaWx0ZXJWYWx1ZXMubWVzZWMpO1xyXG5cclxuICAgICAgICAvLyB6YXBpc2VtbyB2cmVkbm9zdCB2IGZpbHRlciBsZXRvXHJcbiAgICAgICAgdGhpcy5zZXRPYmRvYmplRmlsdGVyVmFsdWVzKGN1cnJlbnRNb250aEZpbHRlclZhbHVlcyk7XHJcblxyXG4gICAgICAgIC8vIG9zdmV6aW1vIG9iZG9iamUgZWxlbWVudCB6IG5vdmltaSBwb2RhdGtpXHJcbiAgICAgICAgdGhpcy5zZXRPYmRvYmplRGF0YUF0dHJpYnV0ZXModGhpcy5fb2Jkb2JqZUlkLCBjdXJyZW50TW9udGhGaWx0ZXJWYWx1ZXMpO1xyXG5cclxuICAgICAgICAvLyBvc3ZlemltbyB0YWJlbG8gcG9kYXRrb3YgdnNlaCB6YXBvc2xlbmloXHJcbiAgICAgICAgdGhpcy5yZWZyZXNoQWxsRW1wbG95ZWVzVGFibGUoY3VycmVudE1vbnRoRmlsdGVyVmFsdWVzLmxldG8sIGN1cnJlbnRNb250aEZpbHRlclZhbHVlcy5tZXNlYyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbmEgcG9wb3ZlciBmaWx0cnUgemEgb2Jkb2JqZSBwb21payB6YSBlbiBtZXNlYyBuYXByZWosIG5hemFqXHJcbiAgICBvYmRvYmplZmlsdGVyc01vbnRoU3RlcENoYW5nZShzdGVwOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fcmVmcmVzaGluZ0FsbEVtcGxveWVlc1RhYmxlID09IHRydWUpIHtcclxuICAgICAgICAgICAgLy8gcG90ZWthIHBvc3RvcGVrIG9zdmV6ZXZhbmphIHBvZGF0a292LCBub3ZpIHphaHRldmVrIG5pIGRvdm9samVuIFxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNBbmFseXNpc1ZpZXcub2Jkb2JqZWZpbHRlcnNNb250aFN0ZXBDaGFuZ2VcIik7XHJcblxyXG4gICAgICAgIC8vIHByZWJlcmVtbyB2cmVkbm9zdGkgbGV0byBpbiBtZXNlY1xyXG4gICAgICAgIGxldCBmaWx0ZXJWYWx1ZXMgPSB0aGlzLmdldE9iZG9iamVmaWx0ZXJWYWx1ZXMoKTtcclxuXHJcbiAgICAgICAgbGV0IG5ld0ZpbHRlclZhbHVlcyA9IG5ldyBPYmRvYmplZmlsdGVyVmFsdWVzKCk7XHJcbiAgICAgICAgbmV3RmlsdGVyVmFsdWVzLm1lc2VjID0gZmlsdGVyVmFsdWVzLm1lc2VjICsgc3RlcDtcclxuICAgICAgICBuZXdGaWx0ZXJWYWx1ZXMubGV0byA9IGZpbHRlclZhbHVlcy5sZXRvO1xyXG4gICAgICAgIGlmIChuZXdGaWx0ZXJWYWx1ZXMubWVzZWMgPT0gMTMpIHtcclxuICAgICAgICAgICAgLy8gemEgZGVjZW1iZXIgamUgamFudWFyXHJcbiAgICAgICAgICAgIG5ld0ZpbHRlclZhbHVlcy5tZXNlYyA9IDE7XHJcbiAgICAgICAgICAgIG5ld0ZpbHRlclZhbHVlcy5sZXRvID0gbmV3RmlsdGVyVmFsdWVzLmxldG8gKyAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChuZXdGaWx0ZXJWYWx1ZXMubWVzZWMgPT0gMCkge1xyXG4gICAgICAgICAgICAvLyBwcmVkIGphbnVhcmplbSBqZSBkZWNlbWJlclxyXG4gICAgICAgICAgICBuZXdGaWx0ZXJWYWx1ZXMubWVzZWMgPSAxMjtcclxuICAgICAgICAgICAgbmV3RmlsdGVyVmFsdWVzLmxldG8gPSBuZXdGaWx0ZXJWYWx1ZXMubGV0byAtIDE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBwb2lzY2VtbyBzZSBuYXppdiBtZXNlY2FcclxuICAgICAgICBuZXdGaWx0ZXJWYWx1ZXMubWVzZWNOYXppdiA9IHRoaXMuZ2V0TW9udGhOYW1lKG5ld0ZpbHRlclZhbHVlcy5tZXNlYyk7XHJcblxyXG4gICAgICAgIC8vIHphcGlzZW1vIG5vdm8gdnJlZG5vc3QgdiBmaWx0ZXIgbGV0b1xyXG4gICAgICAgIHRoaXMuc2V0T2Jkb2JqZUZpbHRlclZhbHVlcyhuZXdGaWx0ZXJWYWx1ZXMpO1xyXG5cclxuICAgICAgICAvLyBvc3ZlemltbyBvYmRvYmplIGVsZW1lbnQgeiBub3ZpbWkgcG9kYXRraVxyXG4gICAgICAgIHRoaXMuc2V0T2Jkb2JqZURhdGFBdHRyaWJ1dGVzKHRoaXMuX29iZG9iamVJZCwgbmV3RmlsdGVyVmFsdWVzKTtcclxuXHJcbiAgICAgICAgLy8gb3N2ZXppbW8gdGFiZWxvIHBvZGF0a292IHZzZWggemFwb3NsZW5paFxyXG4gICAgICAgIHRoaXMucmVmcmVzaEFsbEVtcGxveWVlc1RhYmxlKG5ld0ZpbHRlclZhbHVlcy5sZXRvLCBuZXdGaWx0ZXJWYWx1ZXMubWVzZWMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE1vbnRoTmFtZShtb250aDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNBbmFseXNpc1ZpZXcuZ2V0TW9udGhOYW1lXCIpO1xyXG5cclxuICAgICAgICBsZXQgbWVzZWNFbGVtZW50ID0gJChcImRpdi5wb3BvdmVyLnNob3dcIikuZmluZCh0aGlzLl9vYmRvYmplRmlsdGVyTWVzZWNJZCk7XHJcbiAgICAgICAgaWYgKG1lc2VjRWxlbWVudC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuICQobWVzZWNFbGVtZW50KS5maW5kKFwiIG9wdGlvblt2YWx1ZSA9ICdcIiArIG1vbnRoICsgXCInXVwiKS50ZXh0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gXCJcIjtcclxuICAgIH1cclxuXHJcbiAgICBlbmFibGVEaXNhYmxlT2Jkb2JqZUZpbHRlcnMoZGlzYWJsZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnQXR0ZW5kYW5jZUFsbEVtcGxveWVlc0FuYWx5c2lzVmlldy5lbmFibGVEaXNhYmxlT2Jkb2JqZUZpbHRlcnNcIik7XHJcblxyXG4gICAgICAgIC8vIGxldG9cclxuICAgICAgICBsZXQgbGV0b0VsZW1lbnQgPSAkKFwiZGl2LnBvcG92ZXIuc2hvd1wiKS5maW5kKHRoaXMuX29iZG9iamVGaWx0ZXJMZXRvSWQpO1xyXG4gICAgICAgIGlmIChsZXRvRWxlbWVudC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgbGV0b0VsZW1lbnQucHJvcChcImRpc2FibGVkXCIsIGRpc2FibGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gbWVzZWNcclxuICAgICAgICBsZXQgbWVzZWNFbGVtZW50ID0gJChcImRpdi5wb3BvdmVyLnNob3dcIikuZmluZCh0aGlzLl9vYmRvYmplRmlsdGVyTWVzZWNJZCk7XHJcbiAgICAgICAgaWYgKG1lc2VjRWxlbWVudC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgbWVzZWNFbGVtZW50LnByb3AoXCJkaXNhYmxlZFwiLCBkaXNhYmxlKTtcclxuICAgICAgICB9ICBcclxuXHJcbiAgICAgICAgLy8gZ3VtYiB0cmVudXRuaVxyXG4gICAgICAgIGxldCBfb2Jkb2JqZUN1cnJlbnRCdG5FbGVtZW50ID0gJChcImRpdi5wb3BvdmVyLnNob3dcIikuZmluZCh0aGlzLl9vYmRvYmplQ3VycmVudEJ0bklkKTtcclxuICAgICAgICBpZiAoX29iZG9iamVDdXJyZW50QnRuRWxlbWVudC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgX29iZG9iamVDdXJyZW50QnRuRWxlbWVudC5wcm9wKFwiZGlzYWJsZWRcIiwgZGlzYWJsZSk7XHJcbiAgICAgICAgfSBcclxuICAgIH1cclxuXHJcbiAgICBzZXRPYmRvYmplRmlsdGVyVmFsdWVzKGZpbHRlclZhbHVlczogT2Jkb2JqZWZpbHRlclZhbHVlcyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnQXR0ZW5kYW5jZUFsbEVtcGxveWVlc0FuYWx5c2lzVmlldy5zZXRPYmRvYmplRmlsdGVyVmFsdWVzXCIpO1xyXG5cclxuICAgICAgICBsZXQgb2xkZmlsdGVyVmFsdWVzID0gdGhpcy5nZXRPYmRvYmplZmlsdGVyVmFsdWVzKCk7XHJcblxyXG4gICAgICAgIC8vIGxldG9cclxuICAgICAgICBpZiAob2xkZmlsdGVyVmFsdWVzLmxldG8gIT0gZmlsdGVyVmFsdWVzLmxldG8pIHtcclxuICAgICAgICAgICAgbGV0IGxldG9FbGVtZW50ID0gJChcImRpdi5wb3BvdmVyLnNob3dcIikuZmluZCh0aGlzLl9vYmRvYmplRmlsdGVyTGV0b0lkKTtcclxuICAgICAgICAgICAgaWYgKGxldG9FbGVtZW50Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgbGV0b0VsZW1lbnQudmFsKGZpbHRlclZhbHVlcy5sZXRvKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gbWVzZWNcclxuICAgICAgICBpZiAob2xkZmlsdGVyVmFsdWVzLm1lc2VjICE9IGZpbHRlclZhbHVlcy5tZXNlYykge1xyXG4gICAgICAgICAgICBsZXQgbWVzZWNFbGVtZW50ID0gJChcImRpdi5wb3BvdmVyLnNob3dcIikuZmluZCh0aGlzLl9vYmRvYmplRmlsdGVyTWVzZWNJZCk7XHJcbiAgICAgICAgICAgIGlmIChtZXNlY0VsZW1lbnQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBtZXNlY0VsZW1lbnQudmFsKGZpbHRlclZhbHVlcy5tZXNlYy50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgfSAgXHJcbiAgICAgICAgfSBcclxuICAgIH1cclxuXHJcbiAgICAvLyB2cmVkbm9zdGkgdiBmaWx0cnUgbGV0bywgbWVzZWMgc28gc2Ugc3ByZW1lbmlsZVxyXG4gICAgb2Jkb2JqZWZpbHRlcnNDaGFuZ2VkKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnQXR0ZW5kYW5jZUFsbEVtcGxveWVlc0FuYWx5c2lzVmlldy5vYmRvYmplZmlsdGVyc0NoYW5nZWRcIik7XHJcblxyXG4gICAgICAgIC8vIHByZWJlcmVtbyB2cmVkbm9zdGkgbGV0byBpbiBtZXNlY1xyXG4gICAgICAgIGxldCBmaWx0ZXJWYWx1ZXMgPSB0aGlzLmdldE9iZG9iamVmaWx0ZXJWYWx1ZXMoKTtcclxuXHJcbiAgICAgICAgLy8gb3N2ZXppbW8gb2Jkb2JqZSBlbGVtZW50IHogbm92aW1pIHBvZGF0a2lcclxuICAgICAgICB0aGlzLnNldE9iZG9iamVEYXRhQXR0cmlidXRlcyh0aGlzLl9vYmRvYmplSWQsIGZpbHRlclZhbHVlcyk7XHJcblxyXG4gICAgICAgIHRoaXMucmVmcmVzaEFsbEVtcGxveWVlc1RhYmxlKGZpbHRlclZhbHVlcy5sZXRvLCBmaWx0ZXJWYWx1ZXMubWVzZWMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE9iZG9iamVmaWx0ZXJWYWx1ZXMoKTogT2Jkb2JqZWZpbHRlclZhbHVlcyB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzQW5hbHlzaXNWaWV3LmdldE9iZG9iamVmaWx0ZXJWYWx1ZXNcIik7XHJcblxyXG4gICAgICAgIGxldCBmaWx0ZXJWYWx1ZXMgPSBuZXcgT2Jkb2JqZWZpbHRlclZhbHVlcygpO1xyXG4gICAgICAgIGZpbHRlclZhbHVlcy5sZXRvID0gbnVsbDtcclxuICAgICAgICBmaWx0ZXJWYWx1ZXMubWVzZWMgPSBudWxsO1xyXG4gICAgICAgIGZpbHRlclZhbHVlcy5tZXNlY05heml2ID0gXCJcIjtcclxuXHJcbiAgICAgICAgLy8gZG9sb2NpbW8gbGV0b1xyXG4gICAgICAgIGxldCBsZXRvRWxlbWVudCA9ICQoXCJkaXYucG9wb3Zlci5zaG93XCIpLmZpbmQodGhpcy5fb2Jkb2JqZUZpbHRlckxldG9JZCk7XHJcbiAgICAgICAgaWYgKGxldG9FbGVtZW50Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICBsZXQgbGV0b1N0ciA9IFN0cmluZyhsZXRvRWxlbWVudC52YWwoKSk7XHJcbiAgICAgICAgICAgIGlmIChsZXRvU3RyLmxlbmd0aCA9PSA0IHx8IGxldG9TdHIubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgIGlmIChsZXRvU3RyLmxlbmd0aCA9PSA0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyVmFsdWVzLmxldG8gPSArbGV0b1N0cjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyBkb2xvY2ltbyBtZXNlY1xyXG4gICAgICAgIGxldCBtZXNlY0VsZW1lbnQgPSAkKFwiZGl2LnBvcG92ZXIuc2hvd1wiKS5maW5kKHRoaXMuX29iZG9iamVGaWx0ZXJNZXNlY0lkKTtcclxuICAgICAgICBpZiAobWVzZWNFbGVtZW50Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICBsZXQgc2VsTWVzZWNOYXppdiA9ICQobWVzZWNFbGVtZW50KS5maW5kKFwiOnNlbGVjdGVkXCIpLnRleHQoKTtcclxuICAgICAgICAgICAgbGV0IHNlbE1lc2VjID0gJChtZXNlY0VsZW1lbnQpLmZpbmQoXCI6c2VsZWN0ZWRcIikudmFsKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWlzTmFOKCtzZWxNZXNlYykpIHtcclxuICAgICAgICAgICAgICAgIGZpbHRlclZhbHVlcy5tZXNlYyA9ICtzZWxNZXNlY1xyXG4gICAgICAgICAgICAgICAgZmlsdGVyVmFsdWVzLm1lc2VjTmF6aXYgPSBzZWxNZXNlY05heml2XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmaWx0ZXJWYWx1ZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaEFsbEVtcGxveWVlc1RhYmxlKGxldG86IG51bWJlciwgbWVzZWM6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnQXR0ZW5kYW5jZUFsbEVtcGxveWVlc0FuYWx5c2lzVmlldy5yZWZyZXNoQWxsRW1wbG95ZWVzVGFibGVcIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgbGV0IHNhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgICAgIGxldCBwYXJhbXMgPSB7IGxldG86IGxldG8sIG1lc2VjOiBtZXNlYyB9O1xyXG4gICAgICAgIHRoaXMuX3JlZnJlc2hpbmdBbGxFbXBsb3llZXNUYWJsZSA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuZW5hYmxlRGlzYWJsZU9iZG9iamVGaWx0ZXJzKHRoaXMuX3JlZnJlc2hpbmdBbGxFbXBsb3llZXNUYWJsZSk7XHJcblxyXG4gICAgICAgIHNhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICQoX3RoaXMuX3RhYmxlRGl2SWQpLmh0bWwocmVzcG9uc2UpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGN1cnJlbnRfbW9udGggPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICB2YXIgcHJldmlvdXNfbW9udGggPSBuZXcgRGF0ZShuZXcgRGF0ZShjdXJyZW50X21vbnRoKS5zZXRNb250aChjdXJyZW50X21vbnRoLmdldE1vbnRoKCkgLSAxKSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY3VycmVudF9tb250aC5nZXRGdWxsWWVhcigpID09IGxldG8gJiYgY3VycmVudF9tb250aC5nZXRNb250aCgpICsgMSA9PSBtZXNlYykge1xyXG4gICAgICAgICAgICAgICAgJCgnLmQtY3VycmVudC1tb250aCcpLnJlbW92ZUNsYXNzKCdkLW5vbmUnKTtcclxuICAgICAgICAgICAgICAgICQoJy5kLWN1cnJlbnQtbW9udGgnKS5yZW1vdmVDbGFzcygnZWxlbWVudC1oaWRkZW4nKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICQoJy5kLWN1cnJlbnQtbW9udGgnKS5hZGRDbGFzcygnZC1ub25lJyk7XHJcbiAgICAgICAgICAgICAgICAkKCcuZC1jdXJyZW50LW1vbnRoJykuYWRkQ2xhc3MoJ2VsZW1lbnQtaGlkZGVuJyk7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNfbW9udGguZ2V0RnVsbFllYXIoKSA9PSBsZXRvICYmIHByZXZpb3VzX21vbnRoLmdldE1vbnRoKCkgKyAxID09IG1lc2VjKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnLmQtcHJldmlvdXMtbW9udGgnKS5yZW1vdmVDbGFzcygnZC1ub25lJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnLmQtcHJldmlvdXMtbW9udGgnKS5yZW1vdmVDbGFzcygnZWxlbWVudC1oaWRkZW4nKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnLmQtcHJldmlvdXMtbW9udGgnKS5hZGRDbGFzcygnZC1ub25lJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnLmQtcHJldmlvdXMtbW9udGgnKS5hZGRDbGFzcygnZWxlbWVudC1oaWRkZW4nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgX3RoaXMuaW5pdFdlYkdyaWQxKCk7ICAgICBcclxuXHJcbiAgICAgICAgICAgIF90aGlzLl9yZWZyZXNoaW5nQWxsRW1wbG95ZWVzVGFibGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgX3RoaXMuZW5hYmxlRGlzYWJsZU9iZG9iamVGaWx0ZXJzKF90aGlzLl9yZWZyZXNoaW5nQWxsRW1wbG95ZWVzVGFibGUpO1xyXG5cclxuICAgICAgICAgICAgLy8gaXp2ZWRlbW8gc2UgZmlsdGVyIHZyc3RpYyB0YWJlbGUgZ2xlZGUgb3puYWNlbmloIHphcG9zbGVuaWhcclxuICAgICAgICAgICAgbGV0IGl6YnJhbmlaYXBvc2xlbmkgPSA8c3RyaW5nW10+KF90aGlzLl9zZWxlY3RPcmdGaWx0ZXIuX3NlbGVjdFphcG9zbGVuaS5zZWxlY3RlZENCLnZhbCgpKTtcclxuICAgICAgICAgICAgX3RoaXMuX3NlbGVjdE9yZ0ZpbHRlci5fc2VsZWN0WmFwb3NsZW5pLnNldFNlbGVjdFZhbHVlcyhpemJyYW5pWmFwb3NsZW5pKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHJlZnJlc2ggb3B0aW9ucyBvZiBzZWxlY3REb2dvZGVrIGh0bWwgY29udHJvbFxyXG4gICAgICAgICAgICBfdGhpcy5yZWZyZXNoU2VsZWN0RG9nb2Rla09wdGlvbnMoKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHNhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjogXCJSRUdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzQW5hbHlzaXMvR2V0QWxsRW1wbG95ZWVzQW5hbHlzaXNUYWJsZVwiXHJcbiAgICAgICAgICAgICwgZGF0YTogcGFyYW1zXHJcbiAgICAgICAgICAgICwgdHlwZTogXCJHRVRcIlxyXG4gICAgICAgICAgICAsIHNwaW5uZXJEaXZJZDogXCIjYXR0ZW5kYW5jZUFsbEVtcGxveWVlc0FuYWx5c2lzTG9hZGluZ1wiXHJcbiAgICAgICAgfSk7ICAgIFxyXG5cclxuICAgIH1cclxuXHJcbiAgICBhZnRlclJlZnJlc2hUb2RheURhdGEoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImFmdGVyUmVmcmVzaFRvZGF5RGF0YVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0VGFibGVIZWlnaHQoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzQW5hbHlzaXNWaWV3LnNldFRhYmxlSGVpZ2h0XCIpO1xyXG5cclxuICAgICAgICBsZXQgX2hlaWdodCA9ICQoJyNncmlkLXRvb2xiYXItcHJvY2Vzc2VkJykuaGVpZ2h0KCk7XHJcbiAgICAgICAgbGV0IHJlbWFpbmluZ19oZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSBfaGVpZ2h0IC0gMjQ1O1xyXG4gICAgICAgICQoJyNhdHRlbmRhbmNlQWxsRW1wbG95ZWVzVGFibGVfd3JhcHBlcicpLmhlaWdodChyZW1haW5pbmdfaGVpZ2h0KTsgICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRFdmVudEJpbmRpbmdzKCk6IHZvaWR7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzQW5hbHlzaXNWaWV3LnNldEV2ZW50QmluZGluZ3NcIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIF90aGlzLnNldFRhYmxlSGVpZ2h0KCk7XHJcbiAgICAgICAgd2luZG93Lm9ucmVzaXplID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBfdGhpcy5zZXRUYWJsZUhlaWdodCgpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwcml2YXRlIHJlZnJlc2hTZWxlY3REb2dvZGVrT3B0aW9ucygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNBbmFseXNpc1ZpZXcucmVmcmVzaFNlbGVjdERvZ29kZWtPcHRpb25zXCIpO1xyXG5cclxuICAgICAgICBsZXQgb3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBbXTtcclxuXHJcbiAgICAgICAgLy8gcHJlYmVyZW1vIG9wdGlvbnMgaXogaGlkZGVudCBzZWxlY3Qga29udHJvbGVcclxuICAgICAgICAkKHRoaXMuX3NlbGVjdERvZ29kZWtIaWRkZW5JZCArIFwiIG9wdGlvblwiKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgb3B0aW9ucy5wdXNoKHsgdmFsdWU6ICQodGhpcykudmFsKCkudG9TdHJpbmcoKSwgdGV4dDogJCh0aGlzKS50ZXh0KCkgfSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3NlbGVjdERvZ29kZWsucmVmcmVzaEh0bWxPcHRpb25zKG9wdGlvbnMsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZmlsdGVyRXZlbnRDb2x1bW5zKGVsZW1lbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnQXR0ZW5kYW5jZUFsbEVtcGxveWVlc0FuYWx5c2lzVmlldy5maWx0ZXJFdmVudENvbHVtbnNcIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgbGV0IGl6YnJhbmVTaWZyZURvZ29ka292ID0gPHN0cmluZz4oZWxlbWVudC52YWwoKS50b1N0cmluZygpKTtcclxuICAgICAgICBsZXQgaXpicmFuZVNpZnJlRG9nb2Rrb3ZBcnJheSA9IGl6YnJhbmVTaWZyZURvZ29ka292LnNwbGl0KFwiLFwiKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBldmVudCBzdG9scGNpLWhlYWRlcmppXHJcbiAgICAgICAgJCh0aGlzLl90YWJsZUlkICsgXCIgdGhlYWQgdHIgdGguc2FvcC10YWJsZS1jb2wtZXZlbnRcIikuZWFjaChmdW5jdGlvbiAoaW5kZXgsIHRhYmxlQ2VsbEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgX3RoaXMuc2hvd0hpZGVUYWJsZUV2ZW50Q2VsbCh0YWJsZUNlbGxFbGVtZW50LCBpemJyYW5lU2lmcmVEb2dvZGtvdkFycmF5KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gZXZlbnQgc3RvbHBjaS1wb2RhdGtpXHJcbiAgICAgICAgJCh0aGlzLl90YWJsZUlkICsgXCIgdGJvZHkgdGQuc2FvcC10YWJsZS1jb2wtZXZlbnRcIikuZWFjaChmdW5jdGlvbiAoaW5kZXgsIHRhYmxlQ2VsbEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgX3RoaXMuc2hvd0hpZGVUYWJsZUV2ZW50Q2VsbCh0YWJsZUNlbGxFbGVtZW50LCBpemJyYW5lU2lmcmVEb2dvZGtvdkFycmF5KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNob3dIaWRlVGFibGVFdmVudENlbGwoZWxlbWVudDogSFRNTEVsZW1lbnQsIHNpZnJlRG9nb2Rrb3ZBcnJheTogc3RyaW5nW10pOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNBbmFseXNpc1ZpZXcuZmlsdGVyRXZlbnRDb2x1bW5zXCIpO1xyXG5cclxuICAgICAgICBsZXQgc2hvd1RhYmxlQ2VsbEVsZW1lbnQgPSBmYWxzZTtcclxuICAgICAgICBsZXQgJHRhYmxlQ2VsbEVsZW1lbnQgPSAkKGVsZW1lbnQpO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpZnJlRG9nb2Rrb3ZBcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoJHRhYmxlQ2VsbEVsZW1lbnQuaGFzQ2xhc3MoXCJzYW9wLXRhYmxlLWNvbC1ldmVudC1cIiArIHNpZnJlRG9nb2Rrb3ZBcnJheVtpXS50b0xvd2VyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgICAgICAgc2hvd1RhYmxlQ2VsbEVsZW1lbnQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2hvd1RhYmxlQ2VsbEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgJHRhYmxlQ2VsbEVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJlbGVtZW50LWhpZGRlblwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICR0YWJsZUNlbGxFbGVtZW50LmFkZENsYXNzKFwiZWxlbWVudC1oaWRkZW5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBleHBvcnRDc3YoKSB7XHJcbiAgICAgICAgbGV0IHNhb3BFeHBvcnQgPSBuZXcgU2FvcEV4cG9ydCgpO1xyXG5cclxuICAgICAgICBzYW9wRXhwb3J0LmV4cG9ydFRhYmxlRGF0YTJDc3YodGhpcy5fdGFibGVJZCwgdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiWmJpcm5payB1ciB6YXBvc2xlbmloXCIpK1wiLmNzdlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZmlsdGVyWmFwb3NsZW5pVGFibGVSb3dzKCkge1xyXG4gICAgICAgIC8vIERlY2xhcmUgdmFyaWFibGVzXHJcbiAgICAgICAgdmFyIHRhYmxlLCB0ciwgX3Jvd0lkLCBpLCB0eHRWYWx1ZTtcclxuICAgICAgICB0YWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYXR0ZW5kYW5jZUFsbEVtcGxveWVlc0FuYWx5c2lzVGFibGVcIik7XHJcbiAgICAgICAgdHIgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRyXCIpO1xyXG5cclxuICAgICAgICAvL3NrdXBpbmUgLSB6YXBvc2xlbmkgemEgcHJpa2F6XHJcbiAgICAgICAgbGV0IG11bHRpc2VsZWN0WmFwb3NsZW5pID0gdGhpcy5fc2VsZWN0T3JnRmlsdGVyLl9zZWxlY3RaYXBvc2xlbmkuc2VsZWN0ZWRDQjtcclxuICAgICAgICBsZXQgZmlsdGVyWmFwb3NsZW5pID0gPHN0cmluZz4obXVsdGlzZWxlY3RaYXBvc2xlbmkudmFsKCkudG9TdHJpbmcoKSk7XHJcblxyXG4gICAgICAgIC8vZG9kYXRuaSBwb2dvamlcclxuICAgICAgICBsZXQgcHJpa2F6aVRlZGVuc2thUHJla29yYWNpdGV2ID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IHByaWthemlNZXNlY25hUHJla29yYWNpdGV2ID0gZmFsc2U7IFxyXG4gICAgICAgIGlmICh0aGlzLl9zZWxlY3RQcmlrYXpQb2RhdGtpKSB7XHJcbiAgICAgICAgICAgIGxldCBlbGVtZW50ID0gdGhpcy5fc2VsZWN0UHJpa2F6UG9kYXRraS5zZWxlY3RlZENCO1xyXG5cclxuICAgICAgICAgICAgLy8gcHJlYmVyZW1vLCBrYXRlcmUgc2lmcmUgemFwb3NsZW5paCBzb2Rpam8gdiBpemJyYW5lIHNrdXBpbmVcclxuICAgICAgICAgICAgbGV0IGl6YnJhbmlEb2RhdG5pUG9nb2ppID0gPHN0cmluZz4oZWxlbWVudC52YWwoKS50b1N0cmluZygpKTtcclxuXHJcbiAgICAgICAgICAgIHByaWthemlUZWRlbnNrYVByZWtvcmFjaXRldiA9IChpemJyYW5pRG9kYXRuaVBvZ29qaS50b1VwcGVyQ2FzZSgpLmluZGV4T2YoXCJURURcIikgPiAtMSkgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgICAgICAgIHByaWthemlNZXNlY25hUHJla29yYWNpdGV2ID0gKGl6YnJhbmlEb2RhdG5pUG9nb2ppLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihcIk1FU1wiKSA+IC0xKSA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHRhYmxlIHJvd3MsIGFuZCBoaWRlIHRob3NlIHdobyBkb24ndCBtYXRjaCB0aGUgc2VhcmNoIHF1ZXJ5XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIF9yb3dJZCA9IG51bGw7XHJcbiAgICAgICAgICAgIGxldCBfdHJJZCA9ICQodHJbaV0pLmF0dHIoXCJkYXRhLXNpZnJhLXphcG9zbGVuaVwiKTtcclxuICAgICAgICAgICAgaWYgKCFpc1VuRGVmaW5lZChfdHJJZCkpIHtcclxuICAgICAgICAgICAgICAgIF9yb3dJZCA9IF90cklkLnRvU3RyaW5nKClcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKF9yb3dJZCkge1xyXG4gICAgICAgICAgICAgICAgdHh0VmFsdWUgPSBfcm93SWQudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgIGlmIChpc0VtcHR5KGZpbHRlclphcG9zbGVuaSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAkKHRyW2ldKS5hZGRDbGFzcyhcImVsZW1lbnQtaGlkZGVuXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZmlsdGVyWmFwb3NsZW5pLnRvVXBwZXJDYXNlKCkuaW5kZXhPZih0eHRWYWx1ZSkgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByb3cgPSAkKHRyW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICByb3cucmVtb3ZlQ2xhc3MoXCJlbGVtZW50LWhpZGRlblwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy9kb2RhdG5pIHBvZ29qaVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmlrYXppVGVkZW5za2FQcmVrb3JhY2l0ZXYgfHwgcHJpa2F6aU1lc2VjbmFQcmVrb3JhY2l0ZXYpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm93LmFkZENsYXNzKFwiZWxlbWVudC1oaWRkZW5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmlrYXppVGVkZW5za2FQcmVrb3JhY2l0ZXYgJiYgcm93Lmhhc0NsYXNzKFwidGVkZW5za2lQb2RhdGtpLW5hZHVyZS1lcnJvclwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93LnJlbW92ZUNsYXNzKFwiZWxlbWVudC1oaWRkZW5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByaWthemlNZXNlY25hUHJla29yYWNpdGV2ICYmIHJvdy5oYXNDbGFzcyhcIm1lc2VjbmlQb2RhdGtpLW5hZHVyZS1lcnJvclwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93LnJlbW92ZUNsYXNzKFwiZWxlbWVudC1oaWRkZW5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICQodHJbaV0pLmFkZENsYXNzKFwiZWxlbWVudC1oaWRkZW5cIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwsIGlzRW1wdHksIGlzVW5EZWZpbmVkIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wU2VydmljZXNDb3JlIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC1zZXJ2aWNlcy1jb3JlXCI7XHJcbmltcG9ydCB7IFNhb3BXZWJHcmlkLCBTYW9wV2ViR3JpZFByb3BlcnRpZXMsIFNhb3BXZWJEYXRhVGFibGUgfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLWdyaWRcIjtcclxuaW1wb3J0IHsgU2FvcFdlYkdyaWRVbml0T3JnRmlsdGVyIH0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC1ncmlkLWZpbHRlci1Vbml0T3JnXCI7XHJcbmltcG9ydCB7IFNhb3BTZWxlY3RNb250aFllYXIgfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLXNlbGVjdC1tb250aC15ZWFyXCI7XHJcbmltcG9ydCB7IFNhb3BSZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzRXhjZXNzSG91cnNWaWV3IH0gZnJvbSBcIi4uL1JFRy9zYW9wLXJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNFeGNlc3NIb3Vycy12aWV3XCI7XHJcbmltcG9ydCB7IFNhb3BXZkFjdGlvbiB9IGZyb20gXCIuLi9Db3JlL3Nhb3Atdmlldy1mb3JtXCI7XHJcblxyXG5lbnVtIEV4Y2Vzc0hvdXJzQWN0aW9uVHlwZSB7XHJcbiAgICBDb25maXJtTXVsdGlwbGUgPSAwXHJcbiAgICAsIERlbGV0ZU11bHRpcGxlID0gMVxyXG4gICAgLCBQYXlvdXRNdWx0aXBsZSA9IDJcclxuICAgICwgVW5sb2NrTXVsdGlwbGUgPSAzXHJcbiAgICAsIENvbmNsdWRlTXVsdGlwbGUgPSA0XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wUmVnQXR0ZW5kYW5jZUFsbEVtcGxveWVlc0V4Y2Vzc0hvdXJzR3JpZCB7XHJcbiAgICBwdWJsaWMgX2xpYk5hbWU6IHN0cmluZztcclxuXHJcbiAgICBwcml2YXRlIF93ZWJncmlkOiBTYW9wV2ViR3JpZDtcclxuXHJcbiAgICAvL2ZpbHRyaSB0YWJlbGFcclxuICAgIHByaXZhdGUgX3NlbGVjdE9yZ0ZpbHRlcjogU2FvcFdlYkdyaWRVbml0T3JnRmlsdGVyO1xyXG4gICAgcHVibGljIF9zYW9wU2VsZWN0TW9udGhZZWFyRmlsdGVyOiBTYW9wU2VsZWN0TW9udGhZZWFyO1xyXG5cclxuICAgIC8vZWRpdCBmb3JtYVxyXG4gICAgcHJpdmF0ZSByZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzRXhjZXNzSG91cnNWaWV3OiBTYW9wUmVnQXR0ZW5kYW5jZUFsbEVtcGxveWVlc0V4Y2Vzc0hvdXJzVmlldztcclxuXHJcbiAgICBwcml2YXRlIF90YWJsZUlkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9yZWZyZXNoaW5nQWxsRW1wbG95ZWVzVGFibGU6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIF90YWJsZURpdklkOiBzdHJpbmc7XHJcblxyXG4gICAgY29uc3RydWN0b3IobGliTmFtZTogc3RyaW5nID0gXCJcIikge1xyXG4gICAgICAgIHRoaXMuX2xpYk5hbWUgPSBsaWJOYW1lO1xyXG4gICAgICAgIHRoaXMuX3JlZnJlc2hpbmdBbGxFbXBsb3llZXNUYWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3RhYmxlRGl2SWQgPSBcIiNhdHRlbmRhbmNlQWxsRW1wbG95ZWVzRXhjZXNzSG91cnNUYWJsZURpdlwiO1xyXG4gICAgICAgIHRoaXMuX3RhYmxlSWQgPSBcInRhYmxlUkVHQWxsRW1wbG95ZWVzRXhjZXNzSG91cnNcIjtcclxuXHJcbiAgICAgICAgdGhpcy5fc2VsZWN0T3JnRmlsdGVyID0gbmV3IFNhb3BXZWJHcmlkVW5pdE9yZ0ZpbHRlcihsaWJOYW1lLCBcIlwiKTtcclxuICAgICAgICB0aGlzLl9zZWxlY3RPcmdGaWx0ZXIgPSBuZXcgU2FvcFdlYkdyaWRVbml0T3JnRmlsdGVyKGxpYk5hbWUsIFwiXCIpO1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdE9yZ0ZpbHRlci5maWx0ZXJaYXBvc2xlbmlUYWJsZVJvd3MgPSB0aGlzLmZpbHRlclphcG9zbGVuaVRhYmxlUm93cy5iaW5kKHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLl9zYW9wU2VsZWN0TW9udGhZZWFyRmlsdGVyID0gbmV3IFNhb3BTZWxlY3RNb250aFllYXIoXCJcIiwgXCIjc2VsZWN0TWVzZWNMZXRvXCIsIHRoaXMuX2xpYk5hbWUgKyBcIi5fc2FvcFNlbGVjdE1vbnRoWWVhclwiKTtcclxuICAgICAgICB0aGlzLl9zYW9wU2VsZWN0TW9udGhZZWFyRmlsdGVyLmFmdGVyTW9udGhZZWFyVmFsdWVzQ2hhbmdlZCA9IHRoaXMuYWZ0ZXJTYW9wTW9udGhZZWFyVmFsdWVzQ2hhbmdlZC5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGVkaXRSZWNvcmQoeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyLCBlbXBsb3llZUlkOiBzdHJpbmcsIGVtcGxveWVlTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5yZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzRXhjZXNzSG91cnNWaWV3LmZ1bGxUaXRsZSA9IHRoaXMucmVnQXR0ZW5kYW5jZUFsbEVtcGxveWVlc0V4Y2Vzc0hvdXJzVmlldy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiT2JkZWxhdmEgdmnFoWthIHVyOiBcIikgKyBcIiBcIiArIGVtcGxveWVlSWQgKyBcIiAtIFwiICsgZW1wbG95ZWVOYW1lO1xyXG4gICAgICAgIHRoaXMucmVnQXR0ZW5kYW5jZUFsbEVtcGxveWVlc0V4Y2Vzc0hvdXJzVmlldy5zaG93Vmlld0Zvcm0oU2FvcFdmQWN0aW9uLndmYUVkaXRSZWNvcmQsIHsgbGV0bzogeWVhciwgbWVzZWM6IG1vbnRoLCBzaWZyYVphcG9zbGVuaTogZW1wbG95ZWVJZCB9KTtcclxuICAgIH07XHJcblxyXG4gICAgb25Jbml0VmlldygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNFeGNlc3NIb3Vyc0dyaWQub25Jbml0Vmlld1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzRXhjZXNzSG91cnNWaWV3ID0gbmV3IFNhb3BSZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzRXhjZXNzSG91cnNWaWV3KFwiI3JlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNFeGNlc3NIb3Vyc1ZpZXcwMDFcIiwgdGhpcy5fbGliTmFtZSArIFwiLnJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNFeGNlc3NIb3Vyc1ZpZXdcIik7XHJcbiAgICAgICAgdGhpcy5yZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzRXhjZXNzSG91cnNWaWV3LnJlZnJlc2hEYXRhID0gdGhpcy5yZWZyZXNoQWxsRW1wbG95ZWVzVGFibGUuYmluZCh0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWZyZXNoQWxsRW1wbG95ZWVzRm9ybSgpO1xyXG5cclxuICAgICAgICB0aGlzLnNldE11bHRpcGxlQ29uZmlybURlbnlCdXR0b25zRW5hYmxlRGlzYWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRGaWx0ZXJDb250cm9scygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNFeGNlc3NIb3Vyc0dyaWQuaW5pdEZpbHRlckNvbnRyb2xzXCIpO1xyXG5cclxuICAgICAgICB0aGlzLnNldEV2ZW50QmluZGluZ3MoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2VsZWN0T3JnRmlsdGVyLmluaXRGaWx0ZXJDb250cm9scygpO1xyXG5cclxuICAgICAgICB0aGlzLl9zYW9wU2VsZWN0TW9udGhZZWFyRmlsdGVyLmluaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0V2ViR3JpZDEoKSB7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzRXhjZXNzSG91cnNHcmlkLmluaXRXZWJHcmlkMVwiKTtcclxuICAgICAgICBsZXQgd2dJZCA9IFwiI1wiICsgdGhpcy5fdGFibGVJZDtcclxuXHJcbiAgICAgICAgdGhpcy5fd2ViZ3JpZCA9IG5ldyBTYW9wV2ViR3JpZCh0aGlzLl9saWJOYW1lICsgXCIud2ViR3JpZDFcIik7XHJcbiAgICAgICAgbGV0IGdyaWRQcm9wZXJ0aWVzOiBTYW9wV2ViR3JpZFByb3BlcnRpZXM7XHJcblxyXG4gICAgICAgIGxldCBkYXRhVGFibGU6IFNhb3BXZWJEYXRhVGFibGU7XHJcblxyXG4gICAgICAgIGRhdGFUYWJsZSA9IHtcclxuICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZVxyXG4gICAgICAgICAgICAsIGNvbHVtbkRlZnNTZXR0aW5nczogW1xyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldHM6IDBcclxuICAgICAgICAgICAgICAgICAgICAsIGNoZWNrYm94ZXM6IHsgc2VsZWN0Um93OiB0cnVlIH1cclxuICAgICAgICAgICAgICAgICAgICAsIHJlbmRlcjogZnVuY3Rpb24gKGRhdGEsIHR5cGUsIHJvdywgbWV0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUsIHRyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwidGFibGVSRUdBbGxFbXBsb3llZXNFeGNlc3NIb3Vyc1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHIgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRyXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICc8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJkdC1jaGVja2JveGVzXCI+J1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGlkZGVuID0gJCh0clttZXRhLnJvdyArIDFdKS5oYXNDbGFzcyhcImVsZW1lbnQtaGlkZGVuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm93WzhdLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICc8ZGl2IHN0eWxlPVwid2lkdGg6MTNweDtcIj48L2Rpdj4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoaWRkZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiZHQtY2hlY2tib3hlc1wiIGRpc2FibGVkPic7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0YXJnZXRzOiA4LFxyXG4gICAgICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgLCBvcmRlcjogW1sxLCAnYXNjJ11dXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBncmlkUHJvcGVydGllcyA9IHtcclxuICAgICAgICAgICAgZ3JpZElkOiB3Z0lkXHJcbiAgICAgICAgICAgICwgdG9nZ2xlUGFuZWw6IHsgZW5hYmxlZDogZmFsc2UgfVxyXG4gICAgICAgICAgICAsIGRhdGFUYWJsZTogZGF0YVRhYmxlXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5fd2ViZ3JpZC5pbml0KGdyaWRQcm9wZXJ0aWVzKTtcclxuXHJcblxyXG4gICAgICAgIGxldCBfdG9vbEJhciA9ICQoXCIjZ3JpZC10b29sYmFyLXByb2Nlc3NlZFwiKTtcclxuXHJcbiAgICAgICAgbGV0IF9idG5Db25maXJtTXVsdGlwbGUgPSBfdG9vbEJhci5maW5kKFwiI2J0bkNvbmZpcm1NdWx0aXBsZVwiKTtcclxuICAgICAgICBfYnRuQ29uZmlybU11bHRpcGxlLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgIF9idG5Db25maXJtTXVsdGlwbGUub24oJ2NsaWNrJywgZnVuY3Rpb24gKHJvdykge1xyXG4gICAgICAgICAgICBfdGhpcy5NdWx0aXBsZVJlY29yZEFjdGlvbkNsaWNrKEV4Y2Vzc0hvdXJzQWN0aW9uVHlwZS5Db25maXJtTXVsdGlwbGUpO1xyXG4gICAgICAgICAgICB0aGlzLmJsdXIoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBsZXQgX2J0bkRlbGV0ZU11bHRpcGxlID0gX3Rvb2xCYXIuZmluZChcIiNidG5EZWxldGVNdWx0aXBsZVwiKTtcclxuICAgICAgICBfYnRuRGVsZXRlTXVsdGlwbGUub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgX2J0bkRlbGV0ZU11bHRpcGxlLm9uKCdjbGljaycsIGZ1bmN0aW9uIChyb3cpIHtcclxuICAgICAgICAgICAgX3RoaXMuTXVsdGlwbGVSZWNvcmRBY3Rpb25DbGljayhFeGNlc3NIb3Vyc0FjdGlvblR5cGUuRGVsZXRlTXVsdGlwbGUpO1xyXG4gICAgICAgICAgICB0aGlzLmJsdXIoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBsZXQgX2J0blBheW91dE11bHRpcGxlID0gX3Rvb2xCYXIuZmluZChcIiNidG5QYXlvdXRNdWx0aXBsZVwiKTtcclxuICAgICAgICBfYnRuUGF5b3V0TXVsdGlwbGUub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgX2J0blBheW91dE11bHRpcGxlLm9uKCdjbGljaycsIGZ1bmN0aW9uIChyb3cpIHtcclxuICAgICAgICAgICAgX3RoaXMuTXVsdGlwbGVSZWNvcmRBY3Rpb25DbGljayhFeGNlc3NIb3Vyc0FjdGlvblR5cGUuUGF5b3V0TXVsdGlwbGUpO1xyXG4gICAgICAgICAgICB0aGlzLmJsdXIoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBsZXQgX2J0blVubG9ja011bHRpcGxlID0gX3Rvb2xCYXIuZmluZChcIiNidG5VbmxvY2tNdWx0aXBsZVwiKTtcclxuICAgICAgICBfYnRuVW5sb2NrTXVsdGlwbGUub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgX2J0blVubG9ja011bHRpcGxlLm9uKCdjbGljaycsIGZ1bmN0aW9uIChyb3cpIHtcclxuICAgICAgICAgICAgX3RoaXMuTXVsdGlwbGVSZWNvcmRBY3Rpb25DbGljayhFeGNlc3NIb3Vyc0FjdGlvblR5cGUuVW5sb2NrTXVsdGlwbGUpO1xyXG4gICAgICAgICAgICB0aGlzLmJsdXIoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBsZXQgX2J0bkNvbmNsdWRlTXVsdGlwbGUgPSBfdG9vbEJhci5maW5kKFwiI2J0bkNvbmNsdWRlTXVsdGlwbGVcIik7XHJcbiAgICAgICAgX2J0bkNvbmNsdWRlTXVsdGlwbGUub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgX2J0bkNvbmNsdWRlTXVsdGlwbGUub24oJ2NsaWNrJywgZnVuY3Rpb24gKHJvdykge1xyXG4gICAgICAgICAgICBfdGhpcy5NdWx0aXBsZVJlY29yZEFjdGlvbkNsaWNrKEV4Y2Vzc0hvdXJzQWN0aW9uVHlwZS5Db25jbHVkZU11bHRpcGxlKTtcclxuICAgICAgICAgICAgdGhpcy5ibHVyKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICAkKFwiYm9keVwiKS5vZmYoXCJjaGFuZ2VcIiwgXCIjdGFibGVSRUdBbGxFbXBsb3llZXNFeGNlc3NIb3VycyB0ciB0aC5kdC1jaGVja2JveGVzLXNlbGVjdC1hbGwgaW5wdXRbdHlwZT0nY2hlY2tib3gnXVwiKTtcclxuICAgICAgICAkKFwiYm9keVwiKS5vbihcImNoYW5nZVwiLCBcIiN0YWJsZVJFR0FsbEVtcGxveWVlc0V4Y2Vzc0hvdXJzIHRyIHRoLmR0LWNoZWNrYm94ZXMtc2VsZWN0LWFsbCBpbnB1dFt0eXBlPSdjaGVja2JveCddXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgLy9fdGhpcy5vbkNsaWNrVW5zZWxlY3RIaWRkZW4oKTtcclxuICAgICAgICAgICAgX3RoaXMuc2V0TXVsdGlwbGVDb25maXJtRGVueUJ1dHRvbnNFbmFibGVEaXNhYmxlKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQoXCJib2R5XCIpLm9mZihcImNoYW5nZVwiLCBcIiN0YWJsZVJFR0FsbEVtcGxveWVlc0V4Y2Vzc0hvdXJzIHRyIHRkLmR0LWNoZWNrYm94ZXMtY2VsbCBpbnB1dFt0eXBlPSdjaGVja2JveCddLmR0LWNoZWNrYm94ZXNcIik7XHJcbiAgICAgICAgJChcImJvZHlcIikub24oXCJjaGFuZ2VcIiwgXCIjdGFibGVSRUdBbGxFbXBsb3llZXNFeGNlc3NIb3VycyB0ciB0ZC5kdC1jaGVja2JveGVzLWNlbGwgaW5wdXRbdHlwZT0nY2hlY2tib3gnXS5kdC1jaGVja2JveGVzXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgX3RoaXMuc2V0TXVsdGlwbGVDb25maXJtRGVueUJ1dHRvbnNFbmFibGVEaXNhYmxlKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQoXCIuQWxsRW1wbG95ZWVzRXhjZXNzSG91cnNfZWRpdFwiKS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAkKFwiLkFsbEVtcGxveWVlc0V4Y2Vzc0hvdXJzX2VkaXRcIikub24oJ2NsaWNrJywgZnVuY3Rpb24gKHJvdykge1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNFeGNlc3NIb3Vyc0dyaWQuQWxsRW1wbG95ZWVzRXhjZXNzSG91cnNfZWRpdC5jbGlja1wiKTtcclxuICAgICAgICAgICAgbGV0IF9idG5FZGl0ID0gcm93LmN1cnJlbnRUYXJnZXQ7XHJcbiAgICAgICAgICAgIGxldCBidG5FbmFibGVkID0gX2J0bkVkaXQuZ2V0QXR0cmlidXRlKFwiZGF0YS1lbmFibGVkXCIpITtcclxuICAgICAgICAgICAgaWYgKGJ0bkVuYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgIGxldCB5ZWFyID0gX2J0bkVkaXQuZ2V0QXR0cmlidXRlKFwiZGF0YS15ZWFyXCIpITtcclxuICAgICAgICAgICAgICAgIGxldCBtb250aCA9IF9idG5FZGl0LmdldEF0dHJpYnV0ZShcImRhdGEtbW9udGhcIikhO1xyXG4gICAgICAgICAgICAgICAgbGV0IGVtcGxveWVlSWQgPSBfYnRuRWRpdC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWVtcGxveWVlLWlkXCIpITtcclxuICAgICAgICAgICAgICAgIGxldCBlbXBsb3llZU5hbWUgPSBfYnRuRWRpdC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWVtcGxveWVlLW5hbWVcIikhO1xyXG5cclxuICAgICAgICAgICAgICAgIF90aGlzLmVkaXRSZWNvcmQoTnVtYmVyKHllYXIpLCBOdW1iZXIobW9udGgpLCBlbXBsb3llZUlkLCBlbXBsb3llZU5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7ICBcclxuXHJcbiAgICAgICAgJChcIiNhdHRlbmRhbmNlQWxsRW1wbG95ZWVzQW5hbHlzaXNUYWJsZVJvd3M+dHI+dGRcIikub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgJChcIiNhdHRlbmRhbmNlQWxsRW1wbG95ZWVzQW5hbHlzaXNUYWJsZVJvd3M+dHI+dGRcIikub24oJ2NsaWNrJywgZnVuY3Rpb24gKHJvdykge1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNFeGNlc3NIb3Vyc0dyaWQuQWxsRW1wbG95ZWVzRXhjZXNzSG91cnNfZWRpdC5jbGlja1wiKTtcclxuICAgICAgICAgICAgbGV0IF9idG5FZGl0ID0gcm93LmN1cnJlbnRUYXJnZXQ7XHJcbiAgICAgICAgICAgIHZhciBidG5FbmFibGVkID0gKF9idG5FZGl0LnBhcmVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1lbmFibGVkXCIpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBcInRydWVcIikgJiYgIV9idG5FZGl0LmNsYXNzTGlzdC5jb250YWlucyhcImR0LWNoZWNrYm94ZXMtY2VsbFwiKTtcclxuICAgICAgICAgICAgaWYgKGJ0bkVuYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgIGxldCB5ZWFyID0gX2J0bkVkaXQucGFyZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXllYXJcIik7XHJcbiAgICAgICAgICAgICAgICBsZXQgbW9udGggPSBfYnRuRWRpdC5wYXJlbnRFbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtbW9udGhcIik7XHJcbiAgICAgICAgICAgICAgICBsZXQgZW1wbG95ZWVJZCA9IF9idG5FZGl0LnBhcmVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1lbXBsb3llZS1pZFwiKTtcclxuICAgICAgICAgICAgICAgIGxldCBlbXBsb3llZU5hbWUgPSBfYnRuRWRpdC5wYXJlbnRFbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtZW1wbG95ZWUtbmFtZVwiKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLmVkaXRSZWNvcmQoTnVtYmVyKHllYXIpLCBOdW1iZXIobW9udGgpLCBlbXBsb3llZUlkLCBlbXBsb3llZU5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7ICBcclxuICAgIH1cclxuXHJcbiAgICBNdWx0aXBsZVJlY29yZEFjdGlvbkNsaWNrKHR5cGU6IEV4Y2Vzc0hvdXJzQWN0aW9uVHlwZSk6IHZvaWQge1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnQXR0ZW5kYW5jZUFsbEVtcGxveWVlc0V4Y2Vzc0hvdXJzR3JpZC5NdWx0aXBsZVJlY29yZEFjdGlvbkNsaWNrXCIpO1xyXG5cclxuICAgICAgICB2YXIgcm93cyA9IHRoaXMuX3dlYmdyaWQuZGF0YVRhYmxlLmNvbHVtbigwKS5kYXRhKCkudG9BcnJheSgpO1xyXG5cclxuICAgICAgICByb3dzLmZvckVhY2goZnVuY3Rpb24gKF9lbCkge1xyXG4gICAgICAgICAgICB2YXIgX3JvdyA9IF90aGlzLl93ZWJncmlkLmRhdGFUYWJsZS5yb3coTnVtYmVyKF9lbCkpLm5vZGUoKSBhcyBFbGVtZW50OyBcclxuICAgICAgICAgICAgdmFyIGNoZWNrZWQgPSAkKCQoX3JvdykuZmluZCgnaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJylbMF0pLnByb3AoJ2NoZWNrZWQnKTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBfcm93ICE9PSAndW5kZWZpbmVkJyAmJiBjaGVja2VkID09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIHZhciB5ZWFyID0gX3Jvdy5nZXRBdHRyaWJ1dGUoXCJkYXRhLXllYXJcIik7XHJcbiAgICAgICAgICAgICAgICB2YXIgbW9udGggPSBfcm93LmdldEF0dHJpYnV0ZShcImRhdGEtbW9udGhcIik7XHJcbiAgICAgICAgICAgICAgICB2YXIgZW1wbG95ZWVJZCA9IF9yb3cuZ2V0QXR0cmlidXRlKFwiZGF0YS1lbXBsb3llZS1pZFwiKTtcclxuICAgICAgICAgICAgICAgIHZhciBmaW5nZXJwcmludCA9IF9yb3cuZ2V0QXR0cmlidXRlKFwiZGF0YS1maW5nZXJwcmludFwiKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHllYXIsIG1vbnRoLCBlbXBsb3llZUlkLCB0eXBlKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLmNvbmZpcm1SZWNvcmQoeWVhciwgbW9udGgsIGVtcGxveWVlSWQsIGZpbmdlcnByaW50LCB0eXBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbmZpcm1SZWNvcmQoeWVhcjogc3RyaW5nLCBtb250aDogc3RyaW5nLCBlbXBsb3llZUlkOiBzdHJpbmcsIGZpbmdlcnByaW50OiBzdHJpbmcsIHR5cGU6IEV4Y2Vzc0hvdXJzQWN0aW9uVHlwZSk6IHZvaWQge1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIGxldCBfZGF0YSA9IHsgbGV0bzogeWVhciwgbWVzZWM6IG1vbnRoLCBzaWZyYVphcG9zbGVuaTogZW1wbG95ZWVJZCB9O1xyXG5cclxuICAgICAgICBsZXQgX3VybEFjdGlvbiA9IFwiXCI7XHJcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgRXhjZXNzSG91cnNBY3Rpb25UeXBlLkNvbmZpcm1NdWx0aXBsZTpcclxuICAgICAgICAgICAgICAgIF91cmxBY3Rpb24gPSBcIlJFR0F0dGVuZGFuY2VBbGxFbXBsb3llZXNFeGNlc3NIb3Vycy9Db25maXJtTXVsdGlwbGVcIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIEV4Y2Vzc0hvdXJzQWN0aW9uVHlwZS5EZWxldGVNdWx0aXBsZTpcclxuICAgICAgICAgICAgICAgIF91cmxBY3Rpb24gPSBcIlJFR0F0dGVuZGFuY2VBbGxFbXBsb3llZXNFeGNlc3NIb3Vycy9EZWxldGVNdWx0aXBsZVwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgRXhjZXNzSG91cnNBY3Rpb25UeXBlLlBheW91dE11bHRpcGxlOlxyXG4gICAgICAgICAgICAgICAgX3VybEFjdGlvbiA9IFwiUkVHQXR0ZW5kYW5jZUFsbEVtcGxveWVlc0V4Y2Vzc0hvdXJzL1BheW91dE11bHRpcGxlXCI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBFeGNlc3NIb3Vyc0FjdGlvblR5cGUuVW5sb2NrTXVsdGlwbGU6XHJcbiAgICAgICAgICAgICAgICBfdXJsQWN0aW9uID0gXCJSRUdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzRXhjZXNzSG91cnMvVW5sb2NrTXVsdGlwbGVcIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIEV4Y2Vzc0hvdXJzQWN0aW9uVHlwZS5Db25jbHVkZU11bHRpcGxlOlxyXG4gICAgICAgICAgICAgICAgX3VybEFjdGlvbiA9IFwiUkVHQXR0ZW5kYW5jZUFsbEVtcGxveWVlc0V4Y2Vzc0hvdXJzL0NvbmNsdWRlTXVsdGlwbGVcIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNFeGNlc3NIb3Vyc0dyaWQuXCIgKyBfdXJsQWN0aW9uLnNwbGl0KFwiL1wiKVsxXSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgbGV0IF9zYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgICAgICB0aGlzLl9yZWZyZXNoaW5nQWxsRW1wbG95ZWVzVGFibGUgPSB0cnVlO1xyXG4gICAgICAgIF9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAkKF90aGlzLl90YWJsZURpdklkKS5odG1sKHJlc3BvbnNlKTtcclxuXHJcbiAgICAgICAgICAgIF90aGlzLmluaXRXZWJHcmlkMSgpO1xyXG5cclxuICAgICAgICAgICAgX3RoaXMuX3JlZnJlc2hpbmdBbGxFbXBsb3llZXNUYWJsZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgbGV0IGl6YnJhbmlaYXBvc2xlbmkgPSA8c3RyaW5nW10+KF90aGlzLl9zZWxlY3RPcmdGaWx0ZXIuX3NlbGVjdFphcG9zbGVuaS5zZWxlY3RlZENCLnZhbCgpKTtcclxuICAgICAgICAgICAgX3RoaXMuX3NlbGVjdE9yZ0ZpbHRlci5fc2VsZWN0WmFwb3NsZW5pLnNldFNlbGVjdFZhbHVlcyhpemJyYW5pWmFwb3NsZW5pKTtcclxuICAgICAgICAgICAgX3RoaXMuX3Nhb3BTZWxlY3RNb250aFllYXJGaWx0ZXIuc2V0UmVmcmVzaGluZ1JlY29yZHNDb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICBfdGhpcy5zZXRNdWx0aXBsZUNvbmZpcm1EZW55QnV0dG9uc0VuYWJsZURpc2FibGUoKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIF9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246IF91cmxBY3Rpb25cclxuICAgICAgICAgICAgLCBkYXRhOiBfZGF0YVxyXG4gICAgICAgICAgICAsIHR5cGU6IFwiUE9TVFwiXHJcbiAgICAgICAgICAgICwgc3Bpbm5lckRpdklkOiBcIiNhdHRlbmRhbmNlQWxsRW1wbG95ZWVzRXhjZXNzSG91cnNMb2FkaW5nXCJcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcmVmcmVzaEFsbEVtcGxveWVlc1RhYmxlKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnQXR0ZW5kYW5jZUFsbEVtcGxveWVlc0V4Y2Vzc0hvdXJzR3JpZC5yZWZyZXNoQWxsRW1wbG95ZWVzVGFibGVcIik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcblxyXG4gICAgICAgIGxldCBmaWx0ZXJfdmFsdWVzID0gdGhpcy5fc2FvcFNlbGVjdE1vbnRoWWVhckZpbHRlci5nZXRTZWxlY3RlZE1vbnRoWWVhcigpO1xyXG4gICAgICAgIGxldCBwYXJhbXMgPSB7IGxldG86IGZpbHRlcl92YWx1ZXMubGV0bywgbWVzZWM6IGZpbHRlcl92YWx1ZXMubWVzZWMgfTtcclxuICAgICAgICB0aGlzLl9yZWZyZXNoaW5nQWxsRW1wbG95ZWVzVGFibGUgPSB0cnVlO1xyXG5cclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAkKF90aGlzLl90YWJsZURpdklkKS5odG1sKHJlc3BvbnNlKTtcclxuXHJcbiAgICAgICAgICAgIF90aGlzLmluaXRXZWJHcmlkMSgpO1xyXG5cclxuICAgICAgICAgICAgX3RoaXMuX3JlZnJlc2hpbmdBbGxFbXBsb3llZXNUYWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAvL190aGlzLmVuYWJsZURpc2FibGVPYmRvYmplRmlsdGVycyhfdGhpcy5fcmVmcmVzaGluZ0FsbEVtcGxveWVlc1RhYmxlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGl6dmVkZW1vIHNlIGZpbHRlciB2cnN0aWMgdGFiZWxlIGdsZWRlIG96bmFjZW5paCB6YXBvc2xlbmloXHJcbiAgICAgICAgICAgIGxldCBpemJyYW5pWmFwb3NsZW5pID0gPHN0cmluZ1tdPihfdGhpcy5fc2VsZWN0T3JnRmlsdGVyLl9zZWxlY3RaYXBvc2xlbmkuc2VsZWN0ZWRDQi52YWwoKSk7XHJcbiAgICAgICAgICAgIF90aGlzLl9zZWxlY3RPcmdGaWx0ZXIuX3NlbGVjdFphcG9zbGVuaS5zZXRTZWxlY3RWYWx1ZXMoaXpicmFuaVphcG9zbGVuaSk7XHJcbiAgICAgICAgICAgIF90aGlzLl9zYW9wU2VsZWN0TW9udGhZZWFyRmlsdGVyLnNldFJlZnJlc2hpbmdSZWNvcmRzQ29tcGxldGUoKTtcclxuICAgICAgICAgICAgX3RoaXMuc2V0TXVsdGlwbGVDb25maXJtRGVueUJ1dHRvbnNFbmFibGVEaXNhYmxlKCk7XHJcbiAgICAgICAgICAgIF90aGlzLnNldEV2ZW50QmluZGluZ3MoKTtcclxuXHJcbiAgICAgICAgfTtcclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246IFwiUkVHQXR0ZW5kYW5jZUFsbEVtcGxveWVlc0V4Y2Vzc0hvdXJzL0dldEFsbEVtcGxveWVlc0V4Y2Vzc0hvdXJzVGFibGVcIlxyXG4gICAgICAgICAgICAsIGRhdGE6IHBhcmFtc1xyXG4gICAgICAgICAgICAsIHR5cGU6IFwiR0VUXCJcclxuICAgICAgICAgICAgLCBzcGlubmVyRGl2SWQ6IFwiI2F0dGVuZGFuY2VBbGxFbXBsb3llZXNFeGNlc3NIb3Vyc0xvYWRpbmdcIlxyXG4gICAgICAgIH0pOyAgICBcclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoQWxsRW1wbG95ZWVzRm9ybShwYXJhbXM6IGFueSA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNFeGNlc3NIb3Vyc0dyaWQucmVmcmVzaEFsbEVtcGxveWVlc0Zvcm1cIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgbGV0IHNhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG5cclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAkKFwiI2F0dGVuZGFuY2VBbGxFbXBsb3llZXNFeGNlc3NIb3Vyc0Zvcm1cIikuaHRtbChyZXNwb25zZSk7XHJcbiAgICAgICAgICAgIF90aGlzLmluaXRGaWx0ZXJDb250cm9scygpO1xyXG4gICAgICAgICAgICBfdGhpcy5iaW5kR3JpZEV2ZW50cygpO1xyXG4gICAgICAgICAgICBfdGhpcy5zZXRFdmVudEJpbmRpbmdzKCk7XHJcblxyXG4gICAgICAgIH07XHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOiBcIlJFR0F0dGVuZGFuY2VBbGxFbXBsb3llZXNFeGNlc3NIb3Vycy9HZXRBbGxFbXBsb3llZXNFeGNlc3NIb3Vyc0Zvcm1cIlxyXG4gICAgICAgICAgICAsIGRhdGE6IHBhcmFtc1xyXG4gICAgICAgICAgICAsIHR5cGU6IFwiR0VUXCJcclxuICAgICAgICAgICAgLCBzcGlubmVyRGl2SWQ6IFwiI2F0dGVuZGFuY2VBbGxFbXBsb3llZXNFeGNlc3NIb3Vyc0xvYWRpbmdcIlxyXG4gICAgICAgIH0pOyAgICBcclxuICAgIH1cclxuXHJcbiAgICBiaW5kR3JpZEV2ZW50cygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNFeGNlc3NIb3Vyc0dyaWQuYmluZEdyaWRFdmVudHNcIik7XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdFdlYkdyaWQxKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZmlsdGVyWmFwb3NsZW5pVGFibGVSb3dzKGZpbHRlclphcG9zbGVuaTogc3RyaW5nKSB7XHJcbiAgICAgICAgLy9maWx0cmlyYW5qZSBnbGVkZSBuYSBvcmdhbml6YWNpanNrbyBlbm90byBpbiB6YXBvc2xlbmVnYVxyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnQXR0ZW5kYW5jZUFsbEVtcGxveWVlc0V4Y2Vzc0hvdXJzR3JpZC5maWx0ZXJaYXBvc2xlbmlUYWJsZVJvd3NcIik7XHJcblxyXG4gICAgICAgIC8vIERlY2xhcmUgdmFyaWFibGVzXHJcbiAgICAgICAgdmFyIHRhYmxlLCB0ciwgX3Jvd0lkLCBpLCB0eHRWYWx1ZTtcclxuICAgICAgICB0YWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuX3RhYmxlSWQpO1xyXG4gICAgICAgIHRyID0gdGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0clwiKTtcclxuICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHRhYmxlIHJvd3MsIGFuZCBoaWRlIHRob3NlIHdobyBkb24ndCBtYXRjaCB0aGUgc2VhcmNoIHF1ZXJ5XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIF9yb3dJZCA9IG51bGw7XHJcbiAgICAgICAgICAgIGxldCBfdHJJZCA9ICQodHJbaV0pLmF0dHIoXCJkYXRhLWVtcGxveWVlLWlkXCIpO1xyXG4gICAgICAgICAgICBpZiAoIWlzVW5EZWZpbmVkKF90cklkKSkgeyBcclxuICAgICAgICAgICAgICAgIF9yb3dJZCA9IF90cklkLnRvU3RyaW5nKClcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKF9yb3dJZCkge1xyXG4gICAgICAgICAgICAgICAgdHh0VmFsdWUgPSBfcm93SWQudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgIGxldCBjaGVja2JveCA9ICQodHJbaV0pWzBdLmNoaWxkcmVuWzBdO1xyXG4gICAgICAgICAgICAgICAgbGV0IGRlZmluZWQgPSBjaGVja2JveC5jaGlsZHJlbi5sZW5ndGggPT0gMSAmJiBjaGVja2JveC5jaGlsZHJlblswXS5sb2NhbE5hbWUgPT0gJ2lucHV0JztcclxuICAgICAgICAgICAgICAgIGlmIChpc0VtcHR5KGZpbHRlclphcG9zbGVuaSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAkKHRyW2ldKS5hZGRDbGFzcyhcImVsZW1lbnQtaGlkZGVuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWZpbmVkKSAkKHRyW2ldKVswXS5jaGlsZHJlblswXS5pbm5lckhUTUwgPSAnPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiZHQtY2hlY2tib3hlc1wiIGRpc2FibGVkPic7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbHRlclphcG9zbGVuaS50b1VwcGVyQ2FzZSgpLmluZGV4T2YodHh0VmFsdWUpID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGVmaW5lZCAmJiAkKHRyW2ldKS5oYXNDbGFzcyhcImVsZW1lbnQtaGlkZGVuXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQodHJbaV0pWzBdLmNoaWxkcmVuWzBdLmlubmVySFRNTCA9ICc8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJkdC1jaGVja2JveGVzXCI+JztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgJCh0cltpXSkucmVtb3ZlQ2xhc3MoXCJlbGVtZW50LWhpZGRlblwiKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJCh0cltpXSkuYWRkQ2xhc3MoXCJlbGVtZW50LWhpZGRlblwiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGVmaW5lZCkgJCh0cltpXSlbMF0uY2hpbGRyZW5bMF0uaW5uZXJIVE1MID0gJzxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImR0LWNoZWNrYm94ZXNcIiBkaXNhYmxlZD4nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZnRlclNhb3BNb250aFllYXJWYWx1ZXNDaGFuZ2VkKGxldG86IG51bWJlciwgbWVzZWM6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIC8vcG9taWthbmplIHBvIG1lc2VjaWgsIG5hcHJlaiBuYXphaiwgc3ByZW1lbWJhIG1lc2VjYS4uLi5cclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNFeGNlc3NIb3Vyc0dyaWQuYWZ0ZXJTYW9wTW9udGhZZWFyVmFsdWVzQ2hhbmdlZFwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWZyZXNoQWxsRW1wbG95ZWVzVGFibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRNdWx0aXBsZUNvbmZpcm1EZW55QnV0dG9uc0VuYWJsZURpc2FibGUoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzRXhjZXNzSG91cnNHcmlkLnNldE11bHRpcGxlQ29uZmlybURlbnlCdXR0b25zRW5hYmxlRGlzYWJsZVwiKTtcclxuXHJcbiAgICAgICAgbGV0IF90b29sQmFyID0gJChcIiNncmlkLXRvb2xiYXItcHJvY2Vzc2VkXCIpO1xyXG5cclxuICAgICAgICBsZXQgX2J0bkNvbmZpcm1NdWx0aXBsZSA9IF90b29sQmFyLmZpbmQoXCIjYnRuQ29uZmlybU11bHRpcGxlXCIpO1xyXG4gICAgICAgIF9idG5Db25maXJtTXVsdGlwbGUucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTtcclxuICAgICAgICBsZXQgX2J0bkRlbGV0ZU11bHRpcGxlID0gX3Rvb2xCYXIuZmluZChcIiNidG5EZWxldGVNdWx0aXBsZVwiKTtcclxuICAgICAgICBfYnRuRGVsZXRlTXVsdGlwbGUucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTtcclxuICAgICAgICBsZXQgX2J0blBheW91dE11bHRpcGxlID0gX3Rvb2xCYXIuZmluZChcIiNidG5QYXlvdXRNdWx0aXBsZVwiKTtcclxuICAgICAgICBfYnRuUGF5b3V0TXVsdGlwbGUucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTtcclxuICAgICAgICBsZXQgX2J0blVubG9ja011bHRpcGxlID0gX3Rvb2xCYXIuZmluZChcIiNidG5VbmxvY2tNdWx0aXBsZVwiKTtcclxuICAgICAgICBfYnRuVW5sb2NrTXVsdGlwbGUucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTtcclxuICAgICAgICBsZXQgX2J0bkNvbmNsdWRlTXVsdGlwbGUgPSBfdG9vbEJhci5maW5kKFwiI2J0bkNvbmNsdWRlTXVsdGlwbGVcIik7XHJcbiAgICAgICAgX2J0bkNvbmNsdWRlTXVsdGlwbGUucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTtcclxuXHJcbiAgICAgICAgJChcIiN0YWJsZVJFR0FsbEVtcGxveWVlc0V4Y2Vzc0hvdXJzIHRyIHRkLmR0LWNoZWNrYm94ZXMtY2VsbCBpbnB1dFt0eXBlPSdjaGVja2JveCddLmR0LWNoZWNrYm94ZXNcIikuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGxldCBjaGVja2VkID0gJCh0aGlzKS5pcyhcIjpjaGVja2VkXCIpO1xyXG4gICAgICAgICAgICBpZiAoY2hlY2tlZClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgX2J0bkNvbmZpcm1NdWx0aXBsZS5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIF9idG5EZWxldGVNdWx0aXBsZS5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIF9idG5QYXlvdXRNdWx0aXBsZS5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIF9idG5VbmxvY2tNdWx0aXBsZS5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIF9idG5Db25jbHVkZU11bHRpcGxlLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHB1YmxpYyBzZXRFdmVudEJpbmRpbmdzKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnQXR0ZW5kYW5jZUFsbEVtcGxveWVlc0V4Y2Vzc0hvdXJzR3JpZC5zZXRFdmVudEJpbmRpbmdzXCIpO1xyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICBfdGhpcy5zZXRUYWJsZUhlaWdodCgpO1xyXG4gICAgICAgIHdpbmRvdy5vbnJlc2l6ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgX3RoaXMuc2V0VGFibGVIZWlnaHQoKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0VGFibGVIZWlnaHQoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzRXhjZXNzSG91cnNHcmlkLnNldFRhYmxlSGVpZ2h0XCIpO1xyXG5cclxuICAgICAgICBsZXQgX2hlaWdodCA9ICQoJyNncmlkLXRvb2xiYXItcHJvY2Vzc2VkJykuaGVpZ2h0KCk7XHJcbiAgICAgICAgbGV0IHJlbWFpbmluZ19oZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSBfaGVpZ2h0IC0gMjQ1O1xyXG4gICAgICAgICQoJyN0YWJsZVJFR0FsbEVtcGxveWVlc0V4Y2Vzc0hvdXJzX3dyYXBwZXInKS5oZWlnaHQocmVtYWluaW5nX2hlaWdodCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbiIsIu+7v2ltcG9ydCB7IFNhb3BWaWV3Rm9ybSB9IGZyb20gXCIuLi9Db3JlL3Nhb3Atdmlldy1mb3JtXCI7XHJcbmltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNFeGNlc3NIb3Vyc1ZpZXcgZXh0ZW5kcyBTYW9wVmlld0Zvcm0ge1xyXG4gICAgcHJpdmF0ZSBfZm9ybUlkOiBzdHJpbmc7XHJcbiAgICBjb25zdHJ1Y3Rvcih2aWV3SWQ6IHN0cmluZywgbGliTmFtZTogc3RyaW5nID0gXCJcIikge1xyXG4gICAgICAgIHN1cGVyKHZpZXdJZCwgbGliTmFtZSk7XHJcblxyXG4gICAgICAgIHRoaXMuYWRkUmVjb3JkRW5kcG9pbnQgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuZWRpdFJlY29yZEVuZHBvaW50ID0gXCJSRUdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzRXhjZXNzSG91cnMvRWRpdEFsbEVtcGxveWVlc0V4Y2Vzc0hvdXJzXCI7XHJcbiAgICAgICAgdGhpcy5kZWxldGVSZWNvcmRFbmRwb2ludCA9IFwiXCI7IFxyXG5cclxuICAgIH1cclxufVxyXG5cclxuXHJcbiIsIu+7vy8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9AdHlwZXMvYWxlcnRpZnkvaW5kZXguZC50c1wiIC8+XHJcbmltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFZpZXdGb3JtQmluZGluZ3MgfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXZpZXctZm9ybS1iaW5kaW5nc1wiO1xyXG5pbXBvcnQgeyBTYW9wV2ZTdWJtaXRSZXN1bHQgfSBmcm9tIFwiLi4vY29yZS9zYW9wLXZpZXctZm9ybVwiO1xyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wUmVnQ3VycmVudEV2ZW50VmlldyBleHRlbmRzIFNhb3BWaWV3Rm9ybUJpbmRpbmdzIHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih2aWV3SWQ6IHN0cmluZywgbGliTmFtZTogc3RyaW5nID0gXCJcIikge1xyXG4gICAgICAgIHN1cGVyKHZpZXdJZCwgbGliTmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25TdWJtaXRTdWNjZXNzKGRhdGE6IFNhb3BXZlN1Ym1pdFJlc3VsdCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnQ3VycmVudEV2ZW50Vmlldy5vbkFkZERhdGFTdWNjZXNzXCIpO1xyXG4gICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgYWxlcnRpZnkubWVzc2FnZShkYXRhLmFsZXJ0TWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIGFsZXJ0aWZ5LmVycm9yKGRhdGEuYWxlcnRNZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hZnRlclN1Ym1pdFN1Y2Nlc3MoZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFmdGVyU3VibWl0U3VjY2VzcyhyZXN1bHQ6IFNhb3BXZlN1Ym1pdFJlc3VsdCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnQ3VycmVudEV2ZW50Vmlldy5hZnRlckV4ZWN1dGVTdWNjZXNzXCIpO1xyXG4gICAgfSAgICBcclxuXHJcbiAgICAvL1xyXG59XHJcblxyXG5cclxuIiwi77u/Ly8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9hbGVydGlmeS9pbmRleC5kLnRzXCIgLz5cclxuaW1wb3J0IHsgZ2xvYmFsLCBpc0VtcHR5IH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wU2VydmljZXNDb3JlIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC1zZXJ2aWNlcy1jb3JlXCI7XHJcbmltcG9ydCAqIGFzIG1vbWVudCBmcm9tICcuLi8uLi9ub2RlX21vZHVsZXMvbW9tZW50L21vbWVudCc7XHJcbmltcG9ydCB7IFNhb3BSZWdVcmFEb2dvZGVrVmlldyB9IGZyb20gXCIuL3Nhb3AtcmVnVXJhRG9nb2Rlay12aWV3XCI7XHJcbmltcG9ydCB7IFNhb3BSZWdDdXJyZW50RXZlbnRWaWV3IH0gZnJvbSAnLi9zYW9wLXJlZ0N1cnJlbnRFdmVudC12aWV3J1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BSZWdUb2RheUV2ZW50c1ZpZXcgZXh0ZW5kcyBTYW9wUmVnVXJhRG9nb2Rla1ZpZXcge1xyXG4gICAgcHVibGljIHJlZ0N1cnJlbnRFdmVudFZpZXc6U2FvcFJlZ0N1cnJlbnRFdmVudFZpZXc7XHJcbiAgICAvL1xyXG4gICAgcHJpdmF0ZSBfc2FvcFNlcnZpY2VzQ29yZSA6U2FvcFNlcnZpY2VzQ29yZTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih2aWV3SWQ6c3RyaW5nLGxpYk5hbWU6c3RyaW5nID0gXCJcIikge1xyXG4gICAgICAgIHN1cGVyKHZpZXdJZCxsaWJOYW1lKTtcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMucmVmcmVzaERhdGEgPSB0aGlzLnJlZnJlc2hMaXN0RGF0YS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy5yZWdDdXJyZW50RXZlbnRWaWV3ID0gbmV3IFNhb3BSZWdDdXJyZW50RXZlbnRWaWV3KFwiI3JlZ0FjY3Rpb25CdXR0b25zVmlld1wiLGxpYk5hbWUrXCIucmVnQ3VycmVudEV2ZW50Vmlld1wiKTtcclxuICAgICAgICB0aGlzLnJlZ0N1cnJlbnRFdmVudFZpZXcuYWZ0ZXJTdWJtaXRTdWNjZXNzID0gdGhpcy5yZWZyZXNoTGlzdERhdGEuYmluZCh0aGlzKTsgICBcclxuICAgIH1cclxuXHJcbiAgICBpbml0VmlldygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiaW5pdFZpZXdcIik7XHJcbiAgICAgICAgdGhpcy5pbml0Q2xvY2soKTtcclxuICAgICAgICB0aGlzLm9uUmVhZHlJbml0UmVnVXJhRG9nb2Rla1ZpZXcoKTtcclxuICAgICAgICB0aGlzLm9uUmVhZHlJbml0RG9nb2RraURhbmFzbmppUGFydGlhbFZpZXcoKTsgICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIGJpbmRHcmlkRXZlbnRzKCl7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImJpbmRHcmlkRXZlbnRzXCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgLy9cclxuICAgICAgICAkKFwiI3JlZ1VyYURvZ29kZWtBZGRSZWNvcmRcIikub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgJChcIiNyZWdVcmFEb2dvZGVrQWRkUmVjb3JkXCIpLm9uKCdjbGljaycsIGZ1bmN0aW9uKHJvdyl7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJyZWdVcmFEb2dvZGVrQWRkUmVjb3JkLmNsaWNrXCIpO1xyXG4gICAgICAgICAgICBsZXQgY3VycmVudERhdGUgPSBtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KFwiREQuTU0uWVlZWVwiKVxyXG4gICAgICAgICAgICBfdGhpcy5hZGRSZWNvcmQoeyBTZWxlY3RlZERheTpjdXJyZW50RGF0ZX0pO1xyXG4gICAgICAgIH0pOyAgICAgICAgIFxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgJChcIi5yZWdEb2dvZGtpRGFuYXNuamlUYWJsZV9lZGl0XCIpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICQoXCIucmVnRG9nb2RraURhbmFzbmppVGFibGVfZWRpdFwiKS5vbignY2xpY2snLCBmdW5jdGlvbihyb3cpe1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwicmVnRG9nb2RraURhbmFzbmppVGFibGVfZWRpdC5jbGlja1wiKTtcclxuICAgICAgICAgICAgbGV0IF9idG5FZGl0ID0gcm93LmN1cnJlbnRUYXJnZXQ7XHJcbiAgICAgICAgICAgIGxldCBidG5FbmFibGVkID0gX2J0bkVkaXQuZ2V0QXR0cmlidXRlKFwiZGF0YS1lbmFibGVkXCIpO1xyXG4gICAgICAgICAgICBpZiAoYnRuRW5hYmxlZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT0gXCJ0cnVlXCIpIHtcclxuICAgICAgICAgICAgICAgIGxldCB6YWNldGVrID0gX2J0bkVkaXQuZ2V0QXR0cmlidXRlKFwiZGF0YS16YWNldGVrXCIpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGtvbmVjID0gX2J0bkVkaXQuZ2V0QXR0cmlidXRlKFwiZGF0YS1rb25lY1wiKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLmVkaXRSZWNvcmQoeyBpZFN0YXJ0OiB6YWNldGVrLCBpZEVuZDoga29uZWMgfSxfdGhpcyk7XHJcbiAgICAgICAgICAgIH0gICAgICAgICAgICBcclxuICAgICAgICB9KTsgICAgICAgIFxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgJChcIi5yZWdEb2dvZGtpRGFuYXNuamlUYWJsZV9kZWxldGVcIikub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgJChcIi5yZWdEb2dvZGtpRGFuYXNuamlUYWJsZV9kZWxldGVcIikub24oJ2NsaWNrJywgZnVuY3Rpb24ocm93KXtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInJlZ0RvZ29ka2lEYW5hc25qaVRhYmxlX2RlbGV0ZS5jbGlja1wiKTtcclxuICAgICAgICAgICAgbGV0IF9idG5EZWxldGUgPSByb3cuY3VycmVudFRhcmdldDtcclxuICAgICAgICAgICAgbGV0IGJ0bkVuYWJsZWQgPSBfYnRuRGVsZXRlLmdldEF0dHJpYnV0ZShcImRhdGEtZW5hYmxlZFwiKTtcclxuICAgICAgICAgICAgaWYgKGJ0bkVuYWJsZWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IFwidHJ1ZVwiKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgemFjZXRlayA9IF9idG5EZWxldGUuZ2V0QXR0cmlidXRlKFwiZGF0YS16YWNldGVrXCIpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGtvbmVjID0gX2J0bkRlbGV0ZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLWtvbmVjXCIpO1xyXG4gICAgICAgICAgICAgICAgLy8gLy9cclxuICAgICAgICAgICAgICAgIGxldCBkZWxldGVNb2RhbEZvcm1UaXRsZSA9IF90aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJCcmlzYW5qZVwiKTtcclxuICAgICAgICAgICAgICAgIGxldCBkZWxldGVNb2RhbEZvcm1Cb2R5ID0gX3RoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIkFsaSBzdGUgcHJlcHJpxI1hbmksIGRhIMW+ZWxpdGUgaXpicmlzYXRpIGRvZ29kZWs/XCIpO1xyXG4gICAgICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgICAgIF90aGlzLmRlbGV0ZVJlY29yZChkZWxldGVNb2RhbEZvcm1UaXRsZSxkZWxldGVNb2RhbEZvcm1Cb2R5LHsgaWRTdGFydDogemFjZXRlaywgaWRFbmQ6IGtvbmVjIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7ICAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgYWZ0ZXJSZWZyZXNoRGF0YSgpOnZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnVG9kYXlFdmVudHNWaWV3LmFmdGVyUmVmcmVzaExpc3REYXRhXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hMaXN0RGF0YSh0cmlnZ2VyOmJvb2xlYW4gPSB0cnVlKTp2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ1RvZGF5RXZlbnRzVmlldy5yZWZyZXNoVmlld1wiKTtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uKHJlc3BvbnNlKXtcclxuICAgICAgICAgICAgJChcIiNyZWdUb2RheVJlY29yZEZvcm1cIikuaHRtbChyZXNwb25zZSk7XHJcbiAgICAgICAgICAgIF90aGlzLmJpbmRHcmlkRXZlbnRzKCk7XHJcbiAgICAgICAgICAgIF90aGlzLnJlZ0N1cnJlbnRFdmVudFZpZXcuYmluZEZvcm1BamF4RXZlbnRzKCk7ICAgXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246XCJSRUdUb2RheUV2ZW50cy9NYWluRm9ybVBhcnRpYWxcIiBcclxuICAgICAgICAgICAgLGRhdGE6bnVsbFxyXG4gICAgICAgICAgICAsdHlwZTpcIkdFVFwiXHJcbiAgICAgICAgICAgICxzcGlubmVyRGl2SWQ6XCIjcmVnVG9kYXlSZWNvcmRMb2FkaW5nXCJcclxuICAgICAgICB9KTsgICAgICAgXHJcblxyXG4gICAgICAgIGlmICh0cmlnZ2VyICYmIHRoaXMuYWZ0ZXJSZWZyZXNoRGF0YSAhPSBudWxsKXsgdGhpcy5hZnRlclJlZnJlc2hEYXRhKCk7IH1cclxuICAgIH1cclxuXHJcbiAgICBvblJlYWR5SW5pdFJlZ1VyYURvZ29kZWtWaWV3KCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJvblJlYWR5SW5pdFJlZ1VyYURvZ29kZWtWaWV3XCIpO1xyXG5cclxuICAgICAgICBsZXQgbWVzc2FnZSA9IDxzdHJpbmc+KCQoXCIjT25Mb2FkTWVzc2FnZVwiKS52YWwoKSk7XHJcbiAgICAgICAgaWYgKG1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgYWxlcnRpZnkubWVzc2FnZShtZXNzYWdlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucmVmcmVzaExpc3REYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdENsb2NrKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJvblJlYWR5SW5pdERvZ29ka2lUZWtvY2lQYXJ0aWFsVmlld1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVDbG9jaygpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlQ2xvY2sxKCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVDbG9jazIoKTtcclxuXHJcbiAgICAgICAgc2V0SW50ZXJ2YWwodGhpcy51cGRhdGVDbG9jaywgMTAwMClcclxuICAgICAgICBzZXRJbnRlcnZhbCh0aGlzLnVwZGF0ZUNsb2NrMSwgMTAwMClcclxuICAgICAgICBzZXRJbnRlcnZhbCh0aGlzLnVwZGF0ZUNsb2NrMiwgMTAwMClcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVDbG9jaygpOiB2b2lkIHtcclxuICAgICAgICBsZXQgY2xvY2tFbGVtZW50ID0gJChcIiNjbG9ja1wiKTtcclxuXHJcbiAgICAgICAgLy8gdHJlbnV0bmkgxI1hc1xyXG4gICAgICAgIGxldCBjdXJyZW50VGltZSA9IG1vbWVudCgpO1xyXG4gICAgICAgIGxldCBjdXJyZW50VGltZV9tcyA9IG1vbWVudC5kdXJhdGlvbihjdXJyZW50VGltZS5mb3JtYXQoXCJISDptbTpzc1wiKSkuYXNNaWxsaXNlY29uZHMoKTtcclxuXHJcbiAgICAgICAgLy8gdHJlbnV0bmkgxI1hcyBrb3Qgbml6XHJcbiAgICAgICAgbGV0IGN1cnJlbnRUaW1lU3RyaW5nID0gbW9tZW50LnV0YyhNYXRoLmFicyhjdXJyZW50VGltZV9tcykpLmZvcm1hdChcIkhIOm1tOnNzXCIpO1xyXG5cclxuICAgICAgICBjbG9ja0VsZW1lbnQuaHRtbChjdXJyZW50VGltZVN0cmluZyk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlQ2xvY2sxKCk6IHZvaWQge1xyXG4gICAgICAgIGxldCBjbG9ja0VsZW1lbnQxID0gJChcIiNjbG9jazFcIik7XHJcblxyXG4gICAgICAgIC8vIHRyZW51dG5pIMSNYXNcclxuICAgICAgICBsZXQgY3VycmVudFRpbWUgPSBtb21lbnQoKTtcclxuICAgICAgICBsZXQgY3VycmVudFRpbWVfbXMgPSBtb21lbnQuZHVyYXRpb24oY3VycmVudFRpbWUuZm9ybWF0KFwiSEg6bW06c3NcIikpLmFzTWlsbGlzZWNvbmRzKCk7XHJcblxyXG4gICAgICAgIC8vc2FsZG8gdnNlaCB6YWtsanXEjWVuaWggZG9nb2Rrb3YgbmEgZG5ldm5pIHJhdm5pIChzdG9scGVjIFwiRG5ldm5pIHNhbGRvXCIgdiBcIk1lc2XEjW5pIGV2aWRlbmNpXCIpXHJcbiAgICAgICAgbGV0IHNhbGRvVXJlSEhNTSA9ICQoJyNTYWxkb1VyZUhITU0nKS52YWwoKSArIFwiOjAwXCI7XHJcbiAgICAgICAgbGV0IHNhbGRvVXJlSEhNTV9tcyA9IG1vbWVudC5kdXJhdGlvbihzYWxkb1VyZUhITU0pLmFzTWlsbGlzZWNvbmRzKCk7XHJcblxyXG4gICAgICAgIC8vemHEjWV0ZWsgemFkbmplZ2EgZG9nb2RrYSBwcmVkIHRyZW51dG5pbSDEjWFzb21cclxuICAgICAgICBsZXQgdXJhWmFkbmplZ2FEb2dvZGthID0gJCgnI1VyYVphZG5qZWdhRG9nb2RrYScpLnZhbCgpO1xyXG5cclxuICAgICAgICAvL3JhxI11bmFuamUgdGVrb8SNZSBkb2RhbmVnYSDEjWFzYVxyXG4gICAgICAgIGxldCByZXN1bHRfbXMgPSBzYWxkb1VyZUhITU1fbXM7XHJcbiAgICAgICAgaWYgKHVyYVphZG5qZWdhRG9nb2RrYSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGxldCB1cmFaYWRuamVnYURvZ29ka2FfbXMgPSBtb21lbnQuZHVyYXRpb24odXJhWmFkbmplZ2FEb2dvZGthLnRvU3RyaW5nKCkpLmFzTWlsbGlzZWNvbmRzKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodXJhWmFkbmplZ2FEb2dvZGthX21zID4gMClcclxuICAgICAgICAgICAgICAgIHJlc3VsdF9tcyA9IHJlc3VsdF9tcyArIChjdXJyZW50VGltZV9tcyAtIHVyYVphZG5qZWdhRG9nb2RrYV9tcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL21zIC0+IGZvcm1hdHRlZCBzdHJpbmdcclxuICAgICAgICBsZXQgaXNOZWdhdGl2ZSA9IHJlc3VsdF9tcyA8IDA7XHJcbiAgICAgICAgbGV0IGZvcm1hdHRlZER1cmF0aW9uID0gbW9tZW50LnV0YyhNYXRoLmFicyhyZXN1bHRfbXMpKS5mb3JtYXQoXCJIOm1tXCIpO1xyXG5cclxuICAgICAgICBpc05lZ2F0aXZlID0gaXNOZWdhdGl2ZSAmJiBmb3JtYXR0ZWREdXJhdGlvbiAhPT0gJzA6MDAnO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGlzTmVnYXRpdmUgPyBgLSR7Zm9ybWF0dGVkRHVyYXRpb259YCA6IGArJHtmb3JtYXR0ZWREdXJhdGlvbn1gO1xyXG5cclxuICAgICAgICBjbG9ja0VsZW1lbnQxLmh0bWwocmVzdWx0KTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVDbG9jazIoKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGNsb2NrRWxlbWVudDIgPSAkKFwiI2Nsb2NrMlwiKTtcclxuXHJcbiAgICAgICAgLy8gdHJlbnV0bmkgxI1hc1xyXG4gICAgICAgIGxldCBjdXJyZW50VGltZSA9IG1vbWVudCgpO1xyXG4gICAgICAgIGxldCBjdXJyZW50VGltZV9tcyA9IG1vbWVudC5kdXJhdGlvbihjdXJyZW50VGltZS5mb3JtYXQoXCJISDptbTpzc1wiKSkuYXNNaWxsaXNlY29uZHMoKTtcclxuXHJcbiAgICAgICAgLy9zYWxkbyB2c2VoIHpha2xqdcSNZW5paCBkb2dvZGtvdiBuYSBkbmV2bmkgcmF2bmkgKHN0b2xwZWMgXCJUZWtvxI1pIHNhbGRvXCIgdiBcIk1lc2XEjW5pIGV2aWRlbmNpXCIpXHJcbiAgICAgICAgbGV0IHNhbGRvVXJlVGVrb2NlSEhNTSA9ICQoJyNTYWxkb1VyZVRla29jZUhITU0nKS52YWwoKSArIFwiOjAwXCI7XHJcbiAgICAgICAgbGV0IHNhbGRvVXJlVGVrb2NlSEhNTV9saXN0ID0gc2FsZG9VcmVUZWtvY2VISE1NLnNwbGl0KFwiOlwiKTtcclxuICAgICAgICBsZXQgc2FsZG9VcmVUZWtvY2VISE1NX21zID0gKE1hdGguYWJzKE51bWJlcihzYWxkb1VyZVRla29jZUhITU1fbGlzdFswXSkgKiAzNjAwKSArIE1hdGguYWJzKE51bWJlcihzYWxkb1VyZVRla29jZUhITU1fbGlzdFsxXSkgKiA2MCkpICogMTAwMDtcclxuICAgICAgICBzYWxkb1VyZVRla29jZUhITU1fbXMgPSBzYWxkb1VyZVRla29jZUhITU1fbGlzdFswXVswXSA9PSAnLScgPyBzYWxkb1VyZVRla29jZUhITU1fbXMgKiAoLTEpIDogc2FsZG9VcmVUZWtvY2VISE1NX21zO1xyXG5cclxuICAgICAgICAvL3phxI1ldGVrIHphZG5qZWdhIGRvZ29ka2EgcHJlZCB0cmVudXRuaW0gxI1hc29tXHJcbiAgICAgICAgbGV0IHVyYVphZG5qZWdhRG9nb2RrYSA9ICQoJyNVcmFaYWRuamVnYURvZ29ka2EnKS52YWwoKTtcclxuXHJcbiAgICAgICAgLy9yYcSNdW5hbmplIHRla2/EjWUgZG9kYW5lZ2EgxI1hc2FcclxuICAgICAgICBsZXQgcmVzdWx0X21zID0gc2FsZG9VcmVUZWtvY2VISE1NX21zO1xyXG4gICAgICAgIGlmICh1cmFaYWRuamVnYURvZ29ka2EgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBsZXQgdXJhWmFkbmplZ2FEb2dvZGthX21zID0gbW9tZW50LmR1cmF0aW9uKHVyYVphZG5qZWdhRG9nb2RrYS50b1N0cmluZygpKS5hc01pbGxpc2Vjb25kcygpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHVyYVphZG5qZWdhRG9nb2RrYV9tcyA+IDApXHJcbiAgICAgICAgICAgICAgICByZXN1bHRfbXMgPSByZXN1bHRfbXMgKyAoY3VycmVudFRpbWVfbXMgLSB1cmFaYWRuamVnYURvZ29ka2FfbXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9tcyAtPiBmb3JtYXR0ZWQgc3RyaW5nIChuZSBtb3JlbW8gdXBvcmFiaXQgZW5ha2UgZnVua2NpamUga290IHYgY2xvY2sxLCBrZXIgdHVka2FqIGxhaGtvIHByaWRlIGRvIHVyIHZlxI1qaWggb2QgMjQpXHJcbiAgICAgICAgbGV0IGlzTmVnYXRpdmUgPSByZXN1bHRfbXMgPCAwO1xyXG4gICAgICAgIHJlc3VsdF9tcyA9IE1hdGguYWJzKHJlc3VsdF9tcyk7XHJcblxyXG4gICAgICAgIGxldCBob3VycyA9IE1hdGguZmxvb3IocmVzdWx0X21zIC8gMzYwMDAwMCk7XHJcbiAgICAgICAgbGV0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKChyZXN1bHRfbXMgLSBob3VycyAqIDM2MDAwMDApIC8gNjAwMDApO1xyXG5cclxuICAgICAgICBsZXQgaG91cnNTdHIgPSBob3VycztcclxuICAgICAgICBsZXQgbWludXRlc1N0ciA9IChtaW51dGVzIDwgMTAgPyBcIjBcIiA6IFwiXCIpICsgbWludXRlcztcclxuXHJcbiAgICAgICAgbGV0IGZvcm1hdHRlZER1cmF0aW9uID0gaG91cnNTdHIgKyAnOicgKyBtaW51dGVzU3RyO1xyXG4gICAgICAgIGlzTmVnYXRpdmUgPSBpc05lZ2F0aXZlICYmIGZvcm1hdHRlZER1cmF0aW9uICE9PSAnMDowMCc7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gaXNOZWdhdGl2ZSA/IGAtJHtmb3JtYXR0ZWREdXJhdGlvbn1gIDogYCske2Zvcm1hdHRlZER1cmF0aW9ufWA7XHJcblxyXG4gICAgICAgIGNsb2NrRWxlbWVudDIuaHRtbChyZXN1bHQpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uUmVhZHlJbml0RG9nb2RraURhbmFzbmppUGFydGlhbFZpZXcoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIm9uUmVhZHlJbml0RG9nb2RraURhbmFzbmppUGFydGlhbFZpZXdcIik7XHJcblxyXG4gICAgICAgICQoXCIjcmVnRG9nb2RraURhbmFzbmppVGFibGUgdGJvZHkgdHJcIikuZWFjaChcclxuICAgICAgICAgICAgZnVuY3Rpb24gKGksIHJvdykge1xyXG4gICAgICAgICAgICAgICAgLy8ga29kYSB6YWtvbWVudGlyYW5hLCBrZXIgbmkgcG90cmVibmEuXHJcbiAgICAgICAgICAgICAgICAvLyDEjGUgbmkgemFrb21lbnRpcmFuYSwgc2UgcG9qYXZpam8gdGXFvmF2ZSBwcmkgcmVmcmVzaCB2aWV3IFwiRG9nb2RraSBuYSBkYW5cIiwgaW4gc2UgcG9samUgXCJLb25lY1wiIG9iYXJ2YSByZGVjZSB6YXJhZGkgc3BvZG5qZSBrb2RlXHJcblxyXG4gICAgICAgICAgICAgICAgLy92YXIgJGFjdHVhbFJvdyA9ICQocm93KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvL2lmICgkYWN0dWFsUm93LmNoaWxkcmVuKCd0ZDpudGgtY2hpbGQoMiknKS50ZXh0KCkgPT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgLy8gICAgJCh0aGlzKS5jaGlsZHJlbigndGQ6bnRoLWNoaWxkKDYpJykuY3NzKFwiYmFja2dyb3VuZC1jb2xvclwiLCAnI0ZBQzBCRScpO1xyXG4gICAgICAgICAgICAgICAgLy99IGVsc2UgaWYgKCRhY3R1YWxSb3cuY2hpbGRyZW4oJ3RkOm50aC1jaGlsZCgxKScpLnRleHQoKSA9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAkKHRoaXMpLmNoaWxkcmVuKCd0ZDpudGgtY2hpbGQoNSknKS5jc3MoXCJiYWNrZ3JvdW5kLWNvbG9yXCIsICcjRkFDMEJFJyk7XHJcbiAgICAgICAgICAgICAgICAvL31cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQoXCIjd2ViZ3JpZDEgdGg6bnRoLWNoaWxkKDEpXCIpLmhpZGUoKTtcclxuICAgICAgICAkKFwiI3dlYmdyaWQxIHRoOm50aC1jaGlsZCgyKVwiKS5oaWRlKCk7XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG5cclxuIiwi77u/Ly8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9hbGVydGlmeS9pbmRleC5kLnRzXCIgLz5cclxuaW1wb3J0IHsgZ2xvYmFsLGlzVW5EZWZpbmVkLCBmb3JtYXREYXRlLCBzZXRNb2RhbEZvcm1aSW5kZXgsIGlzRW1wdHkgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BTZXJ2aWNlc0NvcmUgfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXNlcnZpY2VzLWNvcmVcIjtcclxuaW1wb3J0IHsgU2FvcFdlYkdyaWQsIFNhb3BXZWJHcmlkUHJvcGVydGllcywgU2FvcFdlYkdyaWRUb29sYmFyLCBTYW9wV2ViR3JpZFRvb2xiYXJCdXR0b24sIFNhb3BXZWJEYXRhVGFibGUgfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLWdyaWRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wUmVnRGV0YWlsc1RhYmxlVmlldyB7XHJcbiAgICBwcml2YXRlIF9saWJOYW1lOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF90YWJsZURpdklkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIHdlYkdyaWQ6IFNhb3BXZWJHcmlkO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGxpYk5hbWU6IHN0cmluZyA9IFwiXCIsIHRhYmxlRGl2SWQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX2xpYk5hbWUgPSBsaWJOYW1lO1xyXG4gICAgICAgIHRoaXMuX3RhYmxlRGl2SWQgPSB0YWJsZURpdklkO1xyXG4gICAgfSBcclxuXHJcbiAgICBiaW5kR3JpZEV2ZW50cygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0RldGFpbHNUYWJsZVZpZXcuYmluZEdyaWRFdmVudHNcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBcclxuICAgICAgICAkKFwiYm9keVwiKS5vZmYoXCJjbGlja1wiLCB0aGlzLl90YWJsZURpdklkICsgXCIgdGQudGQtYWN0aW9uLWRldGFpbHNcIik7XHJcbiAgICAgICAgJChcImJvZHlcIikub24oXCJjbGlja1wiLCB0aGlzLl90YWJsZURpdklkICsgXCIgdGQudGQtYWN0aW9uLWRldGFpbHNcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBsZXQgc2VsZWN0ZWRSb3cgPSAkKHRoaXMpLmNsb3Nlc3QoXCJ0clwiKTtcclxuICAgICAgICAgICAgbGV0IHNlbGVjdGVkRGF5ID0gc2VsZWN0ZWRSb3cuZmluZChcInRkXCIpLmVxKDIpLnRleHQoKVxyXG4gICAgICAgICAgICBsZXQgYWN0aW9uRGV0YWlsc0NvbHVtbiA9IHNlbGVjdGVkUm93LmZpbmQoXCJ0ZFwiKS5lcSgxKTtcclxuICAgICAgICAgICAgbGV0IGRhdHVtS2V5ID0gc2VsZWN0ZWRSb3cuYXR0cihcImRhdGEtZGF0dW1cIik7XHJcbiAgICAgICAgICAgIGxldCBzaWZyYVphcG9zbGVuaUtleSA9IHNlbGVjdGVkUm93LmF0dHIoXCJkYXRhLXNpZnJhemFwb3NsZW5pXCIpO1xyXG4gICAgICAgICAgICBfdGhpcy5zaG93SGlkZURldGFpbHNTdWJUYWJsZShzZWxlY3RlZFJvdywgYWN0aW9uRGV0YWlsc0NvbHVtbiwgc2VsZWN0ZWREYXksIGRhdHVtS2V5LCBzaWZyYVphcG9zbGVuaUtleSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzaG93SGlkZURldGFpbHNTdWJUYWJsZShzZWxlY3RlZFJvdzogSlF1ZXJ5PEhUTUxUYWJsZVJvd0VsZW1lbnQ+LCBhY3Rpb25EZXRhaWxzQ29sdW1uOiBKUXVlcnk8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+LCBzZWxlY3RlZERheTogc3RyaW5nLCBkYXR1bUtleTogc3RyaW5nLCBzaWZyYVphcG9zbGVuaUtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdEZXRhaWxzVGFibGVWaWV3LnNob3dIaWRlRGV0YWlsc1N1YlRhYmxlXCIpO1xyXG5cclxuICAgICAgICBsZXQgaWNvbkVsZW1lbnQgPSBhY3Rpb25EZXRhaWxzQ29sdW1uLmZpbmQoXCJzcGFuXCIpO1xyXG5cclxuICAgICAgICBsZXQgcm93RGV0YWlsc0lkID0gXCIjZGV0YWlsUm93XCIgKyBkYXR1bUtleTtcclxuICAgICAgICBsZXQgcm93RGV0YWlsc0lkRWxlbWVudCA9ICQocm93RGV0YWlsc0lkKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmlzRGV0YWlsc1N1YlRhYmxlU2hvd2VkKGljb25FbGVtZW50KSkge1xyXG4gICAgICAgICAgICAvLyBzaG93IGRldGFpbHMgc3VidGFibGVcclxuICAgICAgICAgICAgIC8vcHJldmVyaW0sIMSNZSB0YWJlbGEgemUgb2JzdGFqYVxyXG4gICAgICAgICAgICBsZXQgZGV0YWlsUm93RGl2SWQgPSBcIiNkZXRhaWxSb3dEaXZcIiArIGRhdHVtS2V5O1xyXG4gICAgICAgICAgICBsZXQgZGV0YWlsUm93VGFibGVFbGVtZW50ID0gJChkZXRhaWxSb3dEaXZJZCArIFwiIHRhYmxlXCIpO1xyXG4gICAgICAgICAgICBpZiAoZGV0YWlsUm93VGFibGVFbGVtZW50Lmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyB0YWJlbGUgbmksIGdyZW1vIG5hIHNlcnZlciBwbyBwb2RhdGtlIHphIHByaWthelxyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXREZXRhaWxzU3ViVGFibGUoZGV0YWlsUm93RGl2SWQsIHNlbGVjdGVkRGF5LCBzaWZyYVphcG9zbGVuaUtleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHByaWthemkvc2tyaWogYm90dG9tIGJvcmRlclxyXG4gICAgICAgIHNlbGVjdGVkUm93LnRvZ2dsZUNsYXNzKFwic2FvcC10YWJsZS1yb3ctYm9yZGVyLWJvdHRvbS1ub25lXCIpXHJcblxyXG4gICAgICAgIC8vIHByaWthemkvc2tyaWogZGV0YWlscyB0YWJlbG9cclxuICAgICAgICByb3dEZXRhaWxzSWRFbGVtZW50LnRvZ2dsZUNsYXNzKFwic2FvcC10YWJsZS1yb3ctaGlkZGVuXCIpO1xyXG4gICAgICAgIHJvd0RldGFpbHNJZEVsZW1lbnQudG9nZ2xlQ2xhc3MoXCJzYW9wLXRhYmxlLXJvdy1zaG93ZWRcIik7XHJcblxyXG4gICAgICAgIC8vIHNwcmVtZW1iYSBpa29uZVxyXG4gICAgICAgIGljb25FbGVtZW50LnRvZ2dsZUNsYXNzKFwic2FvcC1pbWctcmlnaHRcIik7XHJcbiAgICAgICAgaWNvbkVsZW1lbnQudG9nZ2xlQ2xhc3MoXCJzYW9wLWltZy1kb3duXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaXNEZXRhaWxzU3ViVGFibGVTaG93ZWQoaWNvbkVsZW1lbnQ6IEpRdWVyeTxIVE1MU3BhbkVsZW1lbnQ+KTogYm9vbGVhbiB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdEZXRhaWxzVGFibGVWaWV3LmlzRGV0YWlsc1N1YlRhYmxlU2hvd2VkXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gaWNvbkVsZW1lbnQuaGFzQ2xhc3MoXCJzYW9wLWltZy1kb3duXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0RGV0YWlsc1N1YlRhYmxlKGRldGFpbFJvd0RpdklkOiBzdHJpbmcsIHNlbGVjdGVkRGF5OiBzdHJpbmcsIHNpZnJhWmFwb3NsZW5pOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0RldGFpbHNUYWJsZVZpZXcuZ2V0RGV0YWlsc1N1YlRhYmxlXCIpO1xyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIGxldCBzYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgICAgICBsZXQgcGFyYW1zID0geyBTZWxlY3RlZERheTogc2VsZWN0ZWREYXksIFNpZnJhWmFwb3NsZW5pOiBzaWZyYVphcG9zbGVuaSB9O1xyXG5cclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAkKGRldGFpbFJvd0RpdklkKS5odG1sKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgX3RoaXMuaW5pdFdlYkdyaWQoKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHNhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjogXCJSRUdEYXlFdmVudHMvR2V0UmVnVXJhQnJvd3NlRXZlbnRzVGFibGVcIlxyXG4gICAgICAgICAgICAsIGRhdGE6IHBhcmFtc1xyXG4gICAgICAgICAgICAsIHR5cGU6IFwiR0VUXCJcclxuICAgICAgICAgICAgLy8sIHNwaW5uZXJEaXZJZDogXCIjYXR0ZW5kYW5jZUFsbEVtcGxveWVlc0xvYWRpbmdcIlxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFdlYkdyaWQoKSB7XHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLndlYkdyaWQgPSBuZXcgU2FvcFdlYkdyaWQodGhpcy5fbGliTmFtZSk7XHJcbiAgICAgICAgbGV0IGdyaWRQcm9wZXJ0aWVzOiBTYW9wV2ViR3JpZFByb3BlcnRpZXM7XHJcblxyXG4gICAgICAgIGdyaWRQcm9wZXJ0aWVzID0ge1xyXG4gICAgICAgICAgICBncmlkSWQ6IFwiI3Nhb3BXZWJHcmlkRGV0YWlsc1wiXHJcbiAgICAgICAgICAgICwgY3NzOiBcInRhYmxlLWNvbHVtbi1ob2xkZXItbGFzdFwiXHJcbiAgICAgICAgICAgICwgdG9vbGJhcjogbnVsbFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLndlYkdyaWQuaW5pdChncmlkUHJvcGVydGllcyk7XHJcbiAgICB9XHJcbiAgICAvL1xyXG59XHJcblxyXG5cclxuIiwi77u/Ly8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9hbGVydGlmeS9pbmRleC5kLnRzXCIgLz5cclxuaW1wb3J0IHsgZ2xvYmFsLGlzVW5EZWZpbmVkLCBmb3JtYXREYXRlLCBzZXRNb2RhbEZvcm1aSW5kZXgsIGlzRW1wdHkgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BXZkFjdGlvbiB9IGZyb20gXCIuLi9jb3JlL3Nhb3Atdmlldy1mb3JtXCI7XHJcbmltcG9ydCB7IFNhb3BTZXJ2aWNlc0NvcmUgfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXNlcnZpY2VzLWNvcmVcIjtcclxuaW1wb3J0IHsgU2FvcFJlZ1VyYURvZ29kZWtWaWV3IH0gZnJvbSBcIi4vc2FvcC1yZWdVcmFEb2dvZGVrLXZpZXdcIjtcclxuaW1wb3J0IHsgU2FvcFJlZ0RldGFpbHNUYWJsZVZpZXcgfSBmcm9tIFwiLi9zYW9wLXJlZ1VyYS1kZXRhaWxzLXRhYmxlLXZpZXdcIjtcclxuaW1wb3J0IHsgU2FvcFJlZ1VyYURhblZpZXcgfSBmcm9tIFwiLi9zYW9wLXJlZ1VyYURhbi12aWV3XCJcclxuaW1wb3J0IHsgU2FvcFNlbGVjdE1vbnRoWWVhciB9IGZyb20gXCIuLi9Db21wb25lbnRzL3Nhb3Atc2VsZWN0LW1vbnRoLXllYXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wUmVnVmlldyB7XHJcbiAgICBwcml2YXRlIF9saWJOYW1lOnN0cmluZztcclxuICAgIHByaXZhdGUgX3Nhb3BSZWdVcmFEb2dvZGVrVmlldzE6U2FvcFJlZ1VyYURvZ29kZWtWaWV3O1xyXG4gICAgcHJpdmF0ZSBfcGVyaW9kQ2hlY2tCb3hJZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBzYW9wUmVnRGV0YWlsc1RhYmxlVmlldzogU2FvcFJlZ0RldGFpbHNUYWJsZVZpZXc7XHJcbiAgICBwcml2YXRlIF9zYW9wUmVnVXJhRGFuVmlldzpTYW9wUmVnVXJhRGFuVmlldztcclxuICAgIHB1YmxpYyBfc2FvcFNlbGVjdE1vbnRoWWVhcjogU2FvcFNlbGVjdE1vbnRoWWVhcjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihsaWJOYW1lOnN0cmluZyA9IFwiXCIpIHtcclxuICAgICAgICB0aGlzLl9saWJOYW1lID0gbGliTmFtZTtcclxuICAgICAgICB0aGlzLl9zYW9wUmVnVXJhRG9nb2Rla1ZpZXcxID0gbmV3IFNhb3BSZWdVcmFEb2dvZGVrVmlldyhcIiNyZWdEb2dvZGVrVmlldzBcIix0aGlzLl9saWJOYW1lKTtcclxuICAgICAgICB0aGlzLl9zYW9wUmVnVXJhRG9nb2Rla1ZpZXcxLnJlZnJlc2hEYXRhID0gdGhpcy5yZWZyZXNoUmVnVXJhQnJvd3NlVmlldy5iaW5kKHRoaXMpO1xyXG4gICAgICAgIC8vdGhpcy5fc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICAgICAgdGhpcy5fcGVyaW9kQ2hlY2tCb3hJZCA9IFwiI2NicGVyaW9kQ2hlY2tCb3hcIjtcclxuICAgICAgICB0aGlzLnNhb3BSZWdEZXRhaWxzVGFibGVWaWV3ID0gbmV3IFNhb3BSZWdEZXRhaWxzVGFibGVWaWV3KHRoaXMuX2xpYk5hbWUgKyBcIi5zYW9wUmVnRGV0YWlsc1RhYmxlVmlld1wiLCBcIiNyZWctZ3JpZFwiKTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMuX3Nhb3BSZWdVcmFEYW5WaWV3ID0gbmV3IFNhb3BSZWdVcmFEYW5WaWV3KFwiI3JlZ0RvZ29kZWtWaWV3MFwiLHRoaXMuX2xpYk5hbWUgKyBcIi5fc2FvcFJlZ1VyYURhblZpZXdcIik7XHJcbiAgICAgICAgdGhpcy5fc2FvcFJlZ1VyYURhblZpZXcuYWZ0ZXJSZWZyZXNoRGF0YSA9IHRoaXMuYWZ0ZXJSZWZyZXNoUmVnVXJhRGFuVmlldy5iaW5kKHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLl9zYW9wU2VsZWN0TW9udGhZZWFyID0gbmV3IFNhb3BTZWxlY3RNb250aFllYXIoXCJcIiwgXCIjc2VsZWN0TWVzZWNMZXRvXCIsIHRoaXMuX2xpYk5hbWUgKyBcIi5fc2FvcFNlbGVjdE1vbnRoWWVhclwiKTtcclxuICAgICAgICB0aGlzLl9zYW9wU2VsZWN0TW9udGhZZWFyLmFmdGVyTW9udGhZZWFyVmFsdWVzQ2hhbmdlZCA9IHRoaXMuYWZ0ZXJTYW9wTW9udGhZZWFyVmFsdWVzQ2hhbmdlZC5iaW5kKHRoaXMpO1xyXG4gICAgfSBcclxuXHJcbiAgICBpbml0VmlldygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiaW5pdFJlZ1VyYUJyb3dzZVZpZXdcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgX3Nhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgICAgIF9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uKHJlc3BvbnNlKXtcclxuICAgICAgICAgICAgJChcIiN0YWJSZWdCclwiKS5odG1sKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgX3RoaXMuaW5pdFJlZ1VyYUNvbnRyb2xzKCk7XHJcbiAgICAgICAgICAgIF90aGlzLnJlZnJlc2hCdXR0b25zU3RhdGUoKTtcclxuICAgICAgICAgICAgX3RoaXMucmVmcmVzaFRhYmxlRGF0YSgpOyAgICBcclxuICAgICAgICB9O1xyXG4gICAgICAgIF9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246XCJSRUdNb250aEV2ZW50cy9NYWluRm9ybVBhcnRpYWxcIlxyXG4gICAgICAgICAgICAsdHlwZTpcIkdFVFwiXHJcbiAgICAgICAgICAgICxzcGlubmVyRGl2SWQ6XCIjc2FvcExvYWRpbmd0YWJSZWdCclwiXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdFJlZ1VyYUNvbnRyb2xzKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJpbml0UmVnVXJhQ29udHJvbHNcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgJCgnI2J0bkFkZFJlY29yZCcpLmNsaWNrKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImJ0bkFkZFJlY29yZFwiKTtcclxuICAgICAgICAgICAgbGV0IF90b2RheSA9IGZvcm1hdERhdGUobmV3IERhdGUoKSwgXCJkLm1tLnl5eXlcIik7XHJcbiAgICAgICAgICAgIGxldCBfZGF0YSA9IHsgU2VsZWN0ZWREYXk6IF90b2RheSB9XHJcblxyXG4gICAgICAgICAgICBfdGhpcy5fc2FvcFJlZ1VyYURvZ29kZWtWaWV3MS5vbkVycm9yQ2FsbGJhY2sgPSBcIlwiO1xyXG4gICAgICAgICAgICBfdGhpcy5fc2FvcFJlZ1VyYURvZ29kZWtWaWV3MS5zaG93Vmlld0Zvcm0oU2FvcFdmQWN0aW9uLndmYUFkZFJlY29yZCwgX2RhdGEsIG51bGwpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkKCcjYnRuU2VuZE1haWwnKS5jbGljayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIF90aGlzLnNlbmRTdW1tYXJ5SG91cnMoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgXHJcbiAgICAgICAgdGhpcy5fc2FvcFNlbGVjdE1vbnRoWWVhci5pbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VuZFN1bW1hcnlIb3VycygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic2VuZFN1bW1hcnlIb3Vyc1wiKTtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICBsZXQgc2VsZWN0ZWRNb250aFllYXIgPSB0aGlzLl9zYW9wU2VsZWN0TW9udGhZZWFyLmdldFNlbGVjdGVkTW9udGhZZWFyKCk7XHJcbiAgICAgICAgbGV0IHBhcmFtcyA9IHsgbGV0bzogc2VsZWN0ZWRNb250aFllYXIubGV0bywgbWVzZWM6IHNlbGVjdGVkTW9udGhZZWFyLm1lc2VjIH07XHJcblxyXG4gICAgICAgIGxldCBfc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICAgICAgX3Nhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24ocmVzcG9uc2Upe1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgYWxlcnRpZnkubWVzc2FnZShyZXNwb25zZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICQoXCIjdnNNb250aGx5UmVjb3JkXCIpLmh0bWwocmVzcG9uc2Uudmlld0NvbnRlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICBfc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOiBcIlJFR01vbnRoRXZlbnRzL1N1bW1hcnlIb3Vyc1wiXHJcbiAgICAgICAgICAgICwgZGF0YTogcGFyYW1zXHJcbiAgICAgICAgICAgICwgdHlwZTogXCJHRVRcIlxyXG4gICAgICAgIH0pOyAgICAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgYWZ0ZXJSZWZyZXNoRGF0YSgpOnZvaWR7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdWaWV3LmFmdGVyUmVmcmVzaERhdGFcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaFJlZ1VyYUJyb3dzZVZpZXcodHJpZ2dlcjpib29sZWFuID0gdHJ1ZSk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwicmVmcmVzaFJlZ1VyYUJyb3dzZVZpZXdcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgbGV0IHNlbGVjdGVkTW9udGhZZWFyID0gdGhpcy5fc2FvcFNlbGVjdE1vbnRoWWVhci5nZXRTZWxlY3RlZE1vbnRoWWVhcigpO1xyXG4gICAgICAgIGxldCBwYXJhbXMgPSB7IGxldG86IHNlbGVjdGVkTW9udGhZZWFyLmxldG8sIG1lc2VjOiBzZWxlY3RlZE1vbnRoWWVhci5tZXNlYyB9O1xyXG5cclxuICAgICAgICBsZXQgX3Nhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgICAgIF9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uKHJlc3BvbnNlKXtcclxuICAgICAgICAgICAgJChcIiNyZWctZ3JpZFwiKS5odG1sKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgX3RoaXMucmVmcmVzaEJ1dHRvbnNTdGF0ZSgpO1xyXG4gICAgICAgICAgICBfdGhpcy5yZWZyZXNoVGFibGVEYXRhKCk7IFxyXG4gICAgICAgICAgICBfdGhpcy5yZWZyZXNoQ2FwdGlvbnMoKTsgIFxyXG5cclxuICAgICAgICAgICAgX3RoaXMuX3Nhb3BTZWxlY3RNb250aFllYXIuc2V0UmVmcmVzaGluZ1JlY29yZHNDb21wbGV0ZSgpO1xyXG4gICAgICAgICB9O1xyXG4gICAgICAgIF9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246XCJSRUdNb250aEV2ZW50cy9HZXRSZWdVcmFUYWJsZVZpZXdcIlxyXG4gICAgICAgICAgICAsIGRhdGE6IHBhcmFtc1xyXG4gICAgICAgICAgICAsIHR5cGU6IFwiR0VUXCJcclxuICAgICAgICAgICAgLHNwaW5uZXJEaXZJZDpcIiNzYW9wTG9hZGluZ1JlZ0dyaWRcIlxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAodHJpZ2dlciAmJiB0aGlzLmFmdGVyUmVmcmVzaERhdGEgIT0gbnVsbCl7IHRoaXMuYWZ0ZXJSZWZyZXNoRGF0YSgpOyB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaENhcHRpb25zKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJyZWZyZXNoQ2FwdGlvbnNcIik7XHJcbiAgICAgICAgbGV0IF9jYXB0aW9uTW9udGhOYW1lID0gJCgnI2NhcHRpb25Nb250aE5hbWUnKTtcclxuICAgICAgICBpZiAoX2NhcHRpb25Nb250aE5hbWUubGVuZ3RoKXtcclxuICAgICAgICAgICAgJCgnI2NhcHRpb24nKS5odG1sKF9jYXB0aW9uTW9udGhOYW1lLnZhbCgpLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoQnV0dG9uc1N0YXRlKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJyZWZyZXNoQnV0dG9uc1N0YXRlXCIpO1xyXG4gICAgICAgIGlmICh0eXBlb2YgJChcIiNidG5BZGRSZWNvcmRFbmFibGVkXCIpLnZhbCgpID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBfYnRuQWRkUmVjb3JkRW5hYmxlZCA9ICQoXCIjYnRuQWRkUmVjb3JkRW5hYmxlZFwiKS52YWwoKS50b1N0cmluZygpO1xyXG4gICAgICAgIGlmICghaXNVbkRlZmluZWQoX2J0bkFkZFJlY29yZEVuYWJsZWQpICYmIF9idG5BZGRSZWNvcmRFbmFibGVkLnRvTG93ZXJDYXNlKCkgPT0gXCJ0cnVlXCIpIHtcclxuICAgICAgICAgICAgJCgnI2J0bkFkZFJlY29yZCcpLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTsgICAgICAgICAgICBcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAkKCcjYnRuQWRkUmVjb3JkJykuYXR0cihcImRpc2FibGVkXCIsIFwidHJ1ZVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaFRhYmxlRGF0YShzZXRDbGlja0V2ZW50czogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiUmVnVXJhQnJvd3NlVmlldy0+cmVmcmVzaFRhYmxlRGF0YVwiKTtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgICQoXCIjcmVnLWdyaWQgdGJvZHkgdHJcIikuZWFjaChcclxuICAgICAgICAgICAgZnVuY3Rpb24gKGksIHJvdykge1xyXG4gICAgICAgICAgICAgICAgdmFyICRhY3R1YWxSb3cgPSAkKHJvdyk7XHJcbiAgICAgICAgICAgICAgICB2YXIgJGRhdGEgPSAkYWN0dWFsUm93LmNoaWxkcmVuKCd0ZDpudGgtY2hpbGQoMSknKS50ZXh0KCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgJHdkID0gJGRhdGEuc3Vic3RyaW5nKDAsMSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgJGNvbCA9ICRkYXRhLnN1YnN0cmluZygxLDIpO1xyXG4gICAgICAgICAgICAgICAgdmFyICRhZGF0ZSA9ICRkYXRhLnN1YnN0cmluZygyLDMpO1xyXG4gICAgICAgICAgICAgICAgdmFyICR4eSA9ICRhY3R1YWxSb3cuY2hpbGRyZW4oJ3RkOm50aC1jaGlsZCg0KScpO1xyXG4gICAgICAgICAgICAgICAgbGV0IHN0YXR1c0NhcHRpb24gPSAkeHkuaHRtbCgpO1xyXG4gICAgICAgICAgICAgICAgJHh5Lmh0bWwoXCJcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgJHh5LmNzcygnYmFja2dyb3VuZC1yZXBlYXQnLCAnbm8tcmVwZWF0Jyk7XHJcbiAgICAgICAgICAgICAgICAkeHkuY3NzKCdiYWNrZ3JvdW5kLXBvc2l0aW9uJywgJ3JpZ2h0Jyk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCR3ZCA9PSBcIk5cIikge1xyXG4gICAgICAgICAgICAgICAgICAgICRhY3R1YWxSb3cuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyNGN0Y3RjcnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoJGFkYXRlID09IFwiQlwiKSB7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCRjb2wgPT0gXCJSXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICR4eS5hcHBlbmQoJzxzcGFuIGNsYXNzPVwic2FvcC1jbC1yZWQgc2FvcC1pbWctZXhjbGFtYXRpb24tbWFyay1zb2xpZC1jZlwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDEwJTtcIj48L3NwYW4+ICcpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgkY29sID09IFwiWVwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJHh5LmFwcGVuZCgnPHNwYW4gY2xhc3M9XCJzYW9wLWNsLW9yYW5nZSBzYW9wLWltZy1leGNsYW1hdGlvbi1tYXJrLXNvbGlkLWNmXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogMTAlO1wiPjwvc3Bhbj4gJyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCRjb2wgPT0gXCJXXCIgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICR4eS5hcHBlbmQoJzxzcGFuIGNsYXNzPVwic2FvcC1jbC1ncmVlbiBzYW9wLWltZy1jaGVjay1tYXJrLXNvbGlkLWNmXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogMTAlO1wiPjwvc3Bhbj4gJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCRhY3R1YWxSb3cuY2hpbGRyZW4oJ3RkOm50aC1jaGlsZCgxKScpLnRleHQoKSA9PSBcIlJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICR4eS5hcHBlbmQoJzxzcGFuIGNsYXNzPVwic2FvcC1jbC1yZWQgaW1nLWV4Y2xhbWF0aW9uLW1hcmstc29saWQgc2ktc1wiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDEwJTtcIj48L3NwYW4+Jyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCRhY3R1YWxSb3cuY2hpbGRyZW4oJ3RkOm50aC1jaGlsZCgxKScpLnRleHQoKSA9PSBcIllcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICR4eS5hcHBlbmQoJzxzcGFuIGNsYXNzPVwic2FvcC1jbC1vcmFuZ2Ugc2FvcC1pbWctZXhjbGFtYXRpb24tbWFyay1zb2xpZCBzaS1zXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogMTAlO1wiPjwvc3Bhbj4nKTtcclxuICAgICAgICAgICAgICAgICAgICAkeHkuY3NzKCdiYWNrZ3JvdW5kLXJlcGVhdCcsICduby1yZXBlYXQnKTtcclxuICAgICAgICAgICAgICAgICAgICAkeHkuY3NzKCdiYWNrZ3JvdW5kLXBvc2l0aW9uJywgJ3JpZ2h0Jyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCRhY3R1YWxSb3cuY2hpbGRyZW4oJ3RkOm50aC1jaGlsZCgxKScpLnRleHQoKSA9PSBcIldcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICRhY3R1YWxSb3cuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyNGN0Y3RjcnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoJGFjdHVhbFJvdy5jaGlsZHJlbigndGQ6bnRoLWNoaWxkKDEpJykudGV4dCgpID09IFwiR1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJHh5LmFwcGVuZCgnPHNwYW4gY2xhc3M9XCJzYW9wLWNsLWdyZWVuIHNhb3AtaW1nLWNoZWNrLW1hcmstc29saWQgc2ktc1wiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDEwJTtcIj48L3NwYW4+Jyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgJHh5LmFwcGVuZChzdGF0dXNDYXB0aW9uKTtcclxuICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQoXCIjcmVnLWdyaWQgdGg6bnRoLWNoaWxkKDEpXCIpLmhpZGUoKTtcclxuICAgICAgICAkKFwiI3JlZy1ncmlkIHRkOm50aC1jaGlsZCgxKVwiKS5oaWRlKCk7XHJcblxyXG4gICAgICAgIGxldCBzaWZyYVphcG9zbGVuaSA9ICQoXCIjcmVnLWdyaWQgI1NpZnJhWmFwb3NsZW5pXCIpLnZhbCgpO1xyXG5cclxuICAgICAgICBsZXQgc2VsZWN0ZWRNb250aFllYXIgPSB0aGlzLl9zYW9wU2VsZWN0TW9udGhZZWFyLmdldFNlbGVjdGVkTW9udGhZZWFyKCk7XHJcbiAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIGlmIChkLmdldEZ1bGxZZWFyKCkgPT0gc2VsZWN0ZWRNb250aFllYXIubGV0byAmJiAoZC5nZXRNb250aCgpICsgMSkgPT0gc2VsZWN0ZWRNb250aFllYXIubWVzZWMpIHtcclxuICAgICAgICAgICAgLy8gc2hvdyBzZWxlY3RlZCB0b2RheSBpbiB0YWJsZSBvbmx5IGZvciBjdXJyZW50IG1vbnRoXHJcbiAgICAgICAgICAgIHZhciB3ZWVrRGF5ID0gZC5nZXRVVENEYXRlKCk7XHJcbiAgICAgICAgICAgICQoXCIjcmVnLWdyaWQgdHJbdGFiaW5kZXg9XFxcIlwiICsgU3RyaW5nKHdlZWtEYXkpICsgXCJcXFwiXVwiKS5hZGRDbGFzcyhcInNhb3AtdGFibGUtc2VsZWN0ZWQtcm93XCIpO1xyXG4gICAgICAgICAgICAkKFwiI3JlZy1ncmlkIHRyW3RhYmluZGV4PVxcXCJcIiArIFN0cmluZyh3ZWVrRGF5KSArIFwiXFxcIl1cIikuZm9jdXMoKTtcclxuICAgICAgICAgICAgJChcIiNyZWctZ3JpZCB0clt0YWJpbmRleD1cXFwiXCIgKyBTdHJpbmcod2Vla0RheSkgKyBcIlxcXCJdXCIpLmJsdXIoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzZXRDbGlja0V2ZW50cykge1xyXG4gICAgICAgICAgICAkKFwiYm9keVwiKS5vZmYoXCJjbGlja1wiLCBcIiNyZWctZ3JpZCB0ci5zYW9wLXRyLW1haW4gdGQ6bm90KC50ZC1hY3Rpb24tZGV0YWlscylcIik7XHJcbiAgICAgICAgICAgICQoXCJib2R5XCIpLm9uKFwiY2xpY2tcIiwgXCIjcmVnLWdyaWQgdHIuc2FvcC10ci1tYWluIHRkOm5vdCgudGQtYWN0aW9uLWRldGFpbHMpXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZhciBTZWxlY3RlZERheSA9ICQodGhpcykuY2xvc2VzdChcInRyXCIpLmZpbmQoXCJ0ZFwiKS5lcSgyKS50ZXh0KClcclxuICAgICAgICAgICAgICAgIGxldCBfc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICAgICAgICAgICAgICBfc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbihyZXNwb25zZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgJChcIiNmdWxsc2NyZWVuTW9kYWxCb2R5XCIpLmh0bWwocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICQoJyNzYW9wTW9kYWxGUycpLm1vZGFsKCdzaG93Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0TW9kYWxGb3JtWkluZGV4KCcjc2FvcE1vZGFsRlMnKTtcclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5iaW5kQnV0dG9uc0V2ZW50c1ZpZXcoKTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBfc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb246XCJSRUdEYXlFdmVudHMvR2V0UmVnVXJhQnJvd3NlVmlld1BWP1NlbGVjdGVkRGF5PVwiICsgU2VsZWN0ZWREYXkrXCImZW1wbG95ZWVJZD1cIitzaWZyYVphcG9zbGVuaVxyXG4gICAgICAgICAgICAgICAgICAgICx0eXBlOlwiR0VUXCJcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNhb3BSZWdEZXRhaWxzVGFibGVWaWV3LmJpbmRHcmlkRXZlbnRzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblN1Ym1pdFN1Y2Nlc3MocmVzdWx0OiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zYW9wUmVnVXJhRG9nb2Rla1ZpZXcxLm9uU3VibWl0U3VjY2VzcyhyZXN1bHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBiaW5kQnV0dG9uc0V2ZW50c1ZpZXcoKTp2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiUmVnVXJhQnJvd3NlVmlldy0+YmluZEV2ZW50c1JlZ1VyYURhblZpZXdcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgdGhpcy5fc2FvcFJlZ1VyYURhblZpZXcuaW5pdFZpZXcoKTtcclxuXHJcbiAgICAgICAgbGV0IGJ0bkZ1bGxzY3JlZUNsb3NlID0gJChcIiNwb3B1cE1vZGFsRm9ybUZTXCIpLmZpbmQoXCIjYnRuRnVsbHNjcmVlQ2xvc2VcIik7XHJcbiAgICAgICAgYnRuRnVsbHNjcmVlQ2xvc2Uub2ZmKFwiY2xpY2tcIixfdGhpcy5vbkNsb3NlVmlldyk7XHJcbiAgICAgICAgYnRuRnVsbHNjcmVlQ2xvc2Uub24oXCJjbGlja1wiLF90aGlzLm9uQ2xvc2VWaWV3KTsgICBcclxuXHJcbiAgICAgICAgbGV0IGJ0bkNsb3NlID0gJChcIiNwb3B1cE1vZGFsRm9ybUZTXCIpLmZpbmQoXCIjYnRuQ2xvc2VcIik7XHJcbiAgICAgICAgYnRuQ2xvc2Uub2ZmKFwiY2xpY2tcIixfdGhpcy5vbkNsb3NlVmlldyk7XHJcbiAgICAgICAgYnRuQ2xvc2Uub24oXCJjbGlja1wiLF90aGlzLm9uQ2xvc2VWaWV3KTsgICAgICAgIFxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWZ0ZXJSZWZyZXNoUmVnVXJhRGFuVmlldygpOnZvaWR7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlJlZ1VyYUJyb3dzZVZpZXctPmFmdGVyUmVmcmVzaFJlZ1VyYURhblZpZXdcIik7XHJcbiAgICAgICAgdGhpcy5iaW5kQnV0dG9uc0V2ZW50c1ZpZXcoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25DbG9zZVZpZXcoKTp2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiUmVnVXJhQnJvd3NlVmlldy0+b25DbG9zZVJlZ1VyYURhblZpZXdcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFmdGVyU2FvcE1vbnRoWWVhclZhbHVlc0NoYW5nZWQobGV0bzogbnVtYmVyLCBtZXNlYzogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlJlZ1VyYUJyb3dzZVZpZXctPmFmdGVyU2FvcE1vbnRoWWVhclZhbHVlc0NoYW5nZWRcIik7XHJcblxyXG4gICAgICAgIHRoaXMucmVmcmVzaFJlZ1VyYUJyb3dzZVZpZXcoKTtcclxuICAgIH1cclxuICAgIC8vXHJcbn1cclxuXHJcblxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwsIGlzVW5EZWZpbmVkIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wUmVnVXJhRG9nb2Rla1ZpZXcgfSBmcm9tIFwiLi4vUkVHL3Nhb3AtcmVnVXJhRG9nb2Rlay12aWV3XCI7XHJcbmltcG9ydCB7IFNhb3BTZXJ2aWNlc0NvcmUgfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXNlcnZpY2VzLWNvcmVcIjtcclxuaW1wb3J0IHsgU2FvcFdlYkdyaWQsIFNhb3BXZWJHcmlkUHJvcGVydGllcywgU2FvcFdlYkdyaWRUb29sYmFyLCBTYW9wV2ViR3JpZFRvb2xiYXJCdXR0b24sIFNhb3BXZWJEYXRhVGFibGUgfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLWdyaWRcIjtcclxuaW1wb3J0IHsgU2FvcFJlZ1VyYURvZ29kZWtEZWxldGVPbmVWaWV3IH0gZnJvbSBcIi4uL1JFRy9zYW9wLXJlZ1VyYURvZ29kZWtEZWxldGVPbmUtdmlld1wiXHJcbmltcG9ydCAqIGFzIG1vbWVudCBmcm9tICcuLi8uLi9ub2RlX21vZHVsZXMvbW9tZW50L21vbWVudCc7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BSZWdVcmFEYW5WaWV3IGV4dGVuZHMgU2FvcFJlZ1VyYURvZ29kZWtWaWV3IHtcclxuICAgIHByaXZhdGUgX2xpYk5hbWVQOnN0cmluZztcclxuICAgIHByaXZhdGUgX3Nhb3BTZXJ2aWNlc0NvcmUgOlNhb3BTZXJ2aWNlc0NvcmU7XHJcbiAgICBwcml2YXRlIF9zZWxlY3RlZERhdGU6c3RyaW5nOyAgXHJcbiAgICBwcml2YXRlIHdlYkdyaWQxOlNhb3BXZWJHcmlkO1xyXG4gICAgcHJpdmF0ZSB3ZWJHcmlkMjpTYW9wV2ViR3JpZDtcclxuICAgIHByaXZhdGUgX2FkZFJlY29yZEVuYWJsZWRJZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfYWRkQnV0dG9uMUlkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9zaWZyYVphcG9zbGVuaTpzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9yZXZpemlqc2thU2xlZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfcmVnVXJhRG9nb2Rla0RlbGV0ZU9uZVZpZXc6IFNhb3BSZWdVcmFEb2dvZGVrRGVsZXRlT25lVmlldztcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih2aWV3SWQ6c3RyaW5nLGxpYk5hbWU6c3RyaW5nID0gXCJcIikge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnVXJhRGFuVmlldy5jb25zdHJ1Y3RvclwiKTtcclxuICAgICAgICBzdXBlcih2aWV3SWQsbGliTmFtZSk7XHJcbiAgICAgICAgdGhpcy5fbGliTmFtZVAgPSBsaWJOYW1lO1xyXG4gICAgICAgIHRoaXMuX2FkZFJlY29yZEVuYWJsZWRJZCA9IFwiI2FkZFJlY29yZEVuYWJsZWRcIjtcclxuICAgICAgICB0aGlzLl9hZGRCdXR0b24xSWQgPSBcIiNhZGRCdXR0b24xXCI7XHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLnNldERpY3Rpb25hcnkoKTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy5yZWZyZXNoRGF0YSA9IHRoaXMucmVmcmVzaExpc3REYXRhLmJpbmQodGhpcyk7XHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLl9yZWdVcmFEb2dvZGVrRGVsZXRlT25lVmlldyA9IG5ldyBTYW9wUmVnVXJhRG9nb2Rla0RlbGV0ZU9uZVZpZXcoXCIjcmVnRG9nb2Rla1ZpZXcwXCIsIGxpYk5hbWUgKyBcIi5fcmVnVXJhRG9nb2Rla0RlbGV0ZU9uZVZpZXdcIik7XHJcbiAgICAgICAgdGhpcy5fcmVnVXJhRG9nb2Rla0RlbGV0ZU9uZVZpZXcuYWZ0ZXJEZWxldGVTdWNjZXNzID0gdGhpcy5hZnRlckRlbGV0ZUV2ZW50c1N1Y2Nlc3MuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLl9yZWdVcmFEb2dvZGVrRGVsZXRlT25lVmlldy5hZnRlclZhbGlkYXRpb25FcnJvciA9IHRoaXMub25EZWxldGVWYWxpZGF0aW9uRXJyb3IuYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0VmlldygpOnZvaWR7XHJcbiAgICAgICAgdGhpcy5pbml0V2ViR3JpZDEoKTtcclxuICAgICAgICB0aGlzLmluaXRXZWJHcmlkMUxpc3RuZXJzKCk7XHJcbiAgICAgICAgdGhpcy5pbml0V2ViR3JpZDIoKTtcclxuICAgICAgICB0aGlzLmluaXRXZWJHcmlkMkxpc3RuZXJzKCk7XHJcbiAgICAgICAgdGhpcy5iaW5kVmlld0RhdGEoKTtcclxuICAgIH1cclxuXHJcbiAgICBiaW5kVmlld0RhdGEoKTp2b2lkIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZERhdGUgPSA8c3RyaW5nPiQoXCIjU2VsZWN0ZWREYXRlMVwiKS52YWwoKTtcclxuICAgICAgICB0aGlzLl9zaWZyYVphcG9zbGVuaSA9IDxzdHJpbmc+JChcIiNyZWctZ3JpZCAjU2lmcmFaYXBvc2xlbmlcIikudmFsKCk7XHJcbiAgICAgICAgdGhpcy5fcmV2aXppanNrYVNsZWQgPSA8c3RyaW5nPiQoXCIjUmV2aXppanNrYVNsZWRcIikudmFsKCk7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInNlbGVjdGVkRGF0ZTpcIiArIHRoaXMuX3NlbGVjdGVkRGF0ZSk7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlJldml6aWpza2FTbGVkOlwiICsgdGhpcy5fcmV2aXppanNrYVNsZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldERpY3Rpb25hcnkoKTp2b2lke1xyXG4gICAgICAgIGxldCBkaWN0aW9uYXJ5OnN0cmluZ1tdID0gW1wiRG9nb2Rla1wiLFwiQnJpc2FuamVcIixcIkFsaSBzdGUgcHJlcHJpxI1hbmksIGRhIMW+ZWxpdGUgaXpicmlzYXRpIGRvZ29kZWs/XCJdO1xyXG4gICAgICAgIHRoaXMuc2V0VGVybWlub2xvZ3lMaXN0KGRpY3Rpb25hcnkpO1xyXG4gICAgfSAgICAgXHJcblxyXG4gICAgaW5pdFdlYkdyaWQxKCk6dm9pZHtcclxuICAgICAgICBsZXQgY2FwdGlvblRvb2xiYXIgPSAkKFwiI3Nhb3BXZWJHcmlkMVwiKS5hdHRyKFwiY2FwdGlvbi10b29sYmFyXCIpO1xyXG4gICAgICAgIGxldCBjYXB0aW9uQWRkQnV0dG9uID0gJChcIiNzYW9wV2ViR3JpZDFcIikuYXR0cihcImNhcHRpb24tYWRkQnV0dG9uXCIpO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy53ZWJHcmlkMSA9IG5ldyBTYW9wV2ViR3JpZCh0aGlzLl9saWJOYW1lUCk7XHJcbiAgICAgICAgbGV0IGdyaWRQcm9wZXJ0aWVzOiBTYW9wV2ViR3JpZFByb3BlcnRpZXM7XHJcbiAgICAgICAgbGV0IGdyaWRUb29sYmFyOlNhb3BXZWJHcmlkVG9vbGJhcjtcclxuICAgICAgICBsZXQgdG9vbGJhckJ1dHRvbnM6U2FvcFdlYkdyaWRUb29sYmFyQnV0dG9uW10gPSBbXTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRvb2xiYXJCdXR0b25zLnB1c2goe2lkOiB0aGlzLl9hZGRCdXR0b24xSWQucmVwbGFjZShcIiNcIixcIlwiKSxjYXB0aW9uOmNhcHRpb25BZGRCdXR0b24sb25DbGlja0V2ZW50OnRoaXMuX2xpYk5hbWUrXCIuYWRkUmVjb3JkRXgoKTtcIn0pOyAgICAgICAgXHJcbiAgICAgICAgZ3JpZFRvb2xiYXIgPSB7aWQ6XCJzYW9wV2ViR3JpZFRCMVwiLGNhcHRpb246Y2FwdGlvblRvb2xiYXIsYnV0dG9uczp0b29sYmFyQnV0dG9uc307XHJcbiAgICAgICAgZ3JpZFByb3BlcnRpZXMgPSB7XHJcbiAgICAgICAgICAgIGdyaWRJZDpcIiNzYW9wV2ViR3JpZDFcIlxyXG4gICAgICAgICAgICAsY3NzOlwidGFibGUtY29sdW1uLWhvbGRlci1sYXN0XCJcclxuICAgICAgICAgICAgLHRvb2xiYXI6Z3JpZFRvb2xiYXJcclxuICAgICAgICAgICAgLGRhdGFUYWJsZTp7ZW5hYmxlZDp0cnVlLG9yZGVyaW5nOmZhbHNlfVxyXG4gICAgICAgICAgfTsgICAgICAgIFxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy53ZWJHcmlkMS5pbml0KGdyaWRQcm9wZXJ0aWVzKTsgICBcclxuXHJcbiAgICAgICAgdGhpcy5yZWZyZXNoQnV0dG9uc1N0YXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdFdlYkdyaWQxTGlzdG5lcnMoKTp2b2lke1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgJChcIi5yZWdEYXlFdmVudHNfZWRpdFwiKS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAkKFwiLnJlZ0RheUV2ZW50c19lZGl0XCIpLm9uKCdjbGljaycsIGZ1bmN0aW9uKHJvdyl7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJyZWdEYXlFdmVudHNfZWRpdC5jbGlja1wiKTtcclxuICAgICAgICAgICAgbGV0IF9idG5FZGl0ID0gcm93LmN1cnJlbnRUYXJnZXQ7XHJcbiAgICAgICAgICAgIGxldCBidG5FbmFibGVkID0gX2J0bkVkaXQuZ2V0QXR0cmlidXRlKFwiZGF0YS1lbmFibGVkXCIpO1xyXG4gICAgICAgICAgICBpZiAoYnRuRW5hYmxlZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT0gXCJ0cnVlXCIpIHtcclxuICAgICAgICAgICAgICAgIGxldCBkYXRhX2lkU3RhcnQgPSBfYnRuRWRpdC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWlkc3RhcnRcIik7XHJcbiAgICAgICAgICAgICAgICBsZXQgZGF0YV9pZEVuZCA9IF9idG5FZGl0LmdldEF0dHJpYnV0ZShcImRhdGEtaWRlbmRcIik7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5lZGl0UmVjb3JkKHsgaWRTdGFydDogZGF0YV9pZFN0YXJ0LCBpZEVuZDogZGF0YV9pZEVuZCB9KTtcclxuICAgICAgICAgICAgfSAgICAgICAgICAgIFxyXG4gICAgICAgIH0pOyAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgJChcIi5yZWdEYXlFdmVudHNfZGVsZXRlXCIpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICQoXCIucmVnRGF5RXZlbnRzX2RlbGV0ZVwiKS5vbignY2xpY2snLCBmdW5jdGlvbihyb3cpe1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwicmVnRGF5RXZlbnRzX2RlbGV0ZS5jbGlja1wiKTtcclxuICAgICAgICAgICAgbGV0IF9idG5FZGl0ID0gcm93LmN1cnJlbnRUYXJnZXQ7XHJcbiAgICAgICAgICAgIGxldCBidG5FbmFibGVkID0gX2J0bkVkaXQuZ2V0QXR0cmlidXRlKFwiZGF0YS1lbmFibGVkXCIpO1xyXG4gICAgICAgICAgICBpZiAoYnRuRW5hYmxlZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT0gXCJ0cnVlXCIpIHtcclxuICAgICAgICAgICAgICAgIGxldCBkYXRhX2lkU3RhcnQgPSBfYnRuRWRpdC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWlkc3RhcnRcIik7XHJcbiAgICAgICAgICAgICAgICBsZXQgZGF0YV9pZEVuZCA9IF9idG5FZGl0LmdldEF0dHJpYnV0ZShcImRhdGEtaWRlbmRcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuX3Jldml6aWpza2FTbGVkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBcInRydWVcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB0cmFpbF9wYXJtcyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWRTdGFydDogZGF0YV9pZFN0YXJ0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZEVuZDogZGF0YV9pZEVuZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXVkaXRUcmFpbDogX3RoaXMuX3Jldml6aWpza2FTbGVkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBcInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fcmVnVXJhRG9nb2Rla0RlbGV0ZU9uZVZpZXcuc2hvd0Zvcm0oeyBJZFN0YXJ0OiB0cmFpbF9wYXJtcy5pZFN0YXJ0LCBJZEVuZDogdHJhaWxfcGFybXMuaWRFbmQsIEF1ZGl0VHJhaWw6IHRyYWlsX3Bhcm1zLmF1ZGl0VHJhaWwgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmRlbGV0ZVJlY29yZChcclxuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIkJyaXNhbmplXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICwgX3RoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIkFsaSBzdGUgcHJlcHJpxI1hbmksIGRhIMW+ZWxpdGUgaXpicmlzYXRpIGRvZ29kZWs/XCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICwgeyBpZFN0YXJ0OiBkYXRhX2lkU3RhcnQsIGlkRW5kOiBkYXRhX2lkRW5kIH1cclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9ICAgICAgICAgICAgXHJcbiAgICAgICAgfSk7ICAgICAgICAgXHJcblxyXG4gICAgICAgICQoXCIjc2hvd1ByZXZpb3VzRGF5RGF0YVwiKS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAkKFwiI3Nob3dQcmV2aW91c0RheURhdGFcIikub24oJ2NsaWNrJywgZnVuY3Rpb24ocm93KXtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInNob3dQcmV2aW91c0RheURhdGEuY2xpY2tcIik7XHJcbiAgICAgICAgICAgX3RoaXMuc2hvd1ByZXZpb3VzRGF5RGF0YSgpO1xyXG4gICAgICAgIH0pOyAgXHJcblxyXG4gICAgICAgICQoXCIjc2hvd05leHREYXlEYXRhXCIpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICQoXCIjc2hvd05leHREYXlEYXRhXCIpLm9uKCdjbGljaycsIGZ1bmN0aW9uKHJvdyl7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzaG93TmV4dERheURhdGEuY2xpY2tcIik7XHJcbiAgICAgICAgICAgX3RoaXMuc2hvd05leHREYXlEYXRhKCk7XHJcbiAgICAgICAgfSk7ICAgICAgICAgIFxyXG5cclxuICAgIH1cclxuXHJcbiAgICBpbml0V2ViR3JpZDJMaXN0bmVycygpOnZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJpbml0V2ViR3JpZDJMaXN0bmVycy4uLlwiKTtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIGxldCBfYnRuUmVmcmVzaCA9ICQoXCIuZm9ybS10b2RheS1ldmVudHNcIikuZmluZChcIiNidG5SZWZyZXNoXCIpO1xyXG4gICAgICAgIGlmIChfYnRuUmVmcmVzaC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIF9idG5SZWZyZXNoLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICAgICBfYnRuUmVmcmVzaC5vbihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJidG5SZWZyZXNoLmNsaWNrLi4uXCIpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMucmVmcmVzaENoYWluaW5nRXZlbnRzKCk7ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yOi5mb3JtLXRvZGF5LWV2ZW50cy5idG5SZWZyZXNoIG5vdCBmb3VuZC4uLlwiKTtcclxuICAgICAgICB9ICBcclxuICAgIH1cclxuXHJcbiAgICBhZGRSZWNvcmRFeCgpOnZvaWR7XHJcbiAgICAgICAgdGhpcy5hZGRSZWNvcmQoeyBTZWxlY3RlZERheTp0aGlzLl9zZWxlY3RlZERhdGUsIHNpZnJhWmFwb3NsZW5pOnRoaXMuX3NpZnJhWmFwb3NsZW5pIH0pO1xyXG4gICAgfSAgICAgIFxyXG5cclxuICAgIGluaXRXZWJHcmlkMigpe1xyXG4gICAgICAgIGxldCBjYXB0aW9uVG9vbGJhciA9ICQoXCIjc2FvcFdlYkdyaWQyXCIpLmF0dHIoXCJjYXB0aW9uLXRvb2xiYXJcIik7XHJcbiAgICAgICAgbGV0IHRvb2xiYXJJdGVtc1RlbXBsYXRlSWQgPSAkKFwiI3Nhb3BXZWJHcmlkMlwiKS5hdHRyKFwidG9vbGJhci1pdGVtcy10ZW1wbGF0ZUlkXCIpO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy53ZWJHcmlkMiA9IG5ldyBTYW9wV2ViR3JpZCh0aGlzLl9saWJOYW1lUCk7XHJcbiAgICAgICAgbGV0IGdyaWRQcm9wZXJ0aWVzOiBTYW9wV2ViR3JpZFByb3BlcnRpZXM7XHJcbiAgICAgICAgbGV0IGdyaWRUb29sYmFyOlNhb3BXZWJHcmlkVG9vbGJhcjtcclxuICAgICAgICAvL1xyXG4gICAgICAgIGdyaWRUb29sYmFyID0ge2lkOlwic2FvcFdlYkdyaWRUQjJcIixjYXB0aW9uOmNhcHRpb25Ub29sYmFyLCBpdGVtc1RlbXBsYXRlSWQ6dG9vbGJhckl0ZW1zVGVtcGxhdGVJZH07XHJcbiAgICAgICAgZ3JpZFByb3BlcnRpZXMgPSB7XHJcbiAgICAgICAgICAgIGdyaWRJZDpcIiNzYW9wV2ViR3JpZDJcIlxyXG4gICAgICAgICAgICAsdG9vbGJhcjpncmlkVG9vbGJhclxyXG4gICAgICAgICAgICAsZGF0YVRhYmxlOntlbmFibGVkOnRydWUsb3JkZXJpbmc6ZmFsc2V9XHJcbiAgICAgICAgICB9OyAgICAgICAgXHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLndlYkdyaWQyLmluaXQoZ3JpZFByb3BlcnRpZXMpOyAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgc2hvd05leHREYXlEYXRhKCk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ1VyYURhblZpZXcuc2hvd05leHREYXlEYXRhXCIpO1xyXG4gICAgICAgIGxldCBwYXJzZWREYXRlID0gbW9tZW50KHRoaXMuX3NlbGVjdGVkRGF0ZSxcIkRELk1NLllZWVlcIikuYWRkKDEsICdkYXlzJyk7XHJcblxyXG4gICAgICAgIC8vcHJlbWlrYW1vIHNlIGxhaGtvIHNhbW8gb2QgcHJ2ZWdhIGRvIHphZG5qZWdhIHYgbWVzZWN1IF9zZWxlY3RlZERhdGVcclxuICAgICAgICBpZiAobW9tZW50KHRoaXMuX3NlbGVjdGVkRGF0ZSxcIkRELk1NLllZWVlcIikuZW5kT2YoJ21vbnRoJykuaXNCZWZvcmUobW9tZW50KHBhcnNlZERhdGUsXCJERC5NTS5ZWVlZXCIpKSl7XHJcbiAgICAgICAgICAgICQoJyNzaG93TmV4dERheURhdGEnKS5wcm9wKFwiZGlzYWJsZWRcIiwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAkKCcjc2hvd05leHREYXlEYXRhJykucHJvcChcImRpc2FibGVkXCIsIGZhbHNlKTtcclxuICAgICAgICAgICAgbGV0IHBhcnNlZERhdGVGID0gcGFyc2VkRGF0ZS5mb3JtYXQoXCJERC5NTS5ZWVlZXCIpO1xyXG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZERhdGUgPSBwYXJzZWREYXRlRjtcclxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoTGlzdERhdGEoKTsgXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNob3dQcmV2aW91c0RheURhdGEoKTp2b2lke1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnVXJhRGFuVmlldy5zaG93UHJldmlvdXNEYXlEYXRhXCIpO1xyXG4gICAgICAgIGxldCBwYXJzZWREYXRlID0gbW9tZW50KHRoaXMuX3NlbGVjdGVkRGF0ZSxcIkRELk1NLllZWVlcIikuYWRkKC0xLCAnZGF5cycpO1xyXG5cclxuICAgICAgICAvL3ByZW1pa2FtbyBzZSBsYWhrbyBzYW1vIG9kIHBydmVnYSBkbyB6YWRuamVnYSB2IG1lc2VjdSBfc2VsZWN0ZWREYXRlXHJcbiAgICAgICAgaWYgKG1vbWVudCh0aGlzLl9zZWxlY3RlZERhdGUsXCJERC5NTS5ZWVlZXCIpLnN0YXJ0T2YoJ21vbnRoJykuaXNBZnRlcihtb21lbnQocGFyc2VkRGF0ZSwgXCJERC5NTS5ZWVlZXCIpKSkge1xyXG4gICAgICAgICAgICAkKCcjc2hvd1ByZXZpb3VzRGF5RGF0YScpLnByb3AoXCJkaXNhYmxlZFwiLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICQoJyNzaG93UHJldmlvdXNEYXlEYXRhJykucHJvcChcImRpc2FibGVkXCIsIGZhbHNlKTtcclxuICAgICAgICAgICAgbGV0IHBhcnNlZERhdGVGID0gcGFyc2VkRGF0ZS5mb3JtYXQoXCJERC5NTS5ZWVlZXCIpO1xyXG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZERhdGUgPSBwYXJzZWREYXRlRjtcclxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoTGlzdERhdGEoKTtcclxuICAgICAgICB9XHJcbiAgICB9ICAgIFxyXG5cclxuICAgIGFmdGVyUmVmcmVzaERhdGEoKTp2b2lke1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnVXJhRGFuVmlldy5hZnRlclJlZnJlc2hMaXN0RGF0YVwiKTtcclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoTGlzdERhdGEodHJpZ2dlcjpib29sZWFuID0gdHJ1ZSk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ1VyYURhblZpZXcucmVmcmVzaExpc3REYXRhXCIpO1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcodHJpZ2dlcik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uKHJlc3BvbnNlKXtcclxuICAgICAgICAgICAgJChcIiNmdWxsc2NyZWVuTW9kYWxCb2R5XCIpLmh0bWwocmVzcG9uc2UpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRyaWdnZXIgJiYgX3RoaXMuYWZ0ZXJSZWZyZXNoRGF0YSAhPSBudWxsKXsgXHJcbiAgICAgICAgICAgICAgICBfdGhpcy5hZnRlclJlZnJlc2hEYXRhKCk7IFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246XCJSRUdEYXlFdmVudHMvR2V0UmVnVXJhQnJvd3NlVmlld1BWP1NlbGVjdGVkRGF5PVwiICsgX3RoaXMuX3NlbGVjdGVkRGF0ZStcIiZlbXBsb3llZUlkPVwiK190aGlzLl9zaWZyYVphcG9zbGVuaVxyXG4gICAgICAgICAgICAsZGF0YTpudWxsXHJcbiAgICAgICAgICAgICx0eXBlOlwiR0VUXCJcclxuICAgICAgICAgICAgLHNwaW5uZXJEaXZJZDpcIiNzYW9wTG9hZGluZ1NpZGViYXJyXCJcclxuICAgICAgICB9KTsgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaEJ1dHRvbnNTdGF0ZSgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ1VyYURhblZpZXcucmVmcmVzaEJ1dHRvbnNTdGF0ZVwiKTtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiAkKHRoaXMuX2FkZFJlY29yZEVuYWJsZWRJZCkudmFsKCkgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IF9idG5BZGRSZWNvcmRFbmFibGVkID0gJCh0aGlzLl9hZGRSZWNvcmRFbmFibGVkSWQpLnZhbCgpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgaWYgKCFpc1VuRGVmaW5lZChfYnRuQWRkUmVjb3JkRW5hYmxlZCkgJiYgX2J0bkFkZFJlY29yZEVuYWJsZWQudG9Mb3dlckNhc2UoKSA9PSBcInRydWVcIikge1xyXG4gICAgICAgICAgICAkKHRoaXMuX2FkZEJ1dHRvbjFJZCkucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICQodGhpcy5fYWRkQnV0dG9uMUlkKS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJ0cnVlXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWZ0ZXJEZWxldGVFdmVudHNTdWNjZXNzKHJlc3VsdDogYW55KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImFmdGVyRGVsZXRlRXZlbnRzU3VjY2Vzcy4uLlwiKTtcclxuICAgICAgICB0aGlzLnJlZnJlc2hMaXN0RGF0YSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkRlbGV0ZVZhbGlkYXRpb25FcnJvcihyZXN1bHQ6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJvbkRlbGV0ZVZhbGlkYXRpb25FcnJvci4uLlwiKTtcclxuICAgICAgICB0aGlzLl9yZWdVcmFEb2dvZGVrRGVsZXRlT25lVmlldy5hZnRlclZpZXdTaG93U3VjY2VzcyhyZXN1bHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hDaGFpbkRhdGFUYWJsZShsZXRvOiBudW1iZXIsIG1lc2VjOiBudW1iZXIsIGRhbiA6bnVtYmVyLCBJZFphcG9zbGVuaTpzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNWaWV3LnJlZnJlc2hBbGxFbXBsb3llZXNUYWJsZVwiKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICAgICAgbGV0IHBhcmFtcyA9IHsgbGV0bzogbGV0bywgbWVzZWM6IG1lc2VjLCBkYW4gOiBkYW4sIElkWmFwb3NsZW5pIDogSWRaYXBvc2xlbmkgfTtcclxuXHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuXHJcbiAgICAgICAgfTtcclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246IFwiUkVHQXR0ZW5kYW5jZUFsbEVtcGxveWVlcy9HZXRBbGxFbXBsb3llZXNUYWJsZVwiXHJcbiAgICAgICAgICAgICwgZGF0YTogcGFyYW1zXHJcbiAgICAgICAgICAgICwgdHlwZTogXCJHRVRcIlxyXG4gICAgICAgICAgICAsIHNwaW5uZXJEaXZJZDogXCIjYXR0ZW5kYW5jZUFsbEVtcGxveWVlc0xvYWRpbmdcIlxyXG4gICAgICAgIH0pOyAgICBcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaENoYWluaW5nRXZlbnRzKCk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ1VyYURhblZpZXcucmVmcmVzaExpc3REYXRhXCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbihyZXNwb25zZSl7XHJcbiAgICAgICAgICAgICQoXCIjZnVsbHNjcmVlbk1vZGFsQm9keVwiKS5odG1sKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgaWYgKF90aGlzLmFmdGVyUmVmcmVzaERhdGEgIT0gbnVsbCl7IFxyXG4gICAgICAgICAgICAgICAgX3RoaXMuYWZ0ZXJSZWZyZXNoRGF0YSgpOyBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOlwiUkVHRGF5RXZlbnRzL0dldFJlZ1VyYUJyb3dzZVZpZXdQVj9TZWxlY3RlZERheT1cIiArIF90aGlzLl9zZWxlY3RlZERhdGUrXCImZW1wbG95ZWVJZD1cIitfdGhpcy5fc2lmcmFaYXBvc2xlbmkrXCImcmVmcmVzaD15XCJcclxuICAgICAgICAgICAgLGRhdGE6bnVsbFxyXG4gICAgICAgICAgICAsdHlwZTpcIkdFVFwiXHJcbiAgICAgICAgICAgICxzcGlubmVyRGl2SWQ6XCIjc2FvcExvYWRpbmdTaWRlYmFyclwiXHJcbiAgICAgICAgfSk7ICAgIFxyXG4gICAgfSAgICBcclxuXHJcbiAgICAvL1xyXG59XHJcblxyXG5cclxuIiwi77u/aW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wQ2hlY2tib3hTd2l0Y2ggfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLWNoZWNrYm94LXN3aXRjaFwiO1xyXG5pbXBvcnQgeyBTYW9wVmlld0Zvcm0gfSBmcm9tIFwiLi4vY29yZS9zYW9wLXZpZXctZm9ybVwiO1xyXG5pbXBvcnQgeyBTYW9wTXVsdGlzZWxlY3QgfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLW11bHRpc2VsZWN0XCI7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BSZWdVcmFEb2dvZGVrVmlldyBleHRlbmRzIFNhb3BWaWV3Rm9ybSB7XHJcbiAgICBwcml2YXRlIF92aWV3SWQ6IHN0cmluZzsgXHJcbiAgICBwcml2YXRlIF9zaWZyYURvZ29ka2FJZDogc3RyaW5nID0gXCIjU2lmcmFEb2dvZGthXCI7XHJcbiAgICBwcml2YXRlIF9jcmVhdGVSb3dBY3Rpb25JZDogc3RyaW5nID0gXCIjQ3JlYXRlUm93QWN0aW9uXCI7XHJcbiAgICBwcml2YXRlIF9ldmVudFN0YXJ0SWQ6IHN0cmluZyA9IFwiI0V2ZW50U3RhcnRcIjtcclxuICAgIHByaXZhdGUgX2V2ZW50RW5kSWQ6IHN0cmluZyA9IFwiI0V2ZW50RW5kXCI7XHJcbiAgICBwcml2YXRlIF90cmFqZW5qZU1hbGljYUlkOiBzdHJpbmcgPSBcIiNUcmFqZW5qZU1hbGljYVwiO1xyXG4gICAgIFxyXG4gICAgcHJpdmF0ZSBfY2J2ZWNEbmlDaGVja0JveE1haW5Db250cm9sOiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gICAgcHJpdmF0ZSBfY2J2ZWNEbmlDaGVja0JveENvbnRyb2w6IEpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgICBwcml2YXRlIF9lbkRhdHVtRGl2Q29udHJvbDogSlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIHByaXZhdGUgX3ZlY0RhdHVtb3ZEaXZDb250cm9sOiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gICAgcHJpdmF0ZSBfaXpib3JWZWNEbmlDb250cm9sOiBKUXVlcnk8SFRNTElucHV0RWxlbWVudD47XHJcbiAgICBwcml2YXRlIF9zZWxlY3RaYXBvc2xlbmk6IFNhb3BNdWx0aXNlbGVjdDtcclxuICAgIHByaXZhdGUgX3NpZnJhTG9rYWNpamVEaXZDb250cm9sIDogSlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih2aWV3SWQ6c3RyaW5nLGxpYk5hbWU6c3RyaW5nID0gXCJcIil7XHJcbiAgICAgICAgc3VwZXIodmlld0lkLGxpYk5hbWUpO1xyXG4gICAgICAgIHRoaXMuc2V0RGljdGlvbmFyeSgpOyAgICAgICAgICAgICAgICBcclxuICAgICAgICB0aGlzLnRpdGxlID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiRG9nb2Rla1wiKTtcclxuICAgICAgICB0aGlzLmFkZFJlY29yZEVuZHBvaW50ID0gXCJSRUdVcmFEb2dvZGVrL0NyZWF0ZVJlZ1VyYURvZ29kZWtcIjtcclxuICAgICAgICB0aGlzLmVkaXRSZWNvcmRFbmRwb2ludCA9IFwiUkVHVXJhRG9nb2Rlay9FZGl0UmVnVXJhRG9nb2Rla1wiO1xyXG4gICAgICAgIHRoaXMuZGVsZXRlUmVjb3JkRW5kcG9pbnQgPSBcIlJFR1VyYURvZ29kZWsvRGVsZXRlUmVnVXJhRG9nb2Rla1wiOyAgIFxyXG5cclxuICAgICAgICB0aGlzLl92aWV3SWQgPSB2aWV3SWQ7XHJcbiAgICAgICAgdGhpcy52aWV3U2hvd0NvbXBsZXRlID0gdGhpcy5pbml0Rm9ybS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuYWZ0ZXJTdWJtaXRTdWNjZXNzID0gdGhpcy5pbml0Rm9ybS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy5fc2VsZWN0WmFwb3NsZW5pID0gbmV3IFNhb3BNdWx0aXNlbGVjdChsaWJOYW1lICsgXCIuX3NlbGVjdFphcG9zbGVuaVwiLCB7IGlucHV0V2lkdGhQWDogJzI2MHB4JyB9KTtcclxuICAgICAgICB0aGlzLl9zZWxlY3RaYXBvc2xlbmkuYWZ0ZXJDaGFuZ2VDb21tb25FdmVudCA9IHRoaXMuZmlsdGVyU2VsZWN0WmFwb3NsZW5pRGF0YS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIC8vdGhpcy5fc2VsZWN0WmFwb3NsZW5pLmluaXQoXCIjZW1wbG95ZWVzRmlsdGVyXCIsIFwiScWhxI1pXCIpOyAgICAgICAgXHJcbiAgICAgICAgLy9cclxuICAgIH1cclxuXHJcbiAgICBzZXREaWN0aW9uYXJ5KCl7XHJcbiAgICAgICAgbGV0IGRpY3Rpb25hcnk6c3RyaW5nW10gPSBbXCJEb2dvZGVrXCIsXCJBbGkgc3RlIHByZXByacSNYW5pLCBkYSDFvmVsaXRlIGl6YnJpc2F0aSBkb2dvZGVrP1wiXTtcclxuICAgICAgICB0aGlzLnNldFRlcm1pbm9sb2d5TGlzdChkaWN0aW9uYXJ5KTtcclxuICAgIH0gXHJcblxyXG4gICAgaW5pdEZvcm0oKSB7XHJcbiAgICAgICAgdGhpcy50aXRsZSA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIkRvZ29kZWtcIik7XHJcbiAgICAgICAgdGhpcy5vbkJ0bkNhbmNlbCA9IHRoaXMuZW1wdHlDaGVja2JveEh0bWwuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLm9uU3VibWl0U3VjY2Vzc0NvbXBsZXRlID0gdGhpcy5lbXB0eUNoZWNrYm94SHRtbC5iaW5kKHRoaXMpO1xyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcodGhpcy5pZCArIFwiLmluaXRGb3JtKClcIik7XHJcblxyXG4gICAgICAgIGxldCBzYW9wQ2hlY2tib3hTd2l0Y2ggPSBuZXcgU2FvcENoZWNrYm94U3dpdGNoKCk7XHJcbiAgICAgICAgc2FvcENoZWNrYm94U3dpdGNoLmluaXQodGhpcy5pZCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NidmVjRG5pQ2hlY2tCb3hNYWluQ29udHJvbCA9ICQoXCJcIiArIHRoaXMuX3ZpZXdJZCArIFwiICo+ICN2ZWNEbmlDaGVja0JveFwiKTtcclxuICAgICAgICB0aGlzLl9jYnZlY0RuaUNoZWNrQm94Q29udHJvbCA9ICQoXCJcIiArIHRoaXMuX3ZpZXdJZCArIFwiICo+ICNjYnZlY0RuaUNoZWNrQm94XCIpO1xyXG4gICAgICAgIHRoaXMuX2l6Ym9yVmVjRG5pQ29udHJvbCA9ICQoXCJcIiArIHRoaXMuX3ZpZXdJZCArIFwiICo+ICNJemJvclZlY0RuaVwiKTtcclxuICAgICAgICB0aGlzLl9lbkRhdHVtRGl2Q29udHJvbCA9ICQoXCJcIiArIHRoaXMuX3ZpZXdJZCArIFwiICo+ICNlbkRhdHVtRGl2XCIpO1xyXG4gICAgICAgIHRoaXMuX3ZlY0RhdHVtb3ZEaXZDb250cm9sID0gJChcIlwiICsgdGhpcy5fdmlld0lkICsgXCIgKj4gI3ZlY0RhdHVtb3ZEaXZcIik7XHJcbiAgICAgICAgdGhpcy5fc2lmcmFMb2thY2lqZURpdkNvbnRyb2wgPSAkKFwiXCIgKyB0aGlzLl92aWV3SWQgKyBcIiAqPiAjU2lmcmFMb2thY2lqZVwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXREYXR1bUNvbnRyb2xzRGlzcGxheSgpO1xyXG5cclxuICAgICAgICAkKHRoaXMuX2NidmVjRG5pQ2hlY2tCb3hDb250cm9sKS5jaGFuZ2UoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBfdGhpcy5zZXREYXR1bUNvbnRyb2xzRGlzcGxheSgpO1xyXG4gICAgICAgIH0pOyBcclxuXHJcbiAgICAgICAgdGhpcy5fc2VsZWN0WmFwb3NsZW5pLmluaXQoXCIjZW1wbG95ZWVzRmlsdGVyXCIsIFwiWmFwb3NsZW5pXCIpOyBcclxuICAgICAgICBsZXQgc2VsZWN0ZWRfb3B0aW9ucyA9ICQoXCIjZW1wbG95ZWVzRmlsdGVyXCIpLmF0dHIoXCJkYXRhLXNlbGVjdGVkXCIpO1xyXG4gICAgICAgIGlmIChzZWxlY3RlZF9vcHRpb25zICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgbGV0IGFycmF5ID0gc2VsZWN0ZWRfb3B0aW9ucy5zcGxpdChcIixcIik7XHJcbiAgICAgICAgICAgIF90aGlzLl9zZWxlY3RaYXBvc2xlbmkuc2V0U2VsZWN0VmFsdWVzKGFycmF5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudG9nZ2xlTG9jYXRpb25JbnB1dCgpO1xyXG4gICAgICAgICQodGhpcy5fdmlld0lkICsgJyAnICsgdGhpcy5fc2lmcmFEb2dvZGthSWQpLm9mZignY2hhbmdlJyk7XHJcbiAgICAgICAgJCh0aGlzLl92aWV3SWQgKyAnICcgKyB0aGlzLl9zaWZyYURvZ29ka2FJZCkub24oJ2NoYW5nZScsIF90aGlzLm9uQ2hhbmdlc2lmcmFEb2dvZGthLmJpbmQodGhpcykpO1xyXG5cclxuICAgICAgICAkKHRoaXMuX3ZpZXdJZCArICcgJyArIHRoaXMuX2V2ZW50U3RhcnRJZCkub24oJ2lucHV0JywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBfdGhpcy5jaGVja0FuZFNldEx1bmNoRXZlbnRFbmRUaW1lKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RGF0dW1Db250cm9sc0Rpc3BsYXkoKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGNoZWNrZWQgPSB0aGlzLl9jYnZlY0RuaUNoZWNrQm94Q29udHJvbC5pcyhcIjpjaGVja2VkXCIpO1xyXG4gICAgICAgIGxldCBjaGVja2VkU3RyaW5nVmFsID0gY2hlY2tlZCA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiO1xyXG5cclxuICAgICAgICAkKHRoaXMuX2l6Ym9yVmVjRG5pQ29udHJvbCkudmFsKGNoZWNrZWRTdHJpbmdWYWwpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fZW5EYXR1bURpdkNvbnRyb2wgIT0gbnVsbCAmJiB0aGlzLl92ZWNEYXR1bW92RGl2Q29udHJvbCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlmIChjaGVja2VkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lbkRhdHVtRGl2Q29udHJvbC5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92ZWNEYXR1bW92RGl2Q29udHJvbC5zaG93KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lbkRhdHVtRGl2Q29udHJvbC5zaG93KCk7IFxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmVjRGF0dW1vdkRpdkNvbnRyb2wuaGlkZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHBvdHJlYm5vLCBrZXIgc3dpdGNoIGNoZWNrYm94IG5lIGRlbGEgZG9icm8sIMSNZSBqZSBuYSBpc3RpIGh0bWwgdmXEjSBpc3RpIGVkaXQgZm9ybVxyXG4gICAgZW1wdHlDaGVja2JveEh0bWwoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1Zyh0aGlzLmlkICsgXCIuZW1wdHlDaGVja2JveEh0bWwoKVwiKTtcclxuICAgICAgICB0aGlzLl9jYnZlY0RuaUNoZWNrQm94TWFpbkNvbnRyb2wuaHRtbChcIlwiKTtcclxuICAgIH1cclxuICAgIGZpbHRlclNlbGVjdFphcG9zbGVuaURhdGEoZWxlbWVudDogYW55KSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzVmlldy5maWx0ZXJTZWxlY3RaYXBvc2xlbmlEYXRhXCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIHByZWJlcmVtbywga2F0ZXJlIHNpZnJlIHphcG9zbGVuaWggc29kaWpvIHYgaXpicmFuZSBza3VwaW5lXHJcbiAgICAgICAgbGV0IGl6YnJhbmVTaWZyZVphcG9zbGVuaWggPSA8c3RyaW5nPihlbGVtZW50LnZhbCgpLnRvU3RyaW5nKCkpO1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhcImNoLi4uOlwiK2l6YnJhbmVTaWZyZVphcG9zbGVuaWgpO1xyXG5cclxuICAgICAgICBsZXQgX1NlbGVjdGVkRW1wbG95ZWVzID0gJChcIiNyZWdVcmFEb2dvZGVrVmlldyA+ICNTZWxlY3RlZEVtcGxveWVlc1wiKTtcclxuICAgICAgICBpZiAoX1NlbGVjdGVkRW1wbG95ZWVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgJChcIiNyZWdVcmFEb2dvZGVrVmlldyA+ICNTZWxlY3RlZEVtcGxveWVlc1wiKS52YWwoaXpicmFuZVNpZnJlWmFwb3NsZW5paCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZWdVcmFEb2dvZGVrVmlldy5TZWxlY3RlZEVtcGxveWVlcyBub3QgZm91bmQgLi4uXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZXNpZnJhRG9nb2RrYShlOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNoZWNrQW5kU2V0THVuY2hFdmVudEVuZFRpbWUoKTtcclxuICAgICAgICB0aGlzLnRvZ2dsZUxvY2F0aW9uSW5wdXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNoZWNrQW5kU2V0THVuY2hFdmVudEVuZFRpbWUoKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IF9zZWxlY3RlZFZhbHVlID0gJCh0aGlzLl92aWV3SWQgKyAnICcgKyB0aGlzLl9zaWZyYURvZ29ka2FJZCkudmFsKCkudG9TdHJpbmcoKTtcclxuICAgICAgICBsZXQgY3JlYXRlUm93QWN0aW9uVmFsID0gJCh0aGlzLl92aWV3SWQgKyAnICcgKyB0aGlzLl9jcmVhdGVSb3dBY3Rpb25JZCkudmFsKCkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGxldCBpc0NyZWF0ZVJvd0FjdGlvbiA9IGNyZWF0ZVJvd0FjdGlvblZhbCA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XHJcblxyXG4gICAgICAgIGlmIChpc0NyZWF0ZVJvd0FjdGlvbiAmJiBfc2VsZWN0ZWRWYWx1ZSA9PSAnTUFLJykge1xyXG4gICAgICAgICAgICBsZXQgZXZlbnRTdGFydCA9ICQodGhpcy5fdmlld0lkICsgJyAnICsgdGhpcy5fZXZlbnRTdGFydElkKS52YWwoKS50b1N0cmluZygpLnRyaW0oKVxyXG4gICAgICAgICAgICBsZXQgdXJhU3RhcnRBcnJheSA9IGV2ZW50U3RhcnQuc3BsaXQoJzonKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh1cmFTdGFydEFycmF5Lmxlbmd0aCA9PSAzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKE51bWJlcih1cmFTdGFydEFycmF5WzBdKSkgJiYgIWlzTmFOKE51bWJlcih1cmFTdGFydEFycmF5WzFdKSkgJiYgIWlzTmFOKE51bWJlcih1cmFTdGFydEFycmF5WzJdKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZGF0dW1aYWMgPSBuZXcgRGF0ZSgyMDIzLCAxLCAxLCBOdW1iZXIoKHVyYVN0YXJ0QXJyYXlbMF0pKSwgTnVtYmVyKCh1cmFTdGFydEFycmF5WzFdKSksIE51bWJlcigodXJhU3RhcnRBcnJheVsyXSkpKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgdHJhamFuamVNYWxpY2VVcmUgPSBOdW1iZXIoJCh0aGlzLl92aWV3SWQgKyAnICcgKyB0aGlzLl90cmFqZW5qZU1hbGljYUlkKS52YWwoKS50b1N0cmluZygpLnJlcGxhY2UoXCIsXCIsXCIuXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4odHJhamFuamVNYWxpY2VVcmUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWphbmplTWFsaWNlVXJlID0gMC41O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdHVtS29uID0gbmV3IERhdGUoZGF0dW1aYWMuZ2V0VGltZSgpICsgKDEwMDAgKiA2MCAqIDYwICogdHJhamFuamVNYWxpY2VVcmUpKTsgIC8vIG1zICogc2VrdW5kZSAqIG1pbnV0ZSAqIHVyZVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgdXJlID0gZGF0dW1Lb24uZ2V0SG91cnMoKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbWludXRlID0gZGF0dW1Lb24uZ2V0TWludXRlcygpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWt1bmRlID0gZGF0dW1Lb24uZ2V0U2Vjb25kcygpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB1cmFLb25lY1N0cmluZyA9IHRoaXMuYWRkTGVhZGluZ1plcm8odXJlKSArIFwiOlwiICsgdGhpcy5hZGRMZWFkaW5nWmVybyhtaW51dGUpICsgXCI6XCIgKyB0aGlzLmFkZExlYWRpbmdaZXJvKHNla3VuZGUpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5fdmlld0lkICsgJyAnICsgdGhpcy5fZXZlbnRFbmRJZCkudmFsKHVyYUtvbmVjU3RyaW5nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHRvZ2dsZUxvY2F0aW9uSW5wdXQoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdVcmFEb2dvZGVrVmlldy50b2dnbGVMb2NhdGlvbklucHV0XCIpO1xyXG5cclxuICAgICAgICBsZXQgX3NlbGVjdGVkVmFsdWUgPSAkKHRoaXMuX3ZpZXdJZCArICcgJyArIHRoaXMuX3NpZnJhRG9nb2RrYUlkKS52YWwoKS50b1N0cmluZygpO1xyXG5cclxuICAgICAgICBsZXQgc2hvdyA9IF9zZWxlY3RlZFZhbHVlID09PSAnPycgPyBcIkZhbHNlXCIgOiAkKCcjJyArIF9zZWxlY3RlZFZhbHVlKS52YWwoKTtcclxuXHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhzaG93KTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoc2hvdyA9PT0gJ1RydWUnIHx8IF9zZWxlY3RlZFZhbHVlID09PSAnUkQnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NpZnJhTG9rYWNpamVEaXZDb250cm9sLnBhcmVudCgpLnNob3coKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9zaWZyYUxva2FjaWplRGl2Q29udHJvbC5wYXJlbnQoKS5oaWRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRkTGVhZGluZ1plcm8oc3RldmlsbzogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gKHN0ZXZpbG8gPCAxMCA/IFwiMFwiIDogXCJcIikgKyBzdGV2aWxvLnRvU3RyaW5nKCkudHJpbSgpOyAgICAgXHJcbiAgICB9XHJcbiAgICAvLyAgXHJcbn1cclxuIiwi77u/Ly8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9hbGVydGlmeS9pbmRleC5kLnRzXCIgLz5cclxuaW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wVmlld0Zvcm1CaW5kaW5ncyB9IGZyb20gXCIuLi9Db3JlL3Nhb3Atdmlldy1mb3JtLWJpbmRpbmdzXCI7XHJcbmltcG9ydCB7IFNhb3BWaWV3Rm9ybSB9IGZyb20gXCIuLi9jb3JlL3Nhb3Atdmlldy1mb3JtXCI7XHJcbmltcG9ydCB7IFNhb3BNdWx0aXNlbGVjdCB9IGZyb20gXCIuLi9Db21wb25lbnRzL3Nhb3AtbXVsdGlzZWxlY3RcIjtcclxuaW1wb3J0IHsgU2FvcENoZWNrYm94U3dpdGNoIH0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC1jaGVja2JveC1zd2l0Y2hcIjtcclxuaW1wb3J0IHsgU2FvcE1lc3NhZ2VEbGcsIFNhb3BNc2dEbGdCdXR0b24gfSBmcm9tICcuLi9Db21wb25lbnRzL3Nhb3AtbWVzc2FnZS1kbGcnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wUmVnVXJhRG9nb2Rla0RlbGV0ZVBhcmFtc3RlcnMge1xyXG4gICAgRGF0ZVN0YXJ0OnN0cmluZztcclxuICAgIERhdGVFbmQ6c3RyaW5nO1xyXG59IFxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BSZWdVcmFEb2dvZGVrRGVsZXRlVmlldyBleHRlbmRzIFNhb3BWaWV3Rm9ybUJpbmRpbmdzIHtcclxuICAgIHByaXZhdGUgX3ZpZXdGb3JtOlNhb3BWaWV3Rm9ybTtcclxuICAgIHByaXZhdGUgX3NlbGVjdFphcG9zbGVuaTogU2FvcE11bHRpc2VsZWN0O1xyXG4gICAgcHJpdmF0ZSBfY2JTaW5nbGVEYXlTZWxlY3Q6SlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIHByaXZhdGUgX211bHRpcGxlRGF5c0RpdjpKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gICAgcHJpdmF0ZSBfc2luZ2xlRGF5RGl2OkpRdWVyeTxIVE1MRWxlbWVudD47ICBcclxuICAgIHByaXZhdGUgX3NpbmdsZURheVNlbGVjdDpKUXVlcnk8SFRNTEVsZW1lbnQ+OyAgXHJcblxyXG4gICAgY29uc3RydWN0b3Iodmlld0lkOnN0cmluZyxsaWJOYW1lOnN0cmluZyA9IFwiXCIpe1xyXG4gICAgICAgIHN1cGVyKHZpZXdJZCxsaWJOYW1lKTtcclxuICAgICAgICB0aGlzLl92aWV3Rm9ybSA9IG5ldyBTYW9wVmlld0Zvcm0odmlld0lkLGxpYk5hbWUrXCIuX3ZpZXdGb3JtXCIpO1xyXG4gICAgICAgIHRoaXMuc2V0RGljdGlvbmFyeSgpOyAgICAgICAgICAgICAgICBcclxuICAgICAgICB0aGlzLl92aWV3Rm9ybS5mdWxsVGl0bGUgPSB0aGlzLl92aWV3Rm9ybS50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiQnJpc2FuamVcIik7XHJcbiAgICAgICAgdGhpcy5fdmlld0Zvcm0udGl0bGUgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuX3ZpZXdGb3JtLmFkZFJlY29yZEVuZHBvaW50ID0gXCJSRUdVcmFEb2dvZGVrL0RlbGV0ZVJlZ1VyYURvZ29kZWtQYXJ0aWFsXCI7XHJcbiAgICAgICAgdGhpcy5fdmlld0Zvcm0uZWRpdFJlY29yZEVuZHBvaW50ID0gXCJcIjtcclxuICAgICAgICB0aGlzLl92aWV3Rm9ybS5kZWxldGVSZWNvcmRFbmRwb2ludCA9IFwiXCI7ICAgICAgICAgICBcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMuX3ZpZXdGb3JtLmFmdGVyVmlld1Nob3dTdWNjZXNzID0gdGhpcy5hZnRlclZpZXdTaG93U3VjY2Vzcy5iaW5kKHRoaXMpOyAgIFxyXG4gICAgfVxyXG5cclxuICAgIHNldERpY3Rpb25hcnkoKXtcclxuICAgICAgICBsZXQgZGljdGlvbmFyeTpzdHJpbmdbXSA9IFtcIkJyaXNhbmplXCIsXCJBbGkgc3RlIHByZXByacSNYW5pLCBkYSDFvmVsaXRlIGl6YnJpc2F0aSBkb2dvZGtlP1wiXTtcclxuICAgICAgICB0aGlzLl92aWV3Rm9ybS5zZXRUZXJtaW5vbG9neUxpc3QoZGljdGlvbmFyeSk7XHJcbiAgICB9ICAgICBcclxuXHJcbiAgICBwdWJsaWMgc2hvd0Zvcm0ocGFyYW1zOlNhb3BSZWdVcmFEb2dvZGVrRGVsZXRlUGFyYW1zdGVycyA9IG51bGwpOnZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzaG93Rm9ybS4uLlwiKTtcclxuICAgICAgICB0aGlzLl92aWV3Rm9ybS5hZGRSZWNvcmQocGFyYW1zKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWZ0ZXJWaWV3U2hvd1N1Y2Nlc3Moc2VuZGVyOmFueSk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKHRoaXMuaWQgKyBcIi5hZnRlclZpZXdTaG93U3VjY2VzcygpXCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLl92aWV3Rm9ybS5yZWZyZXNoRGF0YSA9IHRoaXMucmVmcmVzaERhdGEuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLl92aWV3Rm9ybS5vbkJ0bk9rQ2xpY2sgPSB0aGlzLmRlbGV0ZURpYWxvZy5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuX3ZpZXdGb3JtLmFmdGVyU3VibWl0U3VjY2VzcyA9IHRoaXMub25WYWxpZGF0aW9uRXJyb3IuYmluZCh0aGlzKTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdFphcG9zbGVuaSA9IG5ldyBTYW9wTXVsdGlzZWxlY3QoKTtcclxuICAgICAgICB0aGlzLl9zZWxlY3RaYXBvc2xlbmkuYWZ0ZXJDaGFuZ2VDb21tb25FdmVudCA9IHRoaXMuZmlsdGVyU2VsZWN0WmFwb3NsZW5pRGF0YS5iaW5kKHRoaXMpOyAgICAgICAgICAgIFxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy5fc2luZ2xlRGF5U2VsZWN0ID0gJChcIiNkZWxldGVSZWdVcmFEb2dvZGVrUGFydGlhbFwiKS5maW5kKFwiI1NpbmdsZURheVNlbGVjdFwiKTtcclxuICAgICAgICBpZiAodGhpcy5fc2luZ2xlRGF5U2VsZWN0Lmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDb3VsZCBub3QgZmluZCBjb250cm9sICdTaW5nbGVEYXlTZWxlY3QnLi4uIFwiKTtcclxuICAgICAgICB9ICAgICAgICBcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMuX2NiU2luZ2xlRGF5U2VsZWN0ID0gJChcIiNkZWxldGVSZWdVcmFEb2dvZGVrUGFydGlhbFwiKS5maW5kKFwiI2NiU2luZ2xlRGF5U2VsZWN0U3dpdGNoXCIpO1xyXG4gICAgICAgIGlmICh0aGlzLl9jYlNpbmdsZURheVNlbGVjdC5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQ291bGQgbm90IGZpbmQgY29udHJvbCAnU2luZ2xlRGF5U2VsZWN0Jy4uLiBcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy5fY2JTaW5nbGVEYXlTZWxlY3Qub2ZmKFwiY2hhbmdlXCIsX3RoaXMuc2V0Q0JTZWxlY3RlZERheXNEaXNwbGF5KTtcclxuICAgICAgICB0aGlzLl9jYlNpbmdsZURheVNlbGVjdC5vbihcImNoYW5nZVwiLF90aGlzLnNldENCU2VsZWN0ZWREYXlzRGlzcGxheS5iaW5kKHRoaXMpKTsgICAgICBcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMuX211bHRpcGxlRGF5c0RpdiA9ICQoXCIjZGVsZXRlUmVnVXJhRG9nb2Rla1BhcnRpYWxcIikuZmluZChcIiNtdWx0aXBsZURheXNEaXZcIik7XHJcbiAgICAgICAgaWYgKHRoaXMuX211bHRpcGxlRGF5c0Rpdi5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQ291bGQgbm90IGZpbmQgY29udHJvbCAnbXVsdGlwbGVEYXlzRGl2Jy4uLiBcIik7XHJcbiAgICAgICAgfSAgICAgICAgXHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLl9zaW5nbGVEYXlEaXYgPSAkKFwiI2RlbGV0ZVJlZ1VyYURvZ29kZWtQYXJ0aWFsXCIpLmZpbmQoXCIjc2luZ2xlRGF5RGl2XCIpO1xyXG4gICAgICAgIGlmICh0aGlzLl9zaW5nbGVEYXlEaXYubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkNvdWxkIG5vdCBmaW5kIGNvbnRyb2wgJ3NpbmdsZURheURpdicuLi4gXCIpO1xyXG4gICAgICAgIH0gICAgICAgICBcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdFphcG9zbGVuaS5pbml0KFwiI2VtcGxveWVlc0ZpbHRlclwiLCBcIlphcG9zbGVuaVwiKTtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRfb3B0aW9ucyA9ICQoXCIjZW1wbG95ZWVzRmlsdGVyXCIpLmF0dHIoXCJkYXRhLXNlbGVjdGVkXCIpO1xyXG4gICAgICAgIGlmIChzZWxlY3RlZF9vcHRpb25zICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgbGV0IGFycmF5ID0gc2VsZWN0ZWRfb3B0aW9ucy5zcGxpdChcIixcIik7XHJcbiAgICAgICAgICAgIF90aGlzLl9zZWxlY3RaYXBvc2xlbmkuc2V0U2VsZWN0VmFsdWVzKGFycmF5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9cclxuICAgICAgICBsZXQgc2FvcENoZWNrYm94U3dpdGNoID0gbmV3IFNhb3BDaGVja2JveFN3aXRjaCgpO1xyXG4gICAgICAgIHNhb3BDaGVja2JveFN3aXRjaC5pbml0KHRoaXMuX3ZpZXdGb3JtLmlkKTsgICAgICAgIFxyXG5cclxuICAgIH1cclxuXHJcbiAgICBzZXRDQlNlbGVjdGVkRGF5c0Rpc3BsYXkoKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGNoZWNrZWQgPSB0aGlzLl9jYlNpbmdsZURheVNlbGVjdC5pcyhcIjpjaGVja2VkXCIpO1xyXG4gICAgICAgIGxldCBjaGVja2VkU3RyaW5nVmFsID0gY2hlY2tlZCA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiO1xyXG4gICAgICAgICQodGhpcy5fY2JTaW5nbGVEYXlTZWxlY3QpLnZhbChjaGVja2VkU3RyaW5nVmFsKTtcclxuICAgICAgICBjaGVja2VkU3RyaW5nVmFsID0gIWNoZWNrZWQgPyBcInRydWVcIiA6IFwiZmFsc2VcIjsgICAgICAgIFxyXG4gICAgICAgICQodGhpcy5fc2luZ2xlRGF5U2VsZWN0KS52YWwoY2hlY2tlZFN0cmluZ1ZhbCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zaW5nbGVEYXlEaXYgIT0gbnVsbCAmJiB0aGlzLl9tdWx0aXBsZURheXNEaXYgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2luZ2xlRGF5RGl2LmhpZGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlRGF5c0Rpdi5zaG93KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zaW5nbGVEYXlEaXYuc2hvdygpOyBcclxuICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlRGF5c0Rpdi5oaWRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9ICAgIFxyXG5cclxuICAgIGZpbHRlclNlbGVjdFphcG9zbGVuaURhdGEoZWxlbWVudDogYW55KSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdVcmFEb2dvZGVrRGVsZXRlVmlldy5maWx0ZXJTZWxlY3RaYXBvc2xlbmlEYXRhXCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIHByZWJlcmVtbywga2F0ZXJlIHNpZnJlIHphcG9zbGVuaWggc29kaWpvIHYgaXpicmFuZSBza3VwaW5lXHJcbiAgICAgICAgbGV0IGl6YnJhbmVTaWZyZVphcG9zbGVuaWggPSA8c3RyaW5nPihlbGVtZW50LnZhbCgpLnRvU3RyaW5nKCkpO1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhcImNoLi4uOlwiK2l6YnJhbmVTaWZyZVphcG9zbGVuaWgpO1xyXG5cclxuICAgICAgICBsZXQgX1NlbGVjdGVkRW1wbG95ZWVzID0gJChcIiNkZWxldGVSZWdVcmFEb2dvZGVrUGFydGlhbCA+ICNTZWxlY3RlZEVtcGxveWVlc1wiKTtcclxuICAgICAgICBpZiAoX1NlbGVjdGVkRW1wbG95ZWVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgJChcIiNkZWxldGVSZWdVcmFEb2dvZGVrUGFydGlhbCA+ICNTZWxlY3RlZEVtcGxveWVlc1wiKS52YWwoaXpicmFuZVNpZnJlWmFwb3NsZW5paCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJTZWxlY3RlZEVtcGxveWVlcyBub3QgZm91bmQgLi4uXCIpO1xyXG4gICAgICAgIH0gICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlbGV0ZURpYWxvZyhzZW5kZXI6YW55KTp2b2lke1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJkZWxldGVEaWFsb2dcIik7XHJcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0aGlzLl92aWV3Rm9ybS50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiQWxpIHN0ZSBwcmVwcmnEjWFuaSwgZGEgxb5lbGl0ZSBpemJyaXNhdGkgZG9nb2RrZT9cIik7XHJcbiAgICAgICAgbGV0IHRpdGxlID0gdGhpcy5fdmlld0Zvcm0udHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIkJyaXNhbmplXCIpO1xyXG4gICAgICAgIGxldCBzYW9wTWVzc2FnZURsZyA9IG5ldyBTYW9wTWVzc2FnZURsZyh7ZGF0YTpudWxsLHBhcmVudDpudWxsfSkgIFxyXG4gICAgICAgIHNhb3BNZXNzYWdlRGxnLm9uWWVzID0gdGhpcy5vbkRlbGV0ZVJlY29yZC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHNhb3BNZXNzYWdlRGxnLlNob3cobWVzc2FnZSx0aXRsZSwxLFtTYW9wTXNnRGxnQnV0dG9uLm1iWWVzLFNhb3BNc2dEbGdCdXR0b24ubWJOb10pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkRlbGV0ZVJlY29yZChzZW5kZXI6YW55KTp2b2lke1xyXG4gICAgICAgICQoXCIjZGVsZXRlUmVnVXJhRG9nb2Rla1BhcnRpYWxcIikuc3VibWl0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlZnJlc2hEYXRhKHNlbmRlcjphbnkpOnZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnVXJhRG9nb2Rla0RlbGV0ZVZpZXcucmVmcmVzaERhdGFcIik7XHJcbiAgICAgICAgdGhpcy5hZnRlckRlbGV0ZVN1Y2Nlc3Moc2VuZGVyKTtcclxuICAgIH0gICAgICBcclxuXHJcbiAgICBwdWJsaWMgYWZ0ZXJEZWxldGVTdWNjZXNzKHNlbmRlcjphbnkpOnZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnVXJhRG9nb2Rla0RlbGV0ZVZpZXcuYWZ0ZXJEZWxldGVTdWNjZXNzXCIpO1xyXG4gICAgfSAgICBcclxuXHJcbiAgICBwdWJsaWMgb25WYWxpZGF0aW9uRXJyb3Ioc2VuZGVyOmFueSk6dm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdVcmFEb2dvZGVrRGVsZXRlVmlldy5vbkRlbGV0ZUVycm9yXCIpO1xyXG4gICAgICAgIC8vdGhpcy5fdmlld0Zvcm0uYmluZFZpZXdFdmVudHMoKTtcclxuICAgICAgICB0aGlzLmFmdGVyVmFsaWRhdGlvbkVycm9yKHNlbmRlcik7XHJcbiAgICB9ICAgXHJcblxyXG5cclxuICAgIHB1YmxpYyBhZnRlclZhbGlkYXRpb25FcnJvcihzZW5kZXI6YW55KTp2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJlZ1VyYURvZ29kZWtEZWxldGVWaWV3LkFmdGVyVmFsaWRhdGlvbkVycm9yXCIpO1xyXG4gICAgfSAgICAgIFxyXG4gICAgLy9cclxufSIsIu+7vy8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9AdHlwZXMvYWxlcnRpZnkvaW5kZXguZC50c1wiIC8+XHJcbmltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFZpZXdGb3JtQmluZGluZ3MgfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXZpZXctZm9ybS1iaW5kaW5nc1wiO1xyXG5pbXBvcnQgeyBTYW9wVmlld0Zvcm0gfSBmcm9tIFwiLi4vY29yZS9zYW9wLXZpZXctZm9ybVwiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wUmVnVXJhRG9nb2Rla0RlbGV0ZU9uZVBhcmFtc3RlcnMge1xyXG4gICAgSWRTdGFydDpzdHJpbmc7XHJcbiAgICBJZEVuZDogc3RyaW5nO1xyXG4gICAgQXVkaXRUcmFpbDogYm9vbGVhbjtcclxufSBcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wUmVnVXJhRG9nb2Rla0RlbGV0ZU9uZVZpZXcgZXh0ZW5kcyBTYW9wVmlld0Zvcm1CaW5kaW5ncyB7XHJcbiAgICBwcml2YXRlIF92aWV3Rm9ybTpTYW9wVmlld0Zvcm07XHJcblxyXG4gICAgY29uc3RydWN0b3Iodmlld0lkOnN0cmluZyxsaWJOYW1lOnN0cmluZyA9IFwiXCIpe1xyXG4gICAgICAgIHN1cGVyKHZpZXdJZCxsaWJOYW1lKTtcclxuICAgICAgICB0aGlzLl92aWV3Rm9ybSA9IG5ldyBTYW9wVmlld0Zvcm0odmlld0lkLGxpYk5hbWUrXCIuX3ZpZXdGb3JtXCIpOyAgICAgICBcclxuICAgICAgICB0aGlzLl92aWV3Rm9ybS5mdWxsVGl0bGUgPSB0aGlzLl92aWV3Rm9ybS50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiQnJpc2FuamVcIik7XHJcbiAgICAgICAgdGhpcy5fdmlld0Zvcm0udGl0bGUgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuX3ZpZXdGb3JtLmFkZFJlY29yZEVuZHBvaW50ID0gXCJSRUdVcmFEb2dvZGVrL0RlbGV0ZVJlZ1VyYURvZ29kZWtPbmVQYXJ0aWFsXCI7XHJcbiAgICAgICAgdGhpcy5fdmlld0Zvcm0uZWRpdFJlY29yZEVuZHBvaW50ID0gXCJcIjtcclxuICAgICAgICB0aGlzLl92aWV3Rm9ybS5kZWxldGVSZWNvcmRFbmRwb2ludCA9IFwiXCI7ICAgICAgICAgICBcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMuX3ZpZXdGb3JtLmFmdGVyVmlld1Nob3dTdWNjZXNzID0gdGhpcy5hZnRlclZpZXdTaG93U3VjY2Vzcy5iaW5kKHRoaXMpOyAgIFxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaG93Rm9ybShwYXJhbXM6IFNhb3BSZWdVcmFEb2dvZGVrRGVsZXRlT25lUGFyYW1zdGVycyA9IG51bGwpOnZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzaG93Rm9ybS4uLlwiKTtcclxuICAgICAgICB0aGlzLl92aWV3Rm9ybS5hZGRSZWNvcmQocGFyYW1zKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWZ0ZXJWaWV3U2hvd1N1Y2Nlc3Moc2VuZGVyOmFueSk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKHRoaXMuaWQgKyBcIi5hZnRlclZpZXdTaG93U3VjY2VzcygpXCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLl92aWV3Rm9ybS5yZWZyZXNoRGF0YSA9IHRoaXMucmVmcmVzaERhdGEuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLl92aWV3Rm9ybS5vbkJ0bk9rQ2xpY2sgPSB0aGlzLm9uRGVsZXRlUmVjb3JkLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5fdmlld0Zvcm0uYWZ0ZXJTdWJtaXRTdWNjZXNzID0gdGhpcy5vblZhbGlkYXRpb25FcnJvci5iaW5kKHRoaXMpOyBcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25EZWxldGVSZWNvcmQoc2VuZGVyOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICAkKFwiI2RlbGV0ZVJlZ1VyYURvZ29kZWtPbmVQYXJ0aWFsXCIpLnN1Ym1pdCgpO1xyXG4gICAgfSAgICAgXHJcblxyXG4gICAgcHVibGljIHJlZnJlc2hEYXRhKHNlbmRlcjphbnkpOnZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnVXJhRG9nb2Rla0RlbGV0ZU9uZVZpZXcucmVmcmVzaERhdGFcIik7XHJcbiAgICAgICAgdGhpcy5hZnRlckRlbGV0ZVN1Y2Nlc3Moc2VuZGVyKTtcclxuICAgIH0gICAgICBcclxuXHJcbiAgICBwdWJsaWMgYWZ0ZXJEZWxldGVTdWNjZXNzKHNlbmRlcjphbnkpOnZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmVnVXJhRG9nb2Rla0RlbGV0ZU9uZVZpZXcuYWZ0ZXJEZWxldGVTdWNjZXNzXCIpO1xyXG4gICAgfSAgICBcclxuXHJcbiAgICBwdWJsaWMgb25WYWxpZGF0aW9uRXJyb3Ioc2VuZGVyOmFueSk6dm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdVcmFEb2dvZGVrRGVsZXRlT25lVmlldy5vbkRlbGV0ZUVycm9yXCIpO1xyXG4gICAgICAgIC8vdGhpcy5fdmlld0Zvcm0uYmluZFZpZXdFdmVudHMoKTsgXHJcbiAgICAgICAgdGhpcy5hZnRlclZhbGlkYXRpb25FcnJvcih0aGlzKTtcclxuICAgIH0gICBcclxuXHJcbiAgICBwdWJsaWMgYWZ0ZXJWYWxpZGF0aW9uRXJyb3Ioc2VuZGVyOmFueSk6dm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSZWdVcmFEb2dvZGVrRGVsZXRlT25lVmlldy5BZnRlclZhbGlkYXRpb25FcnJvclwiKTtcclxuICAgIH0gICAgICBcclxuICAgIC8vXHJcbn0iLCLvu78vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL2FsZXJ0aWZ5L2luZGV4LmQudHNcIiAvPlxyXG5pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BVcGxvYWRGaWxlcyB9IGZyb20gXCIuLi9Db21wb25lbnRzL3Nhb3AtdXBsb2FkLWZpbGVzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFNwbERvY3VtZW50VmlldyB7XHJcbiAgICBwdWJsaWMgc2FvcFVwbG9hZEZpbGVzOlNhb3BVcGxvYWRGaWxlcztcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih2aWV3SWQ6IHN0cmluZywgbGliTmFtZTogc3RyaW5nID0gXCJcIikge1xyXG4gICAgICAgIHRoaXMuc2FvcFVwbG9hZEZpbGVzID0gbmV3IFNhb3BVcGxvYWRGaWxlcyh2aWV3SWQsbGliTmFtZStcIi5zYW9wVXBsb2FkRmlsZXNcIik7XHJcbiAgICAgICAgdGhpcy5zYW9wVXBsb2FkRmlsZXMuYWZ0ZXJTdWJtaXRTdWNjZXNzID0gdGhpcy5hZnRlclN1Ym1pdFN1Y2Nlc3M7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdFZpZXcoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTcGxEb2N1bWVudFZpZXcuaW5pdFZpZXdcIik7XHJcbiAgICAgICAgLy8gZm9ybSBuaW1hIHNpZGViYXIgcmlnaHQsIHphdG8gc2UgZG9kYW4gY2xhc3MsIGRhIGJ0biBuaSB2aWRlbiB0dWRpIHYgbW9iaWxlIHZlcnppamlcclxuICAgICAgICAkKFwiI2J0blNob3dTaWRlYmFyclwiKS5hZGRDbGFzcyhcImQtbm9uZS1tb2JpbGVcIik7XHJcbiAgICAgICAgdGhpcy5iaW5kQ29udHJvbHMoKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBfdGhpcy5zZXRIZWlnaHQoKTtcclxuICAgICAgICB3aW5kb3cub25yZXNpemUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIF90aGlzLnNldEhlaWdodCgpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgYmluZENvbnRyb2xzKCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU3BsRG9jdW1lbnRWaWV3LmJpbmRHcmlkRXZlbnRzXCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgJChcIi5idG5VcGxvYWRTUExEb2N1bWVudHNcIikub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgJChcIi5idG5VcGxvYWRTUExEb2N1bWVudHNcIikub24oJ2NsaWNrJywgZnVuY3Rpb24gKHJvdykge1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNwbERvY3VtZW50Vmlldy5idG5VcGxvYWRTUExEb2N1bWVudHMuY2xpY2tcIik7XHJcbiAgICAgICAgICAgIGxldCB0aXRsZSA9IHJvdy50YXJnZXQuZ2V0QXR0cmlidXRlKFwiZGF0YS1mb3JtdGl0bGVcIik7XHJcbiAgICAgICAgICAgIF90aGlzLnNhb3BVcGxvYWRGaWxlcy52aWV3VGl0bGUgPSB0aXRsZTtcclxuICAgICAgICAgICAgX3RoaXMuc2FvcFVwbG9hZEZpbGVzLmluaXRWaWV3KHtjb250cm9sbGVyOlwiU1BMRG9jdW1lbnRcIixhY3Rpb246XCJHZXRVcGxvYWREb2N1bWVudHNcIn0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZnRlclN1Ym1pdFN1Y2Nlc3MocmVzdWx0OmFueSk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJhZnRlckV4ZWN1dGVTdWNjZXNzXCIpO1xyXG4gICAgICAgIGlmKHJlc3VsdC5zdWNjZXNzKVxyXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHJlc3VsdC5yZWRpcmVjdFRvO1xyXG4gICAgICAgIFxyXG4gICAgfSAgXHJcblxyXG4gICAgc2V0SGVpZ2h0KCkge1xyXG4gICAgICAgIHZhciBoZWFkZXIgPSAkKFwiI3NpdGUtaGVhZGVyXCIpLmhlaWdodCgpO1xyXG4gICAgICAgIHZhciBmb290ZXIgPSAkKFwiI3NpdGUtZm9vdGVyXCIpLmhlaWdodCgpO1xyXG4gICAgICAgICQoXCIjZG9jdW1lbnRUcmVlXCIpLmhlaWdodCh3aW5kb3cuaW5uZXJIZWlnaHQgLSBoZWFkZXIgLSBmb290ZXIgLSAxKTtcclxuICAgIH1cclxuICAgIC8vXHJcbn1cclxuXHJcblxyXG4iLCLvu78vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL2FsZXJ0aWZ5L2luZGV4LmQudHNcIiAvPlxyXG5pbXBvcnQgeyBnbG9iYWwsIHJlbG9kZUN1cnJlbnRQYWdlIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wU2VydmljZXNDb3JlIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC1zZXJ2aWNlcy1jb3JlXCI7XHJcbmltcG9ydCB7IFNhb3BDaGFuZ2VQd2RWaWV3IH0gZnJvbSAnLi4vQWNjb3VudC9zYW9wLWNoYW5nZS1wd2QtdmlldydcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wU2V0dGluZ3NWaWV3IHsgXHJcbiAgICAvL1xyXG4gICAgcHJpdmF0ZSBfc2FvcFNlcnZpY2VzQ29yZSA6U2FvcFNlcnZpY2VzQ29yZTtcclxuICAgIHByaXZhdGUgX3Nhb3BDaGFuZ2VQd2RWaWV3IDogU2FvcENoYW5nZVB3ZFZpZXc7XHJcblxyXG4gICAgY29uc3RydWN0b3Iodmlld0lkOnN0cmluZyxsaWJOYW1lOnN0cmluZyA9IFwiXCIpIHtcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTsgXHJcbiAgICAgICAgdGhpcy5fc2FvcENoYW5nZVB3ZFZpZXcgPSBuZXcgU2FvcENoYW5nZVB3ZFZpZXcodmlld0lkLGxpYk5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRWaWV3KCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2V0dGluZ3NWaWV3LmluaXRWaWV3XCIpO1xyXG5cclxuICAgICAgICB0aGlzLmJpbmRWaWV3RXZlbnRzKCk7ICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5jaGVja1Bhc3N3b3JkU3RyZW5ndGgoKTtcclxuICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBiaW5kVmlld0V2ZW50cygpe1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2V0dGluZ3NWaWV3LmJpbmRHcmlkRXZlbnRzXCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgLy9cclxuICAgICAgICAkKFwiI3NlbGVjdEplemlrXCIpLm9mZihcImNoYW5nZVwiKTtcclxuICAgICAgICAkKFwiI3NlbGVjdEplemlrXCIpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAocm93KSB7XHJcbiAgICAgICAgICAgIF90aGlzLnZyc3RhSmV6aWthQ2hhbmdlZCgpO1xyXG4gICAgICAgIH0pOyAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5fc2FvcENoYW5nZVB3ZFZpZXcuYmluZFZpZXdFdmVudHMoKTsgICAgICBcclxuICAgIH1cclxuXHJcbiAgICB2cnN0YUplemlrYUNoYW5nZWQoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZXR0aW5nc1ZpZXcudnJzdGFKZXppa2FDaGFuZ2VkXCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIGxldCB2cnN0YUplemlrYUVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsZWN0SmV6aWsnKSBhcyBIVE1MU2VsZWN0RWxlbWVudDtcclxuICAgICAgICBsZXQgamV6aWsgPSB2cnN0YUplemlrYUVsZW1lbnQub3B0aW9uc1t2cnN0YUplemlrYUVsZW1lbnQuc2VsZWN0ZWRJbmRleF0udmFsdWU7XHJcblxyXG4gICAgICAgIGxldCBpZFdlYk9wZXJhdGVyamEgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ0lEV2ViT3BlcmF0ZXJqYScpIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xyXG5cclxuICAgICAgICBsZXQgZGF0YSA9IHsgaWR3ZWJvcGVyYXRlcmphOiBpZFdlYk9wZXJhdGVyamEsIGplemlrOiBqZXppa307XHJcblxyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5hbGVydE1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgIGFsZXJ0aWZ5Lm1lc3NhZ2UocmVzcG9uc2UuYWxlcnRNZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnZpZXdDb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAkKFwiI21lc3NhZ2VCYW5uZXJcIikuaHRtbChyZXNwb25zZS52aWV3Q29udGVudCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgICAgICAvL3JlbG9hZCBjdXJyZW50IHBhZ2UgXHJcbiAgICAgICAgICAgICAgICByZWxvZGVDdXJyZW50UGFnZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgJChcIiNzZWxlY3RKZXppa1wiKS52YWwocmVzcG9uc2UuamV6aWspO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246IFwiU2V0dGluZ3MvVXBkYXRlU2FvcHdlYk9wZXJhdGVyamlKZXppa1wiXHJcbiAgICAgICAgICAgICwgZGF0YTogZGF0YVxyXG4gICAgICAgICAgICAsIHR5cGU6IFwiUE9TVFwiXHJcbiAgICAgICAgICAgICwgc3Bpbm5lckRpdklkOiBcIiNhYnNlbmNlQ29uZmlybWF0aW9uUGVuZGluZ0xvYWRpbmdcIlxyXG4gICAgICAgIH0pOyAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNoZWNrUGFzc3dvcmRTdHJlbmd0aCgpOnZvaWR7XHJcbiAgICAgICAgdGhpcy5fc2FvcENoYW5nZVB3ZFZpZXcuY2hlY2tQYXNzd29yZFN0cmVuZ3RoKCk7XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG5cclxuIiwi77u/aW1wb3J0IHsgZ2xvYmFsLGlzRW1wdHksZ2V0U2l0ZUFic29sdXRlVVJMLCBpc1VuRGVmaW5lZCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFZpZXdTcGlubmVyIH0gZnJvbSAnLi4vQ29tcG9uZW50cy9zYW9wLXZpZXctc3Bpbm5lcidcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcFNlcnZpY2VzQ29yZVBhcmFtcyB7XHJcbiAgYWN0aW9uOnN0cmluZztcclxuICBhc3luYz86Ym9vbGVhblxyXG4gIHR5cGU/OnN0cmluZztcclxuICBkYXRhPzphbnk7XHJcbiAgc3Bpbm5lckRpdklkPzpzdHJpbmc7XHJcbiAgLy8gY29udGVudFR5cGU/OiBzdHJpbmcgfCBmYWxzZSB8IHVuZGVmaW5lZDtcclxuICAvLyBkYXRhVHlwZT86ICd4bWwnIHwgJ2h0bWwnIHwgJ3NjcmlwdCcgfCAnanNvbicgfCAnanNvbnAnIHwgJ3RleHQnIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIC8vIHByb2Nlc3NEYXRhPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcclxufVxyXG5cclxuZXhwb3J0IGVudW0gU2FvcFNlcnZpY2VzQ29yZVJlc3VsdCB7XHJcbiAgc3VjY2VzcyA9IDFcclxuICAsIGVycm9yID0gMlxyXG59XHJcblxyXG5leHBvcnQgZW51bSBTYW9wU2VydmljZXNDb3JlSFRUUFJlc3VsdFN0YXR1c0NvZGUge1xyXG4gIG9rID0gMjAwLFxyXG4gIHVuYXV0aG9yaXplZCA9IDQwMSxcclxuICBpbnRlcm5hbFNlcnZlckVycm9yID0gNTAwXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcFNlcnZpY2VzQ29yZVJlc3BvbnNlIHtcclxuICByZXNwb25zZTogU2FvcFNlcnZpY2VzQ29yZVJlc3VsdDtcclxuICBkYXRhOiBhbnk7XHJcbn07XHJcblxyXG4vLyBmdW5jdGlvbiBzeW5jRGVsYXkobWlsbGlzZWNvbmRzOmFueSl7XHJcbi8vICAgdmFyIHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbi8vICAgdmFyIGVuZD0wO1xyXG4vLyAgIHdoaWxlKCAoZW5kLXN0YXJ0KSA8IG1pbGxpc2Vjb25kcyl7XHJcbi8vICAgICAgIGVuZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4vLyAgIH1cclxuLy8gIH1cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wU2VydmljZXNDb3JlIHtcclxuICBwcml2YXRlIF9zYW9wVmlld1NwaW5uZXI6U2FvcFZpZXdTcGlubmVyID0gbmV3IFNhb3BWaWV3U3Bpbm5lcigpO1xyXG4gIHByaXZhdGUgX3BhcmFtczpTYW9wU2VydmljZXNDb3JlUGFyYW1zO1xyXG4gIHByaXZhdGUgX2RlZmF1bHRQYXJhbXM6U2FvcFNlcnZpY2VzQ29yZVBhcmFtcztcclxuICAvLyAgXHJcbiAgLy9wdWJsaWMgX3Jlc3VsdDpTYW9wU2VydmljZXNDb3JlUmVzcG9uc2UgPSB7cmVzcG9uc2U6bnVsbCxkYXRhOm51bGx9OyAgXHJcblxyXG4gIGNvbnN0cnVjdG9yKCl7XHJcbiAgICB0aGlzLl9kZWZhdWx0UGFyYW1zID0ge1xyXG4gICAgICBhY3Rpb246XCJcIlxyXG4gICAgICAsdHlwZTpcIkdFVFwiXHJcbiAgICAgICxhc3luYzp0cnVlXHJcbiAgICAgICxkYXRhOm51bGxcclxuICAgICAgLHNwaW5uZXJEaXZJZDpcIlwiXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkRvbmUocmVzdWx0OmFueSl7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5vbkRvbmVcIik7XHJcbiAgICB0aGlzLmFmdGVyRG9uZShyZXN1bHQpO1xyXG4gICAgLy90aGlzLl9zYW9wVmlld1NwaW5uZXIuaGlkZUxvYWRpbmdTYW9wKHRoaXMuX3BhcmFtcy5zcGlubmVyRGl2SWQpOyAgICAgIFxyXG4gIH1cclxuXHJcbiAgYWZ0ZXJEb25lKHJlc3VsdDphbnkpOnZvaWR7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmVcIik7XHJcbiAgfSAgXHJcblxyXG4gIHByaXZhdGUgb25TdWNjZXNzKHJlc3VsdDphbnkpOnZvaWR7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5zdWNjZXNzXCIpO1xyXG4gICAgbGV0IF9yZXN1bHQ6U2FvcFNlcnZpY2VzQ29yZVJlc3BvbnNlID0ge3Jlc3BvbnNlOm51bGwsZGF0YTpudWxsfTsgXHJcbiAgICBpZiAodHlwZW9mIHJlc3VsdC5zdWNjZXNzID09PSBcInVuZGVmaW5lZFwiIHx8IHJlc3VsdC5zdWNjZXNzID09PSBudWxsKSB7XHJcbiAgICAgIF9yZXN1bHQucmVzcG9uc2UgPSBTYW9wU2VydmljZXNDb3JlUmVzdWx0LnN1Y2Nlc3M7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBfcmVzdWx0LnJlc3BvbnNlID0gcmVzdWx0LnN1Y2Nlc3MgPT0gdHJ1ZSA/IFNhb3BTZXJ2aWNlc0NvcmVSZXN1bHQuc3VjY2VzcyA6IFNhb3BTZXJ2aWNlc0NvcmVSZXN1bHQuZXJyb3I7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIF9yZXN1bHQuZGF0YSA9IHJlc3VsdDtcclxuICAgIHRoaXMuYWZ0ZXJTdWNjZXNzKF9yZXN1bHQpO1xyXG4gIH1cclxuXHJcbiAgYWZ0ZXJTdWNjZXNzKHJlc3VsdDphbnkpOnZvaWR7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5hZnRlclN1Y2Nlc3NcIik7XHJcbiAgfSAgXHJcblxyXG4gIHByaXZhdGUgb25FcnJvcihyZXN1bHQ6YW55KTp2b2lke1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZXJ2aWNlc0NvcmUuZXJyb3JcIik7XHJcbiAgICBcclxuICAgIGlmIChyZXN1bHQuc3RhdHVzID09IFNhb3BTZXJ2aWNlc0NvcmVIVFRQUmVzdWx0U3RhdHVzQ29kZS51bmF1dGhvcml6ZWQpIHtcclxuICAgICAgLy8gcmVkaXJlY3QgdG8gbG9naW5cclxuICAgICAgdGhpcy51bkF1dGhvcml6ZWRSZWRpcmVjdFRvTG9naW5QYWdlKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVzdWx0LnN0YXR1cyA9IFNhb3BTZXJ2aWNlc0NvcmVIVFRQUmVzdWx0U3RhdHVzQ29kZS5pbnRlcm5hbFNlcnZlckVycm9yICYmICFpc1VuRGVmaW5lZChyZXN1bHQucmVzcG9uc2VUZXh0KSkge1xyXG4gICAgICBhbGVydChcIkludGVybmFsIGVycm9yIVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgX3Jlc3VsdDpTYW9wU2VydmljZXNDb3JlUmVzcG9uc2UgPSB7cmVzcG9uc2U6bnVsbCxkYXRhOm51bGx9OyBcclxuICAgIF9yZXN1bHQucmVzcG9uc2UgPSBTYW9wU2VydmljZXNDb3JlUmVzdWx0LmVycm9yO1xyXG4gICAgX3Jlc3VsdC5kYXRhID0gcmVzdWx0O1xyXG4gICAgdGhpcy5hZnRlckVycm9yKF9yZXN1bHQpO1xyXG4gIH1cclxuXHJcbiAgYWZ0ZXJFcnJvcihyZXN1bHQ6YW55KTp2b2lke1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJTdWNjZXNzXCIpO1xyXG4gIH0gXHJcblxyXG4gIEV4ZWN1dGVBY3Rpb24ocGFyYW1zOlNhb3BTZXJ2aWNlc0NvcmVQYXJhbXMpOnZvaWQge1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvblwiKTtcclxuICAgIGxldCBvcHRpb25zID0geyAuLi50aGlzLl9kZWZhdWx0UGFyYW1zLCAuLi5wYXJhbXMgfTtcclxuICAgIHBhcmFtcyA9IG9wdGlvbnM7XHJcbiAgICB0aGlzLl9wYXJhbXMgPSBwYXJhbXM7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IF9hamF4QWN0aW9uID0gZ2V0U2l0ZUFic29sdXRlVVJMKHBhcmFtcy5hY3Rpb24pO1xyXG5cclxuICAgIC8vQFVybC5BY3Rpb24oXCJjcmVhckNhbXBNYW51YWxcIiwgXCJEUFNcIilcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAkLmFqYXgoe1xyXG4gICAgICAgIGFzeW5jOiBwYXJhbXMuYXN5bmMsXHJcbiAgICAgICAgdXJsOiBfYWpheEFjdGlvbixcclxuICAgICAgICB0eXBlOiAhaXNFbXB0eShwYXJhbXMudHlwZSkgPyBwYXJhbXMudHlwZSA6IFwiUE9TVFwiLFxyXG4gICAgICAgIGRhdGE6IHBhcmFtcy5kYXRhLFxyXG4gICAgICAgIC8vIGNvbnRlbnRUeXBlOiBwYXJhbXMuY29udGVudFR5cGUgPT0gbnVsbCA/ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgnIDogcGFyYW1zLmNvbnRlbnRUeXBlLFxyXG4gICAgICAgIC8vIGRhdGFUeXBlOiBwYXJhbXMudHlwZSA9PSBudWxsID8gJ0ludGVsbGlnZW50IEd1ZXNzICh4bWwsIGpzb24sIHNjcmlwdCwgb3IgaHRtbCknIDogcGFyYW1zLnR5cGUsICBcclxuICAgICAgICAvLyBwcm9jZXNzRGF0YSA6IHBhcmFtcy5wcm9jZXNzRGF0YSA9PSBudWxsID8gdHJ1ZSA6IHBhcmFtcy5wcm9jZXNzRGF0YSwgXHJcbiAgICAgICAgYmVmb3JlU2VuZDogZnVuY3Rpb24gKCkgeyBfdGhpcy5fc2FvcFZpZXdTcGlubmVyLnNob3dMb2FkaW5nU2FvcChwYXJhbXMuc3Bpbm5lckRpdklkKTsgfSxcclxuICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gKCkgeyBfdGhpcy5fc2FvcFZpZXdTcGlubmVyLmhpZGVMb2FkaW5nU2FvcChwYXJhbXMuc3Bpbm5lckRpdklkKTsgfSxcclxuICAgICAgICBzdWNjZXNzOiB0aGlzLm9uU3VjY2Vzcy5iaW5kKF90aGlzKSxcclxuICAgICAgICBlcnJvcjogdGhpcy5vbkVycm9yLmJpbmQoX3RoaXMpXHJcbiAgICAgIH0pLmRvbmUoZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJEb25lLi4uXCIpO1xyXG4gICAgICAgIF90aGlzLm9uRG9uZShyZXN1bHQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGNhdGNoKGVycikge1xyXG4gICAgICBhbGVydChcIkludGVybmFsIGVycm9yIVwiKTtcclxuICAgIH0gICAgXHJcblxyXG4gIFxyXG4gIH1cclxuXHJcbiAgRXhlY3V0ZUJsb2JBY3Rpb24ocGFyYW1zOiBTYW9wU2VydmljZXNDb3JlUGFyYW1zKTogdm9pZCB7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQmxvYkFjdGlvblwiKTtcclxuICAgIGxldCBvcHRpb25zID0geyAuLi50aGlzLl9kZWZhdWx0UGFyYW1zLCAuLi5wYXJhbXMgfTtcclxuICAgIHBhcmFtcyA9IG9wdGlvbnM7XHJcbiAgICB0aGlzLl9wYXJhbXMgPSBwYXJhbXM7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IF9hamF4QWN0aW9uID0gZ2V0U2l0ZUFic29sdXRlVVJMKHBhcmFtcy5hY3Rpb24pO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgICQuYWpheCh7XHJcbiAgICAgICAgdHlwZTogXCJQT1NUXCIsXHJcbiAgICAgICAgdXJsOiBfYWpheEFjdGlvbixcclxuICAgICAgICBkYXRhOiBwYXJhbXMuZGF0YSxcclxuICAgICAgICB4aHJGaWVsZHM6IHtcclxuICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InIC8vIHRvIGF2b2lkIGJpbmFyeSBkYXRhIGJlaW5nIG1hbmdsZWQgb24gY2hhcnNldCBjb252ZXJzaW9uXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoYmxvYiwgc3RhdHVzLCB4aHIpIHtcclxuICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGEgZmlsZW5hbWVcclxuICAgICAgICAgICAgdmFyIGZpbGVuYW1lID0gXCJcIjtcclxuICAgICAgICAgICAgdmFyIGRpc3Bvc2l0aW9uID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uJyk7XHJcbiAgICAgICAgICAgIGlmIChkaXNwb3NpdGlvbiAmJiBkaXNwb3NpdGlvbi5pbmRleE9mKCdhdHRhY2htZW50JykgIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZmlsZW5hbWVSZWdleCA9IC9maWxlbmFtZVteOz1cXG5dKj0oKFsnXCJdKS4qP1xcMnxbXjtcXG5dKikvO1xyXG4gICAgICAgICAgICAgICAgdmFyIG1hdGNoZXMgPSBmaWxlbmFtZVJlZ2V4LmV4ZWMoZGlzcG9zaXRpb24pO1xyXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMgIT0gbnVsbCAmJiBtYXRjaGVzWzFdKSBmaWxlbmFtZSA9IG1hdGNoZXNbMV0ucmVwbGFjZSgvWydcIl0vZywgJycpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL2lmICh0eXBlb2Ygd2luZG93Lm5hdmlnYXRvci5tc1NhdmVCbG9iICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAvLyAgICAvLyBJRSB3b3JrYXJvdW5kIGZvciBcIkhUTUw3MDA3OiBPbmUgb3IgbW9yZSBibG9iIFVSTHMgd2VyZSByZXZva2VkIGJ5IGNsb3NpbmcgdGhlIGJsb2IgZm9yIHdoaWNoIHRoZXkgd2VyZSBjcmVhdGVkLiBUaGVzZSBVUkxzIHdpbGwgbm8gbG9uZ2VyIHJlc29sdmUgYXMgdGhlIGRhdGEgYmFja2luZyB0aGUgVVJMIGhhcyBiZWVuIGZyZWVkLlwiXHJcbiAgICAgICAgICAgIC8vICAgIHdpbmRvdy5uYXZpZ2F0b3IubXNTYXZlQmxvYihibG9iLCBmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgIC8vfSBlbHNlXHJcbiAgICAgICAgICAgIC8ve1xyXG4gICAgICAgICAgICB2YXIgVVJMID0gd2luZG93LlVSTCB8fCB3aW5kb3cud2Via2l0VVJMO1xyXG4gICAgICAgICAgICB2YXIgZG93bmxvYWRVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGZpbGVuYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAvLyB1c2UgSFRNTDUgYVtkb3dubG9hZF0gYXR0cmlidXRlIHRvIHNwZWNpZnkgZmlsZW5hbWVcclxuICAgICAgICAgICAgICAgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XHJcbiAgICAgICAgICAgICAgICAvLyBzYWZhcmkgZG9lc24ndCBzdXBwb3J0IHRoaXMgeWV0XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGEuZG93bmxvYWQgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBkb3dubG9hZFVybDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYS5ocmVmID0gZG93bmxvYWRVcmw7XHJcbiAgICAgICAgICAgICAgICAgICAgYS5kb3dubG9hZCA9IGZpbGVuYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYS5jbGljaygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBkb3dubG9hZFVybDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IFVSTC5yZXZva2VPYmplY3RVUkwoZG93bmxvYWRVcmwpOyB9LCAxMDApOyAvLyBjbGVhbnVwXHJcbiAgICAgICAgICAgIC8vfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IHRoaXMub25FcnJvci5iaW5kKF90aGlzKVxyXG4gICAgICAgIH0pLmRvbmUoZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIkRvbmUuLi5cIik7XHJcbiAgICAgICAgICBfdGhpcy5vbkRvbmUocmVzdWx0KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGFsZXJ0KFwiSW50ZXJuYWwgZXJyb3IhXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuICBwdWJsaWMgaGFuZGxlU3VibWl0RXJyb3IocmVzcG9uc2U6IGFueSk6IHZvaWQge1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZXJ2aWNlc0NvcmUuSGFuZGxlU3VibWl0RXJyb3JcIik7XHJcblxyXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSBTYW9wU2VydmljZXNDb3JlSFRUUFJlc3VsdFN0YXR1c0NvZGUudW5hdXRob3JpemVkKSB7XHJcbiAgICAgICAgdGhpcy51bkF1dGhvcml6ZWRSZWRpcmVjdFRvTG9naW5QYWdlKCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGRpc3BsYXkgZXJyb3JcclxuICAgIGNvbnNvbGUubG9nKFwicmVzcG9uc2VcIiwgcmVzcG9uc2UpO1xyXG4gICAgYWxlcnQocmVzcG9uc2Uuc3RhdHVzVGV4dCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdW5BdXRob3JpemVkUmVkaXJlY3RUb0xvZ2luUGFnZSgpOiB2b2lkIHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VydmljZXNDb3JlLnJlZGlyZWN0VG9Mb2dpblBhZ2VcIik7XHJcblxyXG4gICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xyXG4gIH1cclxuIFxyXG4gIC8vXHJcbn1cclxuIiwi77u/Ly8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9hbGVydGlmeS9pbmRleC5kLnRzXCIgLz5cclxuaW1wb3J0IHsgZ2xvYmFsLCBzZXRNb2RhbEZvcm1aSW5kZXgsIGlzRW1wdHksIGlzVW5EZWZpbmVkLCBzZXRGaXJzdEZvcm1Db250cm9sVG9Gb2N1cyxnZXRTaXRlQWJzb2x1dGVVUkwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BTZXJ2aWNlc0NvcmUsU2FvcFNlcnZpY2VzQ29yZVBhcmFtcywgU2FvcFNlcnZpY2VzQ29yZVJlc3BvbnNlLCBTYW9wU2VydmljZXNDb3JlUmVzdWx0IH0gZnJvbSAnLi9zYW9wLXNlcnZpY2VzLWNvcmUnXHJcbmltcG9ydCB7IFNhb3BNZXNzYWdlRGxnLCBTYW9wTXNnRGxnQnV0dG9uIH0gZnJvbSAnLi4vQ29tcG9uZW50cy9zYW9wLW1lc3NhZ2UtZGxnJztcclxuaW1wb3J0IHsgU2FvcFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJy4uL0NvcmUvc2FvcC10cmFuc2xhdGUnO1xyXG5pbXBvcnQge1Nhb3BGbG9hdGluZ0xhYmVsIH0gZnJvbSAnLi4vQ29tcG9uZW50cy9zYW9wLWZsb2F0aW5nLWxhYmVsJztcclxuXHJcbmV4cG9ydCBjbGFzcyBFcnJvciB7XHJcbiAgICBwdWJsaWMgQ29kZTogc3RyaW5nO1xyXG4gICAgcHVibGljIE1lc3NhZ2U6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGVudW0gU2FvcFdmQWN0aW9uIHtcclxuICAgIHdmYU5vbmUgPSAwXHJcbiAgICAsd2ZhQWRkUmVjb3JkID0gMVxyXG4gICAgLHdmYUVkaXRSZWNvcmQgPSAyXHJcbiAgICAsd2ZhRGVsZXRlUmVjb3JkID0gM1xyXG4gICAgLHdmYVJlY29yZERlc3RhaWxzID0gNFxyXG4gICAgLHdmYUN1c3RvbUh0bWwgPSA1XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcFdmU3VibWl0UmVzdWx0IHtcclxuICAgIHN1Y2Nlc3M6Ym9vbGVhbjtcclxuICAgIHZpZXdDb250ZW50OnN0cmluZztcclxuICAgIHJlZGlyZWN0VG86c3RyaW5nO1xyXG4gICAgYWxlcnRNZXNzYWdlOiBzdHJpbmc7XHJcbiAgICBkYXRhOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wVmlld0Zvcm0ge1xyXG4gICAgcHJpdmF0ZSBfdmlld01vZGFsRnJhbWU6SlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIHByaXZhdGUgX3ZpZXdNb2RhbEJvZHk6SlF1ZXJ5PEhUTUxFbGVtZW50PjsgICAgXHJcbiAgICBwcml2YXRlIF92aWV3X3RpdGxlOkpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgICBwcml2YXRlIF92aWV3X2J0bk9rOkpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgICBwcml2YXRlIF92aWV3X2J0bkNhbmNlbDpKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gICAgcHJpdmF0ZSBfc2VydmljZXNQYXJhbXM6U2FvcFNlcnZpY2VzQ29yZVBhcmFtcyA9IHthY3Rpb246bnVsbCxkYXRhOm51bGwsdHlwZTpcIlBPU1RcIn07XHJcbiAgICBwcml2YXRlIF90ZXJtaW5vbG9neTogc3RyaW5nW107XHJcbiAgICBwcml2YXRlIF9wcmVwYXJlVmlldzpib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9kYXRhOmFueTtcclxuICAgIHByaXZhdGUgX21vZGFsUGFyZW50OmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIC8vXHJcbiAgICBwdWJsaWMgX2xpYk5hbWU6c3RyaW5nOyAgICBcclxuICAgIHB1YmxpYyBzYW9wU2VydmljZXNDb3JlOlNhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgcHVibGljIHRyYW5zbGF0aW9uU2VydmljZTpTYW9wVHJhbnNsYXRpb25TZXJ2aWNlO1xyXG4gICAgcHVibGljIGNvbnRlbnRFbGVtZW50SWQgPSBcIi5zYW9wLW1vZGFsLWJvZHktZWxlbWVudFwiOyAgICBcclxuICAgIHB1YmxpYyBhZGRSZWNvcmRFbmRwb2ludDogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBlZGl0UmVjb3JkRW5kcG9pbnQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgZGVsZXRlUmVjb3JkRW5kcG9pbnQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgc2FvcEZsb2F0aW5nTGFiZWw6IFNhb3BGbG9hdGluZ0xhYmVsO1xyXG4gICAgLy9cclxuICAgIHB1YmxpYyBvblN1Y2NjZXNzQ2FsbGJhY2s6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgb25FcnJvckNhbGxiYWNrOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIG9uRmFpbHVyZUNhbGxiYWNrOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgLy8gICAgXHJcbiAgICBwdWJsaWMgaWQ6c3RyaW5nO1xyXG4gICAgcHVibGljIHRpdGxlOnN0cmluZztcclxuICAgIHB1YmxpYyBmdWxsVGl0bGU6c3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBmdWxsU2NyZWVuOmJvb2xlYW4gPSBmYWxzZTsgXHJcbiAgICAvL1xyXG4gICAgcHVibGljIG9uQ2xvc2U6IChwYXJhbXM6YW55KSA9PiBhbnkgPSBudWxsO1xyXG4gICAgcHVibGljIG9uU3VibWl0OiAocGFyYW1zOmFueSkgPT4gYW55ID0gbnVsbDtcclxuICAgIHB1YmxpYyBvbkVycm9yOiAocGFyYW1zOmFueSkgPT4gYW55ID0gbnVsbDsgIFxyXG4gICAgXHJcbiAgICBjb25zdHJ1Y3Rvcih2aWV3SWQ6c3RyaW5nLGxpYk5hbWU6c3RyaW5nID0gXCJcIil7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BWaWV3Rm9ybS4uLlwiKTtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwidmlld0lkOlwiK3ZpZXdJZCk7XHJcbiAgICAgICAgdGhpcy5pZCA9IHZpZXdJZDtcclxuICAgICAgICB0aGlzLl9saWJOYW1lID0gbGliTmFtZTtcclxuICAgICAgICB0aGlzLm9uU3VjY2Nlc3NDYWxsYmFjayA9IGxpYk5hbWUrXCIub25TdWJtaXRTdWNjZXNzKGRhdGEsXCIrbGliTmFtZStcIik7XCI7XHJcbiAgICAgICAgdGhpcy5vbkVycm9yQ2FsbGJhY2sgPSBsaWJOYW1lICsgXCIub25TdWJtaXRFcnJvcihkYXRhLFwiICsgbGliTmFtZSArIFwiKTtcIjsgXHJcbiAgICAgICAgdGhpcy5vbkZhaWx1cmVDYWxsYmFjayA9IGxpYk5hbWUgKyBcIi5vblN1Ym1pdEZhaWx1cmUoeGhyLFwiICsgbGliTmFtZSArIFwiKTtcIjsgXHJcbiAgICAgICAgdGhpcy50cmFuc2xhdGlvblNlcnZpY2UgPSBuZXcgU2FvcFRyYW5zbGF0aW9uU2VydmljZSgpO1xyXG4gICAgICAgIHRoaXMuc2FvcEZsb2F0aW5nTGFiZWwgPSBuZXcgU2FvcEZsb2F0aW5nTGFiZWwoKTtcclxuICAgICAgICAvLyAgXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RGF0YSgpOmFueSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldFRlcm1pbm9sb2d5TGlzdChkaWN0aW9uYXJ5OiBzdHJpbmdbXSA9IG51bGwpIHtcclxuICAgICAgICB0aGlzLl90ZXJtaW5vbG9neSA9IFtcIlVyZWRpXCIsXCJOb3Ygdm5vc1wiLFwiUG9kcm9ibm9zdGlcIixcIkJyaXNhbmplXCJdO1xyXG4gICAgICAgIGlmIChkaWN0aW9uYXJ5ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5fdGVybWlub2xvZ3kgPSB0aGlzLl90ZXJtaW5vbG9neS5jb25jYXQoZGljdGlvbmFyeSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnNldFRyYW5zbGF0aW9uc0xpc3QodGhpcy5fdGVybWlub2xvZ3kpO1xyXG4gICAgfSAgICAgXHJcblxyXG4gICAgcHVibGljIG9uQnRuT2tDbGljayhzZW5kZXI6YW55KTp2b2lke1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJvbkJ0bk9rQ2xpY2suLi5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQnRuQ2FuY2VsKHNlbmRlcjphbnkpOnZvaWR7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIm9uQnRuQ2FuY2VsLi4uXCIpO1xyXG4gICAgfSAgICBcclxuXHJcbiAgICBwdWJsaWMgYmVmb3JlVmlld1Nob3coc2VuZGVyOmFueSk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKHRoaXMuaWQrXCIuYmVmb3JlVmlld1Nob3coKVwiKTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLl92aWV3TW9kYWxGcmFtZSA9ICQodGhpcy5pZCk7XHJcbiAgICAgICAgaWYgKHRoaXMuX3ZpZXdNb2RhbEZyYW1lID09IG51bGwpIHsgY29uc29sZS5sb2codGhpcy5pZCtcIiBub3QgZm91bmQhXCIpO307XHJcbiAgICAgICAgLy9cclxuICAgICAgICB2YXIgY29udGVudFNlbCA9IHRoaXMuaWQgKyBcIiBcIiArIHRoaXMuY29udGVudEVsZW1lbnRJZDtcclxuICAgICAgICB0aGlzLl92aWV3TW9kYWxCb2R5ID0gJChjb250ZW50U2VsKTsgICBcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWZ0ZXJWaWV3U2hvdyhzZW5kZXI6YW55LHdmQWN0aW9uOlNhb3BXZkFjdGlvbik6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKHRoaXMuaWQrXCIuYWZ0ZXJWaWV3U2hvdygpXCIpO1xyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICB0aGlzLmJpbmRWaWV3RXZlbnRzKHNlbmRlcik7XHJcblxyXG4gICAgICAgIC8vIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgLy8gdGhpcy5fdmlld19idG5PayA9ICQoXCJcIit0aGlzLmlkK1wiICo+ICNidG5Pa1wiKTtcclxuICAgICAgICAvLyB0aGlzLl92aWV3X2J0bkNhbmNlbCA9ICQoXCJcIit0aGlzLmlkK1wiICo+ICNidG5DYW5jZWxcIik7XHJcbiAgICAgICAgLy8gdGhpcy5fdmlld190aXRsZSA9ICQoXCJcIit0aGlzLmlkK1wiICo+ICNleGFtcGxlTW9kYWxMb25nVGl0bGVcIik7XHJcbiAgICAgICAgLy9cclxuXHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImFmdGVyVmlld1Nob3cgdGl0bGU6XCIrIHRoaXMudGl0bGUpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5mdWxsVGl0bGUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnRpdGxlID0gdGhpcy5mdWxsVGl0bGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWlzRW1wdHkodGhpcy50aXRsZSkpe1xyXG4gICAgICAgICAgICBsZXQgX3RpdGxlID0gXCJcIjtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZnVsbFRpdGxlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIF90aXRsZSA9IHRoaXMudGl0bGU7XHJcbiAgICAgICAgICAgIH1lbHNlIGlmICh3ZkFjdGlvbiA9PSBTYW9wV2ZBY3Rpb24ud2ZhQWRkUmVjb3JkKXtcclxuICAgICAgICAgICAgICAgIF90aXRsZSA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIk5vdiB2bm9zXCIpK1wiOiBcIit0aGlzLnRpdGxlO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdmQWN0aW9uID09IFNhb3BXZkFjdGlvbi53ZmFFZGl0UmVjb3JkKXtcclxuICAgICAgICAgICAgICAgIF90aXRsZSA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIlVyZWRpXCIpK1wiOiBcIit0aGlzLnRpdGxlO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdmQWN0aW9uID09IFNhb3BXZkFjdGlvbi53ZmFSZWNvcmREZXN0YWlscyl7ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgX3RpdGxlID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiUG9kcm9ibm9zdGlcIikrXCI6IFwiK3RoaXMudGl0bGU7XHJcbiAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJhZnRlclZpZXdTaG93IF90aXRsZTpcIisgX3RpdGxlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdfdGl0bGUuaHRtbChfdGl0bGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh3ZkFjdGlvbiA9PSBTYW9wV2ZBY3Rpb24ud2ZhQWRkUmVjb3JkKXtcclxuICAgICAgICAgICAgICAgIGxldCBkZWZhdWx0VGl0bGVBZGQgPSAkKFwiXCIrdGhpcy5pZCtcIiAqPiAjYWRkVGl0bGVcIikudmFsKCkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdfdGl0bGUuaHRtbChkZWZhdWx0VGl0bGVBZGQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGV0IGRlZmF1bHRUaXRsZUVkaXQgPSAkKFwiXCIrdGhpcy5pZCtcIiAqPiAjZWRpdFRpdGxlXCIpLnZhbCgpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92aWV3X3RpdGxlLmh0bWwoZGVmYXVsdFRpdGxlRWRpdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudmlld1Nob3dDb21wbGV0ZShzZW5kZXIsIHdmQWN0aW9uKTtcclxuICAgICAgICBcclxuICAgICAgICAvL1xyXG4gICAgICAgIC8vIHRoaXMuX3ZpZXdfYnRuT2suY2xpY2soXHJcbiAgICAgICAgLy8gICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAvLyAgICAgICAgIF90aGlzLm9uQnRuT2tDbGljayhzZW5kZXIpO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gKTtcclxuXHJcbiAgICAgICAgLy8gdGhpcy5fdmlld19idG5DYW5jZWwuY2xpY2soXHJcbiAgICAgICAgLy8gICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAvLyAgICAgICAgIF90aGlzLm9uQnRuQ2FuY2VsKHNlbmRlcik7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyApOyAgICAgICAgXHJcbiAgICBcclxuICAgICAgICAvL3RoaXMuYmluZFZpZXdFdmVudHMoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fbW9kYWxQYXJlbnQgPSAkKFwiYm9keVwiKS5oYXNDbGFzcyhcIm1vZGFsLW9wZW5cIik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9wcmVwYXJlVmlldyA9PSBmYWxzZSl7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdNb2RhbEZyYW1lLm1vZGFsKCdzaG93Jyk7XHJcbiAgICAgICAgICAgIHNldE1vZGFsRm9ybVpJbmRleCh0aGlzLmlkKTsgXHJcbiAgICAgICAgICAgIHNldEZpcnN0Rm9ybUNvbnRyb2xUb0ZvY3VzKHRoaXMuaWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMuYWZ0ZXJWaWV3U2hvd1N1Y2Nlc3Moc2VuZGVyKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFmdGVyVmlld1Nob3dTdWNjZXNzKHNlbmRlcjphbnkpOnZvaWR7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1Zyh0aGlzLmlkICsgXCIuYWZ0ZXJWaWV3U2hvd1N1Y2Nlc3MoKVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdmlld1Nob3dDb21wbGV0ZShzZW5kZXI6IGFueSwgd2ZBY3Rpb246IFNhb3BXZkFjdGlvbik6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcodGhpcy5pZCArIFwiLnZpZXdTaG93Q29tcGxldGUoKVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdmlld1Nob3duQ29tcGxldGUoc2VuZGVyOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKHRoaXMuaWQgKyBcIi52aWV3U2hvd25Db21wbGV0ZSgpXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBiaW5kVmlld0V2ZW50cyhzZW5kZXI6YW55KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImJpbmRWaWV3RXZlbnRzXCIpO1xyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIGxldCBkaXZGb3JtID0gdGhpcy5fdmlld01vZGFsRnJhbWUuZmluZChcImZvcm1cIik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5fdmlld19idG5PayA9ICQoXCJcIit0aGlzLmlkK1wiICo+ICNidG5Pa1wiKTtcclxuICAgICAgICB0aGlzLl92aWV3X2J0bkNhbmNlbCA9ICQoXCJcIit0aGlzLmlkK1wiICo+ICNidG5DYW5jZWxcIik7XHJcbiAgICAgICAgdGhpcy5fdmlld190aXRsZSA9ICQoXCJcIit0aGlzLmlkK1wiICo+ICNleGFtcGxlTW9kYWxMb25nVGl0bGVcIik7ICAgICAgICBcclxuXHJcbiAgICAgICAgdGhpcy5fdmlld19idG5Pay5jbGljayhcclxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMub25CdG5Pa0NsaWNrKHNlbmRlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG5cclxuICAgICAgICB0aGlzLl92aWV3X2J0bkNhbmNlbC5jbGljayhcclxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMub25CdG5DYW5jZWwoc2VuZGVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7ICBcclxuXHJcbiAgICAgICAgaWYgKHRoaXMub25TdWNjY2Vzc0NhbGxiYWNrICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGRpdkZvcm0uYXR0cihcImRhdGEtYWpheC1zdWNjZXNzXCIsIHRoaXMub25TdWNjY2Vzc0NhbGxiYWNrKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub25FcnJvckNhbGxiYWNrICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGRpdkZvcm0uYXR0cihcImRhdGEtYWpheC1lcnJvclwiLCB0aGlzLm9uRXJyb3JDYWxsYmFjayk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm9uRmFpbHVyZUNhbGxiYWNrICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGRpdkZvcm0uYXR0cihcImRhdGEtYWpheC1mYWlsdXJlXCIsIHRoaXMub25GYWlsdXJlQ2FsbGJhY2spO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICB0aGlzLl92aWV3TW9kYWxGcmFtZS5vbignaGlkZGVuLmJzLm1vZGFsJywgZnVuY3Rpb24gKGUpIHsgICAgIFxyXG4gICAgICAgICAgICBpZiAoX3RoaXMuX21vZGFsUGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAkKFwiYm9keVwiKS5hZGRDbGFzcyhcIm1vZGFsLW9wZW5cIik7XHJcbiAgICAgICAgICAgIH0gICAgXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgdGhpcy5fdmlld01vZGFsRnJhbWUub24oJ3Nob3duLmJzLm1vZGFsJywgZnVuY3Rpb24oZSkgeyBcclxuICAgICAgICAgICAgX3RoaXMudmlld1Nob3duQ29tcGxldGUoZSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2FvcEZsb2F0aW5nTGFiZWwuaW5pdCgpOyAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZW5kZXJFcnJvcnNCYW5uZXIoZXJyb3JzOkVycm9yW10pOlNhb3BTZXJ2aWNlc0NvcmVSZXNwb25zZSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdDpTYW9wU2VydmljZXNDb3JlUmVzcG9uc2U7XHJcbiAgICAgICAgcmVzdWx0ID0ge3Jlc3BvbnNlOlNhb3BTZXJ2aWNlc0NvcmVSZXN1bHQuZXJyb3IsZGF0YTpudWxsfTsgXHJcbiAgICAgICAgLy9cclxuICAgICAgICBsZXQganNvbkRhdGEgPSBKU09OLnN0cmluZ2lmeShlcnJvcnMpO1xyXG4gICAgICAgIGxldCBfZGF0YSA9IHtqc29uSW5wdXQ6anNvbkRhdGF9OyAgICAgICAgXHJcbiAgICAgICAgLy9cclxuICAgICAgICBsZXQgX3Nhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgICAgIF9zYW9wU2VydmljZXNDb3JlLmFmdGVyU3VjY2VzcyA9IGZ1bmN0aW9uIChyZXNwb25zZTpTYW9wU2VydmljZXNDb3JlUmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gcmVzcG9uc2U7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBfc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOiBcIkVycm9ycy9SZW5kZXJFcnJvcnNCYW5uZXJcIlxyXG4gICAgICAgICAgICAsIHR5cGU6IFwiUE9TVFwiXHJcbiAgICAgICAgICAgICwgZGF0YTogX2RhdGFcclxuICAgICAgICAgICAgLCBhc3luYzogZmFsc2VcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVuZGVyRXJyb3IoZXJyTWVzc2FnZTpzdHJpbmcpOnZvaWR7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImFqYXguYWZ0ZXJFcnJvclwiKTtcclxuICAgICAgICAgICAgbGV0IF9lcnJvcnM6RXJyb3JbXTtcclxuICAgICAgICAgICAgX2Vycm9ycyA9IFt7Q29kZTpcIlwiLE1lc3NhZ2U6ZXJyTWVzc2FnZX1dOyAgICAgICAgICBcclxuICAgICAgICAgICAgbGV0IF9wYXJlbnRWaWV3ID0gJCh0aGlzLmlkKS5wYXJlbnQoKTtcclxuICAgICAgICAgICAgbGV0IF9lcnJvckJhbm5lcklkID0gdGhpcy5pZCtcIkVycm9yQmFubmVyXCI7XHJcbiAgICAgICAgICAgIGxldCBfdmlld19iYW5uZXIgPSBfcGFyZW50Vmlldy5maW5kKF9lcnJvckJhbm5lcklkKTtcclxuICAgICAgICAgICAgaWYgKCBpc1VuRGVmaW5lZChfdmlld19iYW5uZXIpIHx8IF92aWV3X2Jhbm5lci5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgX3BhcmVudFZpZXcuYXBwZW5kKFwiPGRpdiBpZD1cIiArIF9lcnJvckJhbm5lcklkLnJlcGxhY2UoXCIjXCIsXCJcIikgKyBcIj48L2Rpdj5cIik7XHJcbiAgICAgICAgICAgICAgICBfdmlld19iYW5uZXIgPSBfcGFyZW50Vmlldy5maW5kKF9lcnJvckJhbm5lcklkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgX2Jhbm5lclJlc3VsdCA9IHRoaXMucmVuZGVyRXJyb3JzQmFubmVyKF9lcnJvcnMpO1xyXG4gICAgICAgICAgICBfdmlld19iYW5uZXIuaHRtbChfYmFubmVyUmVzdWx0LmRhdGEudmlld0NvbnRlbnQpOyAgICAgICAgICAgICAgICBcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2goZXJyKSB7XHJcbiAgICAgICAgICAgIGFsZXJ0KGVyci5tZXNzYWdlKTtcclxuICAgICAgICB9ICBcclxuICAgIH1cclxuICAgIC8vcHVibGljIGxvYWRWaWV3Qm9keSh3ZkFjdGlvbjpTYW9wV2ZBY3Rpb24sZGF0YTphbnksc2VuZGVyOmFueSk6U2FvcFNlcnZpY2VzQ29yZVJlc3VsdHtcclxuICAgIHB1YmxpYyBsb2FkVmlld0JvZHkod2ZBY3Rpb246U2FvcFdmQWN0aW9uLGRhdGE6YW55LHNlbmRlcjphbnkpOnZvaWR7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImxvYWRWaWV3Qm9keVwiKTtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMuYmVmb3JlVmlld1Nob3coc2VuZGVyKTtcclxuXHJcbiAgICAgICAgaWYgKHdmQWN0aW9uICE9IFNhb3BXZkFjdGlvbi53ZmFDdXN0b21IdG1sKSB7XHJcbiAgICAgICAgICAgIGxldCBfYWpheEFjdGlvbiA9IHdmQWN0aW9uID09IFNhb3BXZkFjdGlvbi53ZmFBZGRSZWNvcmQgPyB0aGlzLmFkZFJlY29yZEVuZHBvaW50IDogdGhpcy5lZGl0UmVjb3JkRW5kcG9pbnQ7XHJcbiAgICAgICAgICAgIC8vX2FqYXhBY3Rpb24gPSBnZXRTaXRlQWJzb2x1dGVVUkwoX2FqYXhBY3Rpb24pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fc2VydmljZXNQYXJhbXMgPSB7YWN0aW9uOl9hamF4QWN0aW9uLGRhdGE6ZGF0YSx0eXBlOlwiUE9TVFwifTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2FvcFNlcnZpY2VzQ29yZS5hZnRlclN1Y2Nlc3MgPSBmdW5jdGlvbihfYWpheFJlc3VsdCl7XHJcbiAgICAgICAgICAgICAgICBpZiAoX2FqYXhSZXN1bHQucmVzcG9uc2UgPT0gU2FvcFNlcnZpY2VzQ29yZVJlc3VsdC5zdWNjZXNzKXtcclxuICAgICAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiYWpheC5zdWNjZXNzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl92aWV3TW9kYWxCb2R5Lmh0bWwoX2FqYXhSZXN1bHQuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuYWZ0ZXJWaWV3U2hvdyhzZW5kZXIsd2ZBY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiYWpheC5lcnJvclwiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoKGlzVW5EZWZpbmVkKF9hamF4UmVzdWx0LmRhdGEpICYmIGlzVW5EZWZpbmVkKF9hamF4UmVzdWx0LmRhdGEuYWxlcnRNZXNzYWdlKSkgPT0gZmFsc2Upe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZW5kZXJFcnJvcihfYWpheFJlc3VsdC5kYXRhLmFsZXJ0TWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChfYWpheFJlc3VsdC5kYXRhLnJlc3BvbnNlSlNPTiAmJiBfYWpheFJlc3VsdC5kYXRhLnJlc3BvbnNlSlNPTi5tZXNzYWdlKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnRpZnkuZXJyb3IoX2FqYXhSZXN1bHQuZGF0YS5yZXNwb25zZUpTT04ubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH07XHJcbiAgICBcclxuICAgICAgICAgICAgdGhpcy5zYW9wU2VydmljZXNDb3JlLmFmdGVyRXJyb3IgPSBmdW5jdGlvbihfYWpheFJlc3VsdCl7XHJcbiAgICAvLyMjI1xyXG4gICAgICAgICAgICAgICAgaWYgKChpc1VuRGVmaW5lZChfYWpheFJlc3VsdC5kYXRhKSAmJiBpc1VuRGVmaW5lZChfYWpheFJlc3VsdC5kYXRhLmFsZXJ0TWVzc2FnZSkpID09IGZhbHNlKXtcclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZW5kZXJFcnJvcihfYWpheFJlc3VsdC5kYXRhLmFsZXJ0TWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGFsZXJ0KFwiSW50ZXJuYWwgZXJyb3IhXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgXHJcbiAgICAgICAgICAgIHRoaXMuc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHRoaXMuX3NlcnZpY2VzUGFyYW1zKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoIWlzVW5EZWZpbmVkKGRhdGEpICYmICFpc1VuRGVmaW5lZChkYXRhLmh0bWwpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92aWV3TW9kYWxCb2R5Lmh0bWwoZGF0YS5odG1sKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfdGhpcy5hZnRlclZpZXdTaG93KHNlbmRlcix3ZkFjdGlvbik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0gICAgXHJcblxyXG4gICAgcHVibGljIGFmdGVyU3VibWl0U3VjY2VzcyhyZXN1bHQ6IFNhb3BXZlN1Ym1pdFJlc3VsdCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzdWJtaXQuYWZ0ZXJFeGVjdXRlU3VjY2Vzc1wiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25TdWJtaXRTdWNjZXNzQ29tcGxldGUocmVzdWx0OiBTYW9wV2ZTdWJtaXRSZXN1bHQpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic3VibWl0Lm9uU3VibWl0U3VjY2Vzc0NvbXBsZXRlXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblN1Ym1pdEVycm9yKHJlc3VsdDogU2FvcFdmU3VibWl0UmVzdWx0KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInN1Ym1pdC5vblN1Ym1pdEVycm9yXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblN1Ym1pdEZhaWx1cmUocmVzdWx0OiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic3VibWl0Lm9uU3VibWl0RmFpbHVyZVwiKTtcclxuICAgICAgICB2YXIgc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5oYW5kbGVTdWJtaXRFcnJvcihyZXN1bHQpO1xyXG4gICAgfVxyXG4gXHJcbiAgICBwdWJsaWMgb25TdWJtaXRTdWNjZXNzKHJlc3VsdDogU2FvcFdmU3VibWl0UmVzdWx0KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInN1Ym1pdC5vbkV4ZWN1dGVTdWNjZXNzXCIpO1xyXG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic3VibWl0LnN1Y2Nlc3NcIik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl92aWV3TW9kYWxGcmFtZS5tb2RhbCgnaGlkZScpO1xyXG5cclxuICAgICAgICAgICAgLy8ganVzdCBpbiBjYXNlOiBvZHN0cmFuaSwgxI1lIGplIMWhZSB2ZWRubyB2aWRubywgYXZ0b21hdHNrbyBzZSBuZSB6YXByZSB2ZWRubyA6KFxyXG4gICAgICAgICAgICAkKCcubW9kYWwtYmFja2Ryb3AnKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgJChkb2N1bWVudC5ib2R5KS5yZW1vdmVDbGFzcyhcIm1vZGFsLW9wZW5cIik7XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzdWx0LmFsZXJ0TWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgYWxlcnRpZnkubWVzc2FnZShyZXN1bHQuYWxlcnRNZXNzYWdlKTtcclxuICAgICAgICAgICAgfSAgXHJcblxyXG4gICAgICAgICAgICBpZiAoIWlzVW5EZWZpbmVkKHRoaXMucmVmcmVzaERhdGEpKXtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaERhdGEocmVzdWx0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5vblN1Ym1pdFN1Y2Nlc3NDb21wbGV0ZShyZXN1bHQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzdWJtaXQuZXJyb3JcIik7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJyZWxvYWQgdmlldyBmb3JtXCIpO1xyXG4gICAgICAgICAgICB0aGlzLl92aWV3TW9kYWxCb2R5Lmh0bWwocmVzdWx0LnZpZXdDb250ZW50KTtcclxuICAgICAgICAgICAgdGhpcy5iaW5kVmlld0V2ZW50cyhyZXN1bHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFmdGVyU3VibWl0U3VjY2VzcyhyZXN1bHQpO1xyXG4gICAgfSAgICBcclxuXHJcbiAgICBwdWJsaWMgb25EZWxldGVSZWNvcmQoZGVsZXRlRGF0YTphbnkpOnZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJvbkRlbGV0ZVJlY29yZFwiKTtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMuX3NlcnZpY2VzUGFyYW1zID0ge2FjdGlvbjp0aGlzLmRlbGV0ZVJlY29yZEVuZHBvaW50LGRhdGE6ZGVsZXRlRGF0YSx0eXBlOlwiUE9TVFwifTtcclxuXHJcbiAgICAgICAgdGhpcy5zYW9wU2VydmljZXNDb3JlLmFmdGVyU3VjY2VzcyA9IGZ1bmN0aW9uKF9hamF4UmVzdWx0KXtcclxuICAgICAgICAgICAgaWYgKF9hamF4UmVzdWx0LnJlc3BvbnNlID09IFNhb3BTZXJ2aWNlc0NvcmVSZXN1bHQuc3VjY2Vzcyl7XHJcbiAgICAgICAgICAgICAgICBhbGVydGlmeS5tZXNzYWdlKF9hamF4UmVzdWx0LmRhdGEuYWxlcnRNZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIGlmICghaXNVbkRlZmluZWQoX3RoaXMucmVmcmVzaERhdGEpKXtcclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZWZyZXNoRGF0YShkZWxldGVEYXRhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFsZXJ0aWZ5LmVycm9yKF9hamF4UmVzdWx0LmRhdGEuYWxlcnRNZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24odGhpcy5fc2VydmljZXNQYXJhbXMpO1xyXG5cclxuICAgICAgICAvLyBsZXQgX2FqYXhSZXN1bHQgPSB0aGlzLnNhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih0aGlzLl9zZXJ2aWNlc1BhcmFtcyk7XHJcbiAgICAgICAgLy8gaWYgKF9hamF4UmVzdWx0LnJlc3BvbnNlID09IFNhb3BTZXJ2aWNlc0NvcmVSZXN1bHQuc3VjY2Vzcyl7XHJcbiAgICAgICAgLy8gICAgIGFsZXJ0aWZ5Lm1lc3NhZ2UoX2FqYXhSZXN1bHQuZGF0YS5hbGVydE1lc3NhZ2UpO1xyXG4gICAgICAgIC8vICAgICBpZiAoIWlzVW5EZWZpbmVkKHRoaXMucmVmcmVzaERhdGEpKXtcclxuICAgICAgICAvLyAgICAgICAgIHRoaXMucmVmcmVzaERhdGEoZGVsZXRlRGF0YSk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgICBhbGVydGlmeS5lcnJvcihfYWpheFJlc3VsdC5kYXRhLmFsZXJ0TWVzc2FnZSk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIHJldHVybiBfYWpheFJlc3VsdC5yZXNwb25zZTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcHVibGljIHJlZnJlc2hEYXRhKHNlbmRlcjphbnkpOnZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJyZWZyZXNoRGF0YVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVsZXRlUmVjb3JkKHRpdGxlOnN0cmluZyxtZXNzYWdlOnN0cmluZyxkZWxldGVEYXRhOmFueSk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiZGVsZXRlUmVjb3JkLmJlZ2luXCIpO1xyXG4gICAgICAgIGxldCBzYW9wTWVzc2FnZURsZyA9IG5ldyBTYW9wTWVzc2FnZURsZyhkZWxldGVEYXRhKSAgXHJcbiAgICAgICAgc2FvcE1lc3NhZ2VEbGcub25ZZXMgPSB0aGlzLm9uRGVsZXRlUmVjb3JkLmJpbmQodGhpcyk7XHJcbiAgICAgICAgc2FvcE1lc3NhZ2VEbGcuU2hvdyhtZXNzYWdlLHRpdGxlLDEsW1Nhb3BNc2dEbGdCdXR0b24ubWJZZXMsU2FvcE1zZ0RsZ0J1dHRvbi5tYk5vXSk7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImRlbGV0ZVJlY29yZC5lbmRcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZFJlY29yZChkYXRhOmFueSxzZW5kZXI6YW55ID0gbnVsbCk6dm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImFkZFJlY29yZFwiKTtcclxuICAgICAgICB0aGlzLl9kYXRhID0gZGF0YTtcclxuICAgICAgICBsZXQgX3Jlc3VsdCA9IHRoaXMubG9hZFZpZXdCb2R5KFNhb3BXZkFjdGlvbi53ZmFBZGRSZWNvcmQsZGF0YSxzZW5kZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBlZGl0UmVjb3JkKGRhdGE6YW55LHNlbmRlcjphbnkgPSBudWxsKTp2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiZWRpdFJlY29yZFwiKTtcclxuICAgICAgICB0aGlzLl9kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLmxvYWRWaWV3Qm9keShTYW9wV2ZBY3Rpb24ud2ZhRWRpdFJlY29yZCxkYXRhLHNlbmRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlY29yZERldGFpbHMoZGF0YTphbnksc2VuZGVyOmFueSA9IG51bGwpOnZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJlZGl0UmVjb3JkXCIpO1xyXG4gICAgICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMubG9hZFZpZXdCb2R5KFNhb3BXZkFjdGlvbi53ZmFSZWNvcmREZXN0YWlscyxkYXRhLHNlbmRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGN1c3Rvbkh0bWxCb2R5KGRhdGE6YW55LHNlbmRlcjphbnkgPSBudWxsKTp2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY3VzdG9uSHRtbEJvZHlcIik7XHJcbiAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy5sb2FkVmlld0JvZHkoU2FvcFdmQWN0aW9uLndmYUN1c3RvbUh0bWwsZGF0YSxzZW5kZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHB1YmxpYyByZWNvcmRQcmV2aWV3KGRhdGE6YW55LHNlbmRlcjphbnkgPSBudWxsKTp2b2lkIHtcclxuICAgIC8vICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiZWRpdFJlY29yZFwiKTtcclxuICAgIC8vICAgICB0aGlzLmxvYWRWaWV3Qm9keShTYW9wV2ZBY3Rpb24ud2ZhUHJlcGFyZVZpZXcsZGF0YSxzZW5kZXIpO1xyXG4gICAgLy8gfSAgICBcclxuXHJcbiAgICBwdWJsaWMgc2hvd1ZpZXdGb3JtKHdmQWN0aW9uOlNhb3BXZkFjdGlvbixkYXRhOmFueSxzZW5kZXI6YW55ID0gbnVsbCk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic2hvd1ZpZXdGb3JtXCIpO1xyXG4gICAgICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xyXG4gICAgICAgIGlmICh3ZkFjdGlvbiA9PSBTYW9wV2ZBY3Rpb24ud2ZhQWRkUmVjb3JkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkUmVjb3JkKGRhdGEsc2VuZGVyKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHdmQWN0aW9uID09IFNhb3BXZkFjdGlvbi53ZmFFZGl0UmVjb3JkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZWRpdFJlY29yZChkYXRhLHNlbmRlcik7XHJcbiAgICAgICAgfSBlbHNlIGlmICh3ZkFjdGlvbiA9PSBTYW9wV2ZBY3Rpb24ud2ZhUmVjb3JkRGVzdGFpbHMpIHsgIFxyXG4gICAgICAgICAgICB0aGlzLnJlY29yZERldGFpbHMoZGF0YSxzZW5kZXIpOyAgICAgICAgICBcclxuICAgICAgICB9IGVsc2UgaWYgKHdmQWN0aW9uID09IFNhb3BXZkFjdGlvbi53ZmFDdXN0b21IdG1sKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VzdG9uSHRtbEJvZHkoZGF0YSxzZW5kZXIpOyAgICAgICAgICBcclxuICAgICAgICB9ICAgICAgICBcclxuICAgICAgICB0aGlzLlNldFRvRnVsbFNjcmVlbigpOyAgICAgIFxyXG4gICAgfSAgXHJcblxyXG4gICAgcHVibGljIHByZXBhcmVWaWV3Rm9ybSh3ZkFjdGlvbjpTYW9wV2ZBY3Rpb24sZGF0YTphbnksc2VuZGVyOmFueSA9IG51bGwpOnZvaWR7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInNob3dWaWV3Rm9ybVwiKTtcclxuICAgICAgICB0aGlzLl9kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLl9wcmVwYXJlVmlldyA9IHRydWU7XHJcbiAgICAgICAgaWYgKHdmQWN0aW9uID09IFNhb3BXZkFjdGlvbi53ZmFBZGRSZWNvcmQpIHtcclxuICAgICAgICAgICAgdGhpcy5hZGRSZWNvcmQoZGF0YSxzZW5kZXIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAod2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYUVkaXRSZWNvcmQpIHtcclxuICAgICAgICAgICAgdGhpcy5lZGl0UmVjb3JkKGRhdGEsc2VuZGVyKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHdmQWN0aW9uID09IFNhb3BXZkFjdGlvbi53ZmFSZWNvcmREZXN0YWlscykgeyAgXHJcbiAgICAgICAgICAgIHRoaXMucmVjb3JkRGV0YWlscyhkYXRhLHNlbmRlcik7ICAgICAgICAgIFxyXG4gICAgICAgIH0gZWxzZSBpZiAod2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYUN1c3RvbUh0bWwpIHtcclxuICAgICAgICAgICAgdGhpcy5jdXN0b25IdG1sQm9keShkYXRhLHNlbmRlcik7ICAgICAgICAgIFxyXG4gICAgICAgIH0gXHJcblxyXG4gICAgICAgIHRoaXMuU2V0VG9GdWxsU2NyZWVuKCk7ICAgICAgXHJcbiAgICB9ICBcclxuXHJcbiAgICBwdWJsaWMgU2V0VG9GdWxsU2NyZWVuKCl7XHJcbiAgICAgICAgaWYgKHRoaXMuZnVsbFNjcmVlbiApe1xyXG4gICAgICAgICAgICB0aGlzLl92aWV3TW9kYWxGcmFtZS5hZGRDbGFzcyhcInNhb3AtbW9kYWwtZnVsbHNjcmVlbi1mb3JtXCIpO1xyXG4gICAgICAgICAgICBsZXQgX2RpYWxvZ0RpdiA9IHRoaXMuX3ZpZXdNb2RhbEZyYW1lLmZpbmQoXCIubW9kYWwtZGlhbG9nXCIpO1xyXG4gICAgICAgICAgICBfZGlhbG9nRGl2LnJlbW92ZUNsYXNzKCdtb2RhbC1kaWFsb2ctY2VudGVyZWQnKTtcclxuICAgICAgICAgICAgX2RpYWxvZ0Rpdi5hZGRDbGFzcygnbW9kYWwtZnVsbHNjcmVlbicpO1xyXG4gICAgICAgICAgICBfZGlhbG9nRGl2LnJlbW92ZUF0dHIoJ3N0eWxlJyk7XHJcbiAgICBcclxuICAgICAgICAgICAgbGV0IF9jb250ZW50ID0gdGhpcy5fdmlld01vZGFsRnJhbWUuZmluZChcIi5tb2RhbC1jb250ZW50XCIpO1xyXG4gICAgICAgICAgICBfY29udGVudC5yZW1vdmVBdHRyKCdjbGFzcycpO1xyXG4gICAgICAgICAgICBfY29udGVudC5hZGRDbGFzcygnbW9kYWwtY29udGVudCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVmcmVzaEVsZW1lbnREYXRhKGh0bWxDb250ZW50OnN0cmluZyxlbGVtZW50SWQ6c3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInJlZnJlc2hFbGVtZW50RGF0YVwiKTtcclxuICAgICAgICBsZXQgX2RvY3VtZW50ID0gJChodG1sQ29udGVudCk7XHJcbiAgICAgICAgbGV0IF9jZWxsID0gX2RvY3VtZW50LmZpbmQoZWxlbWVudElkKTtcclxuICAgICAgICAkKGVsZW1lbnRJZCkucmVwbGFjZVdpdGgoX2NlbGwpO1xyXG4gICAgICB9XHJcblxyXG4gICAgcHVibGljIENsb3NlVmlld0Zvcm0oKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdmlld01vZGFsRnJhbWUubW9kYWwoJ2hpZGUnKTtcclxuICAgICAgICAvLyBqdXN0IGluIGNhc2U6IG9kc3RyYW5pLCDEjWUgamUgxaFlIHZlZG5vIHZpZG5vLCBhdnRvbWF0c2tvIHNlIG5lIHphcHJlIHZlZG5vIDooXHJcbiAgICAgICAgJCgnLm1vZGFsLWJhY2tkcm9wJykucmVtb3ZlKCk7XHJcbiAgICAgICAgJChkb2N1bWVudC5ib2R5KS5yZW1vdmVDbGFzcyhcIm1vZGFsLW9wZW5cIik7ICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2hvd01vZGFsKCk6dm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3ByZXBhcmVWaWV3ID09IGZhbHNlKXtcclxuICAgICAgICAgICAgdGhpcy5fdmlld01vZGFsRnJhbWUubW9kYWwoJ3Nob3cnKTtcclxuICAgICAgICAgICAgc2V0TW9kYWxGb3JtWkluZGV4KHRoaXMuaWQpOyBcclxuICAgICAgICAgICAgc2V0Rmlyc3RGb3JtQ29udHJvbFRvRm9jdXModGhpcy5pZCk7XHJcbiAgICAgICAgfSAgICAgICAgXHJcbiAgICB9XHJcbiAgIFxyXG4gICAgLy8gIFxyXG59XHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCwgc2V0Rmlyc3RGb3JtQ29udHJvbFRvRm9jdXMgfSBmcm9tIFwiLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFV0aWxzIH0gZnJvbSBcIi4vQ29yZS9zYW9wLXV0aWxzXCI7XHJcbmltcG9ydCB7IFNhb3BUb2dnbGVQYW5lbCB9IGZyb20gXCIuL0NvbXBvbmVudHMvc2FvcC10b2dnbGUtcGFuZWxcIjtcclxuaW1wb3J0IHsgU2FvcElucHV0TWFzayB9IGZyb20gXCIuL0NvbXBvbmVudHMvc2FvcC1pbnB1dG1hc2tcIjtcclxuaW1wb3J0IHsgU2FvcENoZWNrYm94U3dpdGNoIH0gZnJvbSBcIi4vQ29tcG9uZW50cy9zYW9wLWNoZWNrYm94LXN3aXRjaFwiO1xyXG5pbXBvcnQgeyBTYW9wTXVsdGlzZWxlY3QgIH0gZnJvbSBcIi4vQ29tcG9uZW50cy9zYW9wLW11bHRpc2VsZWN0XCI7XHJcbmltcG9ydCB7IFNhb3BWaWV3U3Bpbm5lciB9IGZyb20gJy4vQ29tcG9uZW50cy9zYW9wLXZpZXctc3Bpbm5lcic7XHJcbmltcG9ydCB7IFNhb3BSaWdodFNpZGViYXIgfSBmcm9tICcuL0NvbXBvbmVudHMvc2FvcC1yaWdodC1zaWRlYmFyJztcclxuaW1wb3J0IHsgU2FvcENhbGVuZGFyICB9IGZyb20gXCIuL0NvbXBvbmVudHMvc2FvcC1jYWxlbmRhclwiO1xyXG5pbXBvcnQgeyBNZW51U2lkZWJhciB9IGZyb20gXCIuL0NvbXBvbmVudHMvc2FvcC1tZW51LXNpZGViYXJcIjtcclxuaW1wb3J0IHsgU2FvcE1lc3NhZ2VEbGcgfSBmcm9tIFwiLi9Db21wb25lbnRzL3Nhb3AtbWVzc2FnZS1kbGdcIjtcclxuaW1wb3J0IHsgU2FvcFBvcHVwRGlhbG9nIH0gZnJvbSAnLi9Db21wb25lbnRzL3Nhb3AtcG9wdXAtZGlhbG9nJ1xyXG5pbXBvcnQgeyBTYW9wRmxvYXRpbmdMYWJlbCB9IGZyb20gXCIuL0NvbXBvbmVudHMvc2FvcC1mbG9hdGluZy1sYWJlbFwiO1xyXG5pbXBvcnQgeyBTYW9wUmVnVmlldyB9IGZyb20gXCIuL1JFRy9zYW9wLXJlZ1VyYS12aWV3XCI7XHJcbmltcG9ydCB7IFNhb3BSZWdVcmFEYW5WaWV3IH0gZnJvbSBcIi4vUkVHL3Nhb3AtcmVnVXJhRGFuLXZpZXdcIlxyXG5pbXBvcnQgeyBTYW9wUmVnVXJhRG9nb2Rla1ZpZXcgfSBmcm9tIFwiLi9SRUcvc2FvcC1yZWdVcmFEb2dvZGVrLXZpZXdcIjtcclxuaW1wb3J0IHsgU2FvcFJlZ0Fic2VuY2VFdmVudHNWaWV3IH0gZnJvbSBcIi4vUkVHL3Nhb3AtcmVnQWJzZW5jZUV2ZW50cy12aWV3XCI7XHJcbmltcG9ydCB7IFNhb3BSZWdUb2RheUV2ZW50c1ZpZXcgfSBmcm9tIFwiLi9SRUcvc2FvcC1yZWdUb2RheUV2ZW50cy12aWV3XCI7XHJcbmltcG9ydCB7IFNhb3BEYXNoYm9hcmRWaWV3IH0gZnJvbSBcIi4vRGFzaGJvYXJkL3Nhb3AtZGFzaGJvYXJkLXZpZXdcIjtcclxuaW1wb3J0IHsgU2FvcFJlZ0F0dGVuZGFuY2VWaWV3IH0gZnJvbSAnLi9SRUcvc2FvcC1yZWdBdHRlbmRhbmNlLXZpZXcnO1xyXG5pbXBvcnQgeyBTYW9wQWJzZW5jZUNvbmZpcm1hdGlvblZpZXcgfSBmcm9tICcuL0Fic2VuY2VDb25maXJtYXRpb24vc2FvcC1hYnNlbmNlQ29uZmlybWF0aW9uLXZpZXcnO1xyXG5pbXBvcnQgeyBTYW9wQWJzZW5jZUNvbmZpcm1hdGlvblBlbmRpbmdWaWV3IH0gZnJvbSBcIi4vQWJzZW5jZUNvbmZpcm1hdGlvbi9zYW9wLWFic2VuY2VDb25maXJtYXRpb24tcGVuZGluZy12aWV3XCI7XHJcbmltcG9ydCB7IFNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUHJvY2Vzc2VkVmlldyB9IGZyb20gXCIuL0Fic2VuY2VDb25maXJtYXRpb24vc2FvcC1hYnNlbmNlQ29uZmlybWF0aW9uLXByb2Nlc3NlZC12aWV3XCI7XHJcbmltcG9ydCB7IFNhb3BBYnNlbmNlQ29uZmlybWF0aW9uQ2FsZW5kYXJWaWV3IH0gZnJvbSBcIi4vQWJzZW5jZUNvbmZpcm1hdGlvbi9zYW9wLWFic2VuY2VDb25maXJtYXRpb25DYWxlbmRhci12aWV3XCI7XHJcbmltcG9ydCB7IFNhb3BTcGxEb2N1bWVudFZpZXcgfSBmcm9tIFwiLi9TUExEb2N1bWVudC9zYW9wLXNwbERvY3VtZW50LXZpZXdcIjtcclxuaW1wb3J0IHsgU2FvcEFic2VuY2VDb25maXJtYXRpb25EZXRhaWxzRXZlbnRzIH0gZnJvbSBcIi4vQWJzZW5jZUNvbmZpcm1hdGlvbi9zYW9wLWFic2VuY2VDb25maXJtYXRpb24tZGV0YWlscy1ldmVudHNcIjtcclxuaW1wb3J0IHsgU2FvcEFic2VuY2VDb25maXJtYXRpb25QYXJ0aWFsbHlBcHByb3ZlVmlldyB9IGZyb20gXCIuL0Fic2VuY2VDb25maXJtYXRpb24vc2FvcC1hYnNlbmNlQ29uZmlybWF0aW9uLXBhcnRpYWxseS1hcHByb3ZlLXZpZXdcIjtcclxuaW1wb3J0IHsgT1BOUG90bmlOYWxvZ2lHcmlkIH0gZnJvbSBcIi4vT1BOL09QTlBvdG5pTmFsb2dpLWdyaWRcIjtcclxuaW1wb3J0IHsgT1BOUG90bmlOYWxvZ2lBcmhpdkdyaWQgfSBmcm9tIFwiLi9PUE4vT1BOUG90bmlOYWxvZ2lBcmhpdi1ncmlkXCI7XHJcbmltcG9ydCB7IE9QTlBvdG5pTmFsb2dpQWxsR3JpZCB9IGZyb20gXCIuL09QTi9PUE5Qb3RuaU5hbG9naUFsbC1ncmlkXCI7XHJcbmltcG9ydCB7IFNhb3BTZXR0aW5nc1ZpZXcgfSBmcm9tIFwiLi9TZXR0aW5ncy9zYW9wLXNldHRpbmdzLXZpZXdcIjtcclxuaW1wb3J0IHsgU2FvcFJlZ0Fic2VuY2VNYWluVmlldyB9IGZyb20gXCIuL1JFRy9zYW9wLXJlZ0Fic2VuY2VNYWluLXZpZXdcIjtcclxuaW1wb3J0IHsgU2FvcE9yZ2FuaWdyYW1WaWV3IH0gZnJvbSBcIi4vT3JnYW5pemF0aW9uL3Nhb3Atb3JnYW5pZ3JhbS12aWV3XCI7XHJcbmltcG9ydCB7IFNhb3BSZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzVmlldyB9IGZyb20gJy4vUkVHL3Nhb3AtcmVnQXR0ZW5kYW5jZUFsbEVtcGxveWVlcy12aWV3JztcclxuaW1wb3J0IHsgU2FvcENoYW5nZVB3ZFZpZXcgfSBmcm9tICcuL0FjY291bnQvc2FvcC1jaGFuZ2UtcHdkLXZpZXcnO1xyXG5pbXBvcnQgeyBOREtJbnRlcm5hbE9yZGVycyB9IGZyb20gXCIuL05ESy9OREtJbnRlcm5hbE9yZGVyc1wiO1xyXG5pbXBvcnQgeyBOREtJbnRlcm5hbE9yZGVyRWRpdEZvcm0gfSBmcm9tIFwiLi9OREsvTkRLSW50ZXJuYWxPcmRlckVkaXRGb3JtXCI7XHJcbmltcG9ydCB7IEtlRXBsb3llZUxlYXZlTGlzdEdyaWQgfSBmcm9tICcuL0Fic2VuY2VDb25maXJtYXRpb24vc2FvcC1lbXBsb3llZUxlYXZlTGlzdC1ncmlkJ1xyXG5pbXBvcnQgeyBLRU15R3JhZGVzIH0gZnJvbSAnLi9LRS9LRU15R3JhZGVzJztcclxuaW1wb3J0IHsgS0VNeUdyYWRlRGV0YWlscyB9IGZyb20gJy4vS0UvS0VNeUdyYWRlRGV0YWlscyc7XHJcbmltcG9ydCB7IEtFR3JhZGVzUGVyaW9kIH0gZnJvbSAnLi9LRS9LRUdyYWRlc1BlcmlvZCc7XHJcbmltcG9ydCB7IFNhb3BHb29nbGVNYXBzIH0gZnJvbSAnLi9Db21wb25lbnRzL3Nhb3AtZ29vZ2xlbWFwcyc7XHJcbmltcG9ydCB7IFNhb3BSZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzQW5hbHlzaXNWaWV3IH0gZnJvbSBcIi4vUkVHL3Nhb3AtcmVnQXR0ZW5kYW5jZUFsbEVtcGxveWVlc0FuYWx5c2lzLXZpZXdcIjtcclxuaW1wb3J0IHsgTElLVkNha2FsbmFWcnN0YUdyaWQgfSBmcm9tIFwiLi9MSUtWL0xJS1ZDYWthbG5hVnJzdGEtZ3JpZFwiO1xyXG5pbXBvcnQgeyBMSUtWQ2FrYWxuYVZyc3RhVmlldyB9IGZyb20gXCIuL0xJS1YvTElLVkNha2FsbmFWcnN0YS12aWV3XCI7XHJcbmltcG9ydCB7IFNhb3BBcHBTZXR0aW5nc1ZpZXcgfSBmcm9tIFwiLi9BcHBTZXR0aW5ncy9zYW9wLWFwcHNldHRpbmdzLXZpZXdcIjtcclxuaW1wb3J0IHsgTElLVkNha2FsbmFWcnN0YUFyaGl2R3JpZCB9IGZyb20gXCIuL0xJS1YvTElLVkNha2FsbmFWcnN0YUFyaGl2LWdyaWRcIjtcclxuaW1wb3J0IHsgU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNFeGNlc3NIb3Vyc0dyaWQgfSBmcm9tIFwiLi9SRUcvc2FvcC1yZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzRXhjZXNzSG91cnMtZ3JpZFwiO1xyXG5pbXBvcnQgeyBMSUtWTml2b2ppUG90cmpldmFuamFHcmlkIH0gZnJvbSBcIi4vTElLVi9MSUtWTml2b2ppUG90cmpldmFuamEtZ3JpZFwiO1xyXG5cclxuLyppbXBvcnQgeyBleHRlbmQgfSBmcm9tIFwianF1ZXJ5XCI7Ki9cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjaGVja0NvbXBhdGliaWxpdHkoKTogYm9vbGVhbiB7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY2hlY2tDb21wYXRpYmlsaXR5XCIpO1xyXG4gICAgbGV0IHV0aWxzID0gbmV3IFNhb3BVdGlscygpO1xyXG4gICAgcmV0dXJuIHV0aWxzLmNoZWNrQ29tcGF0aWJpbGl0eSgpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaW5pdENsaWVudExvZ01vZGVWYWx1ZSgpIHtcclxuICAgIGdsb2JhbC5kZWJ1Z01vZGUgPSBnbG9iYWwuR2V0Q2xpZW50TG9nTW9kZVN0b3JhZ2VWYWx1ZSgpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaW5pdFNpdGVCYXNlVXJsVmFsdWUoKSB7XHJcbiAgICBnbG9iYWwuc2l0ZUJhc2VVcmwgPSBnbG9iYWwuZ2V0U2l0ZUJhc2VVcmwoKVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZVNpdGVKUygpIHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJpbml0aWFsaXplU2l0ZUpTXCIpO1xyXG4gICAgLy9uZXcgTWVudVNpZGViYXIoKS5pbml0KCk7XHJcbiAgICBuZXcgU2FvcFRvZ2dsZVBhbmVsKCkuaW5pdCgpO1xyXG5cclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIGlmIChlLmN0cmxLZXkgJiYgZS5hbHRLZXkgJiYgZS5rZXlDb2RlID09IDc5KSB7XHJcbiAgICAgICAgICAgIC8vIENUUkwgKyBBTFQgKyBPXHJcbiAgICAgICAgICAgIGdsb2JhbC5TZXRDbGllbnRMb2dNb2RlU3RvcmFnZVZhbHVlKCk7XHJcbiAgICAgICAgICAgIGdsb2JhbC5kZWJ1Z01vZGUgPSBnbG9iYWwuR2V0Q2xpZW50TG9nTW9kZVN0b3JhZ2VWYWx1ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGdsb2JhbC5zZXRIZWxwTGluaygpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0Rmlyc3RDb250cm9sVG9Gb2N1cyhmb3JtSWQ6IHN0cmluZykge1xyXG4gICAgc2V0Rmlyc3RGb3JtQ29udHJvbFRvRm9jdXMoZm9ybUlkKTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BUb2dnbGVQYW5lbEV4IGV4dGVuZHMgU2FvcFRvZ2dsZVBhbmVse307XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcElucHV0TWFza0V4IGV4dGVuZHMgU2FvcElucHV0TWFza3t9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BDaGVja2JveFN3aXRjaEV4IGV4dGVuZHMgU2FvcENoZWNrYm94U3dpdGNoe307XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcE11bHRpc2VsZWN0RXggZXh0ZW5kcyBTYW9wTXVsdGlzZWxlY3R7fTtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wQ2FsZW5kYXJFeCBleHRlbmRzIFNhb3BDYWxlbmRhcnt9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BNZXNzYWdlRGxnRXggZXh0ZW5kcyBTYW9wTWVzc2FnZURsZ3t9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BQb3B1cERpYWxvZ0V4IGV4dGVuZHMgU2FvcFBvcHVwRGlhbG9ne307XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFJlZ1ZpZXdFeCBleHRlbmRzIFNhb3BSZWdWaWV3e307XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFJlZ1VyYURhblZpZXdFeCBleHRlbmRzIFNhb3BSZWdVcmFEYW5WaWV3e307XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFJlZ1VyYURvZ29kZWtWaWV3RXggZXh0ZW5kcyBTYW9wUmVnVXJhRG9nb2Rla1ZpZXd7fTtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wUmVnQWJzZW5jZUV2ZW50c1ZpZXdFeCBleHRlbmRzIFNhb3BSZWdBYnNlbmNlRXZlbnRzVmlldyB7IH07XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFJlZ1RvZGF5RXZlbnRzVmlld0V4IGV4dGVuZHMgU2FvcFJlZ1RvZGF5RXZlbnRzVmlldyB7IH07XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcERhc2hib2FyZFZpZXdFeCBleHRlbmRzIFNhb3BEYXNoYm9hcmRWaWV3IHsgfTtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wVmlld1NwaW5uZXJFWCBleHRlbmRzIFNhb3BWaWV3U3Bpbm5lciB7IH07XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFJpZ2h0U2lkZWJhckV4IGV4dGVuZHMgU2FvcFJpZ2h0U2lkZWJhciB7IH07XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFJlZ0F0dGVuZGFuY2VWaWV3RXggZXh0ZW5kcyBTYW9wUmVnQXR0ZW5kYW5jZVZpZXcgeyB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BBYnNlbmNlQ29uZmlybWF0aW9uVmlld0V4IGV4dGVuZHMgU2FvcEFic2VuY2VDb25maXJtYXRpb25WaWV3IHsgfTtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wQWJzZW5jZUNvbmZpcm1hdGlvblBlbmRpbmdWaWV3RXggZXh0ZW5kcyBTYW9wQWJzZW5jZUNvbmZpcm1hdGlvblBlbmRpbmdWaWV3IHsgfTsgXHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcEFic2VuY2VDb25maXJtYXRpb25Qcm9jZXNzZWRWaWV3RXggZXh0ZW5kcyBTYW9wQWJzZW5jZUNvbmZpcm1hdGlvblByb2Nlc3NlZFZpZXcgeyB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BBYnNlbmNlQ29uZmlybWF0aW9uQ2FsZW5kYXJWaWV3RXggZXh0ZW5kcyBTYW9wQWJzZW5jZUNvbmZpcm1hdGlvbkNhbGVuZGFyVmlldyB7IH07XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFNwbERvY3VtZW50Vmlld0V4IGV4dGVuZHMgU2FvcFNwbERvY3VtZW50VmlldyB7IH07XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcEFic2VuY2VDb25maXJtYXRpb25EZXRhaWxzRXZlbnRzRXggZXh0ZW5kcyBTYW9wQWJzZW5jZUNvbmZpcm1hdGlvbkRldGFpbHNFdmVudHMgeyB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUGFydGlhbGx5QXBwcm92ZVZpZXdFeCBleHRlbmRzIFNhb3BBYnNlbmNlQ29uZmlybWF0aW9uUGFydGlhbGx5QXBwcm92ZVZpZXcgeyB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIE9QTlBvdG5pTmFsb2dpR3JpZEV4IGV4dGVuZHMgT1BOUG90bmlOYWxvZ2lHcmlkIHsgfTtcclxuXHJcbmV4cG9ydCBjbGFzcyBPUE5Qb3RuaU5hbG9naUdyaWRBcmhpdkV4IGV4dGVuZHMgT1BOUG90bmlOYWxvZ2lBcmhpdkdyaWQgeyB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIE9QTlBvdG5pTmFsb2dpQWxsR3JpZEV4IGV4dGVuZHMgT1BOUG90bmlOYWxvZ2lBbGxHcmlkIHsgfTtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wRmxvYXRpbmdMYWJlbEV4IGV4dGVuZHMgU2FvcEZsb2F0aW5nTGFiZWwgeyB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BTZXR0aW5nc1ZpZXdFeCBleHRlbmRzIFNhb3BTZXR0aW5nc1ZpZXcgeyB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BSZWdBYnNlbmNlTWFpblZpZXdFeCBleHRlbmRzIFNhb3BSZWdBYnNlbmNlTWFpblZpZXcgeyB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BPcmdhbmlncmFtVmlld0V4IGV4dGVuZHMgU2FvcE9yZ2FuaWdyYW1WaWV3IHsgfTtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wUmVnQXR0ZW5kYW5jZUFsbEVtcGxveWVlc1ZpZXdFeCBleHRlbmRzIFNhb3BSZWdBdHRlbmRhbmNlQWxsRW1wbG95ZWVzVmlldyB7IH07XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcENoYW5nZVB3ZFZpZXdFeCBleHRlbmRzIFNhb3BDaGFuZ2VQd2RWaWV3IHsgfTtcclxuXHJcbmV4cG9ydCBjbGFzcyBOREtJbnRlcm5hbE9yZGVyc0V4IGV4dGVuZHMgTkRLSW50ZXJuYWxPcmRlcnMgeyB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIE5ES0ludGVybmFsT3JkZXJFZGl0Rm9ybUV4IGV4dGVuZHMgTkRLSW50ZXJuYWxPcmRlckVkaXRGb3JtIHsgfTtcclxuXHJcbmV4cG9ydCBjbGFzcyBLZUVwbG95ZWVMZWF2ZUxpc3RHcmlkRXggZXh0ZW5kcyBLZUVwbG95ZWVMZWF2ZUxpc3RHcmlkIHsgfTtcclxuXHJcbmV4cG9ydCBjbGFzcyBLRU15R3JhZGVzRXggZXh0ZW5kcyBLRU15R3JhZGVzIHsgfVxyXG5cclxuZXhwb3J0IGNsYXNzIEtFTXlHcmFkZURldGFpbHNFeCBleHRlbmRzIEtFTXlHcmFkZURldGFpbHMgeyB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIEtFR3JhZGVzUGVyaW9kRXggZXh0ZW5kcyBLRUdyYWRlc1BlcmlvZCB7IH07XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcEdvb2dsZU1hcHNFeCBleHRlbmRzIFNhb3BHb29nbGVNYXBzIHsgfTtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wUmVnQXR0ZW5kYW5jZUFsbEVtcGxveWVlc0FuYWx5c2lzVmlld0V4IGV4dGVuZHMgU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNBbmFseXNpc1ZpZXcgeyB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIExJS1ZDYWthbG5hVnJzdGFHcmlkRXggZXh0ZW5kcyBMSUtWQ2FrYWxuYVZyc3RhR3JpZCB7fTtcclxuXHJcbmV4cG9ydCBjbGFzcyBMSUtWQ2FrYWxuYVZyc3RhVmlld0V4IGV4dGVuZHMgTElLVkNha2FsbmFWcnN0YVZpZXcge307XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcEFwcFNldHRpbmdzVmlld0V4IGV4dGVuZHMgU2FvcEFwcFNldHRpbmdzVmlldyB7fTtcclxuXHJcbmV4cG9ydCBjbGFzcyBMSUtWQ2FrYWxuYVZyc3RhR3JpZEFyaGl2RXggZXh0ZW5kcyBMSUtWQ2FrYWxuYVZyc3RhQXJoaXZHcmlkIHsgfTtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wUmVnQXR0ZW5kYW5jZUFsbEVtcGxveWVlc0V4Y2Vzc0hvdXJzR3JpZEV4IGV4dGVuZHMgU2FvcFJlZ0F0dGVuZGFuY2VBbGxFbXBsb3llZXNFeGNlc3NIb3Vyc0dyaWQgeyB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIG1vakluZm9NZW51U2lkZWJhckV4IGV4dGVuZHMgTWVudVNpZGViYXIgeyB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIExJS1ZOaXZvamlQb3RyamV2YW5qYUdyaWRFeCBleHRlbmRzIExJS1ZOaXZvamlQb3RyamV2YW5qYUdyaWQgeyB9O1xyXG4vLyIsIu+7v2ltcG9ydCB7IGdsb2JhbCwgZ2V0UmVsYXRpdmVTaXRlVVJMLCBnZXRTaXRlQWJzb2x1dGVVUkwsIGlzRW1wdHksIGlzVW5EZWZpbmVkIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wVmlld0Zvcm0gfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXZpZXctZm9ybVwiO1xyXG5pbXBvcnQgeyBTYW9wTXVsdGlzZWxlY3QgfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLW11bHRpc2VsZWN0XCI7XHJcbmltcG9ydCB7IFNhb3BTZXJ2aWNlc0NvcmUgfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXNlcnZpY2VzLWNvcmVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBPUE5TZWxlY3RQYXNzZW5nZXJzVmlldyBleHRlbmRzIFNhb3BWaWV3Rm9ybSB7XHJcbiAgcHJpdmF0ZSBfc2VsZWN0WmFwb3NsZW5pOiBTYW9wTXVsdGlzZWxlY3Q7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHZpZXdJZDpzdHJpbmcsbGliTmFtZTpzdHJpbmcgPSBcIlwiKXtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJPUE5Qb3RuaU5hbG9naUdvZ2dsZU1hcHNWaWV3XCIpO1xyXG4gICAgc3VwZXIodmlld0lkLGxpYk5hbWUpO1xyXG4gICAgdGhpcy5zZXREaWN0aW9uYXJ5KCk7ICAgXHJcbiAgICB0aGlzLmFkZFJlY29yZEVuZHBvaW50ID0gXCJcIjtcclxuICAgIHRoaXMuZWRpdFJlY29yZEVuZHBvaW50ID0gXCJUcmF2ZWxPcmRlci9HZXRTZWxlY3RQYXNzZW5nZXJzVmlld1wiO1xyXG4gICAgdGhpcy5kZWxldGVSZWNvcmRFbmRwb2ludCA9IFwiXCI7ICAgXHJcbiAgICB0aGlzLmZ1bGxTY3JlZW4gPSB0cnVlO1xyXG4gICAgdGhpcy5mdWxsVGl0bGUgPSB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJOb3Ygdm5vczogU29wb3RuaWtcIik7XHJcbiAgICB0aGlzLmZ1bGxTY3JlZW4gPSBmYWxzZTtcclxuICAgIC8vXHJcbiAgICB0aGlzLmFmdGVyVmlld1Nob3dTdWNjZXNzID0gdGhpcy5hZnRlclZpZXdTaG93U3VjY2Vzc0V4dC5iaW5kKHRoaXMpOyAgIFxyXG4gICAgLy9cclxuICAgIHRoaXMuX3NlbGVjdFphcG9zbGVuaSA9IG5ldyBTYW9wTXVsdGlzZWxlY3QobGliTmFtZStcIi5fc2VsZWN0WmFwb3NsZW5pXCIse3NlbGVjdEFsbDpmYWxzZSxzZWxlY3RBbGxPcHRpb246ZmFsc2UsaW5wdXRXaWR0aFBYOicyNjBweCd9KTtcclxuICAgIHRoaXMuX3NlbGVjdFphcG9zbGVuaS5hZnRlckNoYW5nZUNvbW1vbkV2ZW50ID0gdGhpcy5yZWZyZXNoU2VsZWN0ZWRFbXBsb3llZXNMaXN0LmJpbmQodGhpcyk7XHJcbiAgfVxyXG5cclxuICBzZXREaWN0aW9uYXJ5KCl7XHJcbiAgICBsZXQgZGljdGlvbmFyeTpzdHJpbmdbXSA9IFtcIk5vdiB2bm9zOiBTb3BvdG5pa1wiXTtcclxuICAgIHRoaXMuc2V0VGVybWlub2xvZ3lMaXN0KGRpY3Rpb25hcnkpO1xyXG59ICAgXHJcblxyXG4gIHB1YmxpYyBiaW5kUmVtb3ZlQnV0dG9uRXZlbnRzICgpOnZvaWR7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgLy9cclxuICAgICQodGhpcy5pZCkuZmluZCgnLnNhb3AtcmVtb3ZlLWl0ZW0tZXZlbnQnKS5vZmYoJ2NsaWNrJyk7XHJcbiAgICAkKHRoaXMuaWQpLmZpbmQoJy5zYW9wLXJlbW92ZS1pdGVtLWV2ZW50JykuYmluZCgnY2xpY2snLCBcclxuICAgICAgZnVuY3Rpb24ocm93KSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIi5zYW9wLXJlbW92ZS1pdGVtLWV2ZW50LmNsaWNrXCIpO1xyXG4gICAgICAgIC8vIC8vXHJcbiAgICAgICAgbGV0IF9idG5SZW1vdmUgPSByb3cuY3VycmVudFRhcmdldDtcclxuICAgICAgICBsZXQgX3NpZnJhemFwb3NsZW5pID0gX2J0blJlbW92ZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXNpZnJhemFwb3NsZW5pXCIpO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgX3RoaXMuX3NlbGVjdFphcG9zbGVuaS51bnNldFNlbGVjdFZhbHVlcyhbX3NpZnJhemFwb3NsZW5pXSk7XHJcbiAgICAgIH0gICAgICAgICAgXHJcbiAgICApOyAgXHJcblxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFmdGVyVmlld1Nob3dTdWNjZXNzRXh0KHNlbmRlcjphbnkpOnZvaWR7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKHRoaXMuaWQgKyBcIi5hZnRlclZpZXdTaG93U3VjY2Vzc0V4dCgpXCIpO1xyXG4gICAgdGhpcy5fc2VsZWN0WmFwb3NsZW5pLmluaXQoXCIjb3BuTW9kZWxfU2VsZWN0ZWRFbXBsb3llZXNcIiwgXCJaYXBvc2xlbmlcIik7IFxyXG4gIH0gIFxyXG4gIFxyXG4gIHB1YmxpYyByZWZyZXNoU2VsZWN0ZWRFbXBsb3llZXNMaXN0KCk6dm9pZCB7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwicmVncmVzaFNlbGVjdGVkRW1wbG95ZWVzTGlzdFwiKTtcclxuXHJcbiAgICBsZXQgX3NlbGVjdGVkRW1wbG95ZWVzTGlzdCA9ICQodGhpcy5pZCkuZmluZChcIiNvcG5Nb2RlbF9TZWxlY3RlZEVtcGxveWVlc1wiKS52YWwoKSBhcyBbYW55XTtcclxuICAgIC8vXHJcbiAgICAkKHRoaXMuaWQpLmZpbmQoXCIjU2VsZWN0ZWRFbXBsb3llZXNMaXN0XCIpLnZhbChfc2VsZWN0ZWRFbXBsb3llZXNMaXN0KTtcclxuICAgIC8vXHJcbiAgICB2YXIgbXlKc29uU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoX3NlbGVjdGVkRW1wbG95ZWVzTGlzdCk7XHJcbiAgICB0aGlzLnJlZnJlc2hMaW5rc0RhdGEobXlKc29uU3RyaW5nKTtcclxuICAgIC8vXHJcbiAgfVxyXG5cclxuICByZWZyZXNoTGlua3NEYXRhKGpzb25FbXBsb3llZXNMaXN0OnN0cmluZyk6dm9pZCB7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwicmVmcmVzaExpbmtzRGF0YVwiKTtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IF9kYXRhID0gdGhpcy5nZXREYXRhKCk7XHJcbiAgICBPYmplY3QuYXNzaWduKF9kYXRhLCB7XCJqc29uRW1wbG95ZWVzTGlzdFwiOmpzb25FbXBsb3llZXNMaXN0fSk7XHJcblxyXG4gICAgbGV0IF9zYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgIF9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uKHJlc3BvbnNlKXtcclxuICAgICAgJChfdGhpcy5pZCkuZmluZChcIiNTZWxlY3RlZEVtcGxveWVlc0xpc3RBamF4XCIpLmh0bWwocmVzcG9uc2UpO1xyXG4gICAgICBfdGhpcy5iaW5kUmVtb3ZlQnV0dG9uRXZlbnRzKCk7XHJcbiAgICB9O1xyXG4gICAgX3Nhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgYWN0aW9uOlwiVHJhdmVsT3JkZXIvR2V0TGlua3NcIiBcclxuICAgICAgICAsZGF0YTogX2RhdGFcclxuICAgICAgICAsdHlwZTpcIkdFVFwiXHJcbiAgICB9KTsgICAgIFxyXG4gIH1cclxuXHJcblxyXG4gIC8vXHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwiLy8hIG1vbWVudC5qc1xuLy8hIHZlcnNpb24gOiAyLjMwLjFcbi8vISBhdXRob3JzIDogVGltIFdvb2QsIElza3JlbiBDaGVybmV2LCBNb21lbnQuanMgY29udHJpYnV0b3JzXG4vLyEgbGljZW5zZSA6IE1JVFxuLy8hIG1vbWVudGpzLmNvbVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKSA6XG4gICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgICBnbG9iYWwubW9tZW50ID0gZmFjdG9yeSgpXG59KHRoaXMsIChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBob29rQ2FsbGJhY2s7XG5cbiAgICBmdW5jdGlvbiBob29rcygpIHtcbiAgICAgICAgcmV0dXJuIGhvb2tDYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgZG9uZSB0byByZWdpc3RlciB0aGUgbWV0aG9kIGNhbGxlZCB3aXRoIG1vbWVudCgpXG4gICAgLy8gd2l0aG91dCBjcmVhdGluZyBjaXJjdWxhciBkZXBlbmRlbmNpZXMuXG4gICAgZnVuY3Rpb24gc2V0SG9va0NhbGxiYWNrKGNhbGxiYWNrKSB7XG4gICAgICAgIGhvb2tDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQXJyYXkoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGlucHV0IGluc3RhbmNlb2YgQXJyYXkgfHxcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IEFycmF5XSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc09iamVjdChpbnB1dCkge1xuICAgICAgICAvLyBJRTggd2lsbCB0cmVhdCB1bmRlZmluZWQgYW5kIG51bGwgYXMgb2JqZWN0IGlmIGl0IHdhc24ndCBmb3JcbiAgICAgICAgLy8gaW5wdXQgIT0gbnVsbFxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgaW5wdXQgIT0gbnVsbCAmJlxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgT2JqZWN0XSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYXNPd25Qcm9wKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLCBiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc09iamVjdEVtcHR5KG9iaikge1xuICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBrO1xuICAgICAgICAgICAgZm9yIChrIGluIG9iaikge1xuICAgICAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKG9iaiwgaykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNVbmRlZmluZWQoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0ID09PSB2b2lkIDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNOdW1iZXIoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IE51bWJlcl0nXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEYXRlKGlucHV0KSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIERhdGUgfHxcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IERhdGVdJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1hcChhcnIsIGZuKSB7XG4gICAgICAgIHZhciByZXMgPSBbXSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBhcnJMZW4gPSBhcnIubGVuZ3RoO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJyTGVuOyArK2kpIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKGZuKGFycltpXSwgaSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXh0ZW5kKGEsIGIpIHtcbiAgICAgICAgZm9yICh2YXIgaSBpbiBiKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcChiLCBpKSkge1xuICAgICAgICAgICAgICAgIGFbaV0gPSBiW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc093blByb3AoYiwgJ3RvU3RyaW5nJykpIHtcbiAgICAgICAgICAgIGEudG9TdHJpbmcgPSBiLnRvU3RyaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc093blByb3AoYiwgJ3ZhbHVlT2YnKSkge1xuICAgICAgICAgICAgYS52YWx1ZU9mID0gYi52YWx1ZU9mO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlVVRDKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0KSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbE9yVVRDKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0LCB0cnVlKS51dGMoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWZhdWx0UGFyc2luZ0ZsYWdzKCkge1xuICAgICAgICAvLyBXZSBuZWVkIHRvIGRlZXAgY2xvbmUgdGhpcyBvYmplY3QuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlbXB0eTogZmFsc2UsXG4gICAgICAgICAgICB1bnVzZWRUb2tlbnM6IFtdLFxuICAgICAgICAgICAgdW51c2VkSW5wdXQ6IFtdLFxuICAgICAgICAgICAgb3ZlcmZsb3c6IC0yLFxuICAgICAgICAgICAgY2hhcnNMZWZ0T3ZlcjogMCxcbiAgICAgICAgICAgIG51bGxJbnB1dDogZmFsc2UsXG4gICAgICAgICAgICBpbnZhbGlkRXJhOiBudWxsLFxuICAgICAgICAgICAgaW52YWxpZE1vbnRoOiBudWxsLFxuICAgICAgICAgICAgaW52YWxpZEZvcm1hdDogZmFsc2UsXG4gICAgICAgICAgICB1c2VySW52YWxpZGF0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgaXNvOiBmYWxzZSxcbiAgICAgICAgICAgIHBhcnNlZERhdGVQYXJ0czogW10sXG4gICAgICAgICAgICBlcmE6IG51bGwsXG4gICAgICAgICAgICBtZXJpZGllbTogbnVsbCxcbiAgICAgICAgICAgIHJmYzI4MjI6IGZhbHNlLFxuICAgICAgICAgICAgd2Vla2RheU1pc21hdGNoOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRQYXJzaW5nRmxhZ3MobSkge1xuICAgICAgICBpZiAobS5fcGYgPT0gbnVsbCkge1xuICAgICAgICAgICAgbS5fcGYgPSBkZWZhdWx0UGFyc2luZ0ZsYWdzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG0uX3BmO1xuICAgIH1cblxuICAgIHZhciBzb21lO1xuICAgIGlmIChBcnJheS5wcm90b3R5cGUuc29tZSkge1xuICAgICAgICBzb21lID0gQXJyYXkucHJvdG90eXBlLnNvbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc29tZSA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICAgICAgICAgIHZhciB0ID0gT2JqZWN0KHRoaXMpLFxuICAgICAgICAgICAgICAgIGxlbiA9IHQubGVuZ3RoID4+PiAwLFxuICAgICAgICAgICAgICAgIGk7XG5cbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpIGluIHQgJiYgZnVuLmNhbGwodGhpcywgdFtpXSwgaSwgdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNWYWxpZChtKSB7XG4gICAgICAgIHZhciBmbGFncyA9IG51bGwsXG4gICAgICAgICAgICBwYXJzZWRQYXJ0cyA9IGZhbHNlLFxuICAgICAgICAgICAgaXNOb3dWYWxpZCA9IG0uX2QgJiYgIWlzTmFOKG0uX2QuZ2V0VGltZSgpKTtcbiAgICAgICAgaWYgKGlzTm93VmFsaWQpIHtcbiAgICAgICAgICAgIGZsYWdzID0gZ2V0UGFyc2luZ0ZsYWdzKG0pO1xuICAgICAgICAgICAgcGFyc2VkUGFydHMgPSBzb21lLmNhbGwoZmxhZ3MucGFyc2VkRGF0ZVBhcnRzLCBmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpICE9IG51bGw7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlzTm93VmFsaWQgPVxuICAgICAgICAgICAgICAgIGZsYWdzLm92ZXJmbG93IDwgMCAmJlxuICAgICAgICAgICAgICAgICFmbGFncy5lbXB0eSAmJlxuICAgICAgICAgICAgICAgICFmbGFncy5pbnZhbGlkRXJhICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmludmFsaWRNb250aCAmJlxuICAgICAgICAgICAgICAgICFmbGFncy5pbnZhbGlkV2Vla2RheSAmJlxuICAgICAgICAgICAgICAgICFmbGFncy53ZWVrZGF5TWlzbWF0Y2ggJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MubnVsbElucHV0ICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmludmFsaWRGb3JtYXQgJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MudXNlckludmFsaWRhdGVkICYmXG4gICAgICAgICAgICAgICAgKCFmbGFncy5tZXJpZGllbSB8fCAoZmxhZ3MubWVyaWRpZW0gJiYgcGFyc2VkUGFydHMpKTtcbiAgICAgICAgICAgIGlmIChtLl9zdHJpY3QpIHtcbiAgICAgICAgICAgICAgICBpc05vd1ZhbGlkID1cbiAgICAgICAgICAgICAgICAgICAgaXNOb3dWYWxpZCAmJlxuICAgICAgICAgICAgICAgICAgICBmbGFncy5jaGFyc0xlZnRPdmVyID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLnVudXNlZFRva2Vucy5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYmlnSG91ciA9PT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3QuaXNGcm96ZW4gPT0gbnVsbCB8fCAhT2JqZWN0LmlzRnJvemVuKG0pKSB7XG4gICAgICAgICAgICBtLl9pc1ZhbGlkID0gaXNOb3dWYWxpZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBpc05vd1ZhbGlkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtLl9pc1ZhbGlkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUludmFsaWQoZmxhZ3MpIHtcbiAgICAgICAgdmFyIG0gPSBjcmVhdGVVVEMoTmFOKTtcbiAgICAgICAgaWYgKGZsYWdzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGV4dGVuZChnZXRQYXJzaW5nRmxhZ3MobSksIGZsYWdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhtKS51c2VySW52YWxpZGF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgLy8gUGx1Z2lucyB0aGF0IGFkZCBwcm9wZXJ0aWVzIHNob3VsZCBhbHNvIGFkZCB0aGUga2V5IGhlcmUgKG51bGwgdmFsdWUpLFxuICAgIC8vIHNvIHdlIGNhbiBwcm9wZXJseSBjbG9uZSBvdXJzZWx2ZXMuXG4gICAgdmFyIG1vbWVudFByb3BlcnRpZXMgPSAoaG9va3MubW9tZW50UHJvcGVydGllcyA9IFtdKSxcbiAgICAgICAgdXBkYXRlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gICAgZnVuY3Rpb24gY29weUNvbmZpZyh0bywgZnJvbSkge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIHByb3AsXG4gICAgICAgICAgICB2YWwsXG4gICAgICAgICAgICBtb21lbnRQcm9wZXJ0aWVzTGVuID0gbW9tZW50UHJvcGVydGllcy5sZW5ndGg7XG5cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9pc0FNb21lbnRPYmplY3QpKSB7XG4gICAgICAgICAgICB0by5faXNBTW9tZW50T2JqZWN0ID0gZnJvbS5faXNBTW9tZW50T2JqZWN0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5faSkpIHtcbiAgICAgICAgICAgIHRvLl9pID0gZnJvbS5faTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2YpKSB7XG4gICAgICAgICAgICB0by5fZiA9IGZyb20uX2Y7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9sKSkge1xuICAgICAgICAgICAgdG8uX2wgPSBmcm9tLl9sO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fc3RyaWN0KSkge1xuICAgICAgICAgICAgdG8uX3N0cmljdCA9IGZyb20uX3N0cmljdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX3R6bSkpIHtcbiAgICAgICAgICAgIHRvLl90em0gPSBmcm9tLl90em07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9pc1VUQykpIHtcbiAgICAgICAgICAgIHRvLl9pc1VUQyA9IGZyb20uX2lzVVRDO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fb2Zmc2V0KSkge1xuICAgICAgICAgICAgdG8uX29mZnNldCA9IGZyb20uX29mZnNldDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX3BmKSkge1xuICAgICAgICAgICAgdG8uX3BmID0gZ2V0UGFyc2luZ0ZsYWdzKGZyb20pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fbG9jYWxlKSkge1xuICAgICAgICAgICAgdG8uX2xvY2FsZSA9IGZyb20uX2xvY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtb21lbnRQcm9wZXJ0aWVzTGVuID4gMCkge1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1vbWVudFByb3BlcnRpZXNMZW47IGkrKykge1xuICAgICAgICAgICAgICAgIHByb3AgPSBtb21lbnRQcm9wZXJ0aWVzW2ldO1xuICAgICAgICAgICAgICAgIHZhbCA9IGZyb21bcHJvcF07XG4gICAgICAgICAgICAgICAgaWYgKCFpc1VuZGVmaW5lZCh2YWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvW3Byb3BdID0gdmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0bztcbiAgICB9XG5cbiAgICAvLyBNb21lbnQgcHJvdG90eXBlIG9iamVjdFxuICAgIGZ1bmN0aW9uIE1vbWVudChjb25maWcpIHtcbiAgICAgICAgY29weUNvbmZpZyh0aGlzLCBjb25maWcpO1xuICAgICAgICB0aGlzLl9kID0gbmV3IERhdGUoY29uZmlnLl9kICE9IG51bGwgPyBjb25maWcuX2QuZ2V0VGltZSgpIDogTmFOKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgdGhpcy5fZCA9IG5ldyBEYXRlKE5hTik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUHJldmVudCBpbmZpbml0ZSBsb29wIGluIGNhc2UgdXBkYXRlT2Zmc2V0IGNyZWF0ZXMgbmV3IG1vbWVudFxuICAgICAgICAvLyBvYmplY3RzLlxuICAgICAgICBpZiAodXBkYXRlSW5Qcm9ncmVzcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHVwZGF0ZUluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHRoaXMpO1xuICAgICAgICAgICAgdXBkYXRlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNNb21lbnQob2JqKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBvYmogaW5zdGFuY2VvZiBNb21lbnQgfHwgKG9iaiAhPSBudWxsICYmIG9iai5faXNBTW9tZW50T2JqZWN0ICE9IG51bGwpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd2Fybihtc2cpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgaG9va3Muc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmdzID09PSBmYWxzZSAmJlxuICAgICAgICAgICAgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICBjb25zb2xlLndhcm5cbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0RlcHJlY2F0aW9uIHdhcm5pbmc6ICcgKyBtc2cpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVwcmVjYXRlKG1zZywgZm4pIHtcbiAgICAgICAgdmFyIGZpcnN0VGltZSA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIGV4dGVuZChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBob29rcy5kZXByZWNhdGlvbkhhbmRsZXIobnVsbCwgbXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaXJzdFRpbWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICAgICAgICAgICAgICBhcmcsXG4gICAgICAgICAgICAgICAgICAgIGksXG4gICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgYXJnTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJnTGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXJndW1lbnRzW2ldID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJnICs9ICdcXG5bJyArIGkgKyAnXSAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrZXkgaW4gYXJndW1lbnRzWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc093blByb3AoYXJndW1lbnRzWzBdLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZyArPSBrZXkgKyAnOiAnICsgYXJndW1lbnRzWzBdW2tleV0gKyAnLCAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZy5zbGljZSgwLCAtMik7IC8vIFJlbW92ZSB0cmFpbGluZyBjb21tYSBhbmQgc3BhY2VcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhcmdzLnB1c2goYXJnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2FybihcbiAgICAgICAgICAgICAgICAgICAgbXNnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdcXG5Bcmd1bWVudHM6ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncykuam9pbignJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVycm9yKCkuc3RhY2tcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGZpcnN0VGltZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH0sIGZuKTtcbiAgICB9XG5cbiAgICB2YXIgZGVwcmVjYXRpb25zID0ge307XG5cbiAgICBmdW5jdGlvbiBkZXByZWNhdGVTaW1wbGUobmFtZSwgbXNnKSB7XG4gICAgICAgIGlmIChob29rcy5kZXByZWNhdGlvbkhhbmRsZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyKG5hbWUsIG1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkZXByZWNhdGlvbnNbbmFtZV0pIHtcbiAgICAgICAgICAgIHdhcm4obXNnKTtcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBob29rcy5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3MgPSBmYWxzZTtcbiAgICBob29rcy5kZXByZWNhdGlvbkhhbmRsZXIgPSBudWxsO1xuXG4gICAgZnVuY3Rpb24gaXNGdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHR5cGVvZiBGdW5jdGlvbiAhPT0gJ3VuZGVmaW5lZCcgJiYgaW5wdXQgaW5zdGFuY2VvZiBGdW5jdGlvbikgfHxcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXQoY29uZmlnKSB7XG4gICAgICAgIHZhciBwcm9wLCBpO1xuICAgICAgICBmb3IgKGkgaW4gY29uZmlnKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcChjb25maWcsIGkpKSB7XG4gICAgICAgICAgICAgICAgcHJvcCA9IGNvbmZpZ1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihwcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW2ldID0gcHJvcDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzWydfJyArIGldID0gcHJvcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgICAgICAvLyBMZW5pZW50IG9yZGluYWwgcGFyc2luZyBhY2NlcHRzIGp1c3QgYSBudW1iZXIgaW4gYWRkaXRpb24gdG9cbiAgICAgICAgLy8gbnVtYmVyICsgKHBvc3NpYmx5KSBzdHVmZiBjb21pbmcgZnJvbSBfZGF5T2ZNb250aE9yZGluYWxQYXJzZS5cbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIFwib3JkaW5hbFBhcnNlXCIgZmFsbGJhY2sgaW4gbmV4dCBtYWpvciByZWxlYXNlLlxuICAgICAgICB0aGlzLl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlTGVuaWVudCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAodGhpcy5fZGF5T2ZNb250aE9yZGluYWxQYXJzZS5zb3VyY2UgfHwgdGhpcy5fb3JkaW5hbFBhcnNlLnNvdXJjZSkgK1xuICAgICAgICAgICAgICAgICd8JyArXG4gICAgICAgICAgICAgICAgL1xcZHsxLDJ9Ly5zb3VyY2VcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZXJnZUNvbmZpZ3MocGFyZW50Q29uZmlnLCBjaGlsZENvbmZpZykge1xuICAgICAgICB2YXIgcmVzID0gZXh0ZW5kKHt9LCBwYXJlbnRDb25maWcpLFxuICAgICAgICAgICAgcHJvcDtcbiAgICAgICAgZm9yIChwcm9wIGluIGNoaWxkQ29uZmlnKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcChjaGlsZENvbmZpZywgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QocGFyZW50Q29uZmlnW3Byb3BdKSAmJiBpc09iamVjdChjaGlsZENvbmZpZ1twcm9wXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzW3Byb3BdID0ge307XG4gICAgICAgICAgICAgICAgICAgIGV4dGVuZChyZXNbcHJvcF0sIHBhcmVudENvbmZpZ1twcm9wXSk7XG4gICAgICAgICAgICAgICAgICAgIGV4dGVuZChyZXNbcHJvcF0sIGNoaWxkQ29uZmlnW3Byb3BdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkQ29uZmlnW3Byb3BdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzW3Byb3BdID0gY2hpbGRDb25maWdbcHJvcF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc1twcm9wXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChwcm9wIGluIHBhcmVudENvbmZpZykge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGhhc093blByb3AocGFyZW50Q29uZmlnLCBwcm9wKSAmJlxuICAgICAgICAgICAgICAgICFoYXNPd25Qcm9wKGNoaWxkQ29uZmlnLCBwcm9wKSAmJlxuICAgICAgICAgICAgICAgIGlzT2JqZWN0KHBhcmVudENvbmZpZ1twcm9wXSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBjaGFuZ2VzIHRvIHByb3BlcnRpZXMgZG9uJ3QgbW9kaWZ5IHBhcmVudCBjb25maWdcbiAgICAgICAgICAgICAgICByZXNbcHJvcF0gPSBleHRlbmQoe30sIHJlc1twcm9wXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBMb2NhbGUoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5zZXQoY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBrZXlzO1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKSB7XG4gICAgICAgIGtleXMgPSBPYmplY3Qua2V5cztcbiAgICB9IGVsc2Uge1xuICAgICAgICBrZXlzID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgdmFyIGksXG4gICAgICAgICAgICAgICAgcmVzID0gW107XG4gICAgICAgICAgICBmb3IgKGkgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc093blByb3Aob2JqLCBpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXMucHVzaChpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0Q2FsZW5kYXIgPSB7XG4gICAgICAgIHNhbWVEYXk6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgbmV4dERheTogJ1tUb21vcnJvdyBhdF0gTFQnLFxuICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2F0XSBMVCcsXG4gICAgICAgIGxhc3REYXk6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgIGxhc3RXZWVrOiAnW0xhc3RdIGRkZGQgW2F0XSBMVCcsXG4gICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGNhbGVuZGFyKGtleSwgbW9tLCBub3cpIHtcbiAgICAgICAgdmFyIG91dHB1dCA9IHRoaXMuX2NhbGVuZGFyW2tleV0gfHwgdGhpcy5fY2FsZW5kYXJbJ3NhbWVFbHNlJ107XG4gICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKG91dHB1dCkgPyBvdXRwdXQuY2FsbChtb20sIG5vdykgOiBvdXRwdXQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gemVyb0ZpbGwobnVtYmVyLCB0YXJnZXRMZW5ndGgsIGZvcmNlU2lnbikge1xuICAgICAgICB2YXIgYWJzTnVtYmVyID0gJycgKyBNYXRoLmFicyhudW1iZXIpLFxuICAgICAgICAgICAgemVyb3NUb0ZpbGwgPSB0YXJnZXRMZW5ndGggLSBhYnNOdW1iZXIubGVuZ3RoLFxuICAgICAgICAgICAgc2lnbiA9IG51bWJlciA+PSAwO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHNpZ24gPyAoZm9yY2VTaWduID8gJysnIDogJycpIDogJy0nKSArXG4gICAgICAgICAgICBNYXRoLnBvdygxMCwgTWF0aC5tYXgoMCwgemVyb3NUb0ZpbGwpKS50b1N0cmluZygpLnN1YnN0cigxKSArXG4gICAgICAgICAgICBhYnNOdW1iZXJcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB2YXIgZm9ybWF0dGluZ1Rva2VucyA9XG4gICAgICAgICAgICAvKFxcW1teXFxbXSpcXF0pfChcXFxcKT8oW0hoXW1tKHNzKT98TW98TU0/TT9NP3xEb3xERERvfEREP0Q/RD98ZGRkP2Q/fGRvP3x3W298d10/fFdbb3xXXT98UW8/fE57MSw1fXxZWVlZWVl8WVlZWVl8WVlZWXxZWXx5ezIsNH18eW8/fGdnKGdnZz8pP3xHRyhHR0c/KT98ZXxFfGF8QXxoaD98SEg/fGtrP3xtbT98c3M/fFN7MSw5fXx4fFh8eno/fFpaP3wuKS9nLFxuICAgICAgICBsb2NhbEZvcm1hdHRpbmdUb2tlbnMgPSAvKFxcW1teXFxbXSpcXF0pfChcXFxcKT8oTFRTfExUfExMP0w/TD98bHsxLDR9KS9nLFxuICAgICAgICBmb3JtYXRGdW5jdGlvbnMgPSB7fSxcbiAgICAgICAgZm9ybWF0VG9rZW5GdW5jdGlvbnMgPSB7fTtcblxuICAgIC8vIHRva2VuOiAgICAnTSdcbiAgICAvLyBwYWRkZWQ6ICAgWydNTScsIDJdXG4gICAgLy8gb3JkaW5hbDogICdNbydcbiAgICAvLyBjYWxsYmFjazogZnVuY3Rpb24gKCkgeyB0aGlzLm1vbnRoKCkgKyAxIH1cbiAgICBmdW5jdGlvbiBhZGRGb3JtYXRUb2tlbih0b2tlbiwgcGFkZGVkLCBvcmRpbmFsLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgZnVuYyA9IGNhbGxiYWNrO1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZnVuYyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1tjYWxsYmFja10oKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICBmb3JtYXRUb2tlbkZ1bmN0aW9uc1t0b2tlbl0gPSBmdW5jO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWRkZWQpIHtcbiAgICAgICAgICAgIGZvcm1hdFRva2VuRnVuY3Rpb25zW3BhZGRlZFswXV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHplcm9GaWxsKGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgcGFkZGVkWzFdLCBwYWRkZWRbMl0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3JkaW5hbCkge1xuICAgICAgICAgICAgZm9ybWF0VG9rZW5GdW5jdGlvbnNbb3JkaW5hbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm9yZGluYWwoXG4gICAgICAgICAgICAgICAgICAgIGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbW92ZUZvcm1hdHRpbmdUb2tlbnMoaW5wdXQpIHtcbiAgICAgICAgaWYgKGlucHV0Lm1hdGNoKC9cXFtbXFxzXFxTXS8pKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvXlxcW3xcXF0kL2csICcnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvXFxcXC9nLCAnJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUZvcm1hdEZ1bmN0aW9uKGZvcm1hdCkge1xuICAgICAgICB2YXIgYXJyYXkgPSBmb3JtYXQubWF0Y2goZm9ybWF0dGluZ1Rva2VucyksXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgbGVuZ3RoO1xuXG4gICAgICAgIGZvciAoaSA9IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZm9ybWF0VG9rZW5GdW5jdGlvbnNbYXJyYXlbaV1dKSB7XG4gICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBmb3JtYXRUb2tlbkZ1bmN0aW9uc1thcnJheVtpXV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFycmF5W2ldID0gcmVtb3ZlRm9ybWF0dGluZ1Rva2VucyhhcnJheVtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG1vbSkge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9ICcnLFxuICAgICAgICAgICAgICAgIGk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgKz0gaXNGdW5jdGlvbihhcnJheVtpXSlcbiAgICAgICAgICAgICAgICAgICAgPyBhcnJheVtpXS5jYWxsKG1vbSwgZm9ybWF0KVxuICAgICAgICAgICAgICAgICAgICA6IGFycmF5W2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBmb3JtYXQgZGF0ZSB1c2luZyBuYXRpdmUgZGF0ZSBvYmplY3RcbiAgICBmdW5jdGlvbiBmb3JtYXRNb21lbnQobSwgZm9ybWF0KSB7XG4gICAgICAgIGlmICghbS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBtLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybWF0ID0gZXhwYW5kRm9ybWF0KGZvcm1hdCwgbS5sb2NhbGVEYXRhKCkpO1xuICAgICAgICBmb3JtYXRGdW5jdGlvbnNbZm9ybWF0XSA9XG4gICAgICAgICAgICBmb3JtYXRGdW5jdGlvbnNbZm9ybWF0XSB8fCBtYWtlRm9ybWF0RnVuY3Rpb24oZm9ybWF0KTtcblxuICAgICAgICByZXR1cm4gZm9ybWF0RnVuY3Rpb25zW2Zvcm1hdF0obSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXhwYW5kRm9ybWF0KGZvcm1hdCwgbG9jYWxlKSB7XG4gICAgICAgIHZhciBpID0gNTtcblxuICAgICAgICBmdW5jdGlvbiByZXBsYWNlTG9uZ0RhdGVGb3JtYXRUb2tlbnMoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbGUubG9uZ0RhdGVGb3JtYXQoaW5wdXQpIHx8IGlucHV0O1xuICAgICAgICB9XG5cbiAgICAgICAgbG9jYWxGb3JtYXR0aW5nVG9rZW5zLmxhc3RJbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChpID49IDAgJiYgbG9jYWxGb3JtYXR0aW5nVG9rZW5zLnRlc3QoZm9ybWF0KSkge1xuICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgbG9jYWxGb3JtYXR0aW5nVG9rZW5zLFxuICAgICAgICAgICAgICAgIHJlcGxhY2VMb25nRGF0ZUZvcm1hdFRva2Vuc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgICAgaSAtPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdDtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvbmdEYXRlRm9ybWF0ID0ge1xuICAgICAgICBMVFM6ICdoOm1tOnNzIEEnLFxuICAgICAgICBMVDogJ2g6bW0gQScsXG4gICAgICAgIEw6ICdNTS9ERC9ZWVlZJyxcbiAgICAgICAgTEw6ICdNTU1NIEQsIFlZWVknLFxuICAgICAgICBMTEw6ICdNTU1NIEQsIFlZWVkgaDptbSBBJyxcbiAgICAgICAgTExMTDogJ2RkZGQsIE1NTU0gRCwgWVlZWSBoOm1tIEEnLFxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBsb25nRGF0ZUZvcm1hdChrZXkpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV0sXG4gICAgICAgICAgICBmb3JtYXRVcHBlciA9IHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleS50b1VwcGVyQ2FzZSgpXTtcblxuICAgICAgICBpZiAoZm9ybWF0IHx8ICFmb3JtYXRVcHBlcikge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV0gPSBmb3JtYXRVcHBlclxuICAgICAgICAgICAgLm1hdGNoKGZvcm1hdHRpbmdUb2tlbnMpXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uICh0b2spIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHRvayA9PT0gJ01NTU0nIHx8XG4gICAgICAgICAgICAgICAgICAgIHRvayA9PT0gJ01NJyB8fFxuICAgICAgICAgICAgICAgICAgICB0b2sgPT09ICdERCcgfHxcbiAgICAgICAgICAgICAgICAgICAgdG9rID09PSAnZGRkZCdcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvay5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRvaztcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbignJyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV07XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRJbnZhbGlkRGF0ZSA9ICdJbnZhbGlkIGRhdGUnO1xuXG4gICAgZnVuY3Rpb24gaW52YWxpZERhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZhbGlkRGF0ZTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdE9yZGluYWwgPSAnJWQnLFxuICAgICAgICBkZWZhdWx0RGF5T2ZNb250aE9yZGluYWxQYXJzZSA9IC9cXGR7MSwyfS87XG5cbiAgICBmdW5jdGlvbiBvcmRpbmFsKG51bWJlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3JkaW5hbC5yZXBsYWNlKCclZCcsIG51bWJlcik7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRSZWxhdGl2ZVRpbWUgPSB7XG4gICAgICAgIGZ1dHVyZTogJ2luICVzJyxcbiAgICAgICAgcGFzdDogJyVzIGFnbycsXG4gICAgICAgIHM6ICdhIGZldyBzZWNvbmRzJyxcbiAgICAgICAgc3M6ICclZCBzZWNvbmRzJyxcbiAgICAgICAgbTogJ2EgbWludXRlJyxcbiAgICAgICAgbW06ICclZCBtaW51dGVzJyxcbiAgICAgICAgaDogJ2FuIGhvdXInLFxuICAgICAgICBoaDogJyVkIGhvdXJzJyxcbiAgICAgICAgZDogJ2EgZGF5JyxcbiAgICAgICAgZGQ6ICclZCBkYXlzJyxcbiAgICAgICAgdzogJ2Egd2VlaycsXG4gICAgICAgIHd3OiAnJWQgd2Vla3MnLFxuICAgICAgICBNOiAnYSBtb250aCcsXG4gICAgICAgIE1NOiAnJWQgbW9udGhzJyxcbiAgICAgICAgeTogJ2EgeWVhcicsXG4gICAgICAgIHl5OiAnJWQgeWVhcnMnLFxuICAgIH07XG5cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSB0aGlzLl9yZWxhdGl2ZVRpbWVbc3RyaW5nXTtcbiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24ob3V0cHV0KVxuICAgICAgICAgICAgPyBvdXRwdXQobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKVxuICAgICAgICAgICAgOiBvdXRwdXQucmVwbGFjZSgvJWQvaSwgbnVtYmVyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXN0RnV0dXJlKGRpZmYsIG91dHB1dCkge1xuICAgICAgICB2YXIgZm9ybWF0ID0gdGhpcy5fcmVsYXRpdmVUaW1lW2RpZmYgPiAwID8gJ2Z1dHVyZScgOiAncGFzdCddO1xuICAgICAgICByZXR1cm4gaXNGdW5jdGlvbihmb3JtYXQpID8gZm9ybWF0KG91dHB1dCkgOiBmb3JtYXQucmVwbGFjZSgvJXMvaSwgb3V0cHV0KTtcbiAgICB9XG5cbiAgICB2YXIgYWxpYXNlcyA9IHtcbiAgICAgICAgRDogJ2RhdGUnLFxuICAgICAgICBkYXRlczogJ2RhdGUnLFxuICAgICAgICBkYXRlOiAnZGF0ZScsXG4gICAgICAgIGQ6ICdkYXknLFxuICAgICAgICBkYXlzOiAnZGF5JyxcbiAgICAgICAgZGF5OiAnZGF5JyxcbiAgICAgICAgZTogJ3dlZWtkYXknLFxuICAgICAgICB3ZWVrZGF5czogJ3dlZWtkYXknLFxuICAgICAgICB3ZWVrZGF5OiAnd2Vla2RheScsXG4gICAgICAgIEU6ICdpc29XZWVrZGF5JyxcbiAgICAgICAgaXNvd2Vla2RheXM6ICdpc29XZWVrZGF5JyxcbiAgICAgICAgaXNvd2Vla2RheTogJ2lzb1dlZWtkYXknLFxuICAgICAgICBEREQ6ICdkYXlPZlllYXInLFxuICAgICAgICBkYXlvZnllYXJzOiAnZGF5T2ZZZWFyJyxcbiAgICAgICAgZGF5b2Z5ZWFyOiAnZGF5T2ZZZWFyJyxcbiAgICAgICAgaDogJ2hvdXInLFxuICAgICAgICBob3VyczogJ2hvdXInLFxuICAgICAgICBob3VyOiAnaG91cicsXG4gICAgICAgIG1zOiAnbWlsbGlzZWNvbmQnLFxuICAgICAgICBtaWxsaXNlY29uZHM6ICdtaWxsaXNlY29uZCcsXG4gICAgICAgIG1pbGxpc2Vjb25kOiAnbWlsbGlzZWNvbmQnLFxuICAgICAgICBtOiAnbWludXRlJyxcbiAgICAgICAgbWludXRlczogJ21pbnV0ZScsXG4gICAgICAgIG1pbnV0ZTogJ21pbnV0ZScsXG4gICAgICAgIE06ICdtb250aCcsXG4gICAgICAgIG1vbnRoczogJ21vbnRoJyxcbiAgICAgICAgbW9udGg6ICdtb250aCcsXG4gICAgICAgIFE6ICdxdWFydGVyJyxcbiAgICAgICAgcXVhcnRlcnM6ICdxdWFydGVyJyxcbiAgICAgICAgcXVhcnRlcjogJ3F1YXJ0ZXInLFxuICAgICAgICBzOiAnc2Vjb25kJyxcbiAgICAgICAgc2Vjb25kczogJ3NlY29uZCcsXG4gICAgICAgIHNlY29uZDogJ3NlY29uZCcsXG4gICAgICAgIGdnOiAnd2Vla1llYXInLFxuICAgICAgICB3ZWVreWVhcnM6ICd3ZWVrWWVhcicsXG4gICAgICAgIHdlZWt5ZWFyOiAnd2Vla1llYXInLFxuICAgICAgICBHRzogJ2lzb1dlZWtZZWFyJyxcbiAgICAgICAgaXNvd2Vla3llYXJzOiAnaXNvV2Vla1llYXInLFxuICAgICAgICBpc293ZWVreWVhcjogJ2lzb1dlZWtZZWFyJyxcbiAgICAgICAgdzogJ3dlZWsnLFxuICAgICAgICB3ZWVrczogJ3dlZWsnLFxuICAgICAgICB3ZWVrOiAnd2VlaycsXG4gICAgICAgIFc6ICdpc29XZWVrJyxcbiAgICAgICAgaXNvd2Vla3M6ICdpc29XZWVrJyxcbiAgICAgICAgaXNvd2VlazogJ2lzb1dlZWsnLFxuICAgICAgICB5OiAneWVhcicsXG4gICAgICAgIHllYXJzOiAneWVhcicsXG4gICAgICAgIHllYXI6ICd5ZWFyJyxcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplVW5pdHModW5pdHMpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB1bml0cyA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgID8gYWxpYXNlc1t1bml0c10gfHwgYWxpYXNlc1t1bml0cy50b0xvd2VyQ2FzZSgpXVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplT2JqZWN0VW5pdHMoaW5wdXRPYmplY3QpIHtcbiAgICAgICAgdmFyIG5vcm1hbGl6ZWRJbnB1dCA9IHt9LFxuICAgICAgICAgICAgbm9ybWFsaXplZFByb3AsXG4gICAgICAgICAgICBwcm9wO1xuXG4gICAgICAgIGZvciAocHJvcCBpbiBpbnB1dE9iamVjdCkge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3AoaW5wdXRPYmplY3QsIHByb3ApKSB7XG4gICAgICAgICAgICAgICAgbm9ybWFsaXplZFByb3AgPSBub3JtYWxpemVVbml0cyhwcm9wKTtcbiAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFByb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZElucHV0W25vcm1hbGl6ZWRQcm9wXSA9IGlucHV0T2JqZWN0W3Byb3BdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBub3JtYWxpemVkSW5wdXQ7XG4gICAgfVxuXG4gICAgdmFyIHByaW9yaXRpZXMgPSB7XG4gICAgICAgIGRhdGU6IDksXG4gICAgICAgIGRheTogMTEsXG4gICAgICAgIHdlZWtkYXk6IDExLFxuICAgICAgICBpc29XZWVrZGF5OiAxMSxcbiAgICAgICAgZGF5T2ZZZWFyOiA0LFxuICAgICAgICBob3VyOiAxMyxcbiAgICAgICAgbWlsbGlzZWNvbmQ6IDE2LFxuICAgICAgICBtaW51dGU6IDE0LFxuICAgICAgICBtb250aDogOCxcbiAgICAgICAgcXVhcnRlcjogNyxcbiAgICAgICAgc2Vjb25kOiAxNSxcbiAgICAgICAgd2Vla1llYXI6IDEsXG4gICAgICAgIGlzb1dlZWtZZWFyOiAxLFxuICAgICAgICB3ZWVrOiA1LFxuICAgICAgICBpc29XZWVrOiA1LFxuICAgICAgICB5ZWFyOiAxLFxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBnZXRQcmlvcml0aXplZFVuaXRzKHVuaXRzT2JqKSB7XG4gICAgICAgIHZhciB1bml0cyA9IFtdLFxuICAgICAgICAgICAgdTtcbiAgICAgICAgZm9yICh1IGluIHVuaXRzT2JqKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcCh1bml0c09iaiwgdSkpIHtcbiAgICAgICAgICAgICAgICB1bml0cy5wdXNoKHsgdW5pdDogdSwgcHJpb3JpdHk6IHByaW9yaXRpZXNbdV0gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdW5pdHMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgcmV0dXJuIGEucHJpb3JpdHkgLSBiLnByaW9yaXR5O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHVuaXRzO1xuICAgIH1cblxuICAgIHZhciBtYXRjaDEgPSAvXFxkLywgLy8gICAgICAgMCAtIDlcbiAgICAgICAgbWF0Y2gyID0gL1xcZFxcZC8sIC8vICAgICAgMDAgLSA5OVxuICAgICAgICBtYXRjaDMgPSAvXFxkezN9LywgLy8gICAgIDAwMCAtIDk5OVxuICAgICAgICBtYXRjaDQgPSAvXFxkezR9LywgLy8gICAgMDAwMCAtIDk5OTlcbiAgICAgICAgbWF0Y2g2ID0gL1srLV0/XFxkezZ9LywgLy8gLTk5OTk5OSAtIDk5OTk5OVxuICAgICAgICBtYXRjaDF0bzIgPSAvXFxkXFxkPy8sIC8vICAgICAgIDAgLSA5OVxuICAgICAgICBtYXRjaDN0bzQgPSAvXFxkXFxkXFxkXFxkPy8sIC8vICAgICA5OTkgLSA5OTk5XG4gICAgICAgIG1hdGNoNXRvNiA9IC9cXGRcXGRcXGRcXGRcXGRcXGQ/LywgLy8gICA5OTk5OSAtIDk5OTk5OVxuICAgICAgICBtYXRjaDF0bzMgPSAvXFxkezEsM30vLCAvLyAgICAgICAwIC0gOTk5XG4gICAgICAgIG1hdGNoMXRvNCA9IC9cXGR7MSw0fS8sIC8vICAgICAgIDAgLSA5OTk5XG4gICAgICAgIG1hdGNoMXRvNiA9IC9bKy1dP1xcZHsxLDZ9LywgLy8gLTk5OTk5OSAtIDk5OTk5OVxuICAgICAgICBtYXRjaFVuc2lnbmVkID0gL1xcZCsvLCAvLyAgICAgICAwIC0gaW5mXG4gICAgICAgIG1hdGNoU2lnbmVkID0gL1srLV0/XFxkKy8sIC8vICAgIC1pbmYgLSBpbmZcbiAgICAgICAgbWF0Y2hPZmZzZXQgPSAvWnxbKy1dXFxkXFxkOj9cXGRcXGQvZ2ksIC8vICswMDowMCAtMDA6MDAgKzAwMDAgLTAwMDAgb3IgWlxuICAgICAgICBtYXRjaFNob3J0T2Zmc2V0ID0gL1p8WystXVxcZFxcZCg/Ojo/XFxkXFxkKT8vZ2ksIC8vICswMCAtMDAgKzAwOjAwIC0wMDowMCArMDAwMCAtMDAwMCBvciBaXG4gICAgICAgIG1hdGNoVGltZXN0YW1wID0gL1srLV0/XFxkKyhcXC5cXGR7MSwzfSk/LywgLy8gMTIzNDU2Nzg5IDEyMzQ1Njc4OS4xMjNcbiAgICAgICAgLy8gYW55IHdvcmQgKG9yIHR3bykgY2hhcmFjdGVycyBvciBudW1iZXJzIGluY2x1ZGluZyB0d28vdGhyZWUgd29yZCBtb250aCBpbiBhcmFiaWMuXG4gICAgICAgIC8vIGluY2x1ZGVzIHNjb3R0aXNoIGdhZWxpYyB0d28gd29yZCBhbmQgaHlwaGVuYXRlZCBtb250aHNcbiAgICAgICAgbWF0Y2hXb3JkID1cbiAgICAgICAgICAgIC9bMC05XXswLDI1Nn1bJ2EtelxcdTAwQTAtXFx1MDVGRlxcdTA3MDAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkYwN1xcdUZGMTAtXFx1RkZFRl17MSwyNTZ9fFtcXHUwNjAwLVxcdTA2RkZcXC9dezEsMjU2fShcXHMqP1tcXHUwNjAwLVxcdTA2RkZdezEsMjU2fSl7MSwyfS9pLFxuICAgICAgICBtYXRjaDF0bzJOb0xlYWRpbmdaZXJvID0gL15bMS05XVxcZD8vLCAvLyAgICAgICAgIDEtOTlcbiAgICAgICAgbWF0Y2gxdG8ySGFzWmVybyA9IC9eKFsxLTldXFxkfFxcZCkvLCAvLyAgICAgICAgICAgMC05OVxuICAgICAgICByZWdleGVzO1xuXG4gICAgcmVnZXhlcyA9IHt9O1xuXG4gICAgZnVuY3Rpb24gYWRkUmVnZXhUb2tlbih0b2tlbiwgcmVnZXgsIHN0cmljdFJlZ2V4KSB7XG4gICAgICAgIHJlZ2V4ZXNbdG9rZW5dID0gaXNGdW5jdGlvbihyZWdleClcbiAgICAgICAgICAgID8gcmVnZXhcbiAgICAgICAgICAgIDogZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGVEYXRhKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gaXNTdHJpY3QgJiYgc3RyaWN0UmVnZXggPyBzdHJpY3RSZWdleCA6IHJlZ2V4O1xuICAgICAgICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFBhcnNlUmVnZXhGb3JUb2tlbih0b2tlbiwgY29uZmlnKSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcChyZWdleGVzLCB0b2tlbikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHVuZXNjYXBlRm9ybWF0KHRva2VuKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVnZXhlc1t0b2tlbl0oY29uZmlnLl9zdHJpY3QsIGNvbmZpZy5fbG9jYWxlKTtcbiAgICB9XG5cbiAgICAvLyBDb2RlIGZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNTYxNDkzL2lzLXRoZXJlLWEtcmVnZXhwLWVzY2FwZS1mdW5jdGlvbi1pbi1qYXZhc2NyaXB0XG4gICAgZnVuY3Rpb24gdW5lc2NhcGVGb3JtYXQocykge1xuICAgICAgICByZXR1cm4gcmVnZXhFc2NhcGUoXG4gICAgICAgICAgICBzXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJ1xcXFwnLCAnJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgL1xcXFwoXFxbKXxcXFxcKFxcXSl8XFxbKFteXFxdXFxbXSopXFxdfFxcXFwoLikvZyxcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKG1hdGNoZWQsIHAxLCBwMiwgcDMsIHA0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDEgfHwgcDIgfHwgcDMgfHwgcDQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVnZXhFc2NhcGUocykge1xuICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9bLVxcL1xcXFxeJCorPy4oKXxbXFxde31dL2csICdcXFxcJCYnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhYnNGbG9vcihudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgICAgIC8vIC0wIC0+IDBcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmNlaWwobnVtYmVyKSB8fCAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IobnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvSW50KGFyZ3VtZW50Rm9yQ29lcmNpb24pIHtcbiAgICAgICAgdmFyIGNvZXJjZWROdW1iZXIgPSArYXJndW1lbnRGb3JDb2VyY2lvbixcbiAgICAgICAgICAgIHZhbHVlID0gMDtcblxuICAgICAgICBpZiAoY29lcmNlZE51bWJlciAhPT0gMCAmJiBpc0Zpbml0ZShjb2VyY2VkTnVtYmVyKSkge1xuICAgICAgICAgICAgdmFsdWUgPSBhYnNGbG9vcihjb2VyY2VkTnVtYmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICB2YXIgdG9rZW5zID0ge307XG5cbiAgICBmdW5jdGlvbiBhZGRQYXJzZVRva2VuKHRva2VuLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGZ1bmMgPSBjYWxsYmFjayxcbiAgICAgICAgICAgIHRva2VuTGVuO1xuICAgICAgICBpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdG9rZW4gPSBbdG9rZW5dO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc051bWJlcihjYWxsYmFjaykpIHtcbiAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgICAgICAgICAgYXJyYXlbY2FsbGJhY2tdID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0b2tlbkxlbiA9IHRva2VuLmxlbmd0aDtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRva2VuTGVuOyBpKyspIHtcbiAgICAgICAgICAgIHRva2Vuc1t0b2tlbltpXV0gPSBmdW5jO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkV2Vla1BhcnNlVG9rZW4odG9rZW4sIGNhbGxiYWNrKSB7XG4gICAgICAgIGFkZFBhcnNlVG9rZW4odG9rZW4sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgICAgIGNvbmZpZy5fdyA9IGNvbmZpZy5fdyB8fCB7fTtcbiAgICAgICAgICAgIGNhbGxiYWNrKGlucHV0LCBjb25maWcuX3csIGNvbmZpZywgdG9rZW4pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRUaW1lVG9BcnJheUZyb21Ub2tlbih0b2tlbiwgaW5wdXQsIGNvbmZpZykge1xuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCAmJiBoYXNPd25Qcm9wKHRva2VucywgdG9rZW4pKSB7XG4gICAgICAgICAgICB0b2tlbnNbdG9rZW5dKGlucHV0LCBjb25maWcuX2EsIGNvbmZpZywgdG9rZW4pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNMZWFwWWVhcih5ZWFyKSB7XG4gICAgICAgIHJldHVybiAoeWVhciAlIDQgPT09IDAgJiYgeWVhciAlIDEwMCAhPT0gMCkgfHwgeWVhciAlIDQwMCA9PT0gMDtcbiAgICB9XG5cbiAgICB2YXIgWUVBUiA9IDAsXG4gICAgICAgIE1PTlRIID0gMSxcbiAgICAgICAgREFURSA9IDIsXG4gICAgICAgIEhPVVIgPSAzLFxuICAgICAgICBNSU5VVEUgPSA0LFxuICAgICAgICBTRUNPTkQgPSA1LFxuICAgICAgICBNSUxMSVNFQ09ORCA9IDYsXG4gICAgICAgIFdFRUsgPSA3LFxuICAgICAgICBXRUVLREFZID0gODtcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdZJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgeSA9IHRoaXMueWVhcigpO1xuICAgICAgICByZXR1cm4geSA8PSA5OTk5ID8gemVyb0ZpbGwoeSwgNCkgOiAnKycgKyB5O1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydZWScsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnllYXIoKSAlIDEwMDtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnWVlZWScsIDRdLCAwLCAneWVhcicpO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnWVlZWVknLCA1XSwgMCwgJ3llYXInKTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1lZWVlZWScsIDYsIHRydWVdLCAwLCAneWVhcicpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignWScsIG1hdGNoU2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCdZWScsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdZWVlZJywgbWF0Y2gxdG80LCBtYXRjaDQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZWVlZJywgbWF0Y2gxdG82LCBtYXRjaDYpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZWVlZWScsIG1hdGNoMXRvNiwgbWF0Y2g2KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydZWVlZWScsICdZWVlZWVknXSwgWUVBUik7XG4gICAgYWRkUGFyc2VUb2tlbignWVlZWScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbWUVBUl0gPVxuICAgICAgICAgICAgaW5wdXQubGVuZ3RoID09PSAyID8gaG9va3MucGFyc2VUd29EaWdpdFllYXIoaW5wdXQpIDogdG9JbnQoaW5wdXQpO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1lZJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtZRUFSXSA9IGhvb2tzLnBhcnNlVHdvRGlnaXRZZWFyKGlucHV0KTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdZJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtZRUFSXSA9IHBhcnNlSW50KGlucHV0LCAxMCk7XG4gICAgfSk7XG5cbiAgICAvLyBIRUxQRVJTXG5cbiAgICBmdW5jdGlvbiBkYXlzSW5ZZWFyKHllYXIpIHtcbiAgICAgICAgcmV0dXJuIGlzTGVhcFllYXIoeWVhcikgPyAzNjYgOiAzNjU7XG4gICAgfVxuXG4gICAgLy8gSE9PS1NcblxuICAgIGhvb2tzLnBhcnNlVHdvRGlnaXRZZWFyID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB0b0ludChpbnB1dCkgKyAodG9JbnQoaW5wdXQpID4gNjggPyAxOTAwIDogMjAwMCk7XG4gICAgfTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIHZhciBnZXRTZXRZZWFyID0gbWFrZUdldFNldCgnRnVsbFllYXInLCB0cnVlKTtcblxuICAgIGZ1bmN0aW9uIGdldElzTGVhcFllYXIoKSB7XG4gICAgICAgIHJldHVybiBpc0xlYXBZZWFyKHRoaXMueWVhcigpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlR2V0U2V0KHVuaXQsIGtlZXBUaW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgc2V0JDEodGhpcywgdW5pdCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCBrZWVwVGltZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXQodGhpcywgdW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0KG1vbSwgdW5pdCkge1xuICAgICAgICBpZiAoIW1vbS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZCA9IG1vbS5fZCxcbiAgICAgICAgICAgIGlzVVRDID0gbW9tLl9pc1VUQztcblxuICAgICAgICBzd2l0Y2ggKHVuaXQpIHtcbiAgICAgICAgICAgIGNhc2UgJ01pbGxpc2Vjb25kcyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzVVRDID8gZC5nZXRVVENNaWxsaXNlY29uZHMoKSA6IGQuZ2V0TWlsbGlzZWNvbmRzKCk7XG4gICAgICAgICAgICBjYXNlICdTZWNvbmRzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNVVEMgPyBkLmdldFVUQ1NlY29uZHMoKSA6IGQuZ2V0U2Vjb25kcygpO1xuICAgICAgICAgICAgY2FzZSAnTWludXRlcyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzVVRDID8gZC5nZXRVVENNaW51dGVzKCkgOiBkLmdldE1pbnV0ZXMoKTtcbiAgICAgICAgICAgIGNhc2UgJ0hvdXJzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNVVEMgPyBkLmdldFVUQ0hvdXJzKCkgOiBkLmdldEhvdXJzKCk7XG4gICAgICAgICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNVVEMgPyBkLmdldFVUQ0RhdGUoKSA6IGQuZ2V0RGF0ZSgpO1xuICAgICAgICAgICAgY2FzZSAnRGF5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNVVEMgPyBkLmdldFVUQ0RheSgpIDogZC5nZXREYXkoKTtcbiAgICAgICAgICAgIGNhc2UgJ01vbnRoJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNVVEMgPyBkLmdldFVUQ01vbnRoKCkgOiBkLmdldE1vbnRoKCk7XG4gICAgICAgICAgICBjYXNlICdGdWxsWWVhcic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzVVRDID8gZC5nZXRVVENGdWxsWWVhcigpIDogZC5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gTmFOOyAvLyBKdXN0IGluIGNhc2VcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldCQxKG1vbSwgdW5pdCwgdmFsdWUpIHtcbiAgICAgICAgdmFyIGQsIGlzVVRDLCB5ZWFyLCBtb250aCwgZGF0ZTtcblxuICAgICAgICBpZiAoIW1vbS5pc1ZhbGlkKCkgfHwgaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBkID0gbW9tLl9kO1xuICAgICAgICBpc1VUQyA9IG1vbS5faXNVVEM7XG5cbiAgICAgICAgc3dpdGNoICh1bml0KSB7XG4gICAgICAgICAgICBjYXNlICdNaWxsaXNlY29uZHMnOlxuICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIChpc1VUQ1xuICAgICAgICAgICAgICAgICAgICA/IGQuc2V0VVRDTWlsbGlzZWNvbmRzKHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICA6IGQuc2V0TWlsbGlzZWNvbmRzKHZhbHVlKSk7XG4gICAgICAgICAgICBjYXNlICdTZWNvbmRzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAoaXNVVEMgPyBkLnNldFVUQ1NlY29uZHModmFsdWUpIDogZC5zZXRTZWNvbmRzKHZhbHVlKSk7XG4gICAgICAgICAgICBjYXNlICdNaW51dGVzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAoaXNVVEMgPyBkLnNldFVUQ01pbnV0ZXModmFsdWUpIDogZC5zZXRNaW51dGVzKHZhbHVlKSk7XG4gICAgICAgICAgICBjYXNlICdIb3Vycyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgKGlzVVRDID8gZC5zZXRVVENIb3Vycyh2YWx1ZSkgOiBkLnNldEhvdXJzKHZhbHVlKSk7XG4gICAgICAgICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAoaXNVVEMgPyBkLnNldFVUQ0RhdGUodmFsdWUpIDogZC5zZXREYXRlKHZhbHVlKSk7XG4gICAgICAgICAgICAvLyBjYXNlICdEYXknOiAvLyBOb3QgcmVhbFxuICAgICAgICAgICAgLy8gICAgcmV0dXJuIHZvaWQgKGlzVVRDID8gZC5zZXRVVENEYXkodmFsdWUpIDogZC5zZXREYXkodmFsdWUpKTtcbiAgICAgICAgICAgIC8vIGNhc2UgJ01vbnRoJzogLy8gTm90IHVzZWQgYmVjYXVzZSB3ZSBuZWVkIHRvIHBhc3MgdHdvIHZhcmlhYmxlc1xuICAgICAgICAgICAgLy8gICAgIHJldHVybiB2b2lkIChpc1VUQyA/IGQuc2V0VVRDTW9udGgodmFsdWUpIDogZC5zZXRNb250aCh2YWx1ZSkpO1xuICAgICAgICAgICAgY2FzZSAnRnVsbFllYXInOlxuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBTZWUgYmVsb3cgLi4uXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gSnVzdCBpbiBjYXNlXG4gICAgICAgIH1cblxuICAgICAgICB5ZWFyID0gdmFsdWU7XG4gICAgICAgIG1vbnRoID0gbW9tLm1vbnRoKCk7XG4gICAgICAgIGRhdGUgPSBtb20uZGF0ZSgpO1xuICAgICAgICBkYXRlID0gZGF0ZSA9PT0gMjkgJiYgbW9udGggPT09IDEgJiYgIWlzTGVhcFllYXIoeWVhcikgPyAyOCA6IGRhdGU7XG4gICAgICAgIHZvaWQgKGlzVVRDXG4gICAgICAgICAgICA/IGQuc2V0VVRDRnVsbFllYXIoeWVhciwgbW9udGgsIGRhdGUpXG4gICAgICAgICAgICA6IGQuc2V0RnVsbFllYXIoeWVhciwgbW9udGgsIGRhdGUpKTtcbiAgICB9XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBzdHJpbmdHZXQodW5pdHMpIHtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHRoaXNbdW5pdHNdKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNbdW5pdHNdKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RyaW5nU2V0KHVuaXRzLCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIHVuaXRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdW5pdHMgPSBub3JtYWxpemVPYmplY3RVbml0cyh1bml0cyk7XG4gICAgICAgICAgICB2YXIgcHJpb3JpdGl6ZWQgPSBnZXRQcmlvcml0aXplZFVuaXRzKHVuaXRzKSxcbiAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgIHByaW9yaXRpemVkTGVuID0gcHJpb3JpdGl6ZWQubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHByaW9yaXRpemVkTGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzW3ByaW9yaXRpemVkW2ldLnVuaXRdKHVuaXRzW3ByaW9yaXRpemVkW2ldLnVuaXRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpc1t1bml0c10pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbdW5pdHNdKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb2QobiwgeCkge1xuICAgICAgICByZXR1cm4gKChuICUgeCkgKyB4KSAlIHg7XG4gICAgfVxuXG4gICAgdmFyIGluZGV4T2Y7XG5cbiAgICBpZiAoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpIHtcbiAgICAgICAgaW5kZXhPZiA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGluZGV4T2YgPSBmdW5jdGlvbiAobykge1xuICAgICAgICAgICAgLy8gSSBrbm93XG4gICAgICAgICAgICB2YXIgaTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNbaV0gPT09IG8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRheXNJbk1vbnRoKHllYXIsIG1vbnRoKSB7XG4gICAgICAgIGlmIChpc05hTih5ZWFyKSB8fCBpc05hTihtb250aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1vZE1vbnRoID0gbW9kKG1vbnRoLCAxMik7XG4gICAgICAgIHllYXIgKz0gKG1vbnRoIC0gbW9kTW9udGgpIC8gMTI7XG4gICAgICAgIHJldHVybiBtb2RNb250aCA9PT0gMVxuICAgICAgICAgICAgPyBpc0xlYXBZZWFyKHllYXIpXG4gICAgICAgICAgICAgICAgPyAyOVxuICAgICAgICAgICAgICAgIDogMjhcbiAgICAgICAgICAgIDogMzEgLSAoKG1vZE1vbnRoICUgNykgJSAyKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignTScsIFsnTU0nLCAyXSwgJ01vJywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb250aCgpICsgMTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdNTU0nLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHNTaG9ydCh0aGlzLCBmb3JtYXQpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ01NTU0nLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHModGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ00nLCBtYXRjaDF0bzIsIG1hdGNoMXRvMk5vTGVhZGluZ1plcm8pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ01NJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ01NTScsIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUubW9udGhzU2hvcnRSZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG4gICAgYWRkUmVnZXhUb2tlbignTU1NTScsIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUubW9udGhzUmVnZXgoaXNTdHJpY3QpO1xuICAgIH0pO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ00nLCAnTU0nXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtNT05USF0gPSB0b0ludChpbnB1dCkgLSAxO1xuICAgIH0pO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ01NTScsICdNTU1NJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgdmFyIG1vbnRoID0gY29uZmlnLl9sb2NhbGUubW9udGhzUGFyc2UoaW5wdXQsIHRva2VuLCBjb25maWcuX3N0cmljdCk7XG4gICAgICAgIC8vIGlmIHdlIGRpZG4ndCBmaW5kIGEgbW9udGggbmFtZSwgbWFyayB0aGUgZGF0ZSBhcyBpbnZhbGlkLlxuICAgICAgICBpZiAobW9udGggIT0gbnVsbCkge1xuICAgICAgICAgICAgYXJyYXlbTU9OVEhdID0gbW9udGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pbnZhbGlkTW9udGggPSBpbnB1dDtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gTE9DQUxFU1xuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVNb250aHMgPVxuICAgICAgICAgICAgJ0phbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgZGVmYXVsdExvY2FsZU1vbnRoc1Nob3J0ID1cbiAgICAgICAgICAgICdKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgTU9OVEhTX0lOX0ZPUk1BVCA9IC9EW29EXT8oXFxbW15cXFtcXF1dKlxcXXxcXHMpK01NTU0/LyxcbiAgICAgICAgZGVmYXVsdE1vbnRoc1Nob3J0UmVnZXggPSBtYXRjaFdvcmQsXG4gICAgICAgIGRlZmF1bHRNb250aHNSZWdleCA9IG1hdGNoV29yZDtcblxuICAgIGZ1bmN0aW9uIGxvY2FsZU1vbnRocyhtLCBmb3JtYXQpIHtcbiAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNBcnJheSh0aGlzLl9tb250aHMpXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9tb250aHNcbiAgICAgICAgICAgICAgICA6IHRoaXMuX21vbnRoc1snc3RhbmRhbG9uZSddO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRocylcbiAgICAgICAgICAgID8gdGhpcy5fbW9udGhzW20ubW9udGgoKV1cbiAgICAgICAgICAgIDogdGhpcy5fbW9udGhzW1xuICAgICAgICAgICAgICAgICAgKHRoaXMuX21vbnRocy5pc0Zvcm1hdCB8fCBNT05USFNfSU5fRk9STUFUKS50ZXN0KGZvcm1hdClcbiAgICAgICAgICAgICAgICAgICAgICA/ICdmb3JtYXQnXG4gICAgICAgICAgICAgICAgICAgICAgOiAnc3RhbmRhbG9uZSdcbiAgICAgICAgICAgICAgXVttLm1vbnRoKCldO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZU1vbnRoc1Nob3J0KG0sIGZvcm1hdCkge1xuICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRoc1Nob3J0KVxuICAgICAgICAgICAgICAgID8gdGhpcy5fbW9udGhzU2hvcnRcbiAgICAgICAgICAgICAgICA6IHRoaXMuX21vbnRoc1Nob3J0WydzdGFuZGFsb25lJ107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzQXJyYXkodGhpcy5fbW9udGhzU2hvcnQpXG4gICAgICAgICAgICA/IHRoaXMuX21vbnRoc1Nob3J0W20ubW9udGgoKV1cbiAgICAgICAgICAgIDogdGhpcy5fbW9udGhzU2hvcnRbXG4gICAgICAgICAgICAgICAgICBNT05USFNfSU5fRk9STUFULnRlc3QoZm9ybWF0KSA/ICdmb3JtYXQnIDogJ3N0YW5kYWxvbmUnXG4gICAgICAgICAgICAgIF1bbS5tb250aCgpXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVTdHJpY3RQYXJzZShtb250aE5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgaWksXG4gICAgICAgICAgICBtb20sXG4gICAgICAgICAgICBsbGMgPSBtb250aE5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCF0aGlzLl9tb250aHNQYXJzZSkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyBub3QgdXNlZFxuICAgICAgICAgICAgdGhpcy5fbW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyArK2kpIHtcbiAgICAgICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIGldKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW2ldID0gdGhpcy5tb250aHNTaG9ydChcbiAgICAgICAgICAgICAgICAgICAgbW9tLFxuICAgICAgICAgICAgICAgICAgICAnJ1xuICAgICAgICAgICAgICAgICkudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2VbaV0gPSB0aGlzLm1vbnRocyhtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ01NTScpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ01NTScpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9sb25nTW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbG9uZ01vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVNb250aHNQYXJzZShtb250aE5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLCBtb20sIHJlZ2V4O1xuXG4gICAgICAgIGlmICh0aGlzLl9tb250aHNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlU3RyaWN0UGFyc2UuY2FsbCh0aGlzLCBtb250aE5hbWUsIGZvcm1hdCwgc3RyaWN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fbW9udGhzUGFyc2UpIHtcbiAgICAgICAgICAgIHRoaXMuX21vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3Nob3J0TW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPRE86IGFkZCBzb3J0aW5nXG4gICAgICAgIC8vIFNvcnRpbmcgbWFrZXMgc3VyZSBpZiBvbmUgbW9udGggKG9yIGFiYnIpIGlzIGEgcHJlZml4IG9mIGFub3RoZXJcbiAgICAgICAgLy8gc2VlIHNvcnRpbmcgaW4gY29tcHV0ZU1vbnRoc1BhcnNlXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgICAgICAgICAvLyBtYWtlIHRoZSByZWdleCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHlcbiAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgaV0pO1xuICAgICAgICAgICAgaWYgKHN0cmljdCAmJiAhdGhpcy5fbG9uZ01vbnRoc1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9uZ01vbnRoc1BhcnNlW2ldID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAgICAgJ14nICsgdGhpcy5tb250aHMobW9tLCAnJykucmVwbGFjZSgnLicsICcnKSArICckJyxcbiAgICAgICAgICAgICAgICAgICAgJ2knXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW2ldID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAgICAgJ14nICsgdGhpcy5tb250aHNTaG9ydChtb20sICcnKS5yZXBsYWNlKCcuJywgJycpICsgJyQnLFxuICAgICAgICAgICAgICAgICAgICAnaSdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFzdHJpY3QgJiYgIXRoaXMuX21vbnRoc1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgcmVnZXggPVxuICAgICAgICAgICAgICAgICAgICAnXicgKyB0aGlzLm1vbnRocyhtb20sICcnKSArICd8XicgKyB0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1BhcnNlW2ldID0gbmV3IFJlZ0V4cChyZWdleC5yZXBsYWNlKCcuJywgJycpLCAnaScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdGVzdCB0aGUgcmVnZXhcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBzdHJpY3QgJiZcbiAgICAgICAgICAgICAgICBmb3JtYXQgPT09ICdNTU1NJyAmJlxuICAgICAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZVtpXS50ZXN0KG1vbnRoTmFtZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBzdHJpY3QgJiZcbiAgICAgICAgICAgICAgICBmb3JtYXQgPT09ICdNTU0nICYmXG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZVtpXS50ZXN0KG1vbnRoTmFtZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyaWN0ICYmIHRoaXMuX21vbnRoc1BhcnNlW2ldLnRlc3QobW9udGhOYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gc2V0TW9udGgobW9tLCB2YWx1ZSkge1xuICAgICAgICBpZiAoIW1vbS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIC8vIE5vIG9wXG4gICAgICAgICAgICByZXR1cm4gbW9tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICgvXlxcZCskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdG9JbnQodmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IG1vbS5sb2NhbGVEYXRhKCkubW9udGhzUGFyc2UodmFsdWUpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IEFub3RoZXIgc2lsZW50IGZhaWx1cmU/XG4gICAgICAgICAgICAgICAgaWYgKCFpc051bWJlcih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbW9udGggPSB2YWx1ZSxcbiAgICAgICAgICAgIGRhdGUgPSBtb20uZGF0ZSgpO1xuXG4gICAgICAgIGRhdGUgPSBkYXRlIDwgMjkgPyBkYXRlIDogTWF0aC5taW4oZGF0ZSwgZGF5c0luTW9udGgobW9tLnllYXIoKSwgbW9udGgpKTtcbiAgICAgICAgdm9pZCAobW9tLl9pc1VUQ1xuICAgICAgICAgICAgPyBtb20uX2Quc2V0VVRDTW9udGgobW9udGgsIGRhdGUpXG4gICAgICAgICAgICA6IG1vbS5fZC5zZXRNb250aChtb250aCwgZGF0ZSkpO1xuICAgICAgICByZXR1cm4gbW9tO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldE1vbnRoKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBzZXRNb250aCh0aGlzLCB2YWx1ZSk7XG4gICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBnZXQodGhpcywgJ01vbnRoJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXREYXlzSW5Nb250aCgpIHtcbiAgICAgICAgcmV0dXJuIGRheXNJbk1vbnRoKHRoaXMueWVhcigpLCB0aGlzLm1vbnRoKCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbnRoc1Nob3J0UmVnZXgoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX21vbnRoc1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX21vbnRoc1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlTW9udGhzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzU2hvcnRSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX21vbnRoc1Nob3J0UmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1Nob3J0UmVnZXggPSBkZWZhdWx0TW9udGhzU2hvcnRSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4ICYmIGlzU3RyaWN0XG4gICAgICAgICAgICAgICAgPyB0aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4XG4gICAgICAgICAgICAgICAgOiB0aGlzLl9tb250aHNTaG9ydFJlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9udGhzUmVnZXgoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX21vbnRoc1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX21vbnRoc1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlTW9udGhzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1JlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1JlZ2V4ID0gZGVmYXVsdE1vbnRoc1JlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4ICYmIGlzU3RyaWN0XG4gICAgICAgICAgICAgICAgPyB0aGlzLl9tb250aHNTdHJpY3RSZWdleFxuICAgICAgICAgICAgICAgIDogdGhpcy5fbW9udGhzUmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb21wdXRlTW9udGhzUGFyc2UoKSB7XG4gICAgICAgIGZ1bmN0aW9uIGNtcExlblJldihhLCBiKSB7XG4gICAgICAgICAgICByZXR1cm4gYi5sZW5ndGggLSBhLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzaG9ydFBpZWNlcyA9IFtdLFxuICAgICAgICAgICAgbG9uZ1BpZWNlcyA9IFtdLFxuICAgICAgICAgICAgbWl4ZWRQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBtb20sXG4gICAgICAgICAgICBzaG9ydFAsXG4gICAgICAgICAgICBsb25nUDtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCBpXSk7XG4gICAgICAgICAgICBzaG9ydFAgPSByZWdleEVzY2FwZSh0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpKTtcbiAgICAgICAgICAgIGxvbmdQID0gcmVnZXhFc2NhcGUodGhpcy5tb250aHMobW9tLCAnJykpO1xuICAgICAgICAgICAgc2hvcnRQaWVjZXMucHVzaChzaG9ydFApO1xuICAgICAgICAgICAgbG9uZ1BpZWNlcy5wdXNoKGxvbmdQKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2gobG9uZ1ApO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChzaG9ydFApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNvcnRpbmcgbWFrZXMgc3VyZSBpZiBvbmUgbW9udGggKG9yIGFiYnIpIGlzIGEgcHJlZml4IG9mIGFub3RoZXIgaXRcbiAgICAgICAgLy8gd2lsbCBtYXRjaCB0aGUgbG9uZ2VyIHBpZWNlLlxuICAgICAgICBzaG9ydFBpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIGxvbmdQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBtaXhlZFBpZWNlcy5zb3J0KGNtcExlblJldik7XG5cbiAgICAgICAgdGhpcy5fbW9udGhzUmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBtaXhlZFBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX21vbnRoc1Nob3J0UmVnZXggPSB0aGlzLl9tb250aHNSZWdleDtcbiAgICAgICAgdGhpcy5fbW9udGhzU3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgJ14oJyArIGxvbmdQaWVjZXMuam9pbignfCcpICsgJyknLFxuICAgICAgICAgICAgJ2knXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgJ14oJyArIHNob3J0UGllY2VzLmpvaW4oJ3wnKSArICcpJyxcbiAgICAgICAgICAgICdpJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZURhdGUoeSwgbSwgZCwgaCwgTSwgcywgbXMpIHtcbiAgICAgICAgLy8gY2FuJ3QganVzdCBhcHBseSgpIHRvIGNyZWF0ZSBhIGRhdGU6XG4gICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcS8xODEzNDhcbiAgICAgICAgdmFyIGRhdGU7XG4gICAgICAgIC8vIHRoZSBkYXRlIGNvbnN0cnVjdG9yIHJlbWFwcyB5ZWFycyAwLTk5IHRvIDE5MDAtMTk5OVxuICAgICAgICBpZiAoeSA8IDEwMCAmJiB5ID49IDApIHtcbiAgICAgICAgICAgIC8vIHByZXNlcnZlIGxlYXAgeWVhcnMgdXNpbmcgYSBmdWxsIDQwMCB5ZWFyIGN5Y2xlLCB0aGVuIHJlc2V0XG4gICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoeSArIDQwMCwgbSwgZCwgaCwgTSwgcywgbXMpO1xuICAgICAgICAgICAgaWYgKGlzRmluaXRlKGRhdGUuZ2V0RnVsbFllYXIoKSkpIHtcbiAgICAgICAgICAgICAgICBkYXRlLnNldEZ1bGxZZWFyKHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKHksIG0sIGQsIGgsIE0sIHMsIG1zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVVUQ0RhdGUoeSkge1xuICAgICAgICB2YXIgZGF0ZSwgYXJncztcbiAgICAgICAgLy8gdGhlIERhdGUuVVRDIGZ1bmN0aW9uIHJlbWFwcyB5ZWFycyAwLTk5IHRvIDE5MDAtMTk5OVxuICAgICAgICBpZiAoeSA8IDEwMCAmJiB5ID49IDApIHtcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgICAgICAgLy8gcHJlc2VydmUgbGVhcCB5ZWFycyB1c2luZyBhIGZ1bGwgNDAwIHllYXIgY3ljbGUsIHRoZW4gcmVzZXRcbiAgICAgICAgICAgIGFyZ3NbMF0gPSB5ICsgNDAwO1xuICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDLmFwcGx5KG51bGwsIGFyZ3MpKTtcbiAgICAgICAgICAgIGlmIChpc0Zpbml0ZShkYXRlLmdldFVUQ0Z1bGxZZWFyKCkpKSB7XG4gICAgICAgICAgICAgICAgZGF0ZS5zZXRVVENGdWxsWWVhcih5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQy5hcHBseShudWxsLCBhcmd1bWVudHMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cblxuICAgIC8vIHN0YXJ0LW9mLWZpcnN0LXdlZWsgLSBzdGFydC1vZi15ZWFyXG4gICAgZnVuY3Rpb24gZmlyc3RXZWVrT2Zmc2V0KHllYXIsIGRvdywgZG95KSB7XG4gICAgICAgIHZhciAvLyBmaXJzdC13ZWVrIGRheSAtLSB3aGljaCBqYW51YXJ5IGlzIGFsd2F5cyBpbiB0aGUgZmlyc3Qgd2VlayAoNCBmb3IgaXNvLCAxIGZvciBvdGhlcilcbiAgICAgICAgICAgIGZ3ZCA9IDcgKyBkb3cgLSBkb3ksXG4gICAgICAgICAgICAvLyBmaXJzdC13ZWVrIGRheSBsb2NhbCB3ZWVrZGF5IC0tIHdoaWNoIGxvY2FsIHdlZWtkYXkgaXMgZndkXG4gICAgICAgICAgICBmd2RsdyA9ICg3ICsgY3JlYXRlVVRDRGF0ZSh5ZWFyLCAwLCBmd2QpLmdldFVUQ0RheSgpIC0gZG93KSAlIDc7XG5cbiAgICAgICAgcmV0dXJuIC1md2RsdyArIGZ3ZCAtIDE7XG4gICAgfVxuXG4gICAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZSNDYWxjdWxhdGluZ19hX2RhdGVfZ2l2ZW5fdGhlX3llYXIuMkNfd2Vla19udW1iZXJfYW5kX3dlZWtkYXlcbiAgICBmdW5jdGlvbiBkYXlPZlllYXJGcm9tV2Vla3MoeWVhciwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIGxvY2FsV2Vla2RheSA9ICg3ICsgd2Vla2RheSAtIGRvdykgJSA3LFxuICAgICAgICAgICAgd2Vla09mZnNldCA9IGZpcnN0V2Vla09mZnNldCh5ZWFyLCBkb3csIGRveSksXG4gICAgICAgICAgICBkYXlPZlllYXIgPSAxICsgNyAqICh3ZWVrIC0gMSkgKyBsb2NhbFdlZWtkYXkgKyB3ZWVrT2Zmc2V0LFxuICAgICAgICAgICAgcmVzWWVhcixcbiAgICAgICAgICAgIHJlc0RheU9mWWVhcjtcblxuICAgICAgICBpZiAoZGF5T2ZZZWFyIDw9IDApIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSB5ZWFyIC0gMTtcbiAgICAgICAgICAgIHJlc0RheU9mWWVhciA9IGRheXNJblllYXIocmVzWWVhcikgKyBkYXlPZlllYXI7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF5T2ZZZWFyID4gZGF5c0luWWVhcih5ZWFyKSkge1xuICAgICAgICAgICAgcmVzWWVhciA9IHllYXIgKyAxO1xuICAgICAgICAgICAgcmVzRGF5T2ZZZWFyID0gZGF5T2ZZZWFyIC0gZGF5c0luWWVhcih5ZWFyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSB5ZWFyO1xuICAgICAgICAgICAgcmVzRGF5T2ZZZWFyID0gZGF5T2ZZZWFyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHllYXI6IHJlc1llYXIsXG4gICAgICAgICAgICBkYXlPZlllYXI6IHJlc0RheU9mWWVhcixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3ZWVrT2ZZZWFyKG1vbSwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIHdlZWtPZmZzZXQgPSBmaXJzdFdlZWtPZmZzZXQobW9tLnllYXIoKSwgZG93LCBkb3kpLFxuICAgICAgICAgICAgd2VlayA9IE1hdGguZmxvb3IoKG1vbS5kYXlPZlllYXIoKSAtIHdlZWtPZmZzZXQgLSAxKSAvIDcpICsgMSxcbiAgICAgICAgICAgIHJlc1dlZWssXG4gICAgICAgICAgICByZXNZZWFyO1xuXG4gICAgICAgIGlmICh3ZWVrIDwgMSkge1xuICAgICAgICAgICAgcmVzWWVhciA9IG1vbS55ZWFyKCkgLSAxO1xuICAgICAgICAgICAgcmVzV2VlayA9IHdlZWsgKyB3ZWVrc0luWWVhcihyZXNZZWFyLCBkb3csIGRveSk7XG4gICAgICAgIH0gZWxzZSBpZiAod2VlayA+IHdlZWtzSW5ZZWFyKG1vbS55ZWFyKCksIGRvdywgZG95KSkge1xuICAgICAgICAgICAgcmVzV2VlayA9IHdlZWsgLSB3ZWVrc0luWWVhcihtb20ueWVhcigpLCBkb3csIGRveSk7XG4gICAgICAgICAgICByZXNZZWFyID0gbW9tLnllYXIoKSArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNZZWFyID0gbW9tLnllYXIoKTtcbiAgICAgICAgICAgIHJlc1dlZWsgPSB3ZWVrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHdlZWs6IHJlc1dlZWssXG4gICAgICAgICAgICB5ZWFyOiByZXNZZWFyLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWtzSW5ZZWFyKHllYXIsIGRvdywgZG95KSB7XG4gICAgICAgIHZhciB3ZWVrT2Zmc2V0ID0gZmlyc3RXZWVrT2Zmc2V0KHllYXIsIGRvdywgZG95KSxcbiAgICAgICAgICAgIHdlZWtPZmZzZXROZXh0ID0gZmlyc3RXZWVrT2Zmc2V0KHllYXIgKyAxLCBkb3csIGRveSk7XG4gICAgICAgIHJldHVybiAoZGF5c0luWWVhcih5ZWFyKSAtIHdlZWtPZmZzZXQgKyB3ZWVrT2Zmc2V0TmV4dCkgLyA3O1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCd3JywgWyd3dycsIDJdLCAnd28nLCAnd2VlaycpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdXJywgWydXVycsIDJdLCAnV28nLCAnaXNvV2VlaycpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbigndycsIG1hdGNoMXRvMiwgbWF0Y2gxdG8yTm9MZWFkaW5nWmVybyk7XG4gICAgYWRkUmVnZXhUb2tlbignd3cnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignVycsIG1hdGNoMXRvMiwgbWF0Y2gxdG8yTm9MZWFkaW5nWmVybyk7XG4gICAgYWRkUmVnZXhUb2tlbignV1cnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihcbiAgICAgICAgWyd3JywgJ3d3JywgJ1cnLCAnV1cnXSxcbiAgICAgICAgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgICAgICB3ZWVrW3Rva2VuLnN1YnN0cigwLCAxKV0gPSB0b0ludChpbnB1dCk7XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gSEVMUEVSU1xuXG4gICAgLy8gTE9DQUxFU1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vlayhtb20pIHtcbiAgICAgICAgcmV0dXJuIHdlZWtPZlllYXIobW9tLCB0aGlzLl93ZWVrLmRvdywgdGhpcy5fd2Vlay5kb3kpLndlZWs7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVXZWVrID0ge1xuICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlRmlyc3REYXlPZldlZWsoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93ZWVrLmRvdztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVGaXJzdERheU9mWWVhcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWsuZG95O1xuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldFdlZWsoaW5wdXQpIHtcbiAgICAgICAgdmFyIHdlZWsgPSB0aGlzLmxvY2FsZURhdGEoKS53ZWVrKHRoaXMpO1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHdlZWsgOiB0aGlzLmFkZCgoaW5wdXQgLSB3ZWVrKSAqIDcsICdkJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0SVNPV2VlayhpbnB1dCkge1xuICAgICAgICB2YXIgd2VlayA9IHdlZWtPZlllYXIodGhpcywgMSwgNCkud2VlaztcbiAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyB3ZWVrIDogdGhpcy5hZGQoKGlucHV0IC0gd2VlaykgKiA3LCAnZCcpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdkJywgMCwgJ2RvJywgJ2RheScpO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2RkJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXNNaW4odGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdkZGQnLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5c1Nob3J0KHRoaXMsIGZvcm1hdCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignZGRkZCcsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzKHRoaXMsIGZvcm1hdCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignZScsIDAsIDAsICd3ZWVrZGF5Jyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ0UnLCAwLCAwLCAnaXNvV2Vla2RheScpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignZCcsIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignZScsIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignRScsIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignZGQnLCBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLndlZWtkYXlzTWluUmVnZXgoaXNTdHJpY3QpO1xuICAgIH0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2RkZCcsIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUud2Vla2RheXNTaG9ydFJlZ2V4KGlzU3RyaWN0KTtcbiAgICB9KTtcbiAgICBhZGRSZWdleFRva2VuKCdkZGRkJywgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS53ZWVrZGF5c1JlZ2V4KGlzU3RyaWN0KTtcbiAgICB9KTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFsnZGQnLCAnZGRkJywgJ2RkZGQnXSwgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHZhciB3ZWVrZGF5ID0gY29uZmlnLl9sb2NhbGUud2Vla2RheXNQYXJzZShpbnB1dCwgdG9rZW4sIGNvbmZpZy5fc3RyaWN0KTtcbiAgICAgICAgLy8gaWYgd2UgZGlkbid0IGdldCBhIHdlZWtkYXkgbmFtZSwgbWFyayB0aGUgZGF0ZSBhcyBpbnZhbGlkXG4gICAgICAgIGlmICh3ZWVrZGF5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHdlZWsuZCA9IHdlZWtkYXk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pbnZhbGlkV2Vla2RheSA9IGlucHV0O1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihbJ2QnLCAnZScsICdFJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB3ZWVrW3Rva2VuXSA9IHRvSW50KGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIGZ1bmN0aW9uIHBhcnNlV2Vla2RheShpbnB1dCwgbG9jYWxlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzTmFOKGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGlucHV0LCAxMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpbnB1dCA9IGxvY2FsZS53ZWVrZGF5c1BhcnNlKGlucHV0KTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNlSXNvV2Vla2RheShpbnB1dCwgbG9jYWxlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlLndlZWtkYXlzUGFyc2UoaW5wdXQpICUgNyB8fCA3O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc05hTihpbnB1dCkgPyBudWxsIDogaW5wdXQ7XG4gICAgfVxuXG4gICAgLy8gTE9DQUxFU1xuICAgIGZ1bmN0aW9uIHNoaWZ0V2Vla2RheXMod3MsIG4pIHtcbiAgICAgICAgcmV0dXJuIHdzLnNsaWNlKG4sIDcpLmNvbmNhdCh3cy5zbGljZSgwLCBuKSk7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVXZWVrZGF5cyA9XG4gICAgICAgICAgICAnU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXknLnNwbGl0KCdfJyksXG4gICAgICAgIGRlZmF1bHRMb2NhbGVXZWVrZGF5c1Nob3J0ID0gJ1N1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgZGVmYXVsdExvY2FsZVdlZWtkYXlzTWluID0gJ1N1X01vX1R1X1dlX1RoX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBkZWZhdWx0V2Vla2RheXNSZWdleCA9IG1hdGNoV29yZCxcbiAgICAgICAgZGVmYXVsdFdlZWtkYXlzU2hvcnRSZWdleCA9IG1hdGNoV29yZCxcbiAgICAgICAgZGVmYXVsdFdlZWtkYXlzTWluUmVnZXggPSBtYXRjaFdvcmQ7XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVXZWVrZGF5cyhtLCBmb3JtYXQpIHtcbiAgICAgICAgdmFyIHdlZWtkYXlzID0gaXNBcnJheSh0aGlzLl93ZWVrZGF5cylcbiAgICAgICAgICAgID8gdGhpcy5fd2Vla2RheXNcbiAgICAgICAgICAgIDogdGhpcy5fd2Vla2RheXNbXG4gICAgICAgICAgICAgICAgICBtICYmIG0gIT09IHRydWUgJiYgdGhpcy5fd2Vla2RheXMuaXNGb3JtYXQudGVzdChmb3JtYXQpXG4gICAgICAgICAgICAgICAgICAgICAgPyAnZm9ybWF0J1xuICAgICAgICAgICAgICAgICAgICAgIDogJ3N0YW5kYWxvbmUnXG4gICAgICAgICAgICAgIF07XG4gICAgICAgIHJldHVybiBtID09PSB0cnVlXG4gICAgICAgICAgICA/IHNoaWZ0V2Vla2RheXMod2Vla2RheXMsIHRoaXMuX3dlZWsuZG93KVxuICAgICAgICAgICAgOiBtXG4gICAgICAgICAgICAgID8gd2Vla2RheXNbbS5kYXkoKV1cbiAgICAgICAgICAgICAgOiB3ZWVrZGF5cztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVXZWVrZGF5c1Nob3J0KG0pIHtcbiAgICAgICAgcmV0dXJuIG0gPT09IHRydWVcbiAgICAgICAgICAgID8gc2hpZnRXZWVrZGF5cyh0aGlzLl93ZWVrZGF5c1Nob3J0LCB0aGlzLl93ZWVrLmRvdylcbiAgICAgICAgICAgIDogbVxuICAgICAgICAgICAgICA/IHRoaXMuX3dlZWtkYXlzU2hvcnRbbS5kYXkoKV1cbiAgICAgICAgICAgICAgOiB0aGlzLl93ZWVrZGF5c1Nob3J0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZVdlZWtkYXlzTWluKG0pIHtcbiAgICAgICAgcmV0dXJuIG0gPT09IHRydWVcbiAgICAgICAgICAgID8gc2hpZnRXZWVrZGF5cyh0aGlzLl93ZWVrZGF5c01pbiwgdGhpcy5fd2Vlay5kb3cpXG4gICAgICAgICAgICA6IG1cbiAgICAgICAgICAgICAgPyB0aGlzLl93ZWVrZGF5c01pblttLmRheSgpXVxuICAgICAgICAgICAgICA6IHRoaXMuX3dlZWtkYXlzTWluO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZVN0cmljdFBhcnNlJDEod2Vla2RheU5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgaWksXG4gICAgICAgICAgICBtb20sXG4gICAgICAgICAgICBsbGMgPSB3ZWVrZGF5TmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIXRoaXMuX3dlZWtkYXlzUGFyc2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZSA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgKytpKSB7XG4gICAgICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCAxXSkuZGF5KGkpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21pbldlZWtkYXlzUGFyc2VbaV0gPSB0aGlzLndlZWtkYXlzTWluKFxuICAgICAgICAgICAgICAgICAgICBtb20sXG4gICAgICAgICAgICAgICAgICAgICcnXG4gICAgICAgICAgICAgICAgKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZVtpXSA9IHRoaXMud2Vla2RheXNTaG9ydChcbiAgICAgICAgICAgICAgICAgICAgbW9tLFxuICAgICAgICAgICAgICAgICAgICAnJ1xuICAgICAgICAgICAgICAgICkudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlW2ldID0gdGhpcy53ZWVrZGF5cyhtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2RkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICdkZGRkJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXNQYXJzZSh3ZWVrZGF5TmFtZSwgZm9ybWF0LCBzdHJpY3QpIHtcbiAgICAgICAgdmFyIGksIG1vbSwgcmVnZXg7XG5cbiAgICAgICAgaWYgKHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVN0cmljdFBhcnNlJDEuY2FsbCh0aGlzLCB3ZWVrZGF5TmFtZSwgZm9ybWF0LCBzdHJpY3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl93ZWVrZGF5c1BhcnNlKSB7XG4gICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICAvLyBtYWtlIHRoZSByZWdleCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHlcblxuICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCAxXSkuZGF5KGkpO1xuICAgICAgICAgICAgaWYgKHN0cmljdCAmJiAhdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbaV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mdWxsV2Vla2RheXNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAgICAgICAgICdeJyArIHRoaXMud2Vla2RheXMobW9tLCAnJykucmVwbGFjZSgnLicsICdcXFxcLj8nKSArICckJyxcbiAgICAgICAgICAgICAgICAgICAgJ2knXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgICAgICAgICAnXicgKyB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykucmVwbGFjZSgnLicsICdcXFxcLj8nKSArICckJyxcbiAgICAgICAgICAgICAgICAgICAgJ2knXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlW2ldID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAgICAgJ14nICsgdGhpcy53ZWVrZGF5c01pbihtb20sICcnKS5yZXBsYWNlKCcuJywgJ1xcXFwuPycpICsgJyQnLFxuICAgICAgICAgICAgICAgICAgICAnaSdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLl93ZWVrZGF5c1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgcmVnZXggPVxuICAgICAgICAgICAgICAgICAgICAnXicgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLndlZWtkYXlzKG1vbSwgJycpICtcbiAgICAgICAgICAgICAgICAgICAgJ3xeJyArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMud2Vla2RheXNTaG9ydChtb20sICcnKSArXG4gICAgICAgICAgICAgICAgICAgICd8XicgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLndlZWtkYXlzTWluKG1vbSwgJycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKHJlZ2V4LnJlcGxhY2UoJy4nLCAnJyksICdpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0ZXN0IHRoZSByZWdleFxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHN0cmljdCAmJlxuICAgICAgICAgICAgICAgIGZvcm1hdCA9PT0gJ2RkZGQnICYmXG4gICAgICAgICAgICAgICAgdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbaV0udGVzdCh3ZWVrZGF5TmFtZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBzdHJpY3QgJiZcbiAgICAgICAgICAgICAgICBmb3JtYXQgPT09ICdkZGQnICYmXG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW2ldLnRlc3Qod2Vla2RheU5hbWUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgc3RyaWN0ICYmXG4gICAgICAgICAgICAgICAgZm9ybWF0ID09PSAnZGQnICYmXG4gICAgICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJpY3QgJiYgdGhpcy5fd2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0RGF5T2ZXZWVrKGlucHV0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsID8gdGhpcyA6IE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkYXkgPSBnZXQodGhpcywgJ0RheScpO1xuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaW5wdXQgPSBwYXJzZVdlZWtkYXkoaW5wdXQsIHRoaXMubG9jYWxlRGF0YSgpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFkZChpbnB1dCAtIGRheSwgJ2QnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBkYXk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRMb2NhbGVEYXlPZldlZWsoaW5wdXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgPyB0aGlzIDogTmFOO1xuICAgICAgICB9XG4gICAgICAgIHZhciB3ZWVrZGF5ID0gKHRoaXMuZGF5KCkgKyA3IC0gdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWsuZG93KSAlIDc7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gd2Vla2RheSA6IHRoaXMuYWRkKGlucHV0IC0gd2Vla2RheSwgJ2QnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRJU09EYXlPZldlZWsoaW5wdXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgPyB0aGlzIDogTmFOO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYmVoYXZlcyB0aGUgc2FtZSBhcyBtb21lbnQjZGF5IGV4Y2VwdFxuICAgICAgICAvLyBhcyBhIGdldHRlciwgcmV0dXJucyA3IGluc3RlYWQgb2YgMCAoMS03IHJhbmdlIGluc3RlYWQgb2YgMC02KVxuICAgICAgICAvLyBhcyBhIHNldHRlciwgc3VuZGF5IHNob3VsZCBiZWxvbmcgdG8gdGhlIHByZXZpb3VzIHdlZWsuXG5cbiAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHZhciB3ZWVrZGF5ID0gcGFyc2VJc29XZWVrZGF5KGlucHV0LCB0aGlzLmxvY2FsZURhdGEoKSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXkodGhpcy5kYXkoKSAlIDcgPyB3ZWVrZGF5IDogd2Vla2RheSAtIDcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF5KCkgfHwgNztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWtkYXlzUmVnZXgoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZVdlZWtkYXlzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUmVnZXggPSBkZWZhdWx0V2Vla2RheXNSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4ICYmIGlzU3RyaWN0XG4gICAgICAgICAgICAgICAgPyB0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4XG4gICAgICAgICAgICAgICAgOiB0aGlzLl93ZWVrZGF5c1JlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd2Vla2RheXNTaG9ydFJlZ2V4KGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVXZWVrZGF5c1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNTaG9ydFJlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXggPSBkZWZhdWx0V2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU2hvcnRTdHJpY3RSZWdleCAmJiBpc1N0cmljdFxuICAgICAgICAgICAgICAgID8gdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4XG4gICAgICAgICAgICAgICAgOiB0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3ZWVrZGF5c01pblJlZ2V4KGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVXZWVrZGF5c1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzTWluUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c01pblJlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c01pblJlZ2V4ID0gZGVmYXVsdFdlZWtkYXlzTWluUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleCAmJiBpc1N0cmljdFxuICAgICAgICAgICAgICAgID8gdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleFxuICAgICAgICAgICAgICAgIDogdGhpcy5fd2Vla2RheXNNaW5SZWdleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbXB1dGVXZWVrZGF5c1BhcnNlKCkge1xuICAgICAgICBmdW5jdGlvbiBjbXBMZW5SZXYoYSwgYikge1xuICAgICAgICAgICAgcmV0dXJuIGIubGVuZ3RoIC0gYS5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbWluUGllY2VzID0gW10sXG4gICAgICAgICAgICBzaG9ydFBpZWNlcyA9IFtdLFxuICAgICAgICAgICAgbG9uZ1BpZWNlcyA9IFtdLFxuICAgICAgICAgICAgbWl4ZWRQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBtb20sXG4gICAgICAgICAgICBtaW5wLFxuICAgICAgICAgICAgc2hvcnRwLFxuICAgICAgICAgICAgbG9uZ3A7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCAxXSkuZGF5KGkpO1xuICAgICAgICAgICAgbWlucCA9IHJlZ2V4RXNjYXBlKHRoaXMud2Vla2RheXNNaW4obW9tLCAnJykpO1xuICAgICAgICAgICAgc2hvcnRwID0gcmVnZXhFc2NhcGUodGhpcy53ZWVrZGF5c1Nob3J0KG1vbSwgJycpKTtcbiAgICAgICAgICAgIGxvbmdwID0gcmVnZXhFc2NhcGUodGhpcy53ZWVrZGF5cyhtb20sICcnKSk7XG4gICAgICAgICAgICBtaW5QaWVjZXMucHVzaChtaW5wKTtcbiAgICAgICAgICAgIHNob3J0UGllY2VzLnB1c2goc2hvcnRwKTtcbiAgICAgICAgICAgIGxvbmdQaWVjZXMucHVzaChsb25ncCk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKG1pbnApO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChzaG9ydHApO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChsb25ncCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU29ydGluZyBtYWtlcyBzdXJlIGlmIG9uZSB3ZWVrZGF5IChvciBhYmJyKSBpcyBhIHByZWZpeCBvZiBhbm90aGVyIGl0XG4gICAgICAgIC8vIHdpbGwgbWF0Y2ggdGhlIGxvbmdlciBwaWVjZS5cbiAgICAgICAgbWluUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgc2hvcnRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBsb25nUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgbWl4ZWRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuXG4gICAgICAgIHRoaXMuX3dlZWtkYXlzUmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBtaXhlZFBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleCA9IHRoaXMuX3dlZWtkYXlzUmVnZXg7XG4gICAgICAgIHRoaXMuX3dlZWtkYXlzTWluUmVnZXggPSB0aGlzLl93ZWVrZGF5c1JlZ2V4O1xuXG4gICAgICAgIHRoaXMuX3dlZWtkYXlzU3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgJ14oJyArIGxvbmdQaWVjZXMuam9pbignfCcpICsgJyknLFxuICAgICAgICAgICAgJ2knXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX3dlZWtkYXlzU2hvcnRTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAnXignICsgc2hvcnRQaWVjZXMuam9pbignfCcpICsgJyknLFxuICAgICAgICAgICAgJ2knXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgJ14oJyArIG1pblBpZWNlcy5qb2luKCd8JykgKyAnKScsXG4gICAgICAgICAgICAnaSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBmdW5jdGlvbiBoRm9ybWF0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ob3VycygpICUgMTIgfHwgMTI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24ga0Zvcm1hdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG91cnMoKSB8fCAyNDtcbiAgICB9XG5cbiAgICBhZGRGb3JtYXRUb2tlbignSCcsIFsnSEgnLCAyXSwgMCwgJ2hvdXInKTtcbiAgICBhZGRGb3JtYXRUb2tlbignaCcsIFsnaGgnLCAyXSwgMCwgaEZvcm1hdCk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ2snLCBbJ2trJywgMl0sIDAsIGtGb3JtYXQpO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2htbScsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICcnICsgaEZvcm1hdC5hcHBseSh0aGlzKSArIHplcm9GaWxsKHRoaXMubWludXRlcygpLCAyKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdobW1zcycsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICcnICtcbiAgICAgICAgICAgIGhGb3JtYXQuYXBwbHkodGhpcykgK1xuICAgICAgICAgICAgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpICtcbiAgICAgICAgICAgIHplcm9GaWxsKHRoaXMuc2Vjb25kcygpLCAyKVxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ0htbScsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICcnICsgdGhpcy5ob3VycygpICsgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ0htbXNzJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgJycgK1xuICAgICAgICAgICAgdGhpcy5ob3VycygpICtcbiAgICAgICAgICAgIHplcm9GaWxsKHRoaXMubWludXRlcygpLCAyKSArXG4gICAgICAgICAgICB6ZXJvRmlsbCh0aGlzLnNlY29uZHMoKSwgMilcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIG1lcmlkaWVtKHRva2VuLCBsb3dlcmNhc2UpIHtcbiAgICAgICAgYWRkRm9ybWF0VG9rZW4odG9rZW4sIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tZXJpZGllbShcbiAgICAgICAgICAgICAgICB0aGlzLmhvdXJzKCksXG4gICAgICAgICAgICAgICAgdGhpcy5taW51dGVzKCksXG4gICAgICAgICAgICAgICAgbG93ZXJjYXNlXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBtZXJpZGllbSgnYScsIHRydWUpO1xuICAgIG1lcmlkaWVtKCdBJywgZmFsc2UpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgZnVuY3Rpb24gbWF0Y2hNZXJpZGllbShpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUuX21lcmlkaWVtUGFyc2U7XG4gICAgfVxuXG4gICAgYWRkUmVnZXhUb2tlbignYScsIG1hdGNoTWVyaWRpZW0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0EnLCBtYXRjaE1lcmlkaWVtKTtcbiAgICBhZGRSZWdleFRva2VuKCdIJywgbWF0Y2gxdG8yLCBtYXRjaDF0bzJIYXNaZXJvKTtcbiAgICBhZGRSZWdleFRva2VuKCdoJywgbWF0Y2gxdG8yLCBtYXRjaDF0bzJOb0xlYWRpbmdaZXJvKTtcbiAgICBhZGRSZWdleFRva2VuKCdrJywgbWF0Y2gxdG8yLCBtYXRjaDF0bzJOb0xlYWRpbmdaZXJvKTtcbiAgICBhZGRSZWdleFRva2VuKCdISCcsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdoaCcsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdraycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ2htbScsIG1hdGNoM3RvNCk7XG4gICAgYWRkUmVnZXhUb2tlbignaG1tc3MnLCBtYXRjaDV0bzYpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0htbScsIG1hdGNoM3RvNCk7XG4gICAgYWRkUmVnZXhUb2tlbignSG1tc3MnLCBtYXRjaDV0bzYpO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ0gnLCAnSEgnXSwgSE9VUik7XG4gICAgYWRkUGFyc2VUb2tlbihbJ2snLCAna2snXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIHZhciBrSW5wdXQgPSB0b0ludChpbnB1dCk7XG4gICAgICAgIGFycmF5W0hPVVJdID0ga0lucHV0ID09PSAyNCA/IDAgOiBrSW5wdXQ7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbihbJ2EnLCAnQSddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl9pc1BtID0gY29uZmlnLl9sb2NhbGUuaXNQTShpbnB1dCk7XG4gICAgICAgIGNvbmZpZy5fbWVyaWRpZW0gPSBpbnB1dDtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKFsnaCcsICdoaCddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dCk7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPSB0cnVlO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ2htbScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIgcG9zID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dC5zdWJzdHIoMCwgcG9zKSk7XG4gICAgICAgIGFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zKSk7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPSB0cnVlO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ2htbXNzJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIHZhciBwb3MxID0gaW5wdXQubGVuZ3RoIC0gNCxcbiAgICAgICAgICAgIHBvczIgPSBpbnB1dC5sZW5ndGggLSAyO1xuICAgICAgICBhcnJheVtIT1VSXSA9IHRvSW50KGlucHV0LnN1YnN0cigwLCBwb3MxKSk7XG4gICAgICAgIGFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zMSwgMikpO1xuICAgICAgICBhcnJheVtTRUNPTkRdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvczIpKTtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9IHRydWU7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignSG1tJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIHZhciBwb3MgPSBpbnB1dC5sZW5ndGggLSAyO1xuICAgICAgICBhcnJheVtIT1VSXSA9IHRvSW50KGlucHV0LnN1YnN0cigwLCBwb3MpKTtcbiAgICAgICAgYXJyYXlbTUlOVVRFXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MpKTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdIbW1zcycsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIgcG9zMSA9IGlucHV0Lmxlbmd0aCAtIDQsXG4gICAgICAgICAgICBwb3MyID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dC5zdWJzdHIoMCwgcG9zMSkpO1xuICAgICAgICBhcnJheVtNSU5VVEVdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvczEsIDIpKTtcbiAgICAgICAgYXJyYXlbU0VDT05EXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MyKSk7XG4gICAgfSk7XG5cbiAgICAvLyBMT0NBTEVTXG5cbiAgICBmdW5jdGlvbiBsb2NhbGVJc1BNKGlucHV0KSB7XG4gICAgICAgIC8vIElFOCBRdWlya3MgTW9kZSAmIElFNyBTdGFuZGFyZHMgTW9kZSBkbyBub3QgYWxsb3cgYWNjZXNzaW5nIHN0cmluZ3MgbGlrZSBhcnJheXNcbiAgICAgICAgLy8gVXNpbmcgY2hhckF0IHNob3VsZCBiZSBtb3JlIGNvbXBhdGlibGUuXG4gICAgICAgIHJldHVybiAoaW5wdXQgKyAnJykudG9Mb3dlckNhc2UoKS5jaGFyQXQoMCkgPT09ICdwJztcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZU1lcmlkaWVtUGFyc2UgPSAvW2FwXVxcLj9tP1xcLj8vaSxcbiAgICAgICAgLy8gU2V0dGluZyB0aGUgaG91ciBzaG91bGQga2VlcCB0aGUgdGltZSwgYmVjYXVzZSB0aGUgdXNlciBleHBsaWNpdGx5XG4gICAgICAgIC8vIHNwZWNpZmllZCB3aGljaCBob3VyIHRoZXkgd2FudC4gU28gdHJ5aW5nIHRvIG1haW50YWluIHRoZSBzYW1lIGhvdXIgKGluXG4gICAgICAgIC8vIGEgbmV3IHRpbWV6b25lKSBtYWtlcyBzZW5zZS4gQWRkaW5nL3N1YnRyYWN0aW5nIGhvdXJzIGRvZXMgbm90IGZvbGxvd1xuICAgICAgICAvLyB0aGlzIHJ1bGUuXG4gICAgICAgIGdldFNldEhvdXIgPSBtYWtlR2V0U2V0KCdIb3VycycsIHRydWUpO1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlTWVyaWRpZW0oaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgaWYgKGhvdXJzID4gMTEpIHtcbiAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ3BtJyA6ICdQTSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdhbScgOiAnQU0nO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGJhc2VDb25maWcgPSB7XG4gICAgICAgIGNhbGVuZGFyOiBkZWZhdWx0Q2FsZW5kYXIsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiBkZWZhdWx0TG9uZ0RhdGVGb3JtYXQsXG4gICAgICAgIGludmFsaWREYXRlOiBkZWZhdWx0SW52YWxpZERhdGUsXG4gICAgICAgIG9yZGluYWw6IGRlZmF1bHRPcmRpbmFsLFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiBkZWZhdWx0RGF5T2ZNb250aE9yZGluYWxQYXJzZSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiBkZWZhdWx0UmVsYXRpdmVUaW1lLFxuXG4gICAgICAgIG1vbnRoczogZGVmYXVsdExvY2FsZU1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQ6IGRlZmF1bHRMb2NhbGVNb250aHNTaG9ydCxcblxuICAgICAgICB3ZWVrOiBkZWZhdWx0TG9jYWxlV2VlayxcblxuICAgICAgICB3ZWVrZGF5czogZGVmYXVsdExvY2FsZVdlZWtkYXlzLFxuICAgICAgICB3ZWVrZGF5c01pbjogZGVmYXVsdExvY2FsZVdlZWtkYXlzTWluLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiBkZWZhdWx0TG9jYWxlV2Vla2RheXNTaG9ydCxcblxuICAgICAgICBtZXJpZGllbVBhcnNlOiBkZWZhdWx0TG9jYWxlTWVyaWRpZW1QYXJzZSxcbiAgICB9O1xuXG4gICAgLy8gaW50ZXJuYWwgc3RvcmFnZSBmb3IgbG9jYWxlIGNvbmZpZyBmaWxlc1xuICAgIHZhciBsb2NhbGVzID0ge30sXG4gICAgICAgIGxvY2FsZUZhbWlsaWVzID0ge30sXG4gICAgICAgIGdsb2JhbExvY2FsZTtcblxuICAgIGZ1bmN0aW9uIGNvbW1vblByZWZpeChhcnIxLCBhcnIyKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgbWlubCA9IE1hdGgubWluKGFycjEubGVuZ3RoLCBhcnIyLmxlbmd0aCk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBtaW5sOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGlmIChhcnIxW2ldICE9PSBhcnIyW2ldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pbmw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplTG9jYWxlKGtleSkge1xuICAgICAgICByZXR1cm4ga2V5ID8ga2V5LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnXycsICctJykgOiBrZXk7XG4gICAgfVxuXG4gICAgLy8gcGljayB0aGUgbG9jYWxlIGZyb20gdGhlIGFycmF5XG4gICAgLy8gdHJ5IFsnZW4tYXUnLCAnZW4tZ2InXSBhcyAnZW4tYXUnLCAnZW4tZ2InLCAnZW4nLCBhcyBpbiBtb3ZlIHRocm91Z2ggdGhlIGxpc3QgdHJ5aW5nIGVhY2hcbiAgICAvLyBzdWJzdHJpbmcgZnJvbSBtb3N0IHNwZWNpZmljIHRvIGxlYXN0LCBidXQgbW92ZSB0byB0aGUgbmV4dCBhcnJheSBpdGVtIGlmIGl0J3MgYSBtb3JlIHNwZWNpZmljIHZhcmlhbnQgdGhhbiB0aGUgY3VycmVudCByb290XG4gICAgZnVuY3Rpb24gY2hvb3NlTG9jYWxlKG5hbWVzKSB7XG4gICAgICAgIHZhciBpID0gMCxcbiAgICAgICAgICAgIGosXG4gICAgICAgICAgICBuZXh0LFxuICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgc3BsaXQ7XG5cbiAgICAgICAgd2hpbGUgKGkgPCBuYW1lcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHNwbGl0ID0gbm9ybWFsaXplTG9jYWxlKG5hbWVzW2ldKS5zcGxpdCgnLScpO1xuICAgICAgICAgICAgaiA9IHNwbGl0Lmxlbmd0aDtcbiAgICAgICAgICAgIG5leHQgPSBub3JtYWxpemVMb2NhbGUobmFtZXNbaSArIDFdKTtcbiAgICAgICAgICAgIG5leHQgPSBuZXh0ID8gbmV4dC5zcGxpdCgnLScpIDogbnVsbDtcbiAgICAgICAgICAgIHdoaWxlIChqID4gMCkge1xuICAgICAgICAgICAgICAgIGxvY2FsZSA9IGxvYWRMb2NhbGUoc3BsaXQuc2xpY2UoMCwgaikuam9pbignLScpKTtcbiAgICAgICAgICAgICAgICBpZiAobG9jYWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgbmV4dCAmJlxuICAgICAgICAgICAgICAgICAgICBuZXh0Lmxlbmd0aCA+PSBqICYmXG4gICAgICAgICAgICAgICAgICAgIGNvbW1vblByZWZpeChzcGxpdCwgbmV4dCkgPj0gaiAtIDFcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgLy90aGUgbmV4dCBhcnJheSBpdGVtIGlzIGJldHRlciB0aGFuIGEgc2hhbGxvd2VyIHN1YnN0cmluZyBvZiB0aGlzIG9uZVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgai0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnbG9iYWxMb2NhbGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNMb2NhbGVOYW1lU2FuZShuYW1lKSB7XG4gICAgICAgIC8vIFByZXZlbnQgbmFtZXMgdGhhdCBsb29rIGxpa2UgZmlsZXN5c3RlbSBwYXRocywgaS5lIGNvbnRhaW4gJy8nIG9yICdcXCdcbiAgICAgICAgLy8gRW5zdXJlIG5hbWUgaXMgYXZhaWxhYmxlIGFuZCBmdW5jdGlvbiByZXR1cm5zIGJvb2xlYW5cbiAgICAgICAgcmV0dXJuICEhKG5hbWUgJiYgbmFtZS5tYXRjaCgnXlteL1xcXFxcXFxcXSokJykpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvYWRMb2NhbGUobmFtZSkge1xuICAgICAgICB2YXIgb2xkTG9jYWxlID0gbnVsbCxcbiAgICAgICAgICAgIGFsaWFzZWRSZXF1aXJlO1xuICAgICAgICAvLyBUT0RPOiBGaW5kIGEgYmV0dGVyIHdheSB0byByZWdpc3RlciBhbmQgbG9hZCBhbGwgdGhlIGxvY2FsZXMgaW4gTm9kZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBsb2NhbGVzW25hbWVdID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICBtb2R1bGUgJiZcbiAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzICYmXG4gICAgICAgICAgICBpc0xvY2FsZU5hbWVTYW5lKG5hbWUpXG4gICAgICAgICkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBvbGRMb2NhbGUgPSBnbG9iYWxMb2NhbGUuX2FiYnI7XG4gICAgICAgICAgICAgICAgYWxpYXNlZFJlcXVpcmUgPSByZXF1aXJlO1xuICAgICAgICAgICAgICAgIGFsaWFzZWRSZXF1aXJlKCcuL2xvY2FsZS8nICsgbmFtZSk7XG4gICAgICAgICAgICAgICAgZ2V0U2V0R2xvYmFsTG9jYWxlKG9sZExvY2FsZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gbWFyayBhcyBub3QgZm91bmQgdG8gYXZvaWQgcmVwZWF0aW5nIGV4cGVuc2l2ZSBmaWxlIHJlcXVpcmUgY2FsbCBjYXVzaW5nIGhpZ2ggQ1BVXG4gICAgICAgICAgICAgICAgLy8gd2hlbiB0cnlpbmcgdG8gZmluZCBlbi1VUywgZW5fVVMsIGVuLXVzIGZvciBldmVyeSBmb3JtYXQgY2FsbFxuICAgICAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBudWxsOyAvLyBudWxsIG1lYW5zIG5vdCBmb3VuZFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2NhbGVzW25hbWVdO1xuICAgIH1cblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBsb2FkIGxvY2FsZSBhbmQgdGhlbiBzZXQgdGhlIGdsb2JhbCBsb2NhbGUuICBJZlxuICAgIC8vIG5vIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluLCBpdCB3aWxsIHNpbXBseSByZXR1cm4gdGhlIGN1cnJlbnQgZ2xvYmFsXG4gICAgLy8gbG9jYWxlIGtleS5cbiAgICBmdW5jdGlvbiBnZXRTZXRHbG9iYWxMb2NhbGUoa2V5LCB2YWx1ZXMpIHtcbiAgICAgICAgdmFyIGRhdGE7XG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZCh2YWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGdldExvY2FsZShrZXkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gZGVmaW5lTG9jYWxlKGtleSwgdmFsdWVzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAvLyBtb21lbnQuZHVyYXRpb24uX2xvY2FsZSA9IG1vbWVudC5fbG9jYWxlID0gZGF0YTtcbiAgICAgICAgICAgICAgICBnbG9iYWxMb2NhbGUgPSBkYXRhO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGNvbnNvbGUud2Fybikge1xuICAgICAgICAgICAgICAgICAgICAvL3dhcm4gdXNlciBpZiBhcmd1bWVudHMgYXJlIHBhc3NlZCBidXQgdGhlIGxvY2FsZSBjb3VsZCBub3QgYmUgc2V0XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICdMb2NhbGUgJyArIGtleSArICcgbm90IGZvdW5kLiBEaWQgeW91IGZvcmdldCB0byBsb2FkIGl0PydcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2xvYmFsTG9jYWxlLl9hYmJyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlZmluZUxvY2FsZShuYW1lLCBjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGxvY2FsZSxcbiAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBiYXNlQ29uZmlnO1xuICAgICAgICAgICAgY29uZmlnLmFiYnIgPSBuYW1lO1xuICAgICAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0ZVNpbXBsZShcbiAgICAgICAgICAgICAgICAgICAgJ2RlZmluZUxvY2FsZU92ZXJyaWRlJyxcbiAgICAgICAgICAgICAgICAgICAgJ3VzZSBtb21lbnQudXBkYXRlTG9jYWxlKGxvY2FsZU5hbWUsIGNvbmZpZykgdG8gY2hhbmdlICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2FuIGV4aXN0aW5nIGxvY2FsZS4gbW9tZW50LmRlZmluZUxvY2FsZShsb2NhbGVOYW1lLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb25maWcpIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGNyZWF0aW5nIGEgbmV3IGxvY2FsZSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdTZWUgaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9kZWZpbmUtbG9jYWxlLyBmb3IgbW9yZSBpbmZvLidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IGxvY2FsZXNbbmFtZV0uX2NvbmZpZztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLnBhcmVudExvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsZXNbY29uZmlnLnBhcmVudExvY2FsZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBsb2NhbGVzW2NvbmZpZy5wYXJlbnRMb2NhbGVdLl9jb25maWc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gbG9hZExvY2FsZShjb25maWcucGFyZW50TG9jYWxlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBsb2NhbGUuX2NvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbG9jYWxlRmFtaWxpZXNbY29uZmlnLnBhcmVudExvY2FsZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGVGYW1pbGllc1tjb25maWcucGFyZW50TG9jYWxlXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlRmFtaWxpZXNbY29uZmlnLnBhcmVudExvY2FsZV0ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IGNvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2NhbGVzW25hbWVdID0gbmV3IExvY2FsZShtZXJnZUNvbmZpZ3MocGFyZW50Q29uZmlnLCBjb25maWcpKTtcblxuICAgICAgICAgICAgaWYgKGxvY2FsZUZhbWlsaWVzW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxlRmFtaWxpZXNbbmFtZV0uZm9yRWFjaChmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICAgICAgICBkZWZpbmVMb2NhbGUoeC5uYW1lLCB4LmNvbmZpZyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGJhY2t3YXJkcyBjb21wYXQgZm9yIG5vdzogYWxzbyBzZXQgdGhlIGxvY2FsZVxuICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIHNldCB0aGUgbG9jYWxlIEFGVEVSIGFsbCBjaGlsZCBsb2NhbGVzIGhhdmUgYmVlblxuICAgICAgICAgICAgLy8gY3JlYXRlZCwgc28gd2Ugd29uJ3QgZW5kIHVwIHdpdGggdGhlIGNoaWxkIGxvY2FsZSBzZXQuXG4gICAgICAgICAgICBnZXRTZXRHbG9iYWxMb2NhbGUobmFtZSk7XG5cbiAgICAgICAgICAgIHJldHVybiBsb2NhbGVzW25hbWVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdXNlZnVsIGZvciB0ZXN0aW5nXG4gICAgICAgICAgICBkZWxldGUgbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdXBkYXRlTG9jYWxlKG5hbWUsIGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBsb2NhbGUsXG4gICAgICAgICAgICAgICAgdG1wTG9jYWxlLFxuICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IGJhc2VDb25maWc7XG5cbiAgICAgICAgICAgIGlmIChsb2NhbGVzW25hbWVdICE9IG51bGwgJiYgbG9jYWxlc1tuYW1lXS5wYXJlbnRMb2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleGlzdGluZyBjaGlsZCBsb2NhbGUgaW4tcGxhY2UgdG8gYXZvaWQgbWVtb3J5LWxlYWtzXG4gICAgICAgICAgICAgICAgbG9jYWxlc1tuYW1lXS5zZXQobWVyZ2VDb25maWdzKGxvY2FsZXNbbmFtZV0uX2NvbmZpZywgY29uZmlnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE1FUkdFXG4gICAgICAgICAgICAgICAgdG1wTG9jYWxlID0gbG9hZExvY2FsZShuYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAodG1wTG9jYWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Q29uZmlnID0gdG1wTG9jYWxlLl9jb25maWc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbmZpZyA9IG1lcmdlQ29uZmlncyhwYXJlbnRDb25maWcsIGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgaWYgKHRtcExvY2FsZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZUxvY2FsZSBpcyBjYWxsZWQgZm9yIGNyZWF0aW5nIGEgbmV3IGxvY2FsZVxuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgYWJiciBzbyBpdCB3aWxsIGhhdmUgYSBuYW1lIChnZXR0ZXJzIHJldHVyblxuICAgICAgICAgICAgICAgICAgICAvLyB1bmRlZmluZWQgb3RoZXJ3aXNlKS5cbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLmFiYnIgPSBuYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgbG9jYWxlLnBhcmVudExvY2FsZSA9IGxvY2FsZXNbbmFtZV07XG4gICAgICAgICAgICAgICAgbG9jYWxlc1tuYW1lXSA9IGxvY2FsZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdCBmb3Igbm93OiBhbHNvIHNldCB0aGUgbG9jYWxlXG4gICAgICAgICAgICBnZXRTZXRHbG9iYWxMb2NhbGUobmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBwYXNzIG51bGwgZm9yIGNvbmZpZyB0byB1bnVwZGF0ZSwgdXNlZnVsIGZvciB0ZXN0c1xuICAgICAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbGVzW25hbWVdLnBhcmVudExvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBsb2NhbGVzW25hbWVdLnBhcmVudExvY2FsZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09IGdldFNldEdsb2JhbExvY2FsZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRTZXRHbG9iYWxMb2NhbGUobmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvY2FsZXNbbmFtZV07XG4gICAgfVxuXG4gICAgLy8gcmV0dXJucyBsb2NhbGUgZGF0YVxuICAgIGZ1bmN0aW9uIGdldExvY2FsZShrZXkpIHtcbiAgICAgICAgdmFyIGxvY2FsZTtcblxuICAgICAgICBpZiAoa2V5ICYmIGtleS5fbG9jYWxlICYmIGtleS5fbG9jYWxlLl9hYmJyKSB7XG4gICAgICAgICAgICBrZXkgPSBrZXkuX2xvY2FsZS5fYWJicjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gZ2xvYmFsTG9jYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0FycmF5KGtleSkpIHtcbiAgICAgICAgICAgIC8vc2hvcnQtY2lyY3VpdCBldmVyeXRoaW5nIGVsc2VcbiAgICAgICAgICAgIGxvY2FsZSA9IGxvYWRMb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIGlmIChsb2NhbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAga2V5ID0gW2tleV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2hvb3NlTG9jYWxlKGtleSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdExvY2FsZXMoKSB7XG4gICAgICAgIHJldHVybiBrZXlzKGxvY2FsZXMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNoZWNrT3ZlcmZsb3cobSkge1xuICAgICAgICB2YXIgb3ZlcmZsb3csXG4gICAgICAgICAgICBhID0gbS5fYTtcblxuICAgICAgICBpZiAoYSAmJiBnZXRQYXJzaW5nRmxhZ3MobSkub3ZlcmZsb3cgPT09IC0yKSB7XG4gICAgICAgICAgICBvdmVyZmxvdyA9XG4gICAgICAgICAgICAgICAgYVtNT05USF0gPCAwIHx8IGFbTU9OVEhdID4gMTFcbiAgICAgICAgICAgICAgICAgICAgPyBNT05USFxuICAgICAgICAgICAgICAgICAgICA6IGFbREFURV0gPCAxIHx8IGFbREFURV0gPiBkYXlzSW5Nb250aChhW1lFQVJdLCBhW01PTlRIXSlcbiAgICAgICAgICAgICAgICAgICAgICA/IERBVEVcbiAgICAgICAgICAgICAgICAgICAgICA6IGFbSE9VUl0gPCAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFbSE9VUl0gPiAyNCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoYVtIT1VSXSA9PT0gMjQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhW01JTlVURV0gIT09IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW1NFQ09ORF0gIT09IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW01JTExJU0VDT05EXSAhPT0gMCkpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IEhPVVJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYVtNSU5VVEVdIDwgMCB8fCBhW01JTlVURV0gPiA1OVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IE1JTlVURVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGFbU0VDT05EXSA8IDAgfHwgYVtTRUNPTkRdID4gNTlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFNFQ09ORFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYVtNSUxMSVNFQ09ORF0gPCAwIHx8IGFbTUlMTElTRUNPTkRdID4gOTk5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IE1JTExJU0VDT05EXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IC0xO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKG0pLl9vdmVyZmxvd0RheU9mWWVhciAmJlxuICAgICAgICAgICAgICAgIChvdmVyZmxvdyA8IFlFQVIgfHwgb3ZlcmZsb3cgPiBEQVRFKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSBEQVRFO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGdldFBhcnNpbmdGbGFncyhtKS5fb3ZlcmZsb3dXZWVrcyAmJiBvdmVyZmxvdyA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IFdFRUs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZ2V0UGFyc2luZ0ZsYWdzKG0pLl9vdmVyZmxvd1dlZWtkYXkgJiYgb3ZlcmZsb3cgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSBXRUVLREFZO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MobSkub3ZlcmZsb3cgPSBvdmVyZmxvdztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIC8vIGlzbyA4NjAxIHJlZ2V4XG4gICAgLy8gMDAwMC0wMC0wMCAwMDAwLVcwMCBvciAwMDAwLVcwMC0wICsgVCArIDAwIG9yIDAwOjAwIG9yIDAwOjAwOjAwIG9yIDAwOjAwOjAwLjAwMCArICswMDowMCBvciArMDAwMCBvciArMDApXG4gICAgdmFyIGV4dGVuZGVkSXNvUmVnZXggPVxuICAgICAgICAgICAgL15cXHMqKCg/OlsrLV1cXGR7Nn18XFxkezR9KS0oPzpcXGRcXGQtXFxkXFxkfFdcXGRcXGQtXFxkfFdcXGRcXGR8XFxkXFxkXFxkfFxcZFxcZCkpKD86KFR8ICkoXFxkXFxkKD86OlxcZFxcZCg/OjpcXGRcXGQoPzpbLixdXFxkKyk/KT8pPykoWystXVxcZFxcZCg/Ojo/XFxkXFxkKT98XFxzKlopPyk/JC8sXG4gICAgICAgIGJhc2ljSXNvUmVnZXggPVxuICAgICAgICAgICAgL15cXHMqKCg/OlsrLV1cXGR7Nn18XFxkezR9KSg/OlxcZFxcZFxcZFxcZHxXXFxkXFxkXFxkfFdcXGRcXGR8XFxkXFxkXFxkfFxcZFxcZHwpKSg/OihUfCApKFxcZFxcZCg/OlxcZFxcZCg/OlxcZFxcZCg/OlsuLF1cXGQrKT8pPyk/KShbKy1dXFxkXFxkKD86Oj9cXGRcXGQpP3xcXHMqWik/KT8kLyxcbiAgICAgICAgdHpSZWdleCA9IC9afFsrLV1cXGRcXGQoPzo6P1xcZFxcZCk/LyxcbiAgICAgICAgaXNvRGF0ZXMgPSBbXG4gICAgICAgICAgICBbJ1lZWVlZWS1NTS1ERCcsIC9bKy1dXFxkezZ9LVxcZFxcZC1cXGRcXGQvXSxcbiAgICAgICAgICAgIFsnWVlZWS1NTS1ERCcsIC9cXGR7NH0tXFxkXFxkLVxcZFxcZC9dLFxuICAgICAgICAgICAgWydHR0dHLVtXXVdXLUUnLCAvXFxkezR9LVdcXGRcXGQtXFxkL10sXG4gICAgICAgICAgICBbJ0dHR0ctW1ddV1cnLCAvXFxkezR9LVdcXGRcXGQvLCBmYWxzZV0sXG4gICAgICAgICAgICBbJ1lZWVktREREJywgL1xcZHs0fS1cXGR7M30vXSxcbiAgICAgICAgICAgIFsnWVlZWS1NTScsIC9cXGR7NH0tXFxkXFxkLywgZmFsc2VdLFxuICAgICAgICAgICAgWydZWVlZWVlNTUREJywgL1srLV1cXGR7MTB9L10sXG4gICAgICAgICAgICBbJ1lZWVlNTUREJywgL1xcZHs4fS9dLFxuICAgICAgICAgICAgWydHR0dHW1ddV1dFJywgL1xcZHs0fVdcXGR7M30vXSxcbiAgICAgICAgICAgIFsnR0dHR1tXXVdXJywgL1xcZHs0fVdcXGR7Mn0vLCBmYWxzZV0sXG4gICAgICAgICAgICBbJ1lZWVlEREQnLCAvXFxkezd9L10sXG4gICAgICAgICAgICBbJ1lZWVlNTScsIC9cXGR7Nn0vLCBmYWxzZV0sXG4gICAgICAgICAgICBbJ1lZWVknLCAvXFxkezR9LywgZmFsc2VdLFxuICAgICAgICBdLFxuICAgICAgICAvLyBpc28gdGltZSBmb3JtYXRzIGFuZCByZWdleGVzXG4gICAgICAgIGlzb1RpbWVzID0gW1xuICAgICAgICAgICAgWydISDptbTpzcy5TU1NTJywgL1xcZFxcZDpcXGRcXGQ6XFxkXFxkXFwuXFxkKy9dLFxuICAgICAgICAgICAgWydISDptbTpzcyxTU1NTJywgL1xcZFxcZDpcXGRcXGQ6XFxkXFxkLFxcZCsvXSxcbiAgICAgICAgICAgIFsnSEg6bW06c3MnLCAvXFxkXFxkOlxcZFxcZDpcXGRcXGQvXSxcbiAgICAgICAgICAgIFsnSEg6bW0nLCAvXFxkXFxkOlxcZFxcZC9dLFxuICAgICAgICAgICAgWydISG1tc3MuU1NTUycsIC9cXGRcXGRcXGRcXGRcXGRcXGRcXC5cXGQrL10sXG4gICAgICAgICAgICBbJ0hIbW1zcyxTU1NTJywgL1xcZFxcZFxcZFxcZFxcZFxcZCxcXGQrL10sXG4gICAgICAgICAgICBbJ0hIbW1zcycsIC9cXGRcXGRcXGRcXGRcXGRcXGQvXSxcbiAgICAgICAgICAgIFsnSEhtbScsIC9cXGRcXGRcXGRcXGQvXSxcbiAgICAgICAgICAgIFsnSEgnLCAvXFxkXFxkL10sXG4gICAgICAgIF0sXG4gICAgICAgIGFzcE5ldEpzb25SZWdleCA9IC9eXFwvP0RhdGVcXCgoLT9cXGQrKS9pLFxuICAgICAgICAvLyBSRkMgMjgyMiByZWdleDogRm9yIGRldGFpbHMgc2VlIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyODIyI3NlY3Rpb24tMy4zXG4gICAgICAgIHJmYzI4MjIgPVxuICAgICAgICAgICAgL14oPzooTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSw/XFxzKT8oXFxkezEsMn0pXFxzKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKVxccyhcXGR7Miw0fSlcXHMoXFxkXFxkKTooXFxkXFxkKSg/OjooXFxkXFxkKSk/XFxzKD86KFVUfEdNVHxbRUNNUF1bU0RdVCl8KFtael0pfChbKy1dXFxkezR9KSkkLyxcbiAgICAgICAgb2JzT2Zmc2V0cyA9IHtcbiAgICAgICAgICAgIFVUOiAwLFxuICAgICAgICAgICAgR01UOiAwLFxuICAgICAgICAgICAgRURUOiAtNCAqIDYwLFxuICAgICAgICAgICAgRVNUOiAtNSAqIDYwLFxuICAgICAgICAgICAgQ0RUOiAtNSAqIDYwLFxuICAgICAgICAgICAgQ1NUOiAtNiAqIDYwLFxuICAgICAgICAgICAgTURUOiAtNiAqIDYwLFxuICAgICAgICAgICAgTVNUOiAtNyAqIDYwLFxuICAgICAgICAgICAgUERUOiAtNyAqIDYwLFxuICAgICAgICAgICAgUFNUOiAtOCAqIDYwLFxuICAgICAgICB9O1xuXG4gICAgLy8gZGF0ZSBmcm9tIGlzbyBmb3JtYXRcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tSVNPKGNvbmZpZykge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGwsXG4gICAgICAgICAgICBzdHJpbmcgPSBjb25maWcuX2ksXG4gICAgICAgICAgICBtYXRjaCA9IGV4dGVuZGVkSXNvUmVnZXguZXhlYyhzdHJpbmcpIHx8IGJhc2ljSXNvUmVnZXguZXhlYyhzdHJpbmcpLFxuICAgICAgICAgICAgYWxsb3dUaW1lLFxuICAgICAgICAgICAgZGF0ZUZvcm1hdCxcbiAgICAgICAgICAgIHRpbWVGb3JtYXQsXG4gICAgICAgICAgICB0ekZvcm1hdCxcbiAgICAgICAgICAgIGlzb0RhdGVzTGVuID0gaXNvRGF0ZXMubGVuZ3RoLFxuICAgICAgICAgICAgaXNvVGltZXNMZW4gPSBpc29UaW1lcy5sZW5ndGg7XG5cbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pc28gPSB0cnVlO1xuICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IGlzb0RhdGVzTGVuOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzb0RhdGVzW2ldWzFdLmV4ZWMobWF0Y2hbMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXQgPSBpc29EYXRlc1tpXVswXTtcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dUaW1lID0gaXNvRGF0ZXNbaV1bMl0gIT09IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0ZUZvcm1hdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoWzNdKSB7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IGlzb1RpbWVzTGVuOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc29UaW1lc1tpXVsxXS5leGVjKG1hdGNoWzNdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hbMl0gc2hvdWxkIGJlICdUJyBvciBzcGFjZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGltZUZvcm1hdCA9IChtYXRjaFsyXSB8fCAnICcpICsgaXNvVGltZXNbaV1bMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGltZUZvcm1hdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFhbGxvd1RpbWUgJiYgdGltZUZvcm1hdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoWzRdKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR6UmVnZXguZXhlYyhtYXRjaFs0XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHpGb3JtYXQgPSAnWic7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25maWcuX2YgPSBkYXRlRm9ybWF0ICsgKHRpbWVGb3JtYXQgfHwgJycpICsgKHR6Rm9ybWF0IHx8ICcnKTtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21TdHJpbmdBbmRGb3JtYXQoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXh0cmFjdEZyb21SRkMyODIyU3RyaW5ncyhcbiAgICAgICAgeWVhclN0cixcbiAgICAgICAgbW9udGhTdHIsXG4gICAgICAgIGRheVN0cixcbiAgICAgICAgaG91clN0cixcbiAgICAgICAgbWludXRlU3RyLFxuICAgICAgICBzZWNvbmRTdHJcbiAgICApIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtcbiAgICAgICAgICAgIHVudHJ1bmNhdGVZZWFyKHllYXJTdHIpLFxuICAgICAgICAgICAgZGVmYXVsdExvY2FsZU1vbnRoc1Nob3J0LmluZGV4T2YobW9udGhTdHIpLFxuICAgICAgICAgICAgcGFyc2VJbnQoZGF5U3RyLCAxMCksXG4gICAgICAgICAgICBwYXJzZUludChob3VyU3RyLCAxMCksXG4gICAgICAgICAgICBwYXJzZUludChtaW51dGVTdHIsIDEwKSxcbiAgICAgICAgXTtcblxuICAgICAgICBpZiAoc2Vjb25kU3RyKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChwYXJzZUludChzZWNvbmRTdHIsIDEwKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVudHJ1bmNhdGVZZWFyKHllYXJTdHIpIHtcbiAgICAgICAgdmFyIHllYXIgPSBwYXJzZUludCh5ZWFyU3RyLCAxMCk7XG4gICAgICAgIGlmICh5ZWFyIDw9IDQ5KSB7XG4gICAgICAgICAgICByZXR1cm4gMjAwMCArIHllYXI7XG4gICAgICAgIH0gZWxzZSBpZiAoeWVhciA8PSA5OTkpIHtcbiAgICAgICAgICAgIHJldHVybiAxOTAwICsgeWVhcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geWVhcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcmVwcm9jZXNzUkZDMjgyMihzKSB7XG4gICAgICAgIC8vIFJlbW92ZSBjb21tZW50cyBhbmQgZm9sZGluZyB3aGl0ZXNwYWNlIGFuZCByZXBsYWNlIG11bHRpcGxlLXNwYWNlcyB3aXRoIGEgc2luZ2xlIHNwYWNlXG4gICAgICAgIHJldHVybiBzXG4gICAgICAgICAgICAucmVwbGFjZSgvXFwoW14oKV0qXFwpfFtcXG5cXHRdL2csICcgJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oXFxzXFxzKykvZywgJyAnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL15cXHNcXHMqLywgJycpXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxzXFxzKiQvLCAnJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2hlY2tXZWVrZGF5KHdlZWtkYXlTdHIsIHBhcnNlZElucHV0LCBjb25maWcpIHtcbiAgICAgICAgaWYgKHdlZWtkYXlTdHIpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IFJlcGxhY2UgdGhlIHZhbmlsbGEgSlMgRGF0ZSBvYmplY3Qgd2l0aCBhbiBpbmRlcGVuZGVudCBkYXktb2Ytd2VlayBjaGVjay5cbiAgICAgICAgICAgIHZhciB3ZWVrZGF5UHJvdmlkZWQgPSBkZWZhdWx0TG9jYWxlV2Vla2RheXNTaG9ydC5pbmRleE9mKHdlZWtkYXlTdHIpLFxuICAgICAgICAgICAgICAgIHdlZWtkYXlBY3R1YWwgPSBuZXcgRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkSW5wdXRbMF0sXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZElucHV0WzFdLFxuICAgICAgICAgICAgICAgICAgICBwYXJzZWRJbnB1dFsyXVxuICAgICAgICAgICAgICAgICkuZ2V0RGF5KCk7XG4gICAgICAgICAgICBpZiAod2Vla2RheVByb3ZpZGVkICE9PSB3ZWVrZGF5QWN0dWFsKSB7XG4gICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykud2Vla2RheU1pc21hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FsY3VsYXRlT2Zmc2V0KG9ic09mZnNldCwgbWlsaXRhcnlPZmZzZXQsIG51bU9mZnNldCkge1xuICAgICAgICBpZiAob2JzT2Zmc2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gb2JzT2Zmc2V0c1tvYnNPZmZzZXRdO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbGl0YXJ5T2Zmc2V0KSB7XG4gICAgICAgICAgICAvLyB0aGUgb25seSBhbGxvd2VkIG1pbGl0YXJ5IHR6IGlzIFpcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGhtID0gcGFyc2VJbnQobnVtT2Zmc2V0LCAxMCksXG4gICAgICAgICAgICAgICAgbSA9IGhtICUgMTAwLFxuICAgICAgICAgICAgICAgIGggPSAoaG0gLSBtKSAvIDEwMDtcbiAgICAgICAgICAgIHJldHVybiBoICogNjAgKyBtO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGF0ZSBhbmQgdGltZSBmcm9tIHJlZiAyODIyIGZvcm1hdFxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21SRkMyODIyKGNvbmZpZykge1xuICAgICAgICB2YXIgbWF0Y2ggPSByZmMyODIyLmV4ZWMocHJlcHJvY2Vzc1JGQzI4MjIoY29uZmlnLl9pKSksXG4gICAgICAgICAgICBwYXJzZWRBcnJheTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBwYXJzZWRBcnJheSA9IGV4dHJhY3RGcm9tUkZDMjgyMlN0cmluZ3MoXG4gICAgICAgICAgICAgICAgbWF0Y2hbNF0sXG4gICAgICAgICAgICAgICAgbWF0Y2hbM10sXG4gICAgICAgICAgICAgICAgbWF0Y2hbMl0sXG4gICAgICAgICAgICAgICAgbWF0Y2hbNV0sXG4gICAgICAgICAgICAgICAgbWF0Y2hbNl0sXG4gICAgICAgICAgICAgICAgbWF0Y2hbN11cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIWNoZWNrV2Vla2RheShtYXRjaFsxXSwgcGFyc2VkQXJyYXksIGNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbmZpZy5fYSA9IHBhcnNlZEFycmF5O1xuICAgICAgICAgICAgY29uZmlnLl90em0gPSBjYWxjdWxhdGVPZmZzZXQobWF0Y2hbOF0sIG1hdGNoWzldLCBtYXRjaFsxMF0pO1xuXG4gICAgICAgICAgICBjb25maWcuX2QgPSBjcmVhdGVVVENEYXRlLmFwcGx5KG51bGwsIGNvbmZpZy5fYSk7XG4gICAgICAgICAgICBjb25maWcuX2Quc2V0VVRDTWludXRlcyhjb25maWcuX2QuZ2V0VVRDTWludXRlcygpIC0gY29uZmlnLl90em0pO1xuXG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5yZmMyODIyID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGF0ZSBmcm9tIDEpIEFTUC5ORVQsIDIpIElTTywgMykgUkZDIDI4MjIgZm9ybWF0cywgb3IgNCkgb3B0aW9uYWwgZmFsbGJhY2sgaWYgcGFyc2luZyBpc24ndCBzdHJpY3RcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tU3RyaW5nKGNvbmZpZykge1xuICAgICAgICB2YXIgbWF0Y2hlZCA9IGFzcE5ldEpzb25SZWdleC5leGVjKGNvbmZpZy5faSk7XG4gICAgICAgIGlmIChtYXRjaGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZSgrbWF0Y2hlZFsxXSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25maWdGcm9tSVNPKGNvbmZpZyk7XG4gICAgICAgIGlmIChjb25maWcuX2lzVmFsaWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBkZWxldGUgY29uZmlnLl9pc1ZhbGlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uZmlnRnJvbVJGQzI4MjIoY29uZmlnKTtcbiAgICAgICAgaWYgKGNvbmZpZy5faXNWYWxpZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjb25maWcuX2lzVmFsaWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLl9zdHJpY3QpIHtcbiAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRmluYWwgYXR0ZW1wdCwgdXNlIElucHV0IEZhbGxiYWNrXG4gICAgICAgICAgICBob29rcy5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjayhjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaG9va3MuY3JlYXRlRnJvbUlucHV0RmFsbGJhY2sgPSBkZXByZWNhdGUoXG4gICAgICAgICd2YWx1ZSBwcm92aWRlZCBpcyBub3QgaW4gYSByZWNvZ25pemVkIFJGQzI4MjIgb3IgSVNPIGZvcm1hdC4gbW9tZW50IGNvbnN0cnVjdGlvbiBmYWxscyBiYWNrIHRvIGpzIERhdGUoKSwgJyArXG4gICAgICAgICAgICAnd2hpY2ggaXMgbm90IHJlbGlhYmxlIGFjcm9zcyBhbGwgYnJvd3NlcnMgYW5kIHZlcnNpb25zLiBOb24gUkZDMjgyMi9JU08gZGF0ZSBmb3JtYXRzIGFyZSAnICtcbiAgICAgICAgICAgICdkaXNjb3VyYWdlZC4gUGxlYXNlIHJlZmVyIHRvIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvanMtZGF0ZS8gZm9yIG1vcmUgaW5mby4nLFxuICAgICAgICBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShjb25maWcuX2kgKyAoY29uZmlnLl91c2VVVEMgPyAnIFVUQycgOiAnJykpO1xuICAgICAgICB9XG4gICAgKTtcblxuICAgIC8vIFBpY2sgdGhlIGZpcnN0IGRlZmluZWQgb2YgdHdvIG9yIHRocmVlIGFyZ3VtZW50cy5cbiAgICBmdW5jdGlvbiBkZWZhdWx0cyhhLCBiLCBjKSB7XG4gICAgICAgIGlmIChhICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGN1cnJlbnREYXRlQXJyYXkoY29uZmlnKSB7XG4gICAgICAgIC8vIGhvb2tzIGlzIGFjdHVhbGx5IHRoZSBleHBvcnRlZCBtb21lbnQgb2JqZWN0XG4gICAgICAgIHZhciBub3dWYWx1ZSA9IG5ldyBEYXRlKGhvb2tzLm5vdygpKTtcbiAgICAgICAgaWYgKGNvbmZpZy5fdXNlVVRDKSB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIG5vd1ZhbHVlLmdldFVUQ0Z1bGxZZWFyKCksXG4gICAgICAgICAgICAgICAgbm93VmFsdWUuZ2V0VVRDTW9udGgoKSxcbiAgICAgICAgICAgICAgICBub3dWYWx1ZS5nZXRVVENEYXRlKCksXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbbm93VmFsdWUuZ2V0RnVsbFllYXIoKSwgbm93VmFsdWUuZ2V0TW9udGgoKSwgbm93VmFsdWUuZ2V0RGF0ZSgpXTtcbiAgICB9XG5cbiAgICAvLyBjb252ZXJ0IGFuIGFycmF5IHRvIGEgZGF0ZS5cbiAgICAvLyB0aGUgYXJyYXkgc2hvdWxkIG1pcnJvciB0aGUgcGFyYW1ldGVycyBiZWxvd1xuICAgIC8vIG5vdGU6IGFsbCB2YWx1ZXMgcGFzdCB0aGUgeWVhciBhcmUgb3B0aW9uYWwgYW5kIHdpbGwgZGVmYXVsdCB0byB0aGUgbG93ZXN0IHBvc3NpYmxlIHZhbHVlLlxuICAgIC8vIFt5ZWFyLCBtb250aCwgZGF5ICwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kXVxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21BcnJheShjb25maWcpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgaW5wdXQgPSBbXSxcbiAgICAgICAgICAgIGN1cnJlbnREYXRlLFxuICAgICAgICAgICAgZXhwZWN0ZWRXZWVrZGF5LFxuICAgICAgICAgICAgeWVhclRvVXNlO1xuXG4gICAgICAgIGlmIChjb25maWcuX2QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnREYXRlID0gY3VycmVudERhdGVBcnJheShjb25maWcpO1xuXG4gICAgICAgIC8vY29tcHV0ZSBkYXkgb2YgdGhlIHllYXIgZnJvbSB3ZWVrcyBhbmQgd2Vla2RheXNcbiAgICAgICAgaWYgKGNvbmZpZy5fdyAmJiBjb25maWcuX2FbREFURV0gPT0gbnVsbCAmJiBjb25maWcuX2FbTU9OVEhdID09IG51bGwpIHtcbiAgICAgICAgICAgIGRheU9mWWVhckZyb21XZWVrSW5mbyhjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9pZiB0aGUgZGF5IG9mIHRoZSB5ZWFyIGlzIHNldCwgZmlndXJlIG91dCB3aGF0IGl0IGlzXG4gICAgICAgIGlmIChjb25maWcuX2RheU9mWWVhciAhPSBudWxsKSB7XG4gICAgICAgICAgICB5ZWFyVG9Vc2UgPSBkZWZhdWx0cyhjb25maWcuX2FbWUVBUl0sIGN1cnJlbnREYXRlW1lFQVJdKTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGNvbmZpZy5fZGF5T2ZZZWFyID4gZGF5c0luWWVhcih5ZWFyVG9Vc2UpIHx8XG4gICAgICAgICAgICAgICAgY29uZmlnLl9kYXlPZlllYXIgPT09IDBcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLl9vdmVyZmxvd0RheU9mWWVhciA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRhdGUgPSBjcmVhdGVVVENEYXRlKHllYXJUb1VzZSwgMCwgY29uZmlnLl9kYXlPZlllYXIpO1xuICAgICAgICAgICAgY29uZmlnLl9hW01PTlRIXSA9IGRhdGUuZ2V0VVRDTW9udGgoKTtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtEQVRFXSA9IGRhdGUuZ2V0VVRDRGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVmYXVsdCB0byBjdXJyZW50IGRhdGUuXG4gICAgICAgIC8vICogaWYgbm8geWVhciwgbW9udGgsIGRheSBvZiBtb250aCBhcmUgZ2l2ZW4sIGRlZmF1bHQgdG8gdG9kYXlcbiAgICAgICAgLy8gKiBpZiBkYXkgb2YgbW9udGggaXMgZ2l2ZW4sIGRlZmF1bHQgbW9udGggYW5kIHllYXJcbiAgICAgICAgLy8gKiBpZiBtb250aCBpcyBnaXZlbiwgZGVmYXVsdCBvbmx5IHllYXJcbiAgICAgICAgLy8gKiBpZiB5ZWFyIGlzIGdpdmVuLCBkb24ndCBkZWZhdWx0IGFueXRoaW5nXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAzICYmIGNvbmZpZy5fYVtpXSA9PSBudWxsOyArK2kpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtpXSA9IGlucHV0W2ldID0gY3VycmVudERhdGVbaV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBaZXJvIG91dCB3aGF0ZXZlciB3YXMgbm90IGRlZmF1bHRlZCwgaW5jbHVkaW5nIHRpbWVcbiAgICAgICAgZm9yICg7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtpXSA9IGlucHV0W2ldID1cbiAgICAgICAgICAgICAgICBjb25maWcuX2FbaV0gPT0gbnVsbCA/IChpID09PSAyID8gMSA6IDApIDogY29uZmlnLl9hW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIDI0OjAwOjAwLjAwMFxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPT09IDI0ICYmXG4gICAgICAgICAgICBjb25maWcuX2FbTUlOVVRFXSA9PT0gMCAmJlxuICAgICAgICAgICAgY29uZmlnLl9hW1NFQ09ORF0gPT09IDAgJiZcbiAgICAgICAgICAgIGNvbmZpZy5fYVtNSUxMSVNFQ09ORF0gPT09IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25maWcuX25leHREYXkgPSB0cnVlO1xuICAgICAgICAgICAgY29uZmlnLl9hW0hPVVJdID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbmZpZy5fZCA9IChjb25maWcuX3VzZVVUQyA/IGNyZWF0ZVVUQ0RhdGUgOiBjcmVhdGVEYXRlKS5hcHBseShcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBpbnB1dFxuICAgICAgICApO1xuICAgICAgICBleHBlY3RlZFdlZWtkYXkgPSBjb25maWcuX3VzZVVUQ1xuICAgICAgICAgICAgPyBjb25maWcuX2QuZ2V0VVRDRGF5KClcbiAgICAgICAgICAgIDogY29uZmlnLl9kLmdldERheSgpO1xuXG4gICAgICAgIC8vIEFwcGx5IHRpbWV6b25lIG9mZnNldCBmcm9tIGlucHV0LiBUaGUgYWN0dWFsIHV0Y09mZnNldCBjYW4gYmUgY2hhbmdlZFxuICAgICAgICAvLyB3aXRoIHBhcnNlWm9uZS5cbiAgICAgICAgaWYgKGNvbmZpZy5fdHptICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZC5zZXRVVENNaW51dGVzKGNvbmZpZy5fZC5nZXRVVENNaW51dGVzKCkgLSBjb25maWcuX3R6bSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLl9uZXh0RGF5KSB7XG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPSAyNDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGZvciBtaXNtYXRjaGluZyBkYXkgb2Ygd2Vla1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb25maWcuX3cgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjb25maWcuX3cuZCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIGNvbmZpZy5fdy5kICE9PSBleHBlY3RlZFdlZWtkYXlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS53ZWVrZGF5TWlzbWF0Y2ggPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGF5T2ZZZWFyRnJvbVdlZWtJbmZvKGNvbmZpZykge1xuICAgICAgICB2YXIgdywgd2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95LCB0ZW1wLCB3ZWVrZGF5T3ZlcmZsb3csIGN1cldlZWs7XG5cbiAgICAgICAgdyA9IGNvbmZpZy5fdztcbiAgICAgICAgaWYgKHcuR0cgIT0gbnVsbCB8fCB3LlcgIT0gbnVsbCB8fCB3LkUgIT0gbnVsbCkge1xuICAgICAgICAgICAgZG93ID0gMTtcbiAgICAgICAgICAgIGRveSA9IDQ7XG5cbiAgICAgICAgICAgIC8vIFRPRE86IFdlIG5lZWQgdG8gdGFrZSB0aGUgY3VycmVudCBpc29XZWVrWWVhciwgYnV0IHRoYXQgZGVwZW5kcyBvblxuICAgICAgICAgICAgLy8gaG93IHdlIGludGVycHJldCBub3cgKGxvY2FsLCB1dGMsIGZpeGVkIG9mZnNldCkuIFNvIGNyZWF0ZVxuICAgICAgICAgICAgLy8gYSBub3cgdmVyc2lvbiBvZiBjdXJyZW50IGNvbmZpZyAodGFrZSBsb2NhbC91dGMvb2Zmc2V0IGZsYWdzLCBhbmRcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBub3cpLlxuICAgICAgICAgICAgd2Vla1llYXIgPSBkZWZhdWx0cyhcbiAgICAgICAgICAgICAgICB3LkdHLFxuICAgICAgICAgICAgICAgIGNvbmZpZy5fYVtZRUFSXSxcbiAgICAgICAgICAgICAgICB3ZWVrT2ZZZWFyKGNyZWF0ZUxvY2FsKCksIDEsIDQpLnllYXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB3ZWVrID0gZGVmYXVsdHMody5XLCAxKTtcbiAgICAgICAgICAgIHdlZWtkYXkgPSBkZWZhdWx0cyh3LkUsIDEpO1xuICAgICAgICAgICAgaWYgKHdlZWtkYXkgPCAxIHx8IHdlZWtkYXkgPiA3KSB7XG4gICAgICAgICAgICAgICAgd2Vla2RheU92ZXJmbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRvdyA9IGNvbmZpZy5fbG9jYWxlLl93ZWVrLmRvdztcbiAgICAgICAgICAgIGRveSA9IGNvbmZpZy5fbG9jYWxlLl93ZWVrLmRveTtcblxuICAgICAgICAgICAgY3VyV2VlayA9IHdlZWtPZlllYXIoY3JlYXRlTG9jYWwoKSwgZG93LCBkb3kpO1xuXG4gICAgICAgICAgICB3ZWVrWWVhciA9IGRlZmF1bHRzKHcuZ2csIGNvbmZpZy5fYVtZRUFSXSwgY3VyV2Vlay55ZWFyKTtcblxuICAgICAgICAgICAgLy8gRGVmYXVsdCB0byBjdXJyZW50IHdlZWsuXG4gICAgICAgICAgICB3ZWVrID0gZGVmYXVsdHMody53LCBjdXJXZWVrLndlZWspO1xuXG4gICAgICAgICAgICBpZiAody5kICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyB3ZWVrZGF5IC0tIGxvdyBkYXkgbnVtYmVycyBhcmUgY29uc2lkZXJlZCBuZXh0IHdlZWtcbiAgICAgICAgICAgICAgICB3ZWVrZGF5ID0gdy5kO1xuICAgICAgICAgICAgICAgIGlmICh3ZWVrZGF5IDwgMCB8fCB3ZWVrZGF5ID4gNikge1xuICAgICAgICAgICAgICAgICAgICB3ZWVrZGF5T3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAody5lICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBsb2NhbCB3ZWVrZGF5IC0tIGNvdW50aW5nIHN0YXJ0cyBmcm9tIGJlZ2lubmluZyBvZiB3ZWVrXG4gICAgICAgICAgICAgICAgd2Vla2RheSA9IHcuZSArIGRvdztcbiAgICAgICAgICAgICAgICBpZiAody5lIDwgMCB8fCB3LmUgPiA2KSB7XG4gICAgICAgICAgICAgICAgICAgIHdlZWtkYXlPdmVyZmxvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIGJlZ2lubmluZyBvZiB3ZWVrXG4gICAgICAgICAgICAgICAgd2Vla2RheSA9IGRvdztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAod2VlayA8IDEgfHwgd2VlayA+IHdlZWtzSW5ZZWFyKHdlZWtZZWFyLCBkb3csIGRveSkpIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLl9vdmVyZmxvd1dlZWtzID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh3ZWVrZGF5T3ZlcmZsb3cgIT0gbnVsbCkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuX292ZXJmbG93V2Vla2RheSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ZW1wID0gZGF5T2ZZZWFyRnJvbVdlZWtzKHdlZWtZZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSk7XG4gICAgICAgICAgICBjb25maWcuX2FbWUVBUl0gPSB0ZW1wLnllYXI7XG4gICAgICAgICAgICBjb25maWcuX2RheU9mWWVhciA9IHRlbXAuZGF5T2ZZZWFyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29uc3RhbnQgdGhhdCByZWZlcnMgdG8gdGhlIElTTyBzdGFuZGFyZFxuICAgIGhvb2tzLklTT184NjAxID0gZnVuY3Rpb24gKCkge307XG5cbiAgICAvLyBjb25zdGFudCB0aGF0IHJlZmVycyB0byB0aGUgUkZDIDI4MjIgZm9ybVxuICAgIGhvb2tzLlJGQ18yODIyID0gZnVuY3Rpb24gKCkge307XG5cbiAgICAvLyBkYXRlIGZyb20gc3RyaW5nIGFuZCBmb3JtYXQgc3RyaW5nXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdChjb25maWcpIHtcbiAgICAgICAgLy8gVE9ETzogTW92ZSB0aGlzIHRvIGFub3RoZXIgcGFydCBvZiB0aGUgY3JlYXRpb24gZmxvdyB0byBwcmV2ZW50IGNpcmN1bGFyIGRlcHNcbiAgICAgICAgaWYgKGNvbmZpZy5fZiA9PT0gaG9va3MuSVNPXzg2MDEpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21JU08oY29uZmlnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLl9mID09PSBob29rcy5SRkNfMjgyMikge1xuICAgICAgICAgICAgY29uZmlnRnJvbVJGQzI4MjIoY29uZmlnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25maWcuX2EgPSBbXTtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuZW1wdHkgPSB0cnVlO1xuXG4gICAgICAgIC8vIFRoaXMgYXJyYXkgaXMgdXNlZCB0byBtYWtlIGEgRGF0ZSwgZWl0aGVyIHdpdGggYG5ldyBEYXRlYCBvciBgRGF0ZS5VVENgXG4gICAgICAgIHZhciBzdHJpbmcgPSAnJyArIGNvbmZpZy5faSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBwYXJzZWRJbnB1dCxcbiAgICAgICAgICAgIHRva2VucyxcbiAgICAgICAgICAgIHRva2VuLFxuICAgICAgICAgICAgc2tpcHBlZCxcbiAgICAgICAgICAgIHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgsXG4gICAgICAgICAgICB0b3RhbFBhcnNlZElucHV0TGVuZ3RoID0gMCxcbiAgICAgICAgICAgIGVyYSxcbiAgICAgICAgICAgIHRva2VuTGVuO1xuXG4gICAgICAgIHRva2VucyA9XG4gICAgICAgICAgICBleHBhbmRGb3JtYXQoY29uZmlnLl9mLCBjb25maWcuX2xvY2FsZSkubWF0Y2goZm9ybWF0dGluZ1Rva2VucykgfHwgW107XG4gICAgICAgIHRva2VuTGVuID0gdG9rZW5zLmxlbmd0aDtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRva2VuTGVuOyBpKyspIHtcbiAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW2ldO1xuICAgICAgICAgICAgcGFyc2VkSW5wdXQgPSAoc3RyaW5nLm1hdGNoKGdldFBhcnNlUmVnZXhGb3JUb2tlbih0b2tlbiwgY29uZmlnKSkgfHxcbiAgICAgICAgICAgICAgICBbXSlbMF07XG4gICAgICAgICAgICBpZiAocGFyc2VkSW5wdXQpIHtcbiAgICAgICAgICAgICAgICBza2lwcGVkID0gc3RyaW5nLnN1YnN0cigwLCBzdHJpbmcuaW5kZXhPZihwYXJzZWRJbnB1dCkpO1xuICAgICAgICAgICAgICAgIGlmIChza2lwcGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykudW51c2VkSW5wdXQucHVzaChza2lwcGVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RyaW5nID0gc3RyaW5nLnNsaWNlKFxuICAgICAgICAgICAgICAgICAgICBzdHJpbmcuaW5kZXhPZihwYXJzZWRJbnB1dCkgKyBwYXJzZWRJbnB1dC5sZW5ndGhcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRvdGFsUGFyc2VkSW5wdXRMZW5ndGggKz0gcGFyc2VkSW5wdXQubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZG9uJ3QgcGFyc2UgaWYgaXQncyBub3QgYSBrbm93biB0b2tlblxuICAgICAgICAgICAgaWYgKGZvcm1hdFRva2VuRnVuY3Rpb25zW3Rva2VuXSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJzZWRJbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5lbXB0eSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnVudXNlZFRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWRkVGltZVRvQXJyYXlGcm9tVG9rZW4odG9rZW4sIHBhcnNlZElucHV0LCBjb25maWcpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWcuX3N0cmljdCAmJiAhcGFyc2VkSW5wdXQpIHtcbiAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS51bnVzZWRUb2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgcmVtYWluaW5nIHVucGFyc2VkIGlucHV0IGxlbmd0aCB0byB0aGUgc3RyaW5nXG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmNoYXJzTGVmdE92ZXIgPVxuICAgICAgICAgICAgc3RyaW5nTGVuZ3RoIC0gdG90YWxQYXJzZWRJbnB1dExlbmd0aDtcbiAgICAgICAgaWYgKHN0cmluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS51bnVzZWRJbnB1dC5wdXNoKHN0cmluZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjbGVhciBfMTJoIGZsYWcgaWYgaG91ciBpcyA8PSAxMlxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPD0gMTIgJiZcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPT09IHRydWUgJiZcbiAgICAgICAgICAgIGNvbmZpZy5fYVtIT1VSXSA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykucGFyc2VkRGF0ZVBhcnRzID0gY29uZmlnLl9hLnNsaWNlKDApO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5tZXJpZGllbSA9IGNvbmZpZy5fbWVyaWRpZW07XG4gICAgICAgIC8vIGhhbmRsZSBtZXJpZGllbVxuICAgICAgICBjb25maWcuX2FbSE9VUl0gPSBtZXJpZGllbUZpeFdyYXAoXG4gICAgICAgICAgICBjb25maWcuX2xvY2FsZSxcbiAgICAgICAgICAgIGNvbmZpZy5fYVtIT1VSXSxcbiAgICAgICAgICAgIGNvbmZpZy5fbWVyaWRpZW1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBoYW5kbGUgZXJhXG4gICAgICAgIGVyYSA9IGdldFBhcnNpbmdGbGFncyhjb25maWcpLmVyYTtcbiAgICAgICAgaWYgKGVyYSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uZmlnLl9hW1lFQVJdID0gY29uZmlnLl9sb2NhbGUuZXJhc0NvbnZlcnRZZWFyKGVyYSwgY29uZmlnLl9hW1lFQVJdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbmZpZ0Zyb21BcnJheShjb25maWcpO1xuICAgICAgICBjaGVja092ZXJmbG93KGNvbmZpZyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyaWRpZW1GaXhXcmFwKGxvY2FsZSwgaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgdmFyIGlzUG07XG5cbiAgICAgICAgaWYgKG1lcmlkaWVtID09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG9cbiAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbGUubWVyaWRpZW1Ib3VyICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbGUubWVyaWRpZW1Ib3VyKGhvdXIsIG1lcmlkaWVtKTtcbiAgICAgICAgfSBlbHNlIGlmIChsb2NhbGUuaXNQTSAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBGYWxsYmFja1xuICAgICAgICAgICAgaXNQbSA9IGxvY2FsZS5pc1BNKG1lcmlkaWVtKTtcbiAgICAgICAgICAgIGlmIChpc1BtICYmIGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgKz0gMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzUG0gJiYgaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyBub3Qgc3VwcG9zZWQgdG8gaGFwcGVuXG4gICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRhdGUgZnJvbSBzdHJpbmcgYW5kIGFycmF5IG9mIGZvcm1hdCBzdHJpbmdzXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbVN0cmluZ0FuZEFycmF5KGNvbmZpZykge1xuICAgICAgICB2YXIgdGVtcENvbmZpZyxcbiAgICAgICAgICAgIGJlc3RNb21lbnQsXG4gICAgICAgICAgICBzY29yZVRvQmVhdCxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBjdXJyZW50U2NvcmUsXG4gICAgICAgICAgICB2YWxpZEZvcm1hdEZvdW5kLFxuICAgICAgICAgICAgYmVzdEZvcm1hdElzVmFsaWQgPSBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ2ZMZW4gPSBjb25maWcuX2YubGVuZ3RoO1xuXG4gICAgICAgIGlmIChjb25maWdmTGVuID09PSAwKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pbnZhbGlkRm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKE5hTik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29uZmlnZkxlbjsgaSsrKSB7XG4gICAgICAgICAgICBjdXJyZW50U2NvcmUgPSAwO1xuICAgICAgICAgICAgdmFsaWRGb3JtYXRGb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGVtcENvbmZpZyA9IGNvcHlDb25maWcoe30sIGNvbmZpZyk7XG4gICAgICAgICAgICBpZiAoY29uZmlnLl91c2VVVEMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRlbXBDb25maWcuX3VzZVVUQyA9IGNvbmZpZy5fdXNlVVRDO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGVtcENvbmZpZy5fZiA9IGNvbmZpZy5fZltpXTtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21TdHJpbmdBbmRGb3JtYXQodGVtcENvbmZpZyk7XG5cbiAgICAgICAgICAgIGlmIChpc1ZhbGlkKHRlbXBDb25maWcpKSB7XG4gICAgICAgICAgICAgICAgdmFsaWRGb3JtYXRGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGFueSBpbnB1dCB0aGF0IHdhcyBub3QgcGFyc2VkIGFkZCBhIHBlbmFsdHkgZm9yIHRoYXQgZm9ybWF0XG4gICAgICAgICAgICBjdXJyZW50U2NvcmUgKz0gZ2V0UGFyc2luZ0ZsYWdzKHRlbXBDb25maWcpLmNoYXJzTGVmdE92ZXI7XG5cbiAgICAgICAgICAgIC8vb3IgdG9rZW5zXG4gICAgICAgICAgICBjdXJyZW50U2NvcmUgKz0gZ2V0UGFyc2luZ0ZsYWdzKHRlbXBDb25maWcpLnVudXNlZFRva2Vucy5sZW5ndGggKiAxMDtcblxuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKHRlbXBDb25maWcpLnNjb3JlID0gY3VycmVudFNjb3JlO1xuXG4gICAgICAgICAgICBpZiAoIWJlc3RGb3JtYXRJc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBzY29yZVRvQmVhdCA9PSBudWxsIHx8XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTY29yZSA8IHNjb3JlVG9CZWF0IHx8XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkRm9ybWF0Rm91bmRcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgc2NvcmVUb0JlYXQgPSBjdXJyZW50U2NvcmU7XG4gICAgICAgICAgICAgICAgICAgIGJlc3RNb21lbnQgPSB0ZW1wQ29uZmlnO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRGb3JtYXRGb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdEZvcm1hdElzVmFsaWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFNjb3JlIDwgc2NvcmVUb0JlYXQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2NvcmVUb0JlYXQgPSBjdXJyZW50U2NvcmU7XG4gICAgICAgICAgICAgICAgICAgIGJlc3RNb21lbnQgPSB0ZW1wQ29uZmlnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGV4dGVuZChjb25maWcsIGJlc3RNb21lbnQgfHwgdGVtcENvbmZpZyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbU9iamVjdChjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5fZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGkgPSBub3JtYWxpemVPYmplY3RVbml0cyhjb25maWcuX2kpLFxuICAgICAgICAgICAgZGF5T3JEYXRlID0gaS5kYXkgPT09IHVuZGVmaW5lZCA/IGkuZGF0ZSA6IGkuZGF5O1xuICAgICAgICBjb25maWcuX2EgPSBtYXAoXG4gICAgICAgICAgICBbaS55ZWFyLCBpLm1vbnRoLCBkYXlPckRhdGUsIGkuaG91ciwgaS5taW51dGUsIGkuc2Vjb25kLCBpLm1pbGxpc2Vjb25kXSxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqICYmIHBhcnNlSW50KG9iaiwgMTApO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbmZpZ0Zyb21BcnJheShjb25maWcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUZyb21Db25maWcoY29uZmlnKSB7XG4gICAgICAgIHZhciByZXMgPSBuZXcgTW9tZW50KGNoZWNrT3ZlcmZsb3cocHJlcGFyZUNvbmZpZyhjb25maWcpKSk7XG4gICAgICAgIGlmIChyZXMuX25leHREYXkpIHtcbiAgICAgICAgICAgIC8vIEFkZGluZyBpcyBzbWFydCBlbm91Z2ggYXJvdW5kIERTVFxuICAgICAgICAgICAgcmVzLmFkZCgxLCAnZCcpO1xuICAgICAgICAgICAgcmVzLl9uZXh0RGF5ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcmVwYXJlQ29uZmlnKGNvbmZpZykge1xuICAgICAgICB2YXIgaW5wdXQgPSBjb25maWcuX2ksXG4gICAgICAgICAgICBmb3JtYXQgPSBjb25maWcuX2Y7XG5cbiAgICAgICAgY29uZmlnLl9sb2NhbGUgPSBjb25maWcuX2xvY2FsZSB8fCBnZXRMb2NhbGUoY29uZmlnLl9sKTtcblxuICAgICAgICBpZiAoaW5wdXQgPT09IG51bGwgfHwgKGZvcm1hdCA9PT0gdW5kZWZpbmVkICYmIGlucHV0ID09PSAnJykpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnZhbGlkKHsgbnVsbElucHV0OiB0cnVlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbmZpZy5faSA9IGlucHV0ID0gY29uZmlnLl9sb2NhbGUucHJlcGFyc2UoaW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzTW9tZW50KGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNb21lbnQoY2hlY2tPdmVyZmxvdyhpbnB1dCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRGF0ZShpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IGlucHV0O1xuICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkoZm9ybWF0KSkge1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEFycmF5KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0KSB7XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nQW5kRm9ybWF0KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25maWdGcm9tSW5wdXQoY29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNWYWxpZChjb25maWcpKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb25maWdGcm9tSW5wdXQoY29uZmlnKSB7XG4gICAgICAgIHZhciBpbnB1dCA9IGNvbmZpZy5faTtcbiAgICAgICAgaWYgKGlzVW5kZWZpbmVkKGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoaG9va3Mubm93KCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRGF0ZShpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKGlucHV0LnZhbHVlT2YoKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZyhjb25maWcpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWcuX2EgPSBtYXAoaW5wdXQuc2xpY2UoMCksIGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQob2JqLCAxMCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21BcnJheShjb25maWcpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnRnJvbU9iamVjdChjb25maWcpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzTnVtYmVyKGlucHV0KSkge1xuICAgICAgICAgICAgLy8gZnJvbSBtaWxsaXNlY29uZHNcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKGlucHV0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhvb2tzLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrKGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVMb2NhbE9yVVRDKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0LCBpc1VUQykge1xuICAgICAgICB2YXIgYyA9IHt9O1xuXG4gICAgICAgIGlmIChmb3JtYXQgPT09IHRydWUgfHwgZm9ybWF0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgc3RyaWN0ID0gZm9ybWF0O1xuICAgICAgICAgICAgZm9ybWF0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxvY2FsZSA9PT0gdHJ1ZSB8fCBsb2NhbGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBzdHJpY3QgPSBsb2NhbGU7XG4gICAgICAgICAgICBsb2NhbGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAoaXNPYmplY3QoaW5wdXQpICYmIGlzT2JqZWN0RW1wdHkoaW5wdXQpKSB8fFxuICAgICAgICAgICAgKGlzQXJyYXkoaW5wdXQpICYmIGlucHV0Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpbnB1dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBvYmplY3QgY29uc3RydWN0aW9uIG11c3QgYmUgZG9uZSB0aGlzIHdheS5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzE0MjNcbiAgICAgICAgYy5faXNBTW9tZW50T2JqZWN0ID0gdHJ1ZTtcbiAgICAgICAgYy5fdXNlVVRDID0gYy5faXNVVEMgPSBpc1VUQztcbiAgICAgICAgYy5fbCA9IGxvY2FsZTtcbiAgICAgICAgYy5faSA9IGlucHV0O1xuICAgICAgICBjLl9mID0gZm9ybWF0O1xuICAgICAgICBjLl9zdHJpY3QgPSBzdHJpY3Q7XG5cbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZyb21Db25maWcoYyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlTG9jYWwoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsT3JVVEMoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QsIGZhbHNlKTtcbiAgICB9XG5cbiAgICB2YXIgcHJvdG90eXBlTWluID0gZGVwcmVjYXRlKFxuICAgICAgICAgICAgJ21vbWVudCgpLm1pbiBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50Lm1heCBpbnN0ZWFkLiBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL21pbi1tYXgvJyxcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgb3RoZXIgPSBjcmVhdGVMb2NhbC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWQoKSAmJiBvdGhlci5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG90aGVyIDwgdGhpcyA/IHRoaXMgOiBvdGhlcjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlSW52YWxpZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgcHJvdG90eXBlTWF4ID0gZGVwcmVjYXRlKFxuICAgICAgICAgICAgJ21vbWVudCgpLm1heCBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50Lm1pbiBpbnN0ZWFkLiBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL21pbi1tYXgvJyxcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgb3RoZXIgPSBjcmVhdGVMb2NhbC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWQoKSAmJiBvdGhlci5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG90aGVyID4gdGhpcyA/IHRoaXMgOiBvdGhlcjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlSW52YWxpZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgIC8vIFBpY2sgYSBtb21lbnQgbSBmcm9tIG1vbWVudHMgc28gdGhhdCBtW2ZuXShvdGhlcikgaXMgdHJ1ZSBmb3IgYWxsXG4gICAgLy8gb3RoZXIuIFRoaXMgcmVsaWVzIG9uIHRoZSBmdW5jdGlvbiBmbiB0byBiZSB0cmFuc2l0aXZlLlxuICAgIC8vXG4gICAgLy8gbW9tZW50cyBzaG91bGQgZWl0aGVyIGJlIGFuIGFycmF5IG9mIG1vbWVudCBvYmplY3RzIG9yIGFuIGFycmF5LCB3aG9zZVxuICAgIC8vIGZpcnN0IGVsZW1lbnQgaXMgYW4gYXJyYXkgb2YgbW9tZW50IG9iamVjdHMuXG4gICAgZnVuY3Rpb24gcGlja0J5KGZuLCBtb21lbnRzKSB7XG4gICAgICAgIHZhciByZXMsIGk7XG4gICAgICAgIGlmIChtb21lbnRzLmxlbmd0aCA9PT0gMSAmJiBpc0FycmF5KG1vbWVudHNbMF0pKSB7XG4gICAgICAgICAgICBtb21lbnRzID0gbW9tZW50c1swXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1vbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWwoKTtcbiAgICAgICAgfVxuICAgICAgICByZXMgPSBtb21lbnRzWzBdO1xuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbW9tZW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKCFtb21lbnRzW2ldLmlzVmFsaWQoKSB8fCBtb21lbnRzW2ldW2ZuXShyZXMpKSB7XG4gICAgICAgICAgICAgICAgcmVzID0gbW9tZW50c1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8vIFRPRE86IFVzZSBbXS5zb3J0IGluc3RlYWQ/XG4gICAgZnVuY3Rpb24gbWluKCkge1xuICAgICAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcblxuICAgICAgICByZXR1cm4gcGlja0J5KCdpc0JlZm9yZScsIGFyZ3MpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1heCgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG5cbiAgICAgICAgcmV0dXJuIHBpY2tCeSgnaXNBZnRlcicsIGFyZ3MpO1xuICAgIH1cblxuICAgIHZhciBub3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBEYXRlLm5vdyA/IERhdGUubm93KCkgOiArbmV3IERhdGUoKTtcbiAgICB9O1xuXG4gICAgdmFyIG9yZGVyaW5nID0gW1xuICAgICAgICAneWVhcicsXG4gICAgICAgICdxdWFydGVyJyxcbiAgICAgICAgJ21vbnRoJyxcbiAgICAgICAgJ3dlZWsnLFxuICAgICAgICAnZGF5JyxcbiAgICAgICAgJ2hvdXInLFxuICAgICAgICAnbWludXRlJyxcbiAgICAgICAgJ3NlY29uZCcsXG4gICAgICAgICdtaWxsaXNlY29uZCcsXG4gICAgXTtcblxuICAgIGZ1bmN0aW9uIGlzRHVyYXRpb25WYWxpZChtKSB7XG4gICAgICAgIHZhciBrZXksXG4gICAgICAgICAgICB1bml0SGFzRGVjaW1hbCA9IGZhbHNlLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIG9yZGVyTGVuID0gb3JkZXJpbmcubGVuZ3RoO1xuICAgICAgICBmb3IgKGtleSBpbiBtKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgaGFzT3duUHJvcChtLCBrZXkpICYmXG4gICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhPZi5jYWxsKG9yZGVyaW5nLCBrZXkpICE9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICAobVtrZXldID09IG51bGwgfHwgIWlzTmFOKG1ba2V5XSkpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IG9yZGVyTGVuOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChtW29yZGVyaW5nW2ldXSkge1xuICAgICAgICAgICAgICAgIGlmICh1bml0SGFzRGVjaW1hbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIG9ubHkgYWxsb3cgbm9uLWludGVnZXJzIGZvciBzbWFsbGVzdCB1bml0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwYXJzZUZsb2F0KG1bb3JkZXJpbmdbaV1dKSAhPT0gdG9JbnQobVtvcmRlcmluZ1tpXV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHVuaXRIYXNEZWNpbWFsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1ZhbGlkJDEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1ZhbGlkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUludmFsaWQkMSgpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKE5hTik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRHVyYXRpb24oZHVyYXRpb24pIHtcbiAgICAgICAgdmFyIG5vcm1hbGl6ZWRJbnB1dCA9IG5vcm1hbGl6ZU9iamVjdFVuaXRzKGR1cmF0aW9uKSxcbiAgICAgICAgICAgIHllYXJzID0gbm9ybWFsaXplZElucHV0LnllYXIgfHwgMCxcbiAgICAgICAgICAgIHF1YXJ0ZXJzID0gbm9ybWFsaXplZElucHV0LnF1YXJ0ZXIgfHwgMCxcbiAgICAgICAgICAgIG1vbnRocyA9IG5vcm1hbGl6ZWRJbnB1dC5tb250aCB8fCAwLFxuICAgICAgICAgICAgd2Vla3MgPSBub3JtYWxpemVkSW5wdXQud2VlayB8fCBub3JtYWxpemVkSW5wdXQuaXNvV2VlayB8fCAwLFxuICAgICAgICAgICAgZGF5cyA9IG5vcm1hbGl6ZWRJbnB1dC5kYXkgfHwgMCxcbiAgICAgICAgICAgIGhvdXJzID0gbm9ybWFsaXplZElucHV0LmhvdXIgfHwgMCxcbiAgICAgICAgICAgIG1pbnV0ZXMgPSBub3JtYWxpemVkSW5wdXQubWludXRlIHx8IDAsXG4gICAgICAgICAgICBzZWNvbmRzID0gbm9ybWFsaXplZElucHV0LnNlY29uZCB8fCAwLFxuICAgICAgICAgICAgbWlsbGlzZWNvbmRzID0gbm9ybWFsaXplZElucHV0Lm1pbGxpc2Vjb25kIHx8IDA7XG5cbiAgICAgICAgdGhpcy5faXNWYWxpZCA9IGlzRHVyYXRpb25WYWxpZChub3JtYWxpemVkSW5wdXQpO1xuXG4gICAgICAgIC8vIHJlcHJlc2VudGF0aW9uIGZvciBkYXRlQWRkUmVtb3ZlXG4gICAgICAgIHRoaXMuX21pbGxpc2Vjb25kcyA9XG4gICAgICAgICAgICArbWlsbGlzZWNvbmRzICtcbiAgICAgICAgICAgIHNlY29uZHMgKiAxZTMgKyAvLyAxMDAwXG4gICAgICAgICAgICBtaW51dGVzICogNmU0ICsgLy8gMTAwMCAqIDYwXG4gICAgICAgICAgICBob3VycyAqIDEwMDAgKiA2MCAqIDYwOyAvL3VzaW5nIDEwMDAgKiA2MCAqIDYwIGluc3RlYWQgb2YgMzZlNSB0byBhdm9pZCBmbG9hdGluZyBwb2ludCByb3VuZGluZyBlcnJvcnMgaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzI5NzhcbiAgICAgICAgLy8gQmVjYXVzZSBvZiBkYXRlQWRkUmVtb3ZlIHRyZWF0cyAyNCBob3VycyBhcyBkaWZmZXJlbnQgZnJvbSBhXG4gICAgICAgIC8vIGRheSB3aGVuIHdvcmtpbmcgYXJvdW5kIERTVCwgd2UgbmVlZCB0byBzdG9yZSB0aGVtIHNlcGFyYXRlbHlcbiAgICAgICAgdGhpcy5fZGF5cyA9ICtkYXlzICsgd2Vla3MgKiA3O1xuICAgICAgICAvLyBJdCBpcyBpbXBvc3NpYmxlIHRvIHRyYW5zbGF0ZSBtb250aHMgaW50byBkYXlzIHdpdGhvdXQga25vd2luZ1xuICAgICAgICAvLyB3aGljaCBtb250aHMgeW91IGFyZSBhcmUgdGFsa2luZyBhYm91dCwgc28gd2UgaGF2ZSB0byBzdG9yZVxuICAgICAgICAvLyBpdCBzZXBhcmF0ZWx5LlxuICAgICAgICB0aGlzLl9tb250aHMgPSArbW9udGhzICsgcXVhcnRlcnMgKiAzICsgeWVhcnMgKiAxMjtcblxuICAgICAgICB0aGlzLl9kYXRhID0ge307XG5cbiAgICAgICAgdGhpcy5fbG9jYWxlID0gZ2V0TG9jYWxlKCk7XG5cbiAgICAgICAgdGhpcy5fYnViYmxlKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEdXJhdGlvbihvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIER1cmF0aW9uO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFic1JvdW5kKG51bWJlcikge1xuICAgICAgICBpZiAobnVtYmVyIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoLTEgKiBudW1iZXIpICogLTE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29tcGFyZSB0d28gYXJyYXlzLCByZXR1cm4gdGhlIG51bWJlciBvZiBkaWZmZXJlbmNlc1xuICAgIGZ1bmN0aW9uIGNvbXBhcmVBcnJheXMoYXJyYXkxLCBhcnJheTIsIGRvbnRDb252ZXJ0KSB7XG4gICAgICAgIHZhciBsZW4gPSBNYXRoLm1pbihhcnJheTEubGVuZ3RoLCBhcnJheTIubGVuZ3RoKSxcbiAgICAgICAgICAgIGxlbmd0aERpZmYgPSBNYXRoLmFicyhhcnJheTEubGVuZ3RoIC0gYXJyYXkyLmxlbmd0aCksXG4gICAgICAgICAgICBkaWZmcyA9IDAsXG4gICAgICAgICAgICBpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAoZG9udENvbnZlcnQgJiYgYXJyYXkxW2ldICE9PSBhcnJheTJbaV0pIHx8XG4gICAgICAgICAgICAgICAgKCFkb250Q29udmVydCAmJiB0b0ludChhcnJheTFbaV0pICE9PSB0b0ludChhcnJheTJbaV0pKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgZGlmZnMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGlmZnMgKyBsZW5ndGhEaWZmO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGZ1bmN0aW9uIG9mZnNldCh0b2tlbiwgc2VwYXJhdG9yKSB7XG4gICAgICAgIGFkZEZvcm1hdFRva2VuKHRva2VuLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy51dGNPZmZzZXQoKSxcbiAgICAgICAgICAgICAgICBzaWduID0gJysnO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSAtb2Zmc2V0O1xuICAgICAgICAgICAgICAgIHNpZ24gPSAnLSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHNpZ24gK1xuICAgICAgICAgICAgICAgIHplcm9GaWxsKH5+KG9mZnNldCAvIDYwKSwgMikgK1xuICAgICAgICAgICAgICAgIHNlcGFyYXRvciArXG4gICAgICAgICAgICAgICAgemVyb0ZpbGwofn5vZmZzZXQgJSA2MCwgMilcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9mZnNldCgnWicsICc6Jyk7XG4gICAgb2Zmc2V0KCdaWicsICcnKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ1onLCBtYXRjaFNob3J0T2Zmc2V0KTtcbiAgICBhZGRSZWdleFRva2VuKCdaWicsIG1hdGNoU2hvcnRPZmZzZXQpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydaJywgJ1paJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICBjb25maWcuX3VzZVVUQyA9IHRydWU7XG4gICAgICAgIGNvbmZpZy5fdHptID0gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaFNob3J0T2Zmc2V0LCBpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBIRUxQRVJTXG5cbiAgICAvLyB0aW1lem9uZSBjaHVua2VyXG4gICAgLy8gJysxMDowMCcgPiBbJzEwJywgICcwMCddXG4gICAgLy8gJy0xNTMwJyAgPiBbJy0xNScsICczMCddXG4gICAgdmFyIGNodW5rT2Zmc2V0ID0gLyhbXFwrXFwtXXxcXGRcXGQpL2dpO1xuXG4gICAgZnVuY3Rpb24gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaGVyLCBzdHJpbmcpIHtcbiAgICAgICAgdmFyIG1hdGNoZXMgPSAoc3RyaW5nIHx8ICcnKS5tYXRjaChtYXRjaGVyKSxcbiAgICAgICAgICAgIGNodW5rLFxuICAgICAgICAgICAgcGFydHMsXG4gICAgICAgICAgICBtaW51dGVzO1xuXG4gICAgICAgIGlmIChtYXRjaGVzID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNodW5rID0gbWF0Y2hlc1ttYXRjaGVzLmxlbmd0aCAtIDFdIHx8IFtdO1xuICAgICAgICBwYXJ0cyA9IChjaHVuayArICcnKS5tYXRjaChjaHVua09mZnNldCkgfHwgWyctJywgMCwgMF07XG4gICAgICAgIG1pbnV0ZXMgPSArKHBhcnRzWzFdICogNjApICsgdG9JbnQocGFydHNbMl0pO1xuXG4gICAgICAgIHJldHVybiBtaW51dGVzID09PSAwID8gMCA6IHBhcnRzWzBdID09PSAnKycgPyBtaW51dGVzIDogLW1pbnV0ZXM7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGEgbW9tZW50IGZyb20gaW5wdXQsIHRoYXQgaXMgbG9jYWwvdXRjL3pvbmUgZXF1aXZhbGVudCB0byBtb2RlbC5cbiAgICBmdW5jdGlvbiBjbG9uZVdpdGhPZmZzZXQoaW5wdXQsIG1vZGVsKSB7XG4gICAgICAgIHZhciByZXMsIGRpZmY7XG4gICAgICAgIGlmIChtb2RlbC5faXNVVEMpIHtcbiAgICAgICAgICAgIHJlcyA9IG1vZGVsLmNsb25lKCk7XG4gICAgICAgICAgICBkaWZmID1cbiAgICAgICAgICAgICAgICAoaXNNb21lbnQoaW5wdXQpIHx8IGlzRGF0ZShpbnB1dClcbiAgICAgICAgICAgICAgICAgICAgPyBpbnB1dC52YWx1ZU9mKClcbiAgICAgICAgICAgICAgICAgICAgOiBjcmVhdGVMb2NhbChpbnB1dCkudmFsdWVPZigpKSAtIHJlcy52YWx1ZU9mKCk7XG4gICAgICAgICAgICAvLyBVc2UgbG93LWxldmVsIGFwaSwgYmVjYXVzZSB0aGlzIGZuIGlzIGxvdy1sZXZlbCBhcGkuXG4gICAgICAgICAgICByZXMuX2Quc2V0VGltZShyZXMuX2QudmFsdWVPZigpICsgZGlmZik7XG4gICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQocmVzLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsKGlucHV0KS5sb2NhbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RGF0ZU9mZnNldChtKSB7XG4gICAgICAgIC8vIE9uIEZpcmVmb3guMjQgRGF0ZSNnZXRUaW1lem9uZU9mZnNldCByZXR1cm5zIGEgZmxvYXRpbmcgcG9pbnQuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L3B1bGwvMTg3MVxuICAgICAgICByZXR1cm4gLU1hdGgucm91bmQobS5fZC5nZXRUaW1lem9uZU9mZnNldCgpKTtcbiAgICB9XG5cbiAgICAvLyBIT09LU1xuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciBhIG1vbWVudCBpcyBtdXRhdGVkLlxuICAgIC8vIEl0IGlzIGludGVuZGVkIHRvIGtlZXAgdGhlIG9mZnNldCBpbiBzeW5jIHdpdGggdGhlIHRpbWV6b25lLlxuICAgIGhvb2tzLnVwZGF0ZU9mZnNldCA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgLy8ga2VlcExvY2FsVGltZSA9IHRydWUgbWVhbnMgb25seSBjaGFuZ2UgdGhlIHRpbWV6b25lLCB3aXRob3V0XG4gICAgLy8gYWZmZWN0aW5nIHRoZSBsb2NhbCBob3VyLiBTbyA1OjMxOjI2ICswMzAwIC0tW3V0Y09mZnNldCgyLCB0cnVlKV0tLT5cbiAgICAvLyA1OjMxOjI2ICswMjAwIEl0IGlzIHBvc3NpYmxlIHRoYXQgNTozMToyNiBkb2Vzbid0IGV4aXN0IHdpdGggb2Zmc2V0XG4gICAgLy8gKzAyMDAsIHNvIHdlIGFkanVzdCB0aGUgdGltZSBhcyBuZWVkZWQsIHRvIGJlIHZhbGlkLlxuICAgIC8vXG4gICAgLy8gS2VlcGluZyB0aGUgdGltZSBhY3R1YWxseSBhZGRzL3N1YnRyYWN0cyAob25lIGhvdXIpXG4gICAgLy8gZnJvbSB0aGUgYWN0dWFsIHJlcHJlc2VudGVkIHRpbWUuIFRoYXQgaXMgd2h5IHdlIGNhbGwgdXBkYXRlT2Zmc2V0XG4gICAgLy8gYSBzZWNvbmQgdGltZS4gSW4gY2FzZSBpdCB3YW50cyB1cyB0byBjaGFuZ2UgdGhlIG9mZnNldCBhZ2FpblxuICAgIC8vIF9jaGFuZ2VJblByb2dyZXNzID09IHRydWUgY2FzZSwgdGhlbiB3ZSBoYXZlIHRvIGFkanVzdCwgYmVjYXVzZVxuICAgIC8vIHRoZXJlIGlzIG5vIHN1Y2ggdGltZSBpbiB0aGUgZ2l2ZW4gdGltZXpvbmUuXG4gICAgZnVuY3Rpb24gZ2V0U2V0T2Zmc2V0KGlucHV0LCBrZWVwTG9jYWxUaW1lLCBrZWVwTWludXRlcykge1xuICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5fb2Zmc2V0IHx8IDAsXG4gICAgICAgICAgICBsb2NhbEFkanVzdDtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgPyB0aGlzIDogTmFOO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaFNob3J0T2Zmc2V0LCBpbnB1dCk7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMoaW5wdXQpIDwgMTYgJiYgIWtlZXBNaW51dGVzKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSBpbnB1dCAqIDYwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLl9pc1VUQyAmJiBrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxBZGp1c3QgPSBnZXREYXRlT2Zmc2V0KHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fb2Zmc2V0ID0gaW5wdXQ7XG4gICAgICAgICAgICB0aGlzLl9pc1VUQyA9IHRydWU7XG4gICAgICAgICAgICBpZiAobG9jYWxBZGp1c3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkKGxvY2FsQWRqdXN0LCAnbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9mZnNldCAhPT0gaW5wdXQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWtlZXBMb2NhbFRpbWUgfHwgdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcykge1xuICAgICAgICAgICAgICAgICAgICBhZGRTdWJ0cmFjdChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVEdXJhdGlvbihpbnB1dCAtIG9mZnNldCwgJ20nKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2NoYW5nZUluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXNVVEMgPyBvZmZzZXQgOiBnZXREYXRlT2Zmc2V0KHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0Wm9uZShpbnB1dCwga2VlcExvY2FsVGltZSkge1xuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IC1pbnB1dDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoaW5wdXQsIGtlZXBMb2NhbFRpbWUpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAtdGhpcy51dGNPZmZzZXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldE9mZnNldFRvVVRDKGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXRjT2Zmc2V0KDAsIGtlZXBMb2NhbFRpbWUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldE9mZnNldFRvTG9jYWwoa2VlcExvY2FsVGltZSkge1xuICAgICAgICBpZiAodGhpcy5faXNVVEMpIHtcbiAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KDAsIGtlZXBMb2NhbFRpbWUpO1xuICAgICAgICAgICAgdGhpcy5faXNVVEMgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1YnRyYWN0KGdldERhdGVPZmZzZXQodGhpcyksICdtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0T2Zmc2V0VG9QYXJzZWRPZmZzZXQoKSB7XG4gICAgICAgIGlmICh0aGlzLl90em0gIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQodGhpcy5fdHptLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuX2kgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YXIgdFpvbmUgPSBvZmZzZXRGcm9tU3RyaW5nKG1hdGNoT2Zmc2V0LCB0aGlzLl9pKTtcbiAgICAgICAgICAgIGlmICh0Wm9uZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQodFpvbmUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgwLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYXNBbGlnbmVkSG91ck9mZnNldChpbnB1dCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaW5wdXQgPSBpbnB1dCA/IGNyZWF0ZUxvY2FsKGlucHV0KS51dGNPZmZzZXQoKSA6IDA7XG5cbiAgICAgICAgcmV0dXJuICh0aGlzLnV0Y09mZnNldCgpIC0gaW5wdXQpICUgNjAgPT09IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEYXlsaWdodFNhdmluZ1RpbWUoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgpID4gdGhpcy5jbG9uZSgpLm1vbnRoKDApLnV0Y09mZnNldCgpIHx8XG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgpID4gdGhpcy5jbG9uZSgpLm1vbnRoKDUpLnV0Y09mZnNldCgpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEYXlsaWdodFNhdmluZ1RpbWVTaGlmdGVkKCkge1xuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKHRoaXMuX2lzRFNUU2hpZnRlZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pc0RTVFNoaWZ0ZWQ7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYyA9IHt9LFxuICAgICAgICAgICAgb3RoZXI7XG5cbiAgICAgICAgY29weUNvbmZpZyhjLCB0aGlzKTtcbiAgICAgICAgYyA9IHByZXBhcmVDb25maWcoYyk7XG5cbiAgICAgICAgaWYgKGMuX2EpIHtcbiAgICAgICAgICAgIG90aGVyID0gYy5faXNVVEMgPyBjcmVhdGVVVEMoYy5fYSkgOiBjcmVhdGVMb2NhbChjLl9hKTtcbiAgICAgICAgICAgIHRoaXMuX2lzRFNUU2hpZnRlZCA9XG4gICAgICAgICAgICAgICAgdGhpcy5pc1ZhbGlkKCkgJiYgY29tcGFyZUFycmF5cyhjLl9hLCBvdGhlci50b0FycmF5KCkpID4gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2lzRFNUU2hpZnRlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRFNUU2hpZnRlZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0xvY2FsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyAhdGhpcy5faXNVVEMgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1V0Y09mZnNldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy5faXNVVEMgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1V0YygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy5faXNVVEMgJiYgdGhpcy5fb2Zmc2V0ID09PSAwIDogZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQVNQLk5FVCBqc29uIGRhdGUgZm9ybWF0IHJlZ2V4XG4gICAgdmFyIGFzcE5ldFJlZ2V4ID0gL14oLXxcXCspPyg/OihcXGQqKVsuIF0pPyhcXGQrKTooXFxkKykoPzo6KFxcZCspKFxcLlxcZCopPyk/JC8sXG4gICAgICAgIC8vIGZyb20gaHR0cDovL2RvY3MuY2xvc3VyZS1saWJyYXJ5Lmdvb2dsZWNvZGUuY29tL2dpdC9jbG9zdXJlX2dvb2dfZGF0ZV9kYXRlLmpzLnNvdXJjZS5odG1sXG4gICAgICAgIC8vIHNvbWV3aGF0IG1vcmUgaW4gbGluZSB3aXRoIDQuNC4zLjIgMjAwNCBzcGVjLCBidXQgYWxsb3dzIGRlY2ltYWwgYW55d2hlcmVcbiAgICAgICAgLy8gYW5kIGZ1cnRoZXIgbW9kaWZpZWQgdG8gYWxsb3cgZm9yIHN0cmluZ3MgY29udGFpbmluZyBib3RoIHdlZWsgYW5kIGRheVxuICAgICAgICBpc29SZWdleCA9XG4gICAgICAgICAgICAvXigtfFxcKyk/UCg/OihbLStdP1swLTksLl0qKVkpPyg/OihbLStdP1swLTksLl0qKU0pPyg/OihbLStdP1swLTksLl0qKVcpPyg/OihbLStdP1swLTksLl0qKUQpPyg/OlQoPzooWy0rXT9bMC05LC5dKilIKT8oPzooWy0rXT9bMC05LC5dKilNKT8oPzooWy0rXT9bMC05LC5dKilTKT8pPyQvO1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlRHVyYXRpb24oaW5wdXQsIGtleSkge1xuICAgICAgICB2YXIgZHVyYXRpb24gPSBpbnB1dCxcbiAgICAgICAgICAgIC8vIG1hdGNoaW5nIGFnYWluc3QgcmVnZXhwIGlzIGV4cGVuc2l2ZSwgZG8gaXQgb24gZGVtYW5kXG4gICAgICAgICAgICBtYXRjaCA9IG51bGwsXG4gICAgICAgICAgICBzaWduLFxuICAgICAgICAgICAgcmV0LFxuICAgICAgICAgICAgZGlmZlJlcztcblxuICAgICAgICBpZiAoaXNEdXJhdGlvbihpbnB1dCkpIHtcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge1xuICAgICAgICAgICAgICAgIG1zOiBpbnB1dC5fbWlsbGlzZWNvbmRzLFxuICAgICAgICAgICAgICAgIGQ6IGlucHV0Ll9kYXlzLFxuICAgICAgICAgICAgICAgIE06IGlucHV0Ll9tb250aHMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGlzTnVtYmVyKGlucHV0KSB8fCAhaXNOYU4oK2lucHV0KSkge1xuICAgICAgICAgICAgZHVyYXRpb24gPSB7fTtcbiAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbltrZXldID0gK2lucHV0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbi5taWxsaXNlY29uZHMgPSAraW5wdXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoKG1hdGNoID0gYXNwTmV0UmVnZXguZXhlYyhpbnB1dCkpKSB7XG4gICAgICAgICAgICBzaWduID0gbWF0Y2hbMV0gPT09ICctJyA/IC0xIDogMTtcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge1xuICAgICAgICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgICAgICAgZDogdG9JbnQobWF0Y2hbREFURV0pICogc2lnbixcbiAgICAgICAgICAgICAgICBoOiB0b0ludChtYXRjaFtIT1VSXSkgKiBzaWduLFxuICAgICAgICAgICAgICAgIG06IHRvSW50KG1hdGNoW01JTlVURV0pICogc2lnbixcbiAgICAgICAgICAgICAgICBzOiB0b0ludChtYXRjaFtTRUNPTkRdKSAqIHNpZ24sXG4gICAgICAgICAgICAgICAgbXM6IHRvSW50KGFic1JvdW5kKG1hdGNoW01JTExJU0VDT05EXSAqIDEwMDApKSAqIHNpZ24sIC8vIHRoZSBtaWxsaXNlY29uZCBkZWNpbWFsIHBvaW50IGlzIGluY2x1ZGVkIGluIHRoZSBtYXRjaFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmICgobWF0Y2ggPSBpc29SZWdleC5leGVjKGlucHV0KSkpIHtcbiAgICAgICAgICAgIHNpZ24gPSBtYXRjaFsxXSA9PT0gJy0nID8gLTEgOiAxO1xuICAgICAgICAgICAgZHVyYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgeTogcGFyc2VJc28obWF0Y2hbMl0sIHNpZ24pLFxuICAgICAgICAgICAgICAgIE06IHBhcnNlSXNvKG1hdGNoWzNdLCBzaWduKSxcbiAgICAgICAgICAgICAgICB3OiBwYXJzZUlzbyhtYXRjaFs0XSwgc2lnbiksXG4gICAgICAgICAgICAgICAgZDogcGFyc2VJc28obWF0Y2hbNV0sIHNpZ24pLFxuICAgICAgICAgICAgICAgIGg6IHBhcnNlSXNvKG1hdGNoWzZdLCBzaWduKSxcbiAgICAgICAgICAgICAgICBtOiBwYXJzZUlzbyhtYXRjaFs3XSwgc2lnbiksXG4gICAgICAgICAgICAgICAgczogcGFyc2VJc28obWF0Y2hbOF0sIHNpZ24pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChkdXJhdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBjaGVja3MgZm9yIG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBkdXJhdGlvbiA9IHt9O1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGR1cmF0aW9uID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgKCdmcm9tJyBpbiBkdXJhdGlvbiB8fCAndG8nIGluIGR1cmF0aW9uKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGRpZmZSZXMgPSBtb21lbnRzRGlmZmVyZW5jZShcbiAgICAgICAgICAgICAgICBjcmVhdGVMb2NhbChkdXJhdGlvbi5mcm9tKSxcbiAgICAgICAgICAgICAgICBjcmVhdGVMb2NhbChkdXJhdGlvbi50bylcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGR1cmF0aW9uID0ge307XG4gICAgICAgICAgICBkdXJhdGlvbi5tcyA9IGRpZmZSZXMubWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgZHVyYXRpb24uTSA9IGRpZmZSZXMubW9udGhzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0ID0gbmV3IER1cmF0aW9uKGR1cmF0aW9uKTtcblxuICAgICAgICBpZiAoaXNEdXJhdGlvbihpbnB1dCkgJiYgaGFzT3duUHJvcChpbnB1dCwgJ19sb2NhbGUnKSkge1xuICAgICAgICAgICAgcmV0Ll9sb2NhbGUgPSBpbnB1dC5fbG9jYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRHVyYXRpb24oaW5wdXQpICYmIGhhc093blByb3AoaW5wdXQsICdfaXNWYWxpZCcpKSB7XG4gICAgICAgICAgICByZXQuX2lzVmFsaWQgPSBpbnB1dC5faXNWYWxpZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgY3JlYXRlRHVyYXRpb24uZm4gPSBEdXJhdGlvbi5wcm90b3R5cGU7XG4gICAgY3JlYXRlRHVyYXRpb24uaW52YWxpZCA9IGNyZWF0ZUludmFsaWQkMTtcblxuICAgIGZ1bmN0aW9uIHBhcnNlSXNvKGlucCwgc2lnbikge1xuICAgICAgICAvLyBXZSdkIG5vcm1hbGx5IHVzZSB+fmlucCBmb3IgdGhpcywgYnV0IHVuZm9ydHVuYXRlbHkgaXQgYWxzb1xuICAgICAgICAvLyBjb252ZXJ0cyBmbG9hdHMgdG8gaW50cy5cbiAgICAgICAgLy8gaW5wIG1heSBiZSB1bmRlZmluZWQsIHNvIGNhcmVmdWwgY2FsbGluZyByZXBsYWNlIG9uIGl0LlxuICAgICAgICB2YXIgcmVzID0gaW5wICYmIHBhcnNlRmxvYXQoaW5wLnJlcGxhY2UoJywnLCAnLicpKTtcbiAgICAgICAgLy8gYXBwbHkgc2lnbiB3aGlsZSB3ZSdyZSBhdCBpdFxuICAgICAgICByZXR1cm4gKGlzTmFOKHJlcykgPyAwIDogcmVzKSAqIHNpZ247XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcG9zaXRpdmVNb21lbnRzRGlmZmVyZW5jZShiYXNlLCBvdGhlcikge1xuICAgICAgICB2YXIgcmVzID0ge307XG5cbiAgICAgICAgcmVzLm1vbnRocyA9XG4gICAgICAgICAgICBvdGhlci5tb250aCgpIC0gYmFzZS5tb250aCgpICsgKG90aGVyLnllYXIoKSAtIGJhc2UueWVhcigpKSAqIDEyO1xuICAgICAgICBpZiAoYmFzZS5jbG9uZSgpLmFkZChyZXMubW9udGhzLCAnTScpLmlzQWZ0ZXIob3RoZXIpKSB7XG4gICAgICAgICAgICAtLXJlcy5tb250aHM7XG4gICAgICAgIH1cblxuICAgICAgICByZXMubWlsbGlzZWNvbmRzID0gK290aGVyIC0gK2Jhc2UuY2xvbmUoKS5hZGQocmVzLm1vbnRocywgJ00nKTtcblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbWVudHNEaWZmZXJlbmNlKGJhc2UsIG90aGVyKSB7XG4gICAgICAgIHZhciByZXM7XG4gICAgICAgIGlmICghKGJhc2UuaXNWYWxpZCgpICYmIG90aGVyLmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG1pbGxpc2Vjb25kczogMCwgbW9udGhzOiAwIH07XG4gICAgICAgIH1cblxuICAgICAgICBvdGhlciA9IGNsb25lV2l0aE9mZnNldChvdGhlciwgYmFzZSk7XG4gICAgICAgIGlmIChiYXNlLmlzQmVmb3JlKG90aGVyKSkge1xuICAgICAgICAgICAgcmVzID0gcG9zaXRpdmVNb21lbnRzRGlmZmVyZW5jZShiYXNlLCBvdGhlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXMgPSBwb3NpdGl2ZU1vbWVudHNEaWZmZXJlbmNlKG90aGVyLCBiYXNlKTtcbiAgICAgICAgICAgIHJlcy5taWxsaXNlY29uZHMgPSAtcmVzLm1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgIHJlcy5tb250aHMgPSAtcmVzLm1vbnRocztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogcmVtb3ZlICduYW1lJyBhcmcgYWZ0ZXIgZGVwcmVjYXRpb24gaXMgcmVtb3ZlZFxuICAgIGZ1bmN0aW9uIGNyZWF0ZUFkZGVyKGRpcmVjdGlvbiwgbmFtZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHZhbCwgcGVyaW9kKSB7XG4gICAgICAgICAgICB2YXIgZHVyLCB0bXA7XG4gICAgICAgICAgICAvL2ludmVydCB0aGUgYXJndW1lbnRzLCBidXQgY29tcGxhaW4gYWJvdXQgaXRcbiAgICAgICAgICAgIGlmIChwZXJpb2QgIT09IG51bGwgJiYgIWlzTmFOKCtwZXJpb2QpKSB7XG4gICAgICAgICAgICAgICAgZGVwcmVjYXRlU2ltcGxlKFxuICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAnbW9tZW50KCkuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcocGVyaW9kLCBudW1iZXIpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgbW9tZW50KCkuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcobnVtYmVyLCBwZXJpb2QpLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdTZWUgaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9hZGQtaW52ZXJ0ZWQtcGFyYW0vIGZvciBtb3JlIGluZm8uJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdG1wID0gdmFsO1xuICAgICAgICAgICAgICAgIHZhbCA9IHBlcmlvZDtcbiAgICAgICAgICAgICAgICBwZXJpb2QgPSB0bXA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGR1ciA9IGNyZWF0ZUR1cmF0aW9uKHZhbCwgcGVyaW9kKTtcbiAgICAgICAgICAgIGFkZFN1YnRyYWN0KHRoaXMsIGR1ciwgZGlyZWN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFN1YnRyYWN0KG1vbSwgZHVyYXRpb24sIGlzQWRkaW5nLCB1cGRhdGVPZmZzZXQpIHtcbiAgICAgICAgdmFyIG1pbGxpc2Vjb25kcyA9IGR1cmF0aW9uLl9taWxsaXNlY29uZHMsXG4gICAgICAgICAgICBkYXlzID0gYWJzUm91bmQoZHVyYXRpb24uX2RheXMpLFxuICAgICAgICAgICAgbW9udGhzID0gYWJzUm91bmQoZHVyYXRpb24uX21vbnRocyk7XG5cbiAgICAgICAgaWYgKCFtb20uaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAvLyBObyBvcFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdXBkYXRlT2Zmc2V0ID0gdXBkYXRlT2Zmc2V0ID09IG51bGwgPyB0cnVlIDogdXBkYXRlT2Zmc2V0O1xuXG4gICAgICAgIGlmIChtb250aHMpIHtcbiAgICAgICAgICAgIHNldE1vbnRoKG1vbSwgZ2V0KG1vbSwgJ01vbnRoJykgKyBtb250aHMgKiBpc0FkZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRheXMpIHtcbiAgICAgICAgICAgIHNldCQxKG1vbSwgJ0RhdGUnLCBnZXQobW9tLCAnRGF0ZScpICsgZGF5cyAqIGlzQWRkaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWlsbGlzZWNvbmRzKSB7XG4gICAgICAgICAgICBtb20uX2Quc2V0VGltZShtb20uX2QudmFsdWVPZigpICsgbWlsbGlzZWNvbmRzICogaXNBZGRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVPZmZzZXQpIHtcbiAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldChtb20sIGRheXMgfHwgbW9udGhzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBhZGQgPSBjcmVhdGVBZGRlcigxLCAnYWRkJyksXG4gICAgICAgIHN1YnRyYWN0ID0gY3JlYXRlQWRkZXIoLTEsICdzdWJ0cmFjdCcpO1xuXG4gICAgZnVuY3Rpb24gaXNTdHJpbmcoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgfHwgaW5wdXQgaW5zdGFuY2VvZiBTdHJpbmc7XG4gICAgfVxuXG4gICAgLy8gdHlwZSBNb21lbnRJbnB1dCA9IE1vbWVudCB8IERhdGUgfCBzdHJpbmcgfCBudW1iZXIgfCAobnVtYmVyIHwgc3RyaW5nKVtdIHwgTW9tZW50SW5wdXRPYmplY3QgfCB2b2lkOyAvLyBudWxsIHwgdW5kZWZpbmVkXG4gICAgZnVuY3Rpb24gaXNNb21lbnRJbnB1dChpbnB1dCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgaXNNb21lbnQoaW5wdXQpIHx8XG4gICAgICAgICAgICBpc0RhdGUoaW5wdXQpIHx8XG4gICAgICAgICAgICBpc1N0cmluZyhpbnB1dCkgfHxcbiAgICAgICAgICAgIGlzTnVtYmVyKGlucHV0KSB8fFxuICAgICAgICAgICAgaXNOdW1iZXJPclN0cmluZ0FycmF5KGlucHV0KSB8fFxuICAgICAgICAgICAgaXNNb21lbnRJbnB1dE9iamVjdChpbnB1dCkgfHxcbiAgICAgICAgICAgIGlucHV0ID09PSBudWxsIHx8XG4gICAgICAgICAgICBpbnB1dCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNNb21lbnRJbnB1dE9iamVjdChpbnB1dCkge1xuICAgICAgICB2YXIgb2JqZWN0VGVzdCA9IGlzT2JqZWN0KGlucHV0KSAmJiAhaXNPYmplY3RFbXB0eShpbnB1dCksXG4gICAgICAgICAgICBwcm9wZXJ0eVRlc3QgPSBmYWxzZSxcbiAgICAgICAgICAgIHByb3BlcnRpZXMgPSBbXG4gICAgICAgICAgICAgICAgJ3llYXJzJyxcbiAgICAgICAgICAgICAgICAneWVhcicsXG4gICAgICAgICAgICAgICAgJ3knLFxuICAgICAgICAgICAgICAgICdtb250aHMnLFxuICAgICAgICAgICAgICAgICdtb250aCcsXG4gICAgICAgICAgICAgICAgJ00nLFxuICAgICAgICAgICAgICAgICdkYXlzJyxcbiAgICAgICAgICAgICAgICAnZGF5JyxcbiAgICAgICAgICAgICAgICAnZCcsXG4gICAgICAgICAgICAgICAgJ2RhdGVzJyxcbiAgICAgICAgICAgICAgICAnZGF0ZScsXG4gICAgICAgICAgICAgICAgJ0QnLFxuICAgICAgICAgICAgICAgICdob3VycycsXG4gICAgICAgICAgICAgICAgJ2hvdXInLFxuICAgICAgICAgICAgICAgICdoJyxcbiAgICAgICAgICAgICAgICAnbWludXRlcycsXG4gICAgICAgICAgICAgICAgJ21pbnV0ZScsXG4gICAgICAgICAgICAgICAgJ20nLFxuICAgICAgICAgICAgICAgICdzZWNvbmRzJyxcbiAgICAgICAgICAgICAgICAnc2Vjb25kJyxcbiAgICAgICAgICAgICAgICAncycsXG4gICAgICAgICAgICAgICAgJ21pbGxpc2Vjb25kcycsXG4gICAgICAgICAgICAgICAgJ21pbGxpc2Vjb25kJyxcbiAgICAgICAgICAgICAgICAnbXMnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgIHByb3BlcnR5TGVuID0gcHJvcGVydGllcy5sZW5ndGg7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHByb3BlcnR5TGVuOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHByb3BlcnR5ID0gcHJvcGVydGllc1tpXTtcbiAgICAgICAgICAgIHByb3BlcnR5VGVzdCA9IHByb3BlcnR5VGVzdCB8fCBoYXNPd25Qcm9wKGlucHV0LCBwcm9wZXJ0eSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb2JqZWN0VGVzdCAmJiBwcm9wZXJ0eVRlc3Q7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNOdW1iZXJPclN0cmluZ0FycmF5KGlucHV0KSB7XG4gICAgICAgIHZhciBhcnJheVRlc3QgPSBpc0FycmF5KGlucHV0KSxcbiAgICAgICAgICAgIGRhdGFUeXBlVGVzdCA9IGZhbHNlO1xuICAgICAgICBpZiAoYXJyYXlUZXN0KSB7XG4gICAgICAgICAgICBkYXRhVHlwZVRlc3QgPVxuICAgICAgICAgICAgICAgIGlucHV0LmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWlzTnVtYmVyKGl0ZW0pICYmIGlzU3RyaW5nKGlucHV0KTtcbiAgICAgICAgICAgICAgICB9KS5sZW5ndGggPT09IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycmF5VGVzdCAmJiBkYXRhVHlwZVRlc3Q7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNDYWxlbmRhclNwZWMoaW5wdXQpIHtcbiAgICAgICAgdmFyIG9iamVjdFRlc3QgPSBpc09iamVjdChpbnB1dCkgJiYgIWlzT2JqZWN0RW1wdHkoaW5wdXQpLFxuICAgICAgICAgICAgcHJvcGVydHlUZXN0ID0gZmFsc2UsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzID0gW1xuICAgICAgICAgICAgICAgICdzYW1lRGF5JyxcbiAgICAgICAgICAgICAgICAnbmV4dERheScsXG4gICAgICAgICAgICAgICAgJ2xhc3REYXknLFxuICAgICAgICAgICAgICAgICduZXh0V2VlaycsXG4gICAgICAgICAgICAgICAgJ2xhc3RXZWVrJyxcbiAgICAgICAgICAgICAgICAnc2FtZUVsc2UnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBwcm9wZXJ0eTtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0aWVzW2ldO1xuICAgICAgICAgICAgcHJvcGVydHlUZXN0ID0gcHJvcGVydHlUZXN0IHx8IGhhc093blByb3AoaW5wdXQsIHByb3BlcnR5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvYmplY3RUZXN0ICYmIHByb3BlcnR5VGVzdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRDYWxlbmRhckZvcm1hdChteU1vbWVudCwgbm93KSB7XG4gICAgICAgIHZhciBkaWZmID0gbXlNb21lbnQuZGlmZihub3csICdkYXlzJywgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBkaWZmIDwgLTZcbiAgICAgICAgICAgID8gJ3NhbWVFbHNlJ1xuICAgICAgICAgICAgOiBkaWZmIDwgLTFcbiAgICAgICAgICAgICAgPyAnbGFzdFdlZWsnXG4gICAgICAgICAgICAgIDogZGlmZiA8IDBcbiAgICAgICAgICAgICAgICA/ICdsYXN0RGF5J1xuICAgICAgICAgICAgICAgIDogZGlmZiA8IDFcbiAgICAgICAgICAgICAgICAgID8gJ3NhbWVEYXknXG4gICAgICAgICAgICAgICAgICA6IGRpZmYgPCAyXG4gICAgICAgICAgICAgICAgICAgID8gJ25leHREYXknXG4gICAgICAgICAgICAgICAgICAgIDogZGlmZiA8IDdcbiAgICAgICAgICAgICAgICAgICAgICA/ICduZXh0V2VlaydcbiAgICAgICAgICAgICAgICAgICAgICA6ICdzYW1lRWxzZSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FsZW5kYXIkMSh0aW1lLCBmb3JtYXRzKSB7XG4gICAgICAgIC8vIFN1cHBvcnQgZm9yIHNpbmdsZSBwYXJhbWV0ZXIsIGZvcm1hdHMgb25seSBvdmVybG9hZCB0byB0aGUgY2FsZW5kYXIgZnVuY3Rpb25cbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGlmICghYXJndW1lbnRzWzBdKSB7XG4gICAgICAgICAgICAgICAgdGltZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBmb3JtYXRzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc01vbWVudElucHV0KGFyZ3VtZW50c1swXSkpIHtcbiAgICAgICAgICAgICAgICB0aW1lID0gYXJndW1lbnRzWzBdO1xuICAgICAgICAgICAgICAgIGZvcm1hdHMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzQ2FsZW5kYXJTcGVjKGFyZ3VtZW50c1swXSkpIHtcbiAgICAgICAgICAgICAgICBmb3JtYXRzID0gYXJndW1lbnRzWzBdO1xuICAgICAgICAgICAgICAgIHRpbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2Ugd2FudCB0byBjb21wYXJlIHRoZSBzdGFydCBvZiB0b2RheSwgdnMgdGhpcy5cbiAgICAgICAgLy8gR2V0dGluZyBzdGFydC1vZi10b2RheSBkZXBlbmRzIG9uIHdoZXRoZXIgd2UncmUgbG9jYWwvdXRjL29mZnNldCBvciBub3QuXG4gICAgICAgIHZhciBub3cgPSB0aW1lIHx8IGNyZWF0ZUxvY2FsKCksXG4gICAgICAgICAgICBzb2QgPSBjbG9uZVdpdGhPZmZzZXQobm93LCB0aGlzKS5zdGFydE9mKCdkYXknKSxcbiAgICAgICAgICAgIGZvcm1hdCA9IGhvb2tzLmNhbGVuZGFyRm9ybWF0KHRoaXMsIHNvZCkgfHwgJ3NhbWVFbHNlJyxcbiAgICAgICAgICAgIG91dHB1dCA9XG4gICAgICAgICAgICAgICAgZm9ybWF0cyAmJlxuICAgICAgICAgICAgICAgIChpc0Z1bmN0aW9uKGZvcm1hdHNbZm9ybWF0XSlcbiAgICAgICAgICAgICAgICAgICAgPyBmb3JtYXRzW2Zvcm1hdF0uY2FsbCh0aGlzLCBub3cpXG4gICAgICAgICAgICAgICAgICAgIDogZm9ybWF0c1tmb3JtYXRdKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXQoXG4gICAgICAgICAgICBvdXRwdXQgfHwgdGhpcy5sb2NhbGVEYXRhKCkuY2FsZW5kYXIoZm9ybWF0LCB0aGlzLCBjcmVhdGVMb2NhbChub3cpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsb25lKCkge1xuICAgICAgICByZXR1cm4gbmV3IE1vbWVudCh0aGlzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0FmdGVyKGlucHV0LCB1bml0cykge1xuICAgICAgICB2YXIgbG9jYWxJbnB1dCA9IGlzTW9tZW50KGlucHV0KSA/IGlucHV0IDogY3JlYXRlTG9jYWwoaW5wdXQpO1xuICAgICAgICBpZiAoISh0aGlzLmlzVmFsaWQoKSAmJiBsb2NhbElucHV0LmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKSB8fCAnbWlsbGlzZWNvbmQnO1xuICAgICAgICBpZiAodW5pdHMgPT09ICdtaWxsaXNlY29uZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlT2YoKSA+IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsSW5wdXQudmFsdWVPZigpIDwgdGhpcy5jbG9uZSgpLnN0YXJ0T2YodW5pdHMpLnZhbHVlT2YoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQmVmb3JlKGlucHV0LCB1bml0cykge1xuICAgICAgICB2YXIgbG9jYWxJbnB1dCA9IGlzTW9tZW50KGlucHV0KSA/IGlucHV0IDogY3JlYXRlTG9jYWwoaW5wdXQpO1xuICAgICAgICBpZiAoISh0aGlzLmlzVmFsaWQoKSAmJiBsb2NhbElucHV0LmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKSB8fCAnbWlsbGlzZWNvbmQnO1xuICAgICAgICBpZiAodW5pdHMgPT09ICdtaWxsaXNlY29uZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlT2YoKSA8IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5lbmRPZih1bml0cykudmFsdWVPZigpIDwgbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0JldHdlZW4oZnJvbSwgdG8sIHVuaXRzLCBpbmNsdXNpdml0eSkge1xuICAgICAgICB2YXIgbG9jYWxGcm9tID0gaXNNb21lbnQoZnJvbSkgPyBmcm9tIDogY3JlYXRlTG9jYWwoZnJvbSksXG4gICAgICAgICAgICBsb2NhbFRvID0gaXNNb21lbnQodG8pID8gdG8gOiBjcmVhdGVMb2NhbCh0byk7XG4gICAgICAgIGlmICghKHRoaXMuaXNWYWxpZCgpICYmIGxvY2FsRnJvbS5pc1ZhbGlkKCkgJiYgbG9jYWxUby5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaW5jbHVzaXZpdHkgPSBpbmNsdXNpdml0eSB8fCAnKCknO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKGluY2x1c2l2aXR5WzBdID09PSAnKCdcbiAgICAgICAgICAgICAgICA/IHRoaXMuaXNBZnRlcihsb2NhbEZyb20sIHVuaXRzKVxuICAgICAgICAgICAgICAgIDogIXRoaXMuaXNCZWZvcmUobG9jYWxGcm9tLCB1bml0cykpICYmXG4gICAgICAgICAgICAoaW5jbHVzaXZpdHlbMV0gPT09ICcpJ1xuICAgICAgICAgICAgICAgID8gdGhpcy5pc0JlZm9yZShsb2NhbFRvLCB1bml0cylcbiAgICAgICAgICAgICAgICA6ICF0aGlzLmlzQWZ0ZXIobG9jYWxUbywgdW5pdHMpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzU2FtZShpbnB1dCwgdW5pdHMpIHtcbiAgICAgICAgdmFyIGxvY2FsSW5wdXQgPSBpc01vbWVudChpbnB1dCkgPyBpbnB1dCA6IGNyZWF0ZUxvY2FsKGlucHV0KSxcbiAgICAgICAgICAgIGlucHV0TXM7XG4gICAgICAgIGlmICghKHRoaXMuaXNWYWxpZCgpICYmIGxvY2FsSW5wdXQuaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpIHx8ICdtaWxsaXNlY29uZCc7XG4gICAgICAgIGlmICh1bml0cyA9PT0gJ21pbGxpc2Vjb25kJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpID09PSBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlucHV0TXMgPSBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgdGhpcy5jbG9uZSgpLnN0YXJ0T2YodW5pdHMpLnZhbHVlT2YoKSA8PSBpbnB1dE1zICYmXG4gICAgICAgICAgICAgICAgaW5wdXRNcyA8PSB0aGlzLmNsb25lKCkuZW5kT2YodW5pdHMpLnZhbHVlT2YoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzU2FtZU9yQWZ0ZXIoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2FtZShpbnB1dCwgdW5pdHMpIHx8IHRoaXMuaXNBZnRlcihpbnB1dCwgdW5pdHMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzU2FtZU9yQmVmb3JlKGlucHV0LCB1bml0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1NhbWUoaW5wdXQsIHVuaXRzKSB8fCB0aGlzLmlzQmVmb3JlKGlucHV0LCB1bml0cyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGlmZihpbnB1dCwgdW5pdHMsIGFzRmxvYXQpIHtcbiAgICAgICAgdmFyIHRoYXQsIHpvbmVEZWx0YSwgb3V0cHV0O1xuXG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICB0aGF0ID0gY2xvbmVXaXRoT2Zmc2V0KGlucHV0LCB0aGlzKTtcblxuICAgICAgICBpZiAoIXRoYXQuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG5cbiAgICAgICAgem9uZURlbHRhID0gKHRoYXQudXRjT2Zmc2V0KCkgLSB0aGlzLnV0Y09mZnNldCgpKSAqIDZlNDtcblxuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcblxuICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBtb250aERpZmYodGhpcywgdGhhdCkgLyAxMjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBtb250aERpZmYodGhpcywgdGhhdCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBtb250aERpZmYodGhpcywgdGhhdCkgLyAzO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAodGhpcyAtIHRoYXQpIC8gMWUzO1xuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyAxMDAwXG4gICAgICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICAgICAgICAgIG91dHB1dCA9ICh0aGlzIC0gdGhhdCkgLyA2ZTQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIDEwMDAgKiA2MFxuICAgICAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gKHRoaXMgLSB0aGF0KSAvIDM2ZTU7XG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIDEwMDAgKiA2MCAqIDYwXG4gICAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgICAgIG91dHB1dCA9ICh0aGlzIC0gdGhhdCAtIHpvbmVEZWx0YSkgLyA4NjRlNTtcbiAgICAgICAgICAgICAgICBicmVhazsgLy8gMTAwMCAqIDYwICogNjAgKiAyNCwgbmVnYXRlIGRzdFxuICAgICAgICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gKHRoaXMgLSB0aGF0IC0gem9uZURlbHRhKSAvIDYwNDhlNTtcbiAgICAgICAgICAgICAgICBicmVhazsgLy8gMTAwMCAqIDYwICogNjAgKiAyNCAqIDcsIG5lZ2F0ZSBkc3RcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gdGhpcyAtIHRoYXQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXNGbG9hdCA/IG91dHB1dCA6IGFic0Zsb29yKG91dHB1dCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9udGhEaWZmKGEsIGIpIHtcbiAgICAgICAgaWYgKGEuZGF0ZSgpIDwgYi5kYXRlKCkpIHtcbiAgICAgICAgICAgIC8vIGVuZC1vZi1tb250aCBjYWxjdWxhdGlvbnMgd29yayBjb3JyZWN0IHdoZW4gdGhlIHN0YXJ0IG1vbnRoIGhhcyBtb3JlXG4gICAgICAgICAgICAvLyBkYXlzIHRoYW4gdGhlIGVuZCBtb250aC5cbiAgICAgICAgICAgIHJldHVybiAtbW9udGhEaWZmKGIsIGEpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRpZmZlcmVuY2UgaW4gbW9udGhzXG4gICAgICAgIHZhciB3aG9sZU1vbnRoRGlmZiA9IChiLnllYXIoKSAtIGEueWVhcigpKSAqIDEyICsgKGIubW9udGgoKSAtIGEubW9udGgoKSksXG4gICAgICAgICAgICAvLyBiIGlzIGluIChhbmNob3IgLSAxIG1vbnRoLCBhbmNob3IgKyAxIG1vbnRoKVxuICAgICAgICAgICAgYW5jaG9yID0gYS5jbG9uZSgpLmFkZCh3aG9sZU1vbnRoRGlmZiwgJ21vbnRocycpLFxuICAgICAgICAgICAgYW5jaG9yMixcbiAgICAgICAgICAgIGFkanVzdDtcblxuICAgICAgICBpZiAoYiAtIGFuY2hvciA8IDApIHtcbiAgICAgICAgICAgIGFuY2hvcjIgPSBhLmNsb25lKCkuYWRkKHdob2xlTW9udGhEaWZmIC0gMSwgJ21vbnRocycpO1xuICAgICAgICAgICAgLy8gbGluZWFyIGFjcm9zcyB0aGUgbW9udGhcbiAgICAgICAgICAgIGFkanVzdCA9IChiIC0gYW5jaG9yKSAvIChhbmNob3IgLSBhbmNob3IyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFuY2hvcjIgPSBhLmNsb25lKCkuYWRkKHdob2xlTW9udGhEaWZmICsgMSwgJ21vbnRocycpO1xuICAgICAgICAgICAgLy8gbGluZWFyIGFjcm9zcyB0aGUgbW9udGhcbiAgICAgICAgICAgIGFkanVzdCA9IChiIC0gYW5jaG9yKSAvIChhbmNob3IyIC0gYW5jaG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY2hlY2sgZm9yIG5lZ2F0aXZlIHplcm8sIHJldHVybiB6ZXJvIGlmIG5lZ2F0aXZlIHplcm9cbiAgICAgICAgcmV0dXJuIC0od2hvbGVNb250aERpZmYgKyBhZGp1c3QpIHx8IDA7XG4gICAgfVxuXG4gICAgaG9va3MuZGVmYXVsdEZvcm1hdCA9ICdZWVlZLU1NLUREVEhIOm1tOnNzWic7XG4gICAgaG9va3MuZGVmYXVsdEZvcm1hdFV0YyA9ICdZWVlZLU1NLUREVEhIOm1tOnNzW1pdJztcblxuICAgIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmxvY2FsZSgnZW4nKS5mb3JtYXQoJ2RkZCBNTU0gREQgWVlZWSBISDptbTpzcyBbR01UXVpaJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9JU09TdHJpbmcoa2VlcE9mZnNldCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdXRjID0ga2VlcE9mZnNldCAhPT0gdHJ1ZSxcbiAgICAgICAgICAgIG0gPSB1dGMgPyB0aGlzLmNsb25lKCkudXRjKCkgOiB0aGlzO1xuICAgICAgICBpZiAobS55ZWFyKCkgPCAwIHx8IG0ueWVhcigpID4gOTk5OSkge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdE1vbWVudChcbiAgICAgICAgICAgICAgICBtLFxuICAgICAgICAgICAgICAgIHV0Y1xuICAgICAgICAgICAgICAgICAgICA/ICdZWVlZWVktTU0tRERbVF1ISDptbTpzcy5TU1NbWl0nXG4gICAgICAgICAgICAgICAgICAgIDogJ1lZWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1onXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nKSkge1xuICAgICAgICAgICAgLy8gbmF0aXZlIGltcGxlbWVudGF0aW9uIGlzIH41MHggZmFzdGVyLCB1c2UgaXQgd2hlbiB3ZSBjYW5cbiAgICAgICAgICAgIGlmICh1dGMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50b0RhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUodGhpcy52YWx1ZU9mKCkgKyB0aGlzLnV0Y09mZnNldCgpICogNjAgKiAxMDAwKVxuICAgICAgICAgICAgICAgICAgICAudG9JU09TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgnWicsIGZvcm1hdE1vbWVudChtLCAnWicpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9ybWF0TW9tZW50KFxuICAgICAgICAgICAgbSxcbiAgICAgICAgICAgIHV0YyA/ICdZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTW1pdJyA6ICdZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTWidcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBodW1hbiByZWFkYWJsZSByZXByZXNlbnRhdGlvbiBvZiBhIG1vbWVudCB0aGF0IGNhblxuICAgICAqIGFsc28gYmUgZXZhbHVhdGVkIHRvIGdldCBhIG5ldyBtb21lbnQgd2hpY2ggaXMgdGhlIHNhbWVcbiAgICAgKlxuICAgICAqIEBsaW5rIGh0dHBzOi8vbm9kZWpzLm9yZy9kaXN0L2xhdGVzdC9kb2NzL2FwaS91dGlsLmh0bWwjdXRpbF9jdXN0b21faW5zcGVjdF9mdW5jdGlvbl9vbl9vYmplY3RzXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuICdtb21lbnQuaW52YWxpZCgvKiAnICsgdGhpcy5faSArICcgKi8pJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgZnVuYyA9ICdtb21lbnQnLFxuICAgICAgICAgICAgem9uZSA9ICcnLFxuICAgICAgICAgICAgcHJlZml4LFxuICAgICAgICAgICAgeWVhcixcbiAgICAgICAgICAgIGRhdGV0aW1lLFxuICAgICAgICAgICAgc3VmZml4O1xuICAgICAgICBpZiAoIXRoaXMuaXNMb2NhbCgpKSB7XG4gICAgICAgICAgICBmdW5jID0gdGhpcy51dGNPZmZzZXQoKSA9PT0gMCA/ICdtb21lbnQudXRjJyA6ICdtb21lbnQucGFyc2Vab25lJztcbiAgICAgICAgICAgIHpvbmUgPSAnWic7XG4gICAgICAgIH1cbiAgICAgICAgcHJlZml4ID0gJ1snICsgZnVuYyArICcoXCJdJztcbiAgICAgICAgeWVhciA9IDAgPD0gdGhpcy55ZWFyKCkgJiYgdGhpcy55ZWFyKCkgPD0gOTk5OSA/ICdZWVlZJyA6ICdZWVlZWVknO1xuICAgICAgICBkYXRldGltZSA9ICctTU0tRERbVF1ISDptbTpzcy5TU1MnO1xuICAgICAgICBzdWZmaXggPSB6b25lICsgJ1tcIildJztcblxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXQocHJlZml4ICsgeWVhciArIGRhdGV0aW1lICsgc3VmZml4KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmb3JtYXQoaW5wdXRTdHJpbmcpIHtcbiAgICAgICAgaWYgKCFpbnB1dFN0cmluZykge1xuICAgICAgICAgICAgaW5wdXRTdHJpbmcgPSB0aGlzLmlzVXRjKClcbiAgICAgICAgICAgICAgICA/IGhvb2tzLmRlZmF1bHRGb3JtYXRVdGNcbiAgICAgICAgICAgICAgICA6IGhvb2tzLmRlZmF1bHRGb3JtYXQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG91dHB1dCA9IGZvcm1hdE1vbWVudCh0aGlzLCBpbnB1dFN0cmluZyk7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5wb3N0Zm9ybWF0KG91dHB1dCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZnJvbSh0aW1lLCB3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuaXNWYWxpZCgpICYmXG4gICAgICAgICAgICAoKGlzTW9tZW50KHRpbWUpICYmIHRpbWUuaXNWYWxpZCgpKSB8fCBjcmVhdGVMb2NhbCh0aW1lKS5pc1ZhbGlkKCkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKHsgdG86IHRoaXMsIGZyb206IHRpbWUgfSlcbiAgICAgICAgICAgICAgICAubG9jYWxlKHRoaXMubG9jYWxlKCkpXG4gICAgICAgICAgICAgICAgLmh1bWFuaXplKCF3aXRob3V0U3VmZml4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZnJvbU5vdyh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZyb20oY3JlYXRlTG9jYWwoKSwgd2l0aG91dFN1ZmZpeCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG8odGltZSwgd2l0aG91dFN1ZmZpeCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmlzVmFsaWQoKSAmJlxuICAgICAgICAgICAgKChpc01vbWVudCh0aW1lKSAmJiB0aW1lLmlzVmFsaWQoKSkgfHwgY3JlYXRlTG9jYWwodGltZSkuaXNWYWxpZCgpKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbih7IGZyb206IHRoaXMsIHRvOiB0aW1lIH0pXG4gICAgICAgICAgICAgICAgLmxvY2FsZSh0aGlzLmxvY2FsZSgpKVxuICAgICAgICAgICAgICAgIC5odW1hbml6ZSghd2l0aG91dFN1ZmZpeCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvTm93KHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG8oY3JlYXRlTG9jYWwoKSwgd2l0aG91dFN1ZmZpeCk7XG4gICAgfVxuXG4gICAgLy8gSWYgcGFzc2VkIGEgbG9jYWxlIGtleSwgaXQgd2lsbCBzZXQgdGhlIGxvY2FsZSBmb3IgdGhpc1xuICAgIC8vIGluc3RhbmNlLiAgT3RoZXJ3aXNlLCBpdCB3aWxsIHJldHVybiB0aGUgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbiAgICAvLyB2YXJpYWJsZXMgZm9yIHRoaXMgaW5zdGFuY2UuXG4gICAgZnVuY3Rpb24gbG9jYWxlKGtleSkge1xuICAgICAgICB2YXIgbmV3TG9jYWxlRGF0YTtcblxuICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGUuX2FiYnI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdMb2NhbGVEYXRhID0gZ2V0TG9jYWxlKGtleSk7XG4gICAgICAgICAgICBpZiAobmV3TG9jYWxlRGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9jYWxlID0gbmV3TG9jYWxlRGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGxhbmcgPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQoKS5sYW5nKCkgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCwgdXNlIG1vbWVudCgpLmxvY2FsZURhdGEoKSB0byBnZXQgdGhlIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb24uIFVzZSBtb21lbnQoKS5sb2NhbGUoKSB0byBjaGFuZ2UgbGFuZ3VhZ2VzLicsXG4gICAgICAgIGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZTtcbiAgICB9XG5cbiAgICB2YXIgTVNfUEVSX1NFQ09ORCA9IDEwMDAsXG4gICAgICAgIE1TX1BFUl9NSU5VVEUgPSA2MCAqIE1TX1BFUl9TRUNPTkQsXG4gICAgICAgIE1TX1BFUl9IT1VSID0gNjAgKiBNU19QRVJfTUlOVVRFLFxuICAgICAgICBNU19QRVJfNDAwX1lFQVJTID0gKDM2NSAqIDQwMCArIDk3KSAqIDI0ICogTVNfUEVSX0hPVVI7XG5cbiAgICAvLyBhY3R1YWwgbW9kdWxvIC0gaGFuZGxlcyBuZWdhdGl2ZSBudW1iZXJzIChmb3IgZGF0ZXMgYmVmb3JlIDE5NzApOlxuICAgIGZ1bmN0aW9uIG1vZCQxKGRpdmlkZW5kLCBkaXZpc29yKSB7XG4gICAgICAgIHJldHVybiAoKGRpdmlkZW5kICUgZGl2aXNvcikgKyBkaXZpc29yKSAlIGRpdmlzb3I7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxTdGFydE9mRGF0ZSh5LCBtLCBkKSB7XG4gICAgICAgIC8vIHRoZSBkYXRlIGNvbnN0cnVjdG9yIHJlbWFwcyB5ZWFycyAwLTk5IHRvIDE5MDAtMTk5OVxuICAgICAgICBpZiAoeSA8IDEwMCAmJiB5ID49IDApIHtcbiAgICAgICAgICAgIC8vIHByZXNlcnZlIGxlYXAgeWVhcnMgdXNpbmcgYSBmdWxsIDQwMCB5ZWFyIGN5Y2xlLCB0aGVuIHJlc2V0XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoeSArIDQwMCwgbSwgZCkgLSBNU19QRVJfNDAwX1lFQVJTO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHksIG0sIGQpLnZhbHVlT2YoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHV0Y1N0YXJ0T2ZEYXRlKHksIG0sIGQpIHtcbiAgICAgICAgLy8gRGF0ZS5VVEMgcmVtYXBzIHllYXJzIDAtOTkgdG8gMTkwMC0xOTk5XG4gICAgICAgIGlmICh5IDwgMTAwICYmIHkgPj0gMCkge1xuICAgICAgICAgICAgLy8gcHJlc2VydmUgbGVhcCB5ZWFycyB1c2luZyBhIGZ1bGwgNDAwIHllYXIgY3ljbGUsIHRoZW4gcmVzZXRcbiAgICAgICAgICAgIHJldHVybiBEYXRlLlVUQyh5ICsgNDAwLCBtLCBkKSAtIE1TX1BFUl80MDBfWUVBUlM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gRGF0ZS5VVEMoeSwgbSwgZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdGFydE9mKHVuaXRzKSB7XG4gICAgICAgIHZhciB0aW1lLCBzdGFydE9mRGF0ZTtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIGlmICh1bml0cyA9PT0gdW5kZWZpbmVkIHx8IHVuaXRzID09PSAnbWlsbGlzZWNvbmQnIHx8ICF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBzdGFydE9mRGF0ZSA9IHRoaXMuX2lzVVRDID8gdXRjU3RhcnRPZkRhdGUgOiBsb2NhbFN0YXJ0T2ZEYXRlO1xuXG4gICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgMCwgMSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMueWVhcigpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vbnRoKCkgLSAodGhpcy5tb250aCgpICUgMyksXG4gICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpLCAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy55ZWFyKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9udGgoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlKCkgLSB0aGlzLndlZWtkYXkoKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdpc29XZWVrJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMueWVhcigpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vbnRoKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZSgpIC0gKHRoaXMuaXNvV2Vla2RheSgpIC0gMSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpLCB0aGlzLmRhdGUoKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdob3VyJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gdGhpcy5fZC52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgdGltZSAtPSBtb2QkMShcbiAgICAgICAgICAgICAgICAgICAgdGltZSArICh0aGlzLl9pc1VUQyA/IDAgOiB0aGlzLnV0Y09mZnNldCgpICogTVNfUEVSX01JTlVURSksXG4gICAgICAgICAgICAgICAgICAgIE1TX1BFUl9IT1VSXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHRoaXMuX2QudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgIHRpbWUgLT0gbW9kJDEodGltZSwgTVNfUEVSX01JTlVURSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9kLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICB0aW1lIC09IG1vZCQxKHRpbWUsIE1TX1BFUl9TRUNPTkQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZC5zZXRUaW1lKHRpbWUpO1xuICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVuZE9mKHVuaXRzKSB7XG4gICAgICAgIHZhciB0aW1lLCBzdGFydE9mRGF0ZTtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIGlmICh1bml0cyA9PT0gdW5kZWZpbmVkIHx8IHVuaXRzID09PSAnbWlsbGlzZWNvbmQnIHx8ICF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBzdGFydE9mRGF0ZSA9IHRoaXMuX2lzVVRDID8gdXRjU3RhcnRPZkRhdGUgOiBsb2NhbFN0YXJ0T2ZEYXRlO1xuXG4gICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSArIDEsIDAsIDEpIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgICAgICAgICAgIHRpbWUgPVxuICAgICAgICAgICAgICAgICAgICBzdGFydE9mRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueWVhcigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb250aCgpIC0gKHRoaXMubW9udGgoKSAlIDMpICsgMyxcbiAgICAgICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICAgICAgKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKHRoaXMueWVhcigpLCB0aGlzLm1vbnRoKCkgKyAxLCAxKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgICAgICAgICB0aW1lID1cbiAgICAgICAgICAgICAgICAgICAgc3RhcnRPZkRhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnllYXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9udGgoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZSgpIC0gdGhpcy53ZWVrZGF5KCkgKyA3XG4gICAgICAgICAgICAgICAgICAgICkgLSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaXNvV2Vlayc6XG4gICAgICAgICAgICAgICAgdGltZSA9XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0T2ZEYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy55ZWFyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vbnRoKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGUoKSAtICh0aGlzLmlzb1dlZWtkYXkoKSAtIDEpICsgN1xuICAgICAgICAgICAgICAgICAgICApIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUodGhpcy55ZWFyKCksIHRoaXMubW9udGgoKSwgdGhpcy5kYXRlKCkgKyAxKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdob3VyJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gdGhpcy5fZC52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgdGltZSArPVxuICAgICAgICAgICAgICAgICAgICBNU19QRVJfSE9VUiAtXG4gICAgICAgICAgICAgICAgICAgIG1vZCQxKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGltZSArICh0aGlzLl9pc1VUQyA/IDAgOiB0aGlzLnV0Y09mZnNldCgpICogTVNfUEVSX01JTlVURSksXG4gICAgICAgICAgICAgICAgICAgICAgICBNU19QRVJfSE9VUlxuICAgICAgICAgICAgICAgICAgICApIC1cbiAgICAgICAgICAgICAgICAgICAgMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHRoaXMuX2QudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgIHRpbWUgKz0gTVNfUEVSX01JTlVURSAtIG1vZCQxKHRpbWUsIE1TX1BFUl9NSU5VVEUpIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHRoaXMuX2QudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgIHRpbWUgKz0gTVNfUEVSX1NFQ09ORCAtIG1vZCQxKHRpbWUsIE1TX1BFUl9TRUNPTkQpIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2Quc2V0VGltZSh0aW1lKTtcbiAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHRoaXMsIHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWx1ZU9mKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZC52YWx1ZU9mKCkgLSAodGhpcy5fb2Zmc2V0IHx8IDApICogNjAwMDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdW5peCgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IodGhpcy52YWx1ZU9mKCkgLyAxMDAwKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0RhdGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9BcnJheSgpIHtcbiAgICAgICAgdmFyIG0gPSB0aGlzO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgbS55ZWFyKCksXG4gICAgICAgICAgICBtLm1vbnRoKCksXG4gICAgICAgICAgICBtLmRhdGUoKSxcbiAgICAgICAgICAgIG0uaG91cigpLFxuICAgICAgICAgICAgbS5taW51dGUoKSxcbiAgICAgICAgICAgIG0uc2Vjb25kKCksXG4gICAgICAgICAgICBtLm1pbGxpc2Vjb25kKCksXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9PYmplY3QoKSB7XG4gICAgICAgIHZhciBtID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHllYXJzOiBtLnllYXIoKSxcbiAgICAgICAgICAgIG1vbnRoczogbS5tb250aCgpLFxuICAgICAgICAgICAgZGF0ZTogbS5kYXRlKCksXG4gICAgICAgICAgICBob3VyczogbS5ob3VycygpLFxuICAgICAgICAgICAgbWludXRlczogbS5taW51dGVzKCksXG4gICAgICAgICAgICBzZWNvbmRzOiBtLnNlY29uZHMoKSxcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kczogbS5taWxsaXNlY29uZHMoKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgICAgIC8vIG5ldyBEYXRlKE5hTikudG9KU09OKCkgPT09IG51bGxcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy50b0lTT1N0cmluZygpIDogbnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1ZhbGlkJDIoKSB7XG4gICAgICAgIHJldHVybiBpc1ZhbGlkKHRoaXMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNpbmdGbGFncygpIHtcbiAgICAgICAgcmV0dXJuIGV4dGVuZCh7fSwgZ2V0UGFyc2luZ0ZsYWdzKHRoaXMpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnZhbGlkQXQoKSB7XG4gICAgICAgIHJldHVybiBnZXRQYXJzaW5nRmxhZ3ModGhpcykub3ZlcmZsb3c7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRpb25EYXRhKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5wdXQ6IHRoaXMuX2ksXG4gICAgICAgICAgICBmb3JtYXQ6IHRoaXMuX2YsXG4gICAgICAgICAgICBsb2NhbGU6IHRoaXMuX2xvY2FsZSxcbiAgICAgICAgICAgIGlzVVRDOiB0aGlzLl9pc1VUQyxcbiAgICAgICAgICAgIHN0cmljdDogdGhpcy5fc3RyaWN0LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGFkZEZvcm1hdFRva2VuKCdOJywgMCwgMCwgJ2VyYUFiYnInKTtcbiAgICBhZGRGb3JtYXRUb2tlbignTk4nLCAwLCAwLCAnZXJhQWJicicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdOTk4nLCAwLCAwLCAnZXJhQWJicicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdOTk5OJywgMCwgMCwgJ2VyYU5hbWUnKTtcbiAgICBhZGRGb3JtYXRUb2tlbignTk5OTk4nLCAwLCAwLCAnZXJhTmFycm93Jyk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigneScsIFsneScsIDFdLCAneW8nLCAnZXJhWWVhcicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCd5JywgWyd5eScsIDJdLCAwLCAnZXJhWWVhcicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCd5JywgWyd5eXknLCAzXSwgMCwgJ2VyYVllYXInKTtcbiAgICBhZGRGb3JtYXRUb2tlbigneScsIFsneXl5eScsIDRdLCAwLCAnZXJhWWVhcicpO1xuXG4gICAgYWRkUmVnZXhUb2tlbignTicsIG1hdGNoRXJhQWJicik7XG4gICAgYWRkUmVnZXhUb2tlbignTk4nLCBtYXRjaEVyYUFiYnIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ05OTicsIG1hdGNoRXJhQWJicik7XG4gICAgYWRkUmVnZXhUb2tlbignTk5OTicsIG1hdGNoRXJhTmFtZSk7XG4gICAgYWRkUmVnZXhUb2tlbignTk5OTk4nLCBtYXRjaEVyYU5hcnJvdyk7XG5cbiAgICBhZGRQYXJzZVRva2VuKFxuICAgICAgICBbJ04nLCAnTk4nLCAnTk5OJywgJ05OTk4nLCAnTk5OTk4nXSxcbiAgICAgICAgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnLCB0b2tlbikge1xuICAgICAgICAgICAgdmFyIGVyYSA9IGNvbmZpZy5fbG9jYWxlLmVyYXNQYXJzZShpbnB1dCwgdG9rZW4sIGNvbmZpZy5fc3RyaWN0KTtcbiAgICAgICAgICAgIGlmIChlcmEpIHtcbiAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5lcmEgPSBlcmE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmludmFsaWRFcmEgPSBpbnB1dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICk7XG5cbiAgICBhZGRSZWdleFRva2VuKCd5JywgbWF0Y2hVbnNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbigneXknLCBtYXRjaFVuc2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCd5eXknLCBtYXRjaFVuc2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCd5eXl5JywgbWF0Y2hVbnNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbigneW8nLCBtYXRjaEVyYVllYXJPcmRpbmFsKTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWyd5JywgJ3l5JywgJ3l5eScsICd5eXl5J10sIFlFQVIpO1xuICAgIGFkZFBhcnNlVG9rZW4oWyd5byddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHZhciBtYXRjaDtcbiAgICAgICAgaWYgKGNvbmZpZy5fbG9jYWxlLl9lcmFZZWFyT3JkaW5hbFJlZ2V4KSB7XG4gICAgICAgICAgICBtYXRjaCA9IGlucHV0Lm1hdGNoKGNvbmZpZy5fbG9jYWxlLl9lcmFZZWFyT3JkaW5hbFJlZ2V4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcuX2xvY2FsZS5lcmFZZWFyT3JkaW5hbFBhcnNlKSB7XG4gICAgICAgICAgICBhcnJheVtZRUFSXSA9IGNvbmZpZy5fbG9jYWxlLmVyYVllYXJPcmRpbmFsUGFyc2UoaW5wdXQsIG1hdGNoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFycmF5W1lFQVJdID0gcGFyc2VJbnQoaW5wdXQsIDEwKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlRXJhcyhtLCBmb3JtYXQpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBsLFxuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIGVyYXMgPSB0aGlzLl9lcmFzIHx8IGdldExvY2FsZSgnZW4nKS5fZXJhcztcbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGVyYXMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBlcmFzW2ldLnNpbmNlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICAgICAgLy8gdHJ1bmNhdGUgdGltZVxuICAgICAgICAgICAgICAgICAgICBkYXRlID0gaG9va3MoZXJhc1tpXS5zaW5jZSkuc3RhcnRPZignZGF5Jyk7XG4gICAgICAgICAgICAgICAgICAgIGVyYXNbaV0uc2luY2UgPSBkYXRlLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIGVyYXNbaV0udW50aWwpIHtcbiAgICAgICAgICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICAgICAgICAgICAgICBlcmFzW2ldLnVudGlsID0gK0luZmluaXR5O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgICAgICAgICAvLyB0cnVuY2F0ZSB0aW1lXG4gICAgICAgICAgICAgICAgICAgIGRhdGUgPSBob29rcyhlcmFzW2ldLnVudGlsKS5zdGFydE9mKCdkYXknKS52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgICAgIGVyYXNbaV0udW50aWwgPSBkYXRlLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVyYXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlRXJhc1BhcnNlKGVyYU5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgbCxcbiAgICAgICAgICAgIGVyYXMgPSB0aGlzLmVyYXMoKSxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBhYmJyLFxuICAgICAgICAgICAgbmFycm93O1xuICAgICAgICBlcmFOYW1lID0gZXJhTmFtZS50b1VwcGVyQ2FzZSgpO1xuXG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBlcmFzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgbmFtZSA9IGVyYXNbaV0ubmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgYWJiciA9IGVyYXNbaV0uYWJici50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgbmFycm93ID0gZXJhc1tpXS5uYXJyb3cudG9VcHBlckNhc2UoKTtcblxuICAgICAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ04nOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdOTic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ05OTic6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWJiciA9PT0gZXJhTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTk5OTic6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gZXJhTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTk5OTk4nOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hcnJvdyA9PT0gZXJhTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChbbmFtZSwgYWJiciwgbmFycm93XS5pbmRleE9mKGVyYU5hbWUpID49IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJhc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZUVyYXNDb252ZXJ0WWVhcihlcmEsIHllYXIpIHtcbiAgICAgICAgdmFyIGRpciA9IGVyYS5zaW5jZSA8PSBlcmEudW50aWwgPyArMSA6IC0xO1xuICAgICAgICBpZiAoeWVhciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaG9va3MoZXJhLnNpbmNlKS55ZWFyKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaG9va3MoZXJhLnNpbmNlKS55ZWFyKCkgKyAoeWVhciAtIGVyYS5vZmZzZXQpICogZGlyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RXJhTmFtZSgpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBsLFxuICAgICAgICAgICAgdmFsLFxuICAgICAgICAgICAgZXJhcyA9IHRoaXMubG9jYWxlRGF0YSgpLmVyYXMoKTtcbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGVyYXMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICAvLyB0cnVuY2F0ZSB0aW1lXG4gICAgICAgICAgICB2YWwgPSB0aGlzLmNsb25lKCkuc3RhcnRPZignZGF5JykudmFsdWVPZigpO1xuXG4gICAgICAgICAgICBpZiAoZXJhc1tpXS5zaW5jZSA8PSB2YWwgJiYgdmFsIDw9IGVyYXNbaV0udW50aWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJhc1tpXS5uYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVyYXNbaV0udW50aWwgPD0gdmFsICYmIHZhbCA8PSBlcmFzW2ldLnNpbmNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVyYXNbaV0ubmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRFcmFOYXJyb3coKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgbCxcbiAgICAgICAgICAgIHZhbCxcbiAgICAgICAgICAgIGVyYXMgPSB0aGlzLmxvY2FsZURhdGEoKS5lcmFzKCk7XG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBlcmFzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgLy8gdHJ1bmNhdGUgdGltZVxuICAgICAgICAgICAgdmFsID0gdGhpcy5jbG9uZSgpLnN0YXJ0T2YoJ2RheScpLnZhbHVlT2YoKTtcblxuICAgICAgICAgICAgaWYgKGVyYXNbaV0uc2luY2UgPD0gdmFsICYmIHZhbCA8PSBlcmFzW2ldLnVudGlsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVyYXNbaV0ubmFycm93O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVyYXNbaV0udW50aWwgPD0gdmFsICYmIHZhbCA8PSBlcmFzW2ldLnNpbmNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVyYXNbaV0ubmFycm93O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEVyYUFiYnIoKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgbCxcbiAgICAgICAgICAgIHZhbCxcbiAgICAgICAgICAgIGVyYXMgPSB0aGlzLmxvY2FsZURhdGEoKS5lcmFzKCk7XG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBlcmFzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgLy8gdHJ1bmNhdGUgdGltZVxuICAgICAgICAgICAgdmFsID0gdGhpcy5jbG9uZSgpLnN0YXJ0T2YoJ2RheScpLnZhbHVlT2YoKTtcblxuICAgICAgICAgICAgaWYgKGVyYXNbaV0uc2luY2UgPD0gdmFsICYmIHZhbCA8PSBlcmFzW2ldLnVudGlsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVyYXNbaV0uYWJicjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcmFzW2ldLnVudGlsIDw9IHZhbCAmJiB2YWwgPD0gZXJhc1tpXS5zaW5jZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldLmFiYnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RXJhWWVhcigpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBsLFxuICAgICAgICAgICAgZGlyLFxuICAgICAgICAgICAgdmFsLFxuICAgICAgICAgICAgZXJhcyA9IHRoaXMubG9jYWxlRGF0YSgpLmVyYXMoKTtcbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGVyYXMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICBkaXIgPSBlcmFzW2ldLnNpbmNlIDw9IGVyYXNbaV0udW50aWwgPyArMSA6IC0xO1xuXG4gICAgICAgICAgICAvLyB0cnVuY2F0ZSB0aW1lXG4gICAgICAgICAgICB2YWwgPSB0aGlzLmNsb25lKCkuc3RhcnRPZignZGF5JykudmFsdWVPZigpO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKGVyYXNbaV0uc2luY2UgPD0gdmFsICYmIHZhbCA8PSBlcmFzW2ldLnVudGlsKSB8fFxuICAgICAgICAgICAgICAgIChlcmFzW2ldLnVudGlsIDw9IHZhbCAmJiB2YWwgPD0gZXJhc1tpXS5zaW5jZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLnllYXIoKSAtIGhvb2tzKGVyYXNbaV0uc2luY2UpLnllYXIoKSkgKiBkaXIgK1xuICAgICAgICAgICAgICAgICAgICBlcmFzW2ldLm9mZnNldFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy55ZWFyKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXJhc05hbWVSZWdleChpc1N0cmljdCkge1xuICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ19lcmFzTmFtZVJlZ2V4JykpIHtcbiAgICAgICAgICAgIGNvbXB1dGVFcmFzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNTdHJpY3QgPyB0aGlzLl9lcmFzTmFtZVJlZ2V4IDogdGhpcy5fZXJhc1JlZ2V4O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVyYXNBYmJyUmVnZXgoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfZXJhc0FiYnJSZWdleCcpKSB7XG4gICAgICAgICAgICBjb21wdXRlRXJhc1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzU3RyaWN0ID8gdGhpcy5fZXJhc0FiYnJSZWdleCA6IHRoaXMuX2VyYXNSZWdleDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlcmFzTmFycm93UmVnZXgoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfZXJhc05hcnJvd1JlZ2V4JykpIHtcbiAgICAgICAgICAgIGNvbXB1dGVFcmFzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNTdHJpY3QgPyB0aGlzLl9lcmFzTmFycm93UmVnZXggOiB0aGlzLl9lcmFzUmVnZXg7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWF0Y2hFcmFBYmJyKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5lcmFzQWJiclJlZ2V4KGlzU3RyaWN0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYXRjaEVyYU5hbWUoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLmVyYXNOYW1lUmVnZXgoaXNTdHJpY3QpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1hdGNoRXJhTmFycm93KGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5lcmFzTmFycm93UmVnZXgoaXNTdHJpY3QpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1hdGNoRXJhWWVhck9yZGluYWwoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLl9lcmFZZWFyT3JkaW5hbFJlZ2V4IHx8IG1hdGNoVW5zaWduZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29tcHV0ZUVyYXNQYXJzZSgpIHtcbiAgICAgICAgdmFyIGFiYnJQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIG5hbWVQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIG5hcnJvd1BpZWNlcyA9IFtdLFxuICAgICAgICAgICAgbWl4ZWRQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBsLFxuICAgICAgICAgICAgZXJhc05hbWUsXG4gICAgICAgICAgICBlcmFzQWJicixcbiAgICAgICAgICAgIGVyYXNOYXJyb3csXG4gICAgICAgICAgICBlcmFzID0gdGhpcy5lcmFzKCk7XG5cbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGVyYXMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICBlcmFzTmFtZSA9IHJlZ2V4RXNjYXBlKGVyYXNbaV0ubmFtZSk7XG4gICAgICAgICAgICBlcmFzQWJiciA9IHJlZ2V4RXNjYXBlKGVyYXNbaV0uYWJicik7XG4gICAgICAgICAgICBlcmFzTmFycm93ID0gcmVnZXhFc2NhcGUoZXJhc1tpXS5uYXJyb3cpO1xuXG4gICAgICAgICAgICBuYW1lUGllY2VzLnB1c2goZXJhc05hbWUpO1xuICAgICAgICAgICAgYWJiclBpZWNlcy5wdXNoKGVyYXNBYmJyKTtcbiAgICAgICAgICAgIG5hcnJvd1BpZWNlcy5wdXNoKGVyYXNOYXJyb3cpO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChlcmFzTmFtZSk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKGVyYXNBYmJyKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2goZXJhc05hcnJvdyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9lcmFzUmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBtaXhlZFBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX2VyYXNOYW1lUmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBuYW1lUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fZXJhc0FiYnJSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIGFiYnJQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgICAgICB0aGlzLl9lcmFzTmFycm93UmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgJ14oJyArIG5hcnJvd1BpZWNlcy5qb2luKCd8JykgKyAnKScsXG4gICAgICAgICAgICAnaSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ2dnJywgMl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2Vla1llYXIoKSAlIDEwMDtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnR0cnLCAyXSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc29XZWVrWWVhcigpICUgMTAwO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gYWRkV2Vla1llYXJGb3JtYXRUb2tlbih0b2tlbiwgZ2V0dGVyKSB7XG4gICAgICAgIGFkZEZvcm1hdFRva2VuKDAsIFt0b2tlbiwgdG9rZW4ubGVuZ3RoXSwgMCwgZ2V0dGVyKTtcbiAgICB9XG5cbiAgICBhZGRXZWVrWWVhckZvcm1hdFRva2VuKCdnZ2dnJywgJ3dlZWtZZWFyJyk7XG4gICAgYWRkV2Vla1llYXJGb3JtYXRUb2tlbignZ2dnZ2cnLCAnd2Vla1llYXInKTtcbiAgICBhZGRXZWVrWWVhckZvcm1hdFRva2VuKCdHR0dHJywgJ2lzb1dlZWtZZWFyJyk7XG4gICAgYWRkV2Vla1llYXJGb3JtYXRUb2tlbignR0dHR0cnLCAnaXNvV2Vla1llYXInKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ0cnLCBtYXRjaFNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbignZycsIG1hdGNoU2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCdHRycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdnZycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdHR0dHJywgbWF0Y2gxdG80LCBtYXRjaDQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2dnZ2cnLCBtYXRjaDF0bzQsIG1hdGNoNCk7XG4gICAgYWRkUmVnZXhUb2tlbignR0dHR0cnLCBtYXRjaDF0bzYsIG1hdGNoNik7XG4gICAgYWRkUmVnZXhUb2tlbignZ2dnZ2cnLCBtYXRjaDF0bzYsIG1hdGNoNik7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihcbiAgICAgICAgWydnZ2dnJywgJ2dnZ2dnJywgJ0dHR0cnLCAnR0dHR0cnXSxcbiAgICAgICAgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgICAgICB3ZWVrW3Rva2VuLnN1YnN0cigwLCAyKV0gPSB0b0ludChpbnB1dCk7XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgYWRkV2Vla1BhcnNlVG9rZW4oWydnZycsICdHRyddLCBmdW5jdGlvbiAoaW5wdXQsIHdlZWssIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgd2Vla1t0b2tlbl0gPSBob29rcy5wYXJzZVR3b0RpZ2l0WWVhcihpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBnZXRTZXRXZWVrWWVhcihpbnB1dCkge1xuICAgICAgICByZXR1cm4gZ2V0U2V0V2Vla1llYXJIZWxwZXIuY2FsbChcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIHRoaXMud2VlaygpLFxuICAgICAgICAgICAgdGhpcy53ZWVrZGF5KCkgKyB0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3csXG4gICAgICAgICAgICB0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3csXG4gICAgICAgICAgICB0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3lcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRJU09XZWVrWWVhcihpbnB1dCkge1xuICAgICAgICByZXR1cm4gZ2V0U2V0V2Vla1llYXJIZWxwZXIuY2FsbChcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIHRoaXMuaXNvV2VlaygpLFxuICAgICAgICAgICAgdGhpcy5pc29XZWVrZGF5KCksXG4gICAgICAgICAgICAxLFxuICAgICAgICAgICAgNFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldElTT1dlZWtzSW5ZZWFyKCkge1xuICAgICAgICByZXR1cm4gd2Vla3NJblllYXIodGhpcy55ZWFyKCksIDEsIDQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldElTT1dlZWtzSW5JU09XZWVrWWVhcigpIHtcbiAgICAgICAgcmV0dXJuIHdlZWtzSW5ZZWFyKHRoaXMuaXNvV2Vla1llYXIoKSwgMSwgNCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0V2Vla3NJblllYXIoKSB7XG4gICAgICAgIHZhciB3ZWVrSW5mbyA9IHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrO1xuICAgICAgICByZXR1cm4gd2Vla3NJblllYXIodGhpcy55ZWFyKCksIHdlZWtJbmZvLmRvdywgd2Vla0luZm8uZG95KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRXZWVrc0luV2Vla1llYXIoKSB7XG4gICAgICAgIHZhciB3ZWVrSW5mbyA9IHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrO1xuICAgICAgICByZXR1cm4gd2Vla3NJblllYXIodGhpcy53ZWVrWWVhcigpLCB3ZWVrSW5mby5kb3csIHdlZWtJbmZvLmRveSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0V2Vla1llYXJIZWxwZXIoaW5wdXQsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSB7XG4gICAgICAgIHZhciB3ZWVrc1RhcmdldDtcbiAgICAgICAgaWYgKGlucHV0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB3ZWVrT2ZZZWFyKHRoaXMsIGRvdywgZG95KS55ZWFyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2Vla3NUYXJnZXQgPSB3ZWVrc0luWWVhcihpbnB1dCwgZG93LCBkb3kpO1xuICAgICAgICAgICAgaWYgKHdlZWsgPiB3ZWVrc1RhcmdldCkge1xuICAgICAgICAgICAgICAgIHdlZWsgPSB3ZWVrc1RhcmdldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzZXRXZWVrQWxsLmNhbGwodGhpcywgaW5wdXQsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldFdlZWtBbGwod2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSB7XG4gICAgICAgIHZhciBkYXlPZlllYXJEYXRhID0gZGF5T2ZZZWFyRnJvbVdlZWtzKHdlZWtZZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSksXG4gICAgICAgICAgICBkYXRlID0gY3JlYXRlVVRDRGF0ZShkYXlPZlllYXJEYXRhLnllYXIsIDAsIGRheU9mWWVhckRhdGEuZGF5T2ZZZWFyKTtcblxuICAgICAgICB0aGlzLnllYXIoZGF0ZS5nZXRVVENGdWxsWWVhcigpKTtcbiAgICAgICAgdGhpcy5tb250aChkYXRlLmdldFVUQ01vbnRoKCkpO1xuICAgICAgICB0aGlzLmRhdGUoZGF0ZS5nZXRVVENEYXRlKCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignUScsIDAsICdRbycsICdxdWFydGVyJyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdRJywgbWF0Y2gxKTtcbiAgICBhZGRQYXJzZVRva2VuKCdRJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtNT05USF0gPSAodG9JbnQoaW5wdXQpIC0gMSkgKiAzO1xuICAgIH0pO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0UXVhcnRlcihpbnB1dCkge1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbFxuICAgICAgICAgICAgPyBNYXRoLmNlaWwoKHRoaXMubW9udGgoKSArIDEpIC8gMylcbiAgICAgICAgICAgIDogdGhpcy5tb250aCgoaW5wdXQgLSAxKSAqIDMgKyAodGhpcy5tb250aCgpICUgMykpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdEJywgWydERCcsIDJdLCAnRG8nLCAnZGF0ZScpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignRCcsIG1hdGNoMXRvMiwgbWF0Y2gxdG8yTm9MZWFkaW5nWmVybyk7XG4gICAgYWRkUmVnZXhUb2tlbignREQnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignRG8nLCBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICAvLyBUT0RPOiBSZW1vdmUgXCJvcmRpbmFsUGFyc2VcIiBmYWxsYmFjayBpbiBuZXh0IG1ham9yIHJlbGVhc2UuXG4gICAgICAgIHJldHVybiBpc1N0cmljdFxuICAgICAgICAgICAgPyBsb2NhbGUuX2RheU9mTW9udGhPcmRpbmFsUGFyc2UgfHwgbG9jYWxlLl9vcmRpbmFsUGFyc2VcbiAgICAgICAgICAgIDogbG9jYWxlLl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlTGVuaWVudDtcbiAgICB9KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydEJywgJ0REJ10sIERBVEUpO1xuICAgIGFkZFBhcnNlVG9rZW4oJ0RvJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtEQVRFXSA9IHRvSW50KGlucHV0Lm1hdGNoKG1hdGNoMXRvMilbMF0pO1xuICAgIH0pO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgdmFyIGdldFNldERheU9mTW9udGggPSBtYWtlR2V0U2V0KCdEYXRlJywgdHJ1ZSk7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignREREJywgWydEREREJywgM10sICdERERvJywgJ2RheU9mWWVhcicpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignREREJywgbWF0Y2gxdG8zKTtcbiAgICBhZGRSZWdleFRva2VuKCdEREREJywgbWF0Y2gzKTtcbiAgICBhZGRQYXJzZVRva2VuKFsnREREJywgJ0REREQnXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5fZGF5T2ZZZWFyID0gdG9JbnQoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gSEVMUEVSU1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0RGF5T2ZZZWFyKGlucHV0KSB7XG4gICAgICAgIHZhciBkYXlPZlllYXIgPVxuICAgICAgICAgICAgTWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgICAodGhpcy5jbG9uZSgpLnN0YXJ0T2YoJ2RheScpIC0gdGhpcy5jbG9uZSgpLnN0YXJ0T2YoJ3llYXInKSkgLyA4NjRlNVxuICAgICAgICAgICAgKSArIDE7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gZGF5T2ZZZWFyIDogdGhpcy5hZGQoaW5wdXQgLSBkYXlPZlllYXIsICdkJyk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ20nLCBbJ21tJywgMl0sIDAsICdtaW51dGUnKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ20nLCBtYXRjaDF0bzIsIG1hdGNoMXRvMkhhc1plcm8pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ21tJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydtJywgJ21tJ10sIE1JTlVURSk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0TWludXRlID0gbWFrZUdldFNldCgnTWludXRlcycsIGZhbHNlKTtcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdzJywgWydzcycsIDJdLCAwLCAnc2Vjb25kJyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdzJywgbWF0Y2gxdG8yLCBtYXRjaDF0bzJIYXNaZXJvKTtcbiAgICBhZGRSZWdleFRva2VuKCdzcycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRQYXJzZVRva2VuKFsncycsICdzcyddLCBTRUNPTkQpO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgdmFyIGdldFNldFNlY29uZCA9IG1ha2VHZXRTZXQoJ1NlY29uZHMnLCBmYWxzZSk7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignUycsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIH5+KHRoaXMubWlsbGlzZWNvbmQoKSAvIDEwMCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTJywgMl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIH5+KHRoaXMubWlsbGlzZWNvbmQoKSAvIDEwKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTJywgM10sIDAsICdtaWxsaXNlY29uZCcpO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTUycsIDRdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTJywgNV0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTUycsIDZdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwO1xuICAgIH0pO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTU1NTUycsIDddLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTU1NTJywgOF0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDAwMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTU1NTUycsIDldLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwMDAwO1xuICAgIH0pO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignUycsIG1hdGNoMXRvMywgbWF0Y2gxKTtcbiAgICBhZGRSZWdleFRva2VuKCdTUycsIG1hdGNoMXRvMywgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdTU1MnLCBtYXRjaDF0bzMsIG1hdGNoMyk7XG5cbiAgICB2YXIgdG9rZW4sIGdldFNldE1pbGxpc2Vjb25kO1xuICAgIGZvciAodG9rZW4gPSAnU1NTUyc7IHRva2VuLmxlbmd0aCA8PSA5OyB0b2tlbiArPSAnUycpIHtcbiAgICAgICAgYWRkUmVnZXhUb2tlbih0b2tlbiwgbWF0Y2hVbnNpZ25lZCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2VNcyhpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbTUlMTElTRUNPTkRdID0gdG9JbnQoKCcwLicgKyBpbnB1dCkgKiAxMDAwKTtcbiAgICB9XG5cbiAgICBmb3IgKHRva2VuID0gJ1MnOyB0b2tlbi5sZW5ndGggPD0gOTsgdG9rZW4gKz0gJ1MnKSB7XG4gICAgICAgIGFkZFBhcnNlVG9rZW4odG9rZW4sIHBhcnNlTXMpO1xuICAgIH1cblxuICAgIGdldFNldE1pbGxpc2Vjb25kID0gbWFrZUdldFNldCgnTWlsbGlzZWNvbmRzJywgZmFsc2UpO1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ3onLCAwLCAwLCAnem9uZUFiYnInKTtcbiAgICBhZGRGb3JtYXRUb2tlbignenonLCAwLCAwLCAnem9uZU5hbWUnKTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFpvbmVBYmJyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNVVEMgPyAnVVRDJyA6ICcnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFpvbmVOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNVVEMgPyAnQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWUnIDogJyc7XG4gICAgfVxuXG4gICAgdmFyIHByb3RvID0gTW9tZW50LnByb3RvdHlwZTtcblxuICAgIHByb3RvLmFkZCA9IGFkZDtcbiAgICBwcm90by5jYWxlbmRhciA9IGNhbGVuZGFyJDE7XG4gICAgcHJvdG8uY2xvbmUgPSBjbG9uZTtcbiAgICBwcm90by5kaWZmID0gZGlmZjtcbiAgICBwcm90by5lbmRPZiA9IGVuZE9mO1xuICAgIHByb3RvLmZvcm1hdCA9IGZvcm1hdDtcbiAgICBwcm90by5mcm9tID0gZnJvbTtcbiAgICBwcm90by5mcm9tTm93ID0gZnJvbU5vdztcbiAgICBwcm90by50byA9IHRvO1xuICAgIHByb3RvLnRvTm93ID0gdG9Ob3c7XG4gICAgcHJvdG8uZ2V0ID0gc3RyaW5nR2V0O1xuICAgIHByb3RvLmludmFsaWRBdCA9IGludmFsaWRBdDtcbiAgICBwcm90by5pc0FmdGVyID0gaXNBZnRlcjtcbiAgICBwcm90by5pc0JlZm9yZSA9IGlzQmVmb3JlO1xuICAgIHByb3RvLmlzQmV0d2VlbiA9IGlzQmV0d2VlbjtcbiAgICBwcm90by5pc1NhbWUgPSBpc1NhbWU7XG4gICAgcHJvdG8uaXNTYW1lT3JBZnRlciA9IGlzU2FtZU9yQWZ0ZXI7XG4gICAgcHJvdG8uaXNTYW1lT3JCZWZvcmUgPSBpc1NhbWVPckJlZm9yZTtcbiAgICBwcm90by5pc1ZhbGlkID0gaXNWYWxpZCQyO1xuICAgIHByb3RvLmxhbmcgPSBsYW5nO1xuICAgIHByb3RvLmxvY2FsZSA9IGxvY2FsZTtcbiAgICBwcm90by5sb2NhbGVEYXRhID0gbG9jYWxlRGF0YTtcbiAgICBwcm90by5tYXggPSBwcm90b3R5cGVNYXg7XG4gICAgcHJvdG8ubWluID0gcHJvdG90eXBlTWluO1xuICAgIHByb3RvLnBhcnNpbmdGbGFncyA9IHBhcnNpbmdGbGFncztcbiAgICBwcm90by5zZXQgPSBzdHJpbmdTZXQ7XG4gICAgcHJvdG8uc3RhcnRPZiA9IHN0YXJ0T2Y7XG4gICAgcHJvdG8uc3VidHJhY3QgPSBzdWJ0cmFjdDtcbiAgICBwcm90by50b0FycmF5ID0gdG9BcnJheTtcbiAgICBwcm90by50b09iamVjdCA9IHRvT2JqZWN0O1xuICAgIHByb3RvLnRvRGF0ZSA9IHRvRGF0ZTtcbiAgICBwcm90by50b0lTT1N0cmluZyA9IHRvSVNPU3RyaW5nO1xuICAgIHByb3RvLmluc3BlY3QgPSBpbnNwZWN0O1xuICAgIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wuZm9yICE9IG51bGwpIHtcbiAgICAgICAgcHJvdG9bU3ltYm9sLmZvcignbm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20nKV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gJ01vbWVudDwnICsgdGhpcy5mb3JtYXQoKSArICc+JztcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHJvdG8udG9KU09OID0gdG9KU09OO1xuICAgIHByb3RvLnRvU3RyaW5nID0gdG9TdHJpbmc7XG4gICAgcHJvdG8udW5peCA9IHVuaXg7XG4gICAgcHJvdG8udmFsdWVPZiA9IHZhbHVlT2Y7XG4gICAgcHJvdG8uY3JlYXRpb25EYXRhID0gY3JlYXRpb25EYXRhO1xuICAgIHByb3RvLmVyYU5hbWUgPSBnZXRFcmFOYW1lO1xuICAgIHByb3RvLmVyYU5hcnJvdyA9IGdldEVyYU5hcnJvdztcbiAgICBwcm90by5lcmFBYmJyID0gZ2V0RXJhQWJicjtcbiAgICBwcm90by5lcmFZZWFyID0gZ2V0RXJhWWVhcjtcbiAgICBwcm90by55ZWFyID0gZ2V0U2V0WWVhcjtcbiAgICBwcm90by5pc0xlYXBZZWFyID0gZ2V0SXNMZWFwWWVhcjtcbiAgICBwcm90by53ZWVrWWVhciA9IGdldFNldFdlZWtZZWFyO1xuICAgIHByb3RvLmlzb1dlZWtZZWFyID0gZ2V0U2V0SVNPV2Vla1llYXI7XG4gICAgcHJvdG8ucXVhcnRlciA9IHByb3RvLnF1YXJ0ZXJzID0gZ2V0U2V0UXVhcnRlcjtcbiAgICBwcm90by5tb250aCA9IGdldFNldE1vbnRoO1xuICAgIHByb3RvLmRheXNJbk1vbnRoID0gZ2V0RGF5c0luTW9udGg7XG4gICAgcHJvdG8ud2VlayA9IHByb3RvLndlZWtzID0gZ2V0U2V0V2VlaztcbiAgICBwcm90by5pc29XZWVrID0gcHJvdG8uaXNvV2Vla3MgPSBnZXRTZXRJU09XZWVrO1xuICAgIHByb3RvLndlZWtzSW5ZZWFyID0gZ2V0V2Vla3NJblllYXI7XG4gICAgcHJvdG8ud2Vla3NJbldlZWtZZWFyID0gZ2V0V2Vla3NJbldlZWtZZWFyO1xuICAgIHByb3RvLmlzb1dlZWtzSW5ZZWFyID0gZ2V0SVNPV2Vla3NJblllYXI7XG4gICAgcHJvdG8uaXNvV2Vla3NJbklTT1dlZWtZZWFyID0gZ2V0SVNPV2Vla3NJbklTT1dlZWtZZWFyO1xuICAgIHByb3RvLmRhdGUgPSBnZXRTZXREYXlPZk1vbnRoO1xuICAgIHByb3RvLmRheSA9IHByb3RvLmRheXMgPSBnZXRTZXREYXlPZldlZWs7XG4gICAgcHJvdG8ud2Vla2RheSA9IGdldFNldExvY2FsZURheU9mV2VlaztcbiAgICBwcm90by5pc29XZWVrZGF5ID0gZ2V0U2V0SVNPRGF5T2ZXZWVrO1xuICAgIHByb3RvLmRheU9mWWVhciA9IGdldFNldERheU9mWWVhcjtcbiAgICBwcm90by5ob3VyID0gcHJvdG8uaG91cnMgPSBnZXRTZXRIb3VyO1xuICAgIHByb3RvLm1pbnV0ZSA9IHByb3RvLm1pbnV0ZXMgPSBnZXRTZXRNaW51dGU7XG4gICAgcHJvdG8uc2Vjb25kID0gcHJvdG8uc2Vjb25kcyA9IGdldFNldFNlY29uZDtcbiAgICBwcm90by5taWxsaXNlY29uZCA9IHByb3RvLm1pbGxpc2Vjb25kcyA9IGdldFNldE1pbGxpc2Vjb25kO1xuICAgIHByb3RvLnV0Y09mZnNldCA9IGdldFNldE9mZnNldDtcbiAgICBwcm90by51dGMgPSBzZXRPZmZzZXRUb1VUQztcbiAgICBwcm90by5sb2NhbCA9IHNldE9mZnNldFRvTG9jYWw7XG4gICAgcHJvdG8ucGFyc2Vab25lID0gc2V0T2Zmc2V0VG9QYXJzZWRPZmZzZXQ7XG4gICAgcHJvdG8uaGFzQWxpZ25lZEhvdXJPZmZzZXQgPSBoYXNBbGlnbmVkSG91ck9mZnNldDtcbiAgICBwcm90by5pc0RTVCA9IGlzRGF5bGlnaHRTYXZpbmdUaW1lO1xuICAgIHByb3RvLmlzTG9jYWwgPSBpc0xvY2FsO1xuICAgIHByb3RvLmlzVXRjT2Zmc2V0ID0gaXNVdGNPZmZzZXQ7XG4gICAgcHJvdG8uaXNVdGMgPSBpc1V0YztcbiAgICBwcm90by5pc1VUQyA9IGlzVXRjO1xuICAgIHByb3RvLnpvbmVBYmJyID0gZ2V0Wm9uZUFiYnI7XG4gICAgcHJvdG8uem9uZU5hbWUgPSBnZXRab25lTmFtZTtcbiAgICBwcm90by5kYXRlcyA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ2RhdGVzIGFjY2Vzc29yIGlzIGRlcHJlY2F0ZWQuIFVzZSBkYXRlIGluc3RlYWQuJyxcbiAgICAgICAgZ2V0U2V0RGF5T2ZNb250aFxuICAgICk7XG4gICAgcHJvdG8ubW9udGhzID0gZGVwcmVjYXRlKFxuICAgICAgICAnbW9udGhzIGFjY2Vzc29yIGlzIGRlcHJlY2F0ZWQuIFVzZSBtb250aCBpbnN0ZWFkJyxcbiAgICAgICAgZ2V0U2V0TW9udGhcbiAgICApO1xuICAgIHByb3RvLnllYXJzID0gZGVwcmVjYXRlKFxuICAgICAgICAneWVhcnMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIHllYXIgaW5zdGVhZCcsXG4gICAgICAgIGdldFNldFllYXJcbiAgICApO1xuICAgIHByb3RvLnpvbmUgPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQoKS56b25lIGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQoKS51dGNPZmZzZXQgaW5zdGVhZC4gaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy96b25lLycsXG4gICAgICAgIGdldFNldFpvbmVcbiAgICApO1xuICAgIHByb3RvLmlzRFNUU2hpZnRlZCA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ2lzRFNUU2hpZnRlZCBpcyBkZXByZWNhdGVkLiBTZWUgaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9kc3Qtc2hpZnRlZC8gZm9yIG1vcmUgaW5mb3JtYXRpb24nLFxuICAgICAgICBpc0RheWxpZ2h0U2F2aW5nVGltZVNoaWZ0ZWRcbiAgICApO1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlVW5peChpbnB1dCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWwoaW5wdXQgKiAxMDAwKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJblpvbmUoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbC5hcHBseShudWxsLCBhcmd1bWVudHMpLnBhcnNlWm9uZSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByZVBhcnNlUG9zdEZvcm1hdChzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICB9XG5cbiAgICB2YXIgcHJvdG8kMSA9IExvY2FsZS5wcm90b3R5cGU7XG5cbiAgICBwcm90byQxLmNhbGVuZGFyID0gY2FsZW5kYXI7XG4gICAgcHJvdG8kMS5sb25nRGF0ZUZvcm1hdCA9IGxvbmdEYXRlRm9ybWF0O1xuICAgIHByb3RvJDEuaW52YWxpZERhdGUgPSBpbnZhbGlkRGF0ZTtcbiAgICBwcm90byQxLm9yZGluYWwgPSBvcmRpbmFsO1xuICAgIHByb3RvJDEucHJlcGFyc2UgPSBwcmVQYXJzZVBvc3RGb3JtYXQ7XG4gICAgcHJvdG8kMS5wb3N0Zm9ybWF0ID0gcHJlUGFyc2VQb3N0Rm9ybWF0O1xuICAgIHByb3RvJDEucmVsYXRpdmVUaW1lID0gcmVsYXRpdmVUaW1lO1xuICAgIHByb3RvJDEucGFzdEZ1dHVyZSA9IHBhc3RGdXR1cmU7XG4gICAgcHJvdG8kMS5zZXQgPSBzZXQ7XG4gICAgcHJvdG8kMS5lcmFzID0gbG9jYWxlRXJhcztcbiAgICBwcm90byQxLmVyYXNQYXJzZSA9IGxvY2FsZUVyYXNQYXJzZTtcbiAgICBwcm90byQxLmVyYXNDb252ZXJ0WWVhciA9IGxvY2FsZUVyYXNDb252ZXJ0WWVhcjtcbiAgICBwcm90byQxLmVyYXNBYmJyUmVnZXggPSBlcmFzQWJiclJlZ2V4O1xuICAgIHByb3RvJDEuZXJhc05hbWVSZWdleCA9IGVyYXNOYW1lUmVnZXg7XG4gICAgcHJvdG8kMS5lcmFzTmFycm93UmVnZXggPSBlcmFzTmFycm93UmVnZXg7XG5cbiAgICBwcm90byQxLm1vbnRocyA9IGxvY2FsZU1vbnRocztcbiAgICBwcm90byQxLm1vbnRoc1Nob3J0ID0gbG9jYWxlTW9udGhzU2hvcnQ7XG4gICAgcHJvdG8kMS5tb250aHNQYXJzZSA9IGxvY2FsZU1vbnRoc1BhcnNlO1xuICAgIHByb3RvJDEubW9udGhzUmVnZXggPSBtb250aHNSZWdleDtcbiAgICBwcm90byQxLm1vbnRoc1Nob3J0UmVnZXggPSBtb250aHNTaG9ydFJlZ2V4O1xuICAgIHByb3RvJDEud2VlayA9IGxvY2FsZVdlZWs7XG4gICAgcHJvdG8kMS5maXJzdERheU9mWWVhciA9IGxvY2FsZUZpcnN0RGF5T2ZZZWFyO1xuICAgIHByb3RvJDEuZmlyc3REYXlPZldlZWsgPSBsb2NhbGVGaXJzdERheU9mV2VlaztcblxuICAgIHByb3RvJDEud2Vla2RheXMgPSBsb2NhbGVXZWVrZGF5cztcbiAgICBwcm90byQxLndlZWtkYXlzTWluID0gbG9jYWxlV2Vla2RheXNNaW47XG4gICAgcHJvdG8kMS53ZWVrZGF5c1Nob3J0ID0gbG9jYWxlV2Vla2RheXNTaG9ydDtcbiAgICBwcm90byQxLndlZWtkYXlzUGFyc2UgPSBsb2NhbGVXZWVrZGF5c1BhcnNlO1xuXG4gICAgcHJvdG8kMS53ZWVrZGF5c1JlZ2V4ID0gd2Vla2RheXNSZWdleDtcbiAgICBwcm90byQxLndlZWtkYXlzU2hvcnRSZWdleCA9IHdlZWtkYXlzU2hvcnRSZWdleDtcbiAgICBwcm90byQxLndlZWtkYXlzTWluUmVnZXggPSB3ZWVrZGF5c01pblJlZ2V4O1xuXG4gICAgcHJvdG8kMS5pc1BNID0gbG9jYWxlSXNQTTtcbiAgICBwcm90byQxLm1lcmlkaWVtID0gbG9jYWxlTWVyaWRpZW07XG5cbiAgICBmdW5jdGlvbiBnZXQkMShmb3JtYXQsIGluZGV4LCBmaWVsZCwgc2V0dGVyKSB7XG4gICAgICAgIHZhciBsb2NhbGUgPSBnZXRMb2NhbGUoKSxcbiAgICAgICAgICAgIHV0YyA9IGNyZWF0ZVVUQygpLnNldChzZXR0ZXIsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIGxvY2FsZVtmaWVsZF0odXRjLCBmb3JtYXQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RNb250aHNJbXBsKGZvcm1hdCwgaW5kZXgsIGZpZWxkKSB7XG4gICAgICAgIGlmIChpc051bWJlcihmb3JtYXQpKSB7XG4gICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgIGZvcm1hdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAnJztcblxuICAgICAgICBpZiAoaW5kZXggIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGdldCQxKGZvcm1hdCwgaW5kZXgsIGZpZWxkLCAnbW9udGgnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgb3V0ID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgICAgICAgICBvdXRbaV0gPSBnZXQkMShmb3JtYXQsIGksIGZpZWxkLCAnbW9udGgnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cblxuICAgIC8vICgpXG4gICAgLy8gKDUpXG4gICAgLy8gKGZtdCwgNSlcbiAgICAvLyAoZm10KVxuICAgIC8vICh0cnVlKVxuICAgIC8vICh0cnVlLCA1KVxuICAgIC8vICh0cnVlLCBmbXQsIDUpXG4gICAgLy8gKHRydWUsIGZtdClcbiAgICBmdW5jdGlvbiBsaXN0V2Vla2RheXNJbXBsKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCwgZmllbGQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBsb2NhbGVTb3J0ZWQgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgaWYgKGlzTnVtYmVyKGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgICAgICBmb3JtYXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IGxvY2FsZVNvcnRlZDtcbiAgICAgICAgICAgIGluZGV4ID0gZm9ybWF0O1xuICAgICAgICAgICAgbG9jYWxlU29ydGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChpc051bWJlcihmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBmb3JtYXQ7XG4gICAgICAgICAgICAgICAgZm9ybWF0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXQgfHwgJyc7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbG9jYWxlID0gZ2V0TG9jYWxlKCksXG4gICAgICAgICAgICBzaGlmdCA9IGxvY2FsZVNvcnRlZCA/IGxvY2FsZS5fd2Vlay5kb3cgOiAwLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIG91dCA9IFtdO1xuXG4gICAgICAgIGlmIChpbmRleCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0JDEoZm9ybWF0LCAoaW5kZXggKyBzaGlmdCkgJSA3LCBmaWVsZCwgJ2RheScpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgb3V0W2ldID0gZ2V0JDEoZm9ybWF0LCAoaSArIHNoaWZ0KSAlIDcsIGZpZWxkLCAnZGF5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0TW9udGhzKGZvcm1hdCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RNb250aHNJbXBsKGZvcm1hdCwgaW5kZXgsICdtb250aHMnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0TW9udGhzU2hvcnQoZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdE1vbnRoc0ltcGwoZm9ybWF0LCBpbmRleCwgJ21vbnRoc1Nob3J0Jyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdFdlZWtkYXlzKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdFdlZWtkYXlzSW1wbChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsICd3ZWVrZGF5cycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RXZWVrZGF5c1Nob3J0KGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdFdlZWtkYXlzSW1wbChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsICd3ZWVrZGF5c1Nob3J0Jyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdFdlZWtkYXlzTWluKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdFdlZWtkYXlzSW1wbChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsICd3ZWVrZGF5c01pbicpO1xuICAgIH1cblxuICAgIGdldFNldEdsb2JhbExvY2FsZSgnZW4nLCB7XG4gICAgICAgIGVyYXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzaW5jZTogJzAwMDEtMDEtMDEnLFxuICAgICAgICAgICAgICAgIHVudGlsOiArSW5maW5pdHksXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiAxLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdBbm5vIERvbWluaScsXG4gICAgICAgICAgICAgICAgbmFycm93OiAnQUQnLFxuICAgICAgICAgICAgICAgIGFiYnI6ICdBRCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNpbmNlOiAnMDAwMC0xMi0zMScsXG4gICAgICAgICAgICAgICAgdW50aWw6IC1JbmZpbml0eSxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDEsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0JlZm9yZSBDaHJpc3QnLFxuICAgICAgICAgICAgICAgIG5hcnJvdzogJ0JDJyxcbiAgICAgICAgICAgICAgICBhYmJyOiAnQkMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHRofHN0fG5kfHJkKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICAgICAgdG9JbnQoKG51bWJlciAlIDEwMCkgLyAxMCkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3N0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICduZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3JkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIFNpZGUgZWZmZWN0IGltcG9ydHNcblxuICAgIGhvb2tzLmxhbmcgPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQubGFuZyBpcyBkZXByZWNhdGVkLiBVc2UgbW9tZW50LmxvY2FsZSBpbnN0ZWFkLicsXG4gICAgICAgIGdldFNldEdsb2JhbExvY2FsZVxuICAgICk7XG4gICAgaG9va3MubGFuZ0RhdGEgPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQubGFuZ0RhdGEgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbWVudC5sb2NhbGVEYXRhIGluc3RlYWQuJyxcbiAgICAgICAgZ2V0TG9jYWxlXG4gICAgKTtcblxuICAgIHZhciBtYXRoQWJzID0gTWF0aC5hYnM7XG5cbiAgICBmdW5jdGlvbiBhYnMoKSB7XG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5fZGF0YTtcblxuICAgICAgICB0aGlzLl9taWxsaXNlY29uZHMgPSBtYXRoQWJzKHRoaXMuX21pbGxpc2Vjb25kcyk7XG4gICAgICAgIHRoaXMuX2RheXMgPSBtYXRoQWJzKHRoaXMuX2RheXMpO1xuICAgICAgICB0aGlzLl9tb250aHMgPSBtYXRoQWJzKHRoaXMuX21vbnRocyk7XG5cbiAgICAgICAgZGF0YS5taWxsaXNlY29uZHMgPSBtYXRoQWJzKGRhdGEubWlsbGlzZWNvbmRzKTtcbiAgICAgICAgZGF0YS5zZWNvbmRzID0gbWF0aEFicyhkYXRhLnNlY29uZHMpO1xuICAgICAgICBkYXRhLm1pbnV0ZXMgPSBtYXRoQWJzKGRhdGEubWludXRlcyk7XG4gICAgICAgIGRhdGEuaG91cnMgPSBtYXRoQWJzKGRhdGEuaG91cnMpO1xuICAgICAgICBkYXRhLm1vbnRocyA9IG1hdGhBYnMoZGF0YS5tb250aHMpO1xuICAgICAgICBkYXRhLnllYXJzID0gbWF0aEFicyhkYXRhLnllYXJzKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRTdWJ0cmFjdCQxKGR1cmF0aW9uLCBpbnB1dCwgdmFsdWUsIGRpcmVjdGlvbikge1xuICAgICAgICB2YXIgb3RoZXIgPSBjcmVhdGVEdXJhdGlvbihpbnB1dCwgdmFsdWUpO1xuXG4gICAgICAgIGR1cmF0aW9uLl9taWxsaXNlY29uZHMgKz0gZGlyZWN0aW9uICogb3RoZXIuX21pbGxpc2Vjb25kcztcbiAgICAgICAgZHVyYXRpb24uX2RheXMgKz0gZGlyZWN0aW9uICogb3RoZXIuX2RheXM7XG4gICAgICAgIGR1cmF0aW9uLl9tb250aHMgKz0gZGlyZWN0aW9uICogb3RoZXIuX21vbnRocztcblxuICAgICAgICByZXR1cm4gZHVyYXRpb24uX2J1YmJsZSgpO1xuICAgIH1cblxuICAgIC8vIHN1cHBvcnRzIG9ubHkgMi4wLXN0eWxlIGFkZCgxLCAncycpIG9yIGFkZChkdXJhdGlvbilcbiAgICBmdW5jdGlvbiBhZGQkMShpbnB1dCwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGFkZFN1YnRyYWN0JDEodGhpcywgaW5wdXQsIHZhbHVlLCAxKTtcbiAgICB9XG5cbiAgICAvLyBzdXBwb3J0cyBvbmx5IDIuMC1zdHlsZSBzdWJ0cmFjdCgxLCAncycpIG9yIHN1YnRyYWN0KGR1cmF0aW9uKVxuICAgIGZ1bmN0aW9uIHN1YnRyYWN0JDEoaW5wdXQsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBhZGRTdWJ0cmFjdCQxKHRoaXMsIGlucHV0LCB2YWx1ZSwgLTEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFic0NlaWwobnVtYmVyKSB7XG4gICAgICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihudW1iZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguY2VpbChudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYnViYmxlKCkge1xuICAgICAgICB2YXIgbWlsbGlzZWNvbmRzID0gdGhpcy5fbWlsbGlzZWNvbmRzLFxuICAgICAgICAgICAgZGF5cyA9IHRoaXMuX2RheXMsXG4gICAgICAgICAgICBtb250aHMgPSB0aGlzLl9tb250aHMsXG4gICAgICAgICAgICBkYXRhID0gdGhpcy5fZGF0YSxcbiAgICAgICAgICAgIHNlY29uZHMsXG4gICAgICAgICAgICBtaW51dGVzLFxuICAgICAgICAgICAgaG91cnMsXG4gICAgICAgICAgICB5ZWFycyxcbiAgICAgICAgICAgIG1vbnRoc0Zyb21EYXlzO1xuXG4gICAgICAgIC8vIGlmIHdlIGhhdmUgYSBtaXggb2YgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHZhbHVlcywgYnViYmxlIGRvd24gZmlyc3RcbiAgICAgICAgLy8gY2hlY2s6IGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8yMTY2XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgKG1pbGxpc2Vjb25kcyA+PSAwICYmIGRheXMgPj0gMCAmJiBtb250aHMgPj0gMCkgfHxcbiAgICAgICAgICAgICAgICAobWlsbGlzZWNvbmRzIDw9IDAgJiYgZGF5cyA8PSAwICYmIG1vbnRocyA8PSAwKVxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kcyArPSBhYnNDZWlsKG1vbnRoc1RvRGF5cyhtb250aHMpICsgZGF5cykgKiA4NjRlNTtcbiAgICAgICAgICAgIGRheXMgPSAwO1xuICAgICAgICAgICAgbW9udGhzID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgY29kZSBidWJibGVzIHVwIHZhbHVlcywgc2VlIHRoZSB0ZXN0cyBmb3JcbiAgICAgICAgLy8gZXhhbXBsZXMgb2Ygd2hhdCB0aGF0IG1lYW5zLlxuICAgICAgICBkYXRhLm1pbGxpc2Vjb25kcyA9IG1pbGxpc2Vjb25kcyAlIDEwMDA7XG5cbiAgICAgICAgc2Vjb25kcyA9IGFic0Zsb29yKG1pbGxpc2Vjb25kcyAvIDEwMDApO1xuICAgICAgICBkYXRhLnNlY29uZHMgPSBzZWNvbmRzICUgNjA7XG5cbiAgICAgICAgbWludXRlcyA9IGFic0Zsb29yKHNlY29uZHMgLyA2MCk7XG4gICAgICAgIGRhdGEubWludXRlcyA9IG1pbnV0ZXMgJSA2MDtcblxuICAgICAgICBob3VycyA9IGFic0Zsb29yKG1pbnV0ZXMgLyA2MCk7XG4gICAgICAgIGRhdGEuaG91cnMgPSBob3VycyAlIDI0O1xuXG4gICAgICAgIGRheXMgKz0gYWJzRmxvb3IoaG91cnMgLyAyNCk7XG5cbiAgICAgICAgLy8gY29udmVydCBkYXlzIHRvIG1vbnRoc1xuICAgICAgICBtb250aHNGcm9tRGF5cyA9IGFic0Zsb29yKGRheXNUb01vbnRocyhkYXlzKSk7XG4gICAgICAgIG1vbnRocyArPSBtb250aHNGcm9tRGF5cztcbiAgICAgICAgZGF5cyAtPSBhYnNDZWlsKG1vbnRoc1RvRGF5cyhtb250aHNGcm9tRGF5cykpO1xuXG4gICAgICAgIC8vIDEyIG1vbnRocyAtPiAxIHllYXJcbiAgICAgICAgeWVhcnMgPSBhYnNGbG9vcihtb250aHMgLyAxMik7XG4gICAgICAgIG1vbnRocyAlPSAxMjtcblxuICAgICAgICBkYXRhLmRheXMgPSBkYXlzO1xuICAgICAgICBkYXRhLm1vbnRocyA9IG1vbnRocztcbiAgICAgICAgZGF0YS55ZWFycyA9IHllYXJzO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRheXNUb01vbnRocyhkYXlzKSB7XG4gICAgICAgIC8vIDQwMCB5ZWFycyBoYXZlIDE0NjA5NyBkYXlzICh0YWtpbmcgaW50byBhY2NvdW50IGxlYXAgeWVhciBydWxlcylcbiAgICAgICAgLy8gNDAwIHllYXJzIGhhdmUgMTIgbW9udGhzID09PSA0ODAwXG4gICAgICAgIHJldHVybiAoZGF5cyAqIDQ4MDApIC8gMTQ2MDk3O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbnRoc1RvRGF5cyhtb250aHMpIHtcbiAgICAgICAgLy8gdGhlIHJldmVyc2Ugb2YgZGF5c1RvTW9udGhzXG4gICAgICAgIHJldHVybiAobW9udGhzICogMTQ2MDk3KSAvIDQ4MDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXModW5pdHMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGF5cyxcbiAgICAgICAgICAgIG1vbnRocyxcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kcyA9IHRoaXMuX21pbGxpc2Vjb25kcztcblxuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcblxuICAgICAgICBpZiAodW5pdHMgPT09ICdtb250aCcgfHwgdW5pdHMgPT09ICdxdWFydGVyJyB8fCB1bml0cyA9PT0gJ3llYXInKSB7XG4gICAgICAgICAgICBkYXlzID0gdGhpcy5fZGF5cyArIG1pbGxpc2Vjb25kcyAvIDg2NGU1O1xuICAgICAgICAgICAgbW9udGhzID0gdGhpcy5fbW9udGhzICsgZGF5c1RvTW9udGhzKGRheXMpO1xuICAgICAgICAgICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICAgICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRocztcbiAgICAgICAgICAgICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRocyAvIDM7XG4gICAgICAgICAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtb250aHMgLyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGhhbmRsZSBtaWxsaXNlY29uZHMgc2VwYXJhdGVseSBiZWNhdXNlIG9mIGZsb2F0aW5nIHBvaW50IG1hdGggZXJyb3JzIChpc3N1ZSAjMTg2NylcbiAgICAgICAgICAgIGRheXMgPSB0aGlzLl9kYXlzICsgTWF0aC5yb3VuZChtb250aHNUb0RheXModGhpcy5fbW9udGhzKSk7XG4gICAgICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXlzIC8gNyArIG1pbGxpc2Vjb25kcyAvIDYwNDhlNTtcbiAgICAgICAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF5cyArIG1pbGxpc2Vjb25kcyAvIDg2NGU1O1xuICAgICAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF5cyAqIDI0ICsgbWlsbGlzZWNvbmRzIC8gMzZlNTtcbiAgICAgICAgICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF5cyAqIDE0NDAgKyBtaWxsaXNlY29uZHMgLyA2ZTQ7XG4gICAgICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRheXMgKiA4NjQwMCArIG1pbGxpc2Vjb25kcyAvIDEwMDA7XG4gICAgICAgICAgICAgICAgLy8gTWF0aC5mbG9vciBwcmV2ZW50cyBmbG9hdGluZyBwb2ludCBtYXRoIGVycm9ycyBoZXJlXG4gICAgICAgICAgICAgICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihkYXlzICogODY0ZTUpICsgbWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biB1bml0ICcgKyB1bml0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlQXMoYWxpYXMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFzKGFsaWFzKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgYXNNaWxsaXNlY29uZHMgPSBtYWtlQXMoJ21zJyksXG4gICAgICAgIGFzU2Vjb25kcyA9IG1ha2VBcygncycpLFxuICAgICAgICBhc01pbnV0ZXMgPSBtYWtlQXMoJ20nKSxcbiAgICAgICAgYXNIb3VycyA9IG1ha2VBcygnaCcpLFxuICAgICAgICBhc0RheXMgPSBtYWtlQXMoJ2QnKSxcbiAgICAgICAgYXNXZWVrcyA9IG1ha2VBcygndycpLFxuICAgICAgICBhc01vbnRocyA9IG1ha2VBcygnTScpLFxuICAgICAgICBhc1F1YXJ0ZXJzID0gbWFrZUFzKCdRJyksXG4gICAgICAgIGFzWWVhcnMgPSBtYWtlQXMoJ3knKSxcbiAgICAgICAgdmFsdWVPZiQxID0gYXNNaWxsaXNlY29uZHM7XG5cbiAgICBmdW5jdGlvbiBjbG9uZSQxKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24odGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0JDIodW5pdHMpIHtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXNbdW5pdHMgKyAncyddKCkgOiBOYU47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUdldHRlcihuYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLl9kYXRhW25hbWVdIDogTmFOO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciBtaWxsaXNlY29uZHMgPSBtYWtlR2V0dGVyKCdtaWxsaXNlY29uZHMnKSxcbiAgICAgICAgc2Vjb25kcyA9IG1ha2VHZXR0ZXIoJ3NlY29uZHMnKSxcbiAgICAgICAgbWludXRlcyA9IG1ha2VHZXR0ZXIoJ21pbnV0ZXMnKSxcbiAgICAgICAgaG91cnMgPSBtYWtlR2V0dGVyKCdob3VycycpLFxuICAgICAgICBkYXlzID0gbWFrZUdldHRlcignZGF5cycpLFxuICAgICAgICBtb250aHMgPSBtYWtlR2V0dGVyKCdtb250aHMnKSxcbiAgICAgICAgeWVhcnMgPSBtYWtlR2V0dGVyKCd5ZWFycycpO1xuXG4gICAgZnVuY3Rpb24gd2Vla3MoKSB7XG4gICAgICAgIHJldHVybiBhYnNGbG9vcih0aGlzLmRheXMoKSAvIDcpO1xuICAgIH1cblxuICAgIHZhciByb3VuZCA9IE1hdGgucm91bmQsXG4gICAgICAgIHRocmVzaG9sZHMgPSB7XG4gICAgICAgICAgICBzczogNDQsIC8vIGEgZmV3IHNlY29uZHMgdG8gc2Vjb25kc1xuICAgICAgICAgICAgczogNDUsIC8vIHNlY29uZHMgdG8gbWludXRlXG4gICAgICAgICAgICBtOiA0NSwgLy8gbWludXRlcyB0byBob3VyXG4gICAgICAgICAgICBoOiAyMiwgLy8gaG91cnMgdG8gZGF5XG4gICAgICAgICAgICBkOiAyNiwgLy8gZGF5cyB0byBtb250aC93ZWVrXG4gICAgICAgICAgICB3OiBudWxsLCAvLyB3ZWVrcyB0byBtb250aFxuICAgICAgICAgICAgTTogMTEsIC8vIG1vbnRocyB0byB5ZWFyXG4gICAgICAgIH07XG5cbiAgICAvLyBoZWxwZXIgZnVuY3Rpb24gZm9yIG1vbWVudC5mbi5mcm9tLCBtb21lbnQuZm4uZnJvbU5vdywgYW5kIG1vbWVudC5kdXJhdGlvbi5mbi5odW1hbml6ZVxuICAgIGZ1bmN0aW9uIHN1YnN0aXR1dGVUaW1lQWdvKHN0cmluZywgbnVtYmVyLCB3aXRob3V0U3VmZml4LCBpc0Z1dHVyZSwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUucmVsYXRpdmVUaW1lKG51bWJlciB8fCAxLCAhIXdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZSQxKHBvc05lZ0R1cmF0aW9uLCB3aXRob3V0U3VmZml4LCB0aHJlc2hvbGRzLCBsb2NhbGUpIHtcbiAgICAgICAgdmFyIGR1cmF0aW9uID0gY3JlYXRlRHVyYXRpb24ocG9zTmVnRHVyYXRpb24pLmFicygpLFxuICAgICAgICAgICAgc2Vjb25kcyA9IHJvdW5kKGR1cmF0aW9uLmFzKCdzJykpLFxuICAgICAgICAgICAgbWludXRlcyA9IHJvdW5kKGR1cmF0aW9uLmFzKCdtJykpLFxuICAgICAgICAgICAgaG91cnMgPSByb3VuZChkdXJhdGlvbi5hcygnaCcpKSxcbiAgICAgICAgICAgIGRheXMgPSByb3VuZChkdXJhdGlvbi5hcygnZCcpKSxcbiAgICAgICAgICAgIG1vbnRocyA9IHJvdW5kKGR1cmF0aW9uLmFzKCdNJykpLFxuICAgICAgICAgICAgd2Vla3MgPSByb3VuZChkdXJhdGlvbi5hcygndycpKSxcbiAgICAgICAgICAgIHllYXJzID0gcm91bmQoZHVyYXRpb24uYXMoJ3knKSksXG4gICAgICAgICAgICBhID1cbiAgICAgICAgICAgICAgICAoc2Vjb25kcyA8PSB0aHJlc2hvbGRzLnNzICYmIFsncycsIHNlY29uZHNdKSB8fFxuICAgICAgICAgICAgICAgIChzZWNvbmRzIDwgdGhyZXNob2xkcy5zICYmIFsnc3MnLCBzZWNvbmRzXSkgfHxcbiAgICAgICAgICAgICAgICAobWludXRlcyA8PSAxICYmIFsnbSddKSB8fFxuICAgICAgICAgICAgICAgIChtaW51dGVzIDwgdGhyZXNob2xkcy5tICYmIFsnbW0nLCBtaW51dGVzXSkgfHxcbiAgICAgICAgICAgICAgICAoaG91cnMgPD0gMSAmJiBbJ2gnXSkgfHxcbiAgICAgICAgICAgICAgICAoaG91cnMgPCB0aHJlc2hvbGRzLmggJiYgWydoaCcsIGhvdXJzXSkgfHxcbiAgICAgICAgICAgICAgICAoZGF5cyA8PSAxICYmIFsnZCddKSB8fFxuICAgICAgICAgICAgICAgIChkYXlzIDwgdGhyZXNob2xkcy5kICYmIFsnZGQnLCBkYXlzXSk7XG5cbiAgICAgICAgaWYgKHRocmVzaG9sZHMudyAhPSBudWxsKSB7XG4gICAgICAgICAgICBhID1cbiAgICAgICAgICAgICAgICBhIHx8XG4gICAgICAgICAgICAgICAgKHdlZWtzIDw9IDEgJiYgWyd3J10pIHx8XG4gICAgICAgICAgICAgICAgKHdlZWtzIDwgdGhyZXNob2xkcy53ICYmIFsnd3cnLCB3ZWVrc10pO1xuICAgICAgICB9XG4gICAgICAgIGEgPSBhIHx8XG4gICAgICAgICAgICAobW9udGhzIDw9IDEgJiYgWydNJ10pIHx8XG4gICAgICAgICAgICAobW9udGhzIDwgdGhyZXNob2xkcy5NICYmIFsnTU0nLCBtb250aHNdKSB8fFxuICAgICAgICAgICAgKHllYXJzIDw9IDEgJiYgWyd5J10pIHx8IFsneXknLCB5ZWFyc107XG5cbiAgICAgICAgYVsyXSA9IHdpdGhvdXRTdWZmaXg7XG4gICAgICAgIGFbM10gPSArcG9zTmVnRHVyYXRpb24gPiAwO1xuICAgICAgICBhWzRdID0gbG9jYWxlO1xuICAgICAgICByZXR1cm4gc3Vic3RpdHV0ZVRpbWVBZ28uYXBwbHkobnVsbCwgYSk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIHNldCB0aGUgcm91bmRpbmcgZnVuY3Rpb24gZm9yIHJlbGF0aXZlIHRpbWUgc3RyaW5nc1xuICAgIGZ1bmN0aW9uIGdldFNldFJlbGF0aXZlVGltZVJvdW5kaW5nKHJvdW5kaW5nRnVuY3Rpb24pIHtcbiAgICAgICAgaWYgKHJvdW5kaW5nRnVuY3Rpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJvdW5kO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygcm91bmRpbmdGdW5jdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcm91bmQgPSByb3VuZGluZ0Z1bmN0aW9uO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHlvdSB0byBzZXQgYSB0aHJlc2hvbGQgZm9yIHJlbGF0aXZlIHRpbWUgc3RyaW5nc1xuICAgIGZ1bmN0aW9uIGdldFNldFJlbGF0aXZlVGltZVRocmVzaG9sZCh0aHJlc2hvbGQsIGxpbWl0KSB7XG4gICAgICAgIGlmICh0aHJlc2hvbGRzW3RocmVzaG9sZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaW1pdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhyZXNob2xkc1t0aHJlc2hvbGRdO1xuICAgICAgICB9XG4gICAgICAgIHRocmVzaG9sZHNbdGhyZXNob2xkXSA9IGxpbWl0O1xuICAgICAgICBpZiAodGhyZXNob2xkID09PSAncycpIHtcbiAgICAgICAgICAgIHRocmVzaG9sZHMuc3MgPSBsaW1pdCAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaHVtYW5pemUoYXJnV2l0aFN1ZmZpeCwgYXJnVGhyZXNob2xkcykge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB3aXRoU3VmZml4ID0gZmFsc2UsXG4gICAgICAgICAgICB0aCA9IHRocmVzaG9sZHMsXG4gICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICBvdXRwdXQ7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBhcmdXaXRoU3VmZml4ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgYXJnVGhyZXNob2xkcyA9IGFyZ1dpdGhTdWZmaXg7XG4gICAgICAgICAgICBhcmdXaXRoU3VmZml4ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhcmdXaXRoU3VmZml4ID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHdpdGhTdWZmaXggPSBhcmdXaXRoU3VmZml4O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYXJnVGhyZXNob2xkcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHRoID0gT2JqZWN0LmFzc2lnbih7fSwgdGhyZXNob2xkcywgYXJnVGhyZXNob2xkcyk7XG4gICAgICAgICAgICBpZiAoYXJnVGhyZXNob2xkcy5zICE9IG51bGwgJiYgYXJnVGhyZXNob2xkcy5zcyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGguc3MgPSBhcmdUaHJlc2hvbGRzLnMgLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbG9jYWxlID0gdGhpcy5sb2NhbGVEYXRhKCk7XG4gICAgICAgIG91dHB1dCA9IHJlbGF0aXZlVGltZSQxKHRoaXMsICF3aXRoU3VmZml4LCB0aCwgbG9jYWxlKTtcblxuICAgICAgICBpZiAod2l0aFN1ZmZpeCkge1xuICAgICAgICAgICAgb3V0cHV0ID0gbG9jYWxlLnBhc3RGdXR1cmUoK3RoaXMsIG91dHB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbG9jYWxlLnBvc3Rmb3JtYXQob3V0cHV0KTtcbiAgICB9XG5cbiAgICB2YXIgYWJzJDEgPSBNYXRoLmFicztcblxuICAgIGZ1bmN0aW9uIHNpZ24oeCkge1xuICAgICAgICByZXR1cm4gKHggPiAwKSAtICh4IDwgMCkgfHwgK3g7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9JU09TdHJpbmckMSgpIHtcbiAgICAgICAgLy8gZm9yIElTTyBzdHJpbmdzIHdlIGRvIG5vdCB1c2UgdGhlIG5vcm1hbCBidWJibGluZyBydWxlczpcbiAgICAgICAgLy8gICogbWlsbGlzZWNvbmRzIGJ1YmJsZSB1cCB1bnRpbCB0aGV5IGJlY29tZSBob3Vyc1xuICAgICAgICAvLyAgKiBkYXlzIGRvIG5vdCBidWJibGUgYXQgYWxsXG4gICAgICAgIC8vICAqIG1vbnRocyBidWJibGUgdXAgdW50aWwgdGhleSBiZWNvbWUgeWVhcnNcbiAgICAgICAgLy8gVGhpcyBpcyBiZWNhdXNlIHRoZXJlIGlzIG5vIGNvbnRleHQtZnJlZSBjb252ZXJzaW9uIGJldHdlZW4gaG91cnMgYW5kIGRheXNcbiAgICAgICAgLy8gKHRoaW5rIG9mIGNsb2NrIGNoYW5nZXMpXG4gICAgICAgIC8vIGFuZCBhbHNvIG5vdCBiZXR3ZWVuIGRheXMgYW5kIG1vbnRocyAoMjgtMzEgZGF5cyBwZXIgbW9udGgpXG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNlY29uZHMgPSBhYnMkMSh0aGlzLl9taWxsaXNlY29uZHMpIC8gMTAwMCxcbiAgICAgICAgICAgIGRheXMgPSBhYnMkMSh0aGlzLl9kYXlzKSxcbiAgICAgICAgICAgIG1vbnRocyA9IGFicyQxKHRoaXMuX21vbnRocyksXG4gICAgICAgICAgICBtaW51dGVzLFxuICAgICAgICAgICAgaG91cnMsXG4gICAgICAgICAgICB5ZWFycyxcbiAgICAgICAgICAgIHMsXG4gICAgICAgICAgICB0b3RhbCA9IHRoaXMuYXNTZWNvbmRzKCksXG4gICAgICAgICAgICB0b3RhbFNpZ24sXG4gICAgICAgICAgICB5bVNpZ24sXG4gICAgICAgICAgICBkYXlzU2lnbixcbiAgICAgICAgICAgIGhtc1NpZ247XG5cbiAgICAgICAgaWYgKCF0b3RhbCkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgc2FtZSBhcyBDIydzIChOb2RhKSBhbmQgcHl0aG9uIChpc29kYXRlKS4uLlxuICAgICAgICAgICAgLy8gYnV0IG5vdCBvdGhlciBKUyAoZ29vZy5kYXRlKVxuICAgICAgICAgICAgcmV0dXJuICdQMEQnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMzYwMCBzZWNvbmRzIC0+IDYwIG1pbnV0ZXMgLT4gMSBob3VyXG4gICAgICAgIG1pbnV0ZXMgPSBhYnNGbG9vcihzZWNvbmRzIC8gNjApO1xuICAgICAgICBob3VycyA9IGFic0Zsb29yKG1pbnV0ZXMgLyA2MCk7XG4gICAgICAgIHNlY29uZHMgJT0gNjA7XG4gICAgICAgIG1pbnV0ZXMgJT0gNjA7XG5cbiAgICAgICAgLy8gMTIgbW9udGhzIC0+IDEgeWVhclxuICAgICAgICB5ZWFycyA9IGFic0Zsb29yKG1vbnRocyAvIDEyKTtcbiAgICAgICAgbW9udGhzICU9IDEyO1xuXG4gICAgICAgIC8vIGluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9kb3JkaWxsZS9tb21lbnQtaXNvZHVyYXRpb24vYmxvYi9tYXN0ZXIvbW9tZW50Lmlzb2R1cmF0aW9uLmpzXG4gICAgICAgIHMgPSBzZWNvbmRzID8gc2Vjb25kcy50b0ZpeGVkKDMpLnJlcGxhY2UoL1xcLj8wKyQvLCAnJykgOiAnJztcblxuICAgICAgICB0b3RhbFNpZ24gPSB0b3RhbCA8IDAgPyAnLScgOiAnJztcbiAgICAgICAgeW1TaWduID0gc2lnbih0aGlzLl9tb250aHMpICE9PSBzaWduKHRvdGFsKSA/ICctJyA6ICcnO1xuICAgICAgICBkYXlzU2lnbiA9IHNpZ24odGhpcy5fZGF5cykgIT09IHNpZ24odG90YWwpID8gJy0nIDogJyc7XG4gICAgICAgIGhtc1NpZ24gPSBzaWduKHRoaXMuX21pbGxpc2Vjb25kcykgIT09IHNpZ24odG90YWwpID8gJy0nIDogJyc7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRvdGFsU2lnbiArXG4gICAgICAgICAgICAnUCcgK1xuICAgICAgICAgICAgKHllYXJzID8geW1TaWduICsgeWVhcnMgKyAnWScgOiAnJykgK1xuICAgICAgICAgICAgKG1vbnRocyA/IHltU2lnbiArIG1vbnRocyArICdNJyA6ICcnKSArXG4gICAgICAgICAgICAoZGF5cyA/IGRheXNTaWduICsgZGF5cyArICdEJyA6ICcnKSArXG4gICAgICAgICAgICAoaG91cnMgfHwgbWludXRlcyB8fCBzZWNvbmRzID8gJ1QnIDogJycpICtcbiAgICAgICAgICAgIChob3VycyA/IGhtc1NpZ24gKyBob3VycyArICdIJyA6ICcnKSArXG4gICAgICAgICAgICAobWludXRlcyA/IGhtc1NpZ24gKyBtaW51dGVzICsgJ00nIDogJycpICtcbiAgICAgICAgICAgIChzZWNvbmRzID8gaG1zU2lnbiArIHMgKyAnUycgOiAnJylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB2YXIgcHJvdG8kMiA9IER1cmF0aW9uLnByb3RvdHlwZTtcblxuICAgIHByb3RvJDIuaXNWYWxpZCA9IGlzVmFsaWQkMTtcbiAgICBwcm90byQyLmFicyA9IGFicztcbiAgICBwcm90byQyLmFkZCA9IGFkZCQxO1xuICAgIHByb3RvJDIuc3VidHJhY3QgPSBzdWJ0cmFjdCQxO1xuICAgIHByb3RvJDIuYXMgPSBhcztcbiAgICBwcm90byQyLmFzTWlsbGlzZWNvbmRzID0gYXNNaWxsaXNlY29uZHM7XG4gICAgcHJvdG8kMi5hc1NlY29uZHMgPSBhc1NlY29uZHM7XG4gICAgcHJvdG8kMi5hc01pbnV0ZXMgPSBhc01pbnV0ZXM7XG4gICAgcHJvdG8kMi5hc0hvdXJzID0gYXNIb3VycztcbiAgICBwcm90byQyLmFzRGF5cyA9IGFzRGF5cztcbiAgICBwcm90byQyLmFzV2Vla3MgPSBhc1dlZWtzO1xuICAgIHByb3RvJDIuYXNNb250aHMgPSBhc01vbnRocztcbiAgICBwcm90byQyLmFzUXVhcnRlcnMgPSBhc1F1YXJ0ZXJzO1xuICAgIHByb3RvJDIuYXNZZWFycyA9IGFzWWVhcnM7XG4gICAgcHJvdG8kMi52YWx1ZU9mID0gdmFsdWVPZiQxO1xuICAgIHByb3RvJDIuX2J1YmJsZSA9IGJ1YmJsZTtcbiAgICBwcm90byQyLmNsb25lID0gY2xvbmUkMTtcbiAgICBwcm90byQyLmdldCA9IGdldCQyO1xuICAgIHByb3RvJDIubWlsbGlzZWNvbmRzID0gbWlsbGlzZWNvbmRzO1xuICAgIHByb3RvJDIuc2Vjb25kcyA9IHNlY29uZHM7XG4gICAgcHJvdG8kMi5taW51dGVzID0gbWludXRlcztcbiAgICBwcm90byQyLmhvdXJzID0gaG91cnM7XG4gICAgcHJvdG8kMi5kYXlzID0gZGF5cztcbiAgICBwcm90byQyLndlZWtzID0gd2Vla3M7XG4gICAgcHJvdG8kMi5tb250aHMgPSBtb250aHM7XG4gICAgcHJvdG8kMi55ZWFycyA9IHllYXJzO1xuICAgIHByb3RvJDIuaHVtYW5pemUgPSBodW1hbml6ZTtcbiAgICBwcm90byQyLnRvSVNPU3RyaW5nID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLnRvU3RyaW5nID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLnRvSlNPTiA9IHRvSVNPU3RyaW5nJDE7XG4gICAgcHJvdG8kMi5sb2NhbGUgPSBsb2NhbGU7XG4gICAgcHJvdG8kMi5sb2NhbGVEYXRhID0gbG9jYWxlRGF0YTtcblxuICAgIHByb3RvJDIudG9Jc29TdHJpbmcgPSBkZXByZWNhdGUoXG4gICAgICAgICd0b0lzb1N0cmluZygpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdG9JU09TdHJpbmcoKSBpbnN0ZWFkIChub3RpY2UgdGhlIGNhcGl0YWxzKScsXG4gICAgICAgIHRvSVNPU3RyaW5nJDFcbiAgICApO1xuICAgIHByb3RvJDIubGFuZyA9IGxhbmc7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignWCcsIDAsIDAsICd1bml4Jyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ3gnLCAwLCAwLCAndmFsdWVPZicpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbigneCcsIG1hdGNoU2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCdYJywgbWF0Y2hUaW1lc3RhbXApO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1gnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUocGFyc2VGbG9hdChpbnB1dCkgKiAxMDAwKTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCd4JywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKHRvSW50KGlucHV0KSk7XG4gICAgfSk7XG5cbiAgICAvLyEgbW9tZW50LmpzXG5cbiAgICBob29rcy52ZXJzaW9uID0gJzIuMzAuMSc7XG5cbiAgICBzZXRIb29rQ2FsbGJhY2soY3JlYXRlTG9jYWwpO1xuXG4gICAgaG9va3MuZm4gPSBwcm90bztcbiAgICBob29rcy5taW4gPSBtaW47XG4gICAgaG9va3MubWF4ID0gbWF4O1xuICAgIGhvb2tzLm5vdyA9IG5vdztcbiAgICBob29rcy51dGMgPSBjcmVhdGVVVEM7XG4gICAgaG9va3MudW5peCA9IGNyZWF0ZVVuaXg7XG4gICAgaG9va3MubW9udGhzID0gbGlzdE1vbnRocztcbiAgICBob29rcy5pc0RhdGUgPSBpc0RhdGU7XG4gICAgaG9va3MubG9jYWxlID0gZ2V0U2V0R2xvYmFsTG9jYWxlO1xuICAgIGhvb2tzLmludmFsaWQgPSBjcmVhdGVJbnZhbGlkO1xuICAgIGhvb2tzLmR1cmF0aW9uID0gY3JlYXRlRHVyYXRpb247XG4gICAgaG9va3MuaXNNb21lbnQgPSBpc01vbWVudDtcbiAgICBob29rcy53ZWVrZGF5cyA9IGxpc3RXZWVrZGF5cztcbiAgICBob29rcy5wYXJzZVpvbmUgPSBjcmVhdGVJblpvbmU7XG4gICAgaG9va3MubG9jYWxlRGF0YSA9IGdldExvY2FsZTtcbiAgICBob29rcy5pc0R1cmF0aW9uID0gaXNEdXJhdGlvbjtcbiAgICBob29rcy5tb250aHNTaG9ydCA9IGxpc3RNb250aHNTaG9ydDtcbiAgICBob29rcy53ZWVrZGF5c01pbiA9IGxpc3RXZWVrZGF5c01pbjtcbiAgICBob29rcy5kZWZpbmVMb2NhbGUgPSBkZWZpbmVMb2NhbGU7XG4gICAgaG9va3MudXBkYXRlTG9jYWxlID0gdXBkYXRlTG9jYWxlO1xuICAgIGhvb2tzLmxvY2FsZXMgPSBsaXN0TG9jYWxlcztcbiAgICBob29rcy53ZWVrZGF5c1Nob3J0ID0gbGlzdFdlZWtkYXlzU2hvcnQ7XG4gICAgaG9va3Mubm9ybWFsaXplVW5pdHMgPSBub3JtYWxpemVVbml0cztcbiAgICBob29rcy5yZWxhdGl2ZVRpbWVSb3VuZGluZyA9IGdldFNldFJlbGF0aXZlVGltZVJvdW5kaW5nO1xuICAgIGhvb2tzLnJlbGF0aXZlVGltZVRocmVzaG9sZCA9IGdldFNldFJlbGF0aXZlVGltZVRocmVzaG9sZDtcbiAgICBob29rcy5jYWxlbmRhckZvcm1hdCA9IGdldENhbGVuZGFyRm9ybWF0O1xuICAgIGhvb2tzLnByb3RvdHlwZSA9IHByb3RvO1xuXG4gICAgLy8gY3VycmVudGx5IEhUTUw1IGlucHV0IHR5cGUgb25seSBzdXBwb3J0cyAyNC1ob3VyIGZvcm1hdHNcbiAgICBob29rcy5IVE1MNV9GTVQgPSB7XG4gICAgICAgIERBVEVUSU1FX0xPQ0FMOiAnWVlZWS1NTS1ERFRISDptbScsIC8vIDxpbnB1dCB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiAvPlxuICAgICAgICBEQVRFVElNRV9MT0NBTF9TRUNPTkRTOiAnWVlZWS1NTS1ERFRISDptbTpzcycsIC8vIDxpbnB1dCB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiBzdGVwPVwiMVwiIC8+XG4gICAgICAgIERBVEVUSU1FX0xPQ0FMX01TOiAnWVlZWS1NTS1ERFRISDptbTpzcy5TU1MnLCAvLyA8aW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgc3RlcD1cIjAuMDAxXCIgLz5cbiAgICAgICAgREFURTogJ1lZWVktTU0tREQnLCAvLyA8aW5wdXQgdHlwZT1cImRhdGVcIiAvPlxuICAgICAgICBUSU1FOiAnSEg6bW0nLCAvLyA8aW5wdXQgdHlwZT1cInRpbWVcIiAvPlxuICAgICAgICBUSU1FX1NFQ09ORFM6ICdISDptbTpzcycsIC8vIDxpbnB1dCB0eXBlPVwidGltZVwiIHN0ZXA9XCIxXCIgLz5cbiAgICAgICAgVElNRV9NUzogJ0hIOm1tOnNzLlNTUycsIC8vIDxpbnB1dCB0eXBlPVwidGltZVwiIHN0ZXA9XCIwLjAwMVwiIC8+XG4gICAgICAgIFdFRUs6ICdHR0dHLVtXXVdXJywgLy8gPGlucHV0IHR5cGU9XCJ3ZWVrXCIgLz5cbiAgICAgICAgTU9OVEg6ICdZWVlZLU1NJywgLy8gPGlucHV0IHR5cGU9XCJtb250aFwiIC8+XG4gICAgfTtcblxuICAgIHJldHVybiBob29rcztcblxufSkpKTtcbiJdfQ=="}