1import __vite__cjsImport0_react from "/node_modules/.vite/deps/react.js?v=47cb5776"; const React = __vite__cjsImport0_react.__esModule ? __vite__cjsImport0_react.default : __vite__cjsImport0_react; const useState = __vite__cjsImport0_react["useState"]; const useEffect = __vite__cjsImport0_react["useEffect"]; 2import axios from "/node_modules/.vite/deps/axios.js?v=a22cc16d"; 3const TICModelItem = ({ model, onEdit, onDelete }) => { 4 const getModelTypeColor = (type) => { 5 switch (type) { 6 case "indoor": 7 return "bg-green-100 text-green-800 border-green-300"; 8 case "outdoor": 9 return "bg-blue-100 text-blue-800 border-blue-300"; 10 case "both": 11 return "bg-purple-100 text-purple-800 border-purple-300"; 12 default: 13 return "bg-gray-100 text-gray-800 border-gray-300"; 14 } 15 }; 16 return /* @__PURE__ */ React.createElement("div", { className: "border border-gray-200 rounded-lg p-4 hover:bg-gray-50 transition-colors" }, /* @__PURE__ */ React.createElement("div", { className: "flex items-start justify-between" }, /* @__PURE__ */ React.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-3 mb-2" }, /* @__PURE__ */ React.createElement("h3", { className: "text-lg font-semibold text-gray-900 font-mono" }, model.modelNumber), /* @__PURE__ */ React.createElement( 17 "span", 18 { 19 className: `px-2 py-1 text-xs font-medium rounded-full border ${getModelTypeColor(model.modelType)}` 20 }, 21 model.modelType
22 )), model.description && /* @__PURE__ */ React.createElement("p", { className: "text-sm text-gray-600 mb-2" }, model.description), /* @__PURE__ */ React.createElement("div", { className: "text-xs text-gray-400" }, "ID: ", model.id, " ⢠Created: ", new Date(model.createdAt).toLocaleDateString())), /* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-2 ml-4" }, /* @__PURE__ */ React.createElement( 23 "button", 24 { 25 onClick: () => onEdit(model), 26 className: "px-3 py-1 text-sm bg-blue-600 text-white rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500" 27 }, 28 "Edit" 29 ), /* @__PURE__ */ React.createElement( 30 "button", 31 { 32 onClick: () => onDelete(model), 33 className: "px-3 py-1 text-sm bg-red-600 text-white rounded-md hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-red-500" 34 }, 35 "Delete" 36 )))); 37}; 38const TICModels = () => { 39 const [models, setModels] = useState([]); 40 const [filteredModels, setFilteredModels] = useState([]); 41 const [loading, setLoading] = useState(true); 42 const [error, setError] = useState(null); 43 const [success, setSuccess] = useState(null); 44 const [isModalOpen, setIsModalOpen] = useState(false); 45 const [isEditModalOpen, setIsEditModalOpen] = useState(false); 46 const [formLoading, setFormLoading] = useState(false); 47 const [editingModel, setEditingModel] = useState(null); 48 const [searchQuery, setSearchQuery] = useState(""); 49 const [filterType, setFilterType] = useState("all"); 50 const [sortBy, setSortBy] = useState("modelNumber"); 51 const availableModelTypes = React.useMemo(() => { 52 const types = new Set(models.map((model) => model.modelType)); 53 return Array.from(types).sort(); 54 }, [models]); 55 const [formData, setFormData] = useState({ 56 modelNumber: "", 57 description: "", 58 modelType: "" 59 }); 60 useEffect(() => { 61 fetchModels(); 62 }, []); 63 useEffect(() => { 64 let filtered = models; 65 if (searchQuery.trim()) { 66 const query = searchQuery.toLowerCase(); 67 filtered = filtered.filter( 68 (model) => model.modelNumber.toLowerCase().includes(query) || model.description && model.description.toLowerCase().includes(query) 69 ); 70 } 71 if (filterType !== "all") { 72 filtered = filtered.filter((model) => model.modelType === filterType); 73 } 74 filtered = [...filtered].sort((a, b) => { 75 switch (sortBy) { 76 case "id": 77 return a.id - b.id; 78 case "modelNumber": 79 return a.modelNumber.localeCompare(b.modelNumber); 80 case "modelType": 81 return a.modelType.localeCompare(b.modelType); 82 default: 83 return 0; 84 } 85 }); 86 setFilteredModels(filtered); 87 }, [models, searchQuery, filterType, sortBy]); 88 useEffect(() => { 89 if (success || error) { 90 const timer = setTimeout(() => { 91 setSuccess(null); 92 setError(null); 93 }, 5e3); 94 return () => clearTimeout(timer); 95 } 96 }, [success, error]); 97 const fetchModels = async () => { 98 setLoading(true); 99 setError(null); 100 try { 101 const response = await axios.get("/api/tic-models"); 102 setModels(response.data); 103 setFilteredModels(response.data); 104 } catch (err) { 105 console.error("Error fetching TIC models:", err); 106 setError(err.response?.data?.error || "Failed to load TIC models"); 107 } finally { 108 setLoading(false); 109 } 110 }; 111 const handleInputChange = (e) => { 112 const { name, value } = e.target; 113 setFormData((prev) => ({ 114 ...prev, 115 [name]: value 116 })); 117 }; 118 const handleSubmit = async (e) => { 119 e.preventDefault(); 120 setFormLoading(true); 121 setError(null); 122 setSuccess(null); 123 try { 124 await axios.post("/api/tic-models", { 125 modelNumber: formData.modelNumber, 126 description: formData.description || null, 127 modelType: formData.modelType 128 }); 129 setSuccess("TIC Model created successfully!"); 130 handleReset(); 131 closeModal(); 132 fetchModels(); 133 } catch (err) { 134 console.error("Error creating TIC model:", err); 135 setError(err.response?.data?.error || "Failed to create TIC model"); 136 } finally { 137 setFormLoading(false); 138 } 139 }; 140 const handleReset = () => { 141 setFormData({ 142 modelNumber: "", 143 description: "", 144 modelType: "indoor" 145 }); 146 }; 147 const openModal = () => { 148 handleReset(); 149 setIsModalOpen(true); 150 }; 151 const closeModal = () => { 152 setIsModalOpen(false); 153 handleReset(); 154 }; 155 const handleEdit = (model) => { 156 setEditingModel(model); 157 setFormData({ 158 modelNumber: model.modelNumber, 159 description: model.description || "", 160 modelType: model.modelType 161 }); 162 setIsEditModalOpen(true); 163 }; 164 const handleUpdate = async (e) => { 165 e.preventDefault(); 166 if (!editingModel) return; 167 setFormLoading(true); 168 setError(null); 169 setSuccess(null); 170 try { 171 await axios.put(`/api/tic-models/${editingModel.id}`, { 172 modelNumber: formData.modelNumber, 173 description: formData.description || null, 174 modelType: formData.modelType 175 }); 176 setSuccess("TIC Model updated successfully!"); 177 closeEditModal(); 178 fetchModels(); 179 } catch (err) { 180 console.error("Error updating TIC model:", err); 181 setError(err.response?.data?.error || "Failed to update TIC model"); 182 } finally { 183 setFormLoading(false); 184 } 185 }; 186 const closeEditModal = () => { 187 setIsEditModalOpen(false); 188 setEditingModel(null); 189 handleReset(); 190 }; 191 const handleDelete = async (model) => { 192 if (!confirm(`Are you sure you want to delete model "${model.modelNumber}"?`)) { 193 return; 194 } 195 setError(null); 196 setSuccess(null); 197 try { 198 await axios.delete(`/api/tic-models/${model.id}`); 199 setSuccess("TIC Model deleted successfully!"); 200 fetchModels(); 201 } catch (err) { 202 console.error("Error deleting TIC model:", err); 203 setError(err.response?.data?.error || "Failed to delete TIC model"); 204 } 205 }; 206 if (loading) { 207 return /* @__PURE__ */ React.createElement("div", { className: "container mx-auto px-4 py-8" }
207, /* @__PURE__ */ React.createElement("div", { className: "text-center py-10" }, /* @__PURE__ */ React.createElement("div", { className: "animate-spin h-10 w-10 text-blue-500 mx-auto mb-4" }, /* @__PURE__ */ React.createElement("svg", { className: "w-full h-full", fill: "none", viewBox: "0 0 24 24" }, /* @__PURE__ */ React.createElement( 208 "circle", 209 { 210 className: "opacity-25", 211 cx: "12", 212 cy: "12", 213 r: "10", 214 stroke: "currentColor", 215 strokeWidth: "4" 216 } 217 ), /* @__PURE__ */ React.createElement( 218 "path", 219 { 220 className: "opacity-75", 221 fill: "currentColor", 222 d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" 223 } 224 ))), /* @__PURE__ */ React.createElement("p", { className: "text-gray-600" }, "Loading TIC Models..."))); 225 } 226 return /* @__PURE__ */ React.createElement("div", { className: "container mx-auto px-4 py-8" }, /* @__PURE__ */ React.createElement("div", { className: "mb-6 flex justify-between items-center" }, /* @__PURE__ */ React.createElement("h1", { className: "text-3xl font-bold text-gray-900" }, "TIC Models"), /* @__PURE__ */ React.createElement( 227 "button", 228 { 229 onClick: openModal, 230 className: "px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2" 231 }, 232 "Create TIC Model" 233 )), error && /* @__PURE__ */ React.createElement("div", { className: "mb-6 p-4 bg-red-100 border border-red-400 text-red-700 rounded-md" }
233, error), success && /* @__PURE__ */ React.createElement("div", { className: "mb-6 p-4 bg-green-100 border border-green-400 text-green-700 rounded-md" }, success), /* @__PURE__ */ React.createElement("div", { className: "bg-white rounded-lg shadow-md p-6 mb-6" }, /* @__PURE__ */ React.createElement("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-4" }, /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement("label", { htmlFor: "search", className: "block text-sm font-medium text-gray-700 mb-1" }, "Search Models"), /* @__PURE__ */ React.createElement( 234 "input", 235 { 236 type: "text", 237 id: "search", 238 value: searchQuery, 239 onChange: (e) => setSearchQuery(e.target.value), 240 placeholder: "Search by model number or description...", 241 className: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500" 242 } 243 )), /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement("label", { htmlFor: "filterType", className: "block text-sm font-medium text-gray-700 mb-1" }, "Filter by Type"), /* @__PURE__ */ React.createElement( 244 "select", 245 { 246 id: "filterType", 247 value: filterType, 248 onChange: (e) => setFilterType(e.target.value), 249 className: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500" 250 }, 251 /* @__PURE__ */ React.createElement("option", { value: "all" }, "All Types"), 252 availableModelTypes.map((type) => /* @__PURE__ */ React.createElement("option", { key: type, value: type }, type))
253 )), /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement("label", { htmlFor: "sortBy", className: "block text-sm font-medium text-gray-700 mb-1" }, "Sort By"), /* @__PURE__ */ React.createElement( 254 "select", 255 { 256 id: "sortBy", 257 value: sortBy, 258 onChange: (e) => setSortBy(e.target.value), 259 className: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500" 260 }, 261 /* @__PURE__ */ React.createElement("option", { value: "modelNumber" }, "Model Number"), 262 /* @__PURE__ */ React.createElement("option", { value: "id" }, "ID"), 263 /* @__PURE__ */ React.createElement("option", { value: "modelType" }, "Model Type") 264 ))), /* @__PURE__ */ React.createElement("div", { className: "mt-4 text-sm text-gray-600" }, "Showing ", filteredModels.length, " of ", models.length, " models")), /* @__PURE__ */ React.createElement("div", { className: "bg-white rounded-lg shadow-md p-6" }, filteredModels.length > 0 ? /* @__PURE__ */ React.createElement("div", { className: "space-y-4" }, filteredModels.map((model) => /* @__PURE__ */ React.createElement( 265 TICModelItem, 266 { 267 key: model.id, 268 model, 269 onEdit: handleEdit, 270 onDelete: handleDelete 271 } 272 ))) : /* @__PURE__ */ React.createElement("div", { className: "text-center py-12" }, /* @__PURE__ */ React.createElement("div", { className: "text-gray-400 mb-4" }, /* @__PURE__ */ React.createElement( 273 "svg", 274 { 275 className: "w-16 h-16 mx-auto", 276 fill: "none", 277 viewBox: "0 0 24 24", 278 stroke: "currentColor" 279 }, 280 /* @__PURE__ */ React.createElement( 281 "path", 282 { 283 strokeLinecap: "round", 284 strokeLinejoin: "round", 285 strokeWidth: 1, 286 d: "M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" 287 } 288 )
289 )), /* @__PURE__ */ React.createElement("h3", { className: "text-lg font-medium text-gray-900 mb-2" }, "No Models Found"), /* @__PURE__ */ React.createElement("p", { className: "text-gray-600" }, searchQuery || filterType !== "all" ? "No models match your filters. Try adjusting your search." : "Get started by creating your first TIC model."))), isModalOpen && /* @__PURE__ */ React.createElement("div", { className: "fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 p-4" }, /* @__PURE__ */ React.createElement("div", { className: "bg-white rounded-lg shadow-xl w-full max-w-2xl" }, /* @__PURE__ */ React.createElement("div", { className: "p-6" }, /* @__PURE__ */ React.createElement("div", { className: "flex justify-between items-center mb-6" }, /* @__PURE__ */ React.createElement("h2", { className: "text-2xl font-bold text-gray-900" }, "Create TIC Model"), /* @__PURE__ */ React.createElement( 290 "button", 291 { 292 onClick: closeModal, 293 className: "text-gray-400 hover:text-gray-600 text-2xl font-bold" 294 }, 295 "Ã"
296 )), /* @__PURE__ */ React.createElement("form", { onSubmit: handleSubmit, className: "space-y-4" }, /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement( 297 "label", 298 { 299 htmlFor: "modelNumber", 300 className: "block text-sm font-medium text-gray-700 mb-1" 301 }, 302 "Model Number *" 303 ), /* @__PURE__ */ React.createElement( 304 "input", 305 { 306 type: "text", 307 id: "modelNumber", 308 name: "modelNumber", 309 value: formData.modelNumber, 310 onChange: handleInputChange, 311 required: true, 312 className: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 font-mono", 313 placeholder: "Enter model number (e.g., MXZ-2C20NAHZ)" 314 } 315 )), /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement( 316 "label", 317 { 318 htmlFor: "description", 319 className: "block text-sm font-medium text-gray-700 mb-1" 320 }, 321 "Description" 322 ), /* @__PURE__ */ React.createElement( 323 "textarea", 324 { 325 id: "description", 326 name: "description", 327 value: formData.description, 328 onChange: handleInputChange, 329 rows: 3, 330 className: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500", 331 placeholder: "Enter model description (optional)" 332 }
333 )), /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement( 334 "label", 335 { 336 htmlFor: "modelType", 337 className: "block text-sm font-medium text-gray-700 mb-1" 338 }, 339 "Model Type *" 340 ), /* @__PURE__ */ React.createElement( 341 "input", 342 { 343 type: "text", 344 id: "modelType", 345 name: "modelType", 346 value: formData.modelType, 347 onChange: handleInputChange, 348 required: true, 349 className: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500", 350 placeholder: "e.g., indoor, outdoor, both, etc." 351 } 352 ), /* @__PURE__ */ React.createElement("p", { className: "mt-1 text-sm text-gray-500" }, "Enter the model type (e.g., indoor, outdoor, both)")), /* @__PURE__ */ React.createElement("div", { className: "flex space-x-4 pt-4" }, /* @__PURE__ */ React.createElement( 353 "button", 354 { 355 type: "submit", 356 disabled: formLoading, 357 className: `flex-1 py-2 px-4 rounded-md text-white font-medium ${formLoading ? "bg-gray-400 cursor-not-allowed" : "bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2"}` 358 }, 359 formLoading ? "Creating..." : "Create Model" 360 ), /* @__PURE__ */ React.createElement( 361 "button", 362 { 363 type: "button", 364 onClick: closeModal, 365 className: "px-4 py-2 border border-gray-300 rounded-md text-gray-700 font-medium hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2" 366 }, 367 "Cancel" 368 )))))), isEditModalOpen && editingModel && /* @__PURE__ */ React.createElement("div", { className: "fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 p-4" }, /* @__PURE__ */ React.createElement("div", { className: "bg-white rounded-lg shadow-xl w-full max-w-2xl" }, /* @__PURE__ */ React.createElement("div", { className: "p-6" }, /* @__PURE__ */ React.createElement("div", { className: "flex justify-between items-center mb-6" }, /* @__PURE__ */ React.createElement("h2", { className: "text-2xl font-bold text-gray-900" }, "Edit TIC Model"), /* @__PURE__ */ React.createElement( 369 "button", 370 { 371 onClick: closeEditModal, 372 className: "text-gray-400 hover:text-gray-600 text-2xl font-bold" 373 }, 374 "Ã"
375 )), /* @__PURE__ */ React.createElement("form", { onSubmit: handleUpdate, className: "space-y-4" }, /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement( 376 "label", 377 { 378 htmlFor: "editModelNumber", 379 className: "block text-sm font-medium text-gray-700 mb-1" 380 }, 381 "Model Number *" 382 ), /* @__PURE__ */ React.createElement( 383 "input", 384 { 385 type: "text", 386 id: "editModelNumber", 387 name: "modelNumber", 388 value: formData.modelNumber, 389 onChange: handleInputChange, 390 required: true, 391 className: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 font-mono", 392 placeholder: "Enter model number" 393 } 394 )), /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement( 395 "label", 396 { 397 htmlFor: "editDescription", 398 className: "block text-sm font-medium text-gray-700 mb-1" 399 }, 400 "Description" 401 ), /* @__PURE__ */ React.createElement( 402 "textarea", 403 { 404 id: "editDescription", 405 name: "description", 406 value: formData.description, 407 onChange: handleInputChange, 408 rows: 3, 409 className: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500", 410 placeholder: "Enter model description (optional)" 411 }
412 )), /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement( 413 "label", 414 { 415 htmlFor: "editModelType", 416 className: "block text-sm font-medium text-gray-700 mb-1" 417 }, 418 "Model Type *" 419 ), /* @__PURE__ */ React.createElement( 420 "input", 421 { 422 type: "text", 423 id: "editModelType", 424 name: "modelType", 425 value: formData.modelType, 426 onChange: handleInputChange, 427 required: true, 428 className: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500", 429 placeholder: "e.g., indoor, outdoor, both, etc." 430 } 431 )), /* @__PURE__ */ React.createElement("div", { className: "flex space-x-4 pt-4" }, /* @__PURE__ */ React.createElement( 432 "button", 433 { 434 type: "submit", 435 disabled: formLoading, 436 className: `flex-1 py-2 px-4 rounded-md text-white font-medium ${formLoading ? "bg-gray-400 cursor-not-allowed" : "bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2"}` 437 }, 438 formLoading ? "Updating..." : "Update Model" 439 ), /* @__PURE__ */ React.createElement( 440 "button", 441 { 442 type: "button", 443 onClick: closeEditModal, 444 className: "px-4 py-2 border border-gray-300 rounded-md text-gray-700 font-medium hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2" 445 }, 446 "Cancel" 447 ))))))); 448}; 449export default TICModels; 450 451//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRJQ01vZGVscy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCdcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcydcblxuaW50ZXJmYWNlIFRJQ01vZGVsIHtcbiAgaWQ6IG51bWJlclxuICBtb2RlbE51bWJlcjogc3RyaW5nXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsXG4gIG1vZGVsVHlwZTogc3RyaW5nXG4gIGNyZWF0ZWRBdDogc3RyaW5nXG4gIHVwZGF0ZWRBdDogc3RyaW5nXG59XG5cbmludGVyZmFjZSBUSUNNb2RlbEl0ZW1Qcm9wcyB7XG4gIG1vZGVsOiBUSUNNb2RlbFxuICBvbkVkaXQ6IChtb2RlbDogVElDTW9kZWwpID0+IHZvaWRcbiAgb25EZWxldGU6IChtb2RlbDogVElDTW9kZWwpID0+IHZvaWRcbn1cblxuY29uc3QgVElDTW9kZWxJdGVtOiBSZWFjdC5GQzxUSUNNb2RlbEl0ZW1Qcm9wcz4gPSAoeyBtb2RlbCwgb25FZGl0LCBvbkRlbGV0ZSB9KSA9PiB7XG4gIGNvbnN0IGdldE1vZGVsVHlwZUNvbG9yID0gKHR5cGU6IHN0cmluZykgPT4ge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnaW5kb29yJzpcbiAgICAgICAgcmV0dXJuICdiZy1ncmVlbi0xMDAgdGV4dC1ncmVlbi04MDAgYm9yZGVyLWdyZWVuLTMwMCdcbiAgICAgIGNhc2UgJ291dGRvb3InOlxuICAgICAgICByZXR1cm4gJ2JnLWJsdWUtMTAwIHRleHQtYmx1ZS04MDAgYm9yZGVyLWJsdWUtMzAwJ1xuICAgICAgY2FzZSAnYm90aCc6XG4gICAgICAgIHJldHVybiAnYmctcHVycGxlLTEwMCB0ZXh0LXB1cnBsZS04MDAgYm9yZGVyLXB1cnBsZS0zMDAnXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2JnLWdyYXktMTAwIHRleHQtZ3JheS04MDAgYm9yZGVyLWdyYXktMzAwJ1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJib3JkZXIgYm9yZGVyLWdyYXktMjAwIHJvdW5kZWQtbGcgcC00IGhvdmVyOmJnLWdyYXktNTAgdHJhbnNpdGlvbi1jb2xvcnNcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1zdGFydCBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgbWluLXctMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTMgbWItMlwiPlxuICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXktOTAwIGZvbnQtbW9ub1wiPnttb2RlbC5tb2RlbE51bWJlcn08L2gzPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcHgtMiBweS0xIHRleHQteHMgZm9udC1tZWRpdW0gcm91bmRlZC1mdWxsIGJvcmRlciAke2dldE1vZGVsVHlwZUNvbG9yKG1vZGVsLm1vZGVsVHlwZSl9YH1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge21vZGVsLm1vZGVsVHlwZX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB7bW9kZWwuZGVzY3JpcHRpb24gJiYgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LWdyYXktNjAwIG1iLTJcIj57bW9kZWwuZGVzY3JpcHRpb259PC9wPn1cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC1ncmF5LTQwMFwiPlxuICAgICAgICAgICAgSUQ6IHttb2RlbC5pZH0g4oCiIENyZWF0ZWQ6IHtuZXcgRGF0ZShtb2RlbC5jcmVhdGVkQXQpLnRvTG9jYWxlRGF0ZVN0cmluZygpfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiBtbC00XCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gb25FZGl0KG1vZGVsKX1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInB4LTMgcHktMSB0ZXh0LXNtIGJnLWJsdWUtNjAwIHRleHQtd2hpdGUgcm91bmRlZC1tZCBob3ZlcjpiZy1ibHVlLTcwMCBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0yIGZvY3VzOnJpbmctYmx1ZS01MDBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIEVkaXRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBvbkRlbGV0ZShtb2RlbCl9XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJweC0zIHB5LTEgdGV4dC1zbSBiZy1yZWQtNjAwIHRleHQtd2hpdGUgcm91bmRlZC1tZCBob3ZlcjpiZy1yZWQtNzAwIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1yZWQtNTAwXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBEZWxldGVcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5jb25zdCBUSUNNb2RlbHM6IFJlYWN0LkZDID0gKCkgPT4ge1xuICBjb25zdCBbbW9kZWxzLCBzZXRNb2RlbHNdID0gdXNlU3RhdGU8VElDTW9kZWxbXT4oW10pXG4gIGNvbnN0IFtmaWx0ZXJlZE1vZGVscywgc2V0RmlsdGVyZWRNb2RlbHNdID0gdXNlU3RhdGU8VElDTW9kZWxbXT4oW10pXG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKHRydWUpXG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbClcbiAgY29uc3QgW3N1Y2Nlc3MsIHNldFN1Y2Nlc3NdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbClcblxuICAvLyBNb2RhbCBzdGF0ZXNcbiAgY29uc3QgW2lzTW9kYWxPcGVuLCBzZXRJc01vZGFsT3Blbl0gP
451SB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2lzRWRpdE1vZGFsT3Blbiwgc2V0SXNFZGl0TW9kYWxPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbZm9ybUxvYWRpbmcsIHNldEZvcm1Mb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbZWRpdGluZ01vZGVsLCBzZXRFZGl0aW5nTW9kZWxdID0gdXNlU3RhdGU8VElDTW9kZWwgfCBudWxsPihudWxsKVxuXG4gIC8vIEZpbHRlciBzdGF0ZXNcbiAgY29uc3QgW3NlYXJjaFF1ZXJ5LCBzZXRTZWFyY2hRdWVyeV0gPSB1c2VTdGF0ZSgnJylcbiAgY29uc3QgW2ZpbHRlclR5cGUsIHNldEZpbHRlclR5cGVdID0gdXNlU3RhdGU8c3RyaW5nPignYWxsJylcbiAgY29uc3QgW3NvcnRCeSwgc2V0U29ydEJ5XSA9IHVzZVN0YXRlPHN0cmluZz4oJ21vZGVsTnVtYmVyJylcblxuICAvLyBBdmFpbGFibGUgbW9kZWwgdHlwZXMgZnJvbSBkYXRhXG4gIGNvbnN0IGF2YWlsYWJsZU1vZGVsVHlwZXMgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCB0eXBlcyA9IG5ldyBTZXQobW9kZWxzLm1hcCgobW9kZWwpID0+IG1vZGVsLm1vZGVsVHlwZSkpXG4gICAgcmV0dXJuIEFycmF5LmZyb20odHlwZXMpLnNvcnQoKVxuICB9LCBbbW9kZWxzXSlcblxuICAvLyBGb3JtIGRhdGFcbiAgY29uc3QgW2Zvcm1EYXRhLCBzZXRGb3JtRGF0YV0gPSB1c2VTdGF0ZSh7XG4gICAgbW9kZWxOdW1iZXI6ICcnLFxuICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICBtb2RlbFR5cGU6ICcnLFxuICB9KVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgZmV0Y2hNb2RlbHMoKVxuICB9LCBbXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIEFwcGx5IGZpbHRlcnMgd2hlbmV2ZXIgbW9kZWxzLCBzZWFyY2hRdWVyeSwgZmlsdGVyVHlwZSwgb3Igc29ydEJ5IGNoYW5nZXNcbiAgICBsZXQgZmlsdGVyZWQgPSBtb2RlbHNcblxuICAgIC8vIEZpbHRlciBieSBzZWFyY2ggcXVlcnlcbiAgICBpZiAoc2VhcmNoUXVlcnkudHJpbSgpKSB7XG4gICAgICBjb25zdCBxdWVyeSA9IHNlYXJjaFF1ZXJ5LnRvTG93ZXJDYXNlKClcbiAgICAgIGZpbHRlcmVkID0gZmlsdGVyZWQuZmlsdGVyKFxuICAgICAgICAobW9kZWwpID0+XG4gICAgICAgICAgbW9kZWwubW9kZWxOdW1iZXIudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkgfHxcbiAgICAgICAgICAobW9kZWwuZGVzY3JpcHRpb24gJiYgbW9kZWwuZGVzY3JpcHRpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkpXG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gRmlsdGVyIGJ5IHR5cGVcbiAgICBpZiAoZmlsdGVyVHlwZSAhPT0gJ2FsbCcpIHtcbiAgICAgIGZpbHRlcmVkID0gZmlsdGVyZWQuZmlsdGVyKChtb2RlbCkgPT4gbW9kZWwubW9kZWxUeXBlID09PSBmaWx0ZXJUeXBlKVxuICAgIH1cblxuICAgIC8vIFNvcnQgcmVzdWx0c1xuICAgIGZpbHRlcmVkID0gWy4uLmZpbHRlcmVkXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBzd2l0Y2ggKHNvcnRCeSkge1xuICAgICAgICBjYXNlICdpZCc6XG4gICAgICAgICAgcmV0dXJuIGEuaWQgLSBiLmlkXG4gICAgICAgIGNhc2UgJ21vZGVsTnVtYmVyJzpcbiAgICAgICAgICByZXR1cm4gYS5tb2RlbE51bWJlci5sb2NhbGVDb21wYXJlKGIubW9kZWxOdW1iZXIpXG4gICAgICAgIGNhc2UgJ21vZGVsVHlwZSc6XG4gICAgICAgICAgcmV0dXJuIGEubW9kZWxUeXBlLmxvY2FsZUNvbXBhcmUoYi5tb2RlbFR5cGUpXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIDBcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgc2V0RmlsdGVyZWRNb2RlbHMoZmlsdGVyZWQpXG4gIH0sIFttb2RlbHMsIHNlYXJjaFF1ZXJ5LCBmaWx0ZXJUeXBlLCBzb3J0QnldKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHN1Y2Nlc3MgfHwgZXJyb3IpIHtcbiAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHNldFN1Y2Nlc3MobnVsbClcbiAgICAgICAgc2V0RXJyb3IobnVsbClcbiAgICAgIH0sIDUwMDApXG4gICAgICByZXR1cm4gKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVyKVxuICAgIH1cbiAgfSwgW3N1Y2Nlc3MsIGVycm9yXSlcblxuICBjb25zdCBmZXRjaE1vZGVscyA9IGFzeW5jICgpID0+IHtcbiAgICBzZXRMb2FkaW5nKHRydWUpXG4gICAgc2V0RXJyb3IobnVsbClcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLmdldCgnL2FwaS90aWMtbW9kZWxzJylcbiAgICAgIHNldE1vZGVscyhyZXNwb25zZS5kYXRhKVxuICAgICAgc2V0RmlsdGVyZWRNb2RlbHMocmVzcG9uc2UuZGF0YSlcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgVElDIG1vZGVsczonLCBlcnIpXG4gICAgICBzZXRFcnJvcihlcnIucmVzcG9uc2U/LmRhdGE/LmVycm9yIHx8ICdGYWlsZWQgdG8gbG9hZCBUSUMgbW9kZWxzJylcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBoYW5kbGVJbnB1dENoYW5nZSA9IChcbiAgICBlOiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudCB8IEhUTUxTZWxlY3RFbGVtZW50PlxuICApID0+IHtcbiAgICBjb25zdCB7IG5hbWUsIHZhbHVlIH0gPSBlLnRhcmdldFxuICAgIHNldEZvcm1EYXRhKChwcmV2KSA9PiAoe1xuICAgICAgLi4ucHJldixcbiAgICAgIFtuYW1lXTogdmFsdWUsXG4gICAgfSkpXG4gIH1cblxuICBjb25zdCBoYW5kbGVTdWJtaXQgPSBhc3luYyAoZTogUmVhY3QuRm9ybUV2ZW50KSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgc2V0Rm9ybUxvYWRpbmcodHJ1ZSlcbiAgICBzZXRFcnJvcihudWxsKVxuICAgIHNldFN1Y2Nlc3MobnVsbClcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBheGlvcy5wb3N0KCcvYXBpL3RpYy1tb2RlbHMnLCB7XG4gICAgICAgIG1vZGVsTnVtYmVyOiBmb3JtRGF0YS5tb2RlbE51bWJlcixcbiAgICAgICAgZGVzY3JpcHRpb246IGZvcm1EYXRhLmRlc2NyaXB0aW9uIHx8IG51bGwsXG4gICAgICAgIG1vZGVsVHlwZTogZm9ybURhdGEubW9kZWxUeXBlLFxuICAgICAgfSlcblxuICAgICAgc2V0U3VjY2VzcygnVElDIE1vZGVsIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5IScpXG4gICAgICBoYW5kbGVSZXNldCgpXG4gICAgICBjbG9zZU1vZGFsKClcbiAgICAgIGZldGNoTW9kZWxzKClcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgY3JlYXRpbmcgVElDIG1vZGVsOicsIGVycilcbiAgICAgIHNldEVycm9yKGVyci5yZXNwb25zZT8uZGF0YT8uZXJyb3IgfHwgJ0ZhaWxlZCB0byBjcmVhdGUgVElDIG1vZGVsJylcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0Rm9ybUxvYWRpbmcoZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGFuZGxlUmVzZXQgP
451SAoKSA9PiB7XG4gICAgc2V0Rm9ybURhdGEoe1xuICAgICAgbW9kZWxOdW1iZXI6ICcnLFxuICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgbW9kZWxUeXBlOiAnaW5kb29yJyxcbiAgICB9KVxuICB9XG5cbiAgY29uc3Qgb3Blbk1vZGFsID0gKCkgPT4ge1xuICAgIGhhbmRsZVJlc2V0KClcbiAgICBzZXRJc01vZGFsT3Blbih0cnVlKVxuICB9XG5cbiAgY29uc3QgY2xvc2VNb2RhbCA9ICgpID0+IHtcbiAgICBzZXRJc01vZGFsT3BlbihmYWxzZSlcbiAgICBoYW5kbGVSZXNldCgpXG4gIH1cblxuICBjb25zdCBoYW5kbGVFZGl0ID0gKG1vZGVsOiBUSUNNb2RlbCkgPT4ge1xuICAgIHNldEVkaXRpbmdNb2RlbChtb2RlbClcbiAgICBzZXRGb3JtRGF0YSh7XG4gICAgICBtb2RlbE51bWJlcjogbW9kZWwubW9kZWxOdW1iZXIsXG4gICAgICBkZXNjcmlwdGlvbjogbW9kZWwuZGVzY3JpcHRpb24gfHwgJycsXG4gICAgICBtb2RlbFR5cGU6IG1vZGVsLm1vZGVsVHlwZSxcbiAgICB9KVxuICAgIHNldElzRWRpdE1vZGFsT3Blbih0cnVlKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlVXBkYXRlID0gYXN5bmMgKGU6IFJlYWN0LkZvcm1FdmVudCkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgIGlmICghZWRpdGluZ01vZGVsKSByZXR1cm5cblxuICAgIHNldEZvcm1Mb2FkaW5nKHRydWUpXG4gICAgc2V0RXJyb3IobnVsbClcbiAgICBzZXRTdWNjZXNzKG51bGwpXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgYXhpb3MucHV0KGAvYXBpL3RpYy1tb2RlbHMvJHtlZGl0aW5nTW9kZWwuaWR9YCwge1xuICAgICAgICBtb2RlbE51bWJlcjogZm9ybURhdGEubW9kZWxOdW1iZXIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBmb3JtRGF0YS5kZXNjcmlwdGlvbiB8fCBudWxsLFxuICAgICAgICBtb2RlbFR5cGU6IGZvcm1EYXRhLm1vZGVsVHlwZSxcbiAgICAgIH0pXG5cbiAgICAgIHNldFN1Y2Nlc3MoJ1RJQyBNb2RlbCB1cGRhdGVkIHN1Y2Nlc3NmdWxseSEnKVxuICAgICAgY2xvc2VFZGl0TW9kYWwoKVxuICAgICAgZmV0Y2hNb2RlbHMoKVxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciB1cGRhdGluZyBUSUMgbW9kZWw6JywgZXJyKVxuICAgICAgc2V0RXJyb3IoZXJyLnJlc3BvbnNlPy5kYXRhPy5lcnJvciB8fCAnRmFpbGVkIHRvIHVwZGF0ZSBUSUMgbW9kZWwnKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRGb3JtTG9hZGluZyhmYWxzZSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBjbG9zZUVkaXRNb2RhbCA9ICgpID0+IHtcbiAgICBzZXRJc0VkaXRNb2RhbE9wZW4oZmFsc2UpXG4gICAgc2V0RWRpdGluZ01vZGVsKG51bGwpXG4gICAgaGFuZGxlUmVzZXQoKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlRGVsZXRlID0gYXN5bmMgKG1vZGVsOiBUSUNNb2RlbCkgPT4ge1xuICAgIGlmICghY29uZmlybShgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSBtb2RlbCBcIiR7bW9kZWwubW9kZWxOdW1iZXJ9XCI/YCkpIHtcbiAgICAgIHJldHVyblxuICAgI
451H1cblxuICAgIHNldEVycm9yKG51bGwpXG4gICAgc2V0U3VjY2VzcyhudWxsKVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGF4aW9zLmRlbGV0ZShgL2FwaS90aWMtbW9kZWxzLyR7bW9kZWwuaWR9YClcbiAgICAgIHNldFN1Y2Nlc3MoJ1RJQyBNb2RlbCBkZWxldGVkIHN1Y2Nlc3NmdWxseSEnKVxuICAgICAgZmV0Y2hNb2RlbHMoKVxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkZWxldGluZyBUSUMgbW9kZWw6JywgZXJyKVxuICAgICAgc2V0RXJyb3IoZXJyLnJlc3BvbnNlPy5kYXRhPy5lcnJvciB8fCAnRmFpbGVkIHRvIGRlbGV0ZSBUSUMgbW9kZWwnKVxuICAgIH1cbiAgfVxuXG4gIGlmIChsb2FkaW5nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGFpbmVyIG14LWF1dG8gcHgtNCBweS04XCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1jZW50ZXIgcHktMTBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFuaW1hdGUtc3BpbiBoLTEwIHctMTAgdGV4dC1ibHVlLTUwMCBteC1hdXRvIG1iLTRcIj5cbiAgICAgICAgICAgIDxzdmcgY2xhc3NOYW1lPVwidy1mdWxsIGgtZnVsbFwiIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxuICAgICAgICAgICAgICA8Y2lyY2xlXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3BhY2l0eS0yNVwiXG4gICAgICAgICAgICAgICAgY3g9XCIxMlwiXG4gICAgICAgICAgICAgICAgY3k9XCIxMlwiXG4gICAgICAgICAgICAgICAgcj1cIjEwXCJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoPVwiNFwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3BhY2l0eS03NVwiXG4gICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgZD1cIk00IDEyYTggOCAwIDAxOC04VjBDNS4zNzMgMCAwIDUuMzczIDAgMTJoNHptMiA1LjI5MUE3Ljk2MiA3Ljk2MiAwIDAxNCAxMkgwYzAgMy4wNDIgMS4xMzUgNS44MjQgMyA3LjkzOGwzLTIuNjQ3elwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LWdyYXktNjAwXCI+TG9hZGluZyBUSUMgTW9kZWxzLi4uPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJjb250YWluZXIgbXgtYXV0byBweC00IHB5LThcIj5cbiAgICAgIHsvKiBIZWFkZXIgKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLTYgZmxleCBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxoMSBjbGFzc05hbWU9XCJ0ZXh0LTN4bCBmb250LWJvbGQgdGV4dC1ncmF5LTkwMFwiPlRJQyBNb2RlbHM8L2gxPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgb25DbGljaz17b3Blbk1vZGFsfVxuICAgICAgICAgIGNsYXNzTmFtZT1cInB4LTQgcHktMiBiZy1ibHVlLTYwMCB0ZXh0LXdoaXRlIHJvdW5kZWQtbWQgaG92ZXI6YmctYmx1ZS03MDAgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMiBmb2N1czpyaW5nLWJsdWUtNTAwIGZvY3VzOnJpbmctb2Zmc2V0LTJcIlxuICAgICAgICA+XG4gICAgICAgICAgQ3JlYXRlIFRJQyBNb2RlbFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7LyogR2xvYmFsIE1lc3NhZ2VzICovfVxuICAgICAge2Vycm9yICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi02IHAtNCBiZy1yZWQtMTAwIGJvcmRlciBib3JkZXItcmVkLTQwMCB0ZXh0LXJlZC03MDAgcm91bmRlZC1tZFwiPlxuICAgICAgICAgIHtlcnJvcn1cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuXG4gICAgICB7c3VjY2VzcyAmJiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItNiBwLTQgYmctZ3JlZW4tMTAwIGJvcmRlciBib3JkZXItZ3JlZW4tNDAwIHRleHQtZ3JlZW4tNzAw
451IHJvdW5kZWQtbWRcIj5cbiAgICAgICAgICB7c3VjY2Vzc31cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuXG4gICAgICB7LyogRmlsdGVycyAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctd2hpdGUgcm91bmRlZC1sZyBzaGFkb3ctbWQgcC02IG1iLTZcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdyaWQtY29scy0xIG1kOmdyaWQtY29scy0zIGdhcC00XCI+XG4gICAgICAgICAgey8qIFNlYXJjaCAqL31cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGxhYmVsIGh0bWxGb3I9XCJzZWFyY2hcIiBjbGFzc05hbWU9XCJibG9jayB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheS03MDAgbWItMVwiPlxuICAgICAgICAgICAgICBTZWFyY2ggTW9kZWxzXG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgaWQ9XCJzZWFyY2hcIlxuICAgICAgICAgICAgICB2YWx1ZT17c2VhcmNoUXVlcnl9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0U2VhcmNoUXVlcnkoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBieSBtb2RlbCBudW1iZXIgb3IgZGVzY3JpcHRpb24uLi5cIlxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgcHgtMyBweS0yIGJvcmRlciBib3JkZXItZ3JheS0zMDAgcm91bmRlZC1tZCBzaGFkb3ctc20gZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMiBmb2N1czpyaW5nLWJsdWUtNTAwIGZvY3VzOmJvcmRlci1ibHVlLTUwMFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgey8qIFR5cGUgRmlsdGVyICovfVxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8bGFiZWwgaHRtbEZvcj1cImZpbHRlclR5cGVcIiBjbGFzc05hbWU9XCJibG9jayB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheS03MDAgbWItMVwiPlxuICAgICAgICAgICAgICBGaWx0ZXIgYnkgVHlwZVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgaWQ9XCJmaWx0ZXJUeXBlXCJcbiAgICAgICAgICAgICAgdmFsdWU9e2ZpbHRlclR5cGV9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0RmlsdGVyVHlwZShlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBweC0zIHB5LTIgYm9yZGVyIGJvcmRlci1ncmF5LTMwMCByb3VuZGVkLW1kIHNoYWRvdy1zbSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0yIGZvY3VzOnJpbmctYmx1ZS01MDAgZm9jdXM6Ym9yZGVyLWJsdWUtNTAwXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFsbFwiPkFsbCBUeXBlczwvb3B0aW9uPlxuICAgICAgICAgICAgICB7YXZhaWxhYmxlTW9kZWxUeXBlcy5tYXAoKHR5cGUpID0+IChcbiAgICAgICAgICAgICAgICA8b3B0aW9uIGtleT17dHlwZX0gdmFsdWU9e3R5cGV9PlxuICAgICAgICAgICAgICAgICAge3R5cGV9XG4gICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICB7LyogU29ydCBCeSAqL31cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGxhYmVsIGh0bWxGb3I9XCJzb3J0QnlcIiBjbGFzc05hbWU9XCJibG9jayB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheS03MDAgbWItMVwiPlxuICAgICAgICAgICAgICBTb3J0IEJ5XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICBpZD1cInNvcnRCeVwiXG4gICAgICAgICAgICAgIHZhbHVlPXtzb3J0Qnl9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0U29ydEJ5KGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIHB4LTMgcHktMiBib3JkZXIgYm9yZGVyLWdyYXktMzAwIHJvdW5kZWQtbWQgc2hhZG93LXNtIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1ibHVlLTUwMCBmb2N1czpib3JkZXItYmx1ZS01MDBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibW9kZWxOdW1iZXJcIj5Nb2RlbCBOdW1iZXI8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImlkXCI+SUQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm1vZGVsVHlwZVwiPk1vZGVsIFR5cGU8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTQgdGV4dC1zbSB0ZXh0LWdyYXktNjAwXCI+XG4gICAgICAgICAgU2hvd2luZyB7ZmlsdGVyZWRNb2RlbHMubGVuZ3RofSBvZiB7bW9kZWxzLmxlbmd0aH0gbW9kZWxzXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIHsvKiBNb2RlbHMgTGlzdCAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctd2h
451pdGUgcm91bmRlZC1sZyBzaGFkb3ctbWQgcC02XCI+XG4gICAgICAgIHtmaWx0ZXJlZE1vZGVscy5sZW5ndGggPiAwID8gKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS00XCI+XG4gICAgICAgICAgICB7ZmlsdGVyZWRNb2RlbHMubWFwKChtb2RlbCkgPT4gKFxuICAgICAgICAgICAgICA8VElDTW9kZWxJdGVtXG4gICAgICAgICAgICAgICAga2V5PXttb2RlbC5pZH1cbiAgICAgICAgICAgICAgICBtb2RlbD17bW9kZWx9XG4gICAgICAgICAgICAgICAgb25FZGl0PXtoYW5kbGVFZGl0fVxuICAgICAgICAgICAgICAgIG9uRGVsZXRlPXtoYW5kbGVEZWxldGV9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtY2VudGVyIHB5LTEyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtZ3JheS00MDAgbWItNFwiPlxuICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy0xNiBoLTE2IG14LWF1dG9cIlxuICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgIHN0cm9rZUxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICBzdHJva2VMaW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoP
451XsxfVxuICAgICAgICAgICAgICAgICAgZD1cIk05IDEyaDZtLTYgNGg2bTIgNUg3YTIgMiAwIDAxLTItMlY1YTIgMiAwIDAxMi0yaDUuNTg2YTEgMSAwIDAxLjcwNy4yOTNsNS40MTQgNS40MTRhMSAxIDAgMDEuMjkzLjcwN1YxOWEyIDIgMCAwMS0yIDJ6XCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1tZWRpdW0gdGV4dC1ncmF5LTkwMCBtYi0yXCI+Tm8gTW9kZWxzIEZvdW5kPC9oMz5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtZ3JheS02MDBcIj5cbiAgICAgICAgICAgICAge3NlYXJjaFF1ZXJ5IHx8IGZpbHRlclR5cGUgIT09ICdhbGwnXG4gICAgICAgICAgICAgICAgPyAnTm8gbW9kZWxzIG1hdGNoIHlvdXIgZmlsdGVycy4gVHJ5IGFkanVzdGluZyB5b3VyIHNlYXJjaC4nXG4gICAgICAgICAgICAgICAgOiAnR2V0IHN0YXJ0ZWQgYnkgY3JlYXRpbmcgeW91ciBmaXJzdCBUSUMgbW9kZWwuJ31cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7LyogQ3JlYXRlIE1vZGFsICovfVxuICAgICAge2lzTW9kYWxPcGVuICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmaXhlZCBpbnNldC0wIGJnLWJsYWNrIGJnLW9wYWNpdHktNTAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgei01MCBwLTRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLXdoaXRlIHJvdW5kZWQtbGcgc2hhZG93LXhsIHctZnVsbCBtYXgtdy0yeGxcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicC02XCI+XG4gICAgICAgICAgICAgIHsvKiBNb2RhbCBIZWFkZXIgKi99XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyIG1iLTZcIj5cbiAgICAgICAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC0yeGwgZm9udC1ib2xkIHRleHQtZ3JheS05MDBcIj5DcmVhdGUgVElDIE1vZGVsPC9oMj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXtjbG9zZU1vZGFsfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1ncmF5LTQwMCBob3Zlcjp0ZXh0LWdyYXktNjAwIHRleHQtMnhsIGZvbnQtYm9sZFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgw5dcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgey8qIEZvcm0gKi99XG4gICAgICAgICAgICAgIDxmb3JtIG9uU3VibWl0PXtoYW5kbGVTdWJtaXR9IGNsYXNzTmFtZT1cInNwYWNlLXktNFwiPlxuICAgICAgICAgICAgICAgIHsvKiBNb2RlbCBOdW1iZXIgKi99XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICBodG1sRm9yPVwibW9kZWxOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJibG9jayB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheS03MDAgbWItMVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIE1vZGVsIE51bWJlciAqXG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJtb2RlbE51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJtb2RlbE51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtmb3JtRGF0YS5tb2RlbE51bWJlcn1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUlucHV0Q2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgcHgtMyBweS0yIGJvcmRlciBib3JkZXItZ3JheS0zMDAgcm91bmRlZC1tZCBzaGFkb3ctc20gZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMiBmb2N1czpyaW5nLWJsdWUtNTAwIGZvY3VzOmJvcmRlci1ibHVlLTUwMCBmb250LW1vbm9cIlxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIG1vZGVsIG51bWJlciAoZS5nLiwgTVhaLTJDMjBOQUhaKVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgey8qIERlc2NyaXB0aW9uICovfVxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgaHRtbEZvcj1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYmxvY2sgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNzAwIG1iLTFcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICAgICAgICBpZD1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2Zvcm1EYXRhLmRlc2NyaXB0aW9ufVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlSW5wdXRDaGFuZ2V9XG4gICAgICAgICAgICAgICAgICAgIHJvd3M9ezN9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBweC0zIHB5LTIgYm9yZGVyIGJvcmRlci1ncmF5LTMwMCByb3VuZGVkLW1kIHNoYWRvdy1zbSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0yIGZvY3VzOnJpbmctYmx1ZS01MDAgZm9jdXM6Ym9yZGVyLWJsdWUtNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBtb2RlbCBkZXNjcmlwdGlvbiAob3B0aW9uYWwpXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICB7LyogTW9kZWwgVHlwZSAqL31cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGh0bWxGb3I9XCJtb2RlbFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJibG9jayB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheS03MDAgbWItMVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIE1vZGVsIFR5cGUgKlxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICB0eX
451BlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIGlkPVwibW9kZWxUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cIm1vZGVsVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtmb3JtRGF0YS5tb2RlbFR5cGV9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVJbnB1dENoYW5nZX1cbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIHB4LTMgcHktMiBib3JkZXIgYm9yZGVyLWdyYXktMzAwIHJvdW5kZWQtbWQgc2hhZG93LXNtIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1ibHVlLTUwMCBmb2N1czpib3JkZXItYmx1ZS01MDBcIlxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4sIGluZG9vciwgb3V0ZG9vciwgYm90aCwgZXRjLlwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMSB0ZXh0LXNtIHRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgRW50ZXIgdGhlIG1vZGVsIHR5cGUgKGUuZy4sIGluZG9vciwgb3V0ZG9vciwgYm90aClcbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIHsvKiBGb3JtIEFjdGlvbnMgKi99XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IHNwYWNlLXgtNCBwdC00XCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17Zm9ybUxvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGZsZXgtMSBweS0yIHB4LTQgcm91bmRlZC1tZCB0ZXh0LXdoaXRlIGZvbnQtbWVkaXVtICR7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUxvYWRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ2JnLWdyYXktNDAwIGN1cnNvci1ub3QtYWxsb3dlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJ2JnLWJsdWUtNjAwIGhvdmVyOmJnLWJsdWUtNzAwIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1ibHVlLTUwMCBmb2N1czpyaW5nLW9mZnNldC0yJ1xuICAgICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge2Zvcm1Mb2FkaW5nID8gJ0NyZWF0aW5nLi4uJyA6ICdDcmVhdGUgTW9kZWwnfVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2Nsb3NlTW9kYWx9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInB4LTQgcHktMiBib3JkZXIgYm9yZGVyLWdyYXktMzAwIHJvdW5kZWQtbWQgdGV4dC1ncmF5LTcwMCBmb250LW1lZGl1bSBob3ZlcjpiZy1ncmF5LTUwIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1ibHVlLTUwMCBmb2N1czpyaW5nLW9mZnNldC0yXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQ2FuY2VsXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cblxuICAgICAgey8qIEVkaXQgTW9kYWwgKi99XG4gICAgICB7aXNFZGl0TW9kYWxPcGVuICYmIGVkaXRpbmdNb2RlbCAmJiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZml4ZWQgaW5zZXQtMCBiZy1ibGFjayBiZy1vcGFjaXR5LTUwIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHotNTAgcC00XCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy13aGl0ZSByb3VuZGVkLWxnIHNoYWRvdy14bCB3LWZ1bGwgbWF4LXctMnhsXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInAtNlwiPlxuICAgICAgICAgICAgICB7LyogTW9kYWwgSGVhZGVyICovfVxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBtYi02XCI+XG4gICAgICAgICAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtYm9sZCB0ZXh0LWdyYXktOTAwXCI+RWRpdCBUSUMgTW9kZWw8L2gyPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2Nsb3NlRWRpdE1vZGFsfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1ncmF5LTQwMCBob3Zlcjp0ZXh0LWdyYXktNjAwIHRleHQtMnhsIGZvbnQtYm9sZFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgw5dcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgey8qIEZvcm0gKi99XG4gICAgICAgICAgICAgIDxmb3JtIG9uU3VibWl0PXtoYW5kbGVVcGRhdGV9IGNsYXNzTmFtZT1cInNwYWNlLXktNFwiPlxuICAgICAgICAgICAgICAgIHsvKiBNb2RlbCBOdW1iZXIgKi99XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICBodG1sRm9yPVwiZWRpdE1vZGVsTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYmxvY2sgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNzAwIG1iLTFcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBNb2RlbCBOdW1iZXIgKlxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIGlkPVwiZWRpdE1vZGVsTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cIm1vZGVsTnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2Zvcm1EYXRhLm1vZGVsTnVtYmVyfVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlSW5wdXRDaGFuZ2V9XG4gICAgICAgICAgICAgICAgICAgI
451HJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBweC0zIHB5LTIgYm9yZGVyIGJvcmRlci1ncmF5LTMwMCByb3VuZGVkLW1kIHNoYWRvdy1zbSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0yIGZvY3VzOnJpbmctYmx1ZS01MDAgZm9jdXM6Ym9yZGVyLWJsdWUtNTAwIGZvbnQtbW9ub1wiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgbW9kZWwgbnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICB7LyogRGVzY3JpcHRpb24gKi99XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICBodG1sRm9yPVwiZWRpdERlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYmxvY2sgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNzAwIG1iLTFcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICAgICAgICBpZD1cImVkaXREZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJkZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtmb3JtRGF0YS5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUlucHV0Q2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICByb3dzPXszfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgcHgtMyBweS0yIGJvcmRlciBib3JkZXItZ3JheS0zMDAgcm91bmRlZC1tZCBzaGFkb3ctc20gZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMiBmb2N1czpyaW5nLWJsdWUtNTAwIGZvY3VzOmJvcmRlci1ibHVlLTUwMFwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgbW9kZWwgZGVzY3JpcHRpb24gKG9wdGlvbmFsKVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgey8qIE1vZGVsIFR5cGUgKi99XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICBodG1sRm9yPVwiZWRpdE1vZGVsVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJsb2NrIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5LTcwMCBtYi0xXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgTW9kZWwgVHlwZSAqXG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJlZGl0TW9kZWxUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cIm1vZGVsVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtmb3JtRGF0YS5tb2RlbFR5cGV9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVJbnB1dENoYW5nZX1cbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIHB4LTMgcHktMiBib3JkZXIgYm9yZGVyLWdyYXktMzAwIHJvdW5kZWQtbWQgc2hhZG93LXNtIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1ibHVlLTUwMCBmb2N1czpib3JkZXItYmx1ZS01MDBcIlxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4sIGluZG9vciwgb3V0ZG9vciwgYm90aCwgZXRjLlwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgey8qIEZvcm0gQWN0aW9ucyAqL31cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggc3BhY2UteC00IHB0LTRcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtmb3JtTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgZmxleC0xIHB5LTIgcHgtNCByb3VuZGVkLW1kIHRleHQtd2hpdGUgZm9udC1tZWRpdW0gJHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtTG9hZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyAnYmctZ3JheS00MDAgY3Vyc29yLW5vdC1hbGxvd2VkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnYmctYmx1ZS02MDAgaG92ZXI6YmctYmx1ZS03MDAgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMiBmb2N1czpyaW5nLWJsdWUtNTAwIGZvY3VzOnJpbmctb2Zmc2V0LTInXG4gICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7Zm9ybUxvYWRpbmcgPyAnVXBkYXRpbmcuLi4nIDogJ1VwZGF0ZSBNb2RlbCd9XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17Y2xvc2VFZGl0TW9kYWx9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInB4LTQgcHktMiBib3JkZXIgYm9yZGVyLWdyYXktMzAwIHJvdW5kZWQtbWQgdGV4dC1ncmF5LTcwMCBmb250LW1lZGl1bSBob3ZlcjpiZy1ncmF5LTUwIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1ibHVlLTUwMCBmb2N1czpyaW5nLW9mZnNldC0yXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQ2FuY2VsXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBUSUNNb2RlbHNcbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxTQUFTLFVBQVUsaUJBQWlCO0FBQzNDLE9BQU8sV0FBVztBQWlCbEIsTUFBTSxlQUE0QyxDQUFDLEVBQUUsT0FBTyxRQUFRLFNBQVMsTUFBTTtBQUNqRixRQUFNLG9CQUFvQixDQUFDLFNBQWlCO0F
451BQzFDLFlBQVEsTUFBTTtBQUFBLE1BQ1osS0FBSztBQUNILGVBQU87QUFBQSxNQUNULEtBQUs7QUFDSCxlQUFPO0FBQUEsTUFDVCxLQUFLO0FBQ0gsZUFBTztBQUFBLE1BQ1Q7QUFDRSxlQUFPO0FBQUEsSUFDWDtBQUFBLEVBQ0Y7QUFFQSxTQUNFLG9DQUFDLFNBQUksV0FBVSw4RUFDYixvQ0FBQyxTQUFJLFdBQVUsc0NBQ2Isb0NBQUMsU0FBSSxXQUFVLG9CQUNiLG9DQUFDLFNBQUksV0FBVSxrQ0FDYixvQ0FBQyxRQUFHLFdBQVUsbURBQWlELE1BQU0sV0FBWSxHQUNqRjtBQUFBLElBQUM7QUFBQTtBQUFBLE1BQ0MsV0FBVyxxREFBcUQsa0JBQWtCLE1BQU0sU0FBUyxDQUFDO0FBQUE7QUFBQSxJQUVqRyxNQUFNO0FBQUEsRUFDVCxDQUNGLEdBQ0MsTUFBTSxlQUFlLG9DQUFDLE9BQUUsV0FBVSxnQ0FBOEIsTUFBTSxXQUFZLEdBQ25GLG9DQUFDLFNBQUksV0FBVSwyQkFBd0IsUUFDaEMsTUFBTSxJQUFHLGdCQUFhLElBQUksS0FBSyxNQUFNLFNBQVMsRUFBRSxtQkFBbUIsQ0FDMUUsQ0FDRixHQUNBLG9DQUFDLFNBQUksV0FBVSxrQ0FDYjtBQUFBLElBQUM7QUFBQTtBQUFBLE1BQ0MsU0FBUyxNQUFNLE9BQU8sS0FBSztBQUFBLE1BQzNCLFdBQVU7QUFBQTtBQUFBLElBQ1g7QUFBQSxFQUVELEdBQ0E7QUFBQSxJQUFDO0FBQUE7QUFBQSxNQUNDLFNBQVMsTUFBTSxTQUFTLEtBQUs7QUFBQSxNQUM3QixXQUFVO0FBQUE7QUFBQSxJQUNYO0FBQUEsRUFFRCxDQUNGLENBQ0YsQ0FDRjtBQUVKO0FBRUEsTUFBTSxZQUFzQixNQUFNO0FBQ2hDLFFBQU0sQ0FBQyxRQUFRLFNBQVMsSUFBSSxTQUFxQixDQUFDLENBQUM7QUFDbkQsUUFBTSxDQUFDLGdCQUFnQixpQkFBaUIsSUFBSSxTQUFxQixDQUFDLENBQUM7QUFDbkUsUUFBTSxDQUFDLFNBQVMsVUFBVSxJQUFJLFNBQVMsSUFBSTtBQUMzQyxRQUFN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
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.