vendor: 2,797 bytes, lines 1-26
1"use strict"; 2 3function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } 4function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } 5function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } 6function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } 7function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } 8function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } 9function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } 10/* eslint-disable no-restricted-globals */ 11/* eslint-disable brace-style */ 12/** 13 * @file 14 * Chart to showhide functionality. 15 * 16 * Adds or removes markup as needed to set up the showhide functionality 17 * of charts at mobile. This is a basic example without full showhide hooks. 18 * 19 * Should not matter how many columns or rows the chart has, or if there are 20 * multiple charts within the same "container". 21 */ 22 23(function ($, Drupal) { 24 Drupal.behaviors.elementWrapper = { 25 attach: function attach(context, settings) { 26 // This is the overall container targetted charts are within.
27 var chContainerClass = "chart-container.edl-showhide--container"; 28 // This is the class that is written at mobile to wrap target elems. 29 var chWrapperClass = "edl-showhide--target"; 30 31 // media query at mobile-to-desktop breakpoint 32 var mq = window.matchMedia("(max-width: 720px)"); 33 var mq2 = window.matchMedia("(min-width: 841px) and (max-width: 1280px)"); 34 if (typeof context.location !== "undefined") { 35 // All chart containers. 36 var chContainers = document.querySelectorAll(".".concat(chContainerClass)); 37 // Bind once per container. 38 $(once('chartGroup', ".".concat(chContainerClass), context)).each(function (idx) { 39 // This chart container. 40 var containerArray = [].slice.call(chContainers); 41 var chContainer = containerArray[idx]; 42 43 /** 44 * Returns the number of column groups. 45 * 46 * This is a little bit of a cheat - this function only looks at the 47 * very last matching item and assumes the "col-n" value will be 48 * enough to indicate how many col groups there are. So if the markup 49 * ever changes to "skip" numbers (col-0, col-1, col-5) then this 50 * function will fail. 51 * 52 * @return{*} No return. 53 */ 54 function getNumberOfColGroups() { 55 var numberOfColGroups = 0; 56 // Get the very last item 57 var lastItem = _toConsumableArray(chContainer.querySelectorAll("[class*=col-]")).pop(); 58 var lastItemClasses = lastItem.classList;
59 // Loop through all classes looking for"col-n", then get the "n" 60 for (var i = 0; i < lastItemClasses.length; i++) { 61 if (lastItemClasses[i].indexOf("col-") !== -1) { 62 // ok, now on the col-n class name 63 var colNumber = lastItemClasses[i].split("-")[1]; 64 numberOfColGroups = parseInt(colNumber, 10) + 1; 65 } 66 } 67 return numberOfColGroups; 68 } 69 70 /** 71 * Given an array of children, and given an element where we want to 72 * append the children as sibling (as siblings), insert each child. 73 * 74 * @param {*} children Array of children. 75 * @param {*} triggerElem Elem that is previous sibling 76 * @returns{*} No return. 77 */ 78 79 function appendClonedChildren(children, triggerElem) { 80 var prevItem; 81 children.forEach(function (item) { 82 if (typeof prevItem !== "undefined") { 83 prevItem = chContainer.insertBefore(item, prevItem.nextSibling); 84 } else { 85 prevItem = chContainer.insertBefore(item, triggerElem.nextSibling); 86 } 87 }); 88 } 89 function makeMobile() { 90 // mobile 91 var colGroups = getNumberOfColGroups(); 92 // Loop through the amount of col groups we should have 93 for (var i = 1; i < colGroups; i++) { 94 // get all elems that should be wrapped 95 var itemsToWrap = chContainer.querySelectorAll(".col-".concat(i, ":not(.row-0)")); 96 // get the first item (aka trigger) 97 var itemTrigger = chContainer.querySelectorAll(".col-".concat(i, ".row-0"))[0]; 98 // basic setup of the wrapper to be added 99 var wrapperElem = document.createElement("div"); 100 var realCount = i - 1; 101 var wrapID = "".concat(chContainer.id, "__sect").concat(realCount); 102 var ariaLabel = "".concat(chContainer.id, "__tabID_").concat(realCount); 103 wrapperElem.classList.add(chWrapperClass); 104 wrapperElem.setAttribute("id", wrapID); 105 wrapperElem.setAttribute("role", "region"); 106 wrapperElem.setAttribute("aria-labelledby", ariaLabel); 107 wrapperElem.hidden = true; 108 109 // now loop through each item being wrapped and append it 110 // to the wrapper 111 // eslint-disable-next-line no-restricted-syntax 112 var _iterator = _createForOfIteratorHelper(itemsToWrap), 113 _step; 114 try { 115 for (_iterator.s(); !(_step = _iterator.n()).done;) { 116 var item = _step.value; 117 wrapperElem.append(item); 118 } 119 // finally place the wrapper (and children) right after the 120 // trigger for this group 121 } catch (err) { 122 _iterator.e(err); 123 } finally { 124 _iterator.f(); 125 } 126 chContainer.insertBefore(wrapperElem, itemTrigger.nextSibling); 127 } 128 } 129 function makeDesktop() { 130 // desktop 131 // First check if removal is even needed 132 if (chContainer.querySelectorAll(".".concat(chWrapperClass)).length) { 133 // get a list of wrappers 134 var wrappers = chContainer.querySelectorAll(".".concat(chWrapperClass)); 135 // loop through to find and clone the children; then delete the 136 // wrapper. After that we can append the cloned children. 137 for (var i = 0; i < wrappers.length; i++) { 138 // this wrapper 139 var wrapper = wrappers[i]; 140 // this wrapper's children 141 var wrapperChildren = wrapper.childNodes; 142 // array setup for the cloned children 143 var clonedChildren = []; 144 // our current trigger elem (previous sibling) 145 var triggerElem = chContainer.querySelectorAll(".col-".concat(i, ".row-0"))[0]; 146 // loop through children and clone each one to save it for appending 147 // eslint-disable-next-line no-restricted-syntax 148 var _iterator2 = _createForOfIteratorHelper(wrapperChildren), 149 _step2; 150 try { 151 for (_iterator2.s();
151 !(_step2 = _iterator2.n()).done;) { 152 var child = _step2.value; 153 var childClone = child.cloneNode(true); 154 clonedChildren.push(childClone); 155 } 156 // remove the wrapper 157 } catch (err) { 158 _iterator2.e(err); 159 } finally { 160 _iterator2.f(); 161 } 162 wrapper.remove(); 163 // and append the children as siblings to the trigger 164 appendClonedChildren(clonedChildren, triggerElem); 165 } 166 } 167 } 168 function mqUpdateMobile(e) { 169 if (e.matches) { 170 location.reload(); 171 makeMobile(); 172 } else { 173 location.reload(); 174 makeDesktop(); 175 } 176 } 177 178 // eslint-disable-next-line no-shadow 179 function mqUpdateTablet(mq2) { 180 if (mq2.matches && chContainer.id === "ft-by-region") { 181 makeMobile(); 182 } else { 183 makeDesktop(); 184 } 185 } 186 function init() { 187 if (chContainer.id === "ft-by-region") { 188 if (mq.matches || mq2.matches) { 189 makeMobile(); 190 } else { 191 makeDesktop(); 192 } 193 } else if (mq.matches) { 194 makeMobile(); 195 } else { 196 makeDesktop(); 197 } 198 } 199 200 /** 201 * Checks if the mediaquery event matches the matchmedia value (i.e. 202 * whether mobile else desktop). 203 * 204 * If mobile, wraps elems in a container for attaching showhide. 205 * 206 * If desktop, removes wrapping elems (and places children back as 207 * siblings). 208 * 209 * @param {*} e The mq event. 210 * @returns{*} No return. 211 */ 212 213 // We're using mediamatch to bind changes when the media-query triggers. 214 // When the page first loads we run mqUpdate, and then we set a 215 // media query listener that will fire mqUpdate whenever that breakpoint 216 // is triggered (i.e. when the browser window passes 960px). 217 init(); 218 mq.addListener(mqUpdateMobile); 219 mq2.addListener(mqUpdateTablet); 220 }); 221 } 222 } 223 }; 224})(jQuery, Drupal); 225//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudFdyYXBwZXIuanMiLCJuYW1lcyI6WyIkIiwiRHJ1cGFsIiwiYmVoYXZpb3JzIiwiZWxlbWVudFdyYXBwZXIiLCJhdHRhY2giLCJjb250ZXh0Iiwic2V0dGluZ3MiLCJjaENvbnRhaW5lckNsYXNzIiwiY2hXcmFwcGVyQ2xhc3MiLCJtcSIsIndpbmRvdyIsIm1hdGNoTWVkaWEiLCJtcTIiLCJsb2NhdGlvbiIsImNoQ29udGFpbmVycyIsImRvY3VtZW50IiwicXVlcnlTZWxlY3RvckFsbCIsImNvbmNhdCIsIm9uY2UiLCJlYWNoIiwiaWR4IiwiY29udGFpbmVyQXJyYXkiLCJzbGljZSIsImNhbGwiLCJjaENvbnRhaW5lciIsImdldE51bWJlck9mQ29sR3JvdXBzIiwibnVtYmVyT2ZDb2xHcm91cHMiLCJsYXN0SXRlbSIsIl90b0NvbnN1bWFibGVBcnJheSIsInBvcCIsImxhc3RJdGVtQ2xhc3NlcyIsImNsYXNzTGlzdCIsImkiLCJsZW5ndGgiLCJpbmRleE9mIiwiY29sTnVtYmVyIiwic3BsaXQiLCJwYXJzZUludCIsImFwcGVuZENsb25lZENoaWxkcmVuIiwiY2hpbGRyZW4iLCJ0cmlnZ2VyRWxlbSIsInByZXZJdGVtIiwiZm9yRWFjaCIsIml0ZW0iLCJpbnNlcnRCZWZvcmUiLCJuZXh0U2libGluZyIsIm1ha2VNb2JpbGUiLCJjb2xHcm91cHMiLCJpdGVtc1RvV3JhcCIsIml0ZW1UcmlnZ2VyIiwid3JhcHBlckVsZW0iLCJjcmVhdGVFbGVtZW50IiwicmVhbENvdW50Iiwid3JhcElEIiwiaWQiLCJhcmlhTGFiZWwiLCJhZGQiLCJzZXRBdHRyaWJ1dGUiLCJoaWRkZW4iLCJfaXRlcmF0b3IiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIl9zdGVwIiwicyIsIm4iLCJkb25lIiwidmFsdWUiLCJhcHBlbmQiLCJlcnIiLCJlIiwiZiIsIm1ha2VEZXNrdG9wIiwid3JhcHBlcnMiLCJ3cmFwcGVyIiwid3JhcHBlckNoaWxkcmVuIiwiY2hpbGROb2RlcyIsImNsb25lZENoaWxkcmVuIiwiX2l0ZXJhdG9yMiIsIl9zdGVwMiIsImNoaWxkIiwiY2hpbGRDbG9uZSIsImNsb25lTm9kZSIsInB1c2giLCJyZW1vdmUiLCJtcVVwZGF0ZU1vYmlsZSIsIm1hdGNoZXMiLCJyZWxvYWQiLCJtcVVwZGF0ZVRhYmxldCIsImluaXQiLCJhZGRMaXN0ZW5lciIsImpRdWVyeSJdLCJzb3VyY2VzIjpbImVsZW1lbnRXcmFwcGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscyAqL1xuLyogZXNsaW50LWRpc2FibGUgYnJhY2Utc3R5bGUgKi9cbi8qKlxuICogQGZpbGVcbiAqIENoYXJ0IHRvIHNob3doaWRlIGZ1bmN0aW9uYWxpdHkuXG4gKlxuICogQWRkcyBvciByZW1vdmVzIG1hcmt1cCBhcyBuZWVkZWQgdG8gc2V0IHVwIHRoZSBzaG93aGlkZSBmdW5jdGlvbmFsaXR5XG4gKiBvZiBjaGFydHMgYXQgbW9iaWxlLiBUaGlzIGlzIGEgYmFzaWMgZXhhbXBsZSB3aXRob3V0IGZ1bGwgc2hvd2hpZGUgaG9va3MuXG4gKlxuICogU2hvdWxkIG5vdCBtYXR0ZXIgaG93IG1hbnkgY29sdW1ucyBvciByb3dzIHRoZSBjaGFydCBoYXMsIG9yIGlmIHRoZXJlIGFyZVxuICogbXVsdGlwbGUgY2hhcnRzIHdpdGhpbiB0aGUgc2FtZSBcImNvbnRhaW5lclwiLlxuICovXG5cbihmdW5jdGlvbiAoJCwgRHJ1cGFsKSB7XG4gIERydXBhbC5iZWhhdmlvcnMuZWxlbWVudFdyYXBwZXIgPSB7XG4gICAgYXR0YWNoKGNvbnRleHQsIHNldHRpbmdzKSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBvdmVyYWxsIGNvbnRhaW5lciB0YXJnZXR0ZWQgY2hhcnRzIGFyZSB3aXRoaW4uXG4gICAgICBjb25zdCBjaENvbnRhaW5lckNsYXNzID0gXCJjaGFydC1jb250YWluZXIuZWRsLXNob3doaWRlLS1jb250YWluZXJcIjtcbiAgICAgIC8vIFRoaXMgaXMgdGhlIGNsYXNzIHRoYXQgaXMgd3JpdHRlbiBhdCBtb2JpbGUgdG8gd3JhcCB0YXJnZXQgZWxlbXMuXG4gICAgICBjb25zdCBjaFdyYXBwZXJDbGFzcyA9IFwiZWRsLXNob3doaWRlLS10YXJnZXRcIjtcblxuICAgICAgLy8gbWVkaWEgcXVlcnkgYXQgbW9iaWxlLXRvLWRlc2t0b3AgYnJlYWtwb2ludFxuICAgICAgY29uc3QgbXEgPSB3aW5kb3cubWF0Y2hNZWRpYShcIihtYXgtd2lkdGg6IDcyMHB4KVwiKTtcbiAgICAgIGNvbnN0IG1xMiA9IHdpbmRvdy5tYXRjaE1lZGlhKFxuICAgICAgICBcIihtaW4td2lkdGg6IDg0MXB4KSBhbmQgKG1heC13aWR0aDogMTI4MHB4KVwiXG4gICAgICApO1xuXG4gICAgICBpZiAodHlwZW9mIGNvbnRleHQubG9jYXRpb24gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgLy8gQWxsIGNoYXJ0IGNvbnRhaW5lcnMuXG4gICAgICAgIGNvbnN0IGNoQ29udGFpbmVycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYC4ke2NoQ29udGFpbmVyQ2xhc3N9YCk7XG4gICAgICAgIC8vIEJpbmQgb25jZSBwZXIgY29udGFpbmVyLlxuICAgICAgICAkKG9uY2UoJ2NoYXJ0R3JvdXAnLCBgLiR7Y2hDb250YWluZXJDbGFzc31gLCBjb250ZXh0KSlcbiAgICAgICAgICAuZWFjaCgoaWR4KSA9PiB7XG4gICAgICAgICAgICAvLyBUaGlzIGNoYXJ0IGNvbnRhaW5lci5cbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lckFycmF5ID0gW10uc2xpY2UuY2FsbChjaENvbnRhaW5lcnMpO1xuICAgICAgICAgICAgY29uc3QgY2hDb250YWluZXIgPSBjb250YWluZXJBcnJheVtpZHhdO1xuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjb2x1bW4gZ3JvdXBzLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIFRoaXMgaXMgYSBsaXR0bG
225UgYml0IG9mIGEgY2hlYXQgLSB0aGlzIGZ1bmN0aW9uIG9ubHkgbG9va3MgYXQgdGhlXG4gICAgICAgICAgICAgKiB2ZXJ5IGxhc3QgbWF0Y2hpbmcgaXRlbSBhbmQgYXNzdW1lcyB0aGUgXCJjb2wtblwiIHZhbHVlIHdpbGwgYmVcbiAgICAgICAgICAgICAqIGVub3VnaCB0byBpbmRpY2F0ZSBob3cgbWFueSBjb2wgZ3JvdXBzIHRoZXJlIGFyZS4gU28gaWYgdGhlIG1hcmt1cFxuICAgICAgICAgICAgICogZXZlciBjaGFuZ2VzIHRvIFwic2tpcFwiIG51bWJlcnMgKGNvbC0wLCBjb2wtMSwgY29sLTUpIHRoZW4gdGhpc1xuICAgICAgICAgICAgICogZnVuY3Rpb24gd2lsbCBmYWlsLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEByZXR1cm57Kn0gTm8gcmV0dXJuLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBmdW5jdGlvbiBnZXROdW1iZXJPZkNvbEdyb3VwcygpIHtcbiAgICAgICAgICAgICAgbGV0IG51bWJlck9mQ29sR3JvdXBzID0gMDtcbiAgICAgICAgICAgICAgLy8gR2V0IHRoZSB2ZXJ5IGxhc3QgaXRlbVxuICAgICAgICAgICAgICBjb25zdCBsYXN0SXRlbSA9IFtcbiAgICAgICAgICAgICAgICAuLi5jaENvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKFwiW2NsYXNzKj1jb2wtXVwiKSxcbiAgICAgICAgICAgICAgXS5wb3AoKTtcbiAgICAgICAgICAgICAgY29uc3QgbGFzdEl0ZW1DbGFzc2VzID0gbGFzdEl0ZW0uY2xhc3NMaXN0O1xuICAgICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIGNsYXNzZXMgbG9va2luZyBmb3JcImNvbC1uXCIsIHRoZW4gZ2V0IHRoZSBcIm5cIlxuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxhc3RJdGVtQ2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChsYXN0SXRlbUNsYXNzZXNbaV0uaW5kZXhPZihcImNvbC1cIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAvLyBvaywgbm93IG9uIHRoZSBjb2wtbiBjbGFzcyBuYW1lXG4gICAgICAgICAgICAgICAgICBjb25zdCBjb2xOdW1iZXIgPSBsYXN0SXRlbUNsYXNzZXNbaV0uc3BsaXQoXCItXCIpWzFdO1xuICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZDb2xHcm91cHMgPSBwYXJzZUludChjb2xOdW1iZXIsIDEwKSArIDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBudW1iZXJPZkNvbEdyb3VwcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBHaXZlbiBhbiBhcnJheSBvZiBjaGlsZHJlbiwgYW5kIGdpdmVuIGFuIGVsZW1lbnQgd2hlcmUgd2Ugd2FudCB0b1xuICAgICAgICAgICAgICogYXBwZW5kIHRoZSBjaGlsZHJlbiBhcyBzaWJsaW5nIChhcyBzaWJsaW5ncyksIGluc2VydCBlYWNoIGNoaWxkLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEBwYXJhbSB7Kn0gY2hpbGRyZW4gQXJyYXkgb2YgY2hpbGRyZW4uXG4gICAgICAgICAgICAgKiBAcGFyYW0geyp9IHRyaWdnZXJFbGVtIEVsZW0gdGh
225hdCBpcyBwcmV2aW91cyBzaWJsaW5nXG4gICAgICAgICAgICAgKiBAcmV0dXJuc3sqfSBObyByZXR1cm4uXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgZnVuY3Rpb24gYXBwZW5kQ2xvbmVkQ2hpbGRyZW4oY2hpbGRyZW4sIHRyaWdnZXJFbGVtKSB7XG4gICAgICAgICAgICAgIGxldCBwcmV2SXRlbTtcbiAgICAgICAgICAgICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJldkl0ZW0gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgIHByZXZJdGVtID0gY2hDb250YWluZXIuaW5zZXJ0QmVmb3JlKFxuICAgICAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgICAgICBwcmV2SXRlbS5uZXh0U2libGluZ1xuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcHJldkl0ZW0gPSBjaENvbnRhaW5lci5pbnNlcnRCZWZvcmUoXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJFbGVtLm5leHRTaWJsaW5nXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIG1ha2VNb2JpbGUoKSB7XG4gICAgICAgICAgICAgIC8vIG1vYmlsZVxuICAgICAgICAgICAgICBjb25zdCBjb2xHcm91cHMgPSBnZXROdW1iZXJPZkNvbEdyb3VwcygpO1xuICAgICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIGFtb3VudCBvZiBjb2wgZ3JvdXBzIHdlIHNob3VsZCBoYXZlXG4gICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY29sR3JvdXBzOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBnZXQgYWxsIGVsZW1zIHRoYXQgc2hvdWxkIGJlIHdyYXBwZWRcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtc1RvV3JhcCA9IGNoQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICAgICAgICAgICAgICBgLmNvbC0ke2l9Om5vdCgucm93LTApYFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBmaXJzdCBpdGVtIChha2EgdHJpZ2dlcilcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtVHJpZ2dlciA9IGNoQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICAgICAgICAgICAgICBgLmNvbC0ke2l9LnJvdy0wYFxuICAgICAgICAgICAgICAgIClbMF07XG4gICAgICAgICAgICAgICAgLy8gYmFzaWMgc2V0dXAgb2YgdGhlIHdyYXBwZXIgdG8gYmUgYWRkZWRcbiAgICAgICAgICAgICAgICBjb25zdCB3cmFwcGVyRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhbENvdW50ID0gaSAtIDE7XG4gICAgICAgICAgICAgICAgY29uc3Qgd3JhcElEID0gYCR7Y2hDb250YWluZXIuaWR9X19zZWN0JHtyZWFsQ291bnR9YDtcbiAgICAgICAgICAgICAgICBjb25zdCBhcmlhTGFiZWwgPSBgJHtjaENvbnRhaW5lci5pZH1fX3RhYklEXyR7cmVhbENvdW50fWA7XG4gICAgICAgICAgICAgICAgd3JhcHBlckVsZW0uY2xhc3NMaXN0LmFkZChjaFdyYXBwZXJDbGFzcyk7XG4gICAgICAgICAgICAgICAgd3JhcHBlckVsZW0uc2V0QXR0cmlidXRlKFwiaWRcIiwgd3JhcElEKTtcbiAgICAgICAgICAgICAgICB3cmFwcGVyRWxlbS5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwicmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHdyYXBwZXJFbGVtLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiLCBhcmlhTGFiZWwpO1xuICAgICAgICAgICAgICAgIHdyYXBwZXJFbGVtLmhpZGRlbiA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAvLyBub3cgbG9vcCB0aHJvdWdoIGVhY2ggaXRlbSBiZWluZyB3cmFwcGVkIGFuZCBhcHBlbmQgaXRcbiAgICAgICAgICAgICAgICAvLyB0byB0aGUgd3JhcHBlclxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtc1RvV3JhcCkge1xuICAgICAgICAgICAgICAgICAgd3JhcHBlckVsZW0uYXBwZW5kKGl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBmaW5hbGx5IHBsYWNlIHRoZSB3cmFwcGVyIChhbmQgY2hpbGRyZW4pIHJpZ2h0IGFmdGVyIHRoZVxuICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgZm9yIHRoaXMgZ3JvdXBcbiAgICAgICAgICAgICAgICBjaENvbnRhaW5lci5pbnNlcnRCZWZvcmUod3JhcHBlckVsZW0sIGl0ZW1UcmlnZ2VyLm5leHRTaWJsaW5nKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBtYWtlRGVza3RvcCgpIHtcbiAgICAgICAgICAgICAgLy8gZGVza3RvcFxuICAgICAgICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiByZW1vdmFsIGlzIGV2ZW4gbmVlZGVkXG4gICAgICAgICAgICAgIGlmIChjaENvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKGAuJHtjaFdyYXBwZXJDbGFzc31gKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyBnZXQgYSBsaXN0IG9mIHdyYXBwZXJzXG4gICAgICAgICAgICAgICAgY29uc3Qgd3JhcHBlcnMgPSBjaENvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAgICAgICAgICAgYC4ke2NoV3JhcHBlckNsYXNzfWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIC8vIGxvb3AgdGhyb3VnaCB0byBmaW5kIGFuZCBjbG9uZSB0aGUgY2hpbGRyZW47IHRoZW4gZGVsZXRlIHRoZVxuICAgICAgICAgICAgICAgIC8vIHdyYXBwZXIuIEFmdGVyIHRoYXQgd2UgY2FuIGFwcGVuZCB0aGUgY2xvbmVkIGNoaWxkcmVuLlxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd3JhcHBlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgIC8vIHRoaXMgd3JhcHBlclxuICAgICAgICAgICAgICAgICAgY29uc3Qgd3JhcHBlciA9IHdyYXBwZXJzW2ldO1xuICAgICAgICAgICAgICAgICAgLy8gdGhpcyB3cmFwcGVyJ3MgY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHdyYXBwZXJDaGlsZHJlbiA9IHdyYXBwZXIuY2hpbGROb2RlcztcbiAgICAgICAgICAgICAgICAgIC8vIGFycmF5IHNldHVwIGZvciB0aGUgY2xvbmVkIGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgICBjb25zdCBjbG9uZWRDaGlsZHJlbiA9IFtdO1xuICAgICAgICAgICAgICAgICAgLy8gb3VyIGN1cnJlbnQgdHJpZ2dlciBlbGVtIChwcmV2aW91cyBzaWJsaW5nKVxuICAgICAgICAgICAgICAgICAgY29uc3QgdHJpZ2dlckVsZW0gP
225SBjaENvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAgICAgICAgICAgICBgLmNvbC0ke2l9LnJvdy0wYFxuICAgICAgICAgICAgICAgICAgKVswXTtcbiAgICAgICAgICAgICAgICAgIC8vIGxvb3AgdGhyb3VnaCBjaGlsZHJlbiBhbmQgY2xvbmUgZWFjaCBvbmUgdG8gc2F2ZSBpdCBmb3IgYXBwZW5kaW5nXG4gICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygd3JhcHBlckNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkQ2xvbmUgPSBjaGlsZC5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNsb25lZENoaWxkcmVuLnB1c2goY2hpbGRDbG9uZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAvLyByZW1vdmUgdGhlIHdyYXBwZXJcbiAgICAgICAgICAgICAgICAgIHdyYXBwZXIucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAvLyBhbmQgYXBwZW5kIHRoZSBjaGlsZHJlbiBhcyBzaWJsaW5ncyB0byB0aGUgdHJpZ2dlclxuICAgICAgICAgICAgICAgICAgYXBwZW5kQ2xvbmVkQ2hpbGRyZW4oY2xvbmVkQ2hpbGRyZW4sIHRyaWdnZXJFbGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gbXFVcGRhdGVNb2JpbGUoZSkge1xuICAgICAgICAgICAgICBpZiAoZS5tYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICAgICAgICAgICAgbWFrZU1vYmlsZSgpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgIG1ha2VEZXNrdG9wKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICAgICAgICAgICAgZnVuY3Rpb24gbXFVcGRhdGVUYWJsZXQobXEyKSB7XG4gICAgICAgICAgICAgIGlmIChtcTIubWF0Y2hlcyAmJiBjaENvbnRhaW5lci5pZCA9PT0gXCJmdC1ieS1yZWdpb25cIikge1xuICAgICAgICAgICAgICAgIG1ha2VNb2JpbGUoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtYWtlRGVza3RvcCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICAgICAgICAgIGlmIChjaENvbnRhaW5lci5pZCA9PT0gXCJmdC1ieS1yZWdpb25cIikge1xuICAgICAgICAgICAgICAgIGlmIChtcS5tYXRjaGVzIHx8IG1xMi5tYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgICBtYWtlTW9iaWxlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIG1ha2VEZXNrdG9wKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1xLm1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgICBtYWtlTW9iaWxlKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbWFrZURlc2t0b3AoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIENoZWNrcyBpZiB0aGUgbWVkaWFxdWVyeSBldmVudCBtYXRjaGVzIHRoZSBtYXRjaG1lZGlhIHZhbHVlIChpLmUuXG4gICAgICAgICAgICAgKiB3aGV0aGVyIG1vYmlsZSBlbHNlIGRlc2t0b3ApLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIElmIG1vYmlsZSwgd3JhcHMgZWxlbXMgaW4gYSBjb250YWluZXIgZm9yIGF0dGFjaGluZyBzaG93aGlkZS5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBJZiBkZXNrdG9wLCByZW1vdmVzIHdyYXBwaW5nIGVsZW1zIChhbmQgcGxhY2VzIGNoaWxkcmVuIGJhY2sgYXNcbiAgICAgICAgICAgICAqIHNpYmxpbmdzKS5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAcGFyYW0geyp9IGUgVGhlIG1xIGV2ZW50LlxuICAgICAgICAgICAgICogQHJldHVybnN7Kn0gTm8gcmV0dXJuLlxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIC8vIFdlJ3JlIHVzaW5nIG1lZGlhbWF0Y2ggdG8gYmluZCBjaGFuZ2VzIHdoZW4gdGhlIG1lZGlhLXF1ZXJ5IHRyaWdnZXJzLlxuICAgICAgICAgICAgLy8gV2hlbiB0aGUgcGFnZSBmaXJzdCBsb2FkcyB3ZSBydW4gbXFVcGRhdGUsIGFuZCB0aGVuIHdlIHNldCBhXG4gICAgICAgICAgICAvLyBtZWRpYSBxdWVyeSBsaXN0ZW5lciB0aGF0IHdpbGwgZmlyZSBtcVVwZGF0ZSB3aGVuZXZlciB0aGF0IGJyZWFrcG9pbnRcbiAgICAgICAgICAgIC8vIGlzIHRyaWdnZXJlZCAoaS5lLiB3aGVuIHRoZSBicm93c2VyIHdpbmRvdyBwYXNzZXMgOTYwcHgpLlxuICAgICAgICAgICAgaW5pdCgpO1xuICAgICAgICAgICAgbXEuYWRkTGlzdGVuZXIobXFVcGRhdGVNb2JpbGUpO1xuICAgICAgICAgICAgbXEyLmFkZExpc3RlbmVyKG1xVXBkYXRlVGFibGV0KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufSkoalF1ZXJ5LCBEcnVwYWwpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBO0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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.