diff --git a/config/astal/components/QuickActions/modules/Bluetooth/Bluetooth.tsx b/config/astal/components/QuickActions/modules/Bluetooth/Bluetooth.tsx index 2ee82aa..00f44ff 100644 --- a/config/astal/components/QuickActions/modules/Bluetooth/Bluetooth.tsx +++ b/config/astal/components/QuickActions/modules/Bluetooth/Bluetooth.tsx @@ -1,4 +1,4 @@ -import { bind, readFile, Variable, writeFile } from "astal"; +import { bind, readFile, writeFile } from "astal"; import { Gtk } from "astal/gtk4"; import AstalBluetooth from "gi://AstalBluetooth"; import BTDevice from "./Device"; @@ -74,7 +74,7 @@ const openBTPicker = () => { }; const BluetoothPickerList = () => { - let btEnableState = readFile("./btconf") === "true" ? true : false; + let btEnableState = readFile(`${DATADIR}./btconf`) === "true" ? true : false; bt.adapter.set_powered(btEnableState); const updateState = () => { diff --git a/config/astal/components/bar/modules/Hyprland.tsx b/config/astal/components/bar/modules/Hyprland.tsx index d540b5e..7755d63 100644 --- a/config/astal/components/bar/modules/Hyprland.tsx +++ b/config/astal/components/bar/modules/Hyprland.tsx @@ -3,6 +3,7 @@ import { bind, GObject } from "astal"; import AstalHyprland from "gi://AstalHyprland"; import { Gtk } from "astal/gtk4"; +const hypr = AstalHyprland.get_default(); const SYNC = GObject.BindingFlags.SYNC_CREATE; const SysTray = () => { @@ -48,8 +49,6 @@ const SysTray = () => { }; const Workspace = () => { - const hypr = AstalHyprland.get_default(); - return ( {bind(hypr, "workspaces").as(wss => @@ -61,9 +60,9 @@ const Workspace = () => { cssClasses={bind(hypr, "focusedWorkspace").as(fw => ws === fw ? [ - "focused-workspace-button", - "workspace-button", - ] + "focused-workspace-button", + "workspace-button", + ] : ["workspace-button"], )} onButtonPressed={() => ws.focus()} @@ -80,88 +79,13 @@ const Workspace = () => { * displaying all available clients */ const ActiveWindow = () => { - const hypr = AstalHyprland.get_default(); const focused = bind(hypr, "focusedClient"); const WindowPopover = (): Gtk.Popover => { // Set up boxes + Popover - const clients = new Map(); const popover = new Gtk.Popover(); - const popoverBox = new Gtk.Box({ - orientation: Gtk.Orientation.VERTICAL, - }); - const widgetTitle = new Gtk.Label({ - cssClasses: ["title-2"], - label: "Available Windows", - }); - - popoverBox.append(widgetTitle); - - const seaparator = new Gtk.Separator({ - marginTop: 5, - marginBottom: 10, - }); - - popoverBox.append(seaparator); - - const addClient = (client: AstalHyprland.Client) => { - const clientBox = new Gtk.Box(); - - // Workspace description - const descWS = new Gtk.Label({ label: "(WS " }); - - // Workpsace information - const workspace = new Gtk.Label(); - client.workspace.bind_property("name", workspace, "label", SYNC); - - const windowClassDesc = new Gtk.Label({ label: ") [" }); - - const windowClass = new Gtk.Label(); - windowClass.label = client.get_initial_class(); - - const titleDesc = new Gtk.Label({ label: "] " }); - titleDesc.set_margin_end(2); - - const title = new Gtk.Label(); - client.bind_property("title", title, "label", SYNC); - - clientBox.append(descWS); - clientBox.append(workspace); - clientBox.append(windowClassDesc); - clientBox.append(windowClass); - clientBox.append(titleDesc); - clientBox.append(title); - - const button = new Gtk.Button(); - button.connect( 'clicked', () => { - client.workspace.focus(); - } ); - button.set_child(clientBox); - - popoverBox.append(button); - - clients.set(client.get_address(), button); - }; - - // Populate with already added clients - const c = hypr.get_clients(); - for (let index = 0; index < c.length; index++) { - addClient(c[index]); - } - - hypr.connect("client-added", (_, client) => { - addClient(client); - }); - - hypr.connect("client-removed", (_, client) => { - const c = clients.get(client); - if (c) { - popoverBox.remove(c); - c.run_dispose(); - clients.delete(client); - } - }); + const popoverBox = WindowPopoverBox(); popover.set_child(popoverBox); return popover; @@ -177,19 +101,37 @@ const ActiveWindow = () => { + child={ + focused.as( + client => + client && ( + + ); }; +const WindowPopoverBox = () => { + return + + + + {bind(hypr, 'clients').as(clients => { + return clients.map(client => { + return + + + + + }) + })} + + +} + export default { Workspace, ActiveWindow, diff --git a/config/astal/btconf b/config/astal/config/btconf similarity index 100% rename from config/astal/btconf rename to config/astal/config/btconf diff --git a/config/astal/env.d.ts b/config/astal/env.d.ts index 467c0a4..7808a73 100644 --- a/config/astal/env.d.ts +++ b/config/astal/env.d.ts @@ -1,4 +1,5 @@ declare const SRC: string +declare const DATADIR: string declare module "inline:*" { const content: string diff --git a/config/astal/meson.build b/config/astal/meson.build new file mode 100644 index 0000000..5d0254e --- /dev/null +++ b/config/astal/meson.build @@ -0,0 +1,27 @@ +pkgdatadir = get_option('prefix') / get_option('datadir') / meson.project_name() +main = meson.project_name() + '.wrapped' + +custom_target( + command: [ + find_program('ags'), + 'bundle', + '--root', meson.project_source_root(), + meson.project_source_root() / 'app.ts', + main, + ], + output: main, + input: files('app.ts'), + install: true, + install_dir: pkgdatadir, +) + +configure_file( + input: files('wrapper.sh'), + output: meson.project_name(), + configuration: { + 'MAIN_PROGRAM': pkgdatadir / main, + 'LAYER_SHELL_LIBDIR': dependency('gtk4-layer-shell-0').get_variable('libdir'), + }, + install: true, + install_dir: get_option('prefix') / get_option('bindir'), +) diff --git a/config/astal/runner b/config/astal/runner new file mode 100755 index 0000000..dd2625d --- /dev/null +++ b/config/astal/runner @@ -0,0 +1,2789 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __typeError = (msg) => { + throw TypeError(msg); +}; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __decorateClass = (decorators, target, key, kind) => { + var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target; + for (var i = decorators.length - 1, decorator; i >= 0; i--) + if (decorator = decorators[i]) + result = (kind ? decorator(target, key, result) : decorator(result)) || result; + if (kind && result) __defProp(target, key, result); + return result; +}; +var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); +var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg); +var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj)); +var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value); +var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value); + +// ../../../../../../../usr/share/astal/gjs/gtk4/index.ts +import Astal6 from "gi://Astal?version=4.0"; +import Gtk4 from "gi://Gtk?version=4.0"; +import Gdk2 from "gi://Gdk?version=4.0"; + +// ../../../../../../../usr/share/astal/gjs/variable.ts +import Astal3 from "gi://AstalIO"; + +// ../../../../../../../usr/share/astal/gjs/binding.ts +var snakeify = (str) => str.replace(/([a-z])([A-Z])/g, "$1_$2").replaceAll("-", "_").toLowerCase(); +var kebabify = (str) => str.replace(/([a-z])([A-Z])/g, "$1-$2").replaceAll("_", "-").toLowerCase(); +var Binding = class _Binding { + transformFn = (v) => v; + #emitter; + #prop; + static bind(emitter, prop) { + return new _Binding(emitter, prop); + } + constructor(emitter, prop) { + this.#emitter = emitter; + this.#prop = prop && kebabify(prop); + } + toString() { + return `Binding<${this.#emitter}${this.#prop ? `, "${this.#prop}"` : ""}>`; + } + as(fn) { + const bind2 = new _Binding(this.#emitter, this.#prop); + bind2.transformFn = (v) => fn(this.transformFn(v)); + return bind2; + } + get() { + if (typeof this.#emitter.get === "function") + return this.transformFn(this.#emitter.get()); + if (typeof this.#prop === "string") { + const getter = `get_${snakeify(this.#prop)}`; + if (typeof this.#emitter[getter] === "function") + return this.transformFn(this.#emitter[getter]()); + return this.transformFn(this.#emitter[this.#prop]); + } + throw Error("can not get value of binding"); + } + subscribe(callback) { + if (typeof this.#emitter.subscribe === "function") { + return this.#emitter.subscribe(() => { + callback(this.get()); + }); + } else if (typeof this.#emitter.connect === "function") { + const signal = `notify::${this.#prop}`; + const id = this.#emitter.connect(signal, () => { + callback(this.get()); + }); + return () => { + this.#emitter.disconnect(id); + }; + } + throw Error(`${this.#emitter} is not bindable`); + } +}; +var { bind } = Binding; +var binding_default = Binding; + +// ../../../../../../../usr/share/astal/gjs/time.ts +import Astal from "gi://AstalIO"; +var Time = Astal.Time; +function interval(interval2, callback) { + return Astal.Time.interval(interval2, () => void callback?.()); +} + +// ../../../../../../../usr/share/astal/gjs/process.ts +import Astal2 from "gi://AstalIO"; +var Process = Astal2.Process; +function subprocess(argsOrCmd, onOut = print, onErr = printerr) { + const args = Array.isArray(argsOrCmd) || typeof argsOrCmd === "string"; + const { cmd, err, out } = { + cmd: args ? argsOrCmd : argsOrCmd.cmd, + err: args ? onErr : argsOrCmd.err || onErr, + out: args ? onOut : argsOrCmd.out || onOut + }; + const proc = Array.isArray(cmd) ? Astal2.Process.subprocessv(cmd) : Astal2.Process.subprocess(cmd); + proc.connect("stdout", (_, stdout) => out(stdout)); + proc.connect("stderr", (_, stderr) => err(stderr)); + return proc; +} +function exec(cmd) { + return Array.isArray(cmd) ? Astal2.Process.execv(cmd) : Astal2.Process.exec(cmd); +} +function execAsync(cmd) { + return new Promise((resolve, reject) => { + if (Array.isArray(cmd)) { + Astal2.Process.exec_asyncv(cmd, (_, res) => { + try { + resolve(Astal2.Process.exec_asyncv_finish(res)); + } catch (error) { + reject(error); + } + }); + } else { + Astal2.Process.exec_async(cmd, (_, res) => { + try { + resolve(Astal2.Process.exec_finish(res)); + } catch (error) { + reject(error); + } + }); + } + }); +} + +// ../../../../../../../usr/share/astal/gjs/variable.ts +var VariableWrapper = class extends Function { + variable; + errHandler = console.error; + _value; + _poll; + _watch; + pollInterval = 1e3; + pollExec; + pollTransform; + pollFn; + watchTransform; + watchExec; + constructor(init) { + super(); + this._value = init; + this.variable = new Astal3.VariableBase(); + this.variable.connect("dropped", () => { + this.stopWatch(); + this.stopPoll(); + }); + this.variable.connect("error", (_, err) => this.errHandler?.(err)); + return new Proxy(this, { + apply: (target, _, args) => target._call(args[0]) + }); + } + _call(transform) { + const b = binding_default.bind(this); + return transform ? b.as(transform) : b; + } + toString() { + return String(`Variable<${this.get()}>`); + } + get() { + return this._value; + } + set(value) { + if (value !== this._value) { + this._value = value; + this.variable.emit("changed"); + } + } + startPoll() { + if (this._poll) + return; + if (this.pollFn) { + this._poll = interval(this.pollInterval, () => { + const v = this.pollFn(this.get()); + if (v instanceof Promise) { + v.then((v2) => this.set(v2)).catch((err) => this.variable.emit("error", err)); + } else { + this.set(v); + } + }); + } else if (this.pollExec) { + this._poll = interval(this.pollInterval, () => { + execAsync(this.pollExec).then((v) => this.set(this.pollTransform(v, this.get()))).catch((err) => this.variable.emit("error", err)); + }); + } + } + startWatch() { + if (this._watch) + return; + this._watch = subprocess({ + cmd: this.watchExec, + out: (out) => this.set(this.watchTransform(out, this.get())), + err: (err) => this.variable.emit("error", err) + }); + } + stopPoll() { + this._poll?.cancel(); + delete this._poll; + } + stopWatch() { + this._watch?.kill(); + delete this._watch; + } + isPolling() { + return !!this._poll; + } + isWatching() { + return !!this._watch; + } + drop() { + this.variable.emit("dropped"); + } + onDropped(callback) { + this.variable.connect("dropped", callback); + return this; + } + onError(callback) { + delete this.errHandler; + this.variable.connect("error", (_, err) => callback(err)); + return this; + } + subscribe(callback) { + const id = this.variable.connect("changed", () => { + callback(this.get()); + }); + return () => this.variable.disconnect(id); + } + poll(interval2, exec2, transform = (out) => out) { + this.stopPoll(); + this.pollInterval = interval2; + this.pollTransform = transform; + if (typeof exec2 === "function") { + this.pollFn = exec2; + delete this.pollExec; + } else { + this.pollExec = exec2; + delete this.pollFn; + } + this.startPoll(); + return this; + } + watch(exec2, transform = (out) => out) { + this.stopWatch(); + this.watchExec = exec2; + this.watchTransform = transform; + this.startWatch(); + return this; + } + observe(objs, sigOrFn, callback) { + const f = typeof sigOrFn === "function" ? sigOrFn : callback ?? (() => this.get()); + const set = (obj, ...args) => this.set(f(obj, ...args)); + if (Array.isArray(objs)) { + for (const obj of objs) { + const [o, s] = obj; + const id = o.connect(s, set); + this.onDropped(() => o.disconnect(id)); + } + } else { + if (typeof sigOrFn === "string") { + const id = objs.connect(sigOrFn, set); + this.onDropped(() => objs.disconnect(id)); + } + } + return this; + } + static derive(deps, fn = (...args) => args) { + const update = () => fn(...deps.map((d) => d.get())); + const derived = new Variable(update()); + const unsubs = deps.map((dep) => dep.subscribe(() => derived.set(update()))); + derived.onDropped(() => unsubs.map((unsub) => unsub())); + return derived; + } +}; +var Variable = new Proxy(VariableWrapper, { + apply: (_t, _a, args) => new VariableWrapper(args[0]) +}); +var { derive } = Variable; +var variable_default = Variable; + +// ../../../../../../../usr/share/astal/gjs/_astal.ts +var noImplicitDestroy = Symbol("no no implicit destroy"); +var setChildren = Symbol("children setter method"); +function mergeBindings(array) { + function getValues(...args) { + let i = 0; + return array.map( + (value) => value instanceof binding_default ? args[i++] : value + ); + } + const bindings = array.filter((i) => i instanceof binding_default); + if (bindings.length === 0) + return array; + if (bindings.length === 1) + return bindings[0].as(getValues); + return variable_default.derive(bindings, getValues)(); +} +function setProp(obj, prop, value) { + try { + const setter = `set_${snakeify(prop)}`; + if (typeof obj[setter] === "function") + return obj[setter](value); + return obj[prop] = value; + } catch (error) { + console.error(`could not set property "${prop}" on ${obj}:`, error); + } +} +function construct(widget, config) { + let { setup, child, children = [], ...props } = config; + if (children instanceof binding_default) { + children = [children]; + } + if (child) { + children.unshift(child); + } + for (const [key, value] of Object.entries(props)) { + if (value === void 0) { + delete props[key]; + } + } + const bindings = Object.keys(props).reduce((acc, prop) => { + if (props[prop] instanceof binding_default) { + const binding = props[prop]; + delete props[prop]; + return [...acc, [prop, binding]]; + } + return acc; + }, []); + const onHandlers = Object.keys(props).reduce((acc, key) => { + if (key.startsWith("on")) { + const sig = kebabify(key).split("-").slice(1).join("-"); + const handler = props[key]; + delete props[key]; + return [...acc, [sig, handler]]; + } + return acc; + }, []); + const mergedChildren = mergeBindings(children.flat(Infinity)); + if (mergedChildren instanceof binding_default) { + widget[setChildren](mergedChildren.get()); + widget.connect("destroy", mergedChildren.subscribe((v) => { + widget[setChildren](v); + })); + } else { + if (mergedChildren.length > 0) { + widget[setChildren](mergedChildren); + } + } + for (const [signal, callback] of onHandlers) { + const sig = signal.startsWith("notify") ? signal.replace("-", "::") : signal; + if (typeof callback === "function") { + widget.connect(sig, callback); + } else { + widget.connect(sig, () => execAsync(callback).then(print).catch(console.error)); + } + } + for (const [prop, binding] of bindings) { + if (prop === "child" || prop === "children") { + widget.connect("destroy", binding.subscribe((v) => { + widget[setChildren](v); + })); + } + widget.connect("destroy", binding.subscribe((v) => { + setProp(widget, prop, v); + })); + setProp(widget, prop, binding.get()); + } + for (const [key, value] of Object.entries(props)) { + if (value === void 0) { + delete props[key]; + } + } + Object.assign(widget, props); + setup?.(widget); + return widget; +} +function isArrowFunction(func) { + return !Object.hasOwn(func, "prototype"); +} +function jsx(ctors2, ctor, { children, ...props }) { + children ??= []; + if (!Array.isArray(children)) + children = [children]; + children = children.filter(Boolean); + if (children.length === 1) + props.child = children[0]; + else if (children.length > 1) + props.children = children; + if (typeof ctor === "string") { + if (isArrowFunction(ctors2[ctor])) + return ctors2[ctor](props); + return new ctors2[ctor](props); + } + if (isArrowFunction(ctor)) + return ctor(props); + return new ctor(props); +} + +// ../../../../../../../usr/share/astal/gjs/gtk4/astalify.ts +import Gtk from "gi://Gtk?version=4.0"; +import Gdk from "gi://Gdk?version=4.0"; +var type = Symbol("child type"); +var dummyBulder = new Gtk.Builder(); +function _getChildren(widget) { + if ("get_child" in widget && typeof widget.get_child == "function") { + return widget.get_child() ? [widget.get_child()] : []; + } + const children = []; + let ch = widget.get_first_child(); + while (ch !== null) { + children.push(ch); + ch = ch.get_next_sibling(); + } + return children; +} +function _setChildren(widget, children) { + children = children.flat(Infinity).map((ch) => ch instanceof Gtk.Widget ? ch : new Gtk.Label({ visible: true, label: String(ch) })); + for (const child of children) { + widget.vfunc_add_child( + dummyBulder, + child, + type in child ? child[type] : null + ); + } +} +function astalify(cls, config = {}) { + Object.assign(cls.prototype, { + [setChildren](children) { + const w = this; + for (const child of config.getChildren?.(w) || _getChildren(w)) { + if (child instanceof Gtk.Widget) { + child.unparent(); + if (!children.includes(child) && noImplicitDestroy in this) + child.run_dispose(); + } + } + if (config.setChildren) { + config.setChildren(w, children); + } else { + _setChildren(w, children); + } + } + }); + return { + [cls.name]: (props = {}, ...children) => { + const widget = new cls("cssName" in props ? { cssName: props.cssName } : {}); + if ("cssName" in props) { + delete props.cssName; + } + if (props.noImplicitDestroy) { + Object.assign(widget, { [noImplicitDestroy]: true }); + delete props.noImplicitDestroy; + } + if (props.type) { + Object.assign(widget, { [type]: props.type }); + delete props.type; + } + if (children.length > 0) { + Object.assign(props, { children }); + } + return construct(widget, setupControllers(widget, props)); + } + }[cls.name]; +} +function setupControllers(widget, { + onFocusEnter, + onFocusLeave, + onKeyPressed, + onKeyReleased, + onKeyModifier, + onLegacy, + onButtonPressed, + onButtonReleased, + onHoverEnter, + onHoverLeave, + onMotion, + onScroll, + onScrollDecelerate, + ...props +}) { + if (onFocusEnter || onFocusLeave) { + const focus = new Gtk.EventControllerFocus(); + widget.add_controller(focus); + if (onFocusEnter) + focus.connect("enter", () => onFocusEnter(widget)); + if (onFocusLeave) + focus.connect("leave", () => onFocusLeave(widget)); + } + if (onKeyPressed || onKeyReleased || onKeyModifier) { + const key = new Gtk.EventControllerKey(); + widget.add_controller(key); + if (onKeyPressed) + key.connect("key-pressed", (_, val, code, state) => onKeyPressed(widget, val, code, state)); + if (onKeyReleased) + key.connect("key-released", (_, val, code, state) => onKeyReleased(widget, val, code, state)); + if (onKeyModifier) + key.connect("modifiers", (_, state) => onKeyModifier(widget, state)); + } + if (onLegacy || onButtonPressed || onButtonReleased) { + const legacy = new Gtk.EventControllerLegacy(); + widget.add_controller(legacy); + legacy.connect("event", (_, event) => { + if (event.get_event_type() === Gdk.EventType.BUTTON_PRESS) { + onButtonPressed?.(widget, event); + } + if (event.get_event_type() === Gdk.EventType.BUTTON_RELEASE) { + onButtonReleased?.(widget, event); + } + onLegacy?.(widget, event); + }); + } + if (onMotion || onHoverEnter || onHoverLeave) { + const hover = new Gtk.EventControllerMotion(); + widget.add_controller(hover); + if (onHoverEnter) + hover.connect("enter", (_, x, y) => onHoverEnter(widget, x, y)); + if (onHoverLeave) + hover.connect("leave", () => onHoverLeave(widget)); + if (onMotion) + hover.connect("motion", (_, x, y) => onMotion(widget, x, y)); + } + if (onScroll || onScrollDecelerate) { + const scroll = new Gtk.EventControllerScroll(); + scroll.flags = Gtk.EventControllerScrollFlags.BOTH_AXES | Gtk.EventControllerScrollFlags.KINETIC; + widget.add_controller(scroll); + if (onScroll) + scroll.connect("scroll", (_, x, y) => onScroll(widget, x, y)); + if (onScrollDecelerate) + scroll.connect("decelerate", (_, x, y) => onScrollDecelerate(widget, x, y)); + } + return props; +} + +// ../../../../../../../usr/share/astal/gjs/gtk4/app.ts +import GLib from "gi://GLib?version=2.0"; +import Gtk2 from "gi://Gtk?version=4.0"; +import Astal4 from "gi://Astal?version=4.0"; + +// ../../../../../../../usr/share/astal/gjs/overrides.ts +var snakeify2 = (str) => str.replace(/([a-z])([A-Z])/g, "$1_$2").replaceAll("-", "_").toLowerCase(); +async function suppress(mod, patch2) { + return mod.then((m) => patch2(m.default)).catch(() => void 0); +} +function patch(proto, prop) { + Object.defineProperty(proto, prop, { + get() { + return this[`get_${snakeify2(prop)}`](); + } + }); +} +await suppress(import("gi://AstalApps"), ({ Apps, Application }) => { + patch(Apps.prototype, "list"); + patch(Application.prototype, "keywords"); + patch(Application.prototype, "categories"); +}); +await suppress(import("gi://AstalBattery"), ({ UPower }) => { + patch(UPower.prototype, "devices"); +}); +await suppress(import("gi://AstalBluetooth"), ({ Adapter, Bluetooth, Device }) => { + patch(Adapter.prototype, "uuids"); + patch(Bluetooth.prototype, "adapters"); + patch(Bluetooth.prototype, "devices"); + patch(Device.prototype, "uuids"); +}); +await suppress(import("gi://AstalHyprland"), ({ Hyprland, Monitor, Workspace: Workspace2 }) => { + patch(Hyprland.prototype, "binds"); + patch(Hyprland.prototype, "monitors"); + patch(Hyprland.prototype, "workspaces"); + patch(Hyprland.prototype, "clients"); + patch(Monitor.prototype, "availableModes"); + patch(Monitor.prototype, "available_modes"); + patch(Workspace2.prototype, "clients"); +}); +await suppress(import("gi://AstalMpris"), ({ Mpris, Player }) => { + patch(Mpris.prototype, "players"); + patch(Player.prototype, "supported_uri_schemes"); + patch(Player.prototype, "supportedUriSchemes"); + patch(Player.prototype, "supported_mime_types"); + patch(Player.prototype, "supportedMimeTypes"); + patch(Player.prototype, "comments"); +}); +await suppress(import("gi://AstalNetwork"), ({ Wifi }) => { + patch(Wifi.prototype, "access_points"); + patch(Wifi.prototype, "accessPoints"); +}); +await suppress(import("gi://AstalNotifd"), ({ Notifd, Notification }) => { + patch(Notifd.prototype, "notifications"); + patch(Notification.prototype, "actions"); +}); +await suppress(import("gi://AstalPowerProfiles"), ({ PowerProfiles }) => { + patch(PowerProfiles.prototype, "actions"); +}); +await suppress(import("gi://AstalWp"), ({ Wp, Audio: Audio2, Video }) => { + patch(Wp.prototype, "endpoints"); + patch(Wp.prototype, "devices"); + patch(Audio2.prototype, "streams"); + patch(Audio2.prototype, "recorders"); + patch(Audio2.prototype, "microphones"); + patch(Audio2.prototype, "speakers"); + patch(Audio2.prototype, "devices"); + patch(Video.prototype, "streams"); + patch(Video.prototype, "recorders"); + patch(Video.prototype, "sinks"); + patch(Video.prototype, "sources"); + patch(Video.prototype, "devices"); +}); + +// ../../../../../../../usr/share/astal/gjs/_app.ts +import { setConsoleLogDomain } from "console"; +import { exit, programArgs } from "system"; +import IO from "gi://AstalIO"; +import GObject from "gi://GObject"; +function mkApp(App) { + return new class AstalJS extends App { + static { + GObject.registerClass({ GTypeName: "AstalJS" }, this); + } + eval(body) { + return new Promise((res, rej) => { + try { + const fn = Function(`return (async function() { + ${body.includes(";") ? body : `return ${body};`} + })`); + fn()().then(res).catch(rej); + } catch (error) { + rej(error); + } + }); + } + requestHandler; + vfunc_request(msg, conn) { + if (typeof this.requestHandler === "function") { + this.requestHandler(msg, (response) => { + IO.write_sock( + conn, + String(response), + (_, res) => IO.write_sock_finish(res) + ); + }); + } else { + super.vfunc_request(msg, conn); + } + } + apply_css(style, reset = false) { + super.apply_css(style, reset); + } + quit(code) { + super.quit(); + exit(code ?? 0); + } + start({ requestHandler, css, hold, main, client, icons, ...cfg } = {}) { + const app = this; + client ??= () => { + print(`Astal instance "${app.instanceName}" already running`); + exit(1); + }; + Object.assign(this, cfg); + setConsoleLogDomain(app.instanceName); + this.requestHandler = requestHandler; + app.connect("activate", () => { + main?.(...programArgs); + }); + try { + app.acquire_socket(); + } catch (error) { + return client((msg) => IO.send_request(app.instanceName, msg), ...programArgs); + } + if (css) + this.apply_css(css, false); + if (icons) + app.add_icons(icons); + hold ??= true; + if (hold) + app.hold(); + app.runAsync([]); + } + }(); +} + +// ../../../../../../../usr/share/astal/gjs/gtk4/app.ts +Gtk2.init(); +GLib.unsetenv("LD_PRELOAD"); +await import("gi://Adw?version=1").then(({ default: Adw }) => Adw.init()).catch(() => void 0); +var app_default = mkApp(Astal4.Application); + +// ../../../../../../../usr/share/astal/gjs/gtk4/widget.ts +import Astal5 from "gi://Astal?version=4.0"; +import Gtk3 from "gi://Gtk?version=4.0"; +function filter(children) { + return children.flat(Infinity).map((ch) => ch instanceof Gtk3.Widget ? ch : new Gtk3.Label({ visible: true, label: String(ch) })); +} +Object.defineProperty(Astal5.Box.prototype, "children", { + get() { + return this.get_children(); + }, + set(v) { + this.set_children(v); + } +}); +var Box = astalify(Astal5.Box, { + getChildren(self) { + return self.get_children(); + }, + setChildren(self, children) { + return self.set_children(filter(children)); + } +}); +var Button = astalify(Gtk3.Button); +var CenterBox = astalify(Gtk3.CenterBox, { + getChildren(box) { + return [box.startWidget, box.centerWidget, box.endWidget]; + }, + setChildren(box, children) { + const ch = filter(children); + box.startWidget = ch[0] || new Gtk3.Box(); + box.centerWidget = ch[1] || new Gtk3.Box(); + box.endWidget = ch[2] || new Gtk3.Box(); + } +}); +var Entry = astalify(Gtk3.Entry, { + getChildren() { + return []; + } +}); +var Image = astalify(Gtk3.Image, { + getChildren() { + return []; + } +}); +var Label = astalify(Gtk3.Label, { + getChildren() { + return []; + }, + setChildren(self, children) { + self.label = String(children); + } +}); +var LevelBar = astalify(Gtk3.LevelBar, { + getChildren() { + return []; + } +}); +var Overlay = astalify(Gtk3.Overlay, { + getChildren(self) { + const children = []; + let ch = self.get_first_child(); + while (ch !== null) { + children.push(ch); + ch = ch.get_next_sibling(); + } + return children.filter((ch2) => ch2 !== self.child); + }, + setChildren(self, children) { + for (const child of filter(children)) { + const types = type in child ? child[type].split(/\s+/) : []; + if (types.includes("overlay")) { + self.add_overlay(child); + } else { + self.set_child(child); + } + self.set_measure_overlay(child, types.includes("measure")); + self.set_clip_overlay(child, types.includes("clip")); + } + } +}); +var Revealer = astalify(Gtk3.Revealer); +var Slider = astalify(Astal5.Slider, { + getChildren() { + return []; + } +}); +var Stack = astalify(Gtk3.Stack, { + setChildren(self, children) { + for (const child of filter(children)) { + if (child.name != "" && child.name != null) { + self.add_named(child, child.name); + } else { + self.add_child(child); + } + } + } +}); +var Switch = astalify(Gtk3.Switch, { + getChildren() { + return []; + } +}); +var Window = astalify(Astal5.Window); +var MenuButton = astalify(Gtk3.MenuButton, { + getChildren(self) { + return [self.popover, self.child]; + }, + setChildren(self, children) { + for (const child of filter(children)) { + if (child instanceof Gtk3.Popover) { + self.set_popover(child); + } else { + self.set_child(child); + } + } + } +}); +var Popover = astalify(Gtk3.Popover); + +// sass:/home/janis/projects/active/dotfiles/config/astal/style.scss +var style_default = `/* @use './components/notifications/notifications.scss'; */ +window.Bar { + font-family: "Comfortaa, sans-serif"; + background: transparent; + color: #E6E6E6; + font-weight: bold; + /* >centerbox { */ + /* background: $bg-color; */ + /* border-radius: 10px; */ + /* margin: 8px; */ + /* } */ +} +window.Bar .bar-button { + border-radius: 20px; + margin: 2px; + padding-left: 10px; + padding-right: 10px; + background-color: #141414; +} +window.Bar .bar-button button { + background-color: #141414; +} +window.Bar .quick-action-button { + border-radius: 20px; + margin: 2px; + padding-left: 10px; + padding-right: 10px; + background-color: #141414; +} +window.Bar button.workspace-button { + border-radius: 20px; + margin: 1px; +} +window.Bar button.workspace-button.focused-workspace-button { + color: #5F50A6; +} +window.Bar .tray-item { + margin: 0; + padding: 0; +} +window.Bar .tray-item button { + margin: 2px; + box-shadow: none; +} +window.Bar .time { + min-width: 11rem; + padding: 3px; +} +window.Bar .time button { + box-shadow: none; + padding: 0; +} + +box.players-box { + margin-top: 20px; +} + +box.player { + padding: 0.6rem; +} +box.player .cover-art { + min-width: 100px; + min-height: 100px; + border-radius: 9px; + margin-right: 0.6rem; + background-size: contain; + background-position: center; +} +box.player .title { + font-weight: bold; + font-size: 1.1em; +} +box.player scale { + padding: 0; + margin: 0.4rem 0; + border-radius: 20px; +} +box.player scale trough { + min-height: 8px; + border-radius: 20px; +} +box.player scale highlight { + background-color: @theme_fg_color; + border-radius: 20px; +} +box.player scale slider { + all: unset; + border-radius: 20px; +} +box.player centerbox.actions { + min-width: 220px; +} +box.player centerbox.actions button { + min-width: 0; + min-height: 0; + padding: 0.4rem; + margin: 0 0.2rem; +} + +.audio-box { + min-width: 320px; +} + +.quick-actions-wrapper { + min-width: 520px; +} + +box.quick-actions { + padding: 10px; +} + +popover * { + border-radius: 20px; +} + +button { + margin: 4px; +} + +.button-no-margin { + margin-top: 0; + margin-bottom: 0; +} + +.devices-list { + margin-bottom: 20px; +} + +button.toggle-button { + min-width: 220px; + border-radius: 50px; +} +button.toggle-button.toggle-on { + min-width: 190px; + margin-right: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + background-color: #B27BD1; +} + +button.actions-button { + margin-left: 0; + border-radius: 0; + background-color: #B27BD1; + border-top-right-radius: 50px; + border-bottom-right-radius: 50px; +} + +.avatar-icon { + border-radius: 100px; + min-height: 40px; + min-width: 40px; + margin-right: 10px; +} + +* { + font-size: 1rem; +} + +empty { + min-width: 0; + background-color: transparent; +} + +.title { + font-size: 1.5rem; + font-weight: bold; +} + +.title-2 { + font-size: 1.2rem; + font-weight: bold; +}`; + +// components/bar/modules/Hyprland.tsx +import AstalTray from "gi://AstalTray"; + +// ../../../../../../../usr/share/astal/gjs/index.ts +import { default as default3 } from "gi://AstalIO?version=0.1"; + +// ../../../../../../../usr/share/astal/gjs/file.ts +import Astal7 from "gi://AstalIO"; +import Gio from "gi://Gio?version=2.0"; +function readFile(path) { + return Astal7.read_file(path) || ""; +} +function readFileAsync(path) { + return new Promise((resolve, reject) => { + Astal7.read_file_async(path, (_, res) => { + try { + resolve(Astal7.read_file_finish(res) || ""); + } catch (error) { + reject(error); + } + }); + }); +} +function writeFile(path, content) { + Astal7.write_file(path, content); +} +function monitorFile(path, callback) { + return Astal7.monitor_file(path, (file, event) => { + callback(file, event); + }); +} + +// ../../../../../../../usr/share/astal/gjs/gobject.ts +import GObject2 from "gi://GObject"; +import { default as default2 } from "gi://GLib?version=2.0"; +var meta = Symbol("meta"); +var priv = Symbol("priv"); +var { ParamSpec, ParamFlags } = GObject2; +var kebabify2 = (str) => str.replace(/([a-z])([A-Z])/g, "$1-$2").replaceAll("_", "-").toLowerCase(); +function register(options = {}) { + return function(cls) { + const t = options.Template; + if (typeof t === "string" && !t.startsWith("resource://") && !t.startsWith("file://")) { + options.Template = new TextEncoder().encode(t); + } + GObject2.registerClass({ + Signals: { ...cls[meta]?.Signals }, + Properties: { ...cls[meta]?.Properties }, + ...options + }, cls); + delete cls[meta]; + }; +} +function property(declaration = Object) { + return function(target, prop, desc) { + target.constructor[meta] ??= {}; + target.constructor[meta].Properties ??= {}; + const name = kebabify2(prop); + if (!desc) { + Object.defineProperty(target, prop, { + get() { + return this[priv]?.[prop] ?? defaultValue(declaration); + }, + set(v) { + if (v !== this[prop]) { + this[priv] ??= {}; + this[priv][prop] = v; + this.notify(name); + } + } + }); + Object.defineProperty(target, `set_${name.replace("-", "_")}`, { + value(v) { + this[prop] = v; + } + }); + Object.defineProperty(target, `get_${name.replace("-", "_")}`, { + value() { + return this[prop]; + } + }); + target.constructor[meta].Properties[kebabify2(prop)] = pspec(name, ParamFlags.READWRITE, declaration); + } else { + let flags = 0; + if (desc.get) flags |= ParamFlags.READABLE; + if (desc.set) flags |= ParamFlags.WRITABLE; + target.constructor[meta].Properties[kebabify2(prop)] = pspec(name, flags, declaration); + } + }; +} +function pspec(name, flags, declaration) { + if (declaration instanceof ParamSpec) + return declaration; + switch (declaration) { + case String: + return ParamSpec.string(name, "", "", flags, ""); + case Number: + return ParamSpec.double(name, "", "", flags, -Number.MAX_VALUE, Number.MAX_VALUE, 0); + case Boolean: + return ParamSpec.boolean(name, "", "", flags, false); + case Object: + return ParamSpec.jsobject(name, "", "", flags); + default: + return ParamSpec.object(name, "", "", flags, declaration.$gtype); + } +} +function defaultValue(declaration) { + if (declaration instanceof ParamSpec) + return declaration.get_default_value(); + switch (declaration) { + case String: + return ""; + case Number: + return 0; + case Boolean: + return false; + case Object: + default: + return null; + } +} + +// components/bar/modules/Hyprland.tsx +import AstalHyprland from "gi://AstalHyprland"; + +// ../../../../../../../usr/share/astal/gjs/gtk4/jsx-runtime.ts +function jsx2(ctor, props) { + return jsx(ctors, ctor, props); +} +var ctors = { + box: Box, + button: Button, + centerbox: CenterBox, + // circularprogress: Widget.CircularProgress, + // drawingarea: Widget.DrawingArea, + entry: Entry, + image: Image, + label: Label, + levelbar: LevelBar, + overlay: Overlay, + revealer: Revealer, + slider: Slider, + stack: Stack, + switch: Switch, + window: Window, + menubutton: MenuButton, + popover: Popover +}; +var jsxs = jsx2; + +// components/bar/modules/Hyprland.tsx +var hypr = AstalHyprland.get_default(); +var SYNC = GObject2.BindingFlags.SYNC_CREATE; +var SysTray = () => { + const trayBox = new Gtk4.Box({ cssClasses: ["bar-button"] }); + const tray = AstalTray.get_default(); + const trayItems = /* @__PURE__ */ new Map(); + const trayAddedHandler = tray.connect("item-added", (_, id) => { + const item = tray.get_item(id); + const popover = Gtk4.PopoverMenu.new_from_model(item.menu_model); + const icon = new Gtk4.Image(); + const button = new Gtk4.MenuButton({ + popover, + child: icon, + cssClasses: ["tray-item"] + }); + item.bind_property("gicon", icon, "gicon", SYNC); + popover.insert_action_group("dbusmenu", item.action_group); + item.connect("notify::action-group", () => { + popover.insert_action_group("dbusmenu", item.action_group); + }); + trayItems.set(id, button); + trayBox.append(button); + }); + const trayRemovedHandler = tray.connect("item-removed", (_, id) => { + const button = trayItems.get(id); + if (button) { + trayBox.remove(button); + button.run_dispose(); + trayItems.delete(id); + } + }); + trayBox.connect("destroy", () => { + tray.disconnect(trayAddedHandler); + tray.disconnect(trayRemovedHandler); + }); + return trayBox; +}; +var Workspace = () => { + return /* @__PURE__ */ jsx2("box", { children: bind(hypr, "workspaces").as( + (wss) => wss.filter((ws) => !(ws.id >= -99 && ws.id <= -2)).sort((a, b) => a.id - b.id).map((ws) => /* @__PURE__ */ jsx2( + "button", + { + cssClasses: bind(hypr, "focusedWorkspace").as( + (fw) => ws === fw ? [ + "focused-workspace-button", + "workspace-button" + ] : ["workspace-button"] + ), + onButtonPressed: () => ws.focus(), + child: /* @__PURE__ */ jsx2("label", { label: String(ws.id) }) + } + )) + ) }); +}; +var ActiveWindow = () => { + const focused = bind(hypr, "focusedClient"); + const WindowPopover = () => { + const popover = new Gtk4.Popover(); + const popoverBox = WindowPopoverBox(); + popover.set_child(popoverBox); + return popover; + }; + const windowPopover = WindowPopover(); + return /* @__PURE__ */ jsxs("box", { visible: focused.as(Boolean), children: [ + /* @__PURE__ */ jsx2( + "button", + { + onClicked: () => windowPopover.popup(), + cssClasses: ["bar-button"], + child: focused.as( + (client) => client && /* @__PURE__ */ jsx2("label", { label: bind(client, "title").as(String) }) + ) + } + ), + windowPopover + ] }); +}; +var WindowPopoverBox = () => { + return /* @__PURE__ */ jsxs("box", { vertical: true, children: [ + /* @__PURE__ */ jsx2("label", { label: "Available Windows", cssClasses: ["title-2"] }), + /* @__PURE__ */ jsx2(Gtk4.Separator, { marginTop: 5, marginBottom: 5 }), + /* @__PURE__ */ jsx2("box", { vertical: true, children: bind(hypr, "clients").as((clients) => { + return clients.map((client) => { + return /* @__PURE__ */ jsxs("box", { children: [ + /* @__PURE__ */ jsx2("label", { label: bind(client, "workspace").as((w) => `(WS ${w})`) }), + /* @__PURE__ */ jsx2("label", { label: bind(client, "initialClass").as((c) => `[${c}]`) }), + /* @__PURE__ */ jsx2("label", { label: bind(client, "title") }) + ] }); + }); + }) }) + ] }); +}; +var Hyprland_default = { + Workspace, + ActiveWindow, + SysTray +}; + +// components/bar/modules/Calendar.tsx +var Time2 = ({ format = "%a, %e.%m %H:%M:%S" }) => { + const time = Variable("").poll( + 1e3, + () => default2.DateTime.new_now_local().format(format) + ); + return /* @__PURE__ */ jsxs( + "menubutton", + { + cssClasses: ["time", "bar-button"], + hexpand: true, + halign: Gtk4.Align.CENTER, + children: [ + /* @__PURE__ */ jsx2("label", { onDestroy: () => time.drop(), label: time(), halign: Gtk4.Align.CENTER }), + /* @__PURE__ */ jsx2("popover", { children: /* @__PURE__ */ jsx2(Gtk4.Calendar, {}) }) + ] + } + ); +}; +var Calendar_default = { + Time: Time2 +}; + +// components/bar/modules/QuickView.tsx +import AstalBattery from "gi://AstalBattery"; +import AstalBluetooth2 from "gi://AstalBluetooth"; +import AstalNetwork3 from "gi://AstalNetwork"; +import AstalWp2 from "gi://AstalWp"; + +// util/brightness.ts +var get = (args) => Number(exec(`brightnessctl ${args}`)); +var screen = exec(`bash -c "ls -w1 /sys/class/backlight | head -1"`); +var kbd = exec(`bash -c "ls -w1 /sys/class/leds | head -1"`); +var _kbdMax, _kbd, _screenMax, _screen, _screenAvailable; +var Brightness = class extends GObject2.Object { + constructor() { + super(); + __privateAdd(this, _kbdMax, get(`--device ${kbd} max`)); + __privateAdd(this, _kbd, get(`--device ${kbd} get`)); + __privateAdd(this, _screenMax, get("max")); + __privateAdd(this, _screen, get("get") / (get("max") || 1)); + __privateAdd(this, _screenAvailable, false); + const screenPath = `/sys/class/backlight/${screen}/brightness`; + const kbdPath = `/sys/class/leds/${kbd}/brightness`; + monitorFile(screenPath, async (f) => { + const v = await readFileAsync(f); + __privateSet(this, _screen, Number(v) / __privateGet(this, _screenMax)); + this.notify("screen"); + }); + monitorFile(kbdPath, async (f) => { + const v = await readFileAsync(f); + __privateSet(this, _kbd, Number(v) / __privateGet(this, _kbdMax)); + this.notify("kbd"); + }); + try { + get("g -c backlight"); + } catch (_) { + __privateSet(this, _screenAvailable, false); + } + } + static get_default() { + if (!this.instance) + this.instance = new Brightness(); + return this.instance; + } + get screenAvailable() { + return __privateGet(this, _screenAvailable); + } + get kbd() { + return __privateGet(this, _kbd); + } + set kbd(value) { + if (value < 0 || value > __privateGet(this, _kbdMax)) + return; + execAsync(`brightnessctl -d ${kbd} s ${value} -q`).then(() => { + __privateSet(this, _kbd, value); + this.notify("kbd"); + }); + } + get screen() { + return __privateGet(this, _screen); + } + set screen(percent) { + if (percent < 0) + percent = 0; + if (percent > 1) + percent = 1; + execAsync(`brightnessctl set ${Math.floor(percent * 100)}% -q`).then(() => { + __privateSet(this, _screen, percent); + this.notify("screen"); + }); + } +}; +_kbdMax = new WeakMap(); +_kbd = new WeakMap(); +_screenMax = new WeakMap(); +_screen = new WeakMap(); +_screenAvailable = new WeakMap(); +__publicField(Brightness, "instance"); +__decorateClass([ + property(Boolean) +], Brightness.prototype, "screenAvailable", 1); +__decorateClass([ + property(Number) +], Brightness.prototype, "kbd", 1); +__decorateClass([ + property(Number) +], Brightness.prototype, "screen", 1); +Brightness = __decorateClass([ + register({ GTypeName: "Brightness" }) +], Brightness); + +// components/QuickActions/modules/Power.tsx +var PowerMenu = () => { + const popover = new Gtk4.Popover({ cssClasses: ["PowerMenu"] }); + const powerMenuBox = () => { + return /* @__PURE__ */ jsxs("box", { children: [ + /* @__PURE__ */ jsx2( + "button", + { + cssClasses: ["power-button"], + child: /* @__PURE__ */ jsx2("image", { iconName: "system-shutdown-symbolic" }), + onClicked: () => exec("/bin/sh -c 'shutdown now'") + } + ), + /* @__PURE__ */ jsx2( + "button", + { + cssClasses: ["power-button"], + child: /* @__PURE__ */ jsx2("image", { iconName: "system-reboot-symbolic" }), + onClicked: () => exec("/bin/sh -c 'reboot'") + } + ), + /* @__PURE__ */ jsx2( + "button", + { + cssClasses: ["power-button"], + child: /* @__PURE__ */ jsx2("image", { iconName: "system-suspend-symbolic" }), + onClicked: () => exec("/bin/sh -c 'systemctl suspend'") + } + ) + ] }); + }; + popover.set_child(powerMenuBox()); + return popover; +}; +var Power = () => { + const pm = PowerMenu(); + return /* @__PURE__ */ jsx2( + "button", + { + widthRequest: 0, + hexpand: false, + vexpand: false, + cssClasses: ["power-menu-button"], + child: /* @__PURE__ */ jsxs("box", { children: [ + /* @__PURE__ */ jsx2("image", { iconName: "system-shutdown-symbolic" }), + pm + ] }), + onClicked: () => pm.popup() + } + ); +}; +var UserMenu = () => { + const popover = new Gtk4.Popover(); + const powerMenuBox = () => { + return /* @__PURE__ */ jsxs("box", { children: [ + /* @__PURE__ */ jsx2( + "button", + { + cssClasses: ["power-button"], + child: /* @__PURE__ */ jsx2("image", { iconName: "system-lock-screen-symbolic" }), + onClicked: () => exec("/bin/sh -c 'hyprlock'") + } + ), + /* @__PURE__ */ jsx2( + "button", + { + cssClasses: ["power-button"], + child: /* @__PURE__ */ jsx2("image", { iconName: "system-log-out-symbolic" }), + onClicked: () => exec("/bin/sh -c 'hyprctl dispatch exit 0'") + } + ) + ] }); + }; + popover.set_child(powerMenuBox()); + return popover; +}; +var Power_default = { + Power, + UserMenu +}; + +// components/QuickActions/modules/Audio/Audio.tsx +import AstalWp from "gi://AstalWp"; +var wp = AstalWp.get_default(); +var AudioModule = () => { + const setVolumeSpeaker = (volume) => { + wp.defaultSpeaker.set_volume(volume / 100); + }; + const setVolumeMicrophone = (volume) => { + wp.defaultMicrophone.set_volume(volume / 100); + }; + const speakerSelector = SinkSelectPopover(AstalWp.MediaClass.AUDIO_SPEAKER); + const micSelector = SinkSelectPopover(AstalWp.MediaClass.AUDIO_MICROPHONE); + return /* @__PURE__ */ jsxs("box", { cssClasses: ["audio-box"], vertical: true, children: [ + /* @__PURE__ */ jsxs("box", { hexpand: true, vexpand: true, children: [ + /* @__PURE__ */ jsx2( + "button", + { + onClicked: () => wp.defaultSpeaker.set_mute( + !wp.defaultSpeaker.get_mute() + ), + tooltipText: "Mute audio output", + child: /* @__PURE__ */ jsx2( + "image", + { + iconName: bind(wp.defaultSpeaker, "volumeIcon"), + marginEnd: 3 + } + ) + } + ), + /* @__PURE__ */ jsx2( + "label", + { + label: bind(wp.defaultSpeaker, "volume").as( + (v) => Math.round(100 * v) + "%" + ) + } + ), + /* @__PURE__ */ jsx2( + "slider", + { + value: bind(wp.defaultSpeaker, "volume").as((v) => 100 * v), + max: 100, + min: 0, + step: 1, + hexpand: true, + vexpand: true, + onChangeValue: (self) => setVolumeSpeaker(self.value) + } + ), + /* @__PURE__ */ jsx2( + "button", + { + cssClasses: ["sink-select-button"], + tooltipText: "Pick audio output", + child: /* @__PURE__ */ jsxs("box", { children: [ + /* @__PURE__ */ jsx2("image", { iconName: "speaker-symbolic" }), + speakerSelector + ] }), + onClicked: () => speakerSelector.popup() + } + ) + ] }), + /* @__PURE__ */ jsxs("box", { hexpand: true, vexpand: true, children: [ + /* @__PURE__ */ jsx2( + "button", + { + onClicked: () => wp.defaultMicrophone.set_mute( + !wp.defaultMicrophone.get_mute() + ), + tooltipText: "Mute audio input", + child: /* @__PURE__ */ jsx2( + "image", + { + iconName: bind(wp.defaultMicrophone, "volumeIcon"), + marginEnd: 3 + } + ) + } + ), + /* @__PURE__ */ jsx2( + "label", + { + label: bind(wp.defaultMicrophone, "volume").as( + (v) => Math.round(100 * v) + "%" + ) + } + ), + /* @__PURE__ */ jsx2( + "slider", + { + value: bind(wp.defaultMicrophone, "volume").as( + (v) => 100 * v + ), + max: 100, + min: 0, + step: 1, + hexpand: true, + vexpand: true, + onChangeValue: (self) => setVolumeMicrophone(self.value) + } + ), + /* @__PURE__ */ jsx2( + "button", + { + cssClasses: ["sink-select-button"], + tooltipText: "Select audio input", + child: /* @__PURE__ */ jsxs("box", { children: [ + /* @__PURE__ */ jsx2("image", { iconName: "microphone" }), + micSelector + ] }), + onClicked: () => micSelector.popup() + } + ) + ] }) + ] }); +}; +var SinkPicker = (type2) => { + const devices = bind(wp, "endpoints"); + return /* @__PURE__ */ jsxs("box", { vertical: true, children: [ + /* @__PURE__ */ jsx2( + "label", + { + label: `Available Audio ${type2 === AstalWp.MediaClass.AUDIO_SPEAKER ? "Output" : type2 === AstalWp.MediaClass.AUDIO_MICROPHONE ? "Input" : ""} Devices` + } + ), + /* @__PURE__ */ jsx2(Gtk4.Separator, { marginBottom: 5, marginTop: 3 }), + /* @__PURE__ */ jsx2("box", { vertical: true, cssClasses: ["sink-picker"], children: devices.as((d) => { + return d.map((device) => { + if (device.get_media_class() !== type2) { + return /* @__PURE__ */ jsx2("box", { cssClasses: ["empty"] }); + } + return /* @__PURE__ */ jsx2( + "button", + { + cssClasses: bind(device, "id").as((id) => { + if (id === (type2 === AstalWp.MediaClass.AUDIO_SPEAKER ? wp.defaultSpeaker.id : type2 === AstalWp.MediaClass.AUDIO_MICROPHONE ? wp.defaultMicrophone.id : "")) { + return [ + "sink-option", + "currently-selected-sink-option" + ]; + } else { + return ["sink-option"]; + } + }), + child: /* @__PURE__ */ jsxs("box", { halign: Gtk4.Align.START, children: [ + /* @__PURE__ */ jsx2( + "image", + { + iconName: bind(device, "icon").as( + (icon) => icon + ), + marginEnd: 3 + } + ), + /* @__PURE__ */ jsx2( + "label", + { + label: bind( + device, + "description" + ).as((t) => t ?? "") + } + ) + ] }), + onClicked: () => { + device.set_is_default(true); + } + } + ); + }); + }) }) + ] }); +}; +var SinkSelectPopover = (type2) => { + const popover = new Gtk4.Popover(); + popover.set_child(SinkPicker(type2)); + return popover; +}; +var Audio_default = { + AudioModule +}; + +// components/QuickActions/modules/Bluetooth/Bluetooth.tsx +import AstalBluetooth from "gi://AstalBluetooth"; + +// components/QuickActions/modules/Bluetooth/Device.tsx +var BTDevice = ({ device }) => { + return /* @__PURE__ */ jsx2( + "button", + { + visible: bind(device, "name").as((n) => n !== null), + child: /* @__PURE__ */ jsx2( + "centerbox", + { + startWidget: /* @__PURE__ */ jsxs("box", { children: [ + /* @__PURE__ */ jsx2( + "image", + { + iconName: "chronometer-reset", + tooltipText: "Device is currently connecting", + visible: bind(device, "connecting") + } + ), + /* @__PURE__ */ jsx2( + "image", + { + iconName: bind(device, "icon"), + marginEnd: 3 + } + ) + ] }), + centerWidget: /* @__PURE__ */ jsx2( + "label", + { + label: bind(device, "name").as((n) => n ?? "No name"), + marginEnd: 5 + } + ), + endWidget: /* @__PURE__ */ jsxs("box", { children: [ + /* @__PURE__ */ jsx2( + "label", + { + label: bind(device, "batteryPercentage").as( + (bat) => bat >= 0 ? bat + "%" : "?%" + ), + tooltipText: "Device's battery percentage", + marginEnd: 3 + } + ), + /* @__PURE__ */ jsx2( + "image", + { + iconName: bind(device, "paired").as( + (v) => v ? "network-bluetooth-activated-symbolic" : "bluetooth-disconnected-symbolic" + ) + } + ), + /* @__PURE__ */ jsx2( + "button", + { + tooltipText: "Device trusted status", + child: /* @__PURE__ */ jsx2( + "image", + { + iconName: bind(device, "trusted").as( + (v) => v ? "checkbox" : "window-close-symbolic" + ) + } + ), + onClicked: () => device.set_trusted(!device.get_trusted()), + cssClasses: ["button-no-margin"] + } + ) + ] }) + } + ), + onClicked: () => { + connectOrPair(device); + } + } + ); +}; +var connectOrPair = (device) => { + if (device.get_paired()) { + device.connect_device(() => { + }); + } else { + device.pair(); + } +}; +var Device_default = BTDevice; + +// components/QuickActions/modules/Bluetooth/Bluetooth.tsx +var ALIGN = Gtk4.Align; +var bt = AstalBluetooth.get_default(); +var BluetoothModule = () => { + return /* @__PURE__ */ jsxs("box", { children: [ + /* @__PURE__ */ jsx2( + "button", + { + cssClasses: bind(bt.adapter, "powered").as( + (powered) => powered ? ["toggle-button", "toggle-on"] : ["toggle-button"] + ), + onClicked: () => bt.adapter.set_powered(!bt.adapter.get_powered()), + child: /* @__PURE__ */ jsxs("box", { vertical: true, children: [ + /* @__PURE__ */ jsx2( + "label", + { + cssClasses: ["title-2"], + label: "Bluetooth", + halign: ALIGN.CENTER, + valign: ALIGN.CENTER + } + ), + /* @__PURE__ */ jsxs("box", { halign: ALIGN.CENTER, valign: ALIGN.CENTER, children: [ + /* @__PURE__ */ jsx2( + "label", + { + visible: bind(bt.adapter, "powered").as( + (p) => !p + ), + label: "Disabled" + } + ), + /* @__PURE__ */ jsx2( + "label", + { + visible: bind(bt.adapter, "powered"), + label: bind(bt, "devices").as((devices) => { + let count = 0; + devices.forEach((device) => { + if (device.connected) { + count++; + } + }); + return `On (${count} ${count === 1 ? "client" : "clients"} connected)`; + }) + } + ) + ] }), + /* @__PURE__ */ jsx2("label", {}) + ] }) + } + ), + /* @__PURE__ */ jsx2( + "button", + { + cssClasses: ["actions-button"], + visible: bind(bt.adapter, "powered"), + child: /* @__PURE__ */ jsxs("box", { children: [ + /* @__PURE__ */ jsx2("image", { iconName: "arrow-right-symbolic" }), + picker + ] }), + tooltipText: "View available devices", + onClicked: () => openBTPicker() + } + ) + ] }); +}; +var openBTPicker = () => { + picker.popup(); + try { + bt.adapter.start_discovery(); + } catch (_) { + } +}; +var BluetoothPickerList = () => { + let btEnableState = readFile(`${"~/projects/active/dotfiles/config/astal/config"}./btconf`) === "true" ? true : false; + bt.adapter.set_powered(btEnableState); + const updateState = () => { + btEnableState = !btEnableState; + writeFile("./btconf", "" + btEnableState); + }; + return /* @__PURE__ */ jsxs( + "box", + { + vertical: true, + onDestroy: () => bt.adapter.stop_discovery(), + cssClasses: ["popover-box"], + children: [ + /* @__PURE__ */ jsx2("label", { cssClasses: ["title"], label: "Bluetooth" }), + /* @__PURE__ */ jsx2(Gtk4.Separator, { marginTop: 3, marginBottom: 5 }), + /* @__PURE__ */ jsx2( + "centerbox", + { + startWidget: /* @__PURE__ */ jsx2("label", { label: "Turn on at startup" }), + endWidget: /* @__PURE__ */ jsx2( + "switch", + { + valign: ALIGN.END, + halign: ALIGN.END, + active: btEnableState, + onButtonPressed: () => updateState() + } + ) + } + ), + /* @__PURE__ */ jsx2( + "label", + { + marginTop: 10, + label: "Connected & Trusted devices", + cssClasses: ["title-2"] + } + ), + /* @__PURE__ */ jsx2(Gtk4.Separator, { marginTop: 3, marginBottom: 5 }), + /* @__PURE__ */ jsx2("box", { vertical: true, cssClasses: ["devices-list"], children: bind(bt, "devices").as((devices) => { + return devices.filter((device) => { + if (device.get_connected() || device.get_paired()) { + return device; + } + }).map((device) => { + return /* @__PURE__ */ jsx2(Device_default, { device }); + }); + }) }), + /* @__PURE__ */ jsx2( + "label", + { + visible: bind(bt, "devices").as((devices) => { + return devices.filter((device) => { + if (device.get_connected() || device.get_paired()) { + return device; + } + }).length === 0; + }), + label: "No connected / trusted devices", + cssClasses: ["bt-no-found", "bt-conn-list"] + } + ), + /* @__PURE__ */ jsx2( + "label", + { + label: "Discovered bluetooth devices", + cssClasses: ["title-2"] + } + ), + /* @__PURE__ */ jsx2(Gtk4.Separator, { marginBottom: 5, marginTop: 3 }), + /* @__PURE__ */ jsx2("box", { vertical: true, children: bind(bt, "devices").as((devices) => { + return devices.filter((data) => { + if (!data.get_connected() && !data.get_paired()) { + return data; + } + }).map((device) => { + return /* @__PURE__ */ jsx2(Device_default, { device }); + }); + }) }), + /* @__PURE__ */ jsx2( + "label", + { + visible: bind(bt, "devices").as((devices) => { + return devices.filter((device) => { + if (!device.get_connected() && !device.get_paired()) { + return device; + } + }).length === 0; + }), + label: "No discovered devices", + cssClasses: ["bt-no-found"] + } + ) + ] + } + ); +}; +var BluetoothPicker = () => { + const popover = new Gtk4.Popover(); + popover.set_child(BluetoothPickerList()); + popover.connect("closed", () => bt.adapter.stop_discovery()); + return popover; +}; +var picker = BluetoothPicker(); +var Bluetooth_default = { + BluetoothModule +}; + +// components/QuickActions/modules/Brightness/Brightness.tsx +var brightness = Brightness.get_default(); +var BrightnessModule = () => { + return /* @__PURE__ */ jsxs("box", { visible: bind(brightness, "screenAvailable"), children: [ + /* @__PURE__ */ jsx2("image", { iconName: "brightness-high-symbolic" }), + /* @__PURE__ */ jsx2("label", { label: bind(brightness, "screen").as((b) => b + "%") }), + /* @__PURE__ */ jsx2("slider", {}) + ] }); +}; +var Brightness_default = { + BrightnessModule +}; + +// components/QuickActions/modules/Player/Player.tsx +import AstalMpris from "gi://AstalMpris"; +import Pango from "gi://Pango?version=1.0"; +var ALIGN2 = Gtk4.Align; +var mpris = AstalMpris.get_default(); +mpris.connect("player-added", (p) => { + print("Player added:", p); +}); +var PlayerModule = () => { + return /* @__PURE__ */ jsxs("box", { vertical: true, cssClasses: ["players-box"], children: [ + /* @__PURE__ */ jsx2("label", { label: "Music Players", halign: ALIGN2.CENTER, cssClasses: ["title-2"] }), + /* @__PURE__ */ jsx2(Gtk4.Separator, { marginTop: 3, marginBottom: 5 }), + /* @__PURE__ */ jsx2("box", { cssClasses: ["players"], children: bind(mpris, "players").as((players) => { + return players.map((player) => { + return /* @__PURE__ */ jsx2(PlayerItem, { player }); + }); + }) }), + /* @__PURE__ */ jsx2("label", { label: "No playback active", visible: bind(mpris, "players").as((players) => players.length === 0) }) + ] }); +}; +var pbStatus = AstalMpris.PlaybackStatus; +var PlayerItem = ({ player }) => { + return /* @__PURE__ */ jsxs("box", { cssClasses: ["player"], children: [ + /* @__PURE__ */ jsx2( + "image", + { + cssClasses: ["cover-art"], + file: bind(player, "coverArt"), + hexpand: true, + vexpand: true + } + ), + /* @__PURE__ */ jsxs("box", { vertical: true, children: [ + /* @__PURE__ */ jsx2( + "label", + { + label: bind(player, "title").as( + (title) => title ?? "Unknown title" + ), + cssClasses: ["title"], + halign: ALIGN2.START, + valign: ALIGN2.START, + maxWidthChars: 30, + ellipsize: Pango.EllipsizeMode.END + } + ), + /* @__PURE__ */ jsx2( + "label", + { + label: bind(player, "artist").as( + (artist) => artist ?? "Unknown artist" + ), + halign: ALIGN2.START, + valign: ALIGN2.START, + maxWidthChars: 30, + ellipsize: Pango.EllipsizeMode.END + } + ), + /* @__PURE__ */ jsx2( + "slider", + { + visible: bind(player, "length").as((l) => l > 0), + value: bind(player, "position"), + min: 0, + max: bind(player, "length"), + onChangeValue: (v) => player.set_position(v.get_value()) + } + ), + /* @__PURE__ */ jsx2( + "centerbox", + { + cssClasses: ["actions"], + startWidget: /* @__PURE__ */ jsx2( + "label", + { + label: bind(player, "position").as( + (v) => secondsToFriendlyTime(v) + ), + hexpand: true, + cssClasses: ["position"] + } + ), + centerWidget: /* @__PURE__ */ jsxs("box", { children: [ + /* @__PURE__ */ jsx2( + "button", + { + visible: bind(player, "canGoPrevious"), + child: /* @__PURE__ */ jsx2( + "image", + { + iconName: "media-skip-backward-symbolic" + } + ), + onClicked: () => player.previous() + } + ), + /* @__PURE__ */ jsx2( + "button", + { + visible: bind(player, "canControl"), + child: /* @__PURE__ */ jsx2( + "image", + { + iconName: bind( + player, + "playbackStatus" + ).as((status) => { + if (status === pbStatus.PLAYING) { + return "media-playback-pause-symbolic"; + } else { + return "media-playback-start-symbolic"; + } + }) + } + ), + onClicked: () => player.play_pause() + } + ), + /* @__PURE__ */ jsx2( + "button", + { + visible: bind(player, "canGoNext"), + child: /* @__PURE__ */ jsx2( + "image", + { + iconName: "media-skip-forward-symbolic" + } + ), + onClicked: () => player.next() + } + ) + ] }), + endWidget: /* @__PURE__ */ jsx2( + "label", + { + cssClasses: ["length"], + hexpand: true, + label: bind(player, "length").as( + (v) => secondsToFriendlyTime(v) + ) + } + ) + } + ) + ] }) + ] }); +}; +var secondsToFriendlyTime = (time) => { + const minutes = Math.floor(time / 60); + const hours = Math.floor(minutes / 60); + const seconds = Math.floor(time % 60); + if (hours > 0) { + return `${hours}:${expandTime(minutes)}:${expandTime(seconds)}`; + } else { + return `${minutes}:${expandTime(seconds)}`; + } +}; +var expandTime = (time) => { + return time < 10 ? `0${time}` : "" + time; +}; +var Player_default = { + PlayerModule +}; + +// components/QuickActions/modules/Battery.tsx +import Battery from "gi://AstalBattery"; +var BatteryBox = () => { + const battery = Battery.get_default(); + const batteryEnergy = (energyRate) => { + return energyRate > 0.1 ? `${Math.round(energyRate * 10) / 10} W ` : ""; + }; + return /* @__PURE__ */ jsx2( + "box", + { + cssClasses: ["battery-info"], + visible: bind(battery, "isBattery"), + children: /* @__PURE__ */ jsxs("box", { cssClasses: ["battery-box"], children: [ + /* @__PURE__ */ jsx2( + "image", + { + iconName: bind(battery, "batteryIconName"), + tooltipText: bind(battery, "energyRate").as( + (er) => batteryEnergy(er) + ) + } + ), + /* @__PURE__ */ jsx2( + "label", + { + label: bind(battery, "percentage").as( + (p) => ` ${Math.round(p * 100)}%` + ) + } + ), + /* @__PURE__ */ jsx2( + "label", + { + cssClasses: ["time"], + hexpand: true, + halign: Gtk4.Align.END, + visible: bind(battery, "charging").as((c) => !c), + label: bind(battery, "timeToEmpty").as((t) => toTime(t)) + } + ) + ] }) + } + ); +}; +var toTime = (time) => { + const MINUTE = 60; + const HOUR = MINUTE * 60; + if (time > 24 * HOUR) return ""; + const hours = Math.round(time / HOUR); + const minutes = Math.round((time - hours * HOUR) / MINUTE); + const hoursDisplay = hours > 0 ? `${hours}h ` : ""; + const minutesDisplay = minutes > 0 ? `${minutes}m ` : ""; + return `${hoursDisplay}${minutesDisplay}`; +}; + +// components/QuickActions/modules/Networking/Network.tsx +import AstalNetwork2 from "gi://AstalNetwork"; + +// components/QuickActions/modules/Networking/network-helper.ts +import AstalNetwork from "gi://AstalNetwork"; +var networkEnabled = Variable(exec("nmcli networking connectivity") !== "none"); +var network = AstalNetwork.get_default(); +var setNetworking = (status) => { + if (status === true) { + exec("nmcli networking on"); + networkEnabled.set(true); + } else { + exec("nmcli networking off"); + networkEnabled.set(false); + } +}; +var getIP = () => { + return exec(`/bin/bash -c "ip addr show | grep 'inet ' | awk '{print $2}' | grep -v '127'"`).split("/")[0]; +}; +var network_helper_default = { + networkEnabled, + setNetworking, + getIP +}; + +// components/QuickActions/modules/Networking/NetworkMenu.tsx +var NetworkMenu = () => { + const popover = new Gtk4.Popover(); + popover.set_child(renderMenu()); + return popover; +}; +var renderMenu = () => { + return /* @__PURE__ */ jsxs("box", { vertical: true, children: [ + /* @__PURE__ */ jsx2("image", { iconName: "appointment-soon-symbolic", iconSize: Gtk4.IconSize.LARGE }), + /* @__PURE__ */ jsx2("label", { label: "Coming later" }) + ] }); +}; +var NetworkMenu_default = { + NetworkMenu +}; + +// components/QuickActions/modules/Networking/Network.tsx +var net = AstalNetwork2.get_default(); +var STATE = AstalNetwork2.DeviceState; +var Network = () => { + const netMenu = NetworkMenu_default.NetworkMenu(); + return /* @__PURE__ */ jsxs("box", { children: [ + /* @__PURE__ */ jsx2( + "button", + { + cssClasses: network_helper_default.networkEnabled((en) => { + if (en) return ["toggle-button", "toggle-on"]; + else return ["toggle-button"]; + }), + onClicked: () => network_helper_default.setNetworking( + !network_helper_default.networkEnabled.get() + ), + child: /* @__PURE__ */ jsxs("box", { vertical: true, children: [ + /* @__PURE__ */ jsx2( + "label", + { + label: bind(net.wifi, "enabled").as( + (stat) => `Network (${stat ? "WiFi" : "Wired"})` + ), + cssClasses: ["title-2"] + } + ), + /* @__PURE__ */ jsx2( + "label", + { + label: bind(net.wired, "state").as((state) => { + if (state === STATE.ACTIVATED) { + return "Wired. IP: " + network_helper_default.getIP(); + } else if (state === STATE.DISCONNECTED) { + return "Disconnected"; + } else if (state === STATE.FAILED) { + return "Error"; + } else if (state === STATE.PREPARE || state === STATE.CONFIG || state === STATE.IP_CHECK || state === STATE.IP_CONFIG) { + return "Connecting..."; + } else { + return "Unavailable"; + } + }), + visible: bind(net.wifi, "enabled").as((v) => !v) + } + ), + /* @__PURE__ */ jsx2( + "label", + { + label: bind(net.wifi, "state").as((state) => { + if (state === STATE.ACTIVATED) { + return `${net.wifi.get_ssid()} (${network_helper_default.getIP()})`; + } else if (state === STATE.DISCONNECTED) { + return "Disconnected"; + } else if (state === STATE.FAILED) { + return "Error"; + } else if (state === STATE.PREPARE || state === STATE.CONFIG || state === STATE.IP_CHECK || state === STATE.IP_CONFIG) { + return "Connecting..."; + } else { + return "Unavailable"; + } + }), + visible: bind(net.wifi, "enabled") + } + ) + ] }) + } + ), + /* @__PURE__ */ jsx2( + "button", + { + cssClasses: ["actions-button"], + visible: network_helper_default.networkEnabled(), + onClicked: () => netMenu.popup(), + child: /* @__PURE__ */ jsxs("box", { children: [ + /* @__PURE__ */ jsx2("image", { iconName: "arrow-right-symbolic" }), + netMenu + ] }), + tooltipText: "View available devices" + } + ) + ] }); +}; +var Network_default = { + Network +}; + +// components/QuickActions/QuickActions.tsx +var QuickActions = () => { + const popover = new Gtk4.Popover({ cssClasses: ["quick-actions-wrapper"] }); + popover.set_child(renderQuickActions()); + return popover; +}; +var renderQuickActions = () => { + const user = exec("/bin/sh -c whoami"); + const profile = exec("/bin/fish -c get-profile-picture"); + const cwd = exec("pwd"); + const um = Power_default.UserMenu(); + return /* @__PURE__ */ jsxs("box", { visible: true, cssClasses: ["quick-actions", "popover-box"], vertical: true, children: [ + /* @__PURE__ */ jsx2( + "centerbox", + { + startWidget: /* @__PURE__ */ jsx2( + "button", + { + onClicked: () => um.popup(), + cssClasses: ["stealthy-button"], + child: /* @__PURE__ */ jsxs("box", { children: [ + um, + /* @__PURE__ */ jsx2( + Gtk4.Frame, + { + cssClasses: ["avatar-icon"], + child: /* @__PURE__ */ jsx2( + "image", + { + file: profile !== "" ? profile : cwd + "/no-avatar-icon.jpg" + } + ) + } + ), + /* @__PURE__ */ jsx2("label", { label: user }) + ] }) + } + ), + endWidget: /* @__PURE__ */ jsxs("box", { children: [ + /* @__PURE__ */ jsx2(BatteryBox, {}), + /* @__PURE__ */ jsx2(Power_default.Power, {}) + ] }) + } + ), + /* @__PURE__ */ jsx2(Gtk4.Separator, { marginTop: 10, marginBottom: 20 }), + /* @__PURE__ */ jsxs("box", { children: [ + /* @__PURE__ */ jsx2(Bluetooth_default.BluetoothModule, {}), + /* @__PURE__ */ jsx2(Network_default.Network, {}) + ] }), + /* @__PURE__ */ jsx2(Gtk4.Separator, { marginTop: 10, marginBottom: 10 }), + /* @__PURE__ */ jsx2(Brightness_default.BrightnessModule, {}), + /* @__PURE__ */ jsx2(Audio_default.AudioModule, {}), + /* @__PURE__ */ jsx2(Player_default.PlayerModule, {}) + ] }); +}; +var QuickActions_default = { + QuickActions +}; + +// components/bar/modules/QuickView.tsx +var STATE2 = AstalNetwork3.DeviceState; +var QuickView = () => { + const qa = QuickActions_default.QuickActions(); + const showQuickActions = () => { + qa.popup(); + }; + return /* @__PURE__ */ jsx2( + "button", + { + onClicked: () => showQuickActions(), + cssClasses: ["quick-action-button"], + child: /* @__PURE__ */ jsxs("box", { children: [ + /* @__PURE__ */ jsx2(BatteryWidget, {}), + /* @__PURE__ */ jsx2(Audio, {}), + /* @__PURE__ */ jsx2(BluetoothWidget, {}), + /* @__PURE__ */ jsx2(NetworkWidget, {}), + /* @__PURE__ */ jsx2(BrightnessWidget, {}), + /* @__PURE__ */ jsx2("image", { iconName: "system-shutdown-symbolic" }), + qa + ] }) + } + ); +}; +var NetworkWidget = () => { + const network2 = AstalNetwork3.get_default(); + return /* @__PURE__ */ jsxs("box", { children: [ + /* @__PURE__ */ jsx2( + "image", + { + iconName: bind(network2, "state").as((state) => { + if (state === AstalNetwork3.State.CONNECTING) { + return "chronometer-reset-symbolic"; + } else if (state === AstalNetwork3.State.CONNECTED_LOCAL || state === AstalNetwork3.State.CONNECTED_SITE || state === AstalNetwork3.State.CONNECTED_GLOBAL) { + return "network-wired-activated-symbolic"; + } else { + return "paint-unknown-symbolic"; + } + }), + cssClasses: ["network-widget", "quick-view-symbol"], + visible: bind(network2.wifi, "state").as( + (state) => state !== STATE2.ACTIVATED + ) + } + ), + /* @__PURE__ */ jsx2( + "image", + { + iconName: bind(network2.wifi, "state").as((state) => { + if (state === STATE2.ACTIVATED) { + return network2.wifi.iconName; + } else { + return ""; + } + }), + cssClasses: ["network-widget", "quick-view-symbol"], + visible: bind(network2.wifi, "state").as( + (state) => state === STATE2.ACTIVATED + ) + } + ) + ] }); +}; +var BluetoothWidget = () => { + const bluetooth = AstalBluetooth2.get_default(); + const enabled2 = bind(bluetooth.adapter, "powered"); + const connected = bind(bluetooth, "isConnected"); + return /* @__PURE__ */ jsxs("box", { children: [ + /* @__PURE__ */ jsxs("box", { visible: enabled2.as((e) => e), children: [ + /* @__PURE__ */ jsx2( + "image", + { + iconName: "bluetooth-active-symbolic", + visible: connected.as((c) => c) + } + ), + /* @__PURE__ */ jsx2( + "image", + { + iconName: "bluetooth-disconnected-symbolic", + visible: connected.as((c) => !c) + } + ) + ] }), + /* @__PURE__ */ jsx2( + "image", + { + iconName: "bluetooth-disabled-symbolic", + visible: enabled2.as((e) => !e) + } + ), + /* @__PURE__ */ jsx2("box", { children: bind(bluetooth, "devices").as((devices) => { + return devices.map((device) => { + return /* @__PURE__ */ jsxs("box", { visible: bind(device, "connected").as((c) => c), children: [ + /* @__PURE__ */ jsx2( + "image", + { + iconName: bind(device, "icon").as( + (icon) => icon + ) + } + ), + /* @__PURE__ */ jsx2( + "label", + { + label: bind(device, "batteryPercentage").as( + (n) => { + return n + "%"; + } + ) + } + ) + ] }); + }); + }) }) + ] }); +}; +var BatteryWidget = () => { + const battery = AstalBattery.get_default(); + if (battery.get_is_present()) { + return /* @__PURE__ */ jsx2( + "image", + { + iconName: bind(battery, "iconName").as((icon) => icon), + cssClasses: ["quick-view-symbol"] + } + ); + } else { + return /* @__PURE__ */ jsx2("box", {}); + } +}; +var BrightnessWidget = () => { + const brightness2 = Brightness.get_default(); + const screen_brightness = bind(brightness2, "screen"); + return /* @__PURE__ */ jsx2( + "label", + { + label: "\u{1F323}" + screen_brightness, + visible: bind(brightness2, "screenAvailable"), + cssClasses: ["quick-view-symbol"] + } + ); +}; +var Audio = () => { + const wireplumber = AstalWp2.get_default(); + if (wireplumber) { + return /* @__PURE__ */ jsxs("box", { orientation: Gtk4.Orientation.HORIZONTAL, children: [ + /* @__PURE__ */ jsx2( + "image", + { + iconName: bind(wireplumber.defaultSpeaker, "volumeIcon").as( + (icon) => icon + ), + cssClasses: ["quick-view-symbol"] + } + ), + /* @__PURE__ */ jsx2( + "image", + { + iconName: bind( + wireplumber.defaultMicrophone, + "volumeIcon" + ).as((icon) => icon), + cssClasses: ["quick-view-symbol"] + } + ) + ] }); + } else { + print( + "[ WirePlumber ] Could not connect, Audio support in bar will be missing" + ); + return /* @__PURE__ */ jsx2("image", { iconName: "action-unavailable-symbolic" }); + } +}; +var QuickView_default = { + QuickView +}; + +// components/bar/modules/SystemInfo.tsx +var FETCH_INTERVAL = 2e3; +var cpuUtil = Variable("0%"); +var ramUtil = Variable("0%"); +var ramUsed = Variable("0MiB"); +var gpuUtil = Variable("0%"); +var gpuName = "card1"; +var enabled = false; +var refreshStats = () => { + gpuName = exec(`/bin/bash -c "ls /sys/class/drm/ | grep '^card[0-9]*$'"`); + const cpuNameInSensors = "CPUTIN"; + const stats = { + kernel: exec("uname -sr"), + netSpeed: exec( + `/bin/bash -c "interface=$(ip route get 8.8.8.8 | awk '{print $5; exit}') && cat "/sys/class/net/$interface/speed""` + ), + cpuTemp: exec( + `/bin/bash -c "sensors | grep -m1 ${cpuNameInSensors} | awk '{print $2}'"` + ), + cpuClk: exec( + `awk '/cpu MHz/ {sum+=$4; ++n} END {print sum/n " MHz"}' /proc/cpuinfo` + ), + gpuTemp: exec( + `/bin/bash -c "sensors | grep -E 'edge' | awk '{print $2}'"` + ), + gpuClk: exec( + `/bin/bash -c "cat /sys/class/drm/${gpuName}/device/pp_dpm_sclk | grep '\\*' | awk '{print $2 $3}'"` + ), + vram: Math.round( + parseInt( + exec( + `cat /sys/class/drm/${gpuName}/device/mem_info_vram_used` + ) + ) / 1024 / 1024 + ) + "MiB", + availableVRAM: Math.round( + parseInt( + exec( + `cat /sys/class/drm/${gpuName}/device/mem_info_vram_total` + ) + ) / 1024 / 1024 + ) + "MiB" + }; + return stats; +}; +var systemStats = Variable(refreshStats()); +var availableFeatures = { + cpu: true, + ram: true +}; +var featureTest = () => { + try { + exec("awk -V"); + exec("sed --version"); + enabled = true; + } catch (e) { + printerr( + "[ SysInfo ] AWK or SED missing! No system info will be available" + ); + enabled = false; + return; + } + try { + exec("mpstat -V"); + } catch (e) { + availableFeatures.cpu = false; + printerr( + "[ SysInfo ] Feature Test for CPU info failed. mpstat from the sysstat package missing!" + ); + } +}; +var info = () => { + return /* @__PURE__ */ jsxs("box", { vertical: true, children: [ + /* @__PURE__ */ jsx2( + "label", + { + label: "System Information", + cssClasses: ["title-2"] + } + ), + /* @__PURE__ */ jsx2(Gtk4.Separator, { marginTop: 5, marginBottom: 10 }), + /* @__PURE__ */ jsx2( + "label", + { + vexpand: true, + halign: Gtk4.Align.START, + hexpand: true, + label: ramUsed((used) => { + return "RAM: " + used + ` (${ramUtil.get()}%)`; + }) + } + ), + /* @__PURE__ */ jsx2( + "label", + { + label: systemStats((stats) => { + return `CPU: ${stats.cpuTemp}, ${stats.cpuClk} +GPU: ${stats.gpuTemp}, ${stats.gpuClk} (${stats.vram} / ${stats.availableVRAM}) +Network: ${stats.netSpeed} mb/s +Kernel: ${stats.kernel}`; + }) + } + ), + /* @__PURE__ */ jsx2(Gtk4.Separator, { marginTop: 10 }), + /* @__PURE__ */ jsx2( + "button", + { + onClicked: () => exec(`/bin/sh -c "kitty --hold fish -c 'fastfetch'"`), + child: /* @__PURE__ */ jsx2("label", { label: "View FastFetch" }) + } + ) + ] }); +}; +var SystemInformationPanel = () => { + const popover = new Gtk4.Popover(); + popover.set_child(info()); + return popover; +}; +var sysInfoFetcher = () => { + if (enabled) { + if (availableFeatures.cpu) { + cpuUtil.set( + "" + Math.round( + parseFloat(exec(`/bin/fish -c cpu-utilization`)) + ) + ); + } + if (availableFeatures.ram) { + ramUtil.set( + "" + Math.round( + parseFloat( + exec( + `/bin/bash -c "free | awk '/Mem/ { printf(\\"%.2f\\\\n\\", ($3/$2)*100) }'"` + ) + ) + ) + ); + ramUsed.set( + exec( + `/bin/bash -c "free -h | awk '/^Mem:/ {print $3 \\" used of \\" $2}'"` + ).replaceAll("Gi", "GiB").replaceAll("Mi", "MiB") + ); + } + gpuUtil.set(exec("cat /sys/class/drm/card1/device/gpu_busy_percent")); + } +}; +var panel = SystemInformationPanel(); +var SystemInfo = () => { + featureTest(); + const openSysInfo = async () => { + panel.popup(); + systemStats.set(refreshStats()); + }; + if (enabled) { + sysInfoFetcher(); + interval(FETCH_INTERVAL, sysInfoFetcher); + return /* @__PURE__ */ jsx2( + "button", + { + onClicked: () => openSysInfo(), + child: /* @__PURE__ */ jsxs("box", { tooltipText: ramUsed((v) => v), children: [ + /* @__PURE__ */ jsx2( + "image", + { + iconName: "power-profile-performance-symbolic", + marginEnd: 1 + } + ), + /* @__PURE__ */ jsx2( + "label", + { + label: cpuUtil((util) => util), + marginEnd: 5 + } + ), + /* @__PURE__ */ jsx2("image", { iconName: "histogram-symbolic" }), + /* @__PURE__ */ jsx2("label", { label: ramUtil((util) => util) }), + /* @__PURE__ */ jsx2("image", { iconName: "show-gpu-effects-symbolic" }), + /* @__PURE__ */ jsx2("label", { label: gpuUtil((util) => util) }), + panel + ] }), + cssClasses: ["bar-button"] + } + ); + } else { + return /* @__PURE__ */ jsx2("image", { iconName: "action-unavailable-symbolic" }); + } +}; +var SystemInfo_default = { + SystemInfo, + panel +}; + +// components/bar/Bar.tsx +var Bar = ({ gdkmonitor, name }) => { + const { TOP, LEFT, RIGHT } = Astal6.WindowAnchor; + return /* @__PURE__ */ jsx2( + "window", + { + gdkmonitor, + cssClasses: ["Bar"], + name, + namespace: "bar", + exclusivity: Astal6.Exclusivity.EXCLUSIVE, + anchor: TOP | LEFT | RIGHT, + visible: true, + application: app_default, + child: /* @__PURE__ */ jsx2( + CenterBox, + { + orientation: Gtk4.Orientation.HORIZONTAL, + start_widget: /* @__PURE__ */ jsxs( + "box", + { + hexpand: true, + halign: Gtk4.Align.START, + children: [ + /* @__PURE__ */ jsx2(Calendar_default.Time, {}), + /* @__PURE__ */ jsx2(SystemInfo_default.SystemInfo, {}), + /* @__PURE__ */ jsx2(Hyprland_default.Workspace, {}) + ] + } + ), + centerWidget: /* @__PURE__ */ jsx2(Hyprland_default.ActiveWindow, {}), + endWidget: /* @__PURE__ */ jsxs( + "box", + { + hexpand: true, + halign: Gtk4.Align.END, + cssClasses: ["BarRight"], + children: [ + /* @__PURE__ */ jsx2(Hyprland_default.SysTray, {}), + /* @__PURE__ */ jsx2(QuickView_default.QuickView, {}) + ] + } + ) + } + ) + } + ); +}; +var cliHandler = (args) => { + return "Not implemented"; +}; +var BarLauncher = (monitor) => { + const windowName = `bar-${monitor.get_connector()}`; + const createBar = () => { + return /* @__PURE__ */ jsx2(Bar, { gdkmonitor: monitor, name: windowName }); + }; + createBar(); + return windowName; +}; +var Bar_default = { + BarLauncher, + cliHandler +}; + +// app.ts +import AstalHyprland2 from "gi://AstalHyprland?version=0.1"; + +// util/hyprland.ts +function hyprToGdk(monitor) { + const monitors = app_default.get_monitors(); + if (!monitors || monitors.length === 0) return null; + for (let gdkmonitor of monitors) { + if (monitor && gdkmonitor && monitor.get_name() === gdkmonitor.get_connector()) + return gdkmonitor; + } + return monitors.length > 0 ? monitors[0] : null; +} + +// app.ts +app_default.start({ + instanceName: "runner", + css: style_default, + main() { + const hypr2 = AstalHyprland2.get_default(); + const bars = /* @__PURE__ */ new Map(); + const barCreator = (monitor) => { + const gdkMonitor = hyprToGdk(monitor); + if (gdkMonitor) { + print("Bar added for screen " + monitor.get_id()); + bars.set(monitor.get_id(), Bar_default.BarLauncher(gdkMonitor)); + } + }; + for (const monitor of hypr2.monitors) { + barCreator(monitor); + } + hypr2.connect("monitor-added", (_, monitor) => { + barCreator(monitor); + }); + hypr2.connect("monitor-removed", (_, monitor) => { + const windowName = bars.get(monitor); + if (windowName) { + const win = app_default.get_window(windowName); + if (win) { + app_default.toggle_window(windowName); + win.set_child(null); + app_default.remove_window(win); + print("Bar removed for screen", monitor); + } + bars.delete(monitor); + } + }); + }, + requestHandler(request, res) { + const args = request.trimStart().split(" "); + if (args[0] === "notifier") { + res("Not available here yet, run astal -i notifier " + args[1]); + } else if (args[0] === "bar") { + res(Bar_default.cliHandler(args)); + } + } +}); +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL3NoYXJlL2FzdGFsL2dqcy9ndGs0L2luZGV4LnRzIiwgIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9zaGFyZS9hc3RhbC9nanMvdmFyaWFibGUudHMiLCAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL3NoYXJlL2FzdGFsL2dqcy9iaW5kaW5nLnRzIiwgIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9zaGFyZS9hc3RhbC9nanMvdGltZS50cyIsICIuLi8uLi8uLi8uLi8uLi8uLi8uLi91c3Ivc2hhcmUvYXN0YWwvZ2pzL3Byb2Nlc3MudHMiLCAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL3NoYXJlL2FzdGFsL2dqcy9fYXN0YWwudHMiLCAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL3NoYXJlL2FzdGFsL2dqcy9ndGs0L2FzdGFsaWZ5LnRzIiwgIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9zaGFyZS9hc3RhbC9nanMvZ3RrNC9hcHAudHMiLCAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL3NoYXJlL2FzdGFsL2dqcy9vdmVycmlkZXMudHMiLCAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL3NoYXJlL2FzdGFsL2dqcy9fYXBwLnRzIiwgIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9zaGFyZS9hc3RhbC9nanMvZ3RrNC93aWRnZXQudHMiLCAic2FzczovaG9tZS9qYW5pcy9wcm9qZWN0cy9hY3RpdmUvZG90ZmlsZXMvY29uZmlnL2FzdGFsL3N0eWxlLnNjc3MiLCAiY29tcG9uZW50cy9iYXIvbW9kdWxlcy9IeXBybGFuZC50c3giLCAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL3NoYXJlL2FzdGFsL2dqcy9pbmRleC50cyIsICIuLi8uLi8uLi8uLi8uLi8uLi8uLi91c3Ivc2hhcmUvYXN0YWwvZ2pzL2ZpbGUudHMiLCAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdXNyL3NoYXJlL2FzdGFsL2dqcy9nb2JqZWN0LnRzIiwgIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9zaGFyZS9hc3RhbC9nanMvZ3RrNC9qc3gtcnVudGltZS50cyIsICJjb21wb25lbnRzL2Jhci9tb2R1bGVzL0NhbGVuZGFyLnRzeCIsICJjb21wb25lbnRzL2Jhci9tb2R1bGVzL1F1aWNrVmlldy50c3giLCAidXRpbC9icmlnaHRuZXNzLnRzIiwgImNvbXBvbmVudHMvUXVpY2tBY3Rpb25zL21vZHVsZXMvUG93ZXIudHN4IiwgImNvbXBvbmVudHMvUXVpY2tBY3Rpb25zL21vZHVsZXMvQXVkaW8vQXVkaW8udHN4IiwgImNvbXBvbmVudHMvUXVpY2tBY3Rpb25zL21vZHVsZXMvQmx1ZXRvb3RoL0JsdWV0b290aC50c3giLCAiY29tcG9uZW50cy9RdWlja0FjdGlvbnMvbW9kdWxlcy9CbHVldG9vdGgvRGV2aWNlLnRzeCIsICJjb21wb25lbnRzL1F1aWNrQWN0aW9ucy9tb2R1bGVzL0JyaWdodG5lc3MvQnJpZ2h0bmVzcy50c3giLCAiY29tcG9uZW50cy9RdWlja0FjdGlvbnMvbW9kdWxlcy9QbGF5ZXIvUGxheWVyLnRzeCIsICJjb21wb25lbnRzL1F1aWNrQWN0aW9ucy9tb2R1bGVzL0JhdHRlcnkudHN4IiwgImNvbXBvbmVudHMvUXVpY2tBY3Rpb25zL21vZHVsZXMvTmV0d29ya2luZy9OZXR3b3JrLnRzeCIsICJjb21wb25lbnRzL1F1aWNrQWN0aW9ucy9tb2R1bGVzL05ldHdvcmtpbmcvbmV0d29yay1oZWxwZXIudHMiLCAiY29tcG9uZW50cy9RdWlja0FjdGlvbnMvbW9kdWxlcy9OZXR3b3JraW5nL05ldHdvcmtNZW51LnRzeCIsICJjb21wb25lbnRzL1F1aWNrQWN0aW9ucy9RdWlja0FjdGlvbnMudHN4IiwgImNvbXBvbmVudHMvYmFyL21vZHVsZXMvU3lzdGVtSW5mby50c3giLCAiY29tcG9uZW50cy9iYXIvQmFyLnRzeCIsICJhcHAudHMiLCAidXRpbC9oeXBybGFuZC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IEFzdGFsIGZyb20gXCJnaTovL0FzdGFsP3ZlcnNpb249NC4wXCJcbmltcG9ydCBHdGsgZnJvbSBcImdpOi8vR3RrP3ZlcnNpb249NC4wXCJcbmltcG9ydCBHZGsgZnJvbSBcImdpOi8vR2RrP3ZlcnNpb249NC4wXCJcbmltcG9ydCBhc3RhbGlmeSwgeyB0eXBlIENvbnN0cnVjdFByb3BzIH0gZnJvbSBcIi4vYXN0YWxpZnkuanNcIlxuXG5leHBvcnQgeyBBc3RhbCwgR3RrLCBHZGsgfVxuZXhwb3J0IHsgZGVmYXVsdCBhcyBBcHAgfSBmcm9tIFwiLi9hcHAuanNcIlxuZXhwb3J0IHsgYXN0YWxpZnksIENvbnN0cnVjdFByb3BzIH1cbmV4cG9ydCAqIGFzIFdpZGdldCBmcm9tIFwiLi93aWRnZXQuanNcIlxuZXhwb3J0IHsgaG9vayB9IGZyb20gXCIuLi9fYXN0YWxcIlxuIiwgImltcG9ydCBBc3RhbCBmcm9tIFwiZ2k6Ly9Bc3RhbElPXCJcbmltcG9ydCBCaW5kaW5nLCB7IHR5cGUgQ29ubmVjdGFibGUsIHR5cGUgU3Vic2NyaWJhYmxlIH0gZnJvbSBcIi4vYmluZGluZy5qc1wiXG5pbXBvcnQgeyBpbnRlcnZhbCB9IGZyb20gXCIuL3RpbWUuanNcIlxuaW1wb3J0IHsgZXhlY0FzeW5jLCBzdWJwcm9jZXNzIH0gZnJvbSBcIi4vcHJvY2Vzcy5qc1wiXG5cbmNsYXNzIFZhcmlhYmxlV3JhcHBlcjxUPiBleHRlbmRzIEZ1bmN0aW9uIHtcbiAgICBwcml2YXRlIHZhcmlhYmxlITogQXN0YWwuVmFyaWFibGVCYXNlXG4gICAgcHJpdmF0ZSBlcnJIYW5kbGVyPyA9IGNvbnNvbGUuZXJyb3JcblxuICAgIHByaXZhdGUgX3ZhbHVlOiBUXG4gICAgcHJpdmF0ZSBfcG9sbD86IEFzdGFsLlRpbWVcbiAgICBwcml2YXRlIF93YXRjaD86IEFzdGFsLlByb2Nlc3NcblxuICAgIHByaXZhdGUgcG9sbEludGVydmFsID0gMTAwMFxuICAgIHByaXZhdGUgcG9sbEV4ZWM/OiBzdHJpbmdbXSB8IHN0cmluZ1xuICAgIHByaXZhdGUgcG9sbFRyYW5zZm9ybT86IChzdGRvdXQ6IHN0cmluZywgcHJldjogVCkgPT4gVFxuICAgIHByaXZhdGUgcG9sbEZuPzogKHByZXY6IFQpID0+IFQgfCBQcm9taXNlPFQ+XG5cbiAgICBwcml2YXRlIHdhdGNoVHJhbnNmb3JtPzogKHN0ZG91dDogc3RyaW5nLCBwcmV2OiBUKSA9PiBUXG4gICAgcHJpdmF0ZSB3YXRjaEV4ZWM/OiBzdHJpbmdbXSB8IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3IoaW5pdDogVCkge1xuICAgICAgICBzdXBlcigpXG4gICAgICAgIHRoaXMuX3ZhbHVlID0gaW5pdFxuICAgICAgICB0aGlzLnZhcmlhYmxlID0gbmV3IEFzdGFsLlZhcmlhYmxlQmFzZSgpXG4gICAgICAgIHRoaXMudmFyaWFibGUuY29ubmVjdChcImRyb3BwZWRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdG9wV2F0Y2goKVxuICAgICAgICAgICAgdGhpcy5zdG9wUG9sbCgpXG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMudmFyaWFibGUuY29ubmVjdChcImVycm9yXCIsIChfLCBlcnIpID0+IHRoaXMuZXJySGFuZGxlcj8uKGVycikpXG4gICAgICAgIHJldHVybiBuZXcgUHJveHkodGhpcywge1xuICAgICAgICAgICAgYXBwbHk6ICh0YXJnZXQsIF8sIGFyZ3MpID0+IHRhcmdldC5fY2FsbChhcmdzWzBdKSxcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jYWxsPFIgPSBUPih0cmFuc2Zvcm0/OiAodmFsdWU6IFQpID0+IFIpOiBCaW5kaW5nPFI+IHtcbiAgICAgICAgY29uc3QgYiA9IEJpbmRpbmcuYmluZCh0aGlzKVxuICAgICAgICByZXR1cm4gdHJhbnNmb3JtID8gYi5hcyh0cmFuc2Zvcm0pIDogYiBhcyB1bmtub3duIGFzIEJpbmRpbmc8Uj5cbiAgICB9XG5cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyhgVmFyaWFibGU8JHt0aGlzLmdldCgpfT5gKVxuICAgIH1cblxuICAgIGdldCgpOiBUIHsgcmV0dXJuIHRoaXMuX3ZhbHVlIH1cbiAgICBzZXQodmFsdWU6IFQpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLl92YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZVxuICAgICAgICAgICAgdGhpcy52YXJpYWJsZS5lbWl0KFwiY2hhbmdlZFwiKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhcnRQb2xsKCkge1xuICAgICAgICBpZiAodGhpcy5fcG9sbClcbiAgICAgICAgICAgIHJldHVyblxuXG4gICAgICAgIGlmICh0aGlzLnBvbGxGbikge1xuICAgICAgICAgICAgdGhpcy5fcG9sbCA9IGludGVydmFsKHRoaXMucG9sbEludGVydmFsLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMucG9sbEZuISh0aGlzLmdldCgpKVxuICAgICAgICAgICAgICAgIGlmICh2IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICB2LnRoZW4odiA9PiB0aGlzLnNldCh2KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4gdGhpcy52YXJpYWJsZS5lbWl0KFwiZXJyb3JcIiwgZXJyKSlcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldCh2KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5wb2xsRXhlYykge1xuICAgICAgICAgICAgdGhpcy5fcG9sbCA9IGludGVydmFsKHRoaXMucG9sbEludGVydmFsLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgZXhlY0FzeW5jKHRoaXMucG9sbEV4ZWMhKVxuICAgICAgICAgICAgICAgICAgICAudGhlbih2ID0+IHRoaXMuc2V0KHRoaXMucG9sbFRyYW5zZm9ybSEodiwgdGhpcy5nZXQoKSkpKVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHRoaXMudmFyaWFibGUuZW1pdChcImVycm9yXCIsIGVycikpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhcnRXYXRjaCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhdGNoKVxuICAgICAgICAgICAgcmV0dXJuXG5cbiAgICAgICAgdGhpcy5fd2F0Y2ggPSBzdWJwcm9jZXNzKHtcbiAgICAgICAgICAgIGNtZDogdGhpcy53YXRjaEV4ZWMhLFxuICAgICAgICAgICAgb3V0OiBvdXQgPT4gdGhpcy5zZXQodGhpcy53YXRjaFRyYW5zZm9ybSEob3V0LCB0aGlzLmdldCgpKSksXG4gICAgICAgICAgICBlcnI6IGVyciA9PiB0aGlzLnZhcmlhYmxlLmVtaXQoXCJlcnJvclwiLCBlcnIpLFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHN0b3BQb2xsKCkge1xuICAgICAgICB0aGlzLl9wb2xsPy5jYW5jZWwoKVxuICAgICAgICBkZWxldGUgdGhpcy5fcG9sbFxuICAgIH1cblxuICAgIHN0b3BXYXRjaCgpIHtcbiAgICAgICAgdGhpcy5fd2F0Y2g/LmtpbGwoKVxuICAgICAgICBkZWxldGUgdGhpcy5fd2F0Y2hcbiAgICB9XG5cbiAgICBpc1BvbGxpbmcoKSB7IHJldHVybiAhIXRoaXMuX3BvbGwgfVxuICAgIGlzV2F0Y2hpbmcoKSB7IHJldHVybiAhIXRoaXMuX3dhdGNoIH1cblxuICAgIGRyb3AoKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGUuZW1pdChcImRyb3BwZWRcIilcbiAgICB9XG5cbiAgICBvbkRyb3BwZWQoY2FsbGJhY2s6ICgpID0+IHZvaWQpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZS5jb25uZWN0KFwiZHJvcHBlZFwiLCBjYWxsYmFjaylcbiAgICAgICAgcmV0dXJuIHRoaXMgYXMgdW5rbm93biBhcyBWYXJpYWJsZTxUPlxuICAgIH1cblxuICAgIG9uRXJyb3IoY2FsbGJhY2s6IChlcnI6IHN0cmluZykgPT4gdm9pZCkge1xuICAgICAgICBkZWxldGUgdGhpcy5lcnJIYW5kbGVyXG4gICAgICAgIHRoaXMudmFyaWFibGUuY29ubmVjdChcImVycm9yXCIsIChfLCBlcnIpID0+IGNhbGxiYWNrKGVycikpXG4gICAgICAgIHJldHVybiB0aGlzIGFzIHVua25vd24gYXMgVmFyaWFibGU8VD5cbiAgICB9XG5cbiAgICBzdWJzY3JpYmUoY2FsbGJhY2s6ICh2YWx1ZTogVCkgPT4gdm9pZCkge1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMudmFyaWFibGUuY29ubmVjdChcImNoYW5nZWRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2sodGhpcy5nZXQoKSlcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuICgpID0+IHRoaXMudmFyaWFibGUuZGlzY29ubmVjdChpZClcbiAgICB9XG5cbiAgICBwb2xsKFxuICAgICAgICBpbnRlcnZhbDogbnVtYmVyLFxuICAgICAgICBleGVjOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICAgICAgdHJhbnNmb3JtPzogKHN0ZG91dDogc3RyaW5nLCBwcmV2OiBUKSA9PiBUXG4gICAgKTogVmFyaWFibGU8VD5cblxuICAgIHBvbGwoXG4gICAgICAgIGludGVydmFsOiBudW1iZXIsXG4gICAgICAgIGNhbGxiYWNrOiAocHJldjogVCkgPT4gVCB8IFByb21pc2U8VD5cbiAgICApOiBWYXJpYWJsZTxUPlxuXG4gICAgcG9sbChcbiAgICAgICAgaW50ZXJ2YWw6IG51bWJlcixcbiAgICAgICAgZXhlYzogc3RyaW5nIHwgc3RyaW5nW10gfCAoKHByZXY6IFQpID0+IFQgfCBQcm9taXNlPFQ+KSxcbiAgICAgICAgdHJhbnNmb3JtOiAoc3Rkb3V0OiBzdHJpbmcsIHByZXY6IFQpID0+IFQgPSBvdXQgPT4gb3V0IGFzIFQsXG4gICAgKSB7XG4gICAgICAgIHRoaXMuc3RvcFBvbGwoKVxuICAgICAgICB0aGlzLnBvbGxJbnRlcnZhbCA9IGludGVydmFsXG4gICAgICAgIHRoaXMucG9sbFRyYW5zZm9ybSA9IHRyYW5zZm9ybVxuICAgICAgICBpZiAodHlwZW9mIGV4ZWMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhpcy5wb2xsRm4gPSBleGVjXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5wb2xsRXhlY1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wb2xsRXhlYyA9IGV4ZWNcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnBvbGxGblxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhcnRQb2xsKClcbiAgICAgICAgcmV0dXJuIHRoaXMgYXMgdW5rbm93biBhcyBWYXJpYWJsZTxUPlxuICAgIH1cblxuICAgIHdhdGNoKFxuICAgICAgICBleGVjOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICAgICAgdHJhbnNmb3JtOiAoc3Rkb3V0OiBzdHJpbmcsIHByZXY6IFQpID0+IFQgPSBvdXQgPT4gb3V0IGFzIFQsXG4gICAgKSB7XG4gICAgICAgIHRoaXMuc3RvcFdhdGNoKClcbiAgICAgICAgdGhpcy53YXRjaEV4ZWMgPSBleGVjXG4gICAgICAgIHRoaXMud2F0Y2hUcmFuc2Zvcm0gPSB0cmFuc2Zvcm1cbiAgICAgICAgdGhpcy5zdGFydFdhdGNoKClcbiAgICAgICAgcmV0dXJuIHRoaXMgYXMgdW5rbm93biBhcyBWYXJpYWJsZTxUPlxuICAgIH1cblxuICAgIG9ic2VydmUoXG4gICAgICAgIG9ianM6IEFycmF5PFtvYmo6IENvbm5lY3RhYmxlLCBzaWduYWw6IHN0cmluZ10+LFxuICAgICAgICBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBULFxuICAgICk6IFZhcmlhYmxlPFQ+XG5cbiAgICBvYnNlcnZlKFxuICAgICAgICBvYmo6IENvbm5lY3RhYmxlLFxuICAgICAgICBzaWduYWw6IHN0cmluZyxcbiAgICAgICAgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gVCxcbiAgICApOiBWYXJpYWJsZTxUPlxuXG4gICAgb2JzZXJ2ZShcbiAgICAgICAgb2JqczogQ29ubmVjdGFibGUgfCBBcnJheTxbb2JqOiBDb25uZWN0YWJsZSwgc2lnbmFsOiBzdHJpbmddPixcbiAgICAgICAgc2lnT3JGbjogc3RyaW5nIHwgKChvYmo6IENvbm5lY3RhYmxlLCAuLi5hcmdzOiBhbnlbXSkgPT4gVCksXG4gICAgICAgIGNhbGxiYWNrPzogKG9iajogQ29ubmVjdGFibGUsIC4uLmFyZ3M6IGFueVtdKSA9PiBULFxuICAgICkge1xuICAgICAgICBjb25zdCBmID0gdHlwZW9mIHNpZ09yRm4gPT09IFwiZnVuY3Rpb25cIiA/IHNpZ09yRm4gOiBjYWxsYmFjayA/PyAoKCkgPT4gdGhpcy5nZXQoKSlcbiAgICAgICAgY29uc3Qgc2V0ID0gKG9iajogQ29ubmVjdGFibGUsIC4uLmFyZ3M6IGFueVtdKSA9PiB0aGlzLnNldChmKG9iaiwgLi4uYXJncykpXG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqcykpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgb2JqIG9mIG9ianMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbbywgc10gPSBvYmpcbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IG8uY29ubmVjdChzLCBzZXQpXG4gICAgICAgICAgICAgICAgdGhpcy5vbkRyb3BwZWQoKCkgPT4gby5kaXNjb25uZWN0KGlkKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2lnT3JGbiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gb2Jqcy5jb25uZWN0KHNpZ09yRm4sIHNldClcbiAgICAgICAgICAgICAgICB0aGlzLm9uRHJvcHBlZCgoKSA9PiBvYmpzLmRpc2Nvbm5lY3QoaWQpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMgYXMgdW5rbm93biBhcyBWYXJpYWJsZTxUPlxuICAgIH1cblxuICAgIHN0YXRpYyBkZXJpdmU8XG4gICAgICAgIGNvbnN0IERlcHMgZXh0ZW5kcyBBcnJheTxTdWJzY3JpYmFibGU8YW55Pj4sXG4gICAgICAgIEFyZ3MgZXh0ZW5kcyB7XG4gICAgICAgICAgICBbSyBpbiBrZXlvZiBEZXBzXTogRGVwc1tLXSBleHRlbmRzIFN1YnNjcmliYWJsZTxpbmZlciBUPiA/IFQgOiBuZXZlclxuICAgICAgICB9LFxuICAgICAgICBWID0gQXJncyxcbiAgICA+KGRlcHM6IERlcHMsIGZuOiAoLi4uYXJnczogQXJncykgPT4gViA9ICguLi5hcmdzKSA9PiBhcmdzIGFzIHVua25vd24gYXMgVikge1xuICAgICAgICBjb25zdCB1cGRhdGUgPSAoKSA9PiBmbiguLi5kZXBzLm1hcChkID0+IGQuZ2V0KCkpIGFzIEFyZ3MpXG4gICAgICAgIGNvbnN0IGRlcml2ZWQgPSBuZXcgVmFyaWFibGUodXBkYXRlKCkpXG4gICAgICAgIGNvbnN0IHVuc3VicyA9IGRlcHMubWFwKGRlcCA9PiBkZXAuc3Vic2NyaWJlKCgpID0+IGRlcml2ZWQuc2V0KHVwZGF0ZSgpKSkpXG4gICAgICAgIGRlcml2ZWQub25Ecm9wcGVkKCgpID0+IHVuc3Vicy5tYXAodW5zdWIgPT4gdW5zdWIoKSkpXG4gICAgICAgIHJldHVybiBkZXJpdmVkXG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZhcmlhYmxlPFQ+IGV4dGVuZHMgT21pdDxWYXJpYWJsZVdyYXBwZXI8VD4sIFwiYmluZFwiPiB7XG4gICAgPFI+KHRyYW5zZm9ybTogKHZhbHVlOiBUKSA9PiBSKTogQmluZGluZzxSPlxuICAgICgpOiBCaW5kaW5nPFQ+XG59XG5cbmV4cG9ydCBjb25zdCBWYXJpYWJsZSA9IG5ldyBQcm94eShWYXJpYWJsZVdyYXBwZXIgYXMgYW55LCB7XG4gICAgYXBwbHk6IChfdCwgX2EsIGFyZ3MpID0+IG5ldyBWYXJpYWJsZVdyYXBwZXIoYXJnc1swXSksXG59KSBhcyB7XG4gICAgZGVyaXZlOiB0eXBlb2YgVmFyaWFibGVXcmFwcGVyW1wiZGVyaXZlXCJdXG4gICAgPFQ+KGluaXQ6IFQpOiBWYXJpYWJsZTxUPlxuICAgIG5ldzxUPihpbml0OiBUKTogVmFyaWFibGU8VD5cbn1cblxuZXhwb3J0IGNvbnN0IHsgZGVyaXZlIH0gPSBWYXJpYWJsZVxuZXhwb3J0IGRlZmF1bHQgVmFyaWFibGVcbiIsICJleHBvcnQgY29uc3Qgc25ha2VpZnkgPSAoc3RyOiBzdHJpbmcpID0+IHN0clxuICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCBcIiQxXyQyXCIpXG4gICAgLnJlcGxhY2VBbGwoXCItXCIsIFwiX1wiKVxuICAgIC50b0xvd2VyQ2FzZSgpXG5cbmV4cG9ydCBjb25zdCBrZWJhYmlmeSA9IChzdHI6IHN0cmluZykgPT4gc3RyXG4gICAgLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csIFwiJDEtJDJcIilcbiAgICAucmVwbGFjZUFsbChcIl9cIiwgXCItXCIpXG4gICAgLnRvTG93ZXJDYXNlKClcblxuZXhwb3J0IGludGVyZmFjZSBTdWJzY3JpYmFibGU8VCA9IHVua25vd24+IHtcbiAgICBzdWJzY3JpYmUoY2FsbGJhY2s6ICh2YWx1ZTogVCkgPT4gdm9pZCk6ICgpID0+IHZvaWRcbiAgICBnZXQoKTogVFxuICAgIFtrZXk6IHN0cmluZ106IGFueVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3RhYmxlIHtcbiAgICBjb25uZWN0KHNpZ25hbDogc3RyaW5nLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiB1bmtub3duKTogbnVtYmVyXG4gICAgZGlzY29ubmVjdChpZDogbnVtYmVyKTogdm9pZFxuICAgIFtrZXk6IHN0cmluZ106IGFueVxufVxuXG5leHBvcnQgY2xhc3MgQmluZGluZzxWYWx1ZT4ge1xuICAgIHByaXZhdGUgdHJhbnNmb3JtRm4gPSAodjogYW55KSA9PiB2XG5cbiAgICAjZW1pdHRlcjogU3Vic2NyaWJhYmxlPFZhbHVlPiB8IENvbm5lY3RhYmxlXG4gICAgI3Byb3A/OiBzdHJpbmdcblxuICAgIHN0YXRpYyBiaW5kPFxuICAgICAgICBUIGV4dGVuZHMgQ29ubmVjdGFibGUsXG4gICAgICAgIFAgZXh0ZW5kcyBrZXlvZiBULFxuICAgID4ob2JqZWN0OiBULCBwcm9wZXJ0eTogUCk6IEJpbmRpbmc8VFtQXT5cblxuICAgIHN0YXRpYyBiaW5kPFQ+KG9iamVjdDogU3Vic2NyaWJhYmxlPFQ+KTogQmluZGluZzxUPlxuXG4gICAgc3RhdGljIGJpbmQoZW1pdHRlcjogQ29ubmVjdGFibGUgfCBTdWJzY3JpYmFibGUsIHByb3A/OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nKGVtaXR0ZXIsIHByb3ApXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihlbWl0dGVyOiBDb25uZWN0YWJsZSB8IFN1YnNjcmliYWJsZTxWYWx1ZT4sIHByb3A/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy4jZW1pdHRlciA9IGVtaXR0ZXJcbiAgICAgICAgdGhpcy4jcHJvcCA9IHByb3AgJiYga2ViYWJpZnkocHJvcClcbiAgICB9XG5cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIGBCaW5kaW5nPCR7dGhpcy4jZW1pdHRlcn0ke3RoaXMuI3Byb3AgPyBgLCBcIiR7dGhpcy4jcHJvcH1cImAgOiBcIlwifT5gXG4gICAgfVxuXG4gICAgYXM8VD4oZm46ICh2OiBWYWx1ZSkgPT4gVCk6IEJpbmRpbmc8VD4ge1xuICAgICAgICBjb25zdCBiaW5kID0gbmV3IEJpbmRpbmcodGhpcy4jZW1pdHRlciwgdGhpcy4jcHJvcClcbiAgICAgICAgYmluZC50cmFuc2Zvcm1GbiA9ICh2OiBWYWx1ZSkgPT4gZm4odGhpcy50cmFuc2Zvcm1Gbih2KSlcbiAgICAgICAgcmV0dXJuIGJpbmQgYXMgdW5rbm93biBhcyBCaW5kaW5nPFQ+XG4gICAgfVxuXG4gICAgZ2V0KCk6IFZhbHVlIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLiNlbWl0dGVyLmdldCA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtRm4odGhpcy4jZW1pdHRlci5nZXQoKSlcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuI3Byb3AgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGdldHRlciA9IGBnZXRfJHtzbmFrZWlmeSh0aGlzLiNwcm9wKX1gXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuI2VtaXR0ZXJbZ2V0dGVyXSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybUZuKHRoaXMuI2VtaXR0ZXJbZ2V0dGVyXSgpKVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1Gbih0aGlzLiNlbWl0dGVyW3RoaXMuI3Byb3BdKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgRXJyb3IoXCJjYW4gbm90IGdldCB2YWx1ZSBvZiBiaW5kaW5nXCIpXG4gICAgfVxuXG4gICAgc3Vic2NyaWJlKGNhbGxiYWNrOiAodmFsdWU6IFZhbHVlKSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy4jZW1pdHRlci5zdWJzY3JpYmUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI2VtaXR0ZXIuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayh0aGlzLmdldCgpKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy4jZW1pdHRlci5jb25uZWN0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHNpZ25hbCA9IGBub3RpZnk6OiR7dGhpcy4jcHJvcH1gXG4gICAgICAgICAgICBjb25zdCBpZCA9IHRoaXMuI2VtaXR0ZXIuY29ubmVjdChzaWduYWwsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayh0aGlzLmdldCgpKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgKHRoaXMuI2VtaXR0ZXIuZGlzY29ubmVjdCBhcyBDb25uZWN0YWJsZVtcImRpc2Nvbm5lY3RcIl0pKGlkKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRocm93IEVycm9yKGAke3RoaXMuI2VtaXR0ZXJ9IGlzIG5vdCBiaW5kYWJsZWApXG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgeyBiaW5kIH0gPSBCaW5kaW5nXG5leHBvcnQgZGVmYXVsdCBCaW5kaW5nXG4iLCAiaW1wb3J0IEFzdGFsIGZyb20gXCJnaTovL0FzdGFsSU9cIlxuXG5leHBvcnQgdHlwZSBUaW1lID0gQXN0YWwuVGltZVxuZXhwb3J0IGNvbnN0IFRpbWUgPSBBc3RhbC5UaW1lXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcnZhbChpbnRlcnZhbDogbnVtYmVyLCBjYWxsYmFjaz86ICgpID0+IHZvaWQpIHtcbiAgICByZXR1cm4gQXN0YWwuVGltZS5pbnRlcnZhbChpbnRlcnZhbCwgKCkgPT4gdm9pZCBjYWxsYmFjaz8uKCkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0aW1lb3V0KHRpbWVvdXQ6IG51bWJlciwgY2FsbGJhY2s/OiAoKSA9PiB2b2lkKSB7XG4gICAgcmV0dXJuIEFzdGFsLlRpbWUudGltZW91dCh0aW1lb3V0LCAoKSA9PiB2b2lkIGNhbGxiYWNrPy4oKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlkbGUoY2FsbGJhY2s/OiAoKSA9PiB2b2lkKSB7XG4gICAgcmV0dXJuIEFzdGFsLlRpbWUuaWRsZSgoKSA9PiB2b2lkIGNhbGxiYWNrPy4oKSlcbn1cbiIsICJpbXBvcnQgQXN0YWwgZnJvbSBcImdpOi8vQXN0YWxJT1wiXG5cbnR5cGUgQXJncyA9IHtcbiAgICBjbWQ6IHN0cmluZyB8IHN0cmluZ1tdXG4gICAgb3V0PzogKHN0ZG91dDogc3RyaW5nKSA9PiB2b2lkXG4gICAgZXJyPzogKHN0ZGVycjogc3RyaW5nKSA9PiB2b2lkXG59XG5cbmV4cG9ydCB0eXBlIFByb2Nlc3MgPSBBc3RhbC5Qcm9jZXNzXG5leHBvcnQgY29uc3QgUHJvY2VzcyA9IEFzdGFsLlByb2Nlc3NcblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnByb2Nlc3MoYXJnczogQXJncyk6IEFzdGFsLlByb2Nlc3NcblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnByb2Nlc3MoXG4gICAgY21kOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICBvbk91dD86IChzdGRvdXQ6IHN0cmluZykgPT4gdm9pZCxcbiAgICBvbkVycj86IChzdGRlcnI6IHN0cmluZykgPT4gdm9pZCxcbik6IEFzdGFsLlByb2Nlc3NcblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnByb2Nlc3MoXG4gICAgYXJnc09yQ21kOiBBcmdzIHwgc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgb25PdXQ6IChzdGRvdXQ6IHN0cmluZykgPT4gdm9pZCA9IHByaW50LFxuICAgIG9uRXJyOiAoc3RkZXJyOiBzdHJpbmcpID0+IHZvaWQgPSBwcmludGVycixcbikge1xuICAgIGNvbnN0IGFyZ3MgPSBBcnJheS5pc0FycmF5KGFyZ3NPckNtZCkgfHwgdHlwZW9mIGFyZ3NPckNtZCA9PT0gXCJzdHJpbmdcIlxuICAgIGNvbnN0IHsgY21kLCBlcnIsIG91dCB9ID0ge1xuICAgICAgICBjbWQ6IGFyZ3MgPyBhcmdzT3JDbWQgOiBhcmdzT3JDbWQuY21kLFxuICAgICAgICBlcnI6IGFyZ3MgPyBvbkVyciA6IGFyZ3NPckNtZC5lcnIgfHwgb25FcnIsXG4gICAgICAgIG91dDogYXJncyA/IG9uT3V0IDogYXJnc09yQ21kLm91dCB8fCBvbk91dCxcbiAgICB9XG5cbiAgICBjb25zdCBwcm9jID0gQXJyYXkuaXNBcnJheShjbWQpXG4gICAgICAgID8gQXN0YWwuUHJvY2Vzcy5zdWJwcm9jZXNzdihjbWQpXG4gICAgICAgIDogQXN0YWwuUHJvY2Vzcy5zdWJwcm9jZXNzKGNtZClcblxuICAgIHByb2MuY29ubmVjdChcInN0ZG91dFwiLCAoXywgc3Rkb3V0OiBzdHJpbmcpID0+IG91dChzdGRvdXQpKVxuICAgIHByb2MuY29ubmVjdChcInN0ZGVyclwiLCAoXywgc3RkZXJyOiBzdHJpbmcpID0+IGVycihzdGRlcnIpKVxuICAgIHJldHVybiBwcm9jXG59XG5cbi8qKiBAdGhyb3dzIHtHTGliLkVycm9yfSBUaHJvd3Mgc3RkZXJyICovXG5leHBvcnQgZnVuY3Rpb24gZXhlYyhjbWQ6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoY21kKVxuICAgICAgICA/IEFzdGFsLlByb2Nlc3MuZXhlY3YoY21kKVxuICAgICAgICA6IEFzdGFsLlByb2Nlc3MuZXhlYyhjbWQpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleGVjQXN5bmMoY21kOiBzdHJpbmcgfCBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY21kKSkge1xuICAgICAgICAgICAgQXN0YWwuUHJvY2Vzcy5leGVjX2FzeW5jdihjbWQsIChfLCByZXMpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKEFzdGFsLlByb2Nlc3MuZXhlY19hc3luY3ZfZmluaXNoKHJlcykpXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBBc3RhbC5Qcm9jZXNzLmV4ZWNfYXN5bmMoY21kLCAoXywgcmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShBc3RhbC5Qcm9jZXNzLmV4ZWNfZmluaXNoKHJlcykpXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9KVxufVxuIiwgImltcG9ydCBWYXJpYWJsZSBmcm9tIFwiLi92YXJpYWJsZS5qc1wiXG5pbXBvcnQgeyBleGVjQXN5bmMgfSBmcm9tIFwiLi9wcm9jZXNzLmpzXCJcbmltcG9ydCBCaW5kaW5nLCB7IENvbm5lY3RhYmxlLCBrZWJhYmlmeSwgc25ha2VpZnksIFN1YnNjcmliYWJsZSB9IGZyb20gXCIuL2JpbmRpbmcuanNcIlxuXG5leHBvcnQgY29uc3Qgbm9JbXBsaWNpdERlc3Ryb3kgPSBTeW1ib2woXCJubyBubyBpbXBsaWNpdCBkZXN0cm95XCIpXG5leHBvcnQgY29uc3Qgc2V0Q2hpbGRyZW4gPSBTeW1ib2woXCJjaGlsZHJlbiBzZXR0ZXIgbWV0aG9kXCIpXG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUJpbmRpbmdzKGFycmF5OiBhbnlbXSkge1xuICAgIGZ1bmN0aW9uIGdldFZhbHVlcyguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICBsZXQgaSA9IDBcbiAgICAgICAgcmV0dXJuIGFycmF5Lm1hcCh2YWx1ZSA9PiB2YWx1ZSBpbnN0YW5jZW9mIEJpbmRpbmdcbiAgICAgICAgICAgID8gYXJnc1tpKytdXG4gICAgICAgICAgICA6IHZhbHVlLFxuICAgICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgYmluZGluZ3MgPSBhcnJheS5maWx0ZXIoaSA9PiBpIGluc3RhbmNlb2YgQmluZGluZylcblxuICAgIGlmIChiaW5kaW5ncy5sZW5ndGggPT09IDApXG4gICAgICAgIHJldHVybiBhcnJheVxuXG4gICAgaWYgKGJpbmRpbmdzLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgcmV0dXJuIGJpbmRpbmdzWzBdLmFzKGdldFZhbHVlcylcblxuICAgIHJldHVybiBWYXJpYWJsZS5kZXJpdmUoYmluZGluZ3MsIGdldFZhbHVlcykoKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0UHJvcChvYmo6IGFueSwgcHJvcDogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2V0dGVyID0gYHNldF8ke3NuYWtlaWZ5KHByb3ApfWBcbiAgICAgICAgaWYgKHR5cGVvZiBvYmpbc2V0dGVyXSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgcmV0dXJuIG9ialtzZXR0ZXJdKHZhbHVlKVxuXG4gICAgICAgIHJldHVybiAob2JqW3Byb3BdID0gdmFsdWUpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgY291bGQgbm90IHNldCBwcm9wZXJ0eSBcIiR7cHJvcH1cIiBvbiAke29ian06YCwgZXJyb3IpXG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBCaW5kYWJsZVByb3BzPFQ+ID0ge1xuICAgIFtLIGluIGtleW9mIFRdOiBCaW5kaW5nPFRbS10+IHwgVFtLXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhvb2s8V2lkZ2V0IGV4dGVuZHMgQ29ubmVjdGFibGU+KFxuICAgIHdpZGdldDogV2lkZ2V0LFxuICAgIG9iamVjdDogQ29ubmVjdGFibGUgfCBTdWJzY3JpYmFibGUsXG4gICAgc2lnbmFsT3JDYWxsYmFjazogc3RyaW5nIHwgKChzZWxmOiBXaWRnZXQsIC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSxcbiAgICBjYWxsYmFjaz86IChzZWxmOiBXaWRnZXQsIC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkLFxuKSB7XG4gICAgaWYgKHR5cGVvZiBvYmplY3QuY29ubmVjdCA9PT0gXCJmdW5jdGlvblwiICYmIGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGlkID0gb2JqZWN0LmNvbm5lY3Qoc2lnbmFsT3JDYWxsYmFjaywgKF86IGFueSwgLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sod2lkZ2V0LCAuLi5hcmdzKVxuICAgICAgICB9KVxuICAgICAgICB3aWRnZXQuY29ubmVjdChcImRlc3Ryb3lcIiwgKCkgPT4ge1xuICAgICAgICAgICAgKG9iamVjdC5kaXNjb25uZWN0IGFzIENvbm5lY3RhYmxlW1wiZGlzY29ubmVjdFwiXSkoaWQpXG4gICAgICAgIH0pXG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqZWN0LnN1YnNjcmliZSA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBzaWduYWxPckNhbGxiYWNrID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY29uc3QgdW5zdWIgPSBvYmplY3Quc3Vic2NyaWJlKCguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICAgICAgICAgIHNpZ25hbE9yQ2FsbGJhY2sod2lkZ2V0LCAuLi5hcmdzKVxuICAgICAgICB9KVxuICAgICAgICB3aWRnZXQuY29ubmVjdChcImRlc3Ryb3lcIiwgdW5zdWIpXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uc3RydWN0PFdpZGdldCBleHRlbmRzIENvbm5lY3RhYmxlICYgeyBbc2V0Q2hpbGRyZW5dOiAoY2hpbGRyZW46IGFueVtdKSA9PiB2b2lkIH0+KHdpZGdldDogV2lkZ2V0LCBjb25maWc6IGFueSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyBzZXR1cCwgY2hpbGQsIGNoaWxkcmVuID0gW10sIC4uLnByb3BzIH0gPSBjb25maWdcblxuICAgIGlmIChjaGlsZHJlbiBpbnN0YW5jZW9mIEJpbmRpbmcpIHtcbiAgICAgICAgY2hpbGRyZW4gPSBbY2hpbGRyZW5dXG4gICAgfVxuXG4gICAgaWYgKGNoaWxkKSB7XG4gICAgICAgIGNoaWxkcmVuLnVuc2hpZnQoY2hpbGQpXG4gICAgfVxuXG4gICAgLy8gcmVtb3ZlIHVuZGVmaW5lZCB2YWx1ZXNcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9wcykpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBwcm9wc1trZXldXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb2xsZWN0IGJpbmRpbmdzXG4gICAgY29uc3QgYmluZGluZ3M6IEFycmF5PFtzdHJpbmcsIEJpbmRpbmc8YW55Pl0+ID0gT2JqZWN0XG4gICAgICAgIC5rZXlzKHByb3BzKVxuICAgICAgICAucmVkdWNlKChhY2M6IGFueSwgcHJvcCkgPT4ge1xuICAgICAgICAgICAgaWYgKHByb3BzW3Byb3BdIGluc3RhbmNlb2YgQmluZGluZykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJpbmRpbmcgPSBwcm9wc1twcm9wXVxuICAgICAgICAgICAgICAgIGRlbGV0ZSBwcm9wc1twcm9wXVxuICAgICAgICAgICAgICAgIHJldHVybiBbLi4uYWNjLCBbcHJvcCwgYmluZGluZ11dXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWNjXG4gICAgICAgIH0sIFtdKVxuXG4gICAgLy8gY29sbGVjdCBzaWduYWwgaGFuZGxlcnNcbiAgICBjb25zdCBvbkhhbmRsZXJzOiBBcnJheTxbc3RyaW5nLCBzdHJpbmcgfCAoKCkgPT4gdW5rbm93bildPiA9IE9iamVjdFxuICAgICAgICAua2V5cyhwcm9wcylcbiAgICAgICAgLnJlZHVjZSgoYWNjOiBhbnksIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKFwib25cIikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzaWcgPSBrZWJhYmlmeShrZXkpLnNwbGl0KFwiLVwiKS5zbGljZSgxKS5qb2luKFwiLVwiKVxuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBwcm9wc1trZXldXG4gICAgICAgICAgICAgICAgZGVsZXRlIHByb3BzW2tleV1cbiAgICAgICAgICAgICAgICByZXR1cm4gWy4uLmFjYywgW3NpZywgaGFuZGxlcl1dXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWNjXG4gICAgICAgIH0sIFtdKVxuXG4gICAgLy8gc2V0IGNoaWxkcmVuXG4gICAgY29uc3QgbWVyZ2VkQ2hpbGRyZW4gPSBtZXJnZUJpbmRpbmdzKGNoaWxkcmVuLmZsYXQoSW5maW5pdHkpKVxuICAgIGlmIChtZXJnZWRDaGlsZHJlbiBpbnN0YW5jZW9mIEJpbmRpbmcpIHtcbiAgICAgICAgd2lkZ2V0W3NldENoaWxkcmVuXShtZXJnZWRDaGlsZHJlbi5nZXQoKSlcbiAgICAgICAgd2lkZ2V0LmNvbm5lY3QoXCJkZXN0cm95XCIsIG1lcmdlZENoaWxkcmVuLnN1YnNjcmliZSgodikgPT4ge1xuICAgICAgICAgICAgd2lkZ2V0W3NldENoaWxkcmVuXSh2KVxuICAgICAgICB9KSlcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobWVyZ2VkQ2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgd2lkZ2V0W3NldENoaWxkcmVuXShtZXJnZWRDaGlsZHJlbilcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNldHVwIHNpZ25hbCBoYW5kbGVyc1xuICAgIGZvciAoY29uc3QgW3NpZ25hbCwgY2FsbGJhY2tdIG9mIG9uSGFuZGxlcnMpIHtcbiAgICAgICAgY29uc3Qgc2lnID0gc2lnbmFsLnN0YXJ0c1dpdGgoXCJub3RpZnlcIilcbiAgICAgICAgICAgID8gc2lnbmFsLnJlcGxhY2UoXCItXCIsIFwiOjpcIilcbiAgICAgICAgICAgIDogc2lnbmFsXG5cbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB3aWRnZXQuY29ubmVjdChzaWcsIGNhbGxiYWNrKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2lkZ2V0LmNvbm5lY3Qoc2lnLCAoKSA9PiBleGVjQXN5bmMoY2FsbGJhY2spXG4gICAgICAgICAgICAgICAgLnRoZW4ocHJpbnQpLmNhdGNoKGNvbnNvbGUuZXJyb3IpKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2V0dXAgYmluZGluZ3MgaGFuZGxlcnNcbiAgICBmb3IgKGNvbnN0IFtwcm9wLCBiaW5kaW5nXSBvZiBiaW5kaW5ncykge1xuICAgICAgICBpZiAocHJvcCA9PT0gXCJjaGlsZFwiIHx8IHByb3AgPT09IFwiY2hpbGRyZW5cIikge1xuICAgICAgICAgICAgd2lkZ2V0LmNvbm5lY3QoXCJkZXN0cm95XCIsIGJpbmRpbmcuc3Vic2NyaWJlKCh2OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICB3aWRnZXRbc2V0Q2hpbGRyZW5dKHYpXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgfVxuICAgICAgICB3aWRnZXQuY29ubmVjdChcImRlc3Ryb3lcIiwgYmluZGluZy5zdWJzY3JpYmUoKHY6IGFueSkgPT4ge1xuICAgICAgICAgICAgc2V0UHJvcCh3aWRnZXQsIHByb3AsIHYpXG4gICAgICAgIH0pKVxuICAgICAgICBzZXRQcm9wKHdpZGdldCwgcHJvcCwgYmluZGluZy5nZXQoKSlcbiAgICB9XG5cbiAgICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BzKSkge1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGVsZXRlIHByb3BzW2tleV1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIE9iamVjdC5hc3NpZ24od2lkZ2V0LCBwcm9wcylcbiAgICBzZXR1cD8uKHdpZGdldClcbiAgICByZXR1cm4gd2lkZ2V0XG59XG5cbmZ1bmN0aW9uIGlzQXJyb3dGdW5jdGlvbihmdW5jOiBhbnkpOiBmdW5jIGlzIChhcmdzOiBhbnkpID0+IGFueSB7XG4gICAgcmV0dXJuICFPYmplY3QuaGFzT3duKGZ1bmMsIFwicHJvdG90eXBlXCIpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBqc3goXG4gICAgY3RvcnM6IFJlY29yZDxzdHJpbmcsIHsgbmV3KHByb3BzOiBhbnkpOiBhbnkgfSB8ICgocHJvcHM6IGFueSkgPT4gYW55KT4sXG4gICAgY3Rvcjogc3RyaW5nIHwgKChwcm9wczogYW55KSA9PiBhbnkpIHwgeyBuZXcocHJvcHM6IGFueSk6IGFueSB9LFxuICAgIHsgY2hpbGRyZW4sIC4uLnByb3BzIH06IGFueSxcbikge1xuICAgIGNoaWxkcmVuID8/PSBbXVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGNoaWxkcmVuKSlcbiAgICAgICAgY2hpbGRyZW4gPSBbY2hpbGRyZW5dXG5cbiAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLmZpbHRlcihCb29sZWFuKVxuXG4gICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgcHJvcHMuY2hpbGQgPSBjaGlsZHJlblswXVxuICAgIGVsc2UgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDEpXG4gICAgICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW5cblxuICAgIGlmICh0eXBlb2YgY3RvciA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBpZiAoaXNBcnJvd0Z1bmN0aW9uKGN0b3JzW2N0b3JdKSlcbiAgICAgICAgICAgIHJldHVybiBjdG9yc1tjdG9yXShwcm9wcylcblxuICAgICAgICByZXR1cm4gbmV3IGN0b3JzW2N0b3JdKHByb3BzKVxuICAgIH1cblxuICAgIGlmIChpc0Fycm93RnVuY3Rpb24oY3RvcikpXG4gICAgICAgIHJldHVybiBjdG9yKHByb3BzKVxuXG4gICAgcmV0dXJuIG5ldyBjdG9yKHByb3BzKVxufVxuIiwgImltcG9ydCB7IG5vSW1wbGljaXREZXN0cm95LCBzZXRDaGlsZHJlbiwgdHlwZSBCaW5kYWJsZVByb3BzLCBjb25zdHJ1Y3QgfSBmcm9tIFwiLi4vX2FzdGFsLmpzXCJcbmltcG9ydCBHdGsgZnJvbSBcImdpOi8vR3RrP3ZlcnNpb249NC4wXCJcbmltcG9ydCBHZGsgZnJvbSBcImdpOi8vR2RrP3ZlcnNpb249NC4wXCJcbmltcG9ydCBCaW5kaW5nIGZyb20gXCIuLi9iaW5kaW5nLmpzXCJcblxuZXhwb3J0IGNvbnN0IHR5cGUgPSBTeW1ib2woXCJjaGlsZCB0eXBlXCIpXG5jb25zdCBkdW1teUJ1bGRlciA9IG5ldyBHdGsuQnVpbGRlclxuXG5mdW5jdGlvbiBfZ2V0Q2hpbGRyZW4od2lkZ2V0OiBHdGsuV2lkZ2V0KTogQXJyYXk8R3RrLldpZGdldD4ge1xuICAgIGlmIChcImdldF9jaGlsZFwiIGluIHdpZGdldCAmJiB0eXBlb2Ygd2lkZ2V0LmdldF9jaGlsZCA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIHdpZGdldC5nZXRfY2hpbGQoKSA/IFt3aWRnZXQuZ2V0X2NoaWxkKCldIDogW11cbiAgICB9XG5cbiAgICBjb25zdCBjaGlsZHJlbjogQXJyYXk8R3RrLldpZGdldD4gPSBbXVxuICAgIGxldCBjaCA9IHdpZGdldC5nZXRfZmlyc3RfY2hpbGQoKVxuICAgIHdoaWxlIChjaCAhPT0gbnVsbCkge1xuICAgICAgICBjaGlsZHJlbi5wdXNoKGNoKVxuICAgICAgICBjaCA9IGNoLmdldF9uZXh0X3NpYmxpbmcoKVxuICAgIH1cbiAgICByZXR1cm4gY2hpbGRyZW5cbn1cblxuZnVuY3Rpb24gX3NldENoaWxkcmVuKHdpZGdldDogR3RrLldpZGdldCwgY2hpbGRyZW46IGFueVtdKSB7XG4gICAgY2hpbGRyZW4gPSBjaGlsZHJlbi5mbGF0KEluZmluaXR5KS5tYXAoY2ggPT4gY2ggaW5zdGFuY2VvZiBHdGsuV2lkZ2V0XG4gICAgICAgID8gY2hcbiAgICAgICAgOiBuZXcgR3RrLkxhYmVsKHsgdmlzaWJsZTogdHJ1ZSwgbGFiZWw6IFN0cmluZyhjaCkgfSkpXG5cblxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgICAgd2lkZ2V0LnZmdW5jX2FkZF9jaGlsZChcbiAgICAgICAgICAgIGR1bW15QnVsZGVyLFxuICAgICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgICB0eXBlIGluIGNoaWxkID8gY2hpbGRbdHlwZV0gOiBudWxsLFxuICAgICAgICApXG4gICAgfVxufVxuXG50eXBlIENvbmZpZzxUIGV4dGVuZHMgR3RrLldpZGdldD4gPSB7XG4gICAgc2V0Q2hpbGRyZW4od2lkZ2V0OiBULCBjaGlsZHJlbjogYW55W10pOiB2b2lkXG4gICAgZ2V0Q2hpbGRyZW4od2lkZ2V0OiBUKTogQXJyYXk8R3RrLldpZGdldD5cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXN0YWxpZnk8XG4gICAgV2lkZ2V0IGV4dGVuZHMgR3RrLldpZGdldCxcbiAgICBQcm9wcyBleHRlbmRzIEd0ay5XaWRnZXQuQ29uc3RydWN0b3JQcm9wcyA9IEd0ay5XaWRnZXQuQ29uc3RydWN0b3JQcm9wcyxcbiAgICBTaWduYWxzIGV4dGVuZHMgUmVjb3JkPGBvbiR7c3RyaW5nfWAsIEFycmF5PHVua25vd24+PiA9IFJlY29yZDxgb24ke3N0cmluZ31gLCBhbnlbXT4sXG4+KGNsczogeyBuZXcoLi4uYXJnczogYW55W10pOiBXaWRnZXQgfSwgY29uZmlnOiBQYXJ0aWFsPENvbmZpZzxXaWRnZXQ+PiA9IHt9KSB7XG4gICAgT2JqZWN0LmFzc2lnbihjbHMucHJvdG90eXBlLCB7XG4gICAgICAgIFtzZXRDaGlsZHJlbl0oY2hpbGRyZW46IGFueVtdKSB7XG4gICAgICAgICAgICBjb25zdCB3ID0gdGhpcyBhcyB1bmtub3duIGFzIFdpZGdldFxuICAgICAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiAoY29uZmlnLmdldENoaWxkcmVuPy4odykgfHwgX2dldENoaWxkcmVuKHcpKSkge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIEd0ay5XaWRnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQudW5wYXJlbnQoKVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuLmluY2x1ZGVzKGNoaWxkKSAmJiBub0ltcGxpY2l0RGVzdHJveSBpbiB0aGlzKVxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQucnVuX2Rpc3Bvc2UoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbmZpZy5zZXRDaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5zZXRDaGlsZHJlbih3LCBjaGlsZHJlbilcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgX3NldENoaWxkcmVuKHcsIGNoaWxkcmVuKVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0pXG5cbiAgICByZXR1cm4ge1xuICAgICAgICBbY2xzLm5hbWVdOiAoXG4gICAgICAgICAgICBwcm9wczogQ29uc3RydWN0UHJvcHM8V2lkZ2V0LCBQcm9wcywgU2lnbmFscz4gPSB7fSxcbiAgICAgICAgICAgIC4uLmNoaWxkcmVuOiBhbnlbXVxuICAgICAgICApOiBXaWRnZXQgPT4ge1xuICAgICAgICAgICAgY29uc3Qgd2lkZ2V0ID0gbmV3IGNscyhcImNzc05hbWVcIiBpbiBwcm9wcyA/IHsgY3NzTmFtZTogcHJvcHMuY3NzTmFtZSB9IDoge30pXG5cbiAgICAgICAgICAgIGlmIChcImNzc05hbWVcIiBpbiBwcm9wcykge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBwcm9wcy5jc3NOYW1lXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9wcy5ub0ltcGxpY2l0RGVzdHJveSkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24od2lkZ2V0LCB7IFtub0ltcGxpY2l0RGVzdHJveV06IHRydWUgfSlcbiAgICAgICAgICAgICAgICBkZWxldGUgcHJvcHMubm9JbXBsaWNpdERlc3Ryb3lcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3BzLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHdpZGdldCwgeyBbdHlwZV06IHByb3BzLnR5cGUgfSlcbiAgICAgICAgICAgICAgICBkZWxldGUgcHJvcHMudHlwZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ocHJvcHMsIHsgY2hpbGRyZW4gfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdCh3aWRnZXQgYXMgYW55LCBzZXR1cENvbnRyb2xsZXJzKHdpZGdldCwgcHJvcHMgYXMgYW55KSlcbiAgICAgICAgfSxcbiAgICB9W2Nscy5uYW1lXVxufVxuXG50eXBlIFNpZ0hhbmRsZXI8XG4gICAgVyBleHRlbmRzIEluc3RhbmNlVHlwZTx0eXBlb2YgR3RrLldpZGdldD4sXG4gICAgQXJncyBleHRlbmRzIEFycmF5PHVua25vd24+LFxuPiA9ICgoc2VsZjogVywgLi4uYXJnczogQXJncykgPT4gdW5rbm93bikgfCBzdHJpbmcgfCBzdHJpbmdbXVxuXG5leHBvcnQgeyBCaW5kYWJsZVByb3BzIH1cbmV4cG9ydCB0eXBlIEJpbmRhYmxlQ2hpbGQgPSBHdGsuV2lkZ2V0IHwgQmluZGluZzxHdGsuV2lkZ2V0PlxuXG5leHBvcnQgdHlwZSBDb25zdHJ1Y3RQcm9wczxcbiAgICBTZWxmIGV4dGVuZHMgSW5zdGFuY2VUeXBlPHR5cGVvZiBHdGsuV2lkZ2V0PixcbiAgICBQcm9wcyBleHRlbmRzIEd0ay5XaWRnZXQuQ29uc3RydWN0b3JQcm9wcyxcbiAgICBTaWduYWxzIGV4dGVuZHMgUmVjb3JkPGBvbiR7c3RyaW5nfWAsIEFycmF5PHVua25vd24+PiA9IFJlY29yZDxgb24ke3N0cmluZ31gLCBhbnlbXT4sXG4+ID0gUGFydGlhbDx7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBjYW4ndCBhc3NpZ24gdG8gdW5rbm93biwgYnV0IGl0IHdvcmtzIGFzIGV4cGVjdGVkIHRob3VnaFxuICAgIFtTIGluIGtleW9mIFNpZ25hbHNdOiBTaWdIYW5kbGVyPFNlbGYsIFNpZ25hbHNbU10+XG59PiAmIFBhcnRpYWw8e1xuICAgIFtLZXkgaW4gYG9uJHtzdHJpbmd9YF06IFNpZ0hhbmRsZXI8U2VsZiwgYW55W10+XG59PiAmIFBhcnRpYWw8QmluZGFibGVQcm9wczxPbWl0PFByb3BzLCBcImNzc05hbWVcIiB8IFwiY3NzX25hbWVcIj4+PiAmIHtcbiAgICBub0ltcGxpY2l0RGVzdHJveT86IHRydWVcbiAgICB0eXBlPzogc3RyaW5nXG4gICAgY3NzTmFtZT86IHN0cmluZ1xufSAmIEV2ZW50Q29udHJvbGxlcjxTZWxmPiAmIHtcbiAgICBvbkRlc3Ryb3k/OiAoc2VsZjogU2VsZikgPT4gdW5rbm93blxuICAgIHNldHVwPzogKHNlbGY6IFNlbGYpID0+IHZvaWRcbn1cblxudHlwZSBFdmVudENvbnRyb2xsZXI8U2VsZiBleHRlbmRzIEd0ay5XaWRnZXQ+ID0ge1xuICAgIG9uRm9jdXNFbnRlcj86IChzZWxmOiBTZWxmKSA9PiB2b2lkXG4gICAgb25Gb2N1c0xlYXZlPzogKHNlbGY6IFNlbGYpID0+IHZvaWRcblxuICAgIG9uS2V5UHJlc3NlZD86IChzZWxmOiBTZWxmLCBrZXl2YWw6IG51bWJlciwga2V5Y29kZTogbnVtYmVyLCBzdGF0ZTogR2RrLk1vZGlmaWVyVHlwZSkgPT4gdm9pZFxuICAgIG9uS2V5UmVsZWFzZWQ/OiAoc2VsZjogU2VsZiwga2V5dmFsOiBudW1iZXIsIGtleWNvZGU6IG51bWJlciwgc3RhdGU6IEdkay5Nb2RpZmllclR5cGUpID0+IHZvaWRcbiAgICBvbktleU1vZGlmaWVyPzogKHNlbGY6IFNlbGYsIHN0YXRlOiBHZGsuTW9kaWZpZXJUeXBlKSA9PiB2b2lkXG5cbiAgICBvbkxlZ2FjeT86IChzZWxmOiBTZWxmLCBldmVudDogR2RrLkV2ZW50KSA9PiB2b2lkXG4gICAgb25CdXR0b25QcmVzc2VkPzogKHNlbGY6IFNlbGYsIHN0YXRlOiBHZGsuQnV0dG9uRXZlbnQpID0+IHZvaWRcbiAgICBvbkJ1dHRvblJlbGVhc2VkPzogKHNlbGY6IFNlbGYsIHN0YXRlOiBHZGsuQnV0dG9uRXZlbnQpID0+IHZvaWRcblxuICAgIG9uSG92ZXJFbnRlcj86IChzZWxmOiBTZWxmLCB4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gdm9pZFxuICAgIG9uSG92ZXJMZWF2ZT86IChzZWxmOiBTZWxmKSA9PiB2b2lkXG4gICAgb25Nb3Rpb24/OiAoc2VsZjogU2VsZiwgeDogbnVtYmVyLCB5OiBudW1iZXIpID0+IHZvaWRcblxuICAgIG9uU2Nyb2xsPzogKHNlbGY6IFNlbGYsIGR4OiBudW1iZXIsIGR5OiBudW1iZXIpID0+IHZvaWRcbiAgICBvblNjcm9sbERlY2VsZXJhdGU/OiAoc2VsZjogU2VsZiwgdmVsX3g6IG51bWJlciwgdmVsX3k6IG51bWJlcikgPT4gdm9pZFxufVxuXG5mdW5jdGlvbiBzZXR1cENvbnRyb2xsZXJzPFQ+KHdpZGdldDogR3RrLldpZGdldCwge1xuICAgIG9uRm9jdXNFbnRlcixcbiAgICBvbkZvY3VzTGVhdmUsXG4gICAgb25LZXlQcmVzc2VkLFxuICAgIG9uS2V5UmVsZWFzZWQsXG4gICAgb25LZXlNb2RpZmllcixcbiAgICBvbkxlZ2FjeSxcbiAgICBvbkJ1dHRvblByZXNzZWQsXG4gICAgb25CdXR0b25SZWxlYXNlZCxcbiAgICBvbkhvdmVyRW50ZXIsXG4gICAgb25Ib3ZlckxlYXZlLFxuICAgIG9uTW90aW9uLFxuICAgIG9uU2Nyb2xsLFxuICAgIG9uU2Nyb2xsRGVjZWxlcmF0ZSxcbiAgICAuLi5wcm9wc1xufTogRXZlbnRDb250cm9sbGVyPEd0ay5XaWRnZXQ+ICYgVCkge1xuICAgIGlmIChvbkZvY3VzRW50ZXIgfHwgb25Gb2N1c0xlYXZlKSB7XG4gICAgICAgIGNvbnN0IGZvY3VzID0gbmV3IEd0ay5FdmVudENvbnRyb2xsZXJGb2N1c1xuICAgICAgICB3aWRnZXQuYWRkX2NvbnRyb2xsZXIoZm9jdXMpXG5cbiAgICAgICAgaWYgKG9uRm9jdXNFbnRlcilcbiAgICAgICAgICAgIGZvY3VzLmNvbm5lY3QoXCJlbnRlclwiLCAoKSA9PiBvbkZvY3VzRW50ZXIod2lkZ2V0KSlcblxuICAgICAgICBpZiAob25Gb2N1c0xlYXZlKVxuICAgICAgICAgICAgZm9jdXMuY29ubmVjdChcImxlYXZlXCIsICgpID0+IG9uRm9jdXNMZWF2ZSh3aWRnZXQpKVxuICAgIH1cblxuICAgIGlmIChvbktleVByZXNzZWQgfHwgb25LZXlSZWxlYXNlZCB8fCBvbktleU1vZGlmaWVyKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IG5ldyBHdGsuRXZlbnRDb250cm9sbGVyS2V5XG4gICAgICAgIHdpZGdldC5hZGRfY29udHJvbGxlcihrZXkpXG5cbiAgICAgICAgaWYgKG9uS2V5UHJlc3NlZClcbiAgICAgICAgICAgIGtleS5jb25uZWN0KFwia2V5LXByZXNzZWRcIiwgKF8sIHZhbCwgY29kZSwgc3RhdGUpID0+IG9uS2V5UHJlc3NlZCh3aWRnZXQsIHZhbCwgY29kZSwgc3RhdGUpKVxuXG4gICAgICAgIGlmIChvbktleVJlbGVhc2VkKVxuICAgICAgICAgICAga2V5LmNvbm5lY3QoXCJrZXktcmVsZWFzZWRcIiwgKF8sIHZhbCwgY29kZSwgc3RhdGUpID0+IG9uS2V5UmVsZWFzZWQod2lkZ2V0LCB2YWwsIGNvZGUsIHN0YXRlKSlcblxuICAgICAgICBpZiAob25LZXlNb2RpZmllcilcbiAgICAgICAgICAgIGtleS5jb25uZWN0KFwibW9kaWZpZXJzXCIsIChfLCBzdGF0ZSkgPT4gb25LZXlNb2RpZmllcih3aWRnZXQsIHN0YXRlKSlcbiAgICB9XG5cbiAgICBpZiAob25MZWdhY3kgfHwgb25CdXR0b25QcmVzc2VkIHx8IG9uQnV0dG9uUmVsZWFzZWQpIHtcbiAgICAgICAgY29uc3QgbGVnYWN5ID0gbmV3IEd0ay5FdmVudENvbnRyb2xsZXJMZWdhY3lcbiAgICAgICAgd2lkZ2V0LmFkZF9jb250cm9sbGVyKGxlZ2FjeSlcblxuICAgICAgICBsZWdhY3kuY29ubmVjdChcImV2ZW50XCIsIChfLCBldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmdldF9ldmVudF90eXBlKCkgPT09IEdkay5FdmVudFR5cGUuQlVUVE9OX1BSRVNTKSB7XG4gICAgICAgICAgICAgICAgb25CdXR0b25QcmVzc2VkPy4od2lkZ2V0LCBldmVudCBhcyBHZGsuQnV0dG9uRXZlbnQpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChldmVudC5nZXRfZXZlbnRfdHlwZSgpID09PSBHZGsuRXZlbnRUeXBlLkJVVFRPTl9SRUxFQVNFKSB7XG4gICAgICAgICAgICAgICAgb25CdXR0b25SZWxlYXNlZD8uKHdpZGdldCwgZXZlbnQgYXMgR2RrLkJ1dHRvbkV2ZW50KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvbkxlZ2FjeT8uKHdpZGdldCwgZXZlbnQpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKG9uTW90aW9uIHx8IG9uSG92ZXJFbnRlciB8fCBvbkhvdmVyTGVhdmUpIHtcbiAgICAgICAgY29uc3QgaG92ZXIgPSBuZXcgR3RrLkV2ZW50Q29udHJvbGxlck1vdGlvblxuICAgICAgICB3aWRnZXQuYWRkX2NvbnRyb2xsZXIoaG92ZXIpXG5cbiAgICAgICAgaWYgKG9uSG92ZXJFbnRlcilcbiAgICAgICAgICAgIGhvdmVyLmNvbm5lY3QoXCJlbnRlclwiLCAoXywgeCwgeSkgPT4gb25Ib3ZlckVudGVyKHdpZGdldCwgeCwgeSkpXG5cbiAgICAgICAgaWYgKG9uSG92ZXJMZWF2ZSlcbiAgICAgICAgICAgIGhvdmVyLmNvbm5lY3QoXCJsZWF2ZVwiLCAoKSA9PiBvbkhvdmVyTGVhdmUod2lkZ2V0KSlcblxuICAgICAgICBpZiAob25Nb3Rpb24pXG4gICAgICAgICAgICBob3Zlci5jb25uZWN0KFwibW90aW9uXCIsIChfLCB4LCB5KSA9PiBvbk1vdGlvbih3aWRnZXQsIHgsIHkpKVxuICAgIH1cblxuICAgIGlmIChvblNjcm9sbCB8fCBvblNjcm9sbERlY2VsZXJhdGUpIHtcbiAgICAgICAgY29uc3Qgc2Nyb2xsID0gbmV3IEd0ay5FdmVudENvbnRyb2xsZXJTY3JvbGxcbiAgICAgICAgc2Nyb2xsLmZsYWdzID0gR3RrLkV2ZW50Q29udHJvbGxlclNjcm9sbEZsYWdzLkJPVEhfQVhFUyB8IEd0ay5FdmVudENvbnRyb2xsZXJTY3JvbGxGbGFncy5LSU5FVElDXG4gICAgICAgIHdpZGdldC5hZGRfY29udHJvbGxlcihzY3JvbGwpXG5cbiAgICAgICAgaWYgKG9uU2Nyb2xsKVxuICAgICAgICAgICAgc2Nyb2xsLmNvbm5lY3QoXCJzY3JvbGxcIiwgKF8sIHgsIHkpID0+IG9uU2Nyb2xsKHdpZGdldCwgeCwgeSkpXG5cbiAgICAgICAgaWYgKG9uU2Nyb2xsRGVjZWxlcmF0ZSlcbiAgICAgICAgICAgIHNjcm9sbC5jb25uZWN0KFwiZGVjZWxlcmF0ZVwiLCAoXywgeCwgeSkgPT4gb25TY3JvbGxEZWNlbGVyYXRlKHdpZGdldCwgeCwgeSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3BzXG59XG4iLCAiaW1wb3J0IEdMaWIgZnJvbSBcImdpOi8vR0xpYj92ZXJzaW9uPTIuMFwiXG5pbXBvcnQgR3RrIGZyb20gXCJnaTovL0d0az92ZXJzaW9uPTQuMFwiXG5pbXBvcnQgQXN0YWwgZnJvbSBcImdpOi8vQXN0YWw/dmVyc2lvbj00LjBcIlxuaW1wb3J0IHsgbWtBcHAgfSBmcm9tIFwiLi4vX2FwcFwiXG5cbkd0ay5pbml0KClcblxuLy8gc3RvcCB0aGlzIGZyb20gbGVha2luZyBpbnRvIHN1YnByb2Nlc3Nlc1xuLy8gYW5kIGdpbyBsYXVuY2ggaW52b2NhdGlvbnNcbkdMaWIudW5zZXRlbnYoXCJMRF9QUkVMT0FEXCIpXG5cbi8vIHVzZXJzIG1pZ2h0IHdhbnQgdG8gdXNlIEFkd2FpdGEgaW4gd2hpY2ggY2FzZSBpdCBoYXMgdG8gYmUgaW5pdGlhbGl6ZWRcbi8vIGl0IG1pZ2h0IGJlIGNvbW1vbiBwaXRmYWxsIHRvIGZvcmdldCBpdCBiZWNhdXNlIGBBcHBgIGlzIG5vdCBgQWR3LkFwcGxpY2F0aW9uYFxuYXdhaXQgaW1wb3J0KFwiZ2k6Ly9BZHc/dmVyc2lvbj0xXCIpXG4gICAgLnRoZW4oKHsgZGVmYXVsdDogQWR3IH0pID0+IEFkdy5pbml0KCkpXG4gICAgLmNhdGNoKCgpID0+IHZvaWQgMClcblxuZXhwb3J0IGRlZmF1bHQgbWtBcHAoQXN0YWwuQXBwbGljYXRpb24pXG4iLCAiLyoqXG4gKiBXb3JrYXJvdW5kIGZvciBcIkNhbid0IGNvbnZlcnQgbm9uLW51bGwgcG9pbnRlciB0byBKUyB2YWx1ZSBcIlxuICovXG5cbmV4cG9ydCB7IH1cblxuY29uc3Qgc25ha2VpZnkgPSAoc3RyOiBzdHJpbmcpID0+IHN0clxuICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCBcIiQxXyQyXCIpXG4gICAgLnJlcGxhY2VBbGwoXCItXCIsIFwiX1wiKVxuICAgIC50b0xvd2VyQ2FzZSgpXG5cbmFzeW5jIGZ1bmN0aW9uIHN1cHByZXNzPFQ+KG1vZDogUHJvbWlzZTx7IGRlZmF1bHQ6IFQgfT4sIHBhdGNoOiAobTogVCkgPT4gdm9pZCkge1xuICAgIHJldHVybiBtb2QudGhlbihtID0+IHBhdGNoKG0uZGVmYXVsdCkpLmNhdGNoKCgpID0+IHZvaWQgMClcbn1cblxuZnVuY3Rpb24gcGF0Y2g8UCBleHRlbmRzIG9iamVjdD4ocHJvdG86IFAsIHByb3A6IEV4dHJhY3Q8a2V5b2YgUCwgc3RyaW5nPikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90bywgcHJvcCwge1xuICAgICAgICBnZXQoKSB7IHJldHVybiB0aGlzW2BnZXRfJHtzbmFrZWlmeShwcm9wKX1gXSgpIH0sXG4gICAgfSlcbn1cblxuYXdhaXQgc3VwcHJlc3MoaW1wb3J0KFwiZ2k6Ly9Bc3RhbEFwcHNcIiksICh7IEFwcHMsIEFwcGxpY2F0aW9uIH0pID0+IHtcbiAgICBwYXRjaChBcHBzLnByb3RvdHlwZSwgXCJsaXN0XCIpXG4gICAgcGF0Y2goQXBwbGljYXRpb24ucHJvdG90eXBlLCBcImtleXdvcmRzXCIpXG4gICAgcGF0Y2goQXBwbGljYXRpb24ucHJvdG90eXBlLCBcImNhdGVnb3JpZXNcIilcbn0pXG5cbmF3YWl0IHN1cHByZXNzKGltcG9ydChcImdpOi8vQXN0YWxCYXR0ZXJ5XCIpLCAoeyBVUG93ZXIgfSkgPT4ge1xuICAgIHBhdGNoKFVQb3dlci5wcm90b3R5cGUsIFwiZGV2aWNlc1wiKVxufSlcblxuYXdhaXQgc3VwcHJlc3MoaW1wb3J0KFwiZ2k6Ly9Bc3RhbEJsdWV0b290aFwiKSwgKHsgQWRhcHRlciwgQmx1ZXRvb3RoLCBEZXZpY2UgfSkgPT4ge1xuICAgIHBhdGNoKEFkYXB0ZXIucHJvdG90eXBlLCBcInV1aWRzXCIpXG4gICAgcGF0Y2goQmx1ZXRvb3RoLnByb3RvdHlwZSwgXCJhZGFwdGVyc1wiKVxuICAgIHBhdGNoKEJsdWV0b290aC5wcm90b3R5cGUsIFwiZGV2aWNlc1wiKVxuICAgIHBhdGNoKERldmljZS5wcm90b3R5cGUsIFwidXVpZHNcIilcbn0pXG5cbmF3YWl0IHN1cHByZXNzKGltcG9ydChcImdpOi8vQXN0YWxIeXBybGFuZFwiKSwgKHsgSHlwcmxhbmQsIE1vbml0b3IsIFdvcmtzcGFjZSB9KSA9PiB7XG4gICAgcGF0Y2goSHlwcmxhbmQucHJvdG90eXBlLCBcImJpbmRzXCIpXG4gICAgcGF0Y2goSHlwcmxhbmQucHJvdG90eXBlLCBcIm1vbml0b3JzXCIpXG4gICAgcGF0Y2goSHlwcmxhbmQucHJvdG90eXBlLCBcIndvcmtzcGFjZXNcIilcbiAgICBwYXRjaChIeXBybGFuZC5wcm90b3R5cGUsIFwiY2xpZW50c1wiKVxuICAgIHBhdGNoKE1vbml0b3IucHJvdG90eXBlLCBcImF2YWlsYWJsZU1vZGVzXCIpXG4gICAgcGF0Y2goTW9uaXRvci5wcm90b3R5cGUsIFwiYXZhaWxhYmxlX21vZGVzXCIpXG4gICAgcGF0Y2goV29ya3NwYWNlLnByb3RvdHlwZSwgXCJjbGllbnRzXCIpXG59KVxuXG5hd2FpdCBzdXBwcmVzcyhpbXBvcnQoXCJnaTovL0FzdGFsTXByaXNcIiksICh7IE1wcmlzLCBQbGF5ZXIgfSkgPT4ge1xuICAgIHBhdGNoKE1wcmlzLnByb3RvdHlwZSwgXCJwbGF5ZXJzXCIpXG4gICAgcGF0Y2goUGxheWVyLnByb3RvdHlwZSwgXCJzdXBwb3J0ZWRfdXJpX3NjaGVtZXNcIilcbiAgICBwYXRjaChQbGF5ZXIucHJvdG90eXBlLCBcInN1cHBvcnRlZFVyaVNjaGVtZXNcIilcbiAgICBwYXRjaChQbGF5ZXIucHJvdG90eXBlLCBcInN1cHBvcnRlZF9taW1lX3R5cGVzXCIpXG4gICAgcGF0Y2goUGxheWVyLnByb3RvdHlwZSwgXCJzdXBwb3J0ZWRNaW1lVHlwZXNcIilcbiAgICBwYXRjaChQbGF5ZXIucHJvdG90eXBlLCBcImNvbW1lbnRzXCIpXG59KVxuXG5hd2FpdCBzdXBwcmVzcyhpbXBvcnQoXCJnaTovL0FzdGFsTmV0d29ya1wiKSwgKHsgV2lmaSB9KSA9PiB7XG4gICAgcGF0Y2goV2lmaS5wcm90b3R5cGUsIFwiYWNjZXNzX3BvaW50c1wiKVxuICAgIHBhdGNoKFdpZmkucHJvdG90eXBlLCBcImFjY2Vzc1BvaW50c1wiKVxufSlcblxuYXdhaXQgc3VwcHJlc3MoaW1wb3J0KFwiZ2k6Ly9Bc3RhbE5vdGlmZFwiKSwgKHsgTm90aWZkLCBOb3RpZmljYXRpb24gfSkgPT4ge1xuICAgIHBhdGNoKE5vdGlmZC5wcm90b3R5cGUsIFwibm90aWZpY2F0aW9uc1wiKVxuICAgIHBhdGNoKE5vdGlmaWNhdGlvbi5wcm90b3R5cGUsIFwiYWN0aW9uc1wiKVxufSlcblxuYXdhaXQgc3VwcHJlc3MoaW1wb3J0KFwiZ2k6Ly9Bc3RhbFBvd2VyUHJvZmlsZXNcIiksICh7IFBvd2VyUHJvZmlsZXMgfSkgPT4ge1xuICAgIHBhdGNoKFBvd2VyUHJvZmlsZXMucHJvdG90eXBlLCBcImFjdGlvbnNcIilcbn0pXG5cbmF3YWl0IHN1cHByZXNzKGltcG9ydChcImdpOi8vQXN0YWxXcFwiKSwgKHsgV3AsIEF1ZGlvLCBWaWRlbyB9KSA9PiB7XG4gICAgcGF0Y2goV3AucHJvdG90eXBlLCBcImVuZHBvaW50c1wiKVxuICAgIHBhdGNoKFdwLnByb3RvdHlwZSwgXCJkZXZpY2VzXCIpXG4gICAgcGF0Y2goQXVkaW8ucHJvdG90eXBlLCBcInN0cmVhbXNcIilcbiAgICBwYXRjaChBdWRpby5wcm90b3R5cGUsIFwicmVjb3JkZXJzXCIpXG4gICAgcGF0Y2goQXVkaW8ucHJvdG90eXBlLCBcIm1pY3JvcGhvbmVzXCIpXG4gICAgcGF0Y2goQXVkaW8ucHJvdG90eXBlLCBcInNwZWFrZXJzXCIpXG4gICAgcGF0Y2goQXVkaW8ucHJvdG90eXBlLCBcImRldmljZXNcIilcbiAgICBwYXRjaChWaWRlby5wcm90b3R5cGUsIFwic3RyZWFtc1wiKVxuICAgIHBhdGNoKFZpZGVvLnByb3RvdHlwZSwgXCJyZWNvcmRlcnNcIilcbiAgICBwYXRjaChWaWRlby5wcm90b3R5cGUsIFwic2lua3NcIilcbiAgICBwYXRjaChWaWRlby5wcm90b3R5cGUsIFwic291cmNlc1wiKVxuICAgIHBhdGNoKFZpZGVvLnByb3RvdHlwZSwgXCJkZXZpY2VzXCIpXG59KVxuIiwgImltcG9ydCBcIi4vb3ZlcnJpZGVzLmpzXCJcbmltcG9ydCB7IHNldENvbnNvbGVMb2dEb21haW4gfSBmcm9tIFwiY29uc29sZVwiXG5pbXBvcnQgeyBleGl0LCBwcm9ncmFtQXJncyB9IGZyb20gXCJzeXN0ZW1cIlxuaW1wb3J0IElPIGZyb20gXCJnaTovL0FzdGFsSU9cIlxuaW1wb3J0IEdPYmplY3QgZnJvbSBcImdpOi8vR09iamVjdFwiXG5pbXBvcnQgR2lvIGZyb20gXCJnaTovL0dpbz92ZXJzaW9uPTIuMFwiXG5pbXBvcnQgdHlwZSBBc3RhbDMgZnJvbSBcImdpOi8vQXN0YWw/dmVyc2lvbj0zLjBcIlxuaW1wb3J0IHR5cGUgQXN0YWw0IGZyb20gXCJnaTovL0FzdGFsP3ZlcnNpb249NC4wXCJcblxudHlwZSBDb25maWcgPSBQYXJ0aWFsPHtcbiAgICBpbnN0YW5jZU5hbWU6IHN0cmluZ1xuICAgIGNzczogc3RyaW5nXG4gICAgaWNvbnM6IHN0cmluZ1xuICAgIGd0a1RoZW1lOiBzdHJpbmdcbiAgICBpY29uVGhlbWU6IHN0cmluZ1xuICAgIGN1cnNvclRoZW1lOiBzdHJpbmdcbiAgICBob2xkOiBib29sZWFuXG4gICAgcmVxdWVzdEhhbmRsZXIocmVxdWVzdDogc3RyaW5nLCByZXM6IChyZXNwb25zZTogYW55KSA9PiB2b2lkKTogdm9pZFxuICAgIG1haW4oLi4uYXJnczogc3RyaW5nW10pOiB2b2lkXG4gICAgY2xpZW50KG1lc3NhZ2U6IChtc2c6IHN0cmluZykgPT4gc3RyaW5nLCAuLi5hcmdzOiBzdHJpbmdbXSk6IHZvaWRcbn0+XG5cbmludGVyZmFjZSBBc3RhbDNKUyBleHRlbmRzIEFzdGFsMy5BcHBsaWNhdGlvbiB7XG4gICAgZXZhbChib2R5OiBzdHJpbmcpOiBQcm9taXNlPGFueT5cbiAgICByZXF1ZXN0SGFuZGxlcjogQ29uZmlnW1wicmVxdWVzdEhhbmRsZXJcIl1cbiAgICBhcHBseV9jc3Moc3R5bGU6IHN0cmluZywgcmVzZXQ/OiBib29sZWFuKTogdm9pZFxuICAgIHF1aXQoY29kZT86IG51bWJlcik6IHZvaWRcbiAgICBzdGFydChjb25maWc/OiBDb25maWcpOiB2b2lkXG59XG5cbmludGVyZmFjZSBBc3RhbDRKUyBleHRlbmRzIEFzdGFsNC5BcHBsaWNhdGlvbiB7XG4gICAgZXZhbChib2R5OiBzdHJpbmcpOiBQcm9taXNlPGFueT5cbiAgICByZXF1ZXN0SGFuZGxlcj86IENvbmZpZ1tcInJlcXVlc3RIYW5kbGVyXCJdXG4gICAgYXBwbHlfY3NzKHN0eWxlOiBzdHJpbmcsIHJlc2V0PzogYm9vbGVhbik6IHZvaWRcbiAgICBxdWl0KGNvZGU/OiBudW1iZXIpOiB2b2lkXG4gICAgc3RhcnQoY29uZmlnPzogQ29uZmlnKTogdm9pZFxufVxuXG50eXBlIEFwcDMgPSB0eXBlb2YgQXN0YWwzLkFwcGxpY2F0aW9uXG50eXBlIEFwcDQgPSB0eXBlb2YgQXN0YWw0LkFwcGxpY2F0aW9uXG5cbmV4cG9ydCBmdW5jdGlvbiBta0FwcDxBcHAgZXh0ZW5kcyBBcHAzPihBcHA6IEFwcCk6IEFzdGFsM0pTXG5leHBvcnQgZnVuY3Rpb24gbWtBcHA8QXBwIGV4dGVuZHMgQXBwND4oQXBwOiBBcHApOiBBc3RhbDRKU1xuXG5leHBvcnQgZnVuY3Rpb24gbWtBcHAoQXBwOiBBcHAzIHwgQXBwNCkge1xuICAgIHJldHVybiBuZXcgKGNsYXNzIEFzdGFsSlMgZXh0ZW5kcyBBcHAge1xuICAgICAgICBzdGF0aWMgeyBHT2JqZWN0LnJlZ2lzdGVyQ2xhc3MoeyBHVHlwZU5hbWU6IFwiQXN0YWxKU1wiIH0sIHRoaXMgYXMgYW55KSB9XG5cbiAgICAgICAgZXZhbChib2R5OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXMsIHJlaikgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZuID0gRnVuY3Rpb24oYHJldHVybiAoYXN5bmMgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAke2JvZHkuaW5jbHVkZXMoXCI7XCIpID8gYm9keSA6IGByZXR1cm4gJHtib2R5fTtgfVxuICAgICAgICAgICAgICAgICAgICB9KWApXG4gICAgICAgICAgICAgICAgICAgIGZuKCkoKS50aGVuKHJlcykuY2F0Y2gocmVqKVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlaihlcnJvcilcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgcmVxdWVzdEhhbmRsZXI/OiBDb25maWdbXCJyZXF1ZXN0SGFuZGxlclwiXVxuXG4gICAgICAgIHZmdW5jX3JlcXVlc3QobXNnOiBzdHJpbmcsIGNvbm46IEdpby5Tb2NrZXRDb25uZWN0aW9uKTogdm9pZCB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMucmVxdWVzdEhhbmRsZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdEhhbmRsZXIobXNnLCAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgSU8ud3JpdGVfc29jayhjb25uLCBTdHJpbmcocmVzcG9uc2UpLCAoXywgcmVzKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgSU8ud3JpdGVfc29ja19maW5pc2gocmVzKSxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN1cGVyLnZmdW5jX3JlcXVlc3QobXNnLCBjb25uKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXBwbHlfY3NzKHN0eWxlOiBzdHJpbmcsIHJlc2V0ID0gZmFsc2UpIHtcbiAgICAgICAgICAgIHN1cGVyLmFwcGx5X2NzcyhzdHlsZSwgcmVzZXQpXG4gICAgICAgIH1cblxuICAgICAgICBxdWl0KGNvZGU/OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgICAgIHN1cGVyLnF1aXQoKVxuICAgICAgICAgICAgZXhpdChjb2RlID8/IDApXG4gICAgICAgIH1cblxuICAgICAgICBzdGFydCh7IHJlcXVlc3RIYW5kbGVyLCBjc3MsIGhvbGQsIG1haW4sIGNsaWVudCwgaWNvbnMsIC4uLmNmZyB9OiBDb25maWcgPSB7fSkge1xuICAgICAgICAgICAgY29uc3QgYXBwID0gdGhpcyBhcyB1bmtub3duIGFzIEluc3RhbmNlVHlwZTxBcHAzIHwgQXBwND5cblxuICAgICAgICAgICAgY2xpZW50ID8/PSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcHJpbnQoYEFzdGFsIGluc3RhbmNlIFwiJHthcHAuaW5zdGFuY2VOYW1lfVwiIGFscmVhZHkgcnVubmluZ2ApXG4gICAgICAgICAgICAgICAgZXhpdCgxKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGNmZylcbiAgICAgICAgICAgIHNldENvbnNvbGVMb2dEb21haW4oYXBwLmluc3RhbmNlTmFtZSlcblxuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SGFuZGxlciA9IHJlcXVlc3RIYW5kbGVyXG4gICAgICAgICAgICBhcHAuY29ubmVjdChcImFjdGl2YXRlXCIsICgpID0+IHtcbiAgICAgICAgICAgICAgICBtYWluPy4oLi4ucHJvZ3JhbUFyZ3MpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGFwcC5hY3F1aXJlX3NvY2tldCgpXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGllbnQobXNnID0+IElPLnNlbmRfcmVxdWVzdChhcHAuaW5zdGFuY2VOYW1lLCBtc2cpISwgLi4ucHJvZ3JhbUFyZ3MpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjc3MpXG4gICAgICAgICAgICAgICAgdGhpcy5hcHBseV9jc3MoY3NzLCBmYWxzZSlcblxuICAgICAgICAgICAgaWYgKGljb25zKVxuICAgICAgICAgICAgICAgIGFwcC5hZGRfaWNvbnMoaWNvbnMpXG5cbiAgICAgICAgICAgIGhvbGQgPz89IHRydWVcbiAgICAgICAgICAgIGlmIChob2xkKVxuICAgICAgICAgICAgICAgIGFwcC5ob2xkKClcblxuICAgICAgICAgICAgYXBwLnJ1bkFzeW5jKFtdKVxuICAgICAgICB9XG4gICAgfSlcbn1cbiIsICJpbXBvcnQgQXN0YWwgZnJvbSBcImdpOi8vQXN0YWw/dmVyc2lvbj00LjBcIlxuaW1wb3J0IEd0ayBmcm9tIFwiZ2k6Ly9HdGs/dmVyc2lvbj00LjBcIlxuaW1wb3J0IGFzdGFsaWZ5LCB7IHR5cGUsIHR5cGUgQ29uc3RydWN0UHJvcHMgfSBmcm9tIFwiLi9hc3RhbGlmeS5qc1wiXG5cbmZ1bmN0aW9uIGZpbHRlcihjaGlsZHJlbjogYW55W10pIHtcbiAgICByZXR1cm4gY2hpbGRyZW4uZmxhdChJbmZpbml0eSkubWFwKGNoID0+IGNoIGluc3RhbmNlb2YgR3RrLldpZGdldFxuICAgICAgICA/IGNoXG4gICAgICAgIDogbmV3IEd0ay5MYWJlbCh7IHZpc2libGU6IHRydWUsIGxhYmVsOiBTdHJpbmcoY2gpIH0pKVxufVxuXG4vLyBCb3hcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShBc3RhbC5Cb3gucHJvdG90eXBlLCBcImNoaWxkcmVuXCIsIHtcbiAgICBnZXQoKSB7IHJldHVybiB0aGlzLmdldF9jaGlsZHJlbigpIH0sXG4gICAgc2V0KHYpIHsgdGhpcy5zZXRfY2hpbGRyZW4odikgfSxcbn0pXG5cbmV4cG9ydCB0eXBlIEJveFByb3BzID0gQ29uc3RydWN0UHJvcHM8QXN0YWwuQm94LCBBc3RhbC5Cb3guQ29uc3RydWN0b3JQcm9wcz5cbmV4cG9ydCBjb25zdCBCb3ggPSBhc3RhbGlmeTxBc3RhbC5Cb3gsIEFzdGFsLkJveC5Db25zdHJ1Y3RvclByb3BzPihBc3RhbC5Cb3gsIHtcbiAgICBnZXRDaGlsZHJlbihzZWxmKSB7IHJldHVybiBzZWxmLmdldF9jaGlsZHJlbigpIH0sXG4gICAgc2V0Q2hpbGRyZW4oc2VsZiwgY2hpbGRyZW4pIHsgcmV0dXJuIHNlbGYuc2V0X2NoaWxkcmVuKGZpbHRlcihjaGlsZHJlbikpIH0sXG59KVxuXG4vLyBCdXR0b25cbnR5cGUgQnV0dG9uU2lnbmFscyA9IHtcbiAgICBvbkNsaWNrZWQ6IFtdXG59XG5cbmV4cG9ydCB0eXBlIEJ1dHRvblByb3BzID0gQ29uc3RydWN0UHJvcHM8R3RrLkJ1dHRvbiwgR3RrLkJ1dHRvbi5Db25zdHJ1Y3RvclByb3BzLCBCdXR0b25TaWduYWxzPlxuZXhwb3J0IGNvbnN0IEJ1dHRvbiA9IGFzdGFsaWZ5PEd0ay5CdXR0b24sIEd0ay5CdXR0b24uQ29uc3RydWN0b3JQcm9wcywgQnV0dG9uU2lnbmFscz4oR3RrLkJ1dHRvbilcblxuLy8gQ2VudGVyQm94XG5leHBvcnQgdHlwZSBDZW50ZXJCb3hQcm9wcyA9IENvbnN0cnVjdFByb3BzPEd0ay5DZW50ZXJCb3gsIEd0ay5DZW50ZXJCb3guQ29uc3RydWN0b3JQcm9wcz5cbmV4cG9ydCBjb25zdCBDZW50ZXJCb3ggPSBhc3RhbGlmeTxHdGsuQ2VudGVyQm94LCBHdGsuQ2VudGVyQm94LkNvbnN0cnVjdG9yUHJvcHM+KEd0ay5DZW50ZXJCb3gsIHtcbiAgICBnZXRDaGlsZHJlbihib3gpIHtcbiAgICAgICAgcmV0dXJuIFtib3guc3RhcnRXaWRnZXQsIGJveC5jZW50ZXJXaWRnZXQsIGJveC5lbmRXaWRnZXRdXG4gICAgfSxcbiAgICBzZXRDaGlsZHJlbihib3gsIGNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IGNoID0gZmlsdGVyKGNoaWxkcmVuKVxuICAgICAgICBib3guc3RhcnRXaWRnZXQgPSBjaFswXSB8fCBuZXcgR3RrLkJveFxuICAgICAgICBib3guY2VudGVyV2lkZ2V0ID0gY2hbMV0gfHwgbmV3IEd0ay5Cb3hcbiAgICAgICAgYm94LmVuZFdpZGdldCA9IGNoWzJdIHx8IG5ldyBHdGsuQm94XG4gICAgfSxcbn0pXG5cbi8vIFRPRE86IENpcmN1bGFyUHJvZ3Jlc3Ncbi8vIFRPRE86IERyYXdpbmdBcmVhXG5cbi8vIEVudHJ5XG50eXBlIEVudHJ5U2lnbmFscyA9IHtcbiAgICBvbkFjdGl2YXRlOiBbXVxuICAgIG9uTm90aWZ5VGV4dDogW11cbn1cblxuZXhwb3J0IHR5cGUgRW50cnlQcm9wcyA9IENvbnN0cnVjdFByb3BzPEd0ay5FbnRyeSwgR3RrLkVudHJ5LkNvbnN0cnVjdG9yUHJvcHMsIEVudHJ5U2lnbmFscz5cbmV4cG9ydCBjb25zdCBFbnRyeSA9IGFzdGFsaWZ5PEd0ay5FbnRyeSwgR3RrLkVudHJ5LkNvbnN0cnVjdG9yUHJvcHMsIEVudHJ5U2lnbmFscz4oR3RrLkVudHJ5LCB7XG4gICAgZ2V0Q2hpbGRyZW4oKSB7IHJldHVybiBbXSB9LFxufSlcblxuLy8gSW1hZ2VcbmV4cG9ydCB0eXBlIEltYWdlUHJvcHMgPSBDb25zdHJ1Y3RQcm9wczxHdGsuSW1hZ2UsIEd0ay5JbWFnZS5Db25zdHJ1Y3RvclByb3BzPlxuZXhwb3J0IGNvbnN0IEltYWdlID0gYXN0YWxpZnk8R3RrLkltYWdlLCBHdGsuSW1hZ2UuQ29uc3RydWN0b3JQcm9wcz4oR3RrLkltYWdlLCB7XG4gICAgZ2V0Q2hpbGRyZW4oKSB7IHJldHVybiBbXSB9LFxufSlcblxuLy8gTGFiZWxcbmV4cG9ydCB0eXBlIExhYmVsUHJvcHMgPSBDb25zdHJ1Y3RQcm9wczxHdGsuTGFiZWwsIEd0ay5MYWJlbC5Db25zdHJ1Y3RvclByb3BzPlxuZXhwb3J0IGNvbnN0IExhYmVsID0gYXN0YWxpZnk8R3RrLkxhYmVsLCBHdGsuTGFiZWwuQ29uc3RydWN0b3JQcm9wcz4oR3RrLkxhYmVsLCB7XG4gICAgZ2V0Q2hpbGRyZW4oKSB7IHJldHVybiBbXSB9LFxuICAgIHNldENoaWxkcmVuKHNlbGYsIGNoaWxkcmVuKSB7IHNlbGYubGFiZWwgPSBTdHJpbmcoY2hpbGRyZW4pIH0sXG59KVxuXG4vLyBMZXZlbEJhclxuZXhwb3J0IHR5cGUgTGV2ZWxCYXJQcm9wcyA9IENvbnN0cnVjdFByb3BzPEd0ay5MZXZlbEJhciwgR3RrLkxldmVsQmFyLkNvbnN0cnVjdG9yUHJvcHM+XG5leHBvcnQgY29uc3QgTGV2ZWxCYXIgPSBhc3RhbGlmeTxHdGsuTGV2ZWxCYXIsIEd0ay5MZXZlbEJhci5Db25zdHJ1Y3RvclByb3BzPihHdGsuTGV2ZWxCYXIsIHtcbiAgICBnZXRDaGlsZHJlbigpIHsgcmV0dXJuIFtdIH0sXG59KVxuXG4vLyBUT0RPOiBMaXN0Qm94XG5cbi8vIE92ZXJsYXlcbmV4cG9ydCB0eXBlIE92ZXJsYXlQcm9wcyA9IENvbnN0cnVjdFByb3BzPEd0ay5PdmVybGF5LCBHdGsuT3ZlcmxheS5Db25zdHJ1Y3RvclByb3BzPlxuZXhwb3J0IGNvbnN0IE92ZXJsYXkgPSBhc3RhbGlmeTxHdGsuT3ZlcmxheSwgR3RrLk92ZXJsYXkuQ29uc3RydWN0b3JQcm9wcz4oR3RrLk92ZXJsYXksIHtcbiAgICBnZXRDaGlsZHJlbihzZWxmKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuOiBBcnJheTxHdGsuV2lkZ2V0PiA9IFtdXG4gICAgICAgIGxldCBjaCA9IHNlbGYuZ2V0X2ZpcnN0X2NoaWxkKClcbiAgICAgICAgd2hpbGUgKGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKGNoKVxuICAgICAgICAgICAgY2ggPSBjaC5nZXRfbmV4dF9zaWJsaW5nKClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjaGlsZHJlbi5maWx0ZXIoY2ggPT4gY2ggIT09IHNlbGYuY2hpbGQpXG4gICAgfSxcbiAgICBzZXRDaGlsZHJlbihzZWxmLCBjaGlsZHJlbikge1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGZpbHRlcihjaGlsZHJlbikpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVzID0gdHlwZSBpbiBjaGlsZFxuICAgICAgICAgICAgICAgID8gKGNoaWxkW3R5cGVdIGFzIHN0cmluZykuc3BsaXQoL1xccysvKVxuICAgICAgICAgICAgICAgIDogW11cblxuICAgICAgICAgICAgaWYgKHR5cGVzLmluY2x1ZGVzKFwib3ZlcmxheVwiKSkge1xuICAgICAgICAgICAgICAgIHNlbGYuYWRkX292ZXJsYXkoY2hpbGQpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNlbGYuc2V0X2NoaWxkKGNoaWxkKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZWxmLnNldF9tZWFzdXJlX292ZXJsYXkoY2hpbGQsIHR5cGVzLmluY2x1ZGVzKFwibWVhc3VyZVwiKSlcbiAgICAgICAgICAgIHNlbGYuc2V0X2NsaXBfb3ZlcmxheShjaGlsZCwgdHlwZXMuaW5jbHVkZXMoXCJjbGlwXCIpKVxuICAgICAgICB9XG4gICAgfSxcbn0pXG5cbi8vIFJldmVhbGVyXG5leHBvcnQgdHlwZSBSZXZlYWxlclByb3BzID0gQ29uc3RydWN0UHJvcHM8R3RrLlJldmVhbGVyLCBHdGsuUmV2ZWFsZXIuQ29uc3RydWN0b3JQcm9wcz5cbmV4cG9ydCBjb25zdCBSZXZlYWxlciA9IGFzdGFsaWZ5PEd0ay5SZXZlYWxlciwgR3RrLlJldmVhbGVyLkNvbnN0cnVjdG9yUHJvcHM+KEd0ay5SZXZlYWxlcilcblxuLy8gU2xpZGVyXG50eXBlIFNsaWRlclNpZ25hbHMgPSB7XG4gICAgb25DaGFuZ2VWYWx1ZTogW11cbn1cblxuZXhwb3J0IHR5cGUgU2xpZGVyUHJvcHMgPSBDb25zdHJ1Y3RQcm9wczxBc3RhbC5TbGlkZXIsIEFzdGFsLlNsaWRlci5Db25zdHJ1Y3RvclByb3BzLCBTbGlkZXJTaWduYWxzPlxuZXhwb3J0IGNvbnN0IFNsaWRlciA9IGFzdGFsaWZ5PEFzdGFsLlNsaWRlciwgQXN0YWwuU2xpZGVyLkNvbnN0cnVjdG9yUHJvcHMsIFNsaWRlclNpZ25hbHM+KEFzdGFsLlNsaWRlciwge1xuICAgIGdldENoaWxkcmVuKCkgeyByZXR1cm4gW10gfSxcbn0pXG5cbi8vIFN0YWNrXG5leHBvcnQgdHlwZSBTdGFja1Byb3BzID0gQ29uc3RydWN0UHJvcHM8R3RrLlN0YWNrLCBHdGsuU3RhY2suQ29uc3RydWN0b3JQcm9wcz5cbmV4cG9ydCBjb25zdCBTdGFjayA9IGFzdGFsaWZ5PEd0ay5TdGFjaywgR3RrLlN0YWNrLkNvbnN0cnVjdG9yUHJvcHM+KEd0ay5TdGFjaywge1xuICAgIHNldENoaWxkcmVuKHNlbGYsIGNoaWxkcmVuKSB7XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZmlsdGVyKGNoaWxkcmVuKSkge1xuICAgICAgICAgICAgaWYgKGNoaWxkLm5hbWUgIT0gXCJcIiAmJiBjaGlsZC5uYW1lICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmFkZF9uYW1lZChjaGlsZCwgY2hpbGQubmFtZSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2VsZi5hZGRfY2hpbGQoY2hpbGQpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxufSlcblxuLy8gU3dpdGNoXG5leHBvcnQgdHlwZSBTd2l0Y2hQcm9wcyA9IENvbnN0cnVjdFByb3BzPEd0ay5Td2l0Y2gsIEd0ay5Td2l0Y2guQ29uc3RydWN0b3JQcm9wcz5cbmV4cG9ydCBjb25zdCBTd2l0Y2ggPSBhc3RhbGlmeTxHdGsuU3dpdGNoLCBHdGsuU3dpdGNoLkNvbnN0cnVjdG9yUHJvcHM+KEd0ay5Td2l0Y2gsIHtcbiAgICBnZXRDaGlsZHJlbigpIHsgcmV0dXJuIFtdIH0sXG59KVxuXG4vLyBXaW5kb3dcbmV4cG9ydCB0eXBlIFdpbmRvd1Byb3BzID0gQ29uc3RydWN0UHJvcHM8QXN0YWwuV2luZG93LCBBc3RhbC5XaW5kb3cuQ29uc3RydWN0b3JQcm9wcz5cbmV4cG9ydCBjb25zdCBXaW5kb3cgPSBhc3RhbGlmeTxBc3RhbC5XaW5kb3csIEFzdGFsLldpbmRvdy5Db25zdHJ1Y3RvclByb3BzPihBc3RhbC5XaW5kb3cpXG5cbi8vIE1lbnVCdXR0b25cbmV4cG9ydCB0eXBlIE1lbnVCdXR0b25Qcm9wcyA9IENvbnN0cnVjdFByb3BzPEd0ay5NZW51QnV0dG9uLCBHdGsuTWVudUJ1dHRvbi5Db25zdHJ1Y3RvclByb3BzPlxuZXhwb3J0IGNvbnN0IE1lbnVCdXR0b24gPSBhc3RhbGlmeTxHdGsuTWVudUJ1dHRvbiwgR3RrLk1lbnVCdXR0b24uQ29uc3RydWN0b3JQcm9wcz4oR3RrLk1lbnVCdXR0b24sIHtcbiAgICBnZXRDaGlsZHJlbihzZWxmKSB7IHJldHVybiBbc2VsZi5wb3BvdmVyLCBzZWxmLmNoaWxkXSB9LFxuICAgIHNldENoaWxkcmVuKHNlbGYsIGNoaWxkcmVuKSB7XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZmlsdGVyKGNoaWxkcmVuKSkge1xuICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgR3RrLlBvcG92ZXIpIHtcbiAgICAgICAgICAgICAgICBzZWxmLnNldF9wb3BvdmVyKGNoaWxkKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZWxmLnNldF9jaGlsZChjaGlsZClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG59KVxuXG4vLyBQb3BvcGVyXG5leHBvcnQgdHlwZSBQb3BvdmVyUHJvcHMgPSBDb25zdHJ1Y3RQcm9wczxHdGsuUG9wb3ZlciwgR3RrLlBvcG92ZXIuQ29uc3RydWN0b3JQcm9wcz5cbmV4cG9ydCBjb25zdCBQb3BvdmVyID0gYXN0YWxpZnk8R3RrLlBvcG92ZXIsIEd0ay5Qb3BvdmVyLkNvbnN0cnVjdG9yUHJvcHM+KEd0ay5Qb3BvdmVyKVxuIiwgIi8qIEB1c2UgJy4vY29tcG9uZW50cy9ub3RpZmljYXRpb25zL25vdGlmaWNhdGlvbnMuc2Nzcyc7ICovXG53aW5kb3cuQmFyIHtcbiAgZm9udC1mYW1pbHk6IFwiQ29tZm9ydGFhLCBzYW5zLXNlcmlmXCI7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICBjb2xvcjogI0U2RTZFNjtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIC8qID5jZW50ZXJib3ggeyAqL1xuICAvKiAgICAgYmFja2dyb3VuZDogJGJnLWNvbG9yOyAqL1xuICAvKiAgICAgYm9yZGVyLXJhZGl1czogMTBweDsgKi9cbiAgLyogICAgIG1hcmdpbjogOHB4OyAqL1xuICAvKiB9ICovXG59XG53aW5kb3cuQmFyIC5iYXItYnV0dG9uIHtcbiAgYm9yZGVyLXJhZGl1czogMjBweDtcbiAgbWFyZ2luOiAycHg7XG4gIHBhZGRpbmctbGVmdDogMTBweDtcbiAgcGFkZGluZy1yaWdodDogMTBweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzE0MTQxNDtcbn1cbndpbmRvdy5CYXIgLmJhci1idXR0b24gYnV0dG9uIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzE0MTQxNDtcbn1cbndpbmRvdy5CYXIgLnF1aWNrLWFjdGlvbi1idXR0b24ge1xuICBib3JkZXItcmFkaXVzOiAyMHB4O1xuICBtYXJnaW46IDJweDtcbiAgcGFkZGluZy1sZWZ0OiAxMHB4O1xuICBwYWRkaW5nLXJpZ2h0OiAxMHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTQxNDE0O1xufVxud2luZG93LkJhciBidXR0b24ud29ya3NwYWNlLWJ1dHRvbiB7XG4gIGJvcmRlci1yYWRpdXM6IDIwcHg7XG4gIG1hcmdpbjogMXB4O1xufVxud2luZG93LkJhciBidXR0b24ud29ya3NwYWNlLWJ1dHRvbi5mb2N1c2VkLXdvcmtzcGFjZS1idXR0b24ge1xuICBjb2xvcjogIzVGNTBBNjtcbn1cbndpbmRvdy5CYXIgLnRyYXktaXRlbSB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbn1cbndpbmRvdy5CYXIgLnRyYXktaXRlbSBidXR0b24ge1xuICBtYXJnaW46IDJweDtcbiAgYm94LXNoYWRvdzogbm9uZTtcbn1cbndpbmRvdy5CYXIgLnRpbWUge1xuICBtaW4td2lkdGg6IDExcmVtO1xuICBwYWRkaW5nOiAzcHg7XG59XG53aW5kb3cuQmFyIC50aW1lIGJ1dHRvbiB7XG4gIGJveC1zaGFkb3c6IG5vbmU7XG4gIHBhZGRpbmc6IDA7XG59XG5cbmJveC5wbGF5ZXJzLWJveCB7XG4gIG1hcmdpbi10b3A6IDIwcHg7XG59XG5cbmJveC5wbGF5ZXIge1xuICBwYWRkaW5nOiAwLjZyZW07XG59XG5ib3gucGxheWVyIC5jb3Zlci1hcnQge1xuICBtaW4td2lkdGg6IDEwMHB4O1xuICBtaW4taGVpZ2h0OiAxMDBweDtcbiAgYm9yZGVyLXJhZGl1czogOXB4O1xuICBtYXJnaW4tcmlnaHQ6IDAuNnJlbTtcbiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluO1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7XG59XG5ib3gucGxheWVyIC50aXRsZSB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBmb250LXNpemU6IDEuMWVtO1xufVxuYm94LnBsYXllciBzY2FsZSB7XG4gIHBhZGRpbmc6IDA7XG4gIG1hcmdpbjogMC40cmVtIDA7XG4gIGJvcmRlci1yYWRpdXM6IDIwcHg7XG59XG5ib3gucGxheWVyIHNjYWxlIHRyb3VnaCB7XG4gIG1pbi1oZWlnaHQ6IDhweDtcbiAgYm9yZGVyLXJhZGl1czogMjBweDtcbn1cbmJveC5wbGF5ZXIgc2NhbGUgaGlnaGxpZ2h0IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogQHRoZW1lX2ZnX2NvbG9yO1xuICBib3JkZXItcmFkaXVzOiAyMHB4O1xufVxuYm94LnBsYXllciBzY2FsZSBzbGlkZXIge1xuICBhbGw6IHVuc2V0O1xuICBib3JkZXItcmFkaXVzOiAyMHB4O1xufVxuYm94LnBsYXllciBjZW50ZXJib3guYWN0aW9ucyB7XG4gIG1pbi13aWR0aDogMjIwcHg7XG59XG5ib3gucGxheWVyIGNlbnRlcmJveC5hY3Rpb25zIGJ1dHRvbiB7XG4gIG1pbi13aWR0aDogMDtcbiAgbWluLWhlaWdodDogMDtcbiAgcGFkZGluZzogMC40cmVtO1xuICBtYXJnaW46IDAgMC4ycmVtO1xufVxuXG4uYXVkaW8tYm94IHtcbiAgbWluLXdpZHRoOiAzMjBweDtcbn1cblxuLnF1aWNrLWFjdGlvbnMtd3JhcHBlciB7XG4gIG1pbi13aWR0aDogNTIwcHg7XG59XG5cbmJveC5xdWljay1hY3Rpb25zIHtcbiAgcGFkZGluZzogMTBweDtcbn1cblxucG9wb3ZlciAqIHtcbiAgYm9yZGVyLXJhZGl1czogMjBweDtcbn1cblxuYnV0dG9uIHtcbiAgbWFyZ2luOiA0cHg7XG59XG5cbi5idXR0b24tbm8tbWFyZ2luIHtcbiAgbWFyZ2luLXRvcDogMDtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbn1cblxuLmRldmljZXMtbGlzdCB7XG4gIG1hcmdpbi1ib3R0b206IDIwcHg7XG59XG5cbmJ1dHRvbi50b2dnbGUtYnV0dG9uIHtcbiAgbWluLXdpZHRoOiAyMjBweDtcbiAgYm9yZGVyLXJhZGl1czogNTBweDtcbn1cbmJ1dHRvbi50b2dnbGUtYnV0dG9uLnRvZ2dsZS1vbiB7XG4gIG1pbi13aWR0aDogMTkwcHg7XG4gIG1hcmdpbi1yaWdodDogMDtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDA7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjQjI3QkQxO1xufVxuXG5idXR0b24uYWN0aW9ucy1idXR0b24ge1xuICBtYXJnaW4tbGVmdDogMDtcbiAgYm9yZGVyLXJhZGl1czogMDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI0IyN0JEMTtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDUwcHg7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA1MHB4O1xufVxuXG4uYXZhdGFyLWljb24ge1xuICBib3JkZXItcmFkaXVzOiAxMDBweDtcbiAgbWluLWhlaWdodDogNDBweDtcbiAgbWluLXdpZHRoOiA0MHB4O1xuICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG59XG5cbioge1xuICBmb250LXNpemU6IDFyZW07XG59XG5cbmVtcHR5IHtcbiAgbWluLXdpZHRoOiAwO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLnRpdGxlIHtcbiAgZm9udC1zaXplOiAxLjVyZW07XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4udGl0bGUtMiB7XG4gIGZvbnQtc2l6ZTogMS4ycmVtO1xuICBmb250LXdlaWdodDogYm9sZDtcbn0iLCAiaW1wb3J0IEFzdGFsVHJheSBmcm9tIFwiZ2k6Ly9Bc3RhbFRyYXlcIjtcbmltcG9ydCB7IGJpbmQsIEdPYmplY3QgfSBmcm9tIFwiYXN0YWxcIjtcbmltcG9ydCBBc3RhbEh5cHJsYW5kIGZyb20gXCJnaTovL0FzdGFsSHlwcmxhbmRcIjtcbmltcG9ydCB7IEd0ayB9IGZyb20gXCJhc3RhbC9ndGs0XCI7XG5cbmNvbnN0IGh5cHIgPSBBc3RhbEh5cHJsYW5kLmdldF9kZWZhdWx0KCk7XG5jb25zdCBTWU5DID0gR09iamVjdC5CaW5kaW5nRmxhZ3MuU1lOQ19DUkVBVEU7XG5cbmNvbnN0IFN5c1RyYXkgPSAoKSA9PiB7XG4gICAgY29uc3QgdHJheUJveCA9IG5ldyBHdGsuQm94KHsgY3NzQ2xhc3NlczogW1wiYmFyLWJ1dHRvblwiXSB9KTtcbiAgICBjb25zdCB0cmF5ID0gQXN0YWxUcmF5LmdldF9kZWZhdWx0KCk7XG5cbiAgICBjb25zdCB0cmF5SXRlbXMgPSBuZXcgTWFwPHN0cmluZywgR3RrLk1lbnVCdXR0b24+KCk7XG4gICAgY29uc3QgdHJheUFkZGVkSGFuZGxlciA9IHRyYXkuY29ubmVjdChcIml0ZW0tYWRkZWRcIiwgKF8sIGlkKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0cmF5LmdldF9pdGVtKGlkKTtcbiAgICAgICAgY29uc3QgcG9wb3ZlciA9IEd0ay5Qb3BvdmVyTWVudS5uZXdfZnJvbV9tb2RlbChpdGVtLm1lbnVfbW9kZWwpO1xuICAgICAgICBjb25zdCBpY29uID0gbmV3IEd0ay5JbWFnZSgpO1xuICAgICAgICBjb25zdCBidXR0b24gPSBuZXcgR3RrLk1lbnVCdXR0b24oe1xuICAgICAgICAgICAgcG9wb3ZlcixcbiAgICAgICAgICAgIGNoaWxkOiBpY29uLFxuICAgICAgICAgICAgY3NzQ2xhc3NlczogW1widHJheS1pdGVtXCJdLFxuICAgICAgICB9KTtcblxuICAgICAgICBpdGVtLmJpbmRfcHJvcGVydHkoXCJnaWNvblwiLCBpY29uLCBcImdpY29uXCIsIFNZTkMpO1xuICAgICAgICBwb3BvdmVyLmluc2VydF9hY3Rpb25fZ3JvdXAoXCJkYnVzbWVudVwiLCBpdGVtLmFjdGlvbl9ncm91cCk7XG4gICAgICAgIGl0ZW0uY29ubmVjdChcIm5vdGlmeTo6YWN0aW9uLWdyb3VwXCIsICgpID0+IHtcbiAgICAgICAgICAgIHBvcG92ZXIuaW5zZXJ0X2FjdGlvbl9ncm91cChcImRidXNtZW51XCIsIGl0ZW0uYWN0aW9uX2dyb3VwKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdHJheUl0ZW1zLnNldChpZCwgYnV0dG9uKTtcbiAgICAgICAgdHJheUJveC5hcHBlbmQoYnV0dG9uKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHRyYXlSZW1vdmVkSGFuZGxlciA9IHRyYXkuY29ubmVjdChcIml0ZW0tcmVtb3ZlZFwiLCAoXywgaWQpID0+IHtcbiAgICAgICAgY29uc3QgYnV0dG9uID0gdHJheUl0ZW1zLmdldChpZCk7XG4gICAgICAgIGlmIChidXR0b24pIHtcbiAgICAgICAgICAgIHRyYXlCb3gucmVtb3ZlKGJ1dHRvbik7XG4gICAgICAgICAgICBidXR0b24ucnVuX2Rpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRyYXlJdGVtcy5kZWxldGUoaWQpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICB0cmF5Qm94LmNvbm5lY3QoXCJkZXN0cm95XCIsICgpID0+IHtcbiAgICAgICAgdHJheS5kaXNjb25uZWN0KHRyYXlBZGRlZEhhbmRsZXIpO1xuICAgICAgICB0cmF5LmRpc2Nvbm5lY3QodHJheVJlbW92ZWRIYW5kbGVyKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0cmF5Qm94O1xufTtcblxuY29uc3QgV29ya3NwYWNlID0gKCkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICAgIDxib3g+XG4gICAgICAgICAgICB7YmluZChoeXByLCBcIndvcmtzcGFjZXNcIikuYXMod3NzID0+XG4gICAgICAgICAgICAgICAgd3NzXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIod3MgPT4gISh3cy5pZCA+PSAtOTkgJiYgd3MuaWQgPD0gLTIpKSAvLyBmaWx0ZXIgb3V0IHNwZWNpYWwgd29ya3NwYWNlc1xuICAgICAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5pZCAtIGIuaWQpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAod3MgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzc0NsYXNzZXM9e2JpbmQoaHlwciwgXCJmb2N1c2VkV29ya3NwYWNlXCIpLmFzKGZ3ID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzID09PSBmd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJmb2N1c2VkLXdvcmtzcGFjZS1idXR0b25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIndvcmtzcGFjZS1idXR0b25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogW1wid29ya3NwYWNlLWJ1dHRvblwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQnV0dG9uUHJlc3NlZD17KCkgPT4gd3MuZm9jdXMoKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZD17PGxhYmVsIGxhYmVsPXtTdHJpbmcod3MuaWQpfT48L2xhYmVsPn1cbiAgICAgICAgICAgICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICApfVxuICAgICAgICA8L2JveD5cbiAgICApO1xufTtcblxuLyoqXG4gKiBEaXNwbGF5cyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSB3aW5kb3cgYW5kIHByb3ZpZGVzIGEgcG9wb3ZlciBmb3JcbiAqIGRpc3BsYXlpbmcgYWxsIGF2YWlsYWJsZSBjbGllbnRzXG4gKi9cbmNvbnN0IEFjdGl2ZVdpbmRvdyA9ICgpID0+IHtcbiAgICBjb25zdCBmb2N1c2VkID0gYmluZChoeXByLCBcImZvY3VzZWRDbGllbnRcIik7XG5cbiAgICBjb25zdCBXaW5kb3dQb3BvdmVyID0gKCk6IEd0ay5Qb3BvdmVyID0+IHtcbiAgICAgICAgLy8gU2V0IHVwIGJveGVzICsgUG9wb3ZlclxuICAgICAgICBjb25zdCBwb3BvdmVyID0gbmV3IEd0ay5Qb3BvdmVyKCk7XG5cbiAgICAgICAgY29uc3QgcG9wb3ZlckJveCA9IFdpbmRvd1BvcG92ZXJCb3goKTtcblxuICAgICAgICBwb3BvdmVyLnNldF9jaGlsZChwb3BvdmVyQm94KTtcbiAgICAgICAgcmV0dXJuIHBvcG92ZXI7XG4gICAgfTtcblxuICAgIGNvbnN0IHdpbmRvd1BvcG92ZXIgPSBXaW5kb3dQb3BvdmVyKCk7XG5cbiAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAvLyBSZXR1cm4gZnVsbHkgYXNzZW1ibGVkIEh5cHJsYW5kRm9jdXNlZENsaWVudCBib3hcbiAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICByZXR1cm4gKFxuICAgICAgICA8Ym94IHZpc2libGU9e2ZvY3VzZWQuYXMoQm9vbGVhbil9PlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIG9uQ2xpY2tlZD17KCkgPT4gd2luZG93UG9wb3Zlci5wb3B1cCgpfVxuICAgICAgICAgICAgICAgIGNzc0NsYXNzZXM9e1tcImJhci1idXR0b25cIl19XG4gICAgICAgICAgICAgICAgY2hpbGQ9e1xuICAgICAgICAgICAgICAgICAgICBmb2N1c2VkLmFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50ID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50ICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGxhYmVsPXtiaW5kKGNsaWVudCwgXCJ0aXRsZVwiKS5hcyhTdHJpbmcpfSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9PjwvYnV0dG9uPlxuICAgICAgICAgICAge3dpbmRvd1BvcG92ZXJ9XG4gICAgICAgIDwvYm94ID5cbiAgICApO1xufTtcblxuY29uc3QgV2luZG93UG9wb3ZlckJveCA9ICgpID0+IHtcbiAgICByZXR1cm4gPGJveCB2ZXJ0aWNhbD5cbiAgICAgICAgPGxhYmVsIGxhYmVsPXtcIkF2YWlsYWJsZSBXaW5kb3dzXCJ9IGNzc0NsYXNzZXM9e1sndGl0bGUtMiddfT48L2xhYmVsPlxuICAgICAgICA8R3RrLlNlcGFyYXRvciBtYXJnaW5Ub3A9ezV9IG1hcmdpbkJvdHRvbT17NX0+PC9HdGsuU2VwYXJhdG9yPlxuICAgICAgICA8Ym94IHZlcnRpY2FsPlxuICAgICAgICAgICAge2JpbmQoaHlwciwgJ2NsaWVudHMnKS5hcyhjbGllbnRzID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50cy5tYXAoY2xpZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgbGFiZWw9e2JpbmQoY2xpZW50LCAnd29ya3NwYWNlJykuYXModyA9PiBgKFdTICR7d30pYCl9PjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgbGFiZWw9e2JpbmQoY2xpZW50LCAnaW5pdGlhbENsYXNzJykuYXMoYyA9PiBgWyR7Y31dYCl9PjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgbGFiZWw9e2JpbmQoY2xpZW50LCAndGl0bGUnKX0+PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9ib3g+XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pfVxuICAgICAgICA8L2JveD5cbiAgICA8L2JveD5cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIFdvcmtzcGFjZSxcbiAgICBBY3RpdmVXaW5kb3csXG4gICAgU3lzVHJheSxcbn07XG4iLCAiaW1wb3J0IFwiLi9vdmVycmlkZXMuanNcIlxuZXhwb3J0IHsgZGVmYXVsdCBhcyBBc3RhbElPIH0gZnJvbSBcImdpOi8vQXN0YWxJTz92ZXJzaW9uPTAuMVwiXG5leHBvcnQgKiBmcm9tIFwiLi9wcm9jZXNzLmpzXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RpbWUuanNcIlxuZXhwb3J0ICogZnJvbSBcIi4vZmlsZS5qc1wiXG5leHBvcnQgKiBmcm9tIFwiLi9nb2JqZWN0LmpzXCJcbmV4cG9ydCB7IEJpbmRpbmcsIGJpbmQgfSBmcm9tIFwiLi9iaW5kaW5nLmpzXCJcbmV4cG9ydCB7IFZhcmlhYmxlLCBkZXJpdmUgfSBmcm9tIFwiLi92YXJpYWJsZS5qc1wiXG4iLCAiaW1wb3J0IEFzdGFsIGZyb20gXCJnaTovL0FzdGFsSU9cIlxuaW1wb3J0IEdpbyBmcm9tIFwiZ2k6Ly9HaW8/dmVyc2lvbj0yLjBcIlxuXG5leHBvcnQgeyBHaW8gfVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZEZpbGUocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gQXN0YWwucmVhZF9maWxlKHBhdGgpIHx8IFwiXCJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRGaWxlQXN5bmMocGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBBc3RhbC5yZWFkX2ZpbGVfYXN5bmMocGF0aCwgKF8sIHJlcykgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKEFzdGFsLnJlYWRfZmlsZV9maW5pc2gocmVzKSB8fCBcIlwiKVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlRmlsZShwYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQge1xuICAgIEFzdGFsLndyaXRlX2ZpbGUocGF0aCwgY29udGVudClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlRmlsZUFzeW5jKHBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgQXN0YWwud3JpdGVfZmlsZV9hc3luYyhwYXRoLCBjb250ZW50LCAoXywgcmVzKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoQXN0YWwud3JpdGVfZmlsZV9maW5pc2gocmVzKSlcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtb25pdG9yRmlsZShcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgY2FsbGJhY2s6IChmaWxlOiBzdHJpbmcsIGV2ZW50OiBHaW8uRmlsZU1vbml0b3JFdmVudCkgPT4gdm9pZCxcbik6IEdpby5GaWxlTW9uaXRvciB7XG4gICAgcmV0dXJuIEFzdGFsLm1vbml0b3JfZmlsZShwYXRoLCAoZmlsZTogc3RyaW5nLCBldmVudDogR2lvLkZpbGVNb25pdG9yRXZlbnQpID0+IHtcbiAgICAgICAgY2FsbGJhY2soZmlsZSwgZXZlbnQpXG4gICAgfSkhXG59XG4iLCAiaW1wb3J0IEdPYmplY3QgZnJvbSBcImdpOi8vR09iamVjdFwiXG5cbmV4cG9ydCB7IGRlZmF1bHQgYXMgR0xpYiB9IGZyb20gXCJnaTovL0dMaWI/dmVyc2lvbj0yLjBcIlxuZXhwb3J0IHsgR09iamVjdCwgR09iamVjdCBhcyBkZWZhdWx0IH1cblxuY29uc3QgbWV0YSA9IFN5bWJvbChcIm1ldGFcIilcbmNvbnN0IHByaXYgPSBTeW1ib2woXCJwcml2XCIpXG5cbmNvbnN0IHsgUGFyYW1TcGVjLCBQYXJhbUZsYWdzIH0gPSBHT2JqZWN0XG5cbmNvbnN0IGtlYmFiaWZ5ID0gKHN0cjogc3RyaW5nKSA9PiBzdHJcbiAgICAucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgXCIkMS0kMlwiKVxuICAgIC5yZXBsYWNlQWxsKFwiX1wiLCBcIi1cIilcbiAgICAudG9Mb3dlckNhc2UoKVxuXG50eXBlIFNpZ25hbERlY2xhcmF0aW9uID0ge1xuICAgIGZsYWdzPzogR09iamVjdC5TaWduYWxGbGFnc1xuICAgIGFjY3VtdWxhdG9yPzogR09iamVjdC5BY2N1bXVsYXRvclR5cGVcbiAgICByZXR1cm5fdHlwZT86IEdPYmplY3QuR1R5cGVcbiAgICBwYXJhbV90eXBlcz86IEFycmF5PEdPYmplY3QuR1R5cGU+XG59XG5cbnR5cGUgUHJvcGVydHlEZWNsYXJhdGlvbiA9XG4gICAgfCBJbnN0YW5jZVR5cGU8dHlwZW9mIEdPYmplY3QuUGFyYW1TcGVjPlxuICAgIHwgeyAkZ3R5cGU6IEdPYmplY3QuR1R5cGUgfVxuICAgIHwgdHlwZW9mIFN0cmluZ1xuICAgIHwgdHlwZW9mIE51bWJlclxuICAgIHwgdHlwZW9mIEJvb2xlYW5cbiAgICB8IHR5cGVvZiBPYmplY3RcblxudHlwZSBHT2JqZWN0Q29uc3RydWN0b3IgPSB7XG4gICAgW21ldGFdPzoge1xuICAgICAgICBQcm9wZXJ0aWVzPzogeyBba2V5OiBzdHJpbmddOiBHT2JqZWN0LlBhcmFtU3BlYyB9XG4gICAgICAgIFNpZ25hbHM/OiB7IFtrZXk6IHN0cmluZ106IEdPYmplY3QuU2lnbmFsRGVmaW5pdGlvbiB9XG4gICAgfVxuICAgIG5ldyguLi5hcmdzOiBhbnlbXSk6IGFueVxufVxuXG50eXBlIE1ldGFJbmZvID0gR09iamVjdC5NZXRhSW5mbzxuZXZlciwgQXJyYXk8eyAkZ3R5cGU6IEdPYmplY3QuR1R5cGUgfT4sIG5ldmVyPlxuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXIob3B0aW9uczogTWV0YUluZm8gPSB7fSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoY2xzOiBHT2JqZWN0Q29uc3RydWN0b3IpIHtcbiAgICAgICAgY29uc3QgdCA9IG9wdGlvbnMuVGVtcGxhdGVcbiAgICAgICAgaWYgKHR5cGVvZiB0ID09PSBcInN0cmluZ1wiICYmICF0LnN0YXJ0c1dpdGgoXCJyZXNvdXJjZTovL1wiKSAmJiAhdC5zdGFydHNXaXRoKFwiZmlsZTovL1wiKSkge1xuICAgICAgICAgICAgLy8gYXNzdW1lIHhtbCB0ZW1wbGF0ZVxuICAgICAgICAgICAgb3B0aW9ucy5UZW1wbGF0ZSA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh0KVxuICAgICAgICB9XG5cbiAgICAgICAgR09iamVjdC5yZWdpc3RlckNsYXNzKHtcbiAgICAgICAgICAgIFNpZ25hbHM6IHsgLi4uY2xzW21ldGFdPy5TaWduYWxzIH0sXG4gICAgICAgICAgICBQcm9wZXJ0aWVzOiB7IC4uLmNsc1ttZXRhXT8uUHJvcGVydGllcyB9LFxuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgfSwgY2xzKVxuXG4gICAgICAgIGRlbGV0ZSBjbHNbbWV0YV1cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9wZXJ0eShkZWNsYXJhdGlvbjogUHJvcGVydHlEZWNsYXJhdGlvbiA9IE9iamVjdCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBhbnksIHByb3A6IGFueSwgZGVzYz86IFByb3BlcnR5RGVzY3JpcHRvcikge1xuICAgICAgICB0YXJnZXQuY29uc3RydWN0b3JbbWV0YV0gPz89IHt9XG4gICAgICAgIHRhcmdldC5jb25zdHJ1Y3RvclttZXRhXS5Qcm9wZXJ0aWVzID8/PSB7fVxuXG4gICAgICAgIGNvbnN0IG5hbWUgPSBrZWJhYmlmeShwcm9wKVxuXG4gICAgICAgIGlmICghZGVzYykge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcCwge1xuICAgICAgICAgICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbcHJpdl0/Lltwcm9wXSA/PyBkZWZhdWx0VmFsdWUoZGVjbGFyYXRpb24pXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXQodjogYW55KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2ICE9PSB0aGlzW3Byb3BdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3ByaXZdID8/PSB7fVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1twcml2XVtwcm9wXSA9IHZcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5KG5hbWUpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgYHNldF8ke25hbWUucmVwbGFjZShcIi1cIiwgXCJfXCIpfWAsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSh2OiBhbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1twcm9wXSA9IHZcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgYGdldF8ke25hbWUucmVwbGFjZShcIi1cIiwgXCJfXCIpfWAsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbcHJvcF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgdGFyZ2V0LmNvbnN0cnVjdG9yW21ldGFdLlByb3BlcnRpZXNba2ViYWJpZnkocHJvcCldID0gcHNwZWMobmFtZSwgUGFyYW1GbGFncy5SRUFEV1JJVEUsIGRlY2xhcmF0aW9uKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGZsYWdzID0gMFxuICAgICAgICAgICAgaWYgKGRlc2MuZ2V0KSBmbGFncyB8PSBQYXJhbUZsYWdzLlJFQURBQkxFXG4gICAgICAgICAgICBpZiAoZGVzYy5zZXQpIGZsYWdzIHw9IFBhcmFtRmxhZ3MuV1JJVEFCTEVcblxuICAgICAgICAgICAgdGFyZ2V0LmNvbnN0cnVjdG9yW21ldGFdLlByb3BlcnRpZXNba2ViYWJpZnkocHJvcCldID0gcHNwZWMobmFtZSwgZmxhZ3MsIGRlY2xhcmF0aW9uKVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2lnbmFsKC4uLnBhcmFtczogQXJyYXk8eyAkZ3R5cGU6IEdPYmplY3QuR1R5cGUgfSB8IHR5cGVvZiBPYmplY3Q+KTpcbih0YXJnZXQ6IGFueSwgc2lnbmFsOiBhbnksIGRlc2M/OiBQcm9wZXJ0eURlc2NyaXB0b3IpID0+IHZvaWRcblxuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbChkZWNsYXJhdGlvbj86IFNpZ25hbERlY2xhcmF0aW9uKTpcbih0YXJnZXQ6IGFueSwgc2lnbmFsOiBhbnksIGRlc2M/OiBQcm9wZXJ0eURlc2NyaXB0b3IpID0+IHZvaWRcblxuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbChcbiAgICBkZWNsYXJhdGlvbj86IFNpZ25hbERlY2xhcmF0aW9uIHwgeyAkZ3R5cGU6IEdPYmplY3QuR1R5cGUgfSB8IHR5cGVvZiBPYmplY3QsXG4gICAgLi4ucGFyYW1zOiBBcnJheTx7ICRndHlwZTogR09iamVjdC5HVHlwZSB9IHwgdHlwZW9mIE9iamVjdD5cbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBhbnksIHNpZ25hbDogYW55LCBkZXNjPzogUHJvcGVydHlEZXNjcmlwdG9yKSB7XG4gICAgICAgIHRhcmdldC5jb25zdHJ1Y3RvclttZXRhXSA/Pz0ge31cbiAgICAgICAgdGFyZ2V0LmNvbnN0cnVjdG9yW21ldGFdLlNpZ25hbHMgPz89IHt9XG5cbiAgICAgICAgY29uc3QgbmFtZSA9IGtlYmFiaWZ5KHNpZ25hbClcblxuICAgICAgICBpZiAoZGVjbGFyYXRpb24gfHwgcGFyYW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVE9ETzogdHlwZSBhc3NlcnRcbiAgICAgICAgICAgIGNvbnN0IGFyciA9IFtkZWNsYXJhdGlvbiwgLi4ucGFyYW1zXS5tYXAodiA9PiB2LiRndHlwZSlcbiAgICAgICAgICAgIHRhcmdldC5jb25zdHJ1Y3RvclttZXRhXS5TaWduYWxzW25hbWVdID0ge1xuICAgICAgICAgICAgICAgIHBhcmFtX3R5cGVzOiBhcnIsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXQuY29uc3RydWN0b3JbbWV0YV0uU2lnbmFsc1tuYW1lXSA9IGRlY2xhcmF0aW9uIHx8IHtcbiAgICAgICAgICAgICAgICBwYXJhbV90eXBlczogW10sXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWRlc2MpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHNpZ25hbCwge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KG5hbWUsIC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBvZzogKCguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkgPSBkZXNjLnZhbHVlXG4gICAgICAgICAgICBkZXNjLnZhbHVlID0gZnVuY3Rpb24gKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBub3QgdHlwZWRcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQobmFtZSwgLi4uYXJncylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGBvbl8ke25hbWUucmVwbGFjZShcIi1cIiwgXCJfXCIpfWAsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZy5hcHBseSh0aGlzLCBhcmdzKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBwc3BlYyhuYW1lOiBzdHJpbmcsIGZsYWdzOiBudW1iZXIsIGRlY2xhcmF0aW9uOiBQcm9wZXJ0eURlY2xhcmF0aW9uKSB7XG4gICAgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgUGFyYW1TcGVjKVxuICAgICAgICByZXR1cm4gZGVjbGFyYXRpb25cblxuICAgIHN3aXRjaCAoZGVjbGFyYXRpb24pIHtcbiAgICAgICAgY2FzZSBTdHJpbmc6XG4gICAgICAgICAgICByZXR1cm4gUGFyYW1TcGVjLnN0cmluZyhuYW1lLCBcIlwiLCBcIlwiLCBmbGFncywgXCJcIilcbiAgICAgICAgY2FzZSBOdW1iZXI6XG4gICAgICAgICAgICByZXR1cm4gUGFyYW1TcGVjLmRvdWJsZShuYW1lLCBcIlwiLCBcIlwiLCBmbGFncywgLU51bWJlci5NQVhfVkFMVUUsIE51bWJlci5NQVhfVkFMVUUsIDApXG4gICAgICAgIGNhc2UgQm9vbGVhbjpcbiAgICAgICAgICAgIHJldHVybiBQYXJhbVNwZWMuYm9vbGVhbihuYW1lLCBcIlwiLCBcIlwiLCBmbGFncywgZmFsc2UpXG4gICAgICAgIGNhc2UgT2JqZWN0OlxuICAgICAgICAgICAgcmV0dXJuIFBhcmFtU3BlYy5qc29iamVjdChuYW1lLCBcIlwiLCBcIlwiLCBmbGFncylcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbWlzc3R5cGVkXG4gICAgICAgICAgICByZXR1cm4gUGFyYW1TcGVjLm9iamVjdChuYW1lLCBcIlwiLCBcIlwiLCBmbGFncywgZGVjbGFyYXRpb24uJGd0eXBlKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZGVmYXVsdFZhbHVlKGRlY2xhcmF0aW9uOiBQcm9wZXJ0eURlY2xhcmF0aW9uKSB7XG4gICAgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgUGFyYW1TcGVjKVxuICAgICAgICByZXR1cm4gZGVjbGFyYXRpb24uZ2V0X2RlZmF1bHRfdmFsdWUoKVxuXG4gICAgc3dpdGNoIChkZWNsYXJhdGlvbikge1xuICAgICAgICBjYXNlIFN0cmluZzpcbiAgICAgICAgICAgIHJldHVybiBcIlwiXG4gICAgICAgIGNhc2UgTnVtYmVyOlxuICAgICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgY2FzZSBCb29sZWFuOlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIGNhc2UgT2JqZWN0OlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG59XG4iLCAiaW1wb3J0IEd0ayBmcm9tIFwiZ2k6Ly9HdGs/dmVyc2lvbj00LjBcIlxuaW1wb3J0IHsgdHlwZSBCaW5kYWJsZUNoaWxkIH0gZnJvbSBcIi4vYXN0YWxpZnkuanNcIlxuaW1wb3J0IHsgbWVyZ2VCaW5kaW5ncywganN4IGFzIF9qc3ggfSBmcm9tIFwiLi4vX2FzdGFsLmpzXCJcbmltcG9ydCAqIGFzIFdpZGdldCBmcm9tIFwiLi93aWRnZXQuanNcIlxuXG5leHBvcnQgZnVuY3Rpb24gRnJhZ21lbnQoeyBjaGlsZHJlbiA9IFtdLCBjaGlsZCB9OiB7XG4gICAgY2hpbGQ/OiBCaW5kYWJsZUNoaWxkXG4gICAgY2hpbGRyZW4/OiBBcnJheTxCaW5kYWJsZUNoaWxkPlxufSkge1xuICAgIGlmIChjaGlsZCkgY2hpbGRyZW4ucHVzaChjaGlsZClcbiAgICByZXR1cm4gbWVyZ2VCaW5kaW5ncyhjaGlsZHJlbilcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGpzeChcbiAgICBjdG9yOiBrZXlvZiB0eXBlb2YgY3RvcnMgfCB0eXBlb2YgR3RrLldpZGdldCxcbiAgICBwcm9wczogYW55LFxuKSB7XG4gICAgcmV0dXJuIF9qc3goY3RvcnMsIGN0b3IgYXMgYW55LCBwcm9wcylcbn1cblxuY29uc3QgY3RvcnMgPSB7XG4gICAgYm94OiBXaWRnZXQuQm94LFxuICAgIGJ1dHRvbjogV2lkZ2V0LkJ1dHRvbixcbiAgICBjZW50ZXJib3g6IFdpZGdldC5DZW50ZXJCb3gsXG4gICAgLy8gY2lyY3VsYXJwcm9ncmVzczogV2lkZ2V0LkNpcmN1bGFyUHJvZ3Jlc3MsXG4gICAgLy8gZHJhd2luZ2FyZWE6IFdpZGdldC5EcmF3aW5nQXJlYSxcbiAgICBlbnRyeTogV2lkZ2V0LkVudHJ5LFxuICAgIGltYWdlOiBXaWRnZXQuSW1hZ2UsXG4gICAgbGFiZWw6IFdpZGdldC5MYWJlbCxcbiAgICBsZXZlbGJhcjogV2lkZ2V0LkxldmVsQmFyLFxuICAgIG92ZXJsYXk6IFdpZGdldC5PdmVybGF5LFxuICAgIHJldmVhbGVyOiBXaWRnZXQuUmV2ZWFsZXIsXG4gICAgc2xpZGVyOiBXaWRnZXQuU2xpZGVyLFxuICAgIHN0YWNrOiBXaWRnZXQuU3RhY2ssXG4gICAgc3dpdGNoOiBXaWRnZXQuU3dpdGNoLFxuICAgIHdpbmRvdzogV2lkZ2V0LldpbmRvdyxcbiAgICBtZW51YnV0dG9uOiBXaWRnZXQuTWVudUJ1dHRvbixcbiAgICBwb3BvdmVyOiBXaWRnZXQuUG9wb3Zlcixcbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG4gICAgbmFtZXNwYWNlIEpTWCB7XG4gICAgICAgIHR5cGUgRWxlbWVudCA9IEd0ay5XaWRnZXRcbiAgICAgICAgdHlwZSBFbGVtZW50Q2xhc3MgPSBHdGsuV2lkZ2V0XG4gICAgICAgIGludGVyZmFjZSBJbnRyaW5zaWNFbGVtZW50cyB7XG4gICAgICAgICAgICBib3g6IFdpZGdldC5Cb3hQcm9wc1xuICAgICAgICAgICAgYnV0dG9uOiBXaWRnZXQuQnV0dG9uUHJvcHNcbiAgICAgICAgICAgIGNlbnRlcmJveDogV2lkZ2V0LkNlbnRlckJveFByb3BzXG4gICAgICAgICAgICAvLyBjaXJjdWxhcnByb2dyZXNzOiBXaWRnZXQuQ2lyY3VsYXJQcm9ncmVzc1Byb3BzXG4gICAgICAgICAgICAvLyBkcmF3aW5nYXJlYTogV2lkZ2V0LkRyYXdpbmdBcmVhUHJvcHNcbiAgICAgICAgICAgIGVudHJ5OiBXaWRnZXQuRW50cnlQcm9wc1xuICAgICAgICAgICAgaW1hZ2U6IFdpZGdldC5JbWFnZVByb3BzXG4gICAgICAgICAgICBsYWJlbDogV2lkZ2V0LkxhYmVsUHJvcHNcbiAgICAgICAgICAgIGxldmVsYmFyOiBXaWRnZXQuTGV2ZWxCYXJQcm9wc1xuICAgICAgICAgICAgb3ZlcmxheTogV2lkZ2V0Lk92ZXJsYXlQcm9wc1xuICAgICAgICAgICAgcmV2ZWFsZXI6IFdpZGdldC5SZXZlYWxlclByb3BzXG4gICAgICAgICAgICBzbGlkZXI6IFdpZGdldC5TbGlkZXJQcm9wc1xuICAgICAgICAgICAgc3RhY2s6IFdpZGdldC5TdGFja1Byb3BzXG4gICAgICAgICAgICBzd2l0Y2g6IFdpZGdldC5Td2l0Y2hQcm9wc1xuICAgICAgICAgICAgd2luZG93OiBXaWRnZXQuV2luZG93UHJvcHNcbiAgICAgICAgICAgIG1lbnVidXR0b246IFdpZGdldC5NZW51QnV0dG9uUHJvcHNcbiAgICAgICAgICAgIHBvcG92ZXI6IFdpZGdldC5Qb3BvdmVyUHJvcHNcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGpzeHMgPSBqc3hcbiIsICJpbXBvcnQgeyBHTGliLCBWYXJpYWJsZSB9IGZyb20gXCJhc3RhbFwiO1xuaW1wb3J0IHsgR3RrIH0gZnJvbSBcImFzdGFsL2d0azRcIjtcblxuY29uc3QgVGltZSA9ICh7IGZvcm1hdCA9IFwiJWEsICVlLiVtICVIOiVNOiVTXCIgfSkgPT4ge1xuICAgIGNvbnN0IHRpbWUgPSBWYXJpYWJsZTxzdHJpbmc+KFwiXCIpLnBvbGwoXG4gICAgICAgIDEwMDAsXG4gICAgICAgICgpID0+IEdMaWIuRGF0ZVRpbWUubmV3X25vd19sb2NhbCgpLmZvcm1hdChmb3JtYXQpISxcbiAgICApO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPG1lbnVidXR0b25cbiAgICAgICAgICAgIGNzc0NsYXNzZXM9e1tcInRpbWVcIiwgXCJiYXItYnV0dG9uXCJdfVxuICAgICAgICAgICAgaGV4cGFuZFxuICAgICAgICAgICAgaGFsaWduPXtHdGsuQWxpZ24uQ0VOVEVSfVxuICAgICAgICA+XG4gICAgICAgICAgICA8bGFiZWwgb25EZXN0cm95PXsoKSA9PiB0aW1lLmRyb3AoKX0gbGFiZWw9e3RpbWUoKX0gaGFsaWduPXtHdGsuQWxpZ24uQ0VOVEVSfT48L2xhYmVsPlxuICAgICAgICAgICAgPHBvcG92ZXI+XG4gICAgICAgICAgICAgICAgPEd0ay5DYWxlbmRhciAvPlxuICAgICAgICAgICAgPC9wb3BvdmVyPlxuICAgICAgICA8L21lbnVidXR0b24+XG4gICAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBUaW1lLFxufTtcbiIsICJpbXBvcnQgeyBiaW5kIH0gZnJvbSBcImFzdGFsXCI7XG5pbXBvcnQgQXN0YWxCYXR0ZXJ5IGZyb20gXCJnaTovL0FzdGFsQmF0dGVyeVwiO1xuaW1wb3J0IEFzdGFsQmx1ZXRvb3RoIGZyb20gXCJnaTovL0FzdGFsQmx1ZXRvb3RoXCI7XG5pbXBvcnQgQXN0YWxOZXR3b3JrIGZyb20gXCJnaTovL0FzdGFsTmV0d29ya1wiO1xuaW1wb3J0IEFzdGFsV3AgZnJvbSBcImdpOi8vQXN0YWxXcFwiO1xuaW1wb3J0IHsgR3RrIH0gZnJvbSBcImFzdGFsL2d0azRcIjtcbmltcG9ydCBCcmlnaHRuZXNzIGZyb20gXCIuLi8uLi8uLi91dGlsL2JyaWdodG5lc3NcIjtcbmltcG9ydCBRdWlja0FjdGlvbnMgZnJvbSBcIi4uLy4uL1F1aWNrQWN0aW9ucy9RdWlja0FjdGlvbnNcIjtcblxuY29uc3QgU1RBVEUgPSBBc3RhbE5ldHdvcmsuRGV2aWNlU3RhdGU7XG5cbmNvbnN0IFF1aWNrVmlldyA9ICgpID0+IHtcbiAgICBjb25zdCBxYSA9IFF1aWNrQWN0aW9ucy5RdWlja0FjdGlvbnMoKTtcbiAgICBjb25zdCBzaG93UXVpY2tBY3Rpb25zID0gKCkgPT4ge1xuICAgICAgICBxYS5wb3B1cCgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBvbkNsaWNrZWQ9eygpID0+IHNob3dRdWlja0FjdGlvbnMoKX1cbiAgICAgICAgICAgIGNzc0NsYXNzZXM9e1tcInF1aWNrLWFjdGlvbi1idXR0b25cIl19XG4gICAgICAgICAgICBjaGlsZD17XG4gICAgICAgICAgICAgICAgPGJveD5cbiAgICAgICAgICAgICAgICAgICAgPEJhdHRlcnlXaWRnZXQ+PC9CYXR0ZXJ5V2lkZ2V0PlxuICAgICAgICAgICAgICAgICAgICA8QXVkaW8+PC9BdWRpbz5cbiAgICAgICAgICAgICAgICAgICAgPEJsdWV0b290aFdpZGdldD48L0JsdWV0b290aFdpZGdldD5cbiAgICAgICAgICAgICAgICAgICAgPE5ldHdvcmtXaWRnZXQ+PC9OZXR3b3JrV2lkZ2V0PlxuICAgICAgICAgICAgICAgICAgICA8QnJpZ2h0bmVzc1dpZGdldD48L0JyaWdodG5lc3NXaWRnZXQ+XG4gICAgICAgICAgICAgICAgICAgIDxpbWFnZSBpY29uTmFtZT17XCJzeXN0ZW0tc2h1dGRvd24tc3ltYm9saWNcIn0+PC9pbWFnZT5cbiAgICAgICAgICAgICAgICAgICAge3FhfVxuICAgICAgICAgICAgICAgIDwvYm94PlxuICAgICAgICAgICAgfVxuICAgICAgICA+PC9idXR0b24+XG4gICAgKTtcbn07XG5cbmNvbnN0IE5ldHdvcmtXaWRnZXQgPSAoKSA9PiB7XG4gICAgY29uc3QgbmV0d29yayA9IEFzdGFsTmV0d29yay5nZXRfZGVmYXVsdCgpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPGJveD5cbiAgICAgICAgICAgIDxpbWFnZVxuICAgICAgICAgICAgICAgIGljb25OYW1lPXtiaW5kKG5ldHdvcmssIFwic3RhdGVcIikuYXMoc3RhdGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT09IEFzdGFsTmV0d29yay5TdGF0ZS5DT05ORUNUSU5HKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJjaHJvbm9tZXRlci1yZXNldC1zeW1ib2xpY1wiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPT09IEFzdGFsTmV0d29yay5TdGF0ZS5DT05ORUNURURfTE9DQUwgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID09PSBBc3RhbE5ldHdvcmsuU3RhdGUuQ09OTkVDVEVEX1NJVEUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID09PSBBc3RhbE5ldHdvcmsuU3RhdGUuQ09OTkVDVEVEX0dMT0JBTFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIm5ldHdvcmstd2lyZWQtYWN0aXZhdGVkLXN5bWJvbGljXCI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJwYWludC11bmtub3duLXN5bWJvbGljXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICBjc3NDbGFzc2VzPXtbXCJuZXR3b3JrLXdpZGdldFwiLCBcInF1aWNrLXZpZXctc3ltYm9sXCJdfVxuICAgICAgICAgICAgICAgIHZpc2libGU9e2JpbmQobmV0d29yay53aWZpLCBcInN0YXRlXCIpLmFzKFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9PiBzdGF0ZSAhPT0gU1RBVEUuQUNUSVZBVEVELFxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA+PC9pbWFnZT5cbiAgICAgICAgICAgIDxpbWFnZVxuICAgICAgICAgICAgICAgIGljb25OYW1lPXtiaW5kKG5ldHdvcmsud2lmaSwgXCJzdGF0ZVwiKS5hcyhzdGF0ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gU1RBVEUuQUNUSVZBVEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV0d29yay53aWZpLmljb25OYW1lO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICBjc3NDbGFzc2VzPXtbXCJuZXR3b3JrLXdpZGdldFwiLCBcInF1aWNrLXZpZXctc3ltYm9sXCJdfVxuICAgICAgICAgICAgICAgIHZpc2libGU9e2JpbmQobmV0d29yay53aWZpLCBcInN0YXRlXCIpLmFzKFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9PiBzdGF0ZSA9PT0gU1RBVEUuQUNUSVZBVEVELFxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA+PC9pbWFnZT5cbiAgICAgICAgPC9ib3g+XG4gICAgKTtcbn07XG5cbmNvbnN0IEJsdWV0b290aFdpZGdldCA9ICgpID0+IHtcbiAgICBjb25zdCBibHVldG9vdGggPSBBc3RhbEJsdWV0b290aC5nZXRfZGVmYXVsdCgpO1xuICAgIGNvbnN0IGVuYWJsZWQgPSBiaW5kKGJsdWV0b290aC5hZGFwdGVyLCBcInBvd2VyZWRcIik7XG4gICAgY29uc3QgY29ubmVjdGVkID0gYmluZChibHVldG9vdGgsIFwiaXNDb25uZWN0ZWRcIik7XG5cbiAgICAvLyBGb3IgZWFjaCBjb25uZWN0ZWQgQlQgZGV2aWNlLCByZW5kZXIgc3RhdHVzXG4gICAgcmV0dXJuIChcbiAgICAgICAgPGJveD5cbiAgICAgICAgICAgIDxib3ggdmlzaWJsZT17ZW5hYmxlZC5hcyhlID0+IGUpfT5cbiAgICAgICAgICAgICAgICA8aW1hZ2VcbiAgICAgICAgICAgICAgICAgICAgaWNvbk5hbWU9e1wiYmx1ZXRvb3RoLWFjdGl2ZS1zeW1ib2xpY1wifVxuICAgICAgICAgICAgICAgICAgICB2aXNpYmxlPXtjb25uZWN0ZWQuYXMoYyA9PiBjKX1cbiAgICAgICAgICAgICAgICA+PC9pbWFnZT5cbiAgICAgICAgICAgICAgICA8aW1hZ2VcbiAgICAgICAgICAgICAgICAgICAgaWNvbk5hbWU9e1wiYmx1ZXRvb3RoLWRpc2Nvbm5lY3RlZC1zeW1ib2xpY1wifVxuICAgICAgICAgICAgICAgICAgICB2aXNpYmxlPXtjb25uZWN0ZWQuYXMoYyA9PiAhYyl9XG4gICAgICAgICAgICAgICAgPjwvaW1hZ2U+XG4gICAgICAgICAgICA8L2JveD5cbiAgICAgICAgICAgIDxpbWFnZVxuICAgICAgICAgICAgICAgIGljb25OYW1lPXtcImJsdWV0b290aC1kaXNhYmxlZC1zeW1ib2xpY1wifVxuICAgICAgICAgICAgICAgIHZpc2libGU9e2VuYWJsZWQuYXMoZSA9PiAhZSl9XG4gICAgICAgICAgICA+PC9pbWFnZT5cbiAgICAgICAgICAgIDxib3g+XG4gICAgICAgICAgICAgICAge2JpbmQoYmx1ZXRvb3RoLCBcImRldmljZXNcIikuYXMoZGV2aWNlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2VzLm1hcChkZXZpY2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Ym94IHZpc2libGU9e2JpbmQoZGV2aWNlLCBcImNvbm5lY3RlZFwiKS5hcyhjID0+IGMpfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uTmFtZT17YmluZChkZXZpY2UsIFwiaWNvblwiKS5hcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uID0+IGljb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pbWFnZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17YmluZChkZXZpY2UsIFwiYmF0dGVyeVBlcmNlbnRhZ2VcIikuYXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuICsgXCIlXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICA8L2JveD5cbiAgICAgICAgPC9ib3g+XG4gICAgKTtcbn07XG5cbmNvbnN0IEJhdHRlcnlXaWRnZXQgPSAoKSA9PiB7XG4gICAgY29uc3QgYmF0dGVyeSA9IEFzdGFsQmF0dGVyeS5nZXRfZGVmYXVsdCgpO1xuICAgIGlmIChiYXR0ZXJ5LmdldF9pc19wcmVzZW50KCkpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxpbWFnZVxuICAgICAgICAgICAgICAgIGljb25OYW1lPXtiaW5kKGJhdHRlcnksIFwiaWNvbk5hbWVcIikuYXMoaWNvbiA9PiBpY29uKX1cbiAgICAgICAgICAgICAgICBjc3NDbGFzc2VzPXtbXCJxdWljay12aWV3LXN5bWJvbFwiXX1cbiAgICAgICAgICAgID48L2ltYWdlPlxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiA8Ym94PjwvYm94PjtcbiAgICB9XG4gICAgLy8gRWxzZSwgbm8gYmF0dGVyeSBhdmFpbGFibGUgLT4gRG9uJ3Qgc2hvdyB0aGUgd2lkZ2V0XG59O1xuXG5jb25zdCBCcmlnaHRuZXNzV2lkZ2V0ID0gKCkgPT4ge1xuICAgIGNvbnN0IGJyaWdodG5lc3MgPSBCcmlnaHRuZXNzLmdldF9kZWZhdWx0KCk7XG4gICAgY29uc3Qgc2NyZWVuX2JyaWdodG5lc3MgPSBiaW5kKGJyaWdodG5lc3MsIFwic2NyZWVuXCIpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICBsYWJlbD17XCJcdUQ4M0NcdURGMjNcIiArIHNjcmVlbl9icmlnaHRuZXNzfVxuICAgICAgICAgICAgdmlzaWJsZT17YmluZChicmlnaHRuZXNzLCBcInNjcmVlbkF2YWlsYWJsZVwiKX1cbiAgICAgICAgICAgIGNzc0NsYXNzZXM9e1tcInF1aWNrLXZpZXctc3ltYm9sXCJdfVxuICAgICAgICA+PC9sYWJlbD5cbiAgICApO1xufTtcblxuY29uc3QgQXVkaW8gPSAoKSA9PiB7XG4gICAgY29uc3Qgd2lyZXBsdW1iZXIgPSBBc3RhbFdwLmdldF9kZWZhdWx0KCk7XG4gICAgaWYgKHdpcmVwbHVtYmVyKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8Ym94IG9yaWVudGF0aW9uPXtHdGsuT3JpZW50YXRpb24uSE9SSVpPTlRBTH0+XG4gICAgICAgICAgICAgICAgPGltYWdlXG4gICAgICAgICAgICAgICAgICAgIGljb25OYW1lPXtiaW5kKHdpcmVwbHVtYmVyLmRlZmF1bHRTcGVha2VyLCBcInZvbHVtZUljb25cIikuYXMoXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uID0+IGljb24sXG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIGNzc0NsYXNzZXM9e1tcInF1aWNrLXZpZXctc3ltYm9sXCJdfVxuICAgICAgICAgICAgICAgID48L2ltYWdlPlxuICAgICAgICAgICAgICAgIDxpbWFnZVxuICAgICAgICAgICAgICAgICAgICBpY29uTmFtZT17YmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpcmVwbHVtYmVyLmRlZmF1bHRNaWNyb3Bob25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ2b2x1bWVJY29uXCIsXG4gICAgICAgICAgICAgICAgICAgICkuYXMoaWNvbiA9PiBpY29uKX1cbiAgICAgICAgICAgICAgICAgICAgY3NzQ2xhc3Nlcz17W1wicXVpY2stdmlldy1zeW1ib2xcIl19XG4gICAgICAgICAgICAgICAgPjwvaW1hZ2U+XG4gICAgICAgICAgICA8L2JveD5cbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBwcmludChcbiAgICAgICAgICAgIFwiWyBXaXJlUGx1bWJlciBdIENvdWxkIG5vdCBjb25uZWN0LCBBdWRpbyBzdXBwb3J0IGluIGJhciB3aWxsIGJlIG1pc3NpbmdcIixcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIDxpbWFnZSBpY29uTmFtZT17XCJhY3Rpb24tdW5hdmFpbGFibGUtc3ltYm9saWNcIn0+PC9pbWFnZT47XG4gICAgfVxufTtcblxuLy8gY3NzQ2xhc3Nlcz17WyAncXVpY2stdmlldy1zeW1ib2wnIF19XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBRdWlja1ZpZXcsXG59O1xuIiwgImltcG9ydCBHT2JqZWN0LCB7IHJlZ2lzdGVyLCBwcm9wZXJ0eSB9IGZyb20gXCJhc3RhbC9nb2JqZWN0XCJcbmltcG9ydCB7IG1vbml0b3JGaWxlLCByZWFkRmlsZUFzeW5jIH0gZnJvbSBcImFzdGFsL2ZpbGVcIlxuaW1wb3J0IHsgZXhlYywgZXhlY0FzeW5jIH0gZnJvbSBcImFzdGFsL3Byb2Nlc3NcIlxuXG5jb25zdCBnZXQgPSAoYXJnczogc3RyaW5nKSA9PiBOdW1iZXIoZXhlYyhgYnJpZ2h0bmVzc2N0bCAke2FyZ3N9YCkpXG5jb25zdCBzY3JlZW4gPSBleGVjKGBiYXNoIC1jIFwibHMgLXcxIC9zeXMvY2xhc3MvYmFja2xpZ2h0IHwgaGVhZCAtMVwiYClcbmNvbnN0IGtiZCA9IGV4ZWMoYGJhc2ggLWMgXCJscyAtdzEgL3N5cy9jbGFzcy9sZWRzIHwgaGVhZCAtMVwiYClcblxuQHJlZ2lzdGVyKHsgR1R5cGVOYW1lOiBcIkJyaWdodG5lc3NcIiB9KVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnJpZ2h0bmVzcyBleHRlbmRzIEdPYmplY3QuT2JqZWN0IHtcbiAgICBzdGF0aWMgaW5zdGFuY2U6IEJyaWdodG5lc3NcbiAgICBzdGF0aWMgZ2V0X2RlZmF1bHQoKSB7XG4gICAgICAgIGlmICghdGhpcy5pbnN0YW5jZSlcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UgPSBuZXcgQnJpZ2h0bmVzcygpXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZVxuICAgIH1cblxuICAgICNrYmRNYXggPSBnZXQoYC0tZGV2aWNlICR7a2JkfSBtYXhgKVxuICAgICNrYmQgPSBnZXQoYC0tZGV2aWNlICR7a2JkfSBnZXRgKVxuICAgICNzY3JlZW5NYXggPSBnZXQoXCJtYXhcIilcbiAgICAjc2NyZWVuID0gZ2V0KFwiZ2V0XCIpIC8gKGdldChcIm1heFwiKSB8fCAxKVxuICAgICNzY3JlZW5BdmFpbGFibGUgPSBmYWxzZVxuXG4gICAgQHByb3BlcnR5KEJvb2xlYW4pXG4gICAgZ2V0IHNjcmVlbkF2YWlsYWJsZSgpIHsgcmV0dXJuIHRoaXMuI3NjcmVlbkF2YWlsYWJsZSB9XG5cbiAgICBAcHJvcGVydHkoTnVtYmVyKVxuICAgIGdldCBrYmQoKSB7IHJldHVybiB0aGlzLiNrYmQgfVxuXG4gICAgc2V0IGtiZCh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gdGhpcy4ja2JkTWF4KVxuICAgICAgICAgICAgcmV0dXJuXG5cbiAgICAgICAgZXhlY0FzeW5jKGBicmlnaHRuZXNzY3RsIC1kICR7a2JkfSBzICR7dmFsdWV9IC1xYCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLiNrYmQgPSB2YWx1ZVxuICAgICAgICAgICAgdGhpcy5ub3RpZnkoXCJrYmRcIilcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBAcHJvcGVydHkoTnVtYmVyKVxuICAgIGdldCBzY3JlZW4oKSB7IHJldHVybiB0aGlzLiNzY3JlZW4gfVxuXG4gICAgc2V0IHNjcmVlbihwZXJjZW50KSB7XG4gICAgICAgIGlmIChwZXJjZW50IDwgMClcbiAgICAgICAgICAgIHBlcmNlbnQgPSAwXG5cbiAgICAgICAgaWYgKHBlcmNlbnQgPiAxKVxuICAgICAgICAgICAgcGVyY2VudCA9IDFcblxuICAgICAgICBleGVjQXN5bmMoYGJyaWdodG5lc3NjdGwgc2V0ICR7TWF0aC5mbG9vcihwZXJjZW50ICogMTAwKX0lIC1xYCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLiNzY3JlZW4gPSBwZXJjZW50XG4gICAgICAgICAgICB0aGlzLm5vdGlmeShcInNjcmVlblwiKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpXG5cbiAgICAgICAgY29uc3Qgc2NyZWVuUGF0aCA9IGAvc3lzL2NsYXNzL2JhY2tsaWdodC8ke3NjcmVlbn0vYnJpZ2h0bmVzc2BcbiAgICAgICAgY29uc3Qga2JkUGF0aCA9IGAvc3lzL2NsYXNzL2xlZHMvJHtrYmR9L2JyaWdodG5lc3NgXG5cbiAgICAgICAgbW9uaXRvckZpbGUoc2NyZWVuUGF0aCwgYXN5bmMgZiA9PiB7XG4gICAgICAgICAgICBjb25zdCB2ID0gYXdhaXQgcmVhZEZpbGVBc3luYyhmKVxuICAgICAgICAgICAgdGhpcy4jc2NyZWVuID0gTnVtYmVyKHYpIC8gdGhpcy4jc2NyZWVuTWF4XG4gICAgICAgICAgICB0aGlzLm5vdGlmeShcInNjcmVlblwiKVxuICAgICAgICB9KVxuXG4gICAgICAgIG1vbml0b3JGaWxlKGtiZFBhdGgsIGFzeW5jIGYgPT4ge1xuICAgICAgICAgICAgY29uc3QgdiA9IGF3YWl0IHJlYWRGaWxlQXN5bmMoZilcbiAgICAgICAgICAgIHRoaXMuI2tiZCA9IE51bWJlcih2KSAvIHRoaXMuI2tiZE1heFxuICAgICAgICAgICAgdGhpcy5ub3RpZnkoXCJrYmRcIilcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIHNjcmVlbiBhdmFpbGFibGVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGdldCggJ2cgLWMgYmFja2xpZ2h0JyApO1xuICAgICAgICB9IGNhdGNoICggXyApIHtcbiAgICAgICAgICAgIHRoaXMuI3NjcmVlbkF2YWlsYWJsZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7IGV4ZWMgfSBmcm9tIFwiYXN0YWxcIjtcbmltcG9ydCB7IEd0ayB9IGZyb20gXCJhc3RhbC9ndGs0XCI7XG5cbmNvbnN0IFBvd2VyTWVudSA9ICgpOiBHdGsuUG9wb3ZlciA9PiB7XG4gICAgY29uc3QgcG9wb3ZlciA9IG5ldyBHdGsuUG9wb3Zlcih7IGNzc0NsYXNzZXM6IFtcIlBvd2VyTWVudVwiXSB9KTtcblxuICAgIGNvbnN0IHBvd2VyTWVudUJveCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxib3g+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjc3NDbGFzc2VzPXtbXCJwb3dlci1idXR0b25cIl19XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkPXtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWFnZSBpY29uTmFtZT17XCJzeXN0ZW0tc2h1dGRvd24tc3ltYm9saWNcIn0+PC9pbWFnZT5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrZWQ9eygpID0+IGV4ZWMoXCIvYmluL3NoIC1jICdzaHV0ZG93biBub3cnXCIpfVxuICAgICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNzc0NsYXNzZXM9e1tcInBvd2VyLWJ1dHRvblwiXX1cbiAgICAgICAgICAgICAgICAgICAgY2hpbGQ9ezxpbWFnZSBpY29uTmFtZT17XCJzeXN0ZW0tcmVib290LXN5bWJvbGljXCJ9PjwvaW1hZ2U+fVxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrZWQ9eygpID0+IGV4ZWMoXCIvYmluL3NoIC1jICdyZWJvb3QnXCIpfVxuICAgICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNzc0NsYXNzZXM9e1tcInBvd2VyLWJ1dHRvblwiXX1cbiAgICAgICAgICAgICAgICAgICAgY2hpbGQ9ezxpbWFnZSBpY29uTmFtZT17XCJzeXN0ZW0tc3VzcGVuZC1zeW1ib2xpY1wifT48L2ltYWdlPn1cbiAgICAgICAgICAgICAgICAgICAgb25DbGlja2VkPXsoKSA9PiBleGVjKFwiL2Jpbi9zaCAtYyAnc3lzdGVtY3RsIHN1c3BlbmQnXCIpfVxuICAgICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIDwvYm94PlxuICAgICAgICApO1xuICAgIH07XG5cbiAgICBwb3BvdmVyLnNldF9jaGlsZChwb3dlck1lbnVCb3goKSk7XG4gICAgcmV0dXJuIHBvcG92ZXI7XG59O1xuXG5jb25zdCBQb3dlciA9ICgpID0+IHtcbiAgICBjb25zdCBwbSA9IFBvd2VyTWVudSgpO1xuICAgIHJldHVybiAoXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHdpZHRoUmVxdWVzdD17MH1cbiAgICAgICAgICAgIGhleHBhbmQ9e2ZhbHNlfVxuICAgICAgICAgICAgdmV4cGFuZD17ZmFsc2V9XG4gICAgICAgICAgICBjc3NDbGFzc2VzPXtbXCJwb3dlci1tZW51LWJ1dHRvblwiXX1cbiAgICAgICAgICAgIGNoaWxkPXtcbiAgICAgICAgICAgICAgICA8Ym94PlxuICAgICAgICAgICAgICAgICAgICA8aW1hZ2UgaWNvbk5hbWU9e1wic3lzdGVtLXNodXRkb3duLXN5bWJvbGljXCJ9PjwvaW1hZ2U+XG4gICAgICAgICAgICAgICAgICAgIHtwbX1cbiAgICAgICAgICAgICAgICA8L2JveD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9uQ2xpY2tlZD17KCkgPT4gcG0ucG9wdXAoKX1cbiAgICAgICAgLz5cbiAgICApO1xufTtcblxuY29uc3QgVXNlck1lbnUgPSAoKTogR3RrLlBvcG92ZXIgPT4ge1xuICAgIGNvbnN0IHBvcG92ZXIgPSBuZXcgR3RrLlBvcG92ZXIoKTtcblxuICAgIGNvbnN0IHBvd2VyTWVudUJveCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxib3g+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjc3NDbGFzc2VzPXtbXCJwb3dlci1idXR0b25cIl19XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkPXtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWFnZSBpY29uTmFtZT17XCJzeXN0ZW0tbG9jay1zY3JlZW4tc3ltYm9saWNcIn0+PC9pbWFnZT5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrZWQ9eygpID0+IGV4ZWMoXCIvYmluL3NoIC1jICdoeXBybG9jaydcIil9XG4gICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgY3NzQ2xhc3Nlcz17W1wicG93ZXItYnV0dG9uXCJdfVxuICAgICAgICAgICAgICAgICAgICBjaGlsZD17PGltYWdlIGljb25OYW1lPXtcInN5c3RlbS1sb2ctb3V0LXN5bWJvbGljXCJ9PjwvaW1hZ2U+fVxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrZWQ9eygpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjKFwiL2Jpbi9zaCAtYyAnaHlwcmN0bCBkaXNwYXRjaCBleGl0IDAnXCIpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8L2JveD5cbiAgICAgICAgKTtcbiAgICB9O1xuXG4gICAgcG9wb3Zlci5zZXRfY2hpbGQocG93ZXJNZW51Qm94KCkpO1xuICAgIHJldHVybiBwb3BvdmVyO1xufTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIFBvd2VyLFxuICAgIFVzZXJNZW51XG59O1xuIiwgImltcG9ydCB7IGJpbmQsIEJpbmRpbmcgfSBmcm9tIFwiYXN0YWxcIjtcbmltcG9ydCB7IEd0ayB9IGZyb20gXCJhc3RhbC9ndGs0XCI7XG5pbXBvcnQgQXN0YWxXcCBmcm9tIFwiZ2k6Ly9Bc3RhbFdwXCI7XG5cbmNvbnN0IHdwID0gQXN0YWxXcC5nZXRfZGVmYXVsdCgpITtcblxuY29uc3QgQXVkaW9Nb2R1bGUgPSAoKSA9PiB7XG4gICAgY29uc3Qgc2V0Vm9sdW1lU3BlYWtlciA9ICh2b2x1bWU6IG51bWJlcikgPT4ge1xuICAgICAgICB3cC5kZWZhdWx0U3BlYWtlci5zZXRfdm9sdW1lKHZvbHVtZSAvIDEwMCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHNldFZvbHVtZU1pY3JvcGhvbmUgPSAodm9sdW1lOiBudW1iZXIpID0+IHtcbiAgICAgICAgd3AuZGVmYXVsdE1pY3JvcGhvbmUuc2V0X3ZvbHVtZSh2b2x1bWUgLyAxMDApO1xuICAgIH07XG5cbiAgICBjb25zdCBzcGVha2VyU2VsZWN0b3IgPSBTaW5rU2VsZWN0UG9wb3ZlcihBc3RhbFdwLk1lZGlhQ2xhc3MuQVVESU9fU1BFQUtFUik7XG4gICAgY29uc3QgbWljU2VsZWN0b3IgPSBTaW5rU2VsZWN0UG9wb3ZlcihBc3RhbFdwLk1lZGlhQ2xhc3MuQVVESU9fTUlDUk9QSE9ORSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8Ym94IGNzc0NsYXNzZXM9e1tcImF1ZGlvLWJveFwiXX0gdmVydGljYWw+XG4gICAgICAgICAgICA8Ym94IGhleHBhbmQgdmV4cGFuZD5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2tlZD17KCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHdwLmRlZmF1bHRTcGVha2VyLnNldF9tdXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICF3cC5kZWZhdWx0U3BlYWtlci5nZXRfbXV0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXBUZXh0PXtcIk11dGUgYXVkaW8gb3V0cHV0XCJ9XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkPXtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25OYW1lPXtiaW5kKHdwLmRlZmF1bHRTcGVha2VyLCBcInZvbHVtZUljb25cIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luRW5kPXszfVxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaW1hZ2U+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsPXtiaW5kKHdwLmRlZmF1bHRTcGVha2VyLCBcInZvbHVtZVwiKS5hcyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHYgPT4gTWF0aC5yb3VuZCgxMDAgKiB2KSArIFwiJVwiLFxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgID48L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxzbGlkZXJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2JpbmQod3AuZGVmYXVsdFNwZWFrZXIsIFwidm9sdW1lXCIpLmFzKHYgPT4gMTAwICogdil9XG4gICAgICAgICAgICAgICAgICAgIG1heD17MTAwfVxuICAgICAgICAgICAgICAgICAgICBtaW49ezB9XG4gICAgICAgICAgICAgICAgICAgIHN0ZXA9ezF9XG4gICAgICAgICAgICAgICAgICAgIGhleHBhbmRcbiAgICAgICAgICAgICAgICAgICAgdmV4cGFuZFxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZVZhbHVlPXtzZWxmID0+IHNldFZvbHVtZVNwZWFrZXIoc2VsZi52YWx1ZSl9XG4gICAgICAgICAgICAgICAgPjwvc2xpZGVyPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgY3NzQ2xhc3Nlcz17W1wic2luay1zZWxlY3QtYnV0dG9uXCJdfVxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwVGV4dD17XCJQaWNrIGF1ZGlvIG91dHB1dFwifVxuICAgICAgICAgICAgICAgICAgICBjaGlsZD17XG4gICAgICAgICAgICAgICAgICAgICAgICA8Ym94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWFnZSBpY29uTmFtZT17XCJzcGVha2VyLXN5bWJvbGljXCJ9PjwvaW1hZ2U+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3NwZWFrZXJTZWxlY3Rvcn1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYm94PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2tlZD17KCkgPT4gc3BlYWtlclNlbGVjdG9yLnBvcHVwKCl9XG4gICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9ib3g+XG4gICAgICAgICAgICA8Ym94IGhleHBhbmQgdmV4cGFuZD5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2tlZD17KCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHdwLmRlZmF1bHRNaWNyb3Bob25lLnNldF9tdXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICF3cC5kZWZhdWx0TWljcm9waG9uZS5nZXRfbXV0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXBUZXh0PXtcIk11dGUgYXVkaW8gaW5wdXRcIn1cbiAgICAgICAgICAgICAgICAgICAgY2hpbGQ9e1xuICAgICAgICAgICAgICAgICAgICAgICAgPGltYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbk5hbWU9e2JpbmQod3AuZGVmYXVsdE1pY3JvcGhvbmUsIFwidm9sdW1lSWNvblwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW5FbmQ9ezN9XG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pbWFnZT5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9e2JpbmQod3AuZGVmYXVsdE1pY3JvcGhvbmUsIFwidm9sdW1lXCIpLmFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgdiA9PiBNYXRoLnJvdW5kKDEwMCAqIHYpICsgXCIlXCIsXG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPHNsaWRlclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17YmluZCh3cC5kZWZhdWx0TWljcm9waG9uZSwgXCJ2b2x1bWVcIikuYXMoXG4gICAgICAgICAgICAgICAgICAgICAgICB2ID0+IDEwMCAqIHYsXG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIG1heD17MTAwfVxuICAgICAgICAgICAgICAgICAgICBtaW49ezB9XG4gICAgICAgICAgICAgICAgICAgIHN0ZXA9ezF9XG4gICAgICAgICAgICAgICAgICAgIGhleHBhbmRcbiAgICAgICAgICAgICAgICAgICAgdmV4cGFuZFxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZVZhbHVlPXtzZWxmID0+IHNldFZvbHVtZU1pY3JvcGhvbmUoc2VsZi52YWx1ZSl9XG4gICAgICAgICAgICAgICAgPjwvc2xpZGVyPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgY3NzQ2xhc3Nlcz17W1wic2luay1zZWxlY3QtYnV0dG9uXCJdfVxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwVGV4dD17XCJTZWxlY3QgYXVkaW8gaW5wdXRcIn1cbiAgICAgICAgICAgICAgICAgICAgY2hpbGQ9e1xuICAgICAgICAgICAgICAgICAgICAgICAgPGJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1hZ2UgaWNvbk5hbWU9e1wibWljcm9waG9uZVwifT48L2ltYWdlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHttaWNTZWxlY3Rvcn1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYm94PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2tlZD17KCkgPT4gbWljU2VsZWN0b3IucG9wdXAoKX1cbiAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8L2JveD5cbiAgICAgICAgPC9ib3g+XG4gICAgKTtcbn07XG5cbmNvbnN0IFNpbmtQaWNrZXIgPSAodHlwZTogQXN0YWxXcC5NZWRpYUNsYXNzKSA9PiB7XG4gICAgY29uc3QgZGV2aWNlcyA9IGJpbmQod3AsIFwiZW5kcG9pbnRzXCIpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPGJveCB2ZXJ0aWNhbD5cbiAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgIGxhYmVsPXtgQXZhaWxhYmxlIEF1ZGlvICR7dHlwZSA9PT0gQXN0YWxXcC5NZWRpYUNsYXNzLkFVRElPX1NQRUFLRVIgPyBcIk91dHB1dFwiIDogdHlwZSA9PT0gQXN0YWxXcC5NZWRpYUNsYXNzLkFVRElPX01JQ1JPUEhPTkUgPyBcIklucHV0XCIgOiBcIlwifSBEZXZpY2VzYH1cbiAgICAgICAgICAgID48L2xhYmVsPlxuICAgICAgICAgICAgPEd0ay5TZXBhcmF0b3IgbWFyZ2luQm90dG9tPXs1fSBtYXJnaW5Ub3A9ezN9PjwvR3RrLlNlcGFyYXRvcj5cbiAgICAgICAgICAgIDxib3ggdmVydGljYWwgY3NzQ2xhc3Nlcz17W1wic2luay1waWNrZXJcIl19PlxuICAgICAgICAgICAgICAgIHtkZXZpY2VzLmFzKGQgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZC5tYXAoZGV2aWNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2UuZ2V0X21lZGlhX2NsYXNzKCkgIT09IHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPGJveCBjc3NDbGFzc2VzPXtbICdlbXB0eScgXX0+PC9ib3g+O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzc0NsYXNzZXM9e2JpbmQoZGV2aWNlLCBcImlkXCIpLmFzKGlkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3RhbFdwLk1lZGlhQ2xhc3MuQVVESU9fU1BFQUtFUlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHdwLmRlZmF1bHRTcGVha2VyLmlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdHlwZSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzdGFsV3AuTWVkaWFDbGFzc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BVURJT19NSUNST1BIT05FXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB3cC5kZWZhdWx0TWljcm9waG9uZS5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwic2luay1vcHRpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjdXJyZW50bHktc2VsZWN0ZWQtc2luay1vcHRpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1wic2luay1vcHRpb25cIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZD17XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Ym94IGhhbGlnbj17R3RrLkFsaWduLlNUQVJUfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1hZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbk5hbWU9e2JpbmQoZGV2aWNlLCBcImljb25cIikuYXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uID0+IGljb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbkVuZD17M31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pbWFnZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e2JpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuYXModCA9PiB0ID8/IFwiXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGlja2VkPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Uuc2V0X2lzX2RlZmF1bHQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICA8L2JveD5cbiAgICAgICAgPC9ib3g+XG4gICAgKTtcbn07XG5cbmNvbnN0IFNpbmtTZWxlY3RQb3BvdmVyID0gKHR5cGU6IEFzdGFsV3AuTWVkaWFDbGFzcykgPT4ge1xuICAgIGNvbnN0IHBvcG92ZXIgPSBuZXcgR3RrLlBvcG92ZXIoKTtcblxuICAgIHBvcG92ZXIuc2V0X2NoaWxkKFNpbmtQaWNrZXIodHlwZSkpO1xuXG4gICAgcmV0dXJuIHBvcG92ZXI7XG59O1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgQXVkaW9Nb2R1bGUsXG59O1xuIiwgImltcG9ydCB7IGJpbmQsIHJlYWRGaWxlLCB3cml0ZUZpbGUgfSBmcm9tIFwiYXN0YWxcIjtcbmltcG9ydCB7IEd0ayB9IGZyb20gXCJhc3RhbC9ndGs0XCI7XG5pbXBvcnQgQXN0YWxCbHVldG9vdGggZnJvbSBcImdpOi8vQXN0YWxCbHVldG9vdGhcIjtcbmltcG9ydCBCVERldmljZSBmcm9tIFwiLi9EZXZpY2VcIjtcbmNvbnN0IEFMSUdOID0gR3RrLkFsaWduO1xuXG5jb25zdCBidCA9IEFzdGFsQmx1ZXRvb3RoLmdldF9kZWZhdWx0KCk7XG5cbmNvbnN0IEJsdWV0b290aE1vZHVsZSA9ICgpID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgICA8Ym94PlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNzc0NsYXNzZXM9e2JpbmQoYnQuYWRhcHRlciwgXCJwb3dlcmVkXCIpLmFzKHBvd2VyZWQgPT5cbiAgICAgICAgICAgICAgICAgICAgcG93ZXJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBbXCJ0b2dnbGUtYnV0dG9uXCIsIFwidG9nZ2xlLW9uXCJdXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFtcInRvZ2dsZS1idXR0b25cIl0sXG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICBvbkNsaWNrZWQ9eygpID0+XG4gICAgICAgICAgICAgICAgICAgIGJ0LmFkYXB0ZXIuc2V0X3Bvd2VyZWQoIWJ0LmFkYXB0ZXIuZ2V0X3Bvd2VyZWQoKSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2hpbGQ9e1xuICAgICAgICAgICAgICAgICAgICA8Ym94IHZlcnRpY2FsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NzQ2xhc3Nlcz17W1widGl0bGUtMlwiXX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17XCJCbHVldG9vdGhcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxpZ249e0FMSUdOLkNFTlRFUn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZ249e0FMSUdOLkNFTlRFUn1cbiAgICAgICAgICAgICAgICAgICAgICAgID48L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJveCBoYWxpZ249e0FMSUdOLkNFTlRFUn0gdmFsaWduPXtBTElHTi5DRU5URVJ9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlPXtiaW5kKGJ0LmFkYXB0ZXIsIFwicG93ZXJlZFwiKS5hcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPT4gIXAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwiRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlPXtiaW5kKGJ0LmFkYXB0ZXIsIFwicG93ZXJlZFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e2JpbmQoYnQsIFwiZGV2aWNlc1wiKS5hcyhkZXZpY2VzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLmZvckVhY2goZGV2aWNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlLmNvbm5lY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBPbiAoJHtjb3VudH0gJHtjb3VudCA9PT0gMSA/IFwiY2xpZW50XCIgOiBcImNsaWVudHNcIn0gY29ubmVjdGVkKWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9ib3g+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNzc0NsYXNzZXM9e1tcImFjdGlvbnMtYnV0dG9uXCJdfVxuICAgICAgICAgICAgICAgIHZpc2libGU9e2JpbmQoYnQuYWRhcHRlciwgXCJwb3dlcmVkXCIpfVxuICAgICAgICAgICAgICAgIGNoaWxkPXtcbiAgICAgICAgICAgICAgICAgICAgPGJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWFnZSBpY29uTmFtZT17XCJhcnJvdy1yaWdodC1zeW1ib2xpY1wifT48L2ltYWdlPlxuICAgICAgICAgICAgICAgICAgICAgICAge3BpY2tlcn1cbiAgICAgICAgICAgICAgICAgICAgPC9ib3g+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRvb2x0aXBUZXh0PXtcIlZpZXcgYXZhaWxhYmxlIGRldmljZXNcIn1cbiAgICAgICAgICAgICAgICBvbkNsaWNrZWQ9eygpID0+IG9wZW5CVFBpY2tlcigpfVxuICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICA8L2JveD5cbiAgICApO1xufTtcblxuY29uc3Qgb3BlbkJUUGlja2VyID0gKCkgPT4ge1xuICAgIHBpY2tlci5wb3B1cCgpO1xuICAgIHRyeSB7XG4gICAgICAgIGJ0LmFkYXB0ZXIuc3RhcnRfZGlzY292ZXJ5KCk7XG4gICAgfSBjYXRjaCAoXykge31cbn07XG5cbmNvbnN0IEJsdWV0b290aFBpY2tlckxpc3QgPSAoKSA9PiB7XG4gICAgbGV0IGJ0RW5hYmxlU3RhdGUgPSByZWFkRmlsZShgJHtEQVRBRElSfS4vYnRjb25mYCkgPT09IFwidHJ1ZVwiID8gdHJ1ZSA6IGZhbHNlO1xuICAgIGJ0LmFkYXB0ZXIuc2V0X3Bvd2VyZWQoYnRFbmFibGVTdGF0ZSk7XG5cbiAgICBjb25zdCB1cGRhdGVTdGF0ZSA9ICgpID0+IHtcbiAgICAgICAgYnRFbmFibGVTdGF0ZSA9ICFidEVuYWJsZVN0YXRlO1xuICAgICAgICB3cml0ZUZpbGUoXCIuL2J0Y29uZlwiLCBcIlwiICsgYnRFbmFibGVTdGF0ZSk7XG4gICAgfTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxib3hcbiAgICAgICAgICAgIHZlcnRpY2FsXG4gICAgICAgICAgICBvbkRlc3Ryb3k9eygpID0+IGJ0LmFkYXB0ZXIuc3RvcF9kaXNjb3ZlcnkoKX1cbiAgICAgICAgICAgIGNzc0NsYXNzZXM9e1tcInBvcG92ZXItYm94XCJdfVxuICAgICAgICA+XG4gICAgICAgICAgICA8bGFiZWwgY3NzQ2xhc3Nlcz17W1widGl0bGVcIl19IGxhYmVsPXtcIkJsdWV0b290aFwifT48L2xhYmVsPlxuICAgICAgICAgICAgPEd0ay5TZXBhcmF0b3IgbWFyZ2luVG9wPXszfSBtYXJnaW5Cb3R0b209ezV9PjwvR3RrLlNlcGFyYXRvcj5cbiAgICAgICAgICAgIDxjZW50ZXJib3hcbiAgICAgICAgICAgICAgICBzdGFydFdpZGdldD17PGxhYmVsIGxhYmVsPXtcIlR1cm4gb24gYXQgc3RhcnR1cFwifT48L2xhYmVsPn1cbiAgICAgICAgICAgICAgICBlbmRXaWRnZXQ9e1xuICAgICAgICAgICAgICAgICAgICA8c3dpdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZ249e0FMSUdOLkVORH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbGlnbj17QUxJR04uRU5EfVxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlPXtidEVuYWJsZVN0YXRlfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25CdXR0b25QcmVzc2VkPXsoKSA9PiB1cGRhdGVTdGF0ZSgpfVxuICAgICAgICAgICAgICAgICAgICA+PC9zd2l0Y2g+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPjwvY2VudGVyYm94PlxuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgbWFyZ2luVG9wPXsxMH1cbiAgICAgICAgICAgICAgICBsYWJlbD17XCJDb25uZWN0ZWQgJiBUcnVzdGVkIGRldmljZXNcIn1cbiAgICAgICAgICAgICAgICBjc3NDbGFzc2VzPXtbXCJ0aXRsZS0yXCJdfVxuICAgICAgICAgICAgPjwvbGFiZWw+XG4gICAgICAgICAgICA8R3RrLlNlcGFyYXRvciBtYXJnaW5Ub3A9ezN9IG1hcmdpbkJvdHRvbT17NX0+PC9HdGsuU2VwYXJhdG9yPlxuICAgICAgICAgICAgPGJveCB2ZXJ0aWNhbCBjc3NDbGFzc2VzPXtbXCJkZXZpY2VzLWxpc3RcIl19PlxuICAgICAgICAgICAgICAgIHtiaW5kKGJ0LCBcImRldmljZXNcIikuYXMoZGV2aWNlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGRldmljZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRldmljZS5nZXRfY29ubmVjdGVkKCkgfHwgZGV2aWNlLmdldF9wYWlyZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKGRldmljZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxCVERldmljZSBkZXZpY2U9e2RldmljZX0+PC9CVERldmljZT47XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIDwvYm94PlxuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgdmlzaWJsZT17YmluZChidCwgXCJkZXZpY2VzXCIpLmFzKGRldmljZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy5maWx0ZXIoZGV2aWNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlLmdldF9jb25uZWN0ZWQoKSB8fCBkZXZpY2UuZ2V0X3BhaXJlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkubGVuZ3RoID09PSAwXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgbGFiZWw9e1wiTm8gY29ubmVjdGVkIC8gdHJ1c3RlZCBkZXZpY2VzXCJ9XG4gICAgICAgICAgICAgICAgY3NzQ2xhc3Nlcz17W1wiYnQtbm8tZm91bmRcIiwgXCJidC1jb25uLWxpc3RcIl19XG4gICAgICAgICAgICA+PC9sYWJlbD5cbiAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgIGxhYmVsPXtcIkRpc2NvdmVyZWQgYmx1ZXRvb3RoIGRldmljZXNcIn1cbiAgICAgICAgICAgICAgICBjc3NDbGFzc2VzPXtbXCJ0aXRsZS0yXCJdfVxuICAgICAgICAgICAgPjwvbGFiZWw+XG4gICAgICAgICAgICA8R3RrLlNlcGFyYXRvciBtYXJnaW5Cb3R0b209ezV9IG1hcmdpblRvcD17M30+PC9HdGsuU2VwYXJhdG9yPlxuICAgICAgICAgICAgPGJveCB2ZXJ0aWNhbD5cbiAgICAgICAgICAgICAgICB7YmluZChidCwgXCJkZXZpY2VzXCIpLmFzKGRldmljZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGEuZ2V0X2Nvbm5lY3RlZCgpICYmICFkYXRhLmdldF9wYWlyZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChkZXZpY2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8QlREZXZpY2UgZGV2aWNlPXtkZXZpY2V9PjwvQlREZXZpY2U+O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICA8L2JveD5cbiAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgIHZpc2libGU9e2JpbmQoYnQsIFwiZGV2aWNlc1wiKS5hcyhkZXZpY2VzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZXMuZmlsdGVyKGRldmljZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGV2aWNlLmdldF9jb25uZWN0ZWQoKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGV2aWNlLmdldF9wYWlyZWQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgIGxhYmVsPXtcIk5vIGRpc2NvdmVyZWQgZGV2aWNlc1wifVxuICAgICAgICAgICAgICAgIGNzc0NsYXNzZXM9e1tcImJ0LW5vLWZvdW5kXCJdfVxuICAgICAgICAgICAgPjwvbGFiZWw+XG4gICAgICAgIDwvYm94PlxuICAgICk7XG59O1xuXG5jb25zdCBCbHVldG9vdGhQaWNrZXIgPSAoKSA9PiB7XG4gICAgY29uc3QgcG9wb3ZlciA9IG5ldyBHdGsuUG9wb3ZlcigpO1xuXG4gICAgcG9wb3Zlci5zZXRfY2hpbGQoQmx1ZXRvb3RoUGlja2VyTGlzdCgpKTtcbiAgICBwb3BvdmVyLmNvbm5lY3QoXCJjbG9zZWRcIiwgKCkgPT4gYnQuYWRhcHRlci5zdG9wX2Rpc2NvdmVyeSgpKTtcblxuICAgIHJldHVybiBwb3BvdmVyO1xufTtcblxuY29uc3QgcGlja2VyID0gQmx1ZXRvb3RoUGlja2VyKCk7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBCbHVldG9vdGhNb2R1bGUsXG59O1xuIiwgImltcG9ydCB7IGJpbmQgfSBmcm9tIFwiYXN0YWxcIjtcbmltcG9ydCBBc3RhbEJsdWV0b290aCBmcm9tIFwiZ2k6Ly9Bc3RhbEJsdWV0b290aFwiO1xuXG5jb25zdCBCVERldmljZSA9ICh7IGRldmljZSB9OiB7IGRldmljZTogQXN0YWxCbHVldG9vdGguRGV2aWNlIH0pID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB2aXNpYmxlPXtiaW5kKGRldmljZSwgXCJuYW1lXCIpLmFzKG4gPT4gbiAhPT0gbnVsbCl9XG4gICAgICAgICAgICBjaGlsZD17XG4gICAgICAgICAgICAgICAgPGNlbnRlcmJveFxuICAgICAgICAgICAgICAgICAgICBzdGFydFdpZGdldD17XG4gICAgICAgICAgICAgICAgICAgICAgICA8Ym94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uTmFtZT17XCJjaHJvbm9tZXRlci1yZXNldFwifVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwVGV4dD17XCJEZXZpY2UgaXMgY3VycmVudGx5IGNvbm5lY3RpbmdcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZT17YmluZChkZXZpY2UsIFwiY29ubmVjdGluZ1wiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pbWFnZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1hZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbk5hbWU9e2JpbmQoZGV2aWNlLCBcImljb25cIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbkVuZD17M31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pbWFnZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYm94PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNlbnRlcldpZGdldD17XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17YmluZChkZXZpY2UsIFwibmFtZVwiKS5hcyhuID0+IG4gPz8gXCJObyBuYW1lXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbkVuZD17NX1cbiAgICAgICAgICAgICAgICAgICAgICAgID48L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVuZFdpZGdldD17XG4gICAgICAgICAgICAgICAgICAgICAgICA8Ym94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17YmluZChkZXZpY2UsIFwiYmF0dGVyeVBlcmNlbnRhZ2VcIikuYXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXQgPT4gKGJhdCA+PSAwID8gYmF0ICsgXCIlXCIgOiBcIj8lXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwVGV4dD17XCJEZXZpY2UncyBiYXR0ZXJ5IHBlcmNlbnRhZ2VcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luRW5kPXszfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uTmFtZT17YmluZChkZXZpY2UsIFwicGFpcmVkXCIpLmFzKHYgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPyBcIm5ldHdvcmstYmx1ZXRvb3RoLWFjdGl2YXRlZC1zeW1ib2xpY1wiIDogXCJibHVldG9vdGgtZGlzY29ubmVjdGVkLXN5bWJvbGljXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaW1hZ2U+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0b29sdGlwVGV4dD17XCJEZXZpY2UgdHJ1c3RlZCBzdGF0dXNcIn0gY2hpbGQ9e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1hZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25OYW1lPXtiaW5kKGRldmljZSwgXCJ0cnVzdGVkXCIpLmFzKHYgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID8gXCJjaGVja2JveFwiIDogXCJ3aW5kb3ctY2xvc2Utc3ltYm9saWNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2ltYWdlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gb25DbGlja2VkPXsoKSA9PiBkZXZpY2Uuc2V0X3RydXN0ZWQoICFkZXZpY2UuZ2V0X3RydXN0ZWQoKSApfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzc0NsYXNzZXM9e1sgJ2J1dHRvbi1uby1tYXJnaW4nIF19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9ib3g+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA+PC9jZW50ZXJib3g+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvbkNsaWNrZWQ9eygpID0+IHtcbiAgICAgICAgICAgICAgICBjb25uZWN0T3JQYWlyKCBkZXZpY2UgKTtcbiAgICAgICAgICAgIH19XG4gICAgICAgID48L2J1dHRvbj5cbiAgICApO1xufTtcblxuY29uc3QgY29ubmVjdE9yUGFpciA9IChkZXZpY2U6IEFzdGFsQmx1ZXRvb3RoLkRldmljZSkgPT4ge1xuICAgIGlmICggZGV2aWNlLmdldF9wYWlyZWQoKSApIHtcbiAgICAgICAgZGV2aWNlLmNvbm5lY3RfZGV2aWNlKCgpID0+IHsgfSk7XG4gICAgICAgIC8vIFNob3cgZmFpbGVkIG1lc3NhZ2UgaWYgdHJpZWQgdG8gY29ubmVjdCBhbmQgZmFpbGVkXG4gICAgfSBlbHNlIHtcbiAgICAgICAgZGV2aWNlLnBhaXIoKTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBCVERldmljZTtcbiIsICJpbXBvcnQgeyBiaW5kIH0gZnJvbSBcImFzdGFsXCI7XG5pbXBvcnQgQnJpZ2h0bmVzcyBmcm9tIFwiLi4vLi4vLi4vLi4vdXRpbC9icmlnaHRuZXNzXCI7XG5cbmNvbnN0IGJyaWdodG5lc3MgPSBCcmlnaHRuZXNzLmdldF9kZWZhdWx0KCk7XG5cbmNvbnN0IEJyaWdodG5lc3NNb2R1bGUgPSAoKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgPGJveCB2aXNpYmxlPXtiaW5kKGJyaWdodG5lc3MsICdzY3JlZW5BdmFpbGFibGUnKX0+XG4gICAgICAgICAgICA8aW1hZ2UgaWNvbk5hbWU9e1wiYnJpZ2h0bmVzcy1oaWdoLXN5bWJvbGljXCJ9PjwvaW1hZ2U+XG4gICAgICAgICAgICA8bGFiZWwgbGFiZWw9e2JpbmQoYnJpZ2h0bmVzcywgXCJzY3JlZW5cIikuYXMoYiA9PiBiICsgXCIlXCIpfT48L2xhYmVsPlxuICAgICAgICAgICAgPHNsaWRlcj48L3NsaWRlcj5cbiAgICAgICAgPC9ib3g+XG4gICAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBCcmlnaHRuZXNzTW9kdWxlXG59O1xuIiwgImltcG9ydCB7IGJpbmQgfSBmcm9tIFwiYXN0YWxcIjtcbmltcG9ydCB7IEd0ayB9IGZyb20gXCJhc3RhbC9ndGs0XCI7XG5pbXBvcnQgQXN0YWxNcHJpcyBmcm9tIFwiZ2k6Ly9Bc3RhbE1wcmlzXCI7XG5pbXBvcnQgUGFuZ28gZnJvbSBcImdpOi8vUGFuZ28/dmVyc2lvbj0xLjBcIjtcbmNvbnN0IEFMSUdOID0gR3RrLkFsaWduO1xuXG5jb25zdCBtcHJpcyA9IEFzdGFsTXByaXMuZ2V0X2RlZmF1bHQoKTtcbm1wcmlzLmNvbm5lY3QoXCJwbGF5ZXItYWRkZWRcIiwgcCA9PiB7XG4gICAgcHJpbnQoXCJQbGF5ZXIgYWRkZWQ6XCIsIHApO1xufSk7XG5cbmNvbnN0IFBsYXllck1vZHVsZSA9ICgpID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgICA8Ym94IHZlcnRpY2FsIGNzc0NsYXNzZXM9eyBbICdwbGF5ZXJzLWJveCcgXSB9PlxuICAgICAgICAgICAgPGxhYmVsIGxhYmVsPXtcIk11c2ljIFBsYXllcnNcIn0gaGFsaWduPXtBTElHTi5DRU5URVJ9IGNzc0NsYXNzZXM9e1sgJ3RpdGxlLTInIF19PjwvbGFiZWw+XG4gICAgICAgICAgICA8R3RrLlNlcGFyYXRvciBtYXJnaW5Ub3A9ezN9IG1hcmdpbkJvdHRvbT17NX0+PC9HdGsuU2VwYXJhdG9yPlxuICAgICAgICAgICAgPGJveCBjc3NDbGFzc2VzPXtbXCJwbGF5ZXJzXCJdfT5cbiAgICAgICAgICAgICAgICB7YmluZChtcHJpcywgXCJwbGF5ZXJzXCIpLmFzKHBsYXllcnMgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxheWVycy5tYXAocGxheWVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8UGxheWVySXRlbSBwbGF5ZXI9e3BsYXllcn0+PC9QbGF5ZXJJdGVtPjtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICA8L2JveD5cbiAgICAgICAgICAgIDxsYWJlbCBsYWJlbD17XCJObyBwbGF5YmFjayBhY3RpdmVcIn0gdmlzaWJsZT17YmluZChtcHJpcywgXCJwbGF5ZXJzXCIpLmFzKCBwbGF5ZXJzID0+IHBsYXllcnMubGVuZ3RoID09PSAwICl9PjwvbGFiZWw+XG4gICAgICAgIDwvYm94PlxuICAgICk7XG59O1xuXG4vLyBUT0RPOiBVcGRhdGUgd2lkdGhzXG5jb25zdCBwYlN0YXR1cyA9IEFzdGFsTXByaXMuUGxheWJhY2tTdGF0dXM7XG5jb25zdCBQbGF5ZXJJdGVtID0gKHsgcGxheWVyIH06IHsgcGxheWVyOiBBc3RhbE1wcmlzLlBsYXllciB9KSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgPGJveCBjc3NDbGFzc2VzPXtbXCJwbGF5ZXJcIl19PlxuICAgICAgICAgICAgPGltYWdlXG4gICAgICAgICAgICAgICAgY3NzQ2xhc3Nlcz17W1wiY292ZXItYXJ0XCJdfVxuICAgICAgICAgICAgICAgIGZpbGU9e2JpbmQocGxheWVyLCBcImNvdmVyQXJ0XCIpfVxuICAgICAgICAgICAgICAgIGhleHBhbmRcbiAgICAgICAgICAgICAgICB2ZXhwYW5kXG4gICAgICAgICAgICA+PC9pbWFnZT5cbiAgICAgICAgICAgIDxib3ggdmVydGljYWw+XG4gICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsPXtiaW5kKHBsYXllciwgXCJ0aXRsZVwiKS5hcyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0+IHRpdGxlID8/IFwiVW5rbm93biB0aXRsZVwiLFxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICBjc3NDbGFzc2VzPXtbXCJ0aXRsZVwiXX1cbiAgICAgICAgICAgICAgICAgICAgaGFsaWduPXtBTElHTi5TVEFSVH1cbiAgICAgICAgICAgICAgICAgICAgdmFsaWduPXtBTElHTi5TVEFSVH1cbiAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGhDaGFycz17MzB9XG4gICAgICAgICAgICAgICAgICAgIGVsbGlwc2l6ZT17UGFuZ28uRWxsaXBzaXplTW9kZS5FTkR9XG4gICAgICAgICAgICAgICAgPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsPXtiaW5kKHBsYXllciwgXCJhcnRpc3RcIikuYXMoXG4gICAgICAgICAgICAgICAgICAgICAgICBhcnRpc3QgPT4gYXJ0aXN0ID8/IFwiVW5rbm93biBhcnRpc3RcIixcbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgaGFsaWduPXtBTElHTi5TVEFSVH1cbiAgICAgICAgICAgICAgICAgICAgdmFsaWduPXtBTElHTi5TVEFSVH1cbiAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGhDaGFycz17MzB9XG4gICAgICAgICAgICAgICAgICAgIGVsbGlwc2l6ZT17UGFuZ28uRWxsaXBzaXplTW9kZS5FTkR9XG4gICAgICAgICAgICAgICAgPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPHNsaWRlclxuICAgICAgICAgICAgICAgICAgICB2aXNpYmxlPXtiaW5kKHBsYXllciwgXCJsZW5ndGhcIikuYXMobCA9PiBsID4gMCl9XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtiaW5kKHBsYXllciwgXCJwb3NpdGlvblwiKX1cbiAgICAgICAgICAgICAgICAgICAgbWluPXswfVxuICAgICAgICAgICAgICAgICAgICBtYXg9e2JpbmQocGxheWVyLCBcImxlbmd0aFwiKX1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2VWYWx1ZT17diA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyLnNldF9wb3NpdGlvbih2LmdldF92YWx1ZSgpKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPjwvc2xpZGVyPlxuICAgICAgICAgICAgICAgIDxjZW50ZXJib3hcbiAgICAgICAgICAgICAgICAgICAgY3NzQ2xhc3Nlcz17W1wiYWN0aW9uc1wiXX1cbiAgICAgICAgICAgICAgICAgICAgc3RhcnRXaWRnZXQ9e1xuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e2JpbmQocGxheWVyLCBcInBvc2l0aW9uXCIpLmFzKHYgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kc1RvRnJpZW5kbHlUaW1lKHYpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGV4cGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzc0NsYXNzZXM9e1tcInBvc2l0aW9uXCJdfVxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2VudGVyV2lkZ2V0PXtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlPXtiaW5kKHBsYXllciwgXCJjYW5Hb1ByZXZpb3VzXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZD17XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1hZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uTmFtZT17XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibWVkaWEtc2tpcC1iYWNrd2FyZC1zeW1ib2xpY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaW1hZ2U+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGlja2VkPXsoKSA9PiBwbGF5ZXIucHJldmlvdXMoKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlPXtiaW5kKHBsYXllciwgXCJjYW5Db250cm9sXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZD17XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1hZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uTmFtZT17YmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInBsYXliYWNrU3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5hcyhzdGF0dXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSBwYlN0YXR1cy5QTEFZSU5HKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJtZWRpYS1wbGF5YmFjay1wYXVzZS1zeW1ib2xpY1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwibWVkaWEtcGxheWJhY2stc3RhcnQtc3ltYm9saWNcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaW1hZ2U+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGlja2VkPXsoKSA9PiBwbGF5ZXIucGxheV9wYXVzZSgpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGU9e2JpbmQocGxheWVyLCBcImNhbkdvTmV4dFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQ9e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbk5hbWU9e1wibWVkaWEtc2tpcC1mb3J3YXJkLXN5bWJvbGljXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pbWFnZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrZWQ9eygpID0+IHBsYXllci5uZXh0KCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9ib3g+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZW5kV2lkZ2V0PXtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzc0NsYXNzZXM9e1tcImxlbmd0aFwiXX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXhwYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e2JpbmQocGxheWVyLCBcImxlbmd0aFwiKS5hcyh2ID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHNUb0ZyaWVuZGx5VGltZSh2KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA+PC9jZW50ZXJib3g+XG4gICAgICAgICAgICA8L2JveD5cbiAgICAgICAgPC9ib3g+XG4gICAgKTtcbn07XG5cbmNvbnN0IHNlY29uZHNUb0ZyaWVuZGx5VGltZSA9ICh0aW1lOiBudW1iZXIpID0+IHtcbiAgICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcih0aW1lIC8gNjApO1xuICAgIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcihtaW51dGVzIC8gNjApO1xuICAgIGNvbnN0IHNlY29uZHMgPSBNYXRoLmZsb29yKHRpbWUgJSA2MCk7XG4gICAgaWYgKGhvdXJzID4gMCkge1xuICAgICAgICByZXR1cm4gYCR7aG91cnN9OiR7ZXhwYW5kVGltZShtaW51dGVzKX06JHtleHBhbmRUaW1lKHNlY29uZHMpfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGAke21pbnV0ZXN9OiR7ZXhwYW5kVGltZShzZWNvbmRzKX1gO1xuICAgIH1cbn07XG5cbmNvbnN0IGV4cGFuZFRpbWUgPSAodGltZTogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gdGltZSA8IDEwID8gYDAke3RpbWV9YCA6IFwiXCIgKyB0aW1lO1xufTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIFBsYXllck1vZHVsZSxcbn07XG4iLCAiaW1wb3J0IHsgYmluZCB9IGZyb20gXCJhc3RhbFwiO1xuaW1wb3J0IEJhdHRlcnkgZnJvbSBcImdpOi8vQXN0YWxCYXR0ZXJ5XCI7XG5pbXBvcnQgeyBHdGsgfSBmcm9tIFwiYXN0YWwvZ3RrNFwiO1xuXG5leHBvcnQgY29uc3QgQmF0dGVyeUJveCA9ICgpID0+IHtcbiAgICBjb25zdCBiYXR0ZXJ5ID0gQmF0dGVyeS5nZXRfZGVmYXVsdCgpO1xuICAgIGNvbnN0IGJhdHRlcnlFbmVyZ3kgPSAoZW5lcmd5UmF0ZTogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiBlbmVyZ3lSYXRlID4gMC4xID8gYCR7TWF0aC5yb3VuZChlbmVyZ3lSYXRlICogMTApIC8gMTB9IFcgYCA6IFwiXCI7XG4gICAgfTtcbiAgICByZXR1cm4gKFxuICAgICAgICA8Ym94XG4gICAgICAgICAgICBjc3NDbGFzc2VzPXtbXCJiYXR0ZXJ5LWluZm9cIl19XG4gICAgICAgICAgICB2aXNpYmxlPXtiaW5kKGJhdHRlcnksIFwiaXNCYXR0ZXJ5XCIpfVxuICAgICAgICA+XG4gICAgICAgICAgICA8Ym94IGNzc0NsYXNzZXM9e1tcImJhdHRlcnktYm94XCJdfT5cbiAgICAgICAgICAgICAgICA8aW1hZ2VcbiAgICAgICAgICAgICAgICAgICAgaWNvbk5hbWU9e2JpbmQoYmF0dGVyeSwgXCJiYXR0ZXJ5SWNvbk5hbWVcIil9XG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXBUZXh0PXtiaW5kKGJhdHRlcnksIFwiZW5lcmd5UmF0ZVwiKS5hcyhlciA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgYmF0dGVyeUVuZXJneShlciksXG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9e2JpbmQoYmF0dGVyeSwgXCJwZXJjZW50YWdlXCIpLmFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgcCA9PiBgICR7TWF0aC5yb3VuZChwICogMTAwKX0lYCxcbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICBjc3NDbGFzc2VzPXtbXCJ0aW1lXCJdfVxuICAgICAgICAgICAgICAgICAgICBoZXhwYW5kPXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICBoYWxpZ249e0d0ay5BbGlnbi5FTkR9XG4gICAgICAgICAgICAgICAgICAgIHZpc2libGU9e2JpbmQoYmF0dGVyeSwgXCJjaGFyZ2luZ1wiKS5hcyhjID0+ICFjKX1cbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9e2JpbmQoYmF0dGVyeSwgXCJ0aW1lVG9FbXB0eVwiKS5hcyh0ID0+IHRvVGltZSh0KSl9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvYm94PlxuICAgICAgICA8L2JveD5cbiAgICApO1xufTtcblxuY29uc3QgdG9UaW1lID0gKHRpbWU6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IE1JTlVURSA9IDYwO1xuICAgIGNvbnN0IEhPVVIgPSBNSU5VVEUgKiA2MDtcblxuICAgIGlmICh0aW1lID4gMjQgKiBIT1VSKSByZXR1cm4gXCJcIjtcblxuICAgIGNvbnN0IGhvdXJzID0gTWF0aC5yb3VuZCh0aW1lIC8gSE9VUik7XG4gICAgY29uc3QgbWludXRlcyA9IE1hdGgucm91bmQoKHRpbWUgLSBob3VycyAqIEhPVVIpIC8gTUlOVVRFKTtcblxuICAgIGNvbnN0IGhvdXJzRGlzcGxheSA9IGhvdXJzID4gMCA/IGAke2hvdXJzfWggYCA6IFwiXCI7XG4gICAgY29uc3QgbWludXRlc0Rpc3BsYXkgPSBtaW51dGVzID4gMCA/IGAke21pbnV0ZXN9bSBgIDogXCJcIjtcblxuICAgIHJldHVybiBgJHtob3Vyc0Rpc3BsYXl9JHttaW51dGVzRGlzcGxheX1gO1xufTtcbiIsICJpbXBvcnQgeyBiaW5kIH0gZnJvbSBcImFzdGFsXCI7XG5pbXBvcnQgeyBHdGsgfSBmcm9tIFwiYXN0YWwvZ3RrNFwiO1xuaW1wb3J0IEFzdGFsTmV0d29yayBmcm9tIFwiZ2k6Ly9Bc3RhbE5ldHdvcmtcIjtcbmltcG9ydCBuZXR3b3JrSGVscGVyIGZyb20gXCIuL25ldHdvcmstaGVscGVyXCI7XG5pbXBvcnQgTmV0d29ya01lbnUgZnJvbSBcIi4vTmV0d29ya01lbnVcIjtcblxuY29uc3QgbmV0ID0gQXN0YWxOZXR3b3JrLmdldF9kZWZhdWx0KCk7XG5jb25zdCBTVEFURSA9IEFzdGFsTmV0d29yay5EZXZpY2VTdGF0ZTtcblxuY29uc3QgTmV0d29yayA9ICgpID0+IHtcbiAgICBjb25zdCBuZXRNZW51ID0gTmV0d29ya01lbnUuTmV0d29ya01lbnUoKTtcbiAgICByZXR1cm4gKFxuICAgICAgICA8Ym94PlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNzc0NsYXNzZXM9e25ldHdvcmtIZWxwZXIubmV0d29ya0VuYWJsZWQoZW4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW4pIHJldHVybiBbXCJ0b2dnbGUtYnV0dG9uXCIsIFwidG9nZ2xlLW9uXCJdO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIHJldHVybiBbXCJ0b2dnbGUtYnV0dG9uXCJdO1xuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2tlZD17KCkgPT5cbiAgICAgICAgICAgICAgICAgICAgbmV0d29ya0hlbHBlci5zZXROZXR3b3JraW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgIW5ldHdvcmtIZWxwZXIubmV0d29ya0VuYWJsZWQuZ2V0KCksXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2hpbGQ9e1xuICAgICAgICAgICAgICAgICAgICA8Ym94IHZlcnRpY2FsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e2JpbmQobmV0LndpZmksIFwiZW5hYmxlZFwiKS5hcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdCA9PiBgTmV0d29yayAoJHtzdGF0ID8gXCJXaUZpXCIgOiBcIldpcmVkXCJ9KWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3NDbGFzc2VzPXtbXCJ0aXRsZS0yXCJdfVxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17YmluZChuZXQud2lyZWQsIFwic3RhdGVcIikuYXMoc3RhdGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT09IFNUQVRFLkFDVElWQVRFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIldpcmVkLiBJUDogXCIgKyBuZXR3b3JrSGVscGVyLmdldElQKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IFNUQVRFLkRJU0NPTk5FQ1RFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiRGlzY29ubmVjdGVkXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IFNUQVRFLkZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiRXJyb3JcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID09PSBTVEFURS5QUkVQQVJFIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9PT0gU1RBVEUuQ09ORklHIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9PT0gU1RBVEUuSVBfQ0hFQ0sgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID09PSBTVEFURS5JUF9DT05GSUdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJDb25uZWN0aW5nLi4uXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJVbmF2YWlsYWJsZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZT17YmluZChuZXQud2lmaSwgXCJlbmFibGVkXCIpLmFzKHYgPT4gIXYpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17YmluZChuZXQud2lmaSwgXCJzdGF0ZVwiKS5hcyhzdGF0ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gU1RBVEUuQUNUSVZBVEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7bmV0LndpZmkuZ2V0X3NzaWQoKX0gKCR7bmV0d29ya0hlbHBlci5nZXRJUCgpfSlgO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBTVEFURS5ESVNDT05ORUNURUQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIkRpc2Nvbm5lY3RlZFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBTVEFURS5GQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIkVycm9yXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9PT0gU1RBVEUuUFJFUEFSRSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPT09IFNUQVRFLkNPTkZJRyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPT09IFNUQVRFLklQX0NIRUNLIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9PT0gU1RBVEUuSVBfQ09ORklHXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiQ29ubmVjdGluZy4uLlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiVW5hdmFpbGFibGVcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGU9e2JpbmQobmV0LndpZmksIFwiZW5hYmxlZFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgID48L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2JveD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY3NzQ2xhc3Nlcz17W1wiYWN0aW9ucy1idXR0b25cIl19XG4gICAgICAgICAgICAgICAgdmlzaWJsZT17bmV0d29ya0hlbHBlci5uZXR3b3JrRW5hYmxlZCgpfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2tlZD17KCkgPT4gbmV0TWVudS5wb3B1cCgpfVxuICAgICAgICAgICAgICAgIGNoaWxkPXtcbiAgICAgICAgICAgICAgICAgICAgPGJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWFnZSBpY29uTmFtZT17XCJhcnJvdy1yaWdodC1zeW1ib2xpY1wifT48L2ltYWdlPlxuICAgICAgICAgICAgICAgICAgICAgICAgeyBuZXRNZW51IH1cbiAgICAgICAgICAgICAgICAgICAgPC9ib3g+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRvb2x0aXBUZXh0PXtcIlZpZXcgYXZhaWxhYmxlIGRldmljZXNcIn1cbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPC9ib3g+XG4gICAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBOZXR3b3JrLFxufTtcbiIsICJpbXBvcnQgeyBleGVjLCBWYXJpYWJsZSB9IGZyb20gXCJhc3RhbFwiO1xuaW1wb3J0IEFzdGFsTmV0d29yayBmcm9tIFwiZ2k6Ly9Bc3RhbE5ldHdvcmtcIjtcblxuY29uc3QgbmV0d29ya0VuYWJsZWQgPSBWYXJpYWJsZSggZXhlYyggJ25tY2xpIG5ldHdvcmtpbmcgY29ubmVjdGl2aXR5JyApICE9PSAnbm9uZScgKTtcbmNvbnN0IG5ldHdvcmsgPSBBc3RhbE5ldHdvcmsuZ2V0X2RlZmF1bHQoKTtcblxuXG5jb25zdCBzZXROZXR3b3JraW5nID0gKCBzdGF0dXM6IGJvb2xlYW4gKSA9PiB7XG4gICAgaWYgKCBzdGF0dXMgPT09IHRydWUgKSB7XG4gICAgICAgIGV4ZWMoICdubWNsaSBuZXR3b3JraW5nIG9uJyApO1xuICAgICAgICBuZXR3b3JrRW5hYmxlZC5zZXQoIHRydWUgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBleGVjKCAnbm1jbGkgbmV0d29ya2luZyBvZmYnICk7XG4gICAgICAgIG5ldHdvcmtFbmFibGVkLnNldCggZmFsc2UgKTtcbiAgICB9XG59XG5cblxuY29uc3QgZ2V0SVAgPSAoKSA9PiB7XG4gICAgcmV0dXJuIGV4ZWMoIGAvYmluL2Jhc2ggLWMgXCJpcCBhZGRyIHNob3cgfCBncmVwICdpbmV0ICcgfCBhd2sgJ3twcmludCAkMn0nIHwgZ3JlcCAtdiAnMTI3J1wiYCApLnNwbGl0KCAnLycgKVsgMCBdO1xufVxuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBuZXR3b3JrRW5hYmxlZCxcbiAgICBzZXROZXR3b3JraW5nLFxuICAgIGdldElQXG59XG4iLCAiaW1wb3J0IHsgR3RrIH0gZnJvbSBcImFzdGFsL2d0azRcIjtcblxuY29uc3QgTmV0d29ya01lbnUgPSAoKSA9PiB7XG4gICAgY29uc3QgcG9wb3ZlciA9IG5ldyBHdGsuUG9wb3ZlcigpO1xuICAgIHBvcG92ZXIuc2V0X2NoaWxkKCByZW5kZXJNZW51KCkgKTtcbiAgICByZXR1cm4gcG9wb3Zlcjtcbn07XG5cbmNvbnN0IHJlbmRlck1lbnUgPSAoKSA9PiB7XG4gICAgcmV0dXJuIDxib3ggdmVydGljYWw+XG4gICAgICAgIDxpbWFnZSBpY29uTmFtZT17XCJhcHBvaW50bWVudC1zb29uLXN5bWJvbGljXCJ9IGljb25TaXplPXtHdGsuSWNvblNpemUuTEFSR0V9PjwvaW1hZ2U+XG4gICAgICAgIDxsYWJlbCBsYWJlbD17XCJDb21pbmcgbGF0ZXJcIn0+PC9sYWJlbD5cbiAgICA8L2JveD47XG59O1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgTmV0d29ya01lbnUsXG59O1xuIiwgImltcG9ydCB7IEd0ayB9IGZyb20gXCJhc3RhbC9ndGs0XCI7XG5pbXBvcnQgUG93ZXIgZnJvbSBcIi4vbW9kdWxlcy9Qb3dlclwiO1xuaW1wb3J0IEF1ZGlvIGZyb20gXCIuL21vZHVsZXMvQXVkaW8vQXVkaW9cIjtcbmltcG9ydCBCbHVldG9vdGggZnJvbSBcIi4vbW9kdWxlcy9CbHVldG9vdGgvQmx1ZXRvb3RoXCI7XG5pbXBvcnQgQnJpZ2h0bmVzcyBmcm9tIFwiLi9tb2R1bGVzL0JyaWdodG5lc3MvQnJpZ2h0bmVzc1wiO1xuaW1wb3J0IFBsYXllciBmcm9tIFwiLi9tb2R1bGVzL1BsYXllci9QbGF5ZXJcIjtcbmltcG9ydCB7IEJhdHRlcnlCb3ggfSBmcm9tIFwiLi9tb2R1bGVzL0JhdHRlcnlcIjtcbmltcG9ydCB7IGV4ZWMgfSBmcm9tIFwiYXN0YWxcIjtcbmltcG9ydCBOZXR3b3JrIGZyb20gXCIuL21vZHVsZXMvTmV0d29ya2luZy9OZXR3b3JrXCI7XG5cbmNvbnN0IFF1aWNrQWN0aW9ucyA9ICgpID0+IHtcbiAgICBjb25zdCBwb3BvdmVyID0gbmV3IEd0ay5Qb3BvdmVyKHsgY3NzQ2xhc3NlczogW1wicXVpY2stYWN0aW9ucy13cmFwcGVyXCJdIH0pO1xuICAgIHBvcG92ZXIuc2V0X2NoaWxkKHJlbmRlclF1aWNrQWN0aW9ucygpKTtcbiAgICByZXR1cm4gcG9wb3Zlcjtcbn07XG5cbmNvbnN0IHJlbmRlclF1aWNrQWN0aW9ucyA9ICgpID0+IHtcbiAgICBjb25zdCB1c2VyID0gZXhlYyhcIi9iaW4vc2ggLWMgd2hvYW1pXCIpO1xuICAgIGNvbnN0IHByb2ZpbGUgPSBleGVjKFwiL2Jpbi9maXNoIC1jIGdldC1wcm9maWxlLXBpY3R1cmVcIik7XG4gICAgY29uc3QgY3dkID0gZXhlYyhcInB3ZFwiKTtcbiAgICBjb25zdCB1bSA9IFBvd2VyLlVzZXJNZW51KCk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8Ym94IHZpc2libGUgY3NzQ2xhc3Nlcz17W1wicXVpY2stYWN0aW9uc1wiLCBcInBvcG92ZXItYm94XCJdfSB2ZXJ0aWNhbD5cbiAgICAgICAgICAgIDxjZW50ZXJib3hcbiAgICAgICAgICAgICAgICBzdGFydFdpZGdldD17XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2tlZD17KCkgPT4gdW0ucG9wdXAoKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNzc0NsYXNzZXM9e1tcInN0ZWFsdGh5LWJ1dHRvblwiXX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkPXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Ym94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dW19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxHdGsuRnJhbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzc0NsYXNzZXM9e1tcImF2YXRhci1pY29uXCJdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQ9e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlPXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUgIT09IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHByb2ZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGN3ZCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIi9uby1hdmF0YXItaWNvbi5qcGdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaW1hZ2U+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L0d0ay5GcmFtZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGxhYmVsPXt1c2VyfT48L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVuZFdpZGdldD17XG4gICAgICAgICAgICAgICAgICAgIDxib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8QmF0dGVyeUJveD48L0JhdHRlcnlCb3g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8UG93ZXIuUG93ZXI+PC9Qb3dlci5Qb3dlcj5cbiAgICAgICAgICAgICAgICAgICAgPC9ib3g+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPjwvY2VudGVyYm94PlxuICAgICAgICAgICAgPEd0ay5TZXBhcmF0b3IgbWFyZ2luVG9wPXsxMH0gbWFyZ2luQm90dG9tPXsyMH0+PC9HdGsuU2VwYXJhdG9yPlxuICAgICAgICAgICAgPGJveD5cbiAgICAgICAgICAgICAgICA8Qmx1ZXRvb3RoLkJsdWV0b290aE1vZHVsZT48L0JsdWV0b290aC5CbHVldG9vdGhNb2R1bGU+XG4gICAgICAgICAgICAgICAgPE5ldHdvcmsuTmV0d29yaz48L05ldHdvcmsuTmV0d29yaz5cbiAgICAgICAgICAgIDwvYm94PlxuICAgICAgICAgICAgPEd0ay5TZXBhcmF0b3IgbWFyZ2luVG9wPXsxMH0gbWFyZ2luQm90dG9tPXsxMH0+PC9HdGsuU2VwYXJhdG9yPlxuICAgICAgICAgICAgPEJyaWdodG5lc3MuQnJpZ2h0bmVzc01vZHVsZT48L0JyaWdodG5lc3MuQnJpZ2h0bmVzc01vZHVsZT5cbiAgICAgICAgICAgIDxBdWRpby5BdWRpb01vZHVsZT48L0F1ZGlvLkF1ZGlvTW9kdWxlPlxuICAgICAgICAgICAgPFBsYXllci5QbGF5ZXJNb2R1bGU+PC9QbGF5ZXIuUGxheWVyTW9kdWxlPlxuICAgICAgICA8L2JveD5cbiAgICApO1xufTtcblxuLy8gVE9ETzogRXhwb3NlIGFkZGl0aW9uYWwgZnVuY3Rpb25zIHRvIGJlIHVzYWJsZSB0aHJvdWdoIENMSVxuZXhwb3J0IGRlZmF1bHQge1xuICAgIFF1aWNrQWN0aW9ucyxcbn07XG4iLCAiaW1wb3J0IHsgZXhlYywgZXhlY0FzeW5jLCBHTGliLCBpbnRlcnZhbCwgVmFyaWFibGUgfSBmcm9tIFwiYXN0YWxcIjtcbmltcG9ydCB7IEd0ayB9IGZyb20gXCJhc3RhbC9ndGs0XCI7XG5pbXBvcnQgQXN0YWxCYXR0ZXJ5IGZyb20gXCJnaTovL0FzdGFsQmF0dGVyeT92ZXJzaW9uPTAuMVwiO1xuXG5jb25zdCBGRVRDSF9JTlRFUlZBTCA9IDIwMDA7XG5cbmNvbnN0IGNwdVV0aWwgPSBWYXJpYWJsZShcIjAlXCIpO1xuY29uc3QgcmFtVXRpbCA9IFZhcmlhYmxlKFwiMCVcIik7XG5jb25zdCByYW1Vc2VkID0gVmFyaWFibGUoXCIwTWlCXCIpO1xuY29uc3QgZ3B1VXRpbCA9IFZhcmlhYmxlKFwiMCVcIik7XG5sZXQgZ3B1TmFtZSA9IFwiY2FyZDFcIjtcbmxldCBlbmFibGVkID0gZmFsc2U7XG5cbmNvbnN0IHJlZnJlc2hTdGF0cyA9ICgpOiBTdGF0cyA9PiB7XG4gICAgZ3B1TmFtZSA9IGV4ZWMoYC9iaW4vYmFzaCAtYyBcImxzIC9zeXMvY2xhc3MvZHJtLyB8IGdyZXAgJ15jYXJkWzAtOV0qJCdcImApO1xuICAgIGNvbnN0IGNwdU5hbWVJblNlbnNvcnMgPSBcIkNQVVRJTlwiO1xuICAgIGNvbnN0IHN0YXRzID0ge1xuICAgICAgICBrZXJuZWw6IGV4ZWMoXCJ1bmFtZSAtc3JcIiksXG4gICAgICAgIG5ldFNwZWVkOiBleGVjKFxuICAgICAgICAgICAgYC9iaW4vYmFzaCAtYyBcImludGVyZmFjZT0kKGlwIHJvdXRlIGdldCA4LjguOC44IHwgYXdrICd7cHJpbnQgJDU7IGV4aXR9JykgJiYgY2F0IFxcXCIvc3lzL2NsYXNzL25ldC8kaW50ZXJmYWNlL3NwZWVkXFxcIlwiYCxcbiAgICAgICAgKSxcbiAgICAgICAgY3B1VGVtcDogZXhlYyhcbiAgICAgICAgICAgIGAvYmluL2Jhc2ggLWMgXCJzZW5zb3JzIHwgZ3JlcCAtbTEgJHtjcHVOYW1lSW5TZW5zb3JzfSB8IGF3ayAne3ByaW50ICQyfSdcImAsXG4gICAgICAgICksXG4gICAgICAgIGNwdUNsazogZXhlYyhcbiAgICAgICAgICAgIGBhd2sgJy9jcHUgTUh6LyB7c3VtKz0kNDsgKytufSBFTkQge3ByaW50IHN1bS9uIFwiIE1IelwifScgL3Byb2MvY3B1aW5mb2AsXG4gICAgICAgICksXG4gICAgICAgIGdwdVRlbXA6IGV4ZWMoXG4gICAgICAgICAgICBgL2Jpbi9iYXNoIC1jIFwic2Vuc29ycyB8IGdyZXAgLUUgJ2VkZ2UnIHwgYXdrICd7cHJpbnQgJDJ9J1wiYCxcbiAgICAgICAgKSxcbiAgICAgICAgZ3B1Q2xrOiBleGVjKFxuICAgICAgICAgICAgYC9iaW4vYmFzaCAtYyBcImNhdCAvc3lzL2NsYXNzL2RybS8ke2dwdU5hbWV9L2RldmljZS9wcF9kcG1fc2NsayB8IGdyZXAgJ1xcXFwqJyB8IGF3ayAne3ByaW50ICQyICQzfSdcImAsXG4gICAgICAgICksXG4gICAgICAgIHZyYW06XG4gICAgICAgICAgICBNYXRoLnJvdW5kKFxuICAgICAgICAgICAgICAgIHBhcnNlSW50KFxuICAgICAgICAgICAgICAgICAgICBleGVjKFxuICAgICAgICAgICAgICAgICAgICAgICAgYGNhdCAvc3lzL2NsYXNzL2RybS8ke2dwdU5hbWV9L2RldmljZS9tZW1faW5mb192cmFtX3VzZWRgLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICkgL1xuICAgICAgICAgICAgICAgICAgICAxMDI0IC9cbiAgICAgICAgICAgICAgICAgICAgMTAyNCxcbiAgICAgICAgICAgICkgKyBcIk1pQlwiLFxuICAgICAgICBhdmFpbGFibGVWUkFNOlxuICAgICAgICAgICAgTWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgICBwYXJzZUludChcbiAgICAgICAgICAgICAgICAgICAgZXhlYyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGBjYXQgL3N5cy9jbGFzcy9kcm0vJHtncHVOYW1lfS9kZXZpY2UvbWVtX2luZm9fdnJhbV90b3RhbGAsXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKSAvXG4gICAgICAgICAgICAgICAgICAgIDEwMjQgL1xuICAgICAgICAgICAgICAgICAgICAxMDI0LFxuICAgICAgICAgICAgKSArIFwiTWlCXCIsXG4gICAgfTtcblxuICAgIHJldHVybiBzdGF0cztcbn07XG5cbmNvbnN0IHN5c3RlbVN0YXRzOiBWYXJpYWJsZTxTdGF0cz4gPSBWYXJpYWJsZShyZWZyZXNoU3RhdHMoKSk7XG5cbmNvbnN0IGF2YWlsYWJsZUZlYXR1cmVzID0ge1xuICAgIGNwdTogdHJ1ZSxcbiAgICByYW06IHRydWUsXG59O1xuXG5jb25zdCBmZWF0dXJlVGVzdCA9ICgpID0+IHtcbiAgICAvLyBDaGVjayBpZiBhd2sgJiBzZWQgYXJlIGF2YWlsYWJsZVxuICAgIHRyeSB7XG4gICAgICAgIGV4ZWMoXCJhd2sgLVZcIik7XG4gICAgICAgIGV4ZWMoXCJzZWQgLS12ZXJzaW9uXCIpO1xuICAgICAgICBlbmFibGVkID0gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHByaW50ZXJyKFxuICAgICAgICAgICAgXCJbIFN5c0luZm8gXSBBV0sgb3IgU0VEIG1pc3NpbmchIE5vIHN5c3RlbSBpbmZvIHdpbGwgYmUgYXZhaWxhYmxlXCIsXG4gICAgICAgICk7XG4gICAgICAgIGVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIG1wc3RhdCBpcyBhdmFpbGFibGVcbiAgICB0cnkge1xuICAgICAgICBleGVjKFwibXBzdGF0IC1WXCIpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgYXZhaWxhYmxlRmVhdHVyZXMuY3B1ID0gZmFsc2U7XG4gICAgICAgIHByaW50ZXJyKFxuICAgICAgICAgICAgXCJbIFN5c0luZm8gXSBGZWF0dXJlIFRlc3QgZm9yIENQVSBpbmZvIGZhaWxlZC4gbXBzdGF0IGZyb20gdGhlIHN5c3N0YXQgcGFja2FnZSBtaXNzaW5nIVwiLFxuICAgICAgICApO1xuICAgIH1cbn07XG5cbmNvbnN0IGluZm8gPSAoKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgPGJveCB2ZXJ0aWNhbD5cbiAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgIGxhYmVsPXtcIlN5c3RlbSBJbmZvcm1hdGlvblwifVxuICAgICAgICAgICAgICAgIGNzc0NsYXNzZXM9e1tcInRpdGxlLTJcIl19XG4gICAgICAgICAgICA+PC9sYWJlbD5cbiAgICAgICAgICAgIDxHdGsuU2VwYXJhdG9yIG1hcmdpblRvcD17NX0gbWFyZ2luQm90dG9tPXsxMH0+PC9HdGsuU2VwYXJhdG9yPlxuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgdmV4cGFuZFxuICAgICAgICAgICAgICAgIGhhbGlnbj17R3RrLkFsaWduLlNUQVJUfVxuICAgICAgICAgICAgICAgIGhleHBhbmRcbiAgICAgICAgICAgICAgICBsYWJlbD17cmFtVXNlZCh1c2VkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiUkFNOiBcIiArIHVzZWQgKyBgICgke3JhbVV0aWwuZ2V0KCl9JSlgO1xuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPjwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICBsYWJlbD17c3lzdGVtU3RhdHMoc3RhdHMgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYENQVTogJHtzdGF0cy5jcHVUZW1wfSwgJHtzdGF0cy5jcHVDbGt9XG5HUFU6ICR7c3RhdHMuZ3B1VGVtcH0sICR7c3RhdHMuZ3B1Q2xrfSAoJHtzdGF0cy52cmFtfSAvICR7c3RhdHMuYXZhaWxhYmxlVlJBTX0pXG5OZXR3b3JrOiAke3N0YXRzLm5ldFNwZWVkfSBtYi9zXG5LZXJuZWw6ICR7c3RhdHMua2VybmVsfWA7XG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICA+PC9sYWJlbD5cbiAgICAgICAgICAgIDxHdGsuU2VwYXJhdG9yIG1hcmdpblRvcD17MTB9PjwvR3RrLlNlcGFyYXRvcj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBvbkNsaWNrZWQ9eygpID0+IGV4ZWMoIGAvYmluL3NoIC1jIFwia2l0dHkgLS1ob2xkIGZpc2ggLWMgJ2Zhc3RmZXRjaCdcImAgKX1cbiAgICAgICAgICAgICAgICBjaGlsZD17XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBsYWJlbD17XCJWaWV3IEZhc3RGZXRjaFwifT48L2xhYmVsPlxuICAgICAgICAgICAgICAgIH0+PC9idXR0b24+XG4gICAgICAgIDwvYm94PlxuICAgICk7XG59O1xuXG5jb25zdCBTeXN0ZW1JbmZvcm1hdGlvblBhbmVsID0gKCkgPT4ge1xuICAgIGNvbnN0IHBvcG92ZXIgPSBuZXcgR3RrLlBvcG92ZXIoKTtcblxuICAgIHBvcG92ZXIuc2V0X2NoaWxkKGluZm8oKSk7XG5cbiAgICByZXR1cm4gcG9wb3Zlcjtcbn07XG5cbmNvbnN0IHN5c0luZm9GZXRjaGVyID0gKCkgPT4ge1xuICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgIGlmIChhdmFpbGFibGVGZWF0dXJlcy5jcHUpIHtcbiAgICAgICAgICAgIGNwdVV0aWwuc2V0KFxuICAgICAgICAgICAgICAgIFwiXCIgK1xuICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VGbG9hdChleGVjKGAvYmluL2Zpc2ggLWMgY3B1LXV0aWxpemF0aW9uYCkpLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXZhaWxhYmxlRmVhdHVyZXMucmFtKSB7XG4gICAgICAgICAgICByYW1VdGlsLnNldChcbiAgICAgICAgICAgICAgICBcIlwiICtcbiAgICAgICAgICAgICAgICAgICAgTWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlRmxvYXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYC9iaW4vYmFzaCAtYyBcImZyZWUgfCBhd2sgJy9NZW0vIHsgcHJpbnRmKFxcXFxcIiUuMmZcXFxcXFxcXG5cXFxcXCIsICgkMy8kMikqMTAwKSB9J1wiYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByYW1Vc2VkLnNldChcbiAgICAgICAgICAgICAgICBleGVjKFxuICAgICAgICAgICAgICAgICAgICBgL2Jpbi9iYXNoIC1jIFxcXCJmcmVlIC1oIHwgYXdrICcvXk1lbTovIHtwcmludCAkMyBcXFxcXCIgdXNlZCBvZiBcXFxcXCIgJDJ9J1xcXCJgLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoXCJHaVwiLCBcIkdpQlwiKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbChcIk1pXCIsIFwiTWlCXCIpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBncHVVdGlsLnNldChleGVjKFwiY2F0IC9zeXMvY2xhc3MvZHJtL2NhcmQxL2RldmljZS9ncHVfYnVzeV9wZXJjZW50XCIpKTtcbiAgICB9XG59O1xuXG5jb25zdCBwYW5lbCA9IFN5c3RlbUluZm9ybWF0aW9uUGFuZWwoKTtcblxuY29uc3QgU3lzdGVtSW5mbyA9ICgpID0+IHtcbiAgICBmZWF0dXJlVGVzdCgpO1xuXG4gICAgY29uc3Qgb3BlblN5c0luZm8gPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIHBhbmVsLnBvcHVwKCk7XG4gICAgICAgIHN5c3RlbVN0YXRzLnNldChyZWZyZXNoU3RhdHMoKSk7XG4gICAgfTtcblxuICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgIHN5c0luZm9GZXRjaGVyKCk7XG4gICAgICAgIGludGVydmFsKEZFVENIX0lOVEVSVkFMLCBzeXNJbmZvRmV0Y2hlcik7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBvbkNsaWNrZWQ9eygpID0+IG9wZW5TeXNJbmZvKCl9XG4gICAgICAgICAgICAgICAgY2hpbGQ9e1xuICAgICAgICAgICAgICAgICAgICA8Ym94IHRvb2x0aXBUZXh0PXtyYW1Vc2VkKHYgPT4gdil9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbk5hbWU9e1wicG93ZXItcHJvZmlsZS1wZXJmb3JtYW5jZS1zeW1ib2xpY1wifVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbkVuZD17MX1cbiAgICAgICAgICAgICAgICAgICAgICAgID48L2ltYWdlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e2NwdVV0aWwodXRpbCA9PiB1dGlsKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW5FbmQ9ezV9XG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWFnZSBpY29uTmFtZT17XCJoaXN0b2dyYW0tc3ltYm9saWNcIn0+PC9pbWFnZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBsYWJlbD17cmFtVXRpbCh1dGlsID0+IHV0aWwpfT48L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltYWdlIGljb25OYW1lPXtcInNob3ctZ3B1LWVmZmVjdHMtc3ltYm9saWNcIn0+PC9pbWFnZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBsYWJlbD17Z3B1VXRpbCh1dGlsID0+IHV0aWwpfT48L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAge3BhbmVsfVxuICAgICAgICAgICAgICAgICAgICA8L2JveD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3NzQ2xhc3Nlcz17W1wiYmFyLWJ1dHRvblwiXX1cbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gPGltYWdlIGljb25OYW1lPXtcImFjdGlvbi11bmF2YWlsYWJsZS1zeW1ib2xpY1wifT48L2ltYWdlPjtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgU3lzdGVtSW5mbyxcbiAgICBwYW5lbCxcbn07XG4iLCAiaW1wb3J0IHsgQXBwLCBBc3RhbCwgR2RrLCBHdGsgfSBmcm9tIFwiYXN0YWwvZ3RrNFwiO1xuaW1wb3J0IEh5cHJsYW5kIGZyb20gXCIuL21vZHVsZXMvSHlwcmxhbmRcIjtcbmltcG9ydCBDYWxlbmRhciBmcm9tIFwiLi9tb2R1bGVzL0NhbGVuZGFyXCI7XG5pbXBvcnQgUXVpY2tWaWV3IGZyb20gXCIuL21vZHVsZXMvUXVpY2tWaWV3XCI7XG5pbXBvcnQgU3lzdGVtSW5mbyBmcm9tIFwiLi9tb2R1bGVzL1N5c3RlbUluZm9cIjtcbmltcG9ydCB7IENlbnRlckJveCB9IGZyb20gXCJhc3RhbC9ndGs0L3dpZGdldFwiO1xuXG5jb25zdCBCYXIgPSAoIHsgZ2RrbW9uaXRvciwgbmFtZSB9OiB7IGdka21vbml0b3I6IEdkay5Nb25pdG9yLCBuYW1lOiBzdHJpbmcgfSApID0+IHtcbiAgICBjb25zdCB7IFRPUCwgTEVGVCwgUklHSFQgfSA9IEFzdGFsLldpbmRvd0FuY2hvcjtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDx3aW5kb3dcbiAgICAgICAgICAgIGdka21vbml0b3I9e2dka21vbml0b3J9XG4gICAgICAgICAgICBjc3NDbGFzc2VzPXtbXCJCYXJcIl19XG4gICAgICAgICAgICBuYW1lPXtuYW1lfVxuICAgICAgICAgICAgbmFtZXNwYWNlPXtcImJhclwifVxuICAgICAgICAgICAgZXhjbHVzaXZpdHk9e0FzdGFsLkV4Y2x1c2l2aXR5LkVYQ0xVU0lWRX1cbiAgICAgICAgICAgIGFuY2hvcj17VE9QIHwgTEVGVCB8IFJJR0hUfVxuICAgICAgICAgICAgdmlzaWJsZVxuICAgICAgICAgICAgYXBwbGljYXRpb249e0FwcH1cbiAgICAgICAgICAgIGNoaWxkPXtcbiAgICAgICAgICAgICAgICA8Q2VudGVyQm94XG4gICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uPXtHdGsuT3JpZW50YXRpb24uSE9SSVpPTlRBTH1cbiAgICAgICAgICAgICAgICAgICAgc3RhcnRfd2lkZ2V0PXtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXhwYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsaWduPXtHdGsuQWxpZ24uU1RBUlR9XG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPENhbGVuZGFyLlRpbWUgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U3lzdGVtSW5mby5TeXN0ZW1JbmZvIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEh5cHJsYW5kLldvcmtzcGFjZSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9ib3g+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2VudGVyV2lkZ2V0PXs8SHlwcmxhbmQuQWN0aXZlV2luZG93IC8+fVxuICAgICAgICAgICAgICAgICAgICBlbmRXaWRnZXQ9e1xuICAgICAgICAgICAgICAgICAgICAgICAgPGJveFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhleHBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxpZ249e0d0ay5BbGlnbi5FTkR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NzQ2xhc3Nlcz17W1wiQmFyUmlnaHRcIl19XG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEh5cHJsYW5kLlN5c1RyYXkgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UXVpY2tWaWV3LlF1aWNrVmlldyAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9ib3g+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA+PC9DZW50ZXJCb3g+XG4gICAgICAgICAgICB9XG4gICAgICAgID48L3dpbmRvdz5cbiAgICApO1xufTtcblxuY29uc3QgY2xpSGFuZGxlciA9IChhcmdzOiBzdHJpbmdbXSk6IHN0cmluZyA9PiB7XG4gICAgcmV0dXJuIFwiTm90IGltcGxlbWVudGVkXCI7XG59O1xuXG5jb25zdCBCYXJMYXVuY2hlciA9ICggbW9uaXRvcjogR2RrLk1vbml0b3IgKSA9PiAge1xuICAgIGNvbnN0IHdpbmRvd05hbWUgPSBgYmFyLSR7bW9uaXRvci5nZXRfY29ubmVjdG9yKCl9YFxuICAgIGNvbnN0IGNyZWF0ZUJhciA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIDxCYXIgZ2RrbW9uaXRvcj17bW9uaXRvcn0gbmFtZT17d2luZG93TmFtZX0+PC9CYXI+XG4gICAgfVxuXG4gICAgLy8gQWN0dWFsbHkgc3RhcnQgdGhlIGJhclxuICAgIGNyZWF0ZUJhcigpO1xuXG4gICAgcmV0dXJuIHdpbmRvd05hbWU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBCYXJMYXVuY2hlcixcbiAgICBjbGlIYW5kbGVyLFxufTtcbiIsICJpbXBvcnQgeyBBcHAgfSBmcm9tIFwiYXN0YWwvZ3RrNFwiXG5pbXBvcnQgc3R5bGUgZnJvbSBcIi4vc3R5bGUuc2Nzc1wiXG5pbXBvcnQgQmFyIGZyb20gXCIuL2NvbXBvbmVudHMvYmFyL0JhclwiO1xuaW1wb3J0IEFzdGFsSHlwcmxhbmQgZnJvbSBcImdpOi8vQXN0YWxIeXBybGFuZD92ZXJzaW9uPTAuMVwiO1xuaW1wb3J0IHsgaHlwclRvR2RrIH0gZnJvbSBcIi4vdXRpbC9oeXBybGFuZFwiO1xuXG5BcHAuc3RhcnQoe1xuICAgIGluc3RhbmNlTmFtZTogXCJydW5uZXJcIixcbiAgICBjc3M6IHN0eWxlLFxuICAgIG1haW4oKSB7XG4gICAgICAgIGNvbnN0IGh5cHIgPSBBc3RhbEh5cHJsYW5kLmdldF9kZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IGJhcnMgPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpO1xuXG4gICAgICAgIGNvbnN0IGJhckNyZWF0b3IgPSAoIG1vbml0b3I6IEFzdGFsSHlwcmxhbmQuTW9uaXRvciApID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGdka01vbml0b3IgPSBoeXByVG9HZGsoIG1vbml0b3IgKTtcbiAgICAgICAgICAgIGlmICggZ2RrTW9uaXRvciApIHtcbiAgICAgICAgICAgICAgICBwcmludCggJ0JhciBhZGRlZCBmb3Igc2NyZWVuICcgKyBtb25pdG9yLmdldF9pZCgpICk7XG4gICAgICAgICAgICAgICAgYmFycy5zZXQoIG1vbml0b3IuZ2V0X2lkKCksIEJhci5CYXJMYXVuY2hlciggZ2RrTW9uaXRvciApICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IG1vbml0b3Igb2YgaHlwci5tb25pdG9ycykge1xuICAgICAgICAgICAgYmFyQ3JlYXRvciggbW9uaXRvciApO1xuICAgICAgICB9XG5cbiAgICAgICAgaHlwci5jb25uZWN0KCAnbW9uaXRvci1hZGRlZCcsICggXywgbW9uaXRvciApID0+IHtcbiAgICAgICAgICAgIGJhckNyZWF0b3IoIG1vbml0b3IgKTtcbiAgICAgICAgfSApO1xuXG4gICAgICAgIGh5cHIuY29ubmVjdCggJ21vbml0b3ItcmVtb3ZlZCcsICggXywgbW9uaXRvciApID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdpbmRvd05hbWUgPSBiYXJzLmdldCggbW9uaXRvciApO1xuICAgICAgICAgICAgaWYgKCB3aW5kb3dOYW1lICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdpbiA9IEFwcC5nZXRfd2luZG93KCB3aW5kb3dOYW1lICk7XG4gICAgICAgICAgICAgICAgaWYgKCB3aW4gKSB7XG4gICAgICAgICAgICAgICAgICAgIEFwcC50b2dnbGVfd2luZG93KCB3aW5kb3dOYW1lICk7XG4gICAgICAgICAgICAgICAgICAgIHdpbi5zZXRfY2hpbGQoIG51bGwgKTtcbiAgICAgICAgICAgICAgICAgICAgQXBwLnJlbW92ZV93aW5kb3coIHdpbiApO1xuICAgICAgICAgICAgICAgICAgICBwcmludCggJ0JhciByZW1vdmVkIGZvciBzY3JlZW4nLCBtb25pdG9yICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJhcnMuZGVsZXRlKCBtb25pdG9yICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gKTtcbiAgICB9LFxuICAgIHJlcXVlc3RIYW5kbGVyKHJlcXVlc3QsIHJlcykge1xuICAgICAgICBjb25zdCBhcmdzID0gcmVxdWVzdC50cmltU3RhcnQoKS5zcGxpdCggJyAnICk7XG5cbiAgICAgICAgaWYgKCBhcmdzWyAwIF0gPT09ICdub3RpZmllcicgKSB7XG4gICAgICAgICAgICByZXMoICdOb3QgYXZhaWxhYmxlIGhlcmUgeWV0LCBydW4gYXN0YWwgLWkgbm90aWZpZXIgJyArIGFyZ3NbIDEgXSApO1xuICAgICAgICAgICAgLy8gcmVzKCBub3RpZmljYXRpb25zLmNsaUhhbmRsZXIoIGFyZ3MgKSApO1xuICAgICAgICB9IGVsc2UgaWYgKCBhcmdzWyAwIF0gPT09ICdiYXInICkge1xuICAgICAgICAgICAgcmVzKCBCYXIuY2xpSGFuZGxlciggYXJncyApICk7XG4gICAgICAgIH1cbiAgICB9LFxufSlcblxuIiwgIi8vIFx1MjUwQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHUyNTEwXG4vLyBcdTI1MDIgIEZyb20gaHR0cHM6Ly9naXRodWIuY29tL05ldXJhcmlhbi9tYXRzaGVsbCAgIFx1MjUwMlxuLy8gXHUyNTE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdTI1MThcbmltcG9ydCB7IEFwcCwgR2RrIH0gZnJvbSBcImFzdGFsL2d0azRcIjtcbmltcG9ydCBIeXBybGFuZCBmcm9tIFwiZ2k6Ly9Bc3RhbEh5cHJsYW5kXCI7XG5cbi8qIE1hdGNoIEh5cHJsYW5kIG1vbml0b3IgdG8gR0RLIG1vbml0b3JcblRISVMgTUFZIE5PVCBXT1JLIEFTIElOVEVOREVEIElGIFlPVSBIQVZFIE1PTklUT1JTIE9GIFRIRSBTQU1FIE1PREVMXG5JIGRpZCBub3QgZmluZCBhIG1vcmUgZWxlZ2FudCBzb2x1dGlvbiB0byB0aGlzLiBcbk9uIG15IHNldHVwIEdESyBjb29yZGluYXRlcyBhbmQgaHlwcmxhbmQgY29vcmRpbmF0ZXMgYXJlIGZsaXBwZWQsXG5zbyBJIGNhbnQgbWF0Y2ggYnkgY29vcmRpbmF0ZXMuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBoeXByVG9HZGsobW9uaXRvcjogSHlwcmxhbmQuTW9uaXRvcik6IEdkay5Nb25pdG9yIHwgbnVsbCB7XG4gICAgY29uc3QgbW9uaXRvcnMgPSBBcHAuZ2V0X21vbml0b3JzKCk7XG4gICAgaWYgKCFtb25pdG9ycyB8fCBtb25pdG9ycy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgZm9yIChsZXQgZ2RrbW9uaXRvciBvZiBtb25pdG9ycykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBtb25pdG9yICYmXG4gICAgICAgICAgICBnZGttb25pdG9yICYmXG4gICAgICAgICAgICBtb25pdG9yLmdldF9uYW1lKCkgPT09IGdka21vbml0b3IuZ2V0X2Nvbm5lY3RvcigpXG4gICAgICAgIClcbiAgICAgICAgICAgIHJldHVybiBnZGttb25pdG9yO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgbW9uaXRvciB3aXRoIG51bGwgc2FmZXR5XG4gICAgcmV0dXJuIG1vbml0b3JzLmxlbmd0aCA+IDAgPyBtb25pdG9yc1swXSA6IG51bGw7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPQSxZQUFXO0FBQ2xCLE9BQU9DLFVBQVM7QUFDaEIsT0FBT0MsVUFBUzs7O0FDRmhCLE9BQU9DLFlBQVc7OztBQ0FYLElBQU0sV0FBVyxDQUFDLFFBQWdCLElBQ3BDLFFBQVEsbUJBQW1CLE9BQU8sRUFDbEMsV0FBVyxLQUFLLEdBQUcsRUFDbkIsWUFBWTtBQUVWLElBQU0sV0FBVyxDQUFDLFFBQWdCLElBQ3BDLFFBQVEsbUJBQW1CLE9BQU8sRUFDbEMsV0FBVyxLQUFLLEdBQUcsRUFDbkIsWUFBWTtBQWNWLElBQU0sVUFBTixNQUFNLFNBQWU7QUFBQSxFQUNoQixjQUFjLENBQUMsTUFBVztBQUFBLEVBRWxDO0FBQUEsRUFDQTtBQUFBLEVBU0EsT0FBTyxLQUFLLFNBQXFDLE1BQWU7QUFDNUQsV0FBTyxJQUFJLFNBQVEsU0FBUyxJQUFJO0FBQUEsRUFDcEM7QUFBQSxFQUVRLFlBQVksU0FBNEMsTUFBZTtBQUMzRSxTQUFLLFdBQVc7QUFDaEIsU0FBSyxRQUFRLFFBQVEsU0FBUyxJQUFJO0FBQUEsRUFDdEM7QUFBQSxFQUVBLFdBQVc7QUFDUCxXQUFPLFdBQVcsS0FBSyxRQUFRLEdBQUcsS0FBSyxRQUFRLE1BQU0sS0FBSyxLQUFLLE1BQU0sRUFBRTtBQUFBLEVBQzNFO0FBQUEsRUFFQSxHQUFNLElBQWlDO0FBQ25DLFVBQU1DLFFBQU8sSUFBSSxTQUFRLEtBQUssVUFBVSxLQUFL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QUksWUFBYSxVQUFXLENBQUU7QUFBQSxNQUM5RDtBQUFBLElBQ0o7QUFFQSxlQUFXLFdBQVdELE1BQUssVUFBVTtBQUNqQyxpQkFBWSxPQUFRO0FBQUEsSUFDeEI7QUFFQSxJQUFBQSxNQUFLLFFBQVMsaUJBQWlCLENBQUUsR0FBRyxZQUFhO0FBQzdDLGlCQUFZLE9BQVE7QUFBQSxJQUN4QixDQUFFO0FBRUYsSUFBQUEsTUFBSyxRQUFTLG1CQUFtQixDQUFFLEdBQUcsWUFBYTtBQUMvQyxZQUFNLGFBQWEsS0FBSyxJQUFLLE9BQVE7QUFDckMsVUFBSyxZQUFhO0FBQ2QsY0FBTSxNQUFNLFlBQUksV0FBWSxVQUFXO0FBQ3ZDLFlBQUssS0FBTTtBQUNQLHNCQUFJLGNBQWUsVUFBVztBQUM5QixjQUFJLFVBQVcsSUFBSztBQUNwQixzQkFBSSxjQUFlLEdBQUk7QUFDdkIsZ0JBQU8sMEJBQTBCLE9BQVE7QUFBQSxRQUM3QztBQUNBLGFBQUssT0FBUSxPQUFRO0FBQUEsTUFDekI7QUFBQSxJQUNKLENBQUU7QUFBQSxFQUNOO0FBQUEsRUFDQSxlQUFlLFNBQVMsS0FBSztBQUN6QixVQUFNLE9BQU8sUUFBUSxVQUFVLEVBQUUsTUFBTyxHQUFJO0FBRTVDLFFBQUssS0FBTSxDQUFFLE1BQU0sWUFBYTtBQUM1QixVQUFLLG1EQUFtRCxLQUFNLENBQUUsQ0FBRTtBQUFBLElBRXRFLFdBQVksS0FBTSxDQUFFLE1BQU0sT0FBUTtBQUM5QixVQUFLLFlBQUksV0FBWSxJQUFLLENBQUU7QUFBQSxJQUNoQztBQUFBLEVBQ0o7QUFDSixDQUFDOyIsCiAgIm5hbWVzIjogWyJBc3RhbCIsICJHdGsiLCAiR2RrIiwgIkFzdGFsIiwgImJpbmQiLCAiaW50ZXJ2YWwiLCAiQXN0YWwiLCAiQXN0YWwiLCAidiIsICJpbnRlcnZhbCIsICJleGVjIiwgImN0b3JzIiwgIkd0ayIsICJBc3RhbCIsICJzbmFrZWlmeSIsICJwYXRjaCIsICJXb3Jrc3BhY2UiLCAiQXVkaW8iLCAiR3RrIiwgIkFzdGFsIiwgIkFzdGFsIiwgIkd0ayIsICJHdGsiLCAiQXN0YWwiLCAiY2giLCAiZGVmYXVsdCIsICJBc3RhbCIsICJBc3RhbCIsICJBc3RhbCIsICJHT2JqZWN0IiwgImRlZmF1bHQiLCAiR09iamVjdCIsICJrZWJhYmlmeSIsICJqc3giLCAiR09iamVjdCIsICJHdGsiLCAianN4IiwgIlRpbWUiLCAiZGVmYXVsdCIsICJHdGsiLCAianN4IiwgIkFzdGFsQmx1ZXRvb3RoIiwgIkFzdGFsTmV0d29yayIsICJBc3RhbFdwIiwgIkdPYmplY3QiLCAiR3RrIiwgImpzeCIsICJqc3giLCAidHlwZSIsICJHdGsiLCAianN4IiwgIkd0ayIsICJqc3giLCAianN4IiwgIkFMSUdOIiwgIkd0ayIsICJqc3giLCAianN4IiwgIkd0ayIsICJBc3RhbE5ldHdvcmsiLCAiR3RrIiwgImpzeCIsICJBc3RhbE5ldHdvcmsiLCAianN4IiwgIkd0ayIsICJqc3giLCAiU1RBVEUiLCAiQXN0YWxOZXR3b3JrIiwgImpzeCIsICJuZXR3b3JrIiwgIkFzdGFsQmx1ZXRvb3RoIiwgImVuYWJsZWQiLCAiYnJpZ2h0bmVzcyIsICJBc3RhbFdwIiwgIkd0ayIsICJqc3giLCAiR3RrIiwgIkFzdGFsIiwgImpzeCIsICJHdGsiLCAiQXN0YWxIeXBybGFuZCIsICJoeXByIiwgIkFzdGFsSHlwcmxhbmQiXQp9Cg== diff --git a/config/astal/wrapper.sh b/config/astal/wrapper.sh new file mode 100755 index 0000000..0ef6be2 --- /dev/null +++ b/config/astal/wrapper.sh @@ -0,0 +1,2 @@ +#!/bin/bash +LD_PRELOAD="@LAYER_SHELL_LIBDIR@/libgtk4-layer-shell.so" @MAIN_PROGRAM@ $@ diff --git a/config/hypr/hyprland/general.conf b/config/hypr/hyprland/general.conf index 5584f28..1080fe1 100644 --- a/config/hypr/hyprland/general.conf +++ b/config/hypr/hyprland/general.conf @@ -5,17 +5,17 @@ # ──────────────────────────────────────────────────────────────────── source = ./colors.conf -exec-once = ags run ~/projects/active/dotfiles/config/ags/notifications/ exec-once = ~/.config/hypr/xdg-portal-hyprland exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP XAUTHORITY DISPLAY exec-once = systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP exec-once = /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 # exec-once = waybar -exec-once = /bin/bash -c "ags run ~/projects/active/dotfiles/config/astal --gtk4" exec-once = hypridle - exec-once = nm-applet exec-once = nextcloud --background +exec = ags run ~/projects/active/dotfiles/config/astal/ --gtk4 +exec = ags run ~/projects/active/dotfiles/config/ags/notifications/ + exec = hyprctl setcursor oreo_spark_blue_cursors 24 diff --git a/setup b/setup index a5dd634..8f04e37 100755 --- a/setup +++ b/setup @@ -68,6 +68,16 @@ cp -r ./config/wlogout/ ~/.config/ cp -r ./config/yazi ~/.config/ cp -r ./config/zathura ~/.config/ +echo " + => Bundling Astal projects +" + +cd ./config/astal +ags bundle app.ts runner + +cd ../ags/notifications +ags bundle app.ts notifier + echo " => Installing yazi plugins "