summaryrefslogtreecommitdiff
path: root/includes/external/addressbook/node_modules/domutils/lib
diff options
context:
space:
mode:
Diffstat (limited to 'includes/external/addressbook/node_modules/domutils/lib')
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/feeds.d.ts71
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/feeds.d.ts.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/feeds.js183
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/feeds.js.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/helpers.d.ts58
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/helpers.d.ts.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/helpers.js135
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/helpers.js.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/index.d.ts10
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/index.d.ts.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/index.js10
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/index.js.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/legacy.d.ts58
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/legacy.d.ts.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/legacy.js117
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/legacy.js.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/manipulation.d.ts49
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/manipulation.d.ts.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/manipulation.js128
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/manipulation.js.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/package.json1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/querying.d.ts62
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/querying.d.ts.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/querying.js119
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/querying.js.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/stringify.d.ts46
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/stringify.d.ts.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/stringify.js81
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/stringify.js.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/traversal.d.ts65
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/traversal.d.ts.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/traversal.js110
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/esm/traversal.js.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/feeds.d.ts71
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/feeds.d.ts.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/feeds.js191
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/feeds.js.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/helpers.d.ts58
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/helpers.d.ts.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/helpers.js141
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/helpers.js.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/index.d.ts10
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/index.d.ts.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/index.js33
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/index.js.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/legacy.d.ts58
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/legacy.d.ts.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/legacy.js131
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/legacy.js.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/manipulation.d.ts49
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/manipulation.d.ts.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/manipulation.js137
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/manipulation.js.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/querying.d.ts62
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/querying.d.ts.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/querying.js134
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/querying.js.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/stringify.d.ts46
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/stringify.d.ts.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/stringify.js92
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/stringify.js.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/traversal.d.ts65
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/traversal.d.ts.map1
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/traversal.js124
-rw-r--r--includes/external/addressbook/node_modules/domutils/lib/traversal.js.map1
65 files changed, 2737 insertions, 0 deletions
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/feeds.d.ts b/includes/external/addressbook/node_modules/domutils/lib/esm/feeds.d.ts
new file mode 100644
index 0000000..5ba60c7
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/feeds.d.ts
@@ -0,0 +1,71 @@
+import type { AnyNode } from "domhandler";
+/**
+ * The type of a media item.
+ *
+ * @category Feeds
+ */
+export declare type FeedItemMediaMedium = "image" | "audio" | "video" | "document" | "executable";
+/**
+ * The type of a media item.
+ *
+ * @category Feeds
+ */
+export declare type FeedItemMediaExpression = "sample" | "full" | "nonstop";
+/**
+ * A media item of a feed entry.
+ *
+ * @category Feeds
+ */
+export interface FeedItemMedia {
+ medium: FeedItemMediaMedium | undefined;
+ isDefault: boolean;
+ url?: string;
+ fileSize?: number;
+ type?: string;
+ expression?: FeedItemMediaExpression;
+ bitrate?: number;
+ framerate?: number;
+ samplingrate?: number;
+ channels?: number;
+ duration?: number;
+ height?: number;
+ width?: number;
+ lang?: string;
+}
+/**
+ * An entry of a feed.
+ *
+ * @category Feeds
+ */
+export interface FeedItem {
+ id?: string;
+ title?: string;
+ link?: string;
+ description?: string;
+ pubDate?: Date;
+ media: FeedItemMedia[];
+}
+/**
+ * The root of a feed.
+ *
+ * @category Feeds
+ */
+export interface Feed {
+ type: string;
+ id?: string;
+ title?: string;
+ link?: string;
+ description?: string;
+ updated?: Date;
+ author?: string;
+ items: FeedItem[];
+}
+/**
+ * Get the feed object from the root of a DOM tree.
+ *
+ * @category Feeds
+ * @param doc - The DOM to to extract the feed from.
+ * @returns The feed.
+ */
+export declare function getFeed(doc: AnyNode[]): Feed | null;
+//# sourceMappingURL=feeds.d.ts.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/feeds.d.ts.map b/includes/external/addressbook/node_modules/domutils/lib/esm/feeds.d.ts.map
new file mode 100644
index 0000000..7228bc1
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/feeds.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"feeds.d.ts","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["feeds.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAW,MAAM,YAAY,CAAC;AAInD;;;;GAIG;AACH,oBAAY,mBAAmB,GACzB,OAAO,GACP,OAAO,GACP,OAAO,GACP,UAAU,GACV,YAAY,CAAC;AAEnB;;;;GAIG;AACH,oBAAY,uBAAuB,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AAEpE;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC1B,MAAM,EAAE,mBAAmB,GAAG,SAAS,CAAC;IACxC,SAAS,EAAE,OAAO,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,uBAAuB,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACrB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,KAAK,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED;;;;GAIG;AACH,MAAM,WAAW,IAAI;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACrB;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,IAAI,GAAG,IAAI,CAQnD"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/feeds.js b/includes/external/addressbook/node_modules/domutils/lib/esm/feeds.js
new file mode 100644
index 0000000..449549b
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/feeds.js
@@ -0,0 +1,183 @@
+import { textContent } from "./stringify.js";
+import { getElementsByTagName } from "./legacy.js";
+/**
+ * Get the feed object from the root of a DOM tree.
+ *
+ * @category Feeds
+ * @param doc - The DOM to to extract the feed from.
+ * @returns The feed.
+ */
+export function getFeed(doc) {
+ const feedRoot = getOneElement(isValidFeed, doc);
+ return !feedRoot
+ ? null
+ : feedRoot.name === "feed"
+ ? getAtomFeed(feedRoot)
+ : getRssFeed(feedRoot);
+}
+/**
+ * Parse an Atom feed.
+ *
+ * @param feedRoot The root of the feed.
+ * @returns The parsed feed.
+ */
+function getAtomFeed(feedRoot) {
+ var _a;
+ const childs = feedRoot.children;
+ const feed = {
+ type: "atom",
+ items: getElementsByTagName("entry", childs).map((item) => {
+ var _a;
+ const { children } = item;
+ const entry = { media: getMediaElements(children) };
+ addConditionally(entry, "id", "id", children);
+ addConditionally(entry, "title", "title", children);
+ const href = (_a = getOneElement("link", children)) === null || _a === void 0 ? void 0 : _a.attribs["href"];
+ if (href) {
+ entry.link = href;
+ }
+ const description = fetch("summary", children) || fetch("content", children);
+ if (description) {
+ entry.description = description;
+ }
+ const pubDate = fetch("updated", children);
+ if (pubDate) {
+ entry.pubDate = new Date(pubDate);
+ }
+ return entry;
+ }),
+ };
+ addConditionally(feed, "id", "id", childs);
+ addConditionally(feed, "title", "title", childs);
+ const href = (_a = getOneElement("link", childs)) === null || _a === void 0 ? void 0 : _a.attribs["href"];
+ if (href) {
+ feed.link = href;
+ }
+ addConditionally(feed, "description", "subtitle", childs);
+ const updated = fetch("updated", childs);
+ if (updated) {
+ feed.updated = new Date(updated);
+ }
+ addConditionally(feed, "author", "email", childs, true);
+ return feed;
+}
+/**
+ * Parse a RSS feed.
+ *
+ * @param feedRoot The root of the feed.
+ * @returns The parsed feed.
+ */
+function getRssFeed(feedRoot) {
+ var _a, _b;
+ const childs = (_b = (_a = getOneElement("channel", feedRoot.children)) === null || _a === void 0 ? void 0 : _a.children) !== null && _b !== void 0 ? _b : [];
+ const feed = {
+ type: feedRoot.name.substr(0, 3),
+ id: "",
+ items: getElementsByTagName("item", feedRoot.children).map((item) => {
+ const { children } = item;
+ const entry = { media: getMediaElements(children) };
+ addConditionally(entry, "id", "guid", children);
+ addConditionally(entry, "title", "title", children);
+ addConditionally(entry, "link", "link", children);
+ addConditionally(entry, "description", "description", children);
+ const pubDate = fetch("pubDate", children);
+ if (pubDate)
+ entry.pubDate = new Date(pubDate);
+ return entry;
+ }),
+ };
+ addConditionally(feed, "title", "title", childs);
+ addConditionally(feed, "link", "link", childs);
+ addConditionally(feed, "description", "description", childs);
+ const updated = fetch("lastBuildDate", childs);
+ if (updated) {
+ feed.updated = new Date(updated);
+ }
+ addConditionally(feed, "author", "managingEditor", childs, true);
+ return feed;
+}
+const MEDIA_KEYS_STRING = ["url", "type", "lang"];
+const MEDIA_KEYS_INT = [
+ "fileSize",
+ "bitrate",
+ "framerate",
+ "samplingrate",
+ "channels",
+ "duration",
+ "height",
+ "width",
+];
+/**
+ * Get all media elements of a feed item.
+ *
+ * @param where Nodes to search in.
+ * @returns Media elements.
+ */
+function getMediaElements(where) {
+ return getElementsByTagName("media:content", where).map((elem) => {
+ const { attribs } = elem;
+ const media = {
+ medium: attribs["medium"],
+ isDefault: !!attribs["isDefault"],
+ };
+ for (const attrib of MEDIA_KEYS_STRING) {
+ if (attribs[attrib]) {
+ media[attrib] = attribs[attrib];
+ }
+ }
+ for (const attrib of MEDIA_KEYS_INT) {
+ if (attribs[attrib]) {
+ media[attrib] = parseInt(attribs[attrib], 10);
+ }
+ }
+ if (attribs["expression"]) {
+ media.expression = attribs["expression"];
+ }
+ return media;
+ });
+}
+/**
+ * Get one element by tag name.
+ *
+ * @param tagName Tag name to look for
+ * @param node Node to search in
+ * @returns The element or null
+ */
+function getOneElement(tagName, node) {
+ return getElementsByTagName(tagName, node, true, 1)[0];
+}
+/**
+ * Get the text content of an element with a certain tag name.
+ *
+ * @param tagName Tag name to look for.
+ * @param where Node to search in.
+ * @param recurse Whether to recurse into child nodes.
+ * @returns The text content of the element.
+ */
+function fetch(tagName, where, recurse = false) {
+ return textContent(getElementsByTagName(tagName, where, recurse, 1)).trim();
+}
+/**
+ * Adds a property to an object if it has a value.
+ *
+ * @param obj Object to be extended
+ * @param prop Property name
+ * @param tagName Tag name that contains the conditionally added property
+ * @param where Element to search for the property
+ * @param recurse Whether to recurse into child nodes.
+ */
+function addConditionally(obj, prop, tagName, where, recurse = false) {
+ const val = fetch(tagName, where, recurse);
+ if (val)
+ obj[prop] = val;
+}
+/**
+ * Checks if an element is a feed root node.
+ *
+ * @param value The name of the element to check.
+ * @returns Whether an element is a feed root node.
+ */
+function isValidFeed(value) {
+ return value === "rss" || value === "feed" || value === "rdf:RDF";
+}
+//# sourceMappingURL=feeds.js.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/feeds.js.map b/includes/external/addressbook/node_modules/domutils/lib/esm/feeds.js.map
new file mode 100644
index 0000000..f38d932
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/feeds.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"feeds.js","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["feeds.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/helpers.d.ts b/includes/external/addressbook/node_modules/domutils/lib/esm/helpers.d.ts
new file mode 100644
index 0000000..bf40d6b
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/helpers.d.ts
@@ -0,0 +1,58 @@
+import { AnyNode } from "domhandler";
+/**
+ * Given an array of nodes, remove any member that is contained by another.
+ *
+ * @category Helpers
+ * @param nodes Nodes to filter.
+ * @returns Remaining nodes that aren't subtrees of each other.
+ */
+export declare function removeSubsets(nodes: AnyNode[]): AnyNode[];
+/**
+ * @category Helpers
+ * @see {@link http://dom.spec.whatwg.org/#dom-node-comparedocumentposition}
+ */
+export declare const enum DocumentPosition {
+ DISCONNECTED = 1,
+ PRECEDING = 2,
+ FOLLOWING = 4,
+ CONTAINS = 8,
+ CONTAINED_BY = 16
+}
+/**
+ * Compare the position of one node against another node in any other document.
+ * The return value is a bitmask with the values from {@link DocumentPosition}.
+ *
+ * Document order:
+ * > There is an ordering, document order, defined on all the nodes in the
+ * > document corresponding to the order in which the first character of the
+ * > XML representation of each node occurs in the XML representation of the
+ * > document after expansion of general entities. Thus, the document element
+ * > node will be the first node. Element nodes occur before their children.
+ * > Thus, document order orders element nodes in order of the occurrence of
+ * > their start-tag in the XML (after expansion of entities). The attribute
+ * > nodes of an element occur after the element and before its children. The
+ * > relative order of attribute nodes is implementation-dependent.
+ *
+ * Source:
+ * http://www.w3.org/TR/DOM-Level-3-Core/glossary.html#dt-document-order
+ *
+ * @category Helpers
+ * @param nodeA The first node to use in the comparison
+ * @param nodeB The second node to use in the comparison
+ * @returns A bitmask describing the input nodes' relative position.
+ *
+ * See http://dom.spec.whatwg.org/#dom-node-comparedocumentposition for
+ * a description of these values.
+ */
+export declare function compareDocumentPosition(nodeA: AnyNode, nodeB: AnyNode): number;
+/**
+ * Sort an array of nodes based on their relative position in the document and
+ * remove any duplicate nodes. If the array contains nodes that do not belong to
+ * the same document, sort order is unspecified.
+ *
+ * @category Helpers
+ * @param nodes Array of DOM nodes.
+ * @returns Collection of unique nodes, sorted in document order.
+ */
+export declare function uniqueSort<T extends AnyNode>(nodes: T[]): T[];
+//# sourceMappingURL=helpers.d.ts.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/helpers.d.ts.map b/includes/external/addressbook/node_modules/domutils/lib/esm/helpers.d.ts.map
new file mode 100644
index 0000000..4e0be2d
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/helpers.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"helpers.d.ts","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,OAAO,EAAc,MAAM,YAAY,CAAC;AAE9D;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CA6BzD;AACD;;;GAGG;AACH,0BAAkB,gBAAgB;IAC9B,YAAY,IAAI;IAChB,SAAS,IAAI;IACb,SAAS,IAAI;IACb,QAAQ,IAAI;IACZ,YAAY,KAAK;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,uBAAuB,CACnC,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,OAAO,GACf,MAAM,CA4CR;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAc7D"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/helpers.js b/includes/external/addressbook/node_modules/domutils/lib/esm/helpers.js
new file mode 100644
index 0000000..38c1422
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/helpers.js
@@ -0,0 +1,135 @@
+import { hasChildren } from "domhandler";
+/**
+ * Given an array of nodes, remove any member that is contained by another.
+ *
+ * @category Helpers
+ * @param nodes Nodes to filter.
+ * @returns Remaining nodes that aren't subtrees of each other.
+ */
+export function removeSubsets(nodes) {
+ let idx = nodes.length;
+ /*
+ * Check if each node (or one of its ancestors) is already contained in the
+ * array.
+ */
+ while (--idx >= 0) {
+ const node = nodes[idx];
+ /*
+ * Remove the node if it is not unique.
+ * We are going through the array from the end, so we only
+ * have to check nodes that preceed the node under consideration in the array.
+ */
+ if (idx > 0 && nodes.lastIndexOf(node, idx - 1) >= 0) {
+ nodes.splice(idx, 1);
+ continue;
+ }
+ for (let ancestor = node.parent; ancestor; ancestor = ancestor.parent) {
+ if (nodes.includes(ancestor)) {
+ nodes.splice(idx, 1);
+ break;
+ }
+ }
+ }
+ return nodes;
+}
+/**
+ * @category Helpers
+ * @see {@link http://dom.spec.whatwg.org/#dom-node-comparedocumentposition}
+ */
+export var DocumentPosition;
+(function (DocumentPosition) {
+ DocumentPosition[DocumentPosition["DISCONNECTED"] = 1] = "DISCONNECTED";
+ DocumentPosition[DocumentPosition["PRECEDING"] = 2] = "PRECEDING";
+ DocumentPosition[DocumentPosition["FOLLOWING"] = 4] = "FOLLOWING";
+ DocumentPosition[DocumentPosition["CONTAINS"] = 8] = "CONTAINS";
+ DocumentPosition[DocumentPosition["CONTAINED_BY"] = 16] = "CONTAINED_BY";
+})(DocumentPosition || (DocumentPosition = {}));
+/**
+ * Compare the position of one node against another node in any other document.
+ * The return value is a bitmask with the values from {@link DocumentPosition}.
+ *
+ * Document order:
+ * > There is an ordering, document order, defined on all the nodes in the
+ * > document corresponding to the order in which the first character of the
+ * > XML representation of each node occurs in the XML representation of the
+ * > document after expansion of general entities. Thus, the document element
+ * > node will be the first node. Element nodes occur before their children.
+ * > Thus, document order orders element nodes in order of the occurrence of
+ * > their start-tag in the XML (after expansion of entities). The attribute
+ * > nodes of an element occur after the element and before its children. The
+ * > relative order of attribute nodes is implementation-dependent.
+ *
+ * Source:
+ * http://www.w3.org/TR/DOM-Level-3-Core/glossary.html#dt-document-order
+ *
+ * @category Helpers
+ * @param nodeA The first node to use in the comparison
+ * @param nodeB The second node to use in the comparison
+ * @returns A bitmask describing the input nodes' relative position.
+ *
+ * See http://dom.spec.whatwg.org/#dom-node-comparedocumentposition for
+ * a description of these values.
+ */
+export function compareDocumentPosition(nodeA, nodeB) {
+ const aParents = [];
+ const bParents = [];
+ if (nodeA === nodeB) {
+ return 0;
+ }
+ let current = hasChildren(nodeA) ? nodeA : nodeA.parent;
+ while (current) {
+ aParents.unshift(current);
+ current = current.parent;
+ }
+ current = hasChildren(nodeB) ? nodeB : nodeB.parent;
+ while (current) {
+ bParents.unshift(current);
+ current = current.parent;
+ }
+ const maxIdx = Math.min(aParents.length, bParents.length);
+ let idx = 0;
+ while (idx < maxIdx && aParents[idx] === bParents[idx]) {
+ idx++;
+ }
+ if (idx === 0) {
+ return DocumentPosition.DISCONNECTED;
+ }
+ const sharedParent = aParents[idx - 1];
+ const siblings = sharedParent.children;
+ const aSibling = aParents[idx];
+ const bSibling = bParents[idx];
+ if (siblings.indexOf(aSibling) > siblings.indexOf(bSibling)) {
+ if (sharedParent === nodeB) {
+ return DocumentPosition.FOLLOWING | DocumentPosition.CONTAINED_BY;
+ }
+ return DocumentPosition.FOLLOWING;
+ }
+ if (sharedParent === nodeA) {
+ return DocumentPosition.PRECEDING | DocumentPosition.CONTAINS;
+ }
+ return DocumentPosition.PRECEDING;
+}
+/**
+ * Sort an array of nodes based on their relative position in the document and
+ * remove any duplicate nodes. If the array contains nodes that do not belong to
+ * the same document, sort order is unspecified.
+ *
+ * @category Helpers
+ * @param nodes Array of DOM nodes.
+ * @returns Collection of unique nodes, sorted in document order.
+ */
+export function uniqueSort(nodes) {
+ nodes = nodes.filter((node, i, arr) => !arr.includes(node, i + 1));
+ nodes.sort((a, b) => {
+ const relative = compareDocumentPosition(a, b);
+ if (relative & DocumentPosition.PRECEDING) {
+ return -1;
+ }
+ else if (relative & DocumentPosition.FOLLOWING) {
+ return 1;
+ }
+ return 0;
+ });
+ return nodes;
+}
+//# sourceMappingURL=helpers.js.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/helpers.js.map b/includes/external/addressbook/node_modules/domutils/lib/esm/helpers.js.map
new file mode 100644
index 0000000..8d43dbd
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/helpers.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"helpers.js","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["helpers.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/index.d.ts b/includes/external/addressbook/node_modules/domutils/lib/esm/index.d.ts
new file mode 100644
index 0000000..41ab6e8
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/index.d.ts
@@ -0,0 +1,10 @@
+export * from "./stringify.js";
+export * from "./traversal.js";
+export * from "./manipulation.js";
+export * from "./querying.js";
+export * from "./legacy.js";
+export * from "./helpers.js";
+export * from "./feeds.js";
+/** @deprecated Use these methods from `domhandler` directly. */
+export { isTag, isCDATA, isText, isComment, isDocument, hasChildren, } from "domhandler";
+//# sourceMappingURL=index.d.ts.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/index.d.ts.map b/includes/external/addressbook/node_modules/domutils/lib/esm/index.d.ts.map
new file mode 100644
index 0000000..1397a26
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,gEAAgE;AAChE,OAAO,EACH,KAAK,EACL,OAAO,EACP,MAAM,EACN,SAAS,EACT,UAAU,EACV,WAAW,GACd,MAAM,YAAY,CAAC"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/index.js b/includes/external/addressbook/node_modules/domutils/lib/esm/index.js
new file mode 100644
index 0000000..918c0eb
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/index.js
@@ -0,0 +1,10 @@
+export * from "./stringify.js";
+export * from "./traversal.js";
+export * from "./manipulation.js";
+export * from "./querying.js";
+export * from "./legacy.js";
+export * from "./helpers.js";
+export * from "./feeds.js";
+/** @deprecated Use these methods from `domhandler` directly. */
+export { isTag, isCDATA, isText, isComment, isDocument, hasChildren, } from "domhandler";
+//# sourceMappingURL=index.js.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/index.js.map b/includes/external/addressbook/node_modules/domutils/lib/esm/index.js.map
new file mode 100644
index 0000000..e358339
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,gEAAgE;AAChE,OAAO,EACH,KAAK,EACL,OAAO,EACP,MAAM,EACN,SAAS,EACT,UAAU,EACV,WAAW,GACd,MAAM,YAAY,CAAC"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/legacy.d.ts b/includes/external/addressbook/node_modules/domutils/lib/esm/legacy.d.ts
new file mode 100644
index 0000000..e79592b
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/legacy.d.ts
@@ -0,0 +1,58 @@
+import { AnyNode, Element } from "domhandler";
+import type { ElementType } from "domelementtype";
+/**
+ * An object with keys to check elements against. If a key is `tag_name`,
+ * `tag_type` or `tag_contains`, it will check the value against that specific
+ * value. Otherwise, it will check an attribute with the key's name.
+ *
+ * @category Legacy Query Functions
+ */
+export interface TestElementOpts {
+ tag_name?: string | ((name: string) => boolean);
+ tag_type?: string | ((name: string) => boolean);
+ tag_contains?: string | ((data?: string) => boolean);
+ [attributeName: string]: undefined | string | ((attributeValue: string) => boolean);
+}
+/**
+ * @category Legacy Query Functions
+ * @param options An object describing nodes to look for.
+ * @param node The element to test.
+ * @returns Whether the element matches the description in `options`.
+ */
+export declare function testElement(options: TestElementOpts, node: AnyNode): boolean;
+/**
+ * @category Legacy Query Functions
+ * @param options An object describing nodes to look for.
+ * @param nodes Nodes to search through.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes that match `options`.
+ */
+export declare function getElements(options: TestElementOpts, nodes: AnyNode | AnyNode[], recurse: boolean, limit?: number): AnyNode[];
+/**
+ * @category Legacy Query Functions
+ * @param id The unique ID attribute value to look for.
+ * @param nodes Nodes to search through.
+ * @param recurse Also consider child nodes.
+ * @returns The node with the supplied ID.
+ */
+export declare function getElementById(id: string | ((id: string) => boolean), nodes: AnyNode | AnyNode[], recurse?: boolean): Element | null;
+/**
+ * @category Legacy Query Functions
+ * @param tagName Tag name to search for.
+ * @param nodes Nodes to search through.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes with the supplied `tagName`.
+ */
+export declare function getElementsByTagName(tagName: string | ((name: string) => boolean), nodes: AnyNode | AnyNode[], recurse?: boolean, limit?: number): Element[];
+/**
+ * @category Legacy Query Functions
+ * @param type Element type to look for.
+ * @param nodes Nodes to search through.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes with the supplied `type`.
+ */
+export declare function getElementsByTagType(type: ElementType | ((type: ElementType) => boolean), nodes: AnyNode | AnyNode[], recurse?: boolean, limit?: number): AnyNode[];
+//# sourceMappingURL=legacy.d.ts.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/legacy.d.ts.map b/includes/external/addressbook/node_modules/domutils/lib/esm/legacy.d.ts.map
new file mode 100644
index 0000000..1c17c8b
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/legacy.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"legacy.d.ts","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["legacy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAKlD;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IAChD,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IAChD,YAAY,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IACrD,CAAC,aAAa,EAAE,MAAM,GAChB,SAAS,GACT,MAAM,GACN,CAAC,CAAC,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;CAC/C;AAsED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAG5E;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACvB,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,EAC1B,OAAO,EAAE,OAAO,EAChB,KAAK,SAAW,GACjB,OAAO,EAAE,CAGX;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC1B,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,EACtC,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,EAC1B,OAAO,UAAO,GACf,OAAO,GAAG,IAAI,CAGhB;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAChC,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,EAC7C,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,EAC1B,OAAO,UAAO,EACd,KAAK,SAAW,GACjB,OAAO,EAAE,CAOX;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAChC,IAAI,EAAE,WAAW,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,EACpD,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,EAC1B,OAAO,UAAO,EACd,KAAK,SAAW,GACjB,OAAO,EAAE,CAEX"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/legacy.js b/includes/external/addressbook/node_modules/domutils/lib/esm/legacy.js
new file mode 100644
index 0000000..113f470
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/legacy.js
@@ -0,0 +1,117 @@
+import { isTag, isText } from "domhandler";
+import { filter, findOne } from "./querying.js";
+const Checks = {
+ tag_name(name) {
+ if (typeof name === "function") {
+ return (elem) => isTag(elem) && name(elem.name);
+ }
+ else if (name === "*") {
+ return isTag;
+ }
+ return (elem) => isTag(elem) && elem.name === name;
+ },
+ tag_type(type) {
+ if (typeof type === "function") {
+ return (elem) => type(elem.type);
+ }
+ return (elem) => elem.type === type;
+ },
+ tag_contains(data) {
+ if (typeof data === "function") {
+ return (elem) => isText(elem) && data(elem.data);
+ }
+ return (elem) => isText(elem) && elem.data === data;
+ },
+};
+/**
+ * @param attrib Attribute to check.
+ * @param value Attribute value to look for.
+ * @returns A function to check whether the a node has an attribute with a
+ * particular value.
+ */
+function getAttribCheck(attrib, value) {
+ if (typeof value === "function") {
+ return (elem) => isTag(elem) && value(elem.attribs[attrib]);
+ }
+ return (elem) => isTag(elem) && elem.attribs[attrib] === value;
+}
+/**
+ * @param a First function to combine.
+ * @param b Second function to combine.
+ * @returns A function taking a node and returning `true` if either of the input
+ * functions returns `true` for the node.
+ */
+function combineFuncs(a, b) {
+ return (elem) => a(elem) || b(elem);
+}
+/**
+ * @param options An object describing nodes to look for.
+ * @returns A function executing all checks in `options` and returning `true` if
+ * any of them match a node.
+ */
+function compileTest(options) {
+ const funcs = Object.keys(options).map((key) => {
+ const value = options[key];
+ return Object.prototype.hasOwnProperty.call(Checks, key)
+ ? Checks[key](value)
+ : getAttribCheck(key, value);
+ });
+ return funcs.length === 0 ? null : funcs.reduce(combineFuncs);
+}
+/**
+ * @category Legacy Query Functions
+ * @param options An object describing nodes to look for.
+ * @param node The element to test.
+ * @returns Whether the element matches the description in `options`.
+ */
+export function testElement(options, node) {
+ const test = compileTest(options);
+ return test ? test(node) : true;
+}
+/**
+ * @category Legacy Query Functions
+ * @param options An object describing nodes to look for.
+ * @param nodes Nodes to search through.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes that match `options`.
+ */
+export function getElements(options, nodes, recurse, limit = Infinity) {
+ const test = compileTest(options);
+ return test ? filter(test, nodes, recurse, limit) : [];
+}
+/**
+ * @category Legacy Query Functions
+ * @param id The unique ID attribute value to look for.
+ * @param nodes Nodes to search through.
+ * @param recurse Also consider child nodes.
+ * @returns The node with the supplied ID.
+ */
+export function getElementById(id, nodes, recurse = true) {
+ if (!Array.isArray(nodes))
+ nodes = [nodes];
+ return findOne(getAttribCheck("id", id), nodes, recurse);
+}
+/**
+ * @category Legacy Query Functions
+ * @param tagName Tag name to search for.
+ * @param nodes Nodes to search through.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes with the supplied `tagName`.
+ */
+export function getElementsByTagName(tagName, nodes, recurse = true, limit = Infinity) {
+ return filter(Checks["tag_name"](tagName), nodes, recurse, limit);
+}
+/**
+ * @category Legacy Query Functions
+ * @param type Element type to look for.
+ * @param nodes Nodes to search through.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes with the supplied `type`.
+ */
+export function getElementsByTagType(type, nodes, recurse = true, limit = Infinity) {
+ return filter(Checks["tag_type"](type), nodes, recurse, limit);
+}
+//# sourceMappingURL=legacy.js.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/legacy.js.map b/includes/external/addressbook/node_modules/domutils/lib/esm/legacy.js.map
new file mode 100644
index 0000000..5bee1a8
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/legacy.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"legacy.js","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["legacy.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/manipulation.d.ts b/includes/external/addressbook/node_modules/domutils/lib/esm/manipulation.d.ts
new file mode 100644
index 0000000..89763f1
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/manipulation.d.ts
@@ -0,0 +1,49 @@
+import type { ChildNode, Element } from "domhandler";
+/**
+ * Remove an element from the dom
+ *
+ * @category Manipulation
+ * @param elem The element to be removed
+ */
+export declare function removeElement(elem: ChildNode): void;
+/**
+ * Replace an element in the dom
+ *
+ * @category Manipulation
+ * @param elem The element to be replaced
+ * @param replacement The element to be added
+ */
+export declare function replaceElement(elem: ChildNode, replacement: ChildNode): void;
+/**
+ * Append a child to an element.
+ *
+ * @category Manipulation
+ * @param elem The element to append to.
+ * @param child The element to be added as a child.
+ */
+export declare function appendChild(elem: Element, child: ChildNode): void;
+/**
+ * Append an element after another.
+ *
+ * @category Manipulation
+ * @param elem The element to append after.
+ * @param next The element be added.
+ */
+export declare function append(elem: ChildNode, next: ChildNode): void;
+/**
+ * Prepend a child to an element.
+ *
+ * @category Manipulation
+ * @param elem The element to prepend before.
+ * @param child The element to be added as a child.
+ */
+export declare function prependChild(elem: Element, child: ChildNode): void;
+/**
+ * Prepend an element before another.
+ *
+ * @category Manipulation
+ * @param elem The element to prepend before.
+ * @param prev The element be added.
+ */
+export declare function prepend(elem: ChildNode, prev: ChildNode): void;
+//# sourceMappingURL=manipulation.d.ts.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/manipulation.d.ts.map b/includes/external/addressbook/node_modules/domutils/lib/esm/manipulation.d.ts.map
new file mode 100644
index 0000000..dcb4848
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/manipulation.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"manipulation.d.ts","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["manipulation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAQnD;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,GAAG,IAAI,CAiB5E;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAajE;AAED;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,CAoB7D;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAalE;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,CAiB9D"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/manipulation.js b/includes/external/addressbook/node_modules/domutils/lib/esm/manipulation.js
new file mode 100644
index 0000000..d228da8
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/manipulation.js
@@ -0,0 +1,128 @@
+/**
+ * Remove an element from the dom
+ *
+ * @category Manipulation
+ * @param elem The element to be removed
+ */
+export function removeElement(elem) {
+ if (elem.prev)
+ elem.prev.next = elem.next;
+ if (elem.next)
+ elem.next.prev = elem.prev;
+ if (elem.parent) {
+ const childs = elem.parent.children;
+ childs.splice(childs.lastIndexOf(elem), 1);
+ }
+}
+/**
+ * Replace an element in the dom
+ *
+ * @category Manipulation
+ * @param elem The element to be replaced
+ * @param replacement The element to be added
+ */
+export function replaceElement(elem, replacement) {
+ const prev = (replacement.prev = elem.prev);
+ if (prev) {
+ prev.next = replacement;
+ }
+ const next = (replacement.next = elem.next);
+ if (next) {
+ next.prev = replacement;
+ }
+ const parent = (replacement.parent = elem.parent);
+ if (parent) {
+ const childs = parent.children;
+ childs[childs.lastIndexOf(elem)] = replacement;
+ elem.parent = null;
+ }
+}
+/**
+ * Append a child to an element.
+ *
+ * @category Manipulation
+ * @param elem The element to append to.
+ * @param child The element to be added as a child.
+ */
+export function appendChild(elem, child) {
+ removeElement(child);
+ child.next = null;
+ child.parent = elem;
+ if (elem.children.push(child) > 1) {
+ const sibling = elem.children[elem.children.length - 2];
+ sibling.next = child;
+ child.prev = sibling;
+ }
+ else {
+ child.prev = null;
+ }
+}
+/**
+ * Append an element after another.
+ *
+ * @category Manipulation
+ * @param elem The element to append after.
+ * @param next The element be added.
+ */
+export function append(elem, next) {
+ removeElement(next);
+ const { parent } = elem;
+ const currNext = elem.next;
+ next.next = currNext;
+ next.prev = elem;
+ elem.next = next;
+ next.parent = parent;
+ if (currNext) {
+ currNext.prev = next;
+ if (parent) {
+ const childs = parent.children;
+ childs.splice(childs.lastIndexOf(currNext), 0, next);
+ }
+ }
+ else if (parent) {
+ parent.children.push(next);
+ }
+}
+/**
+ * Prepend a child to an element.
+ *
+ * @category Manipulation
+ * @param elem The element to prepend before.
+ * @param child The element to be added as a child.
+ */
+export function prependChild(elem, child) {
+ removeElement(child);
+ child.parent = elem;
+ child.prev = null;
+ if (elem.children.unshift(child) !== 1) {
+ const sibling = elem.children[1];
+ sibling.prev = child;
+ child.next = sibling;
+ }
+ else {
+ child.next = null;
+ }
+}
+/**
+ * Prepend an element before another.
+ *
+ * @category Manipulation
+ * @param elem The element to prepend before.
+ * @param prev The element be added.
+ */
+export function prepend(elem, prev) {
+ removeElement(prev);
+ const { parent } = elem;
+ if (parent) {
+ const childs = parent.children;
+ childs.splice(childs.indexOf(elem), 0, prev);
+ }
+ if (elem.prev) {
+ elem.prev.next = prev;
+ }
+ prev.parent = parent;
+ prev.prev = elem.prev;
+ prev.next = elem;
+ elem.prev = prev;
+}
+//# sourceMappingURL=manipulation.js.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/manipulation.js.map b/includes/external/addressbook/node_modules/domutils/lib/esm/manipulation.js.map
new file mode 100644
index 0000000..0d42de0
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/manipulation.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"manipulation.js","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["manipulation.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/package.json b/includes/external/addressbook/node_modules/domutils/lib/esm/package.json
new file mode 100644
index 0000000..089153b
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/package.json
@@ -0,0 +1 @@
+{"type":"module"}
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/querying.d.ts b/includes/external/addressbook/node_modules/domutils/lib/esm/querying.d.ts
new file mode 100644
index 0000000..3e2296a
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/querying.d.ts
@@ -0,0 +1,62 @@
+import { Element, AnyNode } from "domhandler";
+/**
+ * Search a node and its children for nodes passing a test function.
+ *
+ * @category Querying
+ * @param test Function to test nodes on.
+ * @param node Node to search. Will be included in the result set if it matches.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes passing `test`.
+ */
+export declare function filter(test: (elem: AnyNode) => boolean, node: AnyNode | AnyNode[], recurse?: boolean, limit?: number): AnyNode[];
+/**
+ * Search an array of node and its children for nodes passing a test function.
+ *
+ * @category Querying
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes passing `test`.
+ */
+export declare function find(test: (elem: AnyNode) => boolean, nodes: AnyNode[], recurse: boolean, limit: number): AnyNode[];
+/**
+ * Finds the first element inside of an array that matches a test function.
+ *
+ * @category Querying
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @returns The first node in the array that passes `test`.
+ * @deprecated Use `Array.prototype.find` directly.
+ */
+export declare function findOneChild<T>(test: (elem: T) => boolean, nodes: T[]): T | undefined;
+/**
+ * Finds one element in a tree that passes a test.
+ *
+ * @category Querying
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @param recurse Also consider child nodes.
+ * @returns The first child node that passes `test`.
+ */
+export declare function findOne(test: (elem: Element) => boolean, nodes: AnyNode[], recurse?: boolean): Element | null;
+/**
+ * @category Querying
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @returns Whether a tree of nodes contains at least one node passing the test.
+ */
+export declare function existsOne(test: (elem: Element) => boolean, nodes: AnyNode[]): boolean;
+/**
+ * Search and array of nodes and its children for elements passing a test function.
+ *
+ * Same as `find`, but limited to elements and with less options, leading to reduced complexity.
+ *
+ * @category Querying
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @returns All nodes passing `test`.
+ */
+export declare function findAll(test: (elem: Element) => boolean, nodes: AnyNode[]): Element[];
+//# sourceMappingURL=querying.d.ts.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/querying.d.ts.map b/includes/external/addressbook/node_modules/domutils/lib/esm/querying.d.ts.map
new file mode 100644
index 0000000..8b9da87
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/querying.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"querying.d.ts","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["querying.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAElE;;;;;;;;;GASG;AACH,wBAAgB,MAAM,CAClB,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,EAChC,IAAI,EAAE,OAAO,GAAG,OAAO,EAAE,EACzB,OAAO,UAAO,EACd,KAAK,SAAW,GACjB,OAAO,EAAE,CAGX;AAED;;;;;;;;;GASG;AACH,wBAAgB,IAAI,CAChB,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,EAChC,KAAK,EAAE,OAAO,EAAE,EAChB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,GACd,OAAO,EAAE,CAkBX;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAC1B,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,EAC1B,KAAK,EAAE,CAAC,EAAE,GACX,CAAC,GAAG,SAAS,CAEf;AAED;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CACnB,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,EAChC,KAAK,EAAE,OAAO,EAAE,EAChB,OAAO,UAAO,GACf,OAAO,GAAG,IAAI,CAehB;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CACrB,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,EAChC,KAAK,EAAE,OAAO,EAAE,GACjB,OAAO,CAQT;AAED;;;;;;;;;GASG;AACH,wBAAgB,OAAO,CACnB,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,EAChC,KAAK,EAAE,OAAO,EAAE,GACjB,OAAO,EAAE,CAYX"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/querying.js b/includes/external/addressbook/node_modules/domutils/lib/esm/querying.js
new file mode 100644
index 0000000..c4b3a8d
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/querying.js
@@ -0,0 +1,119 @@
+import { isTag, hasChildren } from "domhandler";
+/**
+ * Search a node and its children for nodes passing a test function.
+ *
+ * @category Querying
+ * @param test Function to test nodes on.
+ * @param node Node to search. Will be included in the result set if it matches.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes passing `test`.
+ */
+export function filter(test, node, recurse = true, limit = Infinity) {
+ if (!Array.isArray(node))
+ node = [node];
+ return find(test, node, recurse, limit);
+}
+/**
+ * Search an array of node and its children for nodes passing a test function.
+ *
+ * @category Querying
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes passing `test`.
+ */
+export function find(test, nodes, recurse, limit) {
+ const result = [];
+ for (const elem of nodes) {
+ if (test(elem)) {
+ result.push(elem);
+ if (--limit <= 0)
+ break;
+ }
+ if (recurse && hasChildren(elem) && elem.children.length > 0) {
+ const children = find(test, elem.children, recurse, limit);
+ result.push(...children);
+ limit -= children.length;
+ if (limit <= 0)
+ break;
+ }
+ }
+ return result;
+}
+/**
+ * Finds the first element inside of an array that matches a test function.
+ *
+ * @category Querying
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @returns The first node in the array that passes `test`.
+ * @deprecated Use `Array.prototype.find` directly.
+ */
+export function findOneChild(test, nodes) {
+ return nodes.find(test);
+}
+/**
+ * Finds one element in a tree that passes a test.
+ *
+ * @category Querying
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @param recurse Also consider child nodes.
+ * @returns The first child node that passes `test`.
+ */
+export function findOne(test, nodes, recurse = true) {
+ let elem = null;
+ for (let i = 0; i < nodes.length && !elem; i++) {
+ const checked = nodes[i];
+ if (!isTag(checked)) {
+ continue;
+ }
+ else if (test(checked)) {
+ elem = checked;
+ }
+ else if (recurse && checked.children.length > 0) {
+ elem = findOne(test, checked.children, true);
+ }
+ }
+ return elem;
+}
+/**
+ * @category Querying
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @returns Whether a tree of nodes contains at least one node passing the test.
+ */
+export function existsOne(test, nodes) {
+ return nodes.some((checked) => isTag(checked) &&
+ (test(checked) ||
+ (checked.children.length > 0 &&
+ existsOne(test, checked.children))));
+}
+/**
+ * Search and array of nodes and its children for elements passing a test function.
+ *
+ * Same as `find`, but limited to elements and with less options, leading to reduced complexity.
+ *
+ * @category Querying
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @returns All nodes passing `test`.
+ */
+export function findAll(test, nodes) {
+ var _a;
+ const result = [];
+ const stack = nodes.filter(isTag);
+ let elem;
+ while ((elem = stack.shift())) {
+ const children = (_a = elem.children) === null || _a === void 0 ? void 0 : _a.filter(isTag);
+ if (children && children.length > 0) {
+ stack.unshift(...children);
+ }
+ if (test(elem))
+ result.push(elem);
+ }
+ return result;
+}
+//# sourceMappingURL=querying.js.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/querying.js.map b/includes/external/addressbook/node_modules/domutils/lib/esm/querying.js.map
new file mode 100644
index 0000000..6f03055
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/querying.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"querying.js","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["querying.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAoB,MAAM,YAAY,CAAC;AAElE;;;;;;;;;GASG;AACH,MAAM,UAAU,MAAM,CAClB,IAAgC,EAChC,IAAyB,EACzB,OAAO,GAAG,IAAI,EACd,KAAK,GAAG,QAAQ;IAEhB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IACxC,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,IAAI,CAChB,IAAgC,EAChC,KAAgB,EAChB,OAAgB,EAChB,KAAa;IAEb,MAAM,MAAM,GAAc,EAAE,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACtB,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE;YACZ,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,IAAI,EAAE,KAAK,IAAI,CAAC;gBAAE,MAAM;SAC3B;QAED,IAAI,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YAC3D,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;YACzB,KAAK,IAAI,QAAQ,CAAC,MAAM,CAAC;YACzB,IAAI,KAAK,IAAI,CAAC;gBAAE,MAAM;SACzB;KACJ;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CACxB,IAA0B,EAC1B,KAAU;IAEV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,OAAO,CACnB,IAAgC,EAChC,KAAgB,EAChB,OAAO,GAAG,IAAI;IAEd,IAAI,IAAI,GAAG,IAAI,CAAC;IAEhB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;YACjB,SAAS;SACZ;aAAM,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE;YACtB,IAAI,GAAG,OAAO,CAAC;SAClB;aAAM,IAAI,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YAC/C,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;SAChD;KACJ;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CACrB,IAAgC,EAChC,KAAgB;IAEhB,OAAO,KAAK,CAAC,IAAI,CACb,CAAC,OAAO,EAAE,EAAE,CACR,KAAK,CAAC,OAAO,CAAC;QACd,CAAC,IAAI,CAAC,OAAO,CAAC;YACV,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;gBACxB,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAClD,CAAC;AACN,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,OAAO,CACnB,IAAgC,EAChC,KAAgB;;IAEhB,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,IAAI,CAAC;IACT,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE;QAC3B,MAAM,QAAQ,GAAG,MAAA,IAAI,CAAC,QAAQ,0CAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YACjC,KAAK,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;SAC9B;QACD,IAAI,IAAI,CAAC,IAAI,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KACrC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/stringify.d.ts b/includes/external/addressbook/node_modules/domutils/lib/esm/stringify.d.ts
new file mode 100644
index 0000000..a643f70
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/stringify.d.ts
@@ -0,0 +1,46 @@
+import { AnyNode } from "domhandler";
+import { DomSerializerOptions } from "dom-serializer";
+/**
+ * @category Stringify
+ * @deprecated Use the `dom-serializer` module directly.
+ * @param node Node to get the outer HTML of.
+ * @param options Options for serialization.
+ * @returns `node`'s outer HTML.
+ */
+export declare function getOuterHTML(node: AnyNode | ArrayLike<AnyNode>, options?: DomSerializerOptions): string;
+/**
+ * @category Stringify
+ * @deprecated Use the `dom-serializer` module directly.
+ * @param node Node to get the inner HTML of.
+ * @param options Options for serialization.
+ * @returns `node`'s inner HTML.
+ */
+export declare function getInnerHTML(node: AnyNode, options?: DomSerializerOptions): string;
+/**
+ * Get a node's inner text. Same as `textContent`, but inserts newlines for `<br>` tags.
+ *
+ * @category Stringify
+ * @deprecated Use `textContent` instead.
+ * @param node Node to get the inner text of.
+ * @returns `node`'s inner text.
+ */
+export declare function getText(node: AnyNode | AnyNode[]): string;
+/**
+ * Get a node's text content.
+ *
+ * @category Stringify
+ * @param node Node to get the text content of.
+ * @returns `node`'s text content.
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent}
+ */
+export declare function textContent(node: AnyNode | AnyNode[]): string;
+/**
+ * Get a node's inner text.
+ *
+ * @category Stringify
+ * @param node Node to get the inner text of.
+ * @returns `node`'s inner text.
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Node/innerText}
+ */
+export declare function innerText(node: AnyNode | AnyNode[]): string;
+//# sourceMappingURL=stringify.d.ts.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/stringify.d.ts.map b/includes/external/addressbook/node_modules/domutils/lib/esm/stringify.d.ts.map
new file mode 100644
index 0000000..8da073b
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/stringify.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"stringify.d.ts","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["stringify.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,OAAO,EAEV,MAAM,YAAY,CAAC;AACpB,OAAmB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAGlE;;;;;;GAMG;AACH,wBAAgB,YAAY,CACxB,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,EAClC,OAAO,CAAC,EAAE,oBAAoB,GAC/B,MAAM,CAER;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CACxB,IAAI,EAAE,OAAO,EACb,OAAO,CAAC,EAAE,oBAAoB,GAC/B,MAAM,CAIR;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,MAAM,CAMzD;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,MAAM,CAO7D;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,MAAM,CAO3D"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/stringify.js b/includes/external/addressbook/node_modules/domutils/lib/esm/stringify.js
new file mode 100644
index 0000000..1c389e6
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/stringify.js
@@ -0,0 +1,81 @@
+import { isTag, isCDATA, isText, hasChildren, isComment, } from "domhandler";
+import renderHTML from "dom-serializer";
+import { ElementType } from "domelementtype";
+/**
+ * @category Stringify
+ * @deprecated Use the `dom-serializer` module directly.
+ * @param node Node to get the outer HTML of.
+ * @param options Options for serialization.
+ * @returns `node`'s outer HTML.
+ */
+export function getOuterHTML(node, options) {
+ return renderHTML(node, options);
+}
+/**
+ * @category Stringify
+ * @deprecated Use the `dom-serializer` module directly.
+ * @param node Node to get the inner HTML of.
+ * @param options Options for serialization.
+ * @returns `node`'s inner HTML.
+ */
+export function getInnerHTML(node, options) {
+ return hasChildren(node)
+ ? node.children.map((node) => getOuterHTML(node, options)).join("")
+ : "";
+}
+/**
+ * Get a node's inner text. Same as `textContent`, but inserts newlines for `<br>` tags.
+ *
+ * @category Stringify
+ * @deprecated Use `textContent` instead.
+ * @param node Node to get the inner text of.
+ * @returns `node`'s inner text.
+ */
+export function getText(node) {
+ if (Array.isArray(node))
+ return node.map(getText).join("");
+ if (isTag(node))
+ return node.name === "br" ? "\n" : getText(node.children);
+ if (isCDATA(node))
+ return getText(node.children);
+ if (isText(node))
+ return node.data;
+ return "";
+}
+/**
+ * Get a node's text content.
+ *
+ * @category Stringify
+ * @param node Node to get the text content of.
+ * @returns `node`'s text content.
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent}
+ */
+export function textContent(node) {
+ if (Array.isArray(node))
+ return node.map(textContent).join("");
+ if (hasChildren(node) && !isComment(node)) {
+ return textContent(node.children);
+ }
+ if (isText(node))
+ return node.data;
+ return "";
+}
+/**
+ * Get a node's inner text.
+ *
+ * @category Stringify
+ * @param node Node to get the inner text of.
+ * @returns `node`'s inner text.
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Node/innerText}
+ */
+export function innerText(node) {
+ if (Array.isArray(node))
+ return node.map(innerText).join("");
+ if (hasChildren(node) && (node.type === ElementType.Tag || isCDATA(node))) {
+ return innerText(node.children);
+ }
+ if (isText(node))
+ return node.data;
+ return "";
+}
+//# sourceMappingURL=stringify.js.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/stringify.js.map b/includes/external/addressbook/node_modules/domutils/lib/esm/stringify.js.map
new file mode 100644
index 0000000..8fbb595
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/stringify.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"stringify.js","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["stringify.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,EACL,OAAO,EACP,MAAM,EACN,WAAW,EAEX,SAAS,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,UAAoC,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CACxB,IAAkC,EAClC,OAA8B;IAE9B,OAAO,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CACxB,IAAa,EACb,OAA8B;IAE9B,OAAO,WAAW,CAAC,IAAI,CAAC;QACpB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACnE,CAAC,CAAC,EAAE,CAAC;AACb,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,OAAO,CAAC,IAAyB;IAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3D,IAAI,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3E,IAAI,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjD,IAAI,MAAM,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC;IACnC,OAAO,EAAE,CAAC;AACd,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,IAAyB;IACjD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/D,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;QACvC,OAAO,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACrC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC;IACnC,OAAO,EAAE,CAAC;AACd,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS,CAAC,IAAyB;IAC/C,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7D,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE;QACvE,OAAO,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACnC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC;IACnC,OAAO,EAAE,CAAC;AACd,CAAC"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/traversal.d.ts b/includes/external/addressbook/node_modules/domutils/lib/esm/traversal.d.ts
new file mode 100644
index 0000000..213e6a9
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/traversal.d.ts
@@ -0,0 +1,65 @@
+import { AnyNode, ChildNode, Element, ParentNode } from "domhandler";
+/**
+ * Get a node's children.
+ *
+ * @category Traversal
+ * @param elem Node to get the children of.
+ * @returns `elem`'s children, or an empty array.
+ */
+export declare function getChildren(elem: AnyNode): ChildNode[];
+export declare function getParent(elem: AnyNode): ParentNode | null;
+/**
+ * Gets an elements siblings, including the element itself.
+ *
+ * Attempts to get the children through the element's parent first. If we don't
+ * have a parent (the element is a root node), we walk the element's `prev` &
+ * `next` to get all remaining nodes.
+ *
+ * @category Traversal
+ * @param elem Element to get the siblings of.
+ * @returns `elem`'s siblings.
+ */
+export declare function getSiblings(elem: AnyNode): AnyNode[];
+/**
+ * Gets an attribute from an element.
+ *
+ * @category Traversal
+ * @param elem Element to check.
+ * @param name Attribute name to retrieve.
+ * @returns The element's attribute value, or `undefined`.
+ */
+export declare function getAttributeValue(elem: Element, name: string): string | undefined;
+/**
+ * Checks whether an element has an attribute.
+ *
+ * @category Traversal
+ * @param elem Element to check.
+ * @param name Attribute name to look for.
+ * @returns Returns whether `elem` has the attribute `name`.
+ */
+export declare function hasAttrib(elem: Element, name: string): boolean;
+/**
+ * Get the tag name of an element.
+ *
+ * @category Traversal
+ * @param elem The element to get the name for.
+ * @returns The tag name of `elem`.
+ */
+export declare function getName(elem: Element): string;
+/**
+ * Returns the next element sibling of a node.
+ *
+ * @category Traversal
+ * @param elem The element to get the next sibling of.
+ * @returns `elem`'s next sibling that is a tag.
+ */
+export declare function nextElementSibling(elem: AnyNode): Element | null;
+/**
+ * Returns the previous element sibling of a node.
+ *
+ * @category Traversal
+ * @param elem The element to get the previous sibling of.
+ * @returns `elem`'s previous sibling that is a tag.
+ */
+export declare function prevElementSibling(elem: AnyNode): Element | null;
+//# sourceMappingURL=traversal.d.ts.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/traversal.d.ts.map b/includes/external/addressbook/node_modules/domutils/lib/esm/traversal.d.ts.map
new file mode 100644
index 0000000..cdf1710
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/traversal.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"traversal.d.ts","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["traversal.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,OAAO,EACP,SAAS,EACT,OAAO,EACP,UAAU,EAEb,MAAM,YAAY,CAAC;AAEpB;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,EAAE,CAEtD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI,CAAC;AAY5D;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,EAAE,CAepD;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC7B,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,MAAM,GACb,MAAM,GAAG,SAAS,CAEpB;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAM9D;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAE7C;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI,CAIhE;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI,CAIhE"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/traversal.js b/includes/external/addressbook/node_modules/domutils/lib/esm/traversal.js
new file mode 100644
index 0000000..71dddd7
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/traversal.js
@@ -0,0 +1,110 @@
+import { isTag, hasChildren, } from "domhandler";
+/**
+ * Get a node's children.
+ *
+ * @category Traversal
+ * @param elem Node to get the children of.
+ * @returns `elem`'s children, or an empty array.
+ */
+export function getChildren(elem) {
+ return hasChildren(elem) ? elem.children : [];
+}
+/**
+ * Get a node's parent.
+ *
+ * @category Traversal
+ * @param elem Node to get the parent of.
+ * @returns `elem`'s parent node.
+ */
+export function getParent(elem) {
+ return elem.parent || null;
+}
+/**
+ * Gets an elements siblings, including the element itself.
+ *
+ * Attempts to get the children through the element's parent first. If we don't
+ * have a parent (the element is a root node), we walk the element's `prev` &
+ * `next` to get all remaining nodes.
+ *
+ * @category Traversal
+ * @param elem Element to get the siblings of.
+ * @returns `elem`'s siblings.
+ */
+export function getSiblings(elem) {
+ const parent = getParent(elem);
+ if (parent != null)
+ return getChildren(parent);
+ const siblings = [elem];
+ let { prev, next } = elem;
+ while (prev != null) {
+ siblings.unshift(prev);
+ ({ prev } = prev);
+ }
+ while (next != null) {
+ siblings.push(next);
+ ({ next } = next);
+ }
+ return siblings;
+}
+/**
+ * Gets an attribute from an element.
+ *
+ * @category Traversal
+ * @param elem Element to check.
+ * @param name Attribute name to retrieve.
+ * @returns The element's attribute value, or `undefined`.
+ */
+export function getAttributeValue(elem, name) {
+ var _a;
+ return (_a = elem.attribs) === null || _a === void 0 ? void 0 : _a[name];
+}
+/**
+ * Checks whether an element has an attribute.
+ *
+ * @category Traversal
+ * @param elem Element to check.
+ * @param name Attribute name to look for.
+ * @returns Returns whether `elem` has the attribute `name`.
+ */
+export function hasAttrib(elem, name) {
+ return (elem.attribs != null &&
+ Object.prototype.hasOwnProperty.call(elem.attribs, name) &&
+ elem.attribs[name] != null);
+}
+/**
+ * Get the tag name of an element.
+ *
+ * @category Traversal
+ * @param elem The element to get the name for.
+ * @returns The tag name of `elem`.
+ */
+export function getName(elem) {
+ return elem.name;
+}
+/**
+ * Returns the next element sibling of a node.
+ *
+ * @category Traversal
+ * @param elem The element to get the next sibling of.
+ * @returns `elem`'s next sibling that is a tag.
+ */
+export function nextElementSibling(elem) {
+ let { next } = elem;
+ while (next !== null && !isTag(next))
+ ({ next } = next);
+ return next;
+}
+/**
+ * Returns the previous element sibling of a node.
+ *
+ * @category Traversal
+ * @param elem The element to get the previous sibling of.
+ * @returns `elem`'s previous sibling that is a tag.
+ */
+export function prevElementSibling(elem) {
+ let { prev } = elem;
+ while (prev !== null && !isTag(prev))
+ ({ prev } = prev);
+ return prev;
+}
+//# sourceMappingURL=traversal.js.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/esm/traversal.js.map b/includes/external/addressbook/node_modules/domutils/lib/esm/traversal.js.map
new file mode 100644
index 0000000..cf3c398
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/esm/traversal.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"traversal.js","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["traversal.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,EAKL,WAAW,GACd,MAAM,YAAY,CAAC;AAEpB;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,IAAa;IACrC,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;AAClD,CAAC;AAGD;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,IAAa;IACnC,OAAO,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC;AAC/B,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,WAAW,CAAC,IAAa;IACrC,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,MAAM,IAAI,IAAI;QAAE,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;IAE/C,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,CAAC;IACxB,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IAC1B,OAAO,IAAI,IAAI,IAAI,EAAE;QACjB,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;KACrB;IACD,OAAO,IAAI,IAAI,IAAI,EAAE;QACjB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;KACrB;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAC7B,IAAa,EACb,IAAY;;IAEZ,OAAO,MAAA,IAAI,CAAC,OAAO,0CAAG,IAAI,CAAC,CAAC;AAChC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS,CAAC,IAAa,EAAE,IAAY;IACjD,OAAO,CACH,IAAI,CAAC,OAAO,IAAI,IAAI;QACpB,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC;QACxD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAC7B,CAAC;AACN,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CAAC,IAAa;IACjC,OAAO,IAAI,CAAC,IAAI,CAAC;AACrB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAa;IAC5C,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IACpB,OAAO,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAa;IAC5C,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IACpB,OAAO,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC;AAChB,CAAC"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/feeds.d.ts b/includes/external/addressbook/node_modules/domutils/lib/feeds.d.ts
new file mode 100644
index 0000000..5ba60c7
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/feeds.d.ts
@@ -0,0 +1,71 @@
+import type { AnyNode } from "domhandler";
+/**
+ * The type of a media item.
+ *
+ * @category Feeds
+ */
+export declare type FeedItemMediaMedium = "image" | "audio" | "video" | "document" | "executable";
+/**
+ * The type of a media item.
+ *
+ * @category Feeds
+ */
+export declare type FeedItemMediaExpression = "sample" | "full" | "nonstop";
+/**
+ * A media item of a feed entry.
+ *
+ * @category Feeds
+ */
+export interface FeedItemMedia {
+ medium: FeedItemMediaMedium | undefined;
+ isDefault: boolean;
+ url?: string;
+ fileSize?: number;
+ type?: string;
+ expression?: FeedItemMediaExpression;
+ bitrate?: number;
+ framerate?: number;
+ samplingrate?: number;
+ channels?: number;
+ duration?: number;
+ height?: number;
+ width?: number;
+ lang?: string;
+}
+/**
+ * An entry of a feed.
+ *
+ * @category Feeds
+ */
+export interface FeedItem {
+ id?: string;
+ title?: string;
+ link?: string;
+ description?: string;
+ pubDate?: Date;
+ media: FeedItemMedia[];
+}
+/**
+ * The root of a feed.
+ *
+ * @category Feeds
+ */
+export interface Feed {
+ type: string;
+ id?: string;
+ title?: string;
+ link?: string;
+ description?: string;
+ updated?: Date;
+ author?: string;
+ items: FeedItem[];
+}
+/**
+ * Get the feed object from the root of a DOM tree.
+ *
+ * @category Feeds
+ * @param doc - The DOM to to extract the feed from.
+ * @returns The feed.
+ */
+export declare function getFeed(doc: AnyNode[]): Feed | null;
+//# sourceMappingURL=feeds.d.ts.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/feeds.d.ts.map b/includes/external/addressbook/node_modules/domutils/lib/feeds.d.ts.map
new file mode 100644
index 0000000..7228bc1
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/feeds.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"feeds.d.ts","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["feeds.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAW,MAAM,YAAY,CAAC;AAInD;;;;GAIG;AACH,oBAAY,mBAAmB,GACzB,OAAO,GACP,OAAO,GACP,OAAO,GACP,UAAU,GACV,YAAY,CAAC;AAEnB;;;;GAIG;AACH,oBAAY,uBAAuB,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AAEpE;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC1B,MAAM,EAAE,mBAAmB,GAAG,SAAS,CAAC;IACxC,SAAS,EAAE,OAAO,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,uBAAuB,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACrB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,KAAK,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED;;;;GAIG;AACH,MAAM,WAAW,IAAI;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACrB;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,IAAI,GAAG,IAAI,CAQnD"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/feeds.js b/includes/external/addressbook/node_modules/domutils/lib/feeds.js
new file mode 100644
index 0000000..b68d5b4
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/feeds.js
@@ -0,0 +1,191 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.getFeed = void 0;
+var stringify_js_1 = require("./stringify.js");
+var legacy_js_1 = require("./legacy.js");
+/**
+ * Get the feed object from the root of a DOM tree.
+ *
+ * @category Feeds
+ * @param doc - The DOM to to extract the feed from.
+ * @returns The feed.
+ */
+function getFeed(doc) {
+ var feedRoot = getOneElement(isValidFeed, doc);
+ return !feedRoot
+ ? null
+ : feedRoot.name === "feed"
+ ? getAtomFeed(feedRoot)
+ : getRssFeed(feedRoot);
+}
+exports.getFeed = getFeed;
+/**
+ * Parse an Atom feed.
+ *
+ * @param feedRoot The root of the feed.
+ * @returns The parsed feed.
+ */
+function getAtomFeed(feedRoot) {
+ var _a;
+ var childs = feedRoot.children;
+ var feed = {
+ type: "atom",
+ items: (0, legacy_js_1.getElementsByTagName)("entry", childs).map(function (item) {
+ var _a;
+ var children = item.children;
+ var entry = { media: getMediaElements(children) };
+ addConditionally(entry, "id", "id", children);
+ addConditionally(entry, "title", "title", children);
+ var href = (_a = getOneElement("link", children)) === null || _a === void 0 ? void 0 : _a.attribs["href"];
+ if (href) {
+ entry.link = href;
+ }
+ var description = fetch("summary", children) || fetch("content", children);
+ if (description) {
+ entry.description = description;
+ }
+ var pubDate = fetch("updated", children);
+ if (pubDate) {
+ entry.pubDate = new Date(pubDate);
+ }
+ return entry;
+ }),
+ };
+ addConditionally(feed, "id", "id", childs);
+ addConditionally(feed, "title", "title", childs);
+ var href = (_a = getOneElement("link", childs)) === null || _a === void 0 ? void 0 : _a.attribs["href"];
+ if (href) {
+ feed.link = href;
+ }
+ addConditionally(feed, "description", "subtitle", childs);
+ var updated = fetch("updated", childs);
+ if (updated) {
+ feed.updated = new Date(updated);
+ }
+ addConditionally(feed, "author", "email", childs, true);
+ return feed;
+}
+/**
+ * Parse a RSS feed.
+ *
+ * @param feedRoot The root of the feed.
+ * @returns The parsed feed.
+ */
+function getRssFeed(feedRoot) {
+ var _a, _b;
+ var childs = (_b = (_a = getOneElement("channel", feedRoot.children)) === null || _a === void 0 ? void 0 : _a.children) !== null && _b !== void 0 ? _b : [];
+ var feed = {
+ type: feedRoot.name.substr(0, 3),
+ id: "",
+ items: (0, legacy_js_1.getElementsByTagName)("item", feedRoot.children).map(function (item) {
+ var children = item.children;
+ var entry = { media: getMediaElements(children) };
+ addConditionally(entry, "id", "guid", children);
+ addConditionally(entry, "title", "title", children);
+ addConditionally(entry, "link", "link", children);
+ addConditionally(entry, "description", "description", children);
+ var pubDate = fetch("pubDate", children);
+ if (pubDate)
+ entry.pubDate = new Date(pubDate);
+ return entry;
+ }),
+ };
+ addConditionally(feed, "title", "title", childs);
+ addConditionally(feed, "link", "link", childs);
+ addConditionally(feed, "description", "description", childs);
+ var updated = fetch("lastBuildDate", childs);
+ if (updated) {
+ feed.updated = new Date(updated);
+ }
+ addConditionally(feed, "author", "managingEditor", childs, true);
+ return feed;
+}
+var MEDIA_KEYS_STRING = ["url", "type", "lang"];
+var MEDIA_KEYS_INT = [
+ "fileSize",
+ "bitrate",
+ "framerate",
+ "samplingrate",
+ "channels",
+ "duration",
+ "height",
+ "width",
+];
+/**
+ * Get all media elements of a feed item.
+ *
+ * @param where Nodes to search in.
+ * @returns Media elements.
+ */
+function getMediaElements(where) {
+ return (0, legacy_js_1.getElementsByTagName)("media:content", where).map(function (elem) {
+ var attribs = elem.attribs;
+ var media = {
+ medium: attribs["medium"],
+ isDefault: !!attribs["isDefault"],
+ };
+ for (var _i = 0, MEDIA_KEYS_STRING_1 = MEDIA_KEYS_STRING; _i < MEDIA_KEYS_STRING_1.length; _i++) {
+ var attrib = MEDIA_KEYS_STRING_1[_i];
+ if (attribs[attrib]) {
+ media[attrib] = attribs[attrib];
+ }
+ }
+ for (var _a = 0, MEDIA_KEYS_INT_1 = MEDIA_KEYS_INT; _a < MEDIA_KEYS_INT_1.length; _a++) {
+ var attrib = MEDIA_KEYS_INT_1[_a];
+ if (attribs[attrib]) {
+ media[attrib] = parseInt(attribs[attrib], 10);
+ }
+ }
+ if (attribs["expression"]) {
+ media.expression = attribs["expression"];
+ }
+ return media;
+ });
+}
+/**
+ * Get one element by tag name.
+ *
+ * @param tagName Tag name to look for
+ * @param node Node to search in
+ * @returns The element or null
+ */
+function getOneElement(tagName, node) {
+ return (0, legacy_js_1.getElementsByTagName)(tagName, node, true, 1)[0];
+}
+/**
+ * Get the text content of an element with a certain tag name.
+ *
+ * @param tagName Tag name to look for.
+ * @param where Node to search in.
+ * @param recurse Whether to recurse into child nodes.
+ * @returns The text content of the element.
+ */
+function fetch(tagName, where, recurse) {
+ if (recurse === void 0) { recurse = false; }
+ return (0, stringify_js_1.textContent)((0, legacy_js_1.getElementsByTagName)(tagName, where, recurse, 1)).trim();
+}
+/**
+ * Adds a property to an object if it has a value.
+ *
+ * @param obj Object to be extended
+ * @param prop Property name
+ * @param tagName Tag name that contains the conditionally added property
+ * @param where Element to search for the property
+ * @param recurse Whether to recurse into child nodes.
+ */
+function addConditionally(obj, prop, tagName, where, recurse) {
+ if (recurse === void 0) { recurse = false; }
+ var val = fetch(tagName, where, recurse);
+ if (val)
+ obj[prop] = val;
+}
+/**
+ * Checks if an element is a feed root node.
+ *
+ * @param value The name of the element to check.
+ * @returns Whether an element is a feed root node.
+ */
+function isValidFeed(value) {
+ return value === "rss" || value === "feed" || value === "rdf:RDF";
+}
+//# sourceMappingURL=feeds.js.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/feeds.js.map b/includes/external/addressbook/node_modules/domutils/lib/feeds.js.map
new file mode 100644
index 0000000..66878ec
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/feeds.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"feeds.js","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["feeds.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/helpers.d.ts b/includes/external/addressbook/node_modules/domutils/lib/helpers.d.ts
new file mode 100644
index 0000000..bf40d6b
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/helpers.d.ts
@@ -0,0 +1,58 @@
+import { AnyNode } from "domhandler";
+/**
+ * Given an array of nodes, remove any member that is contained by another.
+ *
+ * @category Helpers
+ * @param nodes Nodes to filter.
+ * @returns Remaining nodes that aren't subtrees of each other.
+ */
+export declare function removeSubsets(nodes: AnyNode[]): AnyNode[];
+/**
+ * @category Helpers
+ * @see {@link http://dom.spec.whatwg.org/#dom-node-comparedocumentposition}
+ */
+export declare const enum DocumentPosition {
+ DISCONNECTED = 1,
+ PRECEDING = 2,
+ FOLLOWING = 4,
+ CONTAINS = 8,
+ CONTAINED_BY = 16
+}
+/**
+ * Compare the position of one node against another node in any other document.
+ * The return value is a bitmask with the values from {@link DocumentPosition}.
+ *
+ * Document order:
+ * > There is an ordering, document order, defined on all the nodes in the
+ * > document corresponding to the order in which the first character of the
+ * > XML representation of each node occurs in the XML representation of the
+ * > document after expansion of general entities. Thus, the document element
+ * > node will be the first node. Element nodes occur before their children.
+ * > Thus, document order orders element nodes in order of the occurrence of
+ * > their start-tag in the XML (after expansion of entities). The attribute
+ * > nodes of an element occur after the element and before its children. The
+ * > relative order of attribute nodes is implementation-dependent.
+ *
+ * Source:
+ * http://www.w3.org/TR/DOM-Level-3-Core/glossary.html#dt-document-order
+ *
+ * @category Helpers
+ * @param nodeA The first node to use in the comparison
+ * @param nodeB The second node to use in the comparison
+ * @returns A bitmask describing the input nodes' relative position.
+ *
+ * See http://dom.spec.whatwg.org/#dom-node-comparedocumentposition for
+ * a description of these values.
+ */
+export declare function compareDocumentPosition(nodeA: AnyNode, nodeB: AnyNode): number;
+/**
+ * Sort an array of nodes based on their relative position in the document and
+ * remove any duplicate nodes. If the array contains nodes that do not belong to
+ * the same document, sort order is unspecified.
+ *
+ * @category Helpers
+ * @param nodes Array of DOM nodes.
+ * @returns Collection of unique nodes, sorted in document order.
+ */
+export declare function uniqueSort<T extends AnyNode>(nodes: T[]): T[];
+//# sourceMappingURL=helpers.d.ts.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/helpers.d.ts.map b/includes/external/addressbook/node_modules/domutils/lib/helpers.d.ts.map
new file mode 100644
index 0000000..4e0be2d
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/helpers.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"helpers.d.ts","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,OAAO,EAAc,MAAM,YAAY,CAAC;AAE9D;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CA6BzD;AACD;;;GAGG;AACH,0BAAkB,gBAAgB;IAC9B,YAAY,IAAI;IAChB,SAAS,IAAI;IACb,SAAS,IAAI;IACb,QAAQ,IAAI;IACZ,YAAY,KAAK;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,uBAAuB,CACnC,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,OAAO,GACf,MAAM,CA4CR;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAc7D"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/helpers.js b/includes/external/addressbook/node_modules/domutils/lib/helpers.js
new file mode 100644
index 0000000..31bd4ac
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/helpers.js
@@ -0,0 +1,141 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.uniqueSort = exports.compareDocumentPosition = exports.DocumentPosition = exports.removeSubsets = void 0;
+var domhandler_1 = require("domhandler");
+/**
+ * Given an array of nodes, remove any member that is contained by another.
+ *
+ * @category Helpers
+ * @param nodes Nodes to filter.
+ * @returns Remaining nodes that aren't subtrees of each other.
+ */
+function removeSubsets(nodes) {
+ var idx = nodes.length;
+ /*
+ * Check if each node (or one of its ancestors) is already contained in the
+ * array.
+ */
+ while (--idx >= 0) {
+ var node = nodes[idx];
+ /*
+ * Remove the node if it is not unique.
+ * We are going through the array from the end, so we only
+ * have to check nodes that preceed the node under consideration in the array.
+ */
+ if (idx > 0 && nodes.lastIndexOf(node, idx - 1) >= 0) {
+ nodes.splice(idx, 1);
+ continue;
+ }
+ for (var ancestor = node.parent; ancestor; ancestor = ancestor.parent) {
+ if (nodes.includes(ancestor)) {
+ nodes.splice(idx, 1);
+ break;
+ }
+ }
+ }
+ return nodes;
+}
+exports.removeSubsets = removeSubsets;
+/**
+ * @category Helpers
+ * @see {@link http://dom.spec.whatwg.org/#dom-node-comparedocumentposition}
+ */
+var DocumentPosition;
+(function (DocumentPosition) {
+ DocumentPosition[DocumentPosition["DISCONNECTED"] = 1] = "DISCONNECTED";
+ DocumentPosition[DocumentPosition["PRECEDING"] = 2] = "PRECEDING";
+ DocumentPosition[DocumentPosition["FOLLOWING"] = 4] = "FOLLOWING";
+ DocumentPosition[DocumentPosition["CONTAINS"] = 8] = "CONTAINS";
+ DocumentPosition[DocumentPosition["CONTAINED_BY"] = 16] = "CONTAINED_BY";
+})(DocumentPosition = exports.DocumentPosition || (exports.DocumentPosition = {}));
+/**
+ * Compare the position of one node against another node in any other document.
+ * The return value is a bitmask with the values from {@link DocumentPosition}.
+ *
+ * Document order:
+ * > There is an ordering, document order, defined on all the nodes in the
+ * > document corresponding to the order in which the first character of the
+ * > XML representation of each node occurs in the XML representation of the
+ * > document after expansion of general entities. Thus, the document element
+ * > node will be the first node. Element nodes occur before their children.
+ * > Thus, document order orders element nodes in order of the occurrence of
+ * > their start-tag in the XML (after expansion of entities). The attribute
+ * > nodes of an element occur after the element and before its children. The
+ * > relative order of attribute nodes is implementation-dependent.
+ *
+ * Source:
+ * http://www.w3.org/TR/DOM-Level-3-Core/glossary.html#dt-document-order
+ *
+ * @category Helpers
+ * @param nodeA The first node to use in the comparison
+ * @param nodeB The second node to use in the comparison
+ * @returns A bitmask describing the input nodes' relative position.
+ *
+ * See http://dom.spec.whatwg.org/#dom-node-comparedocumentposition for
+ * a description of these values.
+ */
+function compareDocumentPosition(nodeA, nodeB) {
+ var aParents = [];
+ var bParents = [];
+ if (nodeA === nodeB) {
+ return 0;
+ }
+ var current = (0, domhandler_1.hasChildren)(nodeA) ? nodeA : nodeA.parent;
+ while (current) {
+ aParents.unshift(current);
+ current = current.parent;
+ }
+ current = (0, domhandler_1.hasChildren)(nodeB) ? nodeB : nodeB.parent;
+ while (current) {
+ bParents.unshift(current);
+ current = current.parent;
+ }
+ var maxIdx = Math.min(aParents.length, bParents.length);
+ var idx = 0;
+ while (idx < maxIdx && aParents[idx] === bParents[idx]) {
+ idx++;
+ }
+ if (idx === 0) {
+ return DocumentPosition.DISCONNECTED;
+ }
+ var sharedParent = aParents[idx - 1];
+ var siblings = sharedParent.children;
+ var aSibling = aParents[idx];
+ var bSibling = bParents[idx];
+ if (siblings.indexOf(aSibling) > siblings.indexOf(bSibling)) {
+ if (sharedParent === nodeB) {
+ return DocumentPosition.FOLLOWING | DocumentPosition.CONTAINED_BY;
+ }
+ return DocumentPosition.FOLLOWING;
+ }
+ if (sharedParent === nodeA) {
+ return DocumentPosition.PRECEDING | DocumentPosition.CONTAINS;
+ }
+ return DocumentPosition.PRECEDING;
+}
+exports.compareDocumentPosition = compareDocumentPosition;
+/**
+ * Sort an array of nodes based on their relative position in the document and
+ * remove any duplicate nodes. If the array contains nodes that do not belong to
+ * the same document, sort order is unspecified.
+ *
+ * @category Helpers
+ * @param nodes Array of DOM nodes.
+ * @returns Collection of unique nodes, sorted in document order.
+ */
+function uniqueSort(nodes) {
+ nodes = nodes.filter(function (node, i, arr) { return !arr.includes(node, i + 1); });
+ nodes.sort(function (a, b) {
+ var relative = compareDocumentPosition(a, b);
+ if (relative & DocumentPosition.PRECEDING) {
+ return -1;
+ }
+ else if (relative & DocumentPosition.FOLLOWING) {
+ return 1;
+ }
+ return 0;
+ });
+ return nodes;
+}
+exports.uniqueSort = uniqueSort;
+//# sourceMappingURL=helpers.js.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/helpers.js.map b/includes/external/addressbook/node_modules/domutils/lib/helpers.js.map
new file mode 100644
index 0000000..3a71038
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/helpers.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"helpers.js","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["helpers.ts"],"names":[],"mappings":";;;AAAA,yCAA8D;AAE9D;;;;;;GAMG;AACH,SAAgB,aAAa,CAAC,KAAgB;IAC1C,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;IAEvB;;;OAGG;IACH,OAAO,EAAE,GAAG,IAAI,CAAC,EAAE;QACf,IAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QAExB;;;;WAIG;QACH,IAAI,GAAG,GAAG,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE;YAClD,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACrB,SAAS;SACZ;QAED,KAAK,IAAI,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAAC,MAAM,EAAE;YACnE,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;gBAC1B,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBACrB,MAAM;aACT;SACJ;KACJ;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AA7BD,sCA6BC;AACD;;;GAGG;AACH,IAAkB,gBAMjB;AAND,WAAkB,gBAAgB;IAC9B,uEAAgB,CAAA;IAChB,iEAAa,CAAA;IACb,iEAAa,CAAA;IACb,+DAAY,CAAA;IACZ,wEAAiB,CAAA;AACrB,CAAC,EANiB,gBAAgB,GAAhB,wBAAgB,KAAhB,wBAAgB,QAMjC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,SAAgB,uBAAuB,CACnC,KAAc,EACd,KAAc;IAEd,IAAM,QAAQ,GAAiB,EAAE,CAAC;IAClC,IAAM,QAAQ,GAAiB,EAAE,CAAC;IAElC,IAAI,KAAK,KAAK,KAAK,EAAE;QACjB,OAAO,CAAC,CAAC;KACZ;IAED,IAAI,OAAO,GAAG,IAAA,wBAAW,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;IACxD,OAAO,OAAO,EAAE;QACZ,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1B,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;KAC5B;IACD,OAAO,GAAG,IAAA,wBAAW,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;IACpD,OAAO,OAAO,EAAE;QACZ,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1B,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;KAC5B;IAED,IAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1D,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,OAAO,GAAG,GAAG,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,GAAG,CAAC,EAAE;QACpD,GAAG,EAAE,CAAC;KACT;IAED,IAAI,GAAG,KAAK,CAAC,EAAE;QACX,OAAO,gBAAgB,CAAC,YAAY,CAAC;KACxC;IAED,IAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACvC,IAAM,QAAQ,GAAc,YAAY,CAAC,QAAQ,CAAC;IAClD,IAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAE/B,IAAI,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;QACzD,IAAI,YAAY,KAAK,KAAK,EAAE;YACxB,OAAO,gBAAgB,CAAC,SAAS,GAAG,gBAAgB,CAAC,YAAY,CAAC;SACrE;QACD,OAAO,gBAAgB,CAAC,SAAS,CAAC;KACrC;IACD,IAAI,YAAY,KAAK,KAAK,EAAE;QACxB,OAAO,gBAAgB,CAAC,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC;KACjE;IACD,OAAO,gBAAgB,CAAC,SAAS,CAAC;AACtC,CAAC;AA/CD,0DA+CC;AAED;;;;;;;;GAQG;AACH,SAAgB,UAAU,CAAoB,KAAU;IACpD,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,UAAC,IAAI,EAAE,CAAC,EAAE,GAAG,IAAK,OAAA,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,EAA1B,CAA0B,CAAC,CAAC;IAEnE,KAAK,CAAC,IAAI,CAAC,UAAC,CAAC,EAAE,CAAC;QACZ,IAAM,QAAQ,GAAG,uBAAuB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/C,IAAI,QAAQ,GAAG,gBAAgB,CAAC,SAAS,EAAE;YACvC,OAAO,CAAC,CAAC,CAAC;SACb;aAAM,IAAI,QAAQ,GAAG,gBAAgB,CAAC,SAAS,EAAE;YAC9C,OAAO,CAAC,CAAC;SACZ;QACD,OAAO,CAAC,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AACjB,CAAC;AAdD,gCAcC"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/index.d.ts b/includes/external/addressbook/node_modules/domutils/lib/index.d.ts
new file mode 100644
index 0000000..41ab6e8
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/index.d.ts
@@ -0,0 +1,10 @@
+export * from "./stringify.js";
+export * from "./traversal.js";
+export * from "./manipulation.js";
+export * from "./querying.js";
+export * from "./legacy.js";
+export * from "./helpers.js";
+export * from "./feeds.js";
+/** @deprecated Use these methods from `domhandler` directly. */
+export { isTag, isCDATA, isText, isComment, isDocument, hasChildren, } from "domhandler";
+//# sourceMappingURL=index.d.ts.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/index.d.ts.map b/includes/external/addressbook/node_modules/domutils/lib/index.d.ts.map
new file mode 100644
index 0000000..1397a26
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,gEAAgE;AAChE,OAAO,EACH,KAAK,EACL,OAAO,EACP,MAAM,EACN,SAAS,EACT,UAAU,EACV,WAAW,GACd,MAAM,YAAY,CAAC"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/index.js b/includes/external/addressbook/node_modules/domutils/lib/index.js
new file mode 100644
index 0000000..1eb8e26
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/index.js
@@ -0,0 +1,33 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ var desc = Object.getOwnPropertyDescriptor(m, k);
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+ desc = { enumerable: true, get: function() { return m[k]; } };
+ }
+ Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.hasChildren = exports.isDocument = exports.isComment = exports.isText = exports.isCDATA = exports.isTag = void 0;
+__exportStar(require("./stringify.js"), exports);
+__exportStar(require("./traversal.js"), exports);
+__exportStar(require("./manipulation.js"), exports);
+__exportStar(require("./querying.js"), exports);
+__exportStar(require("./legacy.js"), exports);
+__exportStar(require("./helpers.js"), exports);
+__exportStar(require("./feeds.js"), exports);
+/** @deprecated Use these methods from `domhandler` directly. */
+var domhandler_1 = require("domhandler");
+Object.defineProperty(exports, "isTag", { enumerable: true, get: function () { return domhandler_1.isTag; } });
+Object.defineProperty(exports, "isCDATA", { enumerable: true, get: function () { return domhandler_1.isCDATA; } });
+Object.defineProperty(exports, "isText", { enumerable: true, get: function () { return domhandler_1.isText; } });
+Object.defineProperty(exports, "isComment", { enumerable: true, get: function () { return domhandler_1.isComment; } });
+Object.defineProperty(exports, "isDocument", { enumerable: true, get: function () { return domhandler_1.isDocument; } });
+Object.defineProperty(exports, "hasChildren", { enumerable: true, get: function () { return domhandler_1.hasChildren; } });
+//# sourceMappingURL=index.js.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/index.js.map b/includes/external/addressbook/node_modules/domutils/lib/index.js.map
new file mode 100644
index 0000000..805f2cd
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,iDAA+B;AAC/B,oDAAkC;AAClC,gDAA8B;AAC9B,8CAA4B;AAC5B,+CAA6B;AAC7B,6CAA2B;AAC3B,gEAAgE;AAChE,yCAOoB;AANhB,mGAAA,KAAK,OAAA;AACL,qGAAA,OAAO,OAAA;AACP,oGAAA,MAAM,OAAA;AACN,uGAAA,SAAS,OAAA;AACT,wGAAA,UAAU,OAAA;AACV,yGAAA,WAAW,OAAA"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/legacy.d.ts b/includes/external/addressbook/node_modules/domutils/lib/legacy.d.ts
new file mode 100644
index 0000000..e79592b
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/legacy.d.ts
@@ -0,0 +1,58 @@
+import { AnyNode, Element } from "domhandler";
+import type { ElementType } from "domelementtype";
+/**
+ * An object with keys to check elements against. If a key is `tag_name`,
+ * `tag_type` or `tag_contains`, it will check the value against that specific
+ * value. Otherwise, it will check an attribute with the key's name.
+ *
+ * @category Legacy Query Functions
+ */
+export interface TestElementOpts {
+ tag_name?: string | ((name: string) => boolean);
+ tag_type?: string | ((name: string) => boolean);
+ tag_contains?: string | ((data?: string) => boolean);
+ [attributeName: string]: undefined | string | ((attributeValue: string) => boolean);
+}
+/**
+ * @category Legacy Query Functions
+ * @param options An object describing nodes to look for.
+ * @param node The element to test.
+ * @returns Whether the element matches the description in `options`.
+ */
+export declare function testElement(options: TestElementOpts, node: AnyNode): boolean;
+/**
+ * @category Legacy Query Functions
+ * @param options An object describing nodes to look for.
+ * @param nodes Nodes to search through.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes that match `options`.
+ */
+export declare function getElements(options: TestElementOpts, nodes: AnyNode | AnyNode[], recurse: boolean, limit?: number): AnyNode[];
+/**
+ * @category Legacy Query Functions
+ * @param id The unique ID attribute value to look for.
+ * @param nodes Nodes to search through.
+ * @param recurse Also consider child nodes.
+ * @returns The node with the supplied ID.
+ */
+export declare function getElementById(id: string | ((id: string) => boolean), nodes: AnyNode | AnyNode[], recurse?: boolean): Element | null;
+/**
+ * @category Legacy Query Functions
+ * @param tagName Tag name to search for.
+ * @param nodes Nodes to search through.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes with the supplied `tagName`.
+ */
+export declare function getElementsByTagName(tagName: string | ((name: string) => boolean), nodes: AnyNode | AnyNode[], recurse?: boolean, limit?: number): Element[];
+/**
+ * @category Legacy Query Functions
+ * @param type Element type to look for.
+ * @param nodes Nodes to search through.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes with the supplied `type`.
+ */
+export declare function getElementsByTagType(type: ElementType | ((type: ElementType) => boolean), nodes: AnyNode | AnyNode[], recurse?: boolean, limit?: number): AnyNode[];
+//# sourceMappingURL=legacy.d.ts.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/legacy.d.ts.map b/includes/external/addressbook/node_modules/domutils/lib/legacy.d.ts.map
new file mode 100644
index 0000000..1c17c8b
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/legacy.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"legacy.d.ts","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["legacy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAKlD;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IAChD,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IAChD,YAAY,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IACrD,CAAC,aAAa,EAAE,MAAM,GAChB,SAAS,GACT,MAAM,GACN,CAAC,CAAC,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;CAC/C;AAsED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAG5E;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACvB,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,EAC1B,OAAO,EAAE,OAAO,EAChB,KAAK,SAAW,GACjB,OAAO,EAAE,CAGX;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC1B,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,EACtC,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,EAC1B,OAAO,UAAO,GACf,OAAO,GAAG,IAAI,CAGhB;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAChC,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,EAC7C,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,EAC1B,OAAO,UAAO,EACd,KAAK,SAAW,GACjB,OAAO,EAAE,CAOX;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAChC,IAAI,EAAE,WAAW,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,EACpD,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,EAC1B,OAAO,UAAO,EACd,KAAK,SAAW,GACjB,OAAO,EAAE,CAEX"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/legacy.js b/includes/external/addressbook/node_modules/domutils/lib/legacy.js
new file mode 100644
index 0000000..fe482c1
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/legacy.js
@@ -0,0 +1,131 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.getElementsByTagType = exports.getElementsByTagName = exports.getElementById = exports.getElements = exports.testElement = void 0;
+var domhandler_1 = require("domhandler");
+var querying_js_1 = require("./querying.js");
+var Checks = {
+ tag_name: function (name) {
+ if (typeof name === "function") {
+ return function (elem) { return (0, domhandler_1.isTag)(elem) && name(elem.name); };
+ }
+ else if (name === "*") {
+ return domhandler_1.isTag;
+ }
+ return function (elem) { return (0, domhandler_1.isTag)(elem) && elem.name === name; };
+ },
+ tag_type: function (type) {
+ if (typeof type === "function") {
+ return function (elem) { return type(elem.type); };
+ }
+ return function (elem) { return elem.type === type; };
+ },
+ tag_contains: function (data) {
+ if (typeof data === "function") {
+ return function (elem) { return (0, domhandler_1.isText)(elem) && data(elem.data); };
+ }
+ return function (elem) { return (0, domhandler_1.isText)(elem) && elem.data === data; };
+ },
+};
+/**
+ * @param attrib Attribute to check.
+ * @param value Attribute value to look for.
+ * @returns A function to check whether the a node has an attribute with a
+ * particular value.
+ */
+function getAttribCheck(attrib, value) {
+ if (typeof value === "function") {
+ return function (elem) { return (0, domhandler_1.isTag)(elem) && value(elem.attribs[attrib]); };
+ }
+ return function (elem) { return (0, domhandler_1.isTag)(elem) && elem.attribs[attrib] === value; };
+}
+/**
+ * @param a First function to combine.
+ * @param b Second function to combine.
+ * @returns A function taking a node and returning `true` if either of the input
+ * functions returns `true` for the node.
+ */
+function combineFuncs(a, b) {
+ return function (elem) { return a(elem) || b(elem); };
+}
+/**
+ * @param options An object describing nodes to look for.
+ * @returns A function executing all checks in `options` and returning `true` if
+ * any of them match a node.
+ */
+function compileTest(options) {
+ var funcs = Object.keys(options).map(function (key) {
+ var value = options[key];
+ return Object.prototype.hasOwnProperty.call(Checks, key)
+ ? Checks[key](value)
+ : getAttribCheck(key, value);
+ });
+ return funcs.length === 0 ? null : funcs.reduce(combineFuncs);
+}
+/**
+ * @category Legacy Query Functions
+ * @param options An object describing nodes to look for.
+ * @param node The element to test.
+ * @returns Whether the element matches the description in `options`.
+ */
+function testElement(options, node) {
+ var test = compileTest(options);
+ return test ? test(node) : true;
+}
+exports.testElement = testElement;
+/**
+ * @category Legacy Query Functions
+ * @param options An object describing nodes to look for.
+ * @param nodes Nodes to search through.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes that match `options`.
+ */
+function getElements(options, nodes, recurse, limit) {
+ if (limit === void 0) { limit = Infinity; }
+ var test = compileTest(options);
+ return test ? (0, querying_js_1.filter)(test, nodes, recurse, limit) : [];
+}
+exports.getElements = getElements;
+/**
+ * @category Legacy Query Functions
+ * @param id The unique ID attribute value to look for.
+ * @param nodes Nodes to search through.
+ * @param recurse Also consider child nodes.
+ * @returns The node with the supplied ID.
+ */
+function getElementById(id, nodes, recurse) {
+ if (recurse === void 0) { recurse = true; }
+ if (!Array.isArray(nodes))
+ nodes = [nodes];
+ return (0, querying_js_1.findOne)(getAttribCheck("id", id), nodes, recurse);
+}
+exports.getElementById = getElementById;
+/**
+ * @category Legacy Query Functions
+ * @param tagName Tag name to search for.
+ * @param nodes Nodes to search through.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes with the supplied `tagName`.
+ */
+function getElementsByTagName(tagName, nodes, recurse, limit) {
+ if (recurse === void 0) { recurse = true; }
+ if (limit === void 0) { limit = Infinity; }
+ return (0, querying_js_1.filter)(Checks["tag_name"](tagName), nodes, recurse, limit);
+}
+exports.getElementsByTagName = getElementsByTagName;
+/**
+ * @category Legacy Query Functions
+ * @param type Element type to look for.
+ * @param nodes Nodes to search through.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes with the supplied `type`.
+ */
+function getElementsByTagType(type, nodes, recurse, limit) {
+ if (recurse === void 0) { recurse = true; }
+ if (limit === void 0) { limit = Infinity; }
+ return (0, querying_js_1.filter)(Checks["tag_type"](type), nodes, recurse, limit);
+}
+exports.getElementsByTagType = getElementsByTagType;
+//# sourceMappingURL=legacy.js.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/legacy.js.map b/includes/external/addressbook/node_modules/domutils/lib/legacy.js.map
new file mode 100644
index 0000000..940c039
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/legacy.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"legacy.js","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["legacy.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/manipulation.d.ts b/includes/external/addressbook/node_modules/domutils/lib/manipulation.d.ts
new file mode 100644
index 0000000..89763f1
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/manipulation.d.ts
@@ -0,0 +1,49 @@
+import type { ChildNode, Element } from "domhandler";
+/**
+ * Remove an element from the dom
+ *
+ * @category Manipulation
+ * @param elem The element to be removed
+ */
+export declare function removeElement(elem: ChildNode): void;
+/**
+ * Replace an element in the dom
+ *
+ * @category Manipulation
+ * @param elem The element to be replaced
+ * @param replacement The element to be added
+ */
+export declare function replaceElement(elem: ChildNode, replacement: ChildNode): void;
+/**
+ * Append a child to an element.
+ *
+ * @category Manipulation
+ * @param elem The element to append to.
+ * @param child The element to be added as a child.
+ */
+export declare function appendChild(elem: Element, child: ChildNode): void;
+/**
+ * Append an element after another.
+ *
+ * @category Manipulation
+ * @param elem The element to append after.
+ * @param next The element be added.
+ */
+export declare function append(elem: ChildNode, next: ChildNode): void;
+/**
+ * Prepend a child to an element.
+ *
+ * @category Manipulation
+ * @param elem The element to prepend before.
+ * @param child The element to be added as a child.
+ */
+export declare function prependChild(elem: Element, child: ChildNode): void;
+/**
+ * Prepend an element before another.
+ *
+ * @category Manipulation
+ * @param elem The element to prepend before.
+ * @param prev The element be added.
+ */
+export declare function prepend(elem: ChildNode, prev: ChildNode): void;
+//# sourceMappingURL=manipulation.d.ts.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/manipulation.d.ts.map b/includes/external/addressbook/node_modules/domutils/lib/manipulation.d.ts.map
new file mode 100644
index 0000000..dcb4848
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/manipulation.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"manipulation.d.ts","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["manipulation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAQnD;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,GAAG,IAAI,CAiB5E;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAajE;AAED;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,CAoB7D;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAalE;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,CAiB9D"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/manipulation.js b/includes/external/addressbook/node_modules/domutils/lib/manipulation.js
new file mode 100644
index 0000000..31c5cc0
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/manipulation.js
@@ -0,0 +1,137 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.prepend = exports.prependChild = exports.append = exports.appendChild = exports.replaceElement = exports.removeElement = void 0;
+/**
+ * Remove an element from the dom
+ *
+ * @category Manipulation
+ * @param elem The element to be removed
+ */
+function removeElement(elem) {
+ if (elem.prev)
+ elem.prev.next = elem.next;
+ if (elem.next)
+ elem.next.prev = elem.prev;
+ if (elem.parent) {
+ var childs = elem.parent.children;
+ childs.splice(childs.lastIndexOf(elem), 1);
+ }
+}
+exports.removeElement = removeElement;
+/**
+ * Replace an element in the dom
+ *
+ * @category Manipulation
+ * @param elem The element to be replaced
+ * @param replacement The element to be added
+ */
+function replaceElement(elem, replacement) {
+ var prev = (replacement.prev = elem.prev);
+ if (prev) {
+ prev.next = replacement;
+ }
+ var next = (replacement.next = elem.next);
+ if (next) {
+ next.prev = replacement;
+ }
+ var parent = (replacement.parent = elem.parent);
+ if (parent) {
+ var childs = parent.children;
+ childs[childs.lastIndexOf(elem)] = replacement;
+ elem.parent = null;
+ }
+}
+exports.replaceElement = replaceElement;
+/**
+ * Append a child to an element.
+ *
+ * @category Manipulation
+ * @param elem The element to append to.
+ * @param child The element to be added as a child.
+ */
+function appendChild(elem, child) {
+ removeElement(child);
+ child.next = null;
+ child.parent = elem;
+ if (elem.children.push(child) > 1) {
+ var sibling = elem.children[elem.children.length - 2];
+ sibling.next = child;
+ child.prev = sibling;
+ }
+ else {
+ child.prev = null;
+ }
+}
+exports.appendChild = appendChild;
+/**
+ * Append an element after another.
+ *
+ * @category Manipulation
+ * @param elem The element to append after.
+ * @param next The element be added.
+ */
+function append(elem, next) {
+ removeElement(next);
+ var parent = elem.parent;
+ var currNext = elem.next;
+ next.next = currNext;
+ next.prev = elem;
+ elem.next = next;
+ next.parent = parent;
+ if (currNext) {
+ currNext.prev = next;
+ if (parent) {
+ var childs = parent.children;
+ childs.splice(childs.lastIndexOf(currNext), 0, next);
+ }
+ }
+ else if (parent) {
+ parent.children.push(next);
+ }
+}
+exports.append = append;
+/**
+ * Prepend a child to an element.
+ *
+ * @category Manipulation
+ * @param elem The element to prepend before.
+ * @param child The element to be added as a child.
+ */
+function prependChild(elem, child) {
+ removeElement(child);
+ child.parent = elem;
+ child.prev = null;
+ if (elem.children.unshift(child) !== 1) {
+ var sibling = elem.children[1];
+ sibling.prev = child;
+ child.next = sibling;
+ }
+ else {
+ child.next = null;
+ }
+}
+exports.prependChild = prependChild;
+/**
+ * Prepend an element before another.
+ *
+ * @category Manipulation
+ * @param elem The element to prepend before.
+ * @param prev The element be added.
+ */
+function prepend(elem, prev) {
+ removeElement(prev);
+ var parent = elem.parent;
+ if (parent) {
+ var childs = parent.children;
+ childs.splice(childs.indexOf(elem), 0, prev);
+ }
+ if (elem.prev) {
+ elem.prev.next = prev;
+ }
+ prev.parent = parent;
+ prev.prev = elem.prev;
+ prev.next = elem;
+ elem.prev = prev;
+}
+exports.prepend = prepend;
+//# sourceMappingURL=manipulation.js.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/manipulation.js.map b/includes/external/addressbook/node_modules/domutils/lib/manipulation.js.map
new file mode 100644
index 0000000..4de0dea
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/manipulation.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"manipulation.js","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["manipulation.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/querying.d.ts b/includes/external/addressbook/node_modules/domutils/lib/querying.d.ts
new file mode 100644
index 0000000..3e2296a
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/querying.d.ts
@@ -0,0 +1,62 @@
+import { Element, AnyNode } from "domhandler";
+/**
+ * Search a node and its children for nodes passing a test function.
+ *
+ * @category Querying
+ * @param test Function to test nodes on.
+ * @param node Node to search. Will be included in the result set if it matches.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes passing `test`.
+ */
+export declare function filter(test: (elem: AnyNode) => boolean, node: AnyNode | AnyNode[], recurse?: boolean, limit?: number): AnyNode[];
+/**
+ * Search an array of node and its children for nodes passing a test function.
+ *
+ * @category Querying
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes passing `test`.
+ */
+export declare function find(test: (elem: AnyNode) => boolean, nodes: AnyNode[], recurse: boolean, limit: number): AnyNode[];
+/**
+ * Finds the first element inside of an array that matches a test function.
+ *
+ * @category Querying
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @returns The first node in the array that passes `test`.
+ * @deprecated Use `Array.prototype.find` directly.
+ */
+export declare function findOneChild<T>(test: (elem: T) => boolean, nodes: T[]): T | undefined;
+/**
+ * Finds one element in a tree that passes a test.
+ *
+ * @category Querying
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @param recurse Also consider child nodes.
+ * @returns The first child node that passes `test`.
+ */
+export declare function findOne(test: (elem: Element) => boolean, nodes: AnyNode[], recurse?: boolean): Element | null;
+/**
+ * @category Querying
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @returns Whether a tree of nodes contains at least one node passing the test.
+ */
+export declare function existsOne(test: (elem: Element) => boolean, nodes: AnyNode[]): boolean;
+/**
+ * Search and array of nodes and its children for elements passing a test function.
+ *
+ * Same as `find`, but limited to elements and with less options, leading to reduced complexity.
+ *
+ * @category Querying
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @returns All nodes passing `test`.
+ */
+export declare function findAll(test: (elem: Element) => boolean, nodes: AnyNode[]): Element[];
+//# sourceMappingURL=querying.d.ts.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/querying.d.ts.map b/includes/external/addressbook/node_modules/domutils/lib/querying.d.ts.map
new file mode 100644
index 0000000..8b9da87
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/querying.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"querying.d.ts","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["querying.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAElE;;;;;;;;;GASG;AACH,wBAAgB,MAAM,CAClB,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,EAChC,IAAI,EAAE,OAAO,GAAG,OAAO,EAAE,EACzB,OAAO,UAAO,EACd,KAAK,SAAW,GACjB,OAAO,EAAE,CAGX;AAED;;;;;;;;;GASG;AACH,wBAAgB,IAAI,CAChB,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,EAChC,KAAK,EAAE,OAAO,EAAE,EAChB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,GACd,OAAO,EAAE,CAkBX;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAC1B,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,EAC1B,KAAK,EAAE,CAAC,EAAE,GACX,CAAC,GAAG,SAAS,CAEf;AAED;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CACnB,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,EAChC,KAAK,EAAE,OAAO,EAAE,EAChB,OAAO,UAAO,GACf,OAAO,GAAG,IAAI,CAehB;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CACrB,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,EAChC,KAAK,EAAE,OAAO,EAAE,GACjB,OAAO,CAQT;AAED;;;;;;;;;GASG;AACH,wBAAgB,OAAO,CACnB,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,EAChC,KAAK,EAAE,OAAO,EAAE,GACjB,OAAO,EAAE,CAYX"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/querying.js b/includes/external/addressbook/node_modules/domutils/lib/querying.js
new file mode 100644
index 0000000..3e2c1ec
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/querying.js
@@ -0,0 +1,134 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.findAll = exports.existsOne = exports.findOne = exports.findOneChild = exports.find = exports.filter = void 0;
+var domhandler_1 = require("domhandler");
+/**
+ * Search a node and its children for nodes passing a test function.
+ *
+ * @category Querying
+ * @param test Function to test nodes on.
+ * @param node Node to search. Will be included in the result set if it matches.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes passing `test`.
+ */
+function filter(test, node, recurse, limit) {
+ if (recurse === void 0) { recurse = true; }
+ if (limit === void 0) { limit = Infinity; }
+ if (!Array.isArray(node))
+ node = [node];
+ return find(test, node, recurse, limit);
+}
+exports.filter = filter;
+/**
+ * Search an array of node and its children for nodes passing a test function.
+ *
+ * @category Querying
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes passing `test`.
+ */
+function find(test, nodes, recurse, limit) {
+ var result = [];
+ for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
+ var elem = nodes_1[_i];
+ if (test(elem)) {
+ result.push(elem);
+ if (--limit <= 0)
+ break;
+ }
+ if (recurse && (0, domhandler_1.hasChildren)(elem) && elem.children.length > 0) {
+ var children = find(test, elem.children, recurse, limit);
+ result.push.apply(result, children);
+ limit -= children.length;
+ if (limit <= 0)
+ break;
+ }
+ }
+ return result;
+}
+exports.find = find;
+/**
+ * Finds the first element inside of an array that matches a test function.
+ *
+ * @category Querying
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @returns The first node in the array that passes `test`.
+ * @deprecated Use `Array.prototype.find` directly.
+ */
+function findOneChild(test, nodes) {
+ return nodes.find(test);
+}
+exports.findOneChild = findOneChild;
+/**
+ * Finds one element in a tree that passes a test.
+ *
+ * @category Querying
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @param recurse Also consider child nodes.
+ * @returns The first child node that passes `test`.
+ */
+function findOne(test, nodes, recurse) {
+ if (recurse === void 0) { recurse = true; }
+ var elem = null;
+ for (var i = 0; i < nodes.length && !elem; i++) {
+ var checked = nodes[i];
+ if (!(0, domhandler_1.isTag)(checked)) {
+ continue;
+ }
+ else if (test(checked)) {
+ elem = checked;
+ }
+ else if (recurse && checked.children.length > 0) {
+ elem = findOne(test, checked.children, true);
+ }
+ }
+ return elem;
+}
+exports.findOne = findOne;
+/**
+ * @category Querying
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @returns Whether a tree of nodes contains at least one node passing the test.
+ */
+function existsOne(test, nodes) {
+ return nodes.some(function (checked) {
+ return (0, domhandler_1.isTag)(checked) &&
+ (test(checked) ||
+ (checked.children.length > 0 &&
+ existsOne(test, checked.children)));
+ });
+}
+exports.existsOne = existsOne;
+/**
+ * Search and array of nodes and its children for elements passing a test function.
+ *
+ * Same as `find`, but limited to elements and with less options, leading to reduced complexity.
+ *
+ * @category Querying
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @returns All nodes passing `test`.
+ */
+function findAll(test, nodes) {
+ var _a;
+ var result = [];
+ var stack = nodes.filter(domhandler_1.isTag);
+ var elem;
+ while ((elem = stack.shift())) {
+ var children = (_a = elem.children) === null || _a === void 0 ? void 0 : _a.filter(domhandler_1.isTag);
+ if (children && children.length > 0) {
+ stack.unshift.apply(stack, children);
+ }
+ if (test(elem))
+ result.push(elem);
+ }
+ return result;
+}
+exports.findAll = findAll;
+//# sourceMappingURL=querying.js.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/querying.js.map b/includes/external/addressbook/node_modules/domutils/lib/querying.js.map
new file mode 100644
index 0000000..76e0f81
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/querying.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"querying.js","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["querying.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/stringify.d.ts b/includes/external/addressbook/node_modules/domutils/lib/stringify.d.ts
new file mode 100644
index 0000000..a643f70
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/stringify.d.ts
@@ -0,0 +1,46 @@
+import { AnyNode } from "domhandler";
+import { DomSerializerOptions } from "dom-serializer";
+/**
+ * @category Stringify
+ * @deprecated Use the `dom-serializer` module directly.
+ * @param node Node to get the outer HTML of.
+ * @param options Options for serialization.
+ * @returns `node`'s outer HTML.
+ */
+export declare function getOuterHTML(node: AnyNode | ArrayLike<AnyNode>, options?: DomSerializerOptions): string;
+/**
+ * @category Stringify
+ * @deprecated Use the `dom-serializer` module directly.
+ * @param node Node to get the inner HTML of.
+ * @param options Options for serialization.
+ * @returns `node`'s inner HTML.
+ */
+export declare function getInnerHTML(node: AnyNode, options?: DomSerializerOptions): string;
+/**
+ * Get a node's inner text. Same as `textContent`, but inserts newlines for `<br>` tags.
+ *
+ * @category Stringify
+ * @deprecated Use `textContent` instead.
+ * @param node Node to get the inner text of.
+ * @returns `node`'s inner text.
+ */
+export declare function getText(node: AnyNode | AnyNode[]): string;
+/**
+ * Get a node's text content.
+ *
+ * @category Stringify
+ * @param node Node to get the text content of.
+ * @returns `node`'s text content.
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent}
+ */
+export declare function textContent(node: AnyNode | AnyNode[]): string;
+/**
+ * Get a node's inner text.
+ *
+ * @category Stringify
+ * @param node Node to get the inner text of.
+ * @returns `node`'s inner text.
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Node/innerText}
+ */
+export declare function innerText(node: AnyNode | AnyNode[]): string;
+//# sourceMappingURL=stringify.d.ts.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/stringify.d.ts.map b/includes/external/addressbook/node_modules/domutils/lib/stringify.d.ts.map
new file mode 100644
index 0000000..8da073b
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/stringify.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"stringify.d.ts","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["stringify.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,OAAO,EAEV,MAAM,YAAY,CAAC;AACpB,OAAmB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAGlE;;;;;;GAMG;AACH,wBAAgB,YAAY,CACxB,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,EAClC,OAAO,CAAC,EAAE,oBAAoB,GAC/B,MAAM,CAER;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CACxB,IAAI,EAAE,OAAO,EACb,OAAO,CAAC,EAAE,oBAAoB,GAC/B,MAAM,CAIR;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,MAAM,CAMzD;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,MAAM,CAO7D;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,MAAM,CAO3D"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/stringify.js b/includes/external/addressbook/node_modules/domutils/lib/stringify.js
new file mode 100644
index 0000000..006d61b
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/stringify.js
@@ -0,0 +1,92 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.innerText = exports.textContent = exports.getText = exports.getInnerHTML = exports.getOuterHTML = void 0;
+var domhandler_1 = require("domhandler");
+var dom_serializer_1 = __importDefault(require("dom-serializer"));
+var domelementtype_1 = require("domelementtype");
+/**
+ * @category Stringify
+ * @deprecated Use the `dom-serializer` module directly.
+ * @param node Node to get the outer HTML of.
+ * @param options Options for serialization.
+ * @returns `node`'s outer HTML.
+ */
+function getOuterHTML(node, options) {
+ return (0, dom_serializer_1.default)(node, options);
+}
+exports.getOuterHTML = getOuterHTML;
+/**
+ * @category Stringify
+ * @deprecated Use the `dom-serializer` module directly.
+ * @param node Node to get the inner HTML of.
+ * @param options Options for serialization.
+ * @returns `node`'s inner HTML.
+ */
+function getInnerHTML(node, options) {
+ return (0, domhandler_1.hasChildren)(node)
+ ? node.children.map(function (node) { return getOuterHTML(node, options); }).join("")
+ : "";
+}
+exports.getInnerHTML = getInnerHTML;
+/**
+ * Get a node's inner text. Same as `textContent`, but inserts newlines for `<br>` tags.
+ *
+ * @category Stringify
+ * @deprecated Use `textContent` instead.
+ * @param node Node to get the inner text of.
+ * @returns `node`'s inner text.
+ */
+function getText(node) {
+ if (Array.isArray(node))
+ return node.map(getText).join("");
+ if ((0, domhandler_1.isTag)(node))
+ return node.name === "br" ? "\n" : getText(node.children);
+ if ((0, domhandler_1.isCDATA)(node))
+ return getText(node.children);
+ if ((0, domhandler_1.isText)(node))
+ return node.data;
+ return "";
+}
+exports.getText = getText;
+/**
+ * Get a node's text content.
+ *
+ * @category Stringify
+ * @param node Node to get the text content of.
+ * @returns `node`'s text content.
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent}
+ */
+function textContent(node) {
+ if (Array.isArray(node))
+ return node.map(textContent).join("");
+ if ((0, domhandler_1.hasChildren)(node) && !(0, domhandler_1.isComment)(node)) {
+ return textContent(node.children);
+ }
+ if ((0, domhandler_1.isText)(node))
+ return node.data;
+ return "";
+}
+exports.textContent = textContent;
+/**
+ * Get a node's inner text.
+ *
+ * @category Stringify
+ * @param node Node to get the inner text of.
+ * @returns `node`'s inner text.
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Node/innerText}
+ */
+function innerText(node) {
+ if (Array.isArray(node))
+ return node.map(innerText).join("");
+ if ((0, domhandler_1.hasChildren)(node) && (node.type === domelementtype_1.ElementType.Tag || (0, domhandler_1.isCDATA)(node))) {
+ return innerText(node.children);
+ }
+ if ((0, domhandler_1.isText)(node))
+ return node.data;
+ return "";
+}
+exports.innerText = innerText;
+//# sourceMappingURL=stringify.js.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/stringify.js.map b/includes/external/addressbook/node_modules/domutils/lib/stringify.js.map
new file mode 100644
index 0000000..100be9e
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/stringify.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"stringify.js","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["stringify.ts"],"names":[],"mappings":";;;;;;AAAA,yCAOoB;AACpB,kEAAkE;AAClE,iDAA6C;AAE7C;;;;;;GAMG;AACH,SAAgB,YAAY,CACxB,IAAkC,EAClC,OAA8B;IAE9B,OAAO,IAAA,wBAAU,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACrC,CAAC;AALD,oCAKC;AAED;;;;;;GAMG;AACH,SAAgB,YAAY,CACxB,IAAa,EACb,OAA8B;IAE9B,OAAO,IAAA,wBAAW,EAAC,IAAI,CAAC;QACpB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAC,IAAI,IAAK,OAAA,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,EAA3B,CAA2B,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACnE,CAAC,CAAC,EAAE,CAAC;AACb,CAAC;AAPD,oCAOC;AAED;;;;;;;GAOG;AACH,SAAgB,OAAO,CAAC,IAAyB;IAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3D,IAAI,IAAA,kBAAK,EAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3E,IAAI,IAAA,oBAAO,EAAC,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjD,IAAI,IAAA,mBAAM,EAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC;IACnC,OAAO,EAAE,CAAC;AACd,CAAC;AAND,0BAMC;AAED;;;;;;;GAOG;AACH,SAAgB,WAAW,CAAC,IAAyB;IACjD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/D,IAAI,IAAA,wBAAW,EAAC,IAAI,CAAC,IAAI,CAAC,IAAA,sBAAS,EAAC,IAAI,CAAC,EAAE;QACvC,OAAO,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACrC;IACD,IAAI,IAAA,mBAAM,EAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC;IACnC,OAAO,EAAE,CAAC;AACd,CAAC;AAPD,kCAOC;AAED;;;;;;;GAOG;AACH,SAAgB,SAAS,CAAC,IAAyB;IAC/C,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7D,IAAI,IAAA,wBAAW,EAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,4BAAW,CAAC,GAAG,IAAI,IAAA,oBAAO,EAAC,IAAI,CAAC,CAAC,EAAE;QACvE,OAAO,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACnC;IACD,IAAI,IAAA,mBAAM,EAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC;IACnC,OAAO,EAAE,CAAC;AACd,CAAC;AAPD,8BAOC"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/traversal.d.ts b/includes/external/addressbook/node_modules/domutils/lib/traversal.d.ts
new file mode 100644
index 0000000..213e6a9
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/traversal.d.ts
@@ -0,0 +1,65 @@
+import { AnyNode, ChildNode, Element, ParentNode } from "domhandler";
+/**
+ * Get a node's children.
+ *
+ * @category Traversal
+ * @param elem Node to get the children of.
+ * @returns `elem`'s children, or an empty array.
+ */
+export declare function getChildren(elem: AnyNode): ChildNode[];
+export declare function getParent(elem: AnyNode): ParentNode | null;
+/**
+ * Gets an elements siblings, including the element itself.
+ *
+ * Attempts to get the children through the element's parent first. If we don't
+ * have a parent (the element is a root node), we walk the element's `prev` &
+ * `next` to get all remaining nodes.
+ *
+ * @category Traversal
+ * @param elem Element to get the siblings of.
+ * @returns `elem`'s siblings.
+ */
+export declare function getSiblings(elem: AnyNode): AnyNode[];
+/**
+ * Gets an attribute from an element.
+ *
+ * @category Traversal
+ * @param elem Element to check.
+ * @param name Attribute name to retrieve.
+ * @returns The element's attribute value, or `undefined`.
+ */
+export declare function getAttributeValue(elem: Element, name: string): string | undefined;
+/**
+ * Checks whether an element has an attribute.
+ *
+ * @category Traversal
+ * @param elem Element to check.
+ * @param name Attribute name to look for.
+ * @returns Returns whether `elem` has the attribute `name`.
+ */
+export declare function hasAttrib(elem: Element, name: string): boolean;
+/**
+ * Get the tag name of an element.
+ *
+ * @category Traversal
+ * @param elem The element to get the name for.
+ * @returns The tag name of `elem`.
+ */
+export declare function getName(elem: Element): string;
+/**
+ * Returns the next element sibling of a node.
+ *
+ * @category Traversal
+ * @param elem The element to get the next sibling of.
+ * @returns `elem`'s next sibling that is a tag.
+ */
+export declare function nextElementSibling(elem: AnyNode): Element | null;
+/**
+ * Returns the previous element sibling of a node.
+ *
+ * @category Traversal
+ * @param elem The element to get the previous sibling of.
+ * @returns `elem`'s previous sibling that is a tag.
+ */
+export declare function prevElementSibling(elem: AnyNode): Element | null;
+//# sourceMappingURL=traversal.d.ts.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/traversal.d.ts.map b/includes/external/addressbook/node_modules/domutils/lib/traversal.d.ts.map
new file mode 100644
index 0000000..cdf1710
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/traversal.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"traversal.d.ts","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["traversal.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,OAAO,EACP,SAAS,EACT,OAAO,EACP,UAAU,EAEb,MAAM,YAAY,CAAC;AAEpB;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,EAAE,CAEtD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI,CAAC;AAY5D;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,EAAE,CAepD;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC7B,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,MAAM,GACb,MAAM,GAAG,SAAS,CAEpB;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAM9D;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAE7C;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI,CAIhE;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI,CAIhE"} \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/traversal.js b/includes/external/addressbook/node_modules/domutils/lib/traversal.js
new file mode 100644
index 0000000..5def453
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/traversal.js
@@ -0,0 +1,124 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.prevElementSibling = exports.nextElementSibling = exports.getName = exports.hasAttrib = exports.getAttributeValue = exports.getSiblings = exports.getParent = exports.getChildren = void 0;
+var domhandler_1 = require("domhandler");
+/**
+ * Get a node's children.
+ *
+ * @category Traversal
+ * @param elem Node to get the children of.
+ * @returns `elem`'s children, or an empty array.
+ */
+function getChildren(elem) {
+ return (0, domhandler_1.hasChildren)(elem) ? elem.children : [];
+}
+exports.getChildren = getChildren;
+/**
+ * Get a node's parent.
+ *
+ * @category Traversal
+ * @param elem Node to get the parent of.
+ * @returns `elem`'s parent node.
+ */
+function getParent(elem) {
+ return elem.parent || null;
+}
+exports.getParent = getParent;
+/**
+ * Gets an elements siblings, including the element itself.
+ *
+ * Attempts to get the children through the element's parent first. If we don't
+ * have a parent (the element is a root node), we walk the element's `prev` &
+ * `next` to get all remaining nodes.
+ *
+ * @category Traversal
+ * @param elem Element to get the siblings of.
+ * @returns `elem`'s siblings.
+ */
+function getSiblings(elem) {
+ var _a, _b;
+ var parent = getParent(elem);
+ if (parent != null)
+ return getChildren(parent);
+ var siblings = [elem];
+ var prev = elem.prev, next = elem.next;
+ while (prev != null) {
+ siblings.unshift(prev);
+ (_a = prev, prev = _a.prev);
+ }
+ while (next != null) {
+ siblings.push(next);
+ (_b = next, next = _b.next);
+ }
+ return siblings;
+}
+exports.getSiblings = getSiblings;
+/**
+ * Gets an attribute from an element.
+ *
+ * @category Traversal
+ * @param elem Element to check.
+ * @param name Attribute name to retrieve.
+ * @returns The element's attribute value, or `undefined`.
+ */
+function getAttributeValue(elem, name) {
+ var _a;
+ return (_a = elem.attribs) === null || _a === void 0 ? void 0 : _a[name];
+}
+exports.getAttributeValue = getAttributeValue;
+/**
+ * Checks whether an element has an attribute.
+ *
+ * @category Traversal
+ * @param elem Element to check.
+ * @param name Attribute name to look for.
+ * @returns Returns whether `elem` has the attribute `name`.
+ */
+function hasAttrib(elem, name) {
+ return (elem.attribs != null &&
+ Object.prototype.hasOwnProperty.call(elem.attribs, name) &&
+ elem.attribs[name] != null);
+}
+exports.hasAttrib = hasAttrib;
+/**
+ * Get the tag name of an element.
+ *
+ * @category Traversal
+ * @param elem The element to get the name for.
+ * @returns The tag name of `elem`.
+ */
+function getName(elem) {
+ return elem.name;
+}
+exports.getName = getName;
+/**
+ * Returns the next element sibling of a node.
+ *
+ * @category Traversal
+ * @param elem The element to get the next sibling of.
+ * @returns `elem`'s next sibling that is a tag.
+ */
+function nextElementSibling(elem) {
+ var _a;
+ var next = elem.next;
+ while (next !== null && !(0, domhandler_1.isTag)(next))
+ (_a = next, next = _a.next);
+ return next;
+}
+exports.nextElementSibling = nextElementSibling;
+/**
+ * Returns the previous element sibling of a node.
+ *
+ * @category Traversal
+ * @param elem The element to get the previous sibling of.
+ * @returns `elem`'s previous sibling that is a tag.
+ */
+function prevElementSibling(elem) {
+ var _a;
+ var prev = elem.prev;
+ while (prev !== null && !(0, domhandler_1.isTag)(prev))
+ (_a = prev, prev = _a.prev);
+ return prev;
+}
+exports.prevElementSibling = prevElementSibling;
+//# sourceMappingURL=traversal.js.map \ No newline at end of file
diff --git a/includes/external/addressbook/node_modules/domutils/lib/traversal.js.map b/includes/external/addressbook/node_modules/domutils/lib/traversal.js.map
new file mode 100644
index 0000000..0fdb30d
--- /dev/null
+++ b/includes/external/addressbook/node_modules/domutils/lib/traversal.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"traversal.js","sourceRoot":"https://raw.githubusercontent.com/fb55/domutils/f7e357b5c210b6731c2a60e0b7b3cfaa1f96b706/src/","sources":["traversal.ts"],"names":[],"mappings":";;;AAAA,yCAOoB;AAEpB;;;;;;GAMG;AACH,SAAgB,WAAW,CAAC,IAAa;IACrC,OAAO,IAAA,wBAAW,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;AAClD,CAAC;AAFD,kCAEC;AAGD;;;;;;GAMG;AACH,SAAgB,SAAS,CAAC,IAAa;IACnC,OAAO,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC;AAC/B,CAAC;AAFD,8BAEC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,WAAW,CAAC,IAAa;;IACrC,IAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,MAAM,IAAI,IAAI;QAAE,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;IAE/C,IAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,CAAC;IAClB,IAAA,IAAI,GAAW,IAAI,KAAf,EAAE,IAAI,GAAK,IAAI,KAAT,CAAU;IAC1B,OAAO,IAAI,IAAI,IAAI,EAAE;QACjB,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC,KAAW,IAAI,EAAb,IAAI,UAAA,CAAU,CAAC;KACrB;IACD,OAAO,IAAI,IAAI,IAAI,EAAE;QACjB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC,KAAW,IAAI,EAAb,IAAI,UAAA,CAAU,CAAC;KACrB;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC;AAfD,kCAeC;AAED;;;;;;;GAOG;AACH,SAAgB,iBAAiB,CAC7B,IAAa,EACb,IAAY;;IAEZ,OAAO,MAAA,IAAI,CAAC,OAAO,0CAAG,IAAI,CAAC,CAAC;AAChC,CAAC;AALD,8CAKC;AAED;;;;;;;GAOG;AACH,SAAgB,SAAS,CAAC,IAAa,EAAE,IAAY;IACjD,OAAO,CACH,IAAI,CAAC,OAAO,IAAI,IAAI;QACpB,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC;QACxD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAC7B,CAAC;AACN,CAAC;AAND,8BAMC;AAED;;;;;;GAMG;AACH,SAAgB,OAAO,CAAC,IAAa;IACjC,OAAO,IAAI,CAAC,IAAI,CAAC;AACrB,CAAC;AAFD,0BAEC;AAED;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAAC,IAAa;;IACtC,IAAA,IAAI,GAAK,IAAI,KAAT,CAAU;IACpB,OAAO,IAAI,KAAK,IAAI,IAAI,CAAC,IAAA,kBAAK,EAAC,IAAI,CAAC;QAAE,CAAC,KAAW,IAAI,EAAb,IAAI,UAAA,CAAU,CAAC;IACxD,OAAO,IAAI,CAAC;AAChB,CAAC;AAJD,gDAIC;AAED;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAAC,IAAa;;IACtC,IAAA,IAAI,GAAK,IAAI,KAAT,CAAU;IACpB,OAAO,IAAI,KAAK,IAAI,IAAI,CAAC,IAAA,kBAAK,EAAC,IAAI,CAAC;QAAE,CAAC,KAAW,IAAI,EAAb,IAAI,UAAA,CAAU,CAAC;IACxD,OAAO,IAAI,CAAC;AAChB,CAAC;AAJD,gDAIC"} \ No newline at end of file