PageSourceSearch

https://doctorassist.ai/src/dashboard/MedicalCurrentContextRule.jsx

js doctorassist.ai collected 2026-10-05 11:58:36 UTC 140,672 bytes, 1,136 lines download raw bytes

1import { createHotContext as __vite__createHotContext } from "/@vite/client";import.meta.hot = __vite__createHotContext("/src/dashboard/MedicalCurrentContextRule.jsx");import.meta.env = {"BASE_URL": "/", "DEV": true, "MODE": "development", "PROD": false, "SSR": false, "VITE_BACKEND_URL": "https://doctorassist.ai/api/", "VITE_QUALITY_CHECKER_SECRET": "another-super-secure-one-time-secret"};import __vite__cjsImport0_react_jsxDevRuntime from "/node_modules/.vite/deps/react_jsx-dev-runtime.js?v=dfc5466a"; const Fragment = __vite__cjsImport0_react_jsxDevRuntime["Fragment"]; const jsxDEV = __vite__cjsImport0_react_jsxDevRuntime["jsxDEV"];
2var _s = $RefreshSig$();
3import __vite__cjsImport1_react from "/node_modules/.vite/deps/react.js?v=dfc5466a"; const React = __vite__cjsImport1_react.__esModule ? __vite__cjsImport1_react.default : __vite__cjsImport1_react; const useState = __vite__cjsImport1_react["useState"]; const useEffect = __vite__cjsImport1_react["useEffect"]; const useRef = __vite__cjsImport1_react["useRef"];
4import { useLocation, useNavigate } from "/node_modules/.vite/deps/react-router-dom.js?v=dfc5466a";
5import logo from "/src/assets/lodo_only.png?import";
6import {
7  Home,
8  Settings,
9  Bed,
10  MessageCircle,
11  Calendar,
12  Activity,
13  LogOut,
14  UserPlus,
15  Shield,
16  Brain,
17  Stethoscope,
18  ClipboardList,
19  Gauge,
20  Sparkles,
21  Target,
22  FileText,
23  CheckCircle,
24  Plus,
25  Notebook
26} from "/node_modules/.vite/deps/lucide-react.js?v=dfc5466a";
27const API_BASE_URL = import.meta.env.VITE_BACKEND_URL;
28const T = {
29  bg: "#ffffff",
30  bgAlt: "#fafafa",
31  bgTert: "#f5f5f5",
32  text: "#000000",
33  textSec: "#444444",
34  textMuted: "#888888",
35  border: "#e0e0e0",
36  borderStr: "#000000",
37  font: "'Open Sans', sans-serif"
38};
39const SIDEBAR_W = "240px";
40const CSS = `
41  @import url('https://fonts.googleapis.com/css2?family=Open+Sans:wght@300;400;600&display=swap');
42  *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
43  ::selection { background: #000; color: #fff; }
44  body, html { font-family: ${T.font}; font-weight: 300; background: ${T.bg}; color: ${T.text}; -webkit-font-smoothing: antialiased; }
45  input, select, textarea, button { font-family: ${T.font}; font-weight: 300; }
46
47  .da-nav-btn { transition: background 0.15s, color 0.15s; }
48  .da-nav-btn:hover { background: ${T.bgAlt} !important; color: ${T.text} !important; }
49  .da-nav-btn.da-active { background: ${T.bgAlt} !important; color: ${T.text} !important; font-weight: 400 !important; border-left-color: ${T.borderStr} !important; }
50
51  .da-btn-primary:hover { background: transparent !important; color: ${T.text} !important; }
52  .da-btn-outline:hover { border-color: ${T.borderStr} !important; color: ${T.text} !important; }
53  .da-btn-ghost:hover   { background: ${T.bgAlt} !important; }
54
55  .da-tab-btn { transition: all 0.15s; cursor: pointer; }
56  .da-tab-btn:hover { background: ${T.bgAlt} !important; color: ${T.text} !important; }
57
58  .da-cat-row:hover { background: ${T.bgAlt} !important; }
59  .da-sidebar-scroll::-webkit-scrollbar { display: none; }
60  .da-sidebar-scroll { -ms-overflow-style: none; scrollbar-width: none; }
61
62  .da-list-scroll { max-height: 520px; overflow-y: auto; }
63  .da-list-scroll::-webkit-scrollbar { width: 3px; }
64  .da-list-scroll::-webkit-scrollbar-thumb { background: ${T.border}; }
65
66  .da-textarea {
67    width: 100%; padding: 0.75rem 0.875rem;
68    border: 1px solid ${T.border}; background: ${T.bg};
69    font-family: 'Courier New', monospace; font-weight: 300;
70    font-size: 0.78rem; color: ${T.text};
71    outline: none; resize: vertical; line-height: 1.6;
72    transition: border-color 0.15s;
73  }
74  .da-textarea:focus { border-color: ${T.borderStr}; }
75
76  .da-input {
77    width: 100%; height: 40px; padding: 0 0.875rem;
78    border: 1px solid ${T.border}; background: ${T.bg};
79    font-family: ${T.font}; font-weight: 300;
80    font-size: 0.82rem; color: ${T.text};
81    outline: none; transition: border-color 0.15s;
82  }
83  .da-input:focus { border-color: ${T.borderStr}; }
84  .da-input::placeholder { color: #bbb; }
85
86  @keyframes da-fadeup { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: translateY(0); } }
87  .da-fadein { animation: da-fadeup 0.18s ease; }
88`;
89const S = {
90  secLabel: {
91    fontSize: "0.6rem",
92    textTransform: "uppercase",
93    letterSpacing: "0.18em",
94    color: T.textMuted,
95    fontWeight: 400,
96    display: "block",
97    marginBottom: "0.2rem"
98  },
99  btnPrimary: {
100    padding: "0.55rem 1.25rem",
101    background: T.text,
102    color: T.bg,
103    border: `1px solid ${T.text}`,
104    fontSize: "0.75rem",
105    fontWeight: 400,
106    cursor: "pointer",
107    fontFamily: T.font,
108    transition: "all 0.15s",
109    display: "inline-flex",
110    alignItems: "center",
111    gap: "6px",
112    letterSpacing: "0.04em"
113  },
114  btnOutline: {
115    padding: "0.55rem 1.25rem",
116    background: T.bg,
117    color: T.textSec,
118    border: `1px solid ${T.border}`,
119    fontSize: "0.75rem",
120    fontWeight: 300,
121    cursor: "pointer",
122    fontFamily: T.font,
123    transition: "all 0.15s",
124    display: "inline-flex",
125    alignItems: "center",
126    gap: "6px"
127  },
128  card: {
129    background: T.bg,
130    border: `1px solid ${T.border}`,
131    padding: "1.5rem"
132  },
133  cardHeader: {
134    display: "flex",
135    alignItems: "center",
136    gap: "10px",
137    paddingBottom: "1rem",
138    marginBottom: "1.25rem",
139    borderBottom: `1px solid ${T.border}`
140  }
141};
142const MedicalCurrentContextRule = () => {
143  _s();
144  const location = useLocation();
145  const navigate = useNavigate();
146  const currentPath = location.pathname;
147  const queryParams = new URLSearchParams(location.search);
148  let doctorId = queryParams.get("doctor_id");
149  if (!doctorId) {
150    const match = location.search.match(/doctor_id=([^&]+)/);
151    if (match) doctorId = match[1];
152  }
153  const [medicalCategoriesList, setMedicalCategoriesList] = useState([]);
154  const [currentCategoriesList, setCurrentCategoriesList] = useState([]);
155  const [showNewMedicalInput, setShowNewMedicalInput] = useState(false);
156  const [showNewCurrentInput, setShowNewCurrentInput] = useState(false);
157  const [newMedicalCategory, setNewMedicalCategory] = useState("");
158  const [newCurrentCategory, setNewCurrentCategory] = useState("");
159  const [doctorName, setDoctorName] = useState("");
160  const [doctorSpeciality, setDoctorSpeciality] = useState("");
161  const [medicalCategoryRules, setMedicalCategoryRules] = useState({});
162  const [currentCategoryRules, setCurrentCategoryRules] = useState({});
163  const [doctorMedicalRulesCache, setDoctorMedicalRulesCache] = useState({});
164  const [doctorCurrentRulesCache, setDoctorCurrentRulesCache] = useState({});
165  const [focusedField, setFocusedField] = useState(null);
166  const [activeTab, setActiveTab] = useState("medical");
167  const [authChecked, setAuthChecked] = useState(false);
168  const [formData, setFormData] = useState({
169    specialty: "",
170    medicalOutputCategories: [],
171    currentOutputCategories: [],
172    medicalCategoryRules: {},
173    currentCategoryRules: {},
174    isActive: false
175  });
176  const medicalScrollRef = useRef(null);
177  const currentScrollRef = useRef(null);
178  useEffect(() => {
179    if (!doctorId) {
180      navigate("/login");
181      return;
182    }
183    fetch(`${API_BASE_URL}/hms/users/doctors/verify`, { credentials: "include" }).then((r) => r.ok ? r.json() : Promise.reject()).then((data) => {
184      if (doctorId !== data.doctor.sys_user_id) navigate("/login");
185    }).catch(() => navigate("/login")).finally(() => setAuthChecked(true));
186  }, [doctorId, navigate]);
187  useEffect(() => {
188    if (!doctorId) return;
189    fetch(`${API_BASE_URL}/hms/users/speciality/users/patient/get_doctor_details`, {
190      method: "POST",
191      headers: { "Content-Type": "application/json" },
192      body: JSON.stringify({ doctor_id: doctorId })
193    }).then((r) => r.json()).then((d) => {
194      if (d.status === "success") {
195        setDoctorName(d.doctor_name);
196        setDoctorSpeciality(d.doctor_speciality);
197      }
198    }).catch(console.error);
199  }, [doctorId]);
200  useEffect(() => {
201    if (!doctorId || !doctorSpeciality) return;
202    const load = async () => {
203      try {
204        const drRes = await fetch(`${API_BASE_URL}/hms/users/data/context/get_DoctorMedicalCurrentRule/${doctorId}`, { credentials: "include" });
205        const drData = await drRes.json();
206        if (drData.status === "success") {
207          const rule = drData.data;
208          const mCats = rule.medical_context.map((i) => i.medical_output_category);
209          const mRules = Object.fromEntries(rule.medical_context.map((i) => [i.medical_output_category, i.rule_text]));
210          const cCats = rule.current_context.map((i) => i.current_output_category);
211          const cRules = Object.fromEntries(rule.current_context.map((i) => [i.current_output_category, i.rule_text]));
212          const adminRes2 = await fetch(`${API_BASE_URL}/hms/users/data/context/get_MedicalCurrentAdminRules`, { credentials: "include" });
213          const adminData2 = await adminRes2.json();
214          if (adminData2.status === "success") {
215            const m = adminData2.data.find((r) => r.speciality === doctorSpeciality);
216            if (m) {
217              const aMCats = m.medical_context.map((i) => i.medical_output_category);
218              const aCCats = m.current_context.map((i) => i.current_output_category);
219              setMedicalCategoriesList([.../* @__PURE__ */ new Set([...aMCats, ...mCats])]);
220              setCurrentCategoriesList([.../* @__PURE__ */ new Set([...aCCats, ...cCats])]);
221            }
222          }
223          setMedicalCategoryRules(mRules);
224          setCurrentCategoryRules(cRules);
225          setDoctorMedicalRulesCache(mRules);
226          setDoctorCurrentRulesCache(cRules);
227          setFormData({ specialty: rule.speciality || "", medicalOutputCategories: mC
227ats, currentOutputCategories: cCats, medicalCategoryRules: mRules, currentCategoryRules: cRules, isActive: rule.is_active ?? true });
228          return;
229        }
230        const adminRes = await fetch(`${API_BASE_URL}/hms/users/data/context/get_MedicalCurrentAdminRules`, { credentials: "include" });
231        const adminData = await adminRes.json();
232        if (adminData.status === "success") {
233          const m = adminData.data.find((r) => r.speciality === doctorSpeciality);
234          if (!m) return;
235          const mCats = m.medical_context.map((i) => i.medical_output_category);
236          const mRules = Object.fromEntries(m.medical_context.map((i) => [i.medical_output_category, i.rule_text]));
237          const cCats = m.current_context.map((i) => i.current_output_category);
238          const cRules = Object.fromEntries(m.current_context.map((i) => [i.current_output_category, i.rule_text]));
239          setMedicalCategoriesList(mCats);
240          setCurrentCategoriesList(cCats);
241          setMedicalCategoryRules(mRules);
242          setCurrentCategoryRules(cRules);
243          setFormData({ specialty: m.speciality || "", medicalOutputCategories: mCats, currentOutputCategories: cCats, medicalCategoryRules: mRules, currentCategoryRules: cRules, isActive: true });
244        }
245      } catch (e) {
246        console.error(e);
247      }
248    };
249    load();
250  }, [doctorId, doctorSpeciality]);
251  useEffect(() => {
252    if (medicalScrollRef.current) medicalScrollRef.current.scrollTop = medicalScrollRef.current.scrollHeight;
253  }, [medicalCategoriesList]);
254  useEffect(() => {
255    if (currentScrollRef.current) currentScrollRef.current.scrollTop = currentScrollRef.current.scrollHeight;
256  }, [currentCategoriesList]);
257  const handleLogout = async () => {
258    try {
259      await fetch(`${API_BASE_URL}/hms/users/auth/logout`, { method: "POST", credentials: "include" });
260    } finally {
261      navigate("/login");
262    }
263  };
264  const handleMedicalRuleChange = (cat, val) => {
265    setMedicalCategoryRules((p) => ({ ...p, [cat]: val }));
266    setFormData((p) => ({ ...p, medicalCategoryRules: { ...p.medicalCategoryRules, [cat]: val } }));
267    setDoctorMedicalRulesCache((p) => ({ ...p, [cat]: val }));
268  };
269  const handleCurrentRuleChange = (cat, val) => {
270    setCurrentCategoryRules((p) => ({ ...p, [cat]: val }));
271    setFormData((p) => ({ ...p, currentCategoryRules: { ...p.currentCategoryRules, [cat]: val } }));
272    setDoctorCurrentRulesCache((p) => ({ ...p, [cat]: val }));
273  };
274  const handleAddMedicalCategory = () => {
275    const cat = newMedicalCategory.trim();
276    if (!cat) return;
277    setMedicalCategoriesList((p) => [...p, cat]);
278    setMedicalCategoryRules((p) => ({ ...p, [cat]: "" }));
279    setDoctorMedicalRulesCache((p) => ({ ...p, [cat]: "" }));
280    setFormData((p) => ({ ...p, medicalOutputCategories: [...p.medicalOutputCategories, cat], medicalCategoryRules: { ...p.medicalCategoryRules, [cat]: "" } }));
281    setNewMedicalCategory("");
282    setShowNewMedicalInput(false);
283    setTimeout(() => {
284      if (medicalScrollRef.current) medicalScrollRef.current.scrollTop = medicalScrollRef.current.scrollHeight;
285    }, 100);
286  };
287  const handleAddCurrentCategory = () => {
288    const cat = newCurrentCategory.trim();
289    if (!cat) return;
290    setCurrentCategoriesList((p) => [...p, cat]);
291    setCurrentCategoryRules((p) => ({ ...p, [cat]: "" }));
292    setDoctorCurrentRulesCache((p) => ({ ...p, [cat]: "" }));
293    setFormData((p) => ({ ...p, currentOutputCategories: [...p.currentOutputCategories, cat], currentCategoryRules: { ...p.currentCategoryRules, [cat]: "" } }));
294    setNewCurrentCategory("");
295    setShowNewCurrentInput(false);
296  };
297  const handleMedicalCategoryChange = async (cat) => {
298    const isSelected = formData.medicalOutputCategories.includes(cat);
299    if (isSelected) {
300      const updated = formData.medicalOutputCategories.filter((c) => c !== cat);
301      setFormData((p) => ({ ...p, medicalOutputCategories: updated }));
302    } else {
303      let ruleText = "";
304      try {
305        const res = await fetch(`${API_BASE_URL}/hms/users/data/context/get_MedicalCurrentAdminRules`, { credentials: "include" });
306        const data = await res.json();
307        if (data.status === "success") {
308          const m = data.data.find((r) => r.speciality === doctorSpeciality);
309          ruleText = m?.medical_context.find((i) => i.medical_output_category === cat)?.rule_text || "";
310        }
311      } catch {
312      }
313      const rule = doctorMedicalRulesCache[cat] ?? ruleText;
314      const updatedRules = { ...formData.medicalCategoryRules, [cat]: rule };
315      setMedicalCategoryRules(updatedRules);
316      setFormData((p) => ({ ...p, medicalOutputCategories: [...p.medicalOutputCategories, cat], medicalCategoryRules: updatedRules }));
317    }
318  };
319  const handleCurrentCategoryChange = async (cat) => {
320    const isSelected = formData.currentOutputCategories.includes(cat);
321    if (isSelected) {
322      setFormData((p) => ({ ...p, currentOutputCategories: p.currentOutputCategories.filter((c) => c !== cat) }));
323    } else {
324      let ruleText = "";
325      try {
326        const res = await fetch(`${API_BASE_URL}/hms/users/data/context/get_MedicalCurrentAdminRules`, { credentials: "include" });
327        const data = await res.json();
328        if (data.status === "success") {
329          const m = data.data.find((r) => r.speciality === doctorSpeciality);
330          ruleText = m?.current_context.find((i) => i.current_output_category === cat)?.rule_text || "";
331        }
332      } catch {
333      }
334      const rule = doctorCurrentRulesCache[cat] ?? formData.currentCategoryRules?.[cat] ?? ruleText;
335      const updatedRules = { ...formData.currentCategoryRules, [cat]: rule };
336      setCurrentCategoryRules(updatedRules);
337      setFormData((p) => ({ ...p, currentOutputCategories: [...p.currentOutputCategories, cat], currentCategoryRules: updatedRules }));
338    }
339  };
340  const handleSubmit = async (e) => {
341    e.preventDefault();
342    try {
343      const payload = {
344        doctor_id: doctorId,
345        speciality: doctorSpeciality,
346        medical_context: formData.medicalOutputCategories.map((cat) => ({ medical_output_category: cat, rule_text: formData.medicalCategoryRules[cat] || "" })),
347        current_context: formData.currentOutputCategories.map((cat) => ({ current_output_category: cat, rule_text: formData.currentCategoryRules[cat] || "" })),
348        is_active: formData.isActive
349      };
350      const res = await fetch(`${API_BASE_URL}/hms/users/data/context/save_DoctorMedicalCurrentRule`, {
351        method: "POST",
352        headers: { "Content-Type": "application/json" },
353        credentials: "include",
354        body: JSON.stringify(payload)
355      });
356      if (res.ok) alert("Configuration saved successfully.");
357      else
358        alert("Failed to save configuration.");
359    } catch (e2) {
360      console.error(e2);
361      alert("Something went wrong.");
362    }
363  };
364  if (!authChecked) return /* @__PURE__ */ jsxDEV("div", { style: { height: "100vh", display: "flex", alignItems: "center", justifyContent: "center", fontFamily: T.font, fontSize: "0.78rem", color: T.textMuted, textTransform: "uppercase", letterSpacing: "0.15em" }, children: "Verifying session…" }, void 0, false, {
365    fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
366    lineNumber: 331,
367    columnNumber: 5
368  }, this);
369  if (!doctorId) return /* @__PURE__ */ jsxDEV("div", { style: { height: "100vh", display: "flex", alignItems: "center", justifyContent: "center", fontFamily: T.font, fontSize: "0.82rem", color: T.text }, children: "Doctor ID missing. Please log in again." }, void 0, false, {
370    fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
371    lineNumber: 336,
372    columnNumber: 5
373  }, this);
374  const navItems = [
375    { label: "Dashboard", icon: /* @__PURE__ */ jsxDEV(Home, { size: 14 }, void 0, false, {
376      fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
377      lineNumber: 342,
378      columnNumber: 31
379    }, this), onClick: () => navigate(`/doctor-dashboard?doctor_id=${doctorId}`) },
380    { label: "Medical Context Skills", icon: /* @__PURE__ */ jsxDEV(Calendar, { size: 14 }, void 0, false, {
381      fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
382      lineNumber: 343,
383      columnNumber: 44
384    }, this), active: currentPath.includes("medical-current-context-rule"), onClick: () => navigate(`/medical-current-context-rule-settings?doctor_id=${doctorId}`) },
385    { label: "Structured Note Skills", icon: /* @__PURE__ */ jsxDEV(Notebook, { size: 14 }, void 0, false, {
386      fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
387      lineNumber: 344,
388      columnNumber: 44
389    }, this), onClick: () => navigate(`/structured-note-instructions-settings?doctor_id=${doctorId}`) },
390    { label: "Guidelines Skills", icon: /* @__PURE__ */ jsxDEV(FileText, { size: 14 }, void 0, false, {
391      fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
392      lineNumber: 345,
393      columnNumber: 39
394    }, this), onClick: () => navigate(`/guidelines-settings?doctor_id=${doctorId}`) }
395  ];
396  const renderCategorySection = (type) => {
397    const isMedical = type === "medical";
398    const categories = isMedical ? medicalCategoriesList : currentCategoriesList;
399    const selected = isMedical ? formData.medicalOutputCategories : formData.currentOutputCategories;
400    const rules = isMedical ? medicalCategoryRules : currentCategoryRules;
401    const scrollRef = isMedical ? medicalScrollRef : currentScrollRef;
402    const showNew = isMedical ? showNewMedicalInput : showNewCurrentInput;
403    const newVal = isMedical ? newMedicalCategory : newCurrentCategory;
404    const setShowNew = isMedical ? setShowNewMedicalInput : setShowNewCurrentInput;
405    const setNewVal = isMedical ? setNewMedicalCategory : setNewCurrentCategory;
406    const onAdd = isMedical ? handleAddMedicalCategory : handleAddCurrentCategory;
407    const onChange = isMedical ? handleMedicalCategoryChange : handleCurrentCategoryChange;
408    const onRuleChange = isMedical ? handleMedicalRuleChange : handleCurrentRuleChange;
409    const fieldPrefix = isMedical ? "medical" : "current";
410    const sectionTitle = isMedical ? "Medical Output Categories" : "Current Output Categories";
411    const sectionSub = isMedical ? "Select categories and define rules for each medical context" : "Select categories and define rules for each current patient context";
412    const Icon = isMedical ? ClipboardList : Gauge;
413    return /* @__PURE__ */ jsxDEV("div", { style: { ...S.card, marginBottom: "1.5rem" }, className: "da-fadein", children: [
414      /* @__PURE__ */ jsxDEV("div", { style: S.cardHeader, children: [
415        /* @__PURE__ */ jsxDEV("div", { style: { width: 36, height: 36, background: T.bgAlt, border: `1px solid ${T.border}`, display: "flex", alignItems: "center", justifyContent: "center", flexShrink: 0 }, children: /* @__PURE__ */ jsxDEV(Icon, { size: 16, color: T.textMuted }, void 0, false, {
416          fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
417          lineNumber: 372,
418          columnNumber: 13
419        }, this) }, void 0, false, {
420          fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
421          lineNumber: 371,
422          columnNumber: 11
423        }, this),
424        /* @__PURE__ */ jsxDEV("div", { children: [
425          /* @__PURE__ */ jsxDEV("p", { style: { fontSize: "0.9rem", fontWeight: 400, color: T.text, margin: 0 }, children: sectionTitle }, void 0, false, {
426            fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
427            lineNumber: 375,
428            columnNumber: 13
429          }, this),
430          /* @__PURE__ */ jsxDEV("p", { style: { fontSize: "0.7rem", color: T.textMuted, margin: "2px 0 0", fontWeight: 300 }, children: sectionSub }, void 0, false, {
431            fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
432            lineNumber: 376,
433            columnNumber: 13
434          }, this)
435        ] }, void 0, true, {
436          fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
437          lineNumber: 374,
438          columnNumber: 11
439        }, this),
440        /* @__PURE__ */ jsxDEV("span", { style: { marginLeft: "auto", ...S.secLabel, margin: 0 }, children: [
441          selected.length,
442          " selected"
443        ] }, void 0, true, {
444          fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
445          lineNumber: 378,
446          columnNumber: 11
447        }, this)
448      ] }, void 0, true, {
449        fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
450        lineNumber: 370,
451        columnNumber: 9
452      }, this),
453      /* @__PURE__ */ jsxDEV("div", { style: { border: `1px solid ${T.border}`, background: T.bgAlt }, children: [
454        /* @__PURE__ */ jsxDEV("div", { style: { padding: "0.65rem 1rem", borderBottom: `1px solid ${T.border}`, display: "flex", justifyContent: "space-between", alignItems: "center" }, children: /* @__PURE__ */ jsxDEV("span", { style: { fontSize: "0.65rem", textTransform: "uppercase", letterSpacing: "0.12em", color: T.textMuted }, children: [
455          "Available Categories (",
456          categories.length,
457          ")"
458        ] }, void 0, true, {
459          fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
460          lineNumber: 385,
461          columnNumber: 13
462        }, this) }, void 0, false, {
463          fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
464          lineNumber: 384,
465          columnNumber: 11
466        }, this),
467        /* @__PURE__ */ jsxDEV("div", { ref: scrollRef, className: "da-list-scroll", style: { background: T.bg }, children: categories.map((cat, i) => {
468          const isSelected = selected.includes(cat);
469          return /* @__PURE__ */ jsxDEV("div", { style: {
470            borderBottom: `1px solid ${T.border}`,
471            background: isSelected ? T.bgAlt : T.bg,
472            transition: "background 0.15s"
473          }, children: [
474            /* @__PURE__ */ jsxDEV(
475              "div",
476              {
477                className: "da-cat-row",
478                style: { display: "flex", alignItems: "center", gap: "10px", padding: "0.75rem 1rem", cursor: "pointer" },
479                onClick: () => onChange(cat),
480                children: [
481                  /* @__PURE__ */ jsxDEV(
482                    "input",
483                    {
484                      type: "checkbox",
485                      checked: isSelected,
486                      onChange: () => onChange(cat),
487                      style: { width: 15, height: 15, cursor: "pointer", accentColor: T.text, flexShrink: 0 }
488                    },
489                    void 0,
490                    false,
491                    {
492                      fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
493                      lineNumber: 404,
494                      columnNumber: 21
495                    },
496                    this
497                  ),
498                  /* @__PURE__ */ jsxDEV("span", { style: { fontSize: "0.82rem", fontWeight: isSelected ? 400 : 300, color: T.text, flex: 1 }, children: cat }, void 0, false, {
499                    fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
500                    lineNumber: 406,
501                    columnNumber: 21
502                  }, this),
503                  isSelected && /* @__PURE__ */ jsxDEV(CheckCircle, { size: 13, color: T.textMuted }, void 0, false, {
504                    fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
505                    lineNumber: 409,
506                    columnNumber: 36
507                  }, this)
508                ]
509              },
510              void 0,
511              true,
512              {
513                fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
514                lineNumber: 401,
515                columnNumber: 19
516              },
517              this
518            ),
519            isSelected && /* @__PURE__ */ jsxDEV("div", { style: { padding: "0 1rem 1rem 2.5rem", background: T.bgAlt }, children: /* @__PURE__ */ jsxDEV("div", { style: { borderLeft: `2px solid ${T.borderStr}`, paddingLeft: "0.875rem" }, children: [
520              /* @__PURE__ */ jsxDEV("label", { style: { ...S.secLabel, marginBottom: "0.35rem", display: "block" }, children: [
521                "Rule definition for ",
522                cat
523              ] }, void 0, true, {
524                fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
525                lineNumber: 416,
526                columnNumber: 25
527              }, this),
528              /* @__PURE__ */ jsxDEV(
529                "textarea",
530                {
531                  className: "da-textarea",
532                  rows: 5,
533                  value: rules[cat] || formData[`${fieldPrefix}CategoryRules`]?.[cat] || "",
534                  onChange: (e) => onRuleChange(cat, e.target.value),
535                  onFocus: () => setFocusedField(`${fieldPrefix}-${cat}`),
536                  onBlur: () => setFocusedField(null),
537                  placeholder: `Define specific rules for ${cat}…`,
538                  style: { borderColor: focusedField === `${fieldPrefix}-${cat}` ? T.borderStr : T.border }
539                },
540                void 0,
541                false,
542                {
543                  fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
544                  lineNumber: 419,
545                  columnNumber: 25
546                },
547                this
548              ),
549              /* @__PURE__ */ jsxDEV("p", { style: { fontSize: "0.65rem", color: T.textMuted, marginTop: "0.35rem", fontStyle: "italic", fontWeight: 300 }, children: [
550                "Example: For ",
551                cat,
552                ", specify clinical criteria, required assessments, and protocols."
553              ] }, void 0, true, {
554                fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
555                lineNumber: 429,
556                columnNumber: 25
557              }, this)
558            ] }, void 0, true, {
559              fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
560              lineNumber: 415,
561              columnNumber: 23
562            }, this) }, void 0, false, {
563              fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
564              lineNumber: 414,
565              columnNumber: 19
566            }, this)
567          ] }, i, true, {
568            fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
569            lineNumber: 395,
570            columnNumber: 17
571          }, this);
572        }) }, void 0, false, {
573          fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
574          lineNumber: 391,
575          columnNumber: 11
576        }, this),
577        /* @__PURE__ */ jsxDEV("div", { style: { borderTop: `1px dashed ${T.border}`, padding: "1rem" }, children: !showNew ? /* @__PURE__ */ jsxDEV(
578          "button",
579          {
580            className: "da-btn-outline",
581            style: { ...S.btnOutline, width: "100%", justifyContent: "center" },
582            onClick: () => setShowNew(true),
583            children: [
584              /* @__PURE__ */ jsxDEV(Plus, { size: 13 }, void 0, false, {
585                fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
586                lineNumber: 445,
587                columnNumber: 17
588              }, this),
589              " Add New Category"
590            ]
591          },
592          void 0,
593          true,
594          {
595            fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
596            lineNumber: 443,
597            columnNumber: 13
598          },
599          this
600        ) : /* @__PURE__ */ jsxDEV("div", { children: [
601          /* @__PURE__ */ jsxDEV(
602            "input",
603            {
604              className: "da-input",
605              style: { marginBottom: "0.75rem" },
606              type: "text",
607              value: newVal,
608              autoFocus: true,
609              onChange: (e) => setNewVal(e.target.value),
610              onKeyDown: (e) => {
611                if (e.key === "Enter") {
612                  e.preventDefault();
613                  onAdd();
614                }
615              },
616              placeholder: "Enter new category name…"
617            },
618            void 0,
619            false,
620            {
621              fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
622              lineNumber: 449,
623              columnNumber: 17
624            },
625            this
626          ),
627          /* @__PURE__ */ jsxDEV("div", { style: { display: "flex", gap: "0.625rem", justifyContent: "flex-end" }, children: [
628            /* @__PURE__ */ jsxDEV(
629              "button",
630              {
631                className: "da-btn-outline",
632                style: S.btnOutline,
633                onClick: () => {
634                  setShowNew(false);
635                  setNewVal("");
636                },
637                children: "Cancel"
638              },
639              void 0,
640              false,
641              {
642                fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
643                lineNumber: 455,
644                columnNumber: 19
645              },
646              this
647            ),
648            /* @__PURE__ */ jsxDEV("button", { className: "da-btn-primary", style: S.btnPrimary, onClick: onAdd, children: "Add Category" }, void 0, false, {
649              fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
650              lineNumber: 459,
651              columnNumber: 19
652            }, this)
653          ] }, void 0, true, {
654            fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
655            lineNumber: 454,
656            columnNumber: 17
657          }, this)
658        ] }, void 0, true, {
659          fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
660          lineNumber: 448,
661          columnNumber: 13
662        }, this) }, void 0, false, {
663          fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
664          lineNumber: 441,
665          columnNumber: 11
666        }, this)
667      ] }, void 0, true, {
668        fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
669        lineNumber: 382,
670        columnNumber: 9
671      }, this)
672    ] }, void 0, true, {
673      fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
674      lineNumber: 368,
675      columnNumber: 7
676    }, this);
677  };
678  return /* @__PURE__ */ jsxDEV(Fragment, { children: [
679    /* @__PURE__ */ jsxDEV("style", { children: CSS }, void 0, false, {
680      fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
681      lineNumber: 473,
682      columnNumber: 7
683    }, this),
684    /* @__PURE__ */ jsxDEV("div", { style: { display: "flex", minHeight: "100vh", background: T.bg, fontFamily: T.font, fontWeight: 300, color: T.text }, children: [
685      /* @__PURE__ */ jsxDEV("aside", { style: {
686        width: SIDEBAR_W,
687        minHeight: "100vh",
688        position: "fixed",
689        top: 0,
690        left: 0,
691        bottom: 0,
692        zIndex: 100,
693        background: T.bg,
694        borderRight: `1px solid ${T.border}`,
695        display: "flex",
696        flexDirection: "column"
697      }, children: [
698        /* @__PURE__ */ jsxDEV("div", { style: { padding: "1.5rem 1.5rem 1rem", borderBottom: `1px solid ${T.border}`, flexShrink: 0 }, children: [
699          /* @__PURE__ */ jsxDEV("div", { style: { display: "flex", alignItems: "center", gap: "10px", marginBottom: "1.25rem" }, children: /* @__PURE__ */ jsxDEV("span", { style: { fontSize: "0.9rem", fontWeight: 400, letterSpacing: "-0.01em", color: T.text }, children: "Doctorassist.AI" }, void 0, false, {
700            fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
701            lineNumber: 487,
702            columnNumber: 15
703          }, this) }, void 0, false, {
704            fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
705            lineNumber: 485,
706            columnNumber: 13
707          }, this),
708          /* @__PURE__ */ jsxDEV("span", { style: S.secLabel, children: "Physician" }, void 0, false, {
709            fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
710            lineNumber: 489,
711            columnNumber: 13
712          }, this),
713          /* @__PURE__ */ jsxDEV("p", { style: { fontSize: "0.85rem", fontWeight: 400, color: T.text, margin: 0 }, children: doctorName || "Loading…" }, void 0, false, {
714            fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
715            lineNumber: 490,
716            columnNumber: 13
717          }, this),
718          /* @__PURE__ */ jsxDEV("p", { style: { fontSize: "0.7rem", color: T.textMuted, marginTop: "2px" }, children: doctorSpeciality || "—" }, void 0, false, {
719            fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
720            lineNumber: 491,
721            columnNumber: 13
722          }, this)
723        ] }, void 0, true, {
724          fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
725          lineNumber: 484,
726          columnNumber: 11
727        }, this),
728        /* @__PURE__ */ jsxDEV("nav", { className: "da-sidebar-scroll", style: { flex: 1, overflowY: "auto", padding: "0.75rem 0" }, children: [
729          /* @__PURE__ */ jsxDEV("span", { style: { fontSize: "0.58rem", textTransform: "uppercase", letterSpacing: "0.15em", color: T.textMuted, padding: "0.5rem 1.25rem", display: "block" }, children: "Settings" }, void 0, false, {
730            fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
731            lineNumber: 496,
732            columnNumber: 13
733          }, this),
734          navItems.map(
735            (item, i) => /* @__PURE__ */ jsxDEV(
736              "button",
737              {
738                className: `da-nav-btn${item.active ? " da-active" : ""}`,
739                onClick: item.onClick,
740                style: {
741                  width: "100%",
742                  background: "transparent",
743                  border: "none",
744                  textAlign: "left",
745                  padding: "0.55rem 1.25rem",
746                  fontSize: "0.78rem",
747                  fontWeight: item.active ? 400 : 300,
748                  color: item.active ? T.text : T.textSec,
749                  cursor: "pointer",
750                  display: "flex",
751                  alignItems: "flex-start",
752                  gap: "10px",
753                  fontFamily: T.font,
754                  transition: "all 0.15s",
755                  lineHeight: 1.4,
756                  borderLeft: item.active ? `2px solid ${T.borderStr}` : "2px solid transparent"
757                },
758                children: [
759                  /* @__PURE__ */ jsxDEV("span", { style: { flexShrink: 0, marginTop: "2px" }, children: item.icon }, void 0, false, {
760                    fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
761                    lineNumber: 509,
762                    columnNumber: 17
763                  }, this),
764                  /* @__PURE__ */ jsxDEV("span", { children: item.label }, void 0, false, {
765                    fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
766                    lineNumber: 510,
767                    columnNumber: 17
768                  }, this)
769                ]
770              },
771              i,
772              true,
773              {
774                fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
775                lineNumber: 498,
776                columnNumber: 13
777              },
778              this
779            )
780          )
781        ] }, void 0, true, {
782          fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
783          lineNumber: 495,
784          columnNumber: 11
785        }, this),
786        /* @__PURE__ */ jsxDEV("div", { style: { padding: "1rem 1.25rem", borderTop: `1px solid ${T.border}`, flexShrink: 0 }, children: /* @__PURE__ */ jsxDEV("button", { className: "da-btn-outline", style: { ...S.btnOutline, width: "100%", justifyContent: "center" }, onClick: handleLogout, children: [
787          /* @__PURE__ */ jsxDEV(LogOut, { size: 13 }, void 0, false, {
788            fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
789            lineNumber: 518,
790            columnNumber: 15
791          }, this),
792          " Logout"
793        ] }, void 0, true, {
794          fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
795          lineNumber: 517,
796          columnNumber: 13
797        }, this) }, void 0, false, {
798          fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
799          lineNumber: 516,
800          columnNumber: 11
801        }, this)
802      ] }, void 0, true, {
803        fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
804        lineNumber: 477,
805        columnNumber: 9
806      }, this),
807      /* @__PURE__ */ jsxDEV("main", { style: { marginLeft: SIDEBAR_W, flex: 1, minWidth: 0, display: "flex", flexDirection: "column" }, children: [
808        /* @__PURE__ */ jsxDEV("div", { style: {
809          position: "sticky",
810          top: 0,
811          zIndex: 50,
812          background: T.bg,
813          borderBottom: `1px solid ${T.border}`,
814          padding: "0.875rem 2rem",
815          display: "flex",
816          justifyContent: "space-between",
817          alignItems: "center"
818        }, children: [
819          /* @__PURE__ */ jsxDEV("div", { children: [
820            /* @__PURE__ */ jsxDEV("span", { style: S.secLabel, children: "Clinical Configuration" }, void 0, false, {
821              fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
822              lineNumber: 534,
823              columnNumber: 15
824            }, this),
825            /* @__PURE__ */ jsxDEV("h1", { style: { fontSize: "1rem", fontWeight: 400, letterSpacing: "-0.01em", color: T.text, margin: 0 }, children: "Medical Current Context Instructions" }, void 0, false, {
826              fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
827              lineNumber: 535,
828              columnNumber: 15
829            }, this)
830          ] }, void 0, true, {
831            fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
832            lineNumber: 533,
833            columnNumber: 13
834          }, this),
835          /* @__PURE__ */ jsxDEV(
836            "button",
837            {
838              className: "da-btn-primary",
839              style: S.btnPrimary,
840              onClick: () => navigate(`/register-patient?doctor_id=${doctorId}`),
841              children: [
842                /* @__PURE__ */ jsxDEV(UserPlus, { size: 13 }, void 0, false, {
843                  fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
844                  lineNumber: 541,
845                  columnNumber: 15
846                }, this),
847                " Register Patient →"
848              ]
849            },
850            void 0,
851            true,
852            {
853              fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
854              lineNumber: 539,
855              columnNumber: 13
856            },
857            this
858          )
859        ] }, void 0, true, {
860          fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
861          lineNumber: 527,
862          columnNumber: 11
863        }, this),
864        /* @__PURE__ */ jsxDEV("div", { style: { padding: "1.5rem 2rem", flex: 1 }, children: [
865          /* @__PURE__ */ jsxDEV("div", { style: { border: `1px solid ${T.border}`, background: T.bgAlt, padding: "1rem 1.25rem", marginBottom: "1.5rem", display: "flex", gap: "1px", flexWrap: "wrap" }, children: [
866            { label: "Specialty", val: doctorSpeciality || "Not Set" },
867            { label: "Medical Categories", val: formData.medicalOutputCategories.length },
868            { label: "Current Categories", val: formData.currentOutputCategories.length },
869            { label: "Status", val: formData.isActive ? "Active" : "Inactive" }
870          ].map(
871            ({ label, val }) => /* @__PURE__ */ jsxDEV("div", { style: { background: T.bg, padding: "0.875rem 1.25rem", flex: "1 1 140px", minWidth: 130 }, children: [
872              /* @__PURE__ */ jsxDEV("span", { style: S.secLabel, children: label }, void 0, false, {
873                fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
874                lineNumber: 557,
875                columnNumber: 19
876              }, this),
877              /* @__PURE__ */ jsxDEV("p", { style: { fontSize: "0.95rem", fontWeight: 400, color: T.text, margin: 0 }, children: val }, void 0, false, {
878                fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
879                lineNumber: 558,
880                columnNumber: 19
881              }, this)
882            ] }, label, true, {
883              fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
884              lineNumber: 556,
885              columnNumber: 15
886            }, this)
887          ) }, void 0, false, {
888            fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
889            lineNumber: 549,
890            columnNumber: 13
891          }, this),
892          /* @__PURE__ */ jsxDEV("div", { style: { display: "flex", borderBottom: `1px solid ${T.border}`, marginBottom: "1.5rem" }, children: [
893            { key: "medical", label: "Medical Context", Icon: Brain },
894            { key: "current", label: "Current Context", Icon: Target }
895          ].map(
896            ({ key, label, Icon }) => /* @__PURE__ */ jsxDEV(
897              "button",
898              {
899                className: "da-tab-btn",
900                onClick: () => setActiveTab(key),
901                style: {
902                  padding: "0.75rem 1.25rem",
903                  background: activeTab === key ? T.bg : T.bgAlt,
904                  border: "none",
905                  borderBottom: activeTab === key ? `2px solid ${T.borderStr}` : "2px solid transparent",
906                  fontSize: "0.78rem",
907                  fontWeight: activeTab === key ? 400 : 300,
908                  color: activeTab === key ? T.text : T.textMuted,
909                  display: "inline-flex",
910                  alignItems: "center",
911                  gap: "6px",
912                  fontFamily: T.font,
913                  cursor: "pointer",
914                  marginBottom: "-1px"
915                },
916                children: [
917                  /* @__PURE__ */ jsxDEV(Icon, { size: 14 }, void 0, false, {
918                    fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
919                    lineNumber: 581,
920                    columnNumber: 19
921                  }, this),
922                  " ",
923                  label
924                ]
925              },
926              key,
927              true,
928              {
929                fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
930                lineNumber: 569,
931                columnNumber: 15
932              },
933              this
934            )
935          ) }, void 0, false, {
936            fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
937            lineNumber: 564,
938            columnNumber: 13
939          }, this),
940          /* @__PURE__ */ jsxDEV("form", { onSubmit: handleSubmit, children: [
941            activeTab === "medical" && renderCategorySection("medical"),
942            activeTab === "current" && renderCategorySection("current"),
943            /* @__PURE__ */ jsxDEV("div", { style: { border: `1px solid ${T.border}`, background: T.bgAlt, padding: "1rem 1.25rem", display: "flex", justifyContent: "space-between", alignItems: "center", flexWrap: "wrap", gap: "0.875rem" }, children: [
944              /* @__PURE__ */ jsxDEV("div", { style: { display: "flex", alignItems: "center", gap: "1.5rem", flexWrap: "wrap" }, children: [
945                /* @__PURE__ */ jsxDEV("div", { style: { display: "flex", alignItems: "center", gap: "0.75rem" }, children: [
946                  /* @__PURE__ */ jsxDEV("span", { style: { fontSize: "0.75rem", color: T.textSec, fontWeight: 300 }, children: "Rule Status:" }, void 0, false, {
947                    fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
948                    lineNumber: 600,
949                    columnNumber: 21
950                  }, this),
951                  /* @__PURE__ */ jsxDEV("div", { style: { position: "relative", width: 44, height: 24, cursor: "pointer" }, onClick: () => setFormData((p) => ({ ...p, isActive: !p.isActive })), children: [
952                    /* @__PURE__ */ jsxDEV("div", { style: {
953                      position: "absolute",
954                      inset: 0,
955                      background: formData.isActive ? T.text : T.border,
956                      transition: "background 0.2s"
957                    } }, void 0, false, {
958                      fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
959                      lineNumber: 602,
960                      columnNumber: 23
961                    }, this),
962                    /* @__PURE__ */ jsxDEV("div", { style: {
963                      position: "absolute",
964                      width: 18,
965                      height: 18,
966                      top: 3,
967                      left: formData.isActive ? 23 : 3,
968                      background: T.bg,
969                      transition: "left 0.2s"
970                    } }, void 0, false, {
971                      fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
972                      lineNumber: 607,
973                      columnNumber: 23
974                    }, this)
975                  ] }, void 0, true, {
976                    fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
977                    lineNumber: 601,
978                    columnNumber: 21
979                  }, this),
980                  /* @__PURE__ */ jsxDEV("span", { style: { fontSize: "0.7rem", textTransform: "uppercase", letterSpacing: "0.1em", color: T.textMuted }, children: formData.isActive ? "Active" : "Inactive" }, void 0, false, {
981                    fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
982                    lineNumber: 613,
983                    columnNumber: 21
984                  }, this)
985                ] }, void 0, true, {
986                  fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
987                  lineNumber: 599,
988                  columnNumber: 19
989                }, this),
990                /* @__PURE__ */ jsxDEV("div", { style: { display: "flex", gap: "1.25rem", paddingLeft: "1.25rem", borderLeft: `1px solid ${T.border}` }, children: [
991                  { label: "Medical", val: formData.medicalOutputCategories.length },
992                  { label: "Current", val: formData.currentOutputCategories.length }
993                ].map(
994                  ({ label, val }) => /* @__PURE__ */ jsxDEV("div", { style: { textAlign: "center" }, children: [
995                    /* @__PURE__ */ jsxDEV("p", { style: { fontSize: "0.6rem", color: T.textMuted, textTransform: "uppercase", letterSpacing: "0.1em", margin: "0 0 2px" }, children: label }, void 0, false, {
996                      fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
997                      lineNumber: 625,
998                      columnNumber: 25
999                    }, this),
1000                    /* @__PURE__ */ jsxDEV("p", { style: { fontSize: "1.1rem", fontWeight: 300, letterSpacing: "-0.03em", color: T.text, margin: 0 }, children: val }, void 0, false, {
1001                      fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
1002                      lineNumber: 626,
1003                      columnNumber: 25
1004                    }, this)
1005                  ] }, label, true, {
1006                    fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
1007                    lineNumber: 624,
1008                    columnNumber: 21
1009                  }, this)
1010                ) }, void 0, false, {
1011                  fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
1012                  lineNumber: 619,
1013                  columnNumber: 19
1014                }, this)
1015              ] }, void 0, true, {
1016                fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
1017                lineNumber: 596,
1018                columnNumber: 17
1019              }, this),
1020              /* @__PURE__ */ jsxDEV("div", { style: { display: "flex", gap: "0.625rem" }, children: [
1021                activeTab === "current" && /* @__PURE__ */ jsxDEV(
1022                  "button",
1023                  {
1024                    type: "button",
1025                    className: "da-btn-outline",
1026                    style: S.btnOutline,
1027                    onClick: () => setActiveTab("medical"),
1028                    children: "← Back"
1029                  },
1030                  void 0,
1031                  false,
1032                  {
1033                    fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
1034                    lineNumber: 635,
1035                    columnNumber: 19
1036                  },
1037                  this
1038                ),
1039                activeTab === "medical" && /* @__PURE__ */ jsxDEV(
1040                  "button",
1041                  {
1042                    type: "button",
1043                    className: "da-btn-primary",
1044                    style: S.btnPrimary,
1045                    onClick: () => setActiveTab("current"),
1046                    children: "Next →"
1047                  },
1048                  void 0,
1049                  false,
1050                  {
1051                    fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
1052                    lineNumber: 641,
1053                    columnNumber: 19
1054                  },
1055                  this
1056                ),
1057                activeTab === "current" && /* @__PURE__ */ jsxDEV("button", { type: "submit", className: "da-btn-primary", style: S.btnPrimary, children: [
1058                  /* @__PURE__ */ jsxDEV(CheckCircle, { size: 13 }, void 0, false, {
1059                    fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
1060                    lineNumber: 648,
1061                    columnNumber: 23
1062                  }, this),
1063                  " Save Configuration"
1064                ] }, void 0, true, {
1065                  fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
1066                  lineNumber: 647,
1067                  columnNumber: 19
1068                }, this)
1069              ] }, void 0, true, {
1070                fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
1071                lineNumber: 633,
1072                columnNumber: 17
1073              }, this)
1074            ] }, void 0, true, {
1075              fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
1076              lineNumber: 593,
1077              columnNumber: 15
1078            }, this)
1079          ] }, void 0, true, {
1080            fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
1081            lineNumber: 587,
1082            columnNumber: 13
1083          }, this)
1084        ] }, void 0, true, {
1085          fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
1086          lineNumber: 546,
1087          columnNumber: 11
1088        }, this)
1089      ] }, void 0, true, {
1090        fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
1091        lineNumber: 524,
1092        columnNumber: 9
1093      }, this)
1094    ] }, void 0, true, {
1095      fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
1096      lineNumber: 474,
1097      columnNumber: 7
1098    }, this)
1099  ] }, void 0, true, {
1100    fileName: "/app/src/dashboard/MedicalCurrentContextRule.jsx",
1101    lineNumber: 472,
1102    columnNumber: 5
1103  }, this);
1104};
1105_s(MedicalCurrentContextRule, "WM/E4pqqWfkT1JDktchIiyy7nlw=", false, function() {
1106  return [useLocation, useNavigate];
1107});
1108_c = MedicalCurrentContextRule;
1109export default MedicalCurrentContextRule;
1110var _c;
1111$RefreshReg$(_c, "MedicalCurrentContextRule");
1112import * as RefreshRuntime from "/@react-refresh";
1113const inWebWorker = typeof WorkerGlobalScope !== "undefined" && self instanceof WorkerGlobalScope;
1114if (import.meta.hot && !inWebWorker) {
1115  if (!window.$RefreshReg$) {
1116    throw new Error(
1117      "@vitejs/plugin-react can't detect preamble. Something is wrong."
1118    );
1119  }
1120  RefreshRuntime.__hmr_import(import.meta.url).then((currentExports) => {
1121    RefreshRuntime.registerExportsForReactRefresh("/app/src/dashboard/MedicalCurrentContextRule.jsx", currentExports);
1122    import.meta.hot.accept((nextExports) => {
1123      if (!nextExports) return;
1124      const invalidateMessage = RefreshRuntime.validateRefreshBoundaryAndEnqueueUpdate("/app/src/dashboard/MedicalCurrentContextRule.jsx", currentExports, nextExports);
1125      if (invalidateMessage) import.meta.hot.invalidate(invalidateMessage);
1126    });
1127  });
1128}
1129function $RefreshReg$(type, id) {
1130  return RefreshRuntime.register(type, "/app/src/dashboard/MedicalCurrentContextRule.jsx " + id);
1131}
1132function $RefreshSig$() {
1133  return RefreshRuntime.createSignatureFunctionForTransform();
1134}
1135
1136//# sourceMappingURL=data:application/json;base64,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7QUFBQSxlQWpFRjtBQUFBO0FBQUE7QUFBQTtBQUFBLGlCQW1FQTtBQUFBLGFBNUdGO0FBQUE7QUFBQTtBQUFBO0FBQUEsZUE2R0E7QUFBQSxXQW5JRjtBQUFBO0FBQUE7QUFBQTtBQUFBLGFBb0lBO0FBQUEsU0F0TEY7QUFBQTtBQUFBO0FBQUE7QUFBQSxXQXVMQTtBQUFBLE9BekxGO0FBQUE7QUFBQTtBQUFBO0FBQUEsU0EwTEE7QUFFSjtBQUFFYyxHQXhoQklELDJCQUF5QjtBQUFBLFVBQ1Y1RCxhQUNBQyxXQUFXO0FBQUE7QUFBQW9QLEtBRjFCekw7QUEwaEJOLGVBQWVBO0FBQTBCLElBQUF5TDtBQUFBQyxhQUFBRCxJQUFBIiwibmFtZXMiOlsiUmVhY3QiLCJ1c2VTdGF0ZSIsInVzZUVmZmVjdCIsInVzZVJlZiIsInVzZUxvY2F0aW9uIiwidXNlTmF2aWdhdGUiLCJsb2dvIiwiSG9tZSIsIlNldHRpbmdzIiwiQmVkIiwiTWVzc2FnZUNpcmNsZSIsIkNhbGVuZGFyIiwiQWN0aXZpdHkiLCJMb2dPdXQiLCJVc2VyUGx1cyIsIlNoaWVsZCIsIkJyYWluIiwiU3RldGhvc2NvcGUiLCJDbGlwYm9hcmRMaXN0IiwiR2F1Z2UiLCJTcGFya2xlcyIsIlRhcmdldCIsIkZpbGVUZXh0IiwiQ2hlY2tDaXJjbGUiLCJQbHVzIiwiTm90ZWJvb2siLCJBUElfQkFTRV9VUkwiLCJpbXBvcnQiLCJlbnYiLCJWSVRFX0JBQ0tFTkRfVVJMIiwiVCIsImJnIiwiYmdBbHQiLCJiZ1RlcnQiLCJ0ZXh0IiwidGV4dFNlYyIsInRleHRNdXRlZCIsImJvcmRlciIsImJvcmRlclN0ciIsImZvbnQiLCJTSURFQkFSX1ciLCJDU1MiLCJTIiwic2VjTGFiZWwiLCJmb250U2l6ZSIsInRleHRUcmFuc2Zvcm0iLCJsZXR0ZXJTcGFjaW5nIiwiY29sb3IiLCJmb250V2VpZ2h0IiwiZGlzcGxheSIsIm1hcmdpbkJvdHRvbSIsImJ0blByaW1hcnkiLCJwYWRkaW5nIiwiYmFja2dyb3VuZCIsImN1cnNvciIsImZvbnRGYW1pbHkiLCJ0cmFuc2l0aW9uIiwiYWxpZ25JdGVtcyIsImdhcCIsImJ0bk91dGxpbmUiLCJjYXJkIiwiY2FyZEhlYWRlciIsInBhZGRpbmdCb3R0b20iLCJib3JkZXJCb3R0b20iLCJNZWRpY2FsQ3VycmVudENvbnRleHRSdWxlIiwiX3MiLCJsb2NhdGlvbiIsIm5hdmlnYXRlIiwiY3VycmVudFBhdGgiLCJwYXRobmFtZSIsInF1ZXJ5UGFyYW1zIiwiVVJMU2VhcmNoUGFyYW1zIiwic2VhcmNoIiwiZG9jdG9ySWQiLCJnZXQiLCJtYXRjaCIsIm1lZGljYWxDYXRlZ29yaWVzTGlzdCIsInNldE1lZGljYWxDYXRlZ29yaWVzTGlzdCIsImN1cnJlbnRDYXRlZ29yaWVzTGlzdCIsInNldEN1cnJlbnRDYXRlZ29yaWVzTGlzdCIsInNob3dOZXdNZWRpY2FsSW5wdXQiLCJzZXRTaG93TmV3TWVkaWNhbElucHV0Iiwic2hvd05ld0N1cnJlbnRJbnB1dCIsInNldFNob3dOZXdDdXJyZW50SW5wdXQiLCJuZXdNZWRpY2FsQ2F0ZWdvcnkiLCJzZXROZXdNZWRpY2FsQ2F0ZWdvcnkiLCJuZXdDdXJyZW50Q2F0ZWdvcnkiLCJzZXROZXdDdXJyZW50Q2F0ZWdvcnkiLCJkb2N0b3JOYW1lIiwic2V0RG9jdG9yTmFtZSIsImRvY3RvclNwZWNpYWxpdHkiLCJzZXREb2N0b3JTcGVjaWFsaXR5IiwibWVkaWNhbENhdGVnb3J5UnVsZXMiLCJzZXRNZWRpY2FsQ2F0ZWdvcnlSdWxlcyIsImN1cnJlbnRDYXRlZ29yeVJ1bGVzIiwic2V0Q3VycmVudENhdGVnb3J5UnVsZXMiLCJkb2N0b3JNZWRpY2FsUnVsZXNDYWNoZSIsInNldERvY3Rvck1lZGljYWxSdWxlc0NhY2hlIiwiZG9jdG9yQ3VycmVudFJ1bGVzQ2FjaGUiLCJzZXREb2N0b3JDdXJyZW50UnVsZXNDYWNoZSIsImZvY3VzZWRGaWVsZCIsInNldEZvY3VzZWRGaWVsZCIsImFjdGl2ZVRhYiIsInNldEFjdGl2ZVRhYiIsImF1dGhDaGVja2VkIiwic2V0QXV0aENoZWNrZWQiLCJmb3JtRGF0YSIsInNldEZvcm1EYXRhIiwic3BlY2lhbHR5IiwibWVkaWNhbE91dHB1dENhdGVnb3JpZXMiLCJjdXJyZW50T3V0cHV0Q2F0ZWdvcmllcyIsImlzQWN0aXZlIiwibWVkaWNhbFNjcm9sbFJlZiIsImN1cnJlbnRTY3JvbGxSZWYiLCJmZXRjaCIsImNyZWRlbnRpYWxzIiwidGhlbiIsInIiLCJvayIsImpzb24iLCJQcm9taXNlIiwicmVqZWN0IiwiZGF0YSIsImRvY3RvciIsInN5c191c2VyX2lkIiwiY2F0Y2giLCJmaW5hbGx5IiwibWV0aG9kIiwiaGVhZGVycyIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5IiwiZG9jdG9yX2lkIiwiZCIsInN0YXR1cyIsImRvY3Rvcl9uYW1lIiwiZG9jdG9yX3NwZWNpYWxpdHkiLCJjb25zb2xlIiwiZXJyb3IiLCJsb2FkIiwiZHJSZXMiLCJkckRhdGEiLCJydWxlIiwibUNhdHMiLCJtZWRpY2FsX2NvbnRleHQiLCJtYXAiLCJpIiwibWVkaWNhbF9vdXRwdXRfY2F0ZWdvcnkiLCJtUnVsZXMiLCJPYmplY3QiLCJmcm9tRW50cmllcyIsInJ1bGVfdGV4dCIsImNDYXRzIiwiY3VycmVudF9jb250ZXh0IiwiY3VycmVudF9vdXRwdXRfY2F0ZWdvcnkiLCJjUnVsZXMiLCJhZG1pblJlcyIsImFkbWluRGF0YSIsIm0iLCJmaW5kIiwic3BlY2lhbGl0eSIsImFNQ2F0cyIsImFDQ2F0cyIsIlNldCIsImlzX2FjdGl2ZSIsImUiLCJjdXJyZW50Iiwic2Nyb2xsVG9wIiwic2Nyb2xsSGVpZ2h0IiwiaGFuZGxlTG9nb3V0IiwiaGFuZGxlTWVkaWNhbFJ1bGVDaGFuZ2UiLCJjYXQiLCJ2YWwiLCJwIiwiaGFuZGxlQ3VycmVudFJ1bGVDaGFuZ2UiLCJoYW5kbGVBZGRNZWRpY2FsQ2F0ZWdvcnkiLCJ0cmltIiwic2V0VGltZW91dCIsImhhbmRsZUFkZEN1cnJlbnRDYXRlZ29yeSIsImhhbmRsZU1lZGljYWxDYXRlZ29yeUNoYW5nZSIsImlzU2VsZWN0ZWQiLCJpbmNsdWRlcyIsInVwZGF0ZWQiLCJmaWx0ZXIiLCJjIiwicnVsZVRleHQiLCJyZXMiLCJ1cGRhdGVkUnVsZXMiLCJoYW5kbGVDdXJyZW50Q2F0ZWdvcnlDaGFuZ2UiLCJoYW5kbGVTdWJtaXQiLCJwcmV2ZW50RGVmYXVsdCIsInBheWxvYWQiLCJhbGVydCIsImhlaWdodCIsImp1c3RpZnlDb250ZW50IiwibmF2SXRlbXMiLCJsYWJlbCIsImljb24iLCJvbkNsaWNrIiwiYWN0aXZlIiwicmVuZGVyQ2F0ZWdvcnlTZWN0aW9uIiwidHlwZSIsImlzTWVkaWNhbCIsImNhdGVnb3JpZXMiLCJzZWxlY3RlZCIsInJ1bGVzIiwic2Nyb2xsUmVmIiwic2hvd05ldyIsIm5ld1ZhbCIsInNldFNob3dOZXciLCJzZXROZXdWYWwiLCJvbkFkZCIsIm9uQ2hhbmdlIiwib25SdWxlQ2hhbmdlIiwiZmllbGRQcmVmaXgiLCJzZWN0aW9uVGl0bGUiLCJzZWN0aW9uU3ViIiwiSWNvbiIsIndpZHRoIiwiZmxleFNocmluayIsIm1hcmdpbiIsIm1hcmdpbkxlZnQiLCJsZW5ndGgiLCJhY2NlbnRDb2xvciIsImZsZXgiLCJib3JkZXJMZWZ0IiwicGFkZGluZ0xlZnQiLCJ0YXJnZXQiLCJ2YWx1ZSIsImJvcmRlckNvbG9yIiwibWFyZ2luVG9wIiwiZm9udFN0eWxlIiwiYm9yZGVyVG9wIiwia2V5IiwibWluSGVpZ2h0IiwicG9zaXRpb24iLCJ0b3AiLCJsZWZ0IiwiYm90dG9tIiwiekluZGV4IiwiYm9yZGVyUmlnaHQiLCJmbGV4RGlyZWN0aW9uIiwib3ZlcmZsb3dZIiwiaXRlbSIsInRleHRBbGlnbiIsImxpbmVIZWlnaHQiLCJtaW5XaWR0aCIsImZsZXhXcmFwIiwiaW5zZXQiLCJfYyIsIiRSZWZyZXNoUmVnJCJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJNZWRpY2FsQ3VycmVudENvbnRleHRSdWxlLmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSBcInJlYW
1136N0XCI7XG5pbXBvcnQgeyB1c2VMb2NhdGlvbiwgdXNlTmF2aWdhdGUgfSBmcm9tIFwicmVhY3Qtcm91dGVyLWRvbVwiO1xuaW1wb3J0IGxvZ28gZnJvbSBcIi4uL2Fzc2V0cy9sb2RvX29ubHkucG5nXCI7XG5pbXBvcnQge1xuICBIb21lLCBTZXR0aW5ncywgQmVkLCBNZXNzYWdlQ2lyY2xlLCBDYWxlbmRhciwgQWN0aXZpdHksXG4gIExvZ091dCwgVXNlclBsdXMsIFNoaWVsZCwgQnJhaW4sIFN0ZXRob3Njb3BlLCBDbGlwYm9hcmRMaXN0LFxuICBHYXVnZSwgU3BhcmtsZXMsIFRhcmdldCwgRmlsZVRleHQsIENoZWNrQ2lyY2xlLCBQbHVzLCBOb3RlYm9vayxcbn0gZnJvbSBcImx1Y2lkZS1yZWFjdFwiO1xuXG5jb25zdCBBUElfQkFTRV9VUkwgPSBpbXBvcnQubWV0YS5lbnYuVklURV9CQUNLRU5EX1VSTDtcblxuLyog4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICBUSEVNRSBUT0tFTlNcbuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqL1xuY29uc3QgVCA9IHtcbiAgYmc6ICAgICAgICBcIiNmZmZmZmZcIixcbiAgYmdBbHQ6ICAgICBcIiNmYWZhZmFcIixcbiAgYmdUZXJ0OiAgICBcIiNmNWY1ZjVcIixcbiAgdGV4dDogICAgICBcIiMwMDAwMDBcIixcbiAgdGV4dFNlYzogICBcIiM0NDQ0NDRcIixcbiAgdGV4dE11dGVkOiBcIiM4ODg4ODhcIixcbiAgYm9yZGVyOiAgICBcIiNlMGUwZTBcIixcbiAgYm9yZGVyU3RyOiBcIiMwMDAwMDBcIixcbiAgZm9udDogICAgICBcIidPcGVuIFNhbnMnLCBzYW5zLXNlcmlmXCIsXG59O1xuXG5jb25zdCBTSURFQkFSX1cgPSBcIjI0MHB4XCI7XG5cbi8qIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgR0xPQkFMIENTU1xu4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovXG5jb25zdCBDU1MgPSBgXG4gIEBpbXBvcnQgdXJsKCdodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PU9wZW4rU2Fuczp3Z2h0QDMwMDs0MDA7NjAwJmRpc3BsYXk9c3dhcCcpO1xuICAqLCAqOjpiZWZvcmUsICo6OmFmdGVyIHsgYm94LXNpemluZzogYm9yZGVyLWJveDsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyB9XG4gIDo6c2VsZWN0aW9uIHsgYmFja2dyb3VuZDogIzAwMDsgY29sb3I6ICNmZmY7IH1cbiAgYm9keSwgaHRtbCB7IGZvbnQtZmFtaWx5OiAke1QuZm9udH07IGZvbnQtd2VpZ2h0OiAzMDA7IGJhY2tncm91bmQ6ICR7VC5iZ307IGNvbG9yOiAke1QudGV4dH07IC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOyB9XG4gIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBidXR0b24geyBmb250LWZhbWlseTogJHtULmZvbnR9OyBmb250LXdlaWdodDogMzAwOyB9XG5cbiAgLmRhLW5hdi1idG4geyB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTVzLCBjb2xvciAwLjE1czsgfVxuICAuZGEtbmF2LWJ0bjpob3ZlciB7IGJhY2tncm91bmQ6ICR7VC5iZ0FsdH0gIWltcG9ydGFudDsgY29sb3I6ICR7VC50ZXh0fSAhaW1wb3J0YW50OyB9XG4gIC5kYS1uYXYtYnRuLmRhLWFjdGl2ZSB7IGJhY2tncm91bmQ6ICR7VC5iZ0FsdH0gIWltcG9ydGFudDsgY29sb3I6ICR7VC50ZXh0fSAhaW1wb3J0YW50OyBmb250LXdlaWdodDogNDAwICFpbXBvcnRhbnQ7IGJvcmRlci1sZWZ0LWNvbG9yOiAke1QuYm9yZGVyU3RyfSAhaW1wb3J0YW50OyB9XG5cbiAgLmRhLWJ0bi1wcmltYXJ5OmhvdmVyIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsgY29sb3I6ICR7VC50ZXh0fSAhaW1wb3J0YW50OyB9XG4gIC5kYS1idG4tb3V0bGluZTpob3ZlciB7IGJvcmRlci1jb2xvcjogJHtULmJvcmRlclN0cn0gIWltcG9ydGFudDsgY29sb3I6ICR7VC50ZXh0fSAhaW1wb3J0YW50OyB9XG4gIC5kYS1idG4tZ2hvc3Q6aG92ZXIgICB7IGJhY2tncm91bmQ6ICR7VC5iZ0FsdH0gIWltcG9ydGFudDsgfVxuXG4gIC5kYS10YWItYnRuIHsgdHJhbnNpdGlvbjogYWxsIDAuMTVzOyBjdXJzb3I6IHBvaW50ZXI7IH1cbiAgLmRhLXRhYi1idG46aG92ZXIgeyBiYWNrZ3JvdW5kOiAke1QuYmdBbHR9ICFpbXBvcnRhbnQ7IGNvbG9yOiAke1QudGV4dH0gIWltcG9ydGFudDsgfVxuXG4gIC5kYS1jYXQtcm93OmhvdmVyIHsgYmFja2dyb3VuZDogJHtULmJnQWx0fSAhaW1wb3J0YW50OyB9XG4gIC5kYS1zaWRlYmFyLXNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXIgeyBkaXNwbGF5OiBub25lOyB9XG4gIC5kYS1zaWRlYmFyLXNjcm9sbCB7IC1tcy1vdmVyZmxvdy1zdHlsZTogbm9uZTsgc2Nyb2xsYmFyLXdpZHRoOiBub25lOyB9XG5cbiAgLmRhLWxpc3Qtc2Nyb2xsIHsgbWF4LWhlaWdodDogNTIwcHg7IG92ZXJmbG93LXk6IGF1dG87IH1cbiAgLmRhLWxpc3Qtc2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhciB7IHdpZHRoOiAzcHg7IH1cbiAgLmRhLWxpc3Qtc2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7IGJhY2tncm91bmQ6ICR7VC5ib3JkZXJ9OyB9XG5cbiAgLmRhLXRleHRhcmVhIHtcbiAgICB3aWR0aDogMTAwJTsgcGFkZGluZzogMC43NXJlbSAwLjg3NXJlbTtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAke1QuYm9yZGVyfTsgYmFja2dyb3VuZDogJHtULmJnfTtcbiAgICBmb250LWZhbWlseTogJ0NvdXJpZXIgTmV3JywgbW9ub3NwYWNlOyBmb250LXdlaWdodDogMzAwO1xuICAgIGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6ICR7VC50ZXh0fTtcbiAgICBvdXRsaW5lOiBub25lOyByZXNpemU6IHZlcnRpY2FsOy
1136BsaW5lLWhlaWdodDogMS42O1xuICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjE1cztcbiAgfVxuICAuZGEtdGV4dGFyZWE6Zm9jdXMgeyBib3JkZXItY29sb3I6ICR7VC5ib3JkZXJTdHJ9OyB9XG5cbiAgLmRhLWlucHV0IHtcbiAgICB3aWR0aDogMTAwJTsgaGVpZ2h0OiA0MHB4OyBwYWRkaW5nOiAwIDAuODc1cmVtO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICR7VC5ib3JkZXJ9OyBiYWNrZ3JvdW5kOiAke1QuYmd9O1xuICAgIGZvbnQtZmFtaWx5OiAke1QuZm9udH07IGZvbnQtd2VpZ2h0OiAzMDA7XG4gICAgZm9udC1zaXplOiAwLjgycmVtOyBjb2xvcjogJHtULnRleHR9O1xuICAgIG91dGxpbmU6IG5vbmU7IHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjE1cztcbiAgfVxuICAuZGEtaW5wdXQ6Zm9jdXMgeyBib3JkZXItY29sb3I6ICR7VC5ib3JkZXJTdHJ9OyB9XG4gIC5kYS1pbnB1dDo6cGxhY2Vob2xkZXIgeyBjb2xvcjogI2JiYjsgfVxuXG4gIEBrZXlmcmFtZXMgZGEtZmFkZXVwIHsgZnJvbSB7IG9wYWNpdHk6IDA7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSg0cHgpOyB9IHRvIHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOyB9IH1cbiAgLmRhLWZhZGVpbiB7IGFuaW1hdGlvbjogZGEtZmFkZXVwIDAuMThzIGVhc2U7IH1cbmA7XG5cbi8qIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgU0hBUkVEIFNUWUxFIFNOSVBQRVRTXG7ilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi9cbmNvbnN0IFMgPSB7XG4gIHNlY0xhYmVsOiB7XG4gICAgZm9udFNpemU6IFwiMC42cmVtXCIsIHRleHRUcmFuc2Zvcm06IFwidXBwZXJjYXNlXCIsXG4gICAgbGV0dGVyU3BhY2luZzogXCIwLjE4ZW1cIiwgY29sb3I6IFQudGV4dE11dGVkLFxuICAgIGZvbnRXZWlnaHQ6IDQwMCwgZGlzcGxheTogXCJibG9ja1wiLCBtYXJnaW5Cb3R0b206IFwiMC4ycmVtXCIsXG4gIH0sXG4gIGJ0blByaW1hcnk6IHtcbiAgICBwYWRkaW5nOiBcIjAuNTVyZW0gMS4yNXJlbVwiLFxuICAgIGJhY2tncm91bmQ6IFQudGV4dCwgY29sb3I6IFQuYmcsXG4gICAgYm9yZGVyOiBgMXB4IHNvbGlkICR7VC50ZXh0fWAsXG4gICAgZm9udFNpemU6IFwiMC43NXJlbVwiLCBmb250V2VpZ2h0OiA0MDAsXG4gICAgY3Vyc29yOiBcInBvaW50ZXJcIiwgZm9udEZhbWlseTogVC5mb250LFxuICAgIHRyYW5zaXRpb246IFwiYWxsIDAuMTVzXCIsXG4gICAgZGlzcGxheTogXCJpbmxpbmUtZmxleFwiLCBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLCBnYXA6IFwiNnB4XCIsXG4gICAgbGV0dGVyU3BhY2luZzogXCIwLjA0ZW1cIixcbiAgfSxcbiAgYnRuT3V0bGluZToge1xuICAgIHBhZGRpbmc6IFwiMC41NXJlbSAxLjI1cmVtXCIsXG4gICAgYmFja2dyb3VuZDogVC5iZywgY29sb3I6IFQudGV4dFNlYyxcbiAgICBib3JkZXI6IGAxcHggc29saWQgJHtULmJvcmRlcn1gLFxuICAgIGZvbnRTaXplOiBcIjAuNzVyZW1cIiwgZm9udFdlaWdodDogMzAwLFxuICAgIGN1cnNvcjogXCJwb2ludGVyXCIsIGZvbnRGYW1pbHk6IFQuZm9udCxcbiAgICB0cmFuc2l0aW9uOiBcImFsbCAwLjE1c1wiLFxuICAgIGRpc3BsYXk6IFwiaW5saW5lLWZsZXhcIiwgYWxpZ25JdGVtczogXCJjZW50ZXJcIiwgZ2FwOiBcIjZweFwiLFxuICB9LFxuICBjYXJkOiB7XG4gICAgYmFja2dyb3VuZDogVC5iZywgYm9yZGVyOiBgMXB4IHNvbGlkICR7VC5ib3JkZXJ9YCxcbiAgICBwYWRkaW5nOiBcIjEuNXJlbVwiLFxuICB9LFxuICBjYXJkSGVhZGVyOiB7XG4gICAgZGlzcGxheTogXCJmbGV4XCIsIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsIGdhcDogXCIxMHB4XCIsXG4gICAgcGFkZGluZ0JvdHRvbTogXCIxcmVtXCIsIG1hcmdpbkJvdHRvbTogXCIxLjI1cmVtXCIsXG4gICAgYm9yZGVyQm90dG9tOiBgMXB4IHNvbGlkICR7VC5ib3JkZXJ9YCxcbiAgfSxcbn07XG5cbi8qIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgTUFJTiBDT01QT05FTlRcbuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqL1xuY29uc3QgTWVkaWNhbEN1cnJlbnRDb250ZXh0UnVsZSA9ICgpID0+IHtcbiAgY29uc3QgbG9jYXRpb24gICA9IHVzZUxvY2F0aW9uKCk7XG4gIGNvbnN0IG5hdmlnYXRlICAgPSB1c2VOYXZpZ2F0ZSgpO1xuICBjb25zdCBjdXJyZW50UGF0aCA9IGxvY2F0aW9uLnBhdGhuYW1lO1xuICBjb25zdCBxdWVyeVBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMobG9jYXRpb24uc2VhcmNoKTtcbiAgbGV0IGRvY3RvcklkID0gcXVlcnlQYXJhbXMuZ2V0KFwiZG9jdG9yX2lkXCIpO1xuXG4gIGlmICghZG9jdG9ySWQpIHtcbiAgICBjb25zdCBtYXRjaCA9IGxvY2F0aW9uLnNlYXJjaC5tYXRjaCgvZG9jdG9yX2lkPShbXiZdKykvKTtcbiAgICBpZiAobWF0Y2gpIGRvY3RvcklkID0gbWF0Y2hbMV07XG4gIH1cblxuICAvKiDilIDilIAgc3RhdGUg4pSA4pSAICovXG4gIGNvbnN0IFttZWRpY2FsQ2F0ZWdvcmllc0xpc3QsIHNldE1lZGljYWxDYXRlZ29yaWVzTGlzdF0gPSB1c2VTdGF0ZShbXSk7XG4gIGNvbnN0IFtjdXJyZW50Q2F0ZWdvcmllc0xpc3QsIHNldEN1cnJlbnRDYXRlZ29yaWVzTGlzdF0gPSB1c2VTdGF0ZShbXSk7XG4gIGNvbnN0IFtzaG93TmV3TWVkaWNhbElucHV0LCAgIHNldFNob3dOZXdNZWRpY2FsSW5wdXRdICAgPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtzaG93TmV3Q3VycmVudElucHV0LCAgIHNldFNob3dOZXd
1136DdXJyZW50SW5wdXRdICAgPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtuZXdNZWRpY2FsQ2F0ZWdvcnksICAgIHNldE5ld01lZGljYWxDYXRlZ29yeV0gICAgPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgW25ld0N1cnJlbnRDYXRlZ29yeSwgICAgc2V0TmV3Q3VycmVudENhdGVnb3J5XSAgICA9IHVzZVN0YXRlKFwiXCIpO1xuICBjb25zdCBbZG9jdG9yTmFtZSwgICAgICAgICAgICBzZXREb2N0b3JOYW1lXSAgICAgICAgICAgID0gdXNlU3RhdGUoXCJcIik7XG4gIGNvbnN0IFtkb2N0b3JTcGVjaWFsaXR5LCAgICAgIHNldERvY3RvclNwZWNpYWxpdHldICAgICAgPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgW21lZGljYWxDYXRlZ29yeVJ1bGVzLCAgc2V0TWVkaWNhbENhdGVnb3J5UnVsZXNdICA9IHVzZVN0YXRlKHt9KTtcbiAgY29uc3QgW2N1cnJlbnRDYXRlZ29yeVJ1bGVzLCAgc2V0Q3VycmVudENhdGVnb3J5UnVsZXNdICA9IHVzZVN0YXRlKHt9KTtcbiAgY29uc3QgW2RvY3Rvck1lZGljYWxSdWxlc0NhY2hlLCBzZXREb2N0b3JNZWRpY2FsUnVsZXNDYWNoZV0gPSB1c2VTdGF0ZSh7fSk7XG4gIGNvbnN0IFtkb2N0b3JDdXJyZW50UnVsZXNDYWNoZSwgc2V0RG9jdG9yQ3VycmVudFJ1bGVzQ2FjaGVdID0gdXNlU3RhdGUoe30pO1xuICBjb25zdCBbZm9jdXNlZEZpZWxkLCAgICAgICAgICBzZXRGb2N1c2VkRmllbGRdICAgICAgICAgID0gdXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IFthY3RpdmVUYWIsICAgICAgICAgICAgIHNldEFjdGl2ZVRhYl0gICAgICAgICAgICAgPSB1c2VTdGF0ZShcIm1lZGljYWxcIik7XG4gIGNvbnN0IFthdXRoQ2hlY2tlZCwgICAgICAgICAgIHNldEF1dGhDaGVja2VkXSAgICAgICAgICAgPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtmb3JtRGF0YSwgc2V0Rm9ybURhdGFdID0gdXNlU3RhdGUoe1xuICAgIHNwZWNpYWx0eTogXCJcIiwgbWVkaWNhbE91dHB1dENhdGVnb3JpZXM6IFtdLCBjdXJyZW50T3V0cHV0Q2F0ZWdvcmllczogW10sXG4gICAgbWVkaWNhbENhdGVnb3J5UnVsZXM6IHt9LCBjdXJyZW50Q2F0ZWdvcnlSdWxlczoge30sIGlzQWN0aXZlOiBmYWxzZSxcbiAgfSk7XG5cbiAgY29uc3QgbWVkaWNhbFNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcbiAgY29uc3QgY3VycmVudFNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcblxuICAvKiDilIDilIAgYXV0aCDilIDilIAgKi9cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWRvY3RvcklkKSB7IG5hdmlnYXRlKFwiL2xvZ2luXCIpOyByZXR1cm47IH1cbiAgICBmZXRjaChgJHtBUElfQkFTRV9VUkx9L2htcy91c2Vycy9kb2N0b3JzL3ZlcmlmeWAsIHsgY3JlZGVudGlhbHM6IFwiaW5jbHVkZVwiIH0pXG4gICAgICAudGhlbihyID0+IHIub2sgPyByLmpzb24oKSA6IFByb21pc2UucmVqZWN0KCkpXG4gICAgICAudGhlbihkYXRhID0+IHsgaWYgKGRvY3RvcklkICE9PSBkYXRhLmRvY3Rvci5zeXNfdXNlcl9pZCkgbmF2aWdhdGUoXCIvbG9naW5cIik7IH0pXG4gICAgICAuY2F0Y2goKCkgPT4gbmF2aWdhdGUoXCIvbG9naW5cIikpXG4gICAgICAuZmluYWxseSgoKSA9PiBzZXRBdXRoQ2hlY2tlZCh0cnVlKSk7XG4gIH0sIFtkb2N0b3JJZCwgbmF2aWdhdGVdKTtcblxuICAvKiDilIDilIAgZG9jdG9yIGRldGFpbHMg4pSA4pSAICovXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFkb2N0b3JJZCkgcmV0dXJuO1xuICAgIGZldGNoKGAke0FQSV9CQVNFX1VSTH0vaG1zL3VzZXJzL3NwZWNpYWxpdHkvdXNlcnMvcGF0aWVudC9nZXRfZG9jdG9yX2RldGFpbHNgLCB7XG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLCBoZWFkZXJzOiB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGRvY3Rvcl9pZDogZG9jdG9ySWQgfSksXG4gICAgfSlcbiAgICAgIC50aGVuKHIgPT4gci5qc29uKCkpXG4gICAgICAudGhlbihkID0+IHsgaWYgKGQuc3RhdHVzID09PSBcInN1Y2Nlc3NcIikgeyBzZXREb2N0b3JOYW1lKGQuZG9jdG9yX25hbWUpOyBzZXREb2N0b3JTcGVjaWFsaXR5KGQuZG9jdG9yX3NwZWNpYWxpdHkpOyB9IH0pXG4gICAgICAuY2F0Y2goY29uc29sZS5lcnJvcik7XG4gIH0sIFtkb2N0b3JJZF0pO1xuXG4gIC8qIOKUgOKUgCBsb2FkIHJ1bGVzIOKUgOKUgCAqL1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZG9jdG9ySWQgfHwgIWRvY3RvclNwZWNpYWxpdHkpIHJldHVybjtcbiAgICBjb25zdCBsb2FkID0gYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZHJSZXMgID0gYXdhaXQgZmV0Y2goYCR7QVBJX0JBU0VfVVJMfS9obXMvdXNlcnMvZGF0YS9jb250ZXh0L2dldF9Eb2N0b3JNZWRpY2FsQ3VycmVudFJ1bGUvJHtkb2N0b3JJZH1gLCB7IGNyZWRlbnRpYWxzOiBcImluY2x1ZGVcIiB9KTtcbiAgICAgICAgY29uc3QgZHJEYXRhID0gYXdhaXQgZHJSZXMuanNvbigpO1xuXG4gICAgICAgIGlmIChkckRhdGEuc3RhdHVzID09PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICAgIGNvbnN0IHJ1bGUgPSBkckRhdGEuZGF0YTtcbiAgICAgICAgICBjb25zdCBtQ2F0cyAgPSBydWxlLm1lZGljYWxfY29udGV4dC5tYXAoaSA9PiBpLm1lZGljYWxfb3V0cHV0X2NhdGVnb3J5KTtcbiAgICAgICAgICBjb25zdCBtUnVsZXMgPSBPYmplY3QuZnJvbUVudHJpZXMocnVsZS5tZWRpY2FsX2NvbnRleHQubWFwKGkgPT4gW2kubWVkaWNhbF9vdXRwdXRfY2F0ZWdvcnksIGkucnVsZV90ZXh0XSkpO1xuICAgICAgICAgIGNvbnN0IGNDYXRzICA9IHJ1bGUuY3VycmVudF9jb250ZXh0Lm1hcChpID0+IGkuY3VycmVudF9vdXRwdXRfY2F0ZWdvcnkpO1xuICAgICAgICAgIGNvbnN0IGNSdWxlcyA9IE9iamVjdC5mcm9tRW50cmllcyhydWxlLmN1cnJlbnRfY29udGV4dC5tYXAoaSA9PiBbaS5jdXJyZW50X291dHB1dF9jYXRlZ29yeSwgaS5ydWxlX3RleHRdKSk7XG5cbiAgICAgICAgICBjb25zdCBhZG1pblJlcyAgPSBhd2FpdCBmZXRjaChgJHtBUElfQkFTRV9VUkx9L2htcy91c2Vycy9kYXRhL2NvbnRleHQvZ2V0X01lZGljYWxDdXJyZW50QWRtaW5SdWxlc2AsIHsgY3JlZGVudGlhbHM6IFwiaW5jbHVkZVwiIH0pO1xuICAgICAgICAgIGNvbnN0IGFkbWluRGF0YSA9IGF3YWl0IGFkbWluUmVzLmpzb24oKTtcbiAgICAgICAgICBpZiAoYWRtaW5EYXRhLnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IG0gPSBhZG1pbkRhdGEuZGF0YS5maW5kKHIgPT4gci5zcGVjaWFsaXR5ID09PSBkb2N0b3JTcGVjaWFsaXR5KTtcbiAgICAgICAgICAgIGlmIChtKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGFNQ2F0cyA9IG0ubWVkaWNhbF9jb250ZXh0Lm1hcChpID0+IGkubWVkaWNhbF9vdXRwdXRfY2F0ZWdvcnkpO1xuICAgICAgICAgICAgICBjb25zdCBhQ0NhdHMgP
1136SBtLmN1cnJlbnRfY29udGV4dC5tYXAoaSA9PiBpLmN1cnJlbnRfb3V0cHV0X2NhdGVnb3J5KTtcbiAgICAgICAgICAgICAgc2V0TWVkaWNhbENhdGVnb3JpZXNMaXN0KFsuLi5uZXcgU2V0KFsuLi5hTUNhdHMsIC4uLm1DYXRzXSldKTtcbiAgICAgICAgICAgICAgc2V0Q3VycmVudENhdGVnb3JpZXNMaXN0KFsuLi5uZXcgU2V0KFsuLi5hQ0NhdHMsIC4uLmNDYXRzXSldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0TWVkaWNhbENhdGVnb3J5UnVsZXMobVJ1bGVzKTsgc2V0Q3VycmVudENhdGVnb3J5UnVsZXMoY1J1bGVzKTtcbiAgICAgICAgICBzZXREb2N0b3JNZWRpY2FsUnVsZXNDYWNoZShtUnVsZXMpOyBzZXREb2N0b3JDdXJyZW50UnVsZXNDYWNoZShjUnVsZXMpO1xuICAgICAgICAgIHNldEZvcm1EYXRhKHsgc3BlY2lhbHR5OiBydWxlLnNwZWNpYWxpdHkgfHwgXCJcIiwgbWVkaWNhbE91dHB1dENhdGVnb3JpZXM6IG1DYXRzLCBjdXJyZW50T3V0cHV0Q2F0ZWdvcmllczogY0NhdHMsIG1lZGljYWxDYXRlZ29yeVJ1bGVzOiBtUnVsZXMsIGN1cnJlbnRDYXRlZ29yeVJ1bGVzOiBjUnVsZXMsIGlzQWN0aXZlOiBydWxlLmlzX2FjdGl2ZSA/PyB0cnVlIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFkbWluUmVzICA9IGF3YWl0IGZldGNoKGAke0FQSV9CQVNFX1VSTH0vaG1zL3VzZXJzL2RhdGEvY29udGV4dC9nZXRfTWVkaWNhbEN1cnJlbnRBZG1pblJ1bGVzYCwgeyBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIgfSk7XG4gICAgICAgIGNvbnN0IGFkbWluRGF0YSA9IGF3YWl0IGFkbWluUmVzLmpzb24oKTtcbiAgICAgICAgaWYgKGFkbWluRGF0YS5zdGF0dXMgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgY29uc3QgbSA9IGFkbWluRGF0YS5kYXRhLmZpbmQociA9PiByLnNwZWNpYWxpdHkgPT09IGRvY3RvclNwZWNpYWxpdHkpO1xuICAgICAgICAgIGlmICghbSkgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IG1DYXRzICA9IG0ubWVkaWNhbF9jb250ZXh0Lm1hcChpID0+IGkubWVkaWNhbF9vdXRwdXRfY2F0ZWdvcnkpO1xuICAgICAgICAgIGNvbnN0IG1SdWxlcyA9IE9iamVjdC5mcm9tRW50cmllcyhtLm1lZGljYWxfY29udGV4dC5tYXAoaSA9PiBbaS5tZWRpY2FsX291dHB1dF9jYXRlZ29yeSwgaS5ydWxlX3RleHRdKSk7XG4gICAgICAgICAgY29uc3QgY0NhdHMgID0gbS5jdXJyZW50X2NvbnRleHQubWFwKGkgPT4gaS5jdXJyZW50X291dHB1dF9jYXRlZ29yeSk7XG4gICAgICAgICAgY29uc3QgY1J1bGVzID0gT2JqZWN0LmZyb21FbnRyaWVzKG0uY3VycmVudF9jb250ZXh0Lm1hcChpID0+IFtpLmN1cnJlbnRfb3V0cHV0X2NhdGVnb3J5LCBpLnJ1bGVfdGV4dF0pKTtcbiAgICAgICAgICBzZXRNZWRpY2FsQ2F0ZWdvcmllc0xpc3QobUNhdHMpOyBzZXRDdXJyZW50Q2F0ZWdvcmllc0xpc3QoY0NhdHMpO1xuICAgICAgICAgIHNldE1lZGljYWxDYXRlZ29yeVJ1bGVzKG1SdWxlcyk7IHNldEN1cnJlbnRDYXRlZ29yeVJ1bGVzKGNSdWxlcyk7XG4gICAgICAgICAgc2V0Rm9ybURhdGEoeyBzcGVjaWFsdHk6IG0uc3BlY2lhbGl0eSB8fCBcIlwiLCBtZWRpY2FsT3V0cHV0Q2F0ZWdvcmllczogbUNhdHMsIGN1cnJlbnRPdXRwdXRDYXRlZ29yaWVzOiBjQ2F0cywgbWVkaWNhbENhdGVnb3J5UnVsZXM6IG1SdWxlcywgY3VycmVudENhdGVnb3J5UnVsZXM6IGNSdWxlcywgaXNBY3RpdmU6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHsgY29uc29sZS5lcnJvcihlKTsgfVxuICAgIH07XG4gICAgbG9hZCgpO1xuICB9LCBbZG9jdG9ySWQsIGRvY3RvclNwZWNpYWxpdHldKTtcblxuICB1c2VFZmZlY3QoKCkgPT4geyBpZiAobWVkaWNhbFNjcm9sbFJlZi5jdXJyZW50KSBtZWRpY2FsU2Nyb2xsUmVmLmN1cnJlbnQuc2Nyb2xsVG9wID0gbWVkaWNhbFNjcm9sbFJlZi5jdXJyZW50LnNjcm9sbEhlaWdodDsgfSwgW21lZGljYWxDYXRlZ29yaWVzTGlzdF0pO1xuICB1c2VFZmZlY3QoKCkgPT4geyBpZiAoY3VycmVudFNjcm9sbFJlZi5jdXJyZW50KSBjdXJyZW50U2Nyb2xsUmVmLmN1cnJlbnQuc2Nyb2xsVG9wID0gY3VycmVudFNjcm9sbFJlZi5jdXJyZW50LnNjcm9sbEhlaWdodDsgfSwgW2N1cnJlbnRDYXRlZ29yaWVzTGlzdF0pO1xuXG4gIC8qIOKUgOKUgCBoYW5kbGVycyDilIDilIAgKi9cbiAgY29uc3QgaGFuZGxlTG9nb3V0ID0gYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7IGF3YWl0IGZldGNoKGAke0FQSV9CQVNFX1VSTH0vaG1zL3VzZXJzL2F1dGgvbG9nb3V0YCwgeyBtZXRob2Q6IFwiUE9TVFwiLCBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIgfSk7IH1cbiAgICBmaW5hbGx5IHsgbmF2aWdhdGUoXCIvbG9naW5cIik7IH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVNZWRpY2FsUnVsZUNoYW5nZSA9IChjYXQsIHZhbCkgPT4ge1xuICAgIHNldE1lZGljYWxDYXRlZ29yeVJ1bGVzKHAgPT4gKHsgLi4ucCwgW2NhdF06IHZhbCB9KSk7XG4gICAgc2V0Rm9ybURhdGEocCA9PiAoeyAuLi5wLCBtZWRpY2FsQ2F0ZWdvcnlSdWxlczogeyAuLi5wLm1lZGljYWxDYXRlZ29yeVJ1bGVzLCBbY2F0XTogdmFsIH0gfSkpO1xuICAgIHNldERvY3Rvck1lZGljYWxSdWxlc0NhY2hlKHAgPT4gKHsgLi4ucCwgW2NhdF06IHZhbCB9KSk7XG4gIH07XG4gIGNvbnN0IGhhbmRsZUN1cnJlbnRSdWxlQ2hhbmdlID0gKGNhdCwgdmFsKSA9PiB7XG4gICAgc2V0Q3VycmVudENhdGVnb3J5UnVsZXMocCA9PiAoeyAuLi5wLCBbY2F0XTogdmFsIH0pKTtcbiAgICBzZXRGb3JtRGF0YShwID0+ICh7IC4uLnAsIGN1cnJlbnRDYXRlZ29yeVJ1bGVzOiB7IC4uLnAuY3VycmVudENhdGVnb3J5UnVsZXMsIFtjYXRdOiB2YWwgfSB9KSk7XG4gICAgc2V0RG9jdG9yQ3VycmVudFJ1bGVzQ2FjaGUocCA9PiAoeyAuLi5wLCBbY2F0XTogdmFsIH0pKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVBZGRNZWRpY2FsQ2F0ZWdvcnkgPSAoKSA9PiB7XG4gICAgY29uc3QgY2F0ID0gbmV3TWVkaWNhbENhdGVnb3J5LnRyaW0oKTsgaWYgKCFjYXQpIHJldHVybjtcbiAgICBzZXRNZWRpY2FsQ2F0ZWdvcmllc0xpc3QocCA9PiBbLi4ucCwgY2F0XSk7XG4gICAgc2V0TWVkaWNhbENhdGVnb3J5UnVsZXMocCA9PiAoeyAuLi5wLCBbY2F0XTogXCJcIiB9KSk7XG4gICAgc2V0RG9jdG9yTWVkaWNhbFJ1bGVzQ2FjaGUocCA9PiAoeyAuLi5wLCBbY2F0XTogXCJcIiB9KSk7XG4gICAgc2V0Rm9ybURhdGEocCA9PiAoeyAuLi5wLCBtZWRpY2FsT3V0cHV0Q2F0ZWdvcmllczogWy4uLnAubWVkaWNhbE91dHB1dENhdGVnb3JpZXMsIGNhdF0sIG1lZGljYWxDYXRlZ29yeVJ1bGVzOiB7IC4uLnAubWVkaWNhbENhdGVnb3J5UnVsZXMsIFtjYXRdOiBcIlwiIH0gfSkpO1xuICAgIHNldE5ld01lZGljYWxDYXRlZ29yeShcIlwiKTsgc2V0U2hvd05ld01lZGljYWxJbnB1dChmYWxzZSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7IGlmIChtZWRpY2FsU2Nyb2xsUmVmLmN1cnJlbnQpIG1lZGljYWxTY3JvbGxSZWYuY3VycmVudC5zY3JvbGxUb3AgPSBtZWRpY2FsU2Nyb2xsUmVmLmN1cnJlbnQuc2Nyb2xsSGVpZ2h0OyB9LCAxM
1136DApO1xuICB9O1xuICBjb25zdCBoYW5kbGVBZGRDdXJyZW50Q2F0ZWdvcnkgPSAoKSA9PiB7XG4gICAgY29uc3QgY2F0ID0gbmV3Q3VycmVudENhdGVnb3J5LnRyaW0oKTsgaWYgKCFjYXQpIHJldHVybjtcbiAgICBzZXRDdXJyZW50Q2F0ZWdvcmllc0xpc3QocCA9PiBbLi4ucCwgY2F0XSk7XG4gICAgc2V0Q3VycmVudENhdGVnb3J5UnVsZXMocCA9PiAoeyAuLi5wLCBbY2F0XTogXCJcIiB9KSk7XG4gICAgc2V0RG9jdG9yQ3VycmVudFJ1bGVzQ2FjaGUocCA9PiAoeyAuLi5wLCBbY2F0XTogXCJcIiB9KSk7XG4gICAgc2V0Rm9ybURhdGEocCA9PiAoeyAuLi5wLCBjdXJyZW50T3V0cHV0Q2F0ZWdvcmllczogWy4uLnAuY3VycmVudE91dHB1dENhdGVnb3JpZXMsIGNhdF0sIGN1cnJlbnRDYXRlZ29yeVJ1bGVzOiB7IC4uLnAuY3VycmVudENhdGVnb3J5UnVsZXMsIFtjYXRdOiBcIlwiIH0gfSkpO1xuICAgIHNldE5ld0N1cnJlbnRDYXRlZ29yeShcIlwiKTsgc2V0U2hvd05ld0N1cnJlbnRJbnB1dChmYWxzZSk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlTWVkaWNhbENhdGVnb3J5Q2hhbmdlID0gYXN5bmMgKGNhdCkgPT4ge1xuICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBmb3JtRGF0YS5tZWRpY2FsT3V0cHV0Q2F0ZWdvcmllcy5pbmNsdWRlcyhjYXQpO1xuICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICBjb25zdCB1cGRhdGVkID0gZm9ybURhdGEubWVkaWNhbE91dHB1dENhdGVnb3JpZXMuZmlsdGVyKGMgPT4gYyAhPT0gY2F0KTtcbiAgICAgIHNldEZvcm1EYXRhKHAgPT4gKHsgLi4ucCwgbWVkaWNhbE91dHB1dENhdGVnb3JpZXM6IHVwZGF0ZWQgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgcnVsZVRleHQgPSBcIlwiO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzICA9IGF3YWl0IGZldGNoKGAke0FQSV9CQVNFX1VSTH0vaG1zL3VzZXJzL2RhdGEvY29udGV4dC9nZXRfTWVkaWNhbEN1cnJlbnRBZG1pblJ1bGVzYCwgeyBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIgfSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5zdGF0dXMgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgY29uc3QgbSA9IGRhdGEuZGF0YS5maW5kKHIgPT4gci5zcGVjaWFsaXR5ID09PSBkb2N0b3JTcGVjaWFsaXR5KTtcbiAgICAgICAgICBydWxlVGV4dCA9IG0/Lm1lZGljYWxfY29udGV4dC5maW5kKGkgPT4gaS5tZWRpY2FsX291dHB1dF9jYXRlZ29yeSA9PT0gY2F0KT8ucnVsZV90ZXh0IHx8IFwiXCI7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge31cbiAgICAgIGNvbnN0IHJ1bGUgPSBkb2N0b3JNZWRpY2FsUnVsZXNDYWNoZVtjYXRdID8/IHJ1bGVUZXh0O1xuICAgICAgY29uc3QgdXBkYXRlZFJ1bGVzID0geyAuLi5mb3JtRGF0YS5tZWRpY2FsQ2F0ZWdvcnlSdWxlcywgW2NhdF06IHJ1bGUgfTtcbiAgICAgIHNldE1lZGljYWxDYXRlZ29yeVJ1bGVzKHVwZGF0ZWRSdWxlcyk7XG4gICAgICBzZXRGb3JtRGF0YShwID0+ICh7IC4uLnAsIG1lZGljYWxPdXRwdXRDYXRlZ29yaWVzOiBbLi4ucC5tZWRpY2FsT3V0cHV0Q2F0ZWdvcmllcywgY2F0XSwgbWVkaWNhbENhdGVnb3J5UnVsZXM6IHVwZGF0ZWRSdWxlcyB9KSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBoYW5kbGVDdXJyZW50Q2F0ZWdvcnlDaGFuZ2UgPSBhc3luYyAoY2F0KSA9PiB7XG4gICAgY29uc3QgaXNTZWxlY3RlZCA9IGZvcm1EYXRhLmN1cnJlbnRPdXRwdXRDYXRlZ29yaWVzLmluY2x1ZGVzKGNhdCk7XG4gICAgaWYgKGlzU2VsZWN0ZWQpIHtcbiAgICAgIHNldEZvcm1EYXRhKHAgPT4gKHsgLi4ucCwgY3VycmVudE91dHB1dENhdGVnb3JpZXM6IHAuY3VycmVudE91dHB1dENhdGVnb3JpZXMuZmlsdGVyKGMgPT4gYyAhPT0gY2F0KSB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBydWxlVGV4dCA9IFwiXCI7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgID0gYXdhaXQgZmV0Y2goYCR7QVBJX0JBU0VfVVJMfS9obXMvdXNlcnMvZGF0YS9jb250ZXh0L2dldF9NZWRpY2FsQ3VycmVudEFkbWluUnVsZXNgLCB7IGNyZWRlbnRpYWxzOiBcImluY2x1ZGVcIiB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIGlmIChkYXRhLnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICBjb25zdCBtID0gZGF0YS5kYXRhLmZpbmQociA9PiByLnNwZWNpYWxpdHkgPT09IGRvY3RvclNwZWNpYWxpdHkpO1xuICAgICAgICAgIHJ1bGVUZXh0ID0gbT8uY3VycmVudF9jb250ZXh0LmZpbmQoaSA9PiBpLmN1cnJlbnRfb3V0cHV0X2NhdGVnb3J5ID09PSBjYXQpPy5ydWxlX3RleHQgfHwgXCJcIjtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7fVxuICAgICAgY29uc3QgcnVsZSA9IGRvY3RvckN1cnJlbnRSdWxlc0NhY2hlW2NhdF0gPz8gZm9ybURhdGEuY3VycmVudENhdGVnb3J5UnVsZXM/LltjYXRdID8/IHJ1bGVUZXh0O1xuICAgICAgY29uc3QgdXBkYXRlZFJ1bGVzID0geyAuLi5mb3JtRGF0YS5jdXJyZW50Q2F0ZWdvcnlSdWxlcywgW2NhdF06IHJ1bGUgfTtcbiAgICAgIHNldEN1cnJlbnRDYXRlZ29yeVJ1bGVzKHVwZGF0ZWRSdWxlcyk7XG4gICAgICBzZXRGb3JtRGF0YShwID0+ICh7IC4uLnAsIGN1cnJlbnRPdXRwdXRDYXRlZ29yaWVzOiBbLi4ucC5jdXJyZW50T3V0cHV0Q2F0ZWdvcmllcywgY2F0XSwgY3VycmVudENhdGVnb3J5UnVsZXM6IHVwZGF0ZWRSdWxlcyB9KSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVN1Ym1pdCA9IGFzeW5jIChlKSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICBkb2
1136N0b3JfaWQ6IGRvY3RvcklkLCBzcGVjaWFsaXR5OiBkb2N0b3JTcGVjaWFsaXR5LFxuICAgICAgICBtZWRpY2FsX2NvbnRleHQ6IGZvcm1EYXRhLm1lZGljYWxPdXRwdXRDYXRlZ29yaWVzLm1hcChjYXQgPT4gKHsgbWVkaWNhbF9vdXRwdXRfY2F0ZWdvcnk6IGNhdCwgcnVsZV90ZXh0OiBmb3JtRGF0YS5tZWRpY2FsQ2F0ZWdvcnlSdWxlc1tjYXRdIHx8IFwiXCIgfSkpLFxuICAgICAgICBjdXJyZW50X2NvbnRleHQ6IGZvcm1EYXRhLmN1cnJlbnRPdXRwdXRDYXRlZ29yaWVzLm1hcChjYXQgPT4gKHsgY3VycmVudF9vdXRwdXRfY2F0ZWdvcnk6IGNhdCwgcnVsZV90ZXh0OiBmb3JtRGF0YS5jdXJyZW50Q2F0ZWdvcnlSdWxlc1tjYXRdIHx8IFwiXCIgfSkpLFxuICAgICAgICBpc19hY3RpdmU6IGZvcm1EYXRhLmlzQWN0aXZlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke0FQSV9CQVNFX1VSTH0vaG1zL3VzZXJzL2RhdGEvY29udGV4dC9zYXZlX0RvY3Rvck1lZGljYWxDdXJyZW50UnVsZWAsIHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIiwgaGVhZGVyczogeyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9LFxuICAgICAgICBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIsIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLFxuICAgICAgfSk7XG4gICAgICBpZiAocmVzLm9rKSBhbGVydChcIkNvbmZpZ3VyYXRpb24gc2F2ZWQgc3VjY2Vzc2Z1bGx5LlwiKTtcbiAgICAgIGVsc2UgYWxlcnQoXCJGYWlsZWQgdG8gc2F2ZSBjb25maWd1cmF0aW9uLlwiKTtcbiAgICB9IGNhdGNoIChlKSB7IGNvbnNvbGUuZXJyb3IoZSk7IGFsZXJ0KFwiU29tZXRoaW5nIHdlbnQgd3JvbmcuXCIpOyB9XG4gIH07XG5cbiAgaWYgKCFhdXRoQ2hlY2tlZCkgcmV0dXJuIChcbiAgICA8ZGl2IHN0eWxlPXt7IGhlaWdodDogXCIxMDB2aFwiLCBkaXNwbGF5OiBcImZsZXhcIiwgYWxpZ25JdGVtczogXCJjZW50ZXJcIiwganVzdGlmeUNvbnRlbnQ6IFwiY2VudGVyXCIsIGZvbnRGYW1pbHk6IFQuZm9udCwgZm9udFNpemU6IFwiMC43OHJlbVwiLCBjb2xvcjogVC50ZXh0TXV0ZWQsIHRleHRUcmFuc2Zvcm06IFwidXBwZXJjYXNlXCIsIGxldHRlclNwYWNpbmc6IFwiMC4xNWVtXCIgfX0+XG4gICAgICBWZXJpZnlpbmcgc2Vzc2lvbuKAplxuICAgIDwvZGl2PlxuICApO1xuICBpZiAoIWRvY3RvcklkKSByZXR1cm4gKFxuICAgIDxkaXYgc3R5bGU9e3sgaGVpZ2h0OiBcIjEwMHZoXCIsIGRpc3BsYXk6IFwiZmxleFwiLCBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLCBqdXN0aWZ5Q29udGVudDogXCJjZW50ZXJcIiwgZm9udEZhbWlseTogVC5mb250LCBmb250U2l6ZTogXCIwLjgycmVtXCIsIGNvbG9yOiBULnRleHQgfX0+XG4gICAgICBEb2N0b3IgSUQgbWlzc2luZy4gUGxlYXNlIGxvZyBpbiBhZ2Fpbi5cbiAgICA8L2Rpdj5cbiAgKTtcblxuICBjb25zdCBuYXZJdGVtcyA9IFtcbiAgICB7IGxhYmVsOiBcIkRhc2hib2FyZFwiLCAgICAgICAgICAgICAgICAgICAgICAgICBpY29uOiA8SG9tZSBzaXplPXsxNH0gLz4sICAgICAgICAgb25DbGljazogKCkgPT4gbmF2aWdhdGUoYC9kb2N0b3ItZGFzaGJvYXJkP2RvY3Rvcl9pZD0ke2RvY3RvcklkfWApIH0sXG4gICAgeyBsYWJlbDogXCJNZWRpY2FsIENvbnRleHQgU2tpbGxzXCIsICAgICAgaWNvbjogPENhbGVuZGFyIHNpemU9ezE0fSAvPiwgICAgIGFjdGl2ZTogY3VycmVudFBhdGguaW5jbHVkZXMoXCJtZWRpY2FsLWN1cnJlbnQtY29udGV4dC1ydWxlXCIpLCBvbkNsaWNrOiAoKSA9PiBuYXZpZ2F0ZShgL21lZGljYWwtY3VycmVudC1jb250ZXh0LXJ1bGUtc2V0dGluZ3M/ZG9jdG9yX2lkPSR7ZG9jdG9ySWR9YCkgfSxcbiAgICB7IGxhYmVsOiBcIlN0cnVjdHVyZWQgTm90ZSBTa2lsbHNcIiwgICAgICBpY29uOiA8Tm90ZWJvb2sgc2l6ZT17MTR9IC8+LCAgICAgb25DbGljazogKCkgPT4gbmF2aWdhdGUoYC9zdHJ1Y3R1cmVkLW5vdGUtaW5zdHJ1Y3Rpb25zLXNldHRpbmdzP2RvY3Rvcl9pZD0ke2RvY3RvcklkfWApIH0sXG4gICAgeyBsYWJlbDogXCJHdWlkZWxpbmVzIFNraWxsc1wiLCAgICAgICAgICAgICAgIGljb246IDxGaWxlVGV4dCBzaXplPXsxNH0gLz4sICAgICBvbkNsaWNrOiAoKSA9PiBuYXZpZ2F0ZShgL2d1aWRlbGluZXMtc2V0dGluZ3M/ZG9jdG9yX2lkPSR7ZG9jdG9ySWR9YCkgfSxcbiAgXTtcblxuICAvKiDilIDilIAgQ2F0ZWdvcnkgc2VjdGlvbiByZW5kZXJlciDilIDilIAgKi9cbiAgY29uc3QgcmVuZGVyQ2F0ZWdvcnlTZWN0aW9uID0gKHR5cGUpID0+IHtcbiAgICBjb25zdCBpc01lZGljYWwgICA9IHR5cGUgPT09IFwibWVkaWNhbFwiO1xuICAgIGNvbnN0IGNhdGVnb3JpZXMgID0gaXNNZWRpY2FsID8gbWVkaWNhbENhdGVnb3JpZXNMaXN0ICAgICAgICA6IGN1cnJlbnRDYXRlZ29yaWVzTGlzdDtcbiAgICBjb25zdCBzZWxlY3RlZCAgICA9IGlzTWVkaWNhbCA/IGZvcm1EYXRhLm1lZGljYWxPdXRwdXRDYXRlZ29yaWVzIDogZm9ybURhdGEuY3VycmVudE91dHB1dENhdGVnb3JpZXM7XG4gICAgY29uc3QgcnVsZXMgICAgICAgPSBpc01lZGljYWwgPyBtZWRpY2FsQ2F0ZWdvcnlSdWxlcyAgICAgICAgIDogY3VycmVudENhdGVnb3J5UnVsZXM7XG4gICAgY29uc3Qgc2Nyb2xsUmVmICAgPSBpc01lZGljYWwgPyBtZWRpY2FsU2Nyb2xsUmVmICAgICAgICAgICAgIDogY3VycmVudFNjcm9sbFJlZjtcbiAgICBjb25zdCBzaG93TmV3ICAgICA9IGlzTWVkaWNhbCA/IHNob3dOZXdNZWRpY2FsSW5wdXQgICAgICAgICAgOiBzaG93TmV3Q3VycmVudElucHV0O1xuICAgIGNvbnN0IG5ld1ZhbCAgICAgID0gaXNNZWRpY2FsID8gbmV3TWVkaWNhbENhdGVnb3J5ICAgICAgICAgICA6IG5ld0N1cnJlbnRDYXRlZ29yeTtcbiAgICBjb25zdCBzZXRTaG93TmV3ICA9IGlzTWVkaWNhbCA/IHNldFNob3dOZXdNZWRpY2FsSW5wdXQgICAgICAgOiBzZXRTaG93TmV3Q3VycmVudElucHV0O1xuICAgIGNvbnN0IHNldE5ld1ZhbCAgID0gaXNNZWRpY2FsID8gc2V0TmV3TWVkaWNhbENhdGVnb3J5ICAgICAgICA6IHNldE5ld0N1cnJlbnRDYXRlZ29yeTtcbiAgICBjb25zdCBvbkFkZCAgICAgICA9IGlzTWVkaWNhbCA/IGhhbmRsZUFkZE1lZGljYWxDYXRlZ29yeSAgICAgOiBoYW5kbGVBZGRDdXJyZW50Q2F0ZWdvcnk7XG4gICAgY29uc3Qgb25DaGFuZ2UgICAgPSBpc01lZGljYWwgPyBoYW5kbGVNZWRpY2FsQ2F0ZWdvcnlDaGFuZ2UgIDogaGFuZGxlQ3VycmVudENhdGVnb3J5Q2hhbmdlO1xuICAgIGNvbnN0IG9uUnVsZUNoYW5nZSA9IGlzTWVkaWNhbCA/IGhhbmRsZU1lZGljYWxSdWxlQ2hhbmdlICAgICA6IGhhbmRsZUN1cnJlbnRSdWxlQ2hhbmdlO1xuICAgIGNvbnN0IGZpZWxkUHJlZml4ID0gaXNNZWRpY2FsID8gXCJtZWRpY2FsXCIgOiBcImN1cnJlbnRcIjtcbiAgICBjb25zdCBzZWN0aW9uVGl0bGUgPSBpc01lZGljYWwgPyBcIk1lZGljYWwgT3V0cHV0IENhdGVnb3JpZXNcIiA6IFwiQ3VycmVudCBPdXRwdXQgQ2F0ZWdvcmllc1wiO1xuICAgIGNvbnN0IHNlY3Rpb25TdWIgICA9IGlzTWVkaWNhbCA/IFwiU2VsZWN0IGNhdGVnb3JpZXMgYW5kIGRlZmluZSBydWxlcyBmb3IgZWFjaCBtZWRpY2FsIGNvbnRleHRcIiA6IFwiU2VsZWN0IGNhdGVnb3JpZXMgYW5kIGRlZmluZSBydWxlcyBmb3IgZWFjaCBjdXJyZW50IHBhdGllbnQgY29udGV4dFwiO1xuICAgIGNvbnN0IEljb24gICAgICAgICA9IGlzTWVkaWNhbCA/IENsaXBib2FyZExpc3QgOiBHYXVnZTtcblxuICAgI
1136HJldHVybiAoXG4gICAgICA8ZGl2IHN0eWxlPXt7IC4uLlMuY2FyZCwgbWFyZ2luQm90dG9tOiBcIjEuNXJlbVwiIH19IGNsYXNzTmFtZT1cImRhLWZhZGVpblwiPlxuICAgICAgICB7LyogaGVhZGVyICovfVxuICAgICAgICA8ZGl2IHN0eWxlPXtTLmNhcmRIZWFkZXJ9PlxuICAgICAgICAgIDxkaXYgc3R5bGU9e3sgd2lkdGg6IDM2LCBoZWlnaHQ6IDM2LCBiYWNrZ3JvdW5kOiBULmJnQWx0LCBib3JkZXI6IGAxcHggc29saWQgJHtULmJvcmRlcn1gLCBkaXNwbGF5OiBcImZsZXhcIiwgYWxpZ25JdGVtczogXCJjZW50ZXJcIiwganVzdGlmeUNvbnRlbnQ6IFwiY2VudGVyXCIsIGZsZXhTaHJpbms6IDAgfX0+XG4gICAgICAgICAgICA8SWNvbiBzaXplPXsxNn0gY29sb3I9e1QudGV4dE11dGVkfSAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8cCBzdHlsZT17eyBmb250U2l6ZTogXCIwLjlyZW1cIiwgZm9udFdlaWdodDogNDAwLCBjb2xvcjogVC50ZXh0LCBtYXJnaW46IDAgfX0+e3NlY3Rpb25UaXRsZX08L3A+XG4gICAgICAgICAgICA8cCBzdHlsZT17eyBmb250U2l6ZTogXCIwLjdyZW1cIiwgY29sb3I6IFQudGV4dE11dGVkLCBtYXJnaW46IFwiMnB4IDAgMFwiLCBmb250V2VpZ2h0OiAzMDAgfX0+e3NlY3Rpb25TdWJ9PC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzcGFuIHN0eWxlPXt7IG1hcmdpbkxlZnQ6IFwiYXV0b1wiLCAuLi5TLnNlY0xhYmVsLCBtYXJnaW46IDAgfX0+e3NlbGVjdGVkLmxlbmd0aH0gc2VsZWN0ZWQ8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIHsvKiBsaXN0ICovfVxuICAgICAgICA8ZGl2IHN0eWxlPXt7IGJvcmRlcjogYDFweCBzb2xpZCAke1QuYm9yZGVyfWAsIGJhY2tncm91bmQ6IFQuYmdBbHQgfX0+XG4gICAgICAgICAgey8qIGxpc3QgaGVhZGVyICovfVxuICAgICAgICAgIDxkaXYgc3R5bGU9e3sgcGFkZGluZzogXCIwLjY1cmVtIDFyZW1cIiwgYm9yZGVyQm90dG9tOiBgMXB4IHNvbGlkICR7VC5ib3JkZXJ9YCwgZGlzcGxheTogXCJmbGV4XCIsIGp1c3RpZnlDb250ZW50OiBcInNwYWNlLWJldHdlZW5cIiwgYWxpZ25JdGVtczogXCJjZW50ZXJcIiB9fT5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPXt7IGZvbnRTaXplOiBcIjAuNjVyZW1cIiwgdGV4dFRyYW5zZm9ybTogXCJ1cHBlcmNhc2VcIiwgbGV0dGVyU3BhY2luZzogXCIwLjEyZW1cIiwgY29sb3I6IFQudGV4dE11dGVkIH19PlxuICAgICAgICAgICAgICBBdmFpbGFibGUgQ2F0ZWdvcmllcyAoe2NhdGVnb3JpZXMubGVuZ3RofSlcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIHsvKiBzY3JvbGxhYmxlIGNhdGVnb3J5IHJvd3MgKi99XG4gICAgICAgICAgPGRpdiByZWY9e3Njcm9sbFJlZn0gY2xhc3NOYW1lPVwiZGEtbGlzdC1zY3JvbGxcIiBzdHlsZT17eyBiYWNrZ3JvdW5kOiBULmJnIH19PlxuICAgICAgICAgICAge2NhdGVnb3JpZXMubWFwKChjYXQsIGkpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IHNlbGVjdGVkLmluY2x1ZGVzKGNhdCk7XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPGRpdiBrZXk9e2l9IHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICBib3JkZXJCb3R0b206IGAxcHggc29saWQgJHtULmJvcmRlcn1gLFxuICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogaXNTZWxlY3RlZCA/IFQuYmdBbHQgOiBULmJnLFxuICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogXCJiYWNrZ3JvdW5kIDAuMTVzXCIsXG4gICAgICAgICAgICAgICAgfX0+XG4gICAgICAgICAgICAgICAgICB7LyogY2hlY2tib3ggcm93ICovfVxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJkYS1jYXQtcm93XCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgZGlzcGxheTogXCJmbGV4XCIsIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsIGdhcDogXCIxMHB4XCIsIHBhZGRpbmc6IFwiMC43NXJlbSAxcmVtXCIsIGN1cnNvcjogXCJwb2ludGVyXCIgfX1cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gb25DaGFuZ2UoY2F0KX0+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjaGVja2VkPXtpc1NlbGVjdGVkfSBvbkNoYW5nZT17KCkgPT4gb25DaGFuZ2UoY2F0KX1cbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17eyB3aWR0aDogMTUsIGhlaWdodDogMTUsIGN1cnNvcjogXCJwb2ludGVyXCIsIGFjY2VudENvbG9yOiBULnRleHQsIGZsZXhTaHJpbms6IDAgfX0gLz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9e3sgZm9udFNpemU6IFwiMC44MnJlbVwiLCBmb250V2VpZ2h0OiBpc1NlbGVjdGVkID8gNDAwIDogMzAwLCBjb2xvcjogVC50ZXh0LCBmbGV4OiAxIH19PlxuICAgICAgICAgICAgICAgICAgICAgIHtjYXR9XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAge2lzU2VsZWN0ZWQgJiYgPENoZWNrQ2lyY2xlIHNpemU9ezEzfSBjb2xvcj17VC50ZXh0TXV0ZWR9IC8+fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIHsvKiBydWxlIHRleHRhcmVhIOKAlCBzaG93biB3aGVuIHNlbGVjdGVkICovfVxuICAgICAgICAgICAgICAgICAge2lzU2VsZWN0ZWQgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7IHBhZGRpbmc6IFwiMCAxcmVtIDFyZW0gMi41cmVtXCIsIGJhY2tncm91bmQ6IFQuYmdBbHQgfX0+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17eyBib3JkZXJMZWZ0OiBgMnB4IHNvbGlkICR7VC5ib3JkZXJTdHJ9YCwgcGFkZGluZ0xlZnQ6IFwiMC44NzVyZW1cIiB9fT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT17eyAuLi5TLnNlY0xhYmVsLCBtYXJnaW5Cb3R0b206IFwiMC4zNXJlbVwiLCBkaXNwbGF5OiBcImJsb2NrXCIgfX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bGUgZGVmaW5pdGlvbiBmb3Ige2NhdH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZGEtdGV4dGFyZWFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICByb3dzPXs1fVxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cnVsZXNbY2F0XSB8fCBmb3JtRGF0YVtgJHtmaWVsZFByZWZpeH1DYXRlZ29yeVJ1bGVzYF0/LltjYXRdIHx8IFwiXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtlID0+IG9uUnVsZUNoYW5nZShjYXQsIGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25Gb2N1cz17KCkgPT4gc2V0Rm9jdXNlZEZpZWxkKGAke2ZpZWxkUHJlZml4fS0ke2NhdH1gKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25CbHVyPXsoKSA9PiBzZXRGb2N1c2VkRmllbGQobnVsbCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgI
1136HBsYWNlaG9sZGVyPXtgRGVmaW5lIHNwZWNpZmljIHJ1bGVzIGZvciAke2NhdH3igKZgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17eyBib3JkZXJDb2xvcjogZm9jdXNlZEZpZWxkID09PSBgJHtmaWVsZFByZWZpeH0tJHtjYXR9YCA/IFQuYm9yZGVyU3RyIDogVC5ib3JkZXIgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBzdHlsZT17eyBmb250U2l6ZTogXCIwLjY1cmVtXCIsIGNvbG9yOiBULnRleHRNdXRlZCwgbWFyZ2luVG9wOiBcIjAuMzVyZW1cIiwgZm9udFN0eWxlOiBcIml0YWxpY1wiLCBmb250V2VpZ2h0OiAzMDAgfX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGU6IEZvciB7Y2F0fSwgc3BlY2lmeSBjbGluaWNhbCBjcml0ZXJpYSwgcmVxdWlyZWQgYXNzZXNzbWVudHMsIGFuZCBwcm90b2NvbHMuXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgey8qIGFkZCBjYXRlZ29yeSAqL31cbiAgICAgICAgICA8ZGl2IHN0eWxlPXt7IGJvcmRlclRvcDogYDFweCBkYXNoZWQgJHtULmJvcmRlcn1gLCBwYWRkaW5nOiBcIjFyZW1cIiB9fT5cbiAgICAgICAgICAgIHshc2hvd05ldyA/IChcbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJkYS1idG4tb3V0bGluZVwiIHN0eWxlPXt7IC4uLlMuYnRuT3V0bGluZSwgd2lkdGg6IFwiMTAwJVwiLCBqdXN0aWZ5Q29udGVudDogXCJjZW50ZXJcIiB9fVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFNob3dOZXcodHJ1ZSl9PlxuICAgICAgICAgICAgICAgIDxQbHVzIHNpemU9ezEzfSAvPiBBZGQgTmV3IENhdGVnb3J5XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3NOYW1lPVwiZGEtaW5wdXRcIiBzdHlsZT17eyBtYXJnaW5Cb3R0b206IFwiMC43NXJlbVwiIH19XG4gICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiIHZhbHVlPXtuZXdWYWx9IGF1dG9Gb2N1c1xuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2UgPT4gc2V0TmV3VmFsKGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgICAgIG9uS2V5RG93bj17ZSA9PiB7IGlmIChlLmtleSA9PT0gXCJFbnRlclwiKSB7IGUucHJldmVudERlZmF1bHQoKTsgb25BZGQoKTsgfSB9fVxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBuZXcgY2F0ZWdvcnkgbmFtZeKAplwiIC8+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17eyBkaXNwbGF5OiBcImZsZXhcIiwgZ2FwOiBcIjAuNjI1cmVtXCIsIGp1c3RpZnlDb250ZW50OiBcImZsZXgtZW5kXCIgfX0+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cImRhLWJ0bi1vdXRsaW5lXCIgc3R5bGU9e1MuYnRuT3V0bGluZX1cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4geyBzZXRTaG93TmV3KGZhbHNlKTsgc2V0TmV3VmFsKFwiXCIpOyB9fT5cbiAgICAgICAgICAgICAgICAgICAgQ2FuY2VsXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiZGEtYnRuLXByaW1hcnlcIiBzdHlsZT17Uy5idG5QcmltYXJ5fSBvbkNsaWNrPXtvbkFkZH0+XG4gICAgICAgICAgICAgICAgICAgIEFkZCBDYXRlZ29yeVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxzdHlsZT57Q1NTfTwvc3R5bGU+XG4gICAgICA8ZGl2IHN0eWxlPXt7IGRpc3BsYXk6IFwiZmxleFwiLCBtaW5IZWlnaHQ6IFwiMTAwdmhcIiwgYmFja2dyb3VuZDogVC5iZywgZm9udEZhbWlseTogVC5mb250LCBmb250V2VpZ2h0OiAzMDAsIGNvbG9yOiBULnRleHQgfX0+XG5cbiAgICAgICAgey8qIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCBTSURFQkFSIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqL31cbiAgICAgICAgPGFzaWRlIHN0eWxlPXt7XG4gICAgICAgICAgd2lkdGg6IFNJREVCQVJfVywgbWluSGVpZ2h0OiBcIjEwMHZoXCIsXG4gICAgICAgICAgcG9zaXRpb246IFwiZml4ZWRcIiwgdG9wOiAwLCBsZWZ0OiAwLCBib3R0b206IDAsIHpJbmRleDogMTAwLFxuICAgICAgICAgIGJhY2tncm91bmQ6IFQuYmcsIGJvcmRlclJpZ2h0OiBgMXB4IHNvbGlkICR7VC5ib3JkZXJ9YCxcbiAgICAgICAgICBkaXNwbGF5OiBcImZsZXhcIiwgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIixcbiAgICAgICAgfX0+XG4gICAgICAgICAgey8qIGJyYW5kICovfVxuICAgICAgICAgIDxkaXYgc3R5bGU9e3sgcGFkZGluZzogXCIxLjVyZW0gMS41cmVtIDFyZW1cIiwgYm9yZGVyQm90dG9tOiBgMXB4IHNvbGlkICR7VC5ib3JkZXJ9YCwgZmxleFNocmluazogMCB9fT5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9e3sgZGlzcGxheTogXCJmbGV4XCIsIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsIGdhcDogXCIxMHB4XCIsIG1hcmdpbkJvdHRvbTogXCIxLjI1cmVtXCIgfX0+XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICA8c3BhbiBzdHlsZT17eyBmb250U2l6ZTogXCIwLjlyZW1cIiwgZm9udFdlaWdodDogNDAwLCBsZXR0ZXJTcGFjaW5nOiBcIi0wLjAxZW1cIiwgY29sb3I6IFQudGV4dCB9fT5Eb2N0b3Jhc3Npc3QuQUk8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPXtTLnNlY0xhYmVsfT5QaHlzaWNpYW48L3NwYW4+XG4gICAgICAgICAgICA8cCBzdHlsZT17eyBmb250U2l6ZTogXCIwLjg1cmVtXCIsIGZvbnRXZWlnaHQ6IDQwMCwgY29sb3I6IFQudGV4dCwgbWFyZ2luOiAwIH19Pntkb2N0b3JOYW1lIHx8IFwiTG9hZGluZ+KAplwifTwvcD5cbiAgICAgICAgICAgIDxwIHN0eWxlPXt7IGZvbnRTaXplOiBcIjAuN3JlbVwiLCBjb2xvcjogVC50ZXh0TXV0ZWQsIG1hcmdpblRvcDogXCIycHhcIiB9fT57ZG9jdG9yU3BlY2lhbGl0eSB8fCBcIuKAlFwifTwvcD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgI
1136HsvKiBuYXYgKi99XG4gICAgICAgICAgPG5hdiBjbGFzc05hbWU9XCJkYS1zaWRlYmFyLXNjcm9sbFwiIHN0eWxlPXt7IGZsZXg6IDEsIG92ZXJmbG93WTogXCJhdXRvXCIsIHBhZGRpbmc6IFwiMC43NXJlbSAwXCIgfX0+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT17eyBmb250U2l6ZTogXCIwLjU4cmVtXCIsIHRleHRUcmFuc2Zvcm06IFwidXBwZXJjYXNlXCIsIGxldHRlclNwYWNpbmc6IFwiMC4xNWVtXCIsIGNvbG9yOiBULnRleHRNdXRlZCwgcGFkZGluZzogXCIwLjVyZW0gMS4yNXJlbVwiLCBkaXNwbGF5OiBcImJsb2NrXCIgfX0+U2V0dGluZ3M8L3NwYW4+XG4gICAgICAgICAgICB7bmF2SXRlbXMubWFwKChpdGVtLCBpKSA9PiAoXG4gICAgICAgICAgICAgIDxidXR0b24ga2V5PXtpfSBjbGFzc05hbWU9e2BkYS1uYXYtYnRuJHtpdGVtLmFjdGl2ZSA/IFwiIGRhLWFjdGl2ZVwiIDogXCJcIn1gfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2l0ZW0ub25DbGlja31cbiAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgd2lkdGg6IFwiMTAwJVwiLCBiYWNrZ3JvdW5kOiBcInRyYW5zcGFyZW50XCIsIGJvcmRlcjogXCJub25lXCIsXG4gICAgICAgICAgICAgICAgICB0ZXh0QWxpZ246IFwibGVmdFwiLCBwYWRkaW5nOiBcIjAuNTVyZW0gMS4yNXJlbVwiLFxuICAgICAgICAgICAgICAgICAgZm9udFNpemU6IFwiMC43OHJlbVwiLCBmb250V2VpZ2h0OiBpdGVtLmFjdGl2ZSA/IDQwMCA6IDMwMCxcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiBpdGVtLmFjdGl2ZSA/IFQudGV4dCA6IFQudGV4dFNlYyxcbiAgICAgICAgICAgICAgICAgIGN1cnNvcjogXCJwb2ludGVyXCIsIGRpc3BsYXk6IFwiZmxleFwiLCBhbGlnbkl0ZW1zOiBcImZsZXgtc3RhcnRcIiwgZ2FwOiBcIjEwcHhcIixcbiAgICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk6IFQuZm9udCwgdHJhbnNpdGlvbjogXCJhbGwgMC4xNXNcIiwgbGluZUhlaWdodDogMS40LFxuICAgICAgICAgICAgICAgICAgYm9yZGVyTGVmdDogaXRlbS5hY3RpdmUgPyBgMnB4IHNvbGlkICR7VC5ib3JkZXJTdHJ9YCA6IFwiMnB4IHNvbGlkIHRyYW5zcGFyZW50XCIsXG4gICAgICAgICAgICAgICAgfX0+XG4gICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9e3sgZmxleFNocmluazogMCwgbWFyZ2luVG9wOiBcIjJweFwiIH19PntpdGVtLmljb259PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuPntpdGVtLmxhYmVsfTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICApKX1cbiAgICAgICAgICA8L25hdj5cblxuICAgICAgICAgIHsvKiBsb2dvdXQgKi99XG4gICAgICAgICAgPGRpdiBzdHlsZT17eyBwYWRkaW5nOiBcIjFyZW0gMS4yNXJlbVwiLCBib3JkZXJUb3A6IGAxcHggc29saWQgJHtULmJvcmRlcn1gLCBmbGV4U2hyaW5rOiAwIH19PlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJkYS1idG4tb3V0bGluZVwiIHN0eWxlPXt7IC4uLlMuYnRuT3V0bGluZSwgd2lkdGg6IFwiMTAwJVwiLCBqdXN0aWZ5Q29udGVudDogXCJjZW50ZXJcIiB9fSBvbkNsaWNrPXtoYW5kbGVMb2dvdXR9PlxuICAgICAgICAgICAgICA8TG9nT3V0IHNpemU9ezEzfSAvPiBMb2dvdXRcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2FzaWRlPlxuXG4gICAgICAgIHsvKiDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgTUFJTiDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgKi99XG4gICAgICAgIDxtYWluIHN0eWxlPXt7IG1hcmdpbkxlZnQ6IFNJREVCQVJfVywgZmxleDogMSwgbWluV2lkdGg6IDAsIGRpc3BsYXk6IFwiZmxleFwiLCBmbGV4RGlyZWN0aW9uOiBcImNvbHVtblwiIH19PlxuXG4gICAgICAgICAgey8qIHRvcCBiYXIgKi99XG4gICAgICAgICAgPGRpdiBzdHlsZT17e1xuICAgICAgICAgICAgcG9zaXRpb246IFwic3RpY2t5XCIsIHRvcDogMCwgekluZGV4OiA1MCxcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IFQuYmcsIGJvcmRlckJvdHRvbTogYDFweCBzb2xpZCAke1QuYm9yZGVyfWAsXG4gICAgICAgICAgICBwYWRkaW5nOiBcIjAuODc1cmVtIDJyZW1cIixcbiAgICAgICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLCBqdXN0aWZ5Q29udGVudDogXCJzcGFjZS1iZXR3ZWVuXCIsIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXG4gICAgICAgICAgfX0+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8c3BhbiBzdHlsZT17Uy5zZWNMYWJlbH0+Q2xpbmljYWwgQ29uZmlndXJhdGlvbjwvc3Bhbj5cbiAgICAgICAgICAgICAgPGgxIHN0eWxlPXt7IGZvbnRTaXplOiBcIjFyZW1cIiwgZm9udFdlaWdodDogNDAwLCBsZXR0ZXJTcGFjaW5nOiBcIi0wLjAxZW1cIiwgY29sb3I6IFQudGV4dCwgbWFyZ2luOiAwIH19PlxuICAgICAgICAgICAgICAgIE1lZGljYWwgQ3VycmVudCBDb250ZXh0IEluc3RydWN0aW9uc1xuICAgICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cImRhLWJ0bi1wcmltYXJ5XCIgc3R5bGU9e1MuYnRuUHJpbWFyeX1cbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gbmF2aWdhdGUoYC9yZWdpc3Rlci1wYXRpZW50P2RvY3Rvcl9pZD0ke2RvY3RvcklkfWApfT5cbiAgICAgICAgICAgICAgPFVzZXJQbHVzIHNpemU9ezEzfSAvPiBSZWdpc3RlciBQYXRpZW50IOKGklxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICB7LyogYm9keSAqL31cbiAgICAgICAgICA8ZGl2IHN0eWxlPXt7IHBhZGRpbmc6IFwiMS41cmVtIDJyZW1cIiwgZmxleDogMSB9fT5cblxuICAgICAgICAgICAgey8qIHNwZWNpYWx0eSArIHN0YXQgc3RyaXAgKi99XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPXt7IGJvcmRlcjogYDFweCBzb2xpZCAke1QuYm9yZGVyfWAsIGJhY2tncm91bmQ6IFQuYmdBbHQsIHBhZGRpbmc6IFwiMXJlbSAxLjI1cmVtXCIsIG1hcmdpbkJvdHRvbTogXCIxLjVyZW1cIiwgZGlzcGxheTogXCJmbGV4XCIsIGdhcDogXCIxcHhcIiwgZmxleFdyYXA6IFwid3JhcFwiIH19PlxuICAgICAgICAgICAgICB7W1xuICAgICAgICAgICAgICAgI
1136HsgbGFiZWw6IFwiU3BlY2lhbHR5XCIsICAgICAgICAgIHZhbDogZG9jdG9yU3BlY2lhbGl0eSB8fCBcIk5vdCBTZXRcIiB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6IFwiTWVkaWNhbCBDYXRlZ29yaWVzXCIsIHZhbDogZm9ybURhdGEubWVkaWNhbE91dHB1dENhdGVnb3JpZXMubGVuZ3RoIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogXCJDdXJyZW50IENhdGVnb3JpZXNcIiwgdmFsOiBmb3JtRGF0YS5jdXJyZW50T3V0cHV0Q2F0ZWdvcmllcy5sZW5ndGggfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiBcIlN0YXR1c1wiLCAgICAgICAgICAgICB2YWw6IGZvcm1EYXRhLmlzQWN0aXZlID8gXCJBY3RpdmVcIiA6IFwiSW5hY3RpdmVcIiB9LFxuICAgICAgICAgICAgICBdLm1hcCgoeyBsYWJlbCwgdmFsIH0pID0+IChcbiAgICAgICAgICAgICAgICA8ZGl2IGtleT17bGFiZWx9IHN0eWxlPXt7IGJhY2tncm91bmQ6IFQuYmcsIHBhZGRpbmc6IFwiMC44NzVyZW0gMS4yNXJlbVwiLCBmbGV4OiBcIjEgMSAxNDBweFwiLCBtaW5XaWR0aDogMTMwIH19PlxuICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9e1Muc2VjTGFiZWx9PntsYWJlbH08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8cCBzdHlsZT17eyBmb250U2l6ZTogXCIwLjk1cmVtXCIsIGZvbnRXZWlnaHQ6IDQwMCwgY29sb3I6IFQudGV4dCwgbWFyZ2luOiAwIH19Pnt2YWx9PC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICB7LyogdGFiIGJhciAqL31cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9e3sgZGlzcGxheTogXCJmbGV4XCIsIGJvcmRlckJvdHRvbTogYDFweCBzb2xpZCAke1QuYm9yZGVyfWAsIG1hcmdpbkJvdHRvbTogXCIxLjVyZW1cIiB9fT5cbiAgICAgICAgICAgICAge1tcbiAgICAgICAgICAgICAgICB7IGtleTogXCJtZWRpY2FsXCIsICBsYWJlbDogXCJNZWRpY2FsIENvbnRleHRcIiwgIEljb246IEJyYWluICB9LFxuICAgICAgICAgICAgICAgIHsga2V5OiBcImN1cnJlbnRcIiwgIGxhYmVsOiBcIkN1cnJlbnQgQ29udGV4dFwiLCAgSWNvbjogVGFyZ2V0IH0sXG4gICAgICAgICAgICAgIF0ubWFwKCh7IGtleSwgbGFiZWwsIEljb24gfSkgPT4gKFxuICAgICAgICAgICAgICAgIDxidXR0b24ga2V5PXtrZXl9IGNsYXNzTmFtZT1cImRhLXRhYi1idG5cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0QWN0aXZlVGFiKGtleSl9XG4gICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBcIjAuNzVyZW0gMS4yNXJlbVwiLFxuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiBhY3RpdmVUYWIgPT09IGtleSA/IFQuYmcgOiBULmJnQWx0LFxuICAgICAgICAgICAgICAgICAgICBib3JkZXI6IFwibm9uZVwiLFxuICAgICAgICAgICAgICAgICAgICBib3JkZXJCb3R0b206IGFjdGl2ZVRhYiA9PT0ga2V5ID8gYDJweCBzb2xpZCAke1QuYm9yZGVyU3RyfWAgOiBcIjJweCBzb2xpZCB0cmFuc3BhcmVudFwiLFxuICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogXCIwLjc4cmVtXCIsIGZvbnRXZWlnaHQ6IGFjdGl2ZVRhYiA9PT0ga2V5ID8gNDAwIDogMzAwLFxuICAgICAgICAgICAgICAgICAgICBjb2xvcjogYWN0aXZlVGFiID09PSBrZXkgPyBULnRleHQgOiBULnRleHRNdXRlZCxcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogXCJpbmxpbmUtZmxleFwiLCBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLCBnYXA6IFwiNnB4XCIsXG4gICAgICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk6IFQuZm9udCwgY3Vyc29yOiBcInBvaW50ZXJcIiwgbWFyZ2luQm90dG9tOiBcIi0xcHhcIixcbiAgICAgICAgICAgICAgICAgIH19PlxuICAgICAgICAgICAgICAgICAgPEljb24gc2l6ZT17MTR9IC8+IHtsYWJlbH1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgey8qIGZvcm0gKi99XG4gICAgICAgICAgICA8Zm9ybSBvblN1Ym1pdD17aGFuZGxlU3VibWl0fT5cblxuICAgICAgICAgICAgICB7YWN0aXZlVGFiID09PSBcIm1lZGljYWxcIiAmJiByZW5kZXJDYXRlZ29yeVNlY3Rpb24oXCJtZWRpY2FsXCIpfVxuICAgICAgICAgICAgICB7YWN0aXZlVGFiID09PSBcImN1cnJlbnRcIiAmJiByZW5kZXJDYXRlZ29yeVNlY3Rpb24oXCJjdXJyZW50XCIpfVxuXG4gICAgICAgICAgICAgIHsvKiBhY3Rpb24gYmFyICovfVxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7IGJvcmRlcjogYDFweCBzb2xpZCAke1QuYm9yZGVyfWAsIGJhY2tncm91bmQ6IFQuYmdBbHQsIHBhZGRpbmc6IFwiMXJlbSAxLjI1cmVtXCIsIGRpc3BsYXk6IFwiZmxleFwiLCBqdXN0aWZ5Q29udGVudDogXCJzcGFjZS1iZXR3ZWVuXCIsIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsIGZsZXhXcmFwOiBcIndyYXBcIiwgZ2FwOiBcIjAuODc1cmVtXCIgfX0+XG5cbiAgICAgICAgICAgICAgICB7LyogbGVmdDogdG9nZ2xlICsgY291bnRzICovfVxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3sgZGlzcGxheTogXCJmbGV4XCIsIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsIGdhcDogXCIxLjVyZW1cIiwgZmxleFdyYXA6IFwid3JhcFwiIH19PlxuXG4gICAgICAgICAgICAgICAgICB7Lyogc3RhdHVzIHRvZ2dsZSAqL31cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3sgZGlzcGxheTogXCJmbGV4XCIsIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsIGdhcDogXCIwLjc1cmVtXCIgfX0+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPXt7IGZvbnRTaXplOiBcIjAuNzVyZW1cIiwgY29sb3I6IFQudGV4dFNlYywgZm9udFdlaWdodDogMzAwIH19PlJ1bGUgU3RhdHVzOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17eyBwb3NpdGlvbjogXCJyZWxhdGl2ZVwiLCB3aWR0aDogNDQsIGhlaWdodDogMjQsIGN1cnNvcjogXCJwb2ludGVyXCIgfX0gb25DbGljaz17KCkgPT4gc2V0Rm9ybURhdGEocCA9PiAoeyAuLi5wLCBpc0FjdGl2ZTogIXAuaXNBY3RpdmUgfSkpfT5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLCBpbnNldDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IGZvcm1EYXRhLmlzQWN0aXZlID8gVC50ZXh0IDogVC5ib3JkZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiBcImJhY2tncm91bmQgMC4yc1wiLFxuICAgICAgICAgICAgICAgICAgICAgI
1136H19IC8+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIiwgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCB0b3A6IDMsXG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiBmb3JtRGF0YS5pc0FjdGl2ZSA/IDIzIDogMyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IFQuYmcsIHRyYW5zaXRpb246IFwibGVmdCAwLjJzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgfX0gLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPXt7IGZvbnRTaXplOiBcIjAuN3JlbVwiLCB0ZXh0VHJhbnNmb3JtOiBcInVwcGVyY2FzZVwiLCBsZXR0ZXJTcGFjaW5nOiBcIjAuMWVtXCIsIGNvbG9yOiBULnRleHRNdXRlZCB9fT5cbiAgICAgICAgICAgICAgICAgICAgICB7Zm9ybURhdGEuaXNBY3RpdmUgPyBcIkFjdGl2ZVwiIDogXCJJbmFjdGl2ZVwifVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgey8qIGNvdW50cyAqL31cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3sgZGlzcGxheTogXCJmbGV4XCIsIGdhcDogXCIxLjI1cmVtXCIsIHBhZGRpbmdMZWZ0OiBcIjEuMjVyZW1cIiwgYm9yZGVyTGVmdDogYDFweCBzb2xpZCAke1QuYm9yZGVyfWAgfX0+XG4gICAgICAgICAgICAgICAgICAgIHtbXG4gICAgICAgICAgICAgICAgICAgICAgeyBsYWJlbDogXCJNZWRpY2FsXCIsIHZhbDogZm9ybURhdGEubWVkaWNhbE91dHB1dENhdGVnb3JpZXMubGVuZ3RoIH0sXG4gICAgICAgICAgICAgICAgICAgICAgeyBsYWJlbDogXCJDdXJyZW50XCIsIHZhbDogZm9ybURhdGEuY3VycmVudE91dHB1dENhdGVnb3JpZXMubGVuZ3RoIH0sXG4gICAgICAgICAgICAgICAgICAgIF0ubWFwKCh7IGxhYmVsLCB2YWwgfSkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYga2V5PXtsYWJlbH0gc3R5bGU9e3sgdGV4dEFsaWduOiBcImNlbnRlclwiIH19PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgc3R5bGU9e3sgZm9udFNpemU6IFwiMC42cmVtXCIsIGNvbG9yOiBULnRleHRNdXRlZCwgdGV4dFRyYW5zZm9ybTogXCJ1cHBlcmNhc2VcIiwgbGV0dGVyU3BhY2luZzogXCIwLjFlbVwiLCBtYXJnaW46IFwiMCAwIDJweFwiIH19PntsYWJlbH08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBzdHlsZT17eyBmb250U2l6ZTogXCIxLjFyZW1cIiwgZm9udFdlaWdodDogMzAwLCBsZXR0ZXJTcGFjaW5nOiBcIi0wLjAzZW1cIiwgY29sb3I6IFQudGV4dCwgbWFyZ2luOiAwIH19Pnt2YWx9PC9wPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgey8qIHJpZ2h0OiBuYXYgYnV0dG9ucyAqL31cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7IGRpc3BsYXk6IFwiZmxleFwiLCBnYXA6IFwiMC42MjVyZW1cIiB9fT5cbiAgICAgICAgICAgICAgICAgIHthY3RpdmVUYWIgPT09IFwiY3VycmVudFwiICYmIChcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiZGEtYnRuLW91dGxpbmVcIiBzdHlsZT17Uy5idG5PdXRsaW5lfVxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldEFjdGl2ZVRhYihcIm1lZGljYWxcIil9PlxuICAgICAgICAgICAgICAgICAgICAgIOKGkCBCYWNrXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgIHthY3RpdmVUYWIgPT09IFwibWVkaWNhbFwiICYmIChcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiZGEtYnRuLXByaW1hcnlcIiBzdHlsZT17Uy5idG5QcmltYXJ5fVxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldEFjdGl2ZVRhYihcImN1cnJlbnRcIil9PlxuICAgICAgICAgICAgICAgICAgICAgIE5leHQg4oaSXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgIHthY3RpdmVUYWIgPT09IFwiY3VycmVudFwiICYmIChcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3NOYW1lPVwiZGEtYnRuLXByaW1hcnlcIiBzdHlsZT17Uy5idG5QcmltYXJ5fT5cbiAgICAgICAgICAgICAgICAgICAgICA8Q2hlY2tDaXJjbGUgc2l6ZT17MTN9IC8+IFNhdmUgQ29uZmlndXJhdGlvblxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbWFpbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTWVkaWNhbEN1cnJlbnRDb250ZXh0UnVsZTsiXSwiZmlsZSI6Ii9hcHAvc3JjL2Rhc2hib2FyZC9NZWRpY2FsQ3VycmVudENvbnRleHRSdWxlLmpzeCJ9

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.