PageSourceSearch

https://bigboard.in/src/pages/WorkItemsListPage.vue

js bigboard.in collected 2026-10-08 00:53:41 UTC 26,558 bytes, 331 lines download raw bytes

1import { createHotContext as __vite__createHotContext } from "/@vite/client";import.meta.hot = __vite__createHotContext("/src/pages/WorkItemsListPage.vue");import { defineComponent as _defineComponent } from "/node_modules/.vite/deps/vue.js?v=33290e8f";
2import { computed, onMounted, ref } from "/node_modules/.vite/deps/vue.js?v=33290e8f";
3import { useRouter } from "/node_modules/.vite/deps/vue-router.js?v=33290e8f";
4import { api } from "/src/api.ts";
5const _sfc_main = /* @__PURE__ */ _defineComponent({
6  __name: "WorkItemsListPage",
7  setup(__props, { expose: __expose }) {
8    __expose();
9    const router = useRouter();
10    const workItems = ref([]);
11    const error = ref("");
12    const loading = ref(false);
13    const search = ref("");
14    const statusFilter = ref("");
15    const STATUS_OPTIONS = [
16      "todo",
17      "in-progress",
18      "blocked",
19      "in-review",
20      "done",
21      "cancelled"
22    ];
23    const filtered = computed(() => {
24      let result = workItems.value;
25      if (statusFilter.value) {
26        result = result.filter((wi) => wi.status === statusFilter.value);
27      }
28      if (search.value.trim()) {
29        const q = search.value.toLowerCase();
30        result = result.filter(
31          (wi) => wi.id.toLowerCase().includes(q) || wi.title.toLowerCase().includes(q) || wi.featureId.toLowerCase().includes(q) || (wi.featureTitle ?? "").toLowerCase().includes(q) || (wi.owner ?? "").toLowerCase().includes(q)
32        );
33      }
34      return result;
35    });
36    const deletingId = ref(null);
37    async function load() {
38      loading.value = true;
39      error.value = "";
40      try {
41        workItems.value = await api.listWorkItems();
42      } catch (e) {
43        error.value = e instanceof Error ? e.message : "Failed to load work items";
44      } finally {
45        loading.value = false;
46      }
47    }
48    onMounted(load);
49    function open(wi) {
50      router.push(`/create-work/${wi.id}`);
51    }
52    async function remove(wi) {
53      if (!window.confirm(
54        `Delete ${wi.id}? This removes the work item and its Study, Impact, Discoveries, plans, and any decisions owned by it. Project decisions (DEC-*) stay.`
55      )) {
56        return;
57      }
58      deletingId.value = wi.id;
59      error.value = "";
60      try {
61        await api.deleteWorkItem(wi.id);
62        workItems.value = workItems.value.filter((item) => item.id !== wi.id);
63      } catch (e) {
64        error.value = e instanceof Error ? e.message : "Delete failed";
65      } finally {
66        deletingId.value = null;
67      }
68    }
69    function statusLabel(s) {
70      return s;
71    }
72    const __returned__ = { router, workItems, error, loading, search, statusFilter, STATUS_OPTIONS, filtered, deletingId, load, open, remove, statusLabel };
73    Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
74    return __returned__;
75  }
76});
77import { createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, resolveComponent as _resolveComponent, withCtx as _withCtx, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, vModelSelect as _vModelSelect, withDirectives as _withDirectives, vModelText as _vModelText, withKeys as _withKeys, createCommentVNode as _createCommentVNode, withModifiers as _withModifiers, normalizeClass as _normalizeClass } from "/node_modules/.vite/deps/vue.js?v=33290e8f";
78const _hoisted_1 = { class: "card" };
79const _hoisted_2 = { class: "meta" };
80const _hoisted_3 = { class: "filters" };
81const _hoisted_4 = ["value"];
82const _hoisted_5 = { class: "grow" };
83const _hoisted_6 = {
84  key: 0,
85  class: "error"
86};
87const _hoisted_7 = { key: 1 };
88const _hoisted_8 = {
89  key: 2,
90  class: "wi-table"
91};
92const _hoisted_9 = ["onClick"];
93const _hoisted_10 = { class: "wi-id" };
94const _hoisted_11 = { class: "mono" };
95const _hoisted_12 = { class: "meta" };
96const _hoisted_13 = { class: "meta" };
97const _hoisted_14 = { class: "actions" };
98const _hoisted_15 = ["disabled", "onClick"];
99const _hoisted_16 = {
100  key: 3,
101  class: "meta"
102};
103function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
104  const _component_router_link = _resolveComponent("router-link");
105  return _openBlock(), _createElementBlock("section", null, [
106    _createElementVNode("div", _hoisted_1, [
107      _cache[8] || (_cache[8] = _createElementVNode(
108        "h2",
109        null,
110        "Work Items",
111        -1
112        /* CACHED */
113      )),
114      _createElementVNode("p", _hoisted_2, [
115        _createTextVNode(
116          _toDisplayString($setup.filtered.length) + " of " + _toDisplayString($setup.workItems.length) + " work items. ",
117          1
118          /* TEXT */
119        ),
120        _createVNode(_component_router_link, { to: "/create-work" }, {
121          default: _withCtx(() => [..._cache[3] || (_cache[3] = [
122            _createTextVNode(
123              "Create a new one →",
124              -1
125              /* CACHED */
126            )
127          ])]),
128          _: 1
129          /* STABLE */
130        })
131      ]),
132      _createElementVNode("div", _hoisted_3, [
133        _createElementVNode("label", null, [
134          _cache[5] || (_cache[5] = _createTextVNode(
135            " Status ",
136            -1
137            /* CACHED */
138          )),
139          _withDirectives(_createElementVNode(
140            "select",
141            {
142              "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => $setup.statusFilter = $event),
143              onChange: ($event) => void 0
144            },
145            [
146              _cache[4] || (_cache[4] = _createElementVNode(
147                "option",
148                { value: "" },
149                "All",
150                -1
151                /* CACHED */
152              )),
153              (_openBlock(), _createElementBlock(
154                _Fragment,
155                null,
156                _renderList($setup.STATUS_OPTIONS, (s) => {
157                  return _createElementVNode("option", {
158                    key: s,
159                    value: s
160                  }, _toDisplayString(s), 9, _hoisted_4);
161                }),
162                64
163                /* STABLE_FRAGMENT */
164              ))
165            ],
166            544
167            /* NEED_HYDRATION, NEED_PATCH */
168          ), [
169            [_vModelSelect, $setup.statusFilter]
170          ])
171        ]),
172        _createElementVNode("label", _hoisted_5, [
173          _cache[6] || (_cache[6] = _createTextVNode(
174            " Search ",
175            -1
176            /* CACHED */
177          )),
178          _withDirectives(_createElementVNode(
179            "input",
180            {
181              "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => $setup.search = $event),
182              placeholder: "ID, title, feature, owner…",
183              onKeyup: _withKeys(($event) => void 0, ["enter"])
184            },
185            null,
186            544
187            /* NEED_HYDRATION, NEED_PATCH */
188          ), [
189            [_vModelText, $setup.search]
190          ])
191        ]),
192        _createElementVNode("button", {
193          class: "secondary",
194          onClick: $setup.load
195        }, "Refresh")
196      ]),
197      $setup.error ? (_openBlock(), _createElementBlock(
198        "p",
199        _hoisted_6,
200        _toDisplayString($setup.error),
201        1
202        /* TEXT */
203      )) : _createCommentVNode("v-if", true),
204      $setup.loading ? (_openBlock(), _createElementBlock("p", _hoisted_7, "Loading…")) : $setup.filtered.length ? (_openBlock(), _createElementBlock("table", _hoisted_8, [
205        _cache[7] || (_cache[7] = _createElementVNode(
206          "thead",
207          null,
208          [
209            _createElementVNode("tr", null, [
210              _createElementVNode("th", null, "ID"),
211              _createElementVNode("th", null, "Title"),
212              _createElementVNode("th", null, "Feature"),
213              _createElementVNode("th", null, "Status"),
214              _createElementVNode("th", null, "Owner"),
215              _createElementVNode("th", null, "Updated"),
216              _createElementVNode("th")
217            ])
218          ],
219          -1
220          /* CACHED */
221        )),
222        _createElementVNode("tbody", null, [
223          (_openBlock(true), _createElementBlock(
224            _Fragment,
225            null,
226            _renderList($setup.filtered, (wi) => {
227              return _openBlock(), _createElementBlock("tr", {
228                key: wi.id,
229                class: "wi-row",
230                onClick: ($event) => $setup.open(wi)
231              }, [
232                _createElementVNode(
233                  "td",
234                  _hoisted_10,
235                  _toDisplayString(wi.id),
236                  1
237                  /* TEXT */
238                ),
239                _createElementVNode(
240                  "td",
241                  null,
242                  _toDisplayString(wi.title),
243                  1
244                  /* TEXT */
245                ),
246                _createElementVNode("td", _hoisted_11, [
247                  _createVNode(_component_router_link, {
248                    to: `/features/${encodeURIComponent(wi.featureId)}`,
249                    onClick: _cache[2] || (_cache[2] = _withModifiers(() => {
250                    }, ["stop"]))
251                  }, {
252                    default: _withCtx(() => [
253                      _createTextVNode(
254                        _toDisplayString(wi.featureId),
255                        1
256                        /* TEXT */
257                      )
258                    ]),
259                    _: 2
260                    /* DYNAMIC */
261                  }, 1032, ["to"]),
262                  _createElementVNode(
263                    "div",
264                    _hoisted_12,
265                    _toDisplayString(wi.featureTitle),
266                    1
267                    /* TEXT */
268                  )
269                ]),
270                _createElementVNode("td", null, [
271                  _createElementVNode(
272                    "span",
273                    {
274                      class: _normalizeClass(["status-badge", wi.status])
275                    },
276                    _toDisplayString($setup.statusLabel(wi.status)),
277                    3
278                    /* TEXT, CLASS */
279                  )
280                ]),
281                _createElementVNode(
282                  "td",
283                  null,
284                  _toDisplayString(wi.owner ?? "—"),
285                  1
286                  /* TEXT */
287                ),
288                _createElementVNode(
289                  "td",
290                  _hoisted_13,
291                  _toDisplayString(wi.updatedAt.slice(0, 10)),
292                  1
293                  /* TEXT */
294                ),
295                _createElementVNode("td", _hoisted_14, [
296                  _createElementVNode("button", {
297                    type: "button",
298                    class: "danger",
299                    disabled: $setup.deletingId === wi.id,
300                    onClick: _withModifiers(($event) => $setup.remove(wi), ["stop"])
301                  }, _toDisplayString($setup.deletingId === wi.id ? "Deleting…" : "Delete"), 9, _hoisted_15)
302                ])
303              ], 8, _hoisted_9);
304            }),
305            128
306            /* KEYED_FRAGMENT */
307          ))
308        ])
309      ])) : (_openBlock(), _createElementBlock("p", _hoisted_16, "No work items found."))
310    ])
311  ]);
312}
313import "/src/pages/WorkItemsListPage.vue?vue&type=style&index=0&scoped=f0d15e56&lang.css";
314_sfc_main.__hmrId = "f0d15e56";
315typeof __VUE_HMR_RUNTIME__ !== "undefined" && __VUE_HMR_RUNTIME__.createRecord(_sfc_main.__hmrId, _sfc_main);
316import.meta.hot.on("file-changed", ({ file }) => {
317  __VUE_HMR_RUNTIME__.CHANGED_FILE = file;
318});
319import.meta.hot.accept((mod) => {
320  if (!mod) return;
321  const { default: updated, _rerender_only } = mod;
322  if (_rerender_only) {
323    __VUE_HMR_RUNTIME__.rerender(updated.__hmrId, updated.render);
324  } else {
325    __VUE_HMR_RUNTIME__.reload(updated.__hmrId, updated);
326  }
327});
328import _export_sfc from "/@id/__x00__plugin-vue:export-helper";
329export default /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-f0d15e56"], ["__file", "/home/reddragon/bigboard-0/workbench/client/src/pages/WorkItemsListPage.vue"]]);
330
331//# sourceMappingURL=data:application/json;base64,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UTtBQUFBLGtDQTFDTjtBQUFBLFVBVVE7QUFBQTtBQUFBO0FBQUEsWUFUTixvQkFRSztBQUFBLGNBUEgsb0JBQVcsWUFBUCxJQUFFO0FBQUEsY0FDTixvQkFBYyxZQUFWLE9BQUs7QUFBQSxjQUNULG9CQUFnQixZQUFaLFNBQU87QUFBQSxjQUNYLG9CQUFlLFlBQVgsUUFBTTtBQUFBLGNBQ1Ysb0JBQWMsWUFBVixPQUFLO0FBQUEsY0FDVCxvQkFBZ0IsWUFBWixTQUFPO0FBQUEsY0FDWCxvQkFBUztBQUFBOzs7OztRQUdiLG9CQThCUTtBQUFBLDZCQTdCTjtBQUFBLFlBNEJLO0FBQUE7QUFBQSx3QkEzQlUsaUJBQVEsQ0FBZCxPQUFFO21DQURYLG9CQTRCSztBQUFBLGdCQTFCRixLQUFLLEdBQUc7QUFBQSxnQkFDVCxPQUFNO0FBQUEsZ0JBQ0wsU0FBSyxZQUFFLFlBQUssRUFBRTtBQUFBO2dCQUVmO0FBQUEsa0JBQWtDO0FBQUEsa0JBQWxDO0FBQUEsa0JBQWtDLGlCQUFiLEdBQUcsRUFBRTtBQUFBO0FBQUE7QUFBQTtBQUFBLGdCQUMxQjtBQUFBLGtCQUF1QjtBQUFBO0FBQUEsbUNBQWhCLEdBQUcsS0FBSztBQUFBO0FBQUE7QUFBQTtBQUFBLGdCQUNmLG9CQU1LLE1BTkwsYUFNSztBQUFBLGtCQUxILGFBR2lDO0FBQUEsb0JBRjlCLElBQUUsYUFBZSxtQkFBbUIsR0FBRyxTQUFTO0FBQUEsb0JBQ2hELFNBQUsseUNBQU47QUFBQSx1QkFBVztBQUFBO3NDQUNaLE1BQWtCO0FBQUE7e
331UNBQWYsR0FBRyxTQUFTO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7a0JBQ2hCO0FBQUEsb0JBQTZDO0FBQUEsb0JBQTdDO0FBQUEsb0JBQTZDLGlCQUF4QixHQUFHLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtnQkFFdEMsb0JBQXVGO0FBQUEsa0JBQW5GO0FBQUEsb0JBQThFO0FBQUE7QUFBQSxzQkFBdkUsT0FBSyxpQ0FBbUIsR0FBRyxNQUFNO0FBQUE7cUNBQU0sbUJBQVksR0FBRyxNQUFNO0FBQUE7QUFBQTtBQUFBO0FBQUE7Z0JBQ3ZFO0FBQUEsa0JBQThCO0FBQUE7QUFBQSxtQ0FBdkIsR0FBRyxTQUFLO0FBQUE7QUFBQTtBQUFBO0FBQUEsZ0JBQ2Y7QUFBQSxrQkFBcUQ7QUFBQSxrQkFBckQ7QUFBQSxrQkFBcUQsaUJBQWpDLEdBQUcsVUFBVSxNQUFLO0FBQUE7QUFBQTtBQUFBO0FBQUEsZ0JBQ3RDLG9CQVNLLE1BVEwsYUFTSztBQUFBLGtCQVJILG9CQU9TO0FBQUEsb0JBTlAsTUFBSztBQUFBLG9CQUNMLE9BQU07QUFBQSxvQkFDTCxVQUFVLHNCQUFlLEdBQUc7QUFBQSxvQkFDNUIsU0FBSywyQkFBTyxjQUFPLEVBQUU7QUFBQSxzQ0FFbkIsc0JBQWUsR0FBRyxLQUFFO0FBQUE7Ozs7Ozs7MkJBT2pDLG9CQUErQyxLQUEvQyxhQUF1QixzQkFBb0I7QUFBQSIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOlsiV29ya0l0ZW1zTGlzdFBhZ2UudnVlIl0sInNvdXJjZXNDb250ZW50IjpbIjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBjb21wdXRlZCwgb25Nb3VudGVkLCByZWYgfSBmcm9tICd2dWUnO1xuaW1wb3J0IHsgdXNlUm91dGVyIH0gZnJvbSAndnVlLXJvdXRlcic7XG5pbXBvcnQgeyBhcGksIHR5cGUgV29ya0l0ZW0sIHR5cGUgV29ya0l0ZW1TdGF0dXMgfSBmcm9tICcuLi9hcGknO1xuXG5jb25zdCByb3V0ZXIgPSB1c2VSb3V0ZXIoKTtcbmNvbnN0IHdvcmtJdGVtcyA9IHJlZjxXb3JrSXRlbVtdPihbXSk7XG5jb25zdCBlcnJvciA9IHJlZignJyk7XG5jb25zdCBsb2FkaW5nID0gcmVmKGZhbHNlKTtcblxuY29uc3Qgc2VhcmNoID0gcmVmKCcnKTtcbmNvbnN0IHN0YXR1c0ZpbHRlciA9IHJlZjxXb3JrSXRlbVN0YXR1cyB8ICcnPignJyk7XG5cbmNvbnN0IFNUQVRVU19PUFRJT05TOiBXb3JrSXRlbVN0YXR1c1tdID0gW1xuICAndG9kbycsICdpbi1wcm9ncmVzcycsICdibG9ja2VkJywgJ2luLXJldmlldycsICdkb25lJywgJ2NhbmNlbGxlZCcsXG5dO1xuXG5jb25zdCBmaWx0ZXJlZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgbGV0IHJlc3VsdCA9IHdvcmtJdGVtcy52YWx1ZTtcbiAgaWYgKHN0YXR1c0ZpbHRlci52YWx1ZSkge1xuICAgIHJlc3VsdCA9IHJlc3VsdC5maWx0ZXIoKHdpKSA9PiB3aS5zdGF0dXMgPT09IHN0YXR1c0ZpbHRlci52YWx1ZSk7XG4gIH1cbiAgaWYgKHNlYXJjaC52YWx1ZS50cmltKCkpIHtcbiAgICBjb25zdCBxID0gc2VhcmNoLnZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgcmVzdWx0ID0gcmVzdWx0LmZpbHRlcihcbiAgICAgICh3aSkgPT5cbiAgICAgICAgd2kuaWQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSB8fFxuICAgICAgICB3aS50aXRsZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpIHx8XG4gICAgICAgIHdpLmZlYXR1cmVJZC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpIHx8XG4gICAgICAgICh3aS5mZWF0dXJlVGl0bGUgPz8gJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkgfHxcbiAgICAgICAgKHdpLm93bmVyID8/ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuXG5jb25zdCBkZWxldGluZ0lkID0gcmVmPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG5hc3luYyBmdW5jdGlvbiBsb2FkKCkge1xuICBsb2FkaW5nLnZhbHVlID0gdHJ1ZTtcbiAgZXJyb3IudmFsdWUgPSAnJztcbiAgdHJ5IHtcbiAgICB3b3JrSXRlbXMudmFsdWUgPSBhd2FpdCBhcGkubGlzdFdvcmtJdGVtcygpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgZXJyb3IudmFsdWUgPSBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiAnRmFpbGVkIHRvIGxvYWQgd29yayBpdGVtcyc7XG4gIH0gZmluYWxseSB7XG4gICAgbG9hZGluZy52YWx1ZSA9IGZhbHNlO1xuICB9XG59XG5cbm9uTW91bnRlZChsb2FkKTtcblxuZnVuY3Rpb24gb3Blbih3aTogV29ya0l0ZW0pIHtcbiAgcm91dGVyLnB1c2goYC9jcmVhdGUtd29yay8ke3dpLmlkfWApO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmUod2k6IFdvcmtJdGVtKSB7XG4gIGlmIChcbiAgICAhd2luZG93LmNvbmZpcm0oXG4gICAgICBgRGVsZXRlICR7d2kuaWR9PyBUaGlzIHJlbW92ZXMgdGhlIHdvcmsgaXRlbSBhbmQgaXRzIFN0dWR5LCBJbXBhY3QsIERpc2NvdmVyaWVzLCBwbGFucywgYW5kIGFueSBkZWNpc2lvbnMgb3duZWQgYnkgaXQuIFByb2plY3QgZGVjaXNpb25zIChERUMtKikgc3RheS5gLFxuICAgIClcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGRlbGV0aW5nSWQudmFsdWUgPSB3aS5pZDtcbiAgZXJyb3IudmFsdWUgPSAnJztcbiAgdHJ5IHtcbiAgICBhd2FpdCBhcGkuZGVsZXRlV29ya0l0ZW0od2kuaWQpO1xuICAgIHdvcmtJdGVtcy52YWx1ZSA9IHdvcmtJdGVtcy52YWx1ZS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uaWQgIT09IHdpLmlkKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGVycm9yLnZhbHVlID0gZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogJ0RlbGV0ZSBmYWlsZWQnO1xuICB9IGZpbmFsbHkge1xuICAgIGRlbGV0aW5nSWQudmFsdWUgPSBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0YXR1c0xhYmVsKHM6IFdvcmtJdGVtU3RhdHVzKTogc3RyaW5nIHtcbiAgcmV0dXJuIHM7XG59XG48L3NjcmlwdD5cblxuPHRlbXBsYXRlPlxuICA8c2VjdGlvbj5cbiAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxuICAgICAgPGgyPldvcmsgSXRlbXM8L2gyPlxuICAgICAgPHAgY2xhc3M9XCJtZXRhXCI+XG4gICAgICAgIHt7IGZpbHRlcmVkLmxlbmd0aCB9fSBvZiB7eyB3b3JrSXRlbXMubGVuZ3RoIH19IHdvcmsgaXRlbXMuXG4gICAgICAgIDxyb3V0ZXItbGluayB0bz1cIi9jcmVhdGUtd29ya1wiPkNyZWF0ZSBhIG5ldyBvbmUg4oaSPC9yb3V0
331ZXItbGluaz5cbiAgICAgIDwvcD5cblxuICAgICAgPGRpdiBjbGFzcz1cImZpbHRlcnNcIj5cbiAgICAgICAgPGxhYmVsPlxuICAgICAgICAgIFN0YXR1c1xuICAgICAgICAgIDxzZWxlY3Qgdi1tb2RlbD1cInN0YXR1c0ZpbHRlclwiIEBjaGFuZ2U9XCJ2b2lkIDBcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5BbGw8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdi1mb3I9XCJzIGluIFNUQVRVU19PUFRJT05TXCIgOmtleT1cInNcIiA6dmFsdWU9XCJzXCI+e3sgcyB9fTwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJncm93XCI+XG4gICAgICAgICAgU2VhcmNoXG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB2LW1vZGVsPVwic2VhcmNoXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiSUQsIHRpdGxlLCBmZWF0dXJlLCBvd25lcuKAplwiXG4gICAgICAgICAgICBAa2V5dXAuZW50ZXI9XCJ2b2lkIDBcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzZWNvbmRhcnlcIiBAY2xpY2s9XCJsb2FkXCI+UmVmcmVzaDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxwIHYtaWY9XCJlcnJvclwiIGNsYXNzPVwiZXJyb3JcIj57eyBlcnJvciB9fTwvcD5cbiAgICAgIDxwIHYtaWY9XCJsb2FkaW5nXCI+TG9hZGluZ+KApjwvcD5cblxuICAgICAgPHRhYmxlIHYtZWxzZS1pZj1cImZpbHRlcmVkLmxlbmd0aFwiIGNsYXNzPVwid2ktdGFibGVcIj5cbiAgICAgICAgPHRoZWFkPlxuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0aD5JRDwvdGg+XG4gICAgICAgICAgICA8dGg+VGl0bGU8L3RoPlxuICAgICAgICAgICAgPHRoPkZlYXR1cmU8L3RoPlxuICAgICAgICAgICAgPHRoPlN0YXR1czwvdGg+XG4gICAgICAgICAgICA8dGg+T3duZXI8L3RoPlxuICAgICAgICAgICAgPHRoPlVwZGF0ZWQ8L3RoPlxuICAgICAgICAgICAgPHRoPjwvdGg+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5PlxuICAgICAgICAgIDx0clxuICAgICAgICAgICAgdi1mb3I9XCJ3aSBpbiBmaWx0ZXJlZFwiXG4gICAgICAgICAgICA6a2V5PVwid2kuaWRcIlxuICAgICAgICAgICAgY2xhc3M9XCJ3aS1yb3dcIlxuICAgICAgICAgICAgQGNsaWNrPVwib3Blbih3aSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cIndpLWlkXCI+e3sgd2kuaWQgfX08L3RkPlxuICAgICAgICAgICAgPHRkPnt7IHdpLnRpdGxlIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cIm1vbm9cIj5cbiAgICAgICAgICAgICAgPHJvdXRlci1saW5rXG4gICAgICAgICAgICAgICAgOnRvPVwiYC9mZWF0dXJlcy8ke2VuY29kZVVSSUNvbXBvbmVudCh3aS5mZWF0dXJlSWQpfWBcIlxuICAgICAgICAgICAgICAgIEBjbGljay5zdG9wXG4gICAgICAgICAgICAgID57eyB3aS5mZWF0dXJlSWQgfX08L3JvdXRlci1saW5rPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0YVwiPnt7IHdpLmZlYXR1cmVUaXRsZSB9fTwvZGl2PlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZD48c3BhbiA6Y2xhc3M9XCJbJ3N0YXR1cy1iYWRnZScsIHdpLnN0YXR1c11cIj57eyBzdGF0dXNMYWJlbCh3aS5zdGF0dXMpIH19PC9zcGFuPjwvdGQ+XG4gICAgICAgICAgICA8dGQ+e3sgd2kub3duZXIgPz8gJ+KAlCcgfX08L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwibWV0YVwiPnt7IHdpLnVwZGF0ZWRBdC5zbGljZSgwLCAxMCkgfX08L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9uc1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkYW5nZXJcIlxuICAgICAgICAgICAgICAgIDpkaXNhYmxlZD1cImRlbGV0aW5nSWQgPT09IHdpLmlkXCJcbiAgICAgICAgICAgICAgICBAY2xpY2suc3RvcD1cInJlbW92ZSh3aSlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgZGVsZXRpbmdJZCA9PT0gd2kuaWQgPyAnRGVsZXRpbmfigKYnIDogJ0RlbGV0ZScgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuXG4gICAgICA8cCB2LWVsc2UgY2xhc3M9XCJtZXRhXCI+Tm8gd29yayBpdGVtcyBmb3VuZC48L3A+XG4gICAgPC9kaXY+XG4gIDwvc2VjdGlvbj5cbjwvdGVtcGxhdGU+XG5cbjxzdHlsZSBzY29wZWQ+XG4uZmlsdGVycyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtd3JhcDogd3JhcDtcbiAgZ2FwOiAwLjc1cmVtO1xuICBhbGlnbi1pdGVtczogZW5kO1xuICBtYXJnaW46IDFyZW0gMDtcbn1cbi5maWx0ZXJzIGxhYmVsIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZm9udC1zaXplOiAwLjc1cmVtO1xuICBjb2xvcjogIzZiNzI4MDtcbiAgZ2FwOiAwLjI1cmVtO1xufVxuLmZpbHRlcnMgbGFiZWwuZ3JvdyB7XG4gIGZsZXg6IDE7XG4gIG1pbi13aWR0aDogMTJyZW07XG59XG4uZmlsdGVycyBzZWxlY3QsXG4uZmlsdGVycyBpbnB1dCB7XG4gIHBhZGRpbmc6IDAuMzc1cmVtIDAuNXJlbTtcbiAgYm9yZGVyOiAxcHggc29saWQgI2QxZDVkYjtcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xuICBmb250LXNpemU6IDAuODc1cmVtO1xufVxuLndpLXRhYmxlIHtcbiAgd2lkdGg6IDEwMCU7XG4gIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG59XG4ud2ktdGFibGUgdGgge1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICBmb250LXNpemU6IDAuNzVyZW07XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIGNvbG9yOiAjNmI3MjgwO1xuICBwYWRkaW5nOiAwLjVyZW0gMC43NXJlbTtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlNWU3ZWI7XG59XG4ud2ktdGFibGUgdGQge1xuICBwYWRkaW5nOiAwLjZyZW0gMC43NXJlbTtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNmM2Y0ZjY7XG59XG4ud2ktcm93IHtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuLndpLXJvdzpob3ZlciB0ZCB7XG4gIGJhY2tncm91bmQ6ICNmOWZhZmI7XG59XG4ud2ktaWQge1xuICBmb250LXdlaWdodDogNjAwO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuLm1vbm8ge1xuICBmb250LWZhbWlseTogdWktbW9ub3NwYWNlLCBtb25vc3BhY2U7XG4gIGZvbnQtc2l6ZTogMC44MTI1cmVtO1
331xufVxuLnN0YXR1cy1iYWRnZSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgcGFkZGluZzogMC4xMjVyZW0gMC41cmVtO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cbi5zdGF0dXMtYmFkZ2UudG9kbyB7IGJhY2tncm91bmQ6ICNmM2Y0ZjY7IGNvbG9yOiAjMzc0MTUxOyB9XG4uc3RhdHVzLWJhZGdlLmluLXByb2dyZXNzIHsgYmFja2dyb3VuZDogI2RiZWFmZTsgY29sb3I6ICMxZTQwYWY7IH1cbi5zdGF0dXMtYmFkZ2UuYmxvY2tlZCB7IGJhY2tncm91bmQ6ICNmZWUyZTI7IGNvbG9yOiAjOTkxYjFiOyB9XG4uc3RhdHVzLWJhZGdlLmluLXJldmlldyB7IGJhY2tncm91bmQ6ICNmZWYzYzc7IGNvbG9yOiAjOTI0MDBlOyB9XG4uc3RhdHVzLWJhZGdlLmRvbmUgeyBiYWNrZ3JvdW5kOiAjZDFmYWU1OyBjb2xvcjogIzA2NWY0NjsgfVxuLnN0YXR1cy1iYWRnZS5jYW5jZWxsZWQgeyBiYWNrZ3JvdW5kOiAjZjNmNGY2OyBjb2xvcjogIzljYTNhZjsgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7IH1cbi5hY3Rpb25zIHtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5idXR0b24uZGFuZ2VyIHtcbiAgYmFja2dyb3VuZDogI2ZlZTJlMjtcbiAgY29sb3I6ICM5OTFiMWI7XG4gIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgcGFkZGluZzogMC4yNXJlbSAwLjZyZW07XG59XG48L3N0eWxlPlxuIl0sImZpbGUiOiIvaG9tZS9yZWRkcmFnb24vYmlnYm9hcmQtMC93b3JrYmVuY2gvY2xpZW50L3NyYy9wYWdlcy9Xb3JrSXRlbXNMaXN0UGFnZS52dWUifQ==

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.