1import { f as createComponent, ag as useAlignProps, J as h, M as hSlot, y as computed, ah as useAlign, q as ref, ai as useFormProps, aj as useSizeProps, X as useDarkProps, k as getCurrentInstance, ak as useFormInject, al as useSize, am as hMergeSlot, Y as useDark, N as stopAndPrevent, an as toRaw, W as QIcon, ao as stop, ap as client, aq as useFieldEmits, ar as useNonInputFieldProps, as as useFieldState, at as fieldValueIsFilled, au as injectProp, av as useField, aw as humanStorageSize, ax as prevent, ay as QChip, az as useFormInputNameAttr } from "./index-vSBdh2XK.js"; 2import { u as useFileFormDomProps } from "./QInput-DntAcNzv.js"; 3const QCardActions = createComponent({ 4 name: "QCardActions", 5 props: { 6 ...useAlignProps, 7 vertical: Boolean 8 }, 9 setup(props, { slots }) { 10 const alignClass = useAlign(props); 11 const classes = computed( 12 () => `q-card__actions ${alignClass.value} q-card__actions--${props.vertical === true ? "vert column" : "horiz row"}` 13 ); 14 return () => h("div", { class: classes.value }, hSlot(slots.default)); 15 } 16}); 17function useRefocusTarget(props, rootRef) { 18 const refocusRef = ref(null); 19 const refocusTargetEl = computed(() => { 20 if (props.disable === true) { 21 return null; 22 } 23 return h("span", { 24 ref: refocusRef, 25 class: "no-outline", 26 tabindex: -1 27 }); 28 }); 29 function refocusTarget(e) { 30 const root = rootRef.value; 31 if (e?.qAvoidFocus === true) return; 32 if (e?.type.indexOf("key") === 0) { 33 if (document.activeElement !== root && root?.contains(document.activeElement) === true) { 34 root.focus(); 35 } 36 } else if (refocusRef.value !== null && (e === void 0 || root?.contains(e.target) === true)) { 37 refocusRef.value.focus(); 38 } 39 } 40 return { 41 refocusTargetEl, 42 refocusTarget 43 }; 44} 45const optionSizes = { 46 xs: 30, 47 sm: 35, 48 md: 40, 49 lg: 50, 50 xl: 60 51}; 52const useCheckboxProps = { 53 ...useDarkProps, 54 ...useSizeProps, 55 ...useFormProps, 56 modelValue: { 57 required: true, 58 default: null 59 }, 60 val: {}, 61 trueValue: { default: true }, 62 falseValue: { default: false }, 63 indeterminateValue: { default: null }, 64 checkedIcon: String, 65 uncheckedIcon: String, 66 indeterminateIcon: String, 67 toggleOrder: { 68 type: String, 69 validator: (v) => v === "tf" || v === "ft" 70 }, 71 toggleIndeterminate: Boolean, 72 label: String, 73 leftLabel: Boolean, 74 color: String, 75 keepColor: Boolean, 76 dense: Boolean, 77 disable: Boolean, 78 tabindex: [String, Number] 79}; 80const useCheckboxEmits = ["update:modelValue"]; 81function useCheckbox(type, getInner) { 82 const { props, slots, emit, proxy } = getCurrentInstance(); 83 const { $q } = proxy; 84 const isDark = useDark(props, $q); 85 const rootRef = ref(null); 86 const { refocusTargetEl, refocusTarget } = useRefocusTarget(props, rootRef); 87 const sizeStyle = useSize(props, optionSizes); 88 const modelIsArray = computed( 89 () => props.val !== void 0 && Array.isArray(props.modelValue) 90 ); 91 const index = computed(() => { 92 const val = toRaw(props.val); 93 return modelIsArray.value === true ? props.modelValue.findIndex((opt) => toRaw(opt) === val) : -1; 94 }); 95 const isTrue = computed(() => modelIsArray.value === true ? index.value !== -1 : toRaw(props.modelValue) === toRaw(props.trueValue)); 96 const isFalse = computed(() => modelIsArray.value === true ? index.value === -1 : toRaw(props.modelValue) === toRaw(props.falseValue)); 97 const isIndeterminate = computed( 98 () => isTrue.value === false && isFalse.value === false 99 ); 100 const tabindex = computed(() => props.disable === true ? -1 : props.tabindex || 0); 101 const classes = computed( 102 () => `q-${type} cursor-pointer no-outline row inline no-wrap items-center` + (props.disable === true ? " disabled" : "") + (isDark.value === true ? ` q-${type}--dark` : "") + (props.dense === true ? ` q-${type}--dense` : "") + (props.leftLabel === true ? " reverse" : "") 103 ); 104 const innerClass = computed(() => { 105 const state = isTrue.value === true ? "truthy" : isFalse.value === true ? "falsy" : "
105indet"; 106 const color = props.color !== void 0 && (props.keepColor === true || isTrue.value === true) ? ` text-${props.color}` : ""; 107 return `q-${type}__inner relative-position non-selectable q-${type}__inner--${state}${color}`; 108 }); 109 const formAttrs = computed(() => { 110 const prop = { type: "checkbox" }; 111 props.name !== void 0 && Object.assign(prop, { 112 // see https://vuejs.org/guide/extras/render-function.html#creating-vnodes (.prop) 113 ".checked": isTrue.value, 114 "^checked": isTrue.value === true ? "checked" : void 0, 115 name: props.name, 116 value: modelIsArray.value === true ? props.val : props.trueValue 117 }); 118 return prop; 119 }); 120 const injectFormInput = useFormInject(formAttrs); 121 const attributes = computed(() => { 122 const attrs = { 123 tabindex: tabindex.value, 124 role: "switch", 125 "aria-label": props.label, 126 "aria-checked": isIndeterminate.value === true ? "mixed" : isTrue.value === true ? "true" : "false" 127 }; 128 if (props.disable === true) { 129 attrs["aria-disabled"] = "true"; 130 } 131 return attrs; 132 }); 133 function onClick(e) { 134 if (e !== void 0) { 135 stopAndPrevent(e); 136 refocusTarget(e); 137 } 138 if (props.disable !== true) { 139 emit("update:modelValue", getNextValue(), e); 140 } 141 } 142 function getNextValue() { 143 if (modelIsArray.value === true) { 144 if (isTrue.value === true) { 145 const val = props.modelValue.slice(); 146 val.splice(index.value, 1); 147 return val; 148 } 149 return props.modelValue.concat([props.val]); 150 } 151 if (isTrue.value === true) { 152 if (props.toggleOrder !== "ft" || props.toggleIndeterminate === false) { 153 return props.falseValue; 154 } 155 } else if (isFalse.value === true) { 156 if (props.toggleOrder === "ft" || props.toggleIndeterminate === false) { 157 return props.trueValue; 158 } 159 } else { 160 return props.toggleOrder !== "ft" ? props.trueValue : props.falseValue; 161 } 162 return props.indeterminateValue; 163 } 164 function onKeydown(e) { 165 if (e.keyCode === 13 || e.keyCode === 32) { 166 stopAndPrevent(e); 167 } 168 } 169 function onKeyup(e) { 170 if (e.keyCode === 13 || e.keyCode === 32) { 171 onClick(e); 172 } 173 } 174 const getInnerContent = getInner(isTrue, isIndeterminate); 175 Object.assign(proxy, { toggle: onClick }); 176 return () => { 177 const inner = getInnerContent(); 178 props.disable !== true && injectFormInput( 179 inner, 180 "unshift", 181 ` q-${type}__native absolute q-ma-none q-pa-none` 182 ); 183 const child = [ 184 h("div", { 185 class: innerClass.value, 186 style: sizeStyle.value, 187 "aria-hidden": "true" 188 }, inner) 189 ]; 190 if (refocusTargetEl.value !== null) { 191 child.push(refocusTargetEl.value); 192 } 193 const label = props.label !== void 0 ? hMergeSlot(slots.default, [props.label]) : hSlot(slots.default); 194 label !== void 0 && child.push( 195 h("div", { 196 class: `q-${type}__label q-anchor--skip` 197 }, label) 198 ); 199 return h("div", { 200 ref: rootRef, 201 class: classes.value, 202 ...attributes.value, 203 onClick, 204 onKeydown, 205 onKeyup 206 }, child); 207 }; 208} 209const QToggle = createComponent({ 210 name: "QToggle", 211 props: { 212 ...useCheckboxProps, 213 icon: String, 214 iconColor: String 215 }, 216 emits: useCheckboxEmits, 217 setup(props) { 218 function getInner(isTrue, isIndeterminate) { 219 const icon = computed( 220 () => (isTrue.value === true ? props.checkedIcon : isIndeterminate.value === true ? props.indeterminateIcon : props.uncheckedIcon) || props.icon 221 ); 222 const color = computed(() => isTrue.value === true ? props.iconColor : null); 223 return () => [ 224 h("div", { class: "q-toggle__track" }), 225 h( 226 "div", 227 { 228 class: "q-toggle__thumb absolute flex flex-center no-wrap" 229 }, 230 icon.value !== void 0 ? [ 231 h(QIcon, { 232 name: icon.value, 233 color: color.value 234 }) 235 ] : void 0 236 ) 237 ]; 238 } 239 return useCheckbox("toggle", getInner); 240 } 241}); 242function filterFiles(files, rejectedFiles, failedPropValidation, filterFn) { 243 const acceptedFiles = [];
244 files.forEach((file) => { 245 if (filterFn(file) === true) { 246 acceptedFiles.push(file); 247 } else { 248 rejectedFiles.push({ failedPropValidation, file }); 249 } 250 }); 251 return acceptedFiles; 252} 253function stopAndPreventDrag(e) { 254 if (e?.dataTransfer) { 255 e.dataTransfer.dropEffect = "copy"; 256 } 257 stopAndPrevent(e); 258} 259const useFileProps = { 260 multiple: Boolean, 261 accept: String, 262 capture: String, 263 maxFileSize: [Number, String], 264 maxTotalSize: [Number, String], 265 maxFiles: [Number, String], 266 filter: Function 267}; 268const useFileEmits = ["rejected"]; 269function useFile({ 270 editable, 271 dnd, 272 getFileInput, 273 addFilesToQueue 274}) { 275 const { props, emit, proxy } = getCurrentInstance(); 276 const dndRef = ref(null); 277 const extensions = computed(() => props.accept !== void 0 ? props.accept.split(",").map((ext) => { 278 ext = ext.trim(); 279 if (ext === "*") { 280 return "*/"; 281 } else if (ext.endsWith("/*")) { 282 ext = ext.slice(0, ext.length - 1); 283 } 284 return ext.toUpperCase(); 285 }) : null); 286 const maxFilesNumber = computed(() => parseInt(props.maxFiles, 10)); 287 const maxTotalSizeNumber = computed(() => parseInt(props.maxTotalSize, 10)); 288 function pickFiles(e) { 289 if (editable.value) { 290 if (e !== Object(e)) { 291 e = { target: null }; 292 } 293 if (e.target?.matches('input[type="file"]') === true) { 294 e.clientX === 0 && e.clientY === 0 && stop(e); 295 } else { 296 const input = getFileInput(); 297 if (input !== e.target) input?.click(e); 298 } 299 } 300 } 301 function addFiles(files) { 302 if (editable.value && files) { 303 addFilesToQueue(null, files); 304 } 305 } 306 function processFiles(e, filesToProcess, currentFileList, append) { 307 let files = Array.from(filesToProcess || e.target.files); 308 const rejectedFiles = []; 309 const done = () => { 310 if (rejectedFiles.length !== 0) { 311 emit("rejected", rejectedFiles); 312 } 313 }; 314 if (props.accept !== void 0 && extensions.value.indexOf("*/") === -1) { 315 files = filterFiles(files, rejectedFiles, "accept", (file) => { 316 return extensions.value.some((ext) => file.type.toUpperCase().startsWith(ext) || file.name.toUpperCase().endsWith(ext)); 317 }); 318 if (files.length === 0) { 319 return done(); 320 } 321 } 322 if (props.maxFileSize !== void 0) { 323 const maxFileSize = parseInt(props.maxFileSize, 10); 324 files = filterFiles(files, rejectedFiles, "max-file-size", (file) => { 325 return file.size <= maxFileSize; 326 }); 327 if (files.length === 0) { 328 return done(); 329 } 330 } 331 if (props.multiple !== true && files.length !== 0) { 332 files = [files[0]]; 333 } 334 files.forEach((file) => { 335 file.__key = file.webkitRelativePath + file.lastModified + file.name + file.size; 336 }); 337 if (append === true) { 338 const filenameMap = currentFileList.map((entry) => entry.__key); 339 files = filterFiles(files, rejectedFiles, "duplicate", (file) => { 340 return filenameMap.includes(file.__key) === false; 341 }); 342 } 343 if (files.length === 0) { 344 return done(); 345 } 346 if (props.maxTotalSize !== void 0) { 347 let size = append === true ? currentFileList.reduce((total, file) => total + file.size, 0) : 0; 348 files = filterFiles(files, rejectedFiles, "max-total-size", (file) => { 349 size += file.size; 350 return size <= maxTotalSizeNumber.value; 351 }); 352 if (files.length === 0) { 353 return done(); 354 } 355 } 356 if (typeof props.filter === "function") { 357 const filteredFiles = props.filter(files); 358 files = filterFiles(files, rejectedFiles, "filter", (file) => { 359 return filteredFiles.includes(file); 360 }); 361 } 362 if (props.maxFiles !== void 0) { 363 let filesNumber = append === true ? currentFileList.length : 0; 364 files = filterFiles(files, rejectedFiles, "max-files", () => { 365 filesNumber++; 366 return filesNumber <= maxFilesNumber.value; 367 }); 368 if (files.length === 0) { 369 return done(); 370 } 371 } 372 done(); 373 if (files.length !== 0) { 374 return files; 375 } 376 } 377 function onDragover(e) { 378 stopAndPreventDrag(e); 379 dnd.value !== true && (dnd.value = true); 380 } 381 function onDragleave(e) { 382 stopAndPrevent(e); 383 const gone = e.relatedTarget !== null || client.is.safari !== true ? e.relatedTarget !== dndRef.value : document.elementsFromPoint(e.clientX, e.clientY).includes(dndRef.value) === false; 384 gone === true && (dnd.value = false); 385 } 386 function onDrop(e) { 387 stopAndPreventDrag(e); 388 const files = e.dataTransfer.files; 389 if (files.length !== 0) { 390 addFilesToQueue(null, files); 391 } 392 dnd.value = false;
393 } 394 function getDndNode(type) { 395 if (dnd.value === true) { 396 return h("div", { 397 ref: dndRef, 398 class: `q-${type}__dnd absolute-full`, 399 onDragenter: stopAndPreventDrag, 400 onDragover: stopAndPreventDrag, 401 onDragleave, 402 onDrop 403 }); 404 } 405 } 406 Object.assign(proxy, { pickFiles, addFiles }); 407 return { 408 pickFiles, 409 addFiles, 410 onDragover, 411 onDragleave, 412 processFiles, 413 getDndNode, 414 maxFilesNumber, 415 maxTotalSizeNumber 416 }; 417} 418const QFile = createComponent({ 419 name: "QFile", 420 inheritAttrs: false, 421 props: { 422 ...useNonInputFieldProps, 423 ...useFormProps, 424 ...useFileProps, 425 /* SSR does not know about File & FileList */ 426 modelValue: [File, FileList, Array], 427 append: Boolean, 428 useChips: Boolean, 429 displayValue: [String, Number], 430 tabindex: { 431 type: [String, Number], 432 default: 0 433 }, 434 counterLabel: Function, 435 inputClass: [Array, String, Object], 436 inputStyle: [Array, String, Object] 437 }, 438 emits: [ 439 ...useFieldEmits, 440 ...useFileEmits 441 ], 442 setup(props, { slots, emit, attrs }) { 443 const { proxy } = getCurrentInstance(); 444 const state = useFieldState(); 445 const inputRef = ref(null); 446 const dnd = ref(false); 447 const nameProp = useFormInputNameAttr(props); 448 const { 449 pickFiles, 450 onDragover, 451 onDragleave, 452 processFiles, 453 getDndNode 454 } = useFile({ editable: state.editable, dnd, getFileInput, addFilesToQueue }); 455 const formDomProps = useFileFormDomProps(props); 456 const innerValue = computed(() => Object(props.modelValue) === props.modelValue ? "length" in props.modelValue ? Array.from(props.modelValue) : [props.modelValue] : []); 457 const hasValue = computed(() => fieldValueIsFilled(innerValue.value)); 458 const selectedString = computed( 459 () => innerValue.value.map((file) => file.name).join(", ") 460 ); 461 const totalSize = computed( 462 () => humanStorageSize( 463 innerValue.value.reduce((acc, file) => acc + file.size, 0) 464 ) 465 ); 466 const counterProps = computed(() => ({ 467 totalSize: totalSize.value, 468 filesNumber: innerValue.value.length, 469 maxFiles: props.maxFiles 470 })); 471 const inputAttrs = computed(() => ({ 472 tabindex: -1, 473 type: "file", 474 title: "", 475 // try to remove default tooltip, 476 accept: props.accept, 477 capture: props.capture, 478 name: nameProp.value, 479 ...attrs, 480 id: state.targetUid.value, 481 disabled: state.editable.value !== true 482 })); 483 const fieldClass = computed( 484 () => "q-file q-field--auto-height" + (dnd.value === true ? " q-file--dnd" : "") 485 ); 486 const isAppending = computed( 487 () => props.multiple === true && props.append === true 488 ); 489 function removeAtIndex(index) { 490 const files = innerValue.value.slice(); 491 files.splice(index, 1); 492 emitValue(files); 493 } 494 function removeFile(file) { 495 const index = innerValue.value.indexOf(file); 496 if (index !== -1) { 497 removeAtIndex(index); 498 } 499 } 500 function emitValue(files) { 501 emit("update:modelValue", props.multiple === true ? files : files[0]); 502 } 503 function onKeydown(e) { 504 e.keyCode === 13 && prevent(e); 505 } 506 function onKeyup(e) { 507 if (e.keyCode === 13 || e.keyCode === 32) { 508 pickFiles(e); 509 } 510 } 511 function getFileInput() { 512 return inputRef.value; 513 } 514 function addFilesToQueue(e, fileList) { 515 const files = processFiles(e, fileList, innerValue.value, isAppending.value); 516 const fileInput = getFileInput(); 517 if (fileInput !== void 0 && fileInput !== null) { 518 fileInput.value = ""; 519 } 520 if (files === void 0) return; 521 if (props.multiple === true ? props.modelValue && files.every((f) => innerValue.value.includes(f)) : props.modelValue === files[0]) return; 522 emitValue( 523 isAppending.value === true ? innerValue.value.concat(files) : files 524 ); 525 } 526 function getFiller() { 527 return [ 528 h("input", { 529 class: [props.inputClass, "q-file__filler"], 530 style: props.inputStyle 531 }) 532 ]; 533 } 534 function getSelection() { 535 if (slots.file !== void 0) { 536 return innerValue.value.length === 0 ? getFiller() : innerValue.value.map( 537 (file, index) => slots.file({ index, file, ref: this }) 538 ); 539 } 540 if (slots.selected !== void 0) { 541 return innerValue.value.length === 0 ? getFiller() : slots.selected({ files: innerValue.value, ref: this }); 542 } 543 if (props.useChips === true) { 544 return innerValue.value.length === 0 ? getFiller() : innerValue.value.map((file, i) => h(QChip, { 545 key: "file-" + i, 546 removable: state.editable.value, 547 dense: true, 548 textColor: props.color, 549 tabindex: props.tabindex, 550 onRemove: () => { 551 removeAtIndex(i); 552 } 553 }, () => h("span", { 554 class: "ellipsis", 555 textContent: file.name 556 }))); 557 } 558 const textContent = props.displayValue !== void 0 ? props.displayValue : selectedString.value; 559 return textContent.length !== 0 ? [ 560 h("div", { 561 class: props.inputClass, 562 style: props.inputStyle, 563 textContent 564 })
565 ] : getFiller(); 566 } 567 function getInput() { 568 const data = { 569 ref: inputRef, 570 ...inputAttrs.value, 571 ...formDomProps.value, 572 class: "q-field__input fit absolute-full cursor-pointer", 573 onChange: addFilesToQueue 574 }; 575 if (props.multiple === true) { 576 data.multiple = true; 577 } 578 return h("input", data); 579 } 580 Object.assign(state, { 581 fieldClass, 582 emitValue, 583 hasValue, 584 inputRef, 585 innerValue, 586 floatingLabel: computed( 587 () => hasValue.value === true || fieldValueIsFilled(props.displayValue) 588 ), 589 computedCounter: computed(() => { 590 if (props.counterLabel !== void 0) { 591 return props.counterLabel(counterProps.value); 592 } 593 const max = props.maxFiles; 594 return `${innerValue.value.length}${max !== void 0 ? " / " + max : ""} (${totalSize.value})`; 595 }), 596 getControlChild: () => getDndNode("file"), 597 getControl: () => { 598 const data = { 599 ref: state.targetRef, 600 class: "q-field__native row items-center cursor-pointer", 601 tabindex: props.tabindex 602 }; 603 if (state.editable.value === true) { 604 Object.assign(data, { onDragover, onDragleave, onKeydown, onKeyup }); 605 } 606 return h("div", data, [getInput()].concat(getSelection())); 607 } 608 }); 609 Object.assign(proxy, { 610 removeAtIndex, 611 removeFile, 612 getNativeElement: () => inputRef.value 613 // deprecated 614 }); 615 injectProp(proxy, "nativeEl", () => inputRef.value); 616 return useField(state); 617 } 618}); 619export { 620 QToggle as Q, 621 QFile as a, 622 QCardActions as b 623}; 624//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUUZpbGUtRHR0REFJNHEuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9xdWFzYXIvc3JjL2NvbXBvbmVudHMvY2FyZC9RQ2FyZEFjdGlvbnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvcXVhc2FyL3NyYy9jb21wb3NhYmxlcy9wcml2YXRlLnVzZS1yZWZvY3VzLXRhcmdldC91c2UtcmVmb2N1cy10YXJnZXQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvcXVhc2FyL3NyYy91dGlscy9wcml2YXRlLm9wdGlvbi1zaXplcy9vcHRpb24tc2l6ZXMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvcXVhc2FyL3NyYy9jb21wb25lbnRzL2NoZWNrYm94L3VzZS1jaGVja2JveC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9xdWFzYXIvc3JjL2NvbXBvbmVudHMvdG9nZ2xlL1FUb2dnbGUuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvcXVhc2FyL3NyYy9jb21wb3NhYmxlcy9wcml2YXRlLnVzZS1maWxlL3VzZS1maWxlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3F1YXNhci9zcmMvY29tcG9uZW50cy9maWxlL1FGaWxlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGgsIGNvbXB1dGVkIH0gZnJvbSAndnVlJ1xuXG5pbXBvcnQgdXNlQWxpZ24sIHsgdXNlQWxpZ25Qcm9wcyB9IGZyb20gJy4uLy4uL2NvbXBvc2FibGVzL3ByaXZhdGUudXNlLWFsaWduL3VzZS1hbGlnbi5qcydcblxuaW1wb3J0IHsgY3JlYXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvcHJpdmF0ZS5jcmVhdGUvY3JlYXRlLmpzJ1xuaW1wb3J0IHsgaFNsb3QgfSBmcm9tICcuLi8uLi91dGlscy9wcml2YXRlLnJlbmRlci9yZW5kZXIuanMnXG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUNvbXBvbmVudCh7XG4gIG5hbWU6ICdRQ2FyZEFjdGlvbnMnLFxuXG4gIHByb3BzOiB7XG4gICAgLi4udXNlQWxpZ25Qcm9wcyxcbiAgICB2ZXJ0aWNhbDogQm9vbGVhblxuICB9LFxuXG4gIHNldHVwIChwcm9wcywgeyBzbG90cyB9KSB7XG4gICAgY29uc3QgYWxpZ25DbGFzcyA9IHVzZUFsaWduKHByb3BzKVxuXG4gICAgY29uc3QgY2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+XG4gICAgICBgcS1jYXJkX19hY3Rpb25zICR7IGFsaWduQ2xhc3MudmFsdWUgfWBcbiAgICAgICsgYCBxLWNhcmRfX2FjdGlvbnMtLSR7IHByb3BzLnZlcnRpY2FsID09PSB0cnVlID8gJ3ZlcnQgY29sdW1uJyA6ICdob3JpeiByb3cnIH1gXG4gICAgKVxuXG4gICAgcmV0dXJuICgpID0+IGgoJ2RpdicsIHsgY2xhc3M6IGNsYXNzZXMudmFsdWUgfSwgaFNsb3Qoc2xvdHMuZGVmYXVsdCkpXG4gIH1cbn0pXG4iLCJpbXBvcnQgeyBoLCBjb21wdXRlZCwgcmVmIH0gZnJvbSAndnVlJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAocHJvcHMsIHJvb3RSZWYpIHtcbiAgY29uc3QgcmVmb2N1c1JlZiA9IHJlZihudWxsKVxuXG4gIGNvbnN0IHJlZm9jdXNUYXJnZXRFbCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBpZiAocHJvcHMuZGlzYWJsZSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICByZXR1cm4gaCgnc3BhbicsIHtcbiAgICAgIHJlZjogcmVmb2N1c1JlZixcbiAgICAgIGNsYXNzOiAnbm8tb3V0bGluZScsXG4gICAgICB0YWJpbmRleDogLTFcbiAgICB9KVxuICB9KVxuXG4gIGZ1bmN0aW9uIHJlZm9jdXNUYXJnZXQgKGUpIHtcbiAgICBjb25zdCByb290ID0gcm9vdFJlZi52YWx1ZVxuXG4gICAgaWYgKGU/LnFBdm9pZEZvY3VzID09PSB0cnVlKSByZXR1cm5cblxuICAgIGlmIChlPy50eXBlLmluZGV4T2YoJ2tleScpID09PSAwKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IHJvb3RcbiAgICAgICAgJiYgcm9vdD8uY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkgPT09IHRydWVcbiAgICAgICkge1xuICAgICAgICByb290LmZvY3VzKClcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoXG4gICAgICByZWZvY3VzUmVmLnZhbHVlICE9PSBudWxsXG4gICAgICAmJiAoKGUgPT09IHZvaWQgMCkgfHwgKHJvb3Q/LmNvbnRhaW5zKGUudGFyZ2V0KSA9PT0gdHJ1ZSkpXG4gICAgKSB7XG4gICAgICByZWZvY3VzUmVmLnZhbHVlLmZvY3VzKClcbiAgICB9XG4gI
624H1cblxuICByZXR1cm4ge1xuICAgIHJlZm9jdXNUYXJnZXRFbCxcbiAgICByZWZvY3VzVGFyZ2V0XG4gIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IHtcbiAgeHM6IDMwLFxuICBzbTogMzUsXG4gIG1kOiA0MCxcbiAgbGc6IDUwLFxuICB4bDogNjBcbn1cbiIsImltcG9ydCB7IGgsIHJlZiwgY29tcHV0ZWQsIGdldEN1cnJlbnRJbnN0YW5jZSwgdG9SYXcgfSBmcm9tICd2dWUnXG5cbmltcG9ydCB1c2VEYXJrLCB7IHVzZURhcmtQcm9wcyB9IGZyb20gJy4uLy4uL2NvbXBvc2FibGVzL3ByaXZhdGUudXNlLWRhcmsvdXNlLWRhcmsuanMnXG5pbXBvcnQgdXNlU2l6ZSwgeyB1c2VTaXplUHJvcHMgfSBmcm9tICcuLi8uLi9jb21wb3NhYmxlcy9wcml2YXRlLnVzZS1zaXplL3VzZS1zaXplLmpzJ1xuaW1wb3J0IHVzZVJlZm9jdXNUYXJnZXQgZnJvbSAnLi4vLi4vY29tcG9zYWJsZXMvcHJpdmF0ZS51c2UtcmVmb2N1cy10YXJnZXQvdXNlLXJlZm9jdXMtdGFyZ2V0LmpzJ1xuaW1wb3J0IHsgdXNlRm9ybUluamVjdCwgdXNlRm9ybVByb3BzIH0gZnJvbSAnLi4vLi4vY29tcG9zYWJsZXMvdXNlLWZvcm0vcHJpdmF0ZS51c2UtZm9ybS5qcydcblxuaW1wb3J0IG9wdGlvblNpemVzIGZyb20gJy4uLy4uL3V0aWxzL3ByaXZhdGUub3B0aW9uLXNpemVzL29wdGlvbi1zaXplcy5qcydcbmltcG9ydCB7IHN0b3BBbmRQcmV2ZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvZXZlbnQvZXZlbnQuanMnXG5pbXBvcnQgeyBoU2xvdCwgaE1lcmdlU2xvdCB9IGZyb20gJy4uLy4uL3V0aWxzL3ByaXZhdGUucmVuZGVyL3JlbmRlci5qcydcblxuZXhwb3J0IGNvbnN0IHVzZUNoZWNrYm94UHJvcHMgPSB7XG4gIC4uLnVzZURhcmtQcm9wcyxcbiAgLi4udXNlU2l6ZVByb3BzLFxuICAuLi51c2VGb3JtUHJvcHMsXG5cbiAgbW9kZWxWYWx1ZToge1xuICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIGRlZmF1bHQ6IG51bGxcbiAgfSxcbiAgdmFsOiB7fSxcblxuICB0cnVlVmFsdWU6IHsgZGVmYXVsdDogdHJ1ZSB9LFxuICBmYWxzZVZhbHVlOiB7IGRlZmF1bHQ6IGZhbHNlIH0sXG4gIGluZGV0ZXJtaW5hdGVWYWx1ZTogeyBkZWZhdWx0OiBudWxsIH0sXG5cbiAgY2hlY2tlZEljb246IFN0cmluZyxcbiAgdW5jaGVja2VkSWNvbjogU3RyaW5nLFxuICBpbmRldGVybWluYXRlSWNvbjogU3RyaW5nLFxuXG4gIHRvZ2dsZU9yZGVyOiB7XG4gICAgdHlwZTogU3RyaW5nLFxuICAgIHZhbGlkYXRvcjogdiA9PiB2ID09PSAndGYnIHx8IHYgPT09ICdmdCdcbiAgfSxcbiAgdG9nZ2xlSW5kZXRlcm1pbmF0ZTogQm9vbGVhbixcblxuICBsYWJlbDogU3RyaW5nLFxuICBsZWZ0TGFiZWw6IEJvb2xlYW4sXG5cbiAgY29sb3I6IFN0cmluZyxcbiAga2VlcENvbG9yOiBCb29sZWFuLFxuICBkZW5zZTogQm9vbGVhbixcblxuICBkaXNhYmxlOiBCb29sZWFuLFxuICB0YWJpbmRleDogWyBTdHJpbmcsIE51bWJlciBdXG59XG5cbmV4cG9ydCBjb25zdCB1c2VDaGVja2JveEVtaXRzID0gWyAndXBkYXRlOm1vZGVsVmFsdWUnIF1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHR5cGUsIGdldElubmVyKSB7XG4gIGNvbnN0IHsgcHJvcHMsIHNsb3RzLCBlbWl0LCBwcm94eSB9ID0gZ2V0Q3VycmVudEluc3RhbmNlKClcbiAgY29uc3QgeyAkcSB9ID0gcHJveHlcblxuICBjb25zdCBpc0RhcmsgPSB1c2VEYXJrKHByb3BzLCAkcSlcblxuICBjb25zdCByb290UmVmID0gcmVmKG51bGwpXG4gIGNvbnN0IHsgcmVmb2N1c1RhcmdldEVsLCByZWZvY3VzVGFyZ2V0IH0gPSB1c2VSZWZvY3VzVGFyZ2V0KHByb3BzLCByb290UmVmKVxuICBjb25zdCBzaXplU3R5bGUgPSB1c2VTaXplKHByb3BzLCBvcHRpb25TaXplcylcblxuICBjb25zdCBtb2RlbElzQXJyYXkgPSBjb21wdXRlZCgoKSA9PlxuICAgIHByb3BzLnZhbCAhPT0gdm9pZCAwICYmIEFycmF5LmlzQXJyYXkocHJvcHMubW9kZWxWYWx1ZSlcbiAgKVxuXG4gIGNvbnN0IGluZGV4ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHZhbCA9IHRvUmF3KHByb3BzLnZhbClcbiAgICByZXR1cm4gbW9kZWxJc0FycmF5LnZhbHVlID09PSB0cnVlXG4gICAgICA/IHByb3BzLm1vZGVsVmFsdWUuZmluZEluZGV4KG9wdCA9PiB0b1JhdyhvcHQpID09PSB2YWwpXG4gICAgICA6IC0xXG4gIH0pXG5cbiAgY29uc3QgaXNUcnVlID0gY29tcHV0ZWQoKCkgPT4gKFxuICAgIG1vZGVsSXNBcnJheS52YWx1ZSA9PT0gdHJ1ZVxuICAgICAgPyBpbmRleC52YWx1ZSAhPT0gLTFcbiAgICAgIDogdG9SYXcocHJvcHMubW9kZWxWYWx1ZSkgPT09IHRvUmF3KHByb3BzLnRydWVWYWx1ZSlcbiAgKSlcblxuICBjb25zdCBpc0ZhbHNlID0gY29tcHV0ZWQoKCkgPT4gKFxuICAgIG1vZGVsSXNBcnJheS52YWx1ZSA9PT0gdHJ1ZVxuICAgICAgPyBpbmRleC52YWx1ZSA9PT0gLTFcbiAgICAgIDogdG9SYXcocHJvcHMubW9kZWxWYWx1ZSkgPT09IHRvUmF3KHByb3BzLmZhbHNlVmFsdWUpXG4gICkpXG5cbiAgY29uc3QgaXNJbmRldGVybWluYXRlID0gY29tcHV0ZWQoKCkgPT5cbiAgICBpc1RydWUudmFsdWUgPT09IGZhbHNlICYmIGlzRmFsc2UudmFsdWUgPT09IGZhbHNlXG4gIClcblxuICBjb25zdCB0YWJpbmRleCA9IGNvbXB1dGVkKCgpID0+IChcbiAgICBwcm9wcy5kaXNhYmxlID09PSB0cnVlID8gLTEgOiBwcm9wcy50YWJpbmRleCB8fCAwXG4gICkpXG5cbiAgY29uc3QgY2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+XG4gICAgYHEtJHsgdHlwZSB9IGN1cnNvci1wb2ludGVyIG5vLW91dGxpbmUgcm93IGlubGluZSBuby13cmFwIGl0ZW1zLWNlbnRlcmBcbiAgICArIChwcm9wcy5kaXNhYmxlID09PSB0cnVlID8gJyBkaXNhYmxlZCcgOiAnJylcbiAgICArIChpc0RhcmsudmFsdWUgPT09IHRydWUgPyBgIHEtJHsgdHlwZSB9LS1kYXJrYCA6ICcnKVxuICAgICsgKHByb3BzLmRlbnNlID09PSB0cnVlID8gYCBxLSR7IHR5cGUgfS0tZGVuc2VgIDogJycpXG4gICAgKyAocHJvcHMubGVmdExhYmVsID09PSB0cnVlID8gJyByZXZlcnNlJyA6ICcnKVxuICApXG5cbiAgY29uc3QgaW5uZXJDbGFzcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IGlzVHJ1ZS52YWx1ZSA9PT0gdHJ1ZSA/ICd0cnV0aHknIDogKGlzRmFsc2UudmFsdWUgPT09IHRydWUgPyAnZmFsc3knIDogJ2luZGV0JylcbiAgICBjb25zdCBjb2xvciA9IHByb3BzLmNvbG9yICE9PSB2b2lkIDAgJiYgKFxuICAgICAgcHJvcHMua2VlcENvbG9yID09PSB0cnVlXG4gICAgICB8fCAodHlwZSA9PT0gJ3RvZ2dsZScgPyBpc1RydWUudmFsdWUgPT09IHRydWUgOiBpc0ZhbHNlLnZhbHVlICE9PSB0cnVlKVxuICAgIClcbiAgICAgID8gYCB0ZXh0LSR7IHByb3BzLmNvbG9yIH1gXG4gICAgICA6ICcnXG5cbiAgICByZXR1cm4gYHEtJHsgdHlwZSB9X19pbm5lciByZWxhdGl2ZS1wb3NpdGlvbiBub24tc2VsZWN0YWJsZSBxLSR7IHR5cGUgfV9faW5uZXItLSR7IHN0YXRlIH0keyBjb2xvciB9YFxuICB9KVxuXG4gIGNvbnN0IGZvcm1BdHRycyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBwcm9wID0geyB0eXBlOiAnY2hlY2tib3gnIH1cblxuICAgI
624HByb3BzLm5hbWUgIT09IHZvaWQgMCAmJiBPYmplY3QuYXNzaWduKHByb3AsIHtcbiAgICAgIC8vIHNlZSBodHRwczovL3Z1ZWpzLm9yZy9ndWlkZS9leHRyYXMvcmVuZGVyLWZ1bmN0aW9uLmh0bWwjY3JlYXRpbmctdm5vZGVzICgucHJvcClcbiAgICAgICcuY2hlY2tlZCc6IGlzVHJ1ZS52YWx1ZSxcbiAgICAgICdeY2hlY2tlZCc6IGlzVHJ1ZS52YWx1ZSA9PT0gdHJ1ZSA/ICdjaGVja2VkJyA6IHZvaWQgMCxcbiAgICAgIG5hbWU6IHByb3BzLm5hbWUsXG4gICAgICB2YWx1ZTogbW9kZWxJc0FycmF5LnZhbHVlID09PSB0cnVlXG4gICAgICAgID8gcHJvcHMudmFsXG4gICAgICAgIDogcHJvcHMudHJ1ZVZhbHVlXG4gICAgfSlcblxuICAgIHJldHVybiBwcm9wXG4gIH0pXG5cbiAgY29uc3QgaW5qZWN0Rm9ybUlucHV0ID0gdXNlRm9ybUluamVjdChmb3JtQXR0cnMpXG5cbiAgY29uc3QgYXR0cmlidXRlcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBhdHRycyA9IHtcbiAgICAgIHRhYmluZGV4OiB0YWJpbmRleC52YWx1ZSxcbiAgICAgIHJvbGU6IHR5cGUgPT09ICd0b2dnbGUnID8gJ3N3aXRjaCcgOiAnY2hlY2tib3gnLFxuICAgICAgJ2FyaWEtbGFiZWwnOiBwcm9wcy5sYWJlbCxcbiAgICAgICdhcmlhLWNoZWNrZWQnOiBpc0luZGV0ZXJtaW5hdGUudmFsdWUgPT09IHRydWVcbiAgICAgICAgPyAnbWl4ZWQnXG4gICAgICAgIDogKGlzVHJ1ZS52YWx1ZSA9PT0gdHJ1ZSA/ICd0cnVlJyA6ICdmYWxzZScpXG4gICAgfVxuXG4gICAgaWYgKHByb3BzLmRpc2FibGUgPT09IHRydWUpIHtcbiAgICAgIGF0dHJzWyAnYXJpYS1kaXNhYmxlZCcgXSA9ICd0cnVlJ1xuICAgIH1cblxuICAgIHJldHVybiBhdHRyc1xuICB9KVxuXG4gIGZ1bmN0aW9uIG9uQ2xpY2sgKGUpIHtcbiAgICBpZiAoZSAhPT0gdm9pZCAwKSB7XG4gICAgICBzdG9wQW5kUHJldmVudChlKVxuICAgICAgcmVmb2N1c1RhcmdldChlKVxuICAgIH1cblxuICAgIGlmIChwcm9wcy5kaXNhYmxlICE9PSB0cnVlKSB7XG4gICAgICBlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIGdldE5leHRWYWx1ZSgpLCBlKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE5leHRWYWx1ZSAoKSB7XG4gICAgaWYgKG1vZGVsSXNBcnJheS52YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgaWYgKGlzVHJ1ZS52YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICBjb25zdCB2YWwgPSBwcm9wcy5tb2RlbFZhbHVlLnNsaWNlKClcbiAgICAgICAgdmFsLnNwbGljZShpbmRleC52YWx1ZSwgMSlcbiAgICAgICAgcmV0dXJuIHZhbFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJvcHMubW9kZWxWYWx1ZS5jb25jYXQoWyBwcm9wcy52YWwgXSlcbiAgICB9XG5cbiAgICBpZiAoaXNUcnVlLnZhbHVlID09PSB0cnVlKSB7XG4gICAgICBpZiAocHJvcHMudG9nZ2xlT3JkZXIgIT09ICdmdCcgfHwgcHJvcHMudG9nZ2xlSW5kZXRlcm1pbmF0ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHByb3BzLmZhbHNlVmFsdWVcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoaXNGYWxzZS52YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgaWYgKHByb3BzLnRvZ2dsZU9yZGVyID09PSAnZnQnIHx8IHByb3BzLnRvZ2dsZUluZGV0ZXJtaW5hdGUgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBwcm9wcy50cnVlVmFsdWVcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gcHJvcHMudG9nZ2xlT3JkZXIgIT09ICdmdCdcbiAgICAgICAgPyBwcm9wcy50cnVlVmFsdWVcbiAgICAgICAgOiBwcm9wcy5mYWxzZVZhbHVlXG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3BzLmluZGV0ZXJtaW5hdGVWYWx1ZVxuICB9XG5cbiAgZnVuY3Rpb24gb25LZXlkb3duIChlKSB7XG4gICAgaWYgKGUua2V5Q29kZSA9PT0gMTMgfHwgZS5rZXlDb2RlID09PSAzMikge1xuICAgICAgc3RvcEFuZFByZXZlbnQoZSlcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbktleXVwIChlKSB7XG4gICAgaWYgKGUua2V5Q29kZSA9PT0gMTMgfHwgZS5rZXlDb2RlID09PSAzMikge1xuICAgICAgb25DbGljayhlKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGdldElubmVyQ29udGVudCA9IGdldElubmVyKGlzVHJ1ZSwgaXNJbmRldGVybWluYXRlKVxuXG4gIC8vIGV4cG9zZSBwdWJsaWMgbWV0aG9kc1xuICBPYmplY3QuYXNzaWduKHByb3h5LCB7IHRvZ2dsZTogb25DbGljayB9KVxuXG4gIHJldHVybiAoKSA9PiB7XG4gICAgY29uc3QgaW5uZXIgPSBnZXRJbm5lckNvbnRlbnQoKVxuXG4gICAgcHJvcHMuZGlzYWJsZSAhPT0gdHJ1ZSAmJiBpbmplY3RGb3JtSW5wdXQoXG4gICAgICBpbm5lcixcbiAgICAgICd1bnNoaWZ0JyxcbiAgICAgIGAgcS0keyB0eXBlIH1fX25hdGl2ZSBhYnNvbHV0ZSBxLW1hLW5vbmUgcS1wYS1ub25lYFxuICAgIClcblxuICAgIGNvbnN0IGNoaWxkID0gW1xuICAgICAgaCgnZGl2Jywge1xuICAgICAgICBjbGFzczogaW5uZXJDbGFzcy52YWx1ZSxcbiAgICAgICAgc3R5bGU6IHNpemVTdHlsZS52YWx1ZSxcbiAgICAgICAgJ2FyaWEtaGlkZGVuJzogJ3RydWUnXG4gICAgICB9LCBpbm5lcilcbiAgICBdXG5cbiAgICBpZiAocmVmb2N1c1RhcmdldEVsLnZhbHVlICE9PSBudWxsKSB7XG4gICAgICBjaGlsZC5wdXNoKHJlZm9jdXNUYXJnZXRFbC52YWx1ZSlcbiAgICB9XG5cbiAgICBjb25zdCBsYWJlbCA9IHByb3BzLmxhYmVsICE9PSB2b2lkIDBcbiAgICAgID8gaE1lcmdlU2xvdChzbG90cy5kZWZh
624dWx0LCBbIHByb3BzLmxhYmVsIF0pXG4gICAgICA6IGhTbG90KHNsb3RzLmRlZmF1bHQpXG5cbiAgICBsYWJlbCAhPT0gdm9pZCAwICYmIGNoaWxkLnB1c2goXG4gICAgICBoKCdkaXYnLCB7XG4gICAgICAgIGNsYXNzOiBgcS0keyB0eXBlIH1fX2xhYmVsIHEtYW5jaG9yLS1za2lwYFxuICAgICAgfSwgbGFiZWwpXG4gICAgKVxuXG4gICAgcmV0dXJuIGgoJ2RpdicsIHtcbiAgICAgIHJlZjogcm9vdFJlZixcbiAgICAgIGNsYXNzOiBjbGFzc2VzLnZhbHVlLFxuICAgICAgLi4uYXR0cmlidXRlcy52YWx1ZSxcbiAgICAgIG9uQ2xpY2ssXG4gICAgICBvbktleWRvd24sXG4gICAgICBvbktleXVwXG4gICAgfSwgY2hpbGQpXG4gIH1cbn1cbiIsImltcG9ydCB7IGgsIGNvbXB1dGVkIH0gZnJvbSAndnVlJ1xuXG5pbXBvcnQgUUljb24gZnJvbSAnLi4vaWNvbi9RSWNvbi5qcydcblxuaW1wb3J0IHVzZUNoZWNrYm94LCB7IHVzZUNoZWNrYm94UHJvcHMsIHVzZUNoZWNrYm94RW1pdHMgfSBmcm9tICcuLi9jaGVja2JveC91c2UtY2hlY2tib3guanMnXG5cbmltcG9ydCB7IGNyZWF0ZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3V0aWxzL3ByaXZhdGUuY3JlYXRlL2NyZWF0ZS5qcydcblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlQ29tcG9uZW50KHtcbiAgbmFtZTogJ1FUb2dnbGUnLFxuXG4gIHByb3BzOiB7XG4gICAgLi4udXNlQ2hlY2tib3hQcm9wcyxcblxuICAgIGljb246IFN0cmluZyxcbiAgICBpY29uQ29sb3I6IFN0cmluZ1xuICB9LFxuXG4gIGVtaXRzOiB1c2VDaGVja2JveEVtaXRzLFxuXG4gIHNldHVwIChwcm9wcykge1xuICAgIGZ1bmN0aW9uIGdldElubmVyIChpc1RydWUsIGlzSW5kZXRlcm1pbmF0ZSkge1xuICAgICAgY29uc3QgaWNvbiA9IGNvbXB1dGVkKCgpID0+XG4gICAgICAgIChpc1RydWUudmFsdWUgPT09IHRydWVcbiAgICAgICAgICA/IHByb3BzLmNoZWNrZWRJY29uXG4gICAgICAgICAgOiAoaXNJbmRldGVybWluYXRlLnZhbHVlID09PSB0cnVlID8gcHJvcHMuaW5kZXRlcm1pbmF0ZUljb24gOiBwcm9wcy51bmNoZWNrZWRJY29uKVxuICAgICAgICApIHx8IHByb3BzLmljb25cbiAgICAgIClcblxuICAgICAgY29uc3QgY29sb3IgPSBjb21wdXRlZCgoKSA9PiAoaXNUcnVlLnZhbHVlID09PSB0cnVlID8gcHJvcHMuaWNvbkNvbG9yIDogbnVsbCkpXG5cbiAgICAgIHJldHVybiAoKSA9PiBbXG4gICAgICAgIGgoJ2RpdicsIHsgY2xhc3M6ICdxLXRvZ2dsZV9fdHJhY2snIH0pLFxuXG4gICAgICAgIGgoJ2RpdicsIHtcbiAgICAgICAgICBjbGFzczogJ3EtdG9nZ2xlX190aHVtYiBhYnNvbHV0ZSBmbGV4IGZsZXgtY2VudGVyIG5vLXdyYXAnXG4gICAgICAgIH0sIGljb24udmFsdWUgIT09IHZvaWQgMFxuICAgICAgICAgID8gW1xuICAgICAgICAgICAgICBoKFFJY29uLCB7XG4gICAgICAgICAgICAgICAgbmFtZTogaWNvbi52YWx1ZSxcbiAgICAgICAgICAgICAgICBjb2xvcjogY29sb3IudmFsdWVcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF1cbiAgICAgICAgICA6IHZvaWQgMFxuICAgICAgICApXG4gICAgICBdXG4gICAgfVxuXG4gICAgcmV0dXJuIHVzZUNoZWNrYm94KCd0b2dnbGUnLCBnZXRJbm5lcilcbiAgfVxufSlcbiIsImltcG9ydCB7IGgsIHJlZiwgY29tcHV0ZWQsIGdldEN1cnJlbnRJbnN0YW5jZSB9IGZyb20gJ3Z1ZSdcblxuaW1wb3J0IHsgY2xpZW50IH0gZnJvbSAnLi4vLi4vcGx1Z2lucy9wbGF0Zm9ybS9QbGF0Zm9ybS5qcydcbmltcG9ydCB7IHN0b3AsIHN0b3BBbmRQcmV2ZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvZXZlbnQvZXZlbnQuanMnXG5cbmZ1bmN0aW9uIGZpbHRlckZpbGVzIChmaWxlcywgcmVqZWN0ZWRGaWxlcywgZmFpbGVkUHJvcFZhbGlkYXRpb24sIGZpbHRlckZuKSB7XG4gIGNvbnN0IGFjY2VwdGVkRmlsZXMgPSBbXVxuXG4gIGZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gICAgaWYgKGZpbHRlckZuKGZpbGUpID09PSB0cnVlKSB7XG4gICAgICBhY2NlcHRlZEZpbGVzLnB1c2goZmlsZSlcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZWplY3RlZEZpbGVzLnB1c2goeyBmYWlsZWRQcm9wVmFsaWRhdGlvbiwgZmlsZSB9KVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gYWNjZXB0ZWRGaWxlc1xufVxuXG5mdW5jdGlvbiBzdG9wQW5kUHJldmVudERyYWcgKGUpIHtcbiAgaWYgKGU/LmRhdGFUcmFuc2Zlcikge1xuICAgIGUuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSdcbiAgfVxuXG4gIHN0b3BBbmRQcmV2ZW50KGUpXG59XG5cbmV4cG9ydCBjb25zdCB1c2VGaWxlUHJvcHMgPSB7XG4gIG11bHRpcGxlOiBCb29sZWFuLFxuICBhY2NlcHQ6IFN0cmluZyxcbiAgY2FwdHVyZTogU3RyaW5nLFxuICBtYXhGaWxlU2l6ZTogWyBOdW1iZXIsIFN0cmluZyBdLFxuICBtYXhUb3RhbFNpemU6IFsgTnVtYmVyLCBTdHJpbmcgXSxcbiAgbWF4RmlsZXM6IFsgTnVtYmVyLCBTdHJpbmcgXSxcbiAgZmlsdGVyOiBGdW5jdGlvblxufVxuXG5leHBvcnQgY29uc3QgdXNlRmlsZUVtaXRzID0gWyAncmVqZWN0ZWQnIF1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHtcbiAgZWRpdGFibGUsXG4gIGRuZCxcbiAgZ2V0RmlsZUlucHV0LFxuICBhZGRGaWxlc1RvUXVldWVcbn0pIHtcbiAgY29uc3QgeyBwcm9wcywgZW1pdCwgcHJveHkgfSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpXG5cbiAgY29uc3QgZG5kUmVmID0gcmVmKG51bGwpXG5cbiAgY29uc3QgZXh0ZW5zaW9ucyA9IGNvbXB1dGVkKCgpID0+IChcbiAgICBwcm9wcy5hY2NlcHQgIT09IHZvaWQgMFxuICAgICAgPyBwcm9wcy5hY2NlcHQuc3BsaXQoJywnKS5tYXAoZXh0ID0+IHtcbiAgICAgICAgZXh0ID0gZXh0LnRyaW0oKVxuICAgICAgICBpZiAoZXh0ID09PSAnKicpIHsgLy8gc3VwcG9ydCBcIipcIlxuICAgICAgICAgIHJldHVybiAnKi8nXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXh0LmVuZHNXaXRoKCcvKicpKSB7IC8vIHN1cHBvcnQgXCJpbWFnZS8qXCIgb3IgXCIqLypcIlxuICAgICAgICAgIGV4dCA9IGV4dC5zbGljZSgwLCBleHQubGVuZ3RoIC0gMSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXh0LnRvVXBwZXJDYXNlKClcbiAgICAgIH0pXG4gICAgICA6IG51bGxcbiAgKSlcblxuICBjb25zdCBtYXhGaWxlc051bWJlciA9IGNvbXB1dGVkKCgpID0+IHBhcnNlSW50KHByb3BzLm1heEZpbGVzLCAxMCkpXG4gIGNvbnN0IG1heFRvdGFsU2l6ZU51bWJlciA9IGNvbXB1dGVkKCgpID0+IHBhcnNlSW50KHByb3BzLm1heFRvdGFsU2l6ZSwgMTApKVxuXG4gIGZ1bmN0aW9uIHBpY2tGaWxlcyAoZSkge1xuICAgIGlmIChlZGl0YWJsZS52YWx1ZSkge1xuICAgICAgaWYgKGUgIT09IE9iamVjdChlKSkge1xuICAgICAgICBlID0geyB0YXJnZXQ6IG51bGwgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZS50YXJnZXQ/Lm1hdGNoZXMoJ2lucHV0W3R5cGU9XCJmaWxlXCJdJykgPT09IHRydWUpIHtcbiAgICAgICAgLy8gc3RvcCBwcm9wYWdhdGlvbiBpZiBpdCdzIG5vdCBhIHJlYWwgcG9pbnRlciBldmVudFxuICAgICAgICBlLmNsaWVudFggPT09IDAgJiYgZS5jbGllbnRZID09PSAwICYmIHN0b3AoZSlcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGdldEZpbGVJbnB1dCgpXG4gICAgICAgIGlmIChpbnB1dCAhPT0gZS50YXJnZXQpIGlucHV0Py5jbGljayhlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZEZpbGVzIChmaWxlcykge1xuICAgIGlmIChlZGl0YWJsZS52YWx1ZSAmJiBmaWxlcykge1xuICAgICAgYWRkRmlsZXNUb1F1ZXVlKG51bGwsIGZpbGVzKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NGaWxlcyAoZSwgZmlsZXNUb1Byb2Nlc3MsIGN1cnJlbnRGaWxlTGlzdCwgYXBwZW5kKSB7XG4gICAgbGV0IGZpbGVzID0gQXJyYXkuZnJvbShmaWxlc1RvUHJvY2VzcyB8fCBlLnRhcmdldC5maWxlcylcbiAgICBjb25zdCByZWplY3RlZEZpbGVzID0gW11cblxuICAgIGNvbnN0IGRvbmUgPSAoKSA9PiB7XG4gICAgICBpZiAocmVqZWN0ZWRGaWxlcy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgZW1pdCgncmVqZWN0ZWQnLCByZWplY3RlZEZpbGVzKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGZpbHRlciBmaWxlIHR5cGVzXG4gICAgaWYgKHByb3BzLmFjY2VwdCAhPT0gdm9pZCAwICYmIGV4dGVuc2lvbnMudmFsdWUuaW5kZXhPZignKi8nKSA9PT0gLTEpIHtcbiAgICAgIGZpbGVzID0gZmlsdGVyRmlsZXMoZmlsZXMsIHJlamVjdGVkRmlsZXMsICdhY2NlcHQnLCBmaWxlID0+IHtcbiAgICAgICAgcmV0dXJuIGV4dGVuc2lvbnMudmFsdWUuc29tZShleHQgPT4gKFxuICAgICAgICAgIGZpbGUudHlwZS50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoZXh0KVxuICAgICAgICAgI
624Hx8IGZpbGUubmFtZS50b1VwcGVyQ2FzZSgpLmVuZHNXaXRoKGV4dClcbiAgICAgICAgKSlcbiAgICAgIH0pXG5cbiAgICAgIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHsgcmV0dXJuIGRvbmUoKSB9XG4gICAgfVxuXG4gICAgLy8gZmlsdGVyIG1heCBmaWxlIHNpemVcbiAgICBpZiAocHJvcHMubWF4RmlsZVNpemUgIT09IHZvaWQgMCkge1xuICAgICAgY29uc3QgbWF4RmlsZVNpemUgPSBwYXJzZUludChwcm9wcy5tYXhGaWxlU2l6ZSwgMTApXG4gICAgICBmaWxlcyA9IGZpbHRlckZpbGVzKGZpbGVzLCByZWplY3RlZEZpbGVzLCAnbWF4LWZpbGUtc2l6ZScsIGZpbGUgPT4ge1xuICAgICAgICByZXR1cm4gZmlsZS5zaXplIDw9IG1heEZpbGVTaXplXG4gICAgICB9KVxuXG4gICAgICBpZiAoZmlsZXMubGVuZ3RoID09PSAwKSB7IHJldHVybiBkb25lKCkgfVxuICAgIH1cblxuICAgIC8vIENvcmRvdmEvaU9TIGFsbG93cyBzZWxlY3RpbmcgbXVsdGlwbGUgZmlsZXMgZXZlbiB3aGVuIHRoZVxuICAgIC8vIG11bHRpcGxlIGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkLiBXZSBhbHNvIG5vcm1hbGl6ZSBkcmFnJ24nZHJvcHBlZFxuICAgIC8vIGZpbGVzIGhlcmU6XG4gICAgaWYgKHByb3BzLm11bHRpcGxlICE9PSB0cnVlICYmIGZpbGVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgZmlsZXMgPSBbIGZpbGVzWyAwIF0gXVxuICAgIH1cblxuICAgIC8vIENvbXB1dGUga2V5IHRvIHVzZSBmb3IgZWFjaCBmaWxlXG4gICAgZmlsZXMuZm9yRWFjaChmaWxlID0+IHtcbiAgICAgIGZpbGUuX19rZXkgPSBmaWxlLndlYmtpdFJlbGF0aXZlUGF0aCArIGZpbGUubGFzdE1vZGlmaWVkICsgZmlsZS5uYW1lICsgZmlsZS5zaXplXG4gICAgfSlcblxuICAgIGlmIChhcHBlbmQgPT09IHRydWUpIHtcbiAgICAgIC8vIEF2b2lkIGR1cGxpY2F0ZSBmaWxlc1xuICAgICAgY29uc3QgZmlsZW5hbWVNYXAgPSBjdXJyZW50RmlsZUxpc3QubWFwKGVudHJ5ID0+IGVudHJ5Ll9fa2V5KVxuICAgICAgZmlsZXMgPSBmaWx0ZXJGaWxlcyhmaWxlcywgcmVqZWN0ZWRGaWxlcywgJ2R1cGxpY2F0ZScsIGZpbGUgPT4ge1xuICAgICAgICByZXR1cm4gZmlsZW5hbWVNYXAuaW5jbHVkZXMoZmlsZS5fX2tleSkgPT09IGZhbHNlXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHsgcmV0dXJuIGRvbmUoKSB9XG5cbiAgICBpZiAocHJvcHMubWF4VG90YWxTaXplICE9PSB2b2lkIDApIHtcbiAgICAgIGxldCBzaXplID0gYXBwZW5kID09PSB0cnVlXG4gICAgICAgID8gY3VycmVudEZpbGVMaXN0LnJlZHVjZSgodG90YWwsIGZpbGUpID0+IHRvdGFsICsgZmlsZS5zaXplLCAwKVxuICAgICAgICA6IDBcblxuICAgICAgZmlsZXMgPSBmaWx0ZXJGaWxlcyhmaWxlcywgcmVqZWN0ZWRGaWxlcywgJ21heC10b3RhbC1zaXplJywgZmlsZSA9PiB7XG4gICAgICAgIHNpemUgKz0gZmlsZS5zaXplXG4gICAgICAgIHJldHVybiBzaXplIDw9IG1heFRvdGFsU2l6ZU51bWJlci52YWx1ZVxuICAgICAgfSlcblxuICAgICAgaWYgKGZpbGVzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gZG9uZSgpIH1cbiAgICB9XG5cbiAgICAvLyBkbyB3ZSBoYXZlIGN1c3RvbSBmaWx0ZXIgZnVuY3Rpb24/XG4gICAgaWYgKHR5cGVvZiBwcm9wcy5maWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IGZpbHRlcmVkRmlsZXMgPSBwcm9wcy5maWx0ZXIoZmlsZXMpXG4gICAgICBmaWxlcyA9IGZpbHRlckZpbGVzKGZpbGVzLCByZWplY3RlZEZpbGVzLCAnZmlsdGVyJywgZmlsZSA9PiB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJlZEZpbGVzLmluY2x1ZGVzKGZpbGUpXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChwcm9wcy5tYXhGaWxlcyAhPT0gdm9pZCAwKSB7XG4gICAgICBsZXQgZmlsZXNOdW1iZXIgPSBhcHBlbmQgPT09IHRydWVcbiAgICAgICAgPyBjdXJyZW50RmlsZUxpc3QubGVuZ3RoXG4gICAgICAgIDogMFxuXG4gICAgICBmaWxlcyA9IGZpbHRlckZpbGVzKGZpbGVzLCByZWplY3RlZEZpbGVzLCAnbWF4LWZpbGVzJywgKCkgPT4ge1xuICAgICAgICBmaWxlc051bWJlcisrXG4gICAgICAgIHJldHVybiBmaWxlc051bWJlciA8PSBtYXhGaWxlc051bWJlci52YWx1ZVxuICAgICAgfSlcblxuICAgICAgaWYgKGZpbGVzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gZG9uZSgpIH1cbiAgICB9XG5cbiAgICBkb25lKClcblxuICAgIGlmIChmaWxlcy5sZW5ndGggIT09IDApIHtcbiAgICAgIHJldHVybiBmaWxlc1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uRHJhZ292ZXIgKGUpIHtcbiAgICBzdG9wQW5kUHJldmVudERyYWcoZSlcbiAgICBkbmQudmFsdWUgIT09IHRydWUgJiYgKGRuZC52YWx1ZSA9IHRydWUpXG4gIH1cblxuICBmdW5jdGlvbiBvbkRyYWdsZWF2ZSAoZSkge1xuICAgIHN0b3BBbmRQcmV2ZW50KGUpXG5cbiAgICAvLyBTYWZhcmkgYnVnOiByZWxhdGVkVGFyZ2V0IGlzIG51bGwgZm9yIG92ZXIgMTAgeWVhcnNcbiAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY1NDdcbiAgICBjb25zdCBnb25lID0gZS5yZWxhdGVkVGFyZ2V0ICE9PSBudWxsIHx8IGNsaWVudC5pcy5zYWZhcmkgIT09IHRydWVcbiAgICAgID8gZS5yZWxhdGVkVGFyZ2V0ICE9PSBkbmRSZWYudmFsdWVcbiAgICAgIDogZG9jdW1lbnQuZWxlbWVudHNGcm9tUG9pbnQoZS5jbGllbnRYLCBlLmNsaWVudFkpLmluY2x1ZGVzKGRuZFJlZi52YWx1ZSkgPT09IGZhbHNlXG5cbiAgICBnb25lID09PSB0cnVlICYmIChkbmQudmFsdWUgPSBmYWxzZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uRHJvcCAoZSkge1xuICAgIHN0b3BBbmRQcmV2ZW50RHJhZyhlKVxuICAgIGNvbnN0IGZpbGVzID0gZS5kYXRhVHJhbnNmZXIuZmlsZXNcblxuICAgIGlmIChmaWxlcy5sZW5ndGggIT09IDApIHtcbiAgICAgIGFkZEZpbGVzVG9RdWV1ZShudWxsLCBmaWxlcylcbiAgICB9XG5cbiAgICBkbmQudmFsdWUgPSBmYWxzZVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RG5kTm9kZSAodHlwZSkge1xuICAgIGlmIChkbmQudmFsdWUgPT09IHRydWUpIHtcbiAgICAgIHJldHVybi
624BoKCdkaXYnLCB7XG4gICAgICAgIHJlZjogZG5kUmVmLFxuICAgICAgICBjbGFzczogYHEtJHsgdHlwZSB9X19kbmQgYWJzb2x1dGUtZnVsbGAsXG4gICAgICAgIG9uRHJhZ2VudGVyOiBzdG9wQW5kUHJldmVudERyYWcsXG4gICAgICAgIG9uRHJhZ292ZXI6IHN0b3BBbmRQcmV2ZW50RHJhZyxcbiAgICAgICAgb25EcmFnbGVhdmUsXG4gICAgICAgIG9uRHJvcFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvLyBleHBvc2UgcHVibGljIG1ldGhvZHNcbiAgT2JqZWN0LmFzc2lnbihwcm94eSwgeyBwaWNrRmlsZXMsIGFkZEZpbGVzIH0pXG5cbiAgcmV0dXJuIHtcbiAgICBwaWNrRmlsZXMsXG4gICAgYWRkRmlsZXMsXG4gICAgb25EcmFnb3ZlcixcbiAgICBvbkRyYWdsZWF2ZSxcbiAgICBwcm9jZXNzRmlsZXMsXG4gICAgZ2V0RG5kTm9kZSxcblxuICAgIG1heEZpbGVzTnVtYmVyLFxuICAgIG1heFRvdGFsU2l6ZU51bWJlclxuICB9XG59XG4iLCJpbXBvcnQgeyBoLCByZWYsIGNvbXB1dGVkLCBnZXRDdXJyZW50SW5zdGFuY2UgfSBmcm9tICd2dWUnXG5cbmltcG9ydCBRQ2hpcCBmcm9tICcuLi9jaGlwL1FDaGlwLmpzJ1xuXG5pbXBvcnQgdXNlRmllbGQsIHsgdXNlRmllbGRTdGF0ZSwgdXNlTm9uSW5wdXRGaWVsZFByb3BzLCB1c2VGaWVsZEVtaXRzLCBmaWVsZFZhbHVlSXNGaWxsZWQgfSBmcm9tICcuLi8uLi9jb21wb3NhYmxlcy9wcml2YXRlLnVzZS1maWVsZC91c2UtZmllbGQuanMnXG5pbXBvcnQgeyB1c2VGb3JtUHJvcHMsIHVzZUZvcm1JbnB1dE5hbWVBdHRyIH0gZnJvbSAnLi4vLi4vY29tcG9zYWJsZXMvdXNlLWZvcm0vcHJpdmF0ZS51c2UtZm9ybS5qcydcbmltcG9ydCB1c2VGaWxlLCB7IHVzZUZpbGVQcm9wcywgdXNlRmlsZUVtaXRzIH0gZnJvbSAnLi4vLi4vY29tcG9zYWJsZXMvcHJpdmF0ZS51c2UtZmlsZS91c2UtZmlsZS5qcydcbmltcG9ydCB1c2VGaWxlRm9ybURvbVByb3BzIGZyb20gJy4uLy4uL2NvbXBvc2FibGVzL3ByaXZhdGUudXNlLWZpbGUvdXNlLWZpbGUtZG9tLXByb3BzLmpzJ1xuXG5pbXBvcnQgeyBjcmVhdGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi91dGlscy9wcml2YXRlLmNyZWF0ZS9jcmVhdGUuanMnXG5pbXBvcnQgeyBodW1hblN0b3JhZ2VTaXplIH0gZnJvbSAnLi4vLi4vdXRpbHMvZm9ybWF0L2Zvcm1hdC5qcydcbmltcG9ydCB7IHByZXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy9ldmVudC9ldmVudC5qcydcbmltcG9ydCB7IGluamVjdFByb3AgfSBmcm9tICcuLi8uLi91dGlscy9wcml2YXRlLmluamVjdC1vYmotcHJvcC9pbmplY3Qtb2JqLXByb3AuanMnXG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUNvbXBvbmVudCh7XG4gIG5hbWU6ICdRRmlsZScsXG5cbiAgaW5oZXJpdEF0dHJzOiBmYWxzZSxcblxuICBwcm9wczoge1xuICAgIC4uLnVzZU5vbklucHV0RmllbGRQcm9wcyxcbiAgICAuLi51c2VGb3JtUHJvcHMsXG4gICAgLi4udXNlRmlsZVByb3BzLFxuXG4gICAgLyogU1NSIGRvZXMgbm90IGtub3cgYWJvdXQgRmlsZSAmIEZpbGVMaXN0ICovXG4gICAgbW9kZWxWYWx1ZTogX19RVUFTQVJfU1NSX1NFUlZFUl9fXG4gICAgICA/IHt9XG4gICAgICA6IFsgRmlsZSwgRmlsZUxpc3QsIEFycmF5IF0sXG5cbiAgICBhcHBlbmQ6IEJvb2xlYW4sXG4gICAgdXNlQ2hpcHM6IEJvb2xlYW4sXG4gICAgZGlzcGxheVZhbHVlOiBbIFN0cmluZywgTnVtYmVyIF0sXG5cbiAgICB0YWJpbmRleDoge1xuICAgICAgdHlwZTogWyBTdHJpbmcsIE51bWJlciBdLFxuICAgICAgZGVmYXVsdDogMFxuICAgIH0sXG5cbiAgICBjb3VudGVyTGFiZWw6IEZ1bmN0aW9uLFxuXG4gICAgaW5wdXRDbGFzczogWyBBcnJheSwgU3RyaW5nLCBPYmplY3QgXSxcbiAgICBpbnB1dFN0eWxlOiBbIEFycmF5LCBTdHJpbmcsIE9iamVjdCBdXG4gIH0sXG5cbiAgZW1pdHM6IFtcbiAgICAuLi51c2VGaWVsZEVtaXRzLFxuICAgIC4uLnVzZUZpbGVFbWl0c1xuICBdLFxuXG4gIHNldHVwIChwcm9wcywgeyBzbG90cywgZW1pdCwgYXR0cnMgfSkge1xuICAgIGNvbnN0IHsgcHJveHkgfSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpXG5cbiAgICBjb25zdCBzdGF0ZSA9IHVzZUZpZWxkU3RhdGUoKVxuXG4gICAgY29uc3QgaW5wdXRSZWYgPSByZWYobnVsbClcbiAgICBjb25zdCBkbmQgPSByZWYoZmFsc2UpXG4gICAgY29uc3QgbmFtZVByb3AgPSB1c2VGb3JtSW5wdXROYW1lQXR0cihwcm9wcylcblxuICAgIGNvbnN0IHtcbiAgICAgIHBpY2tGaWxlcyxcbiAgICAgIG9uRHJhZ292ZXIsXG4gICAgICBvbkRyYWdsZWF2ZSxcbiAgICAgIHByb2Nlc3NGaWxlcyxcbiAgICAgIGdldERuZE5vZGVcbiAgICB9ID0gdXNlRmlsZSh7IGVkaXRhYmxlOiBzdGF0ZS5lZGl0YWJsZSwgZG5kLCBnZXRGaWxlSW5wdXQsIGFkZEZpbGVzVG9RdWV1ZSB9KVxuXG4gICAgY29uc3QgZm9ybURvbVByb3BzID0gdXNlRmlsZUZvcm1Eb21Qcm9wcyhwcm9wcylcblxuICAgIGNvbnN0IGlubmVyVmFsdWUgPSBjb21wdXRlZCgoKSA9PiAoXG4gICAgICBPYmplY3QocHJvcHMubW9kZWxWYWx1ZSkgPT09IHByb3BzLm1vZGVsVmFsdWVcbiAgICAgICAgPyAoJ2xlbmd0aCcgaW4gcHJvcHMubW9kZWxWYWx1ZSA/IEFycmF5LmZyb20ocHJvcHMubW9kZWxWYWx1ZSkgOiBbIHByb3BzLm1vZGVsVmFsdWUgXSlcbiAgICAgICAgOiBbXVxuICAgICkpXG5cbiAgICBjb25zdCBoYXNWYWx1ZSA9IGNvbXB1dGVkKCgpID0+IGZpZWxkVmFsdWVJc0ZpbGxlZChpbm5lclZhbHVlLnZhbHVlKSlcblxuICAgIGNvbnN0IHNlbGVjdGVkU3RyaW5nID0gY29tcHV0ZWQoKCkgPT5cbiAgICAgIGlubmVyVmFsdWUudmFsdWVcbiAgICAgICAgLm1hcChmaWxlID0+IGZpbGUubmFtZSlcbiAgICAgICAgLmpvaW4oJywgJylcbiAgICApXG5cbiAgICBjb25zdCB0b3RhbFNpemUgPSBjb21wdXRlZCgoKSA9PlxuICAgICAgaHVtYW5TdG9yYWdlU2l6ZShcbiAgICAgICAgaW5uZXJWYWx1ZS52YWx1ZS5yZWR1Y2UoKGFjYywgZmlsZSkgPT4gYWNjICsgZmlsZS5zaXplLCAwKVxuICAgICAgKVxuICAgIClcblxuICAgIGNvbnN0IGNvdW50ZXJQcm9wcyA9IGNvbXB1dGVkKCgpID0+ICh7XG4gICAgICB0b3RhbFNpemU6IHRvdGFsU2l6ZS52YWx1ZSxcbiAgICAgIGZpbGVzTnVtYmVyOiBpbm5lclZhbHVlLnZhbHVlLmxlbmd0aCxcbiAgICAgIG1heEZpbGVzOiBwcm9wcy5tYXhGaWxlc1xuICAgIH0pKVxuXG4gICAgY29uc3QgaW5wdXRBdHRycyA9IGNvbXB1dGVkKCgpID0+ICh7XG4gICAgICB0YWJpbmRleDogLTEsXG4gICAgICB0eX
624BlOiAnZmlsZScsXG4gICAgICB0aXRsZTogJycsIC8vIHRyeSB0byByZW1vdmUgZGVmYXVsdCB0b29sdGlwLFxuICAgICAgYWNjZXB0OiBwcm9wcy5hY2NlcHQsXG4gICAgICBjYXB0dXJlOiBwcm9wcy5jYXB0dXJlLFxuICAgICAgbmFtZTogbmFtZVByb3AudmFsdWUsXG4gICAgICAuLi5hdHRycyxcbiAgICAgIGlkOiBzdGF0ZS50YXJnZXRVaWQudmFsdWUsXG4gICAgICBkaXNhYmxlZDogc3RhdGUuZWRpdGFibGUudmFsdWUgIT09IHRydWVcbiAgICB9KSlcblxuICAgIGNvbnN0IGZpZWxkQ2xhc3MgPSBjb21wdXRlZCgoKSA9PlxuICAgICAgJ3EtZmlsZSBxLWZpZWxkLS1hdXRvLWhlaWdodCdcbiAgICAgICsgKGRuZC52YWx1ZSA9PT0gdHJ1ZSA/ICcgcS1maWxlLS1kbmQnIDogJycpXG4gICAgKVxuXG4gICAgY29uc3QgaXNBcHBlbmRpbmcgPSBjb21wdXRlZCgoKSA9PlxuICAgICAgcHJvcHMubXVsdGlwbGUgPT09IHRydWUgJiYgcHJvcHMuYXBwZW5kID09PSB0cnVlXG4gICAgKVxuXG4gICAgZnVuY3Rpb24gcmVtb3ZlQXRJbmRleCAoaW5kZXgpIHtcbiAgICAgIGNvbnN0IGZpbGVzID0gaW5uZXJWYWx1ZS52YWx1ZS5zbGljZSgpXG4gICAgICBmaWxlcy5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICBlbWl0VmFsdWUoZmlsZXMpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVtb3ZlRmlsZSAoZmlsZSkge1xuICAgICAgY29uc3QgaW5kZXggPSBpbm5lclZhbHVlLnZhbHVlLmluZGV4T2YoZmlsZSlcbiAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgcmVtb3ZlQXRJbmRleChpbmRleClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlbWl0VmFsdWUgKGZpbGVzKSB7XG4gICAgICBlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIHByb3BzLm11bHRpcGxlID09PSB0cnVlID8gZmlsZXMgOiBmaWxlc1sgMCBdKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uS2V5ZG93biAoZSkge1xuICAgICAgLy8gcHJldmVudCBmb3JtIHN1Ym1pdCBpZiBFTlRFUiBpcyBwcmVzc2VkXG4gICAgICBlLmtleUNvZGUgPT09IDEzICYmIHByZXZlbnQoZSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbktleXVwIChlKSB7XG4gICAgICAvLyBvbmx5IG9uIEVOVEVSIGFuZCBTUEFDRSB0byBtYXRjaCBuYXRpdmUgaW5wdXQgZmllbGRcbiAgICAgIGlmIChlLmtleUNvZGUgPT09IDEzIHx8IGUua2V5Q29kZSA9PT0gMzIpIHtcbiAgICAgICAgcGlja0ZpbGVzKGUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RmlsZUlucHV0ICgpIHtcbiAgICAgIHJldHVybiBpbnB1dFJlZi52YWx1ZVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZEZpbGVzVG9RdWV1ZSAoZSwgZmlsZUxpc3QpIHtcbiAgICAgIGNvbnN0IGZpbGVzID0gcHJvY2Vzc0ZpbGVzKGUsIGZpbGVMaXN0LCBpbm5lclZhbHVlLnZhbHVlLCBpc0FwcGVuZGluZy52YWx1ZSlcbiAgICAgIGNvbnN0IGZpbGVJbnB1dCA9IGdldEZpbGVJbnB1dCgpXG5cbiAgICAgIGlmIChmaWxlSW5wdXQgIT09IHZvaWQgMCAmJiBmaWxlSW5wdXQgIT09IG51bGwpIHtcbiAgICAgICAgZmlsZUlucHV0LnZhbHVlID0gJydcbiAgICAgIH1cblxuICAgICAgLy8gaWYgbm90aGluZyB0byBkby4uLlxuICAgICAgaWYgKGZpbGVzID09PSB2b2lkIDApIHJldHVyblxuXG4gICAgICAvLyBwcm90ZWN0IGFnYWluc3QgaW5wdXQgQGNoYW5nZSBiZWluZyBjYWxsZWQgaW4gYSBsb29wXG4gICAgICAvLyBsaWtlIGl0IGhhcHBlbnMgb24gU2FmYXJpLCBzbyBkb24ndCBlbWl0IHNhbWUgdGhpbmc6XG4gICAgICBpZiAoXG4gICAgICAgIHByb3BzLm11bHRpcGxlID09PSB0cnVlXG4gICAgICAgICAgPyBwcm9wcy5tb2RlbFZhbHVlICYmIGZpbGVzLmV2ZXJ5KGYgPT4gaW5uZXJWYWx1ZS52YWx1ZS5pbmNsdWRlcyhmKSlcbiAgICAgICAgICA6IHByb3BzLm1vZGVsVmFsdWUgPT09IGZpbGVzWyAwIF1cbiAgICAgICkgcmV0dXJuXG5cbiAgICAgIGVtaXRWYWx1ZShcbiAgICAgICAgaXNBcHBlbmRpbmcudmFsdWUgPT09IHRydWVcbiAgICAgICAgICA/IGlubmVyVmFsdWUudmFsdWUuY29uY2F0KGZpbGVzKVxuICAgICAgICAgIDogZmlsZXNcbiAgICAgIClcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRGaWxsZXIgKCkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgaCgnaW5wdXQnLCB7XG4gICAgICAgICAgY2xhc3M6IFsgcHJvcHMuaW5wdXRDbGFzcywgJ3EtZmlsZV9fZmlsbGVyJyBdLFxuICAgICAgICAgIHN0eWxlOiBwcm9wcy5pbnB1dFN0eWxlXG4gICAgICAgIH0pXG4gICAgICBdXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2VsZWN0aW9uICgpIHtcbiAgICAgIGlmIChzbG90cy5maWxlICE9PSB2b2lkIDApIHtcbiAgICAgICAgcmV0dXJuIGlubmVyVmFsdWUudmFsdWUubGVuZ3RoID09PSAwXG4gICAgICAgICAgPyBnZXRGaWxsZXIoKVxuICAgICAgICAgIDogaW5uZXJWYWx1ZS52YWx1ZS5tYXAoXG4gICAgICAgICAgICAoZmlsZSwgaW5kZXgpID0+IHNsb3RzLmZpbGUoeyBpbmRleCwgZmlsZSwgcmVmOiB0aGlzIH0pXG4gICAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBpZiAoc2xvdHMuc2VsZWN0ZWQgIT09IHZvaWQgMCkge1xuICAgICAgICByZXR1cm4gaW5uZXJWYWx1ZS52YWx1ZS5sZW5ndGggPT09IDBcbiAgICAgICAgICA/IGdldEZpbGxlcigpXG4gICAgICAgICAgOiBzbG90cy5zZWxlY3RlZCh7IGZpbGVzOiBpbm5lclZhbHVlLnZhbHVlLCByZWY6IHRoaXMgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLnVzZUNoaXBzID09PSB0cnVlKSB7XG4gICAgICAgIHJldHVybiBpbm5lclZhbHVlLnZhbHVlLmxlbmd0aCA9PT0gMFxuICAgICAgICAgID8gZ2V0RmlsbGVyKClcbiAgICAgICAgICA6IGlubmVyVmFsdWUudmFsdWUubWFwKChmaWxlLCBpKSA9PiBoKFFDaGlwLCB7XG4gICAgICAgICAgICBrZXk6ICdmaWxlLScgKyBpLFxuICAgICAgICAgICAgcmVtb3ZhYmxlOiBzdGF0ZS5lZGl0YWJsZS52YWx1ZSxcbiAgICAgICAgICAgIGRlbnNlOiB0cnVlLFxuICAgICAgICAgICAgdGV4dENvbG9yOiBwcm9wcy5jb2xvcixcbiAgICAgICAgICAgIHRhYmluZGV4OiBwcm9wcy50YWJpbmRleCxcbiAgICAgICAgICAgIG9uUmVtb3ZlOiAoKSA9PiB7IHJlbW92ZUF0SW5kZXgoaSkgfVxuICAgICAgICAgI
624H0sICgpID0+IGgoJ3NwYW4nLCB7XG4gICAgICAgICAgICBjbGFzczogJ2VsbGlwc2lzJyxcbiAgICAgICAgICAgIHRleHRDb250ZW50OiBmaWxlLm5hbWVcbiAgICAgICAgICB9KSkpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRleHRDb250ZW50ID0gcHJvcHMuZGlzcGxheVZhbHVlICE9PSB2b2lkIDBcbiAgICAgICAgPyBwcm9wcy5kaXNwbGF5VmFsdWVcbiAgICAgICAgOiBzZWxlY3RlZFN0cmluZy52YWx1ZVxuXG4gICAgICByZXR1cm4gdGV4dENvbnRlbnQubGVuZ3RoICE9PSAwXG4gICAgICAgID8gW1xuICAgICAgICAgICAgaCgnZGl2Jywge1xuICAgICAgICAgICAgICBjbGFzczogcHJvcHMuaW5wdXRDbGFzcyxcbiAgICAgICAgICAgICAgc3R5bGU6IHByb3BzLmlucHV0U3R5bGUsXG4gICAgICAgICAgICAgIHRleHRDb250ZW50XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIF1cbiAgICAgICAgOiBnZXRGaWxsZXIoKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldElucHV0ICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgIHJlZjogaW5wdXRSZWYsXG4gICAgICAgIC4uLmlucHV0QXR0cnMudmFsdWUsXG4gICAgICAgIC4uLmZvcm1Eb21Qcm9wcy52YWx1ZSxcbiAgICAgICAgY2xhc3M6ICdxLWZpZWxkX19pbnB1dCBmaXQgYWJzb2x1dGUtZnVsbCBjdXJzb3ItcG9pbnRlcicsXG4gICAgICAgIG9uQ2hhbmdlOiBhZGRGaWxlc1RvUXVldWVcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLm11bHRpcGxlID09PSB0cnVlKSB7XG4gICAgICAgIGRhdGEubXVsdGlwbGUgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBoKCdpbnB1dCcsIGRhdGEpXG4gICAgfVxuXG4gICAgT2JqZWN0LmFzc2lnbihzdGF0ZSwge1xuICAgICAgZmllbGRDbGFzcyxcbiAgICAgIGVtaXRWYWx1ZSxcbiAgICAgIGhhc1ZhbHVlLFxuICAgICAgaW5wdXRSZWYsXG4gICAgICBpbm5lclZhbHVlLFxuXG4gICAgICBmbG9hdGluZ0xhYmVsOiBjb21wdXRlZCgoKSA9PlxuICAgICAgICBoYXNWYWx1ZS52YWx1ZSA9PT0gdHJ1ZVxuICAgICAgICB8fCBmaWVsZFZhbHVlSXNGaWxsZWQocHJvcHMuZGlzcGxheVZhbHVlKVxuICAgICAgKSxcblxuICAgICAgY29tcHV0ZWRDb3VudGVyOiBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGlmIChwcm9wcy5jb3VudGVyTGFiZWwgIT09IHZvaWQgMCkge1xuICAgICAgICAgIHJldHVybiBwcm9wcy5jb3VudGVyTGFiZWwoY291bnRlclByb3BzLnZhbHVlKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWF4ID0gcHJvcHMubWF4RmlsZXNcbiAgICAgICAgcmV0dXJuIGAkeyBpbm5lclZhbHVlLnZhbHVlLmxlbmd0aCB9JHsgbWF4ICE9PSB2b2lkIDAgPyAnIC8gJyArIG1heCA6ICcnIH0gKCR7IHRvdGFsU2l6ZS52YWx1ZSB9KWBcbiAgICAgIH0pLFxuXG4gICAgICBnZXRDb250cm9sQ2hpbGQ6ICgpID0+IGdldERuZE5vZGUoJ2ZpbGUnKSxcbiAgICAgIGdldENvbnRyb2w6ICgpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICByZWY6IHN0YXRlLnRhcmdldFJlZixcbiAgICAgICAgICBjbGFzczogJ3EtZmllbGRfX25hdGl2ZSByb3cgaXRlbXMtY2VudGVyIGN1cnNvci1wb2ludGVyJyxcbiAgICAgICAgICB0YWJpbmRleDogcHJvcHMudGFiaW5kZXhcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0ZS5lZGl0YWJsZS52YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIE9iamVjdC5hc3NpZ24oZGF0YSwgeyBvbkRyYWdvdmVyLCBvbkRyYWdsZWF2ZSwgb25LZXlkb3duLCBvbktleXVwIH0pXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaCgnZGl2JywgZGF0YSwgWyBnZXRJbnB1dCgpIF0uY29uY2F0KGdldFNlbGVjdGlvbigpKSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gZXhwb3NlIHB1YmxpYyBtZXRob2RzXG4gICAgT2JqZWN0LmFzc2lnbihwcm94eSwge1xuICAgICAgcmVtb3ZlQXRJbmRleCxcbiAgICAgIHJlbW92ZUZpbGUsXG4gICAgICBnZXROYXRpdmVFbGVtZW50OiAoKSA9PiBpbnB1dFJlZi52YWx1ZSAvLyBkZXByZWNhdGVkXG4gICAgfSlcblxuICAgIGluamVjdFByb3AocHJveHksICduYXRpdmVFbCcsICgpID0+IGlucHV0UmVmLnZhbHVlKVxuXG4gICAgcmV0dXJuIHVzZUZpZWxkKHN0YXRlKVxuICB9XG59KVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBT0EsTUFBQSxlQUFlLGdCQUFnQjtBQUFBLEVBQzdCLE1BQU07QUFBQSxFQUVOLE9BQU87QUFBQSxJQUNMLEdBQUc7QUFBQSxJQUNILFVBQVU7QUFBQSxFQUNkO0FBQUEsRUFFRSxNQUFPLE9BQU8sRUFBRSxTQUFTO0FBQ3ZCLFVBQU0sYUFBYSxTQUFTLEtBQUs7QUFFakMsVUFBTSxVQUFVO0FBQUEsTUFBUyxNQUN2QixtQkFBb0IsV0FBVyxLQUFLLHFCQUNaLE1BQU0sYUFBYSxPQUFPLGdCQUFnQixXQUFXO0FBQUEsSUFDbkY7QUFFSSxXQUFPLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxRQUFRLFNBQVMsTUFBTSxNQUFNLE9BQU8sQ0FBQztBQUFBLEVBQ3RFO0FBQ0YsQ0FBQztBQ3ZCYyxTQUFBLGlCQUFVLE9BQU8sU0FBUztBQUN2QyxRQUFNLGFBQWEsSUFBSSxJQUFJO0FBRTNCLFFBQU0sa0JBQWtCLFNBQVMsTUFBTTtBQUNyQyxRQUFJLE1BQU0sWUFBWSxNQUFNO0FBQzFCLGFBQU87QUFBQSxJQUNUO0FBRUEsV0FBTyxFQUFFLFFBQVE7QUFBQSxNQUNmLEtBQUs7QUFBQSxNQUNMLE9BQU87QU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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.