1import { Q as QBreadcrumbsEl } from "./QBreadcrumbsEl-DJmFSikN.js"; 2import { a as QTabs, Q as QTab, c as QTabPanels, b as QTabPanel } from "./QTabPanels-BC9Oww_1.js"; 3import { aj as openFile, bA as getRunFiles, R as RunFileType, bC as getTaskFiles, L as getFile, aA as getRun, au as valueLabels$1, W as executeJobs, aE as deleteRuns, M as populateRunName, a8 as getJob } from "./realsyncUtils-B_eb3OgH.js"; 4import { v as valueLabels, e as copyToClipboard, aN as openUrl, av as createRunFile, aM as readCsv, aB as sortIc, bc as canViewFile, O as formatStorageSize, G as notifyInfo, j as jsUtilsExports, aA as generateId2, Q as getRunDuration, h as notifySuccess, n as naver, y as confirmDelete, b as notifyError, m as formatDateTimeForDisplay } from "./utils-Dl9t6EOZ.js"; 5import { m as mixins } from "./mixins-BCMXzTHA.js"; 6import { O as OutputField, I as IconCopy } from "./OutputField-DkpOfYYx.js"; 7import { _ as _export_sfc, c as createBlock, o as openBlock, w as withCtx, a as createVNode, r as resolveComponent, f as createElementBlock, e as createCommentVNode, b as createBaseVNode, i as withModifiers, K as resolveDirective, j as createTextVNode, t as toDisplayString, E as withDirectives, q as defineComponent, s as ref, R as onBeforeMount, x as watch, F as Fragment } from "./index-l2g1tnsc.js"; 8import { Q as QTd } from "./QTd-CqeugD16.js"; 9import { Q as QTable } from "./QTable-DkGSl4XC.js"; 10import { S as StatusFileViewer } from "./StatusFileViewer--1TQcuKo.js"; 11import { F as FileViewerDialog2 } from "./FileViewerDialog2-dcy5GH6m.js"; 12import { E as Empty } from "./Empty-xNUtCALd.js"; 13import { T as TaskDialog, R as RunFilesDialog, a as JobRunConfirmationDialog } from "./JobRunConfirmationDialog-AI5_iEO3.js"; 14import { D as Datagrid } from "./Datagrid-0ZPXgtsI.js"; 15import { i as initAgLicense } from "./AgGrid-8YtAO-sI.js"; 16import { A as AgGridVue } from "./AgGridVue-P7zRffUM.js"; 17import "./modelsMs-40GeEMKf.js"; 18import { S as SyncStatus } from "./SyncStatus-Ehz8Em6K.js"; 19import { a as getObjectFiles } from "./gooddataUtils-BZlE7NLp.js"; 20import { V as ViewErrorMessageDialog } from "./ViewErrorMessageDialog-OLDmWM6x.js"; 21import "./QResizeObserver-C-xPzvmf.js"; 22import "./rtl-DDpZOXNn.js"; 23import "./touch-BscSWsHh.js"; 24import "./selection-CtEbNG46.js"; 25import "./use-render-cache-DRJWLz-b.js"; 26import "./http-QV44vcaW.js"; 27import "./api-CsX1TBBI.js"; 28/* empty css */ 29import "./QList-uCfqyM8w.js"; 30import "./QSelect-a5Elgrcr.js"; 31import "./QChip-o69cw4ec.js"; 32import "./QItemSection-BtIVec04.js"; 33import "./QItemLabel-Bl1X4QV1.js"; 34import "./QMenu-CMxSVE7y.js"; 35import "./position-engine-DlL3Wjag.js"; 36import "./QSplitter-CB1BEeYW.js"; 37import "./TouchPan-6jTMktT1.js"; 38import "./styles-Ba8hxl-j.js"; 39import "./TextViewerDialog-BPyN4E_q.js"; 40import "./TextViewer-DMWZwv7n.js"; 41import "./Toolbar-Cf2a7rhK.js"; 42import "./QToolbarTitle-BeXkQQHt.js"; 43import "./QToolbar-DonaEblG.js"; 44import "./mixinsV3-DJOx874v.js"; 45import "./lodash-D-1jTqv6.js"; 46import "./Empty-DmGcIU4i.js"; 47import "./light-ChFcYHVz.js"; 48import "./Icon-XvtDqeG4.js"; 49import "./use-locale-DQNGyfxu.js"; 50import "./QForm-B7u6vHMU.js"; 51import "./InputFilteringSelect-liwXtivm.js"; 52import "./Tooltip-BL9mlxg7.js"; 53import "./Popover-DdmYwYku.js"; 54import "./Scrollbar-w6xdyLLY.js"; 55import "./InputJsonDialog-CZBYKuBU.js"; 56import "./CheckboxInline-OqdiZR8_.js"; 57import "./QTooltip-CLIBmLrc.js"; 58import "./IconMenu-DT6mxtJq.js"; 59import "./Icon-PX2LcDsd.js"; 60import "./MenuItem-DTtADa1D.js"; 61import "./ClosePopup-BJ95hjD9.js"; 62import "./Row-D4VaIJlq.js"; 63import "./Column-CHEOSUiF.js"; 64import "./InputTemplate-C6rgpBgP.js"; 65import "./vue-draggable-next.esm-bundler-B9T8NuU2.js"; 66import "./ComboBox2-BiTJohDd.js"; 67import "./GridSelect-CjyiI6pi.js"; 68import "./Avatar-DzN63Sfl.js"; 69import "./is-browser-DvVMOi1n.js"; 70import "./replaceable-D4umoBrm.js"; 71import "./upperFirst-DygzsnnD.js"; 72import "./EmailSkewProps-CwH3Sr0k.js"; 73import "./ReplaceFirstProps-BZlkvvP2.js"; 74import "./InputFormula-BBeIO9Bz.js"; 75import "./InputText-UxyPUCv5.js"; 76import "./ContentDialog-BqsEGoNh.js"; 77import "./QSpace-6jc8zFYb.js"; 78import "./Checkbox-CQ3iS9dA.js"; 79import "./Tooltip-Bsgn4djW.js"; 80import "./Button-BRwAsYpw.js"; 81import "./Separator-O_wR5Lqj.js"; 82import "./Table-Bjh46XsY.js"; 83import "./RouteLink-CCU5m11L.js"; 84import "./Tree3-B8c4x5ud.js"; 85import "./Tree-CGsirgHk.js"; 86import "./Loading-BV46Fun6.js"; 87import "./FadeInExpandTransition-Ba2kds_4.js"; 88import "./MaskOptions-GU6LYC7Y.js"; 89import "./FileNameSkewProps-RsWsfndg.js"; 90import "./InputSelect-BYAmTdat.js"; 91import "./DataGridStatusRenderer-BEpV8SXs.js"; 92import "./Close-CMLcMmhU.js"; 93const _sfc_main$g = { 94 props: { 95 model: Object 96 }, 97 components: { OutputField }, 98 data() { 99 return { 100 message: "" 101 }; 102 }, 103 methods: { 104 valueLabels() { 105 return valueLabels; 106 } 107 } 108}; 109function _sfc_render$g(_ctx, _cache, $props, $setup, $data, $options) {
110 const _component_OutputField = resolveComponent("OutputField"); 111 const _component_Column = resolveComponent("Column"); 112 const _component_Row = resolveComponent("Row"); 113 const _component_Card = resolveComponent("Card"); 114 return openBlock(), createBlock(_component_Card, { maxWidth: "800px" }, { 115 default: withCtx(() => [ 116 createVNode(_component_Row, null, { 117 default: withCtx(() => [ 118 createVNode(_component_Column, null, { 119 default: withCtx(() => [ 120 createVNode(_component_OutputField, { 121 label: "Job", 122 value: $props.model.name || $props.model.jobId 123 }, null, 8, ["value"]) 124 ]), 125 _: 1 126 }), 127 createVNode(_component_Column, null, { 128 default: withCtx(() => [ 129 createVNode(_component_OutputField, { 130 label: "Status", 131 value: $props.model.status, 132 valueLabels: $options.valueLabels().status 133 }, null, 8, ["value", "valueLabels"]) 134 ]), 135 _: 1 136 }) 137 ]), 138 _: 1 139 }), 140 createVNode(_component_Row, null, { 141 default: withCtx(() => [ 142 createVNode(_component_Column, null, { 143 default: withCtx(() => [ 144 createVNode(_component_OutputField, { 145 label: "Start At", 146 value: $props.model.startAt, 147 type: "datetime" 148 }, null, 8, ["value"]) 149 ]), 150 _: 1 151 }), 152 createVNode(_component_Column, null, { 153 default: withCtx(() => [ 154 createVNode(_component_OutputField, { 155 label: "End At", 156 value: $props.model.endAt, 157 type: "datetime" 158 }, null, 8, ["value"]) 159 ]), 160 _: 1 161 }) 162 ]), 163 _: 1 164 }), 165 createVNode(_component_Row, null, { 166 default: withCtx(() => [ 167 createVNode(_component_Column, null, { 168 default: withCtx(() => [ 169 createVNode(_component_OutputField, { 170 label: "Completed Tasks", 171 value: ($props.model.tasks || []).filter((task) => task.status === "completed").length 172 }, null, 8, ["value"]) 173 ]), 174 _: 1 175 }), 176 createVNode(_component_Column, null, { 177 default: withCtx(() => [ 178 createVNode(_component_OutputField, { 179 label: "Errored Tasks", 180 value: ($props.model.tasks || []).filter((task) => task.status === "error" || task.status === "aborted").length 181 }, null, 8, ["value"]) 182 ]), 183 _: 1 184 }) 185 ]), 186 _: 1 187 }), 188 createVNode(_component_Row, null, { 189 default: withCtx(() => [ 190 createVNode(_component_Column, null, { 191 default: withCtx(() => [ 192 createVNode(_component_OutputField, { 193 label: "Message", 194 value: $props.model.message 195 }, null, 8, ["value"]) 196 ]), 197 _: 1 198 }) 199 ]), 200 _: 1 201 }), 202 createVNode(_component_Row, null, { 203 default: withCtx(() => [ 204 createVNode(_component_Column, null, { 205 default: withCtx(() => [ 206 createVNode(_component_OutputField, { 207 label: "Details", 208 value: $props.model.details 209 }, null, 8, ["value"]) 210 ]), 211 _: 1 212 }) 213 ]), 214 _: 1 215 }) 216 ]), 217 _: 1 218 }); 219} 220const RunDetails = /* @__PURE__ */ _export_sfc(_sfc_main$g, [["render", _sfc_render$g], ["__file", "RunDetails.vue"]]); 221const _sfc_main$f = { 222 mixins: [mixins], 223 components: { StatusFileViewer, FileViewerDialog2, Empty }, 224 props: { 225 run: Object, 226 jobId: String 227 }, 228 data() { 229 return { 230 outputFiles: [], 231 statusFiles: [], 232 logFiles: [], 233 columns: [ 234 { name: "actions", align: "left" }, 235 { name: "type", field: "type", label: "Type", sortable: true, align: "left" }, 236 { name: "fileName", field: "fileName", label: "File Name", sortable: true, align: "left" }, 237 { name: "fileDescription", field: "fileDescription", label: "File Desc", sortable: true, align: "left" }, 238 { name: "fileSize", field: "fileSizeFormatted", label: "File Size", sortable: true, align: "left" } 239 ], 240 pagination: { 241 page: 1, 242 rowsPerPage: 0 243 }, 244 viewerDialogTitle: "", 245 viewerDialogOpen: false, 246 viewerDialogModel: {}, 247 statusFileViewerDialogOpen: false 248 }; 249 }, 250 watch: { 251 run: { 252 handler() { 253 this.loadFiles(); 254 }, 255 immediate: true 256 } 257 }, 258 methods: { 259 loadFiles() { 260 const files = getRunFiles(this.run).filter((file) => !file.taskId); 261 this.outputFiles = files.filter((file) => file.runFileType === RunFileType.outputFile); 262 this.statusFiles = files.filter((file) => file.runFileType === RunFileType.statusFile); 263 this.logFiles = files.filter((file) => file.runFileType === RunFileType.logFile); 264 }, 265 viewOutputFile(fileInfo) { 266 this.handleViewFile("Output File: " + fileInfo.fileName, fileInfo, "outputFile"); 267 }, 268 viewStatusFile(fileInfo) { 269 this.handleViewFile("Status File: " + fileInfo.fileName, fileInfo, "statusFile"); 270 }, 271 viewLogFile(fileInfo) { 272 this.handleViewFile("Log File: " + fileInfo.fileName, fileInfo, "logFile"); 273 }, 274 async getOpenableUrl(fileInfo) { 275 if (fileInfo.url.startsWith("http")) { 276 return fileInfo.url; 277 } 278 if (fileInfo.openableUrl) { 279 return fileInfo.openableUrl; 280 } 281 const resp = await this.processForm( 282 () => openFile({
283 runId: fileInfo.runId, 284 jobId: this.jobId, 285 url: fileInfo.url, 286 location: fileInfo.location 287 }) 288 ); 289 if (resp) { 290 fileInfo.openableUrl = resp.url; 291 return resp.url; 292 } 293 }, 294 async handleViewFile(title, fileInfo, fileType) { 295 if (fileInfo.url.startsWith("http")) { 296 openUrl(fileInfo.url); 297 return; 298 } 299 const url = await this.getOpenableUrl(fileInfo); 300 if (!url) { 301 return; 302 } 303 this.viewerDialogTitle = title; 304 this.viewerDialogModel = { ...fileInfo, ...{ viewUrl: url } }; 305 if (fileType === "statusFile") { 306 this.statusFileViewerDialogOpen = true; 307 } else { 308 this.viewerDialogOpen = true; 309 } 310 }, 311 async downloadFile(fileInfo) { 312 const url = await this.getOpenableUrl(fileInfo); 313 if (url) { 314 if (url.startsWith("http")) { 315 openUrl(url); 316 } else { 317 window.location.href = url; 318 } 319 } 320 }, 321 async copyFile(fileInfo) { 322 const url = await this.getOpenableUrl(fileInfo); 323 if (url) { 324 await copyToClipboard(url); 325 } 326 } 327 } 328}; 329const _hoisted_1$7 = { 330 key: 0, 331 class: "q-mb-md" 332}; 333const _hoisted_2$1 = { 334 key: 1, 335 class: "q-mb-md" 336}; 337const _hoisted_3$1 = { 338 key: 2, 339 class: "q-mb-md" 340}; 341function _sfc_render$f(_ctx, _cache) { 342 const _component_Icon = resolveComponent("Icon"); 343 const _component_Empty = resolveComponent("Empty"); 344 const _component_FileViewerDialog2 = resolveComponent("FileViewerDialog2"); 345 const _component_StatusFileViewer = resolveComponent("StatusFileViewer"); 346 return openBlock(), createElementBlock("div", null, [ 347 _ctx.outputFiles.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_1$7, [ 348 _cache[5] || (_cache[5] = createBaseVNode("span", null, "Output Files", -1)), 349 createVNode(QTable, { 350 rows: _ctx.outputFiles, 351 columns: _ctx.columns, 352 "row-key": "id", 353 "hide-pagination": true, 354 "rows-per-page-options": [0], 355 pagination: _ctx.pagination, 356 "onUpdate:pagination": _cache[0] || (_cache[0] = ($event) => _ctx.pagination = $event) 357 }, { 358 "body-cell-actions": withCtx((props) => [ 359 createVNode(QTd, null, { 360 default: withCtx(() => [ 361 createVNode(_component_Icon, { 362 name: "content_copy", 363 onClick: ($event) => _ctx.copyFile(props.row), 364 clickable: "", 365 tooltip: "Copy Url" 366 }, null, 8, ["onClick"]), 367 createVNode(_component_Icon, { 368 name: "cloud_download", 369 onClick: ($event) => _ctx.downloadFile(props.row), 370 clickable: "", 371 tooltip: "Download File" 372 }, null, 8, ["onClick"]), 373 props.row.canView ? (openBlock(), createBlock(_component_Icon, { 374 key: 0, 375 name: "visibility", 376 onClick: ($event) => _ctx.viewOutputFile(props.row), 377 clickable: "", 378 tooltip: "View File" 379 }, null, 8, ["onClick"])) : createCommentVNode("", true) 380 ]), 381 _: 2 382 }, 1024) 383 ]), 384 _: 1 385 }, 8, ["rows", "columns", "pagination"]) 386 ])) : createCommentVNode("", true), 387 _ctx.statusFiles.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_2$1, [ 388 _cache[6] || (_cache[6] = createBaseVNode("span", null, "Status Files", -1)), 389 createVNode(QTable, { 390 rows: _ctx.statusFiles, 391 columns: _ctx.columns, 392 "row-key": "id", 393 "hide-pagination": true, 394 "rows-per-page-options": [0], 395 pagination: _ctx.pagination, 396 "onUpdate:pagination": _cache[1] || (_cache[1] = ($event) => _ctx.pagination = $event) 397 }, { 398 "body-cell-actions": withCtx((props) => [ 399 createVNode(QTd, null, { 400 default: withCtx(() => [ 401 createVNode(_component_Icon, { 402 name: "content_copy", 403 onClick: ($event) => _ctx.copyFile(props.row), 404 clickable: "", 405 tooltip: "Copy Url" 406 }, null, 8, ["onClick"]), 407 createVNode(_component_Icon, { 408 name: "cloud_download", 409 onClick: ($event) => _ctx.downloadFile(props.row), 410 clickable: "", 411 tooltip: "Download File" 412 }, null, 8, ["onClick"]), 413 props.row.canView ? (openBlock(), createBlock(_component_Icon, { 414 key: 0, 415 name: "visibility", 416 onClick: ($event) => _ctx.viewStatusFile(props.row), 417 clickable: "", 418 tooltip: "View File" 419 }, null, 8, ["onClick"])) : createCommentVNode("", true) 420 ]), 421 _: 2 422 }, 1024) 423 ]), 424 _: 1 425 }, 8, ["rows", "columns", "pagination"]) 426 ])) : createCommentVNode("", true), 427 _ctx.logFiles.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_3$1, [ 428 createVNode(QTable, { 429 rows: _ctx.logFiles, 430 columns: _ctx.columns, 431 "row-key": "id", 432 "hide-pagination": true, 433 "rows-per-page-options": [0], 434 pagination: _ctx.pagination, 435 "onUpdate:pagination": _cache[2] || (_cache[2] = ($event) => _ctx.pagination = $event) 436 }, { 437 "body-cell-actions": withCtx((props) => [ 438 createVNode(QTd, null, { 439 default: withCtx(() => [ 440 createVNode(_component_Icon, { 441 name: "content_copy", 442 onClick: ($event) => _ctx.copyFile(props.row), 443 clickable: "", 444 tooltip: "Copy Url" 445 }, null, 8, ["onClick"]), 446 createVNode(_component_Icon, { 447 name: "cloud_download", 448 onClick: ($event) => _ctx.downloadFile(props.row), 449 clickable: "", 450 tooltip: "Download File" 451 }, null, 8, ["onClick"]), 452 props.row.canView ? (openBlock(), createBlock(_component_Icon, { 453 key: 0, 454 name: "visibility", 455 onClick: ($event) => _ctx.viewLogFile(props.row), 456 clickable: "", 457 tooltip: "View File" 458 }, null, 8, ["onClick"])) : createCommentVNode("", true) 459 ]), 460 _: 2 461 }, 1024) 462 ]), 463 _: 1 464 }, 8, ["rows", "columns", "pagination"]) 465 ])) : createCommentVNode("", true), 466 !_ctx.outputFiles.length && !_ctx.statusFiles.length && !_ctx.logFiles.length ? (openBlock(), createBlock(_component_Empty, { 467 key: 3, 468 desc: "No run-level files found" 469 })) : createCommentVNode("", true), 470 createVNode(_component_FileViewerDialog2, { 471 modelValue: _ctx.viewerDialogOpen, 472 "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => _ctx.viewerDialogOpen = $event), 473 title: _ctx.viewerDialogTitle, 474 fileInfo: _ctx.viewerDialogModel 475 }, null, 8, ["modelValue", "title", "fileInfo"]), 476 createVNode(_component_StatusFileViewer, { 477 modelValue: _ctx.statusFileViewerDialogOpen, 478 "onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => _ctx.statusFileViewerDialogOpen = $event), 479 title: _ctx.viewerDialogTitle, 480 fileInfo: _ctx.viewerDialogModel 481 }, null, 8, ["modelValue", "title", "fileInfo"]) 482 ]); 483} 484const RunFiles = /* @__PURE__ */ _export_sfc(_sfc_main$f, [["render", _sfc_render$f], ["__file", "RunFiles.vue"]]); 485const _sfc_main$e = { 486 mixins: [mixins], 487 components: { StatusFileViewer, FileViewerDialog2, IconCopy }, 488 props: { 489 title: String, 490 jobId: String, 491 modelValue: Boolean, 492 task: Object, 493 run: Object, 494 errorFiles: Array 495 }, 496 emits: ["cancel", "update:modelValue"], 497 data() { 498 return { 499 outputFiles: [], 500 statusFiles: [], 501 logFiles: [], 502 files: [], 503 columns: [ 504 { name: "actions", align: "left" }, 505 { name: "taskName", field: "taskName", label: "Task", sortable: true, align: "left" }, 506 { name: "type", field: "type", label: "Type", sortable: true, align: "left" }, 507 { name: "fileName", field: "fileName", label: "File Name", sortable: true, align: "left" }, 508 { name: "fileDescription", field: "fileDescription", label: "File Desc", sortable: true, align: "left" }, 509 { name: "fileSize", field: "fileSizeFormatted", label: "File Size", sortable: true, align: "left" } 510 ], 511 fileColumns: [ 512 { name: "actions", align: "left" }, 513 { name: "fileName", field: "fileName", label: "File Name", sortable: true, align: "left" }, 514 { name: "fileDescription", field: "fileDescription", label: "File Desc", sortable: true, align: "left" }, 515 { name: "fileSize", field: "fileSizeFormatted", label: "File Size", sortable: true, align: "left" } 516 ], 517 viewerDialogTitle: "", 518 viewerDialogOpen: false, 519 viewerDialogModel: {}, 520 statusFileViewerDialogOpen: false 521 }; 522 }, 523 computed: { 524 errorFilesToShow() { 525 var _a; 526 const files = (this.errorFiles && this.errorFiles.length > 0 ? this.errorFiles : (_a = this.task) == null ? void 0 : _a.errorSummaryUrls) || []; 527 return files.map((fileInfo) =>
527 createRunFile(fileInfo)); 528 } 529 }, 530 created() { 531 this.initingSuccess = true; 532 }, 533 watch: { 534 modelValue() { 535 if (!this.modelValue) { 536 return; 537 } 538 const files = getTaskFiles(this.run, this.task); 539 this.outputFiles = files.filter((file) => file.runFileType === RunFileType.outputFile); 540 this.statusFiles = files.filter((file) => file.runFileType === RunFileType.statusFile); 541 this.logFiles = files.filter((file) => file.runFileType === RunFileType.logFile); 542 } 543 }, 544 methods: { 545 close() { 546 this.$emit("cancel"); 547 }, 548 viewOutputFile(fileInfo) { 549 this.handleViewFile("Output File: " + fileInfo.fileName, fileInfo, "outputFile"); 550 }, 551 viewStatusFile(fileInfo) { 552 this.handleViewFile("Status File: " + fileInfo.fileName, fileInfo, "statusFile"); 553 }, 554 viewLogFile(fileInfo) { 555 this.handleViewFile("Log File: " + fileInfo.fileName, fileInfo, "logFile"); 556 }, 557 viewErrorFile(fileInfo) { 558 this.handleViewFile("Errors File: " + fileInfo.fileName, fileInfo, "statusFile"); 559 }, 560 async getOpenableUrl(fileInfo) { 561 if (fileInfo.url.startsWith("http")) { 562 return fileInfo.url; 563 } else { 564 if (fileInfo.openableUrl) { 565 return fileInfo.openableUrl; 566 } 567 const resp = await this.processForm( 568 () => openFile({ 569 runId: fileInfo.runId, 570 jobId: this.jobId, 571 url: fileInfo.url, 572 location: fileInfo.location 573 }) 574 ); 575 if (resp) { 576 fileInfo.openableUrl = resp.url; 577 return resp.url; 578 } 579 } 580 }, 581 async handleViewFile(title, fileInfo, fileType) { 582 if (fileInfo.url.startsWith("http")) { 583 openUrl(fileInfo.url); 584 return; 585 } 586 const url = await this.getOpenableUrl(fileInfo); 587 if (!url) { 588 return; 589 } 590 this.viewerDialogTitle = title; 591 this.viewerDialogModel = { 592 ...fileInfo, 593 ...{ viewUrl: url } 594 }; 595 if (fileType === "statusFile") { 596 this.statusFileViewerDialogOpen = true; 597 } else { 598 this.viewerDialogOpen = true; 599 } 600 }, 601 async openInTab(fileInfo) { 602 const url = await this.getOpenableUrl(fileInfo); 603 if (url) { 604 openUrl(url); 605 } 606 }, 607 async downloadFile(fileInfo) { 608 let url = await this.getOpenableUrl(fileInfo); 609 if (url) { 610 if (url.startsWith("http")) { 611 openUrl(url); 612 } else { 613 window.location.href = url; 614 } 615 } 616 }, 617 async copyFile(fileInfo) { 618 let url = await this.getOpenableUrl(fileInfo); 619 if (url) { 620 await copyToClipboard(url); 621 } 622 } 623 } 624}; 625const _hoisted_1$6 = { 626 key: 0, 627 class: "q-mb-md" 628}; 629const _hoisted_2 = { 630 key: 1, 631 class: "q-mb-md" 632}; 633const _hoisted_3 = { 634 key: 2, 635 class: "q-mb-md" 636}; 637const _hoisted_4 = { 638 key: 3, 639 class: "q-mb-md" 640}; 641function _sfc_render$e(_ctx, _cache) { 642 const _component_Icon = resolveComponent("Icon"); 643 const _component_IconCopy = resolveComponent("IconCopy"); 644 const _component_FileViewerDialog2 = resolveComponent("FileViewerDialog2"); 645 const _component_StatusFileViewer = resolveComponent("StatusFileViewer"); 646 const _component_ContentDialog = resolveComponent("ContentDialog"); 647 return openBlock(), createBlock(_component_ContentDialog, { 648 title: _ctx.title || "Files", 649 modelValue: _ctx.modelValue, 650 "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => _ctx.$emit("update:modelValue")), 651 message: _ctx.message, 652 messageType: _ctx.messageType, 653 initing: _ctx.initing, 654 initingSuccess: _ctx.initingSuccess, 655 processing: _ctx.processing, 656 height: "auto", 657 width: "1200px", 658 closeMode: "", 659 persistent: false, 660 onCancel: _ctx.close 661 }, { 662 default: withCtx(() => [ 663 _ctx.outputFiles && _ctx.outputFiles.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_1$6, [ 664 _cache[3] || (_cache[3] = createBaseVNode("span", { class: "" }, "Output Files", -1)), 665 createVNode(QTable, { 666 rows: _ctx.outputFiles, 667 columns: _ctx.columns, 668 "row-key": "id", 669 "hide-pagination": true, 670 "rows-per-page-options": [0] 671 }, { 672 "body-cell-actions": withCtx((props) => [ 673 createVNode(QTd, null, { 674 default: withCtx(() => [ 675 createVNode(_component_Icon, { 676 name: "content_copy", 677 onClick: ($event) => _ctx.copyFile(props.row), 678 clickable: "", 679 tooltip: "Copy Url" 680 }, null, 8, ["onClick"]), 681 createVNode(_component_Icon, { 682 name: "cloud_download", 683 onClick: ($event) => _ctx.downloadFile(props.row), 684 clickable: "", 685 tooltip: "Download File" 686 }, null, 8, ["onClick"]), 687 props.row.canView ? (openBlock(), createBlock(_component_Icon, { 688 key: 0, 689 name: "visibility", 690 onClick: ($event) => _ctx.viewOutputFile(props.row), 691 clickable: "", 692 tooltip: "View File" 693 }, null, 8, ["onClick"])) : createCommentVNode("", true) 694 ]), 695 _: 2 696 }, 1024) 697 ]), 698 _: 1 699 }, 8, ["rows", "columns"]) 700 ])) : createCommentVNode("", true), 701 _ctx.statusFiles && _ctx.statusFiles.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_2, [ 702 _cache[4] || (_cache[4] = createBaseVNode("span", { class: "" }, "Status Files", -1)), 703 createVNode(QTable, { 704 rows: _ctx.statusFiles, 705 columns: _ctx.columns, 706 "row-key": "id", 707 "hide-pagination": true, 708 "rows-per-page-options": [0] 709 }, { 710 "body-cell-actions": withCtx((props) => [ 711 createVNode(QTd, null, { 712 default: withCtx(() => [ 713 createVNode(_component_IconCopy, { 714 content: props.row.url, 715 tooltip: "Copy url to Clipboard" 716 }, null, 8, ["content"]), 717 createVNode(_component_Icon, { 718 name: "cloud_download", 719 onClick: ($event) => _ctx.downloadFile(props.row), 720 clickable: "", 721 tooltip: "Download File" 722 }, null, 8, ["onClick"]), 723 props.row.canView ? (openBlock(), createBlock(_component_Icon, { 724 key: 0, 725 name: "visibility", 726 onClick: ($event) => _ctx.viewStatusFile(props.row), 727 clickable: "", 728 tooltip: "View File" 729 }, null, 8, ["onClick"])) : createCommentVNode("", true) 730 ]), 731 _: 2 732 }, 1024) 733 ]), 734 _: 1 735 }, 8, ["rows", "columns"]) 736 ])) : createCommentVNode("", true), 737 _ctx.errorFilesToShow && _ctx.errorFilesToShow.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_3, [ 738 _cache[5] || (_cache[5] = createBaseVNode("span", { class: "" }, "Errors", -1)), 739 createVNode(QTable, { 740 rows: _ctx.errorFilesToShow, 741 columns: _ctx.fileColumns, 742 "row-key": "id", 743 "hide-pagination": true, 744 "rows-per-page-options": [0] 745 }, { 746 "body-cell-actions": withCtx((props) => [ 747 createVNode(QTd, null, { 748 default: withCtx(() => [ 749 createVNode(_component_IconCopy, { 750 content: props.row.url, 751 tooltip: "Copy url to Clipboard" 752 }, null, 8, ["content"]), 753 createVNode(_component_Icon, { 754 name: "cloud_download", 755 onClick: ($event) => _ctx.downloadFile(props.row), 756 clickable: "", 757 tooltip: "Download File" 758 }, null, 8, ["onClick"]), 759 props.row.canView ? (openBlock(), createBlock(_component_Icon, { 760 key: 0, 761 name: "visibility", 762 onClick: ($event) => _ctx.viewErrorFile(props.row), 763 clickable: "", 764 tooltip: "View File" 765 }, null, 8, ["onClick"])) : createCommentVNode("", true) 766 ]), 767 _: 2 768 }, 1024) 769 ]), 770 _: 1 771 }, 8, ["rows", "columns"]) 772 ])) : createCommentVNode("", true), 773 _ctx.logFiles && _ctx.logFiles.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_4, [ 774 _cache[6] || (_cache[6] = createBaseVNode("span", { class: "" }, "Log Files", -1)), 775 createVNode(QTable, { 776 rows: _ctx.logFiles, 777 columns: _ctx.columns, 778 "row-key": "id", 779 "hide-pagination": true, 780 "rows-per-page-options": [0] 781 }, { 782 "body-cell-actions": withCtx((props) => [ 783 createVNode(QTd, null, { 784 default: withCtx(() => [ 785 createVNode(_component_IconCopy, { 786 content: props.row.url, 787 tooltip: "Copy url to Clipboard" 788 }, null, 8, ["content"]), 789 createVNode(_component_Icon, { 790 name: "cloud_download", 791 onClick: ($event) => _ctx.downloadFile(props.row), 792 clickable: "", 793 tooltip: "Download File" 794 }, null, 8, ["onClick"]), 795 props.row.canView ? (openBlock(), createBlock(_component_Icon, { 796 key: 0, 797 name: "visibility", 798 onClick: ($event) => _ctx.viewLogFile(props.row), 799 clickable: "", 800 tooltip: "View File" 801 }, null, 8, ["onClick"])) : createCommentVNode("", true) 802 ]), 803 _: 2 804 }, 1024) 805 ]), 806 _: 1 807 }, 8, ["rows", "columns"]) 808 ])) : createCommentVNode("", true), 809 createVNode(_component_FileViewerDialog2, { 810 modelValue: _ctx.viewerDialogOpen, 811 "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.viewerDialogOpen = $event), 812 title: _ctx.viewerDialogTitle, 813 fileInfo: _ctx.viewerDialogModel 814 }, null, 8, ["modelValue", "title", "fileInfo"]), 815 createVNode(_component_StatusFileViewer, { 816 modelValue: _ctx.statusFileViewerDialogOpen, 817 "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => _ctx.statusFileViewerDialogOpen = $event), 818 title: _ctx.viewerDialogTitle, 819 fileInfo: _ctx.viewerDialogModel 820 }, null, 8, ["modelValue", "title", "fileInfo"]) 821 ]), 822 _: 1 823 }, 8, ["title", "modelValue", "message", "messageType", "initing", "initingSuccess", "processing", "onCancel"]); 824} 825const TaskFilesDialog = /* @__PURE__ */ _export_sfc(_sfc_main$e, [["render", _sfc_render$e], ["__file", "TaskFilesDialog.vue"]]); 826const _sfc_main$d = { 827 props: { 828 params: Object 829 }, 830 data() { 831 return { 832 row: {} 833 }; 834 }, 835 created() { 836 var _a; 837 this.row = ((_a = this.params) == null ? void 0 : _a.data) || {}; 838 }, 839 methods: { 840 show() { 841 var _a; 842 return !this.row.summaryTotal && (((_a = this.row.stats) == null ? void 0 : _a.errors) || 0) > 0; 843 }, 844 viewErrors() { 845 var _a; 846 if ((_a = this.params) == null ? void 0 : _a.viewErrors) { 847 this.params.viewErrors(this.row); 848 } 849 } 850 } 851}; 852const _hoisted_1$5 = { 853 key: 0, 854 style: { "margin-top": "2px" } 855}; 856function _sfc_render$d(_ctx, _cache, $props, $setup, $data, $options) {
857 const _component_Icon = resolveComponent("Icon"); 858 return $options.show() ? (openBlock(), createElementBlock("div", _hoisted_1$5, [ 859 createVNode(_component_Icon, { 860 name: "visibility", 861 onMousedown: _cache[0] || (_cache[0] = withModifiers(() => { 862 }, ["stop"])), 863 onPointerdown: _cache[1] || (_cache[1] = withModifiers(() => { 864 }, ["stop"])), 865 onClick: withModifiers($options.viewErrors, ["stop"]), 866 clickable: "", 867 tooltip: "View Errors" 868 }, null, 8, ["onClick"]) 869 ])) : createCommentVNode("", true); 870} 871const DataCopyObjectsSummaryAction = /* @__PURE__ */ _export_sfc(_sfc_main$d, [["render", _sfc_render$d], ["__file", "DataCopyObjectsSummaryAction.vue"]]); 872const _sfc_main$c = { 873 components: { DataCopyObjectsSummaryAction, Datagrid, StatusFileViewer }, 874 props: { 875 model: Object, 876 jobId: String, 877 runId: String 878 }, 879 data() { 880 return { 881 columns: [ 882 { 883 headerName: "View", 884 width: 60, 885 sortable: false, 886 filter: false, 887 resizable: false, 888 cellRenderer: DataCopyObjectsSummaryAction, 889 cellRendererParams: (params) => { 890 return { 891 params, 892 viewErrors: (row) => this.viewErrors(row) 893 }; 894 } 895 }, 896 { 897 headerName: "Name", 898 field: "name", 899 width: 300 900 }, 901 { field: "soqls", headerName: "SOQLs", width: 100, type: "int" }, 902 { 903 headerName: "Total", 904 valueGetter: (row) => row.data.stats && row.data.stats.total, 905 width: 100, 906 type: "int" 907 }, 908 { 909 headerName: "Errors", 910 valueGetter: (row) => row.data.stats && row.data.stats.errors, 911 width: 100, 912 type: "int" 913 }, 914 { 915 headerName: "Success", 916 valueGetter: (row) => row.data.stats && row.data.stats.success, 917 width: 100, 918 type: "int" 919 }, 920 { 921 headerName: "Skipped", 922 valueGetter: (row) => row.data.stats && row.data.stats.skipped, 923 width: 100, 924 type: "int" 925 }, 926 { 927 headerName: "Inserts", 928 valueGetter: (row) => row.data.stats && row.data.stats.inserts, 929 width: 100, 930 type: "int" 931 }, 932 { 933 headerName: "Updates", 934 valueGetter: (row) => row.data.stats && row.data.stats.updates, 935 width: 100, 936 type: "int" 937 } 938 ], 939 records: this.getObjects, 940 openableUrlCache: /* @__PURE__ */ new Map(), 941 viewErrorsDialogOpen: false, 942 viewErrorsDialogTitle: "", 943 viewErrorsRows: [] 944 }; 945 }, 946 watch: { 947 model() { 948 this.refresh(); 949 } 950 }, 951 methods: { 952 async getObjects() { 953 const records = sortIc([...this.model.copyStats || []], "name"); 954 if (records.length === 0) { 955 return records; 956 } 957 return [this.getTotalRow(records), ...records]; 958 }, 959 getTotalRow(records) { 960 var _a, _b, _c, _d, _e, _f; 961 const total = { 962 name: "<Total>", 963 soqls: 0, 964 stats: { 965 total: 0, 966 errors: 0, 967 success: 0, 968 skipped: 0, 969 inserts: 0, 970 updates: 0 971 }, 972 summaryTotal: true 973 }; 974 for (const record of records) { 975 total.soqls += record.soqls || 0; 976 total.stats.total += ((_a = record.stats) == null ? void 0 : _a.total) || 0; 977 total.stats.errors += ((_b = record.stats) == null ? void 0 : _b.errors) || 0; 978 total.stats.success += ((_c = record.stats) == null ? void 0 : _c.success) || 0; 979 total.stats.skipped += ((_d = record.stats) == null ? void 0 : _d.skipped) || 0; 980 total.stats.inserts += ((_e = record.stats) == null ? void 0 : _e.inserts) || 0; 981 total.stats.updates += ((_f = record.stats) == null ? void 0 : _f.updates) || 0; 982 } 983 return total; 984 }, 985 isObjectMatch(item, objectName) { 986 if (!item || !item.name || !objectName) { 987 return false; 988 } 989 const itemName = item.name.toLowerCase(); 990 const targetName = objectName.toLowerCase(); 991 return itemName === targetName || itemName.endsWith(`(${targetName})`); 992 }, 993 hasNonReferenceError(item) { 994 const errorTypes = ((item == null ? void 0 : item.errorTypes) || []).map((it) => (it || "").toLowerCase()); 995 if (errorTypes.length === 0) { 996 return true; 997 } 998 return errorTypes.some((it) => it !== "reference"); 999 }, 1000 async getOpenableUrl(fileInfo) { 1001 if (!(fileInfo == null ? void 0 : fileInfo.url)) { 1002 return void 0; 1003 } 1004 if (fileInfo.url.startsWith("http")) { 1005 return fileInfo.url; 1006 } 1007 const cachedUrl = this.openableUrlCache.get(fileInfo.url); 1008 if (cachedUrl) { 1009 return cachedUrl; 1010 } 1011 const resp = await openFile({
1012 runId: this.runId, 1013 jobId: this.jobId, 1014 url: fileInfo.url 1015 }); 1016 if (resp == null ? void 0 : resp.url) { 1017 this.openableUrlCache.set(fileInfo.url, resp.url); 1018 return resp.url; 1019 } 1020 return void 0; 1021 }, 1022 async readStatusFile(fileInfo) { 1023 const url = await this.getOpenableUrl(fileInfo); 1024 if (!url) { 1025 return []; 1026 } 1027 const content = await getFile(url); 1028 const csv = readCsv(content); 1029 return (csv == null ? void 0 : csv.records) || []; 1030 }, 1031 collectMatchingStatusFiles(objectName) { 1032 var _a; 1033 const files = []; 1034 const seenFiles = /* @__PURE__ */ new Set(); 1035 const walk = (items) => { 1036 for (const item of items || []) { 1037 if (this.isObjectMatch(item, objectName) && this.hasNonReferenceError(item)) { 1038 for (const fileInfo of item.statusUrls || []) { 1039 if (!(fileInfo == null ? void 0 : fileInfo.url) || seenFiles.has(fileInfo.url)) { 1040 continue; 1041 } 1042 seenFiles.add(fileInfo.url); 1043 files.push(fileInfo); 1044 } 1045 } 1046 walk(item.parents); 1047 walk(item.children); 1048 } 1049 }; 1050 walk(((_a = this.model) == null ? void 0 : _a.objectsTree) || []); 1051 return files; 1052 }, 1053 isSaveErrorRecord(rec) { 1054 var _a, _b; 1055 const status = ((rec == null ? void 0 : rec.status) || "").toLowerCase(); 1056 if (status !== "error" || !(rec == null ? void 0 : rec.record)) { 1057 return false; 1058 } 1059 try { 1060 const recObj = JSON.parse(rec.record); 1061 const errorType = (((_a = recObj == null ? void 0 : recObj.attributes) == null ? void 0 : _a.errorType) || ((_b = recObj == null ? void 0 : recObj.attributes) == null ? void 0 : _b.errortype) || (recObj == null ? void 0 : recObj.errorType) || "").toLowerCase(); 1062 return errorType === "save"; 1063 } catch (_e) { 1064 return false; 1065 } 1066 }, 1067 getErrorDetailsFromRecord(rec) { 1068 var _a, _b; 1069 if (!(rec == null ? void 0 : rec.record)) { 1070 return ""; 1071 } 1072 try { 1073 const record = JSON.parse(rec.record); 1074 const details = []; 1075 const addDetail = (value) => { 1076 if (Array.isArray(value)) { 1077 details.push(...value.filter((it) => it).map((it) => `${it}`)); 1078 } else if (value) { 1079 details.push(`${value}`); 1080 } 1081 }; 1082 addDetail(record == null ? void 0 : record.details); 1083 addDetail(record == null ? void 0 : record.message); 1084 addDetail((_a = record == null ? void 0 : record.attributes) == null ? void 0 : _a.details); 1085 addDetail((_b = record == null ? void 0 : record.attributes) == null ? void 0 : _b.message); 1086 addDetail(record == null ? void 0 : record.errors); 1087 return details.filter((it) => it).join(" | "); 1088 } catch (_e) { 1089 return ""; 1090 } 1091 }, 1092 combineErrorsWithDetails(rec) { 1093 const errors = [(rec == null ? void 0 : rec.errors) || "", this.getErrorDetailsFromRecord(rec)].filter((it) => it); 1094 return { ...rec, errors: errors.join(" | ") }; 1095 }, 1096 collectErrorRowsFromRecords(records) { 1097 const rows = []; 1098 for (const rec of records || []) { 1099 if (this.isSaveErrorRecord(rec)) { 1100 rows.push(this.combineErrorsWithDetails(rec)); 1101 } 1102 } 1103 return rows; 1104 }, 1105 async getObjectErrorRows(objectName) { 1106 const rows = []; 1107 const files = this.collectMatchingStatusFiles(objectName); 1108 const fileRecords = await Promise.all(files.map((fileInfo) => this.readStatusFile(fileInfo))); 1109 for (const records of fileRecords) { 1110 rows.push(...this.collectErrorRowsFromRecords(records)); 1111 } 1112 return rows; 1113 }, 1114 async viewErrors(row) { 1115 this.viewErrorsDialogTitle = `Errors for ${row.name}`; 1116 try { 1117 this.viewErrorsRows = await this.getObjectErrorRows(row.name); 1118 } catch (_e) { 1119 this.viewErrorsRows = []; 1120 } 1121 this.viewErrorsDialogOpen = true; 1122 }, 1123 refresh() { 1124 this.$nextTick(() => { 1125 if (this.$refs.grid) { 1126 this.$refs.grid.refresh(); 1127 } 1128 }); 1129 } 1130 } 1131}; 1132function _sfc_render$c(_ctx, _cache, $props, $setup, $data, $options) {
1133 const _component_Datagrid = resolveComponent("Datagrid"); 1134 const _component_StatusFileViewer = resolveComponent("StatusFileViewer"); 1135 return openBlock(), createElementBlock("div", null, [ 1136 createVNode(_component_Datagrid, { 1137 ref: "grid", 1138 recordType: "Object", 1139 recordTypePlural: "Objects", 1140 columns: $data.columns, 1141 records: $data.records, 1142 creatable: false, 1143 updatable: false, 1144 deletable: false, 1145 actionsColumn: false, 1146 rowSelection: "none", 1147 refreshable: false, 1148 toolbar: false, 1149 height: "70vh" 1150 }, null, 8, ["columns", "records"]), 1151 createVNode(_component_StatusFileViewer, { 1152 modelValue: $data.viewErrorsDialogOpen, 1153 "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => $data.viewErrorsDialogOpen = $event), 1154 title: $data.viewErrorsDialogTitle, 1155 rows: $data.viewErrorsRows, 1156 persistent: true 1157 }, null, 8, ["modelValue", "title", "rows"]) 1158 ]); 1159} 1160const DataCopyObjectsSummaryDialog = /* @__PURE__ */ _export_sfc(_sfc_main$c, [["render", _sfc_render$c], ["__file", "DataCopyObjectsSummaryDialog.vue"]]); 1161const _sfc_main$b = { 1162 mixins: [mixins], 1163 components: { StatusFileViewer, IconCopy }, 1164 props: { 1165 title: String, 1166 jobId: String, 1167 modelValue: Boolean, 1168 task: Object, 1169 run: Object, 1170 statusFiles: Array 1171 }, 1172 emits: ["cancel", "update:modelValue"], 1173 data() { 1174 return { 1175 columns: [ 1176 { name: "actions", align: "left" }, 1177 // {name: 'taskName', field: 'taskName', label: 'Task', sortable: true, align: 'left'}, 1178 { name: "fileName", field: "fileName", label: "File Name", sortable: true, align: "left" }, 1179 { name: "type", field: "contentType", label: "Type", sortable: true, align: "left" }, 1180 { name: "fileDescription", field: "fileDescription", label: "File Desc", sortable: true, align: "left" }, 1181 { headerName: "File Size", field: (row) => formatStorageSize(row.fileSize), label: "File Size", sortable: true, align: "left" } 1182 ], 1183 viewerDialogTitle: "", 1184 viewerDialogModel: {}, 1185 statusFileViewerDialogOpen: false 1186 }; 1187 }, 1188 created() { 1189 this.initingSuccess = true; 1190 }, 1191 watch: { 1192 modelValue() { 1193 if (!this.modelValue) { 1194 return; 1195 } 1196 } 1197 }, 1198 methods: { 1199 close() { 1200 this.$emit("cancel"); 1201 }, 1202 viewStatusFile(fileInfo) { 1203 this.handleViewFile("Status File: " + fileInfo.fileName, fileInfo, "statusFile"); 1204 }, 1205 async getOpenableUrl(fileInfo) { 1206 if (fileInfo.url.startsWith("http")) { 1207 return fileInfo.url; 1208 } else { 1209 if (fileInfo.openableUrl) { 1210 return fileInfo.openableUrl; 1211 } 1212 const resp = await this.processForm( 1213 async () => await openFile({ 1214 runId: fileInfo.runId, 1215 jobId: this.jobId, 1216 url: fileInfo.url, 1217 location: fileInfo.location 1218 }) 1219 ); 1220 if (resp) { 1221 return resp.url; 1222 } 1223 } 1224 }, 1225 async handleViewFile(title, fileInfo, fileType) { 1226 if (fileInfo.url.startsWith("http")) { 1227 openUrl(fileInfo.url); 1228 return; 1229 } 1230 const url = await this.getOpenableUrl(fileInfo); 1231 if (!url) { 1232 return; 1233 } 1234 this.viewerDialogTitle = title; 1235 this.viewerDialogModel = { 1236 ...fileInfo, 1237 ...{ viewUrl: url } 1238 }; 1239 this.statusFileViewerDialogOpen = true; 1240 }, 1241 async downloadFile(fileInfo) { 1242 let url = await this.getOpenableUrl(fileInfo); 1243 if (url) { 1244 if (url.startsWith("http")) { 1245 openUrl(url); 1246 } else { 1247 window.location.href = url; 1248 } 1249 } 1250 }, 1251 canViewFile(fileInfo) { 1252 return canViewFile(fileInfo); 1253 } 1254 } 1255}; 1256const _hoisted_1$4 = { 1257 key: 0, 1258 class: "q-mb-md" 1259}; 1260function _sfc_render$b(_ctx, _cache) { 1261 const _component_IconCopy = resolveComponent("IconCopy"); 1262 const _component_Icon = resolveComponent("Icon"); 1263 const _component_StatusFileViewer = resolveComponent("StatusFileViewer"); 1264 const _component_ContentDialog = resolveComponent("ContentDialog"); 1265 return openBlock(), createBlock(_component_ContentDialog, { 1266 title: _ctx.title || "Files", 1267 modelValue: _ctx.modelValue, 1268 "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => _ctx.$emit("update:modelValue")), 1269 message: _ctx.message, 1270 messageType: _ctx.messageType, 1271 initing: _ctx.initing, 1272 initingSuccess: _ctx.initingSuccess, 1273 processing: _ctx.processing, 1274 height: "auto", 1275 width: "1200px", 1276 closeMode: "", 1277 persistent: false, 1278 onCancel: _ctx.close 1279 }, { 1280 default: withCtx(() => [ 1281 _ctx.statusFiles && _ctx.statusFiles.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_1$4, [ 1282 createVNode(QTable, { 1283 rows: _ctx.statusFiles, 1284 columns: _ctx.columns, 1285 "row-key": "id", 1286 "hide-pagination": true, 1287 "rows-per-page-options": [0] 1288 }, { 1289 "body-cell-actions": withCtx((props) => [ 1290 createVNode(QTd, null, { 1291 default: withCtx(() => [ 1292 createVNode(_component_IconCopy, { 1293 content: props.row.url, 1294 tooltip: "Copy url to Clipboard" 1295 }, null, 8, ["content"]), 1296 createVNode(_component_Icon, { 1297 name: "cloud_download", 1298 onClick: ($event) => _ctx.downloadFile(props.row), 1299 clickable: "", 1300 tooltip: "Download File" 1301 }, null, 8, ["onClick"]), 1302 _ctx.canViewFile(props.row) ? (openBlock(), createBlock(_component_Icon, { 1303 key: 0, 1304 name: "visibility", 1305 onClick: ($event) => _ctx.viewStatusFile(props.row), 1306 clickable: "", 1307 tooltip: "View File" 1308 }, null, 8, ["onClick"])) : createCommentVNode("", true) 1309 ]), 1310 _: 2 1311 }, 1024) 1312 ]), 1313 _: 1 1314 }, 8, ["rows", "columns"]) 1315 ])) : createCommentVNode("", true), 1316 createVNode(_component_StatusFileViewer, { 1317 modelValue: _ctx.statusFileViewerDialogOpen, 1318 "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.statusFileViewerDialogOpen = $event), 1319 title: _ctx.viewerDialogTitle, 1320 fileInfo: _ctx.viewerDialogModel 1321 }, null, 8, ["modelValue", "title", "fileInfo"]) 1322 ]), 1323 _: 1 1324 }, 8, ["title", "modelValue", "message", "messageType", "initing", "initingSuccess", "processing", "onCancel"]); 1325} 1326const ObjectFilesDialog = /* @__PURE__ */ _export_sfc(_sfc_main$b, [["render", _sfc_render$b], ["__file", "ObjectFilesDialog.vue"]]); 1327const _sfc_main$a = { 1328 mixins: [mixins], 1329 components: { ObjectFilesDialog }, 1330 created() { 1331 this.row = this.params.data || {}; 1332 }, 1333 data() { 1334 return { 1335 row: {}, 1336 filesDialogOpen: false 1337 }; 1338 }, 1339 methods: { 1340 viewFiles() { 1341 this.filesDialogOpen = true; 1342 } 1343 } 1344}; 1345function _sfc_render$a(_ctx, _cache, $props, $setup, $data, $options) {
1346 const _component_Icon = resolveComponent("Icon"); 1347 const _component_ObjectFilesDialog = resolveComponent("ObjectFilesDialog"); 1348 return openBlock(), createElementBlock("div", null, [ 1349 $data.row.statusUrls && $data.row.statusUrls.length > 0 || $data.row.errorSummaryUrls && $data.row.errorSummaryUrls.length > 0 ? (openBlock(), createBlock(_component_Icon, { 1350 key: 0, 1351 name: "library_books", 1352 onClick: $options.viewFiles, 1353 clickable: "" 1354 }, null, 8, ["onClick"])) : createCommentVNode("", true), 1355 createVNode(_component_ObjectFilesDialog, { 1356 title: "Status Files", 1357 modelValue: $data.filesDialogOpen, 1358 "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => $data.filesDialogOpen = $event), 1359 statusFiles: $data.row.statusUrls, 1360 errorFiles: $data.row.errorSummaryUrls, 1361 onCancel: _cache[1] || (_cache[1] = ($event) => $data.filesDialogOpen = false), 1362 onClose: _cache[2] || (_cache[2] = ($event) => $data.filesDialogOpen = false) 1363 }, null, 8, ["modelValue", "statusFiles", "errorFiles"]) 1364 ]); 1365} 1366const TaskRunDetailAction = /* @__PURE__ */ _export_sfc(_sfc_main$a, [["render", _sfc_render$a], ["__file", "TaskRunDetailAction.vue"]]); 1367const _sfc_main$9 = { 1368 props: { 1369 params: Object 1370 }, 1371 components: { SyncStatus }, 1372 methods: { 1373 show(data) { 1374 if (data) return true; 1375 return false; 1376 } 1377 } 1378}; 1379const _hoisted_1$3 = { 1380 key: 0, 1381 style: { "margin-top": "2px" } 1382}; 1383function _sfc_render$9(_ctx, _cache, $props, $setup, $data, $options) { 1384 const _component_SyncStatus = resolveComponent("SyncStatus"); 1385 return $options.show($props.params && $props.params.data && $props.params.data.status) ? (openBlock(), createElementBlock("div", _hoisted_1$3, [ 1386 createVNode(_component_SyncStatus, { 1387 status: $props.params.data.status, 1388 runStatus: $props.params.data.runStatus, 1389 size: "xs", 1390 style: { "height": "22px !important" } 1391 }, null, 8, ["status", "runStatus"]) 1392 ])) : createCommentVNode("", true); 1393} 1394const TreeGridStatusRenderer = /* @__PURE__ */ _export_sfc(_sfc_main$9, [["render", _sfc_render$9], ["__file", "TreeGridStatusRenderer.vue"]]); 1395const _sfc_main$8 = { 1396 mixins: [mixins], 1397 props: { 1398 title: String, 1399 errorMessage: String, 1400 modelValue: Boolean 1401 }, 1402 emits: ["ok", "update:modelValue"], 1403 data() { 1404 return {}; 1405 }, 1406 watch: { 1407 modelValue() { 1408 if (!this.modelValue) { 1409 return; 1410 } 1411 this.initingSuccess = true; 1412 } 1413 }, 1414 methods: { 1415 valueLabels() { 1416 return valueLabels; 1417 }, 1418 copyMessage() { 1419 notifyInfo("Copied!"); 1420 }, 1421 close() { 1422 this.$emit("update:modelValue", false); 1423 } 1424 } 1425}; 1426function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) { 1427 const _component_Para = resolveComponent("Para"); 1428 const _component_Button = resolveComponent("Button"); 1429 const _component_ContentDialog = resolveComponent("ContentDialog"); 1430 const _directive_clipboard = resolveDirective("clipboard"); 1431 return openBlock(), createBlock(_component_ContentDialog, { 1432 title: `${$props.title || "Message"}`, 1433 modelValue: $props.modelValue, 1434 "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.$emit("update:modelValue")), 1435 message: _ctx.message, 1436 messageType: _ctx.messageType, 1437 initing: _ctx.initing, 1438 initingSuccess: _ctx.initingSuccess, 1439 processing: _ctx.processing, 1440 processingCancellable: _ctx.processingCancellable, 1441 height: "auto", 1442 width: "1200px", 1443 closeMode: "", 1444 persistent: false 1445 }, { 1446 "buttons-right": withCtx(() => [ 1447 withDirectives((openBlock(), createBlock(_component_Button, { 1448 onClick: $options.copyMessage, 1449 outline: "", 1450 fullWidth: _ctx.$q.screen.xs 1451 }, { 1452 default: withCtx(() => [..._cache[1] || (_cache[1] = [ 1453 createTextVNode("Copy", -1) 1454 ])]), 1455 _: 1 1456 }, 8, ["onClick", "fullWidth"])), [ 1457 [_directive_clipboard, $props.errorMessage, "copy"] 1458 ]), 1459 createVNode(_component_Button, { 1460 onClick: $options.close, 1461 fullWidth: _ctx.$q.screen.xs 1462 }, { 1463 default: withCtx(() => [..._cache[2] || (_cache[2] = [ 1464 createTextVNode("Close", -1) 1465 ])]), 1466 _: 1 1467 }, 8, ["onClick", "fullWidth"]) 1468 ]), 1469 default: withCtx(() => [ 1470 createVNode(_component_Para, { class: "message text-body1" }, {
1471 default: withCtx(() => [ 1472 createTextVNode(toDisplayString($props.errorMessage), 1) 1473 ]), 1474 _: 1 1475 }) 1476 ]), 1477 _: 1 1478 }, 8, ["title", "modelValue", "message", "messageType", "initing", "initingSuccess", "processing", "processingCancellable"]); 1479} 1480const ViewMessageDialog = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["render", _sfc_render$8], ["__file", "ViewMessageDialog.vue"]]); 1481const Message$1 = "Message"; 1482const _sfc_main$7 = /* @__PURE__ */ defineComponent({ 1483 __name: "AgGridTreeData", 1484 props: { 1485 data: {}, 1486 rowHeight: { default: 35 } 1487 }, 1488 setup(__props, { expose: __expose }) { 1489 initAgLicense(); 1490 const props = __props; 1491 const columns = [ 1492 { headerName: "#", field: "num", width: 50, align: "center", pinned: true, filter: false, floatingFilter: false }, 1493 { 1494 headerName: "Actions", 1495 field: "actions", 1496 cellRenderer: TaskRunDetailAction, 1497 width: 50, 1498 pinned: "left", 1499 filter: false, 1500 floatingFilter: false 1501 }, 1502 { 1503 headerName: "Status", 1504 field: "status", 1505 width: 150, 1506 cellRenderer: TreeGridStatusRenderer, 1507 cellRendererParams: (params) => { 1508 return { params: params.data }; 1509 } 1510 }, 1511 { headerName: "Type", field: "hierarchyType", width: 100 }, 1512 { headerName: "Level", field: "recordLevel", width: 100, align: "center" }, 1513 { headerName: "Copy Order", field: "order", width: 140, align: "center" }, 1514 { headerName: "Error Type", field: "errorTypes", width: 140, align: "center" }, 1515 { headerName: "Total", field: "total", width: 90, align: "center" }, 1516 { headerName: "Errors", field: "errors", width: 90, align: "center" }, 1517 { headerName: "Inserts", field: "inserts", width: 90, align: "center" }, 1518 { headerName: "Updates", field: "updates", width: 90, align: "center" }, 1519 { headerName: "Skipped", field: "skipped", width: 90, align: "center" }, 1520 { headerName: "Cumulative Total", field: "totalRollup", width: 160 }, 1521 { headerName: "Duration", field: "duration", width: 120, align: "center" }, 1522 { headerName: "Duration Rollup", field: "durationRollup", width: 150 }, 1523 { headerName: "Message", field: "message" } 1524 // {headerName: 'Details', field: 'details'}, 1525 ]; 1526 const gridApi = ref(); 1527 const defaultColDef = ref({ 1528 resizable: true, 1529 filter: true, 1530 floatingFilter: true 1531 }); 1532 const autoGroupColumnDef = ref(); 1533 const groupDefaultExpanded = ref(); 1534 const getRowId = ref(); 1535 const rowData = ref(); 1536 const autoSizeStrategy = ref(); 1537 const viewErrorMessageDialogOpen = ref(false); 1538 const viewErrorMessageDialogData = ref(""); 1539 onBeforeMount(() => { 1540 autoGroupColumnDef.value = { 1541 headerName: "Object", 1542 width: 400, 1543 cellRendererParams: { 1544 suppressCount: true 1545 } 1546 }; 1547 groupDefaultExpanded.value = -1; 1548 getRowId.value = (params) => params.data.id; 1549 rowData.value = processData(props.data); 1550 autoSizeStrategy.value = { type: "fitGridWidth" }; 1551 }); 1552 watch( 1553 () => props.data, 1554 (data) => refresh(data), 1555 { deep: true } 1556 ); 1557 function getDataPath(data) { 1558 return data.dataPath; 1559 } 1560 function onGridReady(params) { 1561 gridApi.value = params.api; 1562 } 1563 function refresh(data = props.data) { 1564 rowData.value = processData(data); 1565 if (gridApi.value) { 1566 gridApi.value.setRowData(rowData.value); 1567 } 1568 } 1569 function processData(data) { 1570 const flattenedData = []; 1571 const flattenRowRecursive = (row, parentPath) => { 1572 const dataPath = [...parentPath, row.name]; 1573 flattenedData.push({ ...row, dataPath }); 1574 if (row.children) { 1575 row.children.forEach((child) => flattenRowRecursive(child, dataPath)); 1576 } 1577 }; 1578 data.forEach((row) => flattenRowRecursive(row, [])); 1579 return flattenedData; 1580 } 1581 function cellClickHandle(event) { 1582 if (event.colDef.headerName === Message$1 && event.data.message) { 1583 viewErrorMessageDialogData.value = event.data.details; 1584 viewErrorMessageDialogOpen.value = true; 1585 } 1586 } 1587 __expose({ refresh }); 1588 const __returned__ = { props, columns, gridApi, defaultColDef, autoGroupColumnDef, groupDefaultExpanded, getRowId, rowData, autoSizeStrategy, viewErrorMessageDialogOpen, viewErrorMessageDialogData, Message: Message$1, getDataPath, onGridReady, refresh, processData, cellClickHandle, get AgGridVue() { 1589 return AgGridVue; 1590 }, ViewMessageDialog };
1591 Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true }); 1592 return __returned__; 1593 } 1594}); 1595const _hoisted_1$2 = { style: { "height": "70vh" } }; 1596function _sfc_render$7(_ctx, _cache, $props, $setup, $data, $options) { 1597 return openBlock(), createElementBlock("div", _hoisted_1$2, [ 1598 createVNode($setup["AgGridVue"], { 1599 class: "ag-theme-balham", 1600 style: { "width": "100%", "height": "100%" }, 1601 columnDefs: $setup.columns, 1602 onGridReady: $setup.onGridReady, 1603 defaultColDef: $setup.defaultColDef, 1604 treeData: true, 1605 groupDefaultExpanded: $setup.groupDefaultExpanded, 1606 getDataPath: $setup.getDataPath, 1607 getRowId: $setup.getRowId, 1608 rowData: $setup.rowData, 1609 rowHeight: $props.rowHeight, 1610 autoGroupColumnDef: $setup.autoGroupColumnDef, 1611 autoSizeStrategy: $setup.autoSizeStrategy, 1612 onCellClicked: $setup.cellClickHandle, 1613 suppressContextMenu: true 1614 }, null, 8, ["defaultColDef", "groupDefaultExpanded", "getRowId", "rowData", "rowHeight", "autoGroupColumnDef", "autoSizeStrategy"]), 1615 createVNode($setup["ViewMessageDialog"], { 1616 modelValue: $setup.viewErrorMessageDialogOpen, 1617 "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => $setup.viewErrorMessageDialogOpen = $event), 1618 errorMessage: $setup.viewErrorMessageDialogData, 1619 title: "Details" 1620 }, null, 8, ["modelValue", "errorMessage"]) 1621 ]); 1622} 1623const AgGridTreeData = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["render", _sfc_render$7], ["__file", "AgGridTreeData.vue"]]); 1624const iconSuccess = '<i aria-hidden="true" role="presentation" class="q-pb-xs material-icons q-icon notranslate text-positive r-icon size-xs" style="font-size: 18px;">check_circle</i>'; 1625const iconError = '<i aria-hidden="true" role="presentation" class="q-pb-xs material-icons q-icon notranslate text-negative r-icon size-xs" style="font-size: 18px;">error</i>'; 1626const iconWarn = '<i aria-hidden="true" role="presentation" class="q-pb-xs material-icons q-icon notranslate text-warning r-icon size-xs" style="font-size: 18px;">warning</i>'; 1627const iconProcessing = '<i aria-hidden="true" role="presentation" class="q-pb-xs material-icons q-icon notranslate text-blue-9 r-icon size-xs" style="font-size: 18px;">swap_vertical_circle</i>'; 1628const icons = { 1629 completed: iconSuccess, 1630 error: iconError, 1631 completedWithErrors: iconWarn, 1632 processing: iconProcessing 1633}; 1634function getTitle$1(task) { 1635 return `Data Copy Task Details - ${valueLabels.status[task.status]}`; 1636} 1637let rowNumCount = 0; 1638const _sfc_main$6 = { 1639 mixins: [mixins], 1640 components: { 1641 AgGridTreeData, 1642 DataCopyObjectsSummaryDialog 1643 }, 1644 props: { 1645 modelValue: Boolean, 1646 jobId: String, 1647 task: Object, 1648 run: Object 1649 }, 1650 emits: ["cancel", "update:modelValue"], 1651 data() { 1652 return { 1653 irun: this.run, 1654 itask: this.task, 1655 dataSource: [], 1656 title: getTitle$1(this.task), 1657 currentTab: "hierarchy", 1658 objectsSummaryDialogModel: {}, 1659 columns: [ 1660 { title: "Object", key: "name", width: 500 }, 1661 { title: "Status", key: "status", width: 150 }, 1662 { title: "Type", key: "hierarchyType", width: 100 }, 1663 { title: "Level", key: "recordLevel", width: 80, align: "center" }, 1664 { title: "Copy Order", key: "order", width: 120, align: "center" }, 1665 { title: "Error Type", key: "errorTypes", width: 120, align: "center" }, 1666 { title: "Total", key: "total", width: 80, align: "center" }, 1667 { title: "Errors", key: "errors", width: 80, align: "center" }, 1668 { title: "Inserts", key: "inserts", width: 80, align: "center" }, 1669 { title: "Updates", key: "updates", width: 80, align: "center" }, 1670 { title: "Skipped", key: "skipped", width: 80, align: "center" }, 1671 { title: "Total Rollup", key: "totalRollup", width: 125 }, 1672 { title: "Duration", key: "duration", width: 100, align: "center" }, 1673 { title: "Duration Rollup", key: "durationRollup", width: 120 }, 1674 { title: "Message", key: "message" } 1675 ] 1676 }; 1677 }, 1678 watch: { 1679 async modelValue() { 1680 if (!this.modelValue) { 1681 return; 1682 } 1683 this.objToBeExpanded = []; 1684 this.currentTab = "hierarchy"; 1685 this.dataSource = this.getRows(); 1686 this.initingSuccess = true; 1687 } 1688 }, 1689 methods: { 1690 getRecords() { 1691 return []; 1692 }, 1693 getRows() { 1694 var _a, _b, _c; 1695 this.objectsSummaryDialogModel = (_b = (_a = this.itask.target) == null ? void 0 : _a.runProps) == null ? void 0 : _b.sfdcDataCopy; 1696 const objTree = ((_c = this.objectsSummaryDialogModel) == null ? void 0 : _c.objectsTree) || []; 1697 rowNumCount = 0; 1698 return sortIc(objTree.map(this.processRow), "name"); 1699 }, 1700 rollUpStats(row) { 1701 let totalRollup = row.total || 0;
1702 if (row.children) { 1703 row.children.forEach((it) => { 1704 this.rollUpStats(it); 1705 totalRollup += it.totalRollup; 1706 }); 1707 } 1708 row.totalRollup = totalRollup; 1709 }, 1710 processRow(rec, level) { 1711 level = level || 0; 1712 const row = { 1713 num: rowNumCount++, 1714 recordLevel: level, 1715 action: "", 1716 // id: rec.id, 1717 id: generateId2("sobj"), 1718 name: rec.relationshipName ? `${rec.relationshipName} (${rec.name})` : rec.name, 1719 status: rec.runStatus, 1720 statusIcon: `${icons[rec.runStatus] || ""} ${valueLabels.status[rec.runStatus]}`, 1721 duration: jsUtilsExports.toHumanElapsedTime(rec.duration || 0), 1722 durationRollup: jsUtilsExports.toHumanElapsedTime(rec.durationRollup || 0), 1723 total: rec.stats && rec.stats.total, 1724 done: rec.stats && rec.stats.done, 1725 success: rec.stats && rec.stats.success, 1726 inserts: rec.stats && rec.stats.inserts, 1727 updates: rec.stats && rec.stats.updates, 1728 errors: rec.stats && rec.stats.errors, 1729 skipped: rec.stats && rec.stats.skipped, 1730 message: rec.message, 1731 details: rec.details, 1732 statusUrls: rec.statusUrls, 1733 errorSummaryUrls: rec.errorSummaryUrls, 1734 stats: rec.stats, 1735 order: rec.order, 1736 errorTypes: (rec.errorTypes || []).join(", "), 1737 hierarchyType: valueLabels.hierarchyTypes[rec.hierarchyType], 1738 run: this.irun, 1739 children: [] 1740 }; 1741 if (rec.parents && rec.parents.length > 0) { 1742 const children = { 1743 action: "", 1744 id: generateId2("sobj"), 1745 children: sortIc( 1746 rec.parents.filter((it) => { 1747 var _a; 1748 return ((_a = it.stats) == null ? void 0 : _a.total) > 0 || it.runStatus && it.runStatus !== "completed"; 1749 }).map((it) => this.processRow(it, level + 1)), 1750 "name" 1751 ) 1752 }; 1753 children.name = `Parents (${children.children.length})`; 1754 if (children.children.length > 0) { 1755 row.children.push(children); 1756 } 1757 } 1758 if (rec.children && rec.children.length > 0) { 1759 const children = { 1760 action: "", 1761 id: generateId2("sobj"), 1762 children: sortIc( 1763 rec.children.filter((it) => { 1764 var _a; 1765 return ((_a = it.stats) == null ? void 0 : _a.total) > 0 || it.runStatus && it.runStatus !== "completed"; 1766 }).map((it) => this.processRow(it, level + 1)), 1767 "name" 1768 ) 1769 }; 1770 children.name = `Children (${children.children.length})`; 1771 if (children.children.length > 0) { 1772 row.children.push(children); 1773 } 1774 } 1775 this.rollUpStats(row); 1776 return row; 1777 }, 1778 close() { 1779 this.$emit("cancel"); 1780 }, 1781 refresh() { 1782 this.process(async () => { 1783 this.irun = await getRun(this.run.id); 1784 this.itask = this.irun.tasks.find((it) => it.id === this.task.id); 1785 this.dataSource = this.getRows(); 1786 this.title = getTitle$1(this.itask); 1787 this.$nextTick(() => { 1788 var _a, _b; 1789 (_a = this.$refs.hierarchyGrid) == null ? void 0 : _a.refresh(this.dataSource); 1790 (_b = this.$refs.summaryGrid) == null ? void 0 : _b.refresh(); 1791 }); 1792 }); 1793 } 1794 } 1795}; 1796const _hoisted_1$1 = { class: "row items-center no-wrap q-pb-xs" }; 1797function _sfc_render$6(_ctx, _cache, $props, $setup, $data, $options) { 1798 const _component_Icon = resolveComponent("Icon"); 1799 const _component_AgGridTreeData = resolveComponent("AgGridTreeData"); 1800 const _component_DataCopyObjectsSummaryDialog = resolveComponent("DataCopyObjectsSummaryDialog"); 1801 const _component_ContentDialog = resolveComponent("ContentDialog"); 1802 return openBlock(), createBlock(_component_ContentDialog, { 1803 title: $data.title, 1804 modelValue: $props.modelValue, 1805 "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => _ctx.$emit("update:modelValue", $event)), 1806 initing: _ctx.initing, 1807 initingSuccess: _ctx.initingSuccess, 1808 processing: _ctx.processing, 1809 height: "auto", 1810 width: "90vw", 1811 closeMode: "", 1812 persistent: false 1813 }, { 1814 default: withCtx(() => [ 1815 _ctx.initingSuccess ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [ 1816 createBaseVNode("div", _hoisted_1$1, [ 1817 createVNode(_component_Icon, { 1818 name: "refresh", 1819 onClick: _cache[0] || (_cache[0] = ($event) => $options.refresh()), 1820 clickable: "" 1821 }), 1822 createVNode(QTabs, { 1823 modelValue: $data.currentTab, 1824 "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => $data.currentTab = $event), 1825 align: "left", 1826 dense: "", 1827 "no-caps": "", 1828 "indicator-color": "primary", 1829 class: "col q-ml-sm" 1830 }, { 1831 default: withCtx(() => [ 1832 createVNode(QTab, { 1833 name: "hierarchy", 1834 label: "Objects Hierarchy" 1835 }), 1836 createVNode(QTab, { 1837 name: "summary", 1838 label: "Objects Summary" 1839 }) 1840 ]), 1841 _: 1 1842 }, 8, ["modelValue"]) 1843 ]), 1844 createVNode(QTabPanels, { 1845 modelValue: $data.currentTab, 1846 "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => $data.currentTab = $event), 1847 "keep-alive": "" 1848 }, { 1849 default: withCtx(() => [ 1850 createVNode(QTabPanel, { name: "hierarchy" }, {
1851 default: withCtx(() => [ 1852 createVNode(_component_AgGridTreeData, { 1853 ref: "hierarchyGrid", 1854 data: $data.dataSource, 1855 columns: $data.columns 1856 }, null, 8, ["data", "columns"]) 1857 ]), 1858 _: 1 1859 }), 1860 createVNode(QTabPanel, { name: "summary" }, { 1861 default: withCtx(() => [ 1862 createVNode(_component_DataCopyObjectsSummaryDialog, { 1863 ref: "summaryGrid", 1864 model: $data.objectsSummaryDialogModel, 1865 jobId: $props.jobId, 1866 runId: $props.run.id 1867 }, null, 8, ["model", "jobId", "runId"]) 1868 ]), 1869 _: 1 1870 }) 1871 ]), 1872 _: 1 1873 }, 8, ["modelValue"]) 1874 ], 64)) : createCommentVNode("", true) 1875 ]), 1876 _: 1 1877 }, 8, ["title", "modelValue", "initing", "initingSuccess", "processing"]); 1878} 1879const SfdcDataCopyTaskRunDetailsDialog = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["render", _sfc_render$6], ["__file", "SfdcDataCopyTaskRunDetailsDialog.vue"]]); 1880const _sfc_main$5 = { 1881 mixins: [mixins], 1882 components: { 1883 StatusFileViewer, 1884 FileViewerDialog2 1885 }, 1886 props: { 1887 title: String, 1888 modelValue: Boolean, 1889 statusFiles: Array 1890 }, 1891 data() { 1892 return { 1893 columns: [ 1894 { 1895 name: "actions", 1896 align: "left" 1897 }, 1898 { name: "ObjectName", field: "objectName", label: "Task", sortable: true, align: "left" }, 1899 { name: "fileName", field: "fileName", label: "File Name", sortable: true, align: "left" }, 1900 { name: "fileSize", field: "fileSizeFormatted", label: "File Size", sortable: true, align: "left" } 1901 ], 1902 pagination: { 1903 page: 1, 1904 rowsPerPage: 0 1905 }, 1906 viewerDialogTitle: "", 1907 viewerDialogOpen: false, 1908 statusFileViewerDialogOpen: false, 1909 viewerDialogModel: {} 1910 }; 1911 }, 1912 created() { 1913 this.initingSuccess = true; 1914 }, 1915 emits: ["cancel", "update:modelValue"], 1916 watch: { 1917 modelValue() { 1918 if (!this.modelValue) { 1919 return; 1920 } 1921 } 1922 }, 1923 methods: { 1924 close() { 1925 this.$emit("cancel"); 1926 }, 1927 viewStatusFile(fileInfo) { 1928 this.handleViewFile("Status File: " + fileInfo.fileName, fileInfo); 1929 }, 1930 async getOpenableUrl(fileInfo) { 1931 if (fileInfo.openableUrl) { 1932 return fileInfo.openableUrl; 1933 } 1934 const resp = await this.processForm( 1935 () => openFile({ 1936 runId: fileInfo.runId, 1937 jobId: this.jobId, 1938 url: fileInfo.url, 1939 location: fileInfo.location 1940 }) 1941 ); 1942 if (resp) { 1943 fileInfo.openableUrl = resp.url; 1944 return resp.url; 1945 } 1946 }, 1947 async handleViewFile(title, fileInfo) { 1948 const url = await this.getOpenableUrl(fileInfo); 1949 if (!url) { 1950 return; 1951 } 1952 this.viewerDialogTitle = title, this.viewerDialogModel = { 1953 ...fileInfo, 1954 ...{ url } 1955 }; 1956 this.statusFileViewerDialogOpen = true; 1957 }, 1958 async downloadFile(fileInfo) { 1959 let url = await this.getOpenableUrl(fileInfo); 1960 if (url) { 1961 if (url.startsWith("http")) { 1962 openUrl(url); 1963 } else { 1964 window.location.href = url; 1965 } 1966 } 1967 }, 1968 async copyFile(fileInfo) { 1969 let url = await this.getOpenableUrl(fileInfo); 1970 if (url) { 1971 await copyToClipboard(url); 1972 } 1973 } 1974 } 1975}; 1976const _hoisted_1 = { key: 0 }; 1977function _sfc_render$5(_ctx, _cache) { 1978 const _component_IconCopy = resolveComponent("IconCopy"); 1979 const _component_Icon = resolveComponent("Icon"); 1980 const _component_FileViewerDialog2 = resolveComponent("FileViewerDialog2"); 1981 const _component_StatusFileViewer = resolveComponent("StatusFileViewer"); 1982 const _component_ContentDialog = resolveComponent("ContentDialog"); 1983 return openBlock(), createBlock(_component_ContentDialog, { 1984 title: _ctx.title || "Files", 1985 modelValue: _ctx.modelValue, 1986 "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => _ctx.$emit("update:modelValue")), 1987 message: _ctx.message, 1988 messageType: _ctx.messageType, 1989 initing: _ctx.initing, 1990 initingSuccess: _ctx.initingSuccess, 1991 processing: _ctx.processing, 1992 height: "auto", 1993 width: "900px",
1994 defaultButton: false, 1995 persistent: false 1996 }, { 1997 default: withCtx(() => [ 1998 _ctx.statusFiles.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_1, [ 1999 _cache[4] || (_cache[4] = createBaseVNode("span", { class: "" }, "Status Files", -1)), 2000 createVNode(QTable, { 2001 data: _ctx.statusFiles, 2002 columns: _ctx.columns, 2003 "row-key": "id", 2004 "hide-pagination": true, 2005 "rows-per-page-options": [0], 2006 pagination: _ctx.pagination, 2007 "onUpdate:pagination": _cache[0] || (_cache[0] = ($event) => _ctx.pagination = $event) 2008 }, { 2009 "body-cell-actions": withCtx((props) => [ 2010 createVNode(QTd, null, { 2011 default: withCtx(() => [ 2012 createVNode(_component_IconCopy, { 2013 content: props.row.url, 2014 tooltip: "Copy url to Clipboard" 2015 }, null, 8, ["content"]), 2016 createVNode(_component_Icon, { 2017 name: "cloud_download", 2018 onClick: ($event) => _ctx.downloadFile(props.row), 2019 clickable: "", 2020 tooltip: "Download File" 2021 }, null, 8, ["onClick"]), 2022 props.row.canView ? (openBlock(), createBlock(_component_Icon, { 2023 key: 0, 2024 name: "visibility", 2025 onClick: ($event) => _ctx.viewStatusFile(props.row), 2026 clickable: "", 2027 tooltip: "View File" 2028 }, null, 8, ["onClick"])) : createCommentVNode("", true) 2029 ]), 2030 _: 2 2031 }, 1024) 2032 ]), 2033 _: 1 2034 }, 8, ["data", "columns", "pagination"]) 2035 ])) : createCommentVNode("", true), 2036 createVNode(_component_FileViewerDialog2, { 2037 modelValue: _ctx.viewerDialogOpen, 2038 "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => _ctx.viewerDialogOpen = $event), 2039 title: _ctx.viewerDialogTitle, 2040 fileInfo: _ctx.viewerDialogModel 2041 }, null, 8, ["modelValue", "title", "fileInfo"]), 2042 createVNode(_component_StatusFileViewer, { 2043 modelValue: _ctx.statusFileViewerDialogOpen, 2044 "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => _ctx.statusFileViewerDialogOpen = $event), 2045 title: _ctx.viewerDialogTitle, 2046 fileInfo: _ctx.viewerDialogModel 2047 }, null, 8, ["modelValue", "title", "fileInfo"]) 2048 ]), 2049 _: 1 2050 }, 8, ["title", "modelValue", "message", "messageType", "initing", "initingSuccess", "processing"]); 2051} 2052const FilesDialog = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["render", _sfc_render$5], ["__file", "FilesDialog.vue"]]); 2053const _sfc_main$4 = { 2054 mixins: [mixins], 2055 props: { 2056 run: Object 2057 }, 2058 data() { 2059 return { 2060 statusFiles: [], 2061 filesDialogOpen: false 2062 }; 2063 }, 2064 components: { 2065 FilesDialog 2066 }, 2067 created() { 2068 this.object = this.params.data; 2069 this.statusFiles = getObjectFiles({ id: this.object.runId }, this.object); 2070 }, 2071 methods: { 2072 viewFiles() { 2073 this.filesDialogOpen = true; 2074 } 2075 } 2076}; 2077function _sfc_render$4(_ctx, _cache, $props, $setup, $data, $options) { 2078 const _component_Icon = resolveComponent("Icon"); 2079 const _component_FilesDialog = resolveComponent("FilesDialog"); 2080 return openBlock(), createElementBlock("div", null, [ 2081 $data.statusFiles.length > 0 ? (openBlock(), createBlock(_component_Icon, { 2082 key: 0, 2083 name: "library_books", 2084 onClick: $options.viewFiles, 2085 clickable: "", 2086 tooltip: "View status File" 2087 }, null, 8, ["onClick"])) : createCommentVNode("", true), 2088 createVNode(_component_FilesDialog, { 2089 title: "Object Files", 2090 modelValue: $data.filesDialogOpen, 2091 "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => $data.filesDialogOpen = $event), 2092 statusFiles: $data.statusFiles 2093 }, null, 8, ["modelValue", "statusFiles"]) 2094 ]); 2095} 2096const SfdcDataMaskRunActions = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["render", _sfc_render$4], ["__file", "SfdcDataMaskRunActions.vue"]]); 2097function getTitle(task) { 2098 return `Data Mask Run Details - ${valueLabels.status[task.status]}`; 2099} 2100const _sfc_main$3 = { 2101 mixins: [mixins], 2102 components: { Datagrid }, 2103 props: { 2104 modelValue: Boolean, 2105 jobId: String, 2106 task: Object, 2107 run: Object 2108 }, 2109 data() { 2110 return { 2111 irun: this.run, 2112 itask: this.task, 2113 title: getTitle(this.task), 2114 columns: [ 2115 { 2116 headerName: "Actions", 2117 field: "actions", 2118 cellRendererFramework: SfdcDataMaskRunActions, 2119 width: 95, 2120 pinned: "left" 2121 },
2122 { field: "name" }, 2123 { field: "status" }, 2124 { field: "maskStartAt", headerName: "Masked Till", type: "datetime" }, 2125 { field: "startAt", type: "datetime" }, 2126 { 2127 headerName: "Duration", 2128 valueGetter: (row) => getRunDuration(row.data), 2129 width: 125 2130 }, 2131 { 2132 headerName: "Total", 2133 valueGetter: (row) => row.data.stats && row.data.stats.total, 2134 width: 100, 2135 type: "int" 2136 }, 2137 { 2138 headerName: "Success", 2139 valueGetter: (row) => row.data.stats && row.data.stats.success, 2140 width: 120, 2141 type: "int" 2142 }, 2143 { 2144 headerName: "Skipped", 2145 valueGetter: (row) => row.data.stats && row.data.stats.skipped, 2146 width: 100, 2147 type: "int" 2148 }, 2149 { 2150 headerName: "Errors", 2151 valueGetter: (row) => row.data.stats && row.data.stats.errors, 2152 width: 100, 2153 type: "int" 2154 }, 2155 { field: "message" } 2156 ] 2157 }; 2158 }, 2159 emits: ["cancel", "update:modelValue"], 2160 watch: { 2161 async modelValue() { 2162 if (!this.modelValue) { 2163 return; 2164 } 2165 this.initingSuccess = true; 2166 this.initRecords(); 2167 } 2168 }, 2169 methods: { 2170 getRows() { 2171 return jsUtilsExports.deepClone(this.dataSource); 2172 }, 2173 close() { 2174 this.$emit("cancel"); 2175 }, 2176 refresh() { 2177 this.process(async () => { 2178 this.irun = await getRun(this.run.id); 2179 this.itask = this.irun.tasks.find((it) => it.id === this.task.id); 2180 this.title = getTitle(this.itask); 2181 this.initRecords(); 2182 this.$refs.grid.refresh(); 2183 }); 2184 }, 2185 initRecords() { 2186 var _a, _b; 2187 const recs = ((_b = (_a = this.itask.target) == null ? void 0 : _a.runProps) == null ? void 0 : _b.sfdcDataMask.sobjects) || []; 2188 this.dataSource = sortIc(recs, "name"); 2189 } 2190 } 2191}; 2192function _sfc_render$3(_ctx, _cache, $props, $setup, $data, $options) { 2193 const _component_Datagrid = resolveComponent("Datagrid"); 2194 const _component_ContentDialog = resolveComponent("ContentDialog"); 2195 return openBlock(), createBlock(_component_ContentDialog, { 2196 title: $data.title, 2197 modelValue: $props.modelValue, 2198 "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.$emit("update:modelValue")), 2199 initing: _ctx.initing, 2200 initingSuccess: _ctx.initingSuccess, 2201 processing: _ctx.processing, 2202 height: "auto", 2203 width: "90vw", 2204 closeMode: "", 2205 persistent: false 2206 }, { 2207 default: withCtx(() => [ 2208 _ctx.initingSuccess ? (openBlock(), createBlock(_component_Datagrid, { 2209 key: 0, 2210 ref: "grid", 2211 columns: $data.columns, 2212 records: $options.getRows, 2213 creatable: false, 2214 updatable: false, 2215 deletable: false, 2216 actionsColumn: false, 2217 selectionColumn: false, 2218 externalRefresh: true, 2219 onRefresh: $options.refresh 2220 }, null, 8, ["columns", "records", "onRefresh"])) : createCommentVNode("", true) 2221 ]), 2222 _: 1 2223 }, 8, ["title", "modelValue", "initing", "initingSuccess", "processing"]); 2224} 2225const SfdcDataMaskTaskRunDetailsDialog = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["render", _sfc_render$3], ["__file", "SfdcDataMaskTaskRunDetailsDialog.vue"]]); 2226const _sfc_main$2 = { 2227 mixins: [mixins], 2228 components: { 2229 TaskDialog, 2230 TaskFilesDialog, 2231 SfdcDataCopyTaskRunDetailsDialog, 2232 SfdcDataMaskTaskRunDetailsDialog 2233 }, 2234 props: { 2235 run: Object 2236 }, 2237 data() { 2238 return { 2239 filesDialogOpen: false, 2240 task: {}, 2241 irun: {}, 2242 taskFiles: [], 2243 errorFiles: [], 2244 taskDialogOpen: false, 2245 taskId: "", 2246 jobId: "", 2247 objectsTree: [], 2248 sfdcDataCopyDialogOpen: false, 2249 sfdcDataMaskDialogOpen: false 2250 }; 2251 }, 2252 created() { 2253 var _a; 2254 const row = this.params.data || {}; 2255 this.task = (((_a = this.run) == null ? void 0 : _a.tasks) || []).find((it) => it.id === row.id || it.taskId === row.taskId) || row; 2256 this.taskId = this.task.id; 2257 this.jobId = this.task.jobId; 2258 this.irun = { id: this.task.runId }; 2259 this.taskFiles = getTaskFiles(this.irun, this.task); 2260 this.errorFiles = this.task.errorSummaryUrls || []; 2261 }, 2262 methods: { 2263 viewFiles() { 2264 this.filesDialogOpen = true; 2265 },
2266 // viewSfdcDataCopyDetails() { 2267 // const objTree = this.task.target?.runProps?.sfdcDataCopy?.objectsTree; 2268 // if (objTree) { 2269 // this.objectsTree = objTree; 2270 // this.taskRunInfoDailogOpen = true; 2271 // } 2272 // }, 2273 isShowSfdcDataCopy() { 2274 var _a, _b, _c, _d, _e; 2275 return ((_a = this.task) == null ? void 0 : _a.type) === "sfdcDataCopy" && ((_e = (_d = (_c = (_b = this.task) == null ? void 0 : _b.target) == null ? void 0 : _c.runProps) == null ? void 0 : _d.sfdcDataCopy) == null ? void 0 : _e.objectsTree); 2276 }, 2277 isShowSfdcDataMask() { 2278 var _a, _b, _c, _d, _e; 2279 return ((_a = this.task) == null ? void 0 : _a.type) === "sfdcDataMask" && ((_e = (_d = (_c = (_b = this.task) == null ? void 0 : _b.target) == null ? void 0 : _c.runProps) == null ? void 0 : _d.sfdcDataMask) == null ? void 0 : _e.sobjects); 2280 } 2281 } 2282}; 2283function _sfc_render$2(_ctx, _cache, $props, $setup, $data, $options) { 2284 const _component_Icon = resolveComponent("Icon"); 2285 const _component_TaskFilesDialog = resolveComponent("TaskFilesDialog"); 2286 const _component_TaskDialog = resolveComponent("TaskDialog"); 2287 const _component_SfdcDataCopyTaskRunDetailsDialog = resolveComponent("SfdcDataCopyTaskRunDetailsDialog"); 2288 const _component_SfdcDataMaskTaskRunDetailsDialog = resolveComponent("SfdcDataMaskTaskRunDetailsDialog"); 2289 return openBlock(), createElementBlock("div", null, [ 2290 $data.taskFiles.length > 0 || $data.errorFiles.length > 0 ? (openBlock(), createBlock(_component_Icon, { 2291 key: 0, 2292 name: "library_books", 2293 onClick: $options.viewFiles, 2294 clickable: "", 2295 tooltip: "View Files" 2296 }, null, 8, ["onClick"])) : createCommentVNode("", true), 2297 $options.isShowSfdcDataCopy() ? (openBlock(), createBlock(_component_Icon, { 2298 key: 1, 2299 name: "analytics", 2300 onClick: _cache[0] || (_cache[0] = ($event) => $data.sfdcDataCopyDialogOpen = true), 2301 clickable: "", 2302 tooltip: "View Additional Info" 2303 })) : createCommentVNode("", true), 2304 $options.isShowSfdcDataMask() ? (openBlock(), createBlock(_component_Icon, { 2305 key: 2, 2306 name: "analytics", 2307 onClick: _cache[1] || (_cache[1] = ($event) => $data.sfdcDataMaskDialogOpen = true), 2308 clickable: "", 2309 tooltip: "View Additional Info" 2310 })) : createCommentVNode("", true), 2311 createVNode(_component_Icon, { 2312 name: "edit", 2313 onClick: _cache[2] || (_cache[2] = ($event) => $data.taskDialogOpen = true), 2314 clickable: "", 2315 tooltip: "Edit Task" 2316 }), 2317 createVNode(_component_TaskFilesDialog, { 2318 title: "Task Files", 2319 modelValue: $data.filesDialogOpen, 2320 "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => $data.filesDialogOpen = $event), 2321 run: $data.irun, 2322 task: $data.task, 2323 errorFiles: $data.errorFiles, 2324 onCancel: _cache[4] || (_cache[4] = ($event) => $data.filesDialogOpen = false), 2325 onClose: _cache[5] || (_cache[5] = ($event) => $data.filesDialogOpen = false) 2326 }, null, 8, ["modelValue", "run", "task", "errorFiles"]), 2327 createVNode(_component_TaskDialog, { 2328 modelValue: $data.taskDialogOpen, 2329 "onUpdate:modelValue": _cache[6] || (_cache[6] = ($event) => $data.taskDialogOpen = $event), 2330 taskId: $data.taskId, 2331 jobId: $data.jobId, 2332 mode: "edit", 2333 onCancel: _cache[7] || (_cache[7] = ($event) => $data.taskDialogOpen = false), 2334 onOk: _cache[8] || (_cache[8] = ($event) => $data.taskDialogOpen = false) 2335 }, null, 8, ["modelValue", "taskId", "jobId"]), 2336 createVNode(_component_SfdcDataCopyTaskRunDetailsDialog, { 2337 modelValue: $data.sfdcDataCopyDialogOpen, 2338 "onUpdate:modelValue": _cache[9] || (_cache[9] = ($event) => $data.sfdcDataCopyDialogOpen = $event), 2339 jobId: $data.jobId, 2340 run: $data.irun, 2341 task: $data.task 2342 }, null, 8, ["modelValue", "jobId", "run", "task"]), 2343 createVNode(_component_SfdcDataMaskTaskRunDetailsDialog, { 2344 modelValue: $data.sfdcDataMaskDialogOpen, 2345 "onUpdate:modelValue": _cache[10] || (_cache[10] = ($event) => $data.sfdcDataMaskDialogOpen = $event), 2346 jobId: $data.jobId, 2347 run: $data.irun, 2348 task: $data.task 2349 }, null, 8, ["modelValue", "jobId", "run", "task"]) 2350 ]); 2351} 2352const TaskRunActions = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["render", _sfc_render$2], ["__file", "TaskRunActions.vue"]]); 2353const Message = "Message"; 2354const _sfc_main$1 = { 2355 mixins: [mixins], 2356 props: { 2357 runId: String, 2358 run: Object 2359 }, 2360 components: { 2361 ViewErrorMessageDialog, 2362 Datagrid 2363 }, 2364 emits: ["refresh"], 2365 data() { 2366 return { 2367 taskColumns: [ 2368 { 2369 headerName: "Actions", 2370 field: "actions", 2371 cellRenderer: TaskRunActions, 2372 width: 115, 2373 pinned: "left" 2374 }, 2375 { field: "order", headerName: "#", width: 50 },
2376 { field: "name", width: 350 }, 2377 { field: "typeInfo", headerName: "Type", valueLabels: valueLabels$1.taskTypes, width: 250 }, 2378 // {field: 'typeInfo', label: 'Type', valueLabels: rtUtils.valueLabels.taskTypes, width: 150}, 2379 { field: "status", width: 220 }, 2380 { 2381 headerName: "Duration", 2382 valueGetter: (row) => getRunDuration(row.data), 2383 width: 100 2384 }, 2385 // { 2386 // headerName: 'Read', 2387 // valueGetter: (row) => row.data.stats && row.data.stats.read, 2388 // width: 100, 2389 // type: 'int', 2390 // }, 2391 { 2392 headerName: "Total", 2393 valueGetter: (row) => row.data.stats && row.data.stats.total, 2394 width: 100, 2395 type: "int" 2396 }, 2397 { 2398 headerName: "Inserts", 2399 valueGetter: (row) => row.data.stats && row.data.stats.inserts, 2400 width: 100, 2401 type: "int" 2402 }, 2403 { 2404 headerName: "Updates", 2405 valueGetter: (row) => row.data.stats && row.data.stats.updates, 2406 width: 100, 2407 type: "int" 2408 }, 2409 { 2410 headerName: "Deletes", 2411 valueGetter: (row) => row.data.stats && row.data.stats.deletes, 2412 width: 100, 2413 type: "int" 2414 }, 2415 { 2416 headerName: "Skipped", 2417 valueGetter: (row) => row.data.stats && row.data.stats.skipped, 2418 width: 100, 2419 type: "int" 2420 }, 2421 { 2422 headerName: "Errors", 2423 valueGetter: (row) => row.data.stats && row.data.stats.errors, 2424 width: 100, 2425 type: "int" 2426 }, 2427 { headerName: Message, field: "message", width: 400 }, 2428 { headerName: "Details", field: "details", width: 400 } 2429 ], 2430 taskRecords: this.getTasks, 2431 initingSuccess: true, 2432 viewErrorMessageDialogOpen: false, 2433 viewErrorMessageDialogData: "", 2434 init: false, 2435 tasks: [], 2436 loading: false 2437 }; 2438 }, 2439 created() { 2440 this.tasks = this.run.tasks; 2441 }, 2442 watch: { 2443 run() { 2444 this.tasks = this.run.tasks; 2445 this.refresh(); 2446 } 2447 }, 2448 methods: { 2449 processTaskRuns(taskRuns) { 2450 let order = 1; 2451 return (taskRuns || []).map((task) => { 2452 task.order = order++; 2453 task.runId = this.runId; 2454 task.jobId = this.run.jobId; 2455 return task; 2456 }); 2457 }, 2458 async getTasks() { 2459 return this.processTaskRuns(this.tasks || []); 2460 }, 2461 refresh() { 2462 this.$refs.grid.refresh(); 2463 }, 2464 async refreshTasks() { 2465 this.loading = true; 2466 const run = await getRun(this.runId); 2467 this.tasks = run.tasks; 2468 this.refresh(); 2469 this.loading = false; 2470 this.$emit("refresh", run); 2471 }, 2472 cellClickHandle(rec, fieldName) { 2473 if (fieldName === Message && rec.message) { 2474 this.viewErrorMessageDialogData = rec.message; 2475 this.viewErrorMessageDialogOpen = true; 2476 } 2477 if (fieldName === "Details" && rec.details) { 2478 this.viewErrorMessageDialogData = rec.details; 2479 this.viewErrorMessageDialogOpen = true; 2480 } 2481 } 2482 } 2483}; 2484function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) { 2485 const _component_Datagrid = resolveComponent("Datagrid"); 2486 const _component_ViewErrorMessageDialog = resolveComponent("ViewErrorMessageDialog"); 2487 const _component_PagePart = resolveComponent("PagePart"); 2488 return openBlock(), createBlock(_component_PagePart, { 2489 processing: _ctx.processing, 2490 message: _ctx.message, 2491 messageType: _ctx.messageType 2492 }, { 2493 default: withCtx(() => [ 2494 createVNode(_component_Datagrid, { 2495 ref: "grid", 2496 columns: $data.taskColumns, 2497 records: $data.taskRecords, 2498 creatable: false, 2499 updatable: false, 2500 deletable: false, 2501 actionsColumn: false, 2502 selectionColumn: false, 2503 onCellClick: $options.cellClickHandle, 2504 refreshable: false, 2505 externalRefresh: "", 2506 onRefresh: _cache[0] || (_cache[0] = ($event) => $options.refreshTasks()), 2507 customLoading: $data.loading 2508 }, null, 8, ["columns", "records", "onCellClick", "customLoading"]), 2509 createVNode(_component_ViewErrorMessageDialog, { 2510 modelValue: $data.viewErrorMessageDialogOpen, 2511 "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => $data.viewErrorMessageDialogOpen = $event), 2512 errorMessage: $data.viewErrorMessageDialogData 2513 }, null, 8, ["modelValue", "errorMessage"]) 2514 ]), 2515 _: 1 2516 }, 8, ["processing", "message", "messageType"]); 2517} 2518const TaskRuns = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["render", _sfc_render$1], ["__file", "TaskRuns.vue"]]);
2519const _sfc_main = { 2520 mixins: [mixins], 2521 components: { 2522 JobRunConfirmationDialog, 2523 RunDetails, 2524 RunFiles, 2525 RunFilesDialog, 2526 TaskRuns, 2527 SyncStatus 2528 }, 2529 data: () => ({ 2530 progressOpen: false, 2531 initingSuccess: false, 2532 model: {}, 2533 details: {}, 2534 jobId: "", 2535 runId: "", 2536 currentTab: "tasks", 2537 version: "", 2538 jobRunConfirmationDialogOpen: false, 2539 runLogDialogOpen: false 2540 }), 2541 created() { 2542 this.jobId = this.$route.params.jobId; 2543 this.runId = this.$route.params.runId; 2544 this.initForm(async () => { 2545 let run = await getRun(this.runId); 2546 populateRunName(run); 2547 this.model = run; 2548 }); 2549 }, 2550 watch: { 2551 "$route.params.runId"(newId) { 2552 this.runId = newId; 2553 this.refresh(); 2554 } 2555 }, 2556 methods: { 2557 getDisplayId() { 2558 return formatDateTimeForDisplay(this.model.name.split(" ")[1]); 2559 }, 2560 refresh1() { 2561 this.processForm(async () => { 2562 this.job = await getJob(this.jobId); 2563 this.version = (/* @__PURE__ */ new Date()).toISOString(); 2564 }); 2565 this.currentTab === "tasks" ? this.$refs.tasks.refresh() : void 0; 2566 }, 2567 async refresh() { 2568 await this.processForm(async () => { 2569 let run = await getRun(this.runId); 2570 populateRunName(run); 2571 this.model = run; 2572 }); 2573 if (this.$refs.tasks) { 2574 await this.$refs.tasks.refreshTasks(); 2575 } 2576 }, 2577 handleTaskRunRefresh(run) { 2578 populateRunName(run); 2579 this.model = run; 2580 }, 2581 handleViewLog() { 2582 this.runLogDialogOpen = true; 2583 }, 2584 async handleViewSupportLog() { 2585 await this.processForm(async () => { 2586 var _a, _b, _c; 2587 let logUrl = (_b = (_a = this.model) == null ? void 0 : _a.runtimeInfo) == null ? void 0 : _b.logUrl; 2588 if (!logUrl) { 2589 const run = await getRun(this.runId); 2590 populateRunName(run); 2591 this.model = run; 2592 logUrl = (_c = run == null ? void 0 : run.runtimeInfo) == null ? void 0 : _c.logUrl; 2593 } 2594 if (!logUrl) { 2595 notifyError("Support log is not available for this run."); 2596 return; 2597 } 2598 window.open(logUrl, "_newtab"); 2599 }); 2600 }, 2601 async handleDelete() { 2602 const msg = "Are you sure you want to delete the Run"; 2603 const result = await confirmDelete("Delete Runs?", msg); 2604 if (result) { 2605 this.processForm(async () => { 2606 const resp = await deleteRuns(this.$route.params.jobId, { records: [{ id: this.model.id }] }); 2607 naver.toRealtaskPage(`/jobs/${this.jobId}`); 2608 notifySuccess(resp.message); 2609 }); 2610 } 2611 }, 2612 async handleRunJob(taskIds) { 2613 await this.processForm(async () => { 2614 const resp = await executeJobs(this.getReqBody(taskIds)); 2615 notifySuccess("Job has been submitted for execution"); 2616 const runId = resp[0] && resp[0].runId; 2617 if (runId) { 2618 naver.toRealtaskPage(`/jobs/${this.jobId}/runs/${runId}`); 2619 } 2620 }); 2621 }, 2622 getReqBody(taskIds) { 2623 return { records: [{ id: this.jobId, taskIds }] }; 2624 } 2625 } 2626}; 2627function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { 2628 const _component_Icon = resolveComponent("Icon"); 2629 const _component_MenuItem = resolveComponent("MenuItem"); 2630 const _component_IconMenu = resolveComponent("IconMenu"); 2631 const _component_SyncStatus = resolveComponent("SyncStatus"); 2632 const _component_RunDetails = resolveComponent("RunDetails"); 2633 const _component_RunFiles = resolveComponent("RunFiles"); 2634 const _component_TaskRuns = resolveComponent("TaskRuns"); 2635 const _component_JobRunConfirmationDialog = resolveComponent("JobRunConfirmationDialog"); 2636 const _component_RunFilesDialog = resolveComponent("RunFilesDialog"); 2637 const _component_Page = resolveComponent("Page"); 2638 return openBlock(), createBlock(_component_Page, { 2639 title: () => _ctx.model.runName, 2640 initing: _ctx.initing, 2641 initingSuccess: _ctx.initingSuccess, 2642 processing: _ctx.processing, 2643 message: _ctx.message, 2644 messageType: _ctx.messageType 2645 }, { 2646 breadcrumbs: withCtx(() => [ 2647 createVNode(QBreadcrumbsEl, { 2648 label: "Home", 2649 to: "/realtask/home" 2650 }), 2651 createVNode(QBreadcrumbsEl, { 2652 label: "Jobs", 2653 to: "/realtask/jobs" 2654 }), 2655 createVNode(QBreadcrumbsEl, { 2656 label: `${(_ctx.model.jobId__r || {}).name || "Job"}`, 2657 to: `/realtask/jobs/${_ctx.model.jobId}` 2658 }, null, 8, ["label", "to"]) 2659 ]), 2660 "title-suffix": withCtx(() => [ 2661 createVNode(_component_Icon, { 2662 name: "refresh", 2663 onClick: $options.refresh, 2664 clickable: "" 2665 }, null, 8, ["onClick"]), 2666 createVNode(_component_Icon, { 2667 name: "play_arrow", 2668 onClick: _cache[0] || (_cache[0] = ($event) => _ctx.jobRunConfirmationDialogOpen = true), 2669 clickable: "" 2670 }), 2671 createVNode(_component_IconMenu, null, { 2672 default: withCtx(() => [ 2673 createVNode(_component_MenuItem, { onClick: $options.handleViewLog }, { 2674 default: withCtx(() => [..._cache[6] || (_cache[6] = [ 2675 createTextVNode("View Log", -1) 2676 ])]), 2677 _: 1 2678 }, 8, ["onClick"]), 2679 createVNode(_component_MenuItem, { onClick: $options.handleViewSupportLog }, { 2680 default: withCtx(() => [..._cache[7] || (_cache[7] = [ 2681 createTextVNode("View Support Log", -1) 2682 ])]), 2683 _: 1 2684 }, 8, ["onClick"]), 2685 createVNode(_component_MenuItem, { 2686 onClick: $options.handleDelete, 2687 danger: "" 2688 }, { 2689 default: withCtx(() => [..._cache[8] || (_cache[8] = [ 2690 createTextVNode("Delete", -1) 2691 ])]), 2692 _: 1 2693 }, 8, ["onClick"]) 2694 ]), 2695 _: 1 2696 }) 2697 ]), 2698 "title-desc": withCtx(() => [ 2699 createVNode(_component_SyncStatus, { 2700 status: _ctx.model.status, 2701 size: "sm", 2702 tooltip: _ctx.model.message 2703 }, null, 8, ["status", "tooltip"]) 2704 ]), 2705 default: withCtx(() => [ 2706 createVNode(QTabs, { 2707 "indicator-color": "primary", 2708 align: "left", 2709 modelValue: _ctx.currentTab, 2710 "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => _ctx.currentTab = $event), 2711 dense: "", 2712 class: "", 2713 "no-caps": "" 2714 }, { 2715 default: withCtx(() => [ 2716 createVNode(QTab, { 2717 name: "details", 2718 label: "Run Details" 2719 }), 2720 createVNode(QTab, { 2721 name: "files", 2722 label: "Run Files" 2723 }), 2724 createVNode(QTab, { 2725 name: "tasks", 2726 label: "Task Runs" 2727 }) 2728 ]), 2729 _: 1 2730 }, 8, ["modelValue"]), 2731 createVNode(QTabPanels, { 2732 "keep-alive": "", 2733 modelValue: _ctx.currentTab, 2734 "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => _ctx.currentTab = $event) 2735 }, { 2736 default: withCtx(() => [ 2737 createVNode(QTabPanel, { name: "details" }, { 2738 default: withCtx(() => [ 2739 createVNode(_component_RunDetails, { model: _ctx.model }, null, 8, ["model"]) 2740 ]), 2741 _: 1 2742 }), 2743 createVNode(QTabPanel, { name: "files" }, { 2744 default: withCtx(() => [ 2745 createVNode(_component_RunFiles, { 2746 run: _ctx.model, 2747 jobId: _ctx.jobId 2748 }, null, 8, ["run", "jobId"]) 2749 ]), 2750 _: 1 2751 }), 2752 createVNode(QTabPanel, { name: "tasks" }, { 2753 default: withCtx(() => [ 2754 createVNode(_component_TaskRuns, {
2755 runId: _ctx.model.id, 2756 run: _ctx.model, 2757 ref: "tasks", 2758 onRefresh: $options.handleTaskRunRefresh 2759 }, null, 8, ["runId", "run", "onRefresh"]) 2760 ]), 2761 _: 1 2762 }) 2763 ]), 2764 _: 1 2765 }, 8, ["modelValue"]), 2766 createVNode(_component_JobRunConfirmationDialog, { 2767 modelValue: _ctx.jobRunConfirmationDialogOpen, 2768 "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => _ctx.jobRunConfirmationDialogOpen = $event), 2769 jobId: _ctx.jobId, 2770 onCancel: _cache[4] || (_cache[4] = ($event) => _ctx.jobRunConfirmationDialogOpen = false), 2771 onRun: $options.handleRunJob 2772 }, null, 8, ["modelValue", "jobId", "onRun"]), 2773 createVNode(_component_RunFilesDialog, { 2774 title: "Run Log", 2775 modelValue: _ctx.runLogDialogOpen, 2776 "onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => _ctx.runLogDialogOpen = $event), 2777 run: _ctx.model, 2778 autoOpenFileType: "logFile" 2779 }, null, 8, ["modelValue", "run"]) 2780 ]), 2781 _: 1 2782 }, 8, ["title", "initing", "initingSuccess", "processing", "message", "messageType"]); 2783} 2784const Run = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__file", "Run.vue"]]); 2785export { 2786 Run as default 2787}; 2788//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUnVuLUNxQTFVVUNtLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcHJvZHVjdHMvcmVhbHRhc2svcGFnZXMvcnVucy9SdW5EZXRhaWxzLnZ1ZSIsIi4uLy4uLy4uL3NyYy9wcm9kdWN0cy9yZWFsdGFzay9wYWdlcy9ydW5zL1J1bkZpbGVzLnZ1ZSIsIi4uLy4uLy4uL3NyYy9wcm9kdWN0cy9yZWFsdGFzay9wYWdlcy9ydW5zL1Rhc2tGaWxlc0RpYWxvZy52dWUiLCIuLi8uLi8uLi9zcmMvcHJvZHVjdHMvcmVhbHRhc2svcGFnZXMvcnVucy9EYXRhQ29weU9iamVjdHNTdW1tYXJ5QWN0aW9uLnZ1ZSIsIi4uLy4uLy4uL3NyYy9wcm9kdWN0cy9yZWFsdGFzay9wYWdlcy9ydW5zL0RhdGFDb3B5T2JqZWN0c1N1bW1hcnlEaWFsb2cudnVlIiwiLi4vLi4vLi4vc3JjL3Byb2R1Y3RzL3JlYWx0YXNrL3BhZ2VzL3J1bnMvT2JqZWN0RmlsZXNEaWFsb2cudnVlIiwiLi4vLi4vLi4vc3JjL3Byb2R1Y3RzL3JlYWx0YXNrL3BhZ2VzL3J1bnMvVGFza1J1bkRldGFpbEFjdGlvbi52dWUiLCIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9UcmVlR3JpZFN0YXR1c1JlbmRlcmVyLnZ1ZSIsIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL1ZpZXdNZXNzYWdlRGlhbG9nLnZ1ZSIsIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL0FnR3JpZFRyZWVEYXRhLnZ1ZSIsIi4uLy4uLy4uL3NyYy9wcm9kdWN0cy9yZWFsdGFzay9wYWdlcy9ydW5zL1NmZGNEYXRhQ29weVRhc2tSdW5EZXRhaWxzRGlhbG9nLnZ1ZSIsIi4uLy4uLy4uL3NyYy9wcm9kdWN0cy9yZWFsdGFzay9wYWdlcy9ydW5zL3NmZGNEYXRhTWFzay9GaWxlc0RpYWxvZy52dWUiLCIuLi8uLi8uLi9zcmMvcHJvZHVjdHMvcmVhbHRhc2svcGFnZXMvcnVucy9zZmRjRGF0YU1hc2svU2ZkY0RhdGFNYXNrUnVuQWN0aW9ucy52dWUiLCIuLi8uLi8uLi9zcmMvcHJvZHVjdHMvcmVhbHRhc2svcGFnZXMvcnVucy9zZmRjRGF0YU1hc2svU2ZkY0RhdGFNYXNrVGFza1J1bkRldGFpbHNEaWFsb2cudnVlIiwiLi4vLi4vLi4vc3JjL3Byb2R1Y3RzL3JlYWx0YXNrL3BhZ2VzL3J1bnMvVGFza1J1bkFjdGlvbnMudnVlIiwiLi4vLi4vLi4vc3JjL3Byb2R1Y3RzL3JlYWx0YXNrL3BhZ2VzL3J1bnMvVGFza1J1bnMudnVlIiwiLi4vLi4vLi4vc3JjL3Byb2R1Y3RzL3JlYWx0YXNrL3BhZ2VzL3J1bnMvUnVuLnZ1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+XG4gIDxDYXJkIG1heFdpZHRoPVwiODAwcHhcIj5cbiAgICA8Um93PlxuICAgICAgPENvbHVtbj5cbiAgICAgICAgPE91dHB1dEZpZWxkIGxhYmVsPVwiSm9iXCIgOnZhbHVlPVwibW9kZWwubmFtZSB8fCBtb2RlbC5qb2JJZFwiIC8+XG4gICAgICA8L0NvbHVtbj5cbiAgICAgIDxDb2x1bW4+XG4gICAgICAgIDxPdXRwdXRGaWVsZCBsYWJlbD1cIlN0YXR1c1wiIDp2YWx1ZT1cIm1vZGVsLnN0YXR1c1wiIDp2YWx1ZUxhYmVscz1cInZhbHVlTGFiZWxzKCkuc3RhdHVzXCIgLz5cbiAgICAgIDwvQ29sdW1uPlxuICAgIDwvUm93PlxuICAgIDxSb3c+XG4gICAgICA8Q29sdW1uPlxuICAgICAgICA8T3V0cHV0RmllbGQgbGFiZWw9XCJTdGFydCBBdFwiIDp2YWx1ZT1cIm1vZGVsLnN0YXJ0QXRcIiB0eXBlPVwiZGF0ZXRpbWVcIiAvPlxuICAgICAgPC9Db2x1bW4+XG4gICAgICA8Q29sdW1uPlxuICAgICAgICA8T3V0cHV0RmllbGQgbGFiZWw9XCJFbmQgQXRcIiA6dmFsdWU9XCJtb2RlbC5lbmRBdFwiIHR5cGU9XCJkYXRldGltZVwiIC8+XG4gICAgICA8L0NvbHVtbj5cbiAgICA8L1Jvdz5cbiAgICA8Um93PlxuICAgICAgPENvbHVtbj5cbiAgICAgICAgPE91dHB1dEZpZWxkIGxhYmVsPVwiQ29tcGxldGVkIFRhc2tzXCIgOnZhbHVlPVwiKG1vZGVsLnRhc2tzIHx8IFtdKS5maWx0ZXIoKHRhc2spID0+IHRhc2suc3RhdHVzID09PSAnY29tcGxldGVkJykubGVuZ3RoXCIgLz5cbiAgICAgIDwvQ29sdW1uPlxuICAgICAgPENvbHVtbj5cbiAgICAgICAgPE91dHB1dEZpZWxkXG4gICAgICAgICAgbGFiZWw9XCJFcnJvcmVkIFRhc2tzXCJcbiAgICAgICAgICA6dmFsdWU9XCIobW9kZWwudGFza3MgfHwgW10pLmZpbHRlcigodGFzaykgPT4gdGFzay5zdGF0dXMgPT09ICdlcnJvcicgfHwgdGFzay5zdGF0dXMgPT09ICdhYm9ydGVkJykubGVuZ3RoXCJcbiAgICAgICAgLz5cbiAgICAgIDwvQ29sdW1uPlxuICAgIDwvUm93PlxuICAgIDxSb3c+XG4gICAgICA8Q29sdW1uPlxuICAgICAgICA8T3V0cHV0RmllbGQgbGFiZWw9XCJNZXNzYWdlXCIgOnZhbHVlPVwibW9kZWwubWVzc2FnZVwiIC8+XG4gICAgICA8L0NvbHVtbj5cbiAgICA8L1Jvdz5cbiAgICA8Um93PlxuICAgICAgPENvbHVtbj5cbiAgICAgICAgPE91dHB1dEZpZWxkIGxhYmVsPVwiRG
2788V0YWlsc1wiIDp2YWx1ZT1cIm1vZGVsLmRldGFpbHNcIiAvPlxuICAgICAgPC9Db2x1bW4+XG4gICAgPC9Sb3c+XG4gIDwvQ2FyZD5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICdzcmMvc2VydmljZXMvdXRpbHMnO1xuaW1wb3J0IE91dHB1dEZpZWxkIGZyb20gJ3NyYy9jb21wb25lbnRzL091dHB1dEZpZWxkLnZ1ZSc7XG5leHBvcnQgZGVmYXVsdCB7XG4gIHByb3BzOiB7XG4gICAgbW9kZWw6IE9iamVjdCxcbiAgfSxcbiAgY29tcG9uZW50czoge091dHB1dEZpZWxkfSxcbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogJycsXG4gICAgfTtcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgdmFsdWVMYWJlbHMoKSB7XG4gICAgICByZXR1cm4gdXRpbHMudmFsdWVMYWJlbHM7XG4gICAgfSxcbiAgfSxcbn07XG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdj5cbiAgICA8ZGl2IHYtaWY9XCJvdXRwdXRGaWxlcy5sZW5ndGggPiAwXCIgY2xhc3M9XCJxLW1iLW1kXCI+XG4gICAgICA8c3Bhbj5PdXRwdXQgRmlsZXM8L3NwYW4+XG4gICAgICA8cS10YWJsZVxuICAgICAgICA6cm93cz1cIm91dHB1dEZpbGVzXCJcbiAgICAgICAgOmNvbHVtbnM9XCJjb2x1bW5zXCJcbiAgICAgICAgcm93LWtleT1cImlkXCJcbiAgICAgICAgOmhpZGUtcGFnaW5hdGlvbj1cInRydWVcIlxuICAgICAgICA6cm93cy1wZXItcGFnZS1vcHRpb25zPVwiWzBdXCJcbiAgICAgICAgdi1tb2RlbDpwYWdpbmF0aW9uPVwicGFnaW5hdGlvblwiXG4gICAgICA+XG4gICAgICAgIDx0ZW1wbGF0ZSB2LXNsb3Q6Ym9keS1jZWxsLWFjdGlvbnM9XCJwcm9wc1wiPlxuICAgICAgICAgIDxxLXRkPlxuICAgICAgICAgICAgPEljb24gbmFtZT1cImNvbnRlbnRfY29weVwiIEBjbGljaz1cImNvcHlGaWxlKHByb3BzLnJvdylcIiBjbGlja2FibGUgdG9vbHRpcD1cIkNvcHkgVXJsXCIgLz5cbiAgICAgICAgICAgIDxJY29uIG5hbWU9XCJjbG91ZF9kb3dubG9hZFwiIEBjbGljaz1cImRvd25sb2FkRmlsZShwcm9wcy5yb3cpXCIgY2xpY2thYmxlIHRvb2x0aXA9XCJEb3dubG9hZCBGaWxlXCIgLz5cbiAgICAgICAgICAgIDxJY29uIHYtaWY9XCJwcm9wcy5yb3cuY2FuVmlld1wiIG5hbWU9XCJ2aXNpYmlsaXR5XCIgQGNsaWNrPVwidmlld091dHB1dEZpbGUocHJvcHMucm93KVwiIGNsaWNrYWJsZSB0b29sdGlwPVwiVmlldyBGaWxlXCIgLz5cbiAgICAgICAgICA8L3EtdGQ+XG4gICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICA8L3EtdGFibGU+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IHYtaWY9XCJzdGF0dXNGaWxlcy5sZW5ndGggPiAwXCIgY2xhc3M9XCJxLW1iLW1kXCI+XG4gICAgICA8c3Bhbj5TdGF0dXMgRmlsZXM8L3NwYW4+XG4gICAgICA8cS10YWJsZVxuICAgICAgICA6cm93cz1cInN0YXR1c0ZpbGVzXCJcbiAgICAgICAgOmNvbHVtbnM9XCJjb2x1bW5zXCJcbiAgICAgICAgcm93LWtleT1cImlkXCJcbiAgICAgICAgOmhpZGUtcGFnaW5hdGlvbj1cInRydWVcIlxuICAgICAgICA6cm93cy1wZXItcGFn
2788ZS1vcHRpb25zPVwiWzBdXCJcbiAgICAgICAgdi1tb2RlbDpwYWdpbmF0aW9uPVwicGFnaW5hdGlvblwiXG4gICAgICA+XG4gICAgICAgIDx0ZW1wbGF0ZSB2LXNsb3Q6Ym9keS1jZWxsLWFjdGlvbnM9XCJwcm9wc1wiPlxuICAgICAgICAgIDxxLXRkPlxuICAgICAgICAgICAgPEljb24gbmFtZT1cImNvbnRlbnRfY29weVwiIEBjbGljaz1cImNvcHlGaWxlKHByb3BzLnJvdylcIiBjbGlja2FibGUgdG9vbHRpcD1cIkNvcHkgVXJsXCIgLz5cbiAgICAgICAgICAgIDxJY29uIG5hbWU9XCJjbG91ZF9kb3dubG9hZFwiIEBjbGljaz1cImRvd25sb2FkRmlsZShwcm9wcy5yb3cpXCIgY2xpY2thYmxlIHRvb2x0aXA9XCJEb3dubG9hZCBGaWxlXCIgLz5cbiAgICAgICAgICAgIDxJY29uIHYtaWY9XCJwcm9wcy5yb3cuY2FuVmlld1wiIG5hbWU9XCJ2aXNpYmlsaXR5XCIgQGNsaWNrPVwidmlld1N0YXR1c0ZpbGUocHJvcHMucm93KVwiIGNsaWNrYWJsZSB0b29sdGlwPVwiVmlldyBGaWxlXCIgLz5cbiAgICAgICAgICA8L3EtdGQ+XG4gICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICA8L3EtdGFibGU+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IHYtaWY9XCJsb2dGaWxlcy5sZW5ndGggPiAwXCIgY2xhc3M9XCJxLW1iLW1kXCI+XG4gICAgICA8cS10YWJsZSA6cm93cz1cImxvZ0ZpbGVzXCIgOmNvbHVtbnM9XCJjb2x1bW5zXCIgcm93LWtleT1cImlkXCIgOmhpZGUtcGFnaW5hdGlvbj1cInRydWVcIiA6cm93cy1wZXItcGFnZS1vcHRpb25zPVwiWzBdXCIgdi1tb2RlbDpwYWdpbmF0aW9uPVwicGFnaW5hdGlvblwiPlxuICAgICAgICA8dGVtcGxhdGUgdi1zbG90OmJvZHktY2VsbC1hY3Rpb25zPVwicHJvcHNcIj5cbiAgICAgICAgICA8cS10ZD5cbiAgICAgICAgICAgIDxJY29uIG5hbWU9XCJjb250ZW50X2NvcHlcIiBAY2xpY2s9XCJjb3B5RmlsZShwcm9wcy5yb3cpXCIgY2xpY2thYmxlIHRvb2x0aXA9XCJDb3B5IFVybFwiIC8+XG4gICAgICAgICAgICA8SWNvbiBuYW1lPVwiY2xvdWRfZG93bmxvYWRcIiBAY2xpY2s9XCJkb3dubG9hZEZpbGUocHJvcHMucm93KVwiIGNsaWNrYWJsZSB0b29sdGlwPVwiRG93bmxvYWQgRmlsZVwiIC8+XG4gICAgICAgICAgICA8SWNvbiB2LWlmPVwicHJvcHMucm93LmNhblZpZXdcIiBuYW1lPVwidmlzaWJpbGl0eVwiIEBjbGljaz1cInZpZXdMb2dGaWxlKHByb3BzLnJvdylcIiBjbGlja2FibGUgdG9vbHRpcD1cIlZpZXcgRmlsZVwiIC8+XG4gICAgICAgICAgPC9xLXRkPlxuICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgPC9xLXRhYmxlPlxuICAgIDwvZGl2PlxuXG4gICAgPEVtcHR5IHYtaWY9XCIhb3V0cHV0RmlsZXMubGVuZ3RoICYmICFzdGF0dXNGaWxlcy5sZW5ndGggJiYgIWxvZ0ZpbGVzLmxlbmd0aFwiIGRlc2M9XCJObyBydW4tbGV2ZWwgZmlsZXMgZm91bmRcIiAvPlxuXG4gICAgPEZpbGVWaWV3ZXJEaWFsb2cyIHYtbW9kZWw9XCJ2aWV3ZXJEaWFsb2dPcGVuXCIgOnRpdGxlPVwidmlld2VyRGlhbG9nVGl0bGVcIiA6ZmlsZUluZm89XCJ2aWV3ZXJEaWFsb2dNb2RlbFwiIC8+XG4gICAgPFN0YXR1c0ZpbGVWaWV3ZXIgdi1tb2RlbD1cInN0YXR1c0ZpbGVWaWV3ZXJEaWFsb2dPcGVuXCIgOnRpdGxlPVwidmlld2VyRGlhbG9nVGl0bGVcIiA6ZmlsZUluZm89XCJ2aWV3ZXJEaWFsb2dNb2RlbFwiIC8+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBsYW5nPVwidHlwZXNjcmlwdFwiPlxuaW1wb3J0IG1peGlucyBmcm9tICdzcmMvbWl4aW5zL21peGlucyc7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICdzcmMvc2VydmljZXMvdXRpbHMnO1xuaW1wb3J0ICogYXMgYXBpIGZyb20gJy4uLy4uL3NlcnZpY2VzL2FwaSc7XG5pbXBvcnQgKiBhcyBydFV0aWxzIGZyb20gJy4uLy4uL3NlcnZpY2VzL3J0VXRpbHMnO1xuaW1wb3J0IHtSdW5GaWxlVHlwZX0gZnJvbSAnc3JjL3NlcnZpY2VzL21vZGVscyc7XG5pbXBvcnQgU3RhdHVzRmlsZVZpZXdlciBmcm9tICdzcmMvY29tcG9uZW50cy9TdGF0dXNGaWxlVmlld2VyLnZ1ZSc7XG5pbXBvcnQge2NvcHlUb0NsaXBib2FyZH0gZnJvbSAnc3JjL3NlcnZpY2VzL3V0aWxzJztcbmltcG9ydCBGaWxlVmlld2VyRGlhbG9nMiBmcm9tICdzcmMvY29tcG9uZW50cy9GaWxlVmlld2VyRGlhbG9nMi52dWUnO1xuaW1wb3J0IEVtcHR5IGZyb20gJ3NyYy9jb21wb25lbnRzL0VtcHR5LnZ1ZSc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbbWl4aW5zXSxcbiAgY29tcG9uZW50czoge1N0YXR1c0ZpbGVWaWV3ZXIsIEZpbGVWaWV3ZXJEaWFsb2cyLCBFbXB0eX0sXG4gIHByb3BzOiB7XG4gICAgcnVuOiBPYmplY3QsXG4gICAgam9iSWQ6IFN0cmluZyxcbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBvdXRwdXRGaWxlczogW10sXG4gICAgICBzdGF0dXNGaWxlczogW10sXG4gICAgICBsb2dGaWxlczogW10sXG4gICAgICBjb2x1bW5zOiBbXG4gICAgICAgIHtuYW1lOiAnYWN0aW9ucycsIGFsaWduOiAnbGVmdCd9LFxuICAgICAgICB7bmFtZTogJ3R5cGUnLCBmaWVsZDogJ3R5cGUnLCBsYWJlbDogJ1R5cGUnLCBzb3J0YWJsZTogdHJ1ZSwgYWxpZ246ICdsZWZ0J30sXG4gICAgICAgIHtuYW1lOiAnZmlsZU5hbWUnLCBmaWVsZDogJ2ZpbGVOYW1lJywgbGFiZWw6ICdGaWxlIE5hbWUnLCBzb3J0YWJsZTogdHJ1ZSwgYWxpZ246ICdsZWZ0J30sXG4gICAgICAgIHtuYW1lOiAnZmlsZURlc2NyaXB0aW9uJywgZmllbGQ6ICdmaWxlRGVzY3JpcHRpb24nLCBsYWJlbDogJ0ZpbGUgRGVzYycsIHNvcnRhYmxlOiB0cnVlLCBhbGlnbjogJ2xlZnQnfSxcbiAgICAgICAge25hbWU6ICdmaWxlU2l6ZScsIGZpZWxkOiAnZmlsZVNpemVGb3JtYXR0ZWQnLCBsYWJlbDogJ0ZpbGUgU2l6ZScsIHNvcnRhYmxlOiB0cnVlLCBhbGlnbjogJ2xlZnQnfSxcbiAgICAgIF0sXG4gICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgIHBhZ2U6IDEsXG4gICAgICAgIHJvd3NQZXJQYWdlOiAwLFxuICAgICAgfSxcbiAgICAgIHZpZXdlckRpYWxvZ1RpdGxlOiAnJyxcbiAgICAgIHZpZXdlckRpYWxvZ09wZW46IGZhbHNlLFxuICAgICAgdmlld2VyRGlhbG9nTW9kZWw6IHt9LFxuICAgICAgc3RhdHVzRmlsZVZpZXdlckRpYWxvZ09wZW46IGZhbHNlLFxuICAgIH07XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBydW46IHtcbiAgICAgIGhhbmRsZXIoKSB7XG4gICAgICAgI
2788HRoaXMubG9hZEZpbGVzKCk7XG4gICAgICB9LFxuICAgICAgaW1tZWRpYXRlOiB0cnVlLFxuICAgIH0sXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGxvYWRGaWxlcygpIHtcbiAgICAgIGNvbnN0IGZpbGVzID0gcnRVdGlscy5nZXRSdW5GaWxlcyh0aGlzLnJ1bikuZmlsdGVyKChmaWxlKSA9PiAhZmlsZS50YXNrSWQpO1xuICAgICAgdGhpcy5vdXRwdXRGaWxlcyA9IGZpbGVzLmZpbHRlcigoZmlsZSkgPT4gZmlsZS5ydW5GaWxlVHlwZSA9PT0gUnVuRmlsZVR5cGUub3V0cHV0RmlsZSk7XG4gICAgICB0aGlzLnN0YXR1c0ZpbGVzID0gZmlsZXMuZmlsdGVyKChmaWxlKSA9PiBmaWxlLnJ1bkZpbGVUeXBlID09PSBSdW5GaWxlVHlwZS5zdGF0dXNGaWxlKTtcbiAgICAgIHRoaXMubG9nRmlsZXMgPSBmaWxlcy5maWx0ZXIoKGZpbGUpID0+IGZpbGUucnVuRmlsZVR5cGUgPT09IFJ1bkZpbGVUeXBlLmxvZ0ZpbGUpO1xuICAgIH0sXG5cbiAgICB2aWV3T3V0cHV0RmlsZShmaWxlSW5mbykge1xuICAgICAgdGhpcy5oYW5kbGVWaWV3RmlsZSgnT3V0cHV0IEZpbGU6ICcgKyBmaWxlSW5mby5maWxlTmFtZSwgZmlsZUluZm8sICdvdXRwdXRGaWxlJyk7XG4gICAgfSxcblxuICAgIHZpZXdTdGF0dXNGaWxlKGZpbGVJbmZvKSB7XG4gICAgICB0aGlzLmhhbmRsZVZpZXdGaWxlKCdTdGF0dXMgRmlsZTogJyArIGZpbGVJbmZvLmZpbGVOYW1lLCBmaWxlSW5mbywgJ3N0YXR1c0ZpbGUnKTtcbiAgICB9LFxuXG4gICAgdmlld0xvZ0ZpbGUoZmlsZUluZm8pIHtcbiAgICAgIHRoaXMuaGFuZGxlVmlld0ZpbGUoJ0xvZyBGaWxlOiAnICsgZmlsZUluZm8uZmlsZU5hbWUsIGZpbGVJbmZvLCAnbG9nRmlsZScpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRPcGVuYWJsZVVybChmaWxlSW5mbykge1xuICAgICAgaWYgKGZpbGVJbmZvLnVybC5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgICAgcmV0dXJuIGZpbGVJbmZvLnVybDtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbGVJbmZvLm9wZW5hYmxlVXJsKSB7XG4gICAgICAgIHJldHVybiBmaWxlSW5mby5vcGVuYWJsZVVybDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMucHJvY2Vzc0Zvcm0oKCkgPT5cbiAgICAgICAgYXBpLm9wZW5GaWxlKHtcbiAgICAgICAgICBydW5JZDogZmlsZUluZm8ucnVuSWQsXG4gICAgICAgICAgam9iSWQ6IHRoaXMuam9iSWQsXG4gICAgICAgICAgdXJsOiBmaWxlSW5mby51cmwsXG4gICAgICAgICAgbG9jYXRpb246IGZpbGVJbmZvLmxvY2F0aW9uLFxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgaWYgKHJlc3ApIHtcbiAgICAgICAgZmlsZUluZm8ub3BlbmFibGVVcmwgPSByZXNwLnVybDtcbiAgICAgICAgcmV0dXJuIHJlc3AudXJsO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBoYW5kbGVWaWV3RmlsZSh0aXRsZSwgZmlsZUluZm8sIGZpbGVUeXBlKSB7XG4gICAgICBpZiAoZmlsZUluZm8udXJsLnN0YXJ0c1dpdGgoJ2h0dHAnKSkge1xuICAgICAgICB1dGlscy5vcGVuVXJsKGZpbGVJbmZvLnVybCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5nZXRPcGVuYWJsZVVybChmaWxlSW5mbyk7XG4gICAgICBpZiAoIXVybCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMudmlld2VyRGlhbG9nVGl0bGUgPSB0aXRsZTtcbiAgICAgIHRoaXMudmlld2VyRGlhbG9nTW9kZWwgPSB7Li4uZmlsZUluZm8sIC4uLnt2aWV3VXJsOiB1cmx9fTtcblxuICAgICAgaWYgKGZpbGVUeXBlID09PSAnc3RhdHVzRmlsZScpIHtcbiAgICAgICAgdGhpcy5zdGF0dXNGaWxlVmlld2VyRGlhbG9nT3BlbiA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnZpZXdlckRpYWxvZ09wZW4gPSB0cnVlO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBkb3dubG9hZEZpbGUoZmlsZUluZm8pIHtcbiAgICAgIGNvbnN0IHVybCA9IGF3YWl0IHRoaXMuZ2V0T3BlbmFibGVVcmwoZmlsZUluZm8pO1xuICAgICAgaWYgKHVybCkge1xuICAgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoJ2h0dHAnKSkge1xuICAgICAgICAgIHV0aWxzLm9wZW5VcmwodXJsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBjb3B5RmlsZShmaWxlSW5mbykge1xuICAgICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5nZXRPcGVuYWJsZVVybChmaWxlSW5mbyk7XG4gICAgICBpZiAodXJsKSB7XG4gICAgICAgIGF3YWl0IGNvcHlUb0NsaXBib2FyZCh1cmwpO1xuICAgICAgfVxuICAgIH0sXG4gIH0sXG59O1xuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGU+XG4gIDxDb250ZW50RGlhbG9nXG4gICAgOnRpdGxlPVwidGl0bGUgfHwgJ0ZpbGVzJ1wiXG4gICAgOm1vZGVsVmFsdWU9XCJtb2RlbFZhbHVlXCJcbiAgICBAdXBkYXRlOm1vZGVsVmFsdWU9XCIkZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnKVwiXG4gICAgOm1lc3NhZ2U9XCJtZXNzYWdlXCJcbiAgICA6bWVz
2788c2FnZVR5cGU9XCJtZXNzYWdlVHlwZVwiXG4gICAgOmluaXRpbmc9XCJpbml0aW5nXCJcbiAgICA6aW5pdGluZ1N1Y2Nlc3M9XCJpbml0aW5nU3VjY2Vzc1wiXG4gICAgOnByb2Nlc3Npbmc9XCJwcm9jZXNzaW5nXCJcbiAgICBoZWlnaHQ9XCJhdXRvXCJcbiAgICB3aWR0aD1cIjEyMDBweFwiXG4gICAgY2xvc2VNb2RlXG4gICAgOnBlcnNpc3RlbnQ9XCJmYWxzZVwiXG4gICAgQGNhbmNlbD1cImNsb3NlXCJcbiAgPlxuICAgIDxkaXYgdi1pZj1cIm91dHB1dEZpbGVzICYmIG91dHB1dEZpbGVzLmxlbmd0aCA+IDBcIiBjbGFzcz1cInEtbWItbWRcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiXCI+T3V0cHV0IEZpbGVzPC9zcGFuPlxuICAgICAgPHEtdGFibGUgOnJvd3M9XCJvdXRwdXRGaWxlc1wiIDpjb2x1bW5zPVwiY29sdW1uc1wiIHJvdy1rZXk9XCJpZFwiIDpoaWRlLXBhZ2luYXRpb249XCJ0cnVlXCIgOnJvd3MtcGVyLXBhZ2Utb3B0aW9ucz1cIlswXVwiPlxuICAgICAgICA8dGVtcGxhdGUgdi1zbG90OmJvZHktY2VsbC1hY3Rpb25zPVwicHJvcHNcIj5cbiAgICAgICAgICA8cS10ZD5cbiAgICAgICAgICAgIDxJY29uIG5hbWU9XCJjb250ZW50X2NvcHlcIiBAY2xpY2s9XCJjb3B5RmlsZShwcm9wcy5yb3cpXCIgY2xpY2thYmxlIHRvb2x0aXA9XCJDb3B5IFVybFwiIC8+XG4gICAgICAgICAgICA8SWNvbiBuYW1lPVwiY2xvdWRfZG93bmxvYWRcIiBAY2xpY2s9XCJkb3dubG9hZEZpbGUocHJvcHMucm93KVwiIGNsaWNrYWJsZSB0b29sdGlwPVwiRG93bmxvYWQgRmlsZVwiIC8+XG4gICAgICAgICAgICA8IS0tICAgICAgICAgICAgPEljb24gbmFtZT1cIm9wZW5faW5fbmV3XCIgQGNsaWNrPVwib3BlbkluVGFiKHByb3BzLnJvdylcIiBjbGlja2FibGUgdG9vbHRpcD1cIk9wZW4gaW4gVGFiXCIgLz4tLT5cbiAgICAgICAgICAgIDxJY29uIHYtaWY9XCJwcm9wcy5yb3cuY2FuVmlld1wiIG5hbWU9XCJ2aXNpYmlsaXR5XCIgQGNsaWNrPVwidmlld091dHB1dEZpbGUocHJvcHMucm93KVwiIGNsaWNrYWJsZSB0b29sdGlwPVwiVmlldyBGaWxlXCIgLz5cbiAgICAgICAgICA8L3EtdGQ+XG4gICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICA8L3EtdGFibGU+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IHYtaWY9XCJzdGF0dXNGaWxlcyAmJiBzdGF0dXNGaWxlcy5sZW5ndGggPiAwXCIgY2xhc3M9XCJxLW1iLW1kXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cIlwiPlN0YXR1cyBGaWxlczwvc3Bhbj5cbiAgICAgIDxxLXRhYmxlIDpyb3dzPVwic3RhdHVzRmlsZXNcIiA6Y29sdW1ucz1cImNvbHVtbnNcIiByb3cta2V5PVwiaWRcIiA6aGlkZS1wYWdpbmF0aW9uPVwidHJ1ZVwiIDpyb3dzLXBlci1wYWdl
2788LW9wdGlvbnM9XCJbMF1cIj5cbiAgICAgICAgPHRlbXBsYXRlIHYtc2xvdDpib2R5LWNlbGwtYWN0aW9ucz1cInByb3BzXCI+XG4gICAgICAgICAgPHEtdGQ+XG4gICAgICAgICAgICA8SWNvbkNvcHkgOmNvbnRlbnQ9XCJwcm9wcy5yb3cudXJsXCIgdG9vbHRpcD1cIkNvcHkgdXJsIHRvIENsaXBib2FyZFwiIC8+XG4gICAgICAgICAgICA8SWNvbiBuYW1lPVwiY2xvdWRfZG93bmxvYWRcIiBAY2xpY2s9XCJkb3dubG9hZEZpbGUocHJvcHMucm93KVwiIGNsaWNrYWJsZSB0b29sdGlwPVwiRG93bmxvYWQgRmlsZVwiIC8+XG4gICAgICAgICAgICA8SWNvbiB2LWlmPVwicHJvcHMucm93LmNhblZpZXdcIiBuYW1lPVwidmlzaWJpbGl0eVwiIEBjbGljaz1cInZpZXdTdGF0dXNGaWxlKHByb3BzLnJvdylcIiBjbGlja2FibGUgdG9vbHRpcD1cIlZpZXcgRmlsZVwiIC8+XG4gICAgICAgICAgPC9xLXRkPlxuICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgPC9xLXRhYmxlPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiB2LWlmPVwiZXJyb3JGaWxlc1RvU2hvdyAmJiBlcnJvckZpbGVzVG9TaG93Lmxlbmd0aCA+IDBcIiBjbGFzcz1cInEtbWItbWRcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiXCI+RXJyb3JzPC9zcGFuPlxuICAgICAgPHEtdGFibGUgOnJvd3M9XCJlcnJvckZpbGVzVG9TaG93XCIgOmNvbHVtbnM9XCJmaWxlQ29sdW1uc1wiIHJvdy1rZXk9XCJpZFwiIDpoaWRlLXBhZ2luYXRpb249XCJ0cnVlXCIgOnJvd3MtcGVyLXBhZ2Utb3B0aW9ucz1cIlswXVwiPlxuICAgICAgICA8dGVtcGxhdGUgdi1zbG90OmJvZHktY2VsbC1hY3Rpb25zPVwicHJvcHNcIj5cbiAgICAgICAgICA8cS10ZD5cbiAgICAgICAgICAgIDxJY29uQ29weSA6Y29udGVudD1cInByb3BzLnJvdy51cmxcIiB0b29sdGlwPVwiQ29weSB1cmwgdG8gQ2xpcGJvYXJkXCIgLz5cbiAgICAgICAgICAgIDxJY29uIG5hbWU9XCJjbG91ZF9kb3dubG9hZFwiIEBjbGljaz1cImRvd25sb2FkRmlsZShwcm9wcy5yb3cpXCIgY2xpY2thYmxlIHRvb2x0aXA9XCJEb3dubG9hZCBGaWxlXCIgLz5cbiAgICAgICAgICAgIDxJY29uIHYtaWY9XCJwcm9wcy5yb3cuY2FuVmlld1wiIG5hbWU9XCJ2aXNpYmlsaXR5XCIgQGNsaWNrPVwidmlld0Vycm9yRmlsZShwcm9wcy5yb3cpXCIgY2xpY2thYmxlIHRvb2x0aXA9XCJWaWV3IEZpbGVcIiAvPlxuICAgICAgICAgIDwvcS10ZD5cbiAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgIDwvcS10YWJsZT5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgdi1pZj1cImxvZ0ZpbGVzICYmIGxvZ0ZpbGVzLmxlbmd0aCA+IDBcIiBjbGFzcz1cInEtbWItbWRcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiXCI+TG9nIEZpbGVzPC9zcGFuPlxuICAgICAgPHEtdGFibGUgOnJvd3M9XCJsb2dGaWxlc1wiIDpjb2x1bW5zPVwiY29sdW1uc1wiIHJvdy1rZXk9XCJpZFwiIDpoaWRlLXBhZ2luYXRpb249XCJ0cnVlXCIgOnJvd3MtcGVyLXBhZ2Utb3B0aW9ucz1cIlswXVwiPlxuICAgICAgICA8dGVtcGxhdGUgdi1zbG90OmJvZHktY2VsbC1hY3Rpb25zPVwicHJvcHNcIj5cbiAgICAgICAgICA8cS10ZD5cbiAgICAgICAgICAgIDxJY29uQ29weSA6Y29udGVudD1cInByb3BzLnJvdy51cmxcIiB0b29sdGlwPVwiQ29weSB1cmwgdG8gQ2xpcGJvYXJkXCIgLz5cbiAgICAgICAgICAgIDxJY29uIG5hbWU9XCJjbG91ZF9kb3dubG9hZFwiIEBjbGljaz1cImRvd25sb2FkRmlsZShwcm9wcy5yb3cpXCIgY2xpY2thYmxlIHRvb2x0aXA9XCJEb3dubG9hZCBGaWxlXCIgLz5cbiAgICAgICAgICAgIDxJY29uIHYtaWY9XCJwcm9wcy5yb3cuY2FuVmlld1wiIG5hbWU9XCJ2aXNpYmlsaXR5XCIgQGNsaWNrPVwidmlld0xvZ0ZpbGUocHJvcHMucm93KVwiIGNsaWNrYWJsZSB0b29sdGlwPVwiVmlldyBGaWxlXCIgLz5cbiAgICAgICAgICA8L3EtdGQ+XG4gICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICA8L3EtdGFibGU+XG4gICAgPC9kaXY+XG5cbiAgICA8RmlsZVZpZXdlckRpYWxvZzIgdi1tb2RlbD1cInZpZXdlckRpYWxvZ09wZW5cIiA6dGl0bGU9XCJ2aWV3ZXJEaWFsb2dUaXRsZVwiIDpmaWxlSW5mbz1cInZpZXdlckRpYWxvZ01vZGVsXCIgLz5cbiAgICA8U3RhdHVzRmlsZVZpZXdlciB2LW1vZGVsPVwic3RhdHVzRmlsZVZpZXdlckRpYWxvZ09wZW5cIiA6dGl0bGU9XCJ2aWV3ZXJEaWFsb2dUaXRsZVwiIDpmaWxlSW5mbz1cInZpZXdlckRpYWxvZ01vZGVsXCIgLz5cbiAgPC9Db250ZW50RGlhbG9nPlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBsYW5nPVwidHlwZXNjcmlwdFwiPlxuaW1wb3J0IG1peGlucyBmcm9tICdzcmMvbWl4aW5zL21peGlucyc7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy91dGlscyc7XG5pbXBvcnQgKiBhcyBhcGkgZnJvbSAnLi4vLi4vc2VydmljZXMvYXBpJztcbmltcG9ydCAqIGFzIHJ0VXRpbHMgZnJvbSAnLi4vLi4vc2VydmljZXMvcnRVdGlscyc7XG5pbXBvcnQge1J1bkZpbGVUeXBlfSBmcm9tICdzcmMvc2VydmljZXMvbW9kZWxzJztcbmltcG9ydCBTdGF0dXNGaWxlVmlld2VyIGZyb20gJ3NyYy9jb21wb25lbnRzL1N0YXR1c0ZpbGVWaWV3ZXIudnVlJztcbmltcG9ydCBGaWxlVmlld2VyRGlhbG9nMiBmcm9tICdzcmMvY29tcG9uZW50cy9GaWxlVmlld2VyRGlhbG9nMi52dWUnO1xuaW1wb3J0IEljb25Db3B5IGZyb20gJ3NyYy9jb21wb25lbnRzL0ljb25Db3B5LnZ1ZSc7XG5pbXBvcnQge2NvcHlUb0NsaXBib2FyZH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvdXRpbHMnO1xuXG5jb25zdCBNZXNzYWdlID0gJ01lc3NhZ2UnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW21peGluc10sXG4gIGNvbXBvbmVudHM6IHtTdGF0dXNGaWxlVmlld2VyLCBGaWxlVmlld2VyRGlhbG9nMiwgSWNvbkNvcHl9LFxuXG4gIHByb3BzOiB7XG4gICAgdGl0bGU6IFN0cmluZyxcbiAgICBqb2JJZDogU3RyaW5nLFxuICAgIG1vZGVsVmFsdWU6IEJvb2xlYW4sXG4gICAgdGFzazogT2JqZWN0LFxuICAgIHJ1bjogT2JqZWN0LFxuICAgIGVycm9yRmlsZXM6IEFycmF
27885LFxuICB9LFxuICBlbWl0czogWydjYW5jZWwnLCAndXBkYXRlOm1vZGVsVmFsdWUnXSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBvdXRwdXRGaWxlczogW10sXG4gICAgICBzdGF0dXNGaWxlczogW10sXG4gICAgICBsb2dGaWxlczogW10sXG4gICAgICBmaWxlczogW10sXG5cbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAge25hbWU6ICdhY3Rpb25zJywgYWxpZ246ICdsZWZ0J30sXG4gICAgICAgIHtuYW1lOiAndGFza05hbWUnLCBmaWVsZDogJ3Rhc2tOYW1lJywgbGFiZWw6ICdUYXNrJywgc29ydGFibGU6IHRydWUsIGFsaWduOiAnbGVmdCd9LFxuICAgICAgICB7bmFtZTogJ3R5cGUnLCBmaWVsZDogJ3R5cGUnLCBsYWJlbDogJ1R5cGUnLCBzb3J0YWJsZTogdHJ1ZSwgYWxpZ246ICdsZWZ0J30sXG4gICAgICAgIHtuYW1lOiAnZmlsZU5hbWUnLCBmaWVsZDogJ2ZpbGVOYW1lJywgbGFiZWw6ICdGaWxlIE5hbWUnLCBzb3J0YWJsZTogdHJ1ZSwgYWxpZ246ICdsZWZ0J30sXG4gICAgICAgIHtuYW1lOiAnZmlsZURlc2NyaXB0aW9uJywgZmllbGQ6ICdmaWxlRGVzY3JpcHRpb24nLCBsYWJlbDogJ0ZpbGUgRGVzYycsIHNvcnRhYmxlOiB0cnVlLCBhbGlnbjogJ2xlZnQnfSxcbiAgICAgICAge25hbWU6ICdmaWxlU2l6ZScsIGZpZWxkOiAnZmlsZVNpemVGb3JtYXR0ZWQnLCBsYWJlbDogJ0ZpbGUgU2l6ZScsIHNvcnRhYmxlOiB0cnVlLCBhbGlnbjogJ2xlZnQnfSxcbiAgICAgIF0sXG4gICAgICBmaWxlQ29sdW1uczogW1xuICAgICAgICB7bmFtZTogJ2FjdGlvbnMnLCBhbGlnbjogJ2xlZnQnfSxcbiAgICAgICAge25hbWU6ICdmaWxlTmFtZScsIGZpZWxkOiAnZmlsZU5hbWUnLCBsYWJlbDogJ0ZpbGUgTmFtZScsIHNvcnRhYmxlOiB0cnVlLCBhbGlnbjogJ2xlZnQnfSxcbiAgICAgICAge25hbWU6ICdmaWxlRGVzY3JpcHRpb24nLCBmaWVsZDogJ2ZpbGVEZXNjcmlwdGlvbicsIGxhYmVsOiAnRmlsZSBEZXNjJywgc29ydGFibGU6IHRydWUsIGFsaWduOiAnbGVmdCd9LFxuICAgICAgICB7bmFtZTogJ2ZpbGVTaXplJywgZmllbGQ6ICdmaWxlU2l6ZUZvcm1hdHRlZCcsIGxhYmVsOiAnRmlsZSBTaXplJywgc29ydGFibGU6IHRydWUsIGFsaWduOiAnbGVmdCd9LFxuICAgICAgXSxcbiAgICAgIHZpZXdlckRpYWxvZ1RpdGxlOiAnJyxcbiAgICAgIHZpZXdlckRpYWxvZ09wZW46IGZhbHNlLFxuICAgICAgdmlld2VyRGlhbG9nTW9kZWw6IHt9LFxuICAgICAgc3RhdHVzRmlsZVZpZXdlckRpYWxvZ09wZW46IGZhbHNlLFxuICAgIH07XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBlcnJvckZpbGVzVG9TaG93KCkge1xuICAgICAgY29uc3QgZmlsZXMgPSAodGhpcy5lcnJvckZpbGVzICYmIHRoaXMuZXJyb3JGaWxlcy5sZW5ndGggPiAwID8gdGhpcy5lcnJvckZpbGVzIDogdGhpcy50YXNrPy5lcnJvclN1bW1hcnlVcmxzKSB8fCBbXTtcbiAgICAgIHJldHVybiBmaWxlcy5tYXAoKGZpbGVJbmZvKSA9PiB1dGlscy5jcmVhdGVSdW5GaWxlKGZpbGVJbmZvKSk7XG4gICAgfSxcbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIHRoaXMuaW5pdGluZ1N1Y2Nlc3MgPSB0cnVlO1xuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSgpIHtcbiAgICAgIGlmICghdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsZXMgPSBydFV0aWxzLmdldFRhc2tGaWxlcyh0aGlzLnJ1biwgdGhpcy50YXNrKTtcblxuICAgICAgdGhpcy5vdXRwdXRGaWxlcyA9IGZpbGVzLmZpbHRlcigoZmlsZSkgPT4gZmlsZS5ydW5GaWxlVHlwZSA9PT0gUnVuRmlsZVR5cGUub3V0cHV0RmlsZSk7XG4gICAgICB0aGlzLnN0YXR1c0ZpbGVzID0gZmlsZXMuZmlsdGVyKChmaWxlKSA9PiBmaWxlLnJ1bkZpbGVUeXBlID09PSBSdW5GaWxlVHlwZS5zdGF0dXNGaWxlKTtcbiAgICAgIHRoaXMubG9nRmlsZXMgPSBmaWxlcy5maWx0ZXIoKGZpbGUpID0+IGZpbGUucnVuRmlsZVR5cGUgPT09IFJ1bkZpbGVUeXBlLmxvZ0ZpbGUpO1xuICAgIH0sXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGNsb3NlKCkge1xuICAgICAgdGhpcy4kZW1pdCgnY2FuY2VsJyk7XG4gICAgfSxcblxuICAgIHZpZXdPdXRwdXRGaWxlKGZpbGVJbmZvKSB7XG4gICAgICB0aGlzLmhhbmRsZVZpZXdGaWxlKCdPdXRwdXQgRmlsZTogJyArIGZpbGVJbmZvLmZpbGVOYW1lLCBmaWxlSW5mbywgJ291dHB1dEZpbGUnKTtcbiAgICB9LFxuXG4gICAgdmlld1N0YXR1c0ZpbGUoZmlsZUluZm8pIHtcbiAgICAgIHRoaXMuaGFuZGxlVmlld0ZpbGUoJ1N0YXR1cyBGaWxlOiAnICsgZmlsZUluZm8uZmlsZU5hbWUsIGZpbGVJbmZvLCAnc3RhdHVzRmlsZScpO1xuICAgIH0sXG5cbiAgICB2aWV3TG9nRmlsZShmaWxlSW5mbykge1xuICAgICAgdGhpcy5oYW5kbGVWaWV3RmlsZSgnTG9nIEZpbGU6ICcgKyBmaWxlSW5mby5maWxlTmFtZSwgZmlsZUluZm8sICdsb2dGaWxlJyk7XG4gICAgfSxcblxuICAgIHZpZXdFcnJvckZpbGUoZmlsZUluZm8pIHtcbiAgICAgIHRoaXMuaGFuZGxlVmlld0ZpbGUoJ0Vycm9ycyBGaWxlOiAnICsgZmlsZUluZm8uZmlsZU5hbWUsIGZpbGVJbmZvLCAnc3RhdHVzRmlsZScpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRPcGVuYWJsZVVybChmaWxlSW5mbykge1xuICAgICAgaWYgKGZpbGVJbmZvLnVybC5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgICAgcmV0dXJuIGZpbGVJbmZvLnVybDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmaWxlSW5mby5vcGVuYWJsZVVybCkge1xuICAgICAgICAgIHJldHVybiBmaWxlSW5mby5vcGVuYWJsZVVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLnByb2Nlc3NGb3JtKCgpID0+XG4gICAgICAgICAgYXBpLm9wZW5GaWxlKHtcbiAgICAgICAgICAgIHJ1bklkOiBmaWxlSW5mby5ydW5JZCxcbiAgICAgICAgICAgIGpvYklkOiB0aGlzLmpvYklkLFxuICAgICAgICAgICAgdXJsOiBmaWxlSW5mby51cmwsXG4gICAgICAgICAgICBsb2NhdGlvbjogZmlsZUluZm8ubG9jYXRpb24sXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmVzcCkge1xuICAgICAgICAgIGZpbGVJbmZvLm9wZW5hYmxlVXJsID0gcmVzcC51cmw7XG4gICAgICAgICAgcmV0dXJuIHJlc3AudXJsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGhhbmRsZVZpZXdGaWxlKHRpdGxlLCBmaWxlSW5mbywgZmlsZVR5cGUpIHtcbiAgICAgIGlmIChmaWxlSW5mby51cmwuc3RhcnRzV2l0aCgnaHR0cCcpKSB7XG4gICAgICAgI
2788HV0aWxzLm9wZW5VcmwoZmlsZUluZm8udXJsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB1cmwgPSBhd2FpdCB0aGlzLmdldE9wZW5hYmxlVXJsKGZpbGVJbmZvKTtcbiAgICAgIGlmICghdXJsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy52aWV3ZXJEaWFsb2dUaXRsZSA9IHRpdGxlO1xuICAgICAgdGhpcy52aWV3ZXJEaWFsb2dNb2RlbCA9IHtcbiAgICAgICAgLi4uZmlsZUluZm8sXG4gICAgICAgIC4uLnt2aWV3VXJsOiB1cmx9LFxuICAgICAgfTtcbiAgICAgIGlmIChmaWxlVHlwZSA9PT0gJ3N0YXR1c0ZpbGUnKSB7XG4gICAgICAgIHRoaXMuc3RhdHVzRmlsZVZpZXdlckRpYWxvZ09wZW4gPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy52aWV3ZXJEaWFsb2dPcGVuID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgb3BlbkluVGFiKGZpbGVJbmZvKSB7XG4gICAgICBjb25zdCB1cmwgPSBhd2FpdCB0aGlzLmdldE9wZW5hYmxlVXJsKGZpbGVJbmZvKTtcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgdXRpbHMub3BlblVybCh1cmwpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBkb3dubG9hZEZpbGUoZmlsZUluZm8pIHtcbiAgICAgIGxldCB1cmwgPSBhd2FpdCB0aGlzLmdldE9wZW5hYmxlVXJsKGZpbGVJbmZvKTtcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgaWYgKHVybC5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgICAgICB1dGlscy5vcGVuVXJsKHVybCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgY29weUZpbGUoZmlsZUluZm8pIHtcbiAgICAgIGxldCB1cmwgPSBhd2FpdCB0aGlzLmdldE9wZW5hYmxlVXJsKGZpbGVJbmZvKTtcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgLy8gdGhpcy4kY2xpcGJvYXJkKHVybCk7XG4gICAgICAgIC8vIHV0aWxzLm5vdGlmeUluZm8oJ1VybCBjb3BpZWQhJyk7XG4gICAgICAgIGF3YWl0IGNvcHlUb0NsaXBib2FyZCh1cmwpO1xuICAgICAgfVxuICAgIH0sXG4gIH0sXG59O1xuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGU+XG4gIDxkaXYgdi1pZj1cInNob3coKVwiIHN0eWxlPVwibWFyZ2luLXRvcDogMnB4XCI+XG4gICAgPEljb24gbmFtZT1cInZpc2liaWxpdHlcIiBAbW91c2Vkb3duLnN0b3AgQHBvaW50ZXJkb3duLnN0b3AgQGNsaWNrLnN0b3A9XCJ2aWV3RXJyb3JzXCIgY2xpY2thYmxlIHRvb2x0aXA9XCJWaWV3IEVycm9yc1wiIC8+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgcHJvcHM6IHtcbiAgICBwYXJhbXM6IE9iamVjdCxcbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICByb3c6IHt9LFxuICAgIH07XG4gIH0sXG5cbiAgY3JlYXRlZCgpIHtcbiAgICB0aGlzLnJvdyA9IHRoaXMucGFyYW1zPy5kYXRhIHx8IHt9O1xuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBzaG93KCkge1xuICAgICAgcmV0dXJuICF0aGlzLnJvdy5zdW1tYXJ5VG90YWwgJiYgKHRoaXMucm93LnN0YXRzPy5lcnJvcnMgfHwgMCkgPiAwO1xuICAgIH0sXG5cbiAgICB2aWV3RXJyb3JzKCkge1xuICAgICAgaWYgKHRoaXMucGFyYW1zPy52aWV3RXJyb3JzKSB7XG4gICAgICAgIHRoaXMucGFyYW1zLnZpZXdFcnJvcnModGhpcy5yb3cpO1xuICAgICAgfVxuICAgIH0sXG4gIH0sXG59O1xuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGU+XG4gIDxkaXY+XG4gICAgPERhdGFncmlkXG4gICAgICByZWY9XCJncmlkXCJcbiAgICAgIHJlY29yZFR5cGU9XCJPYmplY3RcIlxuICAgICAgcmVjb3JkVHlwZVBsdXJhbD1cIk9iamVjdHNcIlxuICAgICAgOmNvbHVtbnM9XCJjb2x1bW5zXCJcbiAgICAgIDpyZWNvcmRzPVwicmVjb3Jkc1wiXG4gICAgICA6Y3JlYXRhYmxlPVwiZmFsc2VcIlxuICAgICAgOnVwZGF0YWJsZT1cImZhbHNlXCJcbiAgICAgIDpkZWxldGFibGU9XCJmYWxzZVwiXG4gICAgICA6YWN0aW9uc0NvbHVtbj1cImZhbHNlXCJcbiAgICAgIHJvd1NlbGVjdGlvbj1cIm5vbmVcIlxuICAgICAgOnJlZnJlc2hhYmxlPVwiZmFsc2VcIlxuICAgICAgOnRvb2xiYXI9XCJmYWxzZVwiXG4gICAgICBoZWlnaHQ9XCI3MHZoXCJcbiAgICAvPlxuICAgIDxTdGF0dXNGaWxlVmlld2VyIHYtbW9kZWw9XCJ2aWV3RXJyb3JzRGlhbG9nT3BlblwiIDp0aXRsZT1cInZpZXdFcnJvcnNEaWFsb2dUaXRsZVwiIDpyb3dzPVwidmlld0Vycm9yc1Jvd3NcIiA6cGVyc2lzdGVudD1cInRydWVcIiAvPlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGF0YWdyaWQgZnJvbSAnc3JjL2NvbXBvbmVudHMvRGF0YWdyaWQudnVlJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJ3NyYy9zZXJ2aWNlcy91dGlscyc7XG5pbXBvcnQge3NvcnRJY30gZnJvbSAnc3JjL3NlcnZpY2VzL3V0aWxzJztcbmltcG9ydCAqIGFzIGNvbW1vbkFwaSBmcm9tICdzcmMvc2VydmljZXMvY29tbW9uQXBpJztcbmltcG9ydCAqIGFzIGFwaSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hcGknO1xuaW1wb3J0IERhdGFDb3B5T2JqZWN0c1N1bW1hcnlBY3Rpb24gZnJvbSAnLi9EYXRhQ29weU9iamVjdHNTdW1tYXJ5QWN0aW9uLnZ1ZSc7XG5pbXBvcnQgU3RhdHVzRmlsZVZpZXdlciBmcm9tICdzcmMvY29tcG9uZW50cy9TdGF0dXNGaWxlVmlld2VyLnZ1ZSc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgY29tcG9uZW50czoge0RhdGFDb3B5T2JqZWN0c1N1bW1hcnlBY3Rpb24sIERhdGFncmlkLCBTdGF0dXNGaWxlVmlld2VyfSxcbiAgcHJvcHM6IHtcbiAgICBtb2RlbDogT2JqZWN0LFxuICAgIGpvYklkOiBTdHJpbmcsXG4gICAgcnVuSWQ6IFN0cmluZyxcbiAgfSxcbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sdW1uczogW1xuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyTmFtZTogJ1ZpZXcnLFxuICAgICAgICAgIHdpZHRoOiA2MCxcbiAgICAgICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICAgICAgZmlsdGVyOiBmYWxzZSxcbiAgICAgICAgICByZXNpemFibGU6IGZhbHNlLFxuICAgICAgICAgIGNlbGxSZW5kZXJlcjogRGF0YUNvcHlPYmplY3RzU3VtbWFyeUFjdGlvbixcbiAgICAgICAgICBjZWxsUmVuZGVyZXJQYXJhbXM6IChwYXJhbXMpID0+IHtcbiAgICAgICAgICAgI
2788HJldHVybiB7XG4gICAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgICAgdmlld0Vycm9yczogKHJvdykgPT4gdGhpcy52aWV3RXJyb3JzKHJvdyksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJOYW1lOiAnTmFtZScsXG4gICAgICAgICAgZmllbGQ6ICduYW1lJyxcbiAgICAgICAgICB3aWR0aDogMzAwLFxuICAgICAgICB9LFxuICAgICAgICB7ZmllbGQ6ICdzb3FscycsIGhlYWRlck5hbWU6ICdTT1FMcycsIHdpZHRoOiAxMDAsIHR5cGU6ICdpbnQnfSxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlck5hbWU6ICdUb3RhbCcsXG4gICAgICAgICAgdmFsdWVHZXR0ZXI6IChyb3cpID0+IHJvdy5kYXRhLnN0YXRzICYmIHJvdy5kYXRhLnN0YXRzLnRvdGFsLFxuICAgICAgICAgIHdpZHRoOiAxMDAsXG4gICAgICAgICAgdHlwZTogJ2ludCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJOYW1lOiAnRXJyb3JzJyxcbiAgICAgICAgICB2YWx1ZUdldHRlcjogKHJvdykgPT4gcm93LmRhdGEuc3RhdHMgJiYgcm93LmRhdGEuc3RhdHMuZXJyb3JzLFxuICAgICAgICAgIHdpZHRoOiAxMDAsXG4gICAgICAgICAgdHlwZTogJ2ludCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJOYW1lOiAnU3VjY2VzcycsXG4gICAgICAgICAgdmFsdWVHZXR0ZXI6IChyb3cpID0+IHJvdy5kYXRhLnN0YXRzICYmIHJvdy5kYXRhLnN0YXRzLnN1Y2Nlc3MsXG4gICAgICAgICAgd2lkdGg6IDEwMCxcbiAgICAgICAgICB0eXBlOiAnaW50JyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlck5hbWU6ICdTa2lwcGVkJyxcbiAgICAgICAgICB2YWx1ZUdldHRlcjogKHJvdykgPT4gcm93LmRhdGEuc3RhdHMgJiYgcm93LmRhdGEuc3RhdHMuc2tpcHBlZCxcbiAgICAgICAgICB3aWR0aDogMTAwLFxuICAgICAgICAgIHR5cGU6ICdpbnQnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyTmFtZTogJ0luc2VydHMnLFxuICAgICAgICAgIHZhbHVlR2V0dGVyOiAocm93KSA9PiByb3cuZGF0YS5zdGF0cyAmJiByb3cuZGF0YS5zdGF0cy5pbnNlcnRzLFxuICAgICAgICAgIHdpZHRoOiAxMDAsXG4gICAgICAgICAgdHlwZTogJ2ludCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJOYW1lOiAnVXBkYXRlcycsXG4gICAgICAgICAgdmFsdWVHZXR0ZXI6IChyb3cpID0+IHJvdy5kYXRhLnN0YXRzICYmIHJvdy5kYXRhLnN0YXRzLnVwZGF0ZXMsXG4gICAgICAgICAgd2lkdGg6IDEwMCxcbiAgICAgICAgICB0eXBlOiAnaW50JyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICByZWNvcmRzOiB0aGlzLmdldE9iamVjdHMsXG4gICAgICBvcGVuYWJsZVVybENhY2hlOiBuZXcgTWFwKCksXG4gICAgICB2aWV3RXJyb3JzRGlhbG9nT3BlbjogZmFsc2UsXG4gICAgICB2aWV3RXJyb3JzRGlhbG9nVGl0bGU6ICcnLFxuICAgICAgdmlld0Vycm9yc1Jvd3M6IFtdLFxuICAgIH07XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbCgpIHtcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIH0sXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGFzeW5jIGdldE9iamVjdHMoKSB7XG4gICAgICBjb25zdCByZWNvcmRzID0gc29ydEljKFsuLi4odGhpcy5tb2RlbC5jb3B5U3RhdHMgfHwgW10pXSwgJ25hbWUnKTtcbiAgICAgIGlmIChyZWNvcmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gcmVjb3JkcztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFt0aGlzLmdldFRvdGFsUm93KHJlY29yZHMpLCAuLi5yZWNvcmRzXTtcbiAgICB9LFxuXG4gICAgZ2V0VG90YWxSb3cocmVjb3Jkcykge1xuICAgICAgY29uc3QgdG90YWwgPSB7XG4gICAgICAgIG5hbWU6ICc8VG90YWw+JyxcbiAgICAgICAgc29xbHM6IDAsXG4gICAgICAgIHN0YXRzOiB7XG4gICAgICAgICAgdG90YWw6IDAsXG4gICAgICAgICAgZXJyb3JzOiAwLFxuICAgICAgICAgIHN1Y2Nlc3M6IDAsXG4gICAgICAgICAgc2tpcHBlZDogMCxcbiAgICAgICAgICBpbnNlcnRzOiAwLFxuICAgICAgICAgIHVwZGF0ZXM6IDAsXG4gICAgICAgIH0sXG4gICAgICAgIHN1bW1hcnlUb3RhbDogdHJ1ZSxcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlY29yZHMpIHtcbiAgICAgICAgdG90YWwuc29xbHMgKz0gcmVjb3JkLnNvcWxzIHx8IDA7XG4gICAgICAgIHRvdGFsLnN0YXRzLnRvdGFsICs9IHJlY29yZC5zdGF0cz8udG90YWwgfHwgMDtcbiAgICAgICAgdG90YWwuc3RhdHMuZXJyb3JzICs9IHJlY29yZC5zdGF0cz8uZXJyb3JzIHx8IDA7XG4gICAgICAgIHRvdGFsLnN0YXRzLnN1Y2Nlc3MgKz0gcmVjb3JkLnN0YXRzPy5zdWNjZXNzIHx8IDA7XG4gICAgICAgIHRvdGFsLnN0YXRzLnNraXBwZWQgKz0gcmVjb3JkLnN0YXRzPy5za2lwcGVkIHx8IDA7XG4gICAgICAgIHRvdGFsLnN0YXRzLmluc2VydHMgKz0gcmVjb3JkLnN0YXRzPy5pbnNlcnRzIHx8IDA7XG4gICAgICAgIHRvdGFsLnN0YXRzLnVwZGF0ZXMgKz0gcmVjb3JkLnN0YXRzPy51cGRhdGVzIHx8IDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0b3RhbDtcbiAgICB9LFxuXG4gICAgaXNPYmplY3RNYXRjaChpdGVtLCBvYmplY3ROYW1lKSB7XG4gICAgICBpZiAoIWl0ZW0gfHwgIWl0ZW0ubmFtZSB8fCAhb2JqZWN0TmFtZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGl0ZW1OYW1lID0gaXRlbS5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCB0YXJnZXROYW1lID0gb2JqZWN0TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIGl0ZW1OYW1lID09PSB0YXJnZXROYW1lIHx8IGl0ZW1OYW1lLmVuZHNXaXRoKGAoJHt0YXJnZXROYW1lfSlgKTtcbiAgICB9LFxuXG4gICAgaGFzTm9uUmVmZXJlbmNlRXJyb3IoaXRlbSkge1xuICAgICAgY29uc3QgZXJyb3JUeXBlcyA9IChpdGVtPy5lcnJvclR5cGVzIHx8IFtdKS5tYXAoKGl0KSA9PiAoaXQgfHwgJycpLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgaWYgKGVycm9yVHlwZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgI
2788HJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXJyb3JUeXBlcy5zb21lKChpdCkgPT4gaXQgIT09ICdyZWZlcmVuY2UnKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0T3BlbmFibGVVcmwoZmlsZUluZm8pIHtcbiAgICAgIGlmICghZmlsZUluZm8/LnVybCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlsZUluZm8udXJsLnN0YXJ0c1dpdGgoJ2h0dHAnKSkge1xuICAgICAgICByZXR1cm4gZmlsZUluZm8udXJsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjYWNoZWRVcmwgPSB0aGlzLm9wZW5hYmxlVXJsQ2FjaGUuZ2V0KGZpbGVJbmZvLnVybCk7XG4gICAgICBpZiAoY2FjaGVkVXJsKSB7XG4gICAgICAgIHJldHVybiBjYWNoZWRVcmw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBhcGkub3BlbkZpbGUoe1xuICAgICAgICBydW5JZDogdGhpcy5ydW5JZCxcbiAgICAgICAgam9iSWQ6IHRoaXMuam9iSWQsXG4gICAgICAgIHVybDogZmlsZUluZm8udXJsLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXNwPy51cmwpIHtcbiAgICAgICAgdGhpcy5vcGVuYWJsZVVybENhY2hlLnNldChmaWxlSW5mby51cmwsIHJlc3AudXJsKTtcbiAgICAgICAgcmV0dXJuIHJlc3AudXJsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0sXG5cbiAgICBhc3luYyByZWFkU3RhdHVzRmlsZShmaWxlSW5mbykge1xuICAgICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5nZXRPcGVuYWJsZVVybChmaWxlSW5mbyk7XG4gICAgICBpZiAoIXVybCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBjb21tb25BcGkuZ2V0RmlsZSh1cmwpO1xuICAgICAgY29uc3QgY3N2ID0gdXRpbHMucmVhZENzdihjb250ZW50KTtcbiAgICAgIHJldHVybiBjc3Y/LnJlY29yZHMgfHwgW107XG4gICAgfSxcblxuICAgIGNvbGxlY3RNYXRjaGluZ1N0YXR1c0ZpbGVzKG9iamVjdE5hbWUpIHtcbiAgICAgIGNvbnN0IGZpbGVzID0gW107XG4gICAgICBjb25zdCBzZWVuRmlsZXMgPSBuZXcgU2V0KCk7XG5cbiAgICAgIGNvbnN0IHdhbGsgPSAoaXRlbXMpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zIHx8IFtdKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNPYmplY3RNYXRjaChpdGVtLCBvYmplY3ROYW1lKSAmJiB0aGlzLmhhc05vblJlZmVyZW5jZUVycm9yKGl0ZW0pKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpbGVJbmZvIG9mIGl0ZW0uc3RhdHVzVXJscyB8fCBbXSkge1xuICAgICAgICAgICAgICBpZiAoIWZpbGVJbmZvPy51cmwgfHwgc2VlbkZpbGVzLmhhcyhmaWxlSW5mby51cmwpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBzZWVuRmlsZXMuYWRkKGZpbGVJbmZvLnVybCk7XG4gICAgICAgICAgICAgIGZpbGVzLnB1c2goZmlsZUluZm8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHdhbGsoaXRlbS5wYXJlbnRzKTtcbiAgICAgICAgICB3YWxrKGl0ZW0uY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB3YWxrKHRoaXMubW9kZWw/Lm9iamVjdHNUcmVlIHx8IFtdKTtcbiAgICAgIHJldHVybiBmaWxlcztcbiAgICB9LFxuXG4gICAgaXNTYXZlRXJyb3JSZWNvcmQocmVjKSB7XG4gICAgICBjb25zdCBzdGF0dXMgPSAocmVjPy5zdGF0dXMgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoc3RhdHVzICE9PSAnZXJyb3InIHx8ICFyZWM/LnJlY29yZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlY09iaiA9IEpTT04ucGFyc2UocmVjLnJlY29yZCk7XG4gICAgICAgIGNvbnN0IGVycm9yVHlwZSA9IChyZWNPYmo/LmF0dHJpYnV0ZXM/LmVycm9yVHlwZSB8fCByZWNPYmo/LmF0dHJpYnV0ZXM/LmVycm9ydHlwZSB8fCByZWNPYmo/LmVycm9yVHlwZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcmV0dXJuIGVycm9yVHlwZSA9PT0gJ3NhdmUnO1xuICAgICAgfSBjYXRjaCAoX2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRFcnJvckRldGFpbHNGcm9tUmVjb3JkKHJlYykge1xuICAgICAgaWYgKCFyZWM/LnJlY29yZCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlY29yZCA9IEpTT04ucGFyc2UocmVjLnJlY29yZCk7XG4gICAgICAgIGNvbnN0IGRldGFpbHMgPSBbXTtcbiAgICAgICAgY29uc3QgYWRkRGV0YWlsID0gKHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBkZXRhaWxzLnB1c2goLi4udmFsdWUuZmlsdGVyKChpdCkgPT4gaXQpLm1hcCgoaXQpID0+IGAke2l0fWApKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICBkZXRhaWxzLnB1c2goYCR7dmFsdWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGFkZERldGFpbChyZWNvcmQ/LmRldGFpbHMpO1xuICAgICAgICBhZGREZXRhaWwocmVjb3JkPy5tZXNzYWdlKTtcbiAgICAgICAgYWRkRGV0YWlsKHJlY29yZD8uYXR0cmlidXRlcz8uZGV0YWlscyk7XG4gICAgICAgIGFkZERldGFpbChyZWNvcmQ/LmF0dHJpYnV0ZXM/Lm1lc3NhZ2UpO1xuICAgICAgICBhZGREZXRhaWwocmVjb3JkPy5lcnJvcnMpO1xuICAgICAgICByZXR1cm4gZGV0YWlscy5maWx0ZXIoKGl0KSA9PiBpdCkuam9pbignIHwgJyk7XG4gICAgICB9IGNhdGNoIChfZSkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGNvbWJpbmVFcnJvcnNXaXRoRGV0YWlscyhyZWMpIHtcbiAgICAgIGNvbnN0IGVycm9ycyA9IFtyZWM/LmVycm9ycyB8fCAnJywgdGhpcy5nZXRFcnJvckRldGFpbHNGcm9tUmVjb3JkKHJlYyldLmZpbHRlcigoaXQpID0+IGl0KTtcbiAgICAgIHJldHVybi
2788B7Li4ucmVjLCBlcnJvcnM6IGVycm9ycy5qb2luKCcgfCAnKX07XG4gICAgfSxcblxuICAgIGNvbGxlY3RFcnJvclJvd3NGcm9tUmVjb3JkcyhyZWNvcmRzKSB7XG4gICAgICBjb25zdCByb3dzID0gW107XG4gICAgICBmb3IgKGNvbnN0IHJlYyBvZiByZWNvcmRzIHx8IFtdKSB7XG4gICAgICAgIGlmICh0aGlzLmlzU2F2ZUVycm9yUmVjb3JkKHJlYykpIHtcbiAgICAgICAgICByb3dzLnB1c2godGhpcy5jb21iaW5lRXJyb3JzV2l0aERldGFpbHMocmVjKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByb3dzO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRPYmplY3RFcnJvclJvd3Mob2JqZWN0TmFtZSkge1xuICAgICAgY29uc3Qgcm93cyA9IFtdO1xuICAgICAgY29uc3QgZmlsZXMgPSB0aGlzLmNvbGxlY3RNYXRjaGluZ1N0YXR1c0ZpbGVzKG9iamVjdE5hbWUpO1xuICAgICAgY29uc3QgZmlsZVJlY29yZHMgPSBhd2FpdCBQcm9taXNlLmFsbChmaWxlcy5tYXAoKGZpbGVJbmZvKSA9PiB0aGlzLnJlYWRTdGF0dXNGaWxlKGZpbGVJbmZvKSkpO1xuICAgICAgZm9yIChjb25zdCByZWNvcmRzIG9mIGZpbGVSZWNvcmRzKSB7XG4gICAgICAgIHJvd3MucHVzaCguLi50aGlzLmNvbGxlY3RFcnJvclJvd3NGcm9tUmVjb3JkcyhyZWNvcmRzKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcm93cztcbiAgICB9LFxuXG4gICAgYXN5bmMgdmlld0Vycm9ycyhyb3cpIHtcbiAgICAgIHRoaXMudmlld0Vycm9yc0RpYWxvZ1RpdGxlID0gYEVycm9ycyBmb3IgJHtyb3cubmFtZX1gO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy52aWV3RXJyb3JzUm93cyA9IGF3YWl0IHRoaXMuZ2V0T2JqZWN0RXJyb3JSb3dzKHJvdy5uYW1lKTtcbiAgICAgIH0gY2F0Y2ggKF9lKSB7XG4gICAgICAgIHRoaXMudmlld0Vycm9yc1Jvd3MgPSBbXTtcbiAgICAgIH1cbiAgICAgIHRoaXMudmlld0Vycm9yc0RpYWxvZ09wZW4gPSB0cnVlO1xuICAgIH0sXG5cbiAgICByZWZyZXNoKCkge1xuICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy4kcmVmcy5ncmlkKSB7XG4gICAgICAgICAgdGhpcy4kcmVmcy5ncmlkLnJlZnJlc2goKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgfSxcbn07XG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZT5cbiAgPENvbnRlbnREaWFsb2dcbiAgICA6dGl0bGU9XCJ0aXRsZSB8fCAnRmlsZXMnXCJcbiAgICA6bW9kZWxWYWx1ZT1cIm1vZGVsVmFsdWVcIlxuICAgIEB1cGRhdGU6bW9kZWxWYWx1ZT1cIiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScpXCJcbiAgICA6bWVz
2788c2FnZT1cIm1lc3NhZ2VcIlxuICAgIDptZXNzYWdlVHlwZT1cIm1lc3NhZ2VUeXBlXCJcbiAgICA6aW5pdGluZz1cImluaXRpbmdcIlxuICAgIDppbml0aW5nU3VjY2Vzcz1cImluaXRpbmdTdWNjZXNzXCJcbiAgICA6cHJvY2Vzc2luZz1cInByb2Nlc3NpbmdcIlxuICAgIGhlaWdodD1cImF1dG9cIlxuICAgIHdpZHRoPVwiMTIwMHB4XCJcbiAgICBjbG9zZU1vZGVcbiAgICA6cGVyc2lzdGVudD1cImZhbHNlXCJcbiAgICBAY2FuY2VsPVwiY2xvc2VcIlxuICA+XG4gICAgPGRpdiB2LWlmPVwic3RhdHVzRmlsZXMgJiYgc3RhdHVzRmlsZXMubGVuZ3RoID4gMFwiIGNsYXNzPVwicS1tYi1tZFwiPlxuICAgICAgPHEtdGFibGUgOnJvd3M9XCJzdGF0dXNGaWxlc1wiIDpjb2x1bW5zPVwiY29sdW1uc1wiIHJvdy1rZXk9XCJpZFwiIDpoaWRlLXBhZ2luYXRpb249XCJ0cnVlXCIgOnJvd3MtcGVyLXBhZ2Utb3B0aW9ucz1cIlswXVwiPlxuICAgICAgICA8dGVtcGxhdGUgdi1zbG90OmJvZHktY2VsbC1hY3Rpb25zPVwicHJvcHNcIj5cbiAgICAgICAgICA8cS10ZD5cbiAgICAgICAgICAgIDxJY29uQ29weSA6Y29udGVudD1cInByb3BzLnJvdy51cmxcIiB0b29sdGlwPVwiQ29weSB1cmwgdG8gQ2xpcGJvYXJkXCIgLz5cbiAgICAgICAgICAgIDxJY29uIG5hbWU9XCJjbG91ZF9kb3dubG9hZFwiIEBjbGljaz1cImRvd25sb2FkRmlsZShwcm9wcy5yb3cpXCIgY2xpY2thYmxlIHRvb2x0aXA9XCJEb3dubG9hZCBGaWxlXCIgLz5cbiAgICAgICAgICAgIDxJY29uIHYtaWY9XCJjYW5WaWV3RmlsZShwcm9wcy5yb3cpXCIgbmFtZT1cInZpc2liaWxpdHlcIiBAY2xpY2s9XCJ2aWV3U3RhdHVzRmlsZShwcm9wcy5yb3cpXCIgY2xpY2thYmxlIHRvb2x0aXA9XCJWaWV3IEZpbGVcIiAvPlxuICAgICAgICAgIDwvcS10ZD5cbiAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgIDwvcS10YWJsZT5cbiAgICA8L2Rpdj5cblxuICAgIDxTdGF0dXNGaWxlVmlld2VyIHYtbW9kZWw9XCJzdGF0dXNGaWxlVmlld2VyRGlhbG9nT3BlblwiIDp0aXRsZT1cInZpZXdlckRpYWxvZ1RpdGxlXCIgOmZpbGVJbmZvPVwidmlld2VyRGlhbG9nTW9kZWxcIiAvPlxuICA8L0NvbnRlbnREaWFsb2c+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0IGxhbmc9XCJ0eXBlc2NyaXB0XCI+XG5pbXBvcnQgbWl4aW5zIGZyb20gJ3NyYy9taXhpbnMvbWl4aW5zJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL3V0aWxzJztcbmltcG9ydCAqIGFzIGFwaSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hcGknO1xuaW1wb3J0ICogYXMgcnRVdGlscyBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ydFV0aWxzJztcbmltcG9ydCB7UnVuRmlsZVR5cGV9IGZyb20gJ3NyYy9zZXJ2aWNlcy9tb2RlbHMnO1xuaW1wb3J0IFN0YXR1c0ZpbGVWaWV3ZXIgZnJvbSAnc3JjL2NvbXBvbmVudHMvU3RhdHVzRmlsZVZpZXdlci52dWUnO1xuaW1wb3J0IEljb25Db3B5IGZyb20gJ3NyYy9jb21wb25lbnRzL0ljb25Db3B5LnZ1ZSc7XG5pbXBvcnQge0RlcGxveW1lbnR9IGZyb20gJ0BkYXRhc2VydC9qcy11dGlscy9kaXN0L21vZGVsc01zJztcbmltcG9ydCB7Y2FuVmlld0ZpbGV9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL3V0aWxzJztcbmNvbnN0IE1lc3NhZ2UgPSAnTWVzc2FnZSc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbbWl4aW5zXSxcbiAgY29tcG9uZW50czoge1N0YXR1c0ZpbGVWaWV3ZXIsIEljb25Db3B5fSxcblxuICBwcm9wczoge1xuICAgIHRpdGxlOiBTdHJpbmcsXG4gICAgam9iSWQ6IFN0cmluZyxcbiAgICBtb2RlbFZhbHVlOiBCb29sZWFuLFxuICAgIHRhc2s6IE9iamVjdCxcbiAgICBydW46IE9iamVjdCxcbiAgICBzdGF0dXNGaWxlczogQXJyYXksXG4gIH0sXG4gIGVtaXRzOiBbJ2NhbmNlbCcsICd1cGRhdGU6bW9kZWxWYWx1ZSddLFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAge25hbWU6ICdhY3Rpb25zJywgYWxpZ246ICdsZWZ0J30sXG4gICAgICAgIC8vIHtuYW1lOiAndGFza05hbWUnLCBmaWVsZDogJ3Rhc2tOYW1lJywgbGFiZWw6ICdUYXNrJywgc29ydGFibGU6IHRydWUsIGFsaWduOiAnbGVmdCd9LFxuICAgICAgICB7bmFtZTogJ2ZpbGVOYW1lJywgZmllbGQ6ICdmaWxlTmFtZScsIGxhYmVsOiAnRmlsZSBOYW1lJywgc29ydGFibGU6IHRydWUsIGFsaWduOiAnbGVmdCd9LFxuICAgICAgICB7bmFtZTogJ3R5cGUnLCBmaWVsZDogJ2NvbnRlbnRUeXBlJywgbGFiZWw6ICdUeXBlJywgc29ydGFibGU6IHRydWUsIGFsaWduOiAnbGVmdCd9LFxuICAgICAgICB7bmFtZTogJ2ZpbGVEZXNjcmlwdGlvbicsIGZpZWxkOiAnZmlsZURlc2NyaXB0aW9uJywgbGFiZWw6ICdGaWxlIERlc2MnLCBzb3J0YWJsZTogdHJ1ZSwgYWxpZ246ICdsZWZ0J30sXG4gICAgICAgIHtoZWFkZXJOYW1lOiAnRmlsZSBTaXplJywgZmllbGQ6IChyb3cpID0+IHV0aWxzLmZvcm1hdFN0b3JhZ2VTaXplKHJvdy5maWxlU2l6ZSksIGxhYmVsOiAnRmlsZSBTaXplJywgc29ydGFibGU6IHRydWUsIGFsaWduOiAnbGVmdCd9LFxuICAgICAgXSxcbiAgICAgIHZpZXdlckRpYWxvZ1RpdGxlOiAnJyxcbiAgICAgIHZpZXdlckRpYWxvZ01vZGVsOiB7fSxcbiAgICAgIHN0YXR1c0ZpbGVWaWV3ZXJEaWFsb2dPcGVuOiBmYWxzZSxcbiAgICB9O1xuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5pbml0aW5nU3VjY2VzcyA9IHRydWU7XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKCkge1xuICAgICAgaWYgKCF0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0sXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGNsb3NlKCkge1xuICAgICAgdGhpcy4kZW1pdCgnY2FuY2VsJyk7XG4gICAgfSxcblxuICAgIHZpZXdTdGF0dXNGaWxlKGZpbGVJbmZvKSB7XG4gICAgICB0aGlzLmhhbmRsZVZpZXdGaWxlKCdTdGF0dXMgRmlsZTogJyArIGZpbGVJbmZvLmZpbGVOYW1lLCBmaWxlSW5mbywgJ3N0YXR1c0ZpbGUnKTtcbiAgICB9LFxuICAgIGFzeW5jIGdldE9wZW5hYmxlVXJsKGZpbGVJbmZvKSB7XG4gICAgICBpZiAoZmlsZUluZm8udXJsLnN0YXJ0c1dpdGgoJ2h0dHAnKSkge1xuICAgICAgICByZXR1cm4gZmlsZUluZm8udXJsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZpbGVJbmZvLm9wZW5hYmxlVXJsKSB7XG4gICAgICAgICAgcmV0dXJuIGZ
2788pbGVJbmZvLm9wZW5hYmxlVXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMucHJvY2Vzc0Zvcm0oXG4gICAgICAgICAgYXN5bmMgKCkgPT5cbiAgICAgICAgICAgIGF3YWl0IGFwaS5vcGVuRmlsZSh7XG4gICAgICAgICAgICAgIHJ1bklkOiBmaWxlSW5mby5ydW5JZCxcbiAgICAgICAgICAgICAgam9iSWQ6IHRoaXMuam9iSWQsXG4gICAgICAgICAgICAgIHVybDogZmlsZUluZm8udXJsLFxuICAgICAgICAgICAgICBsb2NhdGlvbjogZmlsZUluZm8ubG9jYXRpb24sXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZXNwKSB7XG4gICAgICAgICAgLy8gZmlsZUluZm8ub3BlbmFibGVVcmwgPSByZXNwLnVybDtcbiAgICAgICAgICByZXR1cm4gcmVzcC51cmw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgaGFuZGxlVmlld0ZpbGUodGl0bGUsIGZpbGVJbmZvLCBmaWxlVHlwZSkge1xuICAgICAgaWYgKGZpbGVJbmZvLnVybC5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgICAgdXRpbHMub3BlblVybChmaWxlSW5mby51cmwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVybCA9IGF3YWl0IHRoaXMuZ2V0T3BlbmFibGVVcmwoZmlsZUluZm8pO1xuICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnZpZXdlckRpYWxvZ1RpdGxlID0gdGl0bGU7XG4gICAgICB0aGlzLnZpZXdlckRpYWxvZ01vZGVsID0ge1xuICAgICAgICAuLi5maWxlSW5mbyxcbiAgICAgICAgLi4ue3ZpZXdVcmw6IHVybH0sXG4gICAgICB9O1xuICAgICAgdGhpcy5zdGF0dXNGaWxlVmlld2VyRGlhbG9nT3BlbiA9IHRydWU7XG4gICAgfSxcbiAgICBhc3luYyBkb3dubG9hZEZpbGUoZmlsZUluZm8pIHtcbiAgICAgIGxldCB1cmwgPSBhd2FpdCB0aGlzLmdldE9wZW5hYmxlVXJsKGZpbGVJbmZvKTtcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgaWYgKHVybC5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgICAgICB1dGlscy5vcGVuVXJsKHVybCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGNhblZpZXdGaWxlKGZpbGVJbmZvKSB7XG4gICAgICByZXR1cm4gdXRpbHMuY2FuVmlld0ZpbGUoZmlsZUluZm8pO1xuICAgIH0sXG4gIH0sXG59O1xuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGU+XG4gIDxkaXY+XG4gICAgPEljb25cbiAgICAgIHYtaWY9XCIocm93LnN0YXR1c1VybHMgJiYgcm93LnN0YXR1c1VybHMubGVuZ3RoID4gMCkgfHwgKHJvdy5lcnJvclN1bW1hcnlVcmxzICYmIHJvdy5lcnJvclN1bW1hcnlVcmxzLmxlbmd0aCA+IDApXCJcbiAgICAgIG5hbWU9XCJsaWJyYXJ5X2Jvb2tzXCJcbiAgICAgIEBjbGljaz1cInZpZXdGaWxlc1wiXG4gICAgICBjbGlja2FibGVcbiAgICAvPlxuXG4gICAgPE9iamVjdEZpbGVzRGlhbG9nXG4gICAgICB0aXRsZT1cIlN0YXR1cyBGaWxlc1wiXG4gICAgICB2LW1vZGVsPVwiZmlsZXNEaWFsb2dPcGVuXCJcbiAgICAgIDpzdGF0dXNGaWxlcz1cInJvdy5zdGF0dXNVcmxzXCJcbiAgICAgIDplcnJvckZpbGVzPVwicm93LmVycm9yU3VtbWFyeVVybHNcIlxuICAgICAgQGNhbmNlbD1cImZpbGVzRGlhbG9nT3BlbiA9IGZhbHNlXCJcbiAgICAgIEBjbG9zZT1cImZpbGVzRGlhbG9nT3BlbiA9IGZhbHNlXCJcbiAgICAvPlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG4vLyBpbXBvcnQgVnVlIGZyb20gJ3Z1ZSc7XG5pbXBvcnQgT2JqZWN0RmlsZXNEaWFsb2cgZnJvbSAnLi9PYmplY3RGaWxlc0RpYWxvZy52dWUnO1xuaW1wb3J0IG1peGlucyBmcm9tICdzcmMvbWl4aW5zL21peGlucyc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbbWl4aW5zXSxcblxuICBjb21wb25lbnRzOiB7T2JqZWN0RmlsZXNEaWFsb2d9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5yb3cgPSB0aGlzLnBhcmFtcy5kYXRhIHx8IHt9O1xuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJvdzoge30sXG4gICAgICBmaWxlc0RpYWxvZ09wZW46IGZhbHNlLFxuICAgIH07XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHZpZXdGaWxlcygpIHtcbiAgICAgIHRoaXMuZmlsZXNEaWFsb2dPcGVuID0gdHJ1ZTtcbiAgICB9LFxuICB9LFxufTtcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlPlxuICA8ZGl2IHYtaWY9XCJzaG93KHBhcmFtcyAmJiBwYXJhbXMuZGF0YSAmJiBwYXJhbXMuZGF0YS5zdGF0dXMpXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAycHhcIj5cbiAgICA8U3luY1N0YXR1cyA6c3RhdHVzPVwicGFyYW1zLmRhdGEuc3RhdHVzXCIgOnJ1blN0YXR1cz1cInBhcmFtcy5kYXRhLnJ1blN0YXR1c1wiIHNpemU9XCJ4c1wiIHN0eWxlPVwiaGVpZ2h0OiAyMnB4ICFpbXBvcnRhbnRcIiAvPlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgU3luY1N0YXR1cyBmcm9tICdzcmMvY29tcG9uZW50cy9TeW5jU3RhdHVzLnZ1ZSc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgcHJvcHM6IHtcbiAgICBwYXJhbXM6IE9iamVjdCxcbiAgfSxcbiAgY29tcG9uZW50czoge1N5bmNTdGF0dXN9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBzaG93KGRhdGEpIHtcbiAgICAgIGlmIChkYXRhKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICB9LFxufTtcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlPlxuICA8Q29udGVudERpYWxvZ1xuICAgIDp0aXRsZT1cImAke3RpdGxlIHx8ICdNZXNzYWdlJ31gXCJcbiAgICA6bW9kZWxWYWx1ZT1cIm1vZGVsVmFsdWVcIlxuICAgIEB1cGRhdGU6bW9kZWxWYWx1ZT1cIiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScpXCJcbiAgICA6bWVz
2788c2FnZT1cIm1lc3NhZ2VcIlxuICAgIDptZXNzYWdlVHlwZT1cIm1lc3NhZ2VUeXBlXCJcbiAgICA6aW5pdGluZz1cImluaXRpbmdcIlxuICAgIDppbml0aW5nU3VjY2Vzcz1cImluaXRpbmdTdWNjZXNzXCJcbiAgICA6cHJvY2Vzc2luZz1cInByb2Nlc3NpbmdcIlxuICAgIDpwcm9jZXNzaW5nQ2FuY2VsbGFibGU9XCJwcm9jZXNzaW5nQ2FuY2VsbGFibGVcIlxuICAgIGhlaWdodD1cImF1dG9cIlxuICAgIHdpZHRoPVwiMTIwMHB4XCJcbiAgICBjbG9zZU1vZGVcbiAgICA6cGVyc2lzdGVudD1cImZhbHNlXCJcbiAgPlxuICAgIDxQYXJhIGNsYXNzPVwibWVzc2FnZSB0ZXh0LWJvZHkxXCI+e3sgZXJyb3JNZXNzYWdlIH19PC9QYXJhPlxuICAgIDx0ZW1wbGF0ZSB2LXNsb3Q6YnV0dG9ucy1yaWdodD5cbiAgICAgIDxCdXR0b24gdi1jbGlwYm9hcmQ6Y29weT1cImVycm9yTWVzc2FnZVwiIEBjbGljaz1cImNvcHlNZXNzYWdlXCIgb3V0bGluZSA6ZnVsbFdpZHRoPVwiJHEuc2NyZWVuLnhzXCI+Q29weTwvQnV0dG9uPlxuICAgICAgPEJ1dHRvbiBAY2xpY2s9XCJjbG9zZVwiIDpmdWxsV2lkdGg9XCIkcS5zY3JlZW4ueHNcIj5DbG9zZTwvQnV0dG9uPlxuICAgIDwvdGVtcGxhdGU+XG4gIDwvQ29udGVudERpYWxvZz5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICdzcmMvc2VydmljZXMvdXRpbHMnO1xuaW1wb3J0IG1peGlucyBmcm9tICdzcmMvbWl4aW5zL21peGlucyc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbbWl4aW5zXSxcblxuICBwcm9wczoge1xuICAgIHRpdGxlOiBTdHJpbmcsXG4gICAgZXJyb3JNZXNzYWdlOiBTdHJpbmcsXG4gICAgbW9kZWxWYWx1ZTogQm9vbGVhbixcbiAgfSxcbiAgZW1pdHM6IFsnb2snLCAndXBkYXRlOm1vZGVsVmFsdWUnXSxcbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge307XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKCkge1xuICAgICAgaWYgKCF0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmluaXRpbmdTdWNjZXNzID0gdHJ1ZTtcbiAgICB9LFxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICB2YWx1ZUxhYmVscygpIHtcbiAgICAgIHJldHVybiB1dGlscy52YWx1ZUxhYmVscztcbiAgICB9LFxuICAgIGNvcHlNZXNzYWdlKCkge1xuICAgICAgdXRpbHMubm90aWZ5SW5mbygnQ29waWVkIScpO1xuICAgIH0sXG4gICAgY2xvc2UoKSB7XG4gICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIGZhbHNlKTtcbiAgICB9LFxuICB9LFxufTtcbjwvc2NyaXB0PlxuPHN0eWxlPlxu
2788Lm1lc3NhZ2Uge1xuICBmb250LWZhbWlseTogJ01vbmFjbycsICdDb25zb2xhcycsICdDb3VyaWVyIE5ldycsICcuU0YgTlMgTW9ubycsICdBbmRhbGUgTW9ubycsICdEcm9pZCBTYW5zIE1vbm8nLCAnSmV0QnJhaW5zIE1vbm8nLCAnbW9ub3NwYWNlJywgJ01vbm9zcGFjZWQnO1xufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBzdHlsZT1cImhlaWdodDogNzB2aFwiPlxuICAgIDxhZy1ncmlkLXZ1ZVxuICAgICAgY2xhc3M9XCJhZy10aGVtZS1iYWxoYW1cIlxuICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlXCJcbiAgICAgIDpjb2x1bW5EZWZzPVwiY29sdW1uc1wiXG4gICAgICBAZ3JpZC1yZWFkeT1cIm9uR3JpZFJlYWR5XCJcbiAgICAgIDpkZWZhdWx0Q29sRGVmPVwiZGVmYXVsdENvbERlZlwiXG4gICAgICA6dHJlZURhdGE9XCJ0cnVlXCJcbiAgICAgIDpncm91cERlZmF1bHRFeHBhbmRlZD1cImdyb3VwRGVmYXVsdEV4cGFuZGVkXCJcbiAgICAgIDpnZXREYXRhUGF0aD1cImdldERhdGFQYXRoXCJcbiAgICAgIDpnZXRSb3dJZD1cImdldFJvd0lkXCJcbiAgICAgIDpyb3dEYXRhPVwicm93RGF0YVwiXG4gICAgICA6cm93SGVpZ2h0PVwicm93SGVpZ2h0XCJcbiAgICAgIDphdXRvR3JvdXBDb2x1bW5EZWY9XCJhdXRvR3JvdXBDb2x1bW5EZWZcIlxuICAgICAgOmF1dG9TaXplU3RyYXRlZ3k9XCJhdXRvU2l6ZVN0cmF0ZWd5XCJcbiAgICAgIEBjZWxsLWNsaWNrZWQ9XCJjZWxsQ2xpY2tIYW5kbGVcIlxuICAgICAgOnN1cHByZXNzQ29udGV4dE1lbnU9XCJ0cnVlXCJcbiAgICA+PC9hZy1ncmlkLXZ1ZT5cbiAgICA8Vmlld01lc3NhZ2VEaWFsb2cgdi1tb2RlbD1cInZpZXdFcnJvck1lc3NhZ2VEaWFsb2dPcGVuXCIgOmVycm9yTWVzc2FnZT1cInZpZXdFcnJvck1lc3NhZ2VEaWFsb2dEYXRhXCIgdGl0bGU9XCJEZXRhaWxzXCIgLz5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cbmltcG9ydCAnYWctZ3JpZC1jb21tdW5pdHkvc3R5bGVzL2FnLWdyaWQuY3NzJztcbmltcG9ydCAnYWctZ3JpZC1lbnRlcnByaXNlJztcbmltcG9ydCB7QWdHcmlkVnVlfSBmcm9tICdhZy1ncmlkLXZ1ZTMnO1xuaW1wb3J0IHtvbkJlZm9yZU1vdW50LCByZWYsIHdhdGNofSBmcm9tICd2dWUnO1xuaW1wb3J0IHtKc09iakFueSwgUmVhbEFueX0gZnJvbSAnQGRhdGFzZXJ0L2pzLXV0aWxzL2Rpc3QvbW9kZWxzJztcbmltcG9ydCB7UGxhaW5PYmplY3R9IGZyb20gJ3NyYy9zZXJ2aWNlcy91dGlscyc7XG5pbXBvcnQgVGFza1J1bkRldGFpbEFjdGlvbiBmcm9tICdzcmMvcHJvZHVjdHMvcmVhbHRhc2svcGFnZXMvcnVucy9UYXNrUnVuRGV0YWlsQWN0aW9uLnZ1ZSc7XG5pbXBvcnQgVHJlZUdyaWRTdGF0dXNSZW5kZXJlciBmcm9tICdzcmMvY29tcG9uZW50cy9UcmVlR3JpZFN0YXR1c1JlbmRlcmVyLnZ1ZSc7XG5pbXBvcnQge2luaXRBZ0xpY2Vuc2V9IGZyb20gJ3NyYy9zZXJ2aWNlcy9saWNlbnNlJztcbmltcG9ydCB7U2ZkY09yZ0RlcGxveX0gZnJvbSAnQGRhdGFzZXJ0L2pzLXV0aWxzL2Rpc3QvbW9kZWxzTXMnO1xuaW1wb3J0IFZpZXdNZXNzYWdlRGlhbG9nIGZyb20gJy4vVmlld01lc3NhZ2VEaWFsb2cudnVlJztcbmluaXRBZ0xpY2Vuc2UoKTtcblxuaW50ZXJmYWNlIFByb3BzIHtcbiAgZGF0YTogUGxhaW5PYmplY3Q8YW55PltdO1xuICByb3dIZWlnaHQ/OiBudW1iZXI7XG59XG5cbmNvbnN0IHByb3BzID0gd2l0aERlZmF1bHRzKGRlZmluZVByb3BzPFByb3BzPigpLCB7cm93SGVpZ2h0OiAzNX0pO1xuXG5jb25zdCBjb2x1bW5zID0gW1xuICB7aGVhZGVyTmFtZTogJyMnLCBmaWVsZDogJ251bScsIHdpZHRoOiA1MCwgYWxpZ246ICdjZW50ZXInLCBwaW5uZWQ6IHRydWUsIGZpbHRlcjogZmFsc2UsIGZsb2F0aW5nRmlsdGVyOiBmYWxzZX0sXG4gIHtcbiAgICBoZWFkZXJOYW1lOiAnQWN0aW9ucycsXG4gICAgZmllbGQ6ICdhY3Rpb25zJyxcbiAgICBjZWxsUmVuZGVyZXI6IFRhc2tSdW5EZXRhaWxBY3Rpb24sXG4gICAgd2lkdGg6IDUwLFxuICAgIHBpbm5lZDogJ2xlZnQnLFxuICAgIGZpbHRlcjogZmFsc2UsXG4gICAgZmxvYXRpbmdGaWx0ZXI6IGZhbHNlLFxuICB9LFxuICB7XG4gICAgaGVhZGVyTmFtZTogJ1N0YXR1cycsXG4gICAgZmllbGQ6ICdzdGF0dXMnLFxuICAgIHdpZHRoOiAxNTAsXG4gICAgY2VsbFJlbmRlcmVyOiBUcmVlR3JpZFN0YXR1c1JlbmRlcmVyLFxuICAgIGNlbGxSZW5kZXJlclBhcmFtczogKHBhcmFtczoge2RhdGE6IGFueX0pID0+IHtcbiAgICAgIHJldHVybiB7cGFyYW1zOiBwYXJhbXMuZGF0YX07XG4gICAgfSxcbiAgfSxcblxuICB7aGVhZGVyTmFtZTogJ1R5cGUnLCBmaWVsZDogJ2hpZXJhcmNoeVR5cGUnLCB3aWR0aDogMTAwfSxcbiAge2hlYWRlck5hbWU6ICdMZXZlbCcsIGZpZWxkOiAncmVjb3JkTGV2ZWwnLCB3aWR0aDogMTAwLCBhbGlnbjogJ2NlbnRlcid9LFxuICB7aGVhZGVyTmFtZTogJ0NvcHkgT3JkZXInLCBmaWVsZDogJ29yZGVyJywgd2lkdGg6IDE0MCwgYWxpZ246ICdjZW50ZXInfSxcbiAge2hlYWRlck5hbWU6ICdFcnJvciBUeXBlJywgZmllbGQ6ICdlcnJvclR5cGVzJywgd2lkdGg6IDE0MCwgYWxpZ246ICdjZW50ZXInfSxcbiAge2hlYWRlck5hbWU6ICdUb3RhbCcsIGZpZWxkOiAndG90YWwnLCB3aWR0aDogOTAsIGFsaWduOiAnY2VudGVyJ30sXG4gIHtoZWFkZXJOYW1lOiAnRXJyb3JzJywgZmllbGQ6ICdlcnJvcnMnLCB3aWR0aDogOTAsIGFsaWduOiAnY2VudGVyJ30sXG4gIHtoZWFkZXJOYW1lOiAnSW5zZXJ0cycsIGZpZWxkOiAnaW5zZXJ0cycsIHdpZHRoOiA5MCwgYWxpZ246ICdjZW50ZXInfSxcbiAge2hlYWRlck5hbWU6ICdVcGRhdGVzJywgZmllbGQ6ICd1cGRhdGVzJywgd2lkdGg6IDkwLCBhbGlnbjogJ2NlbnRlcid9LFxuICB7aGVhZGVyTmFtZTogJ1NraXBwZWQnLCBmaWVsZDogJ3NraXBwZWQnLCB3aWR0aDogOTAsIGFsaWduOiAnY2VudGVyJ30sXG4gIHtoZWFkZXJOYW1lOiAnQ3VtdWxhdGl2ZSBUb3RhbCcsIGZpZWxkOiAndG90YWxSb2xsdXAnLCB3aWR0aDogMTYwfSxcbiAge2hlYWRlck5hbWU6ICdEdXJhdGlvbicsIGZpZWxkOiAnZHVyYXRpb24nLCB3aWR0aDogMTIwLCBhbGlnbjogJ2Nlbn
2788Rlcid9LFxuICB7aGVhZGVyTmFtZTogJ0R1cmF0aW9uIFJvbGx1cCcsIGZpZWxkOiAnZHVyYXRpb25Sb2xsdXAnLCB3aWR0aDogMTUwfSxcbiAge2hlYWRlck5hbWU6ICdNZXNzYWdlJywgZmllbGQ6ICdtZXNzYWdlJ30sXG4gIC8vIHtoZWFkZXJOYW1lOiAnRGV0YWlscycsIGZpZWxkOiAnZGV0YWlscyd9LFxuXTtcblxuY29uc3QgZ3JpZEFwaSA9IHJlZigpO1xuY29uc3QgZGVmYXVsdENvbERlZiA9IHJlZih7XG4gIHJlc2l6YWJsZTogdHJ1ZSxcbiAgZmlsdGVyOiB0cnVlLFxuICBmbG9hdGluZ0ZpbHRlcjogdHJ1ZSxcbn0pO1xuY29uc3QgYXV0b0dyb3VwQ29sdW1uRGVmID0gcmVmKCk7XG5jb25zdCBncm91cERlZmF1bHRFeHBhbmRlZCA9IHJlZigpO1xuY29uc3QgZ2V0Um93SWQgPSByZWYoKTtcbmNvbnN0IHJvd0RhdGEgPSByZWYoKTtcbmNvbnN0IGF1dG9TaXplU3RyYXRlZ3kgPSByZWYoKTtcbmNvbnN0IHZpZXdFcnJvck1lc3NhZ2VEaWFsb2dPcGVuID0gcmVmKGZhbHNlKTtcbmNvbnN0IHZpZXdFcnJvck1lc3NhZ2VEaWFsb2dEYXRhID0gcmVmKCcnKTtcbmNvbnN0IE1lc3NhZ2UgPSAnTWVzc2FnZSc7XG5cbm9uQmVmb3JlTW91bnQoKCkgPT4ge1xuICBhdXRvR3JvdXBDb2x1bW5EZWYudmFsdWUgPSB7XG4gICAgaGVhZGVyTmFtZTogJ09iamVjdCcsXG4gICAgd2lkdGg6IDQwMCxcbiAgICBjZWxsUmVuZGVyZXJQYXJhbXM6IHtcbiAgICAgIHN1cHByZXNzQ291bnQ6IHRydWUsXG4gICAgfSxcbiAgfTtcblxuICBncm91cERlZmF1bHRFeHBhbmRlZC52YWx1ZSA9IC0xO1xuICBnZXRSb3dJZC52YWx1ZSA9IChwYXJhbXM6IHtkYXRhOiB7aWQ6IGFueX19KSA9PiBwYXJhbXMuZGF0YS5pZDtcbiAgcm93RGF0YS52YWx1ZSA9IHByb2Nlc3NEYXRhKHByb3BzLmRh
2788dGEpO1xuICBhdXRvU2l6ZVN0cmF0ZWd5LnZhbHVlID0ge3R5cGU6ICdmaXRHcmlkV2lkdGgnfTtcbn0pO1xuXG53YXRjaChcbiAgKCkgPT4gcHJvcHMuZGF0YSxcbiAgKGRhdGEpID0+IHJlZnJlc2goZGF0YSksXG4gIHtkZWVwOiB0cnVlfVxuKTtcblxuZnVuY3Rpb24gZ2V0RGF0YVBhdGgoZGF0YTogYW55KSB7XG4gIHJldHVybiBkYXRhLmRhdGFQYXRoO1xufVxuXG5mdW5jdGlvbiBvbkdyaWRSZWFkeShwYXJhbXM6IFJlYWxBbnkpIHtcbiAgZ3JpZEFwaS52YWx1ZSA9IHBhcmFtcy5hcGk7XG59XG5cbmZ1bmN0aW9uIHJlZnJlc2goZGF0YTogUGxhaW5PYmplY3Q8UmVhbEFueT5bXSA9IHByb3BzLmRhdGEpIHtcbiAgcm93RGF0YS52YWx1ZSA9IHByb2Nlc3NEYXRhKGRhdGEpO1xuICBpZiAoZ3JpZEFwaS52YWx1ZSkge1xuICAgIGdyaWRBcGkudmFsdWUuc2V0Um93RGF0YShyb3dEYXRhLnZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzRGF0YShkYXRhOiBhbnkpIHtcbiAgY29uc3QgZmxhdHRlbmVkRGF0YTogYW55W10gPSBbXTtcbiAgY29uc3QgZmxhdHRlblJvd1JlY3Vyc2l2ZSA9IChyb3c6IEpzT2JqQW55LCBwYXJlbnRQYXRoOiBKc09iakFueVtdKSA9PiB7XG4gICAgY29uc3QgZGF0YVBhdGggPSBbLi4ucGFyZW50UGF0aCwgcm93Lm5hbWVdO1xuICAgIGZsYXR0ZW5lZERhdGEucHVzaCh7Li4ucm93LCBkYXRhUGF0aH0pO1xuICAgIGlmIChyb3cuY2hpbGRyZW4pIHtcbiAgICAgIHJvdy5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogSnNPYmpBbnkpID0+IGZsYXR0ZW5Sb3dSZWN1cnNpdmUoY2hpbGQsIGRhdGFQYXRoKSk7XG4gICAgfVxuICB9O1xuICBkYXRhLmZvckVhY2goKHJvdzogSnNPYmpBbnkpID0+IGZsYXR0ZW5Sb3dSZWN1cnNpdmUocm93LCBbXSkpO1xuICByZXR1cm4gZmxhdHRlbmVkRGF0YTtcbn1cblxuZnVuY3Rpb24gY2VsbENsaWNrSGFuZGxlKGV2ZW50OiBKc09iakFueSkge1xuICBpZiAoZXZlbnQuY29sRGVmLmhlYWRlck5hbWUgPT09IE1lc3NhZ2UgJiYgZXZlbnQuZGF0YS5tZXNzYWdlKSB7XG4gICAgdmlld0Vycm9yTWVzc2FnZURpYWxvZ0RhdGEudmFsdWUgPSBldmVudC5kYXRhLmRldGFpbHM7XG4gICAgdmlld0Vycm9yTWVzc2FnZURpYWxvZ09wZW4udmFsdWUgPSB0cnVlO1xuICB9XG59XG5cbmRlZmluZUV4cG9zZSh7cmVmcmVzaH0pO1xuPC9zY3JpcHQ+XG48c3R5bGU+XG5AaW1wb3J0ICcuLi8uLi9ub2RlX21vZHVsZXMvYWctZ3JpZC1jb21tdW5pdHkvc3R5bGVzL2FnLWdyaWQuY3NzJztcbkBpbXBvcnQgJy4uLy4uL25vZGVfbW9kdWxlcy9hZy1ncmlkLWNvbW11bml0eS9zdHlsZXMvYWctdGhlbWUtYmFsaGFtLmNzcyc7XG5cbiNhZy1HcmlkLUF1dG9Db2x1bW4ge1xuICBwYWRkaW5nOiAwcHggIWltcG9ydGFudDtcbn1cblxuLmFnLXRoZW1lLWJhbGhhbS1kYXJrIHtcbiAgLS1hZy1yb3ctZ3JvdXAtaW5kZW50LXNpemU6IDEwcHggIWltcG9ydGFudDtcbn1cblxuLmFnLWx0ciAuYWctZ3JvdXAtY29udHJhY3RlZCxcbi5hZy1sdHIgLmFnLWdyb3VwLWV4cGFuZGVkIHtcbiAgbWFyZ2luLXJpZ2h0OiAzcHggIWltcG9ydGFudDtcbn1cblxuLmFnLXRoZW1lLWJhbGhhbSB7XG4gIC0tYWctcm93LWdyb3VwLWluZGVudC1zaXplOiAxMHB4ICFpbXBvcnRhbnQ7XG4gIGZvbnQtc2l6ZTogMTdweDtcbiAgZm9udC1mYW1pbHk6XG4gICAgJ1NvdXJjZSBTYW5zIFBybycsICdNb25hY28nLCAnQ29uc29sYXMnLCAnQ291cmllciBOZXcnLCAnLlNGIE5TIE1vbm8nLCAnQW5kYWxlIE1vbm8nLCAnRHJvaWQgU2FucyBNb25vJywgJ0pldEJyYWlucyBNb25vJywgJ21vbm9zcGFjZScsXG4gICAgJ01vbm9zcGFjZWQnO1xufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPENvbnRlbnREaWFsb2dcbiAgICA6dGl0bGU9XCJ0aXRsZVwiXG4gICAgOm1vZGVsVmFsdWU9XCJtb2RlbFZhbHVlXCJcbiAgICBAdXBkYXRlOm1vZGVsVmFsdWU9XCIkZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCAkZXZlbnQpXCJcbiAgICA6aW5pdGluZz1cImluaXRpbmdcIlxuICAgIDppbml0aW5nU3VjY2Vzcz1cImluaXRpbmdTdWNjZXNzXCJcbiAgICA6cHJvY2Vzc2luZz1cInByb2Nlc3NpbmdcIlxuICAgIGhlaWdodD1cImF1dG9cIlxuICAgIHdpZHRoPVwiOTB2d1wiXG4gICAgY2xvc2VNb2RlXG4gICAgOnBlcnNpc3RlbnQ9XCJmYWxzZVwiXG4gID5cbiAgICA8dGVtcGxhdGUgdi1pZj1cImluaXRpbmdTdWNjZXNzXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicm93IGl0ZW1zLWNlbnRlciBuby13cmFwIHEtcGIteHNcIj5cbiAgICAgICAgPEljb24gbmFtZT1cInJlZnJlc2hcIiBAY2xpY2s9XCJyZWZyZXNoKClcIiBjbGlja2FibGUgLz5cbiAgICAgICAgPHEtdGFicyB2LW1vZGVsPVwiY3VycmVudFRhYlwiIGFsaWduPVwibGVmdFwiIGRlbnNlIG5vLWNhcHMgaW5kaWNhdG9yLWNvbG9yPVwicHJpbWFyeVwiIGNsYXNzPVwiY29sIHEtbWwtc21cIj5cbiAgICAgICAgICA8cS10YWIgbmFtZT1cImhpZXJhcmNoeVwiIGxhYmVsPVwiT2JqZWN0cyBIaWVyYXJjaHlcIiAvPlxuICAgICAgICAgIDxxLXRhYiBuYW1lPVwic3VtbWFyeVwiIGxhYmVsPVwiT2JqZWN0cyBTdW1tYXJ5XCIgLz5cbiAgICAgICAgPC9xLXRhYnM+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxxLXRhYi1wYW5lbHMgdi1tb2RlbD1cImN1cnJlbnRUYWJcIiBrZWVwLWFsaXZlPlxuICAgICAgICA8cS10YWItcGFuZWwgbmFtZT1cImhpZXJhcmNoeVwiPlxuICAgICAgICAgIDxBZ0dyaWRUcmVlRGF0YSByZWY9XCJoaWVyYXJjaHlHcmlkXCIgOmRhdGE9XCJkYXRhU291cmNlXCIgOmNvbHVtbnM9XCJjb2x1bW5zXCIgLz5cbiAgICAgICAgPC9xLXRhYi1wYW5lbD5cbiAgICAgICAgPHEtdGFiLXBhbmVsIG5hbWU9XCJzdW1tYXJ5XCI+XG4gICAgICAgICAgPERhdGFDb3B5T2JqZWN0c1N1bW1hcnlEaWFsb2cgcmVmPVwic3VtbWFyeUdyaWRcIiA6bW9kZWw9XCJvYmplY3RzU3VtbWFyeURpYWxvZ01vZGVsXCIgOmpvYklkPVwiam9iSWRcIiA6cnVuSWQ9XCJydW4uaWRcIiAvPlxuICAgICAgICA8L3EtdGFiLXBhbmVsPlxuICAgICAgPC9xLXRhYi1wYW5lbHM+XG4gICAgPC90ZW1wbGF0ZT5cbiAgPC9Db250ZW50RGlhbG9nPlxuPC90ZW1wbGF0ZT5cbjxzY3JpcHQ+XG5pbXBvcnQgbWl4aW5zIGZyb20gJ3NyYy9taXhpbnMvbWl4aW5zJztcbmltcG9ydCB7Z2VuZXJhdGVJZDIsIHNvcnRJY30gZnJvbSAnc3JjL3NlcnZpY2VzL3V0aWxzJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJ3NyYy9zZXJ2aWNlcy91dGlscyc7XG5pbXBvcnQge3RvSHVtYW5FbGFwc2VkVGltZX0gZnJvbSAnQGRhdGFzZXJ0L2pzLXV0aWxzL2Rpc3QvanNVdGlscyc7XG5pbXBvcnQgKiBhcyBydEFwaSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hcGknO1xuaW1wb3J0IERhdGFDb3B5T2JqZWN0c1N1bW1hcnlEaWFsb2cgZnJvbSAncmVhbHRhc2svcGFnZXMvcnVucy9EYXRhQ29weU9iamVjdHNTdW1tYXJ5RGlhbG9nLnZ1ZSc7XG5pbXBvcnQgQWdHcmlkVHJlZURhdGEgZnJvbSAnc3JjL2NvbXBvbmVudHMvQWdHcmlkVHJlZURhdGEudnVlJztcblxuY29uc3QgaWNvblN1Y2Nlc3MgPVxuICAnPGkgYXJpYS1oaWRkZW49XCJ0cnVlXCIgcm9sZT1cInByZXNlbnRhdGlvblwiIGNsYXNzPVwicS1wYi14cyBtYXRlcmlhbC1pY29ucyBxLWljb24gbm90cmFuc2xhdGUgdGV4dC1wb3NpdGl2ZSByLWljb24gc2l6ZS14c1wiIHN0eWxlPVwiZm9udC1zaXplOiAxOHB4O1wiPmNoZWNrX2NpcmNsZTwvaT4nO1xuY29uc3QgaWNvbkVycm9yID1cbiAgJzxpIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHJvbGU9XCJwcmVzZW50YXRpb25cIiBjbGFzcz1cInEtcGIteHMgbWF0ZXJpYWwtaWNvbnMgcS1pY29uIG5vdHJhbnNsYXRlIHRleHQtbmVnYXRpdmUgci1pY29uIHNpemUteHNcIiBzdHlsZT1cImZvbnQtc2l6ZTogMThweDtcIj5lcnJvcjwvaT4nO1xuY29uc3QgaWNvbldhcm4gPVxuICAnPGkgYXJpYS1oaWRkZW49XCJ0cnVlXCIgcm9sZT1cInByZXNlbnRhdGlvblwiIGNsYXNzPVwicS1wYi14cyBtYXRlcmlhbC1pY29ucyBxLWljb24gbm90cmFuc2xhdGUgdGV4dC13YXJuaW5nIHItaWNvbiBzaXplLXhzXCIgc3R5bGU9XCJmb250LXNpemU6IDE4cHg7XCI+d2FybmluZzwvaT4nO1xuY29uc3QgaWNvblByb2Nlc3NpbmcgPVxuICAnPGkgYXJpYS1oaWRkZW49XCJ0cnVlXCIgcm9sZT1cInByZXNlbnRhdGlvblwiIGNsYXNzPVwicS1wYi14cyBtYXRlcmlhbC1pY29ucyBxLWljb24gbm90cmFuc2xhdGUgdGV4dC1ibHVlLTkgci1pY29uIHNpemUteHNcIiBzdHlsZT1cImZvbnQtc2l6ZTogMThweDtcIj5zd2FwX3ZlcnRpY2FsX2NpcmNsZTwvaT4nO1xuXG5jb25zdCBpY29ucyA9IHtcbiAgY29tcGxldGVkOiBpY29uU3VjY2VzcyxcbiAgZXJyb3I6IGljb25FcnJvcixcbiAgY29tcGxldGVkV2l0aEVycm9yczogaWNvbldhcm4sXG4gIHByb2Nlc3Npbmc6IGljb25Qcm9jZXNzaW5nLFxufTtcblxuZnVuY3Rpb24gZ2V0VGl0bGUodGFzaykge1xuICByZXR1cm4gYERhdGEgQ29weSBUYXNrIERldGFpbHMgLSAke3V0aWxzLnZhbHVlTGFiZWxzLnN0YXR1c1t0YXNrLnN0YXR1c119YDtcbn1cblxubGV0IHJvd051bUNvdW50ID0gMDtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFttaXhpbnNdLFxuICBjb21wb25lbnRzOiB7XG4gICAgQWdHcmlkVHJlZURhdGEsXG4gICAgRGF0YUNvcHlPYmplY3RzU3VtbWFyeURpYWxvZyxcbiAgfSxcbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiBCb29sZWFuLFxuICAgIGpvYklkOiBTdHJpbmcsXG4gICAgdGFzazogT2JqZWN0LFxuICAgIHJ1bjogT2JqZWN0LFxuICB9LFxuICBlbWl0czogWydjYW5jZWwnLCAndXBkYXRlOm1vZGVsVmFsdWUnXSxcbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXJ1bjogdGhpcy5ydW4sXG4gICAgICBpdGFzazogdGhpcy50YXNrLFxuICAgICAgZGF0YVNvdXJjZTogW10sXG4gICAgICB0aXRsZTogZ2V0VGl0bGUodGhpcy50YXNrKSxcbiAgICAgIGN1cnJlbnRUYWI6ICdoaWVyYXJjaHknLFxuICAgICAgb2JqZWN0c1N1bW1hcnlEaWFsb2dNb2RlbDoge30sXG4gICAgICBjb2x1bW5zOiBbXG4gICAgICAgI
2788Ht0aXRsZTogJ09iamVjdCcsIGtleTogJ25hbWUnLCB3aWR0aDogNTAwfSxcbiAgICAgICAge3RpdGxlOiAnU3RhdHVzJywga2V5OiAnc3RhdHVzJywgd2lkdGg6IDE1MH0sXG4gICAgICAgIHt0aXRsZTogJ1R5cGUnLCBrZXk6ICdoaWVyYXJjaHlUeXBlJywgd2lkdGg6IDEwMH0sXG4gICAgICAgIHt0aXRsZTogJ0xldmVsJywga2V5OiAncmVjb3JkTGV2ZWwnLCB3aWR0aDogODAsIGFsaWduOiAnY2VudGVyJ30sXG4gICAgICAgIHt0aXRsZTogJ0NvcHkgT3JkZXInLCBrZXk6ICdvcmRlcicsIHdpZHRoOiAxMjAsIGFsaWduOiAnY2VudGVyJ30sXG4gICAgICAgIHt0aXRsZTogJ0Vycm9yIFR5cGUnLCBrZXk6ICdlcnJvclR5cGVzJywgd2lkdGg6IDEyMCwgYWxpZ246ICdjZW50ZXInfSxcbiAgICAgICAge3RpdGxlOiAnVG90YWwnLCBrZXk6ICd0b3RhbCcsIHdpZHRoOiA4MCwgYWxpZ246ICdjZW50ZXInfSxcbiAgICAgICAge3RpdGxlOiAnRXJyb3JzJywga2V5OiAnZXJyb3JzJywgd2lkdGg6IDgwLCBhbGlnbjogJ2NlbnRlcid9LFxuICAgICAgICB7dGl0bGU6ICdJbnNlcnRzJywga2V5OiAnaW5zZXJ0cycsIHdpZHRoOiA4MCwgYWxpZ246ICdjZW50ZXInfSxcbiAgICAgICAge3RpdGxlOiAnVXBkYXRlcycsIGtleTogJ3VwZGF0ZXMnLCB3aWR0aDogODAsIGFsaWduOiAnY2VudGVyJ30sXG4gICAgICAgIHt0aXRsZTogJ1NraXBwZWQnLCBrZXk6ICdza2lwcGVkJywgd2lkdGg6IDgwLCBhbGlnbjogJ2NlbnRlcid9LFxuICAgICAgICB7dGl0bGU6ICdUb3RhbCBSb2xsdXAnLCBrZXk6ICd0b3RhbFJvbGx1cCcsIHdpZHRoOiAxMjV9LFxuICAgICAgICB7dGl0bGU6ICdEdXJhdGlvbicsIGtleTogJ2R1cmF0aW9uJywgd2lkdGg6IDEwMCwgYWxpZ246ICdjZW50ZXInfSxcbiAgICAgICAge3RpdGxlOiAnRHVyYXRpb24gUm9sbHVwJywga2V5OiAnZHVyYXRpb25Sb2xsdXAnLCB3aWR0aDogMTIwfSxcbiAgICAgICAge3RpdGxlOiAnTWVzc2FnZScsIGtleTogJ21lc3NhZ2UnfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfSxcblxuICB3YXRjaDoge1xuICAgIGFzeW5jIG1vZGVsVmFsdWUoKSB7XG4gICAgICBpZiAoIXRoaXMubW9kZWxWYWx1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLm9ialRvQmVFeHBhbmRlZCA9IFtdO1xuICAgICAgdGhpcy5jdXJyZW50VGFiID0gJ2hpZXJhcmNoeSc7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UgPSB0aGlzLmdldFJvd3MoKTtcblxuICAgICAgdGhpcy5pbml0aW5nU3VjY2VzcyA9IHRydWU7XG4gICAgfSxcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0UmVjb3JkcygpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9LFxuXG4gICAgZ2V0Um93cygpIHtcbiAgICAgIHRoaXMub2JqZWN0c1N1bW1hcnlEaWFsb2dNb2RlbCA9IHRoaXMuaXRhc2sudGFyZ2V0Py5ydW5Qcm9wcz8uc2ZkY0RhdGFDb3B5O1xuICAgICAgY29uc3Qgb2JqVHJlZSA9IHRoaXMub2JqZWN0c1N1bW1hcnlEaWFsb2dNb2RlbD8ub2JqZWN0c1RyZWUgfHwgW107XG4gICAgICByb3dOdW1Db3VudCA9IDA7XG4gICAgICByZXR1cm4gc29ydEljKG9ialRyZWUubWFwKHRoaXMucHJvY2Vzc1JvdyksICduYW1lJyk7XG4gICAgfSxcblxuICAgIHJvbGxVcFN0YXRzKHJvdykge1xuICAgICAgbGV0IHRvdGFsUm9sbHVwID0gcm93LnRvdGFsIHx8IDA7XG5cbiAgICAgIGlmIChyb3cuY2hpbGRyZW4pIHtcbiAgICAgICAgcm93LmNoaWxkcmVuLmZvckVhY2goKGl0KSA9PiB7XG4gICAgICAgICAgdGhpcy5yb2xsVXBTdGF0cyhpdCk7XG4gICAgICAgICAgdG90YWxSb2xsdXAgKz0gaXQudG90YWxSb2xsdXA7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByb3cudG90YWxSb2xsdXAgPSB0b3RhbFJvbGx1cDtcbiAgICB9LFxuXG4gICAgcHJvY2Vzc1JvdyhyZWMsIGxldmVsKSB7XG4gICAgICBsZXZlbCA9IGxldmVsIHx8IDA7XG5cbiAgICAgIGNvbnN0IHJvdyA9IHtcbiAgICAgICAgbnVtOiByb3dOdW1Db3VudCsrLFxuICAgICAgICByZWNvcmRMZXZlbDogbGV2ZWwsXG4gICAgICAgIGFjdGlvbjogJycsXG4gICAgICAgIC8vIGlkOiByZWMuaWQsXG4gICAgICAgIGlkOiBnZW5lcmF0ZUlkMignc29iaicpLFxuICAgICAgICBuYW1lOiByZWMucmVsYXRpb25zaGlwTmFtZSA/IGAke3JlYy5yZWxhdGlvbnNoaXBOYW1lfSAoJHtyZWMubmFtZX0pYCA6IHJlYy5uYW1lLFxuICAgICAgICBzdGF0dXM6IHJlYy5ydW5TdGF0dXMsXG4gICAgICAgIHN0YXR1c0ljb246IGAke2ljb25zW3JlYy5ydW5TdGF0dXNdIHx8ICcnfSAke3V0aWxzLnZhbHVlTGFiZWxzLnN0YXR1c1tyZWMucnVuU3RhdHVzXX1gLFxuICAgICAgICBkdXJhdGlvbjogdG9IdW1hbkVsYXBzZWRUaW1lKHJlYy5kdXJhdGlvbiB8fCAwKSxcbiAgICAgICAgZHVyYXRpb25Sb2xsdXA6IHRvSHVtYW5FbGFwc2VkVGltZShyZWMuZHVyYXRpb25Sb2xsdXAgfHwgMCksXG4gICAgICAgIHRvdGFsOiByZWMuc3RhdHMgJiYgcmVjLnN0YXRzLnRvdGFsLFxuICAgICAgICBkb25lOiByZWMuc3RhdHMgJiYgcmVjLnN0YXRzLmRvbmUsXG4gICAgICAgIHN1Y2Nlc3M6IHJlYy5zdGF0cyAmJiByZWMuc3RhdHMuc3VjY2VzcyxcbiAgICAgICAgaW5zZXJ0czogcmVjLnN0YXRzICYmIHJlYy5zdGF0cy5pbnNlcnRzLFxuICAgICAgICB1cGRhdGVzOiByZWMuc3RhdHMgJiYgcmVjLnN0YXRzLnVwZGF0ZXMsXG4gICAgICAgIGVycm9yczogcmVjLnN0YXRzICYmIHJlYy5zdGF0cy5lcnJvcnMsXG4gICAgICAgIHNraXBwZWQ6IHJlYy5zdGF0cyAmJiByZWMuc3RhdHMuc2tpcHBlZCxcbiAgICAgICAgbWVzc2FnZTogcmVjLm1lc3NhZ2UsXG4gICAgICAgIGRldGFpbHM6IHJlYy5kZXRhaWxzLFxuICAgICAgICBzdGF0dXNVcmxzOiByZWMuc3RhdHVzVXJscyxcbiAgICAgICAgZXJyb3JTdW1tYXJ5VXJsczogcmVjLmVycm9yU3VtbWFyeVVybHMsXG4gICAgICAgIHN0YXRzOiByZWMuc3RhdHMsXG4gICAgICAgIG9yZGVyOiByZWMub3JkZXIsXG4gICAgICAgIGVycm9yVHlwZXM6IChyZWMuZXJyb3JUeXBlcyB8fCBbXSkuam9pbignLCAnKSxcbiAgICAgICAgaGllcmFyY2h5VHlwZTogdXRpbHMudmFsdWVMYWJlbHMuaGllcmFyY2h5VHlwZXNbcmVjLmhpZXJhcmNoeVR5cGVdLFxuICAgICAgICBydW46IHRoaXMuaXJ1bixcbiAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgfTtcbiAgICAgIGlmIChyZWMucGFyZW50cyAmJiByZWMucGFyZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0ge1xuICAgICAgICAgIGFjdGlvbjogJycsXG4gICAgICAgICAgaWQ6IGdlbmVyYXRlSWQyKCdzb2JqJyksXG4gICAgICAgICAgY2hpbGRyZW46IHNvcnRJYyhcbiAgICAgICAgICAgI
2788HJlYy5wYXJlbnRzXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGl0KSA9PiBpdC5zdGF0cz8udG90YWwgPiAwIHx8IChpdC5ydW5TdGF0dXMgJiYgaXQucnVuU3RhdHVzICE9PSAnY29tcGxldGVkJykpXG4gICAgICAgICAgICAgIC5tYXAoKGl0KSA9PiB0aGlzLnByb2Nlc3NSb3coaXQsIGxldmVsICsgMSkpLFxuICAgICAgICAgICAgJ25hbWUnXG4gICAgICAgICAgKSxcbiAgICAgICAgfTtcbiAgICAgICAgY2hpbGRyZW4ubmFtZSA9IGBQYXJlbnRzICgke2NoaWxkcmVuLmNoaWxkcmVuLmxlbmd0aH0pYDtcbiAgICAgICAgaWYgKGNoaWxkcmVuLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByb3cuY2hpbGRyZW4ucHVzaChjaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChyZWMuY2hpbGRyZW4gJiYgcmVjLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSB7XG4gICAgICAgICAgYWN0aW9uOiAnJyxcbiAgICAgICAgICBpZDogZ2VuZXJhdGVJZDIoJ3NvYmonKSxcbiAgICAgICAgICBjaGlsZHJlbjogc29ydEljKFxuICAgICAgICAgICAgcmVjLmNoaWxkcmVuXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGl0KSA9PiBpdC5zdGF0cz8udG90YWwgPiAwIHx8IChpdC5ydW5TdGF0dXMgJiYgaXQucnVuU3RhdHVzICE9PSAnY29tcGxldGVkJykpXG4gICAgICAgICAgICAgIC5tYXAoKGl0KSA9PiB0aGlzLnByb2Nlc3NSb3coaXQsIGxldmVsICsgMSkpLFxuICAgICAgICAgICAgJ25hbWUnXG4gICAgICAgICAgKSxcbiAgICAgICAgfTtcbiAgICAgICAgY2hpbGRyZW4ubmFtZSA9IGBDaGlsZHJlbiAoJHtjaGlsZHJlbi5jaGlsZHJlbi5sZW5ndGh9KWA7XG4gICAgICAgIGlmIChjaGlsZHJlbi5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcm93LmNoaWxkcmVuLnB1c2goY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMucm9sbFVwU3RhdHMocm93KTtcblxuICAgICAgcmV0dXJuIHJvdztcbiAgICB9LFxuXG4gICAgY2xvc2UoKSB7XG4gICAgICB0aGlzLiRlbWl0KCdjYW5jZWwnKTtcbiAgICB9LFxuXG4gICAgcmVmcmVzaCgpIHtcbiAgICAgIHRoaXMucHJvY2Vzcyhhc3luYyAoKSA9PiB7XG4gICAgICAgIHRoaXMuaXJ1biA9IGF3YWl0IHJ0QXBpLmdldFJ1bih0aGlzLnJ1bi5pZCk7XG4gICAgICAgIHRoaXMuaXRhc2sgPSB0aGlzLmlydW4udGFza3MuZmluZCgoaXQpID0+IGl0LmlkID09PSB0aGlzLnRhc2suaWQpO1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSB0aGlzLmdldFJvd3MoKTtcbiAgICAgICAgdGhpcy50aXRsZSA9IGdldFRpdGxlKHRoaXMuaXRhc2spO1xuICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgdGhpcy4kcmVmcy5oaWVyYXJjaHlHcmlkPy5yZWZyZXNoKHRoaXMuZGF0YVNvdXJjZSk7XG4gICAgICAgICAgdGhpcy4kcmVmcy5zdW1tYXJ5R3JpZD8ucmVmcmVzaCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0sXG59O1xuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGU+XG4gIDxDb250ZW50RGlhbG9nXG4gICAgOnRpdGxlPVwidGl0bGUgfHwgJ0ZpbGVzJ1wiXG4gICAgOm1vZGVsVmFsdWU9XCJtb2RlbFZhbHVlXCJcbiAgICBAdXBkYXRlOm1vZGVsVmFsdWU9XCIkZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnKVwiXG4gICAgOm1lc3NhZ2U9XCJtZXNzYWdlXCJcbiAgICA6bWVz
2788c2FnZVR5cGU9XCJtZXNzYWdlVHlwZVwiXG4gICAgOmluaXRpbmc9XCJpbml0aW5nXCJcbiAgICA6aW5pdGluZ1N1Y2Nlc3M9XCJpbml0aW5nU3VjY2Vzc1wiXG4gICAgOnByb2Nlc3Npbmc9XCJwcm9jZXNzaW5nXCJcbiAgICBoZWlnaHQ9XCJhdXRvXCJcbiAgICB3aWR0aD1cIjkwMHB4XCJcbiAgICA6ZGVmYXVsdEJ1dHRvbj1cImZhbHNlXCJcbiAgICA6cGVyc2lzdGVudD1cImZhbHNlXCJcbiAgPlxuICAgIDxkaXYgdi1pZj1cInN0YXR1c0ZpbGVzLmxlbmd0aCA+IDBcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiXCI+U3RhdHVzIEZpbGVzPC9zcGFuPlxuICAgICAgPHEtdGFibGVcbiAgICAgICAgOmRhdGE9XCJzdGF0dXNGaWxlc1wiXG4gICAgICAgIDpjb2x1bW5zPVwiY29sdW1uc1wiXG4gICAgICAgIHJvdy1rZXk9XCJpZFwiXG4gICAgICAgIDpoaWRlLXBhZ2luYXRpb249XCJ0cnVlXCJcbiAgICAgICAgOnJvd3MtcGVyLXBhZ2Utb3B0aW9ucz1cIlswXVwiXG4gICAgICAgIHYtbW9kZWw6cGFnaW5hdGlvbj1cInBhZ2luYXRpb25cIlxuICAgICAgPlxuICAgICAgICA8dGVtcGxhdGUgdi1zbG90OmJvZHktY2VsbC1hY3Rpb25zPVwicHJvcHNcIj5cbiAgICAgICAgICA8cS10ZD5cbiAgICAgICAgICAgIDxJY29uQ29weSA6Y29udGVudD1cInByb3BzLnJvdy51cmxcIiB0b29sdGlwPVwiQ29weSB1cmwgdG8gQ2xpcGJvYXJkXCIgLz5cbiAgICAgICAgICAgIDxJY29uIG5hbWU9XCJjbG91ZF9kb3dubG9hZFwiIEBjbGljaz1cImRvd25sb2FkRmlsZShwcm9wcy5yb3cpXCIgY2xpY2thYmxlIHRvb2x0aXA9XCJEb3dubG9hZCBGaWxlXCIgLz5cbiAgICAgICAgICAgIDxJY29uIHYtaWY9XCJwcm9wcy5yb3cuY2FuVmlld1wiIG5hbWU9XCJ2aXNpYmlsaXR5XCIgQGNsaWNrPVwidmlld1N0YXR1c0ZpbGUocHJvcHMucm93KVwiIGNsaWNrYWJsZSB0b29sdGlwPVwiVmlldyBGaWxlXCIgLz5cbiAgICAgICAgICA8L3EtdGQ+XG4gICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICA8L3EtdGFibGU+XG4gICAgPC9kaXY+XG4gICAgPEZpbGVWaWV3ZXJEaWFsb2cyIHYtbW9kZWw9XCJ2aWV3ZXJEaWFsb2dPcGVuXCIgOnRpdGxlPVwidmlld2VyRGlhbG9nVGl0bGVcIiA6ZmlsZUluZm89XCJ2aWV3ZXJEaWFsb2dNb2RlbFwiIC8+XG4gICAgPFN0YXR1c0ZpbGVWaWV3ZXIgdi1tb2RlbD1cInN0YXR1c0ZpbGVWaWV3ZXJEaWFsb2dPcGVuXCIgOnRpdGxlPVwidmlld2VyRGlhbG9nVGl0bGVcIiA6ZmlsZUluZm89XCJ2aWV3ZXJEaWFsb2dNb2RlbFwiIC8+XG4gIDwvQ29udGVudERpYWxvZz5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInR5cGVzY3JpcHRcIj5cbmltcG9ydCBtaXhpbnMgZnJvbSAnc3JjL21peGlucy9taXhpbnMnO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnc3JjL3NlcnZpY2VzL3V0aWxzJztcbmltcG9ydCAqIGFzIGFwaSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hcGknO1xuaW1wb3J0IFN0YXR1c0ZpbGVWaWV3ZXIgZnJvbSAnc3JjL2NvbXBvbmVudHMvU3RhdHVzRmlsZVZpZXdlci52dWUnO1xuaW1wb3J0IEZpbGVWaWV3ZXJEaWFsb2cyIGZyb20gJ3NyYy9jb21wb25lbnRzL0ZpbGVWaWV3ZXJEaWFsb2cyLnZ1ZSc7XG5pbXBvcnQge2NvcHlUb0NsaXBib2FyZH0gZnJvbSAnc3JjL3NlcnZpY2VzL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFttaXhpbnNdLFxuICBjb21wb25lbnRzOiB7XG4gICAgU3RhdHVzRmlsZVZpZXdlcixcbiAgICBGaWxlVmlld2VyRGlhbG9nMixcbiAgfSxcblxuICBwcm9wczoge1xuICAgIHRpdGxlOiBTdHJpbmcsXG4gICAgbW9kZWxWYWx1ZTogQm9vbGVhbixcbiAgICBzdGF0dXNGaWxlczogQXJyYXksXG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sdW1uczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ2FjdGlvbnMnLFxuICAgICAgICAgIGFsaWduOiAnbGVmdCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtuYW1lOiAnT2JqZWN0TmFtZScsIGZpZWxkOiAnb2JqZWN0TmFtZScsIGxhYmVsOiAnVGFzaycsIHNvcnRhYmxlOiB0cnVlLCBhbGlnbjogJ2xlZnQnfSxcbiAgICAgICAge25hbWU6ICdmaWxlTmFtZScsIGZpZWxkOiAnZmlsZU5hbWUnLCBsYWJlbDogJ0ZpbGUgTmFtZScsIHNvcnRhYmxlOiB0cnVlLCBhbGlnbjogJ2xlZnQnfSxcbiAgICAgICAge25hbWU6ICdmaWxlU2l6ZScsIGZpZWxkOiAnZmlsZVNpemVGb3JtYXR0ZWQnLCBsYWJlbDogJ0ZpbGUgU2l6ZScsIHNvcnRhYmxlOiB0cnVlLCBhbGlnbjogJ2xlZnQnfSxcbiAgICAgIF0sXG4gICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgIHBhZ2U6IDEsXG4gICAgICAgIHJvd3NQZXJQYWdlOiAwLFxuICAgICAgfSxcbiAgICAgIHZpZXdlckRpYWxvZ1RpdGxlOiAnJyxcbiAgICAgIHZpZXdlckRpYWxvZ09wZW46IGZhbHNlLFxuICAgICAgc3RhdHVzRmlsZVZpZXdlckRpYWxvZ09wZW46IGZhbHNlLFxuICAgICAgdmlld2VyRGlhbG9nTW9kZWw6IHt9LFxuICAgIH07XG4gIH0sXG5cbiAgY3JlYXRlZCgpIHtcbiAgICB0aGlzLmluaXRpbmdTdWNjZXNzID0gdHJ1ZTtcbiAgfSxcbiAgZW1pdHM6IFsnY2FuY2VsJywgJ3VwZGF0ZTptb2RlbFZhbHVlJ10sXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSgpIHtcbiAgICAgIGlmICghdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9LFxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBjbG9zZSgpIHtcbiAgICAgIHRoaXMuJGVtaXQoJ2NhbmNlbCcpO1xuICAgIH0sXG5cbiAgICB2aWV3U3RhdHVzRmlsZShmaWxlSW5mbykge1xuICAgICAgdGhpcy5oYW5kbGVWaWV3RmlsZSgnU3RhdHVzIEZpbGU6ICcgKyBmaWxlSW5mby5maWxlTmFtZSwgZmlsZUluZm8pO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRPcGVuYWJsZVVybChmaWxlSW5mbykge1xuICAgICAgaWYgKGZpbGVJbmZvLm9wZW5hYmxlVXJsKSB7XG4gICAgICAgIHJldHVybiBmaWxlSW5mby5vcGVuYWJsZVVybDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMucHJvY2Vzc0Zvcm0oKCkgPT5cbiAgICAgICAgYXBpLm9wZW5GaWxlKHtcbiAgICAgICAgICBydW5JZDogZmlsZUluZm8ucnVuSWQsXG4gICAgICAgICAgam9iSWQ6IHRoaXMuam9iSWQsXG4gICAgICAgICAgdXJsOiBmaWxlSW5mby51cmwsXG4gICAgICAgICAgbG9jYXRpb246IGZpbGVJbmZvLmxvY2F0aW9uLFxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgaWYgKHJlc3ApIHtcbiAgICAgICAgZmlsZUluZm8ub3BlbmFibGVVcmwgPSByZXNwLnVybDtcbiAgICAgICAgcmV0dXJuIHJlc3AudXJsO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBoYW5kbGVWaWV3RmlsZSh0aXRsZSwgZmlsZUluZm8pIHtcbiAgICAgIGNvbnN0IHVybCA9IGF3YWl0IHRoaXMuZ2V0T3BlbmFibGVVcmwoZmlsZUluZm8pO1xuICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAoKHRoaXMudmlld2VyRGlhbG9nVGl0bGUgPSB0aXRsZSksXG4gICAgICAgICh0aGlzLnZpZXdlckRpYWxvZ01vZGVsID0ge1xuICAgICAgICAgIC4uLmZpbGVJbmZvLFxuICAgICAgICAgIC4uLnt1cmx9LFxuICAgICAgICB9KSk7XG4gICAgICB0aGlzLnN0YXR1c0ZpbGVWaWV3ZXJEaWFsb2dPcGVuID0gdHJ1ZTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZG93bmxvYWRGaWxlKGZpbGVJbmZvKSB7XG4gICAgICBsZXQgdXJsID0gYXdhaXQgdGhpcy5nZXRPcGVuYWJsZVVybChmaWxlSW5mbyk7XG4gICAgICBpZiAodXJsKSB7XG4gICAgICAgIGlmICh1cmwuc3RhcnRzV2l0aCgnaHR0cCcpKSB7XG4gICAgICAgICAgdXRpbHMub3BlblVybCh1cmwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgI
2788HdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGNvcHlGaWxlKGZpbGVJbmZvKSB7XG4gICAgICBsZXQgdXJsID0gYXdhaXQgdGhpcy5nZXRPcGVuYWJsZVVybChmaWxlSW5mbyk7XG4gICAgICBpZiAodXJsKSB7XG4gICAgICAgIC8vIHRoaXMuJGNsaXBib2FyZCh1cmwpO1xuICAgICAgICAvLyB1dGlscy5ub3RpZnlJbmZvKCdVcmwgY29waWVkIScpO1xuICAgICAgICBhd2FpdCBjb3B5VG9DbGlwYm9hcmQodXJsKTtcbiAgICAgIH1cbiAgICB9LFxuICB9LFxufTtcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlPlxuICA8ZGl2PlxuICAgIDxJY29uIHYtaWY9XCJzdGF0dXNGaWxlcy5sZW5ndGggPiAwXCIgbmFtZT1cImxpYnJhcnlfYm9va3NcIiBAY2xpY2s9XCJ2aWV3RmlsZXNcIiBjbGlja2FibGUgdG9vbHRpcD1cIlZpZXcgc3RhdHVzIEZpbGVcIiAvPlxuICAgIDxGaWxlc0RpYWxvZyB0aXRsZT1cIk9iamVjdCBGaWxlc1wiIHYtbW9kZWw9XCJmaWxlc0RpYWxvZ09wZW5cIiA6c3RhdHVzRmlsZXM9XCJzdGF0dXNGaWxlc1wiIC8+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBGaWxlc0RpYWxvZyBmcm9tICcuL0ZpbGVzRGlhbG9nLnZ1ZSc7XG5pbXBvcnQgKiBhcyByZFV0aWxzIGZyb20gJ2dvb2RkYXRhL3NlcnZpY2VzL2dvb2RkYXRhVXRpbHMnO1xuaW1wb3J0IG1peGlucyBmcm9tICdzcmMvbWl4aW5zL21peGlucyc7XG5cbmNvbnN0IFNUQVRVU19GSUxFID0gJ3N0YXR1c1VybHMnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW21peGluc10sXG5cbiAgcHJvcHM6IHtcbiAgICBydW46IE9iamVjdCxcbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXNGaWxlczogW10sXG4gICAgICBmaWxlc0RpYWxvZ09wZW46IGZhbHNlLFxuICAgIH07XG4gIH0sXG5cbiAgY29tcG9uZW50czoge1xuICAgIEZpbGVzRGlhbG9nLFxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5vYmplY3QgPSB0aGlzLnBhcmFtcy5kYXRhO1xuICAgIHRoaXMuc3RhdHVzRmlsZXMgPSByZFV0aWxzLmdldE9iamVjdEZpbGVzKHtpZDogdGhpcy5vYmplY3QucnVuSWR9LCB0aGlzLm9iamVjdCwgU1RBVFVTX0ZJTEUpO1xuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICB2aWV3RmlsZXMoKSB7XG4gICAgICB0aGlzLmZpbGVzRGlhbG9nT3BlbiA9IHRydWU7XG4gICAgfSxcbiAgfSxcbn07XG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZT5cbiAgPENvbnRlbnREaWFsb2dcbiAgICA6dGl0bGU9XCJ0aXRsZVwiXG4gICAgOm1vZGVsVmFsdWU9XCJtb2RlbFZhbHVlXCJcbiAgICBAdXBkYXRlOm1vZGVsVmFsdWU9XCIkZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnKVwiXG4gICAgOmluaXRpbmc9XCJpbml0aW5nXCJcbiAgICA6aW5pdGluZ1N1Y2Nlc3M9XCJpbml0aW5nU3VjY2Vzc1wiXG4gICAgOnByb2Nlc3Npbmc9XCJwcm9jZXNzaW5nXCJcbiAgICBoZWlnaHQ9XCJhdXRvXCJcbiAgICB3aWR0aD1cIjkwdndcIlxuICAgIGNsb3NlTW9kZVxuICAgIDpwZXJzaXN0ZW50PVwiZmFsc2VcIlxuICA+XG4gICAgPHRlbXBsYXRlIHYtaWY9XCJpbml0aW5nU3VjY2Vzc1wiPlxuICAgICAgPERhdGFncmlkXG4gICAgICAgIHJlZj1cImdyaWRcIlxuICAgICAgICA6Y29sdW1ucz1cImNvbHVtbnNcIlxuICAgICAgICA6cmVjb3Jkcz1cImdldFJvd3NcIlxuICAgICAgICA6Y3JlYXRhYmxlPVwiZmFsc2VcIlxuICAgICAgICA6dXBkYXRhYmxlPVwiZmFsc2VcIlxuICAgICAgICA6ZGVsZXRhYmxlPVwiZmFsc2VcIlxuICAgICAgICA6YWN0aW9uc0NvbHVtbj1cImZhbHNlXCJcbiAgICAgICAgOnNlbGVjdGlvbkNvbHVtbj1cImZhbHNlXCJcbiAgICAgICAgOmV4dGVybmFsUmVmcmVzaD1cInRydWVcIlxuICAgICAgICBAcmVmcmVzaD1cInJlZnJlc2hcIlxuICAgICAgPlxuICAgICAgPC9EYXRhZ3JpZD5cbiAgICA8L3RlbXBsYXRlPlxuICA8L0NvbnRlbnREaWFsb2c+XG48L3RlbXBsYXRlPlxuPHNjcmlwdD5cbmltcG9ydCBtaXhpbnMgZnJvbSAnc3JjL21peGlucy9taXhpbnMnO1xuaW1wb3J0IHtzb3J0SWN9IGZyb20gJ3NyYy9zZXJ2aWNlcy91dGlscyc7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICdzcmMvc2VydmljZXMvdXRpbHMnO1xuaW1wb3J0ICogYXMgcnRBcGkgZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXBpJztcbmltcG9ydCB7ZGVlcENsb25lfSBmcm9tICdAZGF0YXNlcnQvanMtdXRpbHMvZGlzdC9qc1V0aWxzJztcbmltcG9ydCBEYXRhZ3JpZCBmcm9tICdzcmMvY29tcG9uZW50cy9EYXRhZ3JpZC52dWUnO1xuaW1wb3J0IFNmZGNEYXRhTWFza1J1bkFjdGlvbnMgZnJvbSAnLi9TZmRjRGF0YU1hc2tSdW5BY3Rpb25zLnZ1ZSc7XG5cbmZ1bmN0aW9uIGdldFRpdGxlKHRhc2spIHtcbiAgcmV0dXJuIGBEYXRhIE1hc2sgUnVuIERldGFpbHMgLSAke3V0aWxzLnZhbHVlTGFiZWxzLnN0YXR1c1t0YXNrLnN0YXR1c119YDtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFttaXhpbnNdLFxuICBjb21wb25lbnRzOiB7RGF0YWdyaWR9LFxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IEJvb2xlYW4sXG4gICAgam9iSWQ6IFN0cmluZyxcbiAgICB0YXNrOiBPYmplY3QsXG4gICAgcnVuOiBPYmplY3QsXG4gIH0sXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlydW46IHRoaXMucnVuLFxuICAgICAgaXRhc2s6IHRoaXMudGFzayxcbiAgICAgIHRpdGxlOiBnZXRUaXRsZSh0aGlzLnRhc2spLFxuICAgICAgY29sdW1uczogW1xuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyTmFtZTogJ0FjdGlvbnMnLFxuICAgICAgICAgIGZpZWxkOiAnYWN0aW9ucycsXG4gICAgICAgICAgY2VsbFJlbmRlcmVyRnJhbWV3b3JrOiBTZmRjRGF0YU1hc2tSdW5BY3Rpb25zLFxuICAgICAgICAgIHdpZHRoOiA5NSxcbiAgICAgICAgICBwaW5uZWQ6ICdsZWZ0JyxcbiAgICAgICAgfSxcbiAgICAgICAge2ZpZWxkOiAnbmFtZSd9LFxuICAgICAgICB7ZmllbGQ6ICdzdGF0dXMnfSxcbiAgICAgICAge2ZpZWxkOiAnbWFza1N0YXJ0QXQnLCBoZWFkZXJOYW1lOiAnTWFza2VkIFRpbGwnLCB0eX
2788BlOiAnZGF0ZXRpbWUnfSxcbiAgICAgICAge2ZpZWxkOiAnc3RhcnRBdCcsIHR5cGU6ICdkYXRldGltZSd9LFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyTmFtZTogJ0R1cmF0aW9uJyxcbiAgICAgICAgICB2YWx1ZUdldHRlcjogKHJvdykgPT4gdXRpbHMuZ2V0UnVuRHVyYXRpb24ocm93LmRhdGEpLFxuICAgICAgICAgIHdpZHRoOiAxMjUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJOYW1lOiAnVG90YWwnLFxuICAgICAgICAgIHZhbHVlR2V0dGVyOiAocm93KSA9PiByb3cuZGF0YS5zdGF0cyAmJiByb3cuZGF0YS5zdGF0cy50b3RhbCxcbiAgICAgICAgICB3aWR0aDogMTAwLFxuICAgICAgICAgIHR5cGU6ICdpbnQnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyTmFtZTogJ1N1Y2Nlc3MnLFxuICAgICAgICAgIHZhbHVlR2V0dGVyOiAocm93KSA9PiByb3cuZGF0YS5zdGF0cyAmJiByb3cuZGF0YS5zdGF0cy5zdWNjZXNzLFxuICAgICAgICAgIHdpZHRoOiAxMjAsXG4gICAgICAgICAgdHlwZTogJ2ludCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJOYW1lOiAnU2tpcHBlZCcsXG4gICAgICAgICAgdmFsdWVHZXR0ZXI6IChyb3cpID0+IHJvdy5kYXRhLnN0YXRzICYmIHJvdy5kYXRhLnN0YXRzLnNraXBwZWQsXG4gICAgICAgICAgd2lkdGg6IDEwMCxcbiAgICAgICAgICB0eXBlOiAnaW50JyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlck5hbWU6ICdFcnJvcnMnLFxuICAgICAgICAgIHZhbHVlR2V0dGVyOiAocm93KSA9PiByb3cuZGF0YS5zdGF0cyAmJiByb3cuZGF0YS5zdGF0cy5lcnJvcnMsXG4gICAgICAgICAgd2lkdGg6IDEwMCxcbiAgICAgICAgICB0eXBlOiAnaW50JyxcbiAgICAgICAgfSxcbiAgICAgICAge2ZpZWxkOiAnbWVzc2FnZSd9LFxuICAgICAgXSxcbiAgICB9O1xuICB9LFxuICBlbWl0czogWydjYW5jZWwnLCAndXBkYXRlOm1vZGVsVmFsdWUnXSxcblxuICB3YXRjaDoge1xuICAgIGFzeW5jIG1vZGVsVmFsdWUoKSB7XG4gICAgICBpZiAoIXRoaXMubW9kZWxWYWx1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmluaXRpbmdTdWNjZXNzID0gdHJ1ZTtcbiAgICAgIHRoaXMuaW5pdFJlY29yZHMoKTtcbiAgICB9LFxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRSb3dzKCkge1xuICAgICAgcmV0dXJuIGRlZXBDbG9uZSh0aGlzLmRhdGFTb3VyY2UpO1xuICAgIH0sXG5cbiAgICBjbG9zZSgpIHtcbiAgICAgIHRoaXMuJGVtaXQoJ2NhbmNlbCcpO1xuICAgIH0sXG5cbiAgICByZWZyZXNoKCkge1xuICAgICAgdGhpcy5wcm9jZXNzKGFzeW5jICgpID0+IHtcbiAgICAgICAgdGhpcy5pcnVuID0gYXdhaXQgcnRBcGkuZ2V0UnVuKHRoaXMucnVuLmlkKTtcbiAgICAgICAgdGhpcy5pdGFzayA9IHRoaXMuaXJ1bi50YXNrcy5maW5kKChpdCkgPT4gaXQuaWQgPT09IHRoaXMudGFzay5pZCk7XG4gICAgICAgIHRoaXMudGl0bGUgPSBnZXRUaXRsZSh0aGlzLml0YXNrKTtcbiAgICAgICAgdGhpcy5pbml0UmVjb3JkcygpO1xuICAgICAgICB0aGlzLiRyZWZzLmdyaWQucmVmcmVzaCgpO1xuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGluaXRSZWNvcmRzKCkge1xuICAgICAgY29uc3QgcmVjcyA9IHRoaXMuaXRhc2sudGFyZ2V0Py5ydW5Qcm9wcz8uc2ZkY0RhdGFNYXNrLnNvYmplY3RzIHx8IFtdO1xuICAgICAgdGhpcy5kYXRhU291cmNlID0gc29ydEljKHJlY3MsICduYW1lJyk7XG4gICAgfSxcbiAgfSxcbn07XG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdj5cbiAgICA8SWNvbiB2LWlmPVwidGFza0ZpbGVzLmxlbmd0aCA+IDAgfHwgZXJyb3JGaWxlcy5sZW5ndGggPiAwXCIgbmFtZT1cImxpYnJhcnlfYm9va3NcIiBAY2xpY2s9XCJ2aWV3RmlsZXNcIiBjbGlja2FibGUgdG9vbHRpcD1cIlZpZXcgRmlsZXNcIiAvPlxuICAgIDxJY29uIHYtaWY9XCJpc1Nob3dTZmRjRGF0YUNvcHkoKVwiIG5hbWU9XCJhbmFseXRpY3NcIiBAY2xpY2s9XCJzZmRjRGF0YUNvcHlEaWFsb2dPcGVuID0gdHJ1ZVwiIGNsaWNrYWJsZSB0b29sdGlwPVwiVmlldyBBZGRpdGlvbmFsIEluZm9cIiAvPlxuICAgIDxJY29uIHYtaWY9XCJpc1Nob3dTZmRjRGF0YU1hc2soKVwiIG5hbWU9XCJhbmFseXRpY3NcIiBAY2xpY2s9XCJzZmRjRGF0YU1hc2tEaWFsb2dPcGVuID0gdHJ1ZVwiIGNsaWNrYWJsZSB0b29sdGlwPVwiVmlldyBBZGRpdGlvbmFsIEluZm9cIiAvPlxuICAgIDxJY29uIG5hbWU9XCJlZGl0XCIgQGNsaWNrPVwidGFza0RpYWxvZ09wZW4gPSB0cnVlXCIgY2xpY2thYmxlIHRvb2x0aXA9XCJFZGl0IFRhc2tcIiAvPlxuICAgIDxUYXNrRmlsZXNEaWFsb2dcbiAgICAgIHRpdGxlPVwiVGFzayBGaWxlc1wiXG4gICAgICB2LW1vZGVsPVwiZmlsZXNEaWFsb2dPcGVuXCJcbiAgICAgIDpydW49XCJpcnVuXCJcbiAgICAgIDp0YXNrPVwidGFza1wiXG4gICAgICA6ZXJyb3JGaWxlcz1cImVycm9yRmlsZXNcIlxuICAgICAgQGNhbmNlbD1cImZpbGVzRGlhbG9nT3BlbiA9IGZhbHNlXCJcbiAgICAgIEBjbG9zZT1cImZpbGVzRGlhbG9nT3BlbiA9IGZhbHNlXCJcbiAgICAvPlxuICAgIDxUYXNrRGlhbG9nIHYtbW9kZWw9XCJ0YXNrRGlhbG9nT3BlblwiIDp0YXNrSWQ9XCJ0YXNrSWRcIiA6am9iSWQ9XCJqb2JJZFwiIG1vZGU9XCJlZGl0XCIgQGNhbmNlbD1cInRhc2tEaWFsb2dPcGVuID0gZmFsc2VcIiBAb2s9XCJ0YXNrRGlhbG9nT3BlbiA9IGZhbHNlXCIgLz5cbiAgICA8U2ZkY0RhdGFDb3B5VGFza1J1bkRldGFpbHNEaWFsb2cgdi1tb2RlbD1cInNmZGNEYXRhQ29weURpYWxvZ09wZW5cIiA6am9iSWQ9XCJqb2JJZFwiIDpydW49XCJpcnVuXCIgOnRhc2s9XCJ0YXNrXCIgLz5cbiAgICA8U2ZkY0RhdGFNYXNrVGFza1J1bkRldGFpbHNEaWFsb2cgdi1tb2RlbD1cInNmZGNEYXRhTWFza0RpYWxvZ09wZW5cIiA6am9iSWQ9XCJqb2JJZFwiIDpydW49XCJpcnVuXCIgOnRhc2s9XCJ0YXNrXCIgLz5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuLy8gaW1wb3J0IFZ1ZSBmcm9tICd2dWUnO1xuaW1wb3J0IFRhc2tGaWxlc0RpYWxvZyBmcm9tICcuL1Rhc2tGaWxlc0RpYWxvZy52dWUnO1xuaW1wb3J0IG1peGlucyBmcm9tICdzcmMvbWl4aW5zL21peGlucyc7XG5pbXBvcnQge2dldFRhc2tGaWxlc30gZnJvbSAnLi4vLi4vc2VydmljZXMvcnRVdGlscyc7XG5pbXBvcnQgVGFza0RpYWxvZyBmcm9tICcuLi90YXNrcy9UYXNrRGlhbG9nLnZ1ZSc7XG5pbXBvcnQgU2ZkY0RhdGFDb3B5VGFza1J1bkRldGFpbHNEaWFsb2cgZnJvbSAnLi9TZmRjRGF0YUNvcHlUYXNrUnVuRGV0YWlsc0RpYWxvZy52dWUnO1xuaW1wb3J0IFNmZGNEYXRhTWFza1Rhc2tSdW5EZXRhaWxzRGlhbG9nIGZyb20gJy4vc2ZkY0RhdGFNYXNrL1NmZGNEYXRhTWFza1Rhc2tSdW5EZXRhaWxzRGlhbG9nLnZ1ZSc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbbWl4aW5zXSxcblxuICBjb21wb25lbnRzOiB7XG4gICAgVGFza0RpYWxvZyxcbiAgICBUYXNrRmlsZXNEaWFsb2csXG4gICAgU2ZkY0RhdGFDb3B5VGFza1J1bkRldGFpbHNEaWFsb2csXG4gICAgU2ZkY0RhdGFNYXNrVGFza1J1bkRldGFpbHNEaWFsb2csXG4gIH0sXG5cbiAgcHJvcHM6IHtcbiAgICBydW46IE9iamVjdCxcbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybi
2788B7XG4gICAgICBmaWxlc0RpYWxvZ09wZW46IGZhbHNlLFxuICAgICAgdGFzazoge30sXG4gICAgICBpcnVuOiB7fSxcbiAgICAgIHRhc2tGaWxlczogW10sXG4gICAgICBlcnJvckZpbGVzOiBbXSxcbiAgICAgIHRhc2tEaWFsb2dPcGVuOiBmYWxzZSxcbiAgICAgIHRhc2tJZDogJycsXG4gICAgICBqb2JJZDogJycsXG4gICAgICBvYmplY3RzVHJlZTogW10sXG4gICAgICBzZmRjRGF0YUNvcHlEaWFsb2dPcGVuOiBmYWxzZSxcbiAgICAgIHNmZGNEYXRhTWFza0RpYWxvZ09wZW46IGZhbHNlLFxuICAgIH07XG4gIH0sXG5cbiAgY3JlYXRlZCgpIHtcbiAgICBjb25zdCByb3cgPSB0aGlzLnBhcmFtcy5kYXRhIHx8IHt9O1xuICAgIHRoaXMudGFzayA9ICh0aGlzLnJ1bj8udGFza3MgfHwgW10pLmZpbmQoKGl0KSA9PiBpdC5pZCA9PT0gcm93LmlkIHx8IGl0LnRhc2tJZCA9PT0gcm93LnRhc2tJZCkgfHwgcm93O1xuICAgIHRoaXMudGFza0lkID0gdGhpcy50YXNrLmlkO1xuICAgIHRoaXMuam9iSWQgPSB0aGlzLnRhc2suam9iSWQ7XG4gICAgdGhpcy5pcnVuID0ge2lkOiB0aGlzLnRhc2sucnVuSWR9O1xuICAgIHRoaXMudGFza0ZpbGVzID0gZ2V0VGFza0ZpbGVzKHRoaXMuaXJ1biwgdGhpcy50YXNrKTtcbiAgICB0aGlzLmVycm9yRmlsZXMgPSB0aGlzLnRhc2suZXJyb3JTdW1tYXJ5VXJscyB8fCBbXTtcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgdmlld0ZpbGVzKCkge1xuICAgICAgdGhpcy5maWxlc0RpYWxvZ09wZW4gPSB0cnVlO1xuICAgIH0sXG4gICAgLy8gdmlld1NmZGNEYXRhQ29weURldGFpbHMoKSB7XG4gICAgLy8gICBjb25zdCBvYmpUcmVlID0gdGhpcy50YXNrLnRhcmdldD8ucnVuUHJvcHM/LnNmZGNEYXRhQ29weT8ub2JqZWN0c1RyZWU7XG4gICAgLy8gICBpZiAob2JqVHJlZSkge1xuICAgIC8vICAgICB0aGlzLm9iamVjdHNUcmVlID0gb2JqVHJlZTtcbiAgICAvLyAgICAgdGhpcy50YXNrUnVuSW5mb0RhaWxvZ09wZW4gPSB0cnVlO1xuICAgIC8vICAgfVxuICAgIC8vIH0sXG5cbiAgICBpc1Nob3dTZmRjRGF0YUNvcHkoKSB7XG4gICAgICByZXR1cm4gdGhpcy50YXNrPy50eXBlID09PSAnc2ZkY0RhdGFDb3B5JyAmJiB0aGlzLnRhc2s/LnRhcmdldD8ucnVuUHJvcHM/LnNmZGNEYXRhQ29weT8ub2JqZWN0c1RyZWU7XG4gICAgfSxcbiAgICBpc1Nob3dTZmRjRGF0YU1hc2soKSB7XG4gICAgICByZXR1cm4gdGhpcy50YXNrPy50eXBlID09PSAnc2ZkY0RhdGFNYXNrJyAmJiB0aGlzLnRhc2s/LnRhcmdldD8ucnVuUHJvcHM/LnNmZGNEYXRhTWFzaz8uc29iamVjdHM7XG4gICAgfSxcbiAgfSxcbn07XG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZT5cbiAgPFBhZ2VQYXJ0IDpwcm9jZXNzaW5nPVwicHJvY2Vzc2luZ1wiIDptZXNzYWdlPVwibWVzc2FnZVwiIDptZXNzYWdlVHlwZT1cIm1lc3NhZ2VUeXBlXCI+XG4gICAgPERhdGFncmlkXG4gICAgICByZWY9XCJncmlkXCJcbiAgICAgIDpjb2x1bW5zPVwidGFza0NvbHVtbnNcIlxuICAgICAgOnJlY29yZHM9XCJ0YXNrUmVjb3Jkc1wiXG4gICAgICA6Y3JlYXRhYmxlPVwiZmFsc2VcIlxuICAgICAgOnVwZGF0YWJsZT1cImZhbHNlXCJcbiAgICAgIDpkZWxldGFibGU9XCJmYWxzZVwiXG4gICAgICA6YWN0aW9uc0NvbHVtbj1cImZhbHNlXCJcbiAgICAgIDpzZWxlY3Rpb25Db2x1bW49XCJmYWxzZVwiXG4gICAgICBAY2VsbENsaWNrPVwiY2VsbENsaWNrSGFuZGxlXCJcbiAgICAgIDpyZWZyZXNoYWJsZT1cImZhbHNlXCJcbiAgICAgIGV4dGVybmFsUmVmcmVzaFxuICAgICAgQHJlZnJlc2g9XCJyZWZyZXNoVGFza3MoKVwiXG4gICAgICA6Y3VzdG9tTG9hZGluZz1cImxvYWRpbmdcIlxuICAgID48L0RhdGFncmlkPlxuICAgIDxWaWV3RXJyb3JNZXNzYWdlRGlhbG9nIHYtbW9kZWw9XCJ2aWV3RXJyb3JNZXNzYWdlRGlhbG9nT3BlblwiIDplcnJvck1lc3NhZ2U9XCJ2aWV3RXJyb3JNZXNzYWdlRGlhbG9nRGF0YVwiIC8+XG4gIDwvUGFnZVBhcnQ+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IG1peGlucyBmcm9tICdzcmMvbWl4aW5zL21peGlucyc7XG5pbXBvcnQgVGFza1J1bkFjdGlvbnMgZnJvbSAnLi9UYXNrUnVuQWN0aW9ucy52dWUnO1xuaW1wb3J0ICogYXMgcnRVdGlscyBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ydFV0aWxzJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJ3NyYy9zZXJ2aWNlcy91dGlscyc7XG5pbXBvcnQgVmlld0Vycm9yTWVzc2FnZURpYWxvZyBmcm9tICcuL1ZpZXdFcnJvck1lc3NhZ2VEaWFsb2cudnVlJztcbmltcG9ydCBEYXRhZ3JpZCBmcm9tICdzcmMvY29tcG9uZW50cy9EYXRhZ3JpZC52dWUnO1xuaW1wb3J0ICogYXMgYXBpIGZyb20gJ3NyYy9wcm9kdWN0cy9yZWFsdGFzay9zZXJ2aWNlcy9hcGknO1xuXG5jb25zdCBNZXNzYWdlID0gJ01lc3NhZ2UnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW21peGluc10sXG5cbiAgcHJvcHM6IHtcbiAgICBydW5JZDogU3RyaW5nLFxuICAgIHJ1bjogT2JqZWN0LFxuICB9LFxuXG4gIGNvbXBvbmVudHM6IHtcbiAgICBWaWV3RXJyb3JNZXNzYWdlRGlhbG9nLFxuICAgIERhdGFncmlkLFxuICB9LFxuICBlbWl0czogWydyZWZyZXNoJ10sXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhc2tDb2x1bW5zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJOYW1lOiAnQWN0aW9ucycsXG4gICAgICAgICAgZmllbGQ6ICdhY3Rpb25zJyxcbiAgICAgICAgICBjZWxsUmVuZGVyZXI6IFRhc2tSdW5BY3Rpb25zLFxuICAgICAgICAgIHdpZHRoOiAxMTUsXG4gICAgICAgICAgcGlubmVkOiAnbGVmdCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtmaWVsZDogJ29yZGVyJywgaGVhZGVyTmFtZTogJyMnLCB3aWR0aDogNTB9LFxuICAgICAgICB7ZmllbGQ6ICduYW1lJywgd2lkdGg6IDM1MH0sXG4gICAgICAgIHtmaWVsZDogJ3R5cGVJbmZvJywgaGVhZGVyTmFtZTogJ1R5cGUnLCB2YWx1ZUxhYmVsczogcnRVdGlscy52YWx1ZUxhYmVscy50YXNrVHlwZXMsIHdpZHRoOiAyNTB9LFxuICAgICAgICAvLyB7ZmllbGQ6ICd0eXBlSW5mbycsIGxhYmVsOiAnVHlwZScsIHZhbHVlTGFiZWxzOiBydFV0aWxzLnZhbHVlTGFiZWxzLnRhc2tUeXBlcywgd2lkdGg6IDE1MH0sXG4gICAgICAgI
2788HtmaWVsZDogJ3N0YXR1cycsIHdpZHRoOiAyMjB9LFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyTmFtZTogJ0R1cmF0aW9uJyxcbiAgICAgICAgICB2YWx1ZUdldHRlcjogKHJvdykgPT4gdXRpbHMuZ2V0UnVuRHVyYXRpb24ocm93LmRhdGEpLFxuICAgICAgICAgIHdpZHRoOiAxMDAsXG4gICAgICAgIH0sXG4gICAgICAgIC8vIHtcbiAgICAgICAgLy8gICBoZWFkZXJOYW1lOiAnUmVhZCcsXG4gICAgICAgIC8vICAgdmFsdWVHZXR0ZXI6IChyb3cpID0+IHJvdy5kYXRhLnN0YXRzICYmIHJvdy5kYXRhLnN0YXRzLnJlYWQsXG4gICAgICAgIC8vICAgd2lkdGg6IDEwMCxcbiAgICAgICAgLy8gICB0eXBlOiAnaW50JyxcbiAgICAgICAgLy8gfSxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlck5hbWU6ICdUb3RhbCcsXG4gICAgICAgICAgdmFsdWVHZXR0ZXI6IChyb3cpID0+IHJvdy5kYXRhLnN0YXRzICYmIHJvdy5kYXRhLnN0YXRzLnRvdGFsLFxuICAgICAgICAgIHdpZHRoOiAxMDAsXG4gICAgICAgICAgdHlwZTogJ2ludCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJOYW1lOiAnSW5zZXJ0cycsXG4gICAgICAgICAgdmFsdWVHZXR0ZXI6IChyb3cpID0+IHJvdy5kYXRhLnN0YXRzICYmIHJvdy5kYXRhLnN0YXRzLmluc2VydHMsXG4gICAgICAgICAgd2lkdGg6IDEwMCxcbiAgICAgICAgICB0eXBlOiAnaW50JyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlck5hbWU6ICdVcGRhdGVzJyxcbiAgICAgICAgICB2YWx1ZUdldHRlcjogKHJvdykgPT4gcm93LmRhdGEuc3RhdHMgJiYgcm93LmRhdGEuc3RhdHMudXBkYXRlcyxcbiAgICAgICAgICB3aWR0aDogMTAwLFxuICAgICAgICAgIHR5cGU6ICdpbnQnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyTmFtZTogJ0RlbGV0ZXMnLFxuICAgICAgICAgIHZhbHVlR2V0dGVyOiAocm93KSA9PiByb3cuZGF0YS5zdGF0cyAmJiByb3cuZGF0YS5zdGF0cy5kZWxldGVzLFxuICAgICAgICAgIHdpZHRoOiAxMDAsXG4gICAgICAgICAgdHlwZTogJ2ludCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJOYW1lOiAnU2tpcHBlZCcsXG4gICAgICAgICAgdmFsdWVHZXR0ZXI6IChyb3cpID0+IHJvdy5kYXRhLnN0YXRzICYmIHJvdy5kYXRhLnN0YXRzLnNraXBwZWQsXG4gICAgICAgICAgd2lkdGg6IDEwMCxcbiAgICAgICAgICB0eXBlOiAnaW50JyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlck5hbWU6ICdFcnJvcnMnLFxuICAgICAgICAgIHZhbHVlR2V0dGVyOiAocm93KSA9PiByb3cuZGF0YS5zdGF0cyAmJiByb3cuZGF0YS5zdGF0cy5lcnJvcnMsXG4gICAgICAgICAgd2lkdGg6IDEwMCxcbiAgICAgICAgICB0eXBlOiAnaW50JyxcbiAgICAgICAgfSxcbiAgICAgICAge2hlYWRlck5hbWU6IE1lc3NhZ2UsIGZpZWxkOiAnbWVzc2FnZScsIHdpZHRoOiA0MDB9LFxuICAgICAgICB7aGVhZGVyTmFtZTogJ0RldGFpbHMnLCBmaWVsZDogJ2RldGFpbHMnLCB3aWR0aDogNDAwfSxcbiAgICAgIF0sXG4gICAgICB0YXNrUmVjb3JkczogdGhpcy5nZXRUYXNrcyxcbiAgICAgIGluaXRpbmdTdWNjZXNzOiB0cnVlLFxuICAgICAgdmlld0Vycm9yTWVzc2FnZURpYWxvZ09wZW46IGZhbHNlLFxuICAgICAgdmlld0Vycm9yTWVzc2FnZURpYWxvZ0RhdGE6ICcnLFxuICAgICAgaW5pdDogZmFsc2UsXG4gICAgICB0YXNrczogW10sXG4gICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICB9O1xuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy50YXNrcyA9IHRoaXMucnVuLnRhc2tzO1xuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgcnVuKCkge1xuICAgICAgdGhpcy50YXNrcyA9IHRoaXMucnVuLnRhc2tzO1xuICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfSxcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgcHJvY2Vzc1Rhc2tSdW5zKHRhc2tSdW5zKSB7XG4gICAgICBsZXQgb3JkZXIgPSAxO1xuICAgICAgcmV0dXJuICh0YXNrUnVucyB8fCBbXSkubWFwKCh0YXNrKSA9PiB7XG4gICAgICAgIHRhc2sub3JkZXIgPSBvcmRlcisrO1xuICAgICAgICB0YXNrLnJ1bklkID0gdGhpcy5ydW5JZDtcbiAgICAgICAgdGFzay5qb2JJZCA9IHRoaXMucnVuLmpvYklkO1xuICAgICAgICByZXR1cm4gdGFzaztcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRUYXNrcygpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NUYXNrUnVucyh0aGlzLnRhc2tzIHx8IFtdKTtcbiAgICB9LFxuXG4gICAgcmVmcmVzaCgpIHtcbiAgICAgIHRoaXMuJHJlZnMuZ3JpZC5yZWZyZXNoKCk7XG4gICAgfSxcblxuICAgIGFzeW5jIHJlZnJlc2hUYXNrcygpIHtcbiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICBjb25zdCBydW4gPSBhd2FpdCBhcGkuZ2V0UnVuKHRoaXMucnVuSWQpO1xuICAgICAgdGhpcy50YXNrcyA9IHJ1bi50YXNrcztcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLiRlbWl0KCdyZWZyZXNoJywgcnVuKTtcbiAgICB9LFxuXG4gICAgY2VsbENsaWNrSGFuZGxlKHJlYywgZmllbGROYW1lKSB7XG4gICAgICBpZiAoZmllbGROYW1lID09PSBNZXNzYWdlICYmIHJlYy5tZXNzYWdlKSB7XG4gICAgICAgIHRoaXMudmlld0Vycm9yTWVzc2FnZURpYWxvZ0RhdGEgPSByZWMubWVzc2FnZTtcbiAgICAgICAgdGhpcy52aWV3RXJyb3JNZXNzYWdlRGlhbG9nT3BlbiA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChmaWVsZE5hbWUgPT09ICdEZXRhaWxzJyAmJiByZWMuZGV0YWlscykge1xuICAgICAgICB0aGlzLnZpZXdFcnJvck1lc3NhZ2VEaWFsb2dEYXRhID0gcmVjLmRldGFpbHM7XG4gICAgICAgIHRoaXMudmlld0Vycm9yTWVzc2FnZURpYWxvZ09wZW4gPSB0cnVlO1xuICAgICAgfVxuICAgIH0sXG4gIH0sXG59O1xuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGU+XG4gIDxQYWdlXG4gICAgOnRpdGxlPVwiKCkgPT4gbW9kZWwucnVuTmFtZVwiXG4gICAgOmluaXRpbmc9XCJpbml0aW5nXCJcbiAgICA6aW5pdGluZ1N1Y2Nlc3M9XCJpbml0aW5nU3VjY2Vzc1wiXG4gICAgOnByb2Nlc3Npbmc9XCJwcm9jZXNzaW5nXCJcbiAgICA6bWVz
2788c2FnZT1cIm1lc3NhZ2VcIlxuICAgIDptZXNzYWdlVHlwZT1cIm1lc3NhZ2VUeXBlXCJcbiAgPlxuICAgIDx0ZW1wbGF0ZSB2LXNsb3Q6YnJlYWRjcnVtYnM+XG4gICAgICA8cS1icmVhZGNydW1icy1lbCBsYWJlbD1cIkhvbWVcIiB0bz1cIi9yZWFsdGFzay9ob21lXCIgLz5cbiAgICAgIDxxLWJyZWFkY3J1bWJzLWVsIGxhYmVsPVwiSm9ic1wiIHRvPVwiL3JlYWx0YXNrL2pvYnNcIiAvPlxuICAgICAgPHEtYnJlYWRjcnVtYnMtZWwgOmxhYmVsPVwiYCR7KG1vZGVsLmpvYklkX19yIHx8IHt9KS5uYW1lIHx8ICdKb2InfWBcIiA6dG89XCJgL3JlYWx0YXNrL2pvYnMvJHttb2RlbC5qb2JJZH1gXCIgLz5cbiAgICA8L3RlbXBsYXRlPlxuXG4gICAgPHRlbXBsYXRlIHYtc2xvdDp0aXRsZS1zdWZmaXg+XG4gICAgICA8SWNvbiBuYW1lPVwicmVmcmVzaFwiIEBjbGljaz1cInJlZnJlc2hcIiBjbGlja2FibGUgLz5cbiAgICAgIDxJY29uIG5hbWU9XCJwbGF5X2Fycm93XCIgQGNsaWNrPVwiam9iUnVuQ29uZmlybWF0aW9uRGlhbG9nT3BlbiA9IHRydWVcIiBjbGlja2FibGUgLz5cbiAgICAgIDxJY29uTWVudT5cbiAgICAgICAgPE1lbnVJdGVtIEBjbGljaz1cImhhbmRsZVZpZXdMb2dcIj5WaWV3IExvZzwvTWVudUl0ZW0+XG4gICAgICAgIDxNZW51SXRlbSBAY2xpY2s9XCJoYW5kbGVWaWV3U3VwcG9ydExvZ1wiPlZpZXcgU3VwcG9ydCBMb2c8L01lbnVJdGVtPlxuICAgICAgICA8TWVudUl0ZW0gQGNsaWNrPVwiaGFuZGxlRGVsZXRlXCIgZGFuZ2VyPkRlbGV0ZTwvTWVudUl0ZW0+XG4gICAgICA8L0ljb25NZW51PlxuICAgIDwvdGVtcGxhdGU+XG5cbiAgICA8dGVtcGxhdGUgdi1zbG90OnRpdGxlLWRlc2M+XG4gICAgICA8U3luY1N0YXR1cyA6c3RhdHVzPVwibW9kZWwuc3RhdHVzXCIgc2l6ZT1cInNtXCIgOnRvb2x0aXA9XCJtb2RlbC5tZXNzYWdlXCIgLz5cbiAgICA8L3RlbXBsYXRlPlxuXG4gICAgPHEtdGFicyBpbmRpY2F0b3ItY29sb3I9XCJwcmltYXJ5XCIgYWxpZ249XCJsZWZ0XCIgdi1tb2RlbD1cImN1cnJlbnRUYWJcIiBkZW5zZSBjbGFzcyBuby1jYXBzPlxuICAgICAgPHEtdGFiIG5hbWU9XCJkZXRhaWxzXCIgbGFiZWw9XCJSdW4gRGV0YWlsc1wiIC8+XG4gICAgICA8cS10YWIgbmFtZT1cImZpbGVzXCIgbGFiZWw9XCJSdW4gRmlsZXNcIiAvPlxuICAgICAgPHEtdGFiIG5hbWU9XCJ0YXNrc1wiIGxhYmVsPVwiVGFzayBSdW5zXCIgLz5cbiAgICA8L3EtdGFicz5cblxuICAgIDxxLXRhYi1wYW5lbHMga2VlcC1hbGl2ZSB2LW1vZGVsPVwiY3VycmVudFRhYlwiPlxuICAgICAgPHEtdGFiLXBhbmVsIG5hbWU9XCJkZXRhaWxzXCI+XG4gICAgICAgIDxSdW5EZXRhaWxzIDptb2RlbD1cIm1vZGVsXCIgLz5cbiAgICAgIDwvcS10YWItcGFuZWw+XG5cbiAgICAgIDxxLXRhYi1wYW5lbCBuYW1lPVwiZmlsZXNcIj5cbiAgICAgICAgPFJ1bkZpbGVzIDpydW49XCJtb2RlbFwiIDpqb2JJZD1cImpvYklkXCIgLz5cbiAgICAgIDwvcS10YWItcGFuZWw+XG5cbiAgICAgIDxxLXRhYi1wYW5lbCBuYW1lPVwidGFza3NcIj5cbiAgICAgICAgPFRhc2tSdW5zIDpydW5JZD1cIm1vZGVsLmlkXCIgOnJ1bj1cIm1vZGVsXCIgcmVmPVwidGFza3NcIiBAcmVmcmVzaD1cImhhbmRsZVRhc2tSdW5SZWZyZXNoXCIgLz5cbiAgICAgIDwvcS10YWItcGFuZWw+XG4gICAgPC9xLXRhYi1wYW5lbHM+XG5cbiAgICA8Sm9iUnVuQ29uZmlybWF0aW9uRGlhbG9nIHYtbW9kZWw9XCJqb2JSdW5Db25maXJtYXRpb25EaWFsb2dPcGVuXCIgOmpvYklkIEBjYW5jZWw9XCJqb2JSdW5Db25maXJtYXRpb25EaWFsb2dPcGVuID0gZmFsc2VcIiBAcnVuPVwiaGFuZGxlUnVuSm9iXCIgLz5cbiAgICA8UnVuRmlsZXNEaWFsb2cgdGl0bGU9XCJSdW4gTG9nXCIgdi1tb2RlbD1cInJ1bkxvZ0RpYWxvZ09wZW5cIiA6cnVuPVwibW9kZWxcIiBhdXRvT3BlbkZpbGVUeXBlPVwibG9nRmlsZVwiIC8+XG4gIDwvUGFnZT5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgKiBhcyBhcGkgZnJvbSAnLi4vLi4vc2VydmljZXMvYXBpJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJ3NyYy9zZXJ2aWNlcy91dGlscyc7XG5pbXBvcnQgbWl4aW5zIGZyb20gJ3NyYy9taXhpbnMvbWl4aW5zJztcbmltcG9ydCBSdW5EZXRhaWxzIGZyb20gJy4vUnVuRGV0YWlscy52dWUnO1xuaW1wb3J0IFJ1bkZpbGVzIGZyb20gJy4vUnVuRmlsZXMudnVlJztcbmltcG9ydCBUYXNrUnVucyBmcm9tICcuL1Rhc2tSdW5zLnZ1ZSc7XG5pbXBvcnQgbmF2ZXIgZnJvbSAnc3JjL3NlcnZpY2VzL25hdmVyJztcbmltcG9ydCB7cG9wdWxhdGVSdW5OYW1lfSBmcm9tICdyZWFsdGFzay9zZXJ2aWNlcy9ydFV0aWxzJztcbmltcG9ydCBTeW5jU3RhdHVzIGZyb20gJ3NyYy9jb21wb25lbnRzL1N5bmNTdGF0dXMudnVlJztcbmltcG9ydCBKb2JSdW5Db25maXJtYXRpb25EaWFsb2cgZnJvbSAnc3JjL3Byb2R1Y3RzL3JlYWx0YXNrL3BhZ2VzL2pvYnMvSm9iUnVuQ29uZmlybWF0aW9uRGlhbG9nLnZ1ZSc7XG5pbXBvcnQgUnVuRmlsZXNEaWFsb2cgZnJvbSAnLi9SdW5GaWxlc0RpYWxvZy52dWUnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW21peGluc10sXG5cbiAgY29tcG9uZW50czoge1xuICAgIEpvYlJ1bkNvbmZpcm1hdGlvbkRpYWxvZyxcbiAgICBSdW5EZXRhaWxzLFxuICAgIFJ1bkZpbGVzLFxuICAgIFJ1bkZpbGVzRGlhbG9nLFxuICAgIFRhc2tSdW5zLFxuICAgIFN5bmNTdGF0dXMsXG4gIH0sXG5cbiAgZGF0YTogKCkgPT4gKHtcbiAgICBwcm9ncmVzc09wZW46IGZhbHNlLFxuICAgIGluaXRpbmdTdWNjZXNzOiBmYWxzZSxcbiAgICBtb2RlbDoge30sXG4gICAgZGV0YWlsczoge30sXG4gICAgam9iSWQ6ICcnLFxuICAgIHJ1bklkOiAnJyxcbiAgICBjdXJyZW50VGFiOiAndGFza3MnLFxuICAgIHZlcnNpb246ICcnLFxuICAgIGpvYlJ1bkNvbmZpcm1hdGlvbkRpYWxvZ09wZW46IGZhbHNlLFxuICAgIHJ1bkxvZ0RpYWxvZ09wZW46IGZhbHNlLFxuICB9KSxcblxuICBjcmVhdGVkKCkge1xuICAgIHRoaXMuam9iSWQgPSB0aGlzLiRyb3V0ZS5wYXJhbXMuam9iSWQ7XG4gICAgdGhpcy5ydW5JZCA9IHRoaXMuJHJvdXRlLnBhcmFtcy5ydW5JZDtcblxuICAgI
2788HRoaXMuaW5pdEZvcm0oYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IHJ1biA9IGF3YWl0IGFwaS5nZXRSdW4odGhpcy5ydW5JZCk7XG5cbiAgICAgIHBvcHVsYXRlUnVuTmFtZShydW4pO1xuICAgICAgdGhpcy5tb2RlbCA9IHJ1bjtcbiAgICB9KTtcbiAgfSxcblxuICB3YXRjaDoge1xuICAgICckcm91dGUucGFyYW1zLnJ1bklkJyhuZXdJZCkge1xuICAgICAgdGhpcy5ydW5JZCA9IG5ld0lkO1xuICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfSxcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0RGlzcGxheUlkKCkge1xuICAgICAgcmV0dXJuIHV0aWxzLmZvcm1hdERhdGVUaW1lRm9yRGlzcGxheSh0aGlzLm1vZGVsLm5hbWUuc3BsaXQoJyAnKVsxXSk7XG4gICAgfSxcblxuICAgIHJlZnJlc2gxKCkge1xuICAgICAgdGhpcy5wcm9jZXNzRm9ybShhc3luYyAoKSA9PiB7XG4gICAgICAgIHRoaXMuam9iID0gYXdhaXQgYXBpLmdldEpvYih0aGlzLmpvYklkKTtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmN1cnJlbnRUYWIgPT09ICd0YXNrcycgPyB0aGlzLiRyZWZzLnRhc2tzLnJlZnJlc2goKSA6IHVuZGVmaW5lZDtcbiAgICB9LFxuXG4gICAgYXN5bmMgcmVmcmVzaCgpIHtcbiAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc0Zvcm0oYXN5bmMgKCkgPT4ge1xuICAgICAgICBsZXQgcnVuID0gYXdhaXQgYXBpLmdldFJ1bih0aGlzLnJ1bklkKTtcbiAgICAgICAgcG9wdWxhdGVSdW5OYW1lKHJ1bik7XG4gICAgICAgIHRoaXMubW9kZWwgPSBydW47XG4gICAgICB9KTtcbiAgICAgIGlmICh0aGlzLiRyZWZzLnRhc2tzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuJHJlZnMudGFza3MucmVmcmVzaFRhc2tzKCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGhhbmRsZVRhc2tSdW5SZWZyZXNoKHJ1bikge1xuICAgICAgcG9wdWxhdGVSdW5OYW1lKHJ1bik7XG4gICAgICB0aGlzLm1vZGVsID0gcnVuO1xuICAgIH0sXG5cbiAgICBoYW5kbGVWaWV3TG9nKCkge1xuICAgICAgdGhpcy5ydW5Mb2dEaWFsb2dPcGVuID0gdHJ1ZTtcbiAgICB9LFxuXG4gICAgYXN5bmMgaGFuZGxlVmlld1N1cHBvcnRMb2coKSB7XG4gICAgICBhd2FpdCB0aGlzLnByb2Nlc3NGb3JtKGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IGxvZ1VybCA9IHRoaXMubW9kZWw/LnJ1bnRpbWVJbmZvPy5sb2dVcmw7XG4gICAgICAgIGlmICghbG9nVXJsKSB7XG4gICAgICAgICAgY29uc3QgcnVuID0gYXdhaXQgYXBpLmdldFJ1bih0aGlzLnJ1bklkKTtcbiAgICAgICAgICBwb3B1bGF0ZVJ1bk5hbWUocnVuKTtcbiAgICAgICAgICB0aGlzLm1vZGVsID0gcnVuO1xuICAgICAgICAgIGxvZ1VybCA9IHJ1bj8ucnVudGltZUluZm8/LmxvZ1VybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbG9nVXJsKSB7XG4gICAgICAgICAgdXRpbHMubm90aWZ5RXJyb3IoJ1N1cHBvcnQgbG9nIGlzIG5vdCBhdmFpbGFibGUgZm9yIHRoaXMgcnVuLicpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHdpbmRvdy5vcGVuKGxvZ1VybCwgJ19uZXd0YWInKTtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBoYW5kbGVEZWxldGUoKSB7XG4gICAgICBjb25zdCBtc2cgPSAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgUnVuJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHV0aWxzLmNvbmZpcm1EZWxldGUoJ0RlbGV0ZSBSdW5zPycsIG1zZyk7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0Zvcm0oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBhcGkuZGVsZXRlUnVucyh0aGlzLiRyb3V0ZS5wYXJhbXMuam9iSWQsIHtyZWNvcmRzOiBbe2lkOiB0aGlzLm1vZGVsLmlkfV19KTtcbiAgICAgICAgICBuYXZlci50b1JlYWx0YXNrUGFnZShgL2pvYnMvJHt0aGlzLmpvYklkfWApO1xuICAgICAgICAgIHV0aWxzLm5vdGlmeVN1Y2Nlc3MocmVzcC5tZXNzYWdlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGhhbmRsZVJ1bkpvYih0YXNrSWRzKSB7XG4gICAgICBhd2FpdCB0aGlzLnByb2Nlc3NGb3JtKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGFwaS5leGVjdXRlSm9icyh0aGlzLmdldFJlcUJvZHkodGFza0lkcykpO1xuICAgICAgICB1dGlscy5ub3RpZnlTdWNjZXNzKCdKb2IgaGFzIGJlZW4gc3VibWl0dGVkIGZvciBleGVjdXRpb24nKTtcbiAgICAgICAgY29uc3QgcnVuSWQgPSByZXNwWzBdICYmIHJlc3BbMF0ucnVuSWQ7XG5cbiAgICAgICAgaWYgKHJ1bklkKSB7XG4gICAgICAgICAgbmF2ZXIudG9SZWFsdGFza1BhZ2UoYC9qb2JzLyR7dGhpcy5qb2JJZH0vcnVucy8ke3J1bklkfWApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgZ2V0UmVxQm9keSh0YXNrSWRzKSB7XG4gICAgICByZXR1cm4ge3JlY29yZHM6IFt7aWQ6IHRoaXMuam9iSWQsIHRhc2tJZHN9XX07XG4gICAgfSxcbiAgfSxcbn07XG48L3NjcmlwdD5cbiJdLCJuYW1lcyI6WyJfc2ZjX21haW4iLCJ1dGlscy52YWx1ZUxhYmVscyIsIl9jcmVhdGVCbG9jayIsIl9jcmVhdGVWTm9kZSIsInJ0VXRpbHMuZ2V0UnVuRmlsZXMiLCJhcGkub3BlbkZpbGUiLCJ1dGlscy5vcGVuVXJsIiwiX2NyZWF0ZUVsZW1lbnRCbG9jayIsIl9vcGVuQmxvY2siLCJfaG9pc3RlZF8xIiwiX2NyZWF0ZUVsZW1lbnRWTm9kZSIsIl93aXRoQ3R4IiwiX2hvaXN0ZWRfMiIsIl9ob2lzdGVkXzMiLCJ1dGlscy5jcmVhdGVSdW5GaWxlIiwicnRVdGlscy5nZXRUYXNrRmlsZXMiLCJjb21tb25BcGkuZ2V0RmlsZSIsInV0aWxzLnJlYWRDc3YiLCJ1dGlscy5mb3JtYXRTdG9yYWdlU2l6ZSIsInV0aWxzLmNhblZpZXdGaWxlIiwidXRpbHMubm90aWZ5SW5mbyIsIk1lc3NhZ2UiLCJnZXRUaXRsZSIsInRvSHVtYW5FbGFwc2VkVGltZSIsInJ0QXBpLmdldFJ1biIsIl9GcmFnbWVudCIsInJkVXRpbHMuZ2V0T2JqZWN0RmlsZXMiLCJ1dGlscy5nZXRSdW5EdXJhdGlvbiIsImRlZXBDbG9uZSIsInJ0VXRpbHMudmFsdWVMYWJlbHMiLCJhcGkuZ2V0UnVuIiwidXRpbHMuZm9ybWF0RGF0ZVRpbWVGb3JEaXNwbGF5IiwiYXBpLmdldEpvYiIsInV0aWxzLm5vdGlmeUVycm9yIiwidXRpbHMuY29uZmlybURlbGV0ZSIsImFwaS5kZWxldGVSdW5zIiwidXRpbHMubm90aWZ5U3VjY2VzcyIsImFwaS5leGVjdXRlSm9icyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE2Q0EsTUFBS0EsY0FBVTtBQUFBLEVBQ2IsT0FBTztBQUFBLElBQ0wsT0FBTztBQUFBO0VBRVQsWUFBWSxFQUFDLFlBQVc7QUFBQSxFQUN4QixPQUFPO0FBQ0wsV0FBTztBQUFBLE1BQ0wsU0FBUztBQUFBO0VBRWI7QUFBQSxFQUVBLFNBQVM7QU
2788FBQSxJQUNQLGNBQWM7QUFDWixhQUFPQztBQUFBQSxJQUNUO0FBQUE7QUFFSjs7Ozs7O3NCQTVERUMsWUFzQ08saUJBQUEsRUF0Q0QsVUFBUyxXQUFPO0FBQUEscUJBQ3BCLE1BT007QUFBQSxNQVBOQyxZQU9NLGdCQUFBLE1BQUE7QUFBQSx5QkFOSixNQUVTO0FBQUEsVUFGVEEsWUFFUyxtQkFBQSxNQUFBO0FBQUEsNkJBRFAsTUFBOEQ7QUFBQSxjQUE5REEsWUFBOEQsd0JBQUE7QUFBQSxnQkFBakQsT0FBTTtBQUFBLGdCQUFPLE9BQU8sT0FBQSxNQUFNLFFBQVEsT0FBQSxNQUFNO0FBQUE7Ozs7VUFFdkRBLFlBRVMsbUJBQUEsTUFBQTtBQUFBLDZCQURQLE1BQXdGO0FBQUEsY0FBeEZBLFlBQXdGLHdCQUFBO0FBQUEsZ0JBQTNFLE9BQU07QUFBQSxnQkFBVSxPQUFPLE9BQUEsTUFBTTtBQUFBLGdCQUFTLGFBQWEsU0FBQSxjQUFjO0FBQUE7Ozs7Ozs7TUFHbEZBLFlBT00sZ0JBQUEsTUFBQTtBQUFBLHlCQU5KLE1BRVM7QUFBQSxVQUZUQSxZQUVTLG1CQUFBLE1BQUE7QUFBQSw2QkFEUCxNQUF1RTtBQUFBLGNBQXZFQSxZQUF1RSx3QkFBQTtBQUFBLGdCQUExRCxPQUFNO0FBQUEsZ0JBQVksT0FBTyxPQUFBLE1BQU07QUFBQSxnQkFBUyxNQUFLO0FBQUE7Ozs7VUFFNURBLFlBRVMsbUJBQUEsTUFBQTtBQUFBLDZCQURQLE1BQW1FO0FBQUEsY0FBbkVBLFlBQW1FLHdCQUFBO0FBQUEsZ0JBQXRELE9BQU07QUFBQSxnQkFBVSxPQUFPLE9BQUEsTUFBTTtBQUFBLGdCQUFPLE1BQUs7QUFBQTs7Ozs7OztNQUcxREEsWUFVTSxnQkFBQSxNQUFBO0FBQUEseUJBVEosTUFFUztBQUFBLFVBRlRBLFlBRVMsbUJBQUEsTUFBQTtBQUFBLDZCQURQLE1BQXlIO0FBQUEsY0FBekhBLFlBQXlILH
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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.