1import { createHotContext as __vite__createHotContext } from "/@vite/client";import.meta.hot = __vite__createHotContext("/src/app/pages/checklist/ChecklistPage.tsx");if (!window.$RefreshReg$) throw new Error("React refresh preamble was not loaded. Something is wrong."); 2const prevRefreshReg = window.$RefreshReg$; 3const prevRefreshSig = window.$RefreshSig$; 4window.$RefreshReg$ = RefreshRuntime.getRefreshReg("/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx"); 5window.$RefreshSig$ = RefreshRuntime.createSignatureFunctionForTransform; 6 7import * as RefreshRuntime from "/@react-refresh"; 8 9import __vite__cjsImport1_react_jsxDevRuntime from "/node_modules/.vite/deps/react_jsx-dev-runtime.js?v=e8ce80ae"; const _jsxDEV = __vite__cjsImport1_react_jsxDevRuntime["jsxDEV"]; 10var _s = $RefreshSig$(); 11import axios from "/node_modules/.vite/deps/axios.js?v=e8ce80ae"; 12import Swal from "/node_modules/.vite/deps/sweetalert2.js?v=e8ce80ae"; 13import __vite__cjsImport4_react from "/node_modules/.vite/deps/react.js?v=e8ce80ae"; const useEffect = __vite__cjsImport4_react["useEffect"]; const useRef = __vite__cjsImport4_react["useRef"]; const useState = __vite__cjsImport4_react["useState"]; 14import { useNavigate } from "/node_modules/.vite/deps/react-router-dom.js?v=e8ce80ae"; 15import { CUREENT_COMPANY_NAME, DAY_STRING, CHECK_USER_VIDEO_EXIST, GET_CHECKLIST, GET_ALL_SUBSCRIPTIONPLANS, GET_CAMPAIGNS_BY_COMPANY_USER_AND_FB_ACC, LIFETIME_STRING, LIVE_PLAN, MONTHLY_PLAN_PRICE, MONTH_STRING, POST_SAVE_TASK_VALUE, systemAuthorities, TRIAL_PERIOD_DAYS, WEEK_STRING, YEARLY_PLAN_PRICE, YEAR_STRING } from "/src/app/Constants.tsx"; 16import DateRangeSelector from "/src/app/pages/dashboard/components/DateRangeSelector.tsx"; 17import { useAuth } from "/src/app/modules/auth/index.ts"; 18import { DATE_FORMAT_MMMM_DD_YYYY, getUserTimeZoneBasedCurrentDate } from "/src/app/DateConstants.tsx"; 19import DailyActivityLog from "/src/app/pages/checklist/components/DailyActivityLog.tsx"; 20import FindProspectsOverview from "/src/app/pages/checklist/components/FindProspectsOverview.tsx"; 21import StartConversationsSection from "/src/app/pages/checklist/components/StartConversationsSection.tsx"; 22import ChecklistSection from "/src/app/pages/checklist/components/ChecklistSection.tsx"; 23import { Content } from "/src/config/layout/components/Content.tsx"; 24import { disableSplashScreen, enableSplashScreen } from "/src/app/pages/common/CommonUtilities.tsx"; 25import { getUserByToken } from "/src/app/modules/auth/core/_requests.ts"; 26import UploadVideo from "/src/app/pages/public/components/UploadVideo.tsx"; 27import MonthlyInfo from "/src/app/pages/public/components/MonthlyInfo.tsx"; 28import "/src/app/pages/checklist/css/checklist.css"; 29import DatePicker from "/node_modules/.vite/deps/react-datepicker.js?v=e8ce80ae"; 30import { registerLocale } from "/node_modules/.vite/deps/react-datepicker.js?v=e8ce80ae"; 31import { enGB } from "/node_modules/.vite/deps/date-fns_locale.js?v=e8ce80ae"; 32registerLocale("en-GB", enGB); 33const isOverallValidationErrorMessage = (message)=>message?.type === "error" && message.text === "Overall Accepted should be less than or equal to Overall Sent."; 34// Validates the date-range key used by the date filter UI. 35const isValidRange = (value)=>value === LIFETIME_STRING || value === DAY_STRING || value === WEEK_STRING || value === MONTH_STRING || value === YEAR_STRING; 36const defaultSectionMeta = { 37 "Find Prospects": { 38 number: 1, 39 title: "Find Prospects" 40 }, 41 "Start Conversations": { 42 number: 2, 43 title: "Start Conversations" 44 }, 45 "Build Relationships": { 46 number: 3, 47 title: "Build Relationships" 48 }, 49 "Stay Connected": { 50 number: 4, 51 title: "Stay Connected" 52 }, 53 Community: { 54 number: 5, 55 title: "Community" 56 }, 57 Success: { 58 number: 6, 59 title: "Success" 60 } 61}; 62// Resolves the display order/title for a section, falling back to defaults. 63const getSectionMeta = (section, fallbackName)=>{ 64 const fallback = fallbackName ? defaultSectionMeta[fallbackName] : undefined; 65 return { 66 number: section?.displayOrder ?? fallback?.number ?? 0, 67 title: section?.name ?? fallback?.title ?? "" 68 }; 69}; 70// Safely picks a provider id (platformId preferred). 71const getProviderPlatformId = (provider)=>provider?.platformId ?? provider?.id; 72// Detects whether the provider represents Facebook. 73const isFacebookProvider = (provider)=>provider?.name?.toLowerCase().includes("facebook") ?? false; 74// Picks the primary (Facebook) and secondary providers for the UI. 75const resolveSocialProviders = (providers = [])=>{ 76 const facebookProvider = providers.find((provider)=>isFacebookProvider(provider)) ?? providers[0]; 77 const otherProvider = providers.find((provider)=>provider !== facebookProvider && !isFacebookProvider(provider)) ?? providers.find((provider)=>provider !== facebookProvider); 78 return { 79 facebookProvider, 80 otherProvider 81 }; 82}; 83// Builds the Lifetime Conversion Rate summary card row. 84const getLifetimeConversionRateCard = (sections = [])=>{ 85 const totalSections = sections.length || 6; 86 const completedSections = sections.filter((section)=>section.allTaskCompleted).length; 87 const percentage = totalSections > 0 ? Math.round(completedSections / totalSections * 100) : 0; 88 console.log("Lifetime Conversion Rate section completion states:", sections.map((section)=>({ 89 id: section.id, 90 name: section.name, 91 allTaskCompleted: !!section.allTaskCompleted 92 }))); 93 console.log("Lifetime Conversion Rate calculation:", { 94 formula: `(${completedSections} / ${totalSections}) * 100`, 95 completedSections, 96 totalSections, 97 rawPercentage: totalSections > 0 ? completedSections / totalSections * 100 : 0, 98 roundedPercentage: percentage 99 });
100 let className = "lifetime-conversion-rate lifetime-rate-red"; 101 if (percentage > 20) { 102 className = "lifetime-conversion-rate lifetime-rate-blue"; 103 } else if (percentage >= 10 && percentage <= 20) { 104 className = "lifetime-conversion-rate lifetime-rate-orange"; 105 } 106 return { 107 label: "Lifetime Conversion Rate", 108 value: `${completedSections} in ${totalSections} (${percentage}%)`, 109 className 110 }; 111}; 112// Computes conversion-rate stats and UI tone for the Success section. 113const getLifetimeConversionRateData = (sections = [])=>{ 114 const totalSections = sections.length || 6; 115 const completedSections = sections.filter((section)=>section.allTaskCompleted).length; 116 const percentage = totalSections > 0 ? Math.round(completedSections / totalSections * 100) : 0; 117 let toneClassName = "lifetime-rate-red"; 118 let badgeText = "Stay consistent. Keep going."; 119 if (percentage > 20) { 120 toneClassName = "lifetime-rate-blue"; 121 badgeText = "You did it. 1 in 5."; 122 } else if (percentage >= 10 && percentage <= 20) { 123 toneClassName = "lifetime-rate-orange"; 124 badgeText = "Almost there. Keep going."; 125 } 126 console.log("success-conversion-percent:", { 127 completedSections, 128 totalSections, 129 percentage, 130 toneClassName 131 }); 132 return { 133 completedSections, 134 totalSections, 135 percentage, 136 toneClassName, 137 badgeText 138 }; 139}; 140// Builds initial toggle state from API payload. 141const getInitialToggleValues = (sections = [])=>sections.reduce((acc, section)=>{ 142 (section.tasks ?? []).forEach((task)=>{ 143 if (task.inputType === "TOGGLE") { 144 acc[task.id] = !!task.value?.booleanValue; 145 } 146 }); 147 return acc; 148 }, {}); 149// Normalizes input values so we store booleans/numbers consistently. 150const normalizeChecklistValue = (value)=>{ 151 if (typeof value !== "string") { 152 return value; 153 } 154 const trimmedValue = value.trim(); 155 if (trimmedValue === "") { 156 return ""; 157 } 158 const numericValue = Number(trimmedValue); 159 return Number.isNaN(numericValue) ? trimmedValue : numericValue; 160}; 161// Formats a date/time for saving checklist entries. 162const formatChecklistEntryDate = (date)=>{ 163 const year = date.getFullYear();
164 const month = String(date.getMonth() + 1).padStart(2, "0"); 165 const day = String(date.getDate()).padStart(2, "0"); 166 const hours = String(date.getHours()).padStart(2, "0"); 167 const minutes = String(date.getMinutes()).padStart(2, "0"); 168 return `${year}-${month}-${day} ${hours}:${minutes}`; 169}; 170// Formats a date for filtering (00:00 time). 171const formatChecklistFilterDate = (date)=>{ 172 const year = date.getFullYear(); 173 const month = String(date.getMonth() + 1).padStart(2, "0"); 174 const day = String(date.getDate()).padStart(2, "0"); 175 return `${year}-${month}-${day} 00:00`; 176}; 177const parseFilterDate = (value)=>{ 178 if (!value) return null; 179 const normalized = value.replace(" ", "T"); 180 const parsed = new Date(normalized); 181 return Number.isNaN(parsed.getTime()) ? null : parsed; 182}; 183const formatShortDate = (date)=>new Intl.DateTimeFormat("en-US", { 184 month: "short", 185 day: "2-digit", 186 year: "numeric" 187 }).format(date); 188const formatMonthYear = (date)=>new Intl.DateTimeFormat("en-US", { 189 month: "long", 190 year: "numeric" 191 }).format(date); 192const getWeekRangeLabel = (date)=>{ 193 const day = date.getDay(); 194 // â Convert Sunday(0) â 6, Monday(1) â 0, ... 195 const diff = day === 0 ? -6 : 1 - day; 196 const weekStart = new Date(date); 197 weekStart.setDate(date.getDate() + diff); 198 const weekEnd = new Date(weekStart); 199 weekEnd.setDate(weekStart.getDate() + 6); 200 const sameMonth = weekStart.getMonth() === weekEnd.getMonth(); 201 const sameYear = weekStart.getFullYear() === weekEnd.getFullYear(); 202 if (sameMonth && sameYear) {
203 const month = new Intl.DateTimeFormat("en-US", { 204 month: "short" 205 }).format(weekStart); 206 const startDay = String(weekStart.getDate()).padStart(2, "0"); 207 const endDay = String(weekEnd.getDate()).padStart(2, "0"); 208 return `${month} ${startDay} â ${endDay}, ${weekStart.getFullYear()}`; 209 } 210 return `${formatShortDate(weekStart)} â ${formatShortDate(weekEnd)}`; 211}; 212const buildActivityHeaderLabel = (selectedRange, selectedDate, filter)=>{ 213 const hasAdvancedDateFilter = !!filter?.startDate && !!filter?.endDate; 214 const fromDate = parseFilterDate(filter?.startDate); 215 const toDate = parseFilterDate(filter?.endDate); 216 if (hasAdvancedDateFilter && fromDate && toDate) { 217 if (fromDate.toDateString() === toDate.toDateString()) { 218 return `Weekly Activity Log - ${formatShortDate(fromDate)}`; 219 } 220 return `Weekly Activity Log - ${formatShortDate(fromDate)} â ${formatShortDate(toDate)}`; 221 } 222 if (selectedRange === WEEK_STRING) { 223 return `Weekly Activity Log - ${getWeekRangeLabel(selectedDate)}`; 224 } 225 if (selectedRange === MONTH_STRING) { 226 return `Monthly Activity Log - ${formatMonthYear(selectedDate)}`; 227 } 228 if (selectedRange === YEAR_STRING) { 229 return `Yearly Activity Log - ${selectedDate.getFullYear()}`; 230 } 231 if (selectedRange === LIFETIME_STRING) { 232 return `Lifetime Activity Summary `; 233 } 234 return `Daily Activity Log - ${formatShortDate(selectedDate)}`; 235}; 236// Converts a UI value into the API save payload shape. 237const buildTaskValueUpdate = (taskId, value)=>{ 238 const normalizedValue = normalizeChecklistValue(value); 239 if (typeof normalizedValue === "boolean") { 240 return { 241 taskId, 242 booleanValue: normalizedValue 243 }; 244 } 245 if (typeof normalizedValue === "number") { 246 return { 247 taskId, 248 numberValue: normalizedValue 249 }; 250 } 251 if (normalizedValue === "") { 252 return { 253 taskId, 254 numberValue: null 255 }; 256 } 257 const parsedNumberValue = Number(normalizedValue); 258 return { 259 taskId, 260 numberValue: Number.isNaN(parsedNumberValue) ? null : parsedNumberValue 261 }; 262}; 263// Ensures blank fields render as empty string instead of null/undefined. 264const getDisplayNumberValue = (value)=>value == null ? "" : value; 265// Safely extracts the checklist entry id from any API shape. 266const resolveChecklistEntryId = (payload)=>{ 267 if (!payload) { 268 return null; 269 } 270 const candidateIds = [ 271 payload.id, 272 payload.entryId, 273 payload.entry_id 274 ]; 275 for (const candidate of candidateIds){ 276 if (typeof candidate === "number" && Number.isFinite(candidate) && candidate > 0) { 277 return candidate; 278 } 279 } 280 return null; 281}; 282// Gets the "sent/accepted" task id for a provider. 283const getProviderTaskId = (provider, kind)=>{ 284 if (!provider) return undefined; 285 if (kind === "sent") { 286 return provider.sentTaskId ?? provider.friendRequestSentTaskId; 287 } 288 return provider.acceptedTaskId ?? provider.friendRequestAcceptedTaskId; 289}; 290// Calculates acceptance rate with 0-guard. 291const calculateLifetimeAcceptanceRate = (provider)=>{ 292 const overallSent = provider?.overallSent ?? 0; 293 const overallAccepted = provider?.overallAccepted ?? 0; 294 console.log("SmProvider is ", provider?.name); 295 console.log("overallSent @@@ :", overallSent); 296 console.log("overallAccepted: @@", overallAccepted); 297 if (provider?.name?.toLowerCase().includes("facebook")) { 298 return provider.acceptanceRate ?? 0; 299 } 300 // â Only fix: handle 0/0 for Other Platforms 301 if (provider?.name?.toLowerCase().includes("other") && overallSent === 0 && overallAccepted === 0) { 302 return 0; 303 } 304 return Math.round(overallAccepted / overallSent * 100); 305}; 306// â Main function (single source of truth) 307const getLifetimeAcceptanceRate = (provider)=>{ 308 const isFacebook = provider?.name?.toLowerCase().includes("facebook"); 309 // â For Facebook â STRICTLY use API (no calculation fallback) 310 if (isFacebook) { 311 return provider?.acceptanceRate ?? 0; 312 } 313 // â Others â calculated 314 return calculateLifetimeAcceptanceRate(provider); 315}; 316// â Logging wrapper (only for debug, no logic inside) 317const logLifetimeAcceptanceRate = (sectionName, providerLabel, provider)=>{ 318 const sent = provider?.sent ?? 0; 319 const accepted = provider?.accepted ?? 0; 320 const isFacebook = provider?.name?.toLowerCase().includes("facebook"); 321 const acceptanceRate = getLifetimeAcceptanceRate(provider); 322 console.log(`${sectionName} Lifetime Acceptance Rate`, { 323 provider: providerLabel, 324 source: isFacebook ? "API" : "CALCULATED", 325 sent, 326 accepted, 327 apiValue: provider?.acceptanceRate, 328 acceptanceRate 329 }); 330 return acceptanceRate; 331}; 332// Flattens nested task tree into rows for ChecklistSection rendering.
333const mapTasksToRows = (tasks = [], onAutosave, toggleValues = {}, allowEdit = false)=>{ 334 const childrenByParent = new Map(); 335 const rootTasks = []; 336 tasks.forEach((task)=>{ 337 if (task.parentId == null) { 338 rootTasks.push(task); 339 return; 340 } 341 const siblings = childrenByParent.get(task.parentId) ?? []; 342 siblings.push(task); 343 childrenByParent.set(task.parentId, siblings); 344 }); 345 // Sorts tasks by displayOrder for stable UI ordering. 346 const sortTasks = (items)=>[ 347 ...items 348 ].sort((a, b)=>(a.displayOrder ?? 0) - (b.displayOrder ?? 0)); 349 // Flattens nested tasks into rows with indent levels. 350 const flattenTasks = (items, depth = 0)=>sortTasks(items).flatMap((task)=>{ 351 const childRows = flattenTasks(childrenByParent.get(task.id) ?? [], depth + 1); 352 const hasExplicitInput = typeof task.inputType === "string" && task.inputType.length > 0; 353 if (!hasExplicitInput) { 354 return [ 355 { 356 label: task.name, 357 value: "", 358 isGroupLabel: true, 359 indentLevel: depth 360 }, 361 ...childRows 362 ]; 363 } 364 return [ 365 { 366 label: task.name, 367 allowEdit, 368 value: task.inputType === "TOGGLE" ? /*#__PURE__*/ _jsxDEV(ToggleSwitch, { 369 checked: toggleValues[task.id] ?? !!task.value?.booleanValue, 370 onChange: allowEdit ? (checked)=>onAutosave?.(task.id, task.platformId, checked) : undefined, 371 allowEdit: allowEdit 372 }, void 0, false, { 373 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 374 lineNumber: 569, 375 columnNumber: 15 376 }, this) : getDisplayNumberValue(task.value?.numberValue) ?? task.value?.booleanValue ?? "", 377 indentLevel: depth, 378 onValueCommit: task.inputType === "TOGGLE" ? undefined : allowEdit ? (value)=>onAutosave?.(task.id, task.platformId, value) : undefined 379 }, 380 ...childRows 381 ]; 382 }); 383 return flattenTasks(rootTasks); 384}; 385// Maps provider metrics to rows, including validation and autosave callbacks. 386const mapProviderToRows = (provider, onAutosave, options)=>{ 387 if (!provider) return []; 388 const calculatedAcceptanceRate = calculateLifetimeAcceptanceRate(provider); 389 const lifetimeAcceptanceToneClass = calculatedAcceptanceRate > 29 ? "lifetime-rate-blue" : calculatedAcceptanceRate >= 20 && calculatedAcceptanceRate <= 29 ? "lifetime-rate-orange" : "lifetime-rate-yellow"; 390 const platformId = getProviderPlatformId(provider); 391 const sentTaskId = getProviderTaskId(provider, "sent") ?? options?.sentTaskId; 392 const acceptedTaskId = getProviderTaskId(provider, "accepted") ?? options?.acceptedTaskId; 393 console.log("===== mapProviderToRows DEBUG ====="); 394 console.log("emptyMissingValues:", options?.emptyMissingValues); 395 console.log("isEditable:", options?.isEditable); 396 console.log("provider:", provider); 397 const resolvedSentValue = options?.sentValueOverride !== undefined ? options.sentValueOverride : provider.sent; 398 const resolvedAcceptedValue = options?.acceptedValueOverride !== undefined ? options.acceptedValueOverride : provider.accepted; 399 // â FINAL DISPLAY VALUES 400 const sentValue = resolvedSentValue === null || resolvedSentValue === undefined ? "" : resolvedSentValue; 401 const acceptedValue = resolvedAcceptedValue === null || resolvedAcceptedValue === undefined ? "" : resolvedAcceptedValue; 402 const isOtherPlatformsProvider = provider.name?.trim().toLowerCase() === "other platforms"; 403 // Normalizes provider numeric values for save/update operations. 404 const normalizeProviderFieldValue = (fieldValue)=>{ 405 if (typeof fieldValue !== "string") { 406 return null; 407 } 408 const trimmedValue = fieldValue.trim(); 409 if (trimmedValue === "") { 410 return null; 411 } 412 const parsedValue = Number(trimmedValue); 413 return Number.isNaN(parsedValue) ? null : parsedValue; 414 }; 415 const validateOverallConstraint = (nextValue, field)=>{
416 if (!isOtherPlatformsProvider) { 417 return { 418 isValid: true, 419 parsedValue: normalizeProviderFieldValue(nextValue) 420 }; 421 } 422 const parsedNextValue = normalizeProviderFieldValue(nextValue); 423 if (nextValue.trim() !== "" && parsedNextValue == null) { 424 return { 425 isValid: false, 426 parsedValue: null 427 }; 428 } 429 const currentSentValue = typeof resolvedSentValue === "number" ? resolvedSentValue : null; 430 const currentAcceptedValue = typeof resolvedAcceptedValue === "number" ? resolvedAcceptedValue : null; 431 const nextSentValue = field === "sent" ? parsedNextValue : currentSentValue; 432 const nextAcceptedValue = field === "accepted" ? parsedNextValue : currentAcceptedValue; 433 const baseOverallSent = typeof provider.overallSent === "number" ? provider.overallSent : 0; 434 const baseOverallAccepted = typeof provider.overallAccepted === "number" ? provider.overallAccepted : 0; 435 // overallSent/overallAccepted already include today's saved values, 436 // so subtract today's original to avoid double-counting the new input. 437 const originalDaySent = typeof provider.sent === "number" ? provider.sent : 0; 438 const originalDayAccepted = typeof provider.accepted === "number" ? provider.accepted : 0; 439 const totalSent = baseOverallSent - originalDaySent + (nextSentValue ?? 0); 440 const totalAccepted = baseOverallAccepted - originalDayAccepted + (nextAcceptedValue ?? 0); 441 if (totalAccepted > totalSent) { 442 options?.onMessage?.({ 443 type: "error", 444 text: `Overall Accepted (${baseOverallAccepted}) should be less than or equal to Overall Sent (${baseOverallSent}).` 445 }); 446 return { 447 isValid: false, 448 parsedValue: parsedNextValue 449 }; 450 } 451 return { 452 isValid: true, 453 parsedValue: parsedNextValue 454 }; 455 }; 456 return [ 457 { 458 label: "Friend Request & Message Sent", 459 value: sentValue, 460 allowEdit: !!options?.isEditable, 461 validateNextValue: (nextValue)=>validateOverallConstraint(nextValue, "sent").isValid, 462 onValueCommit: options?.isEditable !== false && sentTaskId ? async (value)=>{ 463 if (typeof value !== "string") { 464 return; 465 } 466 const validation = validateOverallConstraint(value, "sent"); 467 if (!validation.isValid) { 468 return; 469 } 470 const normalizedValue = normalizeProviderFieldValue(value); 471 options?.onMessage?.({ 472 type: "success", 473 text: `Friend Request & Message Sent has been changed to ${normalizedValue == null ? "empty" : normalizedValue}.` 474 }); 475 await onAutosave?.(sentTaskId, platformId, value, provider?.name); 476 } : undefined 477 }, 478 { 479 label: "Accepted", 480 value: acceptedValue, 481 allowEdit: !!options?.isEditable, 482 onValueChange: (nextValue)=>{ 483 const validation = validateOverallConstraint(nextValue, "accepted"); 484 if (!validation.isValid) { 485 return; 486 } 487 }, 488 validateNextValue: (nextValue)=>validateOverallConstraint(nextValue, "accepted").isValid, 489 onValueCommit: options?.isEditable !== false && acceptedTaskId ? async (value)=>{ 490 if (typeof value !== "string") { 491 return; 492 } 493 const validation = validateOverallConstraint(value, "accepted"); 494 if (!validation.isValid) { 495 return; 496 } 497 const normalizedValue = normalizeProviderFieldValue(value); 498 options?.onMessage?.({ 499 type: "success", 500 text: `Accepted has been changed to ${normalizedValue == null ? "empty" : n
500ormalizedValue}.` 501 }); 502 console.log("Accepted has been changed", { 503 value: normalizedValue 504 }); 505 await onAutosave?.(acceptedTaskId, platformId, value, provider?.name); 506 } : undefined 507 }, 508 { 509 label: "Lifetime Acceptance Rate", 510 value: /*#__PURE__*/ _jsxDEV("div", { 511 className: "rate-cell", 512 children: [ 513 /*#__PURE__*/ _jsxDEV("div", { 514 className: "rate-percent", 515 children: [ 516 getLifetimeAcceptanceRate(provider), 517 "%" 518 ] 519 }, void 0, true, { 520 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 521 lineNumber: 790, 522 columnNumber: 11 523 }, this), 524 (()=>{ 525 const percent = getLifetimeAcceptanceRate(provider); 526 const isblue = percent > 29; 527 const isOrange = percent >= 20 && percent <= 29; 528 const bgColor = isblue ? "#FFFFFF33" : isOrange ? "#FFFFFF33" : "#FFFFFF33"; 529 const badgeText = isblue ? "You're performing in the top 1%." : isOrange ? "You're right where you need to be." : "Your list or messages need a refresh."; 530 return /*#__PURE__*/ _jsxDEV("div", { 531 className: "rate-msg", 532 style: { 533 background: bgColor 534 }, 535 children: badgeText 536 }, void 0, false, { 537 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 538 lineNumber: 805, 539 columnNumber: 15 540 }, this); 541 })() 542 ] 543 }, void 0, true, { 544 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 545 lineNumber: 789, 546 columnNumber: 9 547 }, this), 548 valueClassName: "rate-cell", 549 itemClassName: lifetimeAcceptanceToneClass 550 } 551 ]; 552}; 553// Generates the conversion-rate row for the Success section. 554const createSuccessConversionRow = (label = "Conversion Rate", conversionRate = 0, convertedCount = 0, totalCount = 6, toneClassName = "lifetime-rate-red", badgeText = "you're Converting")=>({ 555 label, 556 value: /*#__PURE__*/ _jsxDEV("div", { 557 className: "success-conversion-content", 558 children: [ 559 /*#__PURE__*/ _jsxDEV("div", { 560 className: "success-conversion-percent", 561 children: [ 562 conversionRate, 563 "%" 564 ] 565 }, void 0, true, { 566 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 567 lineNumber: 830, 568 columnNumber: 7 569 }, this), 570 /*#__PURE__*/ _jsxDEV("div", { 571 className: "success-conversion-subtext", 572 children: [ 573 convertedCount, 574 " out of ", 575 totalCount, 576 " converted" 577 ] 578 }, void 0, true, { 579 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 580 lineNumber: 831, 581 columnNumber: 7 582 }, this), 583 /*#__PURE__*/ _jsxDEV("div", { 584 className: `success-conversion-badge ${toneClassName}`, 585 children: badgeText 586 }, void 0, false, { 587 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 588 lineNumber: 832, 589 columnNumber: 7 590 }, this) 591 ] 592 }, void 0, true, { 593 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 594 lineNumber: 829, 595 columnNumber: 5 596 }, this), 597 itemClassName: `success-conversion-item ${toneClassName}`, 598 valueClassName: "success-conversion-control" 599 }); 600// Builds Success section rows, inserting conversion-rate card where needed. 601const mapSuccessToRows = (sections = [], tasks = [], onAutosave, toggleV
601alues = {}, allowEdit = false)=>{ 602 const sortedTasks = [ 603 ...tasks 604 ].sort((a, b)=>(a.displayOrder ?? 0) - (b.displayOrder ?? 0)); 605 const hasConversionTask = sortedTasks.some((task)=>task.name.toLowerCase().includes("conversion")); 606 const lifetimeConversionRate = getLifetimeConversionRateData(sections); 607 const rows = sortedTasks.map((task)=>{ 608 const isConversionTask = task.name.toLowerCase().includes("conversion"); 609 if (isConversionTask) { 610 return createSuccessConversionRow(task.name, lifetimeConversionRate.percentage, lifetimeConversionRate.completedSections, lifetimeConversionRate.totalSections, lifetimeConversionRate.toneClassName, lifetimeConversionRate.badgeText); 611 } 612 return { 613 label: task.name, 614 allowEdit, 615 value: task.inputType === "TOGGLE" ? /*#__PURE__*/ _jsxDEV(ToggleSwitch, { 616 checked: toggleValues[task.id] ?? !!task.value?.booleanValue, 617 onChange: allowEdit ? (checked)=>onAutosave?.(task.id, task.platformId, checked) : undefined, 618 allowEdit: allowEdit 619 }, void 0, false, { 620 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 621 lineNumber: 875, 622 columnNumber: 11 623 }, this) : getDisplayNumberValue(task.value?.numberValue), 624 itemClassName: "success-metric-item", 625 valueClassName: "success-metric-control", 626 inputClassName: task.inputType === "TOGGLE" ? undefined : "success-stat-box", 627 onValueCommit: task.inputType === "TOGGLE" ? undefined : allowEdit ? (value)=>onAutosave?.(task.id, task.platformId, value) : undefined 628 }; 629 }); 630 if (!hasConversionTask) { 631 rows.push(createSuccessConversionRow("Lifetime Conversion Rate", lifetimeConversionRate.percentage, lifetimeConversionRate.completedSections, lifetimeConversionRate.totalSections, lifetimeConversionRate.toneClassName, lifetimeConversionRate.badgeText)); 632 } 633 return rows; 634}; 635// Maps chart response into the last-30-days integrity list. 636const mapChartToIntegrityDays = (chartResponse = [])=>{ 637 console.log("mapChartToIntegrityDays input chartResponse:", chartResponse); 638 const mappedIntegrityDays = [ 639 ...chartResponse 640 ].sort((a, b)=>new Date(a.entryDate).getTime() - new Date(b.entryDate).getTime()).slice(-30).map((item)=>({ 641 date: item.entryDate, 642 completed: !!item.completed, 643 completedCount: item.completedCount ?? 0 644 })); 645 console.log("mapChartToIntegrityDays output IntegrityDay[]:", mappedIntegrityDays); 646 return mappedIntegrityDays; 647}; 648// Simple toggle component used in checklist rows. 649const ToggleSwitch = ({ checked = false, onChange, allowEdit = false })=>{ 650 return /*#__PURE__*/ _jsxDEV("label", { 651 className: `toggle-switch ${allowEdit}`.trim(), 652 children: [ 653 /*#__PURE__*/ _jsxDEV("input", { 654 type: "checkbox", 655 checked: checked, 656 disabled: !allowEdit, 657 onChange: (e)=>onChange?.(e.target.checked), 658 readOnly: !onChange 659 }, void 0, false, { 660 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 661 lineNumber: 941, 662 columnNumber: 7 663 }, this), 664 /*#__PURE__*/ _jsxDEV("span", { 665 className: "toggle-slider" 666 }, void 0, false, { 667 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 668 lineNumber: 948, 669 columnNumber: 7 670 }, this) 671 ] 672 }, void 0, true, { 673 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 674 lineNumber: 940, 675 columnNumber: 5 676 }, this); 677}; 678_c = ToggleSwitch; 679// Main Checklist page component: coordinates data fetch, state, and rendering. 680const ChecklistPage = ()=>{ 681 _s(); 682 const navigate = useNavigate(); 683 const { currentUser, setCurrentUser, auth } = useAuth(); 684 const authorities = currentUser?.companies?.[0]?.authorities ?? [];
685 const [selectedRange, setSelectedRange] = useState(DAY_STRING); 686 const [filter, setFilter] = useState(null); 687 const [selectedDate, setSelectedDate] = useState(new Date()); 688 const [isCustomDateFilterActive, setIsCustomDateFilterActive] = useState(false); 689 const [isDatePickerOpen, setIsDatePickerOpen] = useState(false); 690 const datePickerRef = useRef(null); 691 const [activity, setActivity] = useState({ 692 percentage: 0, 693 done: 0, 694 remaining: 0, 695 total: 0, 696 message: "" 697 }); 698 const [selectedCampaign, setSelectedCampaign] = useState(null); 699 const [isInitializingCampaign, setIsInitializingCampaign] = useState(true); 700 const findProspectsOverviewRef = useRef(null); 701 const [findData, setFindData] = useState([]); 702 const [otherSocialData, setOtherSocialData] = useState([]); 703 const [relationshipData, setRelationshipData] = useState([]); 704 const [stayConnectedData, setStayConnectedData] = useState([]); 705 const [startConversationData, setStartConversationData] = useState([]); 706 const [communityData, setCommunityData] = useState([]); 707 const [growthData, setGrowthData] = useState([]); 708 const [sectionMeta, setSectionMeta] = useState(defaultSectionMeta); 709 const [integrityDays, setIntegrityDays] = useState([]); 710 const [integrityCompletedDays, setIntegrityCompletedDays] = useState(0); 711 const [toggleValues, setToggleValues] = useState({}); 712 const [sectionsState, setSectionsState] = useState([]); 713 const [providersState, setProvidersState] = useState([]); 714 const [allowOtherPlatformsEdit, setAllowOtherPlatformsEdit] = useState(false); 715 const [findProspectsMessage, setFindProspectsMessage] = useState(null); 716 const [loading, setLoading] = useState(false); 717 const [saveLoading, setSaveLoading] = useState(false); 718 const [error, setError] = useState(null); 719 const [pendingChecklistChanges, setPendingChecklistChanges] = useState({}); 720 const yearlyPrice = YEARLY_PLAN_PRICE; 721 const monthlyPrice = MONTHLY_PLAN_PRICE; 722 const liveplan = LIVE_PLAN; 723 const [subscriptionPlanDetails, setSubscriptionPlanDetails] = useState([]); 724 const [selectedSubscriptionPlan, setSelectedSubscriptionPlan] = useState(null); 725 const [showPlanModal, setShowPlanModal] = useState(false); 726 const [selectedPlan, setSelectedPlan] = useState(null); 727 const [isOpen, setIsOpen] = useState(false); 728 const [showUploadVideo, setShowUploadVideo] = useState(false); 729 const [plan, setPlan] = useState(); 730 const [videoExists, setVideoExists] = useState(false); 731 const [trialPeriodExpired, setTrailPeriodExpired] = useState(false); 732 const [subscriptionPeriodExpired, setSubscriptionPeriodExpired] = useState(false); 733 const [summaryPerf, setSummaryPerf] = useState({ 734 daysCompleted: 0, 735 daysTotal: 0, 736 avgCompletion: 0, 737 consecutiveDays: 0 738 }); 739 const [summaryGroups, setSummaryGroups] = useState([]); 740 // ð Fetch running campaign on component mount to initialize with correct campaign upfront 741 async function initializeRunningCampaign() { 742 try { 743 const result = await axios.get(GET_CAMPAIGNS_BY_COMPANY_USER_AND_FB_ACC(CUREENT_COMPANY_NAME)); 744 const responseData = result.data; 745 if (Array.isArray(responseData) && responseData.length > 0) { 746 // Find running campaign 747 const runningCampaign = responseData.find((campaign)=>Array.isArray(campaign.campaignStatus) && campaign.campaignStatus.some((status)=>status.name === "Running")); 748 // Set running campaign if exists, otherwise default to "All" 749 if (runningCampaign) { 750 console.log("â Running Campaign initialized on mount:", runningCampaign.name); 751 const selected = { 752 value: runningCampaign.uuid, 753 label: runningCampaign.name, 754 acceptanceRate: runningCampaign.acceptanceRate 755 }; 756 setSelectedCampaign(selected); 757 } else { 758 console.log("â¹ï¸ No running campaign found - will use All"); 759 setSelectedCampaign({ 760 value: "-1", 761 label: "All" 762 }); 763 } 764 } 765 } catch (error) { 766 console.error("Error fetching running campaign on mount:", error); 767 // Default to "All" if fetch fails 768 setSelectedCampaign({ 769 value: "-1", 770 label: "All" 771 }); 772 } finally{ 773 setIsInitializingCampaign(false); 774 } 775 } 776 // Handles range dropdown changes and resets custom date selection. 777 const handleRangeChange = (range)=>{ 778 setIsCustomDateFilterActive(false); 779 setSelectedRange(range ?? DAY_STRING); 780 setSelectedDate(getUserTimeZoneBasedCurrentDate()); 781 }; 782 // Handles advanced filter changes from DateRangeSelector. 783 const handleFilterChange = (nextFilter)=>{ 784 if (nextFilter?.frequencyType) { 785 setIsCustomDateFilterActive(false); 786 setSelectedDate(getUserTimeZoneBasedCurrentDate()); 787 } 788 setFilter(nextFilter); 789 }; 790 useEffect(()=>{ 791 if (!auth?.api_token) { 792 return; 793 } 794 const init = async ()=>{ 795 const response = await getUserByToken(auth.api_token ?? ""); 796 const user = response.data; 797 setCurrentUser(user); 798 const isTrialExpired = user?.trialPeriodCompleted; 799 const isSubscrptionCompleted = user?.subscriptionPeriodCompleted; 800 const isSubscriptionPeriod = user?.subscriptionPeriod; 801 if ((isTrialExpired || isSubscrptionCompleted) && !isSubscriptionPeriod) { 802 setShowPlanModal(true); 803 } 804 setTrailPeriodExpired(!!isTrialExpired); 805 setSubscriptionPeriodExpired(!!isSubscrptionCompleted); 806 }; 807 init(); 808 }, [ 809 auth?.api_token, 810 setCurrentUser 811 ]);
812 // ð Initialize running campaign on first mount (before any data fetch) 813 useEffect(()=>{ 814 initializeRunningCampaign(); 815 }, []); 816 useEffect(()=>{ 817 getSubscriptionPlanDetails(); 818 }, []); 819 const handlePlanSelect = async (plan)=>{ 820 if (plan === monthlyPrice) { 821 setIsOpen(true); 822 setShowPlanModal(false); 823 const targetedPrice = "197"; 824 setPlan(197); 825 getPlanDetailsBySellPrice(subscriptionPlanDetails, targetedPrice); 826 } else if (plan === yearlyPrice) { 827 const hasVideo = await checkUserVideoExist(); 828 if (hasVideo) { 829 setVideoExists(hasVideo); 830 setShowPlanModal(false); 831 setPlan(97); 832 const targetedPrice = "97"; 833 getPlanDetailsBySellPrice(subscriptionPlanDetails, targetedPrice); 834 setIsOpen(true); 835 return; 836 } 837 setSelectedPlan(plan); 838 setShowUploadVideo(true); 839 setShowPlanModal(false); 840 } else if (plan === liveplan) { 841 setIsOpen(true); 842 setShowPlanModal(false); 843 const targetedPrice = "1"; 844 setPlan(1); 845 getPlanDetailsBySellPrice(subscriptionPlanDetails, targetedPrice); 846 } 847 }; 848 const handleShowStepsPopUp = (value)=>{ 849 setShowPlanModal(value); 850 }; 851 async function getSubscriptionPlanDetails() { 852 try { 853 const response = await axios.get(GET_ALL_SUBSCRIPTIONPLANS(CUREENT_COMPANY_NAME)); 854 if (response.status === 200) { 855 setSubscriptionPlanDetails(response.data); 856 } 857 } catch (e) { 858 console.error("Error ...", e); 859 } 860 } 861 async function checkUserVideoExist() { 862 if (!currentUser?.id) { 863 return false; 864 } 865 try { 866 const response = await axios.get(`${CHECK_USER_VIDEO_EXIST(CUREENT_COMPANY_NAME)}?userId=${currentUser.id}`); 867 if (response.status === 200) { 868 return response.data.data; 869 } 870 } catch (e) { 871 console.error("Error ...", e); 872 } 873 return false; 874 } 875 const getPlanDetailsBySellPrice = (plans, targetPrice)=>{ 876 const priceAsNumber = parseFloat(targetPrice); 877 const matchedPlan = plans.find((plan)=>plan.sellPrice === priceAsNumber); 878 if (matchedPlan) { 879 setSelectedSubscriptionPlan(matchedPlan); 880 } 881 }; 882 // Handles date picker selection and switches to custom date mode. 883 const handleChecklistDateChange = (date)=>{ 884 if (!date) { 885 return; 886 } 887 setSelectedDate(date); 888 setIsCustomDateFilterActive(true); 889 setSelectedRange(null); 890 setFilter((current)=>({ 891 ...current ?? { 892 statusName: [], 893 names: [] 894 }, 895 startDate: null, 896 endDate: null, 897 frequencyType: undefined 898 })); 899 setIsDatePickerOpen(false); 900 }; 901 // Normalizes autosave numeric input into a nullable number. 902 const normalizeNumericAutosaveValue = (value)=>{ 903 if (typeof value !== "string") { 904 return null; 905 } 906 const trimmedValue = value.trim(); 907 if (trimmedValue === "") { 908 return null; 909 } 910 const parsedValue = Number(trimmedValue); 911 return Number.isNaN(parsedValue) ? null : parsedValue; 912 }; 913 // Validates Find Prospects autosave with Other Platforms overall totals. 914 const validateFindProspectsAutosave = async (taskId, platformId, value, providerName)=>{ 915 const findProspectsTasks = sectionsState.find((section)=>section.name === "Find Prospects")?.tasks ?? []; 916 const sentTaskId = findProspectsTasks.find((task)=>task.name === "Friend Request & Message Sent")?.id; 917 const acceptedTaskId = findProspectsTasks.find((task)=>task.name === "Accepted")?.id; 918 if (taskId !== sentTaskId && taskId !== acceptedTaskId) { 919 return true; 920 } 921 const normalizedProviderName = providerName?.trim().toLowerCase(); 922 const matchedProvider = providersState.find((provider)=>{ 923 const samePlatformId = platformId !== undefined && getProviderPlatformId(provider) === platformId; 924 const sameProviderName = normalizedProviderName != null && normalizedProviderName.length > 0 && provider?.name?.trim().toLowerCase() === normalizedProviderName; 925 return samePlatformId || sameProviderName; 926 }) ?? (normalizedProviderName?.includes("other") ? resolveSocialProviders(providersState).otherProvider : resolveSocialProviders(providersState).facebookProvider) ?? resolveSocialProviders(providersState).otherProvider ?? resolveSocialProviders(providersState).facebookProvider;
927 const isOtherPlatformsProvider = matchedProvider?.name?.trim().toLowerCase() === "other platforms"; 928 if (!isOtherPlatformsProvider) { 929 return true; 930 } 931 const normalizedValue = normalizeNumericAutosaveValue(value); 932 const pendingSentValue = sentTaskId != null ? pendingChecklistChanges[sentTaskId]?.numberValue : undefined; 933 const pendingAcceptedValue = acceptedTaskId != null ? pendingChecklistChanges[acceptedTaskId]?.numberValue : undefined; 934 const currentSentValue = pendingSentValue !== undefined ? pendingSentValue : matchedProvider?.sent ?? null; 935 const currentAcceptedValue = pendingAcceptedValue !== undefined ? pendingAcceptedValue : matchedProvider?.accepted ?? null; 936 const nextSent = taskId === sentTaskId ? normalizedValue : currentSentValue; 937 const nextAccepted = taskId === acceptedTaskId ? normalizedValue : currentAcceptedValue; 938 const baseOverallSent = typeof matchedProvider?.overallSent === "number" ? matchedProvider.overallSent : 0; 939 const baseOverallAccepted = typeof matchedProvider?.overallAccepted === "number" ? matchedProvider.overallAccepted : 0; 940 // overallSent/overallAccepted already include today's saved values, 941 // so subtract today's original to avoid double-counting the new input. 942 const originalDaySent = typeof matchedProvider?.sent === "number" ? matchedProvider.sent : 0; 943 const originalDayAccepted = typeof matchedProvider?.accepted === "number" ? matchedProvider.accepted : 0; 944 const totalSent = baseOverallSent - originalDaySent + (nextSent ?? 0); 945 const totalAccepted = baseOverallAccepted - originalDayAccepted + (nextAccepted ?? 0); 946 if (totalAccepted > totalSent) { 947 setFindProspectsMessage({ 948 type: "error", 949 text: `Overall Accepted (${baseOverallAccepted}) should be less than or equal to Overall Sent (${baseOverallSent}).` 950 }); 951 console.log("Blocked Find Prospects autosave because overall totals are invalid", { 952 taskId, 953 platformId, 954 nextSent, 955 nextAccepted, 956 baseOverallSent, 957 baseOverallAccepted, 958 totalSent, 959 totalAccepted 960 }); 961 return false; 962 } 963 return true; 964 }; 965 // Builds all UI state from the checklist API payload. 966 const buildChecklistStateFromPayload = (payload)=>{ 967 const total = payload.totalTask ?? 0; 968 const done = payload.taskCompleted ?? 0; 969 const remaining = payload.leftTask ?? Math.max(0, total - done); 970 const percentage = total > 0 ? Math.round(done / total * 100) : 0; 971 setActivity({ 972 percentage, 973 done, 974 remaining, 975 total, 976 message: percentage >= 80 ? "Crushing it!" : "Keep going" 977 }); 978 const sections = payload.sections ?? []; 979 console.log("sections:", sections); 980 setToggleValues(getInitialToggleValues(sections)); 981 setSectionsState(sections); 982 const sectionsByName = sections.reduce((acc, section)=>{ 983 acc[section.name] = section; 984 return acc; 985 }, {}); 986 setSectionMeta({ 987 "Find Prospects": getSectionMeta(sectionsByName["Find Prospects"], "Find Prospects"), 988 "Start Conversations": getSectionMeta(sectionsByName["Start Conversations"], "Start Conversations"), 989 "Build Relationships": getSectionMeta(sectionsByName["Build Relationships"], "Build Relationships"), 990 "Stay Connected": getSectionMeta(sectionsByName["Stay Connected"], "Stay Connected"), 991 Community: getSectionMeta(sectionsByName["Community"], "Community"), 992 Success: getSectionMeta(sectionsByName["Success"], "Success") 993 }); 994 const smProviders = payload.smProviders ?? []; 995 const allowEdit = !!payload.allowEdit; 996 console.log("checklist allowEdit:", allowEdit); 997 console.log("smProviders:", smProviders); 998 setAllowOtherPlatformsEdit(allowEdit); 999 setProvidersState(smProviders); 1000 const { facebookProvider, otherProvider } = resolveSocialProviders(smProviders); 1001 const findProspectsTasks = sectionsByName["Find Prospects"]?.tasks ?? []; 1002 const sentTask = findProspectsTasks.find((task)=>task.name === "Friend Request & Message Sent"); 1003 const acceptedTask = findProspectsTasks.find((task)=>task.name === "Accepted"); 1004 const sentTaskId = sentTask?.id; 1005 const acceptedTaskId = acceptedTask?.id; 1006 console.log("facebookProvider:", facebookProvider); 1007 console.log("otherProvider:", otherProvider); 1008 logLifetimeAcceptanceRate("Find Prospects", facebookProvider?.name || "Facebook", facebookProvider); 1009 logLifetimeAcceptanceRate("Find Prospects", otherProvider?.name || "Other Platforms", otherProvider); 1010 setFindData(mapProviderToRows(facebookProvider, handleChecklistAutosave, { 1011 sentTaskId, 1012 acceptedTaskId, 1013 onMessage: setFindProspectsMessage 1014 })); 1015 setOtherSocialData(mapProviderToRows(otherProvider, handleChecklistAutosave, { 1016 emptyMissingValues: true, 1017 isEditable: allowEdit, 1018 sentTaskId, 1019 acceptedTaskId, 1020 sentValueOverride: sentTask?.value?.numberValue ?? null, 1021 acceptedValueOverride: acceptedTask?.value?.numberValue ?? null, 1022 treatZeroAsEmpty: true, 1023 onMessage: setFindProspectsMessage 1024 })); 1025 setStartConversationData(mapTasksToRows(sectionsByName["Start Conversations"]?.tasks ?? [], handleChecklistAutosave, getInitialToggleValues(sections), allowEdit));
1026 setRelationshipData(mapTasksToRows(sectionsByName["Build Relationships"]?.tasks ?? [], handleChecklistAutosave, getInitialToggleValues(sections), allowEdit)); 1027 setStayConnectedData(mapTasksToRows(sectionsByName["Stay Connected"]?.tasks ?? [], handleChecklistAutosave, getInitialToggleValues(sections), allowEdit)); 1028 setCommunityData(mapTasksToRows(sectionsByName["Community"]?.tasks ?? [], handleChecklistAutosave, getInitialToggleValues(sections), allowEdit)); 1029 setGrowthData(mapSuccessToRows(sections, sectionsByName["Success"]?.tasks ?? [], handleChecklistAutosave, getInitialToggleValues(sections), allowEdit)); 1030 const integrityChartDays = mapChartToIntegrityDays(payload.chartResponse ?? []); 1031 console.log("IntegrityDay state candidate:", integrityChartDays); 1032 console.log("payload.chartTaskCompletedCountDay:", payload.chartTaskCompletedCountDay); 1033 console.log("completed days from chartResponse:", integrityChartDays.filter((day)=>day.completed).length); 1034 const completedDays = payload.chartTaskCompletedCountDay ?? integrityChartDays.filter((day)=>day.completed).length; 1035 console.log("integrityCompletedDays forced value:", completedDays); 1036 setIntegrityDays(integrityChartDays); 1037 setIntegrityCompletedDays(completedDays); 1038 setSummaryPerf({ 1039 daysCompleted: done, 1040 daysTotal: total, 1041 avgCompletion: percentage, 1042 consecutiveDays: completedDays 1043 }); 1044 const buildRelationshipTasks = sectionsByName["Build Relationships"]?.tasks ?? []; 1045 const successTasks = [ 1046 ...sectionsByName["Success"]?.tasks ?? [] 1047 ].sort((a, b)=>(a.displayOrder ?? 0) - (b.displayOrder ?? 0)); 1048 const prospectsRespondedTask = buildRelationshipTasks.find((task)=>task.name?.toLowerCase().includes("prospects responded")); 1049 const lifetimeConversionRateCard = getLifetimeConversionRateCard(sections); 1050 logLifetimeAcceptanceRate("Success Snapshot", facebookProvider?.name || "Facebook", facebookProvider); 1051 logLifetimeAcceptanceRate("Success Snapshot", otherProvider?.name || "Other Platforms", otherProvider); 1052 setSummaryGroups([ 1053 { 1054 title: facebookProvider?.name || "Facebook", 1055 tagClass: "facebook", 1056 items: mapProviderToRows(facebookProvider) 1057 }, 1058 { 1059 title: otherProvider?.name || "Other Platforms", 1060 tagClass: "social", 1061 items: mapProviderToRows(otherProvider, undefined, { 1062 emptyMissingValues: true 1063 }) 1064 }, 1065 { 1066 title: "Success", 1067 tagClass: "success", 1068 items: [ 1069 ...prospectsRespondedTask ? [ 1070 { 1071 label: prospectsRespondedTask.name, 1072 value: getDisplayNumberValue(prospectsRespondedTask.value?.numberValue) 1073 } 1074 ] : [], 1075 ...successTasks.map((task)=>({ 1076 label: task.name, 1077 value: task.inputType === "TOGGLE" ? task.value?.booleanValue ? "Yes" : "No" : task.name.toLowerCase().includes("conversion") ? `${task.value?.numberValue ?? 0}%` : getDisplayNumberValue(task.value?.numberValue) 1078 })), 1079 lifetimeConversionRateCard 1080 ] 1081 } 1082 ]); 1083 }; 1084 // Fetches checklist data based on current date filter settings. 1085 const fetchChecklistData = async (options)=>{ 1086 if (!options?.silent) { 1087 setLoading(true); 1088 setError(null); 1089 // enableSplashScreen() 1090 } 1091 try { 1092 const companyName = CUREENT_COMPANY_NAME || "sixsigmafunnels"; 1093 const browserTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone || "Asia/Kolkata"; 1094 const hasAdvancedDateFilter = !!filter?.startDate && !!filter?.endDate; 1095 const frequencyType = isValidRange(selectedRange) ? selectedRange : isValidRange(filter?.frequencyType ?? null) ? filter?.frequencyType ?? DAY_STRING : DAY_STRING; 1096 const campaignUuid = selectedCampaign?.value || undefined; 1097 const requestPayload = hasAdvancedDateFilter ? { 1098 browserTimezone, 1099 fromDate: filter?.startDate,
1100 toDate: filter?.endDate, 1101 ...campaignUuid && { 1102 campaignUuid 1103 } 1104 } : isCustomDateFilterActive ? { 1105 browserTimezone, 1106 fromDate: formatChecklistFilterDate(selectedDate), 1107 toDate: formatChecklistFilterDate(selectedDate), 1108 ...campaignUuid && { 1109 campaignUuid 1110 } 1111 } : { 1112 browserTimezone, 1113 frequencyType, 1114 ...campaignUuid && { 1115 campaignUuid 1116 } 1117 }; 1118 console.log("GET_CHECKLIST request:", { 1119 url: GET_CHECKLIST(companyName), 1120 payload: requestPayload 1121 }); 1122 const response = await axios.post(GET_CHECKLIST(companyName), requestPayload); 1123 console.log("GET_CHECKLIST raw response:", response?.data); 1124 const payload = response?.data?.data; 1125 console.log("GET_CHECKLIST payload:", payload); 1126 if (options?.afterSave) { 1127 console.log("Fresh checklist output after save:", payload); 1128 } 1129 if (!response?.data?.success || !payload) { 1130 setError(response?.data?.message || "Failed to load checklist data."); 1131 return; 1132 } 1133 buildChecklistStateFromPayload(payload); 1134 } catch (err) { 1135 setError(err?.message || "Failed to load checklist data."); 1136 } finally{ 1137 if (!options?.silent) { 1138 // setLoading(false) 1139 disableSplashScreen(); 1140 } 1141 } 1142 }; 1143 // â Handles campaign selection and calls GET_CHECKLIST with dynamic values 1144 const handleCampaignChange = async (option)=>{ 1145 enableSplashScreen(); 1146 if (!option) return; 1147 // Reset date filters to "Today" when campaign changes 1148 const todayDate = getUserTimeZoneBasedCurrentDate(); 1149 setSelectedCampaign(option); 1150 setSelectedRange(DAY_STRING); // Select "Today" in calendar 1151 setSelectedDate(todayDate); // Set date to today 1152 setIsCustomDateFilterActive(false); // Clear custom date filter 1153 setFilter(null); // Clear advanced date filters 1154 try { 1155 const companyName = CUREENT_COMPANY_NAME || "sixsigmafunnels"; 1156 const browserTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone || "Asia/Kolkata"; 1157 const requestPayload = { 1158 browserTimezone, 1159 frequencyType: DAY_STRING, 1160 campaignUuid: option.value 1161 }; 1162 console.log("GET_CHECKLIST request with campaign:", { 1163 url: GET_CHECKLIST(companyName), 1164 payload: requestPayload 1165 }); 1166 const response = await axios.post(GET_CHECKLIST(companyName), requestPayload); 1167 console.log("GET_CHECKLIST response after campaign change:", response?.data); 1168 if (response?.data?.success) { 1169 console.log("Checklist data loaded successfully with selected campaign for today"); 1170 buildChecklistStateFromPayload(response?.data?.data); 1171 disableSplashScreen(); 1172 } else { 1173 console.error("Failed to load checklist:", response?.data?.message); 1174 } 1175 } catch (error) { 1176 console.error("Error calling GET_CHECKLIST API on campaign change:", error); 1177 disableSplashScreen(); 1178 } 1179 }; 1180 // Determines which date should be used for save/autosave payloads. 1181 const resolveChecklistEntryDate = ()=>{ 1182 const hasAdvancedDateFilter = !!filter?.startDate && !!filter?.endDate; 1183 // if (hasAdvancedDateFilter || isCustomDateFilterActive) { 1184 // return formatChecklistEntryDate(selectedDate) 1185 // } 1186 if (hasAdvancedDateFilter) { 1187 const advancedFilterDate = new Date(filter.startDate); 1188 if (!Number.isNaN(advancedFilterDate.getTime())) { 1189 return formatChecklistFilterDate(advancedFilterDate); 1190 } 1191 } 1192 if (isCustomDateFilterActive) {
1193 return formatChecklistEntryDate(selectedDate); 1194 } 1195 return formatChecklistEntryDate(getUserTimeZoneBasedCurrentDate()); 1196 }; 1197 // Autosaves a single task value and refreshes data to keep UI in sync. 1198 async function handleChecklistAutosave(taskId, platformId, value, providerName) { 1199 const isValidAutosave = await validateFindProspectsAutosave(taskId, platformId, value, providerName); 1200 if (!isValidAutosave) { 1201 return; 1202 } 1203 if (typeof value === "boolean") { 1204 setToggleValues((current)=>({ 1205 ...current, 1206 [taskId]: value 1207 })); 1208 } 1209 const taskValueUpdate = buildTaskValueUpdate(taskId, value); 1210 const findProspectsTasks = sectionsState.find((section)=>section.name === "Find Prospects")?.tasks ?? []; 1211 const sentTaskId = findProspectsTasks.find((task)=>task.name === "Friend Request & Message Sent")?.id; 1212 const acceptedTaskId = findProspectsTasks.find((task)=>task.name === "Accepted")?.id; 1213 const normalizedProviderName = providerName?.trim().toLowerCase(); 1214 if (normalizedProviderName && (taskId === sentTaskId || taskId === acceptedTaskId) && typeof taskValueUpdate.numberValue !== "undefined") { 1215 setProvidersState((current)=>current.map((provider)=>{ 1216 if (provider?.name?.trim().toLowerCase() !== normalizedProviderName) { 1217 return provider; 1218 } 1219 return { 1220 ...provider, 1221 sent: taskId === sentTaskId ? taskValueUpdate.numberValue ?? null : provider.sent, 1222 accepted: taskId === acceptedTaskId ? taskValueUpdate.numberValue ?? null : provider.accepted 1223 }; 1224 })); 1225 } 1226 const companyName = CUREENT_COMPANY_NAME || "sixsigmafunnels"; 1227 const payload = { 1228 entryDate: resolveChecklistEntryDate(), 1229 timezone: Intl.DateTimeFormat().resolvedOptions().timeZone || "Asia/Kolkata", 1230 values: [ 1231 taskValueUpdate 1232 ] 1233 }; 1234 setPendingChecklistChanges((current)=>({ 1235 ...current, 1236 [taskId]: taskValueUpdate 1237 })); 1238 console.log("CHECKLIST_AUTOSAVE trigger:", { 1239 taskId, 1240 platformId, 1241 value: taskValueUpdate 1242 }); 1243 console.log("CHECKLIST_AUTOSAVE request:", { 1244 url: POST_SAVE_TASK_VALUE(companyName), 1245 payload 1246 }); 1247 const isOtherPlatformsAutosave = normalizedProviderName?.includes("other") && (taskId === sentTaskId || taskId === acceptedTaskId); 1248 if (isOtherPlatformsAutosave) { 1249 enableSplashScreen(); 1250 } 1251 try { 1252 const response = await axios.post(POST_SAVE_TASK_VALUE(companyName), payload); 1253 console.log("CHECKLIST_AUTOSAVE response:", response?.data); 1254 await fetchChecklistData({ 1255 afterSave: true, 1256 silent: true 1257 }); 1258 } catch (err) { 1259 console.log("CHECKLIST_AUTOSAVE error:", err?.response?.data || err?.message || err); 1260 } finally{ 1261 if (isOtherPlatformsAutosave) { 1262 disableSplashScreen(); 1263 } 1264 } 1265 } 1266 // Reset filters on user change (new login/context). 1267 useEffect(()=>{ 1268 setSelectedRange(DAY_STRING); 1269 setFilter(null); 1270 setIsCustomDateFilterActive(false); 1271 window.scrollTo(0, 0); 1272 }, [ 1273 currentUser 1274 ]); 1275 // Auto-clear transient Find Prospects validation messages. 1276 useEffect(()=>{ 1277 if (!findProspectsMessage) { 1278 return; 1279 } 1280 const timeoutId = window.setTimeout(()=>{ 1281 setFindProspectsMessage(null); 1282 }, 5000); 1283 return ()=>window.clearTimeout(timeoutId); 1284 }, [ 1285 findProspectsMessage 1286 ]); 1287 // Load checklist data when dependencies change. 1288 useEffect(()=>{ 1289 // ð Wait until running campaign is initialized before fetching checklist 1290 if (isInitializingCampaign) { 1291 console.log("â³ Waiting for running campaign initialization..."); 1292 return; 1293 } 1294 console.log("â Campaign initialized, now fetching checklist with campaign:", selectedCampaign); 1295 fetchChecklistData(); 1296 }, [ 1297 currentUser, 1298 selectedRange, 1299 filter, 1300 selectedDate, 1301 isCustomDateFilterActive, 1302 selectedCampaign, 1303 isInitializingCampaign 1304 ]); 1305 // Derive all section row data whenever raw state changes. 1306 useEffect(()=>{ 1307 if (!sectionsState.length && !providersState.length) { 1308 return; 1309 } 1310 const sectionsByName = sectionsState.reduce((acc, section)=>{ 1311 acc[section.name] = section; 1312 return acc; 1313 }, {}); 1314 const { facebookProvider, otherProvider } = resolveSocialProviders(providersState); 1315 const findProspectsTasks = sectionsByName["Find Prospects"]?.tasks ?? []; 1316 const sentTask = findProspectsTasks.find((task)=>task.name === "Friend Request & Message Sent"); 1317 const acceptedTask = findProspectsTasks.find((task)=>task.name === "Accepted"); 1318 const sentTaskId = sentTask?.id; 1319 const acceptedTaskId = acceptedTask?.id; 1320 const buildRelationshipTasks = sectionsByName["Build Relationships"]?.tasks ?? []; 1321 const successTasks = [ 1322 ...sectionsByName["Success"]?.tasks ?? [] 1323 ].sort((a, b)=>(a.displayOrder ?? 0) - (b.displayOrder ?? 0)); 1324 const prospectsRespondedTask = buildRelationshipTasks.find((task)=>task.name?.toLowerCase().includes("prospects responded")); 1325 setFindData(mapProviderToRows(facebookProvider, handleChecklistAutosave, { 1326 sentTaskId, 1327 acceptedTaskId, 1328 onMessage: setFindProspectsMessage 1329 })); 1330 setOtherSocialData(mapProviderToRows(otherProvider, handleChecklistAutosave, { 1331 emptyMissingValues: true, 1332 isEditable: allowOtherPlatformsEdit, 1333 sentTaskId, 1334 acceptedTaskId, 1335 sentValueOverride: sentTask?.value?.numberValue ?? null, 1336 acceptedValueOverride: acceptedTask?.value?.numberValue ?? null, 1337 treatZeroAsEmpty: true, 1338 onMessage: setFindProspectsMessage 1339 })); 1340 setStartConversationData(mapTasksToRows(sectionsByName["Start Conversations"]?.tasks ?? [], handleChecklistAutosave, toggleV
1340alues, allowOtherPlatformsEdit)); 1341 setRelationshipData(mapTasksToRows(sectionsByName["Build Relationships"]?.tasks ?? [], handleChecklistAutosave, toggleValues, allowOtherPlatformsEdit)); 1342 setStayConnectedData(mapTasksToRows(sectionsByName["Stay Connected"]?.tasks ?? [], handleChecklistAutosave, toggleValues, allowOtherPlatformsEdit)); 1343 setCommunityData(mapTasksToRows(sectionsByName["Community"]?.tasks ?? [], handleChecklistAutosave, toggleValues, allowOtherPlatformsEdit)); 1344 setGrowthData(mapSuccessToRows(sectionsState, sectionsByName["Success"]?.tasks ?? [], handleChecklistAutosave, toggleValues, allowOtherPlatformsEdit)); 1345 setSummaryGroups([ 1346 { 1347 title: facebookProvider?.name || "Facebook", 1348 tagClass: "facebook", 1349 items: mapProviderToRows(facebookProvider) 1350 }, 1351 { 1352 title: otherProvider?.name || "Other Platforms", 1353 tagClass: "social", 1354 items: mapProviderToRows(otherProvider, undefined, { 1355 emptyMissingValues: true 1356 }) 1357 }, 1358 { 1359 title: "Success", 1360 tagClass: "success", 1361 items: [ 1362 ...prospectsRespondedTask ? [ 1363 { 1364 label: prospectsRespondedTask.name, 1365 value: getDisplayNumberValue(prospectsRespondedTask.value?.numberValue) 1366 } 1367 ] : [], 1368 ...successTasks.map((task)=>({ 1369 label: task.name, 1370 value: task.inputType === "TOGGLE" ? toggleValues[task.id] ?? task.value?.booleanValue ? "Yes" : "No" : task.name.toLowerCase().includes("conversion") ? `${task.value?.numberValue ?? 0}%` : getDisplayNumberValue(task.value?.numberValue) 1371 })), 1372 getLifetimeConversionRateCard(sectionsState) 1373 ] 1374 } 1375 ]); 1376 }, [ 1377 allowOtherPlatformsEdit, 1378 providersState, 1379 sectionsState, 1380 toggleValues 1381 ]); 1382 useEffect(()=>{ 1383 const isInitialDataLoaded = findData !== null && otherSocialData !== null && summaryGroups !== null; 1384 if (isInitialDataLoaded && !saveLoading) { 1385 setLoading(false); 1386 } 1387 console.log("Loading Check ð", { 1388 findData, 1389 otherSocialData, 1390 summaryGroups, 1391 saveLoading 1392 }); 1393 }, [ 1394 findData, 1395 otherSocialData, 1396 summaryGroups, 1397 saveLoading 1398 ]); 1399 useEffect(()=>{ 1400 enableSplashScreen(); // â start immediately when page mounts 1401 loadChecklistPage(); // ð call wrapper function 1402 }, []); 1403 const loadChecklistPage = async ()=>{ 1404 try { 1405 await fetchChecklistData(); // your existing API 1406 } catch (error) { 1407 console.error(error); 1408 } finally{ 1409 disableSplashScreen(); // â already working in your case 1410 } 1411 }; 1412 // Saves all pending checklist changes in a single request. 1413 const handleSaveDailySystem = async ()=>{ 1414 setSaveLoading(true); 1415 try { 1416 const findProspectsTasks = sectionsState.find((section)=>section.name === "Find Prospects")?.tasks ?? []; 1417 const sentTaskId = findProspectsTasks.find((task)=>task.name === "Friend Request & Message Sent")?.id; 1418 const acceptedTaskId = findProspectsTasks.find((task)=>task.name === "Accepted")?.id; 1419 const { otherProvider } = resolveSocialProviders(providersState); 1420 const pendingSentValue = sentTaskId != null ? pendingChecklistChanges[sentTaskId]?.numberValue : undefined; 1421 const pendingAcceptedValue = acceptedTaskId != null ? pendingChecklistChanges[acceptedTaskId]?.numberValue : undefined; 1422 const currentSentValue = pendingSentValue !== undefined ? pendingSentValue : otherProvider?.sent ?? null; 1423 const currentAcceptedValue = pendingAcceptedValue !== undefined ? pendingAcceptedValue : otherProvider?.accepted ?? null; 1424 const baseOverallSent = typeof otherProvider?.overallSent === "number" ? otherProvider.overallSent : 0; 1425 const baseOverallAccepted = typeof otherProvider?.overallAccepted === "number" ? otherProvider.overallAccepted : 0; 1426 // overallSent/overallAccepted already include today's saved values, 1427 // so subtract today's original API value to avoid double-counting. 1428 const originalDaySent = typeof otherProvider?.sent === "number" ? otherProvider.sent : 0; 1429 const originalDayAccepted = typeof otherProvider?.accepted === "number" ? otherProvider.accepted : 0; 1430 const totalSent = baseOverallSent - originalDaySent + (currentSentValue ?? 0); 1431 const totalAccepted = baseOverallAccepted - originalDayAccepted + (currentAcceptedValue ?? 0); 1432 if (totalAccepted > totalSent) { 1433 const errorMessage = `Overall Accepted (${baseOverallAccepted}) should be less than or equal to Overall Sent (${baseOverallSent}).`; 1434 setFindProspectsMessage({ 1435 type: "error", 1436 text: errorMessage 1437 }); 1438 await Swal.fire({ 1439 title: "Validation Error", 1440 text: errorMessage, 1441 icon: "error", 1442 confirmButtonText: "OK", 1443 confirmButtonColor: "#0373b9" 1444 }); 1445 return; 1446 } 1447 const pendingValues = Object.values(pendingChecklistChanges); 1448 const companyName = CUREENT_COMPANY_NAME || "sixsigmafunnels"; 1449 if (!pendingValues.length) { 1450 if (isOverallValidationErrorMessage(findProspectsMessage)) { 1451 const errorMessage = findProspectsMessage?.text || `Overall Accepted (${baseOverallAccepted}) should be less than or equal to Overall Sent (${baseOverallSent}).`; 1452 await Swal.fire({ 1453 title: "Validation Error", 1454 text: errorMessage, 1455 icon: "error", 1456 confirmButtonText: "OK", 1457 confirmButtonColor: "#0373b9" 1458 }); 1459 return; 1460 } 1461 await Swal.fire({ 1462 title: "No Changes", 1463 text: "No checklist changes to save.", 1464 icon: "info", 1465 confirmButtonText: "OK", 1466 confirmButtonColor: "#0373b9" 1467 }); 1468 return; 1469 } 1470 const payload = {
1471 entryDate: resolveChecklistEntryDate(), 1472 timezone: Intl.DateTimeFormat().resolvedOptions().timeZone || "Asia/Kolkata", 1473 values: pendingValues 1474 }; 1475 console.log("CHECKLIST_SAVE request:", { 1476 url: POST_SAVE_TASK_VALUE(companyName), 1477 payload 1478 }); 1479 const response = await axios.post(POST_SAVE_TASK_VALUE(companyName), payload); 1480 console.log("CHECKLIST_SAVE response:", response?.data); 1481 if (response?.data?.success === false) { 1482 await Swal.fire({ 1483 title: "Save Failed", 1484 text: response?.data?.message || "Failed to save daily system.", 1485 icon: "error", 1486 confirmButtonText: "OK", 1487 confirmButtonColor: "#0373b9" 1488 }); 1489 return; 1490 } 1491 setPendingChecklistChanges({}); 1492 await fetchChecklistData({ 1493 afterSave: true 1494 }); 1495 await Swal.fire({ 1496 title: "Saved!", 1497 text: response?.data?.message || "Daily system saved successfully.", 1498 icon: "success", 1499 confirmButtonText: "OK", 1500 confirmButtonColor: "#f79c3a" 1501 }); 1502 } catch (err) { 1503 console.log("CHECKLIST_SAVE error:", err?.response?.data || err?.message || err); 1504 await Swal.fire({ 1505 title: "Save Failed", 1506 text: err?.response?.data?.message || err?.message || "Failed to save daily system.", 1507 icon: "error", 1508 confirmButtonText: "OK", 1509 confirmButtonColor: "#0373b9" 1510 }); 1511 } finally{ 1512 setSaveLoading(false); 1513 } 1514 }; 1515 const maxSelectableDate = getUserTimeZoneBasedCurrentDate(); 1516 const hasAdvancedDateFilter = !!filter?.startDate && !!filter?.endDate; 1517 const isInlineDateFilterActive = isCustomDateFilterActive && !hasAdvancedDateFilter; 1518 const activityHeaderLabel = buildActivityHeaderLabel(selectedRange, selectedDate, filter); 1519 const findProspectsMeta = sectionMeta["Find Prospects"]; 1520 const startConversationsMeta = sectionMeta["Start Conversations"]; 1521 const buildRelationshipsMeta = sectionMeta["Build Relationships"]; 1522 const stayConnectedMeta = sectionMeta["Stay Connected"]; 1523 const communityMeta = sectionMeta["Community"]; 1524 const successMeta = sectionMeta["Success"]; 1525 const { facebookProvider, otherProvider } = resolveSocialProviders(providersState); 1526 const facebookAcceptanceRate = getLifetimeAcceptanceRate(facebookProvider); 1527 const otherAcceptanceRate = getLifetimeAcceptanceRate(otherProvider); 1528 // Convenience helper for section completion pill state. 1529 const isSectionComplete = (sectionName)=>sectionsState.find((section)=>section.name === sectionName)?.allTaskCompleted ?? false; 1530 return /*#__PURE__*/ _jsxDEV(Content, { 1531 children: [ 1532 /*#__PURE__*/ _jsxDEV("div", { 1533 className: "checklist-page", 1534 children: [ 1535 /*#__PURE__*/ _jsxDEV("div", { 1536 className: "checklist-header", 1537 children: /*#__PURE__*/ _jsxDEV("div", { 1538 className: "header-top", 1539 children: [ 1540 /*#__PURE__*/ _jsxDEV("div", { 1541 className: "checklist-header-title", 1542 children: [ 1543 /*#__PURE__*/ _jsxDEV("h1", { 1544 children: " Daily System" 1545 }, void 0, false, { 1546 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1547 lineNumber: 2120, 1548 columnNumber: 15 1549 }, this), 1550 /*#__PURE__*/ _jsxDEV("p", { 1551 children: "Log today's activity. Build predictable growth." 1552 }, void 0, false, { 1553 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1554 lineNumber: 2121, 1555 columnNumber: 15 1556 }, this) 1557 ] 1558 }, void 0, true, { 1559 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1560 lineNumber: 2119, 1561 columnNumber: 13 1562 }, this), 1563 /*#__PURE__*/ _jsxDEV("div", { 1564 className: "date-filter-wrapper", 1565 children: [ 1566 /*#__PURE__*/ _jsxDEV("label", { 1567 className: "date_range_lbl", 1568 children: "Filter:" 1569 }, void 0, false, { 1570 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1571 lineNumber: 2125, 1572 columnNumber: 15 1573 }, this), 1574 /*#__PURE__*/ _jsxDEV(DateRangeSelector, { 1575 selectedRange: selectedRange, 1576 onRangeChange: handleRangeChange, 1577 filter: filter, 1578 setFilter: handleFilterChange, 1579 isUserTable: false, 1580 planType: null, 1581 setSelectedRange: handleRangeChange, 1582 isDropdown: false, 1583 isOverallRequired: false, 1584 isDayRequired: true 1585 }, void 0, false, { 1586 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1587 lineNumber: 2126, 1588 columnNumber: 15 1589 }, this), 1590 /*#__PURE__*/ _jsxDEV("div", { 1591 className: `col-md-4 checklist-header-date-display ${isInlineDateFilterActive ? "is-active" : ""}`, 1592 style: { 1593 position: "relative" 1594 }, 1595 children: [ 1596 /*#__PURE__*/ _jsxDEV("img", { 1597 src: "/media/misc/Daily-system-Header-calender.png", 1598 alt: "calendar", 1599 className: "date-picker-image", 1600 onClick: ()=>setIsDatePickerOpen(true) 1601 }, void 0, false, { 1602 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1603 lineNumber: 2145, 1604 columnNumber: 18 1605 }, this), 1606 /*#__PURE__*/ _jsxDEV(DatePicker, { 1607 ref: datePickerRef, 1608 className: "form-control", 1609 selected: selectedDate, 1610 onChange: handleChecklistDateChange, 1611 open: isDatePickerOpen, 1612 onInputClick: ()=>setIsDatePickerOpen(true),
1613 onClickOutside: ()=>setIsDatePickerOpen(false), 1614 onCalendarClose: ()=>setIsDatePickerOpen(false), 1615 dateFormat: DATE_FORMAT_MMMM_DD_YYYY, 1616 maxDate: maxSelectableDate, 1617 readOnly: true, 1618 locale: "en-GB" 1619 }, void 0, false, { 1620 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1621 lineNumber: 2153, 1622 columnNumber: 17 1623 }, this) 1624 ] 1625 }, void 0, true, { 1626 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1627 lineNumber: 2139, 1628 columnNumber: 15 1629 }, this) 1630 ] 1631 }, void 0, true, { 1632 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1633 lineNumber: 2124, 1634 columnNumber: 13 1635 }, this) 1636 ] 1637 }, void 0, true, { 1638 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1639 lineNumber: 2118, 1640 columnNumber: 11 1641 }, this) 1642 }, void 0, false, { 1643 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1644 lineNumber: 2117, 1645 columnNumber: 9 1646 }, this), 1647 /*#__PURE__*/ _jsxDEV("div", { 1648 className: "checklist-content", 1649 children: [ 1650 /*#__PURE__*/ _jsxDEV(DailyActivityLog, { 1651 dateLabel: activityHeaderLabel, 1652 data: activity, 1653 integrityDays: integrityDays, 1654 integrityCompletedDays: integrityCompletedDays 1655 }, void 0, false, { 1656 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1657 lineNumber: 2175, 1658 columnNumber: 11 1659 }, this), 1660 loading && /*#__PURE__*/ _jsxDEV("div", { 1661 className: "checklist-loading", 1662 children: "Loading checklist..." 1663 }, void 0, false, { 1664 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1665 lineNumber: 2182, 1666 columnNumber: 23 1667 }, this), 1668 error && /*#__PURE__*/ _jsxDEV("div", { 1669 className: "checklist-error", 1670 children: [ 1671 "Error loading checklist: ", 1672 error 1673 ] 1674 }, void 0, true, { 1675 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1676 lineNumber: 2183, 1677 columnNumber: 21 1678 }, this), 1679 /*#__PURE__*/ _jsxDEV("div", { 1680 className: "journey-flow", 1681 children: [ 1682 /*#__PURE__*/ _jsxDEV("div", { 1683 className: "flow-step", 1684 children: [ 1685 /*#__PURE__*/ _jsxDEV("img", { 1686 src: "/media/misc/find-prospects.png", 1687 alt: "find-prospects", 1688 className: "journey-flow-img" 1689 }, void 0, false, { 1690 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1691 lineNumber: 2187, 1692 columnNumber: 15 1693 }, this), 1694 /*#__PURE__*/ _jsxDEV("span", { 1695 children: findProspectsMeta.title 1696 }, void 0, false, { 1697 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1698 lineNumber: 2192, 1699 columnNumber: 15 1700 }, this) 1701 ] 1702 }, void 0, true, { 1703 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1704 lineNumber: 2186, 1705 columnNumber: 13 1706 }, this), 1707 /*#__PURE__*/ _jsxDEV("div", { 1708 className: "flow-arrow", 1709 children: /*#__PURE__*/ _jsxDEV("img", { 1710 src: "/media/misc/Arrow-right.png", 1711 alt: "arrow", 1712 className: "right-arrow" 1713 }, void 0, false, { 1714 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1715 lineNumber: 2195, 1716 columnNumber: 15 1717 }, this) 1718 }, void 0, false, { 1719 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1720 lineNumber: 2194, 1721 columnNumber: 13 1722 }, this), 1723 /*#__PURE__*/ _jsxDEV("div", { 1724 className: "flow-step", 1725 children: [ 1726 /*#__PURE__*/ _jsxDEV("img", { 1727 src: "/media/misc/start-conversation.png", 1728 alt: "start-conversation", 1729 className: "journey-flow-img" 1730 }, void 0, false, { 1731 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1732 lineNumber: 2198, 1733 columnNumber: 15 1734 }, this), 1735 /*#__PURE__*/ _jsxDEV("span", { 1736 children: startConversationsMeta.title 1737 }, void 0, false, { 1738 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1739 lineNumber: 2203, 1740 columnNumber: 15 1741 }, this) 1742 ] 1743 }, void 0, true, { 1744 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1745 lineNumber: 2197, 1746 columnNumber: 13 1747 }, this), 1748 /*#__PURE__*/ _jsxDEV("div", { 1749 className: "flow-arrow", 1750 children: /*#__PURE__*/ _jsxDEV("img", { 1751 src: "/media/misc/Arrow-right.png", 1752 alt: "arrow", 1753 className: "right-arrow" 1754 }, void 0, false, { 1755 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1756 lineNumber: 2206, 1757 columnNumber: 15 1758 }, this) 1759 }, void 0, false, { 1760 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1761 lineNumber: 2205, 1762 columnNumber: 13 1763 }, this), 1764 /*#__PURE__*/ _jsxDEV("div", { 1765 className: "flow-step", 1766 children: [ 1767 /*#__PURE__*/ _jsxDEV("img", { 1768 src: "/media/misc/build-relationships.png", 1769 alt: "build-relationships", 1770 className: "journey-flow-img" 1771 }, void 0, false, { 1772 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1773 lineNumber: 2209, 1774 columnNumber: 15 1775 }, this), 1776 /*#__PURE__*/ _jsxDEV("span", { 1777 children: buildRelationshipsMeta.title 1778 }, void 0, false, { 1779 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1780 lineNumber: 2214, 1781 columnNumber: 15 1782 }, this) 1783 ] 1784 }, void 0, true, { 1785 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1786 lineNumber: 2208, 1787 columnNumber: 13 1788 }, this), 1789 /*#__PURE__*/ _jsxDEV("div", { 1790 className: "flow-arrow", 1791 children: /*#__PURE__*/ _jsxDEV("img", { 1792 src: "/media/misc/Arrow-right.png", 1793 alt: "arrow", 1794 className: "right-arrow" 1795 }, void 0, false, { 1796 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1797 lineNumber: 2217, 1798 columnNumber: 15 1799 }, this) 1800 }, void 0, false, { 1801 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1802 lineNumber: 2216, 1803 columnNumber: 13 1804 }, this), 1805 /*#__PURE__*/ _jsxDEV("div", { 1806 className: "flow-step", 1807 children: [ 1808 /*#__PURE__*/ _jsxDEV("img", { 1809 src: "/media/misc/stay-connected.png", 1810 alt: "stay-connected", 1811 className: "journey-flow-img" 1812 }, void 0, false, { 1813 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1814 lineNumber: 2220, 1815 columnNumber: 15 1816 }, this), 1817 /*#__PURE__*/ _jsxDEV("span", { 1818 children: stayConnectedMeta.title 1819 }, void 0, false, { 1820 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1821 lineNumber: 2225, 1822 columnNumber: 15 1823 }, this) 1824 ] 1825 }, void 0, true, { 1826 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1827 lineNumber: 2219, 1828 columnNumber: 13 1829 }, this), 1830 /*#__PURE__*/ _jsxDEV("div", { 1831 className: "flow-arrow", 1832 children: /*#__PURE__*/ _jsxDEV("img", { 1833 src: "/media/misc/Arrow-right.png", 1834 alt: "arrow", 1835 className: "right-arrow" 1836 }, void 0, false, { 1837 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1838 lineNumber: 2229, 1839 columnNumber: 15 1840 }, this) 1841 }, void 0, false, { 1842 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1843 lineNumber: 2228, 1844 columnNumber: 13 1845 }, this), 1846 /*#__PURE__*/ _jsxDEV("div", { 1847 className: "flow-step", 1848 children: [ 1849 /*#__PURE__*/ _jsxDEV("img", { 1850 src: "/media/misc/Community.png", 1851 alt: "community", 1852
1852 className: "journey-flow-img" 1853 }, void 0, false, { 1854 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1855 lineNumber: 2232, 1856 columnNumber: 15 1857 }, this), 1858 /*#__PURE__*/ _jsxDEV("span", { 1859 children: "Community" 1860 }, void 0, false, { 1861 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1862 lineNumber: 2237, 1863 columnNumber: 15 1864 }, this) 1865 ] 1866 }, void 0, true, { 1867 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1868 lineNumber: 2231, 1869 columnNumber: 13 1870 }, this), 1871 /*#__PURE__*/ _jsxDEV("div", { 1872 className: "flow-arrow", 1873 children: /*#__PURE__*/ _jsxDEV("img", { 1874 src: "/media/misc/Arrow-right.png", 1875 alt: "arrow", 1876 className: "right-arrow" 1877 }, void 0, false, { 1878 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1879 lineNumber: 2241, 1880 columnNumber: 15 1881 }, this) 1882 }, void 0, false, { 1883 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1884 lineNumber: 2240, 1885 columnNumber: 13 1886 }, this), 1887 /*#__PURE__*/ _jsxDEV("div", { 1888 className: "flow-step success", 1889 children: [ 1890 /*#__PURE__*/ _jsxDEV("img", { 1891 src: "/media/misc/success.png", 1892 alt: "success", 1893 className: "journey-flow-img" 1894 }, void 0, false, { 1895 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1896 lineNumber: 2244, 1897 columnNumber: 15 1898 }, this), 1899 /*#__PURE__*/ _jsxDEV("span", { 1900 children: successMeta.title 1901 }, void 0, false, { 1902 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1903 lineNumber: 2245, 1904 columnNumber: 15 1905 }, this) 1906 ] 1907 }, void 0, true, { 1908 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1909 lineNumber: 2243, 1910 columnNumber: 13 1911 }, this) 1912 ] 1913 }, void 0, true, { 1914 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1915 lineNumber: 2185, 1916 columnNumber: 11 1917 }, this), 1918 /*#__PURE__*/ _jsxDEV(FindProspectsOverview, { 1919 number: findProspectsMeta.number, 1920 title: findProspectsMeta.title, 1921 facebookData: findData, 1922 otherSocialData: otherSocialData, 1923 isComplete: isSectionComplete("Find Prospects"), 1924 message: findProspectsMessage, 1925 facebookAcceptanceRate: facebookAcceptanceRate, 1926 otherAcceptanceRate: otherAcceptanceRate, 1927 onCampaignChange: handleCampaignChange, 1928 isInitialized: !isInitializingCampaign, 1929 selectedCampaign: selectedCampaign 1930 }, void 0, false, { 1931 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1932 lineNumber: 2249, 1933 columnNumber: 11 1934 }, this), 1935 /*#__PURE__*/ _jsxDEV("div", { 1936 className: "sections-row", 1937 children: [ 1938 /*#__PURE__*/ _jsxDEV("div", { 1939 className: "col-md-6", 1940 children: [ 1941 /*#__PURE__*/ _jsxDEV(StartConversationsSection, { 1942 number: startConversationsMeta.number, 1943 title: startConversationsMeta.title, 1944 items: startConversationData, 1945 isComplete: isSectionComplete("Start Conversations") 1946 }, void 0, false, { 1947 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1948 lineNumber: 2265, 1949 columnNumber: 15 1950 }, this), 1951 /*#__PURE__*/ _jsxDEV(ChecklistSection, { 1952 number: buildRelationshipsMeta.number, 1953 title: buildRelationshipsMeta.title, 1954 rows: relationshipD
1954ata, 1955 isComplete: isSectionComplete("Build Relationships"), 1956 info: "Track your follow-up and reconnections. This is where prospects become customers and referrals." 1957 }, void 0, false, { 1958 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1959 lineNumber: 2271, 1960 columnNumber: 15 1961 }, this) 1962 ] 1963 }, void 0, true, { 1964 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1965 lineNumber: 2264, 1966 columnNumber: 13 1967 }, this), 1968 /*#__PURE__*/ _jsxDEV("div", { 1969 className: "col-md-6", 1970 children: [ 1971 /*#__PURE__*/ _jsxDEV(ChecklistSection, { 1972 number: stayConnectedMeta.number, 1973 title: stayConnectedMeta.title, 1974 rows: stayConnectedData, 1975 isComplete: isSectionComplete("Stay Connected"), 1976 info: "Log your daily posts, stories, and engagement. Staying visible keeps you top of mind." 1977 }, void 0, false, { 1978 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1979 lineNumber: 2281, 1980 columnNumber: 15 1981 }, this), 1982 /*#__PURE__*/ _jsxDEV(ChecklistSection, { 1983 number: communityMeta.number, 1984 title: communityMeta.title, 1985 rows: communityData, 1986 className: "accent-red", 1987 isComplete: isSectionComplete("Community"), 1988 info: "Track your group activity. An active community attracts new customers and keeps existing ones loyal." 1989 }, void 0, false, { 1990 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1991 lineNumber: 2288, 1992 columnNumber: 15 1993 }, this) 1994 ] 1995 }, void 0, true, { 1996 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 1997 lineNumber: 2280, 1998 columnNumber: 13 1999 }, this) 2000 ] 2001 }, void 0, true, { 2002 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2003 lineNumber: 2263, 2004 columnNumber: 11 2005 }, this), 2006 /*#__PURE__*/ _jsxDEV("div", { 2007 className: "sections-row", 2008 children: /*#__PURE__*/ _jsxDEV(ChecklistSection, { 2009 number: successMeta.number, 2010 title: successMeta.title, 2011 rows: growthData, 2012 className: "accent-blue", 2013 isComplete: isSectionComplete("Success"), 2014 info: "Log every new customer and referral you earn. This is proof that the system is working." 2015 }, void 0, false, { 2016 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2017 lineNumber: 2300, 2018 columnNumber: 13 2019 }, this) 2020 }, void 0, false, { 2021 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2022 lineNumber: 2299, 2023 columnNumber: 11 2024 }, this), 2025 /*#__PURE__*/ _jsxDEV("div", { 2026 className: "save-section", 2027 children: [ 2028 /*#__PURE__*/ _jsxDEV("div", { 2029 className: "info-bar", 2030 children: [ 2031 "Enter ", 2032 /*#__PURE__*/ _jsxDEV("b", { 2033 children: "0" 2034 }, void 0, false, { 2035 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2036 lineNumber: 2312, 2037 columnNumber: 21 2038 }, this), 2039 " if completed with no outcome. Blank fields do not count as complete." 2040 ] 2041 }, void 0, true, { 2042 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2043 lineNumber: 2311, 2044 columnNumber: 13 2045 }, this), 2046 /*#__PURE__*/ _jsxDEV("div", { 2047 className: "save-button-wrapper", 2048 children: /*#__PURE__*/ _jsxDEV("button", { 2049 className: "save-btn", 2050 onClick: handleSaveDailySystem, 2051 disabled: saveLoading || !allowOtherPlatformsEdit, 2052 children: saveLoading ? "Saving..." : "Save Daily System" 2053 }, void 0, false, { 2054 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2055 lineNumber: 2315, 2056 columnNumber: 15 2057 }, this) 2058 }, void 0, false, { 2059 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2060 lineNumber: 2314, 2061 columnNumber: 13 2062 }, this) 2063 ] 2064 }, void 0, true, { 2065 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2066 lineNumber: 2310, 2067 columnNumber: 11 2068 }, this) 2069 ] 2070 }, void 0, true, { 2071 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2072 lineNumber: 2174, 2073 columnNumber: 9 2074 }, this) 2075 ] 2076 }, void 0, true, { 2077 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2078 lineNumber: 2114, 2079 columnNumber: 7 2080 }, this), 2081 showPlanModal && /*#__PURE__*/ _jsxDEV("div", { 2082 className: "upload_overlay", 2083 children: /*#__PURE__*/ _jsxDEV("div", { 2084 className: "plan-selection-modal d-flex flex-column align-items-center", 2085 children: [ 2086 trialPeriodExpired ? /*#__PURE__*/ _jsxDEV("h2", { 2087 children: [ 2088 "Your ", 2089 TRIAL_PERIOD_DAYS, 2090 "-Day Onboarding Ended" 2091 ] 2092 }, void 0, true, { 2093 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2094 lineNumber: 2338, 2095 columnNumber: 15 2096 }, this) : subscriptionPeriodExpired ? /*#__PURE__*/ _jsxDEV("h2", { 2097 children: "Your Subscription was Expired" 2098 }, void 0, false, { 2099 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2100 lineNumber: 2340, 2101 columnNumber: 15 2102 }, this) : /*#__PURE__*/ _jsxDEV("h2", { 2103 children: "Please Subscribe" 2104 }, void 0, false, { 2105 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2106 lineNumber: 2342, 2107 columnNumber: 15 2108 }, this), 2109 /*#__PURE__*/ _jsxDEV("p", { 2110 className: "cus_p_text", 2111 children: "Letâs keep meeting new people." 2112 }, void 0, false, { 2113 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2114 lineNumber: 2345, 2115 columnNumber: 13 2116 }, this), 2117 /*#__PURE__*/ _jsxDEV("div", { 2118 className: "row cus_modal_img_btn flex-wrap flex-sm-nowrap", 2119 children: [ 2120 /*#__PURE__*/ _jsxDEV("div", { 2121 className: "col-lg-4 col-md-4 col-sm-12 col-xs-12 modal-image", 2122 children: /*#__PURE__*/ _jsxDEV("img", {
2123 src: "/media/misc/30daysExpired.png", 2124 alt: "Plan Illustration" 2125 }, void 0, false, { 2126 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2127 lineNumber: 2348, 2128 columnNumber: 17 2129 }, this) 2130 }, void 0, false, { 2131 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2132 lineNumber: 2347, 2133 columnNumber: 15 2134 }, this), 2135 /*#__PURE__*/ _jsxDEV("div", { 2136 className: "col-lg-8 col-md-8 col-sm-12 col-xs-12 modal-options ms-2 text-center", 2137 children: [ 2138 /*#__PURE__*/ _jsxDEV("button", { 2139 onClick: ()=>handlePlanSelect(yearlyPrice), 2140 className: "plans_btn yearly_plan ", 2141 children: "Continue at $97/month" 2142 }, void 0, false, { 2143 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2144 lineNumber: 2352, 2145 columnNumber: 17 2146 }, this), 2147 /*#__PURE__*/ _jsxDEV("div", { 2148 children: /*#__PURE__*/ _jsxDEV("p", { 2149 children: [ 2150 "Just share your results to unlock over 50% off.", 2151 /*#__PURE__*/ _jsxDEV("br", {}, void 0, false, { 2152 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2153 lineNumber: 2361, 2154 columnNumber: 21 2155 }, this), 2156 "Today only. Not available later." 2157 ] 2158 }, void 0, true, { 2159 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2160 lineNumber: 2359, 2161 columnNumber: 19 2162 }, this) 2163 }, void 0, false, { 2164 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2165 lineNumber: 2358, 2166 columnNumber: 17 2167 }, this), 2168 /*#__PURE__*/ _jsxDEV("p", { 2169 className: "h1 text-dark fw-bold cus_or_txt_set", 2170 children: "OR" 2171 }, void 0, false, { 2172 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2173 lineNumber: 2366, 2174 columnNumber: 17 2175 }, this), 2176 /*#__PURE__*/ _jsxDEV("button", { 2177 onClick: ()=>handlePlanSelect(monthlyPrice), 2178 className: "plans_btn monthly_plan ", 2179 children: "$197/month" 2180 }, void 0, false, { 2181 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2182 lineNumber: 2368, 2183 columnNumber: 17 2184 }, this), 2185 /*#__PURE__*/ _jsxDEV("p", { 2186 children: [ 2187 "No results video", 2188 /*#__PURE__*/ _jsxDEV("span", { 2189 className: "question-mark-tag", 2190 children: "?" 2191 }, void 0, false, { 2192 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2193 lineNumber: 2375, 2194 columnNumber: 35 2195 }, this), 2196 /*#__PURE__*/ _jsxDEV("br", {}, void 0, false, { 2197 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2198 lineNumber: 2376, 2199 columnNumber: 19 2200 }, this), 2201 "No worries, only $197/month." 2202 ] 2203 }, void 0, true, { 2204 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2205 lineNumber: 2374, 2206 columnNumber: 17 2207 }, this), 2208 authorities.includes(systemAuthorities.ALLOW_ONE_TIME_PAYMENT_FEATURE) && /*#__PURE__*/ _jsxDEV("button", { 2209 onClick: ()=>handlePlanSelect(liveplan), 2210 className: "plans_btn yearly_plan ", 2211 children: "Continue $1/Month" 2212 }, void 0, false, { 2213 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2214 lineNumber: 2381, 2215 columnNumber: 19 2216 }, this) 2217 ] 2218 }, void 0, true, { 2219 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2220 lineNumber: 2351, 2221 columnNumber: 15 2222 }, this) 2223 ] 2224 }, void 0, true, { 2225 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2226 lineNumber: 2346, 2227 columnNumber: 13 2228 }, this) 2229 ] 2230 }, void 0, true, { 2231 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2232 lineNumber: 2336, 2233 columnNumber: 11 2234 }, this) 2235 }, void 0, false, { 2236 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2237 lineNumber: 2335, 2238 columnNumber: 9 2239 }, this), 2240 isOpen && /*#__PURE__*/ _jsxDEV("div", { 2241 className: "upload_overlay", 2242 children: /*#__PURE__*/ _jsxDEV("div", { 2243 className: "modal_pricing", 2244 onClick: (e)=>e.stopPropagation(), 2245 children: /*#__PURE__*/ _jsxDEV("div", { 2246 className: "cus_modal_content_price_ssf", 2247 children: [ 2248 /*#__PURE__*/ _jsxDEV("div", { 2249 className: "ssf-back-icon", 2250 onClick: ()=>{ 2251 setIsOpen(false); 2252 setShowPlanModal(true); 2253 navigate(`/${CUREENT_COMPANY_NAME}/checklist`); 2254 }, 2255 style: { 2256 position: "absolute", 2257 top: "18px", 2258 left: "18px", 2259 fontSize: "18px", 2260 fontWeight: "bold", 2261 cursor: "pointer", 2262 color: "#333", 2263 padding: "6px 18px",
2264 borderRadius: "6px", 2265 background: "#f1f1f1" 2266 }, 2267 onMouseEnter: (e)=>{ 2268 e.currentTarget.style.background = "#e2e2e2"; 2269 }, 2270 onMouseLeave: (e)=>{ 2271 e.currentTarget.style.background = "#f1f1f1"; 2272 }, 2273 children: /*#__PURE__*/ _jsxDEV("i", { 2274 className: "fa fa-arrow-left" 2275 }, void 0, false, { 2276 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2277 lineNumber: 2425, 2278 columnNumber: 17 2279 }, this) 2280 }, void 0, false, { 2281 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2282 lineNumber: 2399, 2283 columnNumber: 15 2284 }, this), 2285 /*#__PURE__*/ _jsxDEV("div", { 2286 className: "cus_confirm_txt_head", 2287 children: "What You Keep + Gain" 2288 }, void 0, false, { 2289 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2290 lineNumber: 2428, 2291 columnNumber: 15 2292 }, this), 2293 /*#__PURE__*/ _jsxDEV("div", { 2294 className: "container", 2295 children: /*#__PURE__*/ _jsxDEV("div", { 2296 className: "row justify-content-center ssf-plans-monthly-card", 2297 children: /*#__PURE__*/ _jsxDEV("div", { 2298 className: " d-flex justify-content-center", 2299 children: /*#__PURE__*/ _jsxDEV(MonthlyInfo, { 2300 pricePlan: plan, 2301 selectedSubscriptionPlan: selectedSubscriptionPlan, 2302 addOrder: true, 2303 addClickEvent: true, 2304 videoExists: videoExists 2305 }, void 0, false, { 2306 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2307 lineNumber: 2432, 2308 columnNumber: 21 2309 }, this) 2310 }, void 0, false, { 2311 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2312 lineNumber: 2431, 2313 columnNumber: 19 2314 }, this) 2315 }, void 0, false, { 2316 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2317 lineNumber: 2430, 2318 columnNumber: 17 2319 }, this) 2320 }, void 0, false, { 2321 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2322 lineNumber: 2429, 2323 columnNumber: 15 2324 }, this) 2325 ] 2326 }, void 0, true, { 2327 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2328 lineNumber: 2397, 2329 columnNumber: 13 2330 }, this) 2331 }, void 0, false, { 2332 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2333 lineNumber: 2396, 2334 columnNumber: 11 2335 }, this) 2336 }, void 0, false, { 2337 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2338 lineNumber: 2395, 2339 columnNumber: 9 2340 }, this), 2341 showUploadVideo && /*#__PURE__*/ _jsxDEV(UploadVideo, {
2342 selectedPlan: selectedPlan, 2343 selectedSubscriptionPlanDetails: subscriptionPlanDetails, 2344 onOkClick: handleShowStepsPopUp, 2345 onBack: ()=>{ 2346 setShowUploadVideo(false); 2347 setShowPlanModal(true); 2348 } 2349 }, void 0, false, { 2350 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2351 lineNumber: 2448, 2352 columnNumber: 9 2353 }, this) 2354 ] 2355 }, void 0, true, { 2356 fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", 2357 lineNumber: 2113, 2358 columnNumber: 5 2359 }, this); 2360}; 2361_s(ChecklistPage, "srO7gUpCANmrpjNDz1Y5Y7eQXvA=", false, function() { 2362 return [ 2363 useNavigate, 2364 useAuth 2365 ]; 2366}); 2367_c1 = ChecklistPage; 2368export default ChecklistPage; 2369var _c, _c1; 2370$RefreshReg$(_c, "ToggleSwitch"); 2371$RefreshReg$(_c1, "ChecklistPage"); 2372 2373 2374window.$RefreshReg$ = prevRefreshReg; 2375window.$RefreshSig$ = prevRefreshSig; 2376 2377RefreshRuntime.__hmr_import(import.meta.url).then((currentExports) => { 2378 RefreshRuntime.registerExportsForReactRefresh("/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", currentExports); 2379 import.meta.hot.accept((nextExports) => { 2380 if (!nextExports) return; 2381 const invalidateMessage = RefreshRuntime.validateRefreshBoundaryAndEnqueueUpdate("/data/sixsigma/six-sigma-ui/src/app/pages/checklist/ChecklistPage.tsx", currentExports, nextExports); 2382 if (invalidateMessage) import.meta.hot.invalidate(invalidateMessage); 2383 }); 2384}); 2385 2386//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkNoZWNrbGlzdFBhZ2UudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBheGlvcyBmcm9tIFwiYXhpb3NcIlxuaW1wb3J0IFN3YWwgZnJvbSBcInN3ZWV0YWxlcnQyXCJcblxuXG5pbXBvcnQge0ZDLCB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGV9IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgeyB1c2VOYXZpZ2F0ZSB9IGZyb20gXCJyZWFjdC1yb3V0ZXItZG9tXCJcbmltcG9ydCB7XG4gIENVUkVFTlRfQ09NUEFOWV9OQU1FLFxuICBEQVlfU1RSSU5HLFxuICBDSEVDS19VU0VSX1ZJREVPX0VYSVNULFxuICBHRVRfQ0hFQ0tMSVNULFxuICBHRVRfQUxMX1NVQlNDUklQVElPTlBMQU5TLFxuICBHRVRfQ0FNUEFJR05TX0JZX0NPTVBBTllfVVNFUl9BTkRfRkJfQUNDLFxuICBMSUZFVElNRV9TVFJJTkcsXG4gIExJVkVfUExBTixcbiAgTU9OVEhMWV9QTEFOX1BSSUNFLFxuICBNT05USF9TVFJJTkcsXG4gIFBPU1RfU0FWRV9UQVNLX1ZBTFVFLFxuICBSZWd1bGFyT3B0aW9uLFxuICBzeXN0ZW1BdXRob3JpdGllcyxcbiAgVFJJQUxfUEVSSU9EX0RBWVMsXG4gIFdFRUtfU1RSSU5HLFxuICBZRUFSTFlfUExBTl9QUklDRSxcbiAgWUVBUl9TVFJJTkcsXG59IGZyb20gXCIuLi8uLi9Db25zdGFudHNcIlxuaW1wb3J0IERhdGVSYW5nZVNlbGVjdG9yIGZyb20gXCIuLi9kYXNoYm9hcmQvY29tcG9uZW50cy9EYXRlUmFuZ2VTZWxlY3RvclwiXG5pbXBvcnQge3VzZUF1dGh9IGZyb20gXCIuLi8uLi9tb2R1bGVzL2F1dGhcIlxuaW1wb3J0IHtcbiAgREFURV9GT1JNQVRfTU1NTV9ERF9ZWVlZLFxuICBnZXRVc2VyVGltZVpvbmVCYXNlZEN1cnJlbnREYXRlLFxufSBmcm9tIFwiLi4vLi4vRGF0ZUNvbnN0YW50c1wiXG5pbXBvcnQgRGFpbHlBY3Rpdml0eUxvZywge0FjdGl2aXR5RGF0YSwgSW50ZWdyaXR5RGF5fSBmcm9tIFwiLi9jb21wb25lbnRzL0RhaWx5QWN0aXZpdHlMb2dcIlxuaW1wb3J0IEZpbmRQcm9zcGVjdHNPdmVydmlldyBmcm9tIFwiLi9jb21wb25lbnRzL0ZpbmRQcm9zcGVjdHNPdmVydmlld1wiXG5pbXBvcnQgU3RhcnRDb252ZXJzYXRpb25zU2VjdGlvbiBmcm9tIFwiLi9jb21wb25lbnRzL1N0YXJ0Q29udmVyc2F0aW9uc1NlY3Rpb25cIlxuaW1wb3J0IENoZWNrbGlzdFNlY3Rpb24sIHtTZWN0aW9uUm93fSBmcm9tIFwiLi9jb21wb25lbnRzL0NoZWNrbGlzdFNlY3Rpb25cIlxuaW1wb3J0IFN1bW1hcnlTZWN0aW9uLCB7UGVyZm9ybWFuY2VEYXRhLCBTbmFwc2hvdEdyb3VwfSBmcm9tIFwiLi9jb21wb25lbnRzL1N1bW1hcnlTZWN0aW9uXCJcbmltcG9ydCB7Q29udGVudH0gZnJvbSBcIi4uLy4uLy4uL2NvbmZpZy9sYXlvdXQvY29tcG9uZW50cy9Db250ZW50XCJcbmltcG9ydCB7ZGlzYWJsZVNwbGFzaFNjcmVlbiwgZW5hYmxlU3BsYXNoU2NyZWVufSBmcm9tIFwiLi4vY29tbW9uL0NvbW1vblV0aWxpdGllc1wiXG5pbXBvcnQgeyBnZXRVc2VyQnlUb2tlbiB9IGZyb20gXCIuLi8uLi9tb2R1bGVzL2F1dGgvY29yZS9fcmVxdWVzdHNcIlxuaW1wb3J0IFVwbG9hZFZpZGVvIGZyb20gXCIuLi9wdWJsaWMvY29tcG9uZW50cy9VcGxvYWRWaWRlb1wiXG5pbXBvcnQgTW9udGhseUluZm8gZnJvbSBcIi4uL3B1YmxpYy9jb21wb25lbnRzL01vbnRobHlJbmZvXCJcbmltcG9ydCBcIi4vY3NzL2NoZWNrbGlzdC5jc3NcIlxuaW1wb3J0IERhdGVQaWNrZXIgZnJvbSBcInJlYW
2386N0LWRhdGVwaWNrZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJMb2NhbGUgfSBmcm9tIFwicmVhY3QtZGF0ZXBpY2tlclwiO1xuaW1wb3J0IHsgZW5HQiB9IGZyb20gXCJkYXRlLWZucy9sb2NhbGVcIjtcbnJlZ2lzdGVyTG9jYWxlKFwiZW4tR0JcIiwgZW5HQik7XG5cbmV4cG9ydCB0eXBlIENhbXBhaWduRmlsdGVyVHlwZSA9IHtcbiAgc3RhdHVzTmFtZTogUmVndWxhck9wdGlvbltdXG4gIG5hbWVzOiBzdHJpbmdbXVxuICBmcmVxdWVuY3lUeXBlPzogc3RyaW5nXG4gIHN0YXJ0RGF0ZTogc3RyaW5nIHwgbnVsbFxuICBlbmREYXRlOiBzdHJpbmcgfCBudWxsXG59IHwgbnVsbFxuXG50eXBlIENoZWNrbGlzdFRhc2tWYWx1ZSA9IHtcbiAgbnVtYmVyVmFsdWU/OiBudW1iZXIgfCBudWxsXG4gIGJvb2xlYW5WYWx1ZT86IGJvb2xlYW5cbn1cblxudHlwZSBDaGVja2xpc3RUYXNrID0ge1xuICBpZDogbnVtYmVyXG4gIHBhcmVudElkPzogbnVtYmVyXG4gIG5hbWU6IHN0cmluZ1xuICBpbnB1dFR5cGU/OiBzdHJpbmdcbiAgZGlzcGxheU9yZGVyPzogbnVtYmVyXG4gIHBsYXRmb3JtSWQ/OiBudW1iZXJcbiAgdmFsdWU/OiBDaGVja2xpc3RUYXNrVmFsdWVcbn1cblxudHlwZSBDaGVja2xpc3RTZWN0aW9uRGF0YSA9IHtcbiAgaWQ6IG51bWJlclxuICBuYW1lOiBzdHJpbmdcbiAgZGlzcGxheU9yZGVyPzogbnVtYmVyXG4gIHRhc2tzPzogQ2hlY2tsaXN0VGFza1tdXG4gIGFsbFRhc2tDb21wbGV0ZWQ/OiBib29sZWFuXG59XG5cbnR5cGUgU21Qcm92aWRlciA9IHtcbiAgaWQ/OiBudW1iZXJcbiAgbmFtZT86IHN0cmluZ1xuICBwbGF0Zm9ybUlkPzogbnVtYmVyXG4gIHNlbnRUYXNrSWQ/OiBudW1iZXJcbiAgYWNjZXB0ZWRUYXNrSWQ/OiBudW1iZXJcbiAgZnJpZW5kUmVxdWVzdFNlbnRUYXNrSWQ/OiBudW1iZXJcbiAgZnJpZW5kUmVxdWVzdEFjY2VwdGVkVGFza0lkPzogbnVtYmVyXG4gIHNlbnQ/OiBudW1iZXIgfCBudWxsXG4gIGFjY2VwdGVkPzogbnVtYmVyIHwgbnVsbFxuICBhY2NlcHRhbmNlUmF0ZT86IG51bWJlclxuICAgIG92ZXJhbGxTZW50PzogbnVtYmVyIHwgbnVsbFxuICBvdmVyYWxsQWNjZXB0ZWQ/OiBudW1iZXIgfCBudWxsXG59XG5cbnR5cGUgU3Vic2NyaXB0aW9uUGxhbkRldGFpbHMgPSB7XG4gIGlkOiBudW1iZXJcbiAgdXVJZDogc3RyaW5nXG4gIG5hbWU6IHN0cmluZ1xuICBiaWxsaW5nSW50ZXJ2YWw6IG51bWJlclxuICBiYXNlUHJpY2U6IHN0cmluZ1xuICBzZWxsUHJpY2U6IG51bWJlclxuICBmZWF0dXJlczogc3RyaW5nXG4gIHByb2R1Y3RJZDogc3RyaW5nXG4gIHByaWNlSWQ6IHN0cmluZ1xufVxuXG50eXBlIENoZWNrbGlzdFBheWxvYWQgPSB7XG4gIGlkPzogbnVtYmVyXG4gIGVudHJ5SWQ/OiBudW1iZXJcbiAgZW50cnlfaWQ/OiBudW1iZXJcbiAgYWxsb3dFZGl0PzogYm9vbGVhblxuICB0YXNrQ29tcGxldGVkPzogbnVtYmVyXG4gIHRvdGFsVGFzaz86IG51bWJlclxuICBsZWZ0VGFzaz86IG51bWJlclxuICBjaGFydFRhc2tDb21wbGV0ZWRDb3VudERheT86IG51bWJlclxuICBjaGFydFJlc3BvbnNlPzogQXJyYXk8e1xuICAgIGVudHJ5RGF0ZTogc3RyaW5nXG4gICAgY29tcGxldGVkOiBib29sZWFuXG4gICAgY29tcGxldGVkQ291bnQ/OiBudW1iZXJcbiAgfT5cbiAgc2VjdGlvbnM/OiBDaGVja2xpc3RTZWN0aW9uRGF0YVtdXG4gIHNtUHJvdmlkZXJzPzogU21Qcm92aWRlcltdXG59XG5cbnR5cGUgU2VjdGlvbk1ldGEgPSB7XG4gIG51bWJlcjogbnVtYmVyXG4gIHRpdGxlOiBzdHJpbmdcbn1cblxudHlwZSBDaGVja2xpc3RUYXNrVmFsdWVVcGRhdGUgPSB7XG4gIHRhc2tJZDogbnVtYmVyXG4gIG51bWJlclZhbHVlPzogbnVtYmVyIHwgbnVsbFxuICBib29sZWFuVmFsdWU/OiBib29sZWFuXG59XG5cbnR5cGUgQ2hlY2tsaXN0U2F2ZVBheWxvYWQgPSB7XG4gIGVudHJ5RGF0ZTogc3RyaW5nXG4gIHRpbWV6b25lOiBzdHJpbmdcbiAgdmFsdWVzOiBDaGVja2xpc3RUYXNrVmFsdWVVcGRhdGVbXVxufVxuXG50eXBlIEZpbmRQcm9zcGVjdHNNZXNzYWdlID0ge1xuICB0eXBlOiBcInN1Y2Nlc3NcIiB8IFwiZXJyb3JcIlxuICB0ZXh0OiBzdHJpbmdcbn0gfCBudWxsXG5cbmNvbnN0IGlzT3ZlcmFsbFZhbGlkYXRpb25FcnJvck1lc3NhZ2UgPSAobWVzc2FnZT86IEZpbmRQcm9zcGVjdHNNZXNzYWdlKSA9PlxuICBtZXNzYWdlPy50eXBlID09PSBcImVycm9yXCIgJiZcbiAgbWVzc2FnZS50ZXh0ID09PSBcIk92ZXJhbGwgQWNjZXB0ZWQgc2hvdWxkIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBPdmVyYWxsIFNlbnQuXCJcblxuLy8gVmFsaWRhdGVzIHRoZSBkYXRlLXJhbmdlIGtleSB1c2VkIGJ5IHRoZSBkYXRlIGZpbHRlciBVSS5cbmNvbnN0IGlzVmFsaWRSYW5nZSA9ICh2YWx1ZTogc3RyaW5nIHwgbnVsbCkgPT5cbiAgdmFsdWUgPT09IExJRkVUSU1FX1NUUklORyB8fFxuICB2YWx1ZSA9PT0gREFZX1NUUklORyB8fFxuICB2YWx1ZSA9PT0gV0VFS19TVFJJTkcgfHxcbiAgdmFsdWUgPT09IE1PTlRIX1NUUklORyB8fFxuICB2YWx1ZSA9PT0gWUVBUl9TVFJJTkdcblxuY29uc3QgZGVmYXVsdFNlY3Rpb25NZXRhOiBSZWNvcmQ8c3RyaW5nLCBTZWN0aW9uTWV0YT4gPSB7XG4gIFwiRmluZCBQcm9zcGVjdHNcIjoge251bWJlcjogMSwgdGl0bGU6IFwiRmluZCBQcm9zcGVjdHNcIn0sXG4gIFwiU3RhcnQgQ29udmVyc2F0aW9uc1wiOiB7bnVtYmVyOiAyLCB0aXRsZTogXCJTdGFydCBDb252ZXJzYXRpb25zXCJ9LFxuICBcIkJ1aWxkIFJlbGF0aW9uc2hpcHNcIjoge251bWJlcjogMywgdGl0bGU6IFwiQnVpbGQgUmVsYXRpb25zaGlwc1wifSxcbiAgXCJTdGF5IENvbm5lY3RlZFwiOiB7bnVtYmVyOiA0LCB0aXRsZTogXCJTdGF5IENvbm5lY3RlZFwifSxcbiAgQ29tbXVuaXR5OiB7bnVtYmVyOiA1LCB0aXRsZTogXCJDb21tdW5pdHlcIn0sXG4gIFN1Y2Nlc3M6IHtudW1iZXI6IDYsIHRpdGxlOiBcIlN1Y2Nlc3NcIn0sXG59XG5cbi8vIFJlc29sdmVzIHRoZSBkaXNwbGF5IG9yZGVyL3RpdGxlIGZvciBhIHNlY3Rpb24sIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0cy5cbmNvbnN0IGdldFNlY3Rpb25NZXRhID0gKHNlY3Rpb24/OiBDaGVja2xpc3RTZWN0aW9uRGF0YSwgZmFsbGJhY2tOYW1lPzogc3RyaW5nKTogU2VjdGlvbk1ldGEgPT4ge1xuICBjb25zdCBmYWxsYmFjayA9IGZhbGxiYWNrTmFtZSA/IGRlZmF1bHRTZWN0aW9uTWV0YVtmYWxsYmFja05hbWVdIDogdW5kZWZpbmVkXG5cbiAgcmV0dXJuIHtcbiAgICBudW1iZXI6IHNlY3Rpb24/LmRpc3BsYXlPcmRlciA/PyBmYWxsYmFjaz8ubnVtYmVyID8/IDAsXG4gICAgdGl0bGU6IHNlY3Rpb24/Lm5hbWUgPz8gZmFsbGJhY2s
2386/LnRpdGxlID8/IFwiXCIsXG4gIH1cbn1cblxuLy8gU2FmZWx5IHBpY2tzIGEgcHJvdmlkZXIgaWQgKHBsYXRmb3JtSWQgcHJlZmVycmVkKS5cbmNvbnN0IGdldFByb3ZpZGVyUGxhdGZvcm1JZCA9IChwcm92aWRlcj86IFNtUHJvdmlkZXIgfCBudWxsKSA9PiBwcm92aWRlcj8ucGxhdGZvcm1JZCA/PyBwcm92aWRlcj8uaWRcblxuLy8gRGV0ZWN0cyB3aGV0aGVyIHRoZSBwcm92aWRlciByZXByZXNlbnRzIEZhY2Vib29rLlxuY29uc3QgaXNGYWNlYm9va1Byb3ZpZGVyID0gKHByb3ZpZGVyPzogU21Qcm92aWRlciB8IG51bGwpID0+XG4gIHByb3ZpZGVyPy5uYW1lPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwiZmFjZWJvb2tcIikgPz8gZmFsc2VcblxuLy8gUGlja3MgdGhlIHByaW1hcnkgKEZhY2Vib29rKSBhbmQgc2Vjb25kYXJ5IHByb3ZpZGVycyBmb3IgdGhlIFVJLlxuY29uc3QgcmVzb2x2ZVNvY2lhbFByb3ZpZGVycyA9IChwcm92aWRlcnM6IFNtUHJvdmlkZXJbXSA9IFtdKSA9PiB7XG4gIGNvbnN0IGZhY2Vib29rUHJvdmlkZXIgPVxuICAgIHByb3ZpZGVycy5maW5kKChwcm92aWRlcikgPT4gaXNGYWNlYm9va1Byb3ZpZGVyKHByb3ZpZGVyKSkgPz8gcHJvdmlkZXJzWzBdXG4gIGNvbnN0IG90aGVyUHJvdmlkZXIgPVxuICAgIHByb3ZpZGVycy5maW5kKChwcm92aWRlcikgPT4gcHJvdmlkZXIgIT09IGZhY2Vib29rUHJvdmlkZXIgJiYgIWlzRmFjZWJvb2tQcm92aWRlcihwcm92aWRlcikpID8/XG4gICAgcHJvdmlkZXJzLmZpbmQoKHByb3ZpZGVyKSA9PiBwcm92aWRlciAhPT0gZmFjZWJvb2tQcm92aWRlcilcblxuICByZXR1cm4ge2ZhY2Vib29rUHJvdmlkZXIsIG90aGVyUHJvdmlkZXJ9XG59XG5cblxuLy8gQnVpbGRzIHRoZSBMaWZldGltZSBDb252ZXJzaW9uIFJhdGUgc3VtbWFyeSBjYXJkIHJvdy5cbmNvbnN0IGdldExpZmV0aW1lQ29udmVyc2lvblJhdGVDYXJkID0gKHNlY3Rpb25zOiBDaGVja2xpc3RTZWN0aW9uRGF0YVtdID0gW10pID0+IHtcbiAgY29uc3QgdG90YWxTZWN0aW9ucyA9IHNlY3Rpb25zLmxlbmd0aCB8fCA2XG4gIGNvbnN0IGNvbXBsZXRlZFNlY3Rpb25zID0gc2VjdGlvbnMuZmlsdGVyKChzZWN0aW9uKSA9PiBzZWN0aW9uLmFsbFRhc2tDb21wbGV0ZWQpLmxlbmd0aFxuICBjb25zdCBwZXJjZW50YWdlID0gdG90YWxTZWN0aW9ucyA+IDAgPyBNYXRoLnJvdW5kKChjb21wbGV0ZWRTZWN0aW9ucyAvIHRvdGFsU2VjdGlvbnMpICogMTAwKSA6IDBcblxuICBjb25zb2xlLmxvZyhcbiAgICBcIkxpZmV0aW1lIENvbnZlcnNpb24gUmF0ZSBzZWN0aW9uIGNvbXBsZXRpb24gc3RhdGVzOlwiLFxuICAgIHNlY3Rpb25zLm1hcCgoc2VjdGlvbikgPT4gKHtcbiAgICAgIGlkOiBzZWN0aW9uLmlkLFxuICAgICAgbmFtZTogc2VjdGlvbi5uYW1lLFxuICAgICAgYWxsVGFza0NvbXBsZXRlZDogISFzZWN0aW9uLmFsbFRhc2tDb21wbGV0ZWQsXG4gICAgfSkpXG4gIClcbiAgY29uc29sZS5sb2coXCJMaWZldGltZSBDb252ZXJzaW9uIFJhdGUgY2FsY3VsYXRpb246XCIsIHtcbiAgICBmb3JtdWxhOiBgKCR7Y29tcGxldGVkU2VjdGlvbnN9IC8gJHt0b3RhbFNlY3Rpb25zfSkgKiAxMDBgLFxuICAgIGNvbXBsZXRlZFNlY3Rpb25zLFxuICAgIHRvdGFsU2VjdGlvbnMsXG4gICAgcmF3UGVyY2VudGFnZTogdG90YWxTZWN0aW9ucyA+IDAgPyAoY29tcGxldGVkU2VjdGlvbnMgLyB0b3RhbFNlY3Rpb25zKSAqIDEwMCA6IDAsXG4gICAgcm91bmRlZFBlcmNlbnRhZ2U6IHBlcmNlbnRhZ2UsXG4gIH0pXG5cbiAgbGV0IGNsYXNzTmFtZSA9IFwibGlmZXRpbWUtY29udmVyc2lvbi1yYXRlIGxpZmV0aW1lLXJhdGUtcmVkXCJcblxuIGlmIChwZXJjZW50YWdlID4gMjApIHtcbiAgY2xhc3NOYW1lID0gXCJsaWZldGltZS1jb252ZXJzaW9uLXJhdGUgbGlmZXRpbWUtcmF0ZS1ibHVlXCI7XG59IGVsc2UgaWYgKHBlcmNlbnRhZ2UgPj0gMTAgJiYgcGVyY2VudGFnZSA8PSAyMCkge1xuICBjbGFzc05hbWUgPSBcImxpZmV0aW1lLWNvbnZlcnNpb24tcmF0ZSBsaWZldGltZS1yYXRlLW9yYW5nZVwiO1xufVxuXG4gIHJldHVybiB7XG4gICAgbGFiZWw6IFwiTGlmZXRpbWUgQ29udmVyc2lvbiBSYXRlXCIsXG4gICAgdmFsdWU6IGAke2NvbXBsZXRlZFNlY3Rpb25zfSBpbiAke3RvdGFsU2VjdGlvbnN9ICgke3BlcmNlbnRhZ2V9JSlgLFxuICAgIGNsYXNzTmFtZSxcbiAgfVxufVxuXG4vLyBDb21wdXRlcyBjb252ZXJzaW9uLXJhdGUgc3RhdHMgYW5kIFVJIHRvbmUgZm9yIHRoZSBTdWNjZXNzIHNlY3Rpb24uXG5jb25zdCBnZXRMaWZldGltZUNvbnZlcnNpb25SYXRlRGF0YSA9IChzZWN0aW9uczogQ2hlY2tsaXN0U2VjdGlvbkRhdGFbXSA9IFtdKSA9PiB7XG4gIGNvbnN0IHRvdGFsU2VjdGlvbnMgPSBzZWN0aW9ucy5sZW5ndGggfHwgNlxuICBjb25zdCBjb21wbGV0ZWRTZWN0aW9ucyA9IHNlY3Rpb25zLmZpbHRlcigoc2VjdGlvbikgPT4gc2VjdGlvbi5hbGxUYXNrQ29tcGxldGVkKS5sZW5ndGhcbiAgY29uc3QgcGVyY2VudGFnZSA9IHRvdGFsU2VjdGlvbnMgPiAwID8gTWF0aC5yb3VuZCgoY29tcGxldGVkU2VjdGlvbnMgLyB0b3RhbFNlY3Rpb25zKSAqIDEwMCkgOiAwXG5cbiAgbGV0IHRvbmVDbGFzc05hbWUgPSBcImxpZmV0aW1lLXJhdGUtcmVkXCJcbiAgbGV0IGJhZGdlVGV4dCA9IFwiU3RheSBjb25zaXN0ZW50LiBLZWVwIGdvaW5nLlwiXG5cbiAgaWYgKHBlcmNlbnRhZ2UgPiAyMCkge1xuICAgIHRvbmVDbGFzc05hbWUgPSBcImxpZmV0aW1lLXJhdGUtYmx1ZVwiXG4gICAgYmFkZ2VUZXh0ID0gXCJZb3UgZGlkIGl0LiAxIGluIDUuXCJcbiAgfSBlbHNlIGlmIChwZXJjZW50YWdlID49IDEwICYmIHBlcmNlbnRhZ2UgPD0gMjApIHtcbiAgICB0b25lQ2xhc3NOYW1lID0gXCJsaWZldGltZS1yYXRlLW9yYW5nZVwiXG4gICAgYmFkZ2VUZXh0ID0gXCJBbG1vc3QgdGhlcmUuIEtlZXAgZ29pbmcuXCJcbiAgfVxuXG4gIGNvbnNvbGUubG9nKFwic3VjY2Vzcy1jb252ZXJzaW9uLXBlcmNlbnQ6XCIsIHtcbiAgICBjb21wbGV0ZWRTZWN0aW9ucyxcbiAgICB0b3RhbFNlY3Rpb25zLFxuICAgIHBlcmNlbnRhZ2UsXG4gICAgdG9uZUNsYXNzTmFtZSxcbiAgfSlcblxuICByZXR1cm4ge1xuICAgIGNvbXBsZXRlZFNlY3Rpb25zLFxuICAgIHRvdGFsU2VjdGlvbnMsXG4gICAgcGVyY2VudGFnZSxcbiAgICB0b25lQ2xhc3NOYW1lLFxuICAgIGJhZGdlVGV4dCxcbiAgfVxufVxuXG4vLyBCdWlsZHMgaW5pdGlhbCB0b2dnbGUgc3RhdGUgZnJvbSBBUEkgcGF5bG9hZC5cbmNvbnN0IGdldEluaXRpYWxUb2dnbGVWYWx1ZXMgPSAoc2VjdGlvbnM6IENoZWNrbGlzdFNlY3Rpb25EYXRhW10gPSBbXSkgPT5cbiAgc2VjdGlvbnMucmVkdWNlPFJlY29yZDxudW1iZXIsIGJvb2xlYW4+PigoYWNjLCBzZWN0aW9uKSA9PiB7XG4gICAgOyhzZWN0aW9uLnRhc2tzID8/IFtdKS5mb3JFYWNoKCh0YXNrKSA9PiB7XG4gICAgICBpZiAodGFzay5pbnB1dFR5cGUgPT09IFwiVE9HR0xFXCIpIHtcbiAgICAgICAgYWNjW3Rhc2suaWRdID0gISF0YXNrLnZhbHVlPy5ib29sZWFuVmFsdWVcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIGFjY1xuICB9LCB7fSlcblxuLy8gTm9ybWFsaXplcyBpbnB1dCB2YWx1ZXMgc28gd2Ugc3RvcmUgYm9vbGVhbnMvbnVtYmVycyBjb25zaXN0ZW50bHkuXG5jb25zdCBub3JtYWxpem
2386VDaGVja2xpc3RWYWx1ZSA9ICh2YWx1ZTogc3RyaW5nIHwgYm9vbGVhbikgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBjb25zdCB0cmltbWVkVmFsdWUgPSB2YWx1ZS50cmltKClcblxuICBpZiAodHJpbW1lZFZhbHVlID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIFwiXCJcbiAgfVxuXG4gIGNvbnN0IG51bWVyaWNWYWx1ZSA9IE51bWJlcih0cmltbWVkVmFsdWUpXG5cbiAgcmV0dXJuIE51bWJlci5pc05hTihudW1lcmljVmFsdWUpID8gdHJpbW1lZFZhbHVlIDogbnVtZXJpY1ZhbHVlXG59XG5cbi8vIEZvcm1hdHMgYSBkYXRlL3RpbWUgZm9yIHNhdmluZyBjaGVja2xpc3QgZW50cmllcy5cbmNvbnN0IGZvcm1hdENoZWNrbGlzdEVudHJ5RGF0ZSA9IChkYXRlOiBEYXRlKSA9PiB7XG4gIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKClcbiAgY29uc3QgbW9udGggPSBTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgXCIwXCIpXG4gIGNvbnN0IGRheSA9IFN0cmluZyhkYXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgXCIwXCIpXG4gIGNvbnN0IGhvdXJzID0gU3RyaW5nKGRhdGUuZ2V0SG91cnMoKSkucGFkU3RhcnQoMiwgXCIwXCIpXG4gIGNvbnN0IG1pbnV0ZXMgPSBTdHJpbmcoZGF0ZS5nZXRNaW51dGVzKCkpLnBhZFN0YXJ0KDIsIFwiMFwiKVxuXG4gIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX0gJHtob3Vyc306JHttaW51dGVzfWBcbn1cblxuLy8gRm9ybWF0cyBhIGRhdGUgZm9yIGZpbHRlcmluZyAoMDA6MDAgdGltZSkuXG5jb25zdCBmb3JtYXRDaGVja2xpc3RGaWx0ZXJEYXRlID0gKGRhdGU6IERhdGUpID0+IHtcbiAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKVxuICBjb25zdCBtb250aCA9IFN0cmluZyhkYXRlLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCBcIjBcIilcbiAgY29uc3QgZGF5ID0gU3RyaW5nKGRhdGUuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCBcIjBcIilcblxuICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9IDAwOjAwYFxufVxuXG5jb25zdCBwYXJzZUZpbHRlckRhdGUgPSAodmFsdWU/OiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gIGlmICghdmFsdWUpIHJldHVybiBudWxsXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS5yZXBsYWNlKFwiIFwiLCBcIlRcIilcbiAgY29uc3QgcGFyc2VkID0gbmV3IERhdGUobm9ybWFsaXplZClcbiAgcmV0dXJuIE51bWJlci5pc05hTihwYXJzZWQuZ2V0VGltZSgpKSA/IG51bGwgOiBwYXJzZWRcbn1cblxuY29uc3QgZm9ybWF0U2hvcnREYXRlID0gKGRhdGU6IERhdGUpID0+XG4gIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KFwiZW4tVVNcIiwge21vbnRoOiBcInNob3J0XCIsIGRheTogXCIyLWRpZ2l0XCIsIHllYXI6IFwibnVtZXJpY1wifSkuZm9ybWF0KGRhdGUpXG5cbmNvbnN0IGZvcm1hdE1vbnRoWWVhciA9IChkYXRlOiBEYXRlKSA9PlxuICBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChcImVuLVVTXCIsIHttb250aDogXCJsb25nXCIsIHllYXI6IFwibnVtZXJpY1wifSkuZm9ybWF0KGRhdGUpXG5cbmNvbnN0IGdldFdlZWtSYW5nZUxhYmVsID0gKGRhdGU6IERhdGUpID0+IHtcbiAgY29uc3QgZGF5ID0gZGF0ZS5nZXREYXkoKVxuXG4gIC8vIOKchSBDb252ZXJ0IFN1bmRheSgwKSDihpIgNiwgTW9uZGF5KDEpIOKGkiAwLCAuLi5cbiAgY29uc3QgZGlmZiA9IGRheSA9PT0gMCA/IC02IDogMSAtIGRheVxuXG4gIGNvbnN0IHdlZWtTdGFydCA9IG5ldyBEYXRlKGRhdGUpXG4gIHdlZWtTdGFydC5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpICsgZGlmZilcblxuICBjb25zdCB3ZWVrRW5kID0gbmV3IERhdGUod2Vla1N0YXJ0KVxuICB3ZWVrRW5kLnNldERhdGUod2Vla1N0YXJ0LmdldERhdGUoKSArIDYpXG5cbiAgY29uc3Qgc2FtZU1vbnRoID0gd2Vla1N0YXJ0LmdldE1vbnRoKCkgPT09IHdlZWtFbmQuZ2V0TW9udGgoKVxuICBjb25zdCBzYW1lWWVhciA9IHdlZWtTdGFydC5nZXRGdWxsWWVhcigpID09PSB3ZWVrRW5kLmdldEZ1bGxZZWFyKClcblxuICBpZiAoc2FtZU1vbnRoICYmIHNhbWVZZWFyKSB7XG4gICAgY29uc3QgbW9udGggPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChcImVuLVVTXCIsIHsgbW9udGg6IFwic2hvcnRcIiB9KS5mb3JtYXQod2Vla1N0YXJ0KVxuICAgIGNvbnN0IHN0YXJ0RGF5ID0gU3RyaW5nKHdlZWtTdGFydC5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsIFwiMFwiKVxuICAgIGNvbnN0IGVuZERheSA9IFN0cmluZyh3ZWVrRW5kLmdldERhdGUoKSkucGFkU3RhcnQoMiwgXCIwXCIpXG4gICAgcmV0dXJuIGAke21vbnRofSAke3N0YXJ0RGF5fSDigJMgJHtlbmREYXl9LCAke3dlZWtTdGFydC5nZXRGdWxsWWVhcigpfWBcbiAgfVxuXG4gIHJldHVybiBgJHtmb3JtYXRTaG9ydERhdGUod2Vla1N0YXJ0KX0g4oCTICR7Zm9ybWF0U2hvcnREYXRlKHdlZWtFbmQpfWBcbn1cbmNvbnN0IGJ1aWxkQWN0aXZpdHlIZWFkZXJMYWJlbCA9IChcbiAgc2VsZWN0ZWRSYW5nZTogc3RyaW5nIHwgbnVsbCxcbiAgc2VsZWN0ZWREYXRlOiBEYXRlLFxuICBmaWx0ZXI6IENhbXBhaWduRmlsdGVyVHlwZSB8IG51bGxcbikgPT4ge1xuICBjb25zdCBoYXNBZHZhbmNlZERhdGVGaWx0ZXIgPSAhIWZpbHRlcj8uc3RhcnREYXRlICYmICEhZmlsdGVyPy5lbmREYXRlXG4gIGNvbnN0IGZyb21EYXRlID0gcGFyc2VGaWx0ZXJEYXRlKGZpbHRlcj8uc3RhcnREYXRlKVxuICBjb25zdCB0b0RhdGUgPSBwYXJzZUZpbHRlckRhdGUoZmlsdGVyPy5lbmREYXRlKVxuXG4gIGlmIChoYXNBZHZhbmNlZERhdGVGaWx0ZXIgJiYgZnJvbURhdGUgJiYgdG9EYXRlKSB7XG4gICAgaWYgKGZyb21EYXRlLnRvRGF0ZVN0cmluZygpID09PSB0b0RhdGUudG9EYXRlU3RyaW5nKCkpIHtcbiAgICAgIHJldHVybiBgV2Vla2x5IEFjdGl2aXR5IExvZyAtICR7Zm9ybWF0U2hvcnREYXRlKGZyb21EYXRlKX1gXG4gICAgfVxuICAgIHJldHVybiBgV2Vla2x5IEFjdGl2aXR5IExvZyAtICR7Zm9ybWF0U2hvcnREYXRlKGZyb21EYXRlKX0g4oCTICR7Zm9ybWF0U2hvcnREYXRlKHRvRGF0ZSl9YFxuICB9XG5cbiAgaWYgKHNlbGVjdGVkUmFuZ2UgPT09IFdFRUtfU1RSSU5HKSB7XG4gICAgcmV0dXJuIGBXZWVrbHkgQWN0aXZpdHkgTG9nIC0gJHtnZXRXZWVrUmFuZ2VMYWJlbChzZWxlY3RlZERhdGUpfWBcbiAgfVxuXG4gIGlmIChzZWxlY3RlZFJhbmdlID09PSBNT05USF9TVFJJTkcpIHtcbiAgICByZXR1cm4gYE1vbnRobHkgQWN0aXZpdHkgTG9nIC0gJHtmb3JtYXRNb250aFllYXIoc2VsZWN0ZWREYXRlKX1gXG4gIH1cblxuICBpZiAoc2VsZWN0ZWRSYW5nZSA9PT0gWUVBUl9TVFJJTkcpIHtcbiAgICByZXR1cm4gYFllYXJseSBBY3Rpdml0eSBMb2cgLSAke3NlbGVjdGVkRGF0ZS
23865nZXRGdWxsWWVhcigpfWBcbiAgfVxuXG4gIGlmIChzZWxlY3RlZFJhbmdlID09PSBMSUZFVElNRV9TVFJJTkcpIHtcbiAgICByZXR1cm4gYExpZmV0aW1lIEFjdGl2aXR5IFN1bW1hcnkgIGBcbiAgfVxuXG4gIHJldHVybiBgRGFpbHkgQWN0aXZpdHkgTG9nIC0gJHtmb3JtYXRTaG9ydERhdGUoc2VsZWN0ZWREYXRlKX1gXG59XG5cbi8vIENvbnZlcnRzIGEgVUkgdmFsdWUgaW50byB0aGUgQVBJIHNhdmUgcGF5bG9hZCBzaGFwZS5cbmNvbnN0IGJ1aWxkVGFza1ZhbHVlVXBkYXRlID0gKFxuICB0YXNrSWQ6IG51bWJlcixcbiAgdmFsdWU6IHN0cmluZyB8IGJvb2xlYW5cbik6IENoZWNrbGlzdFRhc2tWYWx1ZVVwZGF0ZSA9PiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IG5vcm1hbGl6ZUNoZWNrbGlzdFZhbHVlKHZhbHVlKVxuXG4gIGlmICh0eXBlb2Ygbm9ybWFsaXplZFZhbHVlID09PSBcImJvb2xlYW5cIikge1xuICAgIHJldHVybiB7XG4gICAgICB0YXNrSWQsXG4gICAgICBib29sZWFuVmFsdWU6IG5vcm1hbGl6ZWRWYWx1ZSxcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIG5vcm1hbGl6ZWRWYWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiB7XG4gICAgICB0YXNrSWQsXG4gICAgICBudW1iZXJWYWx1ZTogbm9ybWFsaXplZFZhbHVlLFxuICAgIH1cbiAgfVxuXG4gIGlmIChub3JtYWxpemVkVmFsdWUgPT09IFwiXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGFza0lkLFxuICAgICAgbnVtYmVyVmFsdWU6IG51bGwsXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGFyc2VkTnVtYmVyVmFsdWUgPSBOdW1iZXIobm9ybWFsaXplZFZhbHVlKVxuXG4gIHJldHVybiB7XG4gICAgdGFza0lkLFxuICAgIG51bWJlclZhbHVlOiBOdW1iZXIuaXNOYU4ocGFyc2VkTnVtYmVyVmFsdWUpID8gbnVsbCA6IHBhcnNlZE51bWJlclZhbHVlLFxuICB9XG59XG5cbi8vIEVuc3VyZXMgYmxhbmsgZmllbGRzIHJlbmRlciBhcyBlbXB0eSBzdHJpbmcgaW5zdGVhZCBvZiBudWxsL3VuZGVmaW5lZC5cbmNvbnN0IGdldERpc3BsYXlOdW1iZXJWYWx1ZSA9ICh2YWx1ZT86IG51bWJlciB8IG51bGwpID0+ICh2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlKVxuXG4vLyBTYWZlbHkgZXh0cmFjdHMgdGhlIGNoZWNrbGlzdCBlbnRyeSBpZCBmcm9tIGFueSBBUEkgc2hhcGUuXG5jb25zdCByZXNvbHZlQ2hlY2tsaXN0RW50cnlJZCA9IChwYXlsb2FkPzogQ2hlY2tsaXN0UGF5bG9hZCB8IG51bGwpID0+IHtcbiAgaWYgKCFwYXlsb2FkKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IGNhbmRpZGF0ZUlkcyA9IFtwYXlsb2FkLmlkLCBwYXlsb2FkLmVudHJ5SWQsIHBheWxvYWQuZW50cnlfaWRdXG5cbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlSWRzKSB7XG4gICAgaWYgKHR5cGVvZiBjYW5kaWRhdGUgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKGNhbmRpZGF0ZSkgJiYgY2FuZGlkYXRlID4gMCkge1xuICAgICAgcmV0dXJuIGNhbmRpZGF0ZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbi8vIEdldHMgdGhlIFwic2VudC9hY2NlcHRlZFwiIHRhc2sgaWQgZm9yIGEgcHJvdmlkZXIuXG5jb25zdCBnZXRQcm92aWRlclRhc2tJZCA9IChcbiAgcHJvdmlkZXI6IFNtUHJvdmlkZXIgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBraW5kOiBcInNlbnRcIiB8IFwiYWNjZXB0ZWRcIlxuKSA9PiB7XG4gIGlmICghcHJvdmlkZXIpIHJldHVybiB1bmRlZmluZWRcblxuICBpZiAoa2luZCA9PT0gXCJzZW50XCIpIHtcbiAgICByZXR1cm4gcHJvdmlkZXIuc2VudFRhc2tJZCA/PyBwcm92aWRlci5mcmllbmRSZXF1ZXN0U2VudFRhc2tJZFxuICB9XG5cbiAgcmV0dXJuIHByb3ZpZGVyLmFjY2VwdGVkVGFza0lkID8/IHByb3ZpZGVyLmZyaWVuZFJlcXVlc3RBY2NlcHRlZFRhc2tJZFxufVxuXG4vLyBDYWxjdWxhdGVzIGFjY2VwdGFuY2UgcmF0ZSB3aXRoIDAtZ3VhcmQuXG5jb25zdCBjYWxjdWxhdGVMaWZldGltZUFjY2VwdGFuY2VSYXRlID0gKHByb3ZpZGVyPzogU21Qcm92aWRlciB8IG51bGwpOiBudW1iZXIgPT4ge1xuICBjb25zdCBvdmVyYWxsU2VudCA9IHByb3ZpZGVyPy5vdmVyYWxsU2VudCA/PyAwO1xuICBjb25zdCBvdmVyYWxsQWNjZXB0ZWQgPSBwcm92aWRlcj8ub3ZlcmFsbEFjY2VwdGVkID8/IDA7XG5cbiAgY29uc29sZS5sb2coXCJTbVByb3ZpZGVyIGlzIFwiLCBwcm92aWRlcj8ubmFtZSk7XG4gIGNvbnNvbGUubG9nKFwib3ZlcmFsbFNlbnQgQEBAIDpcIiwgb3ZlcmFsbFNlbnQpO1xuICBjb25zb2xlLmxvZyhcIm92ZXJhbGxBY2NlcHRlZDogQEBcIiwgb3ZlcmFsbEFjY2VwdGVkKTtcblxuICBpZiAocHJvdmlkZXI/Lm5hbWU/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoXCJmYWNlYm9va1wiKSkge1xuICAgIHJldHVybiBwcm92aWRlci5hY2NlcHRhbmNlUmF0ZSA/PyAwO1xuICB9XG5cbiAgLy8g4pyFIE9ubHkgZml4OiBoYW5kbGUgMC8wIGZvciBPdGhlciBQbGF0Zm9ybXNcbiAgaWYgKFxuICAgIHByb3ZpZGVyPy5uYW1lPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwib3RoZXJcIikgJiZcbiAgICBvdmVyYWxsU2VudCA9PT0gMCAmJlxuICAgIG92ZXJhbGxBY2NlcHRlZCA9PT0gMFxuICApIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHJldHVybiBNYXRoLnJvdW5kKChvdmVyYWxsQWNjZXB0ZWQgLyBvdmVyYWxsU2VudCkgKiAxMDApO1xufTtcblxuLy8g4pyFIE1haW4gZnVuY3Rpb24gKHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGgpXG5jb25zdCBnZXRMaWZldGltZUFjY2VwdGFuY2VSYXRlID0gKFxuICBwcm92aWRlcj86IFNtUHJvdmlkZXIgfCBudWxsXG4pOiBudW1iZXIgPT4ge1xuICBjb25zdCBpc0ZhY2Vib29rID1cbiAgICBwcm92aWRlcj8ubmFtZT8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhcImZhY2Vib29rXCIpO1xuXG4gIC8vIOKchSBGb3IgRmFjZWJvb2sg4oaSIFNUUklDVExZIHVzZSBBUEkgKG5vIGNhbGN1bGF0aW9uIGZhbGxiYWNrKVxuICBpZiAoaXNGYWNlYm9vaykge1xuICAgIHJldHVybiBwcm92aWRlcj8uYWNjZXB0YW5jZVJhdGUgPz8gMDtcbiAgfVxuXG4gIC8vIOKchSBPdGhlcnMg4oaSIGNhbGN1bGF0ZWRcbiAgcmV0dXJuIGNhbGN1bGF0ZUxpZmV0aW1lQWNjZXB0YW5jZVJhdGUocHJvdmlkZXIpO1xufTtcblxuLy8g4pyFIExvZ2dpbmcgd3JhcHBlciAob25seSBmb3IgZGVidWcsIG5vIGxvZ2ljIGluc2lkZSlcbmNvbnN0IGxvZ0xpZmV0aW1lQWNjZXB0YW5jZVJhdGUgPSAoXG4gIHNlY3Rpb25OYW1lOiBzdHJpbmcsXG4gIHByb3ZpZGVyTGFiZWw6IHN0cmluZyxcbiAgcHJvdmlkZXI/OiBTbVByb3ZpZGVyIHwgbnVsbFxuKSA9PiB7XG4gIGNvbnN0IHNlbnQgPSBwcm92aWRlcj8uc2VudCA/PyAwO1xuICBjb25zdCBhY2NlcHRlZCA9IHByb3ZpZGVyPy5hY2NlcHRlZCA/PyAwO1xuXG4gIGNvbnN0IGlzRmFjZWJvb2sgPVxuICAgIHByb3ZpZGVyPy5uYW1lPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwiZmFjZWJvb2tcIik7XG5cbiAgY29uc3QgYWNjZXB0YW5jZVJhdGUgPSBnZXRMaWZldGltZUFjY2VwdGFuY2VSYXRl
2386KHByb3ZpZGVyKTtcblxuICBjb25zb2xlLmxvZyhgJHtzZWN0aW9uTmFtZX0gTGlmZXRpbWUgQWNjZXB0YW5jZSBSYXRlYCwge1xuICAgIHByb3ZpZGVyOiBwcm92aWRlckxhYmVsLFxuICAgIHNvdXJjZTogaXNGYWNlYm9vayA/IFwiQVBJXCIgOiBcIkNBTENVTEFURURcIixcbiAgICBzZW50LFxuICAgIGFjY2VwdGVkLFxuICAgIGFwaVZhbHVlOiBwcm92aWRlcj8uYWNjZXB0YW5jZVJhdGUsXG4gICAgYWNjZXB0YW5jZVJhdGUsXG4gIH0pO1xuXG4gIHJldHVybiBhY2NlcHRhbmNlUmF0ZTtcbn07XG4vLyBGbGF0dGVucyBuZXN0ZWQgdGFzayB0cmVlIGludG8gcm93cyBmb3IgQ2hlY2tsaXN0U2VjdGlvbiByZW5kZXJpbmcuXG5jb25zdCBtYXBUYXNrc1RvUm93cyA9IChcbiAgdGFza3M6IENoZWNrbGlzdFRhc2tbXSA9IFtdLFxuICBvbkF1dG9zYXZlPzogKFxuICAgIHRhc2tJZDogbnVtYmVyLFxuICAgIHBsYXRmb3JtSWQ6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICB2YWx1ZTogc3RyaW5nIHwgYm9vbGVhbixcbiAgICBwcm92aWRlck5hbWU/OiBzdHJpbmdcbiAgKSA9PiB2b2lkLFxuICB0b2dnbGVWYWx1ZXM6IFJlY29yZDxudW1iZXIsIGJvb2xlYW4+ID0ge30sXG4gIGFsbG93RWRpdCA9IGZhbHNlXG4pOiBTZWN0aW9uUm93W10gPT4ge1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gbmV3IE1hcDxudW1iZXIsIENoZWNrbGlzdFRhc2tbXT4oKVxuICBjb25zdCByb290VGFza3M6IENoZWNrbGlzdFRhc2tbXSA9IFtdXG5cbiAgdGFza3MuZm9yRWFjaCgodGFzaykgPT4ge1xuICAgIGlmICh0YXNrLnBhcmVudElkID09IG51bGwpIHtcbiAgICAgIHJvb3RUYXNrcy5wdXNoKHRhc2spXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzaWJsaW5ncyA9IGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHRhc2sucGFyZW50SWQpID8/IFtdXG4gICAgc2libGluZ3MucHVzaCh0YXNrKVxuICAgIGNoaWxkcmVuQnlQYXJlbnQuc2V0KHRhc2sucGFyZW50SWQsIHNpYmxpbmdzKVxuICB9KVxuXG4gIC8vIFNvcnRzIHRhc2tzIGJ5IGRpc3BsYXlPcmRlciBmb3Igc3RhYmxlIFVJIG9yZGVyaW5nLlxuICBjb25zdCBzb3J0VGFza3MgPSAoaXRlbXM6IENoZWNrbGlzdFRhc2tbXSkgPT5cbiAgICBbLi4uaXRlbXNdLnNvcnQoKGEsIGIpID0+IChhLmRpc3BsYXlPcmRlciA/PyAwKSAtIChiLmRpc3BsYXlPcmRlciA/PyAwKSlcblxuICAvLyBGbGF0dGVucyBuZXN0ZWQgdGFza3MgaW50byByb3dzIHdpdGggaW5kZW50IGxldmVscy5cbiAgY29uc3QgZmxhdHRlblRhc2tzID0gKGl0ZW1zOiBDaGVja2xpc3RUYXNrW10sIGRlcHRoID0gMCk6IFNlY3Rpb25Sb3dbXSA9PlxuICAgIHNvcnRUYXNrcyhpdGVtcykuZmxhdE1hcCgodGFzaykgPT4ge1xuICAgICAgY29uc3QgY2hpbGRSb3dzID0gZmxhdHRlblRhc2tzKGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHRhc2suaWQpID8/IFtdLCBkZXB0aCArIDEpXG4gICAgICBjb25zdCBoYXNFeHBsaWNpdElucHV0ID0gdHlwZW9mIHRhc2suaW5wdXRUeXBlID09PSBcInN0cmluZ1wiICYmIHRhc2suaW5wdXRUeXBlLmxlbmd0aCA+IDBcblxuICAgICAgaWYgKCFoYXNFeHBsaWNpdElucHV0KSB7XG4gICAgICAgIHJldHVybiBbe2xhYmVsOiB0YXNrLm5hbWUsIHZhbHVlOiBcIlwiLCBpc0dyb3VwTGFiZWw6IHRydWUsIGluZGVudExldmVsOiBkZXB0aH0sIC4uLmNoaWxkUm93c11cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiB0YXNrLm5hbWUsXG4gICAgICAgICAgYWxsb3dFZGl0LFxuICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgdGFzay5pbnB1dFR5cGUgPT09IFwiVE9HR0xFXCIgPyAoXG4gICAgICAgICAgICAgIDxUb2dnbGVTd2l0Y2hcbiAgICAgICAgICAgICAgICBjaGVja2VkPXt0b2dnbGVWYWx1ZXNbdGFzay5pZF0gPz8gISF0YXNrLnZhbHVlPy5ib29sZWFuVmFsdWV9XG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e1xuICAgICAgICAgICAgICAgICAgYWxsb3dFZGl0ID8gKGNoZWNrZWQpID0+IG9uQXV0b3NhdmU/Lih0YXNrLmlkLCB0YXNrLnBsYXRmb3JtSWQsIGNoZWNrZWQpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFsbG93RWRpdD17YWxsb3dFZGl0fVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgZ2V0RGlzcGxheU51bWJlclZhbHVlKHRhc2sudmFsdWU/Lm51bWJlclZhbHVlKSA/PyB0YXNrLnZhbHVlPy5ib29sZWFuVmFsdWUgPz8gXCJcIlxuICAgICAgICAgICAgKSxcbiAgICAgICAgICBpbmRlbnRMZXZlbDogZGVwdGgsXG4gICAgICAgICAgb25WYWx1ZUNvbW1pdDpcbiAgICAgICAgICAgIHRhc2suaW5wdXRUeXBlID09PSBcIlRPR0dMRVwiXG4gICAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgIDogYWxsb3dFZGl0XG4gICAgICAgICAgICAgICAgPyAodmFsdWUpID0+IG9uQXV0b3NhdmU/Lih0YXNrLmlkLCB0YXNrLnBsYXRmb3JtSWQsIHZhbHVlKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB9LFxuICAgICAgICAuLi5jaGlsZFJvd3MsXG4gICAgICBdXG4gICAgfSlcblxuICByZXR1cm4gZmxhdHRlblRhc2tzKHJvb3RUYXNrcylcbn1cblxuLy8gTWFwcyBwcm92aWRlciBtZXRyaWNzIHRvIHJvd3MsIGluY2x1ZGluZyB2YWxpZGF0aW9uIGFuZCBhdXRvc2F2ZSBjYWxsYmFja3MuXG5jb25zdCBtYXBQcm92aWRlclRvUm93cyA9IChcbiAgcHJvdmlkZXI/OiBTbVByb3ZpZGVyIHwgbnVsbCxcbiAgb25BdXRvc2F2ZT86IChcbiAgICB0YXNrSWQ6IG51bWJlcixcbiAgICBwbGF0Zm9ybUlkOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgdmFsdWU6IHN0cmluZyB8IGJvb2xlYW4sXG4gICAgcHJvdmlkZXJOYW1lPzogc3RyaW5nXG4gICkgPT4gdm9pZCxcbiAgb3B0aW9ucz86IHtcbiAgICBlbXB0eU1pc3NpbmdWYWx1ZXM/OiBib29sZWFuXG4gICAgaXNFZGl0YWJsZT86IGJvb2xlYW5cbiAgICBzZW50VGFza0lkPzogbnVtYmVyXG4gICAgYWNjZXB0ZWRUYXNrSWQ/OiBudW1iZXJcbiAgICBzZW50VmFsdWVPdmVycmlkZT86IG51bWJlciB8IG51bGxcbiAgICBhY2NlcHRlZFZhbHVlT3ZlcnJpZGU/OiBudW1iZXIgfCBudWxsXG4gICAgdHJlYXRaZXJvQXNFbXB0eT86IGJvb2xlYW5cbiAgICBvbk1lc3NhZ2U/OiAobWVzc2FnZToge3R5cGU6IFwic3VjY2Vzc1wiIHwgXCJlcnJvclwiOyB0ZXh0OiBzdHJpbmd9IHwgbnVsbCkgPT4gdm9pZFxuICB9XG4pID0+IHtcbiAgaWYgKCFwcm92aWRlcikgcmV0dXJuIFtdXG5cbiAgY29uc3QgY2FsY3VsYXRlZEFjY2VwdGFuY2VSYXRlID0gY2FsY3VsYXRlTGlmZXRpbWVBY2NlcHRhbmNlUmF0ZShwcm92aWRlcilcbiAgY29uc3QgbGlmZXRpbWVBY2NlcHRhbmNlVG9uZUNsYXNzID1cbiAgICBjYWxjdWxhdGVkQWNjZXB0YW5jZVJhdGUgPiAyOVxuICAgICAgPyBcImxpZmV0aW1lLXJhdGUtYmx1ZVwiXG4gICAgICA6IGNhbGN1bGF0ZWRBY2NlcHRhbmNlUmF0ZSA+PSAyMCAmJiBjYWxjdWxhdGVkQWNjZXB0YW5jZVJhdGUgPD0gMjlcbiAgICAgICAgPyBcImxpZmV0aW1lLXJhdGUtb3JhbmdlXCJcbiAgICAgICAgOiBcImxpZmV0aW1lLXJhdGUteWVsbG93XCJcbiAgICAgICAgXG5cbiAgY29uc3QgcGxhdGZvcm1JZCA9IGdldFByb3ZpZGVyUGxhdGZvcm1JZChwcm92aWRlcilcbiAgY29uc3Qgc2VudFRhc2tJZCA9IGdldFByb3ZpZGVyVGFza0lkKHByb3ZpZGVyLCBcInNlbnRcIikgPz8gb3B0aW9ucz8uc2VudFRhc2tJZFxuICBjb25zdCBhY2NlcHRlZFRhc2tJZCA9IGdldFByb3ZpZGVyVGFza0lkKHByb3ZpZGVyLCBcImFjY2VwdGVkXCIpID8/IG9wdGlvbnM/LmFjY2VwdGVkVGFza0lkXG4gIGNvbnNvbGUubG9nKFwiPT09PT0gbWFwUHJvdmlkZXJUb1Jvd3MgREVCVUcgPT09PT1cIik7XG5cbiAgY29uc29sZS5sb2coXCJlbXB0eU1pc3NpbmdWYWx1ZXM6XCIsIG9wdGlvbnM/LmVtcHR5TWlzc2luZ1ZhbHVlcyk7XG4gIGNvbnNvbGUubG9nKFwiaXNFZGl0YWJsZTpcIiwgb3B0aW9ucz8uaXNFZGl0YWJsZSk7XG4gIGNvbnNvbGUubG9nKFwicHJvdmlkZXI6XCIsIHByb3ZpZGVyKTtcblxuICBcbmNvbnN0IHJlc29sdmVkU2VudFZhbHVlID1cbiAgb3B0aW9ucz8uc2VudFZhbHVlT3ZlcnJpZGUgIT09IHVuZGVmaW5lZFxuICAgID8gb3B0aW9ucy5zZW50VmFsdWVPdmVycmlkZVxuICAgIDogcHJvdmlkZXIuc2VudFxuXG5jb25zdCByZXNvbHZlZEFjY2VwdGVkVmFsdWUgPVxuICBvcHRpb25zPy5hY2NlcHRlZFZhbHVlT3ZlcnJpZGUgIT09IHVuZGVmaW5lZFxuICAgID8gb3B0aW9ucy5hY2NlcHRlZFZhbHVlT3ZlcnJpZGVcbiAgICA6IHByb3ZpZGVyLmFjY2VwdGVkXG5cbi8vIOKchSBGSU5BTCBESVNQTEFZIFZBTFVFU1xuY29uc3Qgc2VudFZhbHVlID1cbiAgcmVzb2x2ZWRTZW50VmFsdWUgPT09IG51bGwgfHwgcmVzb2x2ZWRTZW50VmFsdWUgPT09IHVuZGVmaW5lZFxuICAgID8gXCJcIlxuICAgIDogcmVzb2x2ZWRTZW50VmFsdWVcblxuY29uc3QgYWNjZXB0ZWRWYWx1ZSA9XG4gIHJlc29sdmVkQWNjZXB0ZWRWYWx1ZSA9PT0gbnVsbCB8fCByZXNvbHZlZEFjY2VwdGVkVmFsdWUgPT09IHVuZGVmaW5lZFxuICAgID8gXCJcIlxuICAgIDogcmVzb2x2ZWRBY2NlcHRlZFZhbHVlXG5cbiAgY29uc3QgaXNPdGhlclBsYXRmb3Jtc1Byb3ZpZGVyID1cbiAgICBwcm92aWRlci5uYW1lPy50cmltKCkudG9Mb3dlckNhc2UoKSA9PT0gXCJvdGhlciBwbGF0Zm9ybXNcIlxuXG4gIC8vIE5vcm1hbGl6ZXMgcHJvdmlkZXIgbnVtZXJpYyB2YWx1ZXMgZm9yIHNhdmUvdXBkYXRlIG9wZXJhdGlvbnMuXG4gIGNvbnN0IG5vcm1hbGl6ZVByb3ZpZGVyRmllbGRWYWx1ZSA9IChmaWVsZFZhbHVlOiBzdHJpbmcgfCBib29sZWFuKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBmaWVsZFZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGNvbnN0IHRyaW1tZWRWYWx1ZSA9IGZpZWxkVmFsdWUud
2386HJpbSgpXG4gICAgaWYgKHRyaW1tZWRWYWx1ZSA9PT0gXCJcIikge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWRWYWx1ZSA9IE51bWJlcih0cmltbWVkVmFsdWUpXG4gICAgcmV0dXJuIE51bWJlci5pc05hTihwYXJzZWRWYWx1ZSkgPyBudWxsIDogcGFyc2VkVmFsdWVcbiAgfVxuXG4gIGNvbnN0IHZhbGlkYXRlT3ZlcmFsbENvbnN0cmFpbnQgPSAoXG4gICAgbmV4dFZhbHVlOiBzdHJpbmcsXG4gICAgZmllbGQ6IFwic2VudFwiIHwgXCJhY2NlcHRlZFwiXG4gICk6IHtpc1ZhbGlkOiBib29sZWFuOyBwYXJzZWRWYWx1ZTogbnVtYmVyIHwgbnVsbH0gPT4ge1xuICAgIGlmICghaXNPdGhlclBsYXRmb3Jtc1Byb3ZpZGVyKSB7XG4gICAgICByZXR1cm4ge2lzVmFsaWQ6IHRydWUsIHBhcnNlZFZhbHVlOiBub3JtYWxpemVQcm92aWRlckZpZWxkVmFsdWUobmV4dFZhbHVlKX1cbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWROZXh0VmFsdWUgPSBub3JtYWxpemVQcm92aWRlckZpZWxkVmFsdWUobmV4dFZhbHVlKVxuICAgIGlmIChuZXh0VmFsdWUudHJpbSgpICE9PSBcIlwiICYmIHBhcnNlZE5leHRWYWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4ge2lzVmFsaWQ6IGZhbHNlLCBwYXJzZWRWYWx1ZTogbnVsbH1cbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50U2VudFZhbHVlID0gdHlwZW9mIHJlc29sdmVkU2VudFZhbHVlID09PSBcIm51bWJlclwiID8gcmVzb2x2ZWRTZW50VmFsdWUgOiBudWxsXG4gICAgY29uc3QgY3VycmVudEFjY2VwdGVkVmFsdWUgPVxuICAgICAgdHlwZW9mIHJlc29sdmVkQWNjZXB0ZWRWYWx1ZSA9PT0gXCJudW1iZXJcIiA/IHJlc29sdmVkQWNjZXB0ZWRWYWx1ZSA6IG51bGxcblxuICAgIGNvbnN0IG5leHRTZW50VmFsdWUgPSBmaWVsZCA9PT0gXCJzZW50XCIgPyBwYXJzZWROZXh0VmFsdWUgOiBjdXJyZW50U2VudFZhbHVlXG4gICAgY29uc3QgbmV4dEFjY2VwdGVkVmFsdWUgPSBmaWVsZCA9PT0gXCJhY2NlcHRlZFwiID8gcGFyc2VkTmV4dFZhbHVlIDogY3VycmVudEFjY2VwdGVkVmFsdWVcblxuICAgIGNvbnN0IGJhc2VPdmVyYWxsU2VudCA9IHR5cGVvZiBwcm92aWRlci5vdmVyYWxsU2VudCA9PT0gXCJudW1iZXJcIiA/IHByb3ZpZGVyLm92ZXJhbGxTZW50IDogMFxuICAgIGNvbnN0IGJhc2VPdmVyYWxsQWNjZXB0ZWQgPVxuICAgICAgdHlwZW9mIHByb3ZpZGVyLm92ZXJhbGxBY2NlcHRlZCA9PT0gXCJudW1iZXJcIiA/IHByb3ZpZGVyLm92ZXJhbGxBY2NlcHRlZCA6IDBcblxuICAgIC8vIG92ZXJhbGxTZW50L292ZXJhbGxBY2NlcHRlZCBhbHJlYWR5IGluY2x1ZGUgdG9kYXkncyBzYXZlZCB2YWx1ZXMsXG4gICAgLy8gc28gc3VidHJhY3QgdG9kYXkncyBvcmlnaW5hbCB0byBhdm9pZCBkb3VibGUtY291bnRpbmcgdGhlIG5ldyBpbnB1dC5cbiAgICBjb25zdCBvcmlnaW5hbERheVNlbnQgPSB0eXBlb2YgcHJvdmlkZXIuc2VudCA9PT0gXCJudW1iZXJcIiA/IHByb3ZpZGVyLnNlbnQgOiAwXG4gICAgY29uc3Qgb3JpZ2luYWxEYXlBY2NlcHRlZCA9IHR5cGVvZiBwcm92aWRlci5hY2NlcHRlZCA9PT0gXCJudW1iZXJcIiA/IHByb3ZpZGVyLmFjY2VwdGVkIDogMFxuXG4gICAgY29uc3QgdG90YWxTZW50ID0gKGJhc2VPdmVyYWxsU2VudCAtIG9yaWdpbmFsRGF5U2VudCkgKyAobmV4dFNlbnRWYWx1ZSA/PyAwKVxuICAgIGNvbnN0IHRvdGFsQWNjZXB0ZWQgPSAoYmFzZU92ZXJhbGxBY2NlcHRlZCAtIG9yaWdpbmFsRGF5QWNjZXB0ZWQpICsgKG5leHRBY2NlcHRlZFZhbHVlID8/IDApXG5cbiAgICBpZiAodG90YWxBY2NlcHRlZCA+IHRvdGFsU2VudCkge1xuICBvcHRpb25zPy5vbk1lc3NhZ2U/Lih7XG4gICAgdHlwZTogXCJlcnJvclwiLFxuICAgIHRleHQ6IGBPdmVyYWxsIEFjY2VwdGVkICgke2Jhc2VPdmVyYWxsQWNjZXB0ZWR9KSBzaG91bGQgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIE92ZXJhbGwgU2VudCAoJHtiYXNlT3ZlcmFsbFNlbnR9KS5gLFxuICB9KVxuXG4gIHJldHVybiB7IGlzVmFsaWQ6IGZhbHNlLCBwYXJzZWRWYWx1ZTogcGFyc2VkTmV4dFZhbHVlIH1cbn1cblxuICAgIHJldHVybiB7aXNWYWxpZDogdHJ1ZSwgcGFyc2VkVmFsdWU6IHBhcnNlZE5leHRWYWx1ZX1cbiAgfVxuXG4gIHJldHVybiBbXG57XG4gIGxhYmVsOiBcIkZyaWVuZCBSZXF1ZXN0ICYgTWVzc2FnZSBTZW50XCIsXG4gIHZhbHVlOiBzZW50VmFsdWUsXG4gIGFsbG93RWRpdDogISFvcHRpb25zPy5pc0VkaXRhYmxlLFxuICB2YWxpZGF0ZU5leHRWYWx1ZTogKG5leHRWYWx1ZSkgPT4gdmFsaWRhdGVPdmVyYWxsQ29uc3RyYWludChuZXh0VmFsdWUsIFwic2VudFwiKS5pc1ZhbGlkLFxuICBvblZhbHVlQ29tbWl0OlxuICAgIG9wdGlvbnM/LmlzRWRpdGFibGUgIT09IGZhbHNlICYmIHNlbnRUYXNrSWRcbiAgICAgID8gYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHZhbGlkYXRlT3ZlcmFsbENvbnN0cmFpbnQodmFsdWUsIFwic2VudFwiKVxuICAgICAgICAgIGlmICghdmFsaWRhdGlvbi5pc1ZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBub3JtYWxpemVkVmFsdWUgPSBub3JtYWxpemVQcm92aWRlckZpZWxkVmFsdWUodmFsdWUpXG5cbiAgICAgICAgICBvcHRpb25zPy5vbk1lc3NhZ2U/Lih7XG4gICAgICAgICAgICB0eXBlOiBcInN1Y2Nlc3NcIixcbiAgICAgICAgICAgIHRleHQ6IGBGcmllbmQgUmVxdWVzdCAmIE1lc3NhZ2UgU2VudCBoYXMgYmVlbiBjaGFuZ2VkIHRvICR7XG4gICAgICAgICAgICAgIG5vcm1hbGl6ZWRWYWx1ZSA9PSBudWxsID8gXCJlbXB0eVwiIDogbm9ybWFsaXplZFZhbHVlXG4gICAgICAgICAgICB9LmAsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGF3YWl0IG9uQXV0b3NhdmU/LihzZW50VGFza0lkLCBwbGF0Zm9ybUlkLCB2YWx1ZSwgcHJvdmlkZXI/Lm5hbWUpXG4gICAgICAgIH1cbiAgICAgIDogdW5kZWZpbmVkLFxufSxcbiAgICB7XG4gICAgICBsYWJlbDogXCJBY2NlcHRlZFwiLFxuICAgICAgdmFsdWU6IGFjY2VwdGVkVmFsdWUsXG4gICAgICBhbGxvd0VkaXQ6ICEhb3B0aW9ucz8uaXNFZGl0YWJsZSxcbiAgICAgIG9uVmFsdWVDaGFuZ2U6IChuZXh0VmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHZhbGlkYXRlT3ZlcmFsbENvbnN0cmFpbnQobmV4dFZhbHVlLCBcImFjY2VwdGVkXCIpXG4gICAgICAgIGlmICghdmFsaWRhdGlvbi5pc1ZhbGlkKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgI
2386H1cbiAgICAgIH0sXG4gICAgICB2YWxpZGF0ZU5leHRWYWx1ZTogKG5leHRWYWx1ZSkgPT4gdmFsaWRhdGVPdmVyYWxsQ29uc3RyYWludChuZXh0VmFsdWUsIFwiYWNjZXB0ZWRcIikuaXNWYWxpZCxcbiAgICAgIG9uVmFsdWVDb21taXQ6XG4gICAgICAgICAgb3B0aW9ucz8uaXNFZGl0YWJsZSAhPT0gZmFsc2UgJiYgYWNjZXB0ZWRUYXNrSWRcbiAgICAgICAgICAgID8gYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHZhbGlkYXRlT3ZlcmFsbENvbnN0cmFpbnQodmFsdWUsIFwiYWNjZXB0ZWRcIilcbiAgICAgICAgICAgICAgICBpZiAoIXZhbGlkYXRpb24uaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFZhbHVlID0gbm9ybWFsaXplUHJvdmlkZXJGaWVsZFZhbHVlKHZhbHVlKVxuICAgICAgICAgICAgICAgIG9wdGlvbnM/Lm9uTWVzc2FnZT8uKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwic3VjY2Vzc1wiLFxuICAgICAgICAgICAgICAgICAgdGV4dDogYEFjY2VwdGVkIGhhcyBiZWVuIGNoYW5nZWQgdG8gJHtcbiAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZFZhbHVlID09IG51bGwgPyBcImVtcHR5XCIgOiBub3JtYWxpemVkVmFsdWVcbiAgICAgICAgICAgICAgICAgIH0uYCxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQWNjZXB0ZWQgaGFzIGJlZW4gY2hhbmdlZFwiLCB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogbm9ybWFsaXplZFZhbHVlLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgYXdhaXQgb25BdXRvc2F2ZT8uKGFjY2VwdGVkVGFza0lkLCBwbGF0Zm9ybUlkLCB2YWx1ZSwgcHJvdmlkZXI/Lm5hbWUpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6IFwiTGlmZXRpbWUgQWNjZXB0YW5jZSBSYXRlXCIsXG4gICAgICB2YWx1ZTogKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJhdGUtY2VsbFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmF0ZS1wZXJjZW50XCI+e2dldExpZmV0aW1lQWNjZXB0YW5jZVJhdGUocHJvdmlkZXIpfSU8L2Rpdj5cbiAgICAgICAgICB7LyogPGRpdiBjbGFzc05hbWU9XCJyYXRlLXN1YnRleHRcIj57YWNjZXB0ZWRWYWx1ZX0gb3V0IG9mIHtzZW50VmFsdWV9IGFjY2VwdGVkPC9kaXY+ICovfVxuICAgICAgICAgIHsoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGVyY2VudCA9IGdldExpZmV0aW1lQWNjZXB0YW5jZVJhdGUocHJvdmlkZXIpXG4gICAgICAgICAgICBjb25zdCBpc2JsdWUgPSBwZXJjZW50ID4gMjlcbiAgICAgICAgICAgIGNvbnN0IGlzT3JhbmdlID0gcGVyY2VudCA+PSAyMCAmJiBwZXJjZW50IDw9IDI5XG5cbiAgICAgICAgICAgIGNvbnN0IGJnQ29sb3IgPSBpc2JsdWUgPyBcIiNGRkZGRkYzM1wiIDogaXNPcmFuZ2UgPyBcIiNGRkZGRkYzM1wiIDogXCIjRkZGRkZGMzNcIlxuICAgICAgICAgICAgY29uc3QgYmFkZ2VUZXh0ID0gaXNibHVlXG4gICAgICAgICAgICAgID8gXCJZb3UncmUgcGVyZm9ybWluZyBpbiB0aGUgdG9wIDElLlwiXG4gICAgICAgICAgICAgIDogaXNPcmFuZ2VcbiAgICAgICAgICAgICAgICA/IFwiWW91J3JlIHJpZ2h0IHdoZXJlIHlvdSBuZWVkIHRvIGJlLlwiXG4gICAgICAgICAgICAgICAgOiBcIllvdXIgbGlzdCBvciBtZXNzYWdlcyBuZWVkIGEgcmVmcmVzaC5cIlxuXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJhdGUtbXNnXCIgc3R5bGU9e3sgYmFja2dyb3VuZDogYmdDb2xvciB9fT5cbiAgICAgICAgICAgICAgICB7YmFkZ2VUZXh0fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIClcbiAgICAgICAgICB9KSgpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICksXG4gICAgICB2YWx1ZUNsYXNzTmFtZTogXCJyYXRlLWNlbGxcIixcbiAgICAgIGl0ZW1DbGFzc05hbWU6IGxpZmV0aW1lQWNjZXB0YW5jZVRvbmVDbGFzcyxcbiAgICB9LFxuICBdIGFzIFNlY3Rpb25Sb3dbXVxufVxuXG4vLyBHZW5lcmF0ZXMgdGhlIGNvbnZlcnNpb24tcmF0ZSByb3cgZm9yIHRoZSBTdWNjZXNzIHNlY3Rpb24uXG5jb25zdCBjcmVhdGVTdWNjZXNzQ29udmVyc2lvblJvdyA9IChcbiAgbGFiZWwgPSBcIkNvbnZlcnNpb24gUmF0ZVwiLFxuICBjb252ZXJzaW9uUmF0ZSA9IDAsXG4gIGNvbnZlcnRlZENvdW50ID0gMCxcbiAgdG90YWxDb3VudCA9IDYsXG4gIHRvbmVDbGFzc05hbWUgPSBcImxpZmV0aW1lLXJhdGUtcmVkXCIsXG4gIGJhZGdlVGV4dCA9IFwieW91J3JlIENvbnZlcnRpbmdcIlxuKTogU2VjdGlvblJvdyA9PiAoe1xuICBsYWJlbCxcbiAgdmFsdWU6IChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInN1Y2Nlc3MtY29udmVyc2lvbi1jb250ZW50XCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInN1Y2Nlc3MtY29udmVyc2lvbi1wZXJjZW50XCI+e2NvbnZlcnNpb25SYXRlfSU8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3VjY2Vzcy1jb252ZXJzaW9uLXN1YnRleHRcIj57Y29udmVydGVkQ291bnR9IG91dCBvZiB7dG90YWxDb3VudH0gY29udmVydGVkPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT17YHN1Y2Nlc3MtY29udmVyc2lvbi1iYWRnZSAke3RvbmVDbGFzc05hbWV9YH0+e2JhZGdlVGV4dH08L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKSxcbiAgaXRlbUNsYXNzTmFtZTogYHN1Y2Nlc3MtY29udmVyc2lvbi1pdGVtICR7dG9uZUNsYXNzTmFtZX1gLFxuICB2YWx1ZUNsYXNzTmFtZTogXCJzdWNjZXNzLWNvbnZlcnNpb24tY29udHJvbFwiLFxufSlcblxuLy8gQnVpbGRzIFN1Y2Nlc3Mgc2VjdGlvbiByb3dzLCBpbnNlcnRpbmcgY29udmVyc2lvbi1yYXRlIGNhcmQgd2hlcmUgbmVlZGVkLlxuY29uc3QgbWFwU3VjY2Vzc1RvUm93cyA9IChcbiAgc2VjdGlvbnM6IENoZWNrbGlzdFNlY3Rpb25EYXRhW10gPSBbXSxcbiAgdGFza3M6IENoZWNrbGlzdFRhc2tbXSA9IFtdLFxuICBvbkF1dG9zYXZlPzogKFxuICAgIHRhc2tJZDogbnVtYmVyLFxuICAgIHBsYXRmb3JtSWQ6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICB2YWx1ZTogc3RyaW5nIHwgYm9vbGVhbixcbiAgICBwcm92aWRlck5hbWU/OiBzdHJpbmdcbiAgKSA9PiB2b2lkLFxuICB0b2dnbGVWYWx1ZXM6IFJlY29yZDxudW1iZXIsIGJvb2xlYW4+ID0ge30sXG4gIGFsbG93RWRpdCA9IGZhbHNlXG4pID0+IHtcbiAgY29uc3Qgc29ydGVkVGFza3MgPSBbLi4udGFza3NdLnNvcnQoKGEsIGIpID0+IChhLmRpc3BsYXlPcmRlciA/PyAwKSAtIChiLmRpc3BsYXlPcmRlciA/PyAwKSlcbiAgY29uc3QgaGFzQ29udmVyc2lvblRhc2sgPSBzb3J0ZWRUYXNrcy5zb21lKCh0YXNrKSA9PiB0YXNrLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhcImNvbnZlcnNpb25cIikpXG4gIGNvbnN0IGxpZmV0aW1lQ29udmVyc2lvblJhdGUgPSBnZXRMaWZldGltZUNvbnZlcnNpb25SYXRlRGF0YShzZWN0aW9ucylcblxuICBjb25zdCByb3dzID0gc29ydGVkVGFza3MubWFwKCh0YXNrKSA9PiB7XG4gICAgY29uc3QgaXNDb252ZXJzaW9uVGFzayA9IHRhc2submFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwiY29udmVyc2lvblwiKVxuXG4gICAgaWYgKGlzQ29udmVyc2lvblRhc2spIHtcbiAgICAgIHJldHVybi
2386BjcmVhdGVTdWNjZXNzQ29udmVyc2lvblJvdyhcbiAgICAgICAgdGFzay5uYW1lLFxuICAgICAgICBsaWZldGltZUNvbnZlcnNpb25SYXRlLnBlcmNlbnRhZ2UsXG4gICAgICAgIGxpZmV0aW1lQ29udmVyc2lvblJhdGUuY29tcGxldGVkU2VjdGlvbnMsXG4gICAgICAgIGxpZmV0aW1lQ29udmVyc2lvblJhdGUudG90YWxTZWN0aW9ucyxcbiAgICAgICAgbGlmZXRpbWVDb252ZXJzaW9uUmF0ZS50b25lQ2xhc3NOYW1lLFxuICAgICAgICBsaWZldGltZUNvbnZlcnNpb25SYXRlLmJhZGdlVGV4dFxuICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogdGFzay5uYW1lLFxuICAgICAgYWxsb3dFZGl0LFxuICAgICAgdmFsdWU6XG4gICAgICAgIHRhc2suaW5wdXRUeXBlID09PSBcIlRPR0dMRVwiID8gKFxuICAgICAgICAgIDxUb2dnbGVTd2l0Y2hcbiAgICAgICAgICAgIGNoZWNrZWQ9e3RvZ2dsZVZhbHVlc1t0YXNrLmlkXSA/PyAhIXRhc2sudmFsdWU/LmJvb2xlYW5WYWx1ZX1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXtcbiAgICAgICAgICAgICAgYWxsb3dFZGl0ID8gKGNoZWNrZWQpID0+IG9uQXV0b3NhdmU/Lih0YXNrLmlkLCB0YXNrLnBsYXRmb3JtSWQsIGNoZWNrZWQpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhbGxvd0VkaXQ9e2FsbG93RWRpdH1cbiAgICAgICAgICAvPlxuICAgICAgICApIDogKFxuICAgICAgICAgIGdldERpc3BsYXlOdW1iZXJWYWx1ZSh0YXNrLnZhbHVlPy5udW1iZXJWYWx1ZSlcbiAgICAgICAgKSxcbiAgICAgIGl0ZW1DbGFzc05hbWU6IFwic3VjY2Vzcy1tZXRyaWMtaXRlbVwiLFxuICAgICAgdmFsdWVDbGFzc05hbWU6IFwic3VjY2Vzcy1tZXRyaWMtY29udHJvbFwiLFxuICAgICAgaW5wdXRDbGFzc05hbWU6IHRhc2suaW5wdXRUeXBlID09PSBcIlRPR0dMRVwiID8gdW5kZWZpbmVkIDogXCJzdWNjZXNzLXN0YXQtYm94XCIsXG4gICAgICBvblZhbHVlQ29tbWl0OlxuICAgICAgICB0YXNrLmlucHV0VHlwZSA9PT0gXCJUT0dHTEVcIlxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiBhbGxvd0VkaXRcbiAgICAgICAgICAgID8gKHZhbHVlKSA9PiBvbkF1dG9zYXZlPy4odGFzay5pZCwgdGFzay5wbGF0Zm9ybUlkLCB2YWx1ZSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0gYXMgU2VjdGlvblJvd1xuICB9KVxuXG4gIGlmICghaGFzQ29udmVyc2lvblRhc2spIHtcbiAgICByb3dzLnB1c2goXG4gICAgICBjcmVhdGVTdWNjZXNzQ29udmVyc2lvblJvdyhcbiAgICAgICAgXCJMaWZldGltZSBDb252ZXJzaW9uIFJhdGVcIixcbiAgICAgICAgbGlmZXRpbWVDb252ZXJzaW9uUmF0ZS5wZXJjZW50YWdlLFxuICAgICAgICBsaWZldGltZUNvbnZlcnNpb25SYXRlLmNvbXBsZXRlZFNlY3Rpb25zLFxuICAgICAgICBsaWZldGltZUNvbnZlcnNpb25SYXRlLnRvdGFsU2VjdGlvbnMsXG4gICAgICAgIGxpZmV0aW1lQ29udmVyc2lvblJhdGUudG9uZUNsYXNzTmFtZSxcbiAgICAgICAgbGlmZXRpbWVDb252ZXJzaW9uUmF0ZS5iYWRnZVRleHRcbiAgICAgIClcbiAgICApXG4gIH1cblxuICByZXR1cm4gcm93c1xufVxuXG4vLyBNYXBzIGNoYXJ0IHJlc3BvbnNlIGludG8gdGhlIGxhc3QtMzAtZGF5cyBpbnRlZ3JpdHkgbGlzdC5cbmNvbnN0IG1hcENoYXJ0VG9JbnRlZ3JpdHlEYXlzID0gKFxuICBjaGFydFJlc3BvbnNlOiBDaGVja2xpc3RQYXlsb2FkW1wiY2hhcnRSZXNwb25zZVwiXSA9IFtdXG4pOiBJbnRlZ3JpdHlEYXlbXSA9PiB7XG4gIGNvbnNvbGUubG9nKFwibWFwQ2hhcnRUb0ludGVncml0eURheXMgaW5wdXQgY2hhcnRSZXNwb25zZTpcIiwgY2hhcnRSZXNwb25zZSlcblxuICBjb25zdCBtYXBwZWRJbnRlZ3JpdHlEYXlzID0gWy4uLmNoYXJ0UmVzcG9uc2VdXG4gICAgLnNvcnQoKGEsIGIpID0+IG5ldyBEYXRlKGEuZW50cnlEYXRlKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShiLmVudHJ5RGF0ZSkuZ2V0VGltZSgpKVxuICAgIC5zbGljZSgtMzApXG4gICAgLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgIGRhdGU6IGl0ZW0uZW50cnlEYXRlLFxuICAgICAgY29tcGxldGVkOiAhIWl0ZW0uY29tcGxldGVkLFxuICAgICAgY29tcGxldGVkQ291bnQ6IGl0ZW0uY29tcGxldGVkQ291bnQgPz8gMCxcbiAgICB9KSlcblxuICBjb25zb2xlLmxvZyhcIm1hcENoYXJ0VG9JbnRlZ3JpdHlEYXlzIG91dHB1dCBJbnRlZ3JpdHlEYXlbXTpcIiwgbWFwcGVkSW50ZWdyaXR5RGF5cylcblxuICByZXR1cm4gbWFwcGVkSW50ZWdyaXR5RGF5c1xufVxuXG4vLyBTaW1wbGUgdG9nZ2xlIGNvbXBvbmVudCB1c2VkIGluIGNoZWNrbGlzdCByb3dzLlxuY29uc3QgVG9nZ2xlU3dpdGNoOiBSZWFjdC5GQzx7XG4gIGNoZWNrZWQ/OiBib29sZWFuXG4gIG9uQ2hhbmdlPzogKGNoZWNrZWQ6IGJvb2xlYW4pID0+IHZvaWRcbiAgYWxsb3dFZGl0PzogYm9vbGVhblxufT4gPSAoe2NoZWNrZWQgPSBmYWxzZSwgb25DaGFuZ2UsIGFsbG93RWRpdCA9IGZhbHNlfSkgPT4ge1xuICByZXR1cm4gKFxuICAgIDxsYWJlbCAgY2xhc3NOYW1lPXtgdG9nZ2xlLXN3aXRjaCAke2FsbG93RWRpdH1gLnRyaW0oKX0+XG4gICAgICA8aW5wdXRcbiAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgY2hlY2tlZD17Y2hlY2tlZH1cbiAgICAgICAgZGlzYWJsZWQ9eyFhbGxvd0VkaXR9XG4gICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gb25DaGFuZ2U/LihlLnRhcmdldC5jaGVja2VkKX1cbiAgICAgICAgcmVhZE9ubHk9eyFvbkNoYW5nZX1cbiAgICAgIC8+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0b2dnbGUtc2xpZGVyXCI+PC9zcGFuPlxuICAgIDwvbGFiZWw+XG4gIClcbn1cblxuLy8gTWFpbiBDaGVja2xpc3QgcGFnZSBjb21wb25lbnQ6IGNvb3JkaW5hdGVzIGRhdGEgZmV0Y2gsIHN0YXRlLCBhbmQgcmVuZGVyaW5nLlxuY29uc3QgQ2hlY2tsaXN0UGFnZTogRkMgPSAoKSA9PiB7XG4gIGNvbnN0IG5hdmlnYXRlID0gdXNlTmF2aWdhdGUoKVxuICBjb25zdCB7Y3VycmVudFVzZXIsIHNldEN1cnJlbnRVc2VyLCBhdXRofSA9IHVzZUF1dGgoKVxuICBjb25zdCBhdXRob3JpdGllcyA9IGN1cnJlbnRVc2VyPy5jb21wYW5pZXM/LlswXT8uYXV0aG9yaXRpZXMgPz8gW11cbiBcbiAgY29uc3QgW3NlbGVjdGVkUmFuZ2UsIHNldFNlbGVjdGVkUmFuZ2VdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4oREFZX1NUUklORylcbiAgY29uc3QgW2ZpbHRlciwgc2V0RmlsdGVyXSA9IHVzZVN0YXRlPENhbXBhaWduRmlsdGVyVHlwZSB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtzZWxlY3RlZERhdGUsIHNldFNlbGVjdGVkRGF0ZV0gPSB1c2VTdGF0ZShuZXcgRGF0ZSgpKVxuICBjb25zdCBbaXNDdXN0b21EYXRlRmlsdGVyQWN0aXZlLCBzZXRJc0N1c3RvbURhdGVGaWx0ZXJBY3RpdmVdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtpc0RhdGVQaWNrZXJPcGVuLCBzZXRJc0RhdGVQaWNrZXJPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBkYXRlUGlja2VyUmVmID0gdXNlUmVmPGFueT4obnVsbClcblxuICBjb25zdCBbYWN0aXZpdHksIHNldEFjdGl2aXR5XSA9IHVzZVN0YXRlPEFjdGl2aXR5RGF0YT4oe1xuICAgIHBlcmNlbnRhZ2U6IDAsXG4gICAgZG9uZTogMCxcbiAgICByZW1haW5pbmc6IDAsXG4gICAgdG90YWw6IDAsXG4gICAgbWVzc2FnZTogXCJcIixcbiAgfSlcbiAgY29uc3QgW3NlbGVjdGVkQ2FtcGFpZ24sIHNldFNlbGVjdGVkQ2FtcGFpZ25dID0gdXNlU3RhdGU8UmVndWxhck9wdGlvbiB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtpc0luaXRpYWxpemluZ0NhbXBhaWduLCBzZXRJc0luaXRpYWxpemluZ0NhbXBhaWduXSA9IHVzZVN0YXRlKHRydWUpXG4gIGNvbnN0IGZpbmRQcm9zcGVjdHNPdmVydmlld1JlZiA9IHVzZVJlZjxhbnk+KG51bGwpXG4gIGNvbnN0IFtmaW5kRGF0YSwgc2V0RmluZERhdGFdID0gdXNlU3RhdGU8U2VjdGlvblJvd1tdPihbXSlcbiAgY29uc3QgW290aGVyU29jaWFsRGF0YSwgc2V0T3RoZXJTb2NpYWxEYXRhXSA9IHVzZVN0YXRlPFNlY3Rpb25Sb3dbXT4oW10pXG4gIGNvbnN0IFtyZWxhdGlvbnNoaXBEYXRhLCBzZXRSZWxhdGlvbnNoaXBEYXRhXSA9IHVzZVN0YXRlPFNlY3Rpb25Sb3dbXT4oW10pXG4gIGNvbnN0IFtzdGF5Q29ubmVjdGVkRGF0YSwgc2V0U3RheUNvbm5lY3RlZERhdGFdID0gdXNlU3RhdGU8U2VjdGlvblJvd1tdPihbXSlcbiAgY29uc3QgW3N0YXJ0Q29udmVyc2F0aW9uRGF0YSwgc2V0U3RhcnRDb252ZXJzYXRpb25EYXRhXSA9IHVzZVN0YXRlPFNlY3Rpb25Sb3dbXT4oW10pXG4gIGNvbnN0IFtjb21tdW5pdHlEYXRhLCBzZXRDb21tdW5pdHlEYXRhXSA9IHVzZVN0YXRlPFNlY3Rpb25Sb3dbXT4oW10pXG4gIGNvbnN0IFtncm93dGhEYXRhLCBzZXRHcm93dGhEYXRhXSA9IHVzZVN0YXRlPFNlY3Rpb25Sb3dbXT4oW10pXG4gIGNvbnN0IFtzZWN0aW9uTWV0YSwgc2V0U2VjdGlvbk1ldGFdID0gdXNlU3RhdGU8UmVjb3JkPHN0cmluZywgU2VjdGlvbk1ldGE+PihkZWZhdWx0U2VjdGlvbk1ldGEpXG4gIGNvbnN0IFtpbnRlZ3JpdHlEYXlzLCBzZXRJbnRlZ3JpdHlEYXlzXSA9IHVzZVN0YXRlPEludGVncml0eURheVtdPihbXSlcbiAgY29uc3QgW2ludGVncml0eUNvbXBsZXRlZERheXMsIHNldEludGVncml0eUNvbXBsZXRlZERheXNdID0gdXNlU3RhdGUoMClcbiAgY29uc3QgW3RvZ2dsZVZhbHVlcywgc2V0VG9nZ2xlVmFsdWVzXSA9IHVzZVN0YXRlPFJlY29yZDxudW1iZXIsIGJvb2xlYW4+Pih7fSlcbiAgY29uc3QgW3NlY3Rpb25zU3RhdGUsIHNldFNlY3Rpb25zU3RhdGV
2386dID0gdXNlU3RhdGU8Q2hlY2tsaXN0U2VjdGlvbkRhdGFbXT4oW10pXG4gIGNvbnN0IFtwcm92aWRlcnNTdGF0ZSwgc2V0UHJvdmlkZXJzU3RhdGVdID0gdXNlU3RhdGU8U21Qcm92aWRlcltdPihbXSlcbiAgY29uc3QgW2FsbG93T3RoZXJQbGF0Zm9ybXNFZGl0LCBzZXRBbGxvd090aGVyUGxhdGZvcm1zRWRpdF0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2ZpbmRQcm9zcGVjdHNNZXNzYWdlLCBzZXRGaW5kUHJvc3BlY3RzTWVzc2FnZV0gPVxuICAgIHVzZVN0YXRlPEZpbmRQcm9zcGVjdHNNZXNzYWdlPihudWxsKVxuXG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbc2F2ZUxvYWRpbmcsIHNldFNhdmVMb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtwZW5kaW5nQ2hlY2tsaXN0Q2hhbmdlcywgc2V0UGVuZGluZ0NoZWNrbGlzdENoYW5nZXNdID0gdXNlU3RhdGU8XG4gICAgUmVjb3JkPG51bWJlciwgQ2hlY2tsaXN0VGFza1ZhbHVlVXBkYXRlPlxuICA+KHt9KVxuXG4gIGNvbnN0IHllYXJseVByaWNlID0gWUVBUkxZX1BMQU5fUFJJQ0VcbiAgY29uc3QgbW9udGhseVByaWNlID0gTU9OVEhMWV9QTEFOX1BSSUNFXG4gIGNvbnN0IGxpdmVwbGFuID0gTElWRV9QTEFOXG5cbiAgY29uc3QgW3N1YnNjcmlwdGlvblBsYW5EZXRhaWxzLCBzZXRTdWJzY3JpcHRpb25QbGFuRGV0YWlsc10gPSB1c2VTdGF0ZTxcbiAgICBTdWJzY3JpcHRpb25QbGFuRGV0YWlsc1tdXG4gID4oW10pXG4gIGNvbnN0IFtzZWxlY3RlZFN1YnNjcmlwdGlvblBsYW4sIHNldFNlbGVjdGVkU3Vic2NyaXB0aW9uUGxhbl0gPVxuICAgIHVzZVN0YXRlPFN1YnNjcmlwdGlvblBsYW5EZXRhaWxzIHwgbnVsbD4obnVsbClcbiAgY29uc3QgW3Nob3dQbGFuTW9kYWwsIHNldFNob3dQbGFuTW9kYWxdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtzZWxlY3RlZFBsYW4sIHNldFNlbGVjdGVkUGxhbl0gPSB1c2VTdGF0ZTxudW1iZXIgfCBudWxsPihudWxsKVxuICBjb25zdCBbaXNPcGVuLCBzZXRJc09wZW5dID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtzaG93VXBsb2FkVmlkZW8sIHNldFNob3dVcGxvYWRWaWRlb10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW3BsYW4sIHNldFBsYW5dID0gdXNlU3RhdGU8bnVtYmVyIHwgdW5kZWZpbmVkPigpXG4gIGNvbnN0IFt2aWRlb0V4aXN0cywgc2V0VmlkZW9FeGlzdHNdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFt0cmlhbFBlcmlvZEV4cGlyZWQsIHNldFRyYWlsUGVyaW9kRXhwaXJlZF0gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSlcbiAgY29uc3QgW3N1YnNjcmlwdGlvblBlcmlvZEV4cGlyZWQsIHNldFN1YnNjcmlwdGlvblBlcmlvZEV4cGlyZWRdID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpXG5cbiAgY29uc3QgW3N1bW1hcnlQZXJmLCBzZXRTdW1tYXJ5UGVyZl0gPSB1c2VTdGF0ZTxQZXJmb3JtYW5jZURhdGE+KHtcbiAgICBkYXlzQ29tcGxldGVkOiAwLFxuICAgIGRheXNUb3RhbDogMCxcbiAgICBhdmdDb21wbGV0aW9uOiAwLFxuICAgIGNvbnNlY3V0aXZlRGF5czogMCxcbiAgfSlcbiAgY29uc3QgW3N1bW1hcnlHcm91cHMsIHNldFN1bW1hcnlHcm91cHNdID0gdXNlU3RhdGU8U25hcHNob3RHcm91cFtdPihbXSlcblxuICAvLyDwn5GJIEZldGNoIHJ1bm5pbmcgY2FtcGFpZ24gb24gY29tcG9uZW50IG1vdW50IHRvIGluaXRpYWxpemUgd2l0aCBjb3JyZWN0IGNhbXBhaWduIHVwZnJvbnRcbiAgYXN5bmMgZnVuY3Rpb24gaW5pdGlhbGl6ZVJ1bm5pbmdDYW1wYWlnbigpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXhpb3MuZ2V0KFxuICAgICAgICBHRVRfQ0FNUEFJR05TX0JZX0NPTVBBTllfVVNFUl9BTkRfRkJfQUNDKENVUkVFTlRfQ09NUEFOWV9OQU1FKVxuICAgICAgKTtcblxuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhOiBhbnlbXSA9IHJlc3VsdC5kYXRhO1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXNwb25zZURhdGEpICYmIHJlc3BvbnNlRGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIEZpbmQgcnVubmluZyBjYW1wYWlnblxuICAgICAgICBjb25zdCBydW5uaW5nQ2FtcGFpZ24gPSByZXNwb25zZURhdGEuZmluZChcbiAgICAgICAgICAoY2FtcGFpZ24pID0+XG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KGNhbXBhaWduLmNhbXBhaWduU3RhdHVzKSAmJlxuICAgICAgICAgICAgY2FtcGFpZ24uY2FtcGFpZ25TdGF0dXMuc29tZShcbiAgICAgICAgICAgICAgKHN0YXR1czogYW55KSA9PiBzdGF0dXMubmFtZSA9PT0gXCJSdW5uaW5nXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBTZXQgcnVubmluZyBjYW1wYWlnbiBpZiBleGlzdHMsIG90aGVyd2lzZSBkZWZhdWx0IHRvIFwiQWxsXCJcbiAgICAgICAgaWYgKHJ1bm5pbmdDYW1wYWlnbikge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwi4pyFIFJ1bm5pbmcgQ2FtcGFpZ24gaW5pdGlhbGl6ZWQgb24gbW91bnQ6XCIsIHJ1bm5pbmdDYW1wYWlnbi5uYW1lKTtcbiAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHtcbiAgICAgICAgICAgIHZhbHVlOiBydW5uaW5nQ2FtcGFpZ24udXVpZCxcbiAgICAgICAgICAgIGxhYmVsOiBydW5uaW5nQ2FtcGFpZ24ubmFtZSxcbiAgICAgICAgICAgIGFjY2VwdGFuY2VSYXRlOiBydW5uaW5nQ2FtcGFpZ24uYWNjZXB0YW5jZVJhdGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBzZXRTZWxlY3RlZENhbXBhaWduKHNlbGVjdGVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIuKEue+4jyBObyBydW5uaW5nIGNhbXBhaWduIGZvdW5kIC0gd2lsbCB1c2UgQWxsXCIpO1xuICAgICAgICAgIHNldFNlbGVjdGVkQ2FtcGFpZ24oeyB2YWx1ZTogXCItMVwiLCBsYWJlbDogXCJBbGxcIiB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgcnVubmluZyBjYW1wYWlnbiBvbiBtb3VudDpcIiwgZXJyb3IpO1xuICAgICAgLy8gRGVmYXVsdCB0byBcIkFsbFwiIGlmIGZldGNoIGZhaWxzXG4gICAgICBzZXRTZWxlY3RlZENhbXBhaWduKHsgdmFsdWU6IFwiLTFcIiwgbGFiZWw6IFwiQWxsXCIgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldElzSW5pdGlhbGl6aW5nQ2FtcGFpZ24oZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZXMgcmFuZ2UgZHJvcGRvd24gY2hhbmdlcyBhbmQgcmVzZXRzIGN1c3RvbSBkYXRlIHNlbGVjdGlvbi5cbiAgY29uc3QgaGFuZGxlUmFuZ2VDaGFuZ2UgPSAocmFuZ2U6IHN0cmluZyB8IG51bGwpID0+IHtcbiAgICBzZXRJc0N1c3RvbURhdGVGaWx0ZXJBY3RpdmUoZmFsc2UpXG4gICAgc2V0U2VsZWN0ZWRSYW5nZShyYW5nZSA/PyBEQVlfU1RSSU5HKVxuICAgIHNldFNlbGVjdGVkRGF0ZShnZXRVc2VyVGltZVpvbmVCYXNlZEN1cnJlbnREYXRl
2386KCkpXG4gIH1cblxuICAvLyBIYW5kbGVzIGFkdmFuY2VkIGZpbHRlciBjaGFuZ2VzIGZyb20gRGF0ZVJhbmdlU2VsZWN0b3IuXG4gIGNvbnN0IGhhbmRsZUZpbHRlckNoYW5nZSA9IChuZXh0RmlsdGVyOiBDYW1wYWlnbkZpbHRlclR5cGUgfCBudWxsKSA9PiB7XG4gICAgaWYgKG5leHRGaWx0ZXI/LmZyZXF1ZW5jeVR5cGUpIHtcbiAgICAgIHNldElzQ3VzdG9tRGF0ZUZpbHRlckFjdGl2ZShmYWxzZSlcbiAgICAgIHNldFNlbGVjdGVkRGF0ZShnZXRVc2VyVGltZVpvbmVCYXNlZEN1cnJlbnREYXRlKCkpXG4gICAgfVxuXG4gICAgc2V0RmlsdGVyKG5leHRGaWx0ZXIpXG4gIH1cblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghYXV0aD8uYXBpX3Rva2VuKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBpbml0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRVc2VyQnlUb2tlbihhdXRoLmFwaV90b2tlbiA/PyBcIlwiKVxuICAgICAgY29uc3QgdXNlciA9IHJlc3BvbnNlLmRhdGFcblxuICAgICAgc2V0Q3VycmVudFVzZXIodXNlcilcblxuICAgICAgY29uc3QgaXNUcmlhbEV4cGlyZWQgPSB1c2VyPy50cmlhbFBlcmlvZENvbXBsZXRlZFxuICAgICAgY29uc3QgaXNTdWJzY3JwdGlvbkNvbXBsZXRlZCA9IHVzZXI/LnN1YnNjcmlwdGlvblBlcmlvZENvbXBsZXRlZFxuICAgICAgY29uc3QgaXNTdWJzY3JpcHRpb25QZXJpb2QgPSB1c2VyPy5zdWJzY3JpcHRpb25QZXJpb2RcblxuICAgICAgaWYgKChpc1RyaWFsRXhwaXJlZCB8fCBpc1N1YnNjcnB0aW9uQ29tcGxldGVkKSAmJiAhaXNTdWJzY3JpcHRpb25QZXJpb2QpIHtcbiAgICAgICAgc2V0U2hvd1BsYW5Nb2RhbCh0cnVlKVxuICAgICAgfVxuXG4gICAgICBzZXRUcmFpbFBlcmlvZEV4cGlyZWQoISFpc1RyaWFsRXhwaXJlZClcbiAgICAgIHNldFN1YnNjcmlwdGlvblBlcmlvZEV4cGlyZWQoISFpc1N1YnNjcnB0aW9uQ29tcGxldGVkKVxuICAgIH1cblxuICAgIGluaXQoKVxuICB9LCBbYXV0aD8uYXBpX3Rva2VuLCBzZXRDdXJyZW50VXNlcl0pXG5cbiAgLy8g8J+RiSBJbml0aWFsaXplIHJ1bm5pbmcgY2FtcGFpZ24gb24gZmlyc3QgbW91bnQgKGJlZm9yZSBhbnkgZGF0YSBmZXRjaClcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpbml0aWFsaXplUnVubmluZ0NhbXBhaWduKCk7XG4gIH0sIFtdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGdldFN1YnNjcmlwdGlvblBsYW5EZXRhaWxzKClcbiAgfSwgW10pXG5cbiAgY29uc3QgaGFuZGxlUGxhblNlbGVjdCA9IGFzeW5jIChwbGFuOiBudW1iZXIpID0+IHtcbiAgICBpZiAocGxhbiA9PT0gbW9udGhseVByaWNlKSB7XG4gICAgICBzZXRJc09wZW4odHJ1ZSlcbiAgICAgIHNldFNob3dQbGFuTW9kYWwoZmFsc2UpXG5cbiAgICAgIGNvbnN0IHRhcmdldGVkUHJpY2UgPSBcIjE5N1wiXG4gICAgICBzZXRQbGFuKDE5NylcbiAgICAgIGdldFBsYW5EZXRhaWxzQnlTZWxsUHJpY2Uoc3Vic2NyaXB0aW9uUGxhbkRldGFpbHMsIHRhcmdldGVkUHJpY2UpXG4gICAgfSBlbHNlIGlmIChwbGFuID09PSB5ZWFybHlQcmljZSkge1xuICAgICAgY29uc3QgaGFzVmlkZW8gPSBhd2FpdCBjaGVja1VzZXJWaWRlb0V4aXN0KClcbiAgICAgIGlmIChoYXNWaWRlbykge1xuICAgICAgICBzZXRWaWRlb0V4aXN0cyhoYXNWaWRlbylcbiAgICAgICAgc2V0U2hvd1BsYW5Nb2RhbChmYWxzZSlcbiAgICAgICAgc2V0UGxhbig5NylcbiAgICAgICAgY29uc3QgdGFyZ2V0ZWRQcmljZSA9IFwiOTdcIlxuICAgICAgICBnZXRQbGFuRGV0YWlsc0J5U2VsbFByaWNlKHN1YnNjcmlwdGlvblBsYW5EZXRhaWxzLCB0YXJnZXRlZFByaWNlKVxuICAgICAgICBzZXRJc09wZW4odHJ1ZSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBzZXRTZWxlY3RlZFBsYW4ocGxhbilcbiAgICAgIHNldFNob3dVcGxvYWRWaWRlbyh0cnVlKVxuICAgICAgc2V0U2hvd1BsYW5Nb2RhbChmYWxzZSlcbiAgICB9IGVsc2UgaWYgKHBsYW4gPT09IGxpdmVwbGFuKSB7XG4gICAgICBzZXRJc09wZW4odHJ1ZSlcbiAgICAgIHNldFNob3dQbGFuTW9kYWwoZmFsc2UpXG5cbiAgICAgIGNvbnN0IHRhcmdldGVkUHJpY2UgPSBcIjFcIlxuICAgICAgc2V0UGxhbigxKVxuICAgICAgZ2V0UGxhbkRldGFpbHNCeVNlbGxQcmljZShzdWJzY3JpcHRpb25QbGFuRGV0YWlscywgdGFyZ2V0ZWRQcmljZSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBoYW5kbGVTaG93U3RlcHNQb3BVcCA9ICh2YWx1ZTogYm9vbGVhbikgPT4ge1xuICAgIHNldFNob3dQbGFuTW9kYWwodmFsdWUpXG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBnZXRTdWJzY3JpcHRpb25QbGFuRGV0YWlscygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcy5nZXQoXG4gICAgICAgIEdFVF9BTExfU1VCU0NSSVBUSU9OUExBTlMoQ1VSRUVOVF9DT01QQU5ZX05BTUUpXG4gICAgICApXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgc2V0U3Vic2NyaXB0aW9uUGxhbkRldGFpbHMocmVzcG9uc2UuZGF0YSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgLi4uXCIsIGUpXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY2hlY2tVc2VyVmlkZW9FeGlzdCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIWN1cnJlbnRVc2VyPy5pZCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3MuZ2V0KFxuICAgICAgICBgJHtDSEVDS19VU0VSX1ZJREVPX0VYSVNUKENVUkVFTlRfQ09NUEFOWV9OQU1FKX0/dXNlcklkPSR7Y3VycmVudFVzZXIuaWR9YFxuICAgICAgKVxuXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEuZGF0YVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciAuLi5cIiwgZSlcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGNvbnN0IGdldFBsYW5EZXRhaWxzQnlTZWxsUHJpY2UgPSAoXG4gICAgcGxhbnM6IFN1YnNjcmlwdGlvblBsYW5EZXRhaWxzW10sXG4gICAgdGFyZ2V0UHJpY2U6IHN0cmluZ1xuICApID0+IHtcbiAgICBjb25zdCBwcmljZUFzTnVtYmVyID0gcGFyc2VGbG9hdCh0YXJnZXRQcmljZSlcbiAgICBjb25zdCBtYXRjaGVkUGxhbiA9IHBsYW5zLmZpbmQoKHBsYW4pID0+IHBsYW4uc2VsbFByaWNlID09PSBwcmljZUFzTnVtYmVyKVxuICAgIGlmIChtYXRjaGVkUGxhbikge1xuICAgICAgc2V0U2VsZWN0ZWRTdWJzY3JpcHRpb25QbGFuKG1hdGNoZWRQbGFuKVxuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZXMgZGF0ZSBwaWNrZXIgc2VsZWN0aW9uIGFuZCBzd2l0Y2hlcyB0byBjdXN0b20gZGF0ZSBtb2RlLlxuICBjb25zdCBoYW5kbGVDaGVja2xpc3REYXRlQ2hhbmdlID0gKGRhdGU6IERhdGUgfCBudWxsKSA9PiB7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBzZXRTZWxlY3RlZERhdGUoZGF0ZSlcbiAgICBzZXRJc0N1c3RvbURhdGVGaWx0ZXJBY3RpdmUodHJ1ZSlcbiAgICBzZXRTZWxlY3RlZFJhbmdlKG51bGwpXG4gICAgc2V0RmlsdGVyKChjdXJyZW50KSA9PiAoe1xuICAgICAgLi4uKGN1cnJlbnQgPz8ge1xuICAgICAgICBzdGF0dXNOYW1lOiBbXSxcbiAgICAgICAgbmFtZXM6IFtdLFxuICAgICAgfSksXG4gICAgICBzdGFydERhdGU6IG51bGwsXG4gICAgICBlbmREYXRlOiBudWxsLFxuICAgICAgZnJlcXVlbmN5VHlwZTogdW5kZWZpbmVkLFxuICAgIH0pKVxuICAgIHNldElzRGF0ZVBpY2tlck9wZW4oZmFsc2UpXG4gIH1cblxuICAvLyBOb3JtYWxpem
2386VzIGF1dG9zYXZlIG51bWVyaWMgaW5wdXQgaW50byBhIG51bGxhYmxlIG51bWJlci5cbiAgY29uc3Qgbm9ybWFsaXplTnVtZXJpY0F1dG9zYXZlVmFsdWUgPSAodmFsdWU6IHN0cmluZyB8IGJvb2xlYW4pID0+IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGNvbnN0IHRyaW1tZWRWYWx1ZSA9IHZhbHVlLnRyaW0oKVxuICAgIGlmICh0cmltbWVkVmFsdWUgPT09IFwiXCIpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkVmFsdWUgPSBOdW1iZXIodHJpbW1lZFZhbHVlKVxuICAgIHJldHVybiBOdW1iZXIuaXNOYU4ocGFyc2VkVmFsdWUpID8gbnVsbCA6IHBhcnNlZFZhbHVlXG4gIH1cblxuICAvLyBWYWxpZGF0ZXMgRmluZCBQcm9zcGVjdHMgYXV0b3NhdmUgd2l0aCBPdGhlciBQbGF0Zm9ybXMgb3ZlcmFsbCB0b3RhbHMuXG4gIGNvbnN0IHZhbGlkYXRlRmluZFByb3NwZWN0c0F1dG9zYXZlID0gYXN5bmMgKFxuICAgIHRhc2tJZDogbnVtYmVyLFxuICAgIHBsYXRmb3JtSWQ6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICB2YWx1ZTogc3RyaW5nIHwgYm9vbGVhbixcbiAgICBwcm92aWRlck5hbWU/OiBzdHJpbmdcbiAgKSA9PiB7XG4gICAgY29uc3QgZmluZFByb3NwZWN0c1Rhc2tzID1cbiAgICAgIHNlY3Rpb25zU3RhdGUuZmluZCgoc2VjdGlvbikgPT4gc2VjdGlvbi5uYW1lID09PSBcIkZpbmQgUHJvc3BlY3RzXCIpPy50YXNrcyA/PyBbXVxuICAgIGNvbnN0IHNlbnRUYXNrSWQgPSBmaW5kUHJvc3BlY3RzVGFza3MuZmluZChcbiAgICAgICh0YXNrKSA9PiB0YXNrLm5hbWUgPT09IFwiRnJpZW5kIFJlcXVlc3QgJiBNZXNzYWdlIFNlbnRcIlxuICAgICk/LmlkXG4gICAgY29uc3QgYWNjZXB0ZWRUYXNrSWQgPSBmaW5kUHJvc3BlY3RzVGFza3MuZmluZCgodGFzaykgPT4gdGFzay5uYW1lID09PSBcIkFjY2VwdGVkXCIpPy5pZFxuXG4gICAgaWYgKHRhc2tJZCAhPT0gc2VudFRhc2tJZCAmJiB0YXNrSWQgIT09IGFjY2VwdGVkVGFza0lkKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRQcm92aWRlck5hbWUgPSBwcm92aWRlck5hbWU/LnRyaW0oKS50b0xvd2VyQ2FzZSgpXG4gICAgY29uc3QgbWF0Y2hlZFByb3ZpZGVyID1cbiAgICAgIHByb3ZpZGVyc1N0YXRlLmZpbmQoKHByb3ZpZGVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHNhbWVQbGF0Zm9ybUlkID1cbiAgICAgICAgICBwbGF0Zm9ybUlkICE9PSB1bmRlZmluZWQgJiYgZ2V0UHJvdmlkZXJQbGF0Zm9ybUlkKHByb3ZpZGVyKSA9PT0gcGxhdGZvcm1JZFxuICAgICAgICBjb25zdCBzYW1lUHJvdmlkZXJOYW1lID1cbiAgICAgICAgICBub3JtYWxpemVkUHJvdmlkZXJOYW1lICE9IG51bGwgJiZcbiAgICAgICAgICBub3JtYWxpemVkUHJvdmlkZXJOYW1lLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICBwcm92aWRlcj8ubmFtZT8udHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09IG5vcm1hbGl6ZWRQcm92aWRlck5hbWVcblxuICAgICAgICByZXR1cm4gc2FtZVBsYXRmb3JtSWQgfHwgc2FtZVByb3ZpZGVyTmFtZVxuICAgICAgfSkgPz9cbiAgICAgIChub3JtYWxpemVkUHJvdmlkZXJOYW1lPy5pbmNsdWRlcyhcIm90aGVyXCIpXG4gICAgICAgID8gcmVzb2x2ZVNvY2lhbFByb3ZpZGVycyhwcm92aWRlcnNTdGF0ZSkub3RoZXJQcm92aWRlclxuICAgICAgICA6IHJlc29sdmVTb2NpYWxQcm92aWRlcnMocHJvdmlkZXJzU3RhdGUpLmZhY2Vib29rUHJvdmlkZXIpID8/XG4gICAgICByZXNvbHZlU29jaWFsUHJvdmlkZXJzKHByb3ZpZGVyc1N0YXRlKS5vdGhlclByb3ZpZGVyID8/XG4gICAgICByZXNvbHZlU29jaWFsUHJvdmlkZXJzKHByb3ZpZGVyc1N0YXRlKS5mYWNlYm9va1Byb3ZpZGVyXG5cbiAgICBjb25zdCBpc090aGVyUGxhdGZvcm1zUHJvdmlkZXIgPVxuICAgICAgbWF0Y2hlZFByb3ZpZGVyPy5uYW1lPy50cmltKCkudG9Mb3dlckNhc2UoKSA9PT0gXCJvdGhlciBwbGF0Zm9ybXNcIlxuXG4gICAgaWYgKCFpc090aGVyUGxhdGZvcm1zUHJvdmlkZXIpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZFZhbHVlID0gbm9ybWFsaXplTnVtZXJpY0F1dG9zYXZlVmFsdWUodmFsdWUpXG4gICAgY29uc3QgcGVuZGluZ1NlbnRWYWx1ZSA9XG4gICAgICBzZW50VGFza0lkICE9IG51bGwgPyBwZW5kaW5nQ2hlY2tsaXN0Q2hhbmdlc1tzZW50VGFza0lkXT8ubnVtYmVyVmFsdWUgOiB1bmRlZmluZWRcbiAgICBjb25zdCBwZW5kaW5nQWNjZXB0ZWRWYWx1ZSA9XG4gICAgICBhY2NlcHRlZFRhc2tJZCAhPSBudWxsID8gcGVuZGluZ0NoZWNrbGlzdENoYW5nZXNbYWNjZXB0ZWRUYXNrSWRdPy5udW1iZXJWYWx1ZSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IGN1cnJlbnRTZW50VmFsdWUgPVxuICAgICAgcGVuZGluZ1NlbnRWYWx1ZSAhPT0gdW5kZWZpbmVkID8gcGVuZGluZ1NlbnRWYWx1ZSA6IG1hdGNoZWRQcm92aWRlcj8uc2VudCA/PyBudWxsXG4gICAgY29uc3QgY3VycmVudEFjY2VwdGVkVmFsdWUgPVxuICAgICAgcGVuZGluZ0FjY2VwdGVkVmFsdWUgIT09IHVuZGVmaW5lZCA/IHBlbmRpbmdBY2NlcHRlZFZhbHVlIDogbWF0Y2hlZFByb3ZpZGVyPy5hY2NlcHRlZCA/PyBudWxsXG5cbiAgICBjb25zdCBuZXh0U2VudCA9IHRhc2tJZCA9PT0gc2VudFRhc2tJZCA/IG5vcm1hbGl6ZWRWYWx1ZSA6IGN1cnJlbnRTZW50VmFsdWVcbiAgICBjb25zdCBuZXh0QWNjZXB0ZWQgPSB0YXNrSWQgPT09IGFjY2VwdGVkVGFza0lkID8gbm9ybWFsaXplZFZhbHVlIDogY3VycmVudEFjY2VwdGVkVmFsdWVcbiAgICBjb25zdCBiYXNlT3ZlcmFsbFNlbnQgPVxuICAgICAgdHlwZW9mIG1hdGNoZWRQcm92aWRlcj8ub3ZlcmFsbFNlbnQgPT09IFwibnVtYmVyXCIgPyBtYXRjaGVkUHJvdmlkZXIub3ZlcmFsbFNlbnQgOiAwXG4gICAgY29uc3QgYmFzZU92ZXJhbGxBY2NlcHRlZCA9XG4gICAgICB0eXBlb2YgbWF0Y2hlZFByb3ZpZGVyPy5vdmVyYWxsQWNjZXB0ZWQgPT09IFwibnVtYmVyXCIgPyBtYXRjaGVkUHJvdmlkZXIub3ZlcmFsbEFjY2VwdGVkIDogMFxuXG4gICAgLy8gb3ZlcmFsbFNlbnQvb3ZlcmFsbEFjY2VwdGVkIGFscmVhZHkgaW5jbHVkZSB0b2RheSdzIHNhdmVkIHZhbHVlcyxcbiAgICAvLyBzbyBzdWJ0cmFjdCB0b2RheSdzIG9yaWdpbmFsIHRvIGF2b2lkIGRvdWJsZS1jb3VudGluZyB0aGUgbmV3IGlucHV0LlxuICAgIGNvbnN0IG9yaWdpbmFsRGF5U2VudCA9IHR5cGVvZiBtYXRjaGVkUHJvdmlkZXI/LnNlbnQgPT09IFwibnVtYmVyXCIgPyBtYXRjaGVkUHJvdmlkZXIuc2VudCA6IDBcbiAgICBjb25zdCBvcmlnaW5hbERheUFjY2VwdGVkID1cbiAgICAgIHR5cGVvZiBtYXRjaGVkUHJvdmlkZXI/LmFjY2VwdGVkID09PSBcIm51bWJlclwiID8gbWF0Y2hlZFByb3ZpZGVyLmFjY2VwdGVkIDogMFxuXG4gICAgY29uc3QgdG90YWxTZW50ID0gKGJhc2VPdmVyYWxsU2VudCAtIG9yaWdpbmFsRGF5U2VudCkgKyAobmV4dFNlbnQgPz8gMClcbiAgICBjb25zdCB0b3RhbEFjY2VwdGVkID0gKGJhc2VPdmVyYWxsQWNjZXB0ZWQgLSBvcmlnaW5hbERheUFjY2VwdGVkKSArIChuZXh0QWNjZXB0ZWQgPz8gMClcblxuICAgIGlmICh0b3RhbEFjY2VwdGVkID4gdG90YWxTZW50KSB7XG4gICAgICBzZXRGaW5kUHJvc3BlY3RzTWVzc2FnZSh7XG4gICAgICAgI
2386HR5cGU6IFwiZXJyb3JcIixcbiAgICAgICAgdGV4dDogYE92ZXJhbGwgQWNjZXB0ZWQgKCR7YmFzZU92ZXJhbGxBY2NlcHRlZH0pIHNob3VsZCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gT3ZlcmFsbCBTZW50ICgke2Jhc2VPdmVyYWxsU2VudH0pLmAsXG4gICAgICB9KVxuXG4gICAgICBjb25zb2xlLmxvZyhcIkJsb2NrZWQgRmluZCBQcm9zcGVjdHMgYXV0b3NhdmUgYmVjYXVzZSBvdmVyYWxsIHRvdGFscyBhcmUgaW52YWxpZFwiLCB7XG4gICAgICAgIHRhc2tJZCxcbiAgICAgICAgcGxhdGZvcm1JZCxcbiAgICAgICAgbmV4dFNlbnQsXG4gICAgICAgIG5leHRBY2NlcHRlZCxcbiAgICAgICAgYmFzZU92ZXJhbGxTZW50LFxuICAgICAgICBiYXNlT3ZlcmFsbEFjY2VwdGVkLFxuICAgICAgICB0b3RhbFNlbnQsXG4gICAgICAgIHRvdGFsQWNjZXB0ZWQsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIEJ1aWxkcyBhbGwgVUkgc3RhdGUgZnJvbSB0aGUgY2hlY2tsaXN0IEFQSSBwYXlsb2FkLlxuICBjb25zdCBidWlsZENoZWNrbGlzdFN0YXRlRnJvbVBheWxvYWQgPSAocGF5bG9hZDogQ2hlY2tsaXN0UGF5bG9hZCkgPT4ge1xuICAgICAgY29uc3QgdG90YWwgPSBwYXlsb2FkLnRvdGFsVGFzayA/PyAwXG4gICAgICBjb25zdCBkb25lID0gcGF5bG9hZC50YXNrQ29tcGxldGVkID8/IDBcbiAgICAgIGNvbnN0IHJlbWFpbmluZyA9IHBheWxvYWQubGVmdFRhc2sgPz8gTWF0aC5tYXgoMCwgdG90YWwgLSBkb25lKVxuICAgICAgY29uc3QgcGVyY2VudGFnZSA9IHRvdGFsID4gMCA/IE1hdGgucm91bmQoKGRvbmUgLyB0b3RhbCkgKiAxMDApIDogMFxuXG4gICAgICBzZXRBY3Rpdml0eSh7XG4gICAgICAgIHBlcmNlbnRhZ2UsXG4gICAgICAgIGRvbmUsXG4gICAgICAgIHJlbWFpbmluZyxcbiAgICAgICAgdG90YWwsXG4gICAgICAgIG1lc3NhZ2U6IHBlcmNlbnRhZ2UgPj0gODAgPyBcIkNydXNoaW5nIGl0IVwiIDogXCJLZWVwIGdvaW5nXCIsXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBzZWN0aW9ucyA9IHBheWxvYWQuc2VjdGlvbnMgPz8gW11cbiAgICAgIGNvbnNvbGUubG9nKFwic2VjdGlvbnM6XCIsIHNlY3Rpb25zKVxuICAgICAgc2V0VG9nZ2xlVmFsdWVzKGdldEluaXRpYWxUb2dnbGVWYWx1ZXMoc2VjdGlvbnMpKVxuICAgICAgc2V0U2VjdGlvbnNTdGF0ZShzZWN0aW9ucylcbiAgICAgIGNvbnN0IHNlY3Rpb25zQnlOYW1lID0gc2VjdGlvbnMucmVkdWNlPFJlY29yZDxzdHJpbmcsIENoZWNrbGlzdFNlY3Rpb25EYXRhPj4oKGFjYywgc2VjdGlvbikgPT4ge1xuICAgICAgICBhY2Nbc2VjdGlvbi5uYW1lXSA9IHNlY3Rpb25cbiAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgfSwge30pXG5cbiAgICAgIHNldFNlY3Rpb25NZXRhKHtcbiAgICAgICAgXCJGaW5kIFByb3NwZWN0c1wiOiBnZXRTZWN0aW9uTWV0YShzZWN0aW9uc0J5TmFtZVtcIkZpbmQgUHJvc3BlY3RzXCJdLCBcIkZpbmQgUHJvc3BlY3RzXCIpLFxuICAgICAgICBcIlN0YXJ0IENvbnZlcnNhdGlvbnNcIjogZ2V0U2VjdGlvbk1ldGEoXG4gICAgICAgICAgc2VjdGlvbnNCeU5hbWVbXCJTdGFydCBDb252ZXJzYXRpb25zXCJdLFxuICAgICAgICAgIFwiU3RhcnQgQ29udmVyc2F0aW9uc1wiXG4gICAgICAgICksXG4gICAgICAgIFwiQnVpbGQgUmVsYXRpb25zaGlwc1wiOiBnZXRTZWN0aW9uTWV0YShcbiAgICAgICAgICBzZWN0aW9uc0J5TmFtZVtcIkJ1aWxkIFJlbGF0aW9uc2hpcHNcIl0sXG4gICAgICAgICAgXCJCdWlsZCBSZWxhdGlvbnNoaXBzXCJcbiAgICAgICAgKSxcbiAgICAgICAgXCJTdGF5IENvbm5lY3RlZFwiOiBnZXRTZWN0aW9uTWV0YShzZWN0aW9uc0J5TmFtZVtcIlN0YXkgQ29ubmVjdGVkXCJdLCBcIlN0YXkgQ29ubmVjdGVkXCIpLFxuICAgICAgICBDb21tdW5pdHk6IGdldFNlY3Rpb25NZXRhKHNlY3Rpb25zQnlOYW1lW1wiQ29tbXVuaXR5XCJdLCBcIkNvbW11bml0eVwiKSxcbiAgICAgICAgU3VjY2VzczogZ2V0U2VjdGlvbk1ldGEoc2VjdGlvbnNCeU5hbWVbXCJTdWNjZXNzXCJdLCBcIlN1Y2Nlc3NcIiksXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBzbVByb3ZpZGVycyA9IHBheWxvYWQuc21Qcm92aWRlcnMgPz8gW11cbiAgICAgIGNvbnN0IGFsbG93RWRpdCA9ICEhcGF5bG9hZC5hbGxvd0VkaXRcbiAgICAgIGNvbnNvbGUubG9nKFwiY2hlY2tsaXN0IGFsbG93RWRpdDpcIiwgYWxsb3dFZGl0KVxuICAgICAgY29uc29sZS5sb2coXCJzbVByb3ZpZGVyczpcIiwgc21Qcm92aWRlcnMpXG4gICAgICBzZXRBbGxvd090aGVyUGxhdGZvcm1zRWRpdChhbGxvd0VkaXQpXG4gICAgICBzZXRQcm92aWRlcnNTdGF0ZShzbVByb3ZpZGVycylcbiAgICAgIGNvbnN0IHtmYWNlYm9va1Byb3ZpZGVyLCBvdGhlclByb3ZpZGVyfSA9IHJlc29sdmVTb2NpYWxQcm92aWRlcnMoc21Qcm92aWRlcnMpXG4gICAgICBjb25zdCBmaW5kUHJvc3BlY3RzVGFza3MgPSBzZWN0aW9uc0J5TmFtZVtcIkZpbmQgUHJvc3BlY3RzXCJdPy50YXNrcyA/PyBbXVxuICAgICAgY29uc3Qgc2VudFRhc2sgPSBmaW5kUHJvc3BlY3RzVGFza3MuZmluZCgodGFzaykgPT4gdGFzay5uYW1lID09PSBcIkZyaWVuZCBSZXF1ZXN0ICYgTWVzc2FnZSBTZW50XCIpXG4gICAgICBjb25zdCBhY2NlcHRlZFRhc2sgPSBmaW5kUHJvc3BlY3RzVGFza3MuZmluZCgodGFzaykgPT4gdGFzay5uYW1lID09PSBcIkFjY2VwdGVkXCIpXG4gICAgICBjb25zdCBzZW50VGFza0lkID0gc2VudFRhc2s/LmlkXG4gICAgICBjb25zdCBhY2NlcHRlZFRhc2tJZCA9IGFjY2VwdGVkVGFzaz8uaWRcbiAgICAgIGNvbnNvbGUubG9nKFwiZmFjZWJvb2tQcm92aWRlcjpcIiwgZmFjZWJvb2tQcm92aWRlcilcbiAgICAgIGNvbnNvbGUubG9nKFwib3RoZXJQcm92aWRlcjpcIiwgb3RoZXJQcm92aWRlcilcblxuICAgICAgbG9nTGlmZXRpbWVBY2NlcHRhbmNlUmF0ZShcIkZpbmQgUHJvc3BlY3RzXCIsIGZhY2Vib29rUHJvdmlkZXI/Lm5hbWUgfHwgXCJGYWNlYm9va1wiLCBmYWNlYm9va1Byb3ZpZGVyKVxuICAgICAgbG9nTGlmZXRpbWVBY2NlcHRhbmNlUmF0ZShcbiAgICAgICAgXCJGaW5kIFByb3NwZWN0c1wiLFxuICAgICAgICBvdGhlclByb3ZpZGVyPy5uYW1lIHx8IFwiT3RoZXIgUGxhdGZvcm1zXCIsXG4gICAgICAgIG90aGVyUHJvdmlkZXJcbiAgICAgIClcblxuICAgICAgc2V0RmluZERhdGEoXG4gICAgICAgIG1hcFByb3ZpZGVyVG9Sb3dzKGZhY2Vib29rUHJvdmlkZXIsIGhhbmRsZUNoZWNrbGlzdEF1dG9zYXZlLCB7XG4gICAgICAgICAgXG4gICAgICAgICAgc2VudFRhc2tJZCxcbiAgICAgICAgICBhY2NlcHRlZFRhc2tJZCxcbiAgICAgICAgICBvbk1lc3NhZ2U6IHNldEZpbmRQcm9zcGVjdHNNZXNzYWdlLF
2386xuICAgICAgICB9KVxuICAgICAgICBcbiAgICAgIClcbiAgICAgIHNldE90aGVyU29jaWFsRGF0YShcbiAgICAgICAgbWFwUHJvdmlkZXJUb1Jvd3Mob3RoZXJQcm92aWRlciwgaGFuZGxlQ2hlY2tsaXN0QXV0b3NhdmUsIHtcbiAgICAgICAgICBlbXB0eU1pc3NpbmdWYWx1ZXM6IHRydWUsXG4gICAgICAgICAgaXNFZGl0YWJsZTogYWxsb3dFZGl0LFxuICAgICAgICAgIHNlbnRUYXNrSWQsXG4gICAgICAgICAgYWNjZXB0ZWRUYXNrSWQsXG4gICAgICAgICAgc2VudFZhbHVlT3ZlcnJpZGU6IHNlbnRUYXNrPy52YWx1ZT8ubnVtYmVyVmFsdWUgPz8gbnVsbCxcbiAgICAgICAgICBhY2NlcHRlZFZhbHVlT3ZlcnJpZGU6IGFjY2VwdGVkVGFzaz8udmFsdWU/Lm51bWJlclZhbHVlID8/IG51bGwsXG4gICAgICAgICAgdHJlYXRaZXJvQXNFbXB0eTogdHJ1ZSxcbiAgICAgICAgICBvbk1lc3NhZ2U6IHNldEZpbmRQcm9zcGVjdHNNZXNzYWdlLFxuICAgICAgICB9KVxuICAgICAgIClcblxuICAgICAgc2V0U3RhcnRDb252ZXJzYXRpb25EYXRhKFxuICAgICAgICBtYXBUYXNrc1RvUm93cyhcbiAgICAgICAgICBzZWN0aW9uc0J5TmFtZVtcIlN0YXJ0IENvbnZlcnNhdGlvbnNcIl0/LnRhc2tzID8/IFtdLFxuICAgICAgICAgIGhhbmRsZUNoZWNrbGlzdEF1dG9zYXZlLFxuICAgICAgICAgIGdldEluaXRpYWxUb2dnbGVWYWx1ZXMoc2VjdGlvbnMpLFxuICAgICAgICAgIGFsbG93RWRpdFxuICAgICAgICApXG4gICAgICApXG4gICAgICBzZXRSZWxhdGlvbnNoaXBEYXRhKFxuICAgICAgICBtYXBUYXNrc1RvUm93cyhcbiAgICAgICAgICBzZWN0aW9uc0J5TmFtZVtcIkJ1aWxkIFJlbGF0aW9uc2hpcHNcIl0/LnRhc2tzID8/IFtdLFxuICAgICAgICAgIGhhbmRsZUNoZWNrbGlzdEF1dG9zYXZlLFxuICAgICAgICAgIGdldEluaXRpYWxUb2dnbGVWYWx1ZXMoc2VjdGlvbnMpLFxuICAgICAgICAgIGFsbG93RWRpdFxuICAgICAgICApXG4gICAgICApXG4gICAgICBzZXRTdGF5Q29ubmVjdGVkRGF0YShcbiAgICAgICAgbWFwVGFza3NUb1Jvd3MoXG4gICAgICAgICAgc2VjdGlvbnNCeU5hbWVbXCJTdGF5IENvbm5lY3RlZFwiXT8udGFza3MgPz8gW10sXG4gICAgICAgICAgaGFuZGxlQ2hlY2tsaXN0QXV0b3NhdmUsXG4gICAgICAgICAgZ2V0SW5pdGlhbFRvZ2dsZVZhbHVlcyhzZWN0aW9ucyksXG4gICAgICAgICAgYWxsb3dFZGl0XG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIHNldENvbW11bml0eURhdGEoXG4gICAgICAgIG1hcFRhc2tzVG9Sb3dzKFxuICAgICAgICAgIHNlY3Rpb25zQnlOYW1lW1wiQ29tbXVuaXR5XCJdPy50YXNrcyA/PyBbXSxcbiAgICAgICAgICBoYW5kbGVDaGVja2xpc3RBdXRvc2F2ZSxcbiAgICAgICAgICBnZXRJbml0aWFsVG9nZ2xlVmFsdWVzKHNlY3Rpb25zKSxcbiAgICAgICAgICBhbGxvd0VkaXRcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgc2V0R3Jvd3RoRGF0YShcbiAgICAgICAgbWFwU3VjY2Vzc1RvUm93cyhcbiAgICAgICAgICBzZWN0aW9ucyxcbiAgICAgICAgICBzZWN0aW9uc0J5TmFtZVtcIlN1Y2Nlc3NcIl0/LnRhc2tzID8/IFtdLFxuICAgICAgICAgIGhhbmRsZUNoZWNrbGlzdEF1dG9zYXZlLFxuICAgICAgICAgIGdldEluaXRpYWxUb2dnbGVWYWx1ZXMoc2VjdGlvbnMpLFxuICAgICAgICAgIGFsbG93RWRpdFxuICAgICAgICApXG4gICAgICApXG5cbiAgICAgIGNvbnN0IGludGVncml0eUNoYXJ0RGF5cyA9IG1hcENoYXJ0VG9JbnRlZ3JpdHlEYXlzKHBheWxvYWQuY2hhcnRSZXNwb25zZSA/PyBbXSlcbiAgICAgIGNvbnNvbGUubG9nKFwiSW50ZWdyaXR5RGF5IHN0YXRlIGNhbmRpZGF0ZTpcIiwgaW50ZWdyaXR5Q2hhcnREYXlzKVxuICAgICAgY29uc29sZS5sb2coXCJwYXlsb2FkLmNoYXJ0VGFza0NvbXBsZXRlZENvdW50RGF5OlwiLCBwYXlsb2FkLmNoYXJ0VGFza0NvbXBsZXRlZENvdW50RGF5KVxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIFwiY29tcGxldGVkIGRheXMgZnJvbSBjaGFydFJlc3BvbnNlOlwiLFxuICAgICAgICBpbnRlZ3JpdHlDaGFydERheXMuZmlsdGVyKChkYXkpID0+IGRheS5jb21wbGV0ZWQpLmxlbmd0aFxuICAgICAgKVxuICAgICAgY29uc3QgY29tcGxldGVkRGF5cyA9XG4gICAgICAgIHBheWxvYWQuY2hhcnRUYXNrQ29tcGxldGVkQ291bnREYXkgPz8gaW50ZWdyaXR5Q2hhcnREYXlzLmZpbHRlcigoZGF5KSA9PiBkYXkuY29tcGxldGVkKS5sZW5ndGhcbiAgICAgIGNvbnNvbGUubG9nKFwiaW50ZWdyaXR5Q29tcGxldGVkRGF5cyBmb3JjZWQgdmFsdWU6XCIsIGNvbXBsZXRlZERheXMpXG5cbiAgICAgIHNldEludGVncml0eURheXMoaW50ZWdyaXR5Q2hhcnREYXlzKVxuICAgICAgc2V0SW50ZWdyaXR5Q29tcGxldGVkRGF5cyhjb21wbGV0ZWREYXlzKVxuXG4gICAgICBzZXRTdW1tYXJ5UGVyZih7XG4gICAgICAgIGRheXNDb21wbGV0ZWQ6IGRvbmUsXG4gICAgICAgIGRheXNUb3RhbDogdG90YWwsXG4gICAgICAgIGF2Z0NvbXBsZXRpb246IHBlcmNlbnRhZ2UsXG4gICAgICAgIGNvbnNlY3V0aXZlRGF5czogY29tcGxldGVkRGF5cyxcbiAgICAgIH0pXG4gICAgICBjb25zdCBidWlsZFJlbGF0aW9uc2hpcFRhc2tzID0gc2VjdGlvbnNCeU5hbWVbXCJCdWlsZCBSZWxhdGlvbnNoaXBzXCJdPy50YXNrcyA/PyBbXVxuICAgICAgY29uc3Qgc3VjY2Vzc1Rhc2tzID0gWy4uLihzZWN0aW9uc0J5TmFtZVtcIlN1Y2Nlc3NcIl0/LnRhc2tzID8/IFtdKV0uc29ydChcbiAgICAgICAgKGEsIGIpID0+IChhLmRpc3BsYXlPcmRlciA/PyAwKSAtIChiLmRpc3BsYXlPcmRlciA/PyAwKVxuICAgICAgKVxuICAgICAgY29uc3QgcHJvc3BlY3RzUmVzcG9uZGVkVGFzayA9IGJ1aWxkUmVsYXRpb25zaGlwVGFza3MuZmluZCgodGFzaykgPT5cbiAgICAgICAgdGFzay5uYW1lPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwicHJvc3BlY3RzIHJlc3BvbmRlZFwiKVxuICAgICAgKVxuICAgICAgY29uc3QgbGlmZXRpbWVDb252ZXJzaW9uUmF0ZUNhcmQgPSBnZXRMaWZldGltZUNvbnZlcnNpb25SYXRlQ2FyZChzZWN0aW9ucylcblxuICAgICAgbG9nTGlmZXRpbWVBY2NlcHRhbmNlUmF0ZShcbiAgICAgICAgXCJTdWNjZXNzIFNuYXBzaG90XCIsXG4gICAgICAgIGZhY2Vib29rUHJvdmlkZXI/Lm5hbWUgfHwgXCJGYWNlYm9va1wiLFxuICAgICAgICBmYWNlYm9va1Byb3ZpZGVyXG4gICAgICApXG4gICAgICBsb2dMaWZldGltZUFjY2VwdGFuY2VSYXRl
2386KFxuICAgICAgICBcIlN1Y2Nlc3MgU25hcHNob3RcIixcbiAgICAgICAgb3RoZXJQcm92aWRlcj8ubmFtZSB8fCBcIk90aGVyIFBsYXRmb3Jtc1wiLFxuICAgICAgICBvdGhlclByb3ZpZGVyXG4gICAgICApXG5cbiAgICAgIHNldFN1bW1hcnlHcm91cHMoW1xuICAgICAgICB7XG4gICAgICAgICAgdGl0bGU6IGZhY2Vib29rUHJvdmlkZXI/Lm5hbWUgfHwgXCJGYWNlYm9va1wiLFxuICAgICAgICAgIHRhZ0NsYXNzOiBcImZhY2Vib29rXCIsXG4gICAgICAgICAgaXRlbXM6IG1hcFByb3ZpZGVyVG9Sb3dzKGZhY2Vib29rUHJvdmlkZXIpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGl0bGU6IG90aGVyUHJvdmlkZXI/Lm5hbWUgfHwgXCJPdGhlciBQbGF0Zm9ybXNcIixcbiAgICAgICAgICB0YWdDbGFzczogXCJzb2NpYWxcIixcbiAgICAgICAgICBpdGVtczogbWFwUHJvdmlkZXJUb1Jvd3Mob3RoZXJQcm92aWRlciwgdW5kZWZpbmVkLCB7ZW1wdHlNaXNzaW5nVmFsdWVzOiB0cnVlfSksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0aXRsZTogXCJTdWNjZXNzXCIsXG4gICAgICAgICAgdGFnQ2xhc3M6IFwic3VjY2Vzc1wiLFxuICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICAuLi4ocHJvc3BlY3RzUmVzcG9uZGVkVGFza1xuICAgICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBwcm9zcGVjdHNSZXNwb25kZWRUYXNrLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGdldERpc3BsYXlOdW1iZXJWYWx1ZShwcm9zcGVjdHNSZXNwb25kZWRUYXNrLnZhbHVlPy5udW1iZXJWYWx1ZSksXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgOiBbXSksXG4gICAgICAgICAgICAuLi5zdWNjZXNzVGFza3MubWFwKCh0YXNrKSA9PiAoe1xuICAgICAgICAgICAgICBsYWJlbDogdGFzay5uYW1lLFxuICAgICAgICAgICAgICB2YWx1ZTpcbiAgICAgICAgICAgICAgICB0YXNrLmlucHV0VHlwZSA9PT0gXCJUT0dHTEVcIlxuICAgICAgICAgICAgICAgICAgPyB0YXNrLnZhbHVlPy5ib29sZWFuVmFsdWVcbiAgICAgICAgICAgICAgICAgICAgPyBcIlllc1wiXG4gICAgICAgICAgICAgICAgICAgIDogXCJOb1wiXG4gICAgICAgICAgICAgICAgICA6IHRhc2submFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwiY29udmVyc2lvblwiKVxuICAgICAgICAgICAgICAgICAgICA/IGAke3Rhc2sudmFsdWU/Lm51bWJlclZhbHVlID8/IDB9JWBcbiAgICAgICAgICAgICAgICAgICAgOiBnZXREaXNwbGF5TnVtYmVyVmFsdWUodGFzay52YWx1ZT8ubnVtYmVyVmFsdWUpLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgbGlmZXRpbWVDb252ZXJzaW9uUmF0ZUNhcmQsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0pXG4gIH1cblxuICAvLyBGZXRjaGVzIGNoZWNrbGlzdCBkYXRhIGJhc2VkIG9uIGN1cnJlbnQgZGF0ZSBmaWx0ZXIgc2V0dGluZ3MuXG4gIGNvbnN0IGZldGNoQ2hlY2tsaXN0RGF0YSA9IGFzeW5jIChvcHRpb25zPzoge2FmdGVyU2F2ZT86IGJvb2xlYW47IHNpbGVudD86IGJvb2xlYW59KSA9PiB7XG4gICAgaWYgKCFvcHRpb25zPy5zaWxlbnQpIHtcbiAgICAgIHNldExvYWRpbmcodHJ1ZSlcbiAgICAgIHNldEVycm9yKG51bGwpXG4gICAgICAvLyBlbmFibGVTcGxhc2hTY3JlZW4oKVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb21wYW55TmFtZSA9IENVUkVFTlRfQ09NUEFOWV9OQU1FIHx8IFwic2l4c2lnbWFmdW5uZWxzXCJcbiAgICAgIGNvbnN0IGJyb3dzZXJUaW1lem9uZSA9IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZSB8fCBcIkFzaWEvS29sa2F0YVwiXG4gICAgICBjb25zdCBoYXNBZHZhbmNlZERhdGVGaWx0ZXIgPSAhIWZpbHRlcj8uc3RhcnREYXRlICYmICEhZmlsdGVyPy5lbmREYXRlXG4gICAgICBjb25zdCBmcmVxdWVuY3lUeXBlID0gaXNWYWxpZFJhbmdlKHNlbGVjdGVkUmFuZ2UpXG4gICAgICAgID8gc2VsZWN0ZWRSYW5nZVxuICAgICAgICA6IGlzVmFsaWRSYW5nZShmaWx0ZXI/LmZyZXF1ZW5jeVR5cGUgPz8gbnVsbClcbiAgICAgICAgICA/IChmaWx0ZXI/LmZyZXF1ZW5jeVR5cGUgPz8gREFZX1NUUklORylcbiAgICAgICAgICA6IERBWV9TVFJJTkdcbiAgICAgIGNvbnN0IGNhbXBhaWduVXVpZCA9IHNlbGVjdGVkQ2FtcGFpZ24/LnZhbHVlIHx8IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHJlcXVlc3RQYXlsb2FkID0gaGFzQWR2YW5jZWREYXRlRmlsdGVyXG4gICAgICAgID8ge1xuICAgICAgICAgICAgYnJvd3NlclRpbWV6b25lLFxuICAgICAgICAgICAgZnJvbURhdGU6IGZpbHRlcj8uc3RhcnREYXRlLFxuICAgICAgICAgICAgdG9EYXRlOiBmaWx0ZXI/LmVuZERhdGUsXG4gICAgICAgICAgICAuLi4oY2FtcGFpZ25VdWlkICYmIHsgY2FtcGFpZ25VdWlkIH0pLFxuICAgICAgICAgIH1cbiAgICAgICAgOiBpc0N1c3RvbURhdGVGaWx0ZXJBY3RpdmVcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgYnJvd3NlclRpbWV6b25lLFxuICAgICAgICAgICAgICBmcm9tRGF0ZTogZm9ybWF0Q2hlY2tsaXN0RmlsdGVyRGF0ZShzZWxlY3RlZERhdGUpLFxuICAgICAgICAgICAgICB0b0RhdGU6IGZvcm1hdENoZWNrbGlzdEZpbHRlckRhdGUoc2VsZWN0ZWREYXRlKSxcbiAgICAgICAgICAgICAgLi4uKGNhbXBhaWduVXVpZCAmJiB7IGNhbXBhaWduVXVpZCB9KSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgYnJvd3NlclRpbWV6b25lLFxuICAgICAgICAgICAgICBmcmVxdWVuY3lUeXBlLFxuICAgICAgICAgICAgICAuLi4oY2FtcGFpZ25VdWlkICYmIHsgY2FtcGFpZ25VdWlkIH0pLFxuICAgICAgICAgICAgfVxuICAgICAgY29uc29sZS5sb2coXCJHRVRfQ0hFQ0tMSVNUIHJlcXVlc3Q6XCIsIHtcbiAgICAgICAgdXJsOiBHRVRfQ0hFQ0tMSVNUKGNvbXBhbnlOYW1lKSxcbiAgICAgICAgcGF5bG9hZDogcmVxdWVzdFBheWxvYWQsXG4gICAgICB9KVxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcy5wb3N0PHtzdWNjZXNzOiBib29sZWFuOyBkYXRhPzogQ2hlY2tsaXN0UGF5bG9hZDsgbWVzc2FnZT86IHN0cmluZ30+KFxuICAgICAgICBHRVRfQ0hFQ0tMSVNUKGNvbXBhbnlOYW1lKSxcbiAgICAgICAgcmVxdW
2386VzdFBheWxvYWRcbiAgICAgIClcbiAgICAgIGNvbnNvbGUubG9nKFwiR0VUX0NIRUNLTElTVCByYXcgcmVzcG9uc2U6XCIsIHJlc3BvbnNlPy5kYXRhKVxuXG4gICAgICBjb25zdCBwYXlsb2FkID0gcmVzcG9uc2U/LmRhdGE/LmRhdGFcbiAgICAgIGNvbnNvbGUubG9nKFwiR0VUX0NIRUNLTElTVCBwYXlsb2FkOlwiLCBwYXlsb2FkKVxuXG4gICAgICBpZiAob3B0aW9ucz8uYWZ0ZXJTYXZlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiRnJlc2ggY2hlY2tsaXN0IG91dHB1dCBhZnRlciBzYXZlOlwiLCBwYXlsb2FkKVxuICAgICAgfVxuXG4gICAgICBpZiAoIXJlc3BvbnNlPy5kYXRhPy5zdWNjZXNzIHx8ICFwYXlsb2FkKSB7XG4gICAgICAgIHNldEVycm9yKHJlc3BvbnNlPy5kYXRhPy5tZXNzYWdlIHx8IFwiRmFpbGVkIHRvIGxvYWQgY2hlY2tsaXN0IGRhdGEuXCIpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBidWlsZENoZWNrbGlzdFN0YXRlRnJvbVBheWxvYWQocGF5bG9hZClcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgc2V0RXJyb3IoZXJyPy5tZXNzYWdlIHx8IFwiRmFpbGVkIHRvIGxvYWQgY2hlY2tsaXN0IGRhdGEuXCIpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICghb3B0aW9ucz8uc2lsZW50KSB7XG4gICAgICAgIC8vIHNldExvYWRpbmcoZmFsc2UpXG4gICAgICAgIGRpc2FibGVTcGxhc2hTY3JlZW4oKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIOKchSBIYW5kbGVzIGNhbXBhaWduIHNlbGVjdGlvbiBhbmQgY2FsbHMgR0VUX0NIRUNLTElTVCB3aXRoIGR5bmFtaWMgdmFsdWVzXG4gIGNvbnN0IGhhbmRsZUNhbXBhaWduQ2hhbmdlID0gYXN5bmMgKG9wdGlvbjogUmVndWxhck9wdGlvbiB8IG51bGwpID0+IHtcbiAgICAgZW5hYmxlU3BsYXNoU2NyZWVuKCk7XG4gICAgaWYgKCFvcHRpb24pIHJldHVybjtcbiAgICBcbiAgICAvLyBSZXNldCBkYXRlIGZpbHRlcnMgdG8gXCJUb2RheVwiIHdoZW4gY2FtcGFpZ24gY2hhbmdlc1xuICAgIGNvbnN0IHRvZGF5RGF0ZSA9IGdldFVzZXJUaW1lWm9uZUJhc2VkQ3VycmVudERhdGUoKTtcbiAgICBzZXRTZWxlY3RlZENhbXBhaWduKG9wdGlvbik7XG4gICAgc2V0U2VsZWN0ZWRSYW5nZShEQVlfU1RSSU5HKTsgLy8gU2VsZWN0IFwiVG9kYXlcIiBpbiBjYWxlbmRhclxuICAgIHNldFNlbGVjdGVkRGF0ZSh0b2RheURhdGUpOyAvLyBTZXQgZGF0ZSB0byB0b2RheVxuICAgIHNldElzQ3VzdG9tRGF0ZUZpbHRlckFjdGl2ZShmYWxzZSk7IC8vIENsZWFyIGN1c3RvbSBkYXRlIGZpbHRlclxuICAgIHNldEZpbHRlcihudWxsKTsgLy8gQ2xlYXIgYWR2YW5jZWQgZGF0ZSBmaWx0ZXJzXG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbXBhbnlOYW1lID0gQ1VSRUVOVF9DT01QQU5ZX05BTUUgfHwgXCJzaXhzaWdtYWZ1bm5lbHNcIlxuICAgICAgY29uc3QgYnJvd3NlclRpbWV6b25lID0gSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lIHx8IFwiQXNpYS9Lb2xrYXRhXCJcblxuICAgICAgY29uc3QgcmVxdWVzdFBheWxvYWQgPSB7XG4gICAgICAgIGJyb3dzZXJUaW1lem9uZSxcbiAgICAgICAgZnJlcXVlbmN5VHlwZTogREFZX1NUUklORywgLy8gVXNlIERBWV9TVFJJTkcgZm9yIHRvZGF5J3MgZGF0YVxuICAgICAgICBjYW1wYWlnblV1aWQ6IG9wdGlvbi52YWx1ZSwgLy8gVGhpcyB3aWxsIGJlIFwiLTFcIiBmb3IgXCJBbGxcIiBvcHRpb25cbiAgICAgIH07XG5cbiAgICAgIGNvbnNvbGUubG9nKFwiR0VUX0NIRUNLTElTVCByZXF1ZXN0IHdpdGggY2FtcGFpZ246XCIsIHtcbiAgICAgICAgdXJsOiBHRVRfQ0hFQ0tMSVNUKGNvbXBhbnlOYW1lKSxcbiAgICAgICAgcGF5bG9hZDogcmVxdWVzdFBheWxvYWQsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcy5wb3N0KFxuICAgICAgICBHRVRfQ0hFQ0tMSVNUKGNvbXBhbnlOYW1lKSxcbiAgICAgICAgcmVxdWVzdFBheWxvYWRcbiAgICAgICk7XG5cbiAgICAgIGNvbnNvbGUubG9nKFwiR0VUX0NIRUNLTElTVCByZXNwb25zZSBhZnRlciBjYW1wYWlnbiBjaGFuZ2U6XCIsIHJlc3BvbnNlPy5kYXRhKTtcblxuICAgICAgaWYgKHJlc3BvbnNlPy5kYXRhPy5zdWNjZXNzKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiQ2hlY2tsaXN0IGRhdGEgbG9hZGVkIHN1Y2Nlc3NmdWxseSB3aXRoIHNlbGVjdGVkIGNhbXBhaWduIGZvciB0b2RheVwiKTtcbiAgICAgICAgYnVpbGRDaGVja2xpc3RTdGF0ZUZyb21QYXlsb2FkKHJlc3BvbnNlPy5kYXRhPy5kYXRhKTtcbiAgICAgICAgIGRpc2FibGVTcGxhc2hTY3JlZW4oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gbG9hZCBjaGVja2xpc3Q6XCIsIHJlc3BvbnNlPy5kYXRhPy5tZXNzYWdlKTtcbiAgICAgICAgXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBjYWxsaW5nIEdFVF9DSEVDS0xJU1QgQVBJIG9uIGNhbXBhaWduIGNoYW5nZTpcIiwgZXJyb3IpO1xuICAgICAgZGlzYWJsZVNwbGFzaFNjcmVlbigpO1xuICAgIH1cbiAgfTtcblxuICAvLyBEZXRlcm1pbmVzIHdoaWNoIGRhdGUgc2hvdWxkIGJlIHVzZWQgZm9yIHNhdmUvYXV0b3NhdmUgcGF5bG9hZHMuXG4gIGNvbnN0IHJlc29sdmVDaGVja2xpc3RFbnRyeURhdGUgPSAoKSA9PiB7XG4gICAgY29uc3QgaGFzQWR2YW5jZWREYXRlRmlsdGVyID0gISFmaWx0ZXI/LnN0YXJ0RGF0ZSAmJiAhIWZpbHRlcj8uZW5kRGF0ZVxuICAgIC8vIGlmIChoYXNBZHZhbmNlZERhdGVGaWx0ZXIgfHwgaXNDdXN0b21EYXRlRmlsdGVyQWN0aXZlKSB7XG4gICAgLy8gICByZXR1cm4gZm9ybWF0Q2hlY2tsaXN0RW50cnlEYXRlKHNlbGVjdGVkRGF0ZSlcbiAgICAvLyB9XG5cbiBpZiAoaGFzQWR2YW5jZWREYXRlRmlsdGVyKSB7XG4gICAgICBjb25zdCBhZHZhbmNlZEZpbHRlckRhdGUgPSBuZXcgRGF0ZShmaWx0ZXIuc3RhcnREYXRlIGFzIHN0cmluZylcbiAgICAgIGlmICghTnVtYmVyLmlzTmFOKGFkdmFuY2VkRmlsdGVyRGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgICAgI
2386HJldHVybiBmb3JtYXRDaGVja2xpc3RGaWx0ZXJEYXRlKGFkdmFuY2VkRmlsdGVyRGF0ZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNDdXN0b21EYXRlRmlsdGVyQWN0aXZlKSB7XG4gICAgICByZXR1cm4gZm9ybWF0Q2hlY2tsaXN0RW50cnlEYXRlKHNlbGVjdGVkRGF0ZSlcbiAgICB9XG5cbiAgICByZXR1cm4gZm9ybWF0Q2hlY2tsaXN0RW50cnlEYXRlKGdldFVzZXJUaW1lWm9uZUJhc2VkQ3VycmVudERhdGUoKSlcbiAgfVxuXG4gIC8vIEF1dG9zYXZlcyBhIHNpbmdsZSB0YXNrIHZhbHVlIGFuZCByZWZyZXNoZXMgZGF0YSB0byBrZWVwIFVJIGluIHN5bmMuXG4gIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUNoZWNrbGlzdEF1dG9zYXZlKFxuICAgIHRhc2tJZDogbnVtYmVyLFxuICAgIHBsYXRmb3JtSWQ6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICB2YWx1ZTogc3RyaW5nIHwgYm9vbGVhbixcbiAgICBwcm92aWRlck5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgY29uc3QgaXNWYWxpZEF1dG9zYXZlID0gYXdhaXQgdmFsaWRhdGVGaW5kUHJvc3BlY3RzQXV0b3NhdmUoXG4gICAgICB0YXNrSWQsXG4gICAgICBwbGF0Zm9ybUlkLFxuICAgICAgdmFsdWUsXG4gICAgICBwcm92aWRlck5hbWVcbiAgICApXG4gICAgaWYgKCFpc1ZhbGlkQXV0b3NhdmUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBzZXRUb2dnbGVWYWx1ZXMoKGN1cnJlbnQpID0+ICh7XG4gICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgIFt0YXNrSWRdOiB2YWx1ZSxcbiAgICAgIH0pKVxuICAgIH1cblxuICAgIGNvbnN0IHRhc2tWYWx1ZVVwZGF0ZSA9IGJ1aWxkVGFza1ZhbHVlVXBkYXRlKHRhc2tJZCwgdmFsdWUpXG4gICAgY29uc3QgZmluZFByb3NwZWN0c1Rhc2tzID1cbiAgICAgIHNlY3Rpb25zU3RhdGUuZmluZCgoc2VjdGlvbikgPT4gc2VjdGlvbi5uYW1lID09PSBcIkZpbmQgUHJvc3BlY3RzXCIpPy50YXNrcyA/PyBbXVxuICAgIGNvbnN0IHNlbnRUYXNrSWQgPSBmaW5kUHJvc3BlY3RzVGFza3MuZmluZChcbiAgICAgICh0YXNrKSA9PiB0YXNrLm5hbWUgPT09IFwiRnJpZW5kIFJlcXVlc3QgJiBNZXNzYWdlIFNlbnRcIlxuICAgICk/LmlkXG4gICAgY29uc3QgYWNjZXB0ZWRUYXNrSWQgPSBmaW5kUHJvc3BlY3RzVGFza3MuZmluZCgodGFzaykgPT4gdGFzay5uYW1lID09PSBcIkFjY2VwdGVkXCIpPy5pZFxuICAgIGNvbnN0IG5vcm1hbGl6ZWRQcm92aWRlck5hbWUgPSBwcm92aWRlck5hbWU/LnRyaW0oKS50b0xvd2VyQ2FzZSgpXG5cbiAgICBpZiAoXG4gICAgICBub3JtYWxpemVkUHJvdmlkZXJOYW1lICYmXG4gICAgICAodGFza0lkID09PSBzZW50VGFza0lkIHx8IHRhc2tJZCA9PT0gYWNjZXB0ZWRUYXNrSWQpICYmXG4gICAgICB0eXBlb2YgdGFza1ZhbHVlVXBkYXRlLm51bWJlclZhbHVlICE9PSBcInVuZGVmaW5lZFwiXG4gICAgKSB7XG4gICAgICBzZXRQcm92aWRlcnNTdGF0ZSgoY3VycmVudCkgPT5cbiAgICAgICAgY3VycmVudC5tYXAoKHByb3ZpZGVyKSA9PiB7XG4gICAgICAgICAgaWYgKHByb3ZpZGVyPy5uYW1lPy50cmltKCkudG9Mb3dlckNhc2UoKSAhPT0gbm9ybWFsaXplZFByb3ZpZGVyTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnByb3ZpZGVyLFxuICAgICAgICAgICAgc2VudDogdGFza0lkID09PSBzZW50VGFza0lkID8gdGFza1ZhbHVlVXBkYXRlLm51bWJlclZhbHVlID8/IG51bGwgOiBwcm92aWRlci5zZW50LFxuICAgICAgICAgICAgYWNjZXB0ZWQ6XG4gICAgICAgICAgICAgIHRhc2tJZCA9PT0gYWNjZXB0ZWRUYXNrSWQgPyB0YXNrVmFsdWVVcGRhdGUubnVtYmVyVmFsdWUgPz8gbnVsbCA6IHByb3ZpZGVyLmFjY2VwdGVkLFxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCBjb21wYW55TmFtZSA9IENVUkVFTlRfQ09NUEFOWV9OQU1FIHx8IFwic2l4c2lnbWFmdW5uZWxzXCJcbiAgICBjb25zdCBwYXlsb2FkOiBDaGVja2xpc3RTYXZlUGF5bG9hZCA9IHtcbiAgICAgIGVudHJ5RGF0ZTogcmVzb2x2ZUNoZWNrbGlzdEVudHJ5RGF0ZSgpLFxuICAgICAgdGltZXpvbmU6IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZSB8fCBcIkFzaWEvS29sa2F0YVwiLFxuICAgICAgdmFsdWVzOiBbdGFza1ZhbHVlVXBkYXRlXSxcbiAgICB9XG5cbiAgICBzZXRQZW5kaW5nQ2hlY2tsaXN0Q2hhbmdlcygoY3VycmVudCkgPT4gKHtcbiAgICAgIC4uLmN1cnJlbnQsXG4gICAgICBbdGFza0lkXTogdGFza1ZhbHVlVXBkYXRlLFxuICAgIH0pKVxuXG4gICAgY29uc29sZS5sb2coXCJDSEVDS0xJU1RfQVVUT1NBVkUgdHJpZ2dlcjpcIiwge1xuICAgICAgdGFza0lkLFxuICAgICAgcGxhdGZvcm1JZCxcbiAgICAgIHZhbHVlOiB0YXNrVmFsdWVVcGRhdGUsXG4gICAgfSlcblxuICAgIGNvbnNvbGUubG9nKFwiQ0hFQ0tMSVNUX0FVVE9TQVZFIHJlcXVlc3Q6XCIsIHtcbiAgICAgIHVybDogUE9TVF9TQVZFX1RBU0tfVkFMVUUoY29tcGFueU5hbWUpLFxuICAgICAgcGF5bG9hZCxcbiAgICB9KVxuXG4gICAgY29uc3QgaXNPdGhlclBsYXRmb3Jtc0F1dG9zYXZlID1cbiAgICAgIG5vcm1hbGl6ZWRQcm92aWRlck5hbWU/LmluY2x1ZGVzKFwib3RoZXJcIikgJiZcbiAgICAgICh0YXNrSWQgPT09IHNlbnRUYXNrSWQgfHwgdGFza0lkID09PSBhY2NlcHRlZFRhc2tJZClcblxuICAgIGlmIChpc090aGVyUGxhdGZvcm1zQXV0b3NhdmUpIHtcbiAgICAgIGVuYWJsZVNwbGFzaFNjcmVlbigpXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLnBvc3Q8e3N1Y2Nlc3M/OiBib29sZWFuOyBtZXNzYWdlPzogc3RyaW5nfT4oXG4gICAgICAgIFBPU1RfU0FWRV9UQVNLX1ZBTFVFKGNvbXBhbnlOYW1lKSxcbiAgICAgICAgcGF5bG9hZFxuICAgICAgKVxuICAgICAgY29uc29sZS5sb2coXCJDSEVDS0xJU1RfQVVUT1NBVkUgcmVzcG9uc2U6XCIsIHJlc3BvbnNlPy5kYXRhKVxuICAgICAgYXdhaXQgZmV0Y2hDaGVja2xpc3REYXRhKHthZnRlclNhdmU6IHRydWUsIHNpbGVudDogdHJ1ZX0pXG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiQ0
2386hFQ0tMSVNUX0FVVE9TQVZFIGVycm9yOlwiLCBlcnI/LnJlc3BvbnNlPy5kYXRhIHx8IGVycj8ubWVzc2FnZSB8fCBlcnIpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChpc090aGVyUGxhdGZvcm1zQXV0b3NhdmUpIHtcbiAgICAgICAgZGlzYWJsZVNwbGFzaFNjcmVlbigpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUmVzZXQgZmlsdGVycyBvbiB1c2VyIGNoYW5nZSAobmV3IGxvZ2luL2NvbnRleHQpLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHNldFNlbGVjdGVkUmFuZ2UoREFZX1NUUklORylcbiAgICBzZXRGaWx0ZXIobnVsbClcbiAgICBzZXRJc0N1c3RvbURhdGVGaWx0ZXJBY3RpdmUoZmFsc2UpXG4gICAgd2luZG93LnNjcm9sbFRvKDAsIDApXG4gIH0sIFtjdXJyZW50VXNlcl0pXG5cbiAgLy8gQXV0by1jbGVhciB0cmFuc2llbnQgRmluZCBQcm9zcGVjdHMgdmFsaWRhdGlvbiBtZXNzYWdlcy5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWZpbmRQcm9zcGVjdHNNZXNzYWdlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB0aW1lb3V0SWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBzZXRGaW5kUHJvc3BlY3RzTWVzc2FnZShudWxsKVxuICAgIH0sIDUwMDApXG5cbiAgICByZXR1cm4gKCkgPT4gd2luZG93LmNsZWFyVGltZW91dCh0aW1lb3V0SWQpXG4gIH0sIFtmaW5kUHJvc3BlY3RzTWVzc2FnZV0pXG5cbiAgLy8gTG9hZCBjaGVja2xpc3QgZGF0YSB3aGVuIGRlcGVuZGVuY2llcyBjaGFuZ2UuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8g8J+RiSBXYWl0IHVudGlsIHJ1bm5pbmcgY2FtcGFpZ24gaXMgaW5pdGlhbGl6ZWQgYmVmb3JlIGZldGNoaW5nIGNoZWNrbGlzdFxuICAgIGlmIChpc0luaXRpYWxpemluZ0NhbXBhaWduKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIuKPsyBXYWl0aW5nIGZvciBydW5uaW5nIGNhbXBhaWduIGluaXRpYWxpemF0aW9uLi4uXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICBjb25zb2xlLmxvZyhcIuKchSBDYW1wYWlnbiBpbml0aWFsaXplZCwgbm93IGZldGNoaW5nIGNoZWNrbGlzdCB3aXRoIGNhbXBhaWduOlwiLCBzZWxlY3RlZENhbXBhaWduKTtcbiAgICBmZXRjaENoZWNrbGlzdERhdGEoKVxuICB9LCBbY3VycmVudFVzZXIsIHNlbGVjdGVkUmFuZ2UsIGZpbHRlciwgc2VsZWN0ZWREYXRlLCBpc0N1c3RvbURhdGVGaWx0ZXJBY3RpdmUsIHNlbGVjdGVkQ2FtcGFpZ24sIGlzSW5pdGlhbGl6aW5nQ2FtcGFpZ25dKVxuXG4gIC8vIERlcml2ZSBhbGwgc2VjdGlvbiByb3cgZGF0YSB3aGVuZXZlciByYXcgc3RhdGUgY2hhbmdlcy5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXNlY3Rpb25zU3RhdGUubGVuZ3RoICYmICFwcm92aWRlcnNTdGF0ZS5sZW5ndGgpIHtcbiAgICAgIHJldHVyblxuICAgI
2386H1cblxuICAgIGNvbnN0IHNlY3Rpb25zQnlOYW1lID0gc2VjdGlvbnNTdGF0ZS5yZWR1Y2U8UmVjb3JkPHN0cmluZywgQ2hlY2tsaXN0U2VjdGlvbkRhdGE+PigoYWNjLCBzZWN0aW9uKSA9PiB7XG4gICAgICBhY2Nbc2VjdGlvbi5uYW1lXSA9IHNlY3Rpb25cbiAgICAgIHJldHVybiBhY2NcbiAgICB9LCB7fSlcbiAgICBjb25zdCB7ZmFjZWJvb2tQcm92aWRlciwgb3RoZXJQcm92aWRlcn0gPSByZXNvbHZlU29jaWFsUHJvdmlkZXJzKHByb3ZpZGVyc1N0YXRlKVxuICAgIGNvbnN0IGZpbmRQcm9zcGVjdHNUYXNrcyA9IHNlY3Rpb25zQnlOYW1lW1wiRmluZCBQcm9zcGVjdHNcIl0/LnRhc2tzID8/IFtdXG4gICAgY29uc3Qgc2VudFRhc2sgPSBmaW5kUHJvc3BlY3RzVGFza3MuZmluZCgodGFzaykgPT4gdGFzay5uYW1lID09PSBcIkZyaWVuZCBSZXF1ZXN0ICYgTWVzc2FnZSBTZW50XCIpXG4gICAgY29uc3QgYWNjZXB0ZWRUYXNrID0gZmluZFByb3NwZWN0c1Rhc2tzLmZpbmQoKHRhc2spID0+IHRhc2submFtZSA9PT0gXCJBY2NlcHRlZFwiKVxuICAgIGNvbnN0IHNlbnRUYXNrSWQgPSBzZW50VGFzaz8uaWRcbiAgICBjb25zdCBhY2NlcHRlZFRhc2tJZCA9IGFjY2VwdGVkVGFzaz8uaWRcbiAgICBjb25zdCBidWlsZFJlbGF0aW9uc2hpcFRhc2tzID0gc2VjdGlvbnNCeU5hbWVbXCJCdWlsZCBSZWxhdGlvbnNoaXBzXCJdPy50YXNrcyA/PyBbXVxuICAgIGNvbnN0IHN1Y2Nlc3NUYXNrcyA9IFsuLi4oc2VjdGlvbnNCeU5hbWVbXCJTdWNjZXNzXCJdPy50YXNrcyA/PyBbXSldLnNvcnQoXG4gICAgICAoYSwgYikgPT4gKGEuZGlzcGxheU9yZGVyID8/IDApIC0gKGIuZGlzcGxheU9yZGVyID8/IDApXG4gICAgKVxuICAgIGNvbnN0IHByb3NwZWN0c1Jlc3BvbmRlZFRhc2sgPSBidWlsZFJlbGF0aW9uc2hpcFRhc2tzLmZpbmQoKHRhc2spID0+XG4gICAgICB0YXNrLm5hbWU/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoXCJwcm9zcGVjdHMgcmVzcG9uZGVkXCIpXG4gICAgKVxuXG4gICAgc2V0RmluZERhdGEoXG4gICAgICBtYXBQcm92aWRlclRvUm93cyhmYWNlYm9va1Byb3ZpZGVyLCBoYW5kbGVDaGVja2xpc3RBdXRvc2F2ZSwge1xuICAgICAgICBcbiAgICAgICAgc2VudFRhc2tJZCxcbiAgICAgICAgYWNjZXB0ZWRUYXNrSWQsXG4gICAgICAgIG9uTWVzc2FnZTogc2V0RmluZFByb3NwZWN0c01lc3NhZ2UsXG4gICAgICB9KVxuICAgIClcbiAgICBzZXRPdGhlclNvY2lhbERhdGEoXG4gICAgICBtYXBQcm92aWRlclRvUm93cyhvdGhlclByb3ZpZGVyLCBoYW5kbGVDaGVja2xpc3RBdXRvc2F2ZSwge1xuICAgICAgICBlbXB0eU1pc3NpbmdWYWx1ZXM6IHRydWUsXG4gICAgICAgIGlzRWRpdGFibGU6IGFsbG93T3RoZXJQbGF0Zm9ybXNFZGl0LFxuICAgICAgICBzZW50VGFza0lkLFxuICAgICAgICBhY2NlcHRlZFRhc2tJZCxcbiAgICAgICAgc2VudFZhbHVlT3ZlcnJpZGU6IHNlbnRUYXNrPy52YWx1ZT8ubnVtYmVyVmFsdWUgPz8gbnVsbCxcbiAgICAgICAgYWNjZXB0ZWRWYWx1ZU92ZXJyaWRlOiBhY2NlcHRlZFRhc2s/LnZhbHVlPy5udW1iZXJWYWx1ZSA/PyBudWxsLFxuICAgICAgICB0cmVhdFplcm9Bc0VtcHR5OiB0cnVlLFxuICAgICAgICBvbk1lc3NhZ2U6IHNldEZpbmRQcm9zcGVjdHNNZXNzYWdlLFxuICAgICAgfSlcbiAgICApXG4gICAgc2V0U3RhcnRDb252ZXJzYXRpb25EYXRhKFxuICAgICAgbWFwVGFza3NUb1Jvd3MoXG4gICAgICAgIHNlY3Rpb25zQnlOYW1lW1wiU3RhcnQgQ29udmVyc2F0aW9uc1wiXT8udGFza3MgPz8gW10sXG4gICAgICAgIGhhbmRsZUNoZWNrbGlzdEF1dG9zYXZlLFxuICAgICAgICB0b2dnbGVWYWx1ZXMsXG4gICAgICAgIGFsbG93T3RoZXJQbGF0Zm9ybXNFZGl0XG4gICAgICApXG4gICAgKVxuICAgIHNldFJlbGF0aW9uc2hpcERhdGEoXG4gICAgICBtYXBUYXNrc1RvUm93cyhcbiAgICAgICAgc2VjdGlvbnNCeU5hbWVbXCJCdWlsZCBSZWxhdGlvbnNoaXBzXCJdPy50YXNrcyA/PyBbXSxcbiAgICAgICAgaGFuZGxlQ2hlY2tsaXN0QXV0b3NhdmUsXG4gICAgICAgIHRvZ2dsZVZhbHVlcyxcbiAgICAgICAgYWxsb3dPdGhlclBsYXRmb3Jtc0VkaXRcbiAgICAgIClcbiAgICApXG4gICAgc2V0U3RheUNvbm5lY3RlZERhdGEoXG4gICAgICBtYXBUYXNrc1RvUm93cyhcbiAgICAgICAgc2VjdGlvbnNCeU5hbWVbXCJTdGF5IENvbm5lY3RlZFwiXT8udGFza3MgPz8gW10sXG4gICAgICAgIGhhbmRsZUNoZWNrbGlzdEF1dG9zYXZlLFxuICAgICAgICB0b2dnbGVWYWx1ZXMsXG4gICAgICAgIGFsbG93T3RoZXJQbGF0Zm9ybXNFZGl0XG4gICAgICApXG4gICAgKVxuICAgIHNldENvbW11bml0eURhdGEoXG4gICAgICBtYXBUYXNrc1RvUm93cyhcbiAgICAgICAgc2VjdGlvbnNCeU5hbWVbXCJDb21tdW5pdHlcIl0/LnRhc2tzID8/IFtdLFxuICAgICAgICBoYW5kbGVDaGVja2xpc3RBdXRvc2F2ZSxcbiAgICAgICAgdG9nZ2xlVmFsdWVzLFxuICAgICAgICBhbGxvd090aGVyUGxhdGZvcm1zRWRpdFxuICAgICAgKVxuICAgIClcbiAgICBzZXRHcm93dGhEYXRhKFxuICAgICAgbWFwU3VjY2Vzc1RvUm93cyhcbiAgICAgICAgc2VjdGlvbnNTdGF0ZSxcbiAgICAgICAgc2VjdGlvbnNCeU5hbWVbXCJTdWNjZXNzXCJdPy50YXNrcyA/PyBbXSxcbiAgICAgICAgaGFuZGxlQ2hlY2tsaXN0QXV0b3NhdmUsXG4gICAgICAgIHRvZ2dsZVZhbHVlcyxcbiAgICAgICAgYWxsb3dPdGhlclBsYXRmb3Jtc0VkaXRcbiAgICAgIClcbiAgICApXG4gICAgc2V0U3VtbWFyeUdyb3VwcyhbXG4gICAgICB7XG4gICAgICAgIHRpdGxlOiBmYWNlYm9va1Byb3ZpZGVyPy5uYW1lIHx8IFwiRmFjZWJvb2tcIixcbiAgICAgICAgdGFnQ2xhc3M6IFwiZmFjZWJvb2tcIixcbiAgICAgICAgaXRlbXM6IG1hcFByb3ZpZGVyVG9Sb3dzKGZhY2Vib29rUHJvdmlkZXIpLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdGl0bGU6IG90aGVyUHJvdmlkZXI/Lm5hbWUgfHwgXCJPdGhlciBQbGF0Zm9ybXNcIixcbiAgICAgICAgdGFnQ2xhc3M6IFwic29jaWFsXCIsXG4gICAgICAgIGl0ZW1zOiBtYXBQcm92aWRlclRvUm93cyhvdGhlclByb3ZpZGVyLCB1bmRlZmluZWQsIHtlbXB0eU1pc3NpbmdWYWx1ZXM6IHRydWV9KSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgI
2386HRpdGxlOiBcIlN1Y2Nlc3NcIixcbiAgICAgICAgdGFnQ2xhc3M6IFwic3VjY2Vzc1wiLFxuICAgICAgICBpdGVtczogW1xuICAgICAgICAgIC4uLihwcm9zcGVjdHNSZXNwb25kZWRUYXNrXG4gICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBsYWJlbDogcHJvc3BlY3RzUmVzcG9uZGVkVGFzay5uYW1lLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IGdldERpc3BsYXlOdW1iZXJWYWx1ZShwcm9zcGVjdHNSZXNwb25kZWRUYXNrLnZhbHVlPy5udW1iZXJWYWx1ZSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgOiBbXSksXG4gICAgICAgICAgLi4uc3VjY2Vzc1Rhc2tzLm1hcCgodGFzaykgPT4gKHtcbiAgICAgICAgICAgIGxhYmVsOiB0YXNrLm5hbWUsXG4gICAgICAgICAgICB2YWx1ZTpcbiAgICAgICAgICAgICAgdGFzay5pbnB1dFR5cGUgPT09IFwiVE9HR0xFXCJcbiAgICAgICAgICAgICAgPyAodG9nZ2xlVmFsdWVzW3Rhc2suaWRdID8/IHRhc2sudmFsdWU/LmJvb2xlYW5WYWx1ZSlcbiAgICAgICAgICAgICAgICA/IFwiWWVzXCJcbiAgICAgICAgICAgICAgICA6IFwiTm9cIlxuICAgICAgICAgICAgICA6IHRhc2submFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwiY29udmVyc2lvblwiKVxuICAgICAgICAgICAgICAgICAgPyBgJHt0YXNrLnZhbHVlPy5udW1iZXJWYWx1ZSA/PyAwfSVgXG4gICAgICAgICAgICAgICAgICA6IGdldERpc3BsYXlOdW1iZXJWYWx1ZSh0YXNrLnZhbHVlPy5udW1iZXJWYWx1ZSksXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIGdldExpZmV0aW1lQ29udmVyc2lvblJhdGVDYXJkKHNlY3Rpb25zU3RhdGUpLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICBdKVxuICB9LCBbYWxsb3dPdGhlclBsYXRmb3Jtc0VkaXQsIHByb3ZpZGVyc1N0YXRlLCBzZWN0aW9uc1N0YXRlLCB0b2dnbGVWYWx1ZXNdKVxuXG4gIFxudXNlRWZmZWN0KCgpID0+IHtcbiAgY29uc3QgaXNJbml0aWFsRGF0YUxvYWRlZCA9XG4gICAgZmluZERhdGEgIT09IG51bGwgJiZcbiAgICBvdGhlclNvY2lhbERhdGEgIT09IG51bGwgJiZcbiAgICBzdW1tYXJ5R3JvdXBzICE9PSBudWxsXG5cbiAgaWYgKGlzSW5pdGlhbERhdGFMb2FkZWQgJiYgIXNhdmVMb2FkaW5nKSB7XG4gICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgfVxuY29uc29sZS5sb2coXCJMb2FkaW5nIENoZWNrIPCfkYlcIiwge1xuICBmaW5kRGF0YSxcbiAgb3RoZXJTb2NpYWxEYXRhLFxuICBzdW1tYXJ5R3JvdXBzLFxuICBzYXZlTG9hZGluZ1xufSlcbiAgXG59LCBbZmluZERhdGEsIG90aGVyU29jaWFsRGF0YSwgc3VtbWFyeUdyb3Vwcywgc2F2ZUxvYWRpbmddKVxuXG5cbnVzZUVmZmVjdCgoKSA9PiB7XG4gIGVuYWJsZVNwbGFzaFNjcmVlbigpOyAvLyDinIUgc3RhcnQgaW1tZWRpYXRlbHkgd2hlbiBwYWdlIG1vdW50c1xuXG4gIGxvYWRDaGVja2xpc3RQYWdlKCk7ICAvLyDwn5GIIGNhbGwgd3JhcHBlciBmdW5jdGlvblxufSwgW10pO1xuXG5jb25zdCBsb2FkQ2hlY2tsaXN0UGFnZSA9IGFzeW5jICgpID0+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmZXRjaENoZWNrbGlzdERhdGEoKTsgLy8geW91ciBleGlzdGluZyBBUElcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBkaXNhYmxlU3BsYXNoU2NyZWVuKCk7IC8vIOKchSBhbHJlYWR5IHdvcmtpbmcgaW4geW91ciBjYXNlXG4gIH1cbn07XG5cblxuICAvLyBTYXZlcyBhbGwgcGVuZGluZyBjaGVja2xpc3QgY2hhbmdlcyBpbiBhIHNpbmdsZSByZXF1ZXN0LlxuICBjb25zdCBoYW5kbGVTYXZlRGFpbHlTeXN0ZW0gPSBhc3luYyAoKSA9PiB7XG4gICAgc2V0U2F2ZUxvYWRpbmcodHJ1ZSlcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaW5kUHJvc3BlY3RzVGFza3MgPVxuICAgICAgICBzZWN0aW9uc1N0YXRlLmZpbmQoKHNlY3Rpb24pID0+IHNlY3Rpb24ubmFtZSA9PT0gXCJGaW5kIFByb3NwZWN0c1wiKT8udGFza3MgPz8gW11cbiAgICAgIGNvbnN0IHNlbnRUYXNrSWQgPSBmaW5kUHJvc3BlY3RzVGFza3MuZmluZChcbiAgICAgICAgKHRhc2spID0+IHRhc2submFtZSA9PT0gXCJGcmllbmQgUmVxdWVzdCAmIE1lc3NhZ2UgU2VudFwiXG4gICAgICApPy5pZFxuICAgICAgY29uc3QgYWNjZXB0ZWRUYXNrSWQgPSBmaW5kUHJvc3BlY3RzVGFza3MuZmluZCgodGFzaykgPT4gdGFzay5uYW1lID09PSBcIkFjY2VwdGVkXCIpPy5pZFxuICAgICAgY29uc3Qge290aGVyUHJvdmlkZXJ9ID0gcmVzb2x2ZVNvY2lhbFByb3ZpZGVycyhwcm92aWRlcnNTdGF0ZSlcblxuICAgICAgY29uc3QgcGVuZGluZ1NlbnRWYWx1ZSA9XG4gICAgICAgIHNlbnRUYXNrSWQgIT0gbnVsbCA/IHBlbmRpbmdDaGVja2xpc3RDaGFuZ2VzW3NlbnRUYXNrSWRdPy5udW1iZXJWYWx1ZSA6IHVuZGVmaW5lZFxuICAgICAgY29uc3QgcGVuZGluZ0FjY2VwdGVkVmFsdWUgPVxuICAgICAgICBhY2NlcHRlZFRhc2tJZCAhPSBudWxsID8gcGVuZGluZ0NoZWNrbGlzdENoYW5nZXNbYWNjZXB0ZWRUYXNrSWRdPy5udW1iZXJWYWx1ZSA6IHVuZGVmaW5lZFxuICAgICAgY29uc3QgY3VycmVudFNlbnRWYWx1ZSA9XG4gICAgICAgIHBlbmRpbmdTZW50VmFsdWUgIT09IHVuZGVmaW5lZCA/IHBlbmRpbmdTZW50VmFsdWUgOiBvdGhlclByb3ZpZGVyPy5zZW50ID8/IG51bGxcbiAgICAgIGNvbnN0IGN1cnJlbnRBY2NlcHRlZFZhbHVlID1cbiAgICAgICAgcGVuZGluZ0FjY2VwdGVkVmFsdWUgIT09IHVuZGVmaW5lZCA/IHBlbmRpbmdBY2NlcHRlZFZhbHVlIDogb3RoZXJQcm92aWRlcj8uYWNjZXB0ZWQgPz8gbnVsbFxuICAgICAgY29uc3QgYmFzZU92ZXJhbGxTZW50ID1cbiAgICAgICAgdHlwZW9mIG90aGVyUHJvdmlkZXI/Lm92ZXJhbGxTZW50ID09PSBcIm51bWJlclwiID8gb3RoZXJQcm92aWRlci5vdmVyYWxsU2VudCA6IDBcbiAgICAgIGNvbnN0IGJhc2VPdmVyYWxsQWNjZXB0ZWQgPVxuICAgICAgICB0eXBlb2Ygb3RoZXJQcm92aWRlcj8ub3ZlcmFsbEFjY2VwdGVkID09PSBcIm51bWJlclwiID8gb3RoZXJQcm92aWRlci5vdmVyYWxsQWNjZXB0ZWQgOiAwXG5cbiAgICAgIC8vIG92ZXJhbGxTZW50L292ZXJhbGxBY2NlcHRlZCBhbHJlYWR5IGluY2x1ZGUgdG9kYXkncyBzYXZlZCB2YWx1ZXMsXG4gICAgICAvLyBzbyBzdWJ0cmFjdCB0b2RheSdzIG9yaWdpbmFsIEFQSSB2YWx1ZSB0byBhdm9pZCBkb3VibGUtY291bnRpbmcuXG4gICAgICBjb25zdCBvcmlnaW5hbERheVNlbnQgPSB0eXBlb2Ygb3RoZXJQcm92aWRlcj8uc2VudCA9PT0gXCJudW1iZXJcIiA/IG90aGVyUHJvdmlkZXIuc2VudCA6IDBcbiAgICAgIGNvbnN0IG9yaWdpbmFsRGF5QWNjZXB0ZWQgPVxuICAgICAgICB0eX
2386Blb2Ygb3RoZXJQcm92aWRlcj8uYWNjZXB0ZWQgPT09IFwibnVtYmVyXCIgPyBvdGhlclByb3ZpZGVyLmFjY2VwdGVkIDogMFxuXG4gICAgICBjb25zdCB0b3RhbFNlbnQgPSAoYmFzZU92ZXJhbGxTZW50IC0gb3JpZ2luYWxEYXlTZW50KSArIChjdXJyZW50U2VudFZhbHVlID8/IDApXG4gICAgICBjb25zdCB0b3RhbEFjY2VwdGVkID0gKGJhc2VPdmVyYWxsQWNjZXB0ZWQgLSBvcmlnaW5hbERheUFjY2VwdGVkKSArIChjdXJyZW50QWNjZXB0ZWRWYWx1ZSA/PyAwKVxuXG4gICAgICBpZiAodG90YWxBY2NlcHRlZCA+IHRvdGFsU2VudCkge1xuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgT3ZlcmFsbCBBY2NlcHRlZCAoJHtiYXNlT3ZlcmFsbEFjY2VwdGVkfSkgc2hvdWxkIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBPdmVyYWxsIFNlbnQgKCR7YmFzZU92ZXJhbGxTZW50fSkuYFxuICAgICAgICBzZXRGaW5kUHJvc3BlY3RzTWVzc2FnZSh7XG4gICAgICAgICAgdHlwZTogXCJlcnJvclwiLFxuICAgICAgICAgIHRleHQ6IGVycm9yTWVzc2FnZSxcbiAgICAgICAgfSlcblxuICAgICAgICBhd2FpdCBTd2FsLmZpcmUoe1xuICAgICAgICAgIHRpdGxlOiBcIlZhbGlkYXRpb24gRXJyb3JcIixcbiAgICAgICAgICB0ZXh0OiBlcnJvck1lc3NhZ2UsXG4gICAgICAgICAgaWNvbjogXCJlcnJvclwiLFxuICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiBcIk9LXCIsXG4gICAgICAgICAgY29uZmlybUJ1dHRvbkNvbG9yOiBcIiMwMzczYjlcIixcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBlbmRpbmdWYWx1ZXMgPSBPYmplY3QudmFsdWVzKHBlbmRpbmdDaGVja2xpc3RDaGFuZ2VzKVxuICAgICAgY29uc3QgY29tcGFueU5hbWUgPSBDVVJFRU5UX0NPTVBBTllfTkFNRSB8fCBcInNpeHNpZ21hZnVubmVsc1wiXG5cbiAgICAgIGlmICghcGVuZGluZ1ZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKGlzT3ZlcmFsbFZhbGlkYXRpb25FcnJvck1lc3NhZ2UoZmluZFByb3NwZWN0c01lc3NhZ2UpKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZmluZFByb3NwZWN0c01lc3NhZ2U/LnRleHQgfHwgYE92ZXJhbGwgQWNjZXB0ZWQgKCR7YmFzZU92ZXJhbGxBY2NlcHRlZH0pIHNob3VsZCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gT3ZlcmFsbCBTZW50ICgke2Jhc2VPdmVyYWxsU2VudH0pLmBcbiAgICAgICAgICBhd2FpdCBTd2FsLmZpcmUoe1xuICAgICAgICAgICAgdGl0bGU6IFwiVmFsaWRhdGlvbiBFcnJvclwiLFxuICAgICAgICAgICAgdGV4dDogZXJyb3JNZXNzYWdlLFxuICAgICAgICAgICAgaWNvbjogXCJlcnJvclwiLFxuICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6IFwiT0tcIixcbiAgICAgICAgICAgIGNvbmZpcm1CdXR0b25Db2xvcjogXCIjMDM3M2I5XCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IFN3YWwuZmlyZSh7XG4gICAgICAgICAgdGl0bGU6IFwiTm8gQ2hhbmdlc1wiLFxuICAgICAgICAgIHRleHQ6IFwiTm8gY2hlY2tsaXN0IGNoYW5nZXMgdG8gc2F2ZS5cIixcbiAgICAgICAgICBpY29uOiBcImluZm9cIixcbiAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogXCJPS1wiLFxuICAgICAgICAgIGNvbmZpcm1CdXR0b25Db2xvcjogXCIjMDM3M2I5XCIsXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXlsb2FkOiBDaGVja2xpc3RTYXZlUGF5bG9hZCA9IHtcbiAgICAgICAgZW50cnlEYXRlOiByZXNvbHZlQ2hlY2tsaXN0RW50cnlEYXRlKCksXG4gICAgICAgIHRpbWV6b25lOiBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkudGltZVpvbmUgfHwgXCJBc2lhL0tvbGthdGFcIixcbiAgICAgICAgdmFsdWVzOiBwZW5kaW5nVmFsdWVzLFxuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmxvZyhcIkNIRUNLTElTVF9TQVZFIHJlcXVlc3Q6XCIsIHtcbiAgICAgICAgdXJsOiBQT1NUX1NBVkVfVEFTS19WQUxVRShjb21wYW55TmFtZSksXG4gICAgICAgIHBheWxvYWQsXG4gICAgICB9KVxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcy5wb3N0PHtzdWNjZXNzPzogYm9vbGVhbjsgbWVzc2FnZT86IHN0cmluZ30+KFxuICAgICAgICBQT1NUX1NBVkVfVEFTS19WQUxVRShjb21wYW55TmFtZSksXG4gICAgICAgIHBheWxvYWRcbiAgICAgIClcbiAgICAgIGNvbnNvbGUubG9nKFwiQ0hFQ0tMSVNUX1NBVkUgcmVzcG9uc2U6XCIsIHJlc3BvbnNlPy5kYXRhKVxuXG4gICAgICBpZiAocmVzcG9uc2U/LmRhdGE/LnN1Y2Nlc3MgPT09IGZhbHNlKSB7XG4gICAgICAgIGF3YWl0IFN3YWwuZmlyZSh7XG4gICAgICAgICAgdGl0bGU6IFwiU2F2ZSBGYWlsZWRcIixcbiAgICAgICAgICB0ZXh0OiByZXNwb25zZT8uZGF0YT8ubWVzc2FnZSB8fCBcIkZhaWxlZCB0byBzYXZlIGRhaWx5IHN5c3RlbS5cIixcbiAgICAgICAgICBpY29uOiBcImVycm9yXCIsXG4gICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6IFwiT0tcIixcbiAgICAgICAgICBjb25maXJtQnV0dG9uQ29sb3I6IFwiIzAzNzNiOVwiLFxuICAgICAgICB9KVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgc2V0UGVuZGluZ0NoZWNrbGlzdENoYW5nZXMoe30pXG4gICAgICBhd2FpdCBmZXRjaENoZWNrbGlzdERhdGEoe2FmdGVyU2F2ZTogdHJ1ZX0pXG4gICAgICBhd2FpdCBTd2FsLmZpcmUoe1xuICAgICAgICB0aXRsZTogXCJTYXZlZCFcIixcbiAgICAgICAgdGV4dDogcmVzcG9uc2U/LmRhdGE/Lm1lc3NhZ2UgfHwgXCJEYWlseSBzeXN0ZW0gc2F2ZWQgc3VjY2Vzc2Z1bGx5LlwiLFxuICAgICAgICBpY29uOiBcInN1Y2Nlc3NcIixcbiAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6IFwiT0tcIixcbiAgICAgICAgY29uZmlybUJ1dHRvbkNvbG9yOiBcIiNmNzljM2FcIixcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiQ0hFQ0tMSVNUX1NBVkUgZXJyb3I6XCIsIGVycj8ucmVzcG9uc2U/LmR
2386hdGEgfHwgZXJyPy5tZXNzYWdlIHx8IGVycilcbiAgICAgIGF3YWl0IFN3YWwuZmlyZSh7XG4gICAgICAgIHRpdGxlOiBcIlNhdmUgRmFpbGVkXCIsXG4gICAgICAgIHRleHQ6IGVycj8ucmVzcG9uc2U/LmRhdGE/Lm1lc3NhZ2UgfHwgZXJyPy5tZXNzYWdlIHx8IFwiRmFpbGVkIHRvIHNhdmUgZGFpbHkgc3lzdGVtLlwiLFxuICAgICAgICBpY29uOiBcImVycm9yXCIsXG4gICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiBcIk9LXCIsXG4gICAgICAgIGNvbmZpcm1CdXR0b25Db2xvcjogXCIjMDM3M2I5XCIsXG4gICAgICB9KVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRTYXZlTG9hZGluZyhmYWxzZSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBtYXhTZWxlY3RhYmxlRGF0ZSA9IGdldFVzZXJUaW1lWm9uZUJhc2VkQ3VycmVudERhdGUoKVxuICBjb25zdCBoYXNBZHZhbmNlZERhdGVGaWx0ZXIgPSAhIWZpbHRlcj8uc3RhcnREYXRlICYmICEhZmlsdGVyPy5lbmREYXRlXG4gIGNvbnN0IGlzSW5saW5lRGF0ZUZpbHRlckFjdGl2ZSA9IGlzQ3VzdG9tRGF0ZUZpbHRlckFjdGl2ZSAmJiAhaGFzQWR2YW5jZWREYXRlRmlsdGVyXG4gIGNvbnN0IGFjdGl2aXR5SGVhZGVyTGFiZWwgPSBidWlsZEFjdGl2aXR5SGVhZGVyTGFiZWwoc2VsZWN0ZWRSYW5nZSwgc2VsZWN0ZWREYXRlLCBmaWx0ZXIpXG4gIGNvbnN0IGZpbmRQcm9zcGVjdHNNZXRhID0gc2VjdGlvbk1ldGFbXCJGaW5kIFByb3NwZWN0c1wiXVxuICBjb25zdCBzdGFydENvbnZlcnNhdGlvbnNNZXRhID0gc2VjdGlvbk1ldGFbXCJTdGFydCBDb252ZXJzYXRpb25zXCJdXG4gIGNvbnN0IGJ1aWxkUmVsYXRpb25zaGlwc01ldGEgPSBzZWN0aW9uTWV0YVtcIkJ1aWxkIFJlbGF0aW9uc2hpcHNcIl1cbiAgY29uc3Qgc3RheUNvbm5lY3RlZE1ldGEgPSBzZWN0aW9uTWV0YVtcIlN0YXkgQ29ubmVjdGVkXCJdXG4gIGNvbnN0IGNvbW11bml0eU1ldGEgPSBzZWN0aW9uTWV0YVtcIkNvbW11bml0eVwiXVxuICBjb25zdCBzdWNjZXNzTWV0YSA9IHNlY3Rpb25NZXRhW1wiU3VjY2Vzc1wiXVxuICBjb25zdCB7ZmFjZWJvb2tQcm92aWRlciwgb3RoZXJQcm92aWRlcn0gPSByZXNvbHZlU29jaWFsUHJvdmlkZXJzKHByb3ZpZGVyc1N0YXRlKVxuICBjb25zdCBmYWNlYm9va0FjY2VwdGFuY2VSYXRlID0gZ2V0TGlmZXRpbWVBY2NlcHRhbmNlUmF0ZShmYWNlYm9va1Byb3ZpZGVyKVxuICBjb25zdCBvdGhlckFjY2VwdGFuY2VSYXRlID0gZ2V0TGlmZXRpbWVBY2NlcHRhbmNlUmF0ZShvdGhlclByb3ZpZGVyKVxuICAvLyBDb252ZW5pZW5jZSBoZWxwZXIgZm9yIHNlY3Rpb24gY29tcGxldGlvbiBwaWxsIHN0YXRlLlxuICBjb25zdCBpc1NlY3Rpb25Db21wbGV0ZSA9IChzZWN0aW9uTmFtZTogc3RyaW5nKSA9PlxuICAgIHNlY3Rpb25zU3RhdGUuZmluZCgoc2VjdGlvbikgPT4gc2VjdGlvbi5uYW1lID09PSBzZWN0aW9uTmFtZSk/LmFsbFRhc2tDb21wbGV0ZWQgPz8gZmFsc2VcblxuICByZXR1cm4gKFxuICAgIDxDb250ZW50PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjaGVja2xpc3QtcGFnZVwiPlxuICAgICBcblxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNoZWNrbGlzdC1oZWFkZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImhlYWRlci10b3BcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY2hlY2tsaXN0LWhlYWRlci10aXRsZVwiPlxuICAgICAgICAgICAgICA8aDE+IERhaWx5IFN5c3RlbTwvaDE+XG4gICAgICAgICAgICAgIDxwPkxvZyB0b2RheSdzIGFjdGl2aXR5LiBCdWlsZCBwcmVkaWN0YWJsZSBncm93dGguPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZGF0ZS1maWx0ZXItd3JhcHBlclwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiZGF0ZV9yYW5nZV9sYmxcIj5GaWx0ZXI6PC9sYWJlbD5cbiAgICAgICAgICAgICAgPERhdGVSYW5nZVNlbGVjdG9yXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRSYW5nZT17c2VsZWN0ZWRSYW5nZX1cbiAgICAgICAgICAgICAgICBvblJhbmdlQ2hhbmdlPXtoYW5kbGVSYW5nZUNoYW5nZX1cbiAgICAgICAgICAgICAgICBmaWx0ZXI9e2ZpbHRlcn1cbiAgICAgICAgICAgICAgICBzZXRGaWx0ZXI9e2hhbmRsZUZpbHRlckNoYW5nZX1cbiAgICAgICAgICAgICAgICBpc1VzZXJUYWJsZT17ZmFsc2V9XG4gICAgICAgICAgICAgICAgcGxhblR5cGU9e251bGx9XG4gICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRSYW5nZT17aGFuZGxlUmFuZ2VDaGFuZ2V9XG4gICAgICAgICAgICAgICAgaXNEcm9wZG93bj17ZmFsc2V9XG4gICAgICAgICAgICAgICAgaXNPdmVyYWxsUmVxdWlyZWQ9e2ZhbHNlfVxuICAgICAgICAgICAgICAgIGlzRGF5UmVxdWlyZWQ9e3RydWV9XG4gICAgICAgICAgICAgIC8+XG5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGNvbC1tZC00IGNoZWNrbGlzdC1oZWFkZXItZGF0ZS1kaXNwbGF5ICR7XG4gICAgICAgICAgICAgICAgICBpc0lubGluZURhdGVGaWx0ZXJBY3RpdmUgPyBcImlzLWFjdGl2ZVwiIDogXCJcIlxuICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgIHN0eWxlPXt7cG9zaXRpb246IFwicmVsYXRpdmVcIn19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgc3JjPVwiL21lZGlhL21pc2MvRGFpbHktc3lzdGVtLUhlYWRlci1jYWxlbmRlci5wbmdcIlxuICAgICAgICAgICAgICAgICAgYWx0PVwiY2FsZW5kYXJcIlxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZGF0ZS1waWNrZXItaW1hZ2VcIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0SXNEYXRlUGlja2VyT3Blbih0cnVlKX1cbiAgICAgICAgICAgICAgICAvPlxuXG4gICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8RGF0ZVBpY2tlclxuICAgICAgICAgICAgICAgICAgcmVmPXtkYXRlUGlja2VyUmVmfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgI
2386HNlbGVjdGVkPXtzZWxlY3RlZERhdGV9XG4gICAgICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlQ2hlY2tsaXN0RGF0ZUNoYW5nZX1cbiAgICAgICAgICAgICAgICAgIG9wZW49e2lzRGF0ZVBpY2tlck9wZW59XG4gICAgICAgICAgICAgICAgICBvbklucHV0Q2xpY2s9eygpID0+IHNldElzRGF0ZVBpY2tlck9wZW4odHJ1ZSl9XG4gICAgICAgICAgICAgICAgICBvbkNsaWNrT3V0c2lkZT17KCkgPT4gc2V0SXNEYXRlUGlja2VyT3BlbihmYWxzZSl9XG4gICAgICAgICAgICAgICAgICBvbkNhbGVuZGFyQ2xvc2U9eygpID0+IHNldElzRGF0ZVBpY2tlck9wZW4oZmFsc2UpfVxuICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdD17REFURV9GT1JNQVRfTU1NTV9ERF9ZWVlZfVxuICAgICAgICAgICAgICAgICAgbWF4RGF0ZT17bWF4U2VsZWN0YWJsZURhdGV9XG4gICAgICAgICAgICAgICAgICByZWFkT25seVxuICAgICAgICAgICAgICAgICAgbG9jYWxlPVwiZW4tR0JcIlxuICAgICAgICAgICAgICAgIC8+XG5cbiAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNoZWNrbGlzdC1jb250ZW50XCI+XG4gICAgICAgICAgPERhaWx5QWN0aXZpdHlMb2dcbiAgICAgICAgICAgIGRhdGVMYWJlbD17YWN0aXZpdHlIZWFkZXJMYWJlbH1cbiAgICAgICAgICAgIGRhdGE9e2FjdGl2aXR5fVxuICAgICAgICAgICAgaW50ZWdyaXR5RGF5cz17aW50ZWdyaXR5RGF5c31cbiAgICAgICAgICAgIGludGVncml0eUNvbXBsZXRlZERheXM9e2ludGVncml0eUNvbXBsZXRlZERheXN9XG4gICAgICAgICAgLz5cblxuICAgICAgICAgIHtsb2FkaW5nICYmIDxkaXYgY2xhc3NOYW1lPVwiY2hlY2tsaXN0LWxvYWRpbmdcIj5Mb2FkaW5nIGNoZWNrbGlzdC4uLjwvZGl2Pn1cbiAgICAgICAgICB7ZXJyb3IgJiYgPGRpdiBjbGFzc05hbWU9XCJjaGVja2xpc3QtZXJyb3JcIj5FcnJvciBsb2FkaW5nIGNoZWNrbGlzdDoge2Vycm9yfTwvZGl2Pn1cblxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiam91cm5leS1mbG93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsb3ctc3RlcFwiPlxuICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgc3JjPVwiL21lZGlhL21pc2MvZmluZC1wcm9zcGVjdHMucG5nXCJcbiAgICAgICAgICAgICAgICBhbHQ9XCJmaW5kLXByb3NwZWN0c1wiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiam91cm5leS1mbG93LWltZ1wiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuPntmaW5kUHJvc3BlY3RzTWV0YS50aXRsZX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxvdy1hcnJvd1wiPlxuICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9tZWRpYS9taXNjL0Fycm93LXJpZ2h0LnBuZ1wiIGFsdD1cImFycm93XCIgY2xhc3NOYW1lPVwicmlnaHQtYXJyb3dcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsb3ctc3RlcFwiPlxuICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgc3JjPVwiL21lZGlhL21pc2Mvc3RhcnQtY29udmVyc2F0aW9uLnBuZ1wiXG4gICAgICAgICAgICAgICAgYWx0PVwic3RhcnQtY29udmVyc2F0aW9uXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJqb3VybmV5LWZsb3ctaW1nXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+e3N0YXJ0Q29udmVyc2F0aW9uc01ldGEudGl0bGV9PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsb3ctYXJyb3dcIj5cbiAgICAgICAgICAgICAgPGltZyBzcmM9XCIvbWVkaWEvbWlzYy9BcnJvdy1yaWdodC5wbmdcIiBhbHQ9XCJhcnJvd1wiIGNsYXNzTmFtZT1cInJpZ2h0LWFycm93XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbG93LXN0ZXBcIj5cbiAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgIHNyYz1cIi9tZWRpYS9taXNjL2J1aWxkLXJlbGF0aW9uc2hpcHMucG5nXCJcbiAgICAgICAgICAgICAgICBhbHQ9XCJ
2386idWlsZC1yZWxhdGlvbnNoaXBzXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJqb3VybmV5LWZsb3ctaW1nXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+e2J1aWxkUmVsYXRpb25zaGlwc01ldGEudGl0bGV9PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsb3ctYXJyb3dcIj5cbiAgICAgICAgICAgICAgPGltZyBzcmM9XCIvbWVkaWEvbWlzYy9BcnJvdy1yaWdodC5wbmdcIiBhbHQ9XCJhcnJvd1wiIGNsYXNzTmFtZT1cInJpZ2h0LWFycm93XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbG93LXN0ZXBcIj5cbiAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgIHNyYz1cIi9tZWRpYS9taXNjL3N0YXktY29ubmVjdGVkLnBuZ1wiXG4gICAgICAgICAgICAgICAgYWx0PVwic3RheS1jb25uZWN0ZWRcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImpvdXJuZXktZmxvdy1pbWdcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c3Bhbj57c3RheUNvbm5lY3RlZE1ldGEudGl0bGV9PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxvdy1hcnJvd1wiPlxuICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9tZWRpYS9taXNjL0Fycm93LXJpZ2h0LnBuZ1wiIGFsdD1cImFycm93XCIgY2xhc3NOYW1lPVwicmlnaHQtYXJyb3dcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsb3ctc3RlcFwiPlxuICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgc3JjPVwiL21lZGlhL21pc2MvQ29tbXVuaXR5LnBuZ1wiXG4gICAgICAgICAgICAgICAgYWx0PVwiY29tbXVuaXR5XCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJqb3VybmV5LWZsb3ctaW1nXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+Q29tbXVuaXR5PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxvdy1hcnJvd1wiPlxuICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9tZWRpYS9taXNjL0Fycm93LXJpZ2h0LnBuZ1wiIGFsdD1cImFycm93XCIgY2xhc3NOYW1lPVwicmlnaHQtYXJyb3dcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsb3ctc3RlcCBzdWNjZXNzXCI+XG4gICAgICAgICAgICAgIDxpbWcgc3JjPVwiL21lZGlhL21pc2Mvc3VjY2Vzcy5wbmdcIiBhbHQ9XCJzdWNjZXNzXCIgY2xhc3NOYW1lPVwiam91cm5leS1mbG93LWltZ1wiIC8+XG4gICAgICAgICAgICAgIDxzcGFuPntzdWNjZXNzTWV0YS50aXRsZX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxGaW5kUHJvc3BlY3RzT3ZlcnZpZXdcbiAgICAgICAgICAgIG51bWJlcj17ZmluZFByb3NwZWN0c01ldGEubnVtYmVyfVxuICAgICAgICAgICAgdGl0bGU9e2ZpbmRQcm9zcGVjdHNNZXRhLnRpdGxlfVxuICAgICAgICAgICAgZmFjZWJvb2tEYXRhPXtmaW5kRGF0YX1cbiAgICAgICAgICAgIG90aGVyU29jaWFsRGF0YT17b3RoZXJTb2NpYWxEYXRhfVxuICAgICAgICAgICAgaXNDb21wbGV0ZT17aXNTZWN0aW9uQ29tcGxldGUoXCJGaW5kIFByb3NwZWN0c1wiKX1cbiAgICAgICAgICAgIG1lc3NhZ2U9e2ZpbmRQcm9zcGVjdHNNZXNzYWdlfVxuICAgICAgICAgICAgZmFjZWJvb2tBY2NlcHRhbmNlUmF0ZT17ZmFjZWJvb2tBY2NlcHRhbmNlUmF0ZX1cbiAgICAgICAgICAgIG90aGVyQWNjZXB0YW5jZVJhdGU9e290aGVyQWNjZXB0YW5jZVJhdGV9XG4gICAgICAgICAgICBvbkNhbXBhaWduQ2hhbmdlPXtoYW5kbGVDYW1wYWlnbkNoYW5nZX1cbiAgICAgICAgICAgIGlzSW5pdGlhbGl6ZWQ9eyFpc0luaXRpYWxpemluZ0NhbXBhaWdufVxuICAgICAgICAgICAgc2VsZWN0ZWRDYW1wYWlnbj17c2VsZWN0ZWRDYW1wYWlnbn1cbiAgICAgICAgICAvPlxuXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzZWN0aW9ucy1yb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLW1kLTZcIj5cbiAgICAgICAgICAgICAgPFN0YXJ0Q29udmVyc2F0aW9uc1NlY3Rpb25cbiAgICAgICAgICAgICAgICBudW1iZXI9e3N0YXJ0Q29udmVyc2F0aW9uc01ldGEubnVtYmVyfVxuICAgICAgICAgICAgICAgIHRpdGxlPXtzdGFydENvbnZlcnNhdGlvbnNNZXRhLnRpdGxlfVxuICAgICAgICAgICAgICAgIGl0ZW1zPXtzdGFydENvbnZlcnNhdGlvbkRhdGF9XG4gICAgICAgICAgICAgICAgaXNDb21wbGV0ZT17aXNTZWN0aW9uQ29tcGxldGUoXCJTdGFydCBDb252ZXJzYXRpb25zXCIpfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8Q2hlY2tsaXN0U2VjdGlvblxuICAgICAgICAgICAgICAgIG51bWJlcj17YnVpbGRSZWxhdGlvbnNoaXBzTWV0YS5udW1iZXJ9XG4gICAgICAgICAgICAgICAgdGl0bGU9e2J1aWxkUmVsYXRpb25zaGlwc01ldGEudGl0bGV9XG4gICAgICAgICAgICAgICAgcm93cz17cmVsYXRpb25zaGlwRGF0YX1cbiAgICAgICAgICAgICAgICBpc0NvbXBsZXRlPXtpc1NlY3Rpb25Db21wbGV0ZShcIkJ1aWxkIFJlbGF0aW9uc2hpcHNcIil9XG4gICAgICAgICAgICAgICAgaW5mbz1cIlRyYWNrIHlvdXIgZm9sbG93LXVwIGFuZCByZWNvbm5lY3Rpb25zLiBUaGlzIGlzIHdoZXJlIHByb3NwZWN0cyBiZWNvbWUgY3VzdG9tZXJzIGFuZCByZWZlcnJhbHMuXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbC1tZC02XCI+XG4gICAgICAgICAgICAgIDxDaGVja2xpc3RTZWN0aW9uXG4gICAgICAgICAgICAgICAgbnVtYmVyPXtzdGF5Q29ubmVjdGVkTWV0YS5udW1iZXJ9XG4gICAgICAgICAgICAgICAgdGl0bGU9e3N0YXlDb25uZWN0ZWRNZXRhLnRpdGxlfVxuICAgICAgICAgICAgICAgIHJvd3M9e3N0YXlDb25uZWN0ZWREYXRhfVxuICAgICAgICAgICAgICAgIGlzQ29tcGxldGU9e2lzU2VjdGlvbkNvbXBsZXRlKFwiU3RheSBDb25uZWN0ZWRcIil9XG4gICAgICAgICAgICAgICAgaW5mbz1cIkxvZyB5b3VyIGRhaWx5IHBvc3RzLCBzdG9yaWVzLCBhbmQgZW5nYWdlbWVudC4gU3RheWluZyB2aXNpYmxlIGtlZXBzIHlvdSB0b3Agb2YgbWluZC5cIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8Q2hlY2tsaXN0U2VjdGlvblxuICAgICAgICAgICAgICAgIG51bWJlcj17Y29tbXVuaXR5TWV0YS5udW1iZXJ9XG4gICAgICAgICAgICAgICAgdGl0bGU9e2NvbW11bml0eU1ldGEudGl0bGV9XG4gICAgICAgICAgICAgICAgcm93cz17Y29tbXVuaXR5RGF0YX1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJhY2NlbnQtcmVkXCJcbiAgICAgICAgICAgICAgICBpc0NvbXBsZXRlPXtpc1NlY3Rpb25Db21wbGV0ZShcIkNvbW11bml0eVwiKX1cbiAgICAgICAgICAgICAgICBpbmZvPVwiVHJhY2sgeW91ciBncm91cCBhY3Rpdml0eS4gQW4gYWN0aXZlIGNvbW11bml0eSBhdHRyYWN0cyBuZXcgY3VzdG9tZXJzIGFuZCBrZWVwcyBleGlzdGluZyBvbmVzIGxveWFsLlwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2VjdGlvbnMtcm93XCI+XG4gICAgICAgICAgICA8Q2hlY2tsaXN0U2VjdGlvblxuICAgICAgICAgICAgICBudW1iZXI9e3N1Y2Nlc3NNZXRhLm51bWJlcn1cbiAgICAgICAgICAgICAgdGl0bGU9e3N1Y2Nlc3NNZXRhLnRpdGxlfVxuICAgICAgICAgICAgICByb3dzPXtncm93dGhEYXRhfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJhY2NlbnQtYmx1ZVwiXG4gICAgICAgICAgICAgIGlzQ29tcGxldGU9e2lzU2VjdGlvbkNvbXBsZXRlKFwiU3VjY2Vzc1wiKX1cbiAgICAgICAgICAgICAgaW5mbz1cIkxvZyBldmVyeSBuZXcgY3VzdG9tZXIgYW5kIHJlZmVycmFsIHlvdSBlYXJuLiBUaGlzIGlzIHByb29mIHRoYXQgdGhlIHN5c3RlbSBpcyB3b3JraW5nLlwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzYXZlLXNlY3Rpb25cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaW5mby1iYXJcIj5cbiAgICAgICAgICAgICAgRW50ZXIgPGI+MDwvYj4gaWYgY29tcGxldGVkIHdpdGggbm8gb3V0Y29tZS4gQmxhbmsgZmllbGRzIGRvIG5vdCBjb3VudCBhcyBjb21wbGV0ZS5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzYXZlLWJ1dHRvbi13cmFwcGVyXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJzYXZlLWJ0blwiXG4gICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlU2F2ZURhaWx5U3lzdGVtfVxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXtzYXZlTG9hZGluZyB8fCAhYWxsb3dPdGhlclBsYXRmb3Jtc0VkaXR9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7c2F2ZUxvYWRpbmcgP
2386yBcIlNhdmluZy4uLlwiIDogXCJTYXZlIERhaWx5IFN5c3RlbVwifVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgey8qIDxTdW1tYXJ5U2VjdGlvblxuICAgICAgICAgICAgcGVyZm9ybWFuY2U9e3N1bW1hcnlQZXJmfVxuICAgICAgICAgICAgZ3JvdXBzPXtzdW1tYXJ5R3JvdXBzfVxuICAgICAgICAgICAgaW50ZWdyaXR5RGF5cz17aW50ZWdyaXR5RGF5c31cbiAgICAgICAgICAgIGludGVncml0eUNvbXBsZXRlZERheXM9e2ludGVncml0eUNvbXBsZXRlZERheXN9XG4gICAgICAgICAgLz4gKi99XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIHtzaG93UGxhbk1vZGFsICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ1cGxvYWRfb3ZlcmxheVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicGxhbi1zZWxlY3Rpb24tbW9kYWwgZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAge3RyaWFsUGVyaW9kRXhwaXJlZCA/IChcbiAgICAgICAgICAgICAgPGgyPllvdXIge1RSSUFMX1BFUklPRF9EQVlTfS1EYXkgT25ib2FyZGluZyBFbmRlZDwvaDI+XG4gICAgICAgICAgICApIDogc3Vic2NyaXB0aW9uUGVyaW9kRXhwaXJlZCA/IChcbiAgICAgICAgICAgICAgPGgyPllvdXIgU3Vic2NyaXB0aW9uIHdhcyBFeHBpcmVkPC9oMj5cbiAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgIDxoMj5QbGVhc2UgU3Vic2NyaWJlPC9oMj5cbiAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cImN1c19wX3RleHRcIj5MZXTigJlzIGtlZXAgbWVldGluZyBuZXcgcGVvcGxlLjwvcD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicm93IGN1c19tb2RhbF9pbWdfYnRuIGZsZXgtd3JhcCBmbGV4LXNtLW5vd3JhcFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbC1sZy00IGNvbC1tZC00IGNvbC1zbS0xMiBjb2wteHMtMTIgbW9kYWwtaW1hZ2VcIj5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9tZWRpYS9taXNjLzMwZGF5c0V4cGlyZWQucG5nXCIgYWx0PVwiUGxhbiBJbGx1c3RyYXRpb25cIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbC1sZy04IGNvbC1tZC04IGNvbC1zbS0xMiBjb2wteHMtMTIgbW9kYWwtb3B0aW9ucyBtcy0yIHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlUGxhblNlbGVjdCh5ZWFybHlQcmljZSl9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJwbGFuc19idG4gIHllYXJseV9wbGFuIFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgQ29udGludWUgYXQgJDk3L21vbnRoXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgICAgICBKdXN0IHNoYXJlIHlvdXIgcmVzdWx0cyB0byB1bmxvY2sgb3ZlciA1MCUgb2ZmLlxuICAgICAgICAgICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgICAgICAgICAgVG9kYXkgb25seS4gTm90IGF2YWlsYWJsZSBsYXRlci5cbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cImgxIHRleHQtZGFyayBmdy1ib2xkIGN1c19vcl90eHRfc2V0XCI+T1I8L3A+XG5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVQbGFuU2VsZWN0KG1vbnRobHlQcmljZSl9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJwbGFuc19idG4gIG1vbnRobHlfcGxhbiBcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICQxOTcvbW9udGhcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgIE5vIHJlc3VsdHMgdmlkZW88c3BhbiBjbGFzc05hbWU9XCJxdWVzdGlvbi1tYXJrLXRhZ1wiPj88L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgICAgICAgIE5vIHdvcnJpZXMsIG9ubHkgJDE5Ny9tb250aC5cbiAgICAgICAgICAgICAgICA8L3A+XG5cbiAgICAgICAgICAgICAgICB7YXV0aG9yaXRpZXMuaW5jbHVkZXMoc3lzdGVtQXV0aG9yaXRpZXMuQUxMT1dfT05FX1RJTUVfUEFZTUVOVF9GRUFUVVJFKSAmJiAoXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZVBsYW5TZWxlY3QobGl2ZXBsYW4pfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJwbGFuc19idG4gIHllYXJseV9wbGFuIFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIENvbnRpbnVlICQxL01vbnRoXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG5cbiAgICAgIHtpc09wZW4gJiYgKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInVwbG9hZF9vdmVybGF5XCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbF9wcmljaW5nXCIgb25DbGljaz17KGUpID0+IGUuc3RvcFByb3BhZ2F0aW9uKCl9PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjdXNfbW9kYWxfY29udGVudF9wcmljZV9zc2ZcIj5cbiAgICAgICAgICAgICAgey8qIEJhY2sgYnV0dG9uICovfVxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwic3NmLWJhY2staWNvblwiXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgc2V0SXNPcGVuKGZhbHNlKVxuICAgICAgICAgICAgICAgICAgc2V0U2hvd1BsYW5Nb2RhbCh0cnVlKVxuICAgICAgICAgICAgICAgICAgbmF2aWdhdGUoYC8ke0NVUkVFTlRfQ09NUEFOWV9OQU1FfS9jaGVja2xpc3RgKVxuICAgICAgICAgICAgICAgI
2386H19XG4gICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgICAgICAgICB0b3A6IFwiMThweFwiLFxuICAgICAgICAgICAgICAgICAgbGVmdDogXCIxOHB4XCIsXG4gICAgICAgICAgICAgICAgICBmb250U2l6ZTogXCIxOHB4XCIsXG4gICAgICAgICAgICAgICAgICBmb250V2VpZ2h0OiBcImJvbGRcIixcbiAgICAgICAgICAgICAgICAgIGN1cnNvcjogXCJwb2ludGVyXCIsXG4gICAgICAgICAgICAgICAgICBjb2xvcjogXCIjMzMzXCIsXG4gICAgICAgICAgICAgICAgICBwYWRkaW5nOiBcIjZweCAxOHB4XCIsXG4gICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiNnB4XCIsXG4gICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiBcIiNmMWYxZjFcIixcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIG9uTW91c2VFbnRlcj17KGUpID0+IHtcbiAgICAgICAgICAgICAgICAgIGUuY3VycmVudFRhcmdldC5zdHlsZS5iYWNrZ3JvdW5kID0gXCIjZTJlMmUyXCJcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIG9uTW91c2VMZWF2ZT17KGUpID0+IHtcbiAgICAgICAgICAgICAgICAgIGUuY3VycmVudFRhcmdldC5zdHlsZS5iYWNrZ3JvdW5kID0gXCIjZjFmMWYxXCJcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmEgZmEtYXJyb3ctbGVmdFwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY3VzX2NvbmZpcm1fdHh0X2hlYWRcIj5XaGF0IFlvdSBLZWVwICsgR2FpbjwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicm93IGp1c3RpZnktY29udGVudC1jZW50ZXIgc3NmLXBsYW5zLW1vbnRobHktY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCIgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPE1vbnRobHlJbmZvXG4gICAgICAgICAgICAgICAgICAgICAgcHJpY2VQbGFuPXtwbGFufVxuICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkU3Vic2NyaXB0aW9uUGxhbj17c2VsZWN0ZWRTdWJzY3JpcHRpb25QbGFufVxuICAgICAgICAgICAgICAgICAgICAgIGFkZE9yZGVyPXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICAgIGFkZENsaWNrRXZlbnQ9e3RydWV9XG4gICAgICAgICAgICAgICAgICAgICAgdmlkZW9FeGlzdHM9e3ZpZGVvRXhpc3RzfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cblxuICAgICAge3Nob3dVcGxvYWRWaWRlbyAmJiAoXG4gICAgICAgIDxVcGxvYWRWaWRlb1xuICAgICAgICAgIHNlbGVjdGVkUGxhbj17c2VsZWN0ZWRQbGFufVxuICAgICAgICAgIHNlbGVjdGVkU3Vic2NyaXB0aW9uUGxhbkRldGFpbHM9e3N1YnNjcmlwdGlvblBsYW5EZXRhaWxzfVxuICAgICAgICAgIG9uT2tDbGljaz17aGFuZGxlU2hvd1N0ZXBzUG9wVXB9XG4gICAgICAgICAgb25CYWNrPXsoKSA9PiB7XG4gICAgICAgICAgICBzZXRTaG93VXBsb2FkVmlkZW8oZmFsc2UpXG4gICAgICAgICAgICBzZXRTaG93UGxhbk1vZGFsKHRydWUpXG4gICAgICAgICAgfX1cbiAgICAgICAgLz5cbiAgICAgICl9XG4gICAgPC9Db250ZW50PlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IENoZWNrbGlzdFBhZ2VcbiJdLCJuYW1lcyI6WyJheGlvcyIsIlN3YWwiLCJ1c2VFZmZlY3QiLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsInVzZU5hdmlnYXRlIiwiQ1VSRUVOVF9DT01QQU5ZX05BTUUiLCJEQVlfU1RSSU5HIiwiQ0hFQ0tfVVNFUl9WSURFT19FWElTVCIsIkdFVF9DSEVDS0xJU1QiLCJHRVRfQUxMX1NVQlNDUklQVElPTlBMQU5TIiwiR0VUX0NBTVBBSUdOU19CWV9DT01QQU5ZX1VTRVJfQU5EX0ZCX0FDQyIsIkxJRkVUSU1FX1NUUklORyIsIkxJVkVfUExBTiIsIk1PTlRITFlfUExBTl9QUklDRSIsIk1PTlRIX1NUUklORyIsIlBPU1RfU0FWRV9UQVNLX1ZBTFVFIiwic3lzdGVtQXV0aG9yaXRpZXMiLCJUUklBTF9QRVJJT0RfREFZUyIsIldFRUtfU1RSSU5HIiwiWUVBUkxZX1BMQU5fUFJJQ0UiLCJZRUFSX1NUUklORyIsIkRhdGVSYW5nZVNlbGVjdG9yIiwidXNlQXV0aCIsIkRBVEVfRk9STUFUX01NTU1fRERfWVlZWSIsImdldFVzZXJUaW1lWm9uZUJhc2VkQ3VycmVudERhdGUiLCJEYWlseUFjdGl2aXR5TG9nIiwiRmluZFByb3NwZWN0c092ZXJ2aWV3IiwiU3RhcnRDb252ZXJzYXRpb25zU2VjdGlvbiIsIkNoZWNrbGlzdFNlY3Rpb24iLCJDb250ZW50IiwiZGlzYWJsZVNwbGFzaFNjcmVlbiIsImVuYWJsZVNwbGFzaFNjcmVlbiIsImdldFVzZXJCeVRva2VuIiwiVXBsb2FkVmlkZW8iLCJNb250aGx5SW5mbyIsIkRhdGVQaWNrZXIiLCJyZWdpc3RlckxvY2FsZSIsImVuR0IiLCJpc092ZXJhbGxWYWxpZGF0aW9uRXJyb3JNZXNzYWdlIiwibWVzc2FnZSIsInR5cGUiLCJ0ZXh0IiwiaXNWYWxpZFJhbmdlIiwidmFsdWUiLCJkZWZhdWx0U2VjdGlvbk1ldGEiLCJudW1iZXIiLCJ0aXRsZSIsIkNvbW11bml0eSIsIlN1Y2Nlc3MiLCJnZXRTZWN0aW9uTWV0YSIsInNlY3Rpb24iLCJmYWxsYmFja05hbWUiLCJmYWxsYmFjayIsInVuZGVmaW5lZCIsImRpc3BsYXlPcmRlciIsIm5hbWUiLCJnZXRQcm92aWRlclBsYXRmb3JtSWQiLCJwcm92aWRlciIsInBsYXRmb3JtSWQiLCJpZCIsImlzRmFjZWJvb2tQcm92aWRlciIsInRvTG93ZXJDYXNlIiwiaW5jbHVkZXMiLCJyZXNvbHZlU29jaWFsUHJvdmlkZXJzIiwicHJvdmlkZXJzIiwiZmFjZWJvb2tQcm92aWRlciIsImZpbmQiLCJvdGhlclByb3ZpZGVyIiwiZ2V0TGlmZXRpbWVDb252ZXJzaW9uUmF0ZUNhcmQiLCJzZWN0aW9ucyIsInRvdGFsU2VjdGlvbnMiLCJsZW5ndGgiLCJjb21wbGV0ZWRTZWN0aW9ucyIsImZpbHRlciIsImFsbFRhc2tDb21wbGV0ZWQiLCJwZXJjZW50YWdlIiwiTWF0aCIsInJvdW5kIiwiY29uc29sZSIsImxvZyIsIm1hcCIsImZvcm11bGEiLCJyYXdQZXJjZW50YWdlIiwicm91bmRlZFBlcmNlbnRhZ2UiLCJjbGFzc05hbWUiLCJsYWJlbCIsImdldExpZmV0aW1lQ29udmVyc2lvblJhdGVEYXRhIiwidG9uZUNsYXNzTmFtZSIsImJhZGdlVGV4dCIsImdldEluaXRpYWxUb2dnbGVWYWx1ZXMiLCJyZWR1Y2UiLCJhY2MiLCJ0YXNrcyIsImZvckVhY2giLCJ0YXNrIiwiaW5wdXRUeXBlIiwiYm9vbGVhblZhbHVlIiwibm9ybWFsaXplQ2hlY2tsaXN0VmFsdWUiLCJ0cmltbWVkVmFsdWUiLCJ0cmltIiwibnVtZXJpY1ZhbHVlIiwiTnVtYmVyIiwiaXNOYU4iLCJmb3JtYXRDaGVja2xpc3RFbnRyeURhdGUiLCJkYXRlIiwieWVhciIsImdldEZ1bGxZZWFyIiwibW9udGgiLCJTdHJpbmciLCJnZXRNb250aCIsInBhZFN0YXJ0IiwiZGF5IiwiZ2V0RGF0ZSIsImhvdXJzIiwiZ2V0SG91cnMiLCJtaW51dGVzIiwiZ2V0TWludXRlcyIsImZvcm1hdENoZWNrbGlzdEZpbHRlckRhdGUiLCJwYXJzZUZpbHRlckRhdGUiLCJub3JtYWxpem
2386VkIiwicmVwbGFjZSIsInBhcnNlZCIsIkRhdGUiLCJnZXRUaW1lIiwiZm9ybWF0U2hvcnREYXRlIiwiSW50bCIsIkRhdGVUaW1lRm9ybWF0IiwiZm9ybWF0IiwiZm9ybWF0TW9udGhZZWFyIiwiZ2V0V2Vla1JhbmdlTGFiZWwiLCJnZXREYXkiLCJkaWZmIiwid2Vla1N0YXJ0Iiwic2V0RGF0ZSIsIndlZWtFbmQiLCJzYW1lTW9udGgiLCJzYW1lWWVhciIsInN0YXJ0RGF5IiwiZW5kRGF5IiwiYnVpbGRBY3Rpdml0eUhlYWRlckxhYmVsIiwic2VsZWN0ZWRSYW5nZSIsInNlbGVjdGVkRGF0ZSIsImhhc0FkdmFuY2VkRGF0ZUZpbHRlciIsInN0YXJ0RGF0ZSIsImVuZERhdGUiLCJmcm9tRGF0ZSIsInRvRGF0ZSIsInRvRGF0ZVN0cmluZyIsImJ1aWxkVGFza1ZhbHVlVXBkYXRlIiwidGFza0lkIiwibm9ybWFsaXplZFZhbHVlIiwibnVtYmVyVmFsdWUiLCJwYXJzZWROdW1iZXJWYWx1ZSIsImdldERpc3BsYXlOdW1iZXJWYWx1ZSIsInJlc29sdmVDaGVja2xpc3RFbnRyeUlkIiwicGF5bG9hZCIsImNhbmRpZGF0ZUlkcyIsImVudHJ5SWQiLCJlbnRyeV9pZCIsImNhbmRpZGF0ZSIsImlzRmluaXRlIiwiZ2V0UHJvdmlkZXJUYXNrSWQiLCJraW5kIiwic2VudFRhc2tJZCIsImZyaWVuZFJlcXVlc3RTZW50VGFza0lkIiwiYWNjZXB0ZWRUYXNrSWQiLCJmcmllbmRSZXF1ZXN0QWNjZXB0ZWRUYXNrSWQiLCJjYWxjdWxhdGVMaWZldGltZUFjY2VwdGFuY2VSYXRlIiwib3ZlcmFsbFNlbnQiLCJvdmVyYWxsQWNjZXB0ZWQiLCJhY2NlcHRhbmNlUmF0ZSIsImdldExpZmV0aW1lQWNjZXB0YW5jZVJhdGUiLCJpc0ZhY2Vib29rIiwibG9nTGlmZXRpbWVBY2NlcHRhbmNlUmF0ZSIsInNlY3Rpb25OYW1lIiwicHJvdmlkZXJMYWJlbCIsInNlbnQiLCJhY2NlcHRlZCIsInNvdXJjZSIsImFwaVZhbHVlIiwibWFwVGFza3NUb1Jvd3MiLCJvbkF1dG9zYXZlIiwidG9nZ2xlVmFsdWVzIiwiYWxsb3dFZGl0IiwiY2hpbGRyZW5CeVBhcmVudCIsIk1hcCIsInJvb3RUYXNrcyIsInBhcmVudElkIiwicHVzaCIsInNpYmxpbmdzIiwiZ2V0Iiwic2V0Iiwic29ydFRhc2tzIiwiaXRlbXMiLCJzb3J0IiwiYSIsImIiLCJmbGF0dGVuVGFza3MiLCJkZXB0aCIsImZsYXRNYXAiLCJjaGlsZFJvd3MiLCJoYXNFeHBsaWNpdElucHV0IiwiaXNHcm91cExhYmVsIiwiaW5kZW50TGV2ZWwiLCJUb2dnbGVTd2l0Y2giLCJjaGVja2VkIiwib25DaGFuZ2UiLCJvblZhbHVlQ29tbWl0IiwibWFwUHJvdmlkZXJUb1Jvd3MiLCJvcHRpb25zIiwiY2FsY3VsYXRlZEFjY2VwdGFuY2VSYXRlIiwibGlmZXRpbWVBY2NlcHRhbmNlVG9uZUNsYXNzIiwiZW1wdHlNaXNzaW5nVmFsdWVzIiwiaXNFZGl0YWJsZSIsInJlc29sdmVkU2VudFZhbHVlIiwic2VudFZhbHVlT3ZlcnJpZGUiLCJyZXNvbHZlZEFjY2VwdGVkVmFsdWUiLCJhY2NlcHRlZFZhbHVlT3ZlcnJpZGUiLCJzZW50VmFsdWUiLCJhY2NlcHRlZFZhbHVlIiwiaXNPdGhlclBsYXRmb3Jtc1Byb3ZpZGVyIiwibm9ybWFsaXplUHJvdmlkZXJGaWVsZFZhbHVlIiwiZmllbGRWYWx1ZSIsInBhcnNlZFZhbHVlIiwidmFsaWRhdGVPdmVyYWxsQ29uc3RyYWludCIsIm5leHRWYWx1ZSIsImZpZWxkIiwiaXNWYWxpZCIsInBhcnNlZE5leHRWYWx1ZSIsImN1cnJlbnRTZW50VmFsdWUiLCJjdXJyZW50QWNjZXB0ZWRWYWx1ZSIsIm5leHRTZW50VmFsdWUiLCJuZXh0QWNjZXB0ZWRWYWx1ZSIsImJhc2VPdmVyYWxsU2VudCIsImJhc2VPdmVyYWxsQWNjZXB0ZWQiLCJvcmlnaW5hbERheVNlbnQiLCJvcmlnaW5hbERheUFjY2VwdGVkIiwidG90YWxTZW50IiwidG90YWxBY2NlcHRlZCIsIm9uTWVzc2FnZSIsInZhbGlkYXRlTmV4dFZhbHVlIiwidmFsaWRhdGlvbiIsIm9uVmFsdWVDaGFuZ2UiLCJkaXYiLCJwZXJjZW50IiwiaXNibHVlIiwiaXNPcmFuZ2UiLCJiZ0NvbG9yIiwic3R5bGUiLCJiYWNrZ3JvdW5kIiwidmFsdWVDbGFzc05hbWUiLCJpdGVtQ2xhc3NOYW1lIiwiY3JlYXRlU3VjY2Vzc0NvbnZlcnNpb25Sb3ciLCJjb252ZXJzaW9uUmF0ZSIsImNvbnZlcnRlZENvdW50IiwidG90YWxDb3VudCIsIm1hcFN1Y2Nlc3NUb1Jvd3MiLCJzb3J0ZWRUYXNrcyIsImhhc0NvbnZlcnNpb25UYXNrIiwic29tZSIsImxpZmV0aW1lQ29udmVyc2lvblJhdGUiLCJyb3dzIiwiaXNDb252ZXJzaW9uVGFzayIsImlucHV0Q2xhc3NOYW1lIiwibWFwQ2hhcnRUb0ludGVncml0eURheXMiLCJjaGFydFJl
2386c3BvbnNlIiwibWFwcGVkSW50ZWdyaXR5RGF5cyIsImVudHJ5RGF0ZSIsInNsaWNlIiwiaXRlbSIsImNvbXBsZXRlZCIsImNvbXBsZXRlZENvdW50IiwiaW5wdXQiLCJkaXNhYmxlZCIsImUiLCJ0YXJnZXQiLCJyZWFkT25seSIsInNwYW4iLCJDaGVja2xpc3RQYWdlIiwibmF2aWdhdGUiLCJjdXJyZW50VXNlciIsInNldEN1cnJlbnRVc2VyIiwiYXV0aCIsImF1dGhvcml0aWVzIiwiY29tcGFuaWVzIiwic2V0U2VsZWN0ZWRSYW5nZSIsInNldEZpbHRlciIsInNldFNlbGVjdGVkRGF0ZSIsImlzQ3VzdG9tRGF0ZUZpbHRlckFjdGl2ZSIsInNldElzQ3VzdG9tRGF0ZUZpbHRlckFjdGl2ZSIsImlzRGF0ZVBpY2tlck9wZW4iLCJzZXRJc0RhdGVQaWNrZXJPcGVuIiwiZGF0ZVBpY2tlclJlZiIsImFjdGl2aXR5Iiwic2V0QWN0aXZpdHkiLCJkb25lIiwicmVtYWluaW5nIiwidG90YWwiLCJzZWxlY3RlZENhbXBhaWduIiwic2V0U2VsZWN0ZWRDYW1wYWlnbiIsImlzSW5pdGlhbGl6aW5nQ2FtcGFpZ24iLCJzZXRJc0luaXRpYWxpemluZ0NhbXBhaWduIiwiZmluZFByb3NwZWN0c092ZXJ2aWV3UmVmIiwiZmluZERhdGEiLCJzZXRGaW5kRGF0YSIsIm90aGVyU29jaWFsRGF0YSIsInNldE90aGVyU29jaWFsRGF0YSIsInJlbGF0aW9uc2hpcERhdGEiLCJzZXRSZWxhdGlvbnNoaXBEYXRhIiwic3RheUNvbm5lY3RlZERhdGEiLCJzZXRTdGF5Q29ubmVjdGVkRGF0YSIsInN0YXJ0Q29udmVyc2F0aW9uRGF0YSIsInNldFN0YXJ0Q29udmVyc2F0aW9uRGF0YSIsImNvbW11bml0eURhdGEiLCJzZXRDb21tdW5pdHlEYXRhIiwiZ3Jvd3RoRGF0YSIsInNldEdyb3d0aERhdGEiLCJzZWN0aW9uTWV0YSIsInNldFNlY3Rpb25NZXRhIiwiaW50ZWdyaXR5RGF5cyIsInNldEludGVncml0eURheXMiLCJpbnRlZ3JpdHlDb21wbGV0ZWREYXlzIiwic2V0SW50ZWdyaXR5Q29tcGxldGVkRGF5cyIsInNldFRvZ2dsZVZhbHVlcyIsInNlY3Rpb25zU3RhdGUiLCJzZXRTZWN0aW9uc1N0YXRlIiwicHJvdmlkZXJzU3RhdGUiLCJzZXRQcm92aWRlcnNTdGF0ZSIsImFsbG93T3RoZXJQbGF0Zm9ybXNFZGl0Iiwic2V0QWxsb3dPdGhlclBsYXRmb3Jtc0VkaXQiLCJmaW5kUHJvc3BlY3RzTWVzc2FnZSIsInNldEZpbmRQcm9zcGVjdHNNZXNzYWdlIiwibG9hZGluZyIsInNldExvYWRpbmciLCJzYXZlTG9hZGluZyIsInNldFNhdmVMb2FkaW5nIiwiZXJyb3IiLCJzZXRFcnJvciIsInBlbmRpbmdDaGVja2xpc3RDaGFuZ2VzIiwic2V0UGVuZGluZ0NoZWNrbGlzdENoYW5nZXMiLCJ5ZWFybHlQcmljZSIsIm1vbnRobHlQcmljZSIsImxpdmVwbGFuIiwic3Vic2NyaXB0aW9uUGxhbkRldGFpbHMiLCJzZXRTdWJzY3JpcHRpb25QbGFuRGV0YWlscyIsInNlbGVjdGVkU3Vic2NyaXB0aW9uUGxhbiIsInNldFNlbGVjdGVkU3Vic2NyaXB0aW9uUGxhbiIsInNob3dQbGFuTW9kYWwiLCJzZXRTaG93UGxhbk1vZGFsIiwic2VsZWN0ZWRQbGFuIiwic2V0U2VsZWN0ZWRQbGFuIiwiaXNPcGVuIiwic2V0SXNPcGVuIiwic2hvd1VwbG9hZFZpZGVvIiwic2V0U2hvd1VwbG9hZFZpZGVvIiwicGxhbiIsInNldFBsYW4iLCJ2aWRlb0V4aXN0cyIsInNldFZpZGVvRXhpc3RzIiwidHJpYWxQZXJpb2RFeHBpcmVkIiwic2V0VHJhaWxQZXJpb2RFeHBpcmVkIiwic3Vic2NyaXB0aW9uUGVyaW9kRXhwaXJlZCIsInNldFN1YnNjcmlwdGlvblBlcmlvZEV4cGlyZWQiLCJzdW1tYXJ5UGVyZiIsInNldFN1bW1hcnlQZXJmIiwiZGF5c0NvbXBsZXRlZCIsImRheXNUb3RhbCIsImF2Z0NvbXBsZXRpb24iLCJjb25zZWN1dGl2ZURheXMiLCJzdW1tYXJ5R3JvdXBzIiwic2V0U3VtbWFyeUdyb3VwcyIsImluaXRpYWxpemVSdW5uaW5nQ2FtcGFpZ24iLCJyZXN1bHQiLCJyZXNwb25zZURhdGEiLCJkYXRhIiwiQXJyYXkiLCJpc0FycmF5IiwicnVubmluZ0NhbXBhaWduIiwiY2FtcGFpZ24iLCJjYW1wYWlnblN0YXR1cyIsInN0YXR1cyIsInNlbGVjdGVkIiwidXVpZCIsImhhbmRsZVJhbmdlQ2hhbmdlIiwicmFuZ2UiLCJoYW5kbGVGaWx0ZXJDaGFuZ2UiLCJuZXh0RmlsdGVyIiwiZnJlcXVlbmN5VHlwZSIsImFwaV90b2tlbiIsImluaXQiLCJyZXNwb25zZSIsInVzZXIiLCJpc1RyaWFsRXhwaXJlZCIsInRyaWFsUGVyaW9kQ29tcGxldGVkIiwiaXNTdWJzY3JwdGlvbkNvbXBsZXRlZCIsInN1YnNjcmlwdGlvblBlcmlvZENvbXBsZXRlZCIsImlzU3Vic2NyaXB0aW9uUGVyaW9kIiwic3Vic2NyaXB0aW9uUGVyaW9kIiwiZ2V0U3Vic2NyaXB0aW9uUGxhbkRldGFpbHMiLCJoYW5kbGVQbGFuU2VsZWN0IiwidGFyZ2V0ZWRQcmljZSIsImdldFBsYW5EZXRhaWxzQnlTZWxsUHJpY2UiLCJoYXNWaWRlbyIsImNoZWNrVXNlclZpZGVvRXhpc3QiLCJoYW5kbGVTaG93U3RlcHNQb3BVcCIsInBsYW5zIiwidGFyZ2V0UHJpY2UiLCJwcmljZUFzTnVtYmVyIiwicGFyc2VGbG9hdCIsIm1hdGNoZWRQbGFuIiwic2VsbFByaWNlIiwiaGFuZGxlQ2hlY2tsaXN0RGF0ZUNoYW5nZSIsImN1cnJlbnQiLCJzdGF0dXNOYW1lIiwibmFtZXMiLCJub3JtYWxpemVOdW1lcmljQXV0b3NhdmVWYWx1ZSIsInZhbGlkYXRlRmluZFByb3NwZWN0c0F1dG9zYXZlIiwicHJvdmlkZXJOYW1lIiwiZmluZFByb3NwZWN0c1Rhc2tzIiwibm9ybWFsaXplZFByb3ZpZGVyTmFtZSIsIm1hdGNoZWRQcm92aWRlciIsInNhbWVQbGF0Zm9ybUlkIiwic2FtZVByb3ZpZGVyTmFtZSIsInBlbmRpbmdTZW50VmFsdWUiLCJwZW5kaW5nQWNjZXB0ZWRWYWx1ZSIsIm5leHRTZW50IiwibmV4dEFjY2VwdGVkIiwiYnVpbGRDaGVja2xpc3RTdGF0ZUZyb21QYXlsb2FkIiwidG90YWxUYXNrIiwidGFza0NvbXBsZXRlZCIsImxlZnRUYXNrIiwibWF4Iiwic2VjdGlvbnNCeU5hbWUiLCJzbVByb3ZpZGVycyIsInNlbnRUYXNrIiwiYWNjZXB0ZWRUYXNrIiwiaGFuZGxlQ2hlY2tsaXN0QXV0b3NhdmUiLCJ0cmVhdFplcm9Bc0VtcHR5IiwiaW50ZWdyaXR5Q2hhcnREYXlzIiwiY2hhcnRUYXNrQ29tcGxldGVkQ291bnREYXkiLCJjb21wbGV0ZWREYXlzIiwiYnVpbGRSZWxhdGlvbnNoaXBUYXNrcyIsInN1Y2Nlc3NUYXNrcyIsInByb3NwZWN0c1Jlc3BvbmRlZFRhc2siLCJsaWZldGltZUNvbnZlcnNpb25SYXRlQ2FyZCIsInRhZ0NsYXNzIiwiZmV0Y2hDaGVja2xpc3REYXRhIiwic2lsZW50IiwiY29tcGFueU5hbWUiLCJicm93c2VyVGltZXpvbmUiLCJyZXNvbHZlZE9wdGlvbnMiLCJ0aW1lWm9uZSIsImNhbXBhaWduVXVpZCIsInJlcXVlc3RQYXlsb2FkIiwidXJsIiwicG9zdCIsImFmdGVyU2F2ZSIsInN1Y2Nlc3MiLCJlcnIiLCJoYW5kbGVDYW1wYWlnbkNoYW5nZSIsIm9wdGlvbiIsInRvZGF5RGF0ZSIsInJlc29sdmVDaGVja2xpc3RFbnRyeURhdGUiLCJhZHZhbmNlZEZpbHRlckRhdGUiLCJpc1ZhbGlkQXV0b3NhdmUiLCJ0YXNrVmFsdWVVcGRhdGUiLCJ0aW1lem9uZSIsInZhbHVlcyIsImlzT3RoZXJQbGF0Zm9ybXNBdXRvc2F2ZSIsIndpbmRvdyIsInNjcm9sbFRvIiwidGltZW91dElkIiwic2V0VGltZW91dCIsImNsZWFyVGltZW91dCIsImlzSW5pdGlhbERhdGFMb2FkZWQiLCJsb2FkQ2hlY2tsaXN0UGFnZSIsImhhbmRsZVNhdmVEYWlseVN5c3RlbSIsImVycm9yTWVzc2FnZSIsImZpcmUiLCJpY29uIiwiY29uZmlybUJ1dHRvblRleHQiLCJ
2386jb25maXJtQnV0dG9uQ29sb3IiLCJwZW5kaW5nVmFsdWVzIiwiT2JqZWN0IiwibWF4U2VsZWN0YWJsZURhdGUiLCJpc0lubGluZURhdGVGaWx0ZXJBY3RpdmUiLCJhY3Rpdml0eUhlYWRlckxhYmVsIiwiZmluZFByb3NwZWN0c01ldGEiLCJzdGFydENvbnZlcnNhdGlvbnNNZXRhIiwiYnVpbGRSZWxhdGlvbnNoaXBzTWV0YSIsInN0YXlDb25uZWN0ZWRNZXRhIiwiY29tbXVuaXR5TWV0YSIsInN1Y2Nlc3NNZXRhIiwiZmFjZWJvb2tBY2NlcHRhbmNlUmF0ZSIsIm90aGVyQWNjZXB0YW5jZVJhdGUiLCJpc1NlY3Rpb25Db21wbGV0ZSIsImgxIiwicCIsIm9uUmFuZ2VDaGFuZ2UiLCJpc1VzZXJUYWJsZSIsInBsYW5UeXBlIiwiaXNEcm9wZG93biIsImlzT3ZlcmFsbFJlcXVpcmVkIiwiaXNEYXlSZXF1aXJlZCIsInBvc2l0aW9uIiwiaW1nIiwic3JjIiwiYWx0Iiwib25DbGljayIsInJlZiIsIm9wZW4iLCJvbklucHV0Q2xpY2siLCJvbkNsaWNrT3V0c2lkZSIsIm9uQ2FsZW5kYXJDbG9zZSIsImRhdGVGb3JtYXQiLCJtYXhEYXRlIiwibG9jYWxlIiwiZGF0ZUxhYmVsIiwiZmFjZWJvb2tEYXRhIiwiaXNDb21wbGV0ZSIsIm9uQ2FtcGFpZ25DaGFuZ2UiLCJpc0luaXRpYWxpemVkIiwiaW5mbyIsImJ1dHRvbiIsImgyIiwiYnIiLCJBTExPV19PTkVfVElNRV9QQVlNRU5UX0ZFQVRVUkUiLCJzdG9wUHJvcGFnYXRpb24iLCJ0b3AiLCJsZWZ0IiwiZm9udFNpemUiLCJmb250V2VpZ2h0IiwiY3Vyc29yIiwiY29sb3IiLCJwYWRkaW5nIiwiYm9yZGVyUmFkaXVzIiwib25Nb3VzZUVudGVyIiwiY3VycmVudFRhcmdldCIsIm9uTW91c2VMZWF2ZSIsImkiLCJwcmljZVBsYW4iLCJhZGRPcmRlciIsImFkZENsaWNrRXZlbnQiLCJzZWxlY3RlZFN1YnNjcmlwdGlvblBsYW5EZXRhaWxzIiwib25Pa0NsaWNrIiwib25CYWNrIl0sInJhbmdlTWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs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
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.