");
+ return t.fl();
+}, partials: {}, subs: {} });
+defaultTemplates["tag-file-added"] = new Hogan2.Template({ code: function(c, p, i) {
+ var t = this;
+ t.b(i = i || "");
+ t.b('ADDED');
+ return t.fl();
+}, partials: {}, subs: {} });
+defaultTemplates["tag-file-changed"] = new Hogan2.Template({ code: function(c, p, i) {
+ var t = this;
+ t.b(i = i || "");
+ t.b('CHANGED');
+ return t.fl();
+}, partials: {}, subs: {} });
+defaultTemplates["tag-file-deleted"] = new Hogan2.Template({ code: function(c, p, i) {
+ var t = this;
+ t.b(i = i || "");
+ t.b('DELETED');
+ return t.fl();
+}, partials: {}, subs: {} });
+defaultTemplates["tag-file-renamed"] = new Hogan2.Template({ code: function(c, p, i) {
+ var t = this;
+ t.b(i = i || "");
+ t.b('RENAMED');
+ return t.fl();
+}, partials: {}, subs: {} });
+
+// node_modules/.pnpm/diff2html@3.4.47/node_modules/diff2html/lib-esm/hoganjs-utils.js
+var HoganJsUtils = class {
+ constructor({ compiledTemplates = {}, rawTemplates = {} }) {
+ const compiledRawTemplates = Object.entries(rawTemplates).reduce((previousTemplates, [name, templateString]) => {
+ const compiledTemplate = Hogan3.compile(templateString, { asString: false });
+ return Object.assign(Object.assign({}, previousTemplates), { [name]: compiledTemplate });
+ }, {});
+ this.preCompiledTemplates = Object.assign(Object.assign(Object.assign({}, defaultTemplates), compiledTemplates), compiledRawTemplates);
+ }
+ static compile(templateString) {
+ return Hogan3.compile(templateString, { asString: false });
+ }
+ render(namespace, view, params, partials, indent2) {
+ const templateKey = this.templateKey(namespace, view);
+ try {
+ const template = this.preCompiledTemplates[templateKey];
+ return template.render(params, partials, indent2);
+ } catch (e) {
+ throw new Error(`Could not find template to render '${templateKey}'`);
+ }
+ }
+ template(namespace, view) {
+ return this.preCompiledTemplates[this.templateKey(namespace, view)];
+ }
+ templateKey(namespace, view) {
+ return `${namespace}-${view}`;
+ }
+};
+
+// node_modules/.pnpm/diff2html@3.4.47/node_modules/diff2html/lib-esm/diff2html.js
+var defaultDiff2HtmlConfig = Object.assign(Object.assign(Object.assign({}, defaultLineByLineRendererConfig), defaultSideBySideRendererConfig), { outputFormat: OutputFormatType.LINE_BY_LINE, drawFileList: true });
+function html(diffInput, configuration = {}) {
+ const config = Object.assign(Object.assign({}, defaultDiff2HtmlConfig), configuration);
+ const diffJson = typeof diffInput === "string" ? parse(diffInput, config) : diffInput;
+ const hoganUtils = new HoganJsUtils(config);
+ const { colorScheme } = config;
+ const fileListRendererConfig = { colorScheme };
+ const fileList = config.drawFileList ? new FileListRenderer(hoganUtils, fileListRendererConfig).render(diffJson) : "";
+ const diffOutput = config.outputFormat === "side-by-side" ? new SideBySideRenderer(hoganUtils, config).render(diffJson) : new LineByLineRenderer(hoganUtils, config).render(diffJson);
+ return fileList + diffOutput;
+}
+
+// src/ui/diff/diffView.ts
+var import_obsidian17 = require("obsidian");
+var DiffView = class extends import_obsidian17.ItemView {
+ constructor(leaf, plugin) {
+ super(leaf);
+ this.plugin = plugin;
+ this.gettingDiff = false;
+ this.gitRefreshBind = this.refresh.bind(this);
+ this.gitViewRefreshBind = this.refresh.bind(this);
+ this.parser = new DOMParser();
+ this.navigation = true;
+ addEventListener("git-refresh", this.gitRefreshBind);
+ addEventListener("git-view-refresh", this.gitViewRefreshBind);
+ }
+ getViewType() {
+ return DIFF_VIEW_CONFIG.type;
+ }
+ getDisplayText() {
+ var _a2;
+ if (((_a2 = this.state) == null ? void 0 : _a2.file) != null) {
+ let fileName = this.state.file.split("/").last();
+ if (fileName == null ? void 0 : fileName.endsWith(".md"))
+ fileName = fileName.slice(0, -3);
+ return DIFF_VIEW_CONFIG.name + ` (${fileName})`;
+ }
+ return DIFF_VIEW_CONFIG.name;
+ }
+ getIcon() {
+ return DIFF_VIEW_CONFIG.icon;
+ }
+ async setState(state, result) {
+ this.state = state;
+ if (import_obsidian17.Platform.isMobile) {
+ this.leaf.view.titleEl.textContent = this.getDisplayText();
+ }
+ await this.refresh();
+ }
+ getState() {
+ return this.state;
+ }
+ onClose() {
+ removeEventListener("git-refresh", this.gitRefreshBind);
+ removeEventListener("git-view-refresh", this.gitViewRefreshBind);
+ return super.onClose();
+ }
+ onOpen() {
+ this.refresh();
+ return super.onOpen();
+ }
+ async refresh() {
+ var _a2;
+ if (((_a2 = this.state) == null ? void 0 : _a2.file) && !this.gettingDiff && this.plugin.gitManager) {
+ this.gettingDiff = true;
+ try {
+ let diff3 = await this.plugin.gitManager.getDiffString(
+ this.state.file,
+ this.state.staged,
+ this.state.hash
+ );
+ this.contentEl.empty();
+ if (!diff3) {
+ if (this.plugin.gitManager instanceof SimpleGit && await this.plugin.gitManager.isTracked(
+ this.state.file
+ )) {
+ diff3 = [
+ `--- ${this.state.file}`,
+ `+++ ${this.state.file}`,
+ ""
+ ].join("\n");
+ } else {
+ const content = await this.app.vault.adapter.read(
+ this.plugin.gitManager.getRelativeVaultPath(
+ this.state.file
+ )
+ );
+ const header = `--- /dev/null
++++ ${this.state.file}
+@@ -0,0 +1,${content.split("\n").length} @@`;
+ diff3 = [
+ ...header.split("\n"),
+ ...content.split("\n").map((line) => `+${line}`)
+ ].join("\n");
+ }
+ }
+ const diffEl = this.parser.parseFromString(html(diff3), "text/html").querySelector(".d2h-file-diff");
+ this.contentEl.append(diffEl);
+ } finally {
+ this.gettingDiff = false;
+ }
+ }
+ }
+};
+
+// src/ui/history/historyView.ts
+init_polyfill_buffer();
+var import_obsidian21 = require("obsidian");
+
+// src/ui/history/historyView.svelte
+init_polyfill_buffer();
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/index.js
+init_polyfill_buffer();
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/animations.js
+init_polyfill_buffer();
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/utils.js
+init_polyfill_buffer();
+function noop() {
+}
+var identity = (x) => x;
+function run(fn) {
+ return fn();
+}
+function blank_object() {
+ return /* @__PURE__ */ Object.create(null);
+}
+function run_all(fns) {
+ fns.forEach(run);
+}
+function is_function(thing) {
+ return typeof thing === "function";
+}
+function safe_not_equal(a, b) {
+ return a != a ? b == b : a !== b || a && typeof a === "object" || typeof a === "function";
+}
+function is_empty(obj) {
+ return Object.keys(obj).length === 0;
+}
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/environment.js
+init_polyfill_buffer();
+var is_client = typeof window !== "undefined";
+var now = is_client ? () => window.performance.now() : () => Date.now();
+var raf = is_client ? (cb) => requestAnimationFrame(cb) : noop;
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/loop.js
+init_polyfill_buffer();
+var tasks = /* @__PURE__ */ new Set();
+function run_tasks(now2) {
+ tasks.forEach((task) => {
+ if (!task.c(now2)) {
+ tasks.delete(task);
+ task.f();
+ }
+ });
+ if (tasks.size !== 0)
+ raf(run_tasks);
+}
+function loop(callback) {
+ let task;
+ if (tasks.size === 0)
+ raf(run_tasks);
+ return {
+ promise: new Promise((fulfill) => {
+ tasks.add(task = { c: callback, f: fulfill });
+ }),
+ abort() {
+ tasks.delete(task);
+ }
+ };
+}
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/style_manager.js
+init_polyfill_buffer();
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/dom.js
+init_polyfill_buffer();
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/ResizeObserverSingleton.js
+init_polyfill_buffer();
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/globals.js
+init_polyfill_buffer();
+var globals = typeof window !== "undefined" ? window : typeof globalThis !== "undefined" ? globalThis : (
+ // @ts-ignore Node typings have this
+ global
+);
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/ResizeObserverSingleton.js
+var ResizeObserverSingleton = class _ResizeObserverSingleton {
+ /** @param {ResizeObserverOptions} options */
+ constructor(options) {
+ /**
+ * @private
+ * @readonly
+ * @type {WeakMap}
+ */
+ __publicField(this, "_listeners", "WeakMap" in globals ? /* @__PURE__ */ new WeakMap() : void 0);
+ /**
+ * @private
+ * @type {ResizeObserver}
+ */
+ __publicField(this, "_observer");
+ /** @type {ResizeObserverOptions} */
+ __publicField(this, "options");
+ this.options = options;
+ }
+ /**
+ * @param {Element} element
+ * @param {import('./private.js').Listener} listener
+ * @returns {() => void}
+ */
+ observe(element2, listener) {
+ this._listeners.set(element2, listener);
+ this._getObserver().observe(element2, this.options);
+ return () => {
+ this._listeners.delete(element2);
+ this._observer.unobserve(element2);
+ };
+ }
+ /**
+ * @private
+ */
+ _getObserver() {
+ var _a2;
+ return (_a2 = this._observer) != null ? _a2 : this._observer = new ResizeObserver((entries) => {
+ var _a3;
+ for (const entry of entries) {
+ _ResizeObserverSingleton.entries.set(entry.target, entry);
+ (_a3 = this._listeners.get(entry.target)) == null ? void 0 : _a3(entry);
+ }
+ });
+ }
+};
+ResizeObserverSingleton.entries = "WeakMap" in globals ? /* @__PURE__ */ new WeakMap() : void 0;
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/dom.js
+var is_hydrating = false;
+function start_hydrating() {
+ is_hydrating = true;
+}
+function end_hydrating() {
+ is_hydrating = false;
+}
+function append2(target, node) {
+ target.appendChild(node);
+}
+function append_styles(target, style_sheet_id, styles) {
+ const append_styles_to = get_root_for_style(target);
+ if (!append_styles_to.getElementById(style_sheet_id)) {
+ const style = element("style");
+ style.id = style_sheet_id;
+ style.textContent = styles;
+ append_stylesheet(append_styles_to, style);
+ }
+}
+function get_root_for_style(node) {
+ if (!node)
+ return document;
+ const root2 = node.getRootNode ? node.getRootNode() : node.ownerDocument;
+ if (root2 && /** @type {ShadowRoot} */
+ root2.host) {
+ return (
+ /** @type {ShadowRoot} */
+ root2
+ );
+ }
+ return node.ownerDocument;
+}
+function append_empty_stylesheet(node) {
+ const style_element = element("style");
+ style_element.textContent = "/* empty */";
+ append_stylesheet(get_root_for_style(node), style_element);
+ return style_element.sheet;
+}
+function append_stylesheet(node, style) {
+ append2(
+ /** @type {Document} */
+ node.head || node,
+ style
+ );
+ return style.sheet;
+}
+function insert(target, node, anchor) {
+ target.insertBefore(node, anchor || null);
+}
+function detach(node) {
+ if (node.parentNode) {
+ node.parentNode.removeChild(node);
+ }
+}
+function destroy_each(iterations, detaching) {
+ for (let i = 0; i < iterations.length; i += 1) {
+ if (iterations[i])
+ iterations[i].d(detaching);
+ }
+}
+function element(name) {
+ return document.createElement(name);
+}
+function text(data) {
+ return document.createTextNode(data);
+}
+function space() {
+ return text(" ");
+}
+function empty() {
+ return text("");
+}
+function listen(node, event, handler, options) {
+ node.addEventListener(event, handler, options);
+ return () => node.removeEventListener(event, handler, options);
+}
+function stop_propagation(fn) {
+ return function(event) {
+ event.stopPropagation();
+ return fn.call(this, event);
+ };
+}
+function attr(node, attribute, value) {
+ if (value == null)
+ node.removeAttribute(attribute);
+ else if (node.getAttribute(attribute) !== value)
+ node.setAttribute(attribute, value);
+}
+function children(element2) {
+ return Array.from(element2.childNodes);
+}
+function set_data(text2, data) {
+ data = "" + data;
+ if (text2.data === data)
+ return;
+ text2.data = /** @type {string} */
+ data;
+}
+function set_input_value(input, value) {
+ input.value = value == null ? "" : value;
+}
+function set_style(node, key2, value, important) {
+ if (value == null) {
+ node.style.removeProperty(key2);
+ } else {
+ node.style.setProperty(key2, value, important ? "important" : "");
+ }
+}
+function toggle_class(element2, name, toggle) {
+ element2.classList.toggle(name, !!toggle);
+}
+function custom_event(type, detail, { bubbles = false, cancelable = false } = {}) {
+ return new CustomEvent(type, { detail, bubbles, cancelable });
+}
+function get_custom_elements_slots(element2) {
+ const result = {};
+ element2.childNodes.forEach(
+ /** @param {Element} node */
+ (node) => {
+ result[node.slot || "default"] = true;
+ }
+ );
+ return result;
+}
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/style_manager.js
+var managed_styles = /* @__PURE__ */ new Map();
+var active = 0;
+function hash(str) {
+ let hash2 = 5381;
+ let i = str.length;
+ while (i--)
+ hash2 = (hash2 << 5) - hash2 ^ str.charCodeAt(i);
+ return hash2 >>> 0;
+}
+function create_style_information(doc, node) {
+ const info = { stylesheet: append_empty_stylesheet(node), rules: {} };
+ managed_styles.set(doc, info);
+ return info;
+}
+function create_rule(node, a, b, duration, delay2, ease, fn, uid = 0) {
+ const step = 16.666 / duration;
+ let keyframes = "{\n";
+ for (let p = 0; p <= 1; p += step) {
+ const t = a + (b - a) * ease(p);
+ keyframes += p * 100 + `%{${fn(t, 1 - t)}}
+`;
+ }
+ const rule = keyframes + `100% {${fn(b, 1 - b)}}
+}`;
+ const name = `__svelte_${hash(rule)}_${uid}`;
+ const doc = get_root_for_style(node);
+ const { stylesheet, rules } = managed_styles.get(doc) || create_style_information(doc, node);
+ if (!rules[name]) {
+ rules[name] = true;
+ stylesheet.insertRule(`@keyframes ${name} ${rule}`, stylesheet.cssRules.length);
+ }
+ const animation = node.style.animation || "";
+ node.style.animation = `${animation ? `${animation}, ` : ""}${name} ${duration}ms linear ${delay2}ms 1 both`;
+ active += 1;
+ return name;
+}
+function delete_rule(node, name) {
+ const previous = (node.style.animation || "").split(", ");
+ const next = previous.filter(
+ name ? (anim) => anim.indexOf(name) < 0 : (anim) => anim.indexOf("__svelte") === -1
+ // remove all Svelte animations
+ );
+ const deleted = previous.length - next.length;
+ if (deleted) {
+ node.style.animation = next.join(", ");
+ active -= deleted;
+ if (!active)
+ clear_rules();
+ }
+}
+function clear_rules() {
+ raf(() => {
+ if (active)
+ return;
+ managed_styles.forEach((info) => {
+ const { ownerNode } = info.stylesheet;
+ if (ownerNode)
+ detach(ownerNode);
+ });
+ managed_styles.clear();
+ });
+}
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/await_block.js
+init_polyfill_buffer();
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/transitions.js
+init_polyfill_buffer();
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/scheduler.js
+init_polyfill_buffer();
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/lifecycle.js
+init_polyfill_buffer();
+var current_component;
+function set_current_component(component) {
+ current_component = component;
+}
+function get_current_component() {
+ if (!current_component)
+ throw new Error("Function called outside component initialization");
+ return current_component;
+}
+function onDestroy(fn) {
+ get_current_component().$$.on_destroy.push(fn);
+}
+function bubble(component, event) {
+ const callbacks = component.$$.callbacks[event.type];
+ if (callbacks) {
+ callbacks.slice().forEach((fn) => fn.call(this, event));
+ }
+}
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/scheduler.js
+var dirty_components = [];
+var binding_callbacks = [];
+var render_callbacks = [];
+var flush_callbacks = [];
+var resolved_promise = /* @__PURE__ */ Promise.resolve();
+var update_scheduled = false;
+function schedule_update() {
+ if (!update_scheduled) {
+ update_scheduled = true;
+ resolved_promise.then(flush);
+ }
+}
+function add_render_callback(fn) {
+ render_callbacks.push(fn);
+}
+var seen_callbacks = /* @__PURE__ */ new Set();
+var flushidx = 0;
+function flush() {
+ if (flushidx !== 0) {
+ return;
+ }
+ const saved_component = current_component;
+ do {
+ try {
+ while (flushidx < dirty_components.length) {
+ const component = dirty_components[flushidx];
+ flushidx++;
+ set_current_component(component);
+ update(component.$$);
+ }
+ } catch (e) {
+ dirty_components.length = 0;
+ flushidx = 0;
+ throw e;
+ }
+ set_current_component(null);
+ dirty_components.length = 0;
+ flushidx = 0;
+ while (binding_callbacks.length)
+ binding_callbacks.pop()();
+ for (let i = 0; i < render_callbacks.length; i += 1) {
+ const callback = render_callbacks[i];
+ if (!seen_callbacks.has(callback)) {
+ seen_callbacks.add(callback);
+ callback();
+ }
+ }
+ render_callbacks.length = 0;
+ } while (dirty_components.length);
+ while (flush_callbacks.length) {
+ flush_callbacks.pop()();
+ }
+ update_scheduled = false;
+ seen_callbacks.clear();
+ set_current_component(saved_component);
+}
+function update($$) {
+ if ($$.fragment !== null) {
+ $$.update();
+ run_all($$.before_update);
+ const dirty = $$.dirty;
+ $$.dirty = [-1];
+ $$.fragment && $$.fragment.p($$.ctx, dirty);
+ $$.after_update.forEach(add_render_callback);
+ }
+}
+function flush_render_callbacks(fns) {
+ const filtered = [];
+ const targets = [];
+ render_callbacks.forEach((c) => fns.indexOf(c) === -1 ? filtered.push(c) : targets.push(c));
+ targets.forEach((c) => c());
+ render_callbacks = filtered;
+}
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/transitions.js
+var promise;
+function wait() {
+ if (!promise) {
+ promise = Promise.resolve();
+ promise.then(() => {
+ promise = null;
+ });
+ }
+ return promise;
+}
+function dispatch(node, direction, kind) {
+ node.dispatchEvent(custom_event(`${direction ? "intro" : "outro"}${kind}`));
+}
+var outroing = /* @__PURE__ */ new Set();
+var outros;
+function group_outros() {
+ outros = {
+ r: 0,
+ c: [],
+ p: outros
+ // parent group
+ };
+}
+function check_outros() {
+ if (!outros.r) {
+ run_all(outros.c);
+ }
+ outros = outros.p;
+}
+function transition_in(block, local) {
+ if (block && block.i) {
+ outroing.delete(block);
+ block.i(local);
+ }
+}
+function transition_out(block, local, detach2, callback) {
+ if (block && block.o) {
+ if (outroing.has(block))
+ return;
+ outroing.add(block);
+ outros.c.push(() => {
+ outroing.delete(block);
+ if (callback) {
+ if (detach2)
+ block.d(1);
+ callback();
+ }
+ });
+ block.o(local);
+ } else if (callback) {
+ callback();
+ }
+}
+var null_transition = { duration: 0 };
+function create_bidirectional_transition(node, fn, params, intro) {
+ const options = { direction: "both" };
+ let config = fn(node, params, options);
+ let t = intro ? 0 : 1;
+ let running_program = null;
+ let pending_program = null;
+ let animation_name = null;
+ let original_inert_value;
+ function clear_animation() {
+ if (animation_name)
+ delete_rule(node, animation_name);
+ }
+ function init3(program, duration) {
+ const d = (
+ /** @type {Program['d']} */
+ program.b - t
+ );
+ duration *= Math.abs(d);
+ return {
+ a: t,
+ b: program.b,
+ d,
+ duration,
+ start: program.start,
+ end: program.start + duration,
+ group: program.group
+ };
+ }
+ function go(b) {
+ const {
+ delay: delay2 = 0,
+ duration = 300,
+ easing = identity,
+ tick: tick2 = noop,
+ css
+ } = config || null_transition;
+ const program = {
+ start: now() + delay2,
+ b
+ };
+ if (!b) {
+ program.group = outros;
+ outros.r += 1;
+ }
+ if ("inert" in node) {
+ if (b) {
+ if (original_inert_value !== void 0) {
+ node.inert = original_inert_value;
+ }
+ } else {
+ original_inert_value = /** @type {HTMLElement} */
+ node.inert;
+ node.inert = true;
+ }
+ }
+ if (running_program || pending_program) {
+ pending_program = program;
+ } else {
+ if (css) {
+ clear_animation();
+ animation_name = create_rule(node, t, b, duration, delay2, easing, css);
+ }
+ if (b)
+ tick2(0, 1);
+ running_program = init3(program, duration);
+ add_render_callback(() => dispatch(node, b, "start"));
+ loop((now2) => {
+ if (pending_program && now2 > pending_program.start) {
+ running_program = init3(pending_program, duration);
+ pending_program = null;
+ dispatch(node, running_program.b, "start");
+ if (css) {
+ clear_animation();
+ animation_name = create_rule(
+ node,
+ t,
+ running_program.b,
+ running_program.duration,
+ 0,
+ easing,
+ config.css
+ );
+ }
+ }
+ if (running_program) {
+ if (now2 >= running_program.end) {
+ tick2(t = running_program.b, 1 - t);
+ dispatch(node, running_program.b, "end");
+ if (!pending_program) {
+ if (running_program.b) {
+ clear_animation();
+ } else {
+ if (!--running_program.group.r)
+ run_all(running_program.group.c);
+ }
+ }
+ running_program = null;
+ } else if (now2 >= running_program.start) {
+ const p = now2 - running_program.start;
+ t = running_program.a + running_program.d * easing(p / running_program.duration);
+ tick2(t, 1 - t);
+ }
+ }
+ return !!(running_program || pending_program);
+ });
+ }
+ }
+ return {
+ run(b) {
+ if (is_function(config)) {
+ wait().then(() => {
+ const opts = { direction: b ? "in" : "out" };
+ config = config(opts);
+ go(b);
+ });
+ } else {
+ go(b);
+ }
+ },
+ end() {
+ clear_animation();
+ running_program = pending_program = null;
+ }
+ };
+}
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/each.js
+init_polyfill_buffer();
+function ensure_array_like(array_like_or_iterator) {
+ return (array_like_or_iterator == null ? void 0 : array_like_or_iterator.length) !== void 0 ? array_like_or_iterator : Array.from(array_like_or_iterator);
+}
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/spread.js
+init_polyfill_buffer();
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/ssr.js
+init_polyfill_buffer();
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/shared/boolean_attributes.js
+init_polyfill_buffer();
+var _boolean_attributes = (
+ /** @type {const} */
+ [
+ "allowfullscreen",
+ "allowpaymentrequest",
+ "async",
+ "autofocus",
+ "autoplay",
+ "checked",
+ "controls",
+ "default",
+ "defer",
+ "disabled",
+ "formnovalidate",
+ "hidden",
+ "inert",
+ "ismap",
+ "loop",
+ "multiple",
+ "muted",
+ "nomodule",
+ "novalidate",
+ "open",
+ "playsinline",
+ "readonly",
+ "required",
+ "reversed",
+ "selected"
+ ]
+);
+var boolean_attributes = /* @__PURE__ */ new Set([..._boolean_attributes]);
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/shared/utils/names.js
+init_polyfill_buffer();
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/Component.js
+init_polyfill_buffer();
+function create_component(block) {
+ block && block.c();
+}
+function mount_component(component, target, anchor) {
+ const { fragment, after_update } = component.$$;
+ fragment && fragment.m(target, anchor);
+ add_render_callback(() => {
+ const new_on_destroy = component.$$.on_mount.map(run).filter(is_function);
+ if (component.$$.on_destroy) {
+ component.$$.on_destroy.push(...new_on_destroy);
+ } else {
+ run_all(new_on_destroy);
+ }
+ component.$$.on_mount = [];
+ });
+ after_update.forEach(add_render_callback);
+}
+function destroy_component(component, detaching) {
+ const $$ = component.$$;
+ if ($$.fragment !== null) {
+ flush_render_callbacks($$.after_update);
+ run_all($$.on_destroy);
+ $$.fragment && $$.fragment.d(detaching);
+ $$.on_destroy = $$.fragment = null;
+ $$.ctx = [];
+ }
+}
+function make_dirty(component, i) {
+ if (component.$$.dirty[0] === -1) {
+ dirty_components.push(component);
+ schedule_update();
+ component.$$.dirty.fill(0);
+ }
+ component.$$.dirty[i / 31 | 0] |= 1 << i % 31;
+}
+function init2(component, options, instance10, create_fragment10, not_equal, props, append_styles2 = null, dirty = [-1]) {
+ const parent_component = current_component;
+ set_current_component(component);
+ const $$ = component.$$ = {
+ fragment: null,
+ ctx: [],
+ // state
+ props,
+ update: noop,
+ not_equal,
+ bound: blank_object(),
+ // lifecycle
+ on_mount: [],
+ on_destroy: [],
+ on_disconnect: [],
+ before_update: [],
+ after_update: [],
+ context: new Map(options.context || (parent_component ? parent_component.$$.context : [])),
+ // everything else
+ callbacks: blank_object(),
+ dirty,
+ skip_bound: false,
+ root: options.target || parent_component.$$.root
+ };
+ append_styles2 && append_styles2($$.root);
+ let ready = false;
+ $$.ctx = instance10 ? instance10(component, options.props || {}, (i, ret, ...rest) => {
+ const value = rest.length ? rest[0] : ret;
+ if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {
+ if (!$$.skip_bound && $$.bound[i])
+ $$.bound[i](value);
+ if (ready)
+ make_dirty(component, i);
+ }
+ return ret;
+ }) : [];
+ $$.update();
+ ready = true;
+ run_all($$.before_update);
+ $$.fragment = create_fragment10 ? create_fragment10($$.ctx) : false;
+ if (options.target) {
+ if (options.hydrate) {
+ start_hydrating();
+ const nodes = children(options.target);
+ $$.fragment && $$.fragment.l(nodes);
+ nodes.forEach(detach);
+ } else {
+ $$.fragment && $$.fragment.c();
+ }
+ if (options.intro)
+ transition_in(component.$$.fragment);
+ mount_component(component, options.target, options.anchor);
+ end_hydrating();
+ flush();
+ }
+ set_current_component(parent_component);
+}
+var SvelteElement;
+if (typeof HTMLElement === "function") {
+ SvelteElement = class extends HTMLElement {
+ constructor($$componentCtor, $$slots, use_shadow_dom) {
+ super();
+ /** The Svelte component constructor */
+ __publicField(this, "$$ctor");
+ /** Slots */
+ __publicField(this, "$$s");
+ /** The Svelte component instance */
+ __publicField(this, "$$c");
+ /** Whether or not the custom element is connected */
+ __publicField(this, "$$cn", false);
+ /** Component props data */
+ __publicField(this, "$$d", {});
+ /** `true` if currently in the process of reflecting component props back to attributes */
+ __publicField(this, "$$r", false);
+ /** @type {Record} Props definition (name, reflected, type etc) */
+ __publicField(this, "$$p_d", {});
+ /** @type {Record} Event listeners */
+ __publicField(this, "$$l", {});
+ /** @type {Map} Event listener unsubscribe functions */
+ __publicField(this, "$$l_u", /* @__PURE__ */ new Map());
+ this.$$ctor = $$componentCtor;
+ this.$$s = $$slots;
+ if (use_shadow_dom) {
+ this.attachShadow({ mode: "open" });
+ }
+ }
+ addEventListener(type, listener, options) {
+ this.$$l[type] = this.$$l[type] || [];
+ this.$$l[type].push(listener);
+ if (this.$$c) {
+ const unsub = this.$$c.$on(type, listener);
+ this.$$l_u.set(listener, unsub);
+ }
+ super.addEventListener(type, listener, options);
+ }
+ removeEventListener(type, listener, options) {
+ super.removeEventListener(type, listener, options);
+ if (this.$$c) {
+ const unsub = this.$$l_u.get(listener);
+ if (unsub) {
+ unsub();
+ this.$$l_u.delete(listener);
+ }
+ }
+ }
+ async connectedCallback() {
+ this.$$cn = true;
+ if (!this.$$c) {
+ let create_slot = function(name) {
+ return () => {
+ let node;
+ const obj = {
+ c: function create() {
+ node = element("slot");
+ if (name !== "default") {
+ attr(node, "name", name);
+ }
+ },
+ /**
+ * @param {HTMLElement} target
+ * @param {HTMLElement} [anchor]
+ */
+ m: function mount(target, anchor) {
+ insert(target, node, anchor);
+ },
+ d: function destroy(detaching) {
+ if (detaching) {
+ detach(node);
+ }
+ }
+ };
+ return obj;
+ };
+ };
+ await Promise.resolve();
+ if (!this.$$cn) {
+ return;
+ }
+ const $$slots = {};
+ const existing_slots = get_custom_elements_slots(this);
+ for (const name of this.$$s) {
+ if (name in existing_slots) {
+ $$slots[name] = [create_slot(name)];
+ }
+ }
+ for (const attribute of this.attributes) {
+ const name = this.$$g_p(attribute.name);
+ if (!(name in this.$$d)) {
+ this.$$d[name] = get_custom_element_value(name, attribute.value, this.$$p_d, "toProp");
+ }
+ }
+ for (const key2 in this.$$p_d) {
+ if (!(key2 in this.$$d) && this[key2] !== void 0) {
+ this.$$d[key2] = this[key2];
+ delete this[key2];
+ }
+ }
+ this.$$c = new this.$$ctor({
+ target: this.shadowRoot || this,
+ props: {
+ ...this.$$d,
+ $$slots,
+ $$scope: {
+ ctx: []
+ }
+ }
+ });
+ const reflect_attributes = () => {
+ this.$$r = true;
+ for (const key2 in this.$$p_d) {
+ this.$$d[key2] = this.$$c.$$.ctx[this.$$c.$$.props[key2]];
+ if (this.$$p_d[key2].reflect) {
+ const attribute_value = get_custom_element_value(
+ key2,
+ this.$$d[key2],
+ this.$$p_d,
+ "toAttribute"
+ );
+ if (attribute_value == null) {
+ this.removeAttribute(this.$$p_d[key2].attribute || key2);
+ } else {
+ this.setAttribute(this.$$p_d[key2].attribute || key2, attribute_value);
+ }
+ }
+ }
+ this.$$r = false;
+ };
+ this.$$c.$$.after_update.push(reflect_attributes);
+ reflect_attributes();
+ for (const type in this.$$l) {
+ for (const listener of this.$$l[type]) {
+ const unsub = this.$$c.$on(type, listener);
+ this.$$l_u.set(listener, unsub);
+ }
+ }
+ this.$$l = {};
+ }
+ }
+ // We don't need this when working within Svelte code, but for compatibility of people using this outside of Svelte
+ // and setting attributes through setAttribute etc, this is helpful
+ attributeChangedCallback(attr2, _oldValue, newValue) {
+ var _a2;
+ if (this.$$r)
+ return;
+ attr2 = this.$$g_p(attr2);
+ this.$$d[attr2] = get_custom_element_value(attr2, newValue, this.$$p_d, "toProp");
+ (_a2 = this.$$c) == null ? void 0 : _a2.$set({ [attr2]: this.$$d[attr2] });
+ }
+ disconnectedCallback() {
+ this.$$cn = false;
+ Promise.resolve().then(() => {
+ if (!this.$$cn) {
+ this.$$c.$destroy();
+ this.$$c = void 0;
+ }
+ });
+ }
+ $$g_p(attribute_name) {
+ return Object.keys(this.$$p_d).find(
+ (key2) => this.$$p_d[key2].attribute === attribute_name || !this.$$p_d[key2].attribute && key2.toLowerCase() === attribute_name
+ ) || attribute_name;
+ }
+ };
+}
+function get_custom_element_value(prop, value, props_definition, transform) {
+ var _a2;
+ const type = (_a2 = props_definition[prop]) == null ? void 0 : _a2.type;
+ value = type === "Boolean" && typeof value !== "boolean" ? value != null : value;
+ if (!transform || !props_definition[prop]) {
+ return value;
+ } else if (transform === "toAttribute") {
+ switch (type) {
+ case "Object":
+ case "Array":
+ return value == null ? null : JSON.stringify(value);
+ case "Boolean":
+ return value ? "" : null;
+ case "Number":
+ return value == null ? null : value;
+ default:
+ return value;
+ }
+ } else {
+ switch (type) {
+ case "Object":
+ case "Array":
+ return value && JSON.parse(value);
+ case "Boolean":
+ return value;
+ case "Number":
+ return value != null ? +value : value;
+ default:
+ return value;
+ }
+ }
+}
+var SvelteComponent = class {
+ constructor() {
+ /**
+ * ### PRIVATE API
+ *
+ * Do not use, may change at any time
+ *
+ * @type {any}
+ */
+ __publicField(this, "$$");
+ /**
+ * ### PRIVATE API
+ *
+ * Do not use, may change at any time
+ *
+ * @type {any}
+ */
+ __publicField(this, "$$set");
+ }
+ /** @returns {void} */
+ $destroy() {
+ destroy_component(this, 1);
+ this.$destroy = noop;
+ }
+ /**
+ * @template {Extract} K
+ * @param {K} type
+ * @param {((e: Events[K]) => void) | null | undefined} callback
+ * @returns {() => void}
+ */
+ $on(type, callback) {
+ if (!is_function(callback)) {
+ return noop;
+ }
+ const callbacks = this.$$.callbacks[type] || (this.$$.callbacks[type] = []);
+ callbacks.push(callback);
+ return () => {
+ const index2 = callbacks.indexOf(callback);
+ if (index2 !== -1)
+ callbacks.splice(index2, 1);
+ };
+ }
+ /**
+ * @param {Partial} props
+ * @returns {void}
+ */
+ $set(props) {
+ if (this.$$set && !is_empty(props)) {
+ this.$$.skip_bound = true;
+ this.$$set(props);
+ this.$$.skip_bound = false;
+ }
+ }
+};
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/dev.js
+init_polyfill_buffer();
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/shared/version.js
+init_polyfill_buffer();
+var PUBLIC_VERSION = "4";
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/internal/disclose-version/index.js
+init_polyfill_buffer();
+if (typeof window !== "undefined")
+ (window.__svelte || (window.__svelte = { v: /* @__PURE__ */ new Set() })).v.add(PUBLIC_VERSION);
+
+// node_modules/.pnpm/tslib@2.6.2/node_modules/tslib/tslib.es6.mjs
+init_polyfill_buffer();
+function __awaiter(thisArg, _arguments, P, generator) {
+ function adopt(value) {
+ return value instanceof P ? value : new P(function(resolve) {
+ resolve(value);
+ });
+ }
+ return new (P || (P = Promise))(function(resolve, reject) {
+ function fulfilled(value) {
+ try {
+ step(generator.next(value));
+ } catch (e) {
+ reject(e);
+ }
+ }
+ function rejected(value) {
+ try {
+ step(generator["throw"](value));
+ } catch (e) {
+ reject(e);
+ }
+ }
+ function step(result) {
+ result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
+ }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+}
+
+// src/ui/history/historyView.svelte
+var import_obsidian20 = require("obsidian");
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/index.js
+init_polyfill_buffer();
+
+// src/ui/history/components/logComponent.svelte
+init_polyfill_buffer();
+var import_obsidian19 = require("obsidian");
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/transition/index.js
+init_polyfill_buffer();
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/easing/index.js
+init_polyfill_buffer();
+function cubicOut(t) {
+ const f = t - 1;
+ return f * f * f + 1;
+}
+
+// node_modules/.pnpm/svelte@4.2.10/node_modules/svelte/src/runtime/transition/index.js
+function slide(node, { delay: delay2 = 0, duration = 400, easing = cubicOut, axis = "y" } = {}) {
+ const style = getComputedStyle(node);
+ const opacity = +style.opacity;
+ const primary_property = axis === "y" ? "height" : "width";
+ const primary_property_value = parseFloat(style[primary_property]);
+ const secondary_properties = axis === "y" ? ["top", "bottom"] : ["left", "right"];
+ const capitalized_secondary_properties = secondary_properties.map(
+ (e) => `${e[0].toUpperCase()}${e.slice(1)}`
+ );
+ const padding_start_value = parseFloat(style[`padding${capitalized_secondary_properties[0]}`]);
+ const padding_end_value = parseFloat(style[`padding${capitalized_secondary_properties[1]}`]);
+ const margin_start_value = parseFloat(style[`margin${capitalized_secondary_properties[0]}`]);
+ const margin_end_value = parseFloat(style[`margin${capitalized_secondary_properties[1]}`]);
+ const border_width_start_value = parseFloat(
+ style[`border${capitalized_secondary_properties[0]}Width`]
+ );
+ const border_width_end_value = parseFloat(
+ style[`border${capitalized_secondary_properties[1]}Width`]
+ );
+ return {
+ delay: delay2,
+ duration,
+ easing,
+ css: (t) => `overflow: hidden;opacity: ${Math.min(t * 20, 1) * opacity};${primary_property}: ${t * primary_property_value}px;padding-${secondary_properties[0]}: ${t * padding_start_value}px;padding-${secondary_properties[1]}: ${t * padding_end_value}px;margin-${secondary_properties[0]}: ${t * margin_start_value}px;margin-${secondary_properties[1]}: ${t * margin_end_value}px;border-${secondary_properties[0]}-width: ${t * border_width_start_value}px;border-${secondary_properties[1]}-width: ${t * border_width_end_value}px;`
+ };
+}
+
+// src/ui/history/components/logFileComponent.svelte
+init_polyfill_buffer();
+var import_obsidian18 = require("obsidian");
+function add_css(target) {
+ append_styles(target, "svelte-1wbh8tp", "main.svelte-1wbh8tp .nav-file-title.svelte-1wbh8tp{align-items:center}");
+}
+function create_if_block(ctx) {
+ let div;
+ let mounted;
+ let dispose;
+ return {
+ c() {
+ div = element("div");
+ attr(div, "data-icon", "go-to-file");
+ attr(div, "aria-label", "Open File");
+ attr(div, "class", "clickable-icon");
+ },
+ m(target, anchor) {
+ insert(target, div, anchor);
+ ctx[7](div);
+ if (!mounted) {
+ dispose = [
+ listen(div, "auxclick", stop_propagation(
+ /*open*/
+ ctx[4]
+ )),
+ listen(div, "click", stop_propagation(
+ /*open*/
+ ctx[4]
+ ))
+ ];
+ mounted = true;
+ }
+ },
+ p: noop,
+ d(detaching) {
+ if (detaching) {
+ detach(div);
+ }
+ ctx[7](null);
+ mounted = false;
+ run_all(dispose);
+ }
+ };
+}
+function create_fragment(ctx) {
+ let main;
+ let div3;
+ let div0;
+ let t0_value = getDisplayPath(
+ /*diff*/
+ ctx[0].vault_path
+ ) + "";
+ let t0;
+ let t1;
+ let div2;
+ let div1;
+ let show_if = (
+ /*view*/
+ ctx[1].app.vault.getAbstractFileByPath(
+ /*diff*/
+ ctx[0].vault_path
+ )
+ );
+ let t2;
+ let span;
+ let t3_value = (
+ /*diff*/
+ ctx[0].status + ""
+ );
+ let t3;
+ let span_data_type_value;
+ let div3_data_path_value;
+ let div3_aria_label_value;
+ let mounted;
+ let dispose;
+ let if_block = show_if && create_if_block(ctx);
+ return {
+ c() {
+ var _a2, _b;
+ main = element("main");
+ div3 = element("div");
+ div0 = element("div");
+ t0 = text(t0_value);
+ t1 = space();
+ div2 = element("div");
+ div1 = element("div");
+ if (if_block)
+ if_block.c();
+ t2 = space();
+ span = element("span");
+ t3 = text(t3_value);
+ attr(div0, "class", "tree-item-inner nav-file-title-content");
+ attr(div1, "class", "buttons");
+ attr(span, "class", "type");
+ attr(span, "data-type", span_data_type_value = /*diff*/
+ ctx[0].status);
+ attr(div2, "class", "git-tools");
+ attr(div3, "class", "tree-item-self is-clickable nav-file-title svelte-1wbh8tp");
+ attr(div3, "data-path", div3_data_path_value = /*diff*/
+ ctx[0].vault_path);
+ attr(
+ div3,
+ "data-tooltip-position",
+ /*side*/
+ ctx[3]
+ );
+ attr(div3, "aria-label", div3_aria_label_value = /*diff*/
+ ctx[0].vault_path);
+ toggle_class(
+ div3,
+ "is-active",
+ /*view*/
+ ((_a2 = ctx[1].plugin.lastDiffViewState) == null ? void 0 : _a2.file) == /*diff*/
+ ctx[0].vault_path && /*view*/
+ ((_b = ctx[1].plugin.lastDiffViewState) == null ? void 0 : _b.hash)
+ );
+ attr(main, "class", "tree-item nav-file svelte-1wbh8tp");
+ },
+ m(target, anchor) {
+ insert(target, main, anchor);
+ append2(main, div3);
+ append2(div3, div0);
+ append2(div0, t0);
+ append2(div3, t1);
+ append2(div3, div2);
+ append2(div2, div1);
+ if (if_block)
+ if_block.m(div1, null);
+ append2(div2, t2);
+ append2(div2, span);
+ append2(span, t3);
+ if (!mounted) {
+ dispose = [
+ listen(main, "click", stop_propagation(
+ /*showDiff*/
+ ctx[5]
+ )),
+ listen(main, "auxclick", stop_propagation(
+ /*showDiff*/
+ ctx[5]
+ )),
+ listen(
+ main,
+ "focus",
+ /*focus_handler*/
+ ctx[6]
+ )
+ ];
+ mounted = true;
+ }
+ },
+ p(ctx2, [dirty]) {
+ var _a2, _b;
+ if (dirty & /*diff*/
+ 1 && t0_value !== (t0_value = getDisplayPath(
+ /*diff*/
+ ctx2[0].vault_path
+ ) + ""))
+ set_data(t0, t0_value);
+ if (dirty & /*view, diff*/
+ 3)
+ show_if = /*view*/
+ ctx2[1].app.vault.getAbstractFileByPath(
+ /*diff*/
+ ctx2[0].vault_path
+ );
+ if (show_if) {
+ if (if_block) {
+ if_block.p(ctx2, dirty);
+ } else {
+ if_block = create_if_block(ctx2);
+ if_block.c();
+ if_block.m(div1, null);
+ }
+ } else if (if_block) {
+ if_block.d(1);
+ if_block = null;
+ }
+ if (dirty & /*diff*/
+ 1 && t3_value !== (t3_value = /*diff*/
+ ctx2[0].status + ""))
+ set_data(t3, t3_value);
+ if (dirty & /*diff*/
+ 1 && span_data_type_value !== (span_data_type_value = /*diff*/
+ ctx2[0].status)) {
+ attr(span, "data-type", span_data_type_value);
+ }
+ if (dirty & /*diff*/
+ 1 && div3_data_path_value !== (div3_data_path_value = /*diff*/
+ ctx2[0].vault_path)) {
+ attr(div3, "data-path", div3_data_path_value);
+ }
+ if (dirty & /*side*/
+ 8) {
+ attr(
+ div3,
+ "data-tooltip-position",
+ /*side*/
+ ctx2[3]
+ );
+ }
+ if (dirty & /*diff*/
+ 1 && div3_aria_label_value !== (div3_aria_label_value = /*diff*/
+ ctx2[0].vault_path)) {
+ attr(div3, "aria-label", div3_aria_label_value);
+ }
+ if (dirty & /*view, diff*/
+ 3) {
+ toggle_class(
+ div3,
+ "is-active",
+ /*view*/
+ ((_a2 = ctx2[1].plugin.lastDiffViewState) == null ? void 0 : _a2.file) == /*diff*/
+ ctx2[0].vault_path && /*view*/
+ ((_b = ctx2[1].plugin.lastDiffViewState) == null ? void 0 : _b.hash)
+ );
+ }
+ },
+ i: noop,
+ o: noop,
+ d(detaching) {
+ if (detaching) {
+ detach(main);
+ }
+ if (if_block)
+ if_block.d();
+ mounted = false;
+ run_all(dispose);
+ }
+ };
+}
+function instance($$self, $$props, $$invalidate) {
+ let side;
+ let { diff: diff3 } = $$props;
+ let { view } = $$props;
+ let buttons = [];
+ window.setTimeout(() => buttons.forEach((b) => (0, import_obsidian18.setIcon)(b, b.getAttr("data-icon"))), 0);
+ function open(event) {
+ var _a2;
+ const file = view.app.vault.getAbstractFileByPath(diff3.vault_path);
+ if (file instanceof import_obsidian18.TFile) {
+ (_a2 = getNewLeaf(event)) === null || _a2 === void 0 ? void 0 : _a2.openFile(file);
+ }
+ }
+ function showDiff(event) {
+ var _a2;
+ (_a2 = getNewLeaf(event)) === null || _a2 === void 0 ? void 0 : _a2.setViewState({
+ type: DIFF_VIEW_CONFIG.type,
+ active: true,
+ state: {
+ file: diff3.path,
+ staged: false,
+ hash: diff3.hash
+ }
+ });
+ }
+ function focus_handler(event) {
+ bubble.call(this, $$self, event);
+ }
+ function div_binding($$value) {
+ binding_callbacks[$$value ? "unshift" : "push"](() => {
+ buttons[0] = $$value;
+ $$invalidate(2, buttons);
+ });
+ }
+ $$self.$$set = ($$props2) => {
+ if ("diff" in $$props2)
+ $$invalidate(0, diff3 = $$props2.diff);
+ if ("view" in $$props2)
+ $$invalidate(1, view = $$props2.view);
+ };
+ $$self.$$.update = () => {
+ if ($$self.$$.dirty & /*view*/
+ 2) {
+ $:
+ $$invalidate(3, side = view.leaf.getRoot().side == "left" ? "right" : "left");
+ }
+ };
+ return [diff3, view, buttons, side, open, showDiff, focus_handler, div_binding];
+}
+var LogFileComponent = class extends SvelteComponent {
+ constructor(options) {
+ super();
+ init2(this, options, instance, create_fragment, safe_not_equal, { diff: 0, view: 1 }, add_css);
+ }
+};
+var logFileComponent_default = LogFileComponent;
+
+// src/ui/history/components/logTreeComponent.svelte
+init_polyfill_buffer();
+function add_css2(target) {
+ append_styles(target, "svelte-1lnl15d", "main.svelte-1lnl15d .nav-folder-title-content.svelte-1lnl15d{display:flex;align-items:center}");
+}
+function get_each_context(ctx, list, i) {
+ const child_ctx = ctx.slice();
+ child_ctx[8] = list[i];
+ return child_ctx;
+}
+function create_else_block(ctx) {
+ let div4;
+ let div3;
+ let div0;
+ let t0;
+ let div1;
+ let t1;
+ let div2;
+ let t2_value = (
+ /*entity*/
+ ctx[8].title + ""
+ );
+ let t2;
+ let div3_aria_label_value;
+ let t3;
+ let t4;
+ let current;
+ let mounted;
+ let dispose;
+ function click_handler() {
+ return (
+ /*click_handler*/
+ ctx[7](
+ /*entity*/
+ ctx[8]
+ )
+ );
+ }
+ let if_block = !/*closed*/
+ ctx[4][
+ /*entity*/
+ ctx[8].title
+ ] && create_if_block_1(ctx);
+ return {
+ c() {
+ div4 = element("div");
+ div3 = element("div");
+ div0 = element("div");
+ t0 = space();
+ div1 = element("div");
+ div1.innerHTML = ``;
+ t1 = space();
+ div2 = element("div");
+ t2 = text(t2_value);
+ t3 = space();
+ if (if_block)
+ if_block.c();
+ t4 = space();
+ attr(div0, "data-icon", "folder");
+ set_style(div0, "padding-right", "5px");
+ set_style(div0, "display", "flex");
+ attr(div1, "class", "tree-item-icon nav-folder-collapse-indicator collapse-icon");
+ toggle_class(
+ div1,
+ "is-collapsed",
+ /*closed*/
+ ctx[4][
+ /*entity*/
+ ctx[8].title
+ ]
+ );
+ attr(div2, "class", "tree-item-inner nav-folder-title-content svelte-1lnl15d");
+ attr(div3, "class", "tree-item-self is-clickable nav-folder-title");
+ attr(
+ div3,
+ "data-tooltip-position",
+ /*side*/
+ ctx[5]
+ );
+ attr(div3, "aria-label", div3_aria_label_value = /*entity*/
+ ctx[8].vaultPath);
+ attr(div4, "class", "tree-item nav-folder");
+ toggle_class(
+ div4,
+ "is-collapsed",
+ /*closed*/
+ ctx[4][
+ /*entity*/
+ ctx[8].title
+ ]
+ );
+ },
+ m(target, anchor) {
+ insert(target, div4, anchor);
+ append2(div4, div3);
+ append2(div3, div0);
+ append2(div3, t0);
+ append2(div3, div1);
+ append2(div3, t1);
+ append2(div3, div2);
+ append2(div2, t2);
+ append2(div4, t3);
+ if (if_block)
+ if_block.m(div4, null);
+ append2(div4, t4);
+ current = true;
+ if (!mounted) {
+ dispose = listen(div3, "click", click_handler);
+ mounted = true;
+ }
+ },
+ p(new_ctx, dirty) {
+ ctx = new_ctx;
+ if (!current || dirty & /*closed, hierarchy*/
+ 17) {
+ toggle_class(
+ div1,
+ "is-collapsed",
+ /*closed*/
+ ctx[4][
+ /*entity*/
+ ctx[8].title
+ ]
+ );
+ }
+ if ((!current || dirty & /*hierarchy*/
+ 1) && t2_value !== (t2_value = /*entity*/
+ ctx[8].title + ""))
+ set_data(t2, t2_value);
+ if (!current || dirty & /*side*/
+ 32) {
+ attr(
+ div3,
+ "data-tooltip-position",
+ /*side*/
+ ctx[5]
+ );
+ }
+ if (!current || dirty & /*hierarchy*/
+ 1 && div3_aria_label_value !== (div3_aria_label_value = /*entity*/
+ ctx[8].vaultPath)) {
+ attr(div3, "aria-label", div3_aria_label_value);
+ }
+ if (!/*closed*/
+ ctx[4][
+ /*entity*/
+ ctx[8].title
+ ]) {
+ if (if_block) {
+ if_block.p(ctx, dirty);
+ if (dirty & /*closed, hierarchy*/
+ 17) {
+ transition_in(if_block, 1);
+ }
+ } else {
+ if_block = create_if_block_1(ctx);
+ if_block.c();
+ transition_in(if_block, 1);
+ if_block.m(div4, t4);
+ }
+ } else if (if_block) {
+ group_outros();
+ transition_out(if_block, 1, 1, () => {
+ if_block = null;
+ });
+ check_outros();
+ }
+ if (!current || dirty & /*closed, hierarchy*/
+ 17) {
+ toggle_class(
+ div4,
+ "is-collapsed",
+ /*closed*/
+ ctx[4][
+ /*entity*/
+ ctx[8].title
+ ]
+ );
+ }
+ },
+ i(local) {
+ if (current)
+ return;
+ transition_in(if_block);
+ current = true;
+ },
+ o(local) {
+ transition_out(if_block);
+ current = false;
+ },
+ d(detaching) {
+ if (detaching) {
+ detach(div4);
+ }
+ if (if_block)
+ if_block.d();
+ mounted = false;
+ dispose();
+ }
+ };
+}
+function create_if_block2(ctx) {
+ let div;
+ let logfilecomponent;
+ let t;
+ let current;
+ logfilecomponent = new logFileComponent_default({
+ props: {
+ diff: (
+ /*entity*/
+ ctx[8].data
+ ),
+ view: (
+ /*view*/
+ ctx[2]
+ )
+ }
+ });
+ return {
+ c() {
+ div = element("div");
+ create_component(logfilecomponent.$$.fragment);
+ t = space();
+ },
+ m(target, anchor) {
+ insert(target, div, anchor);
+ mount_component(logfilecomponent, div, null);
+ append2(div, t);
+ current = true;
+ },
+ p(ctx2, dirty) {
+ const logfilecomponent_changes = {};
+ if (dirty & /*hierarchy*/
+ 1)
+ logfilecomponent_changes.diff = /*entity*/
+ ctx2[8].data;
+ if (dirty & /*view*/
+ 4)
+ logfilecomponent_changes.view = /*view*/
+ ctx2[2];
+ logfilecomponent.$set(logfilecomponent_changes);
+ },
+ i(local) {
+ if (current)
+ return;
+ transition_in(logfilecomponent.$$.fragment, local);
+ current = true;
+ },
+ o(local) {
+ transition_out(logfilecomponent.$$.fragment, local);
+ current = false;
+ },
+ d(detaching) {
+ if (detaching) {
+ detach(div);
+ }
+ destroy_component(logfilecomponent);
+ }
+ };
+}
+function create_if_block_1(ctx) {
+ let div;
+ let logtreecomponent;
+ let div_transition;
+ let current;
+ logtreecomponent = new LogTreeComponent({
+ props: {
+ hierarchy: (
+ /*entity*/
+ ctx[8]
+ ),
+ plugin: (
+ /*plugin*/
+ ctx[1]
+ ),
+ view: (
+ /*view*/
+ ctx[2]
+ )
+ }
+ });
+ return {
+ c() {
+ div = element("div");
+ create_component(logtreecomponent.$$.fragment);
+ attr(div, "class", "tree-item-children nav-folder-children");
+ },
+ m(target, anchor) {
+ insert(target, div, anchor);
+ mount_component(logtreecomponent, div, null);
+ current = true;
+ },
+ p(ctx2, dirty) {
+ const logtreecomponent_changes = {};
+ if (dirty & /*hierarchy*/
+ 1)
+ logtreecomponent_changes.hierarchy = /*entity*/
+ ctx2[8];
+ if (dirty & /*plugin*/
+ 2)
+ logtreecomponent_changes.plugin = /*plugin*/
+ ctx2[1];
+ if (dirty & /*view*/
+ 4)
+ logtreecomponent_changes.view = /*view*/
+ ctx2[2];
+ logtreecomponent.$set(logtreecomponent_changes);
+ },
+ i(local) {
+ if (current)
+ return;
+ transition_in(logtreecomponent.$$.fragment, local);
+ if (local) {
+ add_render_callback(() => {
+ if (!current)
+ return;
+ if (!div_transition)
+ div_transition = create_bidirectional_transition(div, slide, { duration: 150 }, true);
+ div_transition.run(1);
+ });
+ }
+ current = true;
+ },
+ o(local) {
+ transition_out(logtreecomponent.$$.fragment, local);
+ if (local) {
+ if (!div_transition)
+ div_transition = create_bidirectional_transition(div, slide, { duration: 150 }, false);
+ div_transition.run(0);
+ }
+ current = false;
+ },
+ d(detaching) {
+ if (detaching) {
+ detach(div);
+ }
+ destroy_component(logtreecomponent);
+ if (detaching && div_transition)
+ div_transition.end();
+ }
+ };
+}
+function create_each_block(ctx) {
+ let current_block_type_index;
+ let if_block;
+ let if_block_anchor;
+ let current;
+ const if_block_creators = [create_if_block2, create_else_block];
+ const if_blocks = [];
+ function select_block_type(ctx2, dirty) {
+ if (
+ /*entity*/
+ ctx2[8].data
+ )
+ return 0;
+ return 1;
+ }
+ current_block_type_index = select_block_type(ctx, -1);
+ if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);
+ return {
+ c() {
+ if_block.c();
+ if_block_anchor = empty();
+ },
+ m(target, anchor) {
+ if_blocks[current_block_type_index].m(target, anchor);
+ insert(target, if_block_anchor, anchor);
+ current = true;
+ },
+ p(ctx2, dirty) {
+ let previous_block_index = current_block_type_index;
+ current_block_type_index = select_block_type(ctx2, dirty);
+ if (current_block_type_index === previous_block_index) {
+ if_blocks[current_block_type_index].p(ctx2, dirty);
+ } else {
+ group_outros();
+ transition_out(if_blocks[previous_block_index], 1, 1, () => {
+ if_blocks[previous_block_index] = null;
+ });
+ check_outros();
+ if_block = if_blocks[current_block_type_index];
+ if (!if_block) {
+ if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx2);
+ if_block.c();
+ } else {
+ if_block.p(ctx2, dirty);
+ }
+ transition_in(if_block, 1);
+ if_block.m(if_block_anchor.parentNode, if_block_anchor);
+ }
+ },
+ i(local) {
+ if (current)
+ return;
+ transition_in(if_block);
+ current = true;
+ },
+ o(local) {
+ transition_out(if_block);
+ current = false;
+ },
+ d(detaching) {
+ if (detaching) {
+ detach(if_block_anchor);
+ }
+ if_blocks[current_block_type_index].d(detaching);
+ }
+ };
+}
+function create_fragment2(ctx) {
+ let main;
+ let current;
+ let each_value = ensure_array_like(
+ /*hierarchy*/
+ ctx[0].children
+ );
+ let each_blocks = [];
+ for (let i = 0; i < each_value.length; i += 1) {
+ each_blocks[i] = create_each_block(get_each_context(ctx, each_value, i));
+ }
+ const out = (i) => transition_out(each_blocks[i], 1, 1, () => {
+ each_blocks[i] = null;
+ });
+ return {
+ c() {
+ main = element("main");
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ each_blocks[i].c();
+ }
+ attr(main, "class", "svelte-1lnl15d");
+ toggle_class(
+ main,
+ "topLevel",
+ /*topLevel*/
+ ctx[3]
+ );
+ },
+ m(target, anchor) {
+ insert(target, main, anchor);
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ if (each_blocks[i]) {
+ each_blocks[i].m(main, null);
+ }
+ }
+ current = true;
+ },
+ p(ctx2, [dirty]) {
+ if (dirty & /*hierarchy, view, closed, plugin, side, fold*/
+ 119) {
+ each_value = ensure_array_like(
+ /*hierarchy*/
+ ctx2[0].children
+ );
+ let i;
+ for (i = 0; i < each_value.length; i += 1) {
+ const child_ctx = get_each_context(ctx2, each_value, i);
+ if (each_blocks[i]) {
+ each_blocks[i].p(child_ctx, dirty);
+ transition_in(each_blocks[i], 1);
+ } else {
+ each_blocks[i] = create_each_block(child_ctx);
+ each_blocks[i].c();
+ transition_in(each_blocks[i], 1);
+ each_blocks[i].m(main, null);
+ }
+ }
+ group_outros();
+ for (i = each_value.length; i < each_blocks.length; i += 1) {
+ out(i);
+ }
+ check_outros();
+ }
+ if (!current || dirty & /*topLevel*/
+ 8) {
+ toggle_class(
+ main,
+ "topLevel",
+ /*topLevel*/
+ ctx2[3]
+ );
+ }
+ },
+ i(local) {
+ if (current)
+ return;
+ for (let i = 0; i < each_value.length; i += 1) {
+ transition_in(each_blocks[i]);
+ }
+ current = true;
+ },
+ o(local) {
+ each_blocks = each_blocks.filter(Boolean);
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ transition_out(each_blocks[i]);
+ }
+ current = false;
+ },
+ d(detaching) {
+ if (detaching) {
+ detach(main);
+ }
+ destroy_each(each_blocks, detaching);
+ }
+ };
+}
+function instance2($$self, $$props, $$invalidate) {
+ let side;
+ let { hierarchy } = $$props;
+ let { plugin } = $$props;
+ let { view } = $$props;
+ let { topLevel = false } = $$props;
+ const closed = {};
+ function fold(item) {
+ $$invalidate(4, closed[item.title] = !closed[item.title], closed);
+ }
+ const click_handler = (entity) => fold(entity);
+ $$self.$$set = ($$props2) => {
+ if ("hierarchy" in $$props2)
+ $$invalidate(0, hierarchy = $$props2.hierarchy);
+ if ("plugin" in $$props2)
+ $$invalidate(1, plugin = $$props2.plugin);
+ if ("view" in $$props2)
+ $$invalidate(2, view = $$props2.view);
+ if ("topLevel" in $$props2)
+ $$invalidate(3, topLevel = $$props2.topLevel);
+ };
+ $$self.$$.update = () => {
+ if ($$self.$$.dirty & /*view*/
+ 4) {
+ $:
+ $$invalidate(5, side = view.leaf.getRoot().side == "left" ? "right" : "left");
+ }
+ };
+ return [hierarchy, plugin, view, topLevel, closed, side, fold, click_handler];
+}
+var LogTreeComponent = class extends SvelteComponent {
+ constructor(options) {
+ super();
+ init2(
+ this,
+ options,
+ instance2,
+ create_fragment2,
+ safe_not_equal,
+ {
+ hierarchy: 0,
+ plugin: 1,
+ view: 2,
+ topLevel: 3
+ },
+ add_css2
+ );
+ }
+};
+var logTreeComponent_default = LogTreeComponent;
+
+// src/ui/history/components/logComponent.svelte
+function get_each_context2(ctx, list, i) {
+ const child_ctx = ctx.slice();
+ child_ctx[9] = list[i];
+ return child_ctx;
+}
+function create_if_block_4(ctx) {
+ let div;
+ let t_value = (
+ /*log*/
+ ctx[0].refs.join(", ") + ""
+ );
+ let t;
+ return {
+ c() {
+ div = element("div");
+ t = text(t_value);
+ attr(div, "class", "git-ref");
+ },
+ m(target, anchor) {
+ insert(target, div, anchor);
+ append2(div, t);
+ },
+ p(ctx2, dirty) {
+ if (dirty & /*log*/
+ 1 && t_value !== (t_value = /*log*/
+ ctx2[0].refs.join(", ") + ""))
+ set_data(t, t_value);
+ },
+ d(detaching) {
+ if (detaching) {
+ detach(div);
+ }
+ }
+ };
+}
+function create_if_block_3(ctx) {
+ let div;
+ let t_value = (
+ /*authorToString*/
+ ctx[7](
+ /*log*/
+ ctx[0]
+ ) + ""
+ );
+ let t;
+ return {
+ c() {
+ div = element("div");
+ t = text(t_value);
+ attr(div, "class", "git-author");
+ },
+ m(target, anchor) {
+ insert(target, div, anchor);
+ append2(div, t);
+ },
+ p(ctx2, dirty) {
+ if (dirty & /*log*/
+ 1 && t_value !== (t_value = /*authorToString*/
+ ctx2[7](
+ /*log*/
+ ctx2[0]
+ ) + ""))
+ set_data(t, t_value);
+ },
+ d(detaching) {
+ if (detaching) {
+ detach(div);
+ }
+ }
+ };
+}
+function create_if_block_2(ctx) {
+ let div;
+ let t_value = (0, import_obsidian19.moment)(
+ /*log*/
+ ctx[0].date
+ ).format(
+ /*plugin*/
+ ctx[3].settings.commitDateFormat
+ ) + "";
+ let t;
+ return {
+ c() {
+ div = element("div");
+ t = text(t_value);
+ attr(div, "class", "git-date");
+ },
+ m(target, anchor) {
+ insert(target, div, anchor);
+ append2(div, t);
+ },
+ p(ctx2, dirty) {
+ if (dirty & /*log, plugin*/
+ 9 && t_value !== (t_value = (0, import_obsidian19.moment)(
+ /*log*/
+ ctx2[0].date
+ ).format(
+ /*plugin*/
+ ctx2[3].settings.commitDateFormat
+ ) + ""))
+ set_data(t, t_value);
+ },
+ d(detaching) {
+ if (detaching) {
+ detach(div);
+ }
+ }
+ };
+}
+function create_if_block3(ctx) {
+ let div;
+ let current_block_type_index;
+ let if_block;
+ let div_transition;
+ let current;
+ const if_block_creators = [create_if_block_12, create_else_block2];
+ const if_blocks = [];
+ function select_block_type(ctx2, dirty) {
+ if (
+ /*showTree*/
+ ctx2[2]
+ )
+ return 0;
+ return 1;
+ }
+ current_block_type_index = select_block_type(ctx, -1);
+ if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);
+ return {
+ c() {
+ div = element("div");
+ if_block.c();
+ attr(div, "class", "tree-item-children nav-folder-children");
+ },
+ m(target, anchor) {
+ insert(target, div, anchor);
+ if_blocks[current_block_type_index].m(div, null);
+ current = true;
+ },
+ p(ctx2, dirty) {
+ let previous_block_index = current_block_type_index;
+ current_block_type_index = select_block_type(ctx2, dirty);
+ if (current_block_type_index === previous_block_index) {
+ if_blocks[current_block_type_index].p(ctx2, dirty);
+ } else {
+ group_outros();
+ transition_out(if_blocks[previous_block_index], 1, 1, () => {
+ if_blocks[previous_block_index] = null;
+ });
+ check_outros();
+ if_block = if_blocks[current_block_type_index];
+ if (!if_block) {
+ if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx2);
+ if_block.c();
+ } else {
+ if_block.p(ctx2, dirty);
+ }
+ transition_in(if_block, 1);
+ if_block.m(div, null);
+ }
+ },
+ i(local) {
+ if (current)
+ return;
+ transition_in(if_block);
+ if (local) {
+ add_render_callback(() => {
+ if (!current)
+ return;
+ if (!div_transition)
+ div_transition = create_bidirectional_transition(div, slide, { duration: 150 }, true);
+ div_transition.run(1);
+ });
+ }
+ current = true;
+ },
+ o(local) {
+ transition_out(if_block);
+ if (local) {
+ if (!div_transition)
+ div_transition = create_bidirectional_transition(div, slide, { duration: 150 }, false);
+ div_transition.run(0);
+ }
+ current = false;
+ },
+ d(detaching) {
+ if (detaching) {
+ detach(div);
+ }
+ if_blocks[current_block_type_index].d();
+ if (detaching && div_transition)
+ div_transition.end();
+ }
+ };
+}
+function create_else_block2(ctx) {
+ let each_1_anchor;
+ let current;
+ let each_value = ensure_array_like(
+ /*log*/
+ ctx[0].diff.files
+ );
+ let each_blocks = [];
+ for (let i = 0; i < each_value.length; i += 1) {
+ each_blocks[i] = create_each_block2(get_each_context2(ctx, each_value, i));
+ }
+ const out = (i) => transition_out(each_blocks[i], 1, 1, () => {
+ each_blocks[i] = null;
+ });
+ return {
+ c() {
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ each_blocks[i].c();
+ }
+ each_1_anchor = empty();
+ },
+ m(target, anchor) {
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ if (each_blocks[i]) {
+ each_blocks[i].m(target, anchor);
+ }
+ }
+ insert(target, each_1_anchor, anchor);
+ current = true;
+ },
+ p(ctx2, dirty) {
+ if (dirty & /*view, log*/
+ 3) {
+ each_value = ensure_array_like(
+ /*log*/
+ ctx2[0].diff.files
+ );
+ let i;
+ for (i = 0; i < each_value.length; i += 1) {
+ const child_ctx = get_each_context2(ctx2, each_value, i);
+ if (each_blocks[i]) {
+ each_blocks[i].p(child_ctx, dirty);
+ transition_in(each_blocks[i], 1);
+ } else {
+ each_blocks[i] = create_each_block2(child_ctx);
+ each_blocks[i].c();
+ transition_in(each_blocks[i], 1);
+ each_blocks[i].m(each_1_anchor.parentNode, each_1_anchor);
+ }
+ }
+ group_outros();
+ for (i = each_value.length; i < each_blocks.length; i += 1) {
+ out(i);
+ }
+ check_outros();
+ }
+ },
+ i(local) {
+ if (current)
+ return;
+ for (let i = 0; i < each_value.length; i += 1) {
+ transition_in(each_blocks[i]);
+ }
+ current = true;
+ },
+ o(local) {
+ each_blocks = each_blocks.filter(Boolean);
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ transition_out(each_blocks[i]);
+ }
+ current = false;
+ },
+ d(detaching) {
+ if (detaching) {
+ detach(each_1_anchor);
+ }
+ destroy_each(each_blocks, detaching);
+ }
+ };
+}
+function create_if_block_12(ctx) {
+ let logtreecomponent;
+ let current;
+ logtreecomponent = new logTreeComponent_default({
+ props: {
+ hierarchy: (
+ /*logsHierarchy*/
+ ctx[6]
+ ),
+ plugin: (
+ /*plugin*/
+ ctx[3]
+ ),
+ view: (
+ /*view*/
+ ctx[1]
+ ),
+ topLevel: true
+ }
+ });
+ return {
+ c() {
+ create_component(logtreecomponent.$$.fragment);
+ },
+ m(target, anchor) {
+ mount_component(logtreecomponent, target, anchor);
+ current = true;
+ },
+ p(ctx2, dirty) {
+ const logtreecomponent_changes = {};
+ if (dirty & /*logsHierarchy*/
+ 64)
+ logtreecomponent_changes.hierarchy = /*logsHierarchy*/
+ ctx2[6];
+ if (dirty & /*plugin*/
+ 8)
+ logtreecomponent_changes.plugin = /*plugin*/
+ ctx2[3];
+ if (dirty & /*view*/
+ 2)
+ logtreecomponent_changes.view = /*view*/
+ ctx2[1];
+ logtreecomponent.$set(logtreecomponent_changes);
+ },
+ i(local) {
+ if (current)
+ return;
+ transition_in(logtreecomponent.$$.fragment, local);
+ current = true;
+ },
+ o(local) {
+ transition_out(logtreecomponent.$$.fragment, local);
+ current = false;
+ },
+ d(detaching) {
+ destroy_component(logtreecomponent, detaching);
+ }
+ };
+}
+function create_each_block2(ctx) {
+ let logfilecomponent;
+ let current;
+ logfilecomponent = new logFileComponent_default({
+ props: {
+ view: (
+ /*view*/
+ ctx[1]
+ ),
+ diff: (
+ /*file*/
+ ctx[9]
+ )
+ }
+ });
+ return {
+ c() {
+ create_component(logfilecomponent.$$.fragment);
+ },
+ m(target, anchor) {
+ mount_component(logfilecomponent, target, anchor);
+ current = true;
+ },
+ p(ctx2, dirty) {
+ const logfilecomponent_changes = {};
+ if (dirty & /*view*/
+ 2)
+ logfilecomponent_changes.view = /*view*/
+ ctx2[1];
+ if (dirty & /*log*/
+ 1)
+ logfilecomponent_changes.diff = /*file*/
+ ctx2[9];
+ logfilecomponent.$set(logfilecomponent_changes);
+ },
+ i(local) {
+ if (current)
+ return;
+ transition_in(logfilecomponent.$$.fragment, local);
+ current = true;
+ },
+ o(local) {
+ transition_out(logfilecomponent.$$.fragment, local);
+ current = false;
+ },
+ d(detaching) {
+ destroy_component(logfilecomponent, detaching);
+ }
+ };
+}
+function create_fragment3(ctx) {
+ var _a2;
+ let main;
+ let div4;
+ let div3;
+ let div0;
+ let t0;
+ let div2;
+ let t1;
+ let t2;
+ let t3;
+ let div1;
+ let t4_value = (
+ /*log*/
+ ctx[0].message + ""
+ );
+ let t4;
+ let div3_aria_label_value;
+ let t5;
+ let current;
+ let mounted;
+ let dispose;
+ let if_block0 = (
+ /*log*/
+ ctx[0].refs.length > 0 && create_if_block_4(ctx)
+ );
+ let if_block1 = (
+ /*plugin*/
+ ctx[3].settings.authorInHistoryView != "hide" && /*log*/
+ ((_a2 = ctx[0].author) == null ? void 0 : _a2.name) && create_if_block_3(ctx)
+ );
+ let if_block2 = (
+ /*plugin*/
+ ctx[3].settings.dateInHistoryView && create_if_block_2(ctx)
+ );
+ let if_block3 = !/*isCollapsed*/
+ ctx[4] && create_if_block3(ctx);
+ return {
+ c() {
+ var _a3;
+ main = element("main");
+ div4 = element("div");
+ div3 = element("div");
+ div0 = element("div");
+ div0.innerHTML = ``;
+ t0 = space();
+ div2 = element("div");
+ if (if_block0)
+ if_block0.c();
+ t1 = space();
+ if (if_block1)
+ if_block1.c();
+ t2 = space();
+ if (if_block2)
+ if_block2.c();
+ t3 = space();
+ div1 = element("div");
+ t4 = text(t4_value);
+ t5 = space();
+ if (if_block3)
+ if_block3.c();
+ attr(div0, "class", "tree-item-icon nav-folder-collapse-indicator collapse-icon");
+ toggle_class(
+ div0,
+ "is-collapsed",
+ /*isCollapsed*/
+ ctx[4]
+ );
+ attr(div1, "class", "tree-item-inner nav-folder-title-content");
+ attr(div3, "class", "tree-item-self is-clickable nav-folder-title");
+ attr(div3, "aria-label", div3_aria_label_value = `${/*log*/
+ ctx[0].refs.length > 0 ? (
+ /*log*/
+ ctx[0].refs.join(", ") + "\n"
+ ) : ""}${/*log*/
+ (_a3 = ctx[0].author) == null ? void 0 : _a3.name}
+${(0, import_obsidian19.moment)(
+ /*log*/
+ ctx[0].date
+ ).format(
+ /*plugin*/
+ ctx[3].settings.commitDateFormat
+ )}
+${/*log*/
+ ctx[0].message}`);
+ attr(
+ div3,
+ "data-tooltip-position",
+ /*side*/
+ ctx[5]
+ );
+ attr(div4, "class", "tree-item nav-folder");
+ toggle_class(
+ div4,
+ "is-collapsed",
+ /*isCollapsed*/
+ ctx[4]
+ );
+ },
+ m(target, anchor) {
+ insert(target, main, anchor);
+ append2(main, div4);
+ append2(div4, div3);
+ append2(div3, div0);
+ append2(div3, t0);
+ append2(div3, div2);
+ if (if_block0)
+ if_block0.m(div2, null);
+ append2(div2, t1);
+ if (if_block1)
+ if_block1.m(div2, null);
+ append2(div2, t2);
+ if (if_block2)
+ if_block2.m(div2, null);
+ append2(div2, t3);
+ append2(div2, div1);
+ append2(div1, t4);
+ append2(div4, t5);
+ if (if_block3)
+ if_block3.m(div4, null);
+ current = true;
+ if (!mounted) {
+ dispose = listen(
+ div3,
+ "click",
+ /*click_handler*/
+ ctx[8]
+ );
+ mounted = true;
+ }
+ },
+ p(ctx2, [dirty]) {
+ var _a3, _b;
+ if (!current || dirty & /*isCollapsed*/
+ 16) {
+ toggle_class(
+ div0,
+ "is-collapsed",
+ /*isCollapsed*/
+ ctx2[4]
+ );
+ }
+ if (
+ /*log*/
+ ctx2[0].refs.length > 0
+ ) {
+ if (if_block0) {
+ if_block0.p(ctx2, dirty);
+ } else {
+ if_block0 = create_if_block_4(ctx2);
+ if_block0.c();
+ if_block0.m(div2, t1);
+ }
+ } else if (if_block0) {
+ if_block0.d(1);
+ if_block0 = null;
+ }
+ if (
+ /*plugin*/
+ ctx2[3].settings.authorInHistoryView != "hide" && /*log*/
+ ((_a3 = ctx2[0].author) == null ? void 0 : _a3.name)
+ ) {
+ if (if_block1) {
+ if_block1.p(ctx2, dirty);
+ } else {
+ if_block1 = create_if_block_3(ctx2);
+ if_block1.c();
+ if_block1.m(div2, t2);
+ }
+ } else if (if_block1) {
+ if_block1.d(1);
+ if_block1 = null;
+ }
+ if (
+ /*plugin*/
+ ctx2[3].settings.dateInHistoryView
+ ) {
+ if (if_block2) {
+ if_block2.p(ctx2, dirty);
+ } else {
+ if_block2 = create_if_block_2(ctx2);
+ if_block2.c();
+ if_block2.m(div2, t3);
+ }
+ } else if (if_block2) {
+ if_block2.d(1);
+ if_block2 = null;
+ }
+ if ((!current || dirty & /*log*/
+ 1) && t4_value !== (t4_value = /*log*/
+ ctx2[0].message + ""))
+ set_data(t4, t4_value);
+ if (!current || dirty & /*log, plugin*/
+ 9 && div3_aria_label_value !== (div3_aria_label_value = `${/*log*/
+ ctx2[0].refs.length > 0 ? (
+ /*log*/
+ ctx2[0].refs.join(", ") + "\n"
+ ) : ""}${/*log*/
+ (_b = ctx2[0].author) == null ? void 0 : _b.name}
+${(0, import_obsidian19.moment)(
+ /*log*/
+ ctx2[0].date
+ ).format(
+ /*plugin*/
+ ctx2[3].settings.commitDateFormat
+ )}
+${/*log*/
+ ctx2[0].message}`)) {
+ attr(div3, "aria-label", div3_aria_label_value);
+ }
+ if (!current || dirty & /*side*/
+ 32) {
+ attr(
+ div3,
+ "data-tooltip-position",
+ /*side*/
+ ctx2[5]
+ );
+ }
+ if (!/*isCollapsed*/
+ ctx2[4]) {
+ if (if_block3) {
+ if_block3.p(ctx2, dirty);
+ if (dirty & /*isCollapsed*/
+ 16) {
+ transition_in(if_block3, 1);
+ }
+ } else {
+ if_block3 = create_if_block3(ctx2);
+ if_block3.c();
+ transition_in(if_block3, 1);
+ if_block3.m(div4, null);
+ }
+ } else if (if_block3) {
+ group_outros();
+ transition_out(if_block3, 1, 1, () => {
+ if_block3 = null;
+ });
+ check_outros();
+ }
+ if (!current || dirty & /*isCollapsed*/
+ 16) {
+ toggle_class(
+ div4,
+ "is-collapsed",
+ /*isCollapsed*/
+ ctx2[4]
+ );
+ }
+ },
+ i(local) {
+ if (current)
+ return;
+ transition_in(if_block3);
+ current = true;
+ },
+ o(local) {
+ transition_out(if_block3);
+ current = false;
+ },
+ d(detaching) {
+ if (detaching) {
+ detach(main);
+ }
+ if (if_block0)
+ if_block0.d();
+ if (if_block1)
+ if_block1.d();
+ if (if_block2)
+ if_block2.d();
+ if (if_block3)
+ if_block3.d();
+ mounted = false;
+ dispose();
+ }
+ };
+}
+function instance3($$self, $$props, $$invalidate) {
+ let logsHierarchy;
+ let side;
+ let { log: log2 } = $$props;
+ let { view } = $$props;
+ let { showTree } = $$props;
+ let { plugin } = $$props;
+ let isCollapsed = true;
+ function authorToString(log3) {
+ const name = log3.author.name;
+ if (plugin.settings.authorInHistoryView == "full") {
+ return name;
+ } else if (plugin.settings.authorInHistoryView == "initials") {
+ const words = name.split(" ").filter((word) => word.length > 0);
+ return words.map((word) => word[0].toUpperCase()).join("");
+ }
+ }
+ const click_handler = () => $$invalidate(4, isCollapsed = !isCollapsed);
+ $$self.$$set = ($$props2) => {
+ if ("log" in $$props2)
+ $$invalidate(0, log2 = $$props2.log);
+ if ("view" in $$props2)
+ $$invalidate(1, view = $$props2.view);
+ if ("showTree" in $$props2)
+ $$invalidate(2, showTree = $$props2.showTree);
+ if ("plugin" in $$props2)
+ $$invalidate(3, plugin = $$props2.plugin);
+ };
+ $$self.$$.update = () => {
+ if ($$self.$$.dirty & /*plugin, log*/
+ 9) {
+ $:
+ $$invalidate(6, logsHierarchy = {
+ title: "",
+ path: "",
+ vaultPath: "",
+ children: plugin.gitManager.getTreeStructure(log2.diff.files)
+ });
+ }
+ if ($$self.$$.dirty & /*view*/
+ 2) {
+ $:
+ $$invalidate(5, side = view.leaf.getRoot().side == "left" ? "right" : "left");
+ }
+ };
+ return [
+ log2,
+ view,
+ showTree,
+ plugin,
+ isCollapsed,
+ side,
+ logsHierarchy,
+ authorToString,
+ click_handler
+ ];
+}
+var LogComponent = class extends SvelteComponent {
+ constructor(options) {
+ super();
+ init2(this, options, instance3, create_fragment3, safe_not_equal, { log: 0, view: 1, showTree: 2, plugin: 3 });
+ }
+};
+var logComponent_default = LogComponent;
+
+// src/ui/history/historyView.svelte
+function get_each_context3(ctx, list, i) {
+ const child_ctx = ctx.slice();
+ child_ctx[11] = list[i];
+ return child_ctx;
+}
+function create_if_block4(ctx) {
+ let div1;
+ let div0;
+ let current;
+ let each_value = ensure_array_like(
+ /*logs*/
+ ctx[6]
+ );
+ let each_blocks = [];
+ for (let i = 0; i < each_value.length; i += 1) {
+ each_blocks[i] = create_each_block3(get_each_context3(ctx, each_value, i));
+ }
+ const out = (i) => transition_out(each_blocks[i], 1, 1, () => {
+ each_blocks[i] = null;
+ });
+ return {
+ c() {
+ div1 = element("div");
+ div0 = element("div");
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ each_blocks[i].c();
+ }
+ attr(div0, "class", "tree-item-children nav-folder-children");
+ attr(div1, "class", "tree-item nav-folder mod-root");
+ },
+ m(target, anchor) {
+ insert(target, div1, anchor);
+ append2(div1, div0);
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ if (each_blocks[i]) {
+ each_blocks[i].m(div0, null);
+ }
+ }
+ current = true;
+ },
+ p(ctx2, dirty) {
+ if (dirty & /*view, showTree, logs, plugin*/
+ 71) {
+ each_value = ensure_array_like(
+ /*logs*/
+ ctx2[6]
+ );
+ let i;
+ for (i = 0; i < each_value.length; i += 1) {
+ const child_ctx = get_each_context3(ctx2, each_value, i);
+ if (each_blocks[i]) {
+ each_blocks[i].p(child_ctx, dirty);
+ transition_in(each_blocks[i], 1);
+ } else {
+ each_blocks[i] = create_each_block3(child_ctx);
+ each_blocks[i].c();
+ transition_in(each_blocks[i], 1);
+ each_blocks[i].m(div0, null);
+ }
+ }
+ group_outros();
+ for (i = each_value.length; i < each_blocks.length; i += 1) {
+ out(i);
+ }
+ check_outros();
+ }
+ },
+ i(local) {
+ if (current)
+ return;
+ for (let i = 0; i < each_value.length; i += 1) {
+ transition_in(each_blocks[i]);
+ }
+ current = true;
+ },
+ o(local) {
+ each_blocks = each_blocks.filter(Boolean);
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ transition_out(each_blocks[i]);
+ }
+ current = false;
+ },
+ d(detaching) {
+ if (detaching) {
+ detach(div1);
+ }
+ destroy_each(each_blocks, detaching);
+ }
+ };
+}
+function create_each_block3(ctx) {
+ let logcomponent;
+ let current;
+ logcomponent = new logComponent_default({
+ props: {
+ view: (
+ /*view*/
+ ctx[1]
+ ),
+ showTree: (
+ /*showTree*/
+ ctx[2]
+ ),
+ log: (
+ /*log*/
+ ctx[11]
+ ),
+ plugin: (
+ /*plugin*/
+ ctx[0]
+ )
+ }
+ });
+ return {
+ c() {
+ create_component(logcomponent.$$.fragment);
+ },
+ m(target, anchor) {
+ mount_component(logcomponent, target, anchor);
+ current = true;
+ },
+ p(ctx2, dirty) {
+ const logcomponent_changes = {};
+ if (dirty & /*view*/
+ 2)
+ logcomponent_changes.view = /*view*/
+ ctx2[1];
+ if (dirty & /*showTree*/
+ 4)
+ logcomponent_changes.showTree = /*showTree*/
+ ctx2[2];
+ if (dirty & /*logs*/
+ 64)
+ logcomponent_changes.log = /*log*/
+ ctx2[11];
+ if (dirty & /*plugin*/
+ 1)
+ logcomponent_changes.plugin = /*plugin*/
+ ctx2[0];
+ logcomponent.$set(logcomponent_changes);
+ },
+ i(local) {
+ if (current)
+ return;
+ transition_in(logcomponent.$$.fragment, local);
+ current = true;
+ },
+ o(local) {
+ transition_out(logcomponent.$$.fragment, local);
+ current = false;
+ },
+ d(detaching) {
+ destroy_component(logcomponent, detaching);
+ }
+ };
+}
+function create_fragment4(ctx) {
+ let main;
+ let div3;
+ let div2;
+ let div0;
+ let t0;
+ let div1;
+ let t1;
+ let div4;
+ let current;
+ let mounted;
+ let dispose;
+ let if_block = (
+ /*logs*/
+ ctx[6] && create_if_block4(ctx)
+ );
+ return {
+ c() {
+ main = element("main");
+ div3 = element("div");
+ div2 = element("div");
+ div0 = element("div");
+ t0 = space();
+ div1 = element("div");
+ t1 = space();
+ div4 = element("div");
+ if (if_block)
+ if_block.c();
+ attr(div0, "id", "layoutChange");
+ attr(div0, "class", "clickable-icon nav-action-button");
+ attr(div0, "aria-label", "Change Layout");
+ attr(div1, "id", "refresh");
+ attr(div1, "class", "clickable-icon nav-action-button");
+ attr(div1, "data-icon", "refresh-cw");
+ attr(div1, "aria-label", "Refresh");
+ set_style(div1, "margin", "1px");
+ toggle_class(
+ div1,
+ "loading",
+ /*loading*/
+ ctx[4]
+ );
+ attr(div2, "class", "nav-buttons-container");
+ attr(div3, "class", "nav-header");
+ attr(div4, "class", "nav-files-container");
+ set_style(div4, "position", "relative");
+ },
+ m(target, anchor) {
+ insert(target, main, anchor);
+ append2(main, div3);
+ append2(div3, div2);
+ append2(div2, div0);
+ ctx[7](div0);
+ append2(div2, t0);
+ append2(div2, div1);
+ ctx[9](div1);
+ append2(main, t1);
+ append2(main, div4);
+ if (if_block)
+ if_block.m(div4, null);
+ current = true;
+ if (!mounted) {
+ dispose = [
+ listen(
+ div0,
+ "click",
+ /*click_handler*/
+ ctx[8]
+ ),
+ listen(div1, "click", triggerRefresh)
+ ];
+ mounted = true;
+ }
+ },
+ p(ctx2, [dirty]) {
+ if (!current || dirty & /*loading*/
+ 16) {
+ toggle_class(
+ div1,
+ "loading",
+ /*loading*/
+ ctx2[4]
+ );
+ }
+ if (
+ /*logs*/
+ ctx2[6]
+ ) {
+ if (if_block) {
+ if_block.p(ctx2, dirty);
+ if (dirty & /*logs*/
+ 64) {
+ transition_in(if_block, 1);
+ }
+ } else {
+ if_block = create_if_block4(ctx2);
+ if_block.c();
+ transition_in(if_block, 1);
+ if_block.m(div4, null);
+ }
+ } else if (if_block) {
+ group_outros();
+ transition_out(if_block, 1, 1, () => {
+ if_block = null;
+ });
+ check_outros();
+ }
+ },
+ i(local) {
+ if (current)
+ return;
+ transition_in(if_block);
+ current = true;
+ },
+ o(local) {
+ transition_out(if_block);
+ current = false;
+ },
+ d(detaching) {
+ if (detaching) {
+ detach(main);
+ }
+ ctx[7](null);
+ ctx[9](null);
+ if (if_block)
+ if_block.d();
+ mounted = false;
+ run_all(dispose);
+ }
+ };
+}
+function triggerRefresh() {
+ dispatchEvent(new CustomEvent("git-refresh"));
+}
+function instance4($$self, $$props, $$invalidate) {
+ let { plugin } = $$props;
+ let { view } = $$props;
+ let loading;
+ let buttons = [];
+ let logs;
+ let showTree = plugin.settings.treeStructure;
+ let layoutBtn;
+ addEventListener("git-view-refresh", refresh);
+ plugin.app.workspace.onLayoutReady(() => {
+ window.setTimeout(
+ () => {
+ buttons.forEach((btn) => (0, import_obsidian20.setIcon)(btn, btn.getAttr("data-icon")));
+ (0, import_obsidian20.setIcon)(layoutBtn, showTree ? "list" : "folder");
+ },
+ 0
+ );
+ });
+ onDestroy(() => {
+ removeEventListener("git-view-refresh", refresh);
+ });
+ function refresh() {
+ return __awaiter(this, void 0, void 0, function* () {
+ $$invalidate(4, loading = true);
+ const isSimpleGit = plugin.gitManager instanceof SimpleGit;
+ $$invalidate(6, logs = yield plugin.gitManager.log(void 0, false, isSimpleGit ? 50 : 10));
+ $$invalidate(4, loading = false);
+ });
+ }
+ function div0_binding($$value) {
+ binding_callbacks[$$value ? "unshift" : "push"](() => {
+ layoutBtn = $$value;
+ $$invalidate(3, layoutBtn);
+ });
+ }
+ const click_handler = () => {
+ $$invalidate(2, showTree = !showTree);
+ $$invalidate(0, plugin.settings.treeStructure = showTree, plugin);
+ plugin.saveSettings();
+ };
+ function div1_binding($$value) {
+ binding_callbacks[$$value ? "unshift" : "push"](() => {
+ buttons[6] = $$value;
+ $$invalidate(5, buttons);
+ });
+ }
+ $$self.$$set = ($$props2) => {
+ if ("plugin" in $$props2)
+ $$invalidate(0, plugin = $$props2.plugin);
+ if ("view" in $$props2)
+ $$invalidate(1, view = $$props2.view);
+ };
+ $$self.$$.update = () => {
+ if ($$self.$$.dirty & /*layoutBtn, showTree*/
+ 12) {
+ $: {
+ if (layoutBtn) {
+ layoutBtn.empty();
+ (0, import_obsidian20.setIcon)(layoutBtn, showTree ? "list" : "folder");
+ }
+ }
+ }
+ };
+ return [
+ plugin,
+ view,
+ showTree,
+ layoutBtn,
+ loading,
+ buttons,
+ logs,
+ div0_binding,
+ click_handler,
+ div1_binding
+ ];
+}
+var HistoryView = class extends SvelteComponent {
+ constructor(options) {
+ super();
+ init2(this, options, instance4, create_fragment4, safe_not_equal, { plugin: 0, view: 1 });
+ }
+};
+var historyView_default = HistoryView;
+
+// src/ui/history/historyView.ts
+var HistoryView2 = class extends import_obsidian21.ItemView {
+ constructor(leaf, plugin) {
+ super(leaf);
+ this.plugin = plugin;
+ this.hoverPopover = null;
+ }
+ getViewType() {
+ return HISTORY_VIEW_CONFIG.type;
+ }
+ getDisplayText() {
+ return HISTORY_VIEW_CONFIG.name;
+ }
+ getIcon() {
+ return HISTORY_VIEW_CONFIG.icon;
+ }
+ onClose() {
+ return super.onClose();
+ }
+ onOpen() {
+ this._view = new historyView_default({
+ target: this.contentEl,
+ props: {
+ plugin: this.plugin,
+ view: this
+ }
+ });
+ return super.onOpen();
+ }
+};
+
+// src/ui/modals/branchModal.ts
+init_polyfill_buffer();
+var import_obsidian22 = require("obsidian");
+var BranchModal = class extends import_obsidian22.FuzzySuggestModal {
+ constructor(branches) {
+ super(app);
+ this.branches = branches;
+ this.setPlaceholder("Select branch to checkout");
+ }
+ getItems() {
+ return this.branches;
+ }
+ getItemText(item) {
+ return item;
+ }
+ onChooseItem(item, evt) {
+ this.resolve(item);
+ }
+ open() {
+ super.open();
+ return new Promise((resolve) => {
+ this.resolve = resolve;
+ });
+ }
+ async onClose() {
+ await new Promise((resolve) => setTimeout(resolve, 10));
+ if (this.resolve)
+ this.resolve(void 0);
+ }
+};
+
+// src/ui/modals/ignoreModal.ts
+init_polyfill_buffer();
+var import_obsidian23 = require("obsidian");
+var IgnoreModal = class extends import_obsidian23.Modal {
+ constructor(app2, content) {
+ super(app2);
+ this.content = content;
+ this.resolve = null;
+ }
+ open() {
+ super.open();
+ return new Promise((resolve) => {
+ this.resolve = resolve;
+ });
+ }
+ onOpen() {
+ const { contentEl, titleEl } = this;
+ titleEl.setText("Edit .gitignore");
+ const div = contentEl.createDiv();
+ const text2 = div.createEl("textarea", {
+ text: this.content,
+ cls: ["obsidian-git-textarea"],
+ attr: { rows: 10, cols: 30, wrap: "off" }
+ });
+ div.createEl("button", {
+ cls: ["mod-cta", "obsidian-git-center-button"],
+ text: "Save"
+ }).addEventListener("click", async () => {
+ this.resolve(text2.value);
+ this.close();
+ });
+ }
+ onClose() {
+ const { contentEl } = this;
+ this.resolve(void 0);
+ contentEl.empty();
+ }
+};
+
+// src/ui/sourceControl/sourceControl.ts
+init_polyfill_buffer();
+var import_obsidian30 = require("obsidian");
+
+// src/ui/sourceControl/sourceControl.svelte
+init_polyfill_buffer();
+var import_obsidian29 = require("obsidian");
+
+// src/ui/modals/discardModal.ts
+init_polyfill_buffer();
+var import_obsidian24 = require("obsidian");
+var DiscardModal = class extends import_obsidian24.Modal {
+ constructor(app2, deletion, filename) {
+ super(app2);
+ this.deletion = deletion;
+ this.filename = filename;
+ this.resolve = null;
+ }
+ myOpen() {
+ this.open();
+ return new Promise((resolve) => {
+ this.resolve = resolve;
+ });
+ }
+ onOpen() {
+ const { contentEl, titleEl } = this;
+ titleEl.setText(`${this.deletion ? "Delete" : "Discard"} this file?`);
+ contentEl.createEl("p").setText(
+ `Do you really want to ${this.deletion ? "delete" : "discard the changes of"} "${this.filename}"`
+ );
+ const div = contentEl.createDiv({ cls: "modal-button-container" });
+ const discard = div.createEl("button", {
+ cls: "mod-warning",
+ text: this.deletion ? "Delete" : "Discard"
+ });
+ discard.addEventListener("click", async () => {
+ if (this.resolve)
+ this.resolve(true);
+ this.close();
+ });
+ discard.addEventListener("keypress", async () => {
+ if (this.resolve)
+ this.resolve(true);
+ this.close();
+ });
+ const close = div.createEl("button", {
+ text: "Cancel"
+ });
+ close.addEventListener("click", () => {
+ if (this.resolve)
+ this.resolve(false);
+ return this.close();
+ });
+ close.addEventListener("keypress", () => {
+ if (this.resolve)
+ this.resolve(false);
+ return this.close();
+ });
+ }
+ onClose() {
+ const { contentEl } = this;
+ contentEl.empty();
+ }
+};
+
+// src/ui/sourceControl/components/fileComponent.svelte
+init_polyfill_buffer();
+var import_obsidian26 = require("obsidian");
+
+// node_modules/.pnpm/github.com+Vinzent03+obsidian-community-lib@e663de4f95c879b40613090da78ea599ff621d24_@codemir_xyncsguozhhawq25qkwtwp76my/node_modules/obsidian-community-lib/dist/index.js
+init_polyfill_buffer();
+
+// node_modules/.pnpm/github.com+Vinzent03+obsidian-community-lib@e663de4f95c879b40613090da78ea599ff621d24_@codemir_xyncsguozhhawq25qkwtwp76my/node_modules/obsidian-community-lib/dist/utils.js
+init_polyfill_buffer();
+var feather = __toESM(require_feather());
+var import_obsidian25 = require("obsidian");
+function hoverPreview(event, view, to) {
+ const targetEl = event.target;
+ app.workspace.trigger("hover-link", {
+ event,
+ source: view.getViewType(),
+ hoverParent: view,
+ targetEl,
+ linktext: to
+ });
+}
+
+// src/ui/sourceControl/components/fileComponent.svelte
+function add_css3(target) {
+ append_styles(target, "svelte-1wbh8tp", "main.svelte-1wbh8tp .nav-file-title.svelte-1wbh8tp{align-items:center}");
+}
+function create_if_block5(ctx) {
+ let div;
+ let mounted;
+ let dispose;
+ return {
+ c() {
+ div = element("div");
+ attr(div, "data-icon", "go-to-file");
+ attr(div, "aria-label", "Open File");
+ attr(div, "class", "clickable-icon");
+ },
+ m(target, anchor) {
+ insert(target, div, anchor);
+ ctx[11](div);
+ if (!mounted) {
+ dispose = [
+ listen(div, "auxclick", stop_propagation(
+ /*open*/
+ ctx[5]
+ )),
+ listen(div, "click", stop_propagation(
+ /*open*/
+ ctx[5]
+ ))
+ ];
+ mounted = true;
+ }
+ },
+ p: noop,
+ d(detaching) {
+ if (detaching) {
+ detach(div);
+ }
+ ctx[11](null);
+ mounted = false;
+ run_all(dispose);
+ }
+ };
+}
+function create_fragment5(ctx) {
+ let main;
+ let div6;
+ let div0;
+ let t0_value = getDisplayPath(
+ /*change*/
+ ctx[0].vault_path
+ ) + "";
+ let t0;
+ let t1;
+ let div5;
+ let div3;
+ let show_if = (
+ /*view*/
+ ctx[1].app.vault.getAbstractFileByPath(
+ /*change*/
+ ctx[0].vault_path
+ )
+ );
+ let t2;
+ let div1;
+ let t3;
+ let div2;
+ let t4;
+ let div4;
+ let t5_value = (
+ /*change*/
+ ctx[0].working_dir + ""
+ );
+ let t5;
+ let div4_data_type_value;
+ let div6_data_path_value;
+ let div6_aria_label_value;
+ let mounted;
+ let dispose;
+ let if_block = show_if && create_if_block5(ctx);
+ return {
+ c() {
+ var _a2, _b, _c;
+ main = element("main");
+ div6 = element("div");
+ div0 = element("div");
+ t0 = text(t0_value);
+ t1 = space();
+ div5 = element("div");
+ div3 = element("div");
+ if (if_block)
+ if_block.c();
+ t2 = space();
+ div1 = element("div");
+ t3 = space();
+ div2 = element("div");
+ t4 = space();
+ div4 = element("div");
+ t5 = text(t5_value);
+ attr(div0, "class", "tree-item-inner nav-file-title-content");
+ attr(div1, "data-icon", "undo");
+ attr(div1, "aria-label", "Discard");
+ attr(div1, "class", "clickable-icon");
+ attr(div2, "data-icon", "plus");
+ attr(div2, "aria-label", "Stage");
+ attr(div2, "class", "clickable-icon");
+ attr(div3, "class", "buttons");
+ attr(div4, "class", "type");
+ attr(div4, "data-type", div4_data_type_value = /*change*/
+ ctx[0].working_dir);
+ attr(div5, "class", "git-tools");
+ attr(div6, "class", "tree-item-self is-clickable nav-file-title svelte-1wbh8tp");
+ attr(div6, "data-path", div6_data_path_value = /*change*/
+ ctx[0].vault_path);
+ attr(
+ div6,
+ "data-tooltip-position",
+ /*side*/
+ ctx[3]
+ );
+ attr(div6, "aria-label", div6_aria_label_value = /*change*/
+ ctx[0].vault_path);
+ toggle_class(
+ div6,
+ "is-active",
+ /*view*/
+ ((_a2 = ctx[1].plugin.lastDiffViewState) == null ? void 0 : _a2.file) == /*change*/
+ ctx[0].vault_path && !/*view*/
+ ((_b = ctx[1].plugin.lastDiffViewState) == null ? void 0 : _b.hash) && !/*view*/
+ ((_c = ctx[1].plugin.lastDiffViewState) == null ? void 0 : _c.staged)
+ );
+ attr(main, "class", "tree-item nav-file svelte-1wbh8tp");
+ },
+ m(target, anchor) {
+ insert(target, main, anchor);
+ append2(main, div6);
+ append2(div6, div0);
+ append2(div0, t0);
+ append2(div6, t1);
+ append2(div6, div5);
+ append2(div5, div3);
+ if (if_block)
+ if_block.m(div3, null);
+ append2(div3, t2);
+ append2(div3, div1);
+ ctx[12](div1);
+ append2(div3, t3);
+ append2(div3, div2);
+ ctx[13](div2);
+ append2(div5, t4);
+ append2(div5, div4);
+ append2(div4, t5);
+ if (!mounted) {
+ dispose = [
+ listen(div1, "click", stop_propagation(
+ /*discard*/
+ ctx[8]
+ )),
+ listen(div2, "click", stop_propagation(
+ /*stage*/
+ ctx[6]
+ )),
+ listen(
+ main,
+ "mouseover",
+ /*hover*/
+ ctx[4]
+ ),
+ listen(main, "click", stop_propagation(
+ /*showDiff*/
+ ctx[7]
+ )),
+ listen(main, "auxclick", stop_propagation(
+ /*showDiff*/
+ ctx[7]
+ )),
+ listen(
+ main,
+ "focus",
+ /*focus_handler*/
+ ctx[10]
+ )
+ ];
+ mounted = true;
+ }
+ },
+ p(ctx2, [dirty]) {
+ var _a2, _b, _c;
+ if (dirty & /*change*/
+ 1 && t0_value !== (t0_value = getDisplayPath(
+ /*change*/
+ ctx2[0].vault_path
+ ) + ""))
+ set_data(t0, t0_value);
+ if (dirty & /*view, change*/
+ 3)
+ show_if = /*view*/
+ ctx2[1].app.vault.getAbstractFileByPath(
+ /*change*/
+ ctx2[0].vault_path
+ );
+ if (show_if) {
+ if (if_block) {
+ if_block.p(ctx2, dirty);
+ } else {
+ if_block = create_if_block5(ctx2);
+ if_block.c();
+ if_block.m(div3, t2);
+ }
+ } else if (if_block) {
+ if_block.d(1);
+ if_block = null;
+ }
+ if (dirty & /*change*/
+ 1 && t5_value !== (t5_value = /*change*/
+ ctx2[0].working_dir + ""))
+ set_data(t5, t5_value);
+ if (dirty & /*change*/
+ 1 && div4_data_type_value !== (div4_data_type_value = /*change*/
+ ctx2[0].working_dir)) {
+ attr(div4, "data-type", div4_data_type_value);
+ }
+ if (dirty & /*change*/
+ 1 && div6_data_path_value !== (div6_data_path_value = /*change*/
+ ctx2[0].vault_path)) {
+ attr(div6, "data-path", div6_data_path_value);
+ }
+ if (dirty & /*side*/
+ 8) {
+ attr(
+ div6,
+ "data-tooltip-position",
+ /*side*/
+ ctx2[3]
+ );
+ }
+ if (dirty & /*change*/
+ 1 && div6_aria_label_value !== (div6_aria_label_value = /*change*/
+ ctx2[0].vault_path)) {
+ attr(div6, "aria-label", div6_aria_label_value);
+ }
+ if (dirty & /*view, change*/
+ 3) {
+ toggle_class(
+ div6,
+ "is-active",
+ /*view*/
+ ((_a2 = ctx2[1].plugin.lastDiffViewState) == null ? void 0 : _a2.file) == /*change*/
+ ctx2[0].vault_path && !/*view*/
+ ((_b = ctx2[1].plugin.lastDiffViewState) == null ? void 0 : _b.hash) && !/*view*/
+ ((_c = ctx2[1].plugin.lastDiffViewState) == null ? void 0 : _c.staged)
+ );
+ }
+ },
+ i: noop,
+ o: noop,
+ d(detaching) {
+ if (detaching) {
+ detach(main);
+ }
+ if (if_block)
+ if_block.d();
+ ctx[12](null);
+ ctx[13](null);
+ mounted = false;
+ run_all(dispose);
+ }
+ };
+}
+function instance5($$self, $$props, $$invalidate) {
+ let side;
+ let { change } = $$props;
+ let { view } = $$props;
+ let { manager } = $$props;
+ let buttons = [];
+ window.setTimeout(() => buttons.forEach((b) => (0, import_obsidian26.setIcon)(b, b.getAttr("data-icon"))), 0);
+ function hover(event) {
+ if (app.vault.getAbstractFileByPath(change.vault_path)) {
+ hoverPreview(event, view, change.vault_path);
+ }
+ }
+ function open(event) {
+ var _a2;
+ const file = view.app.vault.getAbstractFileByPath(change.vault_path);
+ console.log(event);
+ if (file instanceof import_obsidian26.TFile) {
+ (_a2 = getNewLeaf(event)) === null || _a2 === void 0 ? void 0 : _a2.openFile(file);
+ }
+ }
+ function stage() {
+ manager.stage(change.path, false).finally(() => {
+ dispatchEvent(new CustomEvent("git-refresh"));
+ });
+ }
+ function showDiff(event) {
+ var _a2;
+ (_a2 = getNewLeaf(event)) === null || _a2 === void 0 ? void 0 : _a2.setViewState({
+ type: DIFF_VIEW_CONFIG.type,
+ active: true,
+ state: { file: change.path, staged: false }
+ });
+ }
+ function discard() {
+ const deleteFile = change.working_dir == "U";
+ new DiscardModal(view.app, deleteFile, change.vault_path).myOpen().then((shouldDiscard) => {
+ if (shouldDiscard === true) {
+ if (deleteFile) {
+ view.app.vault.adapter.remove(change.vault_path).finally(() => {
+ dispatchEvent(new CustomEvent("git-refresh"));
+ });
+ } else {
+ manager.discard(change.path).finally(() => {
+ dispatchEvent(new CustomEvent("git-refresh"));
+ });
+ }
+ }
+ });
+ }
+ function focus_handler(event) {
+ bubble.call(this, $$self, event);
+ }
+ function div_binding($$value) {
+ binding_callbacks[$$value ? "unshift" : "push"](() => {
+ buttons[1] = $$value;
+ $$invalidate(2, buttons);
+ });
+ }
+ function div1_binding($$value) {
+ binding_callbacks[$$value ? "unshift" : "push"](() => {
+ buttons[0] = $$value;
+ $$invalidate(2, buttons);
+ });
+ }
+ function div2_binding($$value) {
+ binding_callbacks[$$value ? "unshift" : "push"](() => {
+ buttons[2] = $$value;
+ $$invalidate(2, buttons);
+ });
+ }
+ $$self.$$set = ($$props2) => {
+ if ("change" in $$props2)
+ $$invalidate(0, change = $$props2.change);
+ if ("view" in $$props2)
+ $$invalidate(1, view = $$props2.view);
+ if ("manager" in $$props2)
+ $$invalidate(9, manager = $$props2.manager);
+ };
+ $$self.$$.update = () => {
+ if ($$self.$$.dirty & /*view*/
+ 2) {
+ $:
+ $$invalidate(3, side = view.leaf.getRoot().side == "left" ? "right" : "left");
+ }
+ };
+ return [
+ change,
+ view,
+ buttons,
+ side,
+ hover,
+ open,
+ stage,
+ showDiff,
+ discard,
+ manager,
+ focus_handler,
+ div_binding,
+ div1_binding,
+ div2_binding
+ ];
+}
+var FileComponent = class extends SvelteComponent {
+ constructor(options) {
+ super();
+ init2(this, options, instance5, create_fragment5, safe_not_equal, { change: 0, view: 1, manager: 9 }, add_css3);
+ }
+};
+var fileComponent_default = FileComponent;
+
+// src/ui/sourceControl/components/pulledFileComponent.svelte
+init_polyfill_buffer();
+var import_obsidian27 = require("obsidian");
+function add_css4(target) {
+ append_styles(target, "svelte-1wbh8tp", "main.svelte-1wbh8tp .nav-file-title.svelte-1wbh8tp{align-items:center}");
+}
+function create_fragment6(ctx) {
+ let main;
+ let div2;
+ let div0;
+ let t0_value = getDisplayPath(
+ /*change*/
+ ctx[0].vault_path
+ ) + "";
+ let t0;
+ let t1;
+ let div1;
+ let span;
+ let t2_value = (
+ /*change*/
+ ctx[0].working_dir + ""
+ );
+ let t2;
+ let span_data_type_value;
+ let div2_data_path_value;
+ let div2_aria_label_value;
+ let mounted;
+ let dispose;
+ return {
+ c() {
+ main = element("main");
+ div2 = element("div");
+ div0 = element("div");
+ t0 = text(t0_value);
+ t1 = space();
+ div1 = element("div");
+ span = element("span");
+ t2 = text(t2_value);
+ attr(div0, "class", "tree-item-inner nav-file-title-content");
+ attr(span, "class", "type");
+ attr(span, "data-type", span_data_type_value = /*change*/
+ ctx[0].working_dir);
+ attr(div1, "class", "git-tools");
+ attr(div2, "class", "tree-item-self is-clickable nav-file-title svelte-1wbh8tp");
+ attr(div2, "data-path", div2_data_path_value = /*change*/
+ ctx[0].vault_path);
+ attr(
+ div2,
+ "data-tooltip-position",
+ /*side*/
+ ctx[1]
+ );
+ attr(div2, "aria-label", div2_aria_label_value = /*change*/
+ ctx[0].vault_path);
+ attr(main, "class", "tree-item nav-file svelte-1wbh8tp");
+ },
+ m(target, anchor) {
+ insert(target, main, anchor);
+ append2(main, div2);
+ append2(div2, div0);
+ append2(div0, t0);
+ append2(div2, t1);
+ append2(div2, div1);
+ append2(div1, span);
+ append2(span, t2);
+ if (!mounted) {
+ dispose = [
+ listen(
+ main,
+ "mouseover",
+ /*hover*/
+ ctx[2]
+ ),
+ listen(main, "click", stop_propagation(
+ /*open*/
+ ctx[3]
+ )),
+ listen(main, "auxclick", stop_propagation(
+ /*open*/
+ ctx[3]
+ )),
+ listen(
+ main,
+ "focus",
+ /*focus_handler*/
+ ctx[5]
+ )
+ ];
+ mounted = true;
+ }
+ },
+ p(ctx2, [dirty]) {
+ if (dirty & /*change*/
+ 1 && t0_value !== (t0_value = getDisplayPath(
+ /*change*/
+ ctx2[0].vault_path
+ ) + ""))
+ set_data(t0, t0_value);
+ if (dirty & /*change*/
+ 1 && t2_value !== (t2_value = /*change*/
+ ctx2[0].working_dir + ""))
+ set_data(t2, t2_value);
+ if (dirty & /*change*/
+ 1 && span_data_type_value !== (span_data_type_value = /*change*/
+ ctx2[0].working_dir)) {
+ attr(span, "data-type", span_data_type_value);
+ }
+ if (dirty & /*change*/
+ 1 && div2_data_path_value !== (div2_data_path_value = /*change*/
+ ctx2[0].vault_path)) {
+ attr(div2, "data-path", div2_data_path_value);
+ }
+ if (dirty & /*side*/
+ 2) {
+ attr(
+ div2,
+ "data-tooltip-position",
+ /*side*/
+ ctx2[1]
+ );
+ }
+ if (dirty & /*change*/
+ 1 && div2_aria_label_value !== (div2_aria_label_value = /*change*/
+ ctx2[0].vault_path)) {
+ attr(div2, "aria-label", div2_aria_label_value);
+ }
+ },
+ i: noop,
+ o: noop,
+ d(detaching) {
+ if (detaching) {
+ detach(main);
+ }
+ mounted = false;
+ run_all(dispose);
+ }
+ };
+}
+function instance6($$self, $$props, $$invalidate) {
+ let side;
+ let { change } = $$props;
+ let { view } = $$props;
+ function hover(event) {
+ if (app.vault.getAbstractFileByPath(change.vault_path)) {
+ hoverPreview(event, view, change.vault_path);
+ }
+ }
+ function open(event) {
+ var _a2;
+ const file = view.app.vault.getAbstractFileByPath(change.vault_path);
+ if (file instanceof import_obsidian27.TFile) {
+ (_a2 = getNewLeaf(event)) === null || _a2 === void 0 ? void 0 : _a2.openFile(file);
+ }
+ }
+ function focus_handler(event) {
+ bubble.call(this, $$self, event);
+ }
+ $$self.$$set = ($$props2) => {
+ if ("change" in $$props2)
+ $$invalidate(0, change = $$props2.change);
+ if ("view" in $$props2)
+ $$invalidate(4, view = $$props2.view);
+ };
+ $$self.$$.update = () => {
+ if ($$self.$$.dirty & /*view*/
+ 16) {
+ $:
+ $$invalidate(1, side = view.leaf.getRoot().side == "left" ? "right" : "left");
+ }
+ };
+ return [change, side, hover, open, view, focus_handler];
+}
+var PulledFileComponent = class extends SvelteComponent {
+ constructor(options) {
+ super();
+ init2(this, options, instance6, create_fragment6, safe_not_equal, { change: 0, view: 4 }, add_css4);
+ }
+};
+var pulledFileComponent_default = PulledFileComponent;
+
+// src/ui/sourceControl/components/stagedFileComponent.svelte
+init_polyfill_buffer();
+var import_obsidian28 = require("obsidian");
+function add_css5(target) {
+ append_styles(target, "svelte-1wbh8tp", "main.svelte-1wbh8tp .nav-file-title.svelte-1wbh8tp{align-items:center}");
+}
+function create_if_block6(ctx) {
+ let div;
+ let mounted;
+ let dispose;
+ return {
+ c() {
+ div = element("div");
+ attr(div, "data-icon", "go-to-file");
+ attr(div, "aria-label", "Open File");
+ attr(div, "class", "clickable-icon");
+ },
+ m(target, anchor) {
+ insert(target, div, anchor);
+ ctx[10](div);
+ if (!mounted) {
+ dispose = listen(div, "click", stop_propagation(
+ /*open*/
+ ctx[5]
+ ));
+ mounted = true;
+ }
+ },
+ p: noop,
+ d(detaching) {
+ if (detaching) {
+ detach(div);
+ }
+ ctx[10](null);
+ mounted = false;
+ dispose();
+ }
+ };
+}
+function create_fragment7(ctx) {
+ let main;
+ let div5;
+ let div0;
+ let t0_value = getDisplayPath(
+ /*change*/
+ ctx[0].vault_path
+ ) + "";
+ let t0;
+ let t1;
+ let div4;
+ let div2;
+ let show_if = (
+ /*view*/
+ ctx[1].app.vault.getAbstractFileByPath(
+ /*change*/
+ ctx[0].vault_path
+ )
+ );
+ let t2;
+ let div1;
+ let t3;
+ let div3;
+ let t4_value = (
+ /*change*/
+ ctx[0].index + ""
+ );
+ let t4;
+ let div3_data_type_value;
+ let div5_data_path_value;
+ let div5_aria_label_value;
+ let mounted;
+ let dispose;
+ let if_block = show_if && create_if_block6(ctx);
+ return {
+ c() {
+ var _a2, _b, _c;
+ main = element("main");
+ div5 = element("div");
+ div0 = element("div");
+ t0 = text(t0_value);
+ t1 = space();
+ div4 = element("div");
+ div2 = element("div");
+ if (if_block)
+ if_block.c();
+ t2 = space();
+ div1 = element("div");
+ t3 = space();
+ div3 = element("div");
+ t4 = text(t4_value);
+ attr(div0, "class", "tree-item-inner nav-file-title-content");
+ attr(div1, "data-icon", "minus");
+ attr(div1, "aria-label", "Unstage");
+ attr(div1, "class", "clickable-icon");
+ attr(div2, "class", "buttons");
+ attr(div3, "class", "type");
+ attr(div3, "data-type", div3_data_type_value = /*change*/
+ ctx[0].index);
+ attr(div4, "class", "git-tools");
+ attr(div5, "class", "tree-item-self is-clickable nav-file-title svelte-1wbh8tp");
+ attr(div5, "data-path", div5_data_path_value = /*change*/
+ ctx[0].vault_path);
+ attr(
+ div5,
+ "data-tooltip-position",
+ /*side*/
+ ctx[3]
+ );
+ attr(div5, "aria-label", div5_aria_label_value = /*change*/
+ ctx[0].vault_path);
+ toggle_class(
+ div5,
+ "is-active",
+ /*view*/
+ ((_a2 = ctx[1].plugin.lastDiffViewState) == null ? void 0 : _a2.file) == /*change*/
+ ctx[0].vault_path && !/*view*/
+ ((_b = ctx[1].plugin.lastDiffViewState) == null ? void 0 : _b.hash) && /*view*/
+ ((_c = ctx[1].plugin.lastDiffViewState) == null ? void 0 : _c.staged)
+ );
+ attr(main, "class", "tree-item nav-file svelte-1wbh8tp");
+ },
+ m(target, anchor) {
+ insert(target, main, anchor);
+ append2(main, div5);
+ append2(div5, div0);
+ append2(div0, t0);
+ append2(div5, t1);
+ append2(div5, div4);
+ append2(div4, div2);
+ if (if_block)
+ if_block.m(div2, null);
+ append2(div2, t2);
+ append2(div2, div1);
+ ctx[11](div1);
+ append2(div4, t3);
+ append2(div4, div3);
+ append2(div3, t4);
+ if (!mounted) {
+ dispose = [
+ listen(div1, "click", stop_propagation(
+ /*unstage*/
+ ctx[7]
+ )),
+ listen(
+ main,
+ "mouseover",
+ /*hover*/
+ ctx[4]
+ ),
+ listen(
+ main,
+ "focus",
+ /*focus_handler*/
+ ctx[9]
+ ),
+ listen(main, "click", stop_propagation(
+ /*showDiff*/
+ ctx[6]
+ )),
+ listen(main, "auxclick", stop_propagation(
+ /*showDiff*/
+ ctx[6]
+ ))
+ ];
+ mounted = true;
+ }
+ },
+ p(ctx2, [dirty]) {
+ var _a2, _b, _c;
+ if (dirty & /*change*/
+ 1 && t0_value !== (t0_value = getDisplayPath(
+ /*change*/
+ ctx2[0].vault_path
+ ) + ""))
+ set_data(t0, t0_value);
+ if (dirty & /*view, change*/
+ 3)
+ show_if = /*view*/
+ ctx2[1].app.vault.getAbstractFileByPath(
+ /*change*/
+ ctx2[0].vault_path
+ );
+ if (show_if) {
+ if (if_block) {
+ if_block.p(ctx2, dirty);
+ } else {
+ if_block = create_if_block6(ctx2);
+ if_block.c();
+ if_block.m(div2, t2);
+ }
+ } else if (if_block) {
+ if_block.d(1);
+ if_block = null;
+ }
+ if (dirty & /*change*/
+ 1 && t4_value !== (t4_value = /*change*/
+ ctx2[0].index + ""))
+ set_data(t4, t4_value);
+ if (dirty & /*change*/
+ 1 && div3_data_type_value !== (div3_data_type_value = /*change*/
+ ctx2[0].index)) {
+ attr(div3, "data-type", div3_data_type_value);
+ }
+ if (dirty & /*change*/
+ 1 && div5_data_path_value !== (div5_data_path_value = /*change*/
+ ctx2[0].vault_path)) {
+ attr(div5, "data-path", div5_data_path_value);
+ }
+ if (dirty & /*side*/
+ 8) {
+ attr(
+ div5,
+ "data-tooltip-position",
+ /*side*/
+ ctx2[3]
+ );
+ }
+ if (dirty & /*change*/
+ 1 && div5_aria_label_value !== (div5_aria_label_value = /*change*/
+ ctx2[0].vault_path)) {
+ attr(div5, "aria-label", div5_aria_label_value);
+ }
+ if (dirty & /*view, change*/
+ 3) {
+ toggle_class(
+ div5,
+ "is-active",
+ /*view*/
+ ((_a2 = ctx2[1].plugin.lastDiffViewState) == null ? void 0 : _a2.file) == /*change*/
+ ctx2[0].vault_path && !/*view*/
+ ((_b = ctx2[1].plugin.lastDiffViewState) == null ? void 0 : _b.hash) && /*view*/
+ ((_c = ctx2[1].plugin.lastDiffViewState) == null ? void 0 : _c.staged)
+ );
+ }
+ },
+ i: noop,
+ o: noop,
+ d(detaching) {
+ if (detaching) {
+ detach(main);
+ }
+ if (if_block)
+ if_block.d();
+ ctx[11](null);
+ mounted = false;
+ run_all(dispose);
+ }
+ };
+}
+function instance7($$self, $$props, $$invalidate) {
+ let side;
+ let { change } = $$props;
+ let { view } = $$props;
+ let { manager } = $$props;
+ let buttons = [];
+ window.setTimeout(() => buttons.forEach((b) => (0, import_obsidian28.setIcon)(b, b.getAttr("data-icon"))), 0);
+ function hover(event) {
+ if (app.vault.getAbstractFileByPath(change.vault_path)) {
+ hoverPreview(event, view, change.vault_path);
+ }
+ }
+ function open(event) {
+ var _a2;
+ const file = view.app.vault.getAbstractFileByPath(change.vault_path);
+ if (file instanceof import_obsidian28.TFile) {
+ (_a2 = getNewLeaf(event)) === null || _a2 === void 0 ? void 0 : _a2.openFile(file);
+ }
+ }
+ function showDiff(event) {
+ var _a2;
+ (_a2 = getNewLeaf(event)) === null || _a2 === void 0 ? void 0 : _a2.setViewState({
+ type: DIFF_VIEW_CONFIG.type,
+ active: true,
+ state: { file: change.path, staged: true }
+ });
+ }
+ function unstage() {
+ manager.unstage(change.path, false).finally(() => {
+ dispatchEvent(new CustomEvent("git-refresh"));
+ });
+ }
+ function focus_handler(event) {
+ bubble.call(this, $$self, event);
+ }
+ function div_binding($$value) {
+ binding_callbacks[$$value ? "unshift" : "push"](() => {
+ buttons[1] = $$value;
+ $$invalidate(2, buttons);
+ });
+ }
+ function div1_binding($$value) {
+ binding_callbacks[$$value ? "unshift" : "push"](() => {
+ buttons[0] = $$value;
+ $$invalidate(2, buttons);
+ });
+ }
+ $$self.$$set = ($$props2) => {
+ if ("change" in $$props2)
+ $$invalidate(0, change = $$props2.change);
+ if ("view" in $$props2)
+ $$invalidate(1, view = $$props2.view);
+ if ("manager" in $$props2)
+ $$invalidate(8, manager = $$props2.manager);
+ };
+ $$self.$$.update = () => {
+ if ($$self.$$.dirty & /*view*/
+ 2) {
+ $:
+ $$invalidate(3, side = view.leaf.getRoot().side == "left" ? "right" : "left");
+ }
+ };
+ return [
+ change,
+ view,
+ buttons,
+ side,
+ hover,
+ open,
+ showDiff,
+ unstage,
+ manager,
+ focus_handler,
+ div_binding,
+ div1_binding
+ ];
+}
+var StagedFileComponent = class extends SvelteComponent {
+ constructor(options) {
+ super();
+ init2(this, options, instance7, create_fragment7, safe_not_equal, { change: 0, view: 1, manager: 8 }, add_css5);
+ }
+};
+var stagedFileComponent_default = StagedFileComponent;
+
+// src/ui/sourceControl/components/treeComponent.svelte
+init_polyfill_buffer();
+function add_css6(target) {
+ append_styles(target, "svelte-hup5mn", "main.svelte-hup5mn .nav-folder-title.svelte-hup5mn{align-items:center}");
+}
+function get_each_context4(ctx, list, i) {
+ const child_ctx = ctx.slice();
+ child_ctx[15] = list[i];
+ return child_ctx;
+}
+function create_else_block3(ctx) {
+ let div7;
+ let div6;
+ let div0;
+ let t0;
+ let div1;
+ let t1;
+ let div2;
+ let t2_value = (
+ /*entity*/
+ ctx[15].title + ""
+ );
+ let t2;
+ let t3;
+ let div5;
+ let div4;
+ let t4;
+ let div3;
+ let div6_aria_label_value;
+ let t5;
+ let t6;
+ let current;
+ let mounted;
+ let dispose;
+ function select_block_type_2(ctx2, dirty) {
+ if (
+ /*fileType*/
+ ctx2[3] == 0 /* staged */
+ )
+ return create_if_block_5;
+ return create_else_block_1;
+ }
+ let current_block_type = select_block_type_2(ctx, -1);
+ let if_block0 = current_block_type(ctx);
+ let if_block1 = !/*closed*/
+ ctx[5][
+ /*entity*/
+ ctx[15].title
+ ] && create_if_block_42(ctx);
+ function click_handler_3() {
+ return (
+ /*click_handler_3*/
+ ctx[14](
+ /*entity*/
+ ctx[15]
+ )
+ );
+ }
+ return {
+ c() {
+ div7 = element("div");
+ div6 = element("div");
+ div0 = element("div");
+ t0 = space();
+ div1 = element("div");
+ div1.innerHTML = ``;
+ t1 = space();
+ div2 = element("div");
+ t2 = text(t2_value);
+ t3 = space();
+ div5 = element("div");
+ div4 = element("div");
+ if_block0.c();
+ t4 = space();
+ div3 = element("div");
+ t5 = space();
+ if (if_block1)
+ if_block1.c();
+ t6 = space();
+ attr(div0, "data-icon", "folder");
+ set_style(div0, "padding-right", "5px");
+ set_style(div0, "display", "flex");
+ attr(div1, "class", "tree-item-icon nav-folder-collapse-indicator collapse-icon");
+ toggle_class(
+ div1,
+ "is-collapsed",
+ /*closed*/
+ ctx[5][
+ /*entity*/
+ ctx[15].title
+ ]
+ );
+ attr(div2, "class", "tree-item-inner nav-folder-title-content");
+ set_style(div3, "width", "11px");
+ attr(div4, "class", "buttons");
+ attr(div5, "class", "git-tools");
+ attr(div6, "class", "tree-item-self is-clickable nav-folder-title svelte-hup5mn");
+ attr(
+ div6,
+ "data-tooltip-position",
+ /*side*/
+ ctx[6]
+ );
+ attr(div6, "aria-label", div6_aria_label_value = /*entity*/
+ ctx[15].vaultPath);
+ attr(div7, "class", "tree-item nav-folder");
+ toggle_class(
+ div7,
+ "is-collapsed",
+ /*closed*/
+ ctx[5][
+ /*entity*/
+ ctx[15].title
+ ]
+ );
+ },
+ m(target, anchor) {
+ insert(target, div7, anchor);
+ append2(div7, div6);
+ append2(div6, div0);
+ append2(div6, t0);
+ append2(div6, div1);
+ append2(div6, t1);
+ append2(div6, div2);
+ append2(div2, t2);
+ append2(div6, t3);
+ append2(div6, div5);
+ append2(div5, div4);
+ if_block0.m(div4, null);
+ append2(div4, t4);
+ append2(div4, div3);
+ append2(div7, t5);
+ if (if_block1)
+ if_block1.m(div7, null);
+ append2(div7, t6);
+ current = true;
+ if (!mounted) {
+ dispose = listen(div7, "click", stop_propagation(click_handler_3));
+ mounted = true;
+ }
+ },
+ p(new_ctx, dirty) {
+ ctx = new_ctx;
+ if (!current || dirty & /*closed, hierarchy*/
+ 33) {
+ toggle_class(
+ div1,
+ "is-collapsed",
+ /*closed*/
+ ctx[5][
+ /*entity*/
+ ctx[15].title
+ ]
+ );
+ }
+ if ((!current || dirty & /*hierarchy*/
+ 1) && t2_value !== (t2_value = /*entity*/
+ ctx[15].title + ""))
+ set_data(t2, t2_value);
+ if (current_block_type === (current_block_type = select_block_type_2(ctx, dirty)) && if_block0) {
+ if_block0.p(ctx, dirty);
+ } else {
+ if_block0.d(1);
+ if_block0 = current_block_type(ctx);
+ if (if_block0) {
+ if_block0.c();
+ if_block0.m(div4, t4);
+ }
+ }
+ if (!current || dirty & /*side*/
+ 64) {
+ attr(
+ div6,
+ "data-tooltip-position",
+ /*side*/
+ ctx[6]
+ );
+ }
+ if (!current || dirty & /*hierarchy*/
+ 1 && div6_aria_label_value !== (div6_aria_label_value = /*entity*/
+ ctx[15].vaultPath)) {
+ attr(div6, "aria-label", div6_aria_label_value);
+ }
+ if (!/*closed*/
+ ctx[5][
+ /*entity*/
+ ctx[15].title
+ ]) {
+ if (if_block1) {
+ if_block1.p(ctx, dirty);
+ if (dirty & /*closed, hierarchy*/
+ 33) {
+ transition_in(if_block1, 1);
+ }
+ } else {
+ if_block1 = create_if_block_42(ctx);
+ if_block1.c();
+ transition_in(if_block1, 1);
+ if_block1.m(div7, t6);
+ }
+ } else if (if_block1) {
+ group_outros();
+ transition_out(if_block1, 1, 1, () => {
+ if_block1 = null;
+ });
+ check_outros();
+ }
+ if (!current || dirty & /*closed, hierarchy*/
+ 33) {
+ toggle_class(
+ div7,
+ "is-collapsed",
+ /*closed*/
+ ctx[5][
+ /*entity*/
+ ctx[15].title
+ ]
+ );
+ }
+ },
+ i(local) {
+ if (current)
+ return;
+ transition_in(if_block1);
+ current = true;
+ },
+ o(local) {
+ transition_out(if_block1);
+ current = false;
+ },
+ d(detaching) {
+ if (detaching) {
+ detach(div7);
+ }
+ if_block0.d();
+ if (if_block1)
+ if_block1.d();
+ mounted = false;
+ dispose();
+ }
+ };
+}
+function create_if_block7(ctx) {
+ let div;
+ let current_block_type_index;
+ let if_block;
+ let t;
+ let current;
+ const if_block_creators = [create_if_block_13, create_if_block_22, create_if_block_32];
+ const if_blocks = [];
+ function select_block_type_1(ctx2, dirty) {
+ if (
+ /*fileType*/
+ ctx2[3] == 0 /* staged */
+ )
+ return 0;
+ if (
+ /*fileType*/
+ ctx2[3] == 1 /* changed */
+ )
+ return 1;
+ if (
+ /*fileType*/
+ ctx2[3] == 2 /* pulled */
+ )
+ return 2;
+ return -1;
+ }
+ if (~(current_block_type_index = select_block_type_1(ctx, -1))) {
+ if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);
+ }
+ return {
+ c() {
+ div = element("div");
+ if (if_block)
+ if_block.c();
+ t = space();
+ },
+ m(target, anchor) {
+ insert(target, div, anchor);
+ if (~current_block_type_index) {
+ if_blocks[current_block_type_index].m(div, null);
+ }
+ append2(div, t);
+ current = true;
+ },
+ p(ctx2, dirty) {
+ let previous_block_index = current_block_type_index;
+ current_block_type_index = select_block_type_1(ctx2, dirty);
+ if (current_block_type_index === previous_block_index) {
+ if (~current_block_type_index) {
+ if_blocks[current_block_type_index].p(ctx2, dirty);
+ }
+ } else {
+ if (if_block) {
+ group_outros();
+ transition_out(if_blocks[previous_block_index], 1, 1, () => {
+ if_blocks[previous_block_index] = null;
+ });
+ check_outros();
+ }
+ if (~current_block_type_index) {
+ if_block = if_blocks[current_block_type_index];
+ if (!if_block) {
+ if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx2);
+ if_block.c();
+ } else {
+ if_block.p(ctx2, dirty);
+ }
+ transition_in(if_block, 1);
+ if_block.m(div, t);
+ } else {
+ if_block = null;
+ }
+ }
+ },
+ i(local) {
+ if (current)
+ return;
+ transition_in(if_block);
+ current = true;
+ },
+ o(local) {
+ transition_out(if_block);
+ current = false;
+ },
+ d(detaching) {
+ if (detaching) {
+ detach(div);
+ }
+ if (~current_block_type_index) {
+ if_blocks[current_block_type_index].d();
+ }
+ }
+ };
+}
+function create_else_block_1(ctx) {
+ let div0;
+ let t;
+ let div1;
+ let mounted;
+ let dispose;
+ function click_handler_1() {
+ return (
+ /*click_handler_1*/
+ ctx[12](
+ /*entity*/
+ ctx[15]
+ )
+ );
+ }
+ function click_handler_2() {
+ return (
+ /*click_handler_2*/
+ ctx[13](
+ /*entity*/
+ ctx[15]
+ )
+ );
+ }
+ return {
+ c() {
+ div0 = element("div");
+ div0.innerHTML = ``;
+ t = space();
+ div1 = element("div");
+ div1.innerHTML = ``;
+ attr(div0, "data-icon", "undo");
+ attr(div0, "aria-label", "Discard");
+ attr(div0, "class", "clickable-icon");
+ attr(div1, "data-icon", "plus");
+ attr(div1, "aria-label", "Stage");
+ attr(div1, "class", "clickable-icon");
+ },
+ m(target, anchor) {
+ insert(target, div0, anchor);
+ insert(target, t, anchor);
+ insert(target, div1, anchor);
+ if (!mounted) {
+ dispose = [
+ listen(div0, "click", stop_propagation(click_handler_1)),
+ listen(div1, "click", stop_propagation(click_handler_2))
+ ];
+ mounted = true;
+ }
+ },
+ p(new_ctx, dirty) {
+ ctx = new_ctx;
+ },
+ d(detaching) {
+ if (detaching) {
+ detach(div0);
+ detach(t);
+ detach(div1);
+ }
+ mounted = false;
+ run_all(dispose);
+ }
+ };
+}
+function create_if_block_5(ctx) {
+ let div;
+ let mounted;
+ let dispose;
+ function click_handler() {
+ return (
+ /*click_handler*/
+ ctx[11](
+ /*entity*/
+ ctx[15]
+ )
+ );
+ }
+ return {
+ c() {
+ div = element("div");
+ div.innerHTML = ``;
+ attr(div, "data-icon", "minus");
+ attr(div, "aria-label", "Unstage");
+ attr(div, "class", "clickable-icon");
+ },
+ m(target, anchor) {
+ insert(target, div, anchor);
+ if (!mounted) {
+ dispose = listen(div, "click", stop_propagation(click_handler));
+ mounted = true;
+ }
+ },
+ p(new_ctx, dirty) {
+ ctx = new_ctx;
+ },
+ d(detaching) {
+ if (detaching) {
+ detach(div);
+ }
+ mounted = false;
+ dispose();
+ }
+ };
+}
+function create_if_block_42(ctx) {
+ let div;
+ let treecomponent;
+ let div_transition;
+ let current;
+ treecomponent = new TreeComponent({
+ props: {
+ hierarchy: (
+ /*entity*/
+ ctx[15]
+ ),
+ plugin: (
+ /*plugin*/
+ ctx[1]
+ ),
+ view: (
+ /*view*/
+ ctx[2]
+ ),
+ fileType: (
+ /*fileType*/
+ ctx[3]
+ )
+ }
+ });
+ return {
+ c() {
+ div = element("div");
+ create_component(treecomponent.$$.fragment);
+ attr(div, "class", "tree-item-children nav-folder-children");
+ },
+ m(target, anchor) {
+ insert(target, div, anchor);
+ mount_component(treecomponent, div, null);
+ current = true;
+ },
+ p(ctx2, dirty) {
+ const treecomponent_changes = {};
+ if (dirty & /*hierarchy*/
+ 1)
+ treecomponent_changes.hierarchy = /*entity*/
+ ctx2[15];
+ if (dirty & /*plugin*/
+ 2)
+ treecomponent_changes.plugin = /*plugin*/
+ ctx2[1];
+ if (dirty & /*view*/
+ 4)
+ treecomponent_changes.view = /*view*/
+ ctx2[2];
+ if (dirty & /*fileType*/
+ 8)
+ treecomponent_changes.fileType = /*fileType*/
+ ctx2[3];
+ treecomponent.$set(treecomponent_changes);
+ },
+ i(local) {
+ if (current)
+ return;
+ transition_in(treecomponent.$$.fragment, local);
+ if (local) {
+ add_render_callback(() => {
+ if (!current)
+ return;
+ if (!div_transition)
+ div_transition = create_bidirectional_transition(div, slide, { duration: 150 }, true);
+ div_transition.run(1);
+ });
+ }
+ current = true;
+ },
+ o(local) {
+ transition_out(treecomponent.$$.fragment, local);
+ if (local) {
+ if (!div_transition)
+ div_transition = create_bidirectional_transition(div, slide, { duration: 150 }, false);
+ div_transition.run(0);
+ }
+ current = false;
+ },
+ d(detaching) {
+ if (detaching) {
+ detach(div);
+ }
+ destroy_component(treecomponent);
+ if (detaching && div_transition)
+ div_transition.end();
+ }
+ };
+}
+function create_if_block_32(ctx) {
+ let pulledfilecomponent;
+ let current;
+ pulledfilecomponent = new pulledFileComponent_default({
+ props: {
+ change: (
+ /*entity*/
+ ctx[15].data
+ ),
+ view: (
+ /*view*/
+ ctx[2]
+ )
+ }
+ });
+ return {
+ c() {
+ create_component(pulledfilecomponent.$$.fragment);
+ },
+ m(target, anchor) {
+ mount_component(pulledfilecomponent, target, anchor);
+ current = true;
+ },
+ p(ctx2, dirty) {
+ const pulledfilecomponent_changes = {};
+ if (dirty & /*hierarchy*/
+ 1)
+ pulledfilecomponent_changes.change = /*entity*/
+ ctx2[15].data;
+ if (dirty & /*view*/
+ 4)
+ pulledfilecomponent_changes.view = /*view*/
+ ctx2[2];
+ pulledfilecomponent.$set(pulledfilecomponent_changes);
+ },
+ i(local) {
+ if (current)
+ return;
+ transition_in(pulledfilecomponent.$$.fragment, local);
+ current = true;
+ },
+ o(local) {
+ transition_out(pulledfilecomponent.$$.fragment, local);
+ current = false;
+ },
+ d(detaching) {
+ destroy_component(pulledfilecomponent, detaching);
+ }
+ };
+}
+function create_if_block_22(ctx) {
+ let filecomponent;
+ let current;
+ filecomponent = new fileComponent_default({
+ props: {
+ change: (
+ /*entity*/
+ ctx[15].data
+ ),
+ manager: (
+ /*plugin*/
+ ctx[1].gitManager
+ ),
+ view: (
+ /*view*/
+ ctx[2]
+ )
+ }
+ });
+ return {
+ c() {
+ create_component(filecomponent.$$.fragment);
+ },
+ m(target, anchor) {
+ mount_component(filecomponent, target, anchor);
+ current = true;
+ },
+ p(ctx2, dirty) {
+ const filecomponent_changes = {};
+ if (dirty & /*hierarchy*/
+ 1)
+ filecomponent_changes.change = /*entity*/
+ ctx2[15].data;
+ if (dirty & /*plugin*/
+ 2)
+ filecomponent_changes.manager = /*plugin*/
+ ctx2[1].gitManager;
+ if (dirty & /*view*/
+ 4)
+ filecomponent_changes.view = /*view*/
+ ctx2[2];
+ filecomponent.$set(filecomponent_changes);
+ },
+ i(local) {
+ if (current)
+ return;
+ transition_in(filecomponent.$$.fragment, local);
+ current = true;
+ },
+ o(local) {
+ transition_out(filecomponent.$$.fragment, local);
+ current = false;
+ },
+ d(detaching) {
+ destroy_component(filecomponent, detaching);
+ }
+ };
+}
+function create_if_block_13(ctx) {
+ let stagedfilecomponent;
+ let current;
+ stagedfilecomponent = new stagedFileComponent_default({
+ props: {
+ change: (
+ /*entity*/
+ ctx[15].data
+ ),
+ manager: (
+ /*plugin*/
+ ctx[1].gitManager
+ ),
+ view: (
+ /*view*/
+ ctx[2]
+ )
+ }
+ });
+ return {
+ c() {
+ create_component(stagedfilecomponent.$$.fragment);
+ },
+ m(target, anchor) {
+ mount_component(stagedfilecomponent, target, anchor);
+ current = true;
+ },
+ p(ctx2, dirty) {
+ const stagedfilecomponent_changes = {};
+ if (dirty & /*hierarchy*/
+ 1)
+ stagedfilecomponent_changes.change = /*entity*/
+ ctx2[15].data;
+ if (dirty & /*plugin*/
+ 2)
+ stagedfilecomponent_changes.manager = /*plugin*/
+ ctx2[1].gitManager;
+ if (dirty & /*view*/
+ 4)
+ stagedfilecomponent_changes.view = /*view*/
+ ctx2[2];
+ stagedfilecomponent.$set(stagedfilecomponent_changes);
+ },
+ i(local) {
+ if (current)
+ return;
+ transition_in(stagedfilecomponent.$$.fragment, local);
+ current = true;
+ },
+ o(local) {
+ transition_out(stagedfilecomponent.$$.fragment, local);
+ current = false;
+ },
+ d(detaching) {
+ destroy_component(stagedfilecomponent, detaching);
+ }
+ };
+}
+function create_each_block4(ctx) {
+ let current_block_type_index;
+ let if_block;
+ let if_block_anchor;
+ let current;
+ const if_block_creators = [create_if_block7, create_else_block3];
+ const if_blocks = [];
+ function select_block_type(ctx2, dirty) {
+ if (
+ /*entity*/
+ ctx2[15].data
+ )
+ return 0;
+ return 1;
+ }
+ current_block_type_index = select_block_type(ctx, -1);
+ if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);
+ return {
+ c() {
+ if_block.c();
+ if_block_anchor = empty();
+ },
+ m(target, anchor) {
+ if_blocks[current_block_type_index].m(target, anchor);
+ insert(target, if_block_anchor, anchor);
+ current = true;
+ },
+ p(ctx2, dirty) {
+ let previous_block_index = current_block_type_index;
+ current_block_type_index = select_block_type(ctx2, dirty);
+ if (current_block_type_index === previous_block_index) {
+ if_blocks[current_block_type_index].p(ctx2, dirty);
+ } else {
+ group_outros();
+ transition_out(if_blocks[previous_block_index], 1, 1, () => {
+ if_blocks[previous_block_index] = null;
+ });
+ check_outros();
+ if_block = if_blocks[current_block_type_index];
+ if (!if_block) {
+ if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx2);
+ if_block.c();
+ } else {
+ if_block.p(ctx2, dirty);
+ }
+ transition_in(if_block, 1);
+ if_block.m(if_block_anchor.parentNode, if_block_anchor);
+ }
+ },
+ i(local) {
+ if (current)
+ return;
+ transition_in(if_block);
+ current = true;
+ },
+ o(local) {
+ transition_out(if_block);
+ current = false;
+ },
+ d(detaching) {
+ if (detaching) {
+ detach(if_block_anchor);
+ }
+ if_blocks[current_block_type_index].d(detaching);
+ }
+ };
+}
+function create_fragment8(ctx) {
+ let main;
+ let current;
+ let each_value = ensure_array_like(
+ /*hierarchy*/
+ ctx[0].children
+ );
+ let each_blocks = [];
+ for (let i = 0; i < each_value.length; i += 1) {
+ each_blocks[i] = create_each_block4(get_each_context4(ctx, each_value, i));
+ }
+ const out = (i) => transition_out(each_blocks[i], 1, 1, () => {
+ each_blocks[i] = null;
+ });
+ return {
+ c() {
+ main = element("main");
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ each_blocks[i].c();
+ }
+ attr(main, "class", "svelte-hup5mn");
+ toggle_class(
+ main,
+ "topLevel",
+ /*topLevel*/
+ ctx[4]
+ );
+ },
+ m(target, anchor) {
+ insert(target, main, anchor);
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ if (each_blocks[i]) {
+ each_blocks[i].m(main, null);
+ }
+ }
+ current = true;
+ },
+ p(ctx2, [dirty]) {
+ if (dirty & /*hierarchy, plugin, view, fileType, closed, fold, side, unstage, stage, discard*/
+ 2031) {
+ each_value = ensure_array_like(
+ /*hierarchy*/
+ ctx2[0].children
+ );
+ let i;
+ for (i = 0; i < each_value.length; i += 1) {
+ const child_ctx = get_each_context4(ctx2, each_value, i);
+ if (each_blocks[i]) {
+ each_blocks[i].p(child_ctx, dirty);
+ transition_in(each_blocks[i], 1);
+ } else {
+ each_blocks[i] = create_each_block4(child_ctx);
+ each_blocks[i].c();
+ transition_in(each_blocks[i], 1);
+ each_blocks[i].m(main, null);
+ }
+ }
+ group_outros();
+ for (i = each_value.length; i < each_blocks.length; i += 1) {
+ out(i);
+ }
+ check_outros();
+ }
+ if (!current || dirty & /*topLevel*/
+ 16) {
+ toggle_class(
+ main,
+ "topLevel",
+ /*topLevel*/
+ ctx2[4]
+ );
+ }
+ },
+ i(local) {
+ if (current)
+ return;
+ for (let i = 0; i < each_value.length; i += 1) {
+ transition_in(each_blocks[i]);
+ }
+ current = true;
+ },
+ o(local) {
+ each_blocks = each_blocks.filter(Boolean);
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ transition_out(each_blocks[i]);
+ }
+ current = false;
+ },
+ d(detaching) {
+ if (detaching) {
+ detach(main);
+ }
+ destroy_each(each_blocks, detaching);
+ }
+ };
+}
+function instance8($$self, $$props, $$invalidate) {
+ let side;
+ let { hierarchy } = $$props;
+ let { plugin } = $$props;
+ let { view } = $$props;
+ let { fileType } = $$props;
+ let { topLevel = false } = $$props;
+ const closed = {};
+ function stage(path2) {
+ plugin.gitManager.stageAll({ dir: path2 }).finally(() => {
+ dispatchEvent(new CustomEvent("git-refresh"));
+ });
+ }
+ function unstage(path2) {
+ plugin.gitManager.unstageAll({ dir: path2 }).finally(() => {
+ dispatchEvent(new CustomEvent("git-refresh"));
+ });
+ }
+ function discard(item) {
+ new DiscardModal(view.app, false, item.vaultPath).myOpen().then((shouldDiscard) => {
+ if (shouldDiscard === true) {
+ plugin.gitManager.discardAll({
+ dir: item.path,
+ status: plugin.cachedStatus
+ }).finally(() => {
+ dispatchEvent(new CustomEvent("git-refresh"));
+ });
+ }
+ });
+ }
+ function fold(item) {
+ $$invalidate(5, closed[item.title] = !closed[item.title], closed);
+ }
+ const click_handler = (entity) => unstage(entity.path);
+ const click_handler_1 = (entity) => discard(entity);
+ const click_handler_2 = (entity) => stage(entity.path);
+ const click_handler_3 = (entity) => fold(entity);
+ $$self.$$set = ($$props2) => {
+ if ("hierarchy" in $$props2)
+ $$invalidate(0, hierarchy = $$props2.hierarchy);
+ if ("plugin" in $$props2)
+ $$invalidate(1, plugin = $$props2.plugin);
+ if ("view" in $$props2)
+ $$invalidate(2, view = $$props2.view);
+ if ("fileType" in $$props2)
+ $$invalidate(3, fileType = $$props2.fileType);
+ if ("topLevel" in $$props2)
+ $$invalidate(4, topLevel = $$props2.topLevel);
+ };
+ $$self.$$.update = () => {
+ if ($$self.$$.dirty & /*view*/
+ 4) {
+ $:
+ $$invalidate(6, side = view.leaf.getRoot().side == "left" ? "right" : "left");
+ }
+ };
+ return [
+ hierarchy,
+ plugin,
+ view,
+ fileType,
+ topLevel,
+ closed,
+ side,
+ stage,
+ unstage,
+ discard,
+ fold,
+ click_handler,
+ click_handler_1,
+ click_handler_2,
+ click_handler_3
+ ];
+}
+var TreeComponent = class extends SvelteComponent {
+ constructor(options) {
+ super();
+ init2(
+ this,
+ options,
+ instance8,
+ create_fragment8,
+ safe_not_equal,
+ {
+ hierarchy: 0,
+ plugin: 1,
+ view: 2,
+ fileType: 3,
+ topLevel: 4
+ },
+ add_css6
+ );
+ }
+};
+var treeComponent_default = TreeComponent;
+
+// src/ui/sourceControl/sourceControl.svelte
+function add_css7(target) {
+ append_styles(target, "svelte-11adhly", `.commit-msg-input.svelte-11adhly.svelte-11adhly{width:100%;overflow:hidden;resize:none;padding:7px 5px;background-color:var(--background-modifier-form-field)}.git-commit-msg.svelte-11adhly.svelte-11adhly{position:relative;padding:0;width:calc(100% - var(--size-4-8));margin:4px auto}main.svelte-11adhly .git-tools .files-count.svelte-11adhly{padding-left:var(--size-2-1);width:11px;display:flex;align-items:center;justify-content:center}.nav-folder-title.svelte-11adhly.svelte-11adhly{align-items:center}.git-commit-msg-clear-button.svelte-11adhly.svelte-11adhly{position:absolute;background:transparent;border-radius:50%;color:var(--search-clear-button-color);cursor:var(--cursor);top:-4px;right:2px;bottom:0px;line-height:0;height:var(--input-height);width:28px;margin:auto;padding:0 0;text-align:center;display:flex;justify-content:center;align-items:center;transition:color 0.15s ease-in-out}.git-commit-msg-clear-button.svelte-11adhly.svelte-11adhly:after{content:"";height:var(--search-clear-button-size);width:var(--search-clear-button-size);display:block;background-color:currentColor;mask-image:url("data:image/svg+xml,");mask-repeat:no-repeat;-webkit-mask-image:url("data:image/svg+xml,");-webkit-mask-repeat:no-repeat}`);
+}
+function get_each_context5(ctx, list, i) {
+ const child_ctx = ctx.slice();
+ child_ctx[40] = list[i];
+ return child_ctx;
+}
+function get_each_context_1(ctx, list, i) {
+ const child_ctx = ctx.slice();
+ child_ctx[40] = list[i];
+ return child_ctx;
+}
+function get_each_context_2(ctx, list, i) {
+ const child_ctx = ctx.slice();
+ child_ctx[45] = list[i];
+ return child_ctx;
+}
+function create_if_block_8(ctx) {
+ let div;
+ let div_aria_label_value;
+ let mounted;
+ let dispose;
+ return {
+ c() {
+ div = element("div");
+ attr(div, "class", "git-commit-msg-clear-button svelte-11adhly");
+ attr(div, "aria-label", div_aria_label_value = "Clear");
+ },
+ m(target, anchor) {
+ insert(target, div, anchor);
+ if (!mounted) {
+ dispose = listen(
+ div,
+ "click",
+ /*click_handler_1*/
+ ctx[33]
+ );
+ mounted = true;
+ }
+ },
+ p: noop,
+ d(detaching) {
+ if (detaching) {
+ detach(div);
+ }
+ mounted = false;
+ dispose();
+ }
+ };
+}
+function create_if_block8(ctx) {
+ let div18;
+ let div17;
+ let div7;
+ let div6;
+ let div0;
+ let t0;
+ let div1;
+ let t2;
+ let div5;
+ let div3;
+ let div2;
+ let t3;
+ let div4;
+ let t4_value = (
+ /*status*/
+ ctx[6].staged.length + ""
+ );
+ let t4;
+ let t5;
+ let t6;
+ let div16;
+ let div15;
+ let div8;
+ let t7;
+ let div9;
+ let t9;
+ let div14;
+ let div12;
+ let div10;
+ let t10;
+ let div11;
+ let t11;
+ let div13;
+ let t12_value = (
+ /*status*/
+ ctx[6].changed.length + ""
+ );
+ let t12;
+ let t13;
+ let t14;
+ let current;
+ let mounted;
+ let dispose;
+ let if_block0 = (
+ /*stagedOpen*/
+ ctx[13] && create_if_block_6(ctx)
+ );
+ let if_block1 = (
+ /*changesOpen*/
+ ctx[12] && create_if_block_43(ctx)
+ );
+ let if_block2 = (
+ /*lastPulledFiles*/
+ ctx[7].length > 0 && create_if_block_14(ctx)
+ );
+ return {
+ c() {
+ div18 = element("div");
+ div17 = element("div");
+ div7 = element("div");
+ div6 = element("div");
+ div0 = element("div");
+ div0.innerHTML = ``;
+ t0 = space();
+ div1 = element("div");
+ div1.textContent = "Staged Changes";
+ t2 = space();
+ div5 = element("div");
+ div3 = element("div");
+ div2 = element("div");
+ div2.innerHTML = ``;
+ t3 = space();
+ div4 = element("div");
+ t4 = text(t4_value);
+ t5 = space();
+ if (if_block0)
+ if_block0.c();
+ t6 = space();
+ div16 = element("div");
+ div15 = element("div");
+ div8 = element("div");
+ div8.innerHTML = ``;
+ t7 = space();
+ div9 = element("div");
+ div9.textContent = "Changes";
+ t9 = space();
+ div14 = element("div");
+ div12 = element("div");
+ div10 = element("div");
+ div10.innerHTML = ``;
+ t10 = space();
+ div11 = element("div");
+ div11.innerHTML = ``;
+ t11 = space();
+ div13 = element("div");
+ t12 = text(t12_value);
+ t13 = space();
+ if (if_block1)
+ if_block1.c();
+ t14 = space();
+ if (if_block2)
+ if_block2.c();
+ attr(div0, "class", "tree-item-icon nav-folder-collapse-indicator collapse-icon");
+ toggle_class(div0, "is-collapsed", !/*stagedOpen*/
+ ctx[13]);
+ attr(div1, "class", "tree-item-inner nav-folder-title-content");
+ attr(div2, "data-icon", "minus");
+ attr(div2, "aria-label", "Unstage");
+ attr(div2, "class", "clickable-icon");
+ attr(div3, "class", "buttons");
+ attr(div4, "class", "files-count svelte-11adhly");
+ attr(div5, "class", "git-tools");
+ attr(div6, "class", "tree-item-self is-clickable nav-folder-title svelte-11adhly");
+ attr(div7, "class", "staged tree-item nav-folder");
+ toggle_class(div7, "is-collapsed", !/*stagedOpen*/
+ ctx[13]);
+ attr(div8, "class", "tree-item-icon nav-folder-collapse-indicator collapse-icon");
+ toggle_class(div8, "is-collapsed", !/*changesOpen*/
+ ctx[12]);
+ attr(div9, "class", "tree-item-inner nav-folder-title-content");
+ attr(div10, "data-icon", "undo");
+ attr(div10, "aria-label", "Discard");
+ attr(div10, "class", "clickable-icon");
+ attr(div11, "data-icon", "plus");
+ attr(div11, "aria-label", "Stage");
+ attr(div11, "class", "clickable-icon");
+ attr(div12, "class", "buttons");
+ attr(div13, "class", "files-count svelte-11adhly");
+ attr(div14, "class", "git-tools");
+ attr(div15, "class", "tree-item-self is-clickable nav-folder-title svelte-11adhly");
+ attr(div16, "class", "changes tree-item nav-folder");
+ toggle_class(div16, "is-collapsed", !/*changesOpen*/
+ ctx[12]);
+ attr(div17, "class", "tree-item-children nav-folder-children");
+ attr(div18, "class", "tree-item nav-folder mod-root");
+ },
+ m(target, anchor) {
+ insert(target, div18, anchor);
+ append2(div18, div17);
+ append2(div17, div7);
+ append2(div7, div6);
+ append2(div6, div0);
+ append2(div6, t0);
+ append2(div6, div1);
+ append2(div6, t2);
+ append2(div6, div5);
+ append2(div5, div3);
+ append2(div3, div2);
+ ctx[34](div2);
+ append2(div5, t3);
+ append2(div5, div4);
+ append2(div4, t4);
+ append2(div7, t5);
+ if (if_block0)
+ if_block0.m(div7, null);
+ append2(div17, t6);
+ append2(div17, div16);
+ append2(div16, div15);
+ append2(div15, div8);
+ append2(div15, t7);
+ append2(div15, div9);
+ append2(div15, t9);
+ append2(div15, div14);
+ append2(div14, div12);
+ append2(div12, div10);
+ append2(div12, t10);
+ append2(div12, div11);
+ ctx[36](div11);
+ append2(div14, t11);
+ append2(div14, div13);
+ append2(div13, t12);
+ append2(div16, t13);
+ if (if_block1)
+ if_block1.m(div16, null);
+ append2(div17, t14);
+ if (if_block2)
+ if_block2.m(div17, null);
+ current = true;
+ if (!mounted) {
+ dispose = [
+ listen(div2, "click", stop_propagation(
+ /*unstageAll*/
+ ctx[19]
+ )),
+ listen(
+ div6,
+ "click",
+ /*click_handler_2*/
+ ctx[35]
+ ),
+ listen(div10, "click", stop_propagation(
+ /*discard*/
+ ctx[22]
+ )),
+ listen(div11, "click", stop_propagation(
+ /*stageAll*/
+ ctx[18]
+ )),
+ listen(
+ div15,
+ "click",
+ /*click_handler_3*/
+ ctx[37]
+ )
+ ];
+ mounted = true;
+ }
+ },
+ p(ctx2, dirty) {
+ if (!current || dirty[0] & /*stagedOpen*/
+ 8192) {
+ toggle_class(div0, "is-collapsed", !/*stagedOpen*/
+ ctx2[13]);
+ }
+ if ((!current || dirty[0] & /*status*/
+ 64) && t4_value !== (t4_value = /*status*/
+ ctx2[6].staged.length + ""))
+ set_data(t4, t4_value);
+ if (
+ /*stagedOpen*/
+ ctx2[13]
+ ) {
+ if (if_block0) {
+ if_block0.p(ctx2, dirty);
+ if (dirty[0] & /*stagedOpen*/
+ 8192) {
+ transition_in(if_block0, 1);
+ }
+ } else {
+ if_block0 = create_if_block_6(ctx2);
+ if_block0.c();
+ transition_in(if_block0, 1);
+ if_block0.m(div7, null);
+ }
+ } else if (if_block0) {
+ group_outros();
+ transition_out(if_block0, 1, 1, () => {
+ if_block0 = null;
+ });
+ check_outros();
+ }
+ if (!current || dirty[0] & /*stagedOpen*/
+ 8192) {
+ toggle_class(div7, "is-collapsed", !/*stagedOpen*/
+ ctx2[13]);
+ }
+ if (!current || dirty[0] & /*changesOpen*/
+ 4096) {
+ toggle_class(div8, "is-collapsed", !/*changesOpen*/
+ ctx2[12]);
+ }
+ if ((!current || dirty[0] & /*status*/
+ 64) && t12_value !== (t12_value = /*status*/
+ ctx2[6].changed.length + ""))
+ set_data(t12, t12_value);
+ if (
+ /*changesOpen*/
+ ctx2[12]
+ ) {
+ if (if_block1) {
+ if_block1.p(ctx2, dirty);
+ if (dirty[0] & /*changesOpen*/
+ 4096) {
+ transition_in(if_block1, 1);
+ }
+ } else {
+ if_block1 = create_if_block_43(ctx2);
+ if_block1.c();
+ transition_in(if_block1, 1);
+ if_block1.m(div16, null);
+ }
+ } else if (if_block1) {
+ group_outros();
+ transition_out(if_block1, 1, 1, () => {
+ if_block1 = null;
+ });
+ check_outros();
+ }
+ if (!current || dirty[0] & /*changesOpen*/
+ 4096) {
+ toggle_class(div16, "is-collapsed", !/*changesOpen*/
+ ctx2[12]);
+ }
+ if (
+ /*lastPulledFiles*/
+ ctx2[7].length > 0
+ ) {
+ if (if_block2) {
+ if_block2.p(ctx2, dirty);
+ if (dirty[0] & /*lastPulledFiles*/
+ 128) {
+ transition_in(if_block2, 1);
+ }
+ } else {
+ if_block2 = create_if_block_14(ctx2);
+ if_block2.c();
+ transition_in(if_block2, 1);
+ if_block2.m(div17, null);
+ }
+ } else if (if_block2) {
+ group_outros();
+ transition_out(if_block2, 1, 1, () => {
+ if_block2 = null;
+ });
+ check_outros();
+ }
+ },
+ i(local) {
+ if (current)
+ return;
+ transition_in(if_block0);
+ transition_in(if_block1);
+ transition_in(if_block2);
+ current = true;
+ },
+ o(local) {
+ transition_out(if_block0);
+ transition_out(if_block1);
+ transition_out(if_block2);
+ current = false;
+ },
+ d(detaching) {
+ if (detaching) {
+ detach(div18);
+ }
+ ctx[34](null);
+ if (if_block0)
+ if_block0.d();
+ ctx[36](null);
+ if (if_block1)
+ if_block1.d();
+ if (if_block2)
+ if_block2.d();
+ mounted = false;
+ run_all(dispose);
+ }
+ };
+}
+function create_if_block_6(ctx) {
+ let div;
+ let current_block_type_index;
+ let if_block;
+ let div_transition;
+ let current;
+ const if_block_creators = [create_if_block_7, create_else_block_2];
+ const if_blocks = [];
+ function select_block_type(ctx2, dirty) {
+ if (
+ /*showTree*/
+ ctx2[3]
+ )
+ return 0;
+ return 1;
+ }
+ current_block_type_index = select_block_type(ctx, [-1, -1]);
+ if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);
+ return {
+ c() {
+ div = element("div");
+ if_block.c();
+ attr(div, "class", "tree-item-children nav-folder-children");
+ },
+ m(target, anchor) {
+ insert(target, div, anchor);
+ if_blocks[current_block_type_index].m(div, null);
+ current = true;
+ },
+ p(ctx2, dirty) {
+ let previous_block_index = current_block_type_index;
+ current_block_type_index = select_block_type(ctx2, dirty);
+ if (current_block_type_index === previous_block_index) {
+ if_blocks[current_block_type_index].p(ctx2, dirty);
+ } else {
+ group_outros();
+ transition_out(if_blocks[previous_block_index], 1, 1, () => {
+ if_blocks[previous_block_index] = null;
+ });
+ check_outros();
+ if_block = if_blocks[current_block_type_index];
+ if (!if_block) {
+ if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx2);
+ if_block.c();
+ } else {
+ if_block.p(ctx2, dirty);
+ }
+ transition_in(if_block, 1);
+ if_block.m(div, null);
+ }
+ },
+ i(local) {
+ if (current)
+ return;
+ transition_in(if_block);
+ if (local) {
+ add_render_callback(() => {
+ if (!current)
+ return;
+ if (!div_transition)
+ div_transition = create_bidirectional_transition(div, slide, { duration: 150 }, true);
+ div_transition.run(1);
+ });
+ }
+ current = true;
+ },
+ o(local) {
+ transition_out(if_block);
+ if (local) {
+ if (!div_transition)
+ div_transition = create_bidirectional_transition(div, slide, { duration: 150 }, false);
+ div_transition.run(0);
+ }
+ current = false;
+ },
+ d(detaching) {
+ if (detaching) {
+ detach(div);
+ }
+ if_blocks[current_block_type_index].d();
+ if (detaching && div_transition)
+ div_transition.end();
+ }
+ };
+}
+function create_else_block_2(ctx) {
+ let each_1_anchor;
+ let current;
+ let each_value_2 = ensure_array_like(
+ /*status*/
+ ctx[6].staged
+ );
+ let each_blocks = [];
+ for (let i = 0; i < each_value_2.length; i += 1) {
+ each_blocks[i] = create_each_block_2(get_each_context_2(ctx, each_value_2, i));
+ }
+ const out = (i) => transition_out(each_blocks[i], 1, 1, () => {
+ each_blocks[i] = null;
+ });
+ return {
+ c() {
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ each_blocks[i].c();
+ }
+ each_1_anchor = empty();
+ },
+ m(target, anchor) {
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ if (each_blocks[i]) {
+ each_blocks[i].m(target, anchor);
+ }
+ }
+ insert(target, each_1_anchor, anchor);
+ current = true;
+ },
+ p(ctx2, dirty) {
+ if (dirty[0] & /*status, view, plugin*/
+ 67) {
+ each_value_2 = ensure_array_like(
+ /*status*/
+ ctx2[6].staged
+ );
+ let i;
+ for (i = 0; i < each_value_2.length; i += 1) {
+ const child_ctx = get_each_context_2(ctx2, each_value_2, i);
+ if (each_blocks[i]) {
+ each_blocks[i].p(child_ctx, dirty);
+ transition_in(each_blocks[i], 1);
+ } else {
+ each_blocks[i] = create_each_block_2(child_ctx);
+ each_blocks[i].c();
+ transition_in(each_blocks[i], 1);
+ each_blocks[i].m(each_1_anchor.parentNode, each_1_anchor);
+ }
+ }
+ group_outros();
+ for (i = each_value_2.length; i < each_blocks.length; i += 1) {
+ out(i);
+ }
+ check_outros();
+ }
+ },
+ i(local) {
+ if (current)
+ return;
+ for (let i = 0; i < each_value_2.length; i += 1) {
+ transition_in(each_blocks[i]);
+ }
+ current = true;
+ },
+ o(local) {
+ each_blocks = each_blocks.filter(Boolean);
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ transition_out(each_blocks[i]);
+ }
+ current = false;
+ },
+ d(detaching) {
+ if (detaching) {
+ detach(each_1_anchor);
+ }
+ destroy_each(each_blocks, detaching);
+ }
+ };
+}
+function create_if_block_7(ctx) {
+ let treecomponent;
+ let current;
+ treecomponent = new treeComponent_default({
+ props: {
+ hierarchy: (
+ /*stagedHierarchy*/
+ ctx[10]
+ ),
+ plugin: (
+ /*plugin*/
+ ctx[0]
+ ),
+ view: (
+ /*view*/
+ ctx[1]
+ ),
+ fileType: 0 /* staged */,
+ topLevel: true
+ }
+ });
+ return {
+ c() {
+ create_component(treecomponent.$$.fragment);
+ },
+ m(target, anchor) {
+ mount_component(treecomponent, target, anchor);
+ current = true;
+ },
+ p(ctx2, dirty) {
+ const treecomponent_changes = {};
+ if (dirty[0] & /*stagedHierarchy*/
+ 1024)
+ treecomponent_changes.hierarchy = /*stagedHierarchy*/
+ ctx2[10];
+ if (dirty[0] & /*plugin*/
+ 1)
+ treecomponent_changes.plugin = /*plugin*/
+ ctx2[0];
+ if (dirty[0] & /*view*/
+ 2)
+ treecomponent_changes.view = /*view*/
+ ctx2[1];
+ treecomponent.$set(treecomponent_changes);
+ },
+ i(local) {
+ if (current)
+ return;
+ transition_in(treecomponent.$$.fragment, local);
+ current = true;
+ },
+ o(local) {
+ transition_out(treecomponent.$$.fragment, local);
+ current = false;
+ },
+ d(detaching) {
+ destroy_component(treecomponent, detaching);
+ }
+ };
+}
+function create_each_block_2(ctx) {
+ let stagedfilecomponent;
+ let current;
+ stagedfilecomponent = new stagedFileComponent_default({
+ props: {
+ change: (
+ /*stagedFile*/
+ ctx[45]
+ ),
+ view: (
+ /*view*/
+ ctx[1]
+ ),
+ manager: (
+ /*plugin*/
+ ctx[0].gitManager
+ )
+ }
+ });
+ return {
+ c() {
+ create_component(stagedfilecomponent.$$.fragment);
+ },
+ m(target, anchor) {
+ mount_component(stagedfilecomponent, target, anchor);
+ current = true;
+ },
+ p(ctx2, dirty) {
+ const stagedfilecomponent_changes = {};
+ if (dirty[0] & /*status*/
+ 64)
+ stagedfilecomponent_changes.change = /*stagedFile*/
+ ctx2[45];
+ if (dirty[0] & /*view*/
+ 2)
+ stagedfilecomponent_changes.view = /*view*/
+ ctx2[1];
+ if (dirty[0] & /*plugin*/
+ 1)
+ stagedfilecomponent_changes.manager = /*plugin*/
+ ctx2[0].gitManager;
+ stagedfilecomponent.$set(stagedfilecomponent_changes);
+ },
+ i(local) {
+ if (current)
+ return;
+ transition_in(stagedfilecomponent.$$.fragment, local);
+ current = true;
+ },
+ o(local) {
+ transition_out(stagedfilecomponent.$$.fragment, local);
+ current = false;
+ },
+ d(detaching) {
+ destroy_component(stagedfilecomponent, detaching);
+ }
+ };
+}
+function create_if_block_43(ctx) {
+ let div;
+ let current_block_type_index;
+ let if_block;
+ let div_transition;
+ let current;
+ const if_block_creators = [create_if_block_52, create_else_block_12];
+ const if_blocks = [];
+ function select_block_type_1(ctx2, dirty) {
+ if (
+ /*showTree*/
+ ctx2[3]
+ )
+ return 0;
+ return 1;
+ }
+ current_block_type_index = select_block_type_1(ctx, [-1, -1]);
+ if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);
+ return {
+ c() {
+ div = element("div");
+ if_block.c();
+ attr(div, "class", "tree-item-children nav-folder-children");
+ },
+ m(target, anchor) {
+ insert(target, div, anchor);
+ if_blocks[current_block_type_index].m(div, null);
+ current = true;
+ },
+ p(ctx2, dirty) {
+ let previous_block_index = current_block_type_index;
+ current_block_type_index = select_block_type_1(ctx2, dirty);
+ if (current_block_type_index === previous_block_index) {
+ if_blocks[current_block_type_index].p(ctx2, dirty);
+ } else {
+ group_outros();
+ transition_out(if_blocks[previous_block_index], 1, 1, () => {
+ if_blocks[previous_block_index] = null;
+ });
+ check_outros();
+ if_block = if_blocks[current_block_type_index];
+ if (!if_block) {
+ if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx2);
+ if_block.c();
+ } else {
+ if_block.p(ctx2, dirty);
+ }
+ transition_in(if_block, 1);
+ if_block.m(div, null);
+ }
+ },
+ i(local) {
+ if (current)
+ return;
+ transition_in(if_block);
+ if (local) {
+ add_render_callback(() => {
+ if (!current)
+ return;
+ if (!div_transition)
+ div_transition = create_bidirectional_transition(div, slide, { duration: 150 }, true);
+ div_transition.run(1);
+ });
+ }
+ current = true;
+ },
+ o(local) {
+ transition_out(if_block);
+ if (local) {
+ if (!div_transition)
+ div_transition = create_bidirectional_transition(div, slide, { duration: 150 }, false);
+ div_transition.run(0);
+ }
+ current = false;
+ },
+ d(detaching) {
+ if (detaching) {
+ detach(div);
+ }
+ if_blocks[current_block_type_index].d();
+ if (detaching && div_transition)
+ div_transition.end();
+ }
+ };
+}
+function create_else_block_12(ctx) {
+ let each_1_anchor;
+ let current;
+ let each_value_1 = ensure_array_like(
+ /*status*/
+ ctx[6].changed
+ );
+ let each_blocks = [];
+ for (let i = 0; i < each_value_1.length; i += 1) {
+ each_blocks[i] = create_each_block_1(get_each_context_1(ctx, each_value_1, i));
+ }
+ const out = (i) => transition_out(each_blocks[i], 1, 1, () => {
+ each_blocks[i] = null;
+ });
+ return {
+ c() {
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ each_blocks[i].c();
+ }
+ each_1_anchor = empty();
+ },
+ m(target, anchor) {
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ if (each_blocks[i]) {
+ each_blocks[i].m(target, anchor);
+ }
+ }
+ insert(target, each_1_anchor, anchor);
+ current = true;
+ },
+ p(ctx2, dirty) {
+ if (dirty[0] & /*status, view, plugin*/
+ 67) {
+ each_value_1 = ensure_array_like(
+ /*status*/
+ ctx2[6].changed
+ );
+ let i;
+ for (i = 0; i < each_value_1.length; i += 1) {
+ const child_ctx = get_each_context_1(ctx2, each_value_1, i);
+ if (each_blocks[i]) {
+ each_blocks[i].p(child_ctx, dirty);
+ transition_in(each_blocks[i], 1);
+ } else {
+ each_blocks[i] = create_each_block_1(child_ctx);
+ each_blocks[i].c();
+ transition_in(each_blocks[i], 1);
+ each_blocks[i].m(each_1_anchor.parentNode, each_1_anchor);
+ }
+ }
+ group_outros();
+ for (i = each_value_1.length; i < each_blocks.length; i += 1) {
+ out(i);
+ }
+ check_outros();
+ }
+ },
+ i(local) {
+ if (current)
+ return;
+ for (let i = 0; i < each_value_1.length; i += 1) {
+ transition_in(each_blocks[i]);
+ }
+ current = true;
+ },
+ o(local) {
+ each_blocks = each_blocks.filter(Boolean);
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ transition_out(each_blocks[i]);
+ }
+ current = false;
+ },
+ d(detaching) {
+ if (detaching) {
+ detach(each_1_anchor);
+ }
+ destroy_each(each_blocks, detaching);
+ }
+ };
+}
+function create_if_block_52(ctx) {
+ let treecomponent;
+ let current;
+ treecomponent = new treeComponent_default({
+ props: {
+ hierarchy: (
+ /*changeHierarchy*/
+ ctx[9]
+ ),
+ plugin: (
+ /*plugin*/
+ ctx[0]
+ ),
+ view: (
+ /*view*/
+ ctx[1]
+ ),
+ fileType: 1 /* changed */,
+ topLevel: true
+ }
+ });
+ return {
+ c() {
+ create_component(treecomponent.$$.fragment);
+ },
+ m(target, anchor) {
+ mount_component(treecomponent, target, anchor);
+ current = true;
+ },
+ p(ctx2, dirty) {
+ const treecomponent_changes = {};
+ if (dirty[0] & /*changeHierarchy*/
+ 512)
+ treecomponent_changes.hierarchy = /*changeHierarchy*/
+ ctx2[9];
+ if (dirty[0] & /*plugin*/
+ 1)
+ treecomponent_changes.plugin = /*plugin*/
+ ctx2[0];
+ if (dirty[0] & /*view*/
+ 2)
+ treecomponent_changes.view = /*view*/
+ ctx2[1];
+ treecomponent.$set(treecomponent_changes);
+ },
+ i(local) {
+ if (current)
+ return;
+ transition_in(treecomponent.$$.fragment, local);
+ current = true;
+ },
+ o(local) {
+ transition_out(treecomponent.$$.fragment, local);
+ current = false;
+ },
+ d(detaching) {
+ destroy_component(treecomponent, detaching);
+ }
+ };
+}
+function create_each_block_1(ctx) {
+ let filecomponent;
+ let current;
+ filecomponent = new fileComponent_default({
+ props: {
+ change: (
+ /*change*/
+ ctx[40]
+ ),
+ view: (
+ /*view*/
+ ctx[1]
+ ),
+ manager: (
+ /*plugin*/
+ ctx[0].gitManager
+ )
+ }
+ });
+ filecomponent.$on("git-refresh", triggerRefresh2);
+ return {
+ c() {
+ create_component(filecomponent.$$.fragment);
+ },
+ m(target, anchor) {
+ mount_component(filecomponent, target, anchor);
+ current = true;
+ },
+ p(ctx2, dirty) {
+ const filecomponent_changes = {};
+ if (dirty[0] & /*status*/
+ 64)
+ filecomponent_changes.change = /*change*/
+ ctx2[40];
+ if (dirty[0] & /*view*/
+ 2)
+ filecomponent_changes.view = /*view*/
+ ctx2[1];
+ if (dirty[0] & /*plugin*/
+ 1)
+ filecomponent_changes.manager = /*plugin*/
+ ctx2[0].gitManager;
+ filecomponent.$set(filecomponent_changes);
+ },
+ i(local) {
+ if (current)
+ return;
+ transition_in(filecomponent.$$.fragment, local);
+ current = true;
+ },
+ o(local) {
+ transition_out(filecomponent.$$.fragment, local);
+ current = false;
+ },
+ d(detaching) {
+ destroy_component(filecomponent, detaching);
+ }
+ };
+}
+function create_if_block_14(ctx) {
+ let div3;
+ let div2;
+ let div0;
+ let t0;
+ let div1;
+ let t2;
+ let span;
+ let t3_value = (
+ /*lastPulledFiles*/
+ ctx[7].length + ""
+ );
+ let t3;
+ let t4;
+ let current;
+ let mounted;
+ let dispose;
+ let if_block = (
+ /*lastPulledFilesOpen*/
+ ctx[14] && create_if_block_23(ctx)
+ );
+ return {
+ c() {
+ div3 = element("div");
+ div2 = element("div");
+ div0 = element("div");
+ div0.innerHTML = ``;
+ t0 = space();
+ div1 = element("div");
+ div1.textContent = "Recently Pulled Files";
+ t2 = space();
+ span = element("span");
+ t3 = text(t3_value);
+ t4 = space();
+ if (if_block)
+ if_block.c();
+ attr(div0, "class", "tree-item-icon nav-folder-collapse-indicator collapse-icon");
+ attr(div1, "class", "tree-item-inner nav-folder-title-content");
+ attr(span, "class", "tree-item-flair");
+ attr(div2, "class", "tree-item-self is-clickable nav-folder-title svelte-11adhly");
+ attr(div3, "class", "pulled nav-folder");
+ toggle_class(div3, "is-collapsed", !/*lastPulledFilesOpen*/
+ ctx[14]);
+ },
+ m(target, anchor) {
+ insert(target, div3, anchor);
+ append2(div3, div2);
+ append2(div2, div0);
+ append2(div2, t0);
+ append2(div2, div1);
+ append2(div2, t2);
+ append2(div2, span);
+ append2(span, t3);
+ append2(div3, t4);
+ if (if_block)
+ if_block.m(div3, null);
+ current = true;
+ if (!mounted) {
+ dispose = listen(
+ div2,
+ "click",
+ /*click_handler_4*/
+ ctx[38]
+ );
+ mounted = true;
+ }
+ },
+ p(ctx2, dirty) {
+ if ((!current || dirty[0] & /*lastPulledFiles*/
+ 128) && t3_value !== (t3_value = /*lastPulledFiles*/
+ ctx2[7].length + ""))
+ set_data(t3, t3_value);
+ if (
+ /*lastPulledFilesOpen*/
+ ctx2[14]
+ ) {
+ if (if_block) {
+ if_block.p(ctx2, dirty);
+ if (dirty[0] & /*lastPulledFilesOpen*/
+ 16384) {
+ transition_in(if_block, 1);
+ }
+ } else {
+ if_block = create_if_block_23(ctx2);
+ if_block.c();
+ transition_in(if_block, 1);
+ if_block.m(div3, null);
+ }
+ } else if (if_block) {
+ group_outros();
+ transition_out(if_block, 1, 1, () => {
+ if_block = null;
+ });
+ check_outros();
+ }
+ if (!current || dirty[0] & /*lastPulledFilesOpen*/
+ 16384) {
+ toggle_class(div3, "is-collapsed", !/*lastPulledFilesOpen*/
+ ctx2[14]);
+ }
+ },
+ i(local) {
+ if (current)
+ return;
+ transition_in(if_block);
+ current = true;
+ },
+ o(local) {
+ transition_out(if_block);
+ current = false;
+ },
+ d(detaching) {
+ if (detaching) {
+ detach(div3);
+ }
+ if (if_block)
+ if_block.d();
+ mounted = false;
+ dispose();
+ }
+ };
+}
+function create_if_block_23(ctx) {
+ let div;
+ let current_block_type_index;
+ let if_block;
+ let div_transition;
+ let current;
+ const if_block_creators = [create_if_block_33, create_else_block4];
+ const if_blocks = [];
+ function select_block_type_2(ctx2, dirty) {
+ if (
+ /*showTree*/
+ ctx2[3]
+ )
+ return 0;
+ return 1;
+ }
+ current_block_type_index = select_block_type_2(ctx, [-1, -1]);
+ if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);
+ return {
+ c() {
+ div = element("div");
+ if_block.c();
+ attr(div, "class", "tree-item-children nav-folder-children");
+ },
+ m(target, anchor) {
+ insert(target, div, anchor);
+ if_blocks[current_block_type_index].m(div, null);
+ current = true;
+ },
+ p(ctx2, dirty) {
+ let previous_block_index = current_block_type_index;
+ current_block_type_index = select_block_type_2(ctx2, dirty);
+ if (current_block_type_index === previous_block_index) {
+ if_blocks[current_block_type_index].p(ctx2, dirty);
+ } else {
+ group_outros();
+ transition_out(if_blocks[previous_block_index], 1, 1, () => {
+ if_blocks[previous_block_index] = null;
+ });
+ check_outros();
+ if_block = if_blocks[current_block_type_index];
+ if (!if_block) {
+ if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx2);
+ if_block.c();
+ } else {
+ if_block.p(ctx2, dirty);
+ }
+ transition_in(if_block, 1);
+ if_block.m(div, null);
+ }
+ },
+ i(local) {
+ if (current)
+ return;
+ transition_in(if_block);
+ if (local) {
+ add_render_callback(() => {
+ if (!current)
+ return;
+ if (!div_transition)
+ div_transition = create_bidirectional_transition(div, slide, { duration: 150 }, true);
+ div_transition.run(1);
+ });
+ }
+ current = true;
+ },
+ o(local) {
+ transition_out(if_block);
+ if (local) {
+ if (!div_transition)
+ div_transition = create_bidirectional_transition(div, slide, { duration: 150 }, false);
+ div_transition.run(0);
+ }
+ current = false;
+ },
+ d(detaching) {
+ if (detaching) {
+ detach(div);
+ }
+ if_blocks[current_block_type_index].d();
+ if (detaching && div_transition)
+ div_transition.end();
+ }
+ };
+}
+function create_else_block4(ctx) {
+ let each_1_anchor;
+ let current;
+ let each_value = ensure_array_like(
+ /*lastPulledFiles*/
+ ctx[7]
+ );
+ let each_blocks = [];
+ for (let i = 0; i < each_value.length; i += 1) {
+ each_blocks[i] = create_each_block5(get_each_context5(ctx, each_value, i));
+ }
+ const out = (i) => transition_out(each_blocks[i], 1, 1, () => {
+ each_blocks[i] = null;
+ });
+ return {
+ c() {
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ each_blocks[i].c();
+ }
+ each_1_anchor = empty();
+ },
+ m(target, anchor) {
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ if (each_blocks[i]) {
+ each_blocks[i].m(target, anchor);
+ }
+ }
+ insert(target, each_1_anchor, anchor);
+ current = true;
+ },
+ p(ctx2, dirty) {
+ if (dirty[0] & /*lastPulledFiles, view*/
+ 130) {
+ each_value = ensure_array_like(
+ /*lastPulledFiles*/
+ ctx2[7]
+ );
+ let i;
+ for (i = 0; i < each_value.length; i += 1) {
+ const child_ctx = get_each_context5(ctx2, each_value, i);
+ if (each_blocks[i]) {
+ each_blocks[i].p(child_ctx, dirty);
+ transition_in(each_blocks[i], 1);
+ } else {
+ each_blocks[i] = create_each_block5(child_ctx);
+ each_blocks[i].c();
+ transition_in(each_blocks[i], 1);
+ each_blocks[i].m(each_1_anchor.parentNode, each_1_anchor);
+ }
+ }
+ group_outros();
+ for (i = each_value.length; i < each_blocks.length; i += 1) {
+ out(i);
+ }
+ check_outros();
+ }
+ },
+ i(local) {
+ if (current)
+ return;
+ for (let i = 0; i < each_value.length; i += 1) {
+ transition_in(each_blocks[i]);
+ }
+ current = true;
+ },
+ o(local) {
+ each_blocks = each_blocks.filter(Boolean);
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ transition_out(each_blocks[i]);
+ }
+ current = false;
+ },
+ d(detaching) {
+ if (detaching) {
+ detach(each_1_anchor);
+ }
+ destroy_each(each_blocks, detaching);
+ }
+ };
+}
+function create_if_block_33(ctx) {
+ let treecomponent;
+ let current;
+ treecomponent = new treeComponent_default({
+ props: {
+ hierarchy: (
+ /*lastPulledFilesHierarchy*/
+ ctx[11]
+ ),
+ plugin: (
+ /*plugin*/
+ ctx[0]
+ ),
+ view: (
+ /*view*/
+ ctx[1]
+ ),
+ fileType: 2 /* pulled */,
+ topLevel: true
+ }
+ });
+ return {
+ c() {
+ create_component(treecomponent.$$.fragment);
+ },
+ m(target, anchor) {
+ mount_component(treecomponent, target, anchor);
+ current = true;
+ },
+ p(ctx2, dirty) {
+ const treecomponent_changes = {};
+ if (dirty[0] & /*lastPulledFilesHierarchy*/
+ 2048)
+ treecomponent_changes.hierarchy = /*lastPulledFilesHierarchy*/
+ ctx2[11];
+ if (dirty[0] & /*plugin*/
+ 1)
+ treecomponent_changes.plugin = /*plugin*/
+ ctx2[0];
+ if (dirty[0] & /*view*/
+ 2)
+ treecomponent_changes.view = /*view*/
+ ctx2[1];
+ treecomponent.$set(treecomponent_changes);
+ },
+ i(local) {
+ if (current)
+ return;
+ transition_in(treecomponent.$$.fragment, local);
+ current = true;
+ },
+ o(local) {
+ transition_out(treecomponent.$$.fragment, local);
+ current = false;
+ },
+ d(detaching) {
+ destroy_component(treecomponent, detaching);
+ }
+ };
+}
+function create_each_block5(ctx) {
+ let pulledfilecomponent;
+ let current;
+ pulledfilecomponent = new pulledFileComponent_default({
+ props: {
+ change: (
+ /*change*/
+ ctx[40]
+ ),
+ view: (
+ /*view*/
+ ctx[1]
+ )
+ }
+ });
+ pulledfilecomponent.$on("git-refresh", triggerRefresh2);
+ return {
+ c() {
+ create_component(pulledfilecomponent.$$.fragment);
+ },
+ m(target, anchor) {
+ mount_component(pulledfilecomponent, target, anchor);
+ current = true;
+ },
+ p(ctx2, dirty) {
+ const pulledfilecomponent_changes = {};
+ if (dirty[0] & /*lastPulledFiles*/
+ 128)
+ pulledfilecomponent_changes.change = /*change*/
+ ctx2[40];
+ if (dirty[0] & /*view*/
+ 2)
+ pulledfilecomponent_changes.view = /*view*/
+ ctx2[1];
+ pulledfilecomponent.$set(pulledfilecomponent_changes);
+ },
+ i(local) {
+ if (current)
+ return;
+ transition_in(pulledfilecomponent.$$.fragment, local);
+ current = true;
+ },
+ o(local) {
+ transition_out(pulledfilecomponent.$$.fragment, local);
+ current = false;
+ },
+ d(detaching) {
+ destroy_component(pulledfilecomponent, detaching);
+ }
+ };
+}
+function create_fragment9(ctx) {
+ let main;
+ let div9;
+ let div8;
+ let div0;
+ let t0;
+ let div1;
+ let t1;
+ let div2;
+ let t2;
+ let div3;
+ let t3;
+ let div4;
+ let t4;
+ let div5;
+ let t5;
+ let div6;
+ let t6;
+ let div7;
+ let t7;
+ let div10;
+ let textarea;
+ let t8;
+ let t9;
+ let div11;
+ let main_data_type_value;
+ let current;
+ let mounted;
+ let dispose;
+ let if_block0 = (
+ /*commitMessage*/
+ ctx[2] && create_if_block_8(ctx)
+ );
+ let if_block1 = (
+ /*status*/
+ ctx[6] && /*stagedHierarchy*/
+ ctx[10] && /*changeHierarchy*/
+ ctx[9] && create_if_block8(ctx)
+ );
+ return {
+ c() {
+ main = element("main");
+ div9 = element("div");
+ div8 = element("div");
+ div0 = element("div");
+ t0 = space();
+ div1 = element("div");
+ t1 = space();
+ div2 = element("div");
+ t2 = space();
+ div3 = element("div");
+ t3 = space();
+ div4 = element("div");
+ t4 = space();
+ div5 = element("div");
+ t5 = space();
+ div6 = element("div");
+ t6 = space();
+ div7 = element("div");
+ t7 = space();
+ div10 = element("div");
+ textarea = element("textarea");
+ t8 = space();
+ if (if_block0)
+ if_block0.c();
+ t9 = space();
+ div11 = element("div");
+ if (if_block1)
+ if_block1.c();
+ attr(div0, "id", "backup-btn");
+ attr(div0, "data-icon", "arrow-up-circle");
+ attr(div0, "class", "clickable-icon nav-action-button");
+ attr(div0, "aria-label", "Backup");
+ attr(div1, "id", "commit-btn");
+ attr(div1, "data-icon", "check");
+ attr(div1, "class", "clickable-icon nav-action-button");
+ attr(div1, "aria-label", "Commit");
+ attr(div2, "id", "stage-all");
+ attr(div2, "class", "clickable-icon nav-action-button");
+ attr(div2, "data-icon", "plus-circle");
+ attr(div2, "aria-label", "Stage all");
+ attr(div3, "id", "unstage-all");
+ attr(div3, "class", "clickable-icon nav-action-button");
+ attr(div3, "data-icon", "minus-circle");
+ attr(div3, "aria-label", "Unstage all");
+ attr(div4, "id", "push");
+ attr(div4, "class", "clickable-icon nav-action-button");
+ attr(div4, "data-icon", "upload");
+ attr(div4, "aria-label", "Push");
+ attr(div5, "id", "pull");
+ attr(div5, "class", "clickable-icon nav-action-button");
+ attr(div5, "data-icon", "download");
+ attr(div5, "aria-label", "Pull");
+ attr(div6, "id", "layoutChange");
+ attr(div6, "class", "clickable-icon nav-action-button");
+ attr(div6, "aria-label", "Change Layout");
+ attr(div7, "id", "refresh");
+ attr(div7, "class", "clickable-icon nav-action-button");
+ attr(div7, "data-icon", "refresh-cw");
+ attr(div7, "aria-label", "Refresh");
+ set_style(div7, "margin", "1px");
+ toggle_class(
+ div7,
+ "loading",
+ /*loading*/
+ ctx[5]
+ );
+ attr(div8, "class", "nav-buttons-container");
+ attr(div9, "class", "nav-header");
+ attr(
+ textarea,
+ "rows",
+ /*rows*/
+ ctx[15]
+ );
+ attr(textarea, "class", "commit-msg-input svelte-11adhly");
+ attr(textarea, "spellcheck", "true");
+ attr(textarea, "placeholder", "Commit Message");
+ attr(div10, "class", "git-commit-msg svelte-11adhly");
+ attr(div11, "class", "nav-files-container");
+ set_style(div11, "position", "relative");
+ attr(main, "data-type", main_data_type_value = SOURCE_CONTROL_VIEW_CONFIG.type);
+ attr(main, "class", "svelte-11adhly");
+ },
+ m(target, anchor) {
+ insert(target, main, anchor);
+ append2(main, div9);
+ append2(div9, div8);
+ append2(div8, div0);
+ ctx[23](div0);
+ append2(div8, t0);
+ append2(div8, div1);
+ ctx[24](div1);
+ append2(div8, t1);
+ append2(div8, div2);
+ ctx[25](div2);
+ append2(div8, t2);
+ append2(div8, div3);
+ ctx[26](div3);
+ append2(div8, t3);
+ append2(div8, div4);
+ ctx[27](div4);
+ append2(div8, t4);
+ append2(div8, div5);
+ ctx[28](div5);
+ append2(div8, t5);
+ append2(div8, div6);
+ ctx[29](div6);
+ append2(div8, t6);
+ append2(div8, div7);
+ ctx[31](div7);
+ append2(main, t7);
+ append2(main, div10);
+ append2(div10, textarea);
+ set_input_value(
+ textarea,
+ /*commitMessage*/
+ ctx[2]
+ );
+ append2(div10, t8);
+ if (if_block0)
+ if_block0.m(div10, null);
+ append2(main, t9);
+ append2(main, div11);
+ if (if_block1)
+ if_block1.m(div11, null);
+ current = true;
+ if (!mounted) {
+ dispose = [
+ listen(
+ div0,
+ "click",
+ /*backup*/
+ ctx[17]
+ ),
+ listen(
+ div1,
+ "click",
+ /*commit*/
+ ctx[16]
+ ),
+ listen(
+ div2,
+ "click",
+ /*stageAll*/
+ ctx[18]
+ ),
+ listen(
+ div3,
+ "click",
+ /*unstageAll*/
+ ctx[19]
+ ),
+ listen(
+ div4,
+ "click",
+ /*push*/
+ ctx[20]
+ ),
+ listen(
+ div5,
+ "click",
+ /*pull*/
+ ctx[21]
+ ),
+ listen(
+ div6,
+ "click",
+ /*click_handler*/
+ ctx[30]
+ ),
+ listen(div7, "click", triggerRefresh2),
+ listen(
+ textarea,
+ "input",
+ /*textarea_input_handler*/
+ ctx[32]
+ )
+ ];
+ mounted = true;
+ }
+ },
+ p(ctx2, dirty) {
+ if (!current || dirty[0] & /*loading*/
+ 32) {
+ toggle_class(
+ div7,
+ "loading",
+ /*loading*/
+ ctx2[5]
+ );
+ }
+ if (!current || dirty[0] & /*rows*/
+ 32768) {
+ attr(
+ textarea,
+ "rows",
+ /*rows*/
+ ctx2[15]
+ );
+ }
+ if (dirty[0] & /*commitMessage*/
+ 4) {
+ set_input_value(
+ textarea,
+ /*commitMessage*/
+ ctx2[2]
+ );
+ }
+ if (
+ /*commitMessage*/
+ ctx2[2]
+ ) {
+ if (if_block0) {
+ if_block0.p(ctx2, dirty);
+ } else {
+ if_block0 = create_if_block_8(ctx2);
+ if_block0.c();
+ if_block0.m(div10, null);
+ }
+ } else if (if_block0) {
+ if_block0.d(1);
+ if_block0 = null;
+ }
+ if (
+ /*status*/
+ ctx2[6] && /*stagedHierarchy*/
+ ctx2[10] && /*changeHierarchy*/
+ ctx2[9]
+ ) {
+ if (if_block1) {
+ if_block1.p(ctx2, dirty);
+ if (dirty[0] & /*status, stagedHierarchy, changeHierarchy*/
+ 1600) {
+ transition_in(if_block1, 1);
+ }
+ } else {
+ if_block1 = create_if_block8(ctx2);
+ if_block1.c();
+ transition_in(if_block1, 1);
+ if_block1.m(div11, null);
+ }
+ } else if (if_block1) {
+ group_outros();
+ transition_out(if_block1, 1, 1, () => {
+ if_block1 = null;
+ });
+ check_outros();
+ }
+ },
+ i(local) {
+ if (current)
+ return;
+ transition_in(if_block1);
+ current = true;
+ },
+ o(local) {
+ transition_out(if_block1);
+ current = false;
+ },
+ d(detaching) {
+ if (detaching) {
+ detach(main);
+ }
+ ctx[23](null);
+ ctx[24](null);
+ ctx[25](null);
+ ctx[26](null);
+ ctx[27](null);
+ ctx[28](null);
+ ctx[29](null);
+ ctx[31](null);
+ if (if_block0)
+ if_block0.d();
+ if (if_block1)
+ if_block1.d();
+ mounted = false;
+ run_all(dispose);
+ }
+ };
+}
+function triggerRefresh2() {
+ dispatchEvent(new CustomEvent("git-refresh"));
+}
+function instance9($$self, $$props, $$invalidate) {
+ let rows;
+ let { plugin } = $$props;
+ let { view } = $$props;
+ let loading;
+ let status2;
+ let lastPulledFiles = [];
+ let commitMessage = plugin.settings.commitMessage;
+ let buttons = [];
+ let changeHierarchy;
+ let stagedHierarchy;
+ let lastPulledFilesHierarchy;
+ let changesOpen = true;
+ let stagedOpen = true;
+ let lastPulledFilesOpen = true;
+ let showTree = plugin.settings.treeStructure;
+ let layoutBtn;
+ addEventListener("git-view-refresh", refresh);
+ plugin.app.workspace.onLayoutReady(() => {
+ window.setTimeout(
+ () => {
+ buttons.forEach((btn) => (0, import_obsidian29.setIcon)(btn, btn.getAttr("data-icon")));
+ (0, import_obsidian29.setIcon)(layoutBtn, showTree ? "list" : "folder");
+ },
+ 0
+ );
+ });
+ onDestroy(() => {
+ removeEventListener("git-view-refresh", refresh);
+ });
+ function commit2() {
+ return __awaiter(this, void 0, void 0, function* () {
+ $$invalidate(5, loading = true);
+ if (status2) {
+ if (yield plugin.hasTooBigFiles(status2.staged)) {
+ plugin.setState(0 /* idle */);
+ return false;
+ }
+ plugin.promiseQueue.addTask(() => plugin.gitManager.commit({ message: commitMessage }).then(() => {
+ if (commitMessage !== plugin.settings.commitMessage) {
+ $$invalidate(2, commitMessage = "");
+ }
+ plugin.setUpAutoBackup();
+ }).finally(triggerRefresh2));
+ }
+ });
+ }
+ function backup() {
+ return __awaiter(this, void 0, void 0, function* () {
+ $$invalidate(5, loading = true);
+ if (status2) {
+ plugin.promiseQueue.addTask(() => plugin.createBackup(false, false, commitMessage).then(() => {
+ if (commitMessage !== plugin.settings.commitMessage) {
+ $$invalidate(2, commitMessage = "");
+ }
+ }).finally(triggerRefresh2));
+ }
+ });
+ }
+ function refresh() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!plugin.gitReady) {
+ $$invalidate(6, status2 = void 0);
+ return;
+ }
+ const unPushedCommits = yield plugin.gitManager.getUnpushedCommits();
+ buttons.forEach((btn) => {
+ var _a2, _b;
+ if (import_obsidian29.Platform.isMobile) {
+ btn.removeClass("button-border");
+ if (btn.id == "push" && unPushedCommits > 0) {
+ btn.addClass("button-border");
+ }
+ } else {
+ (_a2 = btn.firstElementChild) === null || _a2 === void 0 ? void 0 : _a2.removeAttribute("color");
+ if (btn.id == "push" && unPushedCommits > 0) {
+ (_b = btn.firstElementChild) === null || _b === void 0 ? void 0 : _b.setAttr("color", "var(--text-accent)");
+ }
+ }
+ });
+ $$invalidate(6, status2 = plugin.cachedStatus);
+ if (plugin.lastPulledFiles && plugin.lastPulledFiles != lastPulledFiles) {
+ $$invalidate(7, lastPulledFiles = plugin.lastPulledFiles);
+ $$invalidate(11, lastPulledFilesHierarchy = {
+ title: "",
+ path: "",
+ vaultPath: "",
+ children: plugin.gitManager.getTreeStructure(lastPulledFiles)
+ });
+ }
+ if (status2) {
+ const sort = (a, b) => {
+ return a.vault_path.split("/").last().localeCompare(getDisplayPath(b.vault_path));
+ };
+ status2.changed.sort(sort);
+ status2.staged.sort(sort);
+ if (status2.changed.length + status2.staged.length > 500) {
+ $$invalidate(6, status2 = void 0);
+ if (!plugin.loading) {
+ plugin.displayError("Too many changes to display");
+ }
+ } else {
+ $$invalidate(9, changeHierarchy = {
+ title: "",
+ path: "",
+ vaultPath: "",
+ children: plugin.gitManager.getTreeStructure(status2.changed)
+ });
+ $$invalidate(10, stagedHierarchy = {
+ title: "",
+ path: "",
+ vaultPath: "",
+ children: plugin.gitManager.getTreeStructure(status2.staged)
+ });
+ }
+ } else {
+ $$invalidate(9, changeHierarchy = void 0);
+ $$invalidate(10, stagedHierarchy = void 0);
+ }
+ $$invalidate(5, loading = plugin.loading);
+ });
+ }
+ function stageAll() {
+ $$invalidate(5, loading = true);
+ plugin.promiseQueue.addTask(() => plugin.gitManager.stageAll({ status: status2 }).finally(triggerRefresh2));
+ }
+ function unstageAll() {
+ $$invalidate(5, loading = true);
+ plugin.promiseQueue.addTask(() => plugin.gitManager.unstageAll({ status: status2 }).finally(triggerRefresh2));
+ }
+ function push2() {
+ $$invalidate(5, loading = true);
+ plugin.promiseQueue.addTask(() => plugin.push().finally(triggerRefresh2));
+ }
+ function pull2() {
+ $$invalidate(5, loading = true);
+ plugin.promiseQueue.addTask(() => plugin.pullChangesFromRemote().finally(triggerRefresh2));
+ }
+ function discard() {
+ new DiscardModal(view.app, false, plugin.gitManager.getRelativeVaultPath("/")).myOpen().then((shouldDiscard) => {
+ if (shouldDiscard === true) {
+ plugin.promiseQueue.addTask(() => plugin.gitManager.discardAll({ status: plugin.cachedStatus }).finally(() => {
+ dispatchEvent(new CustomEvent("git-refresh"));
+ }));
+ }
+ });
+ }
+ function div0_binding($$value) {
+ binding_callbacks[$$value ? "unshift" : "push"](() => {
+ buttons[5] = $$value;
+ $$invalidate(8, buttons);
+ });
+ }
+ function div1_binding($$value) {
+ binding_callbacks[$$value ? "unshift" : "push"](() => {
+ buttons[0] = $$value;
+ $$invalidate(8, buttons);
+ });
+ }
+ function div2_binding($$value) {
+ binding_callbacks[$$value ? "unshift" : "push"](() => {
+ buttons[1] = $$value;
+ $$invalidate(8, buttons);
+ });
+ }
+ function div3_binding($$value) {
+ binding_callbacks[$$value ? "unshift" : "push"](() => {
+ buttons[2] = $$value;
+ $$invalidate(8, buttons);
+ });
+ }
+ function div4_binding($$value) {
+ binding_callbacks[$$value ? "unshift" : "push"](() => {
+ buttons[3] = $$value;
+ $$invalidate(8, buttons);
+ });
+ }
+ function div5_binding($$value) {
+ binding_callbacks[$$value ? "unshift" : "push"](() => {
+ buttons[4] = $$value;
+ $$invalidate(8, buttons);
+ });
+ }
+ function div6_binding($$value) {
+ binding_callbacks[$$value ? "unshift" : "push"](() => {
+ layoutBtn = $$value;
+ $$invalidate(4, layoutBtn);
+ });
+ }
+ const click_handler = () => {
+ $$invalidate(3, showTree = !showTree);
+ $$invalidate(0, plugin.settings.treeStructure = showTree, plugin);
+ plugin.saveSettings();
+ };
+ function div7_binding($$value) {
+ binding_callbacks[$$value ? "unshift" : "push"](() => {
+ buttons[6] = $$value;
+ $$invalidate(8, buttons);
+ });
+ }
+ function textarea_input_handler() {
+ commitMessage = this.value;
+ $$invalidate(2, commitMessage);
+ }
+ const click_handler_1 = () => $$invalidate(2, commitMessage = "");
+ function div2_binding_1($$value) {
+ binding_callbacks[$$value ? "unshift" : "push"](() => {
+ buttons[8] = $$value;
+ $$invalidate(8, buttons);
+ });
+ }
+ const click_handler_2 = () => $$invalidate(13, stagedOpen = !stagedOpen);
+ function div11_binding($$value) {
+ binding_callbacks[$$value ? "unshift" : "push"](() => {
+ buttons[9] = $$value;
+ $$invalidate(8, buttons);
+ });
+ }
+ const click_handler_3 = () => $$invalidate(12, changesOpen = !changesOpen);
+ const click_handler_4 = () => $$invalidate(14, lastPulledFilesOpen = !lastPulledFilesOpen);
+ $$self.$$set = ($$props2) => {
+ if ("plugin" in $$props2)
+ $$invalidate(0, plugin = $$props2.plugin);
+ if ("view" in $$props2)
+ $$invalidate(1, view = $$props2.view);
+ };
+ $$self.$$.update = () => {
+ if ($$self.$$.dirty[0] & /*layoutBtn, showTree*/
+ 24) {
+ $: {
+ if (layoutBtn) {
+ layoutBtn.empty();
+ (0, import_obsidian29.setIcon)(layoutBtn, showTree ? "list" : "folder");
+ }
+ }
+ }
+ if ($$self.$$.dirty[0] & /*commitMessage*/
+ 4) {
+ $:
+ $$invalidate(15, rows = (commitMessage.match(/\n/g) || []).length + 1 || 1);
+ }
+ };
+ return [
+ plugin,
+ view,
+ commitMessage,
+ showTree,
+ layoutBtn,
+ loading,
+ status2,
+ lastPulledFiles,
+ buttons,
+ changeHierarchy,
+ stagedHierarchy,
+ lastPulledFilesHierarchy,
+ changesOpen,
+ stagedOpen,
+ lastPulledFilesOpen,
+ rows,
+ commit2,
+ backup,
+ stageAll,
+ unstageAll,
+ push2,
+ pull2,
+ discard,
+ div0_binding,
+ div1_binding,
+ div2_binding,
+ div3_binding,
+ div4_binding,
+ div5_binding,
+ div6_binding,
+ click_handler,
+ div7_binding,
+ textarea_input_handler,
+ click_handler_1,
+ div2_binding_1,
+ click_handler_2,
+ div11_binding,
+ click_handler_3,
+ click_handler_4
+ ];
+}
+var SourceControl = class extends SvelteComponent {
+ constructor(options) {
+ super();
+ init2(this, options, instance9, create_fragment9, safe_not_equal, { plugin: 0, view: 1 }, add_css7, [-1, -1]);
+ }
+};
+var sourceControl_default = SourceControl;
+
+// src/ui/sourceControl/sourceControl.ts
+var GitView = class extends import_obsidian30.ItemView {
+ constructor(leaf, plugin) {
+ super(leaf);
+ this.plugin = plugin;
+ this.hoverPopover = null;
+ }
+ getViewType() {
+ return SOURCE_CONTROL_VIEW_CONFIG.type;
+ }
+ getDisplayText() {
+ return SOURCE_CONTROL_VIEW_CONFIG.name;
+ }
+ getIcon() {
+ return SOURCE_CONTROL_VIEW_CONFIG.icon;
+ }
+ onClose() {
+ return super.onClose();
+ }
+ onOpen() {
+ this._view = new sourceControl_default({
+ target: this.contentEl,
+ props: {
+ plugin: this.plugin,
+ view: this
+ }
+ });
+ return super.onOpen();
+ }
+};
+
+// src/ui/statusBar/branchStatusBar.ts
+init_polyfill_buffer();
+var BranchStatusBar = class {
+ constructor(statusBarEl, plugin) {
+ this.statusBarEl = statusBarEl;
+ this.plugin = plugin;
+ this.statusBarEl.addClass("mod-clickable");
+ this.statusBarEl.onClickEvent((e) => {
+ this.plugin.switchBranch();
+ });
+ }
+ async display() {
+ if (this.plugin.gitReady) {
+ const branchInfo = await this.plugin.gitManager.branchInfo();
+ if (branchInfo.current != void 0) {
+ this.statusBarEl.setText(branchInfo.current);
+ } else {
+ this.statusBarEl.empty();
+ }
+ } else {
+ this.statusBarEl.empty();
+ }
+ }
+};
+
+// src/main.ts
+var ObsidianGit = class extends import_obsidian31.Plugin {
+ constructor() {
+ super(...arguments);
+ this.gitReady = false;
+ this.promiseQueue = new PromiseQueue();
+ this.conflictOutputFile = "conflict-files-obsidian-git.md";
+ this.offlineMode = false;
+ this.loading = false;
+ this.lineAuthoringFeature = new LineAuthoringFeature(this);
+ }
+ setState(state) {
+ var _a2;
+ this.state = state;
+ (_a2 = this.statusBar) == null ? void 0 : _a2.display();
+ }
+ async updateCachedStatus() {
+ this.cachedStatus = await this.gitManager.status();
+ return this.cachedStatus;
+ }
+ async refresh() {
+ const gitView = this.app.workspace.getLeavesOfType(
+ SOURCE_CONTROL_VIEW_CONFIG.type
+ );
+ const historyView = this.app.workspace.getLeavesOfType(
+ HISTORY_VIEW_CONFIG.type
+ );
+ if (this.settings.changedFilesInStatusBar || gitView.length > 0 || historyView.length > 0) {
+ this.loading = true;
+ dispatchEvent(new CustomEvent("git-view-refresh"));
+ await this.updateCachedStatus();
+ this.loading = false;
+ dispatchEvent(new CustomEvent("git-view-refresh"));
+ }
+ }
+ async refreshUpdatedHead() {
+ this.lineAuthoringFeature.refreshLineAuthorViews();
+ }
+ async onload() {
+ console.log("loading " + this.manifest.name + " plugin");
+ pluginRef.plugin = this;
+ this.localStorage = new LocalStorageSettings(this);
+ this.localStorage.migrate();
+ await this.loadSettings();
+ this.migrateSettings();
+ this.settingsTab = new ObsidianGitSettingsTab(this.app, this);
+ this.addSettingTab(this.settingsTab);
+ if (!this.localStorage.getPluginDisabled()) {
+ this.loadPlugin();
+ }
+ }
+ async loadPlugin() {
+ addEventListener("git-refresh", this.refresh.bind(this));
+ addEventListener("git-head-update", this.refreshUpdatedHead.bind(this));
+ this.registerView(SOURCE_CONTROL_VIEW_CONFIG.type, (leaf) => {
+ return new GitView(leaf, this);
+ });
+ this.registerView(HISTORY_VIEW_CONFIG.type, (leaf) => {
+ return new HistoryView2(leaf, this);
+ });
+ this.registerView(DIFF_VIEW_CONFIG.type, (leaf) => {
+ return new DiffView(leaf, this);
+ });
+ this.lineAuthoringFeature.onLoadPlugin();
+ this.app.workspace.registerHoverLinkSource(
+ SOURCE_CONTROL_VIEW_CONFIG.type,
+ {
+ display: "Git View",
+ defaultMod: true
+ }
+ );
+ this.setRefreshDebouncer();
+ this.addCommand({
+ id: "edit-gitignore",
+ name: "Edit .gitignore",
+ callback: async () => {
+ const path2 = this.gitManager.getRelativeVaultPath(".gitignore");
+ if (!await this.app.vault.adapter.exists(path2)) {
+ this.app.vault.adapter.write(path2, "");
+ }
+ const content = await this.app.vault.adapter.read(path2);
+ const modal = new IgnoreModal(this.app, content);
+ const res = await modal.open();
+ if (res !== void 0) {
+ await this.app.vault.adapter.write(path2, res);
+ this.refresh();
+ }
+ }
+ });
+ this.addCommand({
+ id: "open-git-view",
+ name: "Open source control view",
+ callback: async () => {
+ const leafs = this.app.workspace.getLeavesOfType(
+ SOURCE_CONTROL_VIEW_CONFIG.type
+ );
+ let leaf;
+ if (leafs.length === 0) {
+ leaf = this.app.workspace.getRightLeaf(false);
+ await leaf.setViewState({
+ type: SOURCE_CONTROL_VIEW_CONFIG.type
+ });
+ } else {
+ leaf = leafs.first();
+ }
+ this.app.workspace.revealLeaf(leaf);
+ dispatchEvent(new CustomEvent("git-refresh"));
+ }
+ });
+ this.addCommand({
+ id: "open-history-view",
+ name: "Open history view",
+ callback: async () => {
+ const leafs = this.app.workspace.getLeavesOfType(
+ HISTORY_VIEW_CONFIG.type
+ );
+ let leaf;
+ if (leafs.length === 0) {
+ leaf = this.app.workspace.getRightLeaf(false);
+ await leaf.setViewState({
+ type: HISTORY_VIEW_CONFIG.type
+ });
+ } else {
+ leaf = leafs.first();
+ }
+ this.app.workspace.revealLeaf(leaf);
+ dispatchEvent(new CustomEvent("git-refresh"));
+ }
+ });
+ this.addCommand({
+ id: "open-diff-view",
+ name: "Open diff view",
+ checkCallback: (checking) => {
+ var _a2;
+ const file = this.app.workspace.getActiveFile();
+ if (checking) {
+ return file !== null;
+ } else {
+ (_a2 = getNewLeaf()) == null ? void 0 : _a2.setViewState({
+ type: DIFF_VIEW_CONFIG.type,
+ active: true,
+ state: {
+ staged: false,
+ file: this.gitManager.getRelativeRepoPath(
+ file.path,
+ true
+ )
+ }
+ });
+ }
+ }
+ });
+ this.addCommand({
+ id: "view-file-on-github",
+ name: "Open file on GitHub",
+ editorCallback: (editor, { file }) => {
+ if (file)
+ return openLineInGitHub(editor, file, this.gitManager);
+ }
+ });
+ this.addCommand({
+ id: "view-history-on-github",
+ name: "Open file history on GitHub",
+ editorCallback: (_, { file }) => {
+ if (file)
+ return openHistoryInGitHub(file, this.gitManager);
+ }
+ });
+ this.addCommand({
+ id: "pull",
+ name: "Pull",
+ callback: () => this.promiseQueue.addTask(() => this.pullChangesFromRemote())
+ });
+ this.addCommand({
+ id: "fetch",
+ name: "fetch",
+ callback: () => this.promiseQueue.addTask(() => this.fetch())
+ });
+ this.addCommand({
+ id: "switch-to-remote-branch",
+ name: "Switch to remote branch",
+ callback: () => this.promiseQueue.addTask(() => this.switchRemoteBranch())
+ });
+ this.addCommand({
+ id: "add-to-gitignore",
+ name: "Add file to gitignore",
+ checkCallback: (checking) => {
+ const file = this.app.workspace.getActiveFile();
+ if (checking) {
+ return file !== null;
+ } else {
+ this.app.vault.adapter.append(
+ this.gitManager.getRelativeVaultPath(".gitignore"),
+ "\n" + this.gitManager.getRelativeRepoPath(
+ file.path,
+ true
+ )
+ ).then(() => {
+ this.refresh();
+ });
+ }
+ }
+ });
+ this.addCommand({
+ id: "push",
+ name: "Create backup",
+ callback: () => this.promiseQueue.addTask(() => this.createBackup(false))
+ });
+ this.addCommand({
+ id: "backup-and-close",
+ name: "Create backup and close",
+ callback: () => this.promiseQueue.addTask(async () => {
+ await this.createBackup(false);
+ window.close();
+ })
+ });
+ this.addCommand({
+ id: "commit-push-specified-message",
+ name: "Create backup with specific message",
+ callback: () => this.promiseQueue.addTask(() => this.createBackup(false, true))
+ });
+ this.addCommand({
+ id: "commit",
+ name: "Commit all changes",
+ callback: () => this.promiseQueue.addTask(
+ () => this.commit({ fromAutoBackup: false })
+ )
+ });
+ this.addCommand({
+ id: "commit-specified-message",
+ name: "Commit all changes with specific message",
+ callback: () => this.promiseQueue.addTask(
+ () => this.commit({
+ fromAutoBackup: false,
+ requestCustomMessage: true
+ })
+ )
+ });
+ this.addCommand({
+ id: "commit-staged",
+ name: "Commit staged",
+ callback: () => this.promiseQueue.addTask(
+ () => this.commit({
+ fromAutoBackup: false,
+ requestCustomMessage: false,
+ onlyStaged: true
+ })
+ )
+ });
+ if (import_obsidian31.Platform.isDesktopApp) {
+ this.addCommand({
+ id: "commit-amend-staged-specified-message",
+ name: "Commit Amend",
+ callback: () => this.promiseQueue.addTask(
+ () => this.commit({
+ fromAutoBackup: false,
+ requestCustomMessage: true,
+ onlyStaged: true,
+ amend: true
+ })
+ )
+ });
+ }
+ this.addCommand({
+ id: "commit-staged-specified-message",
+ name: "Commit staged with specific message",
+ callback: () => this.promiseQueue.addTask(
+ () => this.commit({
+ fromAutoBackup: false,
+ requestCustomMessage: true,
+ onlyStaged: true
+ })
+ )
+ });
+ this.addCommand({
+ id: "push2",
+ name: "Push",
+ callback: () => this.promiseQueue.addTask(() => this.push())
+ });
+ this.addCommand({
+ id: "stage-current-file",
+ name: "Stage current file",
+ checkCallback: (checking) => {
+ const file = this.app.workspace.getActiveFile();
+ if (checking) {
+ return file !== null;
+ } else {
+ this.promiseQueue.addTask(() => this.stageFile(file));
+ }
+ }
+ });
+ this.addCommand({
+ id: "unstage-current-file",
+ name: "Unstage current file",
+ checkCallback: (checking) => {
+ const file = this.app.workspace.getActiveFile();
+ if (checking) {
+ return file !== null;
+ } else {
+ this.promiseQueue.addTask(() => this.unstageFile(file));
+ }
+ }
+ });
+ this.addCommand({
+ id: "edit-remotes",
+ name: "Edit remotes",
+ callback: async () => this.editRemotes()
+ });
+ this.addCommand({
+ id: "remove-remote",
+ name: "Remove remote",
+ callback: async () => this.removeRemote()
+ });
+ this.addCommand({
+ id: "set-upstream-branch",
+ name: "Set upstream branch",
+ callback: async () => this.setUpsreamBranch()
+ });
+ this.addCommand({
+ id: "delete-repo",
+ name: "CAUTION: Delete repository",
+ callback: async () => {
+ const repoExists = await this.app.vault.adapter.exists(
+ `${this.settings.basePath}/.git`
+ );
+ if (repoExists) {
+ const modal = new GeneralModal({
+ options: ["NO", "YES"],
+ placeholder: "Do you really want to delete the repository (.git directory)? This action cannot be undone.",
+ onlySelection: true
+ });
+ const shouldDelete = await modal.open() === "YES";
+ if (shouldDelete) {
+ await this.app.vault.adapter.rmdir(
+ `${this.settings.basePath}/.git`,
+ true
+ );
+ new import_obsidian31.Notice(
+ "Successfully deleted repository. Reloading plugin..."
+ );
+ this.unloadPlugin();
+ this.init();
+ }
+ } else {
+ new import_obsidian31.Notice("No repository found");
+ }
+ }
+ });
+ this.addCommand({
+ id: "init-repo",
+ name: "Initialize a new repo",
+ callback: async () => this.createNewRepo()
+ });
+ this.addCommand({
+ id: "clone-repo",
+ name: "Clone an existing remote repo",
+ callback: async () => this.cloneNewRepo()
+ });
+ this.addCommand({
+ id: "list-changed-files",
+ name: "List changed files",
+ callback: async () => {
+ if (!await this.isAllInitialized())
+ return;
+ const status2 = await this.gitManager.status();
+ console.log(status2);
+ this.setState(0 /* idle */);
+ if (status2.changed.length + status2.staged.length > 500) {
+ this.displayError("Too many changes to display");
+ return;
+ }
+ new ChangedFilesModal(this, status2.all).open();
+ }
+ });
+ this.addCommand({
+ id: "switch-branch",
+ name: "Switch branch",
+ callback: () => {
+ this.switchBranch();
+ }
+ });
+ this.addCommand({
+ id: "create-branch",
+ name: "Create new branch",
+ callback: () => {
+ this.createBranch();
+ }
+ });
+ this.addCommand({
+ id: "delete-branch",
+ name: "Delete branch",
+ callback: () => {
+ this.deleteBranch();
+ }
+ });
+ this.addCommand({
+ id: "discard-all",
+ name: "CAUTION: Discard all changes",
+ callback: async () => {
+ if (!await this.isAllInitialized())
+ return false;
+ const modal = new GeneralModal({
+ options: ["NO", "YES"],
+ placeholder: "Do you want to discard all changes to tracked files? This action cannot be undone.",
+ onlySelection: true
+ });
+ const shouldDiscardAll = await modal.open() === "YES";
+ if (shouldDiscardAll) {
+ this.promiseQueue.addTask(() => this.discardAll());
+ }
+ }
+ });
+ this.addCommand({
+ id: "toggle-line-author-info",
+ name: "Toggle line author information",
+ callback: () => {
+ var _a2;
+ return (_a2 = this.settingsTab) == null ? void 0 : _a2.configureLineAuthorShowStatus(
+ !this.settings.lineAuthor.show
+ );
+ }
+ });
+ this.registerEvent(
+ this.app.workspace.on("file-menu", (menu, file, source) => {
+ this.handleFileMenu(menu, file, source);
+ })
+ );
+ if (this.settings.showStatusBar) {
+ const statusBarEl = this.addStatusBarItem();
+ this.statusBar = new StatusBar(statusBarEl, this);
+ this.registerInterval(
+ window.setInterval(() => {
+ var _a2;
+ return (_a2 = this.statusBar) == null ? void 0 : _a2.display();
+ }, 1e3)
+ );
+ }
+ if (import_obsidian31.Platform.isDesktop && this.settings.showBranchStatusBar) {
+ const branchStatusBarEl = this.addStatusBarItem();
+ this.branchBar = new BranchStatusBar(branchStatusBarEl, this);
+ this.registerInterval(
+ window.setInterval(() => {
+ var _a2;
+ return (_a2 = this.branchBar) == null ? void 0 : _a2.display();
+ }, 6e4)
+ );
+ }
+ this.app.workspace.onLayoutReady(() => this.init());
+ }
+ setRefreshDebouncer() {
+ var _a2;
+ (_a2 = this.debRefresh) == null ? void 0 : _a2.cancel();
+ this.debRefresh = (0, import_obsidian31.debounce)(
+ () => {
+ if (this.settings.refreshSourceControl) {
+ this.refresh();
+ }
+ },
+ this.settings.refreshSourceControlTimer,
+ true
+ );
+ }
+ async showNotices() {
+ const length = 1e4;
+ if (this.manifest.id === "obsidian-git" && import_obsidian31.Platform.isDesktopApp && !this.settings.showedMobileNotice) {
+ new import_obsidian31.Notice(
+ "Git is now available on mobile! Please read the plugin's README for more information.",
+ length
+ );
+ this.settings.showedMobileNotice = true;
+ await this.saveSettings();
+ }
+ if (this.manifest.id === "obsidian-git-isomorphic") {
+ new import_obsidian31.Notice(
+ "Git Mobile is now deprecated. Please uninstall it and install Git instead.",
+ length
+ );
+ }
+ }
+ handleFileMenu(menu, file, source) {
+ if (!this.settings.showFileMenu)
+ return;
+ if (source !== "file-explorer-context-menu") {
+ return;
+ }
+ if (!file) {
+ return;
+ }
+ if (!this.gitReady)
+ return;
+ menu.addItem((item) => {
+ item.setTitle(`Git: Stage`).setIcon("plus-circle").setSection("action").onClick((_) => {
+ this.promiseQueue.addTask(async () => {
+ if (file instanceof import_obsidian31.TFile) {
+ await this.gitManager.stage(file.path, true);
+ } else {
+ await this.gitManager.stageAll({
+ dir: this.gitManager.getRelativeRepoPath(
+ file.path,
+ true
+ )
+ });
+ }
+ this.displayMessage(`Staged ${file.path}`);
+ });
+ });
+ });
+ menu.addItem((item) => {
+ item.setTitle(`Git: Unstage`).setIcon("minus-circle").setSection("action").onClick((_) => {
+ this.promiseQueue.addTask(async () => {
+ if (file instanceof import_obsidian31.TFile) {
+ await this.gitManager.unstage(file.path, true);
+ } else {
+ await this.gitManager.unstageAll({
+ dir: this.gitManager.getRelativeRepoPath(
+ file.path,
+ true
+ )
+ });
+ }
+ this.displayMessage(`Unstaged ${file.path}`);
+ });
+ });
+ });
+ }
+ async migrateSettings() {
+ if (this.settings.mergeOnPull != void 0) {
+ this.settings.syncMethod = this.settings.mergeOnPull ? "merge" : "rebase";
+ this.settings.mergeOnPull = void 0;
+ await this.saveSettings();
+ }
+ if (this.settings.autoCommitMessage === void 0) {
+ this.settings.autoCommitMessage = this.settings.commitMessage;
+ await this.saveSettings();
+ }
+ if (this.settings.gitPath != void 0) {
+ this.localStorage.setGitPath(this.settings.gitPath);
+ this.settings.gitPath = void 0;
+ await this.saveSettings();
+ }
+ if (this.settings.username != void 0) {
+ this.localStorage.setPassword(this.settings.username);
+ this.settings.username = void 0;
+ await this.saveSettings();
+ }
+ }
+ unloadPlugin() {
+ this.gitReady = false;
+ dispatchEvent(new CustomEvent("git-refresh"));
+ this.lineAuthoringFeature.deactivateFeature();
+ this.clearAutoPull();
+ this.clearAutoPush();
+ this.clearAutoBackup();
+ removeEventListener("git-refresh", this.refresh.bind(this));
+ removeEventListener(
+ "git-head-update",
+ this.refreshUpdatedHead.bind(this)
+ );
+ this.app.workspace.offref(this.openEvent);
+ this.app.metadataCache.offref(this.modifyEvent);
+ this.app.metadataCache.offref(this.deleteEvent);
+ this.app.metadataCache.offref(this.createEvent);
+ this.app.metadataCache.offref(this.renameEvent);
+ this.debRefresh.cancel();
+ }
+ async onunload() {
+ this.app.workspace.unregisterHoverLinkSource(
+ SOURCE_CONTROL_VIEW_CONFIG.type
+ );
+ this.unloadPlugin();
+ console.log("unloading " + this.manifest.name + " plugin");
+ }
+ async loadSettings() {
+ let data = await this.loadData();
+ if (data == void 0) {
+ data = { showedMobileNotice: true };
+ }
+ this.settings = mergeSettingsByPriority(DEFAULT_SETTINGS, data);
+ }
+ async saveSettings() {
+ var _a2;
+ (_a2 = this.settingsTab) == null ? void 0 : _a2.beforeSaveSettings();
+ await this.saveData(this.settings);
+ }
+ saveLastAuto(date, mode) {
+ if (mode === "backup") {
+ this.localStorage.setLastAutoBackup(date.toString());
+ } else if (mode === "pull") {
+ this.localStorage.setLastAutoPull(date.toString());
+ } else if (mode === "push") {
+ this.localStorage.setLastAutoPush(date.toString());
+ }
+ }
+ loadLastAuto() {
+ var _a2, _b, _c;
+ return {
+ backup: new Date((_a2 = this.localStorage.getLastAutoBackup()) != null ? _a2 : ""),
+ pull: new Date((_b = this.localStorage.getLastAutoPull()) != null ? _b : ""),
+ push: new Date((_c = this.localStorage.getLastAutoPush()) != null ? _c : "")
+ };
+ }
+ get useSimpleGit() {
+ return import_obsidian31.Platform.isDesktopApp;
+ }
+ async init() {
+ var _a2;
+ this.showNotices();
+ try {
+ if (this.useSimpleGit) {
+ this.gitManager = new SimpleGit(this);
+ await this.gitManager.setGitInstance();
+ } else {
+ this.gitManager = new IsomorphicGit(this);
+ }
+ const result = await this.gitManager.checkRequirements();
+ switch (result) {
+ case "missing-git":
+ this.displayError("Cannot run git command");
+ break;
+ case "missing-repo":
+ new import_obsidian31.Notice(
+ "Can't find a valid git repository. Please create one via the given command or clone an existing repo.",
+ 1e4
+ );
+ break;
+ case "valid":
+ this.gitReady = true;
+ this.setState(0 /* idle */);
+ this.openEvent = this.app.workspace.on(
+ "active-leaf-change",
+ (leaf) => this.handleViewActiveState(leaf)
+ );
+ this.modifyEvent = this.app.vault.on("modify", () => {
+ this.debRefresh();
+ });
+ this.deleteEvent = this.app.vault.on("delete", () => {
+ this.debRefresh();
+ });
+ this.createEvent = this.app.vault.on("create", () => {
+ this.debRefresh();
+ });
+ this.renameEvent = this.app.vault.on("rename", () => {
+ this.debRefresh();
+ });
+ this.registerEvent(this.modifyEvent);
+ this.registerEvent(this.deleteEvent);
+ this.registerEvent(this.createEvent);
+ this.registerEvent(this.renameEvent);
+ (_a2 = this.branchBar) == null ? void 0 : _a2.display();
+ this.lineAuthoringFeature.conditionallyActivateBySettings();
+ dispatchEvent(new CustomEvent("git-refresh"));
+ if (this.settings.autoPullOnBoot) {
+ this.promiseQueue.addTask(
+ () => this.pullChangesFromRemote()
+ );
+ }
+ this.setUpAutos();
+ break;
+ default:
+ console.log(
+ "Something weird happened. The 'checkRequirements' result is " + result
+ );
+ }
+ } catch (error) {
+ this.displayError(error);
+ console.error(error);
+ }
+ }
+ async createNewRepo() {
+ await this.gitManager.init();
+ new import_obsidian31.Notice("Initialized new repo");
+ await this.init();
+ }
+ async cloneNewRepo() {
+ const modal = new GeneralModal({ placeholder: "Enter remote URL" });
+ const url = await modal.open();
+ if (url) {
+ const confirmOption = "Vault Root";
+ let dir = await new GeneralModal({
+ options: this.gitManager instanceof IsomorphicGit ? [confirmOption] : [],
+ placeholder: "Enter directory for clone. It needs to be empty or not existent.",
+ allowEmpty: this.gitManager instanceof IsomorphicGit
+ }).open();
+ if (dir !== void 0) {
+ if (dir === confirmOption) {
+ dir = ".";
+ }
+ dir = (0, import_obsidian31.normalizePath)(dir);
+ if (dir === "/") {
+ dir = ".";
+ }
+ if (dir === ".") {
+ const modal2 = new GeneralModal({
+ options: ["NO", "YES"],
+ placeholder: `Does your remote repo contain a ${app.vault.configDir} directory at the root?`,
+ onlySelection: true
+ });
+ const containsConflictDir = await modal2.open();
+ if (containsConflictDir === void 0) {
+ new import_obsidian31.Notice("Aborted clone");
+ return;
+ } else if (containsConflictDir === "YES") {
+ const confirmOption2 = "DELETE ALL YOUR LOCAL CONFIG AND PLUGINS";
+ const modal3 = new GeneralModal({
+ options: ["Abort clone", confirmOption2],
+ placeholder: `To avoid conflicts, the local ${app.vault.configDir} directory needs to be deleted.`,
+ onlySelection: true
+ });
+ const shouldDelete = await modal3.open() === confirmOption2;
+ if (shouldDelete) {
+ await this.app.vault.adapter.rmdir(
+ app.vault.configDir,
+ true
+ );
+ } else {
+ new import_obsidian31.Notice("Aborted clone");
+ return;
+ }
+ }
+ }
+ const depth = await new GeneralModal({
+ placeholder: "Specify depth of clone. Leave empty for full clone.",
+ allowEmpty: true
+ }).open();
+ let depthInt = void 0;
+ if (depth !== "") {
+ depthInt = parseInt(depth);
+ if (isNaN(depthInt)) {
+ new import_obsidian31.Notice("Invalid depth. Aborting clone.");
+ return;
+ }
+ }
+ new import_obsidian31.Notice(`Cloning new repo into "${dir}"`);
+ const oldBase = this.settings.basePath;
+ const customDir = dir && dir !== ".";
+ if (customDir) {
+ this.settings.basePath = dir;
+ }
+ try {
+ await this.gitManager.clone(url, dir, depthInt);
+ } catch (error) {
+ this.settings.basePath = oldBase;
+ this.saveSettings();
+ throw error;
+ }
+ new import_obsidian31.Notice("Cloned new repo.");
+ new import_obsidian31.Notice("Please restart Obsidian");
+ if (customDir) {
+ this.saveSettings();
+ }
+ }
+ }
+ }
+ /**
+ * Retries to call `this.init()` if necessary, otherwise returns directly
+ * @returns true if `this.gitManager` is ready to be used, false if not.
+ */
+ async isAllInitialized() {
+ if (!this.gitReady) {
+ await this.init();
+ }
+ return this.gitReady;
+ }
+ ///Used for command
+ async pullChangesFromRemote() {
+ if (!await this.isAllInitialized())
+ return;
+ const filesUpdated = await this.pull();
+ this.setUpAutoBackup();
+ if (filesUpdated === false) {
+ return;
+ }
+ if (!filesUpdated) {
+ this.displayMessage("Everything is up-to-date");
+ }
+ if (this.gitManager instanceof SimpleGit) {
+ const status2 = await this.gitManager.status();
+ if (status2.conflicted.length > 0) {
+ this.displayError(
+ `You have conflicts in ${status2.conflicted.length} ${status2.conflicted.length == 1 ? "file" : "files"}`
+ );
+ this.handleConflict(status2.conflicted);
+ }
+ }
+ dispatchEvent(new CustomEvent("git-refresh"));
+ this.setState(0 /* idle */);
+ }
+ async createBackup(fromAutoBackup, requestCustomMessage = false, commitMessage) {
+ if (!await this.isAllInitialized())
+ return;
+ if (this.settings.syncMethod == "reset" && this.settings.pullBeforePush) {
+ await this.pull();
+ }
+ if (!await this.commit({
+ fromAutoBackup,
+ requestCustomMessage,
+ commitMessage
+ }))
+ return;
+ if (!this.settings.disablePush) {
+ if (await this.gitManager.canPush()) {
+ if (this.settings.syncMethod != "reset" && this.settings.pullBeforePush) {
+ await this.pull();
+ }
+ await this.push();
+ } else {
+ this.displayMessage("No changes to push");
+ }
+ }
+ this.setState(0 /* idle */);
+ }
+ // Returns true if commit was successfully
+ async commit({
+ fromAutoBackup,
+ requestCustomMessage = false,
+ onlyStaged = false,
+ commitMessage,
+ amend = false
+ }) {
+ if (!await this.isAllInitialized())
+ return false;
+ let hadConflict = this.localStorage.getConflict();
+ let changedFiles;
+ let status2;
+ let unstagedFiles;
+ if (this.gitManager instanceof SimpleGit) {
+ this.mayDeleteConflictFile();
+ status2 = await this.updateCachedStatus();
+ if (status2.conflicted.length == 0) {
+ this.localStorage.setConflict(false);
+ hadConflict = false;
+ }
+ if (fromAutoBackup && status2.conflicted.length > 0) {
+ this.displayError(
+ `Did not commit, because you have conflicts in ${status2.conflicted.length} ${status2.conflicted.length == 1 ? "file" : "files"}. Please resolve them and commit per command.`
+ );
+ this.handleConflict(status2.conflicted);
+ return false;
+ }
+ changedFiles = [...status2.changed, ...status2.staged];
+ } else if (fromAutoBackup && hadConflict) {
+ this.setState(6 /* conflicted */);
+ this.displayError(
+ `Did not commit, because you have conflicts. Please resolve them and commit per command.`
+ );
+ return false;
+ } else if (hadConflict) {
+ await this.mayDeleteConflictFile();
+ status2 = await this.updateCachedStatus();
+ changedFiles = [...status2.changed, ...status2.staged];
+ } else {
+ if (onlyStaged) {
+ changedFiles = await this.gitManager.getStagedFiles();
+ } else {
+ unstagedFiles = await this.gitManager.getUnstagedFiles();
+ changedFiles = unstagedFiles.map(({ filepath }) => ({
+ vault_path: this.gitManager.getRelativeVaultPath(filepath)
+ }));
+ }
+ }
+ if (await this.hasTooBigFiles(changedFiles)) {
+ this.setState(0 /* idle */);
+ return false;
+ }
+ if (changedFiles.length !== 0 || hadConflict) {
+ let cmtMessage = commitMessage != null ? commitMessage : commitMessage = fromAutoBackup ? this.settings.autoCommitMessage : this.settings.commitMessage;
+ if (fromAutoBackup && this.settings.customMessageOnAutoBackup || requestCustomMessage) {
+ if (!this.settings.disablePopups && fromAutoBackup) {
+ new import_obsidian31.Notice(
+ "Auto backup: Please enter a custom commit message. Leave empty to abort"
+ );
+ }
+ const tempMessage = await new CustomMessageModal(
+ this,
+ true
+ ).open();
+ if (tempMessage != void 0 && tempMessage != "" && tempMessage != "...") {
+ cmtMessage = tempMessage;
+ } else {
+ this.setState(0 /* idle */);
+ return false;
+ }
+ }
+ let committedFiles;
+ if (onlyStaged) {
+ committedFiles = await this.gitManager.commit({
+ message: cmtMessage,
+ amend
+ });
+ } else {
+ committedFiles = await this.gitManager.commitAll({
+ message: cmtMessage,
+ status: status2,
+ unstagedFiles,
+ amend
+ });
+ }
+ if (this.gitManager instanceof SimpleGit) {
+ if ((await this.updateCachedStatus()).conflicted.length == 0) {
+ this.localStorage.setConflict(false);
+ }
+ }
+ let roughly = false;
+ if (committedFiles === void 0) {
+ roughly = true;
+ committedFiles = changedFiles.length;
+ }
+ this.setUpAutoBackup();
+ this.displayMessage(
+ `Committed${roughly ? " approx." : ""} ${committedFiles} ${committedFiles == 1 ? "file" : "files"}`
+ );
+ } else {
+ this.displayMessage("No changes to commit");
+ }
+ dispatchEvent(new CustomEvent("git-refresh"));
+ this.setState(0 /* idle */);
+ return true;
+ }
+ async hasTooBigFiles(files) {
+ const branchInfo = await this.gitManager.branchInfo();
+ const remote = branchInfo.tracking ? splitRemoteBranch(branchInfo.tracking)[0] : null;
+ if (remote) {
+ const remoteUrl = await this.gitManager.getRemoteUrl(remote);
+ if (remoteUrl == null ? void 0 : remoteUrl.includes("github.com")) {
+ const tooBigFiles = files.filter((f) => {
+ const file = this.app.vault.getAbstractFileByPath(
+ f.vault_path
+ );
+ if (file instanceof import_obsidian31.TFile) {
+ return file.stat.size >= 1e8;
+ }
+ return false;
+ });
+ if (tooBigFiles.length > 0) {
+ this.displayError(
+ `Did not commit, because following files are too big: ${tooBigFiles.map(
+ (e) => e.vault_path
+ )}. Please remove them.`
+ );
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+ async push() {
+ if (!await this.isAllInitialized())
+ return false;
+ if (!await this.remotesAreSet()) {
+ return false;
+ }
+ const hadConflict = this.localStorage.getConflict();
+ if (this.gitManager instanceof SimpleGit)
+ await this.mayDeleteConflictFile();
+ let status2;
+ if (this.gitManager instanceof SimpleGit && (status2 = await this.updateCachedStatus()).conflicted.length > 0) {
+ this.displayError(
+ `Cannot push. You have conflicts in ${status2.conflicted.length} ${status2.conflicted.length == 1 ? "file" : "files"}`
+ );
+ this.handleConflict(status2.conflicted);
+ return false;
+ } else if (this.gitManager instanceof IsomorphicGit && hadConflict) {
+ this.displayError(`Cannot push. You have conflicts`);
+ this.setState(6 /* conflicted */);
+ return false;
+ }
+ console.log("Pushing....");
+ const pushedFiles = await this.gitManager.push();
+ if (pushedFiles !== void 0) {
+ console.log("Pushed!", pushedFiles);
+ if (pushedFiles > 0) {
+ this.displayMessage(
+ `Pushed ${pushedFiles} ${pushedFiles == 1 ? "file" : "files"} to remote`
+ );
+ } else {
+ this.displayMessage(`No changes to push`);
+ }
+ }
+ this.offlineMode = false;
+ this.setState(0 /* idle */);
+ dispatchEvent(new CustomEvent("git-refresh"));
+ return true;
+ }
+ /** Used for internals
+ Returns whether the pull added a commit or not.
+
+ See {@link pullChangesFromRemote} for the command version. */
+ async pull() {
+ if (!await this.remotesAreSet()) {
+ return false;
+ }
+ const pulledFiles = await this.gitManager.pull() || [];
+ this.offlineMode = false;
+ if (pulledFiles.length > 0) {
+ this.displayMessage(
+ `Pulled ${pulledFiles.length} ${pulledFiles.length == 1 ? "file" : "files"} from remote`
+ );
+ this.lastPulledFiles = pulledFiles;
+ }
+ return pulledFiles.length;
+ }
+ async fetch() {
+ if (!await this.remotesAreSet()) {
+ return;
+ }
+ await this.gitManager.fetch();
+ this.displayMessage(`Fetched from remote`);
+ this.offlineMode = false;
+ dispatchEvent(new CustomEvent("git-refresh"));
+ }
+ async mayDeleteConflictFile() {
+ const file = this.app.vault.getAbstractFileByPath(
+ this.conflictOutputFile
+ );
+ if (file) {
+ this.app.workspace.iterateAllLeaves((leaf) => {
+ var _a2;
+ if (leaf.view instanceof import_obsidian31.MarkdownView && ((_a2 = leaf.view.file) == null ? void 0 : _a2.path) == file.path) {
+ leaf.detach();
+ }
+ });
+ await this.app.vault.delete(file);
+ }
+ }
+ async stageFile(file) {
+ if (!await this.isAllInitialized())
+ return false;
+ await this.gitManager.stage(file.path, true);
+ this.displayMessage(`Staged ${file.path}`);
+ dispatchEvent(new CustomEvent("git-refresh"));
+ this.setState(0 /* idle */);
+ return true;
+ }
+ async unstageFile(file) {
+ if (!await this.isAllInitialized())
+ return false;
+ await this.gitManager.unstage(file.path, true);
+ this.displayMessage(`Unstaged ${file.path}`);
+ dispatchEvent(new CustomEvent("git-refresh"));
+ this.setState(0 /* idle */);
+ return true;
+ }
+ async switchBranch() {
+ var _a2;
+ if (!await this.isAllInitialized())
+ return;
+ const branchInfo = await this.gitManager.branchInfo();
+ const selectedBranch = await new BranchModal(
+ branchInfo.branches
+ ).open();
+ if (selectedBranch != void 0) {
+ await this.gitManager.checkout(selectedBranch);
+ this.displayMessage(`Switched to ${selectedBranch}`);
+ (_a2 = this.branchBar) == null ? void 0 : _a2.display();
+ return selectedBranch;
+ }
+ }
+ async switchRemoteBranch() {
+ var _a2;
+ if (!await this.isAllInitialized())
+ return;
+ const selectedBranch = await this.selectRemoteBranch() || "";
+ const [remote, branch2] = splitRemoteBranch(selectedBranch);
+ if (branch2 != void 0 && remote != void 0) {
+ await this.gitManager.checkout(branch2, remote);
+ this.displayMessage(`Switched to ${selectedBranch}`);
+ (_a2 = this.branchBar) == null ? void 0 : _a2.display();
+ return selectedBranch;
+ }
+ }
+ async createBranch() {
+ var _a2;
+ if (!await this.isAllInitialized())
+ return;
+ const newBranch = await new GeneralModal({
+ placeholder: "Create new branch"
+ }).open();
+ if (newBranch != void 0) {
+ await this.gitManager.createBranch(newBranch);
+ this.displayMessage(`Created new branch ${newBranch}`);
+ (_a2 = this.branchBar) == null ? void 0 : _a2.display();
+ return newBranch;
+ }
+ }
+ async deleteBranch() {
+ var _a2;
+ if (!await this.isAllInitialized())
+ return;
+ const branchInfo = await this.gitManager.branchInfo();
+ if (branchInfo.current)
+ branchInfo.branches.remove(branchInfo.current);
+ const branch2 = await new GeneralModal({
+ options: branchInfo.branches,
+ placeholder: "Delete branch",
+ onlySelection: true
+ }).open();
+ if (branch2 != void 0) {
+ let force = false;
+ const merged = await this.gitManager.branchIsMerged(branch2);
+ if (!merged) {
+ const forceAnswer = await new GeneralModal({
+ options: ["YES", "NO"],
+ placeholder: "This branch isn't merged into HEAD. Force delete?",
+ onlySelection: true
+ }).open();
+ if (forceAnswer !== "YES") {
+ return;
+ }
+ force = forceAnswer === "YES";
+ }
+ await this.gitManager.deleteBranch(branch2, force);
+ this.displayMessage(`Deleted branch ${branch2}`);
+ (_a2 = this.branchBar) == null ? void 0 : _a2.display();
+ return branch2;
+ }
+ }
+ // Ensures that the upstream branch is set.
+ // If not, it will prompt the user to set it.
+ //
+ // An exception is when the user has submodules enabled.
+ // In this case, the upstream branch is not required,
+ // to allow pulling/pushing only the submodules and not the outer repo.
+ async remotesAreSet() {
+ if (this.settings.updateSubmodules) {
+ return true;
+ }
+ if (!(await this.gitManager.branchInfo()).tracking) {
+ new import_obsidian31.Notice("No upstream branch is set. Please select one.");
+ return await this.setUpsreamBranch();
+ }
+ return true;
+ }
+ async setUpsreamBranch() {
+ const remoteBranch = await this.selectRemoteBranch();
+ if (remoteBranch == void 0) {
+ this.displayError("Aborted. No upstream-branch is set!", 1e4);
+ this.setState(0 /* idle */);
+ return false;
+ } else {
+ await this.gitManager.updateUpstreamBranch(remoteBranch);
+ this.displayMessage(`Set upstream branch to ${remoteBranch}`);
+ this.setState(0 /* idle */);
+ return true;
+ }
+ }
+ async setUpAutoBackup() {
+ if (this.settings.setLastSaveToLastCommit) {
+ this.clearAutoBackup();
+ const lastCommitDate = await this.gitManager.getLastCommitTime();
+ if (lastCommitDate) {
+ this.localStorage.setLastAutoBackup(lastCommitDate.toString());
+ }
+ }
+ if (!this.timeoutIDBackup && !this.onFileModifyEventRef) {
+ const lastAutos = this.loadLastAuto();
+ if (this.settings.autoSaveInterval > 0) {
+ const now2 = /* @__PURE__ */ new Date();
+ const diff3 = this.settings.autoSaveInterval - Math.round(
+ (now2.getTime() - lastAutos.backup.getTime()) / 1e3 / 60
+ );
+ this.startAutoBackup(diff3 <= 0 ? 0 : diff3);
+ }
+ }
+ }
+ async setUpAutos() {
+ this.setUpAutoBackup();
+ const lastAutos = this.loadLastAuto();
+ if (this.settings.differentIntervalCommitAndPush && this.settings.autoPushInterval > 0) {
+ const now2 = /* @__PURE__ */ new Date();
+ const diff3 = this.settings.autoPushInterval - Math.round(
+ (now2.getTime() - lastAutos.push.getTime()) / 1e3 / 60
+ );
+ this.startAutoPush(diff3 <= 0 ? 0 : diff3);
+ }
+ if (this.settings.autoPullInterval > 0) {
+ const now2 = /* @__PURE__ */ new Date();
+ const diff3 = this.settings.autoPullInterval - Math.round(
+ (now2.getTime() - lastAutos.pull.getTime()) / 1e3 / 60
+ );
+ this.startAutoPull(diff3 <= 0 ? 0 : diff3);
+ }
+ }
+ async discardAll() {
+ await this.gitManager.discardAll({
+ status: this.cachedStatus
+ });
+ new import_obsidian31.Notice(
+ "All local changes have been discarded. New files remain untouched."
+ );
+ }
+ clearAutos() {
+ this.clearAutoBackup();
+ this.clearAutoPush();
+ this.clearAutoPull();
+ }
+ startAutoBackup(minutes) {
+ let time = (minutes != null ? minutes : this.settings.autoSaveInterval) * 6e4;
+ if (this.settings.autoBackupAfterFileChange) {
+ if (minutes === 0) {
+ this.doAutoBackup();
+ } else {
+ this.onFileModifyEventRef = this.app.vault.on(
+ "modify",
+ () => this.autoBackupDebouncer()
+ );
+ this.autoBackupDebouncer = (0, import_obsidian31.debounce)(
+ () => this.doAutoBackup(),
+ time,
+ true
+ );
+ }
+ } else {
+ if (time > 2147483647)
+ time = 2147483647;
+ this.timeoutIDBackup = window.setTimeout(
+ () => this.doAutoBackup(),
+ time
+ );
+ }
+ }
+ // This is used for both auto backup and commit
+ doAutoBackup() {
+ this.promiseQueue.addTask(() => {
+ if (this.settings.differentIntervalCommitAndPush) {
+ return this.commit({ fromAutoBackup: true });
+ } else {
+ return this.createBackup(true);
+ }
+ });
+ this.saveLastAuto(/* @__PURE__ */ new Date(), "backup");
+ this.saveSettings();
+ this.startAutoBackup();
+ }
+ startAutoPull(minutes) {
+ let time = (minutes != null ? minutes : this.settings.autoPullInterval) * 6e4;
+ if (time > 2147483647)
+ time = 2147483647;
+ this.timeoutIDPull = window.setTimeout(() => {
+ this.promiseQueue.addTask(() => this.pullChangesFromRemote());
+ this.saveLastAuto(/* @__PURE__ */ new Date(), "pull");
+ this.saveSettings();
+ this.startAutoPull();
+ }, time);
+ }
+ startAutoPush(minutes) {
+ let time = (minutes != null ? minutes : this.settings.autoPushInterval) * 6e4;
+ if (time > 2147483647)
+ time = 2147483647;
+ this.timeoutIDPush = window.setTimeout(() => {
+ this.promiseQueue.addTask(() => this.push());
+ this.saveLastAuto(/* @__PURE__ */ new Date(), "push");
+ this.saveSettings();
+ this.startAutoPush();
+ }, time);
+ }
+ clearAutoBackup() {
+ var _a2;
+ let wasActive = false;
+ if (this.timeoutIDBackup) {
+ window.clearTimeout(this.timeoutIDBackup);
+ this.timeoutIDBackup = void 0;
+ wasActive = true;
+ }
+ if (this.onFileModifyEventRef) {
+ (_a2 = this.autoBackupDebouncer) == null ? void 0 : _a2.cancel();
+ this.app.vault.offref(this.onFileModifyEventRef);
+ this.onFileModifyEventRef = void 0;
+ wasActive = true;
+ }
+ return wasActive;
+ }
+ clearAutoPull() {
+ if (this.timeoutIDPull) {
+ window.clearTimeout(this.timeoutIDPull);
+ this.timeoutIDPull = void 0;
+ return true;
+ }
+ return false;
+ }
+ clearAutoPush() {
+ if (this.timeoutIDPush) {
+ window.clearTimeout(this.timeoutIDPush);
+ this.timeoutIDPush = void 0;
+ return true;
+ }
+ return false;
+ }
+ async handleConflict(conflicted) {
+ this.setState(6 /* conflicted */);
+ this.localStorage.setConflict(true);
+ let lines;
+ if (conflicted !== void 0) {
+ lines = [
+ "# Conflicts",
+ "Please resolve them and commit them using the commands `Git: Commit all changes` followed by `Git: Push`",
+ "(This file will automatically be deleted before commit)",
+ "[[#Additional Instructions]] available below file list",
+ "",
+ ...conflicted.map((e) => {
+ const file = this.app.vault.getAbstractFileByPath(e);
+ if (file instanceof import_obsidian31.TFile) {
+ const link = this.app.metadataCache.fileToLinktext(
+ file,
+ "/"
+ );
+ return `- [[${link}]]`;
+ } else {
+ return `- Not a file: ${e}`;
+ }
+ }),
+ `
+# Additional Instructions
+I strongly recommend to use "Source mode" for viewing the conflicted files. For simple conflicts, in each file listed above replace every occurrence of the following text blocks with the desired text.
+
+\`\`\`diff
+<<<<<<< HEAD
+ File changes in local repository
+=======
+ File changes in remote repository
+>>>>>>> origin/main
+\`\`\``
+ ];
+ }
+ this.writeAndOpenFile(lines == null ? void 0 : lines.join("\n"));
+ }
+ async editRemotes() {
+ if (!await this.isAllInitialized())
+ return;
+ const remotes = await this.gitManager.getRemotes();
+ const nameModal = new GeneralModal({
+ options: remotes,
+ placeholder: "Select or create a new remote by typing its name and selecting it"
+ });
+ const remoteName = await nameModal.open();
+ if (remoteName) {
+ const oldUrl = await this.gitManager.getRemoteUrl(remoteName);
+ const urlModal = new GeneralModal({ initialValue: oldUrl });
+ const remoteURL = await urlModal.open();
+ if (remoteURL) {
+ await this.gitManager.setRemote(remoteName, remoteURL);
+ return remoteName;
+ }
+ }
+ }
+ async selectRemoteBranch() {
+ let remotes = await this.gitManager.getRemotes();
+ let selectedRemote;
+ if (remotes.length === 0) {
+ selectedRemote = await this.editRemotes();
+ if (selectedRemote == void 0) {
+ remotes = await this.gitManager.getRemotes();
+ }
+ }
+ const nameModal = new GeneralModal({
+ options: remotes,
+ placeholder: "Select or create a new remote by typing its name and selecting it"
+ });
+ const remoteName = selectedRemote != null ? selectedRemote : await nameModal.open();
+ if (remoteName) {
+ this.displayMessage("Fetching remote branches");
+ await this.gitManager.fetch(remoteName);
+ const branches = await this.gitManager.getRemoteBranches(remoteName);
+ const branchModal = new GeneralModal({
+ options: branches,
+ placeholder: "Select or create a new remote branch by typing its name and selecting it"
+ });
+ return await branchModal.open();
+ }
+ }
+ async removeRemote() {
+ if (!await this.isAllInitialized())
+ return;
+ const remotes = await this.gitManager.getRemotes();
+ const nameModal = new GeneralModal({
+ options: remotes,
+ placeholder: "Select a remote"
+ });
+ const remoteName = await nameModal.open();
+ if (remoteName) {
+ this.gitManager.removeRemote(remoteName);
+ }
+ }
+ async writeAndOpenFile(text2) {
+ if (text2 !== void 0) {
+ await this.app.vault.adapter.write(this.conflictOutputFile, text2);
+ }
+ let fileIsAlreadyOpened = false;
+ this.app.workspace.iterateAllLeaves((leaf) => {
+ if (leaf.getDisplayText() != "" && this.conflictOutputFile.startsWith(leaf.getDisplayText())) {
+ fileIsAlreadyOpened = true;
+ }
+ });
+ if (!fileIsAlreadyOpened) {
+ this.app.workspace.openLinkText(this.conflictOutputFile, "/", true);
+ }
+ }
+ handleViewActiveState(leaf) {
+ var _a2, _b;
+ if (!(leaf == null ? void 0 : leaf.view.getState().file))
+ return;
+ const sourceControlLeaf = this.app.workspace.getLeavesOfType(SOURCE_CONTROL_VIEW_CONFIG.type).first();
+ const historyLeaf = this.app.workspace.getLeavesOfType(HISTORY_VIEW_CONFIG.type).first();
+ (_a2 = sourceControlLeaf == null ? void 0 : sourceControlLeaf.view.containerEl.querySelector(`div.nav-file-title.is-active`)) == null ? void 0 : _a2.removeClass("is-active");
+ (_b = historyLeaf == null ? void 0 : historyLeaf.view.containerEl.querySelector(`div.nav-file-title.is-active`)) == null ? void 0 : _b.removeClass("is-active");
+ if ((leaf == null ? void 0 : leaf.view) instanceof DiffView) {
+ const path2 = leaf.view.state.file;
+ this.lastDiffViewState = leaf.view.getState();
+ let el;
+ if (sourceControlLeaf && leaf.view.state.staged) {
+ el = sourceControlLeaf.view.containerEl.querySelector(
+ `div.staged div.nav-file-title[data-path='${path2}']`
+ );
+ } else if (sourceControlLeaf && leaf.view.state.staged === false && !leaf.view.state.hash) {
+ el = sourceControlLeaf.view.containerEl.querySelector(
+ `div.changes div.nav-file-title[data-path='${path2}']`
+ );
+ } else if (historyLeaf && leaf.view.state.hash) {
+ el = historyLeaf.view.containerEl.querySelector(
+ `div.nav-file-title[data-path='${path2}']`
+ );
+ }
+ el == null ? void 0 : el.addClass("is-active");
+ } else {
+ this.lastDiffViewState = void 0;
+ }
+ }
+ // region: displaying / formatting messages
+ displayMessage(message, timeout = 4 * 1e3) {
+ var _a2;
+ (_a2 = this.statusBar) == null ? void 0 : _a2.displayMessage(message.toLowerCase(), timeout);
+ if (!this.settings.disablePopups) {
+ if (!this.settings.disablePopupsForNoChanges || !message.startsWith("No changes")) {
+ new import_obsidian31.Notice(message, 5 * 1e3);
+ }
+ }
+ this.log(message);
+ }
+ displayError(message, timeout = 10 * 1e3) {
+ var _a2;
+ if (message instanceof Errors.UserCanceledError) {
+ new import_obsidian31.Notice("Aborted");
+ return;
+ }
+ message = message.toString();
+ new import_obsidian31.Notice(message, timeout);
+ console.log(`git obsidian error: ${message}`);
+ (_a2 = this.statusBar) == null ? void 0 : _a2.displayMessage(message.toLowerCase(), timeout);
+ }
+ log(message) {
+ console.log(`${this.manifest.id}: ` + message);
+ }
+};
+/*! Bundled license information:
+
+ieee754/index.js:
+ (*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh *)
+
+buffer/index.js:
+ (*!
+ * The buffer module from node.js, for the browser.
+ *
+ * @author Feross Aboukhadijeh
+ * @license MIT
+ *)
+
+safe-buffer/index.js:
+ (*! safe-buffer. MIT License. Feross Aboukhadijeh *)
+
+crc-32/crc32.js:
+ (*! crc32.js (C) 2014-present SheetJS -- http://sheetjs.com *)
+
+js-sha256/src/sha256.js:
+ (**
+ * [js-sha256]{@link https://github.com/emn178/js-sha256}
+ *
+ * @version 0.9.0
+ * @author Chen, Yi-Cyuan [emn178@gmail.com]
+ * @copyright Chen, Yi-Cyuan 2014-2017
+ * @license MIT
+ *)
+
+feather-icons/dist/feather.js:
+ (*!
+ Copyright (c) 2016 Jed Watson.
+ Licensed under the MIT License (MIT), see
+ http://jedwatson.github.io/classnames
+ *)
+*/
diff --git a/.obsidian/plugins/obsidian-git/manifest.json b/.obsidian/plugins/obsidian-git/manifest.json
new file mode 100644
index 00000000000..79dc19c16fc
--- /dev/null
+++ b/.obsidian/plugins/obsidian-git/manifest.json
@@ -0,0 +1,9 @@
+{
+ "id": "obsidian-git",
+ "name": "Git",
+ "description": "Backup your vault with Git.",
+ "isDesktopOnly": false,
+ "fundingUrl": "https://ko-fi.com/vinzent",
+ "js": "main.js",
+ "version": "2.24.1"
+}
diff --git a/.obsidian/plugins/obsidian-git/styles.css b/.obsidian/plugins/obsidian-git/styles.css
new file mode 100644
index 00000000000..226dbe9c740
--- /dev/null
+++ b/.obsidian/plugins/obsidian-git/styles.css
@@ -0,0 +1,551 @@
+@keyframes loading {
+ 0% {
+ transform: rotate(0deg);
+ }
+
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+
+.workspace-leaf-content[data-type="git-view"] .button-border {
+ border: 2px solid var(--interactive-accent);
+ border-radius: var(--radius-s);
+}
+
+.workspace-leaf-content[data-type="git-view"] .view-content {
+ padding: 0;
+}
+
+.workspace-leaf-content[data-type="git-history-view"] .view-content {
+ padding: 0;
+}
+
+.loading > svg {
+ animation: 2s linear infinite loading;
+ transform-origin: 50% 50%;
+ display: inline-block;
+}
+
+.obsidian-git-center {
+ margin: auto;
+ text-align: center;
+ width: 50%;
+}
+
+.obsidian-git-textarea {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.obsidian-git-center-button {
+ display: block;
+ margin: 20px auto;
+}
+
+.tooltip.mod-left {
+ overflow-wrap: break-word;
+}
+
+.tooltip.mod-right {
+ overflow-wrap: break-word;
+}
+.git-tools {
+ display: flex;
+ margin-left: auto;
+}
+.git-tools .type {
+ padding-left: var(--size-2-1);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 11px;
+}
+
+.git-tools .type[data-type="M"] {
+ color: orange;
+}
+.git-tools .type[data-type="D"] {
+ color: red;
+}
+.git-tools .buttons {
+ display: flex;
+}
+.git-tools .buttons > * {
+ padding: 0 0;
+ height: auto;
+}
+
+.git-author {
+ color: var(--text-accent);
+}
+
+.git-date {
+ color: var(--text-accent);
+}
+
+.git-ref {
+ color: var(--text-accent);
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-d-none {
+ display: none;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-wrapper {
+ text-align: left;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-file-header {
+ background-color: var(--background-primary);
+ border-bottom: 1px solid var(--interactive-accent);
+ font-family: var(--font-monospace);
+ height: 35px;
+ padding: 5px 10px;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-file-header,
+.workspace-leaf-content[data-type="diff-view"] .d2h-file-stats {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-file-stats {
+ font-size: 14px;
+ margin-left: auto;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-lines-added {
+ border: 1px solid #b4e2b4;
+ border-radius: 5px 0 0 5px;
+ color: #399839;
+ padding: 2px;
+ text-align: right;
+ vertical-align: middle;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-lines-deleted {
+ border: 1px solid #e9aeae;
+ border-radius: 0 5px 5px 0;
+ color: #c33;
+ margin-left: 1px;
+ padding: 2px;
+ text-align: left;
+ vertical-align: middle;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-file-name-wrapper {
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ font-size: 15px;
+ width: 100%;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-file-name {
+ overflow-x: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-file-wrapper {
+ border: 1px solid var(--background-modifier-border);
+ border-radius: 3px;
+ margin-bottom: 1em;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-file-collapse {
+ -webkit-box-pack: end;
+ -ms-flex-pack: end;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ border: 1px solid var(--background-modifier-border);
+ border-radius: 3px;
+ cursor: pointer;
+ display: none;
+ font-size: 12px;
+ justify-content: flex-end;
+ padding: 4px 8px;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-file-collapse.d2h-selected {
+ background-color: #c8e1ff;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-file-collapse-input {
+ margin: 0 4px 0 0;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-diff-table {
+ border-collapse: collapse;
+ font-family: Menlo, Consolas, monospace;
+ font-size: 13px;
+ width: 100%;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-files-diff {
+ width: 100%;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-file-diff {
+ overflow-y: hidden;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-file-side-diff {
+ display: inline-block;
+ margin-bottom: -8px;
+ margin-right: -4px;
+ overflow-x: scroll;
+ overflow-y: hidden;
+ width: 50%;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-code-line {
+ padding: 0 8em;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-code-line,
+.workspace-leaf-content[data-type="diff-view"] .d2h-code-side-line {
+ display: inline-block;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ white-space: nowrap;
+ width: 100%;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-code-side-line {
+ padding: 0 4.5em;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-code-line-ctn {
+ word-wrap: normal;
+ background: none;
+ display: inline-block;
+ padding: 0;
+ -webkit-user-select: text;
+ -moz-user-select: text;
+ -ms-user-select: text;
+ user-select: text;
+ vertical-align: middle;
+ white-space: pre;
+ width: 100%;
+}
+
+.theme-light .workspace-leaf-content[data-type="diff-view"] .d2h-code-line del,
+.theme-light
+ .workspace-leaf-content[data-type="diff-view"]
+ .d2h-code-side-line
+ del {
+ background-color: #ffb6ba;
+}
+
+.theme-dark .workspace-leaf-content[data-type="diff-view"] .d2h-code-line del,
+.theme-dark
+ .workspace-leaf-content[data-type="diff-view"]
+ .d2h-code-side-line
+ del {
+ background-color: #8d232881;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-code-line del,
+.workspace-leaf-content[data-type="diff-view"] .d2h-code-line ins,
+.workspace-leaf-content[data-type="diff-view"] .d2h-code-side-line del,
+.workspace-leaf-content[data-type="diff-view"] .d2h-code-side-line ins {
+ border-radius: 0.2em;
+ display: inline-block;
+ margin-top: -1px;
+ text-decoration: none;
+ vertical-align: middle;
+}
+
+.theme-light .workspace-leaf-content[data-type="diff-view"] .d2h-code-line ins,
+.theme-light
+ .workspace-leaf-content[data-type="diff-view"]
+ .d2h-code-side-line
+ ins {
+ background-color: #97f295;
+ text-align: left;
+}
+
+.theme-dark .workspace-leaf-content[data-type="diff-view"] .d2h-code-line ins,
+.theme-dark
+ .workspace-leaf-content[data-type="diff-view"]
+ .d2h-code-side-line
+ ins {
+ background-color: #1d921996;
+ text-align: left;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-code-line-prefix {
+ word-wrap: normal;
+ background: none;
+ display: inline;
+ padding: 0;
+ white-space: pre;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .line-num1 {
+ float: left;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .line-num1,
+.workspace-leaf-content[data-type="diff-view"] .line-num2 {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ overflow: hidden;
+ padding: 0 0.5em;
+ text-overflow: ellipsis;
+ width: 3.5em;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .line-num2 {
+ float: right;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-code-linenumber {
+ background-color: var(--background-primary);
+ border: solid var(--background-modifier-border);
+ border-width: 0 1px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ color: var(--text-muted);
+ cursor: pointer;
+ display: inline-block;
+ position: absolute;
+ text-align: right;
+ width: 7.5em;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-code-linenumber:after {
+ content: "\200b";
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-code-side-linenumber {
+ background-color: var(--background-primary);
+ border: solid var(--background-modifier-border);
+ border-width: 0 1px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ color: var(--text-muted);
+ cursor: pointer;
+ display: inline-block;
+ overflow: hidden;
+ padding: 0 0.5em;
+ position: absolute;
+ text-align: right;
+ text-overflow: ellipsis;
+ width: 4em;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-diff-tbody tr {
+ position: relative;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-code-side-linenumber:after {
+ content: "\200b";
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-code-side-emptyplaceholder,
+.workspace-leaf-content[data-type="diff-view"] .d2h-emptyplaceholder {
+ background-color: var(--background-primary);
+ border-color: var(--background-modifier-border);
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-code-line-prefix,
+.workspace-leaf-content[data-type="diff-view"] .d2h-code-linenumber,
+.workspace-leaf-content[data-type="diff-view"] .d2h-code-side-linenumber,
+.workspace-leaf-content[data-type="diff-view"] .d2h-emptyplaceholder {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-code-linenumber,
+.workspace-leaf-content[data-type="diff-view"] .d2h-code-side-linenumber {
+ direction: rtl;
+}
+
+.theme-light .workspace-leaf-content[data-type="diff-view"] .d2h-del {
+ background-color: #fee8e9;
+ border-color: #e9aeae;
+}
+
+.theme-light .workspace-leaf-content[data-type="diff-view"] .d2h-ins {
+ background-color: #dfd;
+ border-color: #b4e2b4;
+}
+
+.theme-dark .workspace-leaf-content[data-type="diff-view"] .d2h-del {
+ background-color: #521b1d83;
+ border-color: #691d1d73;
+}
+
+.theme-dark .workspace-leaf-content[data-type="diff-view"] .d2h-ins {
+ background-color: rgba(30, 71, 30, 0.5);
+ border-color: #13501381;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-info {
+ background-color: var(--background-primary);
+ border-color: var(--background-modifier-border);
+ color: var(--text-normal);
+}
+
+.theme-light
+ .workspace-leaf-content[data-type="diff-view"]
+ .d2h-file-diff
+ .d2h-del.d2h-change {
+ background-color: #fdf2d0;
+}
+
+.theme-dark
+ .workspace-leaf-content[data-type="diff-view"]
+ .d2h-file-diff
+ .d2h-del.d2h-change {
+ background-color: #55492480;
+}
+
+.theme-light
+ .workspace-leaf-content[data-type="diff-view"]
+ .d2h-file-diff
+ .d2h-ins.d2h-change {
+ background-color: #ded;
+}
+
+.theme-dark
+ .workspace-leaf-content[data-type="diff-view"]
+ .d2h-file-diff
+ .d2h-ins.d2h-change {
+ background-color: rgba(37, 78, 37, 0.418);
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-file-list-wrapper {
+ margin-bottom: 10px;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-file-list-wrapper a {
+ color: #3572b0;
+ text-decoration: none;
+}
+
+.workspace-leaf-content[data-type="diff-view"]
+ .d2h-file-list-wrapper
+ a:visited {
+ color: #3572b0;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-file-list-header {
+ text-align: left;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-file-list-title {
+ font-weight: 700;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-file-list-line {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ text-align: left;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-file-list {
+ display: block;
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-file-list > li {
+ border-bottom: 1px solid var(--background-modifier-border);
+ margin: 0;
+ padding: 5px 10px;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-file-list > li:last-child {
+ border-bottom: none;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-file-switch {
+ cursor: pointer;
+ display: none;
+ font-size: 10px;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-icon {
+ fill: currentColor;
+ margin-right: 10px;
+ vertical-align: middle;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-deleted {
+ color: #c33;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-added {
+ color: #399839;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-changed {
+ color: #d0b44c;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-moved {
+ color: #3572b0;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-tag {
+ background-color: var(--background-primary);
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ font-size: 10px;
+ margin-left: 5px;
+ padding: 0 2px;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-deleted-tag {
+ border: 2px solid #c33;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-added-tag {
+ border: 1px solid #399839;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-changed-tag {
+ border: 1px solid #d0b44c;
+}
+
+.workspace-leaf-content[data-type="diff-view"] .d2h-moved-tag {
+ border: 1px solid #3572b0;
+}
+
+/* ====================== Line Authoring Information ====================== */
+
+.cm-gutterElement.obs-git-blame-gutter {
+ /* Add background color to spacing inbetween and around the gutter for better aesthetics */
+ border-width: 0px 2px 0.2px 2px;
+ border-style: solid;
+ border-color: var(--background-secondary);
+ background-color: var(--background-secondary);
+}
+
+.cm-gutterElement.obs-git-blame-gutter > div,
+.line-author-settings-preview {
+ /* delegate text color to settings */
+ color: var(--obs-git-gutter-text);
+ font-family: monospace;
+ height: 100%; /* ensure, that age-based background color occupies entire parent */
+ text-align: right;
+ padding: 0px 6px 0px 6px;
+ white-space: pre; /* Keep spaces and do not collapse them. */
+}
diff --git a/.obsidian/plugins/obsidian-image-auto-upload-plugin/main.js b/.obsidian/plugins/obsidian-image-auto-upload-plugin/main.js
new file mode 100644
index 00000000000..2a6957031ad
--- /dev/null
+++ b/.obsidian/plugins/obsidian-image-auto-upload-plugin/main.js
@@ -0,0 +1,9940 @@
+'use strict';
+
+var obsidian = require('obsidian');
+var require$$0$1 = require('path');
+var require$$0 = require('fs');
+var process$2 = require('node:process');
+var require$$0$2 = require('child_process');
+var require$$0$3 = require('os');
+var require$$0$4 = require('assert');
+var require$$2 = require('events');
+var require$$0$6 = require('buffer');
+var require$$0$5 = require('stream');
+var require$$2$1 = require('util');
+var node_os = require('node:os');
+var node_buffer = require('node:buffer');
+require('electron');
+
+/******************************************************************************
+Copyright (c) Microsoft Corporation.
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+***************************************************************************** */
+/* global Reflect, Promise */
+
+var extendStatics = function(d, b) {
+ extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
+ return extendStatics(d, b);
+};
+
+function __extends(d, b) {
+ if (typeof b !== "function" && b !== null)
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+}
+
+function __awaiter(thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+}
+
+function __generator(thisArg, body) {
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
+ function verb(n) { return function (v) { return step([n, v]); }; }
+ function step(op) {
+ if (f) throw new TypeError("Generator is already executing.");
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
+ if (y = 0, t) op = [op[0] & 2, t.value];
+ switch (op[0]) {
+ case 0: case 1: t = op; break;
+ case 4: _.label++; return { value: op[1], done: false };
+ case 5: _.label++; y = op[1]; op = [0]; continue;
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
+ default:
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
+ if (t[2]) _.ops.pop();
+ _.trys.pop(); continue;
+ }
+ op = body.call(thisArg, _);
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
+ }
+}
+
+function __values(o) {
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
+ if (m) return m.call(o);
+ if (o && typeof o.length === "number") return {
+ next: function () {
+ if (o && i >= o.length) o = void 0;
+ return { value: o && o[i++], done: !o };
+ }
+ };
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
+}
+
+function __read(o, n) {
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
+ if (!m) return o;
+ var i = m.call(o), r, ar = [], e;
+ try {
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
+ }
+ catch (error) { e = { error: error }; }
+ finally {
+ try {
+ if (r && !r.done && (m = i["return"])) m.call(i);
+ }
+ finally { if (e) throw e.error; }
+ }
+ return ar;
+}
+
+function __spreadArray(to, from, pack) {
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
+ if (ar || !(i in from)) {
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
+ ar[i] = from[i];
+ }
+ }
+ return to.concat(ar || Array.prototype.slice.call(from));
+}
+
+function __asyncValues(o) {
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
+ var m = o[Symbol.asyncIterator], i;
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
+}
+
+var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
+
+function getDefaultExportFromCjs (x) {
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
+}
+
+var execa$2 = {exports: {}};
+
+var crossSpawn$1 = {exports: {}};
+
+var windows;
+var hasRequiredWindows;
+
+function requireWindows () {
+ if (hasRequiredWindows) return windows;
+ hasRequiredWindows = 1;
+ windows = isexe;
+ isexe.sync = sync;
+
+ var fs = require$$0;
+
+ function checkPathExt (path, options) {
+ var pathext = options.pathExt !== undefined ?
+ options.pathExt : process.env.PATHEXT;
+
+ if (!pathext) {
+ return true
+ }
+
+ pathext = pathext.split(';');
+ if (pathext.indexOf('') !== -1) {
+ return true
+ }
+ for (var i = 0; i < pathext.length; i++) {
+ var p = pathext[i].toLowerCase();
+ if (p && path.substr(-p.length).toLowerCase() === p) {
+ return true
+ }
+ }
+ return false
+ }
+
+ function checkStat (stat, path, options) {
+ if (!stat.isSymbolicLink() && !stat.isFile()) {
+ return false
+ }
+ return checkPathExt(path, options)
+ }
+
+ function isexe (path, options, cb) {
+ fs.stat(path, function (er, stat) {
+ cb(er, er ? false : checkStat(stat, path, options));
+ });
+ }
+
+ function sync (path, options) {
+ return checkStat(fs.statSync(path), path, options)
+ }
+ return windows;
+}
+
+var mode;
+var hasRequiredMode;
+
+function requireMode () {
+ if (hasRequiredMode) return mode;
+ hasRequiredMode = 1;
+ mode = isexe;
+ isexe.sync = sync;
+
+ var fs = require$$0;
+
+ function isexe (path, options, cb) {
+ fs.stat(path, function (er, stat) {
+ cb(er, er ? false : checkStat(stat, options));
+ });
+ }
+
+ function sync (path, options) {
+ return checkStat(fs.statSync(path), options)
+ }
+
+ function checkStat (stat, options) {
+ return stat.isFile() && checkMode(stat, options)
+ }
+
+ function checkMode (stat, options) {
+ var mod = stat.mode;
+ var uid = stat.uid;
+ var gid = stat.gid;
+
+ var myUid = options.uid !== undefined ?
+ options.uid : process.getuid && process.getuid();
+ var myGid = options.gid !== undefined ?
+ options.gid : process.getgid && process.getgid();
+
+ var u = parseInt('100', 8);
+ var g = parseInt('010', 8);
+ var o = parseInt('001', 8);
+ var ug = u | g;
+
+ var ret = (mod & o) ||
+ (mod & g) && gid === myGid ||
+ (mod & u) && uid === myUid ||
+ (mod & ug) && myUid === 0;
+
+ return ret
+ }
+ return mode;
+}
+
+var core$1;
+if (process.platform === 'win32' || commonjsGlobal.TESTING_WINDOWS) {
+ core$1 = requireWindows();
+} else {
+ core$1 = requireMode();
+}
+
+var isexe_1 = isexe$1;
+isexe$1.sync = sync;
+
+function isexe$1 (path, options, cb) {
+ if (typeof options === 'function') {
+ cb = options;
+ options = {};
+ }
+
+ if (!cb) {
+ if (typeof Promise !== 'function') {
+ throw new TypeError('callback not provided')
+ }
+
+ return new Promise(function (resolve, reject) {
+ isexe$1(path, options || {}, function (er, is) {
+ if (er) {
+ reject(er);
+ } else {
+ resolve(is);
+ }
+ });
+ })
+ }
+
+ core$1(path, options || {}, function (er, is) {
+ // ignore EACCES because that just means we aren't allowed to run it
+ if (er) {
+ if (er.code === 'EACCES' || options && options.ignoreErrors) {
+ er = null;
+ is = false;
+ }
+ }
+ cb(er, is);
+ });
+}
+
+function sync (path, options) {
+ // my kingdom for a filtered catch
+ try {
+ return core$1.sync(path, options || {})
+ } catch (er) {
+ if (options && options.ignoreErrors || er.code === 'EACCES') {
+ return false
+ } else {
+ throw er
+ }
+ }
+}
+
+const isWindows = process.platform === 'win32' ||
+ process.env.OSTYPE === 'cygwin' ||
+ process.env.OSTYPE === 'msys';
+
+const path$3 = require$$0$1;
+const COLON = isWindows ? ';' : ':';
+const isexe = isexe_1;
+
+const getNotFoundError = (cmd) =>
+ Object.assign(new Error(`not found: ${cmd}`), { code: 'ENOENT' });
+
+const getPathInfo = (cmd, opt) => {
+ const colon = opt.colon || COLON;
+
+ // If it has a slash, then we don't bother searching the pathenv.
+ // just check the file itself, and that's it.
+ const pathEnv = cmd.match(/\//) || isWindows && cmd.match(/\\/) ? ['']
+ : (
+ [
+ // windows always checks the cwd first
+ ...(isWindows ? [process.cwd()] : []),
+ ...(opt.path || process.env.PATH ||
+ /* istanbul ignore next: very unusual */ '').split(colon),
+ ]
+ );
+ const pathExtExe = isWindows
+ ? opt.pathExt || process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM'
+ : '';
+ const pathExt = isWindows ? pathExtExe.split(colon) : [''];
+
+ if (isWindows) {
+ if (cmd.indexOf('.') !== -1 && pathExt[0] !== '')
+ pathExt.unshift('');
+ }
+
+ return {
+ pathEnv,
+ pathExt,
+ pathExtExe,
+ }
+};
+
+const which$1 = (cmd, opt, cb) => {
+ if (typeof opt === 'function') {
+ cb = opt;
+ opt = {};
+ }
+ if (!opt)
+ opt = {};
+
+ const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt);
+ const found = [];
+
+ const step = i => new Promise((resolve, reject) => {
+ if (i === pathEnv.length)
+ return opt.all && found.length ? resolve(found)
+ : reject(getNotFoundError(cmd))
+
+ const ppRaw = pathEnv[i];
+ const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw;
+
+ const pCmd = path$3.join(pathPart, cmd);
+ const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd
+ : pCmd;
+
+ resolve(subStep(p, i, 0));
+ });
+
+ const subStep = (p, i, ii) => new Promise((resolve, reject) => {
+ if (ii === pathExt.length)
+ return resolve(step(i + 1))
+ const ext = pathExt[ii];
+ isexe(p + ext, { pathExt: pathExtExe }, (er, is) => {
+ if (!er && is) {
+ if (opt.all)
+ found.push(p + ext);
+ else
+ return resolve(p + ext)
+ }
+ return resolve(subStep(p, i, ii + 1))
+ });
+ });
+
+ return cb ? step(0).then(res => cb(null, res), cb) : step(0)
+};
+
+const whichSync = (cmd, opt) => {
+ opt = opt || {};
+
+ const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt);
+ const found = [];
+
+ for (let i = 0; i < pathEnv.length; i ++) {
+ const ppRaw = pathEnv[i];
+ const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw;
+
+ const pCmd = path$3.join(pathPart, cmd);
+ const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd
+ : pCmd;
+
+ for (let j = 0; j < pathExt.length; j ++) {
+ const cur = p + pathExt[j];
+ try {
+ const is = isexe.sync(cur, { pathExt: pathExtExe });
+ if (is) {
+ if (opt.all)
+ found.push(cur);
+ else
+ return cur
+ }
+ } catch (ex) {}
+ }
+ }
+
+ if (opt.all && found.length)
+ return found
+
+ if (opt.nothrow)
+ return null
+
+ throw getNotFoundError(cmd)
+};
+
+var which_1 = which$1;
+which$1.sync = whichSync;
+
+var pathKey$1 = {exports: {}};
+
+const pathKey = (options = {}) => {
+ const environment = options.env || process.env;
+ const platform = options.platform || process.platform;
+
+ if (platform !== 'win32') {
+ return 'PATH';
+ }
+
+ return Object.keys(environment).reverse().find(key => key.toUpperCase() === 'PATH') || 'Path';
+};
+
+pathKey$1.exports = pathKey;
+// TODO: Remove this for the next major release
+pathKey$1.exports.default = pathKey;
+
+var pathKeyExports = pathKey$1.exports;
+
+const path$2 = require$$0$1;
+const which = which_1;
+const getPathKey = pathKeyExports;
+
+function resolveCommandAttempt(parsed, withoutPathExt) {
+ const env = parsed.options.env || process.env;
+ const cwd = process.cwd();
+ const hasCustomCwd = parsed.options.cwd != null;
+ // Worker threads do not have process.chdir()
+ const shouldSwitchCwd = hasCustomCwd && process.chdir !== undefined && !process.chdir.disabled;
+
+ // If a custom `cwd` was specified, we need to change the process cwd
+ // because `which` will do stat calls but does not support a custom cwd
+ if (shouldSwitchCwd) {
+ try {
+ process.chdir(parsed.options.cwd);
+ } catch (err) {
+ /* Empty */
+ }
+ }
+
+ let resolved;
+
+ try {
+ resolved = which.sync(parsed.command, {
+ path: env[getPathKey({ env })],
+ pathExt: withoutPathExt ? path$2.delimiter : undefined,
+ });
+ } catch (e) {
+ /* Empty */
+ } finally {
+ if (shouldSwitchCwd) {
+ process.chdir(cwd);
+ }
+ }
+
+ // If we successfully resolved, ensure that an absolute path is returned
+ // Note that when a custom `cwd` was used, we need to resolve to an absolute path based on it
+ if (resolved) {
+ resolved = path$2.resolve(hasCustomCwd ? parsed.options.cwd : '', resolved);
+ }
+
+ return resolved;
+}
+
+function resolveCommand$1(parsed) {
+ return resolveCommandAttempt(parsed) || resolveCommandAttempt(parsed, true);
+}
+
+var resolveCommand_1 = resolveCommand$1;
+
+var _escape = {};
+
+// See http://www.robvanderwoude.com/escapechars.php
+const metaCharsRegExp = /([()\][%!^"`<>&|;, *?])/g;
+
+function escapeCommand(arg) {
+ // Escape meta chars
+ arg = arg.replace(metaCharsRegExp, '^$1');
+
+ return arg;
+}
+
+function escapeArgument(arg, doubleEscapeMetaChars) {
+ // Convert to string
+ arg = `${arg}`;
+
+ // Algorithm below is based on https://qntm.org/cmd
+
+ // Sequence of backslashes followed by a double quote:
+ // double up all the backslashes and escape the double quote
+ arg = arg.replace(/(\\*)"/g, '$1$1\\"');
+
+ // Sequence of backslashes followed by the end of the string
+ // (which will become a double quote later):
+ // double up all the backslashes
+ arg = arg.replace(/(\\*)$/, '$1$1');
+
+ // All other backslashes occur literally
+
+ // Quote the whole thing:
+ arg = `"${arg}"`;
+
+ // Escape meta chars
+ arg = arg.replace(metaCharsRegExp, '^$1');
+
+ // Double escape meta chars if necessary
+ if (doubleEscapeMetaChars) {
+ arg = arg.replace(metaCharsRegExp, '^$1');
+ }
+
+ return arg;
+}
+
+_escape.command = escapeCommand;
+_escape.argument = escapeArgument;
+
+var shebangRegex$1 = /^#!(.*)/;
+
+const shebangRegex = shebangRegex$1;
+
+var shebangCommand$1 = (string = '') => {
+ const match = string.match(shebangRegex);
+
+ if (!match) {
+ return null;
+ }
+
+ const [path, argument] = match[0].replace(/#! ?/, '').split(' ');
+ const binary = path.split('/').pop();
+
+ if (binary === 'env') {
+ return argument;
+ }
+
+ return argument ? `${binary} ${argument}` : binary;
+};
+
+const fs = require$$0;
+const shebangCommand = shebangCommand$1;
+
+function readShebang$1(command) {
+ // Read the first 150 bytes from the file
+ const size = 150;
+ const buffer = Buffer.alloc(size);
+
+ let fd;
+
+ try {
+ fd = fs.openSync(command, 'r');
+ fs.readSync(fd, buffer, 0, size, 0);
+ fs.closeSync(fd);
+ } catch (e) { /* Empty */ }
+
+ // Attempt to extract shebang (null is returned if not a shebang)
+ return shebangCommand(buffer.toString());
+}
+
+var readShebang_1 = readShebang$1;
+
+const path$1 = require$$0$1;
+const resolveCommand = resolveCommand_1;
+const escape = _escape;
+const readShebang = readShebang_1;
+
+const isWin$2 = process.platform === 'win32';
+const isExecutableRegExp = /\.(?:com|exe)$/i;
+const isCmdShimRegExp = /node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;
+
+function detectShebang(parsed) {
+ parsed.file = resolveCommand(parsed);
+
+ const shebang = parsed.file && readShebang(parsed.file);
+
+ if (shebang) {
+ parsed.args.unshift(parsed.file);
+ parsed.command = shebang;
+
+ return resolveCommand(parsed);
+ }
+
+ return parsed.file;
+}
+
+function parseNonShell(parsed) {
+ if (!isWin$2) {
+ return parsed;
+ }
+
+ // Detect & add support for shebangs
+ const commandFile = detectShebang(parsed);
+
+ // We don't need a shell if the command filename is an executable
+ const needsShell = !isExecutableRegExp.test(commandFile);
+
+ // If a shell is required, use cmd.exe and take care of escaping everything correctly
+ // Note that `forceShell` is an hidden option used only in tests
+ if (parsed.options.forceShell || needsShell) {
+ // Need to double escape meta chars if the command is a cmd-shim located in `node_modules/.bin/`
+ // The cmd-shim simply calls execute the package bin file with NodeJS, proxying any argument
+ // Because the escape of metachars with ^ gets interpreted when the cmd.exe is first called,
+ // we need to double escape them
+ const needsDoubleEscapeMetaChars = isCmdShimRegExp.test(commandFile);
+
+ // Normalize posix paths into OS compatible paths (e.g.: foo/bar -> foo\bar)
+ // This is necessary otherwise it will always fail with ENOENT in those cases
+ parsed.command = path$1.normalize(parsed.command);
+
+ // Escape command & arguments
+ parsed.command = escape.command(parsed.command);
+ parsed.args = parsed.args.map((arg) => escape.argument(arg, needsDoubleEscapeMetaChars));
+
+ const shellCommand = [parsed.command].concat(parsed.args).join(' ');
+
+ parsed.args = ['/d', '/s', '/c', `"${shellCommand}"`];
+ parsed.command = process.env.comspec || 'cmd.exe';
+ parsed.options.windowsVerbatimArguments = true; // Tell node's spawn that the arguments are already escaped
+ }
+
+ return parsed;
+}
+
+function parse$1(command, args, options) {
+ // Normalize arguments, similar to nodejs
+ if (args && !Array.isArray(args)) {
+ options = args;
+ args = null;
+ }
+
+ args = args ? args.slice(0) : []; // Clone array to avoid changing the original
+ options = Object.assign({}, options); // Clone object to avoid changing the original
+
+ // Build our parsed object
+ const parsed = {
+ command,
+ args,
+ options,
+ file: undefined,
+ original: {
+ command,
+ args,
+ },
+ };
+
+ // Delegate further parsing to shell or non-shell
+ return options.shell ? parsed : parseNonShell(parsed);
+}
+
+var parse_1 = parse$1;
+
+const isWin$1 = process.platform === 'win32';
+
+function notFoundError(original, syscall) {
+ return Object.assign(new Error(`${syscall} ${original.command} ENOENT`), {
+ code: 'ENOENT',
+ errno: 'ENOENT',
+ syscall: `${syscall} ${original.command}`,
+ path: original.command,
+ spawnargs: original.args,
+ });
+}
+
+function hookChildProcess(cp, parsed) {
+ if (!isWin$1) {
+ return;
+ }
+
+ const originalEmit = cp.emit;
+
+ cp.emit = function (name, arg1) {
+ // If emitting "exit" event and exit code is 1, we need to check if
+ // the command exists and emit an "error" instead
+ // See https://github.com/IndigoUnited/node-cross-spawn/issues/16
+ if (name === 'exit') {
+ const err = verifyENOENT(arg1, parsed);
+
+ if (err) {
+ return originalEmit.call(cp, 'error', err);
+ }
+ }
+
+ return originalEmit.apply(cp, arguments); // eslint-disable-line prefer-rest-params
+ };
+}
+
+function verifyENOENT(status, parsed) {
+ if (isWin$1 && status === 1 && !parsed.file) {
+ return notFoundError(parsed.original, 'spawn');
+ }
+
+ return null;
+}
+
+function verifyENOENTSync(status, parsed) {
+ if (isWin$1 && status === 1 && !parsed.file) {
+ return notFoundError(parsed.original, 'spawnSync');
+ }
+
+ return null;
+}
+
+var enoent$1 = {
+ hookChildProcess,
+ verifyENOENT,
+ verifyENOENTSync,
+ notFoundError,
+};
+
+const cp = require$$0$2;
+const parse = parse_1;
+const enoent = enoent$1;
+
+function spawn(command, args, options) {
+ // Parse the arguments
+ const parsed = parse(command, args, options);
+
+ // Spawn the child process
+ const spawned = cp.spawn(parsed.command, parsed.args, parsed.options);
+
+ // Hook into child process "exit" event to emit an error if the command
+ // does not exists, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16
+ enoent.hookChildProcess(spawned, parsed);
+
+ return spawned;
+}
+
+function spawnSync(command, args, options) {
+ // Parse the arguments
+ const parsed = parse(command, args, options);
+
+ // Spawn the child process
+ const result = cp.spawnSync(parsed.command, parsed.args, parsed.options);
+
+ // Analyze if the command does not exist, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16
+ result.error = result.error || enoent.verifyENOENTSync(result.status, parsed);
+
+ return result;
+}
+
+crossSpawn$1.exports = spawn;
+crossSpawn$1.exports.spawn = spawn;
+crossSpawn$1.exports.sync = spawnSync;
+
+crossSpawn$1.exports._parse = parse;
+crossSpawn$1.exports._enoent = enoent;
+
+var crossSpawnExports = crossSpawn$1.exports;
+
+var stripFinalNewline$1 = input => {
+ const LF = typeof input === 'string' ? '\n' : '\n'.charCodeAt();
+ const CR = typeof input === 'string' ? '\r' : '\r'.charCodeAt();
+
+ if (input[input.length - 1] === LF) {
+ input = input.slice(0, input.length - 1);
+ }
+
+ if (input[input.length - 1] === CR) {
+ input = input.slice(0, input.length - 1);
+ }
+
+ return input;
+};
+
+var npmRunPath$1 = {exports: {}};
+
+npmRunPath$1.exports;
+
+(function (module) {
+ const path = require$$0$1;
+ const pathKey = pathKeyExports;
+
+ const npmRunPath = options => {
+ options = {
+ cwd: process.cwd(),
+ path: process.env[pathKey()],
+ execPath: process.execPath,
+ ...options
+ };
+
+ let previous;
+ let cwdPath = path.resolve(options.cwd);
+ const result = [];
+
+ while (previous !== cwdPath) {
+ result.push(path.join(cwdPath, 'node_modules/.bin'));
+ previous = cwdPath;
+ cwdPath = path.resolve(cwdPath, '..');
+ }
+
+ // Ensure the running `node` binary is used
+ const execPathDir = path.resolve(options.cwd, options.execPath, '..');
+ result.push(execPathDir);
+
+ return result.concat(options.path).join(path.delimiter);
+ };
+
+ module.exports = npmRunPath;
+ // TODO: Remove this for the next major release
+ module.exports.default = npmRunPath;
+
+ module.exports.env = options => {
+ options = {
+ env: process.env,
+ ...options
+ };
+
+ const env = {...options.env};
+ const path = pathKey({env});
+
+ options.path = env[path];
+ env[path] = module.exports(options);
+
+ return env;
+ };
+} (npmRunPath$1));
+
+var npmRunPathExports = npmRunPath$1.exports;
+
+var onetime$2 = {exports: {}};
+
+var mimicFn$2 = {exports: {}};
+
+const mimicFn$1 = (to, from) => {
+ for (const prop of Reflect.ownKeys(from)) {
+ Object.defineProperty(to, prop, Object.getOwnPropertyDescriptor(from, prop));
+ }
+
+ return to;
+};
+
+mimicFn$2.exports = mimicFn$1;
+// TODO: Remove this for the next major release
+mimicFn$2.exports.default = mimicFn$1;
+
+var mimicFnExports = mimicFn$2.exports;
+
+const mimicFn = mimicFnExports;
+
+const calledFunctions = new WeakMap();
+
+const onetime$1 = (function_, options = {}) => {
+ if (typeof function_ !== 'function') {
+ throw new TypeError('Expected a function');
+ }
+
+ let returnValue;
+ let callCount = 0;
+ const functionName = function_.displayName || function_.name || '';
+
+ const onetime = function (...arguments_) {
+ calledFunctions.set(onetime, ++callCount);
+
+ if (callCount === 1) {
+ returnValue = function_.apply(this, arguments_);
+ function_ = null;
+ } else if (options.throw === true) {
+ throw new Error(`Function \`${functionName}\` can only be called once`);
+ }
+
+ return returnValue;
+ };
+
+ mimicFn(onetime, function_);
+ calledFunctions.set(onetime, callCount);
+
+ return onetime;
+};
+
+onetime$2.exports = onetime$1;
+// TODO: Remove this for the next major release
+onetime$2.exports.default = onetime$1;
+
+onetime$2.exports.callCount = function_ => {
+ if (!calledFunctions.has(function_)) {
+ throw new Error(`The given function \`${function_.name}\` is not wrapped by the \`onetime\` package`);
+ }
+
+ return calledFunctions.get(function_);
+};
+
+var onetimeExports = onetime$2.exports;
+
+var main = {};
+
+var signals$2 = {};
+
+var core = {};
+
+Object.defineProperty(core,"__esModule",{value:true});core.SIGNALS=void 0;
+
+const SIGNALS=[
+{
+name:"SIGHUP",
+number:1,
+action:"terminate",
+description:"Terminal closed",
+standard:"posix"},
+
+{
+name:"SIGINT",
+number:2,
+action:"terminate",
+description:"User interruption with CTRL-C",
+standard:"ansi"},
+
+{
+name:"SIGQUIT",
+number:3,
+action:"core",
+description:"User interruption with CTRL-\\",
+standard:"posix"},
+
+{
+name:"SIGILL",
+number:4,
+action:"core",
+description:"Invalid machine instruction",
+standard:"ansi"},
+
+{
+name:"SIGTRAP",
+number:5,
+action:"core",
+description:"Debugger breakpoint",
+standard:"posix"},
+
+{
+name:"SIGABRT",
+number:6,
+action:"core",
+description:"Aborted",
+standard:"ansi"},
+
+{
+name:"SIGIOT",
+number:6,
+action:"core",
+description:"Aborted",
+standard:"bsd"},
+
+{
+name:"SIGBUS",
+number:7,
+action:"core",
+description:
+"Bus error due to misaligned, non-existing address or paging error",
+standard:"bsd"},
+
+{
+name:"SIGEMT",
+number:7,
+action:"terminate",
+description:"Command should be emulated but is not implemented",
+standard:"other"},
+
+{
+name:"SIGFPE",
+number:8,
+action:"core",
+description:"Floating point arithmetic error",
+standard:"ansi"},
+
+{
+name:"SIGKILL",
+number:9,
+action:"terminate",
+description:"Forced termination",
+standard:"posix",
+forced:true},
+
+{
+name:"SIGUSR1",
+number:10,
+action:"terminate",
+description:"Application-specific signal",
+standard:"posix"},
+
+{
+name:"SIGSEGV",
+number:11,
+action:"core",
+description:"Segmentation fault",
+standard:"ansi"},
+
+{
+name:"SIGUSR2",
+number:12,
+action:"terminate",
+description:"Application-specific signal",
+standard:"posix"},
+
+{
+name:"SIGPIPE",
+number:13,
+action:"terminate",
+description:"Broken pipe or socket",
+standard:"posix"},
+
+{
+name:"SIGALRM",
+number:14,
+action:"terminate",
+description:"Timeout or timer",
+standard:"posix"},
+
+{
+name:"SIGTERM",
+number:15,
+action:"terminate",
+description:"Termination",
+standard:"ansi"},
+
+{
+name:"SIGSTKFLT",
+number:16,
+action:"terminate",
+description:"Stack is empty or overflowed",
+standard:"other"},
+
+{
+name:"SIGCHLD",
+number:17,
+action:"ignore",
+description:"Child process terminated, paused or unpaused",
+standard:"posix"},
+
+{
+name:"SIGCLD",
+number:17,
+action:"ignore",
+description:"Child process terminated, paused or unpaused",
+standard:"other"},
+
+{
+name:"SIGCONT",
+number:18,
+action:"unpause",
+description:"Unpaused",
+standard:"posix",
+forced:true},
+
+{
+name:"SIGSTOP",
+number:19,
+action:"pause",
+description:"Paused",
+standard:"posix",
+forced:true},
+
+{
+name:"SIGTSTP",
+number:20,
+action:"pause",
+description:"Paused using CTRL-Z or \"suspend\"",
+standard:"posix"},
+
+{
+name:"SIGTTIN",
+number:21,
+action:"pause",
+description:"Background process cannot read terminal input",
+standard:"posix"},
+
+{
+name:"SIGBREAK",
+number:21,
+action:"terminate",
+description:"User interruption with CTRL-BREAK",
+standard:"other"},
+
+{
+name:"SIGTTOU",
+number:22,
+action:"pause",
+description:"Background process cannot write to terminal output",
+standard:"posix"},
+
+{
+name:"SIGURG",
+number:23,
+action:"ignore",
+description:"Socket received out-of-band data",
+standard:"bsd"},
+
+{
+name:"SIGXCPU",
+number:24,
+action:"core",
+description:"Process timed out",
+standard:"bsd"},
+
+{
+name:"SIGXFSZ",
+number:25,
+action:"core",
+description:"File too big",
+standard:"bsd"},
+
+{
+name:"SIGVTALRM",
+number:26,
+action:"terminate",
+description:"Timeout or timer",
+standard:"bsd"},
+
+{
+name:"SIGPROF",
+number:27,
+action:"terminate",
+description:"Timeout or timer",
+standard:"bsd"},
+
+{
+name:"SIGWINCH",
+number:28,
+action:"ignore",
+description:"Terminal window size changed",
+standard:"bsd"},
+
+{
+name:"SIGIO",
+number:29,
+action:"terminate",
+description:"I/O is available",
+standard:"other"},
+
+{
+name:"SIGPOLL",
+number:29,
+action:"terminate",
+description:"Watched event",
+standard:"other"},
+
+{
+name:"SIGINFO",
+number:29,
+action:"ignore",
+description:"Request for process information",
+standard:"other"},
+
+{
+name:"SIGPWR",
+number:30,
+action:"terminate",
+description:"Device running out of power",
+standard:"systemv"},
+
+{
+name:"SIGSYS",
+number:31,
+action:"core",
+description:"Invalid system call",
+standard:"other"},
+
+{
+name:"SIGUNUSED",
+number:31,
+action:"terminate",
+description:"Invalid system call",
+standard:"other"}];core.SIGNALS=SIGNALS;
+
+var realtime = {};
+
+Object.defineProperty(realtime,"__esModule",{value:true});realtime.SIGRTMAX=realtime.getRealtimeSignals=void 0;
+const getRealtimeSignals=function(){
+const length=SIGRTMAX-SIGRTMIN+1;
+return Array.from({length},getRealtimeSignal);
+};realtime.getRealtimeSignals=getRealtimeSignals;
+
+const getRealtimeSignal=function(value,index){
+return {
+name:`SIGRT${index+1}`,
+number:SIGRTMIN+index,
+action:"terminate",
+description:"Application-specific signal (realtime)",
+standard:"posix"};
+
+};
+
+const SIGRTMIN=34;
+const SIGRTMAX=64;realtime.SIGRTMAX=SIGRTMAX;
+
+Object.defineProperty(signals$2,"__esModule",{value:true});signals$2.getSignals=void 0;var _os$1=require$$0$3;
+
+var _core=core;
+var _realtime$1=realtime;
+
+
+
+const getSignals=function(){
+const realtimeSignals=(0, _realtime$1.getRealtimeSignals)();
+const signals=[..._core.SIGNALS,...realtimeSignals].map(normalizeSignal);
+return signals;
+};signals$2.getSignals=getSignals;
+
+
+
+
+
+
+
+const normalizeSignal=function({
+name,
+number:defaultNumber,
+description,
+action,
+forced=false,
+standard})
+{
+const{
+signals:{[name]:constantSignal}}=
+_os$1.constants;
+const supported=constantSignal!==undefined;
+const number=supported?constantSignal:defaultNumber;
+return {name,number,description,supported,action,forced,standard};
+};
+
+Object.defineProperty(main,"__esModule",{value:true});main.signalsByNumber=main.signalsByName=void 0;var _os=require$$0$3;
+
+var _signals=signals$2;
+var _realtime=realtime;
+
+
+
+const getSignalsByName=function(){
+const signals=(0, _signals.getSignals)();
+return signals.reduce(getSignalByName,{});
+};
+
+const getSignalByName=function(
+signalByNameMemo,
+{name,number,description,supported,action,forced,standard})
+{
+return {
+...signalByNameMemo,
+[name]:{name,number,description,supported,action,forced,standard}};
+
+};
+
+const signalsByName$1=getSignalsByName();main.signalsByName=signalsByName$1;
+
+
+
+
+const getSignalsByNumber=function(){
+const signals=(0, _signals.getSignals)();
+const length=_realtime.SIGRTMAX+1;
+const signalsA=Array.from({length},(value,number)=>
+getSignalByNumber(number,signals));
+
+return Object.assign({},...signalsA);
+};
+
+const getSignalByNumber=function(number,signals){
+const signal=findSignalByNumber(number,signals);
+
+if(signal===undefined){
+return {};
+}
+
+const{name,description,supported,action,forced,standard}=signal;
+return {
+[number]:{
+name,
+number,
+description,
+supported,
+action,
+forced,
+standard}};
+
+
+};
+
+
+
+const findSignalByNumber=function(number,signals){
+const signal=signals.find(({name})=>_os.constants.signals[name]===number);
+
+if(signal!==undefined){
+return signal;
+}
+
+return signals.find(signalA=>signalA.number===number);
+};
+
+const signalsByNumber=getSignalsByNumber();main.signalsByNumber=signalsByNumber;
+
+const {signalsByName} = main;
+
+const getErrorPrefix = ({timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled}) => {
+ if (timedOut) {
+ return `timed out after ${timeout} milliseconds`;
+ }
+
+ if (isCanceled) {
+ return 'was canceled';
+ }
+
+ if (errorCode !== undefined) {
+ return `failed with ${errorCode}`;
+ }
+
+ if (signal !== undefined) {
+ return `was killed with ${signal} (${signalDescription})`;
+ }
+
+ if (exitCode !== undefined) {
+ return `failed with exit code ${exitCode}`;
+ }
+
+ return 'failed';
+};
+
+const makeError$1 = ({
+ stdout,
+ stderr,
+ all,
+ error,
+ signal,
+ exitCode,
+ command,
+ escapedCommand,
+ timedOut,
+ isCanceled,
+ killed,
+ parsed: {options: {timeout}}
+}) => {
+ // `signal` and `exitCode` emitted on `spawned.on('exit')` event can be `null`.
+ // We normalize them to `undefined`
+ exitCode = exitCode === null ? undefined : exitCode;
+ signal = signal === null ? undefined : signal;
+ const signalDescription = signal === undefined ? undefined : signalsByName[signal].description;
+
+ const errorCode = error && error.code;
+
+ const prefix = getErrorPrefix({timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled});
+ const execaMessage = `Command ${prefix}: ${command}`;
+ const isError = Object.prototype.toString.call(error) === '[object Error]';
+ const shortMessage = isError ? `${execaMessage}\n${error.message}` : execaMessage;
+ const message = [shortMessage, stderr, stdout].filter(Boolean).join('\n');
+
+ if (isError) {
+ error.originalMessage = error.message;
+ error.message = message;
+ } else {
+ error = new Error(message);
+ }
+
+ error.shortMessage = shortMessage;
+ error.command = command;
+ error.escapedCommand = escapedCommand;
+ error.exitCode = exitCode;
+ error.signal = signal;
+ error.signalDescription = signalDescription;
+ error.stdout = stdout;
+ error.stderr = stderr;
+
+ if (all !== undefined) {
+ error.all = all;
+ }
+
+ if ('bufferedData' in error) {
+ delete error.bufferedData;
+ }
+
+ error.failed = true;
+ error.timedOut = Boolean(timedOut);
+ error.isCanceled = isCanceled;
+ error.killed = killed && !timedOut;
+
+ return error;
+};
+
+var error = makeError$1;
+
+var stdio = {exports: {}};
+
+const aliases = ['stdin', 'stdout', 'stderr'];
+
+const hasAlias = options => aliases.some(alias => options[alias] !== undefined);
+
+const normalizeStdio$1 = options => {
+ if (!options) {
+ return;
+ }
+
+ const {stdio} = options;
+
+ if (stdio === undefined) {
+ return aliases.map(alias => options[alias]);
+ }
+
+ if (hasAlias(options)) {
+ throw new Error(`It's not possible to provide \`stdio\` in combination with one of ${aliases.map(alias => `\`${alias}\``).join(', ')}`);
+ }
+
+ if (typeof stdio === 'string') {
+ return stdio;
+ }
+
+ if (!Array.isArray(stdio)) {
+ throw new TypeError(`Expected \`stdio\` to be of type \`string\` or \`Array\`, got \`${typeof stdio}\``);
+ }
+
+ const length = Math.max(stdio.length, aliases.length);
+ return Array.from({length}, (value, index) => stdio[index]);
+};
+
+stdio.exports = normalizeStdio$1;
+
+// `ipc` is pushed unless it is already present
+stdio.exports.node = options => {
+ const stdio = normalizeStdio$1(options);
+
+ if (stdio === 'ipc') {
+ return 'ipc';
+ }
+
+ if (stdio === undefined || typeof stdio === 'string') {
+ return [stdio, stdio, stdio, 'ipc'];
+ }
+
+ if (stdio.includes('ipc')) {
+ return stdio;
+ }
+
+ return [...stdio, 'ipc'];
+};
+
+var stdioExports = stdio.exports;
+
+var signalExit = {exports: {}};
+
+var signals$1 = {exports: {}};
+
+var hasRequiredSignals;
+
+function requireSignals () {
+ if (hasRequiredSignals) return signals$1.exports;
+ hasRequiredSignals = 1;
+ (function (module) {
+ // This is not the set of all possible signals.
+ //
+ // It IS, however, the set of all signals that trigger
+ // an exit on either Linux or BSD systems. Linux is a
+ // superset of the signal names supported on BSD, and
+ // the unknown signals just fail to register, so we can
+ // catch that easily enough.
+ //
+ // Don't bother with SIGKILL. It's uncatchable, which
+ // means that we can't fire any callbacks anyway.
+ //
+ // If a user does happen to register a handler on a non-
+ // fatal signal like SIGWINCH or something, and then
+ // exit, it'll end up firing `process.emit('exit')`, so
+ // the handler will be fired anyway.
+ //
+ // SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised
+ // artificially, inherently leave the process in a
+ // state from which it is not safe to try and enter JS
+ // listeners.
+ module.exports = [
+ 'SIGABRT',
+ 'SIGALRM',
+ 'SIGHUP',
+ 'SIGINT',
+ 'SIGTERM'
+ ];
+
+ if (process.platform !== 'win32') {
+ module.exports.push(
+ 'SIGVTALRM',
+ 'SIGXCPU',
+ 'SIGXFSZ',
+ 'SIGUSR2',
+ 'SIGTRAP',
+ 'SIGSYS',
+ 'SIGQUIT',
+ 'SIGIOT'
+ // should detect profiler and enable/disable accordingly.
+ // see #21
+ // 'SIGPROF'
+ );
+ }
+
+ if (process.platform === 'linux') {
+ module.exports.push(
+ 'SIGIO',
+ 'SIGPOLL',
+ 'SIGPWR',
+ 'SIGSTKFLT',
+ 'SIGUNUSED'
+ );
+ }
+ } (signals$1));
+ return signals$1.exports;
+}
+
+// Note: since nyc uses this module to output coverage, any lines
+// that are in the direct sync flow of nyc's outputCoverage are
+// ignored, since we can never get coverage for them.
+// grab a reference to node's real process object right away
+var process$1 = commonjsGlobal.process;
+
+const processOk = function (process) {
+ return process &&
+ typeof process === 'object' &&
+ typeof process.removeListener === 'function' &&
+ typeof process.emit === 'function' &&
+ typeof process.reallyExit === 'function' &&
+ typeof process.listeners === 'function' &&
+ typeof process.kill === 'function' &&
+ typeof process.pid === 'number' &&
+ typeof process.on === 'function'
+};
+
+// some kind of non-node environment, just no-op
+/* istanbul ignore if */
+if (!processOk(process$1)) {
+ signalExit.exports = function () {
+ return function () {}
+ };
+} else {
+ var assert = require$$0$4;
+ var signals = requireSignals();
+ var isWin = /^win/i.test(process$1.platform);
+
+ var EE = require$$2;
+ /* istanbul ignore if */
+ if (typeof EE !== 'function') {
+ EE = EE.EventEmitter;
+ }
+
+ var emitter;
+ if (process$1.__signal_exit_emitter__) {
+ emitter = process$1.__signal_exit_emitter__;
+ } else {
+ emitter = process$1.__signal_exit_emitter__ = new EE();
+ emitter.count = 0;
+ emitter.emitted = {};
+ }
+
+ // Because this emitter is a global, we have to check to see if a
+ // previous version of this library failed to enable infinite listeners.
+ // I know what you're about to say. But literally everything about
+ // signal-exit is a compromise with evil. Get used to it.
+ if (!emitter.infinite) {
+ emitter.setMaxListeners(Infinity);
+ emitter.infinite = true;
+ }
+
+ signalExit.exports = function (cb, opts) {
+ /* istanbul ignore if */
+ if (!processOk(commonjsGlobal.process)) {
+ return function () {}
+ }
+ assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler');
+
+ if (loaded === false) {
+ load();
+ }
+
+ var ev = 'exit';
+ if (opts && opts.alwaysLast) {
+ ev = 'afterexit';
+ }
+
+ var remove = function () {
+ emitter.removeListener(ev, cb);
+ if (emitter.listeners('exit').length === 0 &&
+ emitter.listeners('afterexit').length === 0) {
+ unload();
+ }
+ };
+ emitter.on(ev, cb);
+
+ return remove
+ };
+
+ var unload = function unload () {
+ if (!loaded || !processOk(commonjsGlobal.process)) {
+ return
+ }
+ loaded = false;
+
+ signals.forEach(function (sig) {
+ try {
+ process$1.removeListener(sig, sigListeners[sig]);
+ } catch (er) {}
+ });
+ process$1.emit = originalProcessEmit;
+ process$1.reallyExit = originalProcessReallyExit;
+ emitter.count -= 1;
+ };
+ signalExit.exports.unload = unload;
+
+ var emit = function emit (event, code, signal) {
+ /* istanbul ignore if */
+ if (emitter.emitted[event]) {
+ return
+ }
+ emitter.emitted[event] = true;
+ emitter.emit(event, code, signal);
+ };
+
+ // { : , ... }
+ var sigListeners = {};
+ signals.forEach(function (sig) {
+ sigListeners[sig] = function listener () {
+ /* istanbul ignore if */
+ if (!processOk(commonjsGlobal.process)) {
+ return
+ }
+ // If there are no other listeners, an exit is coming!
+ // Simplest way: remove us and then re-send the signal.
+ // We know that this will kill the process, so we can
+ // safely emit now.
+ var listeners = process$1.listeners(sig);
+ if (listeners.length === emitter.count) {
+ unload();
+ emit('exit', null, sig);
+ /* istanbul ignore next */
+ emit('afterexit', null, sig);
+ /* istanbul ignore next */
+ if (isWin && sig === 'SIGHUP') {
+ // "SIGHUP" throws an `ENOSYS` error on Windows,
+ // so use a supported signal instead
+ sig = 'SIGINT';
+ }
+ /* istanbul ignore next */
+ process$1.kill(process$1.pid, sig);
+ }
+ };
+ });
+
+ signalExit.exports.signals = function () {
+ return signals
+ };
+
+ var loaded = false;
+
+ var load = function load () {
+ if (loaded || !processOk(commonjsGlobal.process)) {
+ return
+ }
+ loaded = true;
+
+ // This is the number of onSignalExit's that are in play.
+ // It's important so that we can count the correct number of
+ // listeners on signals, and don't wait for the other one to
+ // handle it instead of us.
+ emitter.count += 1;
+
+ signals = signals.filter(function (sig) {
+ try {
+ process$1.on(sig, sigListeners[sig]);
+ return true
+ } catch (er) {
+ return false
+ }
+ });
+
+ process$1.emit = processEmit;
+ process$1.reallyExit = processReallyExit;
+ };
+ signalExit.exports.load = load;
+
+ var originalProcessReallyExit = process$1.reallyExit;
+ var processReallyExit = function processReallyExit (code) {
+ /* istanbul ignore if */
+ if (!processOk(commonjsGlobal.process)) {
+ return
+ }
+ process$1.exitCode = code || /* istanbul ignore next */ 0;
+ emit('exit', process$1.exitCode, null);
+ /* istanbul ignore next */
+ emit('afterexit', process$1.exitCode, null);
+ /* istanbul ignore next */
+ originalProcessReallyExit.call(process$1, process$1.exitCode);
+ };
+
+ var originalProcessEmit = process$1.emit;
+ var processEmit = function processEmit (ev, arg) {
+ if (ev === 'exit' && processOk(commonjsGlobal.process)) {
+ /* istanbul ignore else */
+ if (arg !== undefined) {
+ process$1.exitCode = arg;
+ }
+ var ret = originalProcessEmit.apply(this, arguments);
+ /* istanbul ignore next */
+ emit('exit', process$1.exitCode, null);
+ /* istanbul ignore next */
+ emit('afterexit', process$1.exitCode, null);
+ /* istanbul ignore next */
+ return ret
+ } else {
+ return originalProcessEmit.apply(this, arguments)
+ }
+ };
+}
+
+var signalExitExports = signalExit.exports;
+
+const os = require$$0$3;
+const onExit = signalExitExports;
+
+const DEFAULT_FORCE_KILL_TIMEOUT = 1000 * 5;
+
+// Monkey-patches `childProcess.kill()` to add `forceKillAfterTimeout` behavior
+const spawnedKill$1 = (kill, signal = 'SIGTERM', options = {}) => {
+ const killResult = kill(signal);
+ setKillTimeout(kill, signal, options, killResult);
+ return killResult;
+};
+
+const setKillTimeout = (kill, signal, options, killResult) => {
+ if (!shouldForceKill(signal, options, killResult)) {
+ return;
+ }
+
+ const timeout = getForceKillAfterTimeout(options);
+ const t = setTimeout(() => {
+ kill('SIGKILL');
+ }, timeout);
+
+ // Guarded because there's no `.unref()` when `execa` is used in the renderer
+ // process in Electron. This cannot be tested since we don't run tests in
+ // Electron.
+ // istanbul ignore else
+ if (t.unref) {
+ t.unref();
+ }
+};
+
+const shouldForceKill = (signal, {forceKillAfterTimeout}, killResult) => {
+ return isSigterm(signal) && forceKillAfterTimeout !== false && killResult;
+};
+
+const isSigterm = signal => {
+ return signal === os.constants.signals.SIGTERM ||
+ (typeof signal === 'string' && signal.toUpperCase() === 'SIGTERM');
+};
+
+const getForceKillAfterTimeout = ({forceKillAfterTimeout = true}) => {
+ if (forceKillAfterTimeout === true) {
+ return DEFAULT_FORCE_KILL_TIMEOUT;
+ }
+
+ if (!Number.isFinite(forceKillAfterTimeout) || forceKillAfterTimeout < 0) {
+ throw new TypeError(`Expected the \`forceKillAfterTimeout\` option to be a non-negative integer, got \`${forceKillAfterTimeout}\` (${typeof forceKillAfterTimeout})`);
+ }
+
+ return forceKillAfterTimeout;
+};
+
+// `childProcess.cancel()`
+const spawnedCancel$1 = (spawned, context) => {
+ const killResult = spawned.kill();
+
+ if (killResult) {
+ context.isCanceled = true;
+ }
+};
+
+const timeoutKill = (spawned, signal, reject) => {
+ spawned.kill(signal);
+ reject(Object.assign(new Error('Timed out'), {timedOut: true, signal}));
+};
+
+// `timeout` option handling
+const setupTimeout$1 = (spawned, {timeout, killSignal = 'SIGTERM'}, spawnedPromise) => {
+ if (timeout === 0 || timeout === undefined) {
+ return spawnedPromise;
+ }
+
+ let timeoutId;
+ const timeoutPromise = new Promise((resolve, reject) => {
+ timeoutId = setTimeout(() => {
+ timeoutKill(spawned, killSignal, reject);
+ }, timeout);
+ });
+
+ const safeSpawnedPromise = spawnedPromise.finally(() => {
+ clearTimeout(timeoutId);
+ });
+
+ return Promise.race([timeoutPromise, safeSpawnedPromise]);
+};
+
+const validateTimeout$1 = ({timeout}) => {
+ if (timeout !== undefined && (!Number.isFinite(timeout) || timeout < 0)) {
+ throw new TypeError(`Expected the \`timeout\` option to be a non-negative integer, got \`${timeout}\` (${typeof timeout})`);
+ }
+};
+
+// `cleanup` option handling
+const setExitHandler$1 = async (spawned, {cleanup, detached}, timedPromise) => {
+ if (!cleanup || detached) {
+ return timedPromise;
+ }
+
+ const removeExitHandler = onExit(() => {
+ spawned.kill();
+ });
+
+ return timedPromise.finally(() => {
+ removeExitHandler();
+ });
+};
+
+var kill = {
+ spawnedKill: spawnedKill$1,
+ spawnedCancel: spawnedCancel$1,
+ setupTimeout: setupTimeout$1,
+ validateTimeout: validateTimeout$1,
+ setExitHandler: setExitHandler$1
+};
+
+const isStream$1 = stream =>
+ stream !== null &&
+ typeof stream === 'object' &&
+ typeof stream.pipe === 'function';
+
+isStream$1.writable = stream =>
+ isStream$1(stream) &&
+ stream.writable !== false &&
+ typeof stream._write === 'function' &&
+ typeof stream._writableState === 'object';
+
+isStream$1.readable = stream =>
+ isStream$1(stream) &&
+ stream.readable !== false &&
+ typeof stream._read === 'function' &&
+ typeof stream._readableState === 'object';
+
+isStream$1.duplex = stream =>
+ isStream$1.writable(stream) &&
+ isStream$1.readable(stream);
+
+isStream$1.transform = stream =>
+ isStream$1.duplex(stream) &&
+ typeof stream._transform === 'function';
+
+var isStream_1 = isStream$1;
+
+var getStream$2 = {exports: {}};
+
+const {PassThrough: PassThroughStream} = require$$0$5;
+
+var bufferStream$1 = options => {
+ options = {...options};
+
+ const {array} = options;
+ let {encoding} = options;
+ const isBuffer = encoding === 'buffer';
+ let objectMode = false;
+
+ if (array) {
+ objectMode = !(encoding || isBuffer);
+ } else {
+ encoding = encoding || 'utf8';
+ }
+
+ if (isBuffer) {
+ encoding = null;
+ }
+
+ const stream = new PassThroughStream({objectMode});
+
+ if (encoding) {
+ stream.setEncoding(encoding);
+ }
+
+ let length = 0;
+ const chunks = [];
+
+ stream.on('data', chunk => {
+ chunks.push(chunk);
+
+ if (objectMode) {
+ length = chunks.length;
+ } else {
+ length += chunk.length;
+ }
+ });
+
+ stream.getBufferedValue = () => {
+ if (array) {
+ return chunks;
+ }
+
+ return isBuffer ? Buffer.concat(chunks, length) : chunks.join('');
+ };
+
+ stream.getBufferedLength = () => length;
+
+ return stream;
+};
+
+const {constants: BufferConstants} = require$$0$6;
+const stream$2 = require$$0$5;
+const {promisify} = require$$2$1;
+const bufferStream = bufferStream$1;
+
+const streamPipelinePromisified = promisify(stream$2.pipeline);
+
+class MaxBufferError extends Error {
+ constructor() {
+ super('maxBuffer exceeded');
+ this.name = 'MaxBufferError';
+ }
+}
+
+async function getStream$1(inputStream, options) {
+ if (!inputStream) {
+ throw new Error('Expected a stream');
+ }
+
+ options = {
+ maxBuffer: Infinity,
+ ...options
+ };
+
+ const {maxBuffer} = options;
+ const stream = bufferStream(options);
+
+ await new Promise((resolve, reject) => {
+ const rejectPromise = error => {
+ // Don't retrieve an oversized buffer.
+ if (error && stream.getBufferedLength() <= BufferConstants.MAX_LENGTH) {
+ error.bufferedData = stream.getBufferedValue();
+ }
+
+ reject(error);
+ };
+
+ (async () => {
+ try {
+ await streamPipelinePromisified(inputStream, stream);
+ resolve();
+ } catch (error) {
+ rejectPromise(error);
+ }
+ })();
+
+ stream.on('data', () => {
+ if (stream.getBufferedLength() > maxBuffer) {
+ rejectPromise(new MaxBufferError());
+ }
+ });
+ });
+
+ return stream.getBufferedValue();
+}
+
+getStream$2.exports = getStream$1;
+getStream$2.exports.buffer = (stream, options) => getStream$1(stream, {...options, encoding: 'buffer'});
+getStream$2.exports.array = (stream, options) => getStream$1(stream, {...options, array: true});
+getStream$2.exports.MaxBufferError = MaxBufferError;
+
+var getStreamExports = getStream$2.exports;
+
+const { PassThrough } = require$$0$5;
+
+var mergeStream$1 = function (/*streams...*/) {
+ var sources = [];
+ var output = new PassThrough({objectMode: true});
+
+ output.setMaxListeners(0);
+
+ output.add = add;
+ output.isEmpty = isEmpty;
+
+ output.on('unpipe', remove);
+
+ Array.prototype.slice.call(arguments).forEach(add);
+
+ return output
+
+ function add (source) {
+ if (Array.isArray(source)) {
+ source.forEach(add);
+ return this
+ }
+
+ sources.push(source);
+ source.once('end', remove.bind(null, source));
+ source.once('error', output.emit.bind(output, 'error'));
+ source.pipe(output, {end: false});
+ return this
+ }
+
+ function isEmpty () {
+ return sources.length == 0;
+ }
+
+ function remove (source) {
+ sources = sources.filter(function (it) { return it !== source });
+ if (!sources.length && output.readable) { output.end(); }
+ }
+};
+
+const isStream = isStream_1;
+const getStream = getStreamExports;
+const mergeStream = mergeStream$1;
+
+// `input` option
+const handleInput$1 = (spawned, input) => {
+ // Checking for stdin is workaround for https://github.com/nodejs/node/issues/26852
+ // @todo remove `|| spawned.stdin === undefined` once we drop support for Node.js <=12.2.0
+ if (input === undefined || spawned.stdin === undefined) {
+ return;
+ }
+
+ if (isStream(input)) {
+ input.pipe(spawned.stdin);
+ } else {
+ spawned.stdin.end(input);
+ }
+};
+
+// `all` interleaves `stdout` and `stderr`
+const makeAllStream$1 = (spawned, {all}) => {
+ if (!all || (!spawned.stdout && !spawned.stderr)) {
+ return;
+ }
+
+ const mixed = mergeStream();
+
+ if (spawned.stdout) {
+ mixed.add(spawned.stdout);
+ }
+
+ if (spawned.stderr) {
+ mixed.add(spawned.stderr);
+ }
+
+ return mixed;
+};
+
+// On failure, `result.stdout|stderr|all` should contain the currently buffered stream
+const getBufferedData = async (stream, streamPromise) => {
+ if (!stream) {
+ return;
+ }
+
+ stream.destroy();
+
+ try {
+ return await streamPromise;
+ } catch (error) {
+ return error.bufferedData;
+ }
+};
+
+const getStreamPromise = (stream, {encoding, buffer, maxBuffer}) => {
+ if (!stream || !buffer) {
+ return;
+ }
+
+ if (encoding) {
+ return getStream(stream, {encoding, maxBuffer});
+ }
+
+ return getStream.buffer(stream, {maxBuffer});
+};
+
+// Retrieve result of child process: exit code, signal, error, streams (stdout/stderr/all)
+const getSpawnedResult$1 = async ({stdout, stderr, all}, {encoding, buffer, maxBuffer}, processDone) => {
+ const stdoutPromise = getStreamPromise(stdout, {encoding, buffer, maxBuffer});
+ const stderrPromise = getStreamPromise(stderr, {encoding, buffer, maxBuffer});
+ const allPromise = getStreamPromise(all, {encoding, buffer, maxBuffer: maxBuffer * 2});
+
+ try {
+ return await Promise.all([processDone, stdoutPromise, stderrPromise, allPromise]);
+ } catch (error) {
+ return Promise.all([
+ {error, signal: error.signal, timedOut: error.timedOut},
+ getBufferedData(stdout, stdoutPromise),
+ getBufferedData(stderr, stderrPromise),
+ getBufferedData(all, allPromise)
+ ]);
+ }
+};
+
+const validateInputSync$1 = ({input}) => {
+ if (isStream(input)) {
+ throw new TypeError('The `input` option cannot be a stream in sync mode');
+ }
+};
+
+var stream$1 = {
+ handleInput: handleInput$1,
+ makeAllStream: makeAllStream$1,
+ getSpawnedResult: getSpawnedResult$1,
+ validateInputSync: validateInputSync$1
+};
+
+const nativePromisePrototype = (async () => {})().constructor.prototype;
+const descriptors = ['then', 'catch', 'finally'].map(property => [
+ property,
+ Reflect.getOwnPropertyDescriptor(nativePromisePrototype, property)
+]);
+
+// The return value is a mixin of `childProcess` and `Promise`
+const mergePromise$1 = (spawned, promise) => {
+ for (const [property, descriptor] of descriptors) {
+ // Starting the main `promise` is deferred to avoid consuming streams
+ const value = typeof promise === 'function' ?
+ (...args) => Reflect.apply(descriptor.value, promise(), args) :
+ descriptor.value.bind(promise);
+
+ Reflect.defineProperty(spawned, property, {...descriptor, value});
+ }
+
+ return spawned;
+};
+
+// Use promises instead of `child_process` events
+const getSpawnedPromise$1 = spawned => {
+ return new Promise((resolve, reject) => {
+ spawned.on('exit', (exitCode, signal) => {
+ resolve({exitCode, signal});
+ });
+
+ spawned.on('error', error => {
+ reject(error);
+ });
+
+ if (spawned.stdin) {
+ spawned.stdin.on('error', error => {
+ reject(error);
+ });
+ }
+ });
+};
+
+var promise = {
+ mergePromise: mergePromise$1,
+ getSpawnedPromise: getSpawnedPromise$1
+};
+
+const normalizeArgs = (file, args = []) => {
+ if (!Array.isArray(args)) {
+ return [file];
+ }
+
+ return [file, ...args];
+};
+
+const NO_ESCAPE_REGEXP = /^[\w.-]+$/;
+const DOUBLE_QUOTES_REGEXP = /"/g;
+
+const escapeArg = arg => {
+ if (typeof arg !== 'string' || NO_ESCAPE_REGEXP.test(arg)) {
+ return arg;
+ }
+
+ return `"${arg.replace(DOUBLE_QUOTES_REGEXP, '\\"')}"`;
+};
+
+const joinCommand$1 = (file, args) => {
+ return normalizeArgs(file, args).join(' ');
+};
+
+const getEscapedCommand$1 = (file, args) => {
+ return normalizeArgs(file, args).map(arg => escapeArg(arg)).join(' ');
+};
+
+const SPACES_REGEXP = / +/g;
+
+// Handle `execa.command()`
+const parseCommand$1 = command => {
+ const tokens = [];
+ for (const token of command.trim().split(SPACES_REGEXP)) {
+ // Allow spaces to be escaped by a backslash if not meant as a delimiter
+ const previousToken = tokens[tokens.length - 1];
+ if (previousToken && previousToken.endsWith('\\')) {
+ // Merge previous token with current one
+ tokens[tokens.length - 1] = `${previousToken.slice(0, -1)} ${token}`;
+ } else {
+ tokens.push(token);
+ }
+ }
+
+ return tokens;
+};
+
+var command = {
+ joinCommand: joinCommand$1,
+ getEscapedCommand: getEscapedCommand$1,
+ parseCommand: parseCommand$1
+};
+
+const path = require$$0$1;
+const childProcess = require$$0$2;
+const crossSpawn = crossSpawnExports;
+const stripFinalNewline = stripFinalNewline$1;
+const npmRunPath = npmRunPathExports;
+const onetime = onetimeExports;
+const makeError = error;
+const normalizeStdio = stdioExports;
+const {spawnedKill, spawnedCancel, setupTimeout, validateTimeout, setExitHandler} = kill;
+const {handleInput, getSpawnedResult, makeAllStream, validateInputSync} = stream$1;
+const {mergePromise, getSpawnedPromise} = promise;
+const {joinCommand, parseCommand, getEscapedCommand} = command;
+
+const DEFAULT_MAX_BUFFER = 1000 * 1000 * 100;
+
+const getEnv = ({env: envOption, extendEnv, preferLocal, localDir, execPath}) => {
+ const env = extendEnv ? {...process.env, ...envOption} : envOption;
+
+ if (preferLocal) {
+ return npmRunPath.env({env, cwd: localDir, execPath});
+ }
+
+ return env;
+};
+
+const handleArguments = (file, args, options = {}) => {
+ const parsed = crossSpawn._parse(file, args, options);
+ file = parsed.command;
+ args = parsed.args;
+ options = parsed.options;
+
+ options = {
+ maxBuffer: DEFAULT_MAX_BUFFER,
+ buffer: true,
+ stripFinalNewline: true,
+ extendEnv: true,
+ preferLocal: false,
+ localDir: options.cwd || process.cwd(),
+ execPath: process.execPath,
+ encoding: 'utf8',
+ reject: true,
+ cleanup: true,
+ all: false,
+ windowsHide: true,
+ ...options
+ };
+
+ options.env = getEnv(options);
+
+ options.stdio = normalizeStdio(options);
+
+ if (process.platform === 'win32' && path.basename(file, '.exe') === 'cmd') {
+ // #116
+ args.unshift('/q');
+ }
+
+ return {file, args, options, parsed};
+};
+
+const handleOutput = (options, value, error) => {
+ if (typeof value !== 'string' && !Buffer.isBuffer(value)) {
+ // When `execa.sync()` errors, we normalize it to '' to mimic `execa()`
+ return error === undefined ? undefined : '';
+ }
+
+ if (options.stripFinalNewline) {
+ return stripFinalNewline(value);
+ }
+
+ return value;
+};
+
+const execa = (file, args, options) => {
+ const parsed = handleArguments(file, args, options);
+ const command = joinCommand(file, args);
+ const escapedCommand = getEscapedCommand(file, args);
+
+ validateTimeout(parsed.options);
+
+ let spawned;
+ try {
+ spawned = childProcess.spawn(parsed.file, parsed.args, parsed.options);
+ } catch (error) {
+ // Ensure the returned error is always both a promise and a child process
+ const dummySpawned = new childProcess.ChildProcess();
+ const errorPromise = Promise.reject(makeError({
+ error,
+ stdout: '',
+ stderr: '',
+ all: '',
+ command,
+ escapedCommand,
+ parsed,
+ timedOut: false,
+ isCanceled: false,
+ killed: false
+ }));
+ return mergePromise(dummySpawned, errorPromise);
+ }
+
+ const spawnedPromise = getSpawnedPromise(spawned);
+ const timedPromise = setupTimeout(spawned, parsed.options, spawnedPromise);
+ const processDone = setExitHandler(spawned, parsed.options, timedPromise);
+
+ const context = {isCanceled: false};
+
+ spawned.kill = spawnedKill.bind(null, spawned.kill.bind(spawned));
+ spawned.cancel = spawnedCancel.bind(null, spawned, context);
+
+ const handlePromise = async () => {
+ const [{error, exitCode, signal, timedOut}, stdoutResult, stderrResult, allResult] = await getSpawnedResult(spawned, parsed.options, processDone);
+ const stdout = handleOutput(parsed.options, stdoutResult);
+ const stderr = handleOutput(parsed.options, stderrResult);
+ const all = handleOutput(parsed.options, allResult);
+
+ if (error || exitCode !== 0 || signal !== null) {
+ const returnedError = makeError({
+ error,
+ exitCode,
+ signal,
+ stdout,
+ stderr,
+ all,
+ command,
+ escapedCommand,
+ parsed,
+ timedOut,
+ isCanceled: context.isCanceled,
+ killed: spawned.killed
+ });
+
+ if (!parsed.options.reject) {
+ return returnedError;
+ }
+
+ throw returnedError;
+ }
+
+ return {
+ command,
+ escapedCommand,
+ exitCode: 0,
+ stdout,
+ stderr,
+ all,
+ failed: false,
+ timedOut: false,
+ isCanceled: false,
+ killed: false
+ };
+ };
+
+ const handlePromiseOnce = onetime(handlePromise);
+
+ handleInput(spawned, parsed.options.input);
+
+ spawned.all = makeAllStream(spawned, parsed.options);
+
+ return mergePromise(spawned, handlePromiseOnce);
+};
+
+execa$2.exports = execa;
+
+execa$2.exports.sync = (file, args, options) => {
+ const parsed = handleArguments(file, args, options);
+ const command = joinCommand(file, args);
+ const escapedCommand = getEscapedCommand(file, args);
+
+ validateInputSync(parsed.options);
+
+ let result;
+ try {
+ result = childProcess.spawnSync(parsed.file, parsed.args, parsed.options);
+ } catch (error) {
+ throw makeError({
+ error,
+ stdout: '',
+ stderr: '',
+ all: '',
+ command,
+ escapedCommand,
+ parsed,
+ timedOut: false,
+ isCanceled: false,
+ killed: false
+ });
+ }
+
+ const stdout = handleOutput(parsed.options, result.stdout, result.error);
+ const stderr = handleOutput(parsed.options, result.stderr, result.error);
+
+ if (result.error || result.status !== 0 || result.signal !== null) {
+ const error = makeError({
+ stdout,
+ stderr,
+ error: result.error,
+ signal: result.signal,
+ exitCode: result.status,
+ command,
+ escapedCommand,
+ parsed,
+ timedOut: result.error && result.error.code === 'ETIMEDOUT',
+ isCanceled: false,
+ killed: result.signal !== null
+ });
+
+ if (!parsed.options.reject) {
+ return error;
+ }
+
+ throw error;
+ }
+
+ return {
+ command,
+ escapedCommand,
+ exitCode: 0,
+ stdout,
+ stderr,
+ failed: false,
+ timedOut: false,
+ isCanceled: false,
+ killed: false
+ };
+};
+
+execa$2.exports.command = (command, options) => {
+ const [file, ...args] = parseCommand(command);
+ return execa(file, args, options);
+};
+
+execa$2.exports.commandSync = (command, options) => {
+ const [file, ...args] = parseCommand(command);
+ return execa.sync(file, args, options);
+};
+
+execa$2.exports.node = (scriptPath, args, options = {}) => {
+ if (args && !Array.isArray(args) && typeof args === 'object') {
+ options = args;
+ args = [];
+ }
+
+ const stdio = normalizeStdio.node(options);
+ const defaultExecArgv = process.execArgv.filter(arg => !arg.startsWith('--inspect'));
+
+ const {
+ nodePath = process.execPath,
+ nodeOptions = defaultExecArgv
+ } = options;
+
+ return execa(
+ nodePath,
+ [
+ ...nodeOptions,
+ scriptPath,
+ ...(Array.isArray(args) ? args : [])
+ ],
+ {
+ ...options,
+ stdin: undefined,
+ stdout: undefined,
+ stderr: undefined,
+ stdio,
+ shell: false
+ }
+ );
+};
+
+var execaExports = execa$2.exports;
+var execa$1 = /*@__PURE__*/getDefaultExportFromCjs(execaExports);
+
+function ansiRegex({onlyFirst = false} = {}) {
+ const pattern = [
+ '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)',
+ '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))'
+ ].join('|');
+
+ return new RegExp(pattern, onlyFirst ? undefined : 'g');
+}
+
+function stripAnsi(string) {
+ if (typeof string !== 'string') {
+ throw new TypeError(`Expected a \`string\`, got \`${typeof string}\``);
+ }
+
+ return string.replace(ansiRegex(), '');
+}
+
+const detectDefaultShell = () => {
+ const {env} = process$2;
+
+ if (process$2.platform === 'win32') {
+ return env.COMSPEC || 'cmd.exe';
+ }
+
+ try {
+ const {shell} = node_os.userInfo();
+ if (shell) {
+ return shell;
+ }
+ } catch {}
+
+ if (process$2.platform === 'darwin') {
+ return env.SHELL || '/bin/zsh';
+ }
+
+ return env.SHELL || '/bin/sh';
+};
+
+// Stores default shell when imported.
+const defaultShell = detectDefaultShell();
+
+const args = [
+ '-ilc',
+ 'echo -n "_SHELL_ENV_DELIMITER_"; env; echo -n "_SHELL_ENV_DELIMITER_"; exit',
+];
+
+const env = {
+ // Disables Oh My Zsh auto-update thing that can block the process.
+ DISABLE_AUTO_UPDATE: 'true',
+};
+
+const parseEnv = env => {
+ env = env.split('_SHELL_ENV_DELIMITER_')[1];
+ const returnValue = {};
+
+ for (const line of stripAnsi(env).split('\n').filter(line => Boolean(line))) {
+ const [key, ...values] = line.split('=');
+ returnValue[key] = values.join('=');
+ }
+
+ return returnValue;
+};
+
+function shellEnvSync(shell) {
+ if (process$2.platform === 'win32') {
+ return process$2.env;
+ }
+
+ try {
+ const {stdout} = execa$1.sync(shell || defaultShell, args, {env});
+ return parseEnv(stdout);
+ } catch (error) {
+ if (shell) {
+ throw error;
+ } else {
+ return process$2.env;
+ }
+ }
+}
+
+function shellPathSync() {
+ const {PATH} = shellEnvSync();
+ return PATH;
+}
+
+function fixPath() {
+ if (process$2.platform === 'win32') {
+ return;
+ }
+
+ process$2.env.PATH = shellPathSync() || [
+ './node_modules/.bin',
+ '/.nodebrew/current/bin',
+ '/usr/local/bin',
+ process$2.env.PATH,
+ ].join(':');
+}
+
+var lib = {};
+
+var readable = {exports: {}};
+
+var stream;
+var hasRequiredStream;
+
+function requireStream () {
+ if (hasRequiredStream) return stream;
+ hasRequiredStream = 1;
+ stream = require$$0$5;
+ return stream;
+}
+
+var buffer_list;
+var hasRequiredBuffer_list;
+
+function requireBuffer_list () {
+ if (hasRequiredBuffer_list) return buffer_list;
+ hasRequiredBuffer_list = 1;
+
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
+ var _require = require$$0$6,
+ Buffer = _require.Buffer;
+ var _require2 = require$$2$1,
+ inspect = _require2.inspect;
+ var custom = inspect && inspect.custom || 'inspect';
+ function copyBuffer(src, target, offset) {
+ Buffer.prototype.copy.call(src, target, offset);
+ }
+ buffer_list = /*#__PURE__*/function () {
+ function BufferList() {
+ _classCallCheck(this, BufferList);
+ this.head = null;
+ this.tail = null;
+ this.length = 0;
+ }
+ _createClass(BufferList, [{
+ key: "push",
+ value: function push(v) {
+ var entry = {
+ data: v,
+ next: null
+ };
+ if (this.length > 0) this.tail.next = entry;else this.head = entry;
+ this.tail = entry;
+ ++this.length;
+ }
+ }, {
+ key: "unshift",
+ value: function unshift(v) {
+ var entry = {
+ data: v,
+ next: this.head
+ };
+ if (this.length === 0) this.tail = entry;
+ this.head = entry;
+ ++this.length;
+ }
+ }, {
+ key: "shift",
+ value: function shift() {
+ if (this.length === 0) return;
+ var ret = this.head.data;
+ if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;
+ --this.length;
+ return ret;
+ }
+ }, {
+ key: "clear",
+ value: function clear() {
+ this.head = this.tail = null;
+ this.length = 0;
+ }
+ }, {
+ key: "join",
+ value: function join(s) {
+ if (this.length === 0) return '';
+ var p = this.head;
+ var ret = '' + p.data;
+ while (p = p.next) ret += s + p.data;
+ return ret;
+ }
+ }, {
+ key: "concat",
+ value: function concat(n) {
+ if (this.length === 0) return Buffer.alloc(0);
+ var ret = Buffer.allocUnsafe(n >>> 0);
+ var p = this.head;
+ var i = 0;
+ while (p) {
+ copyBuffer(p.data, ret, i);
+ i += p.data.length;
+ p = p.next;
+ }
+ return ret;
+ }
+
+ // Consumes a specified amount of bytes or characters from the buffered data.
+ }, {
+ key: "consume",
+ value: function consume(n, hasStrings) {
+ var ret;
+ if (n < this.head.data.length) {
+ // `slice` is the same for buffers and strings.
+ ret = this.head.data.slice(0, n);
+ this.head.data = this.head.data.slice(n);
+ } else if (n === this.head.data.length) {
+ // First chunk is a perfect match.
+ ret = this.shift();
+ } else {
+ // Result spans more than one buffer.
+ ret = hasStrings ? this._getString(n) : this._getBuffer(n);
+ }
+ return ret;
+ }
+ }, {
+ key: "first",
+ value: function first() {
+ return this.head.data;
+ }
+
+ // Consumes a specified amount of characters from the buffered data.
+ }, {
+ key: "_getString",
+ value: function _getString(n) {
+ var p = this.head;
+ var c = 1;
+ var ret = p.data;
+ n -= ret.length;
+ while (p = p.next) {
+ var str = p.data;
+ var nb = n > str.length ? str.length : n;
+ if (nb === str.length) ret += str;else ret += str.slice(0, n);
+ n -= nb;
+ if (n === 0) {
+ if (nb === str.length) {
+ ++c;
+ if (p.next) this.head = p.next;else this.head = this.tail = null;
+ } else {
+ this.head = p;
+ p.data = str.slice(nb);
+ }
+ break;
+ }
+ ++c;
+ }
+ this.length -= c;
+ return ret;
+ }
+
+ // Consumes a specified amount of bytes from the buffered data.
+ }, {
+ key: "_getBuffer",
+ value: function _getBuffer(n) {
+ var ret = Buffer.allocUnsafe(n);
+ var p = this.head;
+ var c = 1;
+ p.data.copy(ret);
+ n -= p.data.length;
+ while (p = p.next) {
+ var buf = p.data;
+ var nb = n > buf.length ? buf.length : n;
+ buf.copy(ret, ret.length - n, 0, nb);
+ n -= nb;
+ if (n === 0) {
+ if (nb === buf.length) {
+ ++c;
+ if (p.next) this.head = p.next;else this.head = this.tail = null;
+ } else {
+ this.head = p;
+ p.data = buf.slice(nb);
+ }
+ break;
+ }
+ ++c;
+ }
+ this.length -= c;
+ return ret;
+ }
+
+ // Make sure the linked list only shows the minimal necessary information.
+ }, {
+ key: custom,
+ value: function value(_, options) {
+ return inspect(this, _objectSpread(_objectSpread({}, options), {}, {
+ // Only inspect one level.
+ depth: 0,
+ // It should not recurse.
+ customInspect: false
+ }));
+ }
+ }]);
+ return BufferList;
+ }();
+ return buffer_list;
+}
+
+var destroy_1;
+var hasRequiredDestroy;
+
+function requireDestroy () {
+ if (hasRequiredDestroy) return destroy_1;
+ hasRequiredDestroy = 1;
+
+ // undocumented cb() API, needed for core, not for public API
+ function destroy(err, cb) {
+ var _this = this;
+ var readableDestroyed = this._readableState && this._readableState.destroyed;
+ var writableDestroyed = this._writableState && this._writableState.destroyed;
+ if (readableDestroyed || writableDestroyed) {
+ if (cb) {
+ cb(err);
+ } else if (err) {
+ if (!this._writableState) {
+ process.nextTick(emitErrorNT, this, err);
+ } else if (!this._writableState.errorEmitted) {
+ this._writableState.errorEmitted = true;
+ process.nextTick(emitErrorNT, this, err);
+ }
+ }
+ return this;
+ }
+
+ // we set destroyed to true before firing error callbacks in order
+ // to make it re-entrance safe in case destroy() is called within callbacks
+
+ if (this._readableState) {
+ this._readableState.destroyed = true;
+ }
+
+ // if this is a duplex stream mark the writable part as destroyed as well
+ if (this._writableState) {
+ this._writableState.destroyed = true;
+ }
+ this._destroy(err || null, function (err) {
+ if (!cb && err) {
+ if (!_this._writableState) {
+ process.nextTick(emitErrorAndCloseNT, _this, err);
+ } else if (!_this._writableState.errorEmitted) {
+ _this._writableState.errorEmitted = true;
+ process.nextTick(emitErrorAndCloseNT, _this, err);
+ } else {
+ process.nextTick(emitCloseNT, _this);
+ }
+ } else if (cb) {
+ process.nextTick(emitCloseNT, _this);
+ cb(err);
+ } else {
+ process.nextTick(emitCloseNT, _this);
+ }
+ });
+ return this;
+ }
+ function emitErrorAndCloseNT(self, err) {
+ emitErrorNT(self, err);
+ emitCloseNT(self);
+ }
+ function emitCloseNT(self) {
+ if (self._writableState && !self._writableState.emitClose) return;
+ if (self._readableState && !self._readableState.emitClose) return;
+ self.emit('close');
+ }
+ function undestroy() {
+ if (this._readableState) {
+ this._readableState.destroyed = false;
+ this._readableState.reading = false;
+ this._readableState.ended = false;
+ this._readableState.endEmitted = false;
+ }
+ if (this._writableState) {
+ this._writableState.destroyed = false;
+ this._writableState.ended = false;
+ this._writableState.ending = false;
+ this._writableState.finalCalled = false;
+ this._writableState.prefinished = false;
+ this._writableState.finished = false;
+ this._writableState.errorEmitted = false;
+ }
+ }
+ function emitErrorNT(self, err) {
+ self.emit('error', err);
+ }
+ function errorOrDestroy(stream, err) {
+ // We have tests that rely on errors being emitted
+ // in the same tick, so changing this is semver major.
+ // For now when you opt-in to autoDestroy we allow
+ // the error to be emitted nextTick. In a future
+ // semver major update we should change the default to this.
+
+ var rState = stream._readableState;
+ var wState = stream._writableState;
+ if (rState && rState.autoDestroy || wState && wState.autoDestroy) stream.destroy(err);else stream.emit('error', err);
+ }
+ destroy_1 = {
+ destroy: destroy,
+ undestroy: undestroy,
+ errorOrDestroy: errorOrDestroy
+ };
+ return destroy_1;
+}
+
+var errors = {};
+
+var hasRequiredErrors;
+
+function requireErrors () {
+ if (hasRequiredErrors) return errors;
+ hasRequiredErrors = 1;
+
+ const codes = {};
+
+ function createErrorType(code, message, Base) {
+ if (!Base) {
+ Base = Error;
+ }
+
+ function getMessage (arg1, arg2, arg3) {
+ if (typeof message === 'string') {
+ return message
+ } else {
+ return message(arg1, arg2, arg3)
+ }
+ }
+
+ class NodeError extends Base {
+ constructor (arg1, arg2, arg3) {
+ super(getMessage(arg1, arg2, arg3));
+ }
+ }
+
+ NodeError.prototype.name = Base.name;
+ NodeError.prototype.code = code;
+
+ codes[code] = NodeError;
+ }
+
+ // https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js
+ function oneOf(expected, thing) {
+ if (Array.isArray(expected)) {
+ const len = expected.length;
+ expected = expected.map((i) => String(i));
+ if (len > 2) {
+ return `one of ${thing} ${expected.slice(0, len - 1).join(', ')}, or ` +
+ expected[len - 1];
+ } else if (len === 2) {
+ return `one of ${thing} ${expected[0]} or ${expected[1]}`;
+ } else {
+ return `of ${thing} ${expected[0]}`;
+ }
+ } else {
+ return `of ${thing} ${String(expected)}`;
+ }
+ }
+
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith
+ function startsWith(str, search, pos) {
+ return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search;
+ }
+
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
+ function endsWith(str, search, this_len) {
+ if (this_len === undefined || this_len > str.length) {
+ this_len = str.length;
+ }
+ return str.substring(this_len - search.length, this_len) === search;
+ }
+
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes
+ function includes(str, search, start) {
+ if (typeof start !== 'number') {
+ start = 0;
+ }
+
+ if (start + search.length > str.length) {
+ return false;
+ } else {
+ return str.indexOf(search, start) !== -1;
+ }
+ }
+
+ createErrorType('ERR_INVALID_OPT_VALUE', function (name, value) {
+ return 'The value "' + value + '" is invalid for option "' + name + '"'
+ }, TypeError);
+ createErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) {
+ // determiner: 'must be' or 'must not be'
+ let determiner;
+ if (typeof expected === 'string' && startsWith(expected, 'not ')) {
+ determiner = 'must not be';
+ expected = expected.replace(/^not /, '');
+ } else {
+ determiner = 'must be';
+ }
+
+ let msg;
+ if (endsWith(name, ' argument')) {
+ // For cases like 'first argument'
+ msg = `The ${name} ${determiner} ${oneOf(expected, 'type')}`;
+ } else {
+ const type = includes(name, '.') ? 'property' : 'argument';
+ msg = `The "${name}" ${type} ${determiner} ${oneOf(expected, 'type')}`;
+ }
+
+ msg += `. Received type ${typeof actual}`;
+ return msg;
+ }, TypeError);
+ createErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF');
+ createErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (name) {
+ return 'The ' + name + ' method is not implemented'
+ });
+ createErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close');
+ createErrorType('ERR_STREAM_DESTROYED', function (name) {
+ return 'Cannot call ' + name + ' after a stream was destroyed';
+ });
+ createErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times');
+ createErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable');
+ createErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end');
+ createErrorType('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError);
+ createErrorType('ERR_UNKNOWN_ENCODING', function (arg) {
+ return 'Unknown encoding: ' + arg
+ }, TypeError);
+ createErrorType('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event');
+
+ errors.codes = codes;
+ return errors;
+}
+
+var state;
+var hasRequiredState;
+
+function requireState () {
+ if (hasRequiredState) return state;
+ hasRequiredState = 1;
+
+ var ERR_INVALID_OPT_VALUE = requireErrors().codes.ERR_INVALID_OPT_VALUE;
+ function highWaterMarkFrom(options, isDuplex, duplexKey) {
+ return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null;
+ }
+ function getHighWaterMark(state, options, duplexKey, isDuplex) {
+ var hwm = highWaterMarkFrom(options, isDuplex, duplexKey);
+ if (hwm != null) {
+ if (!(isFinite(hwm) && Math.floor(hwm) === hwm) || hwm < 0) {
+ var name = isDuplex ? duplexKey : 'highWaterMark';
+ throw new ERR_INVALID_OPT_VALUE(name, hwm);
+ }
+ return Math.floor(hwm);
+ }
+
+ // Default value
+ return state.objectMode ? 16 : 16 * 1024;
+ }
+ state = {
+ getHighWaterMark: getHighWaterMark
+ };
+ return state;
+}
+
+var inherits = {exports: {}};
+
+var inherits_browser = {exports: {}};
+
+var hasRequiredInherits_browser;
+
+function requireInherits_browser () {
+ if (hasRequiredInherits_browser) return inherits_browser.exports;
+ hasRequiredInherits_browser = 1;
+ if (typeof Object.create === 'function') {
+ // implementation from standard node.js 'util' module
+ inherits_browser.exports = function inherits(ctor, superCtor) {
+ if (superCtor) {
+ ctor.super_ = superCtor;
+ ctor.prototype = Object.create(superCtor.prototype, {
+ constructor: {
+ value: ctor,
+ enumerable: false,
+ writable: true,
+ configurable: true
+ }
+ });
+ }
+ };
+ } else {
+ // old school shim for old browsers
+ inherits_browser.exports = function inherits(ctor, superCtor) {
+ if (superCtor) {
+ ctor.super_ = superCtor;
+ var TempCtor = function () {};
+ TempCtor.prototype = superCtor.prototype;
+ ctor.prototype = new TempCtor();
+ ctor.prototype.constructor = ctor;
+ }
+ };
+ }
+ return inherits_browser.exports;
+}
+
+var hasRequiredInherits;
+
+function requireInherits () {
+ if (hasRequiredInherits) return inherits.exports;
+ hasRequiredInherits = 1;
+ try {
+ var util = require('util');
+ /* istanbul ignore next */
+ if (typeof util.inherits !== 'function') throw '';
+ inherits.exports = util.inherits;
+ } catch (e) {
+ /* istanbul ignore next */
+ inherits.exports = requireInherits_browser();
+ }
+ return inherits.exports;
+}
+
+var node;
+var hasRequiredNode;
+
+function requireNode () {
+ if (hasRequiredNode) return node;
+ hasRequiredNode = 1;
+ /**
+ * For Node.js, simply re-export the core `util.deprecate` function.
+ */
+
+ node = require$$2$1.deprecate;
+ return node;
+}
+
+var _stream_writable;
+var hasRequired_stream_writable;
+
+function require_stream_writable () {
+ if (hasRequired_stream_writable) return _stream_writable;
+ hasRequired_stream_writable = 1;
+
+ _stream_writable = Writable;
+
+ // It seems a linked list but it is not
+ // there will be only 2 of these for each stream
+ function CorkedRequest(state) {
+ var _this = this;
+ this.next = null;
+ this.entry = null;
+ this.finish = function () {
+ onCorkedFinish(_this, state);
+ };
+ }
+ /* */
+
+ /**/
+ var Duplex;
+ /**/
+
+ Writable.WritableState = WritableState;
+
+ /**/
+ var internalUtil = {
+ deprecate: requireNode()
+ };
+ /**/
+
+ /**/
+ var Stream = requireStream();
+ /**/
+
+ var Buffer = require$$0$6.Buffer;
+ var OurUint8Array = (typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {};
+ function _uint8ArrayToBuffer(chunk) {
+ return Buffer.from(chunk);
+ }
+ function _isUint8Array(obj) {
+ return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
+ }
+ var destroyImpl = requireDestroy();
+ var _require = requireState(),
+ getHighWaterMark = _require.getHighWaterMark;
+ var _require$codes = requireErrors().codes,
+ ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,
+ ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,
+ ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK,
+ ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE,
+ ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED,
+ ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES,
+ ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END,
+ ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING;
+ var errorOrDestroy = destroyImpl.errorOrDestroy;
+ requireInherits()(Writable, Stream);
+ function nop() {}
+ function WritableState(options, stream, isDuplex) {
+ Duplex = Duplex || require_stream_duplex();
+ options = options || {};
+
+ // Duplex streams are both readable and writable, but share
+ // the same options object.
+ // However, some cases require setting options to different
+ // values for the readable and the writable sides of the duplex stream,
+ // e.g. options.readableObjectMode vs. options.writableObjectMode, etc.
+ if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex;
+
+ // object stream flag to indicate whether or not this stream
+ // contains buffers or objects.
+ this.objectMode = !!options.objectMode;
+ if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode;
+
+ // the point at which write() starts returning false
+ // Note: 0 is a valid value, means that we always return false if
+ // the entire buffer is not flushed immediately on write()
+ this.highWaterMark = getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex);
+
+ // if _final has been called
+ this.finalCalled = false;
+
+ // drain event flag.
+ this.needDrain = false;
+ // at the start of calling end()
+ this.ending = false;
+ // when end() has been called, and returned
+ this.ended = false;
+ // when 'finish' is emitted
+ this.finished = false;
+
+ // has it been destroyed
+ this.destroyed = false;
+
+ // should we decode strings into buffers before passing to _write?
+ // this is here so that some node-core streams can optimize string
+ // handling at a lower level.
+ var noDecode = options.decodeStrings === false;
+ this.decodeStrings = !noDecode;
+
+ // Crypto is kind of old and crusty. Historically, its default string
+ // encoding is 'binary' so we have to make this configurable.
+ // Everything else in the universe uses 'utf8', though.
+ this.defaultEncoding = options.defaultEncoding || 'utf8';
+
+ // not an actual buffer we keep track of, but a measurement
+ // of how much we're waiting to get pushed to some underlying
+ // socket or file.
+ this.length = 0;
+
+ // a flag to see when we're in the middle of a write.
+ this.writing = false;
+
+ // when true all writes will be buffered until .uncork() call
+ this.corked = 0;
+
+ // a flag to be able to tell if the onwrite cb is called immediately,
+ // or on a later tick. We set this to true at first, because any
+ // actions that shouldn't happen until "later" should generally also
+ // not happen before the first write call.
+ this.sync = true;
+
+ // a flag to know if we're processing previously buffered items, which
+ // may call the _write() callback in the same tick, so that we don't
+ // end up in an overlapped onwrite situation.
+ this.bufferProcessing = false;
+
+ // the callback that's passed to _write(chunk,cb)
+ this.onwrite = function (er) {
+ onwrite(stream, er);
+ };
+
+ // the callback that the user supplies to write(chunk,encoding,cb)
+ this.writecb = null;
+
+ // the amount that is being written when _write is called.
+ this.writelen = 0;
+ this.bufferedRequest = null;
+ this.lastBufferedRequest = null;
+
+ // number of pending user-supplied write callbacks
+ // this must be 0 before 'finish' can be emitted
+ this.pendingcb = 0;
+
+ // emit prefinish if the only thing we're waiting for is _write cbs
+ // This is relevant for synchronous Transform streams
+ this.prefinished = false;
+
+ // True if the error was already emitted and should not be thrown again
+ this.errorEmitted = false;
+
+ // Should close be emitted on destroy. Defaults to true.
+ this.emitClose = options.emitClose !== false;
+
+ // Should .destroy() be called after 'finish' (and potentially 'end')
+ this.autoDestroy = !!options.autoDestroy;
+
+ // count buffered requests
+ this.bufferedRequestCount = 0;
+
+ // allocate the first CorkedRequest, there is always
+ // one allocated and free to use, and we maintain at most two
+ this.corkedRequestsFree = new CorkedRequest(this);
+ }
+ WritableState.prototype.getBuffer = function getBuffer() {
+ var current = this.bufferedRequest;
+ var out = [];
+ while (current) {
+ out.push(current);
+ current = current.next;
+ }
+ return out;
+ };
+ (function () {
+ try {
+ Object.defineProperty(WritableState.prototype, 'buffer', {
+ get: internalUtil.deprecate(function writableStateBufferGetter() {
+ return this.getBuffer();
+ }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')
+ });
+ } catch (_) {}
+ })();
+
+ // Test _writableState for inheritance to account for Duplex streams,
+ // whose prototype chain only points to Readable.
+ var realHasInstance;
+ if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {
+ realHasInstance = Function.prototype[Symbol.hasInstance];
+ Object.defineProperty(Writable, Symbol.hasInstance, {
+ value: function value(object) {
+ if (realHasInstance.call(this, object)) return true;
+ if (this !== Writable) return false;
+ return object && object._writableState instanceof WritableState;
+ }
+ });
+ } else {
+ realHasInstance = function realHasInstance(object) {
+ return object instanceof this;
+ };
+ }
+ function Writable(options) {
+ Duplex = Duplex || require_stream_duplex();
+
+ // Writable ctor is applied to Duplexes, too.
+ // `realHasInstance` is necessary because using plain `instanceof`
+ // would return false, as no `_writableState` property is attached.
+
+ // Trying to use the custom `instanceof` for Writable here will also break the
+ // Node.js LazyTransform implementation, which has a non-trivial getter for
+ // `_writableState` that would lead to infinite recursion.
+
+ // Checking for a Stream.Duplex instance is faster here instead of inside
+ // the WritableState constructor, at least with V8 6.5
+ var isDuplex = this instanceof Duplex;
+ if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options);
+ this._writableState = new WritableState(options, this, isDuplex);
+
+ // legacy.
+ this.writable = true;
+ if (options) {
+ if (typeof options.write === 'function') this._write = options.write;
+ if (typeof options.writev === 'function') this._writev = options.writev;
+ if (typeof options.destroy === 'function') this._destroy = options.destroy;
+ if (typeof options.final === 'function') this._final = options.final;
+ }
+ Stream.call(this);
+ }
+
+ // Otherwise people can pipe Writable streams, which is just wrong.
+ Writable.prototype.pipe = function () {
+ errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE());
+ };
+ function writeAfterEnd(stream, cb) {
+ var er = new ERR_STREAM_WRITE_AFTER_END();
+ // TODO: defer error events consistently everywhere, not just the cb
+ errorOrDestroy(stream, er);
+ process.nextTick(cb, er);
+ }
+
+ // Checks that a user-supplied chunk is valid, especially for the particular
+ // mode the stream is in. Currently this means that `null` is never accepted
+ // and undefined/non-string values are only allowed in object mode.
+ function validChunk(stream, state, chunk, cb) {
+ var er;
+ if (chunk === null) {
+ er = new ERR_STREAM_NULL_VALUES();
+ } else if (typeof chunk !== 'string' && !state.objectMode) {
+ er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk);
+ }
+ if (er) {
+ errorOrDestroy(stream, er);
+ process.nextTick(cb, er);
+ return false;
+ }
+ return true;
+ }
+ Writable.prototype.write = function (chunk, encoding, cb) {
+ var state = this._writableState;
+ var ret = false;
+ var isBuf = !state.objectMode && _isUint8Array(chunk);
+ if (isBuf && !Buffer.isBuffer(chunk)) {
+ chunk = _uint8ArrayToBuffer(chunk);
+ }
+ if (typeof encoding === 'function') {
+ cb = encoding;
+ encoding = null;
+ }
+ if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;
+ if (typeof cb !== 'function') cb = nop;
+ if (state.ending) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {
+ state.pendingcb++;
+ ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);
+ }
+ return ret;
+ };
+ Writable.prototype.cork = function () {
+ this._writableState.corked++;
+ };
+ Writable.prototype.uncork = function () {
+ var state = this._writableState;
+ if (state.corked) {
+ state.corked--;
+ if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
+ }
+ };
+ Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
+ // node::ParseEncoding() requires lower case.
+ if (typeof encoding === 'string') encoding = encoding.toLowerCase();
+ if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new ERR_UNKNOWN_ENCODING(encoding);
+ this._writableState.defaultEncoding = encoding;
+ return this;
+ };
+ Object.defineProperty(Writable.prototype, 'writableBuffer', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function get() {
+ return this._writableState && this._writableState.getBuffer();
+ }
+ });
+ function decodeChunk(state, chunk, encoding) {
+ if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
+ chunk = Buffer.from(chunk, encoding);
+ }
+ return chunk;
+ }
+ Object.defineProperty(Writable.prototype, 'writableHighWaterMark', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function get() {
+ return this._writableState.highWaterMark;
+ }
+ });
+
+ // if we're already writing something, then just put this
+ // in the queue, and wait our turn. Otherwise, call _write
+ // If we return false, then we need a drain event, so set that flag.
+ function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {
+ if (!isBuf) {
+ var newChunk = decodeChunk(state, chunk, encoding);
+ if (chunk !== newChunk) {
+ isBuf = true;
+ encoding = 'buffer';
+ chunk = newChunk;
+ }
+ }
+ var len = state.objectMode ? 1 : chunk.length;
+ state.length += len;
+ var ret = state.length < state.highWaterMark;
+ // we must ensure that previous needDrain will not be reset to false.
+ if (!ret) state.needDrain = true;
+ if (state.writing || state.corked) {
+ var last = state.lastBufferedRequest;
+ state.lastBufferedRequest = {
+ chunk: chunk,
+ encoding: encoding,
+ isBuf: isBuf,
+ callback: cb,
+ next: null
+ };
+ if (last) {
+ last.next = state.lastBufferedRequest;
+ } else {
+ state.bufferedRequest = state.lastBufferedRequest;
+ }
+ state.bufferedRequestCount += 1;
+ } else {
+ doWrite(stream, state, false, len, chunk, encoding, cb);
+ }
+ return ret;
+ }
+ function doWrite(stream, state, writev, len, chunk, encoding, cb) {
+ state.writelen = len;
+ state.writecb = cb;
+ state.writing = true;
+ state.sync = true;
+ if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED('write'));else if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
+ state.sync = false;
+ }
+ function onwriteError(stream, state, sync, er, cb) {
+ --state.pendingcb;
+ if (sync) {
+ // defer the callback if we are being called synchronously
+ // to avoid piling up things on the stack
+ process.nextTick(cb, er);
+ // this can emit finish, and it will always happen
+ // after error
+ process.nextTick(finishMaybe, stream, state);
+ stream._writableState.errorEmitted = true;
+ errorOrDestroy(stream, er);
+ } else {
+ // the caller expect this to happen before if
+ // it is async
+ cb(er);
+ stream._writableState.errorEmitted = true;
+ errorOrDestroy(stream, er);
+ // this can emit finish, but finish must
+ // always follow error
+ finishMaybe(stream, state);
+ }
+ }
+ function onwriteStateUpdate(state) {
+ state.writing = false;
+ state.writecb = null;
+ state.length -= state.writelen;
+ state.writelen = 0;
+ }
+ function onwrite(stream, er) {
+ var state = stream._writableState;
+ var sync = state.sync;
+ var cb = state.writecb;
+ if (typeof cb !== 'function') throw new ERR_MULTIPLE_CALLBACK();
+ onwriteStateUpdate(state);
+ if (er) onwriteError(stream, state, sync, er, cb);else {
+ // Check if we're actually ready to finish, but don't emit yet
+ var finished = needFinish(state) || stream.destroyed;
+ if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
+ clearBuffer(stream, state);
+ }
+ if (sync) {
+ process.nextTick(afterWrite, stream, state, finished, cb);
+ } else {
+ afterWrite(stream, state, finished, cb);
+ }
+ }
+ }
+ function afterWrite(stream, state, finished, cb) {
+ if (!finished) onwriteDrain(stream, state);
+ state.pendingcb--;
+ cb();
+ finishMaybe(stream, state);
+ }
+
+ // Must force callback to be called on nextTick, so that we don't
+ // emit 'drain' before the write() consumer gets the 'false' return
+ // value, and has a chance to attach a 'drain' listener.
+ function onwriteDrain(stream, state) {
+ if (state.length === 0 && state.needDrain) {
+ state.needDrain = false;
+ stream.emit('drain');
+ }
+ }
+
+ // if there's something in the buffer waiting, then process it
+ function clearBuffer(stream, state) {
+ state.bufferProcessing = true;
+ var entry = state.bufferedRequest;
+ if (stream._writev && entry && entry.next) {
+ // Fast case, write everything using _writev()
+ var l = state.bufferedRequestCount;
+ var buffer = new Array(l);
+ var holder = state.corkedRequestsFree;
+ holder.entry = entry;
+ var count = 0;
+ var allBuffers = true;
+ while (entry) {
+ buffer[count] = entry;
+ if (!entry.isBuf) allBuffers = false;
+ entry = entry.next;
+ count += 1;
+ }
+ buffer.allBuffers = allBuffers;
+ doWrite(stream, state, true, state.length, buffer, '', holder.finish);
+
+ // doWrite is almost always async, defer these to save a bit of time
+ // as the hot path ends with doWrite
+ state.pendingcb++;
+ state.lastBufferedRequest = null;
+ if (holder.next) {
+ state.corkedRequestsFree = holder.next;
+ holder.next = null;
+ } else {
+ state.corkedRequestsFree = new CorkedRequest(state);
+ }
+ state.bufferedRequestCount = 0;
+ } else {
+ // Slow case, write chunks one-by-one
+ while (entry) {
+ var chunk = entry.chunk;
+ var encoding = entry.encoding;
+ var cb = entry.callback;
+ var len = state.objectMode ? 1 : chunk.length;
+ doWrite(stream, state, false, len, chunk, encoding, cb);
+ entry = entry.next;
+ state.bufferedRequestCount--;
+ // if we didn't call the onwrite immediately, then
+ // it means that we need to wait until it does.
+ // also, that means that the chunk and cb are currently
+ // being processed, so move the buffer counter past them.
+ if (state.writing) {
+ break;
+ }
+ }
+ if (entry === null) state.lastBufferedRequest = null;
+ }
+ state.bufferedRequest = entry;
+ state.bufferProcessing = false;
+ }
+ Writable.prototype._write = function (chunk, encoding, cb) {
+ cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()'));
+ };
+ Writable.prototype._writev = null;
+ Writable.prototype.end = function (chunk, encoding, cb) {
+ var state = this._writableState;
+ if (typeof chunk === 'function') {
+ cb = chunk;
+ chunk = null;
+ encoding = null;
+ } else if (typeof encoding === 'function') {
+ cb = encoding;
+ encoding = null;
+ }
+ if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);
+
+ // .end() fully uncorks
+ if (state.corked) {
+ state.corked = 1;
+ this.uncork();
+ }
+
+ // ignore unnecessary end() calls.
+ if (!state.ending) endWritable(this, state, cb);
+ return this;
+ };
+ Object.defineProperty(Writable.prototype, 'writableLength', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function get() {
+ return this._writableState.length;
+ }
+ });
+ function needFinish(state) {
+ return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
+ }
+ function callFinal(stream, state) {
+ stream._final(function (err) {
+ state.pendingcb--;
+ if (err) {
+ errorOrDestroy(stream, err);
+ }
+ state.prefinished = true;
+ stream.emit('prefinish');
+ finishMaybe(stream, state);
+ });
+ }
+ function prefinish(stream, state) {
+ if (!state.prefinished && !state.finalCalled) {
+ if (typeof stream._final === 'function' && !state.destroyed) {
+ state.pendingcb++;
+ state.finalCalled = true;
+ process.nextTick(callFinal, stream, state);
+ } else {
+ state.prefinished = true;
+ stream.emit('prefinish');
+ }
+ }
+ }
+ function finishMaybe(stream, state) {
+ var need = needFinish(state);
+ if (need) {
+ prefinish(stream, state);
+ if (state.pendingcb === 0) {
+ state.finished = true;
+ stream.emit('finish');
+ if (state.autoDestroy) {
+ // In case of duplex streams we need a way to detect
+ // if the readable side is ready for autoDestroy as well
+ var rState = stream._readableState;
+ if (!rState || rState.autoDestroy && rState.endEmitted) {
+ stream.destroy();
+ }
+ }
+ }
+ }
+ return need;
+ }
+ function endWritable(stream, state, cb) {
+ state.ending = true;
+ finishMaybe(stream, state);
+ if (cb) {
+ if (state.finished) process.nextTick(cb);else stream.once('finish', cb);
+ }
+ state.ended = true;
+ stream.writable = false;
+ }
+ function onCorkedFinish(corkReq, state, err) {
+ var entry = corkReq.entry;
+ corkReq.entry = null;
+ while (entry) {
+ var cb = entry.callback;
+ state.pendingcb--;
+ cb(err);
+ entry = entry.next;
+ }
+
+ // reuse the free corkReq.
+ state.corkedRequestsFree.next = corkReq;
+ }
+ Object.defineProperty(Writable.prototype, 'destroyed', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function get() {
+ if (this._writableState === undefined) {
+ return false;
+ }
+ return this._writableState.destroyed;
+ },
+ set: function set(value) {
+ // we ignore the value if the stream
+ // has not been initialized yet
+ if (!this._writableState) {
+ return;
+ }
+
+ // backward compatibility, the user is explicitly
+ // managing destroyed
+ this._writableState.destroyed = value;
+ }
+ });
+ Writable.prototype.destroy = destroyImpl.destroy;
+ Writable.prototype._undestroy = destroyImpl.undestroy;
+ Writable.prototype._destroy = function (err, cb) {
+ cb(err);
+ };
+ return _stream_writable;
+}
+
+var _stream_duplex;
+var hasRequired_stream_duplex;
+
+function require_stream_duplex () {
+ if (hasRequired_stream_duplex) return _stream_duplex;
+ hasRequired_stream_duplex = 1;
+
+ /**/
+ var objectKeys = Object.keys || function (obj) {
+ var keys = [];
+ for (var key in obj) keys.push(key);
+ return keys;
+ };
+ /**/
+
+ _stream_duplex = Duplex;
+ var Readable = require_stream_readable();
+ var Writable = require_stream_writable();
+ requireInherits()(Duplex, Readable);
+ {
+ // Allow the keys array to be GC'ed.
+ var keys = objectKeys(Writable.prototype);
+ for (var v = 0; v < keys.length; v++) {
+ var method = keys[v];
+ if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
+ }
+ }
+ function Duplex(options) {
+ if (!(this instanceof Duplex)) return new Duplex(options);
+ Readable.call(this, options);
+ Writable.call(this, options);
+ this.allowHalfOpen = true;
+ if (options) {
+ if (options.readable === false) this.readable = false;
+ if (options.writable === false) this.writable = false;
+ if (options.allowHalfOpen === false) {
+ this.allowHalfOpen = false;
+ this.once('end', onend);
+ }
+ }
+ }
+ Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function get() {
+ return this._writableState.highWaterMark;
+ }
+ });
+ Object.defineProperty(Duplex.prototype, 'writableBuffer', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function get() {
+ return this._writableState && this._writableState.getBuffer();
+ }
+ });
+ Object.defineProperty(Duplex.prototype, 'writableLength', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function get() {
+ return this._writableState.length;
+ }
+ });
+
+ // the no-half-open enforcer
+ function onend() {
+ // If the writable side ended, then we're ok.
+ if (this._writableState.ended) return;
+
+ // no more data can be written.
+ // But allow more writes to happen in this tick.
+ process.nextTick(onEndNT, this);
+ }
+ function onEndNT(self) {
+ self.end();
+ }
+ Object.defineProperty(Duplex.prototype, 'destroyed', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function get() {
+ if (this._readableState === undefined || this._writableState === undefined) {
+ return false;
+ }
+ return this._readableState.destroyed && this._writableState.destroyed;
+ },
+ set: function set(value) {
+ // we ignore the value if the stream
+ // has not been initialized yet
+ if (this._readableState === undefined || this._writableState === undefined) {
+ return;
+ }
+
+ // backward compatibility, the user is explicitly
+ // managing destroyed
+ this._readableState.destroyed = value;
+ this._writableState.destroyed = value;
+ }
+ });
+ return _stream_duplex;
+}
+
+var string_decoder = {};
+
+var safeBuffer = {exports: {}};
+
+/*! safe-buffer. MIT License. Feross Aboukhadijeh */
+
+var hasRequiredSafeBuffer;
+
+function requireSafeBuffer () {
+ if (hasRequiredSafeBuffer) return safeBuffer.exports;
+ hasRequiredSafeBuffer = 1;
+ (function (module, exports) {
+ /* eslint-disable node/no-deprecated-api */
+ var buffer = require$$0$6;
+ var Buffer = buffer.Buffer;
+
+ // alternative to using Object.keys for old browsers
+ function copyProps (src, dst) {
+ for (var key in src) {
+ dst[key] = src[key];
+ }
+ }
+ if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
+ module.exports = buffer;
+ } else {
+ // Copy properties from require('buffer')
+ copyProps(buffer, exports);
+ exports.Buffer = SafeBuffer;
+ }
+
+ function SafeBuffer (arg, encodingOrOffset, length) {
+ return Buffer(arg, encodingOrOffset, length)
+ }
+
+ SafeBuffer.prototype = Object.create(Buffer.prototype);
+
+ // Copy static methods from Buffer
+ copyProps(Buffer, SafeBuffer);
+
+ SafeBuffer.from = function (arg, encodingOrOffset, length) {
+ if (typeof arg === 'number') {
+ throw new TypeError('Argument must not be a number')
+ }
+ return Buffer(arg, encodingOrOffset, length)
+ };
+
+ SafeBuffer.alloc = function (size, fill, encoding) {
+ if (typeof size !== 'number') {
+ throw new TypeError('Argument must be a number')
+ }
+ var buf = Buffer(size);
+ if (fill !== undefined) {
+ if (typeof encoding === 'string') {
+ buf.fill(fill, encoding);
+ } else {
+ buf.fill(fill);
+ }
+ } else {
+ buf.fill(0);
+ }
+ return buf
+ };
+
+ SafeBuffer.allocUnsafe = function (size) {
+ if (typeof size !== 'number') {
+ throw new TypeError('Argument must be a number')
+ }
+ return Buffer(size)
+ };
+
+ SafeBuffer.allocUnsafeSlow = function (size) {
+ if (typeof size !== 'number') {
+ throw new TypeError('Argument must be a number')
+ }
+ return buffer.SlowBuffer(size)
+ };
+ } (safeBuffer, safeBuffer.exports));
+ return safeBuffer.exports;
+}
+
+var hasRequiredString_decoder;
+
+function requireString_decoder () {
+ if (hasRequiredString_decoder) return string_decoder;
+ hasRequiredString_decoder = 1;
+
+ /**/
+
+ var Buffer = requireSafeBuffer().Buffer;
+ /**/
+
+ var isEncoding = Buffer.isEncoding || function (encoding) {
+ encoding = '' + encoding;
+ switch (encoding && encoding.toLowerCase()) {
+ case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw':
+ return true;
+ default:
+ return false;
+ }
+ };
+
+ function _normalizeEncoding(enc) {
+ if (!enc) return 'utf8';
+ var retried;
+ while (true) {
+ switch (enc) {
+ case 'utf8':
+ case 'utf-8':
+ return 'utf8';
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return 'utf16le';
+ case 'latin1':
+ case 'binary':
+ return 'latin1';
+ case 'base64':
+ case 'ascii':
+ case 'hex':
+ return enc;
+ default:
+ if (retried) return; // undefined
+ enc = ('' + enc).toLowerCase();
+ retried = true;
+ }
+ }
+ }
+ // Do not cache `Buffer.isEncoding` when checking encoding names as some
+ // modules monkey-patch it to support additional encodings
+ function normalizeEncoding(enc) {
+ var nenc = _normalizeEncoding(enc);
+ if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);
+ return nenc || enc;
+ }
+
+ // StringDecoder provides an interface for efficiently splitting a series of
+ // buffers into a series of JS strings without breaking apart multi-byte
+ // characters.
+ string_decoder.StringDecoder = StringDecoder;
+ function StringDecoder(encoding) {
+ this.encoding = normalizeEncoding(encoding);
+ var nb;
+ switch (this.encoding) {
+ case 'utf16le':
+ this.text = utf16Text;
+ this.end = utf16End;
+ nb = 4;
+ break;
+ case 'utf8':
+ this.fillLast = utf8FillLast;
+ nb = 4;
+ break;
+ case 'base64':
+ this.text = base64Text;
+ this.end = base64End;
+ nb = 3;
+ break;
+ default:
+ this.write = simpleWrite;
+ this.end = simpleEnd;
+ return;
+ }
+ this.lastNeed = 0;
+ this.lastTotal = 0;
+ this.lastChar = Buffer.allocUnsafe(nb);
+ }
+
+ StringDecoder.prototype.write = function (buf) {
+ if (buf.length === 0) return '';
+ var r;
+ var i;
+ if (this.lastNeed) {
+ r = this.fillLast(buf);
+ if (r === undefined) return '';
+ i = this.lastNeed;
+ this.lastNeed = 0;
+ } else {
+ i = 0;
+ }
+ if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);
+ return r || '';
+ };
+
+ StringDecoder.prototype.end = utf8End;
+
+ // Returns only complete characters in a Buffer
+ StringDecoder.prototype.text = utf8Text;
+
+ // Attempts to complete a partial non-UTF-8 character using bytes from a Buffer
+ StringDecoder.prototype.fillLast = function (buf) {
+ if (this.lastNeed <= buf.length) {
+ buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);
+ return this.lastChar.toString(this.encoding, 0, this.lastTotal);
+ }
+ buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);
+ this.lastNeed -= buf.length;
+ };
+
+ // Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a
+ // continuation byte. If an invalid byte is detected, -2 is returned.
+ function utf8CheckByte(byte) {
+ if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;
+ return byte >> 6 === 0x02 ? -1 : -2;
+ }
+
+ // Checks at most 3 bytes at the end of a Buffer in order to detect an
+ // incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)
+ // needed to complete the UTF-8 character (if applicable) are returned.
+ function utf8CheckIncomplete(self, buf, i) {
+ var j = buf.length - 1;
+ if (j < i) return 0;
+ var nb = utf8CheckByte(buf[j]);
+ if (nb >= 0) {
+ if (nb > 0) self.lastNeed = nb - 1;
+ return nb;
+ }
+ if (--j < i || nb === -2) return 0;
+ nb = utf8CheckByte(buf[j]);
+ if (nb >= 0) {
+ if (nb > 0) self.lastNeed = nb - 2;
+ return nb;
+ }
+ if (--j < i || nb === -2) return 0;
+ nb = utf8CheckByte(buf[j]);
+ if (nb >= 0) {
+ if (nb > 0) {
+ if (nb === 2) nb = 0;else self.lastNeed = nb - 3;
+ }
+ return nb;
+ }
+ return 0;
+ }
+
+ // Validates as many continuation bytes for a multi-byte UTF-8 character as
+ // needed or are available. If we see a non-continuation byte where we expect
+ // one, we "replace" the validated continuation bytes we've seen so far with
+ // a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding
+ // behavior. The continuation byte check is included three times in the case
+ // where all of the continuation bytes for a character exist in the same buffer.
+ // It is also done this way as a slight performance increase instead of using a
+ // loop.
+ function utf8CheckExtraBytes(self, buf, p) {
+ if ((buf[0] & 0xC0) !== 0x80) {
+ self.lastNeed = 0;
+ return '\ufffd';
+ }
+ if (self.lastNeed > 1 && buf.length > 1) {
+ if ((buf[1] & 0xC0) !== 0x80) {
+ self.lastNeed = 1;
+ return '\ufffd';
+ }
+ if (self.lastNeed > 2 && buf.length > 2) {
+ if ((buf[2] & 0xC0) !== 0x80) {
+ self.lastNeed = 2;
+ return '\ufffd';
+ }
+ }
+ }
+ }
+
+ // Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.
+ function utf8FillLast(buf) {
+ var p = this.lastTotal - this.lastNeed;
+ var r = utf8CheckExtraBytes(this, buf);
+ if (r !== undefined) return r;
+ if (this.lastNeed <= buf.length) {
+ buf.copy(this.lastChar, p, 0, this.lastNeed);
+ return this.lastChar.toString(this.encoding, 0, this.lastTotal);
+ }
+ buf.copy(this.lastChar, p, 0, buf.length);
+ this.lastNeed -= buf.length;
+ }
+
+ // Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a
+ // partial character, the character's bytes are buffered until the required
+ // number of bytes are available.
+ function utf8Text(buf, i) {
+ var total = utf8CheckIncomplete(this, buf, i);
+ if (!this.lastNeed) return buf.toString('utf8', i);
+ this.lastTotal = total;
+ var end = buf.length - (total - this.lastNeed);
+ buf.copy(this.lastChar, 0, end);
+ return buf.toString('utf8', i, end);
+ }
+
+ // For UTF-8, a replacement character is added when ending on a partial
+ // character.
+ function utf8End(buf) {
+ var r = buf && buf.length ? this.write(buf) : '';
+ if (this.lastNeed) return r + '\ufffd';
+ return r;
+ }
+
+ // UTF-16LE typically needs two bytes per character, but even if we have an even
+ // number of bytes available, we need to check if we end on a leading/high
+ // surrogate. In that case, we need to wait for the next two bytes in order to
+ // decode the last character properly.
+ function utf16Text(buf, i) {
+ if ((buf.length - i) % 2 === 0) {
+ var r = buf.toString('utf16le', i);
+ if (r) {
+ var c = r.charCodeAt(r.length - 1);
+ if (c >= 0xD800 && c <= 0xDBFF) {
+ this.lastNeed = 2;
+ this.lastTotal = 4;
+ this.lastChar[0] = buf[buf.length - 2];
+ this.lastChar[1] = buf[buf.length - 1];
+ return r.slice(0, -1);
+ }
+ }
+ return r;
+ }
+ this.lastNeed = 1;
+ this.lastTotal = 2;
+ this.lastChar[0] = buf[buf.length - 1];
+ return buf.toString('utf16le', i, buf.length - 1);
+ }
+
+ // For UTF-16LE we do not explicitly append special replacement characters if we
+ // end on a partial character, we simply let v8 handle that.
+ function utf16End(buf) {
+ var r = buf && buf.length ? this.write(buf) : '';
+ if (this.lastNeed) {
+ var end = this.lastTotal - this.lastNeed;
+ return r + this.lastChar.toString('utf16le', 0, end);
+ }
+ return r;
+ }
+
+ function base64Text(buf, i) {
+ var n = (buf.length - i) % 3;
+ if (n === 0) return buf.toString('base64', i);
+ this.lastNeed = 3 - n;
+ this.lastTotal = 3;
+ if (n === 1) {
+ this.lastChar[0] = buf[buf.length - 1];
+ } else {
+ this.lastChar[0] = buf[buf.length - 2];
+ this.lastChar[1] = buf[buf.length - 1];
+ }
+ return buf.toString('base64', i, buf.length - n);
+ }
+
+ function base64End(buf) {
+ var r = buf && buf.length ? this.write(buf) : '';
+ if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);
+ return r;
+ }
+
+ // Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)
+ function simpleWrite(buf) {
+ return buf.toString(this.encoding);
+ }
+
+ function simpleEnd(buf) {
+ return buf && buf.length ? this.write(buf) : '';
+ }
+ return string_decoder;
+}
+
+var endOfStream;
+var hasRequiredEndOfStream;
+
+function requireEndOfStream () {
+ if (hasRequiredEndOfStream) return endOfStream;
+ hasRequiredEndOfStream = 1;
+
+ var ERR_STREAM_PREMATURE_CLOSE = requireErrors().codes.ERR_STREAM_PREMATURE_CLOSE;
+ function once(callback) {
+ var called = false;
+ return function () {
+ if (called) return;
+ called = true;
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+ callback.apply(this, args);
+ };
+ }
+ function noop() {}
+ function isRequest(stream) {
+ return stream.setHeader && typeof stream.abort === 'function';
+ }
+ function eos(stream, opts, callback) {
+ if (typeof opts === 'function') return eos(stream, null, opts);
+ if (!opts) opts = {};
+ callback = once(callback || noop);
+ var readable = opts.readable || opts.readable !== false && stream.readable;
+ var writable = opts.writable || opts.writable !== false && stream.writable;
+ var onlegacyfinish = function onlegacyfinish() {
+ if (!stream.writable) onfinish();
+ };
+ var writableEnded = stream._writableState && stream._writableState.finished;
+ var onfinish = function onfinish() {
+ writable = false;
+ writableEnded = true;
+ if (!readable) callback.call(stream);
+ };
+ var readableEnded = stream._readableState && stream._readableState.endEmitted;
+ var onend = function onend() {
+ readable = false;
+ readableEnded = true;
+ if (!writable) callback.call(stream);
+ };
+ var onerror = function onerror(err) {
+ callback.call(stream, err);
+ };
+ var onclose = function onclose() {
+ var err;
+ if (readable && !readableEnded) {
+ if (!stream._readableState || !stream._readableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE();
+ return callback.call(stream, err);
+ }
+ if (writable && !writableEnded) {
+ if (!stream._writableState || !stream._writableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE();
+ return callback.call(stream, err);
+ }
+ };
+ var onrequest = function onrequest() {
+ stream.req.on('finish', onfinish);
+ };
+ if (isRequest(stream)) {
+ stream.on('complete', onfinish);
+ stream.on('abort', onclose);
+ if (stream.req) onrequest();else stream.on('request', onrequest);
+ } else if (writable && !stream._writableState) {
+ // legacy streams
+ stream.on('end', onlegacyfinish);
+ stream.on('close', onlegacyfinish);
+ }
+ stream.on('end', onend);
+ stream.on('finish', onfinish);
+ if (opts.error !== false) stream.on('error', onerror);
+ stream.on('close', onclose);
+ return function () {
+ stream.removeListener('complete', onfinish);
+ stream.removeListener('abort', onclose);
+ stream.removeListener('request', onrequest);
+ if (stream.req) stream.req.removeListener('finish', onfinish);
+ stream.removeListener('end', onlegacyfinish);
+ stream.removeListener('close', onlegacyfinish);
+ stream.removeListener('finish', onfinish);
+ stream.removeListener('end', onend);
+ stream.removeListener('error', onerror);
+ stream.removeListener('close', onclose);
+ };
+ }
+ endOfStream = eos;
+ return endOfStream;
+}
+
+var async_iterator;
+var hasRequiredAsync_iterator;
+
+function requireAsync_iterator () {
+ if (hasRequiredAsync_iterator) return async_iterator;
+ hasRequiredAsync_iterator = 1;
+
+ var _Object$setPrototypeO;
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
+ var finished = requireEndOfStream();
+ var kLastResolve = Symbol('lastResolve');
+ var kLastReject = Symbol('lastReject');
+ var kError = Symbol('error');
+ var kEnded = Symbol('ended');
+ var kLastPromise = Symbol('lastPromise');
+ var kHandlePromise = Symbol('handlePromise');
+ var kStream = Symbol('stream');
+ function createIterResult(value, done) {
+ return {
+ value: value,
+ done: done
+ };
+ }
+ function readAndResolve(iter) {
+ var resolve = iter[kLastResolve];
+ if (resolve !== null) {
+ var data = iter[kStream].read();
+ // we defer if data is null
+ // we can be expecting either 'end' or
+ // 'error'
+ if (data !== null) {
+ iter[kLastPromise] = null;
+ iter[kLastResolve] = null;
+ iter[kLastReject] = null;
+ resolve(createIterResult(data, false));
+ }
+ }
+ }
+ function onReadable(iter) {
+ // we wait for the next tick, because it might
+ // emit an error with process.nextTick
+ process.nextTick(readAndResolve, iter);
+ }
+ function wrapForNext(lastPromise, iter) {
+ return function (resolve, reject) {
+ lastPromise.then(function () {
+ if (iter[kEnded]) {
+ resolve(createIterResult(undefined, true));
+ return;
+ }
+ iter[kHandlePromise](resolve, reject);
+ }, reject);
+ };
+ }
+ var AsyncIteratorPrototype = Object.getPrototypeOf(function () {});
+ var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = {
+ get stream() {
+ return this[kStream];
+ },
+ next: function next() {
+ var _this = this;
+ // if we have detected an error in the meanwhile
+ // reject straight away
+ var error = this[kError];
+ if (error !== null) {
+ return Promise.reject(error);
+ }
+ if (this[kEnded]) {
+ return Promise.resolve(createIterResult(undefined, true));
+ }
+ if (this[kStream].destroyed) {
+ // We need to defer via nextTick because if .destroy(err) is
+ // called, the error will be emitted via nextTick, and
+ // we cannot guarantee that there is no error lingering around
+ // waiting to be emitted.
+ return new Promise(function (resolve, reject) {
+ process.nextTick(function () {
+ if (_this[kError]) {
+ reject(_this[kError]);
+ } else {
+ resolve(createIterResult(undefined, true));
+ }
+ });
+ });
+ }
+
+ // if we have multiple next() calls
+ // we will wait for the previous Promise to finish
+ // this logic is optimized to support for await loops,
+ // where next() is only called once at a time
+ var lastPromise = this[kLastPromise];
+ var promise;
+ if (lastPromise) {
+ promise = new Promise(wrapForNext(lastPromise, this));
+ } else {
+ // fast path needed to support multiple this.push()
+ // without triggering the next() queue
+ var data = this[kStream].read();
+ if (data !== null) {
+ return Promise.resolve(createIterResult(data, false));
+ }
+ promise = new Promise(this[kHandlePromise]);
+ }
+ this[kLastPromise] = promise;
+ return promise;
+ }
+ }, _defineProperty(_Object$setPrototypeO, Symbol.asyncIterator, function () {
+ return this;
+ }), _defineProperty(_Object$setPrototypeO, "return", function _return() {
+ var _this2 = this;
+ // destroy(err, cb) is a private API
+ // we can guarantee we have that here, because we control the
+ // Readable class this is attached to
+ return new Promise(function (resolve, reject) {
+ _this2[kStream].destroy(null, function (err) {
+ if (err) {
+ reject(err);
+ return;
+ }
+ resolve(createIterResult(undefined, true));
+ });
+ });
+ }), _Object$setPrototypeO), AsyncIteratorPrototype);
+ var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator(stream) {
+ var _Object$create;
+ var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty(_Object$create, kStream, {
+ value: stream,
+ writable: true
+ }), _defineProperty(_Object$create, kLastResolve, {
+ value: null,
+ writable: true
+ }), _defineProperty(_Object$create, kLastReject, {
+ value: null,
+ writable: true
+ }), _defineProperty(_Object$create, kError, {
+ value: null,
+ writable: true
+ }), _defineProperty(_Object$create, kEnded, {
+ value: stream._readableState.endEmitted,
+ writable: true
+ }), _defineProperty(_Object$create, kHandlePromise, {
+ value: function value(resolve, reject) {
+ var data = iterator[kStream].read();
+ if (data) {
+ iterator[kLastPromise] = null;
+ iterator[kLastResolve] = null;
+ iterator[kLastReject] = null;
+ resolve(createIterResult(data, false));
+ } else {
+ iterator[kLastResolve] = resolve;
+ iterator[kLastReject] = reject;
+ }
+ },
+ writable: true
+ }), _Object$create));
+ iterator[kLastPromise] = null;
+ finished(stream, function (err) {
+ if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') {
+ var reject = iterator[kLastReject];
+ // reject if we are waiting for data in the Promise
+ // returned by next() and store the error
+ if (reject !== null) {
+ iterator[kLastPromise] = null;
+ iterator[kLastResolve] = null;
+ iterator[kLastReject] = null;
+ reject(err);
+ }
+ iterator[kError] = err;
+ return;
+ }
+ var resolve = iterator[kLastResolve];
+ if (resolve !== null) {
+ iterator[kLastPromise] = null;
+ iterator[kLastResolve] = null;
+ iterator[kLastReject] = null;
+ resolve(createIterResult(undefined, true));
+ }
+ iterator[kEnded] = true;
+ });
+ stream.on('readable', onReadable.bind(null, iterator));
+ return iterator;
+ };
+ async_iterator = createReadableStreamAsyncIterator;
+ return async_iterator;
+}
+
+var from_1;
+var hasRequiredFrom;
+
+function requireFrom () {
+ if (hasRequiredFrom) return from_1;
+ hasRequiredFrom = 1;
+
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
+ function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
+ var ERR_INVALID_ARG_TYPE = requireErrors().codes.ERR_INVALID_ARG_TYPE;
+ function from(Readable, iterable, opts) {
+ var iterator;
+ if (iterable && typeof iterable.next === 'function') {
+ iterator = iterable;
+ } else if (iterable && iterable[Symbol.asyncIterator]) iterator = iterable[Symbol.asyncIterator]();else if (iterable && iterable[Symbol.iterator]) iterator = iterable[Symbol.iterator]();else throw new ERR_INVALID_ARG_TYPE('iterable', ['Iterable'], iterable);
+ var readable = new Readable(_objectSpread({
+ objectMode: true
+ }, opts));
+ // Reading boolean to protect against _read
+ // being called before last iteration completion.
+ var reading = false;
+ readable._read = function () {
+ if (!reading) {
+ reading = true;
+ next();
+ }
+ };
+ function next() {
+ return _next2.apply(this, arguments);
+ }
+ function _next2() {
+ _next2 = _asyncToGenerator(function* () {
+ try {
+ var _yield$iterator$next = yield iterator.next(),
+ value = _yield$iterator$next.value,
+ done = _yield$iterator$next.done;
+ if (done) {
+ readable.push(null);
+ } else if (readable.push(yield value)) {
+ next();
+ } else {
+ reading = false;
+ }
+ } catch (err) {
+ readable.destroy(err);
+ }
+ });
+ return _next2.apply(this, arguments);
+ }
+ return readable;
+ }
+ from_1 = from;
+ return from_1;
+}
+
+var _stream_readable;
+var hasRequired_stream_readable;
+
+function require_stream_readable () {
+ if (hasRequired_stream_readable) return _stream_readable;
+ hasRequired_stream_readable = 1;
+
+ _stream_readable = Readable;
+
+ /**/
+ var Duplex;
+ /**/
+
+ Readable.ReadableState = ReadableState;
+
+ /**/
+ require$$2.EventEmitter;
+ var EElistenerCount = function EElistenerCount(emitter, type) {
+ return emitter.listeners(type).length;
+ };
+ /**/
+
+ /**/
+ var Stream = requireStream();
+ /**/
+
+ var Buffer = require$$0$6.Buffer;
+ var OurUint8Array = (typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {};
+ function _uint8ArrayToBuffer(chunk) {
+ return Buffer.from(chunk);
+ }
+ function _isUint8Array(obj) {
+ return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
+ }
+
+ /**/
+ var debugUtil = require$$2$1;
+ var debug;
+ if (debugUtil && debugUtil.debuglog) {
+ debug = debugUtil.debuglog('stream');
+ } else {
+ debug = function debug() {};
+ }
+ /**/
+
+ var BufferList = requireBuffer_list();
+ var destroyImpl = requireDestroy();
+ var _require = requireState(),
+ getHighWaterMark = _require.getHighWaterMark;
+ var _require$codes = requireErrors().codes,
+ ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,
+ ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF,
+ ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,
+ ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT;
+
+ // Lazy loaded to improve the startup performance.
+ var StringDecoder;
+ var createReadableStreamAsyncIterator;
+ var from;
+ requireInherits()(Readable, Stream);
+ var errorOrDestroy = destroyImpl.errorOrDestroy;
+ var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];
+ function prependListener(emitter, event, fn) {
+ // Sadly this is not cacheable as some libraries bundle their own
+ // event emitter implementation with them.
+ if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn);
+
+ // This is a hack to make sure that our error handler is attached before any
+ // userland ones. NEVER DO THIS. This is here only because this code needs
+ // to continue to work with older versions of Node.js that do not include
+ // the prependListener() method. The goal is to eventually remove this hack.
+ if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
+ }
+ function ReadableState(options, stream, isDuplex) {
+ Duplex = Duplex || require_stream_duplex();
+ options = options || {};
+
+ // Duplex streams are both readable and writable, but share
+ // the same options object.
+ // However, some cases require setting options to different
+ // values for the readable and the writable sides of the duplex stream.
+ // These options can be provided separately as readableXXX and writableXXX.
+ if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex;
+
+ // object stream flag. Used to make read(n) ignore n and to
+ // make all the buffer merging and length checks go away
+ this.objectMode = !!options.objectMode;
+ if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode;
+
+ // the point at which it stops calling _read() to fill the buffer
+ // Note: 0 is a valid value, means "don't call _read preemptively ever"
+ this.highWaterMark = getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex);
+
+ // A linked list is used to store data chunks instead of an array because the
+ // linked list can remove elements from the beginning faster than
+ // array.shift()
+ this.buffer = new BufferList();
+ this.length = 0;
+ this.pipes = null;
+ this.pipesCount = 0;
+ this.flowing = null;
+ this.ended = false;
+ this.endEmitted = false;
+ this.reading = false;
+
+ // a flag to be able to tell if the event 'readable'/'data' is emitted
+ // immediately, or on a later tick. We set this to true at first, because
+ // any actions that shouldn't happen until "later" should generally also
+ // not happen before the first read call.
+ this.sync = true;
+
+ // whenever we return null, then we set a flag to say
+ // that we're awaiting a 'readable' event emission.
+ this.needReadable = false;
+ this.emittedReadable = false;
+ this.readableListening = false;
+ this.resumeScheduled = false;
+ this.paused = true;
+
+ // Should close be emitted on destroy. Defaults to true.
+ this.emitClose = options.emitClose !== false;
+
+ // Should .destroy() be called after 'end' (and potentially 'finish')
+ this.autoDestroy = !!options.autoDestroy;
+
+ // has it been destroyed
+ this.destroyed = false;
+
+ // Crypto is kind of old and crusty. Historically, its default string
+ // encoding is 'binary' so we have to make this configurable.
+ // Everything else in the universe uses 'utf8', though.
+ this.defaultEncoding = options.defaultEncoding || 'utf8';
+
+ // the number of writers that are awaiting a drain event in .pipe()s
+ this.awaitDrain = 0;
+
+ // if true, a maybeReadMore has been scheduled
+ this.readingMore = false;
+ this.decoder = null;
+ this.encoding = null;
+ if (options.encoding) {
+ if (!StringDecoder) StringDecoder = requireString_decoder().StringDecoder;
+ this.decoder = new StringDecoder(options.encoding);
+ this.encoding = options.encoding;
+ }
+ }
+ function Readable(options) {
+ Duplex = Duplex || require_stream_duplex();
+ if (!(this instanceof Readable)) return new Readable(options);
+
+ // Checking for a Stream.Duplex instance is faster here instead of inside
+ // the ReadableState constructor, at least with V8 6.5
+ var isDuplex = this instanceof Duplex;
+ this._readableState = new ReadableState(options, this, isDuplex);
+
+ // legacy
+ this.readable = true;
+ if (options) {
+ if (typeof options.read === 'function') this._read = options.read;
+ if (typeof options.destroy === 'function') this._destroy = options.destroy;
+ }
+ Stream.call(this);
+ }
+ Object.defineProperty(Readable.prototype, 'destroyed', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function get() {
+ if (this._readableState === undefined) {
+ return false;
+ }
+ return this._readableState.destroyed;
+ },
+ set: function set(value) {
+ // we ignore the value if the stream
+ // has not been initialized yet
+ if (!this._readableState) {
+ return;
+ }
+
+ // backward compatibility, the user is explicitly
+ // managing destroyed
+ this._readableState.destroyed = value;
+ }
+ });
+ Readable.prototype.destroy = destroyImpl.destroy;
+ Readable.prototype._undestroy = destroyImpl.undestroy;
+ Readable.prototype._destroy = function (err, cb) {
+ cb(err);
+ };
+
+ // Manually shove something into the read() buffer.
+ // This returns true if the highWaterMark has not been hit yet,
+ // similar to how Writable.write() returns true if you should
+ // write() some more.
+ Readable.prototype.push = function (chunk, encoding) {
+ var state = this._readableState;
+ var skipChunkCheck;
+ if (!state.objectMode) {
+ if (typeof chunk === 'string') {
+ encoding = encoding || state.defaultEncoding;
+ if (encoding !== state.encoding) {
+ chunk = Buffer.from(chunk, encoding);
+ encoding = '';
+ }
+ skipChunkCheck = true;
+ }
+ } else {
+ skipChunkCheck = true;
+ }
+ return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);
+ };
+
+ // Unshift should *always* be something directly out of read()
+ Readable.prototype.unshift = function (chunk) {
+ return readableAddChunk(this, chunk, null, true, false);
+ };
+ function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {
+ debug('readableAddChunk', chunk);
+ var state = stream._readableState;
+ if (chunk === null) {
+ state.reading = false;
+ onEofChunk(stream, state);
+ } else {
+ var er;
+ if (!skipChunkCheck) er = chunkInvalid(state, chunk);
+ if (er) {
+ errorOrDestroy(stream, er);
+ } else if (state.objectMode || chunk && chunk.length > 0) {
+ if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {
+ chunk = _uint8ArrayToBuffer(chunk);
+ }
+ if (addToFront) {
+ if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());else addChunk(stream, state, chunk, true);
+ } else if (state.ended) {
+ errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF());
+ } else if (state.destroyed) {
+ return false;
+ } else {
+ state.reading = false;
+ if (state.decoder && !encoding) {
+ chunk = state.decoder.write(chunk);
+ if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);
+ } else {
+ addChunk(stream, state, chunk, false);
+ }
+ }
+ } else if (!addToFront) {
+ state.reading = false;
+ maybeReadMore(stream, state);
+ }
+ }
+
+ // We can push more data if we are below the highWaterMark.
+ // Also, if we have no data yet, we can stand some more bytes.
+ // This is to work around cases where hwm=0, such as the repl.
+ return !state.ended && (state.length < state.highWaterMark || state.length === 0);
+ }
+ function addChunk(stream, state, chunk, addToFront) {
+ if (state.flowing && state.length === 0 && !state.sync) {
+ state.awaitDrain = 0;
+ stream.emit('data', chunk);
+ } else {
+ // update the buffer info.
+ state.length += state.objectMode ? 1 : chunk.length;
+ if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
+ if (state.needReadable) emitReadable(stream);
+ }
+ maybeReadMore(stream, state);
+ }
+ function chunkInvalid(state, chunk) {
+ var er;
+ if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
+ er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk);
+ }
+ return er;
+ }
+ Readable.prototype.isPaused = function () {
+ return this._readableState.flowing === false;
+ };
+
+ // backwards compatibility.
+ Readable.prototype.setEncoding = function (enc) {
+ if (!StringDecoder) StringDecoder = requireString_decoder().StringDecoder;
+ var decoder = new StringDecoder(enc);
+ this._readableState.decoder = decoder;
+ // If setEncoding(null), decoder.encoding equals utf8
+ this._readableState.encoding = this._readableState.decoder.encoding;
+
+ // Iterate over current buffer to convert already stored Buffers:
+ var p = this._readableState.buffer.head;
+ var content = '';
+ while (p !== null) {
+ content += decoder.write(p.data);
+ p = p.next;
+ }
+ this._readableState.buffer.clear();
+ if (content !== '') this._readableState.buffer.push(content);
+ this._readableState.length = content.length;
+ return this;
+ };
+
+ // Don't raise the hwm > 1GB
+ var MAX_HWM = 0x40000000;
+ function computeNewHighWaterMark(n) {
+ if (n >= MAX_HWM) {
+ // TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE.
+ n = MAX_HWM;
+ } else {
+ // Get the next highest power of 2 to prevent increasing hwm excessively in
+ // tiny amounts
+ n--;
+ n |= n >>> 1;
+ n |= n >>> 2;
+ n |= n >>> 4;
+ n |= n >>> 8;
+ n |= n >>> 16;
+ n++;
+ }
+ return n;
+ }
+
+ // This function is designed to be inlinable, so please take care when making
+ // changes to the function body.
+ function howMuchToRead(n, state) {
+ if (n <= 0 || state.length === 0 && state.ended) return 0;
+ if (state.objectMode) return 1;
+ if (n !== n) {
+ // Only flow one buffer at a time
+ if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
+ }
+ // If we're asking for more than the current hwm, then raise the hwm.
+ if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
+ if (n <= state.length) return n;
+ // Don't have enough
+ if (!state.ended) {
+ state.needReadable = true;
+ return 0;
+ }
+ return state.length;
+ }
+
+ // you can override either this method, or the async _read(n) below.
+ Readable.prototype.read = function (n) {
+ debug('read', n);
+ n = parseInt(n, 10);
+ var state = this._readableState;
+ var nOrig = n;
+ if (n !== 0) state.emittedReadable = false;
+
+ // if we're doing read(0) to trigger a readable event, but we
+ // already have a bunch of data in the buffer, then just trigger
+ // the 'readable' event and move on.
+ if (n === 0 && state.needReadable && ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || state.ended)) {
+ debug('read: emitReadable', state.length, state.ended);
+ if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
+ return null;
+ }
+ n = howMuchToRead(n, state);
+
+ // if we've ended, and we're now clear, then finish it up.
+ if (n === 0 && state.ended) {
+ if (state.length === 0) endReadable(this);
+ return null;
+ }
+
+ // All the actual chunk generation logic needs to be
+ // *below* the call to _read. The reason is that in certain
+ // synthetic stream cases, such as passthrough streams, _read
+ // may be a completely synchronous operation which may change
+ // the state of the read buffer, providing enough data when
+ // before there was *not* enough.
+ //
+ // So, the steps are:
+ // 1. Figure out what the state of things will be after we do
+ // a read from the buffer.
+ //
+ // 2. If that resulting state will trigger a _read, then call _read.
+ // Note that this may be asynchronous, or synchronous. Yes, it is
+ // deeply ugly to write APIs this way, but that still doesn't mean
+ // that the Readable class should behave improperly, as streams are
+ // designed to be sync/async agnostic.
+ // Take note if the _read call is sync or async (ie, if the read call
+ // has returned yet), so that we know whether or not it's safe to emit
+ // 'readable' etc.
+ //
+ // 3. Actually pull the requested chunks out of the buffer and return.
+
+ // if we need a readable event, then we need to do some reading.
+ var doRead = state.needReadable;
+ debug('need readable', doRead);
+
+ // if we currently have less than the highWaterMark, then also read some
+ if (state.length === 0 || state.length - n < state.highWaterMark) {
+ doRead = true;
+ debug('length less than watermark', doRead);
+ }
+
+ // however, if we've ended, then there's no point, and if we're already
+ // reading, then it's unnecessary.
+ if (state.ended || state.reading) {
+ doRead = false;
+ debug('reading or ended', doRead);
+ } else if (doRead) {
+ debug('do read');
+ state.reading = true;
+ state.sync = true;
+ // if the length is currently zero, then we *need* a readable event.
+ if (state.length === 0) state.needReadable = true;
+ // call internal read method
+ this._read(state.highWaterMark);
+ state.sync = false;
+ // If _read pushed data synchronously, then `reading` will be false,
+ // and we need to re-evaluate how much data we can return to the user.
+ if (!state.reading) n = howMuchToRead(nOrig, state);
+ }
+ var ret;
+ if (n > 0) ret = fromList(n, state);else ret = null;
+ if (ret === null) {
+ state.needReadable = state.length <= state.highWaterMark;
+ n = 0;
+ } else {
+ state.length -= n;
+ state.awaitDrain = 0;
+ }
+ if (state.length === 0) {
+ // If we have nothing in the buffer, then we want to know
+ // as soon as we *do* get something into the buffer.
+ if (!state.ended) state.needReadable = true;
+
+ // If we tried to read() past the EOF, then emit end on the next tick.
+ if (nOrig !== n && state.ended) endReadable(this);
+ }
+ if (ret !== null) this.emit('data', ret);
+ return ret;
+ };
+ function onEofChunk(stream, state) {
+ debug('onEofChunk');
+ if (state.ended) return;
+ if (state.decoder) {
+ var chunk = state.decoder.end();
+ if (chunk && chunk.length) {
+ state.buffer.push(chunk);
+ state.length += state.objectMode ? 1 : chunk.length;
+ }
+ }
+ state.ended = true;
+ if (state.sync) {
+ // if we are sync, wait until next tick to emit the data.
+ // Otherwise we risk emitting data in the flow()
+ // the readable code triggers during a read() call
+ emitReadable(stream);
+ } else {
+ // emit 'readable' now to make sure it gets picked up.
+ state.needReadable = false;
+ if (!state.emittedReadable) {
+ state.emittedReadable = true;
+ emitReadable_(stream);
+ }
+ }
+ }
+
+ // Don't emit readable right away in sync mode, because this can trigger
+ // another read() call => stack overflow. This way, it might trigger
+ // a nextTick recursion warning, but that's not so bad.
+ function emitReadable(stream) {
+ var state = stream._readableState;
+ debug('emitReadable', state.needReadable, state.emittedReadable);
+ state.needReadable = false;
+ if (!state.emittedReadable) {
+ debug('emitReadable', state.flowing);
+ state.emittedReadable = true;
+ process.nextTick(emitReadable_, stream);
+ }
+ }
+ function emitReadable_(stream) {
+ var state = stream._readableState;
+ debug('emitReadable_', state.destroyed, state.length, state.ended);
+ if (!state.destroyed && (state.length || state.ended)) {
+ stream.emit('readable');
+ state.emittedReadable = false;
+ }
+
+ // The stream needs another readable event if
+ // 1. It is not flowing, as the flow mechanism will take
+ // care of it.
+ // 2. It is not ended.
+ // 3. It is below the highWaterMark, so we can schedule
+ // another readable later.
+ state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark;
+ flow(stream);
+ }
+
+ // at this point, the user has presumably seen the 'readable' event,
+ // and called read() to consume some data. that may have triggered
+ // in turn another _read(n) call, in which case reading = true if
+ // it's in progress.
+ // However, if we're not ended, or reading, and the length < hwm,
+ // then go ahead and try to read some more preemptively.
+ function maybeReadMore(stream, state) {
+ if (!state.readingMore) {
+ state.readingMore = true;
+ process.nextTick(maybeReadMore_, stream, state);
+ }
+ }
+ function maybeReadMore_(stream, state) {
+ // Attempt to read more data if we should.
+ //
+ // The conditions for reading more data are (one of):
+ // - Not enough data buffered (state.length < state.highWaterMark). The loop
+ // is responsible for filling the buffer with enough data if such data
+ // is available. If highWaterMark is 0 and we are not in the flowing mode
+ // we should _not_ attempt to buffer any extra data. We'll get more data
+ // when the stream consumer calls read() instead.
+ // - No data in the buffer, and the stream is in flowing mode. In this mode
+ // the loop below is responsible for ensuring read() is called. Failing to
+ // call read here would abort the flow and there's no other mechanism for
+ // continuing the flow if the stream consumer has just subscribed to the
+ // 'data' event.
+ //
+ // In addition to the above conditions to keep reading data, the following
+ // conditions prevent the data from being read:
+ // - The stream has ended (state.ended).
+ // - There is already a pending 'read' operation (state.reading). This is a
+ // case where the the stream has called the implementation defined _read()
+ // method, but they are processing the call asynchronously and have _not_
+ // called push() with new data. In this case we skip performing more
+ // read()s. The execution ends in this method again after the _read() ends
+ // up calling push() with more data.
+ while (!state.reading && !state.ended && (state.length < state.highWaterMark || state.flowing && state.length === 0)) {
+ var len = state.length;
+ debug('maybeReadMore read 0');
+ stream.read(0);
+ if (len === state.length)
+ // didn't get any data, stop spinning.
+ break;
+ }
+ state.readingMore = false;
+ }
+
+ // abstract method. to be overridden in specific implementation classes.
+ // call cb(er, data) where data is <= n in length.
+ // for virtual (non-string, non-buffer) streams, "length" is somewhat
+ // arbitrary, and perhaps not very meaningful.
+ Readable.prototype._read = function (n) {
+ errorOrDestroy(this, new ERR_METHOD_NOT_IMPLEMENTED('_read()'));
+ };
+ Readable.prototype.pipe = function (dest, pipeOpts) {
+ var src = this;
+ var state = this._readableState;
+ switch (state.pipesCount) {
+ case 0:
+ state.pipes = dest;
+ break;
+ case 1:
+ state.pipes = [state.pipes, dest];
+ break;
+ default:
+ state.pipes.push(dest);
+ break;
+ }
+ state.pipesCount += 1;
+ debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
+ var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
+ var endFn = doEnd ? onend : unpipe;
+ if (state.endEmitted) process.nextTick(endFn);else src.once('end', endFn);
+ dest.on('unpipe', onunpipe);
+ function onunpipe(readable, unpipeInfo) {
+ debug('onunpipe');
+ if (readable === src) {
+ if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
+ unpipeInfo.hasUnpiped = true;
+ cleanup();
+ }
+ }
+ }
+ function onend() {
+ debug('onend');
+ dest.end();
+ }
+
+ // when the dest drains, it reduces the awaitDrain counter
+ // on the source. This would be more elegant with a .once()
+ // handler in flow(), but adding and removing repeatedly is
+ // too slow.
+ var ondrain = pipeOnDrain(src);
+ dest.on('drain', ondrain);
+ var cleanedUp = false;
+ function cleanup() {
+ debug('cleanup');
+ // cleanup event handlers once the pipe is broken
+ dest.removeListener('close', onclose);
+ dest.removeListener('finish', onfinish);
+ dest.removeListener('drain', ondrain);
+ dest.removeListener('error', onerror);
+ dest.removeListener('unpipe', onunpipe);
+ src.removeListener('end', onend);
+ src.removeListener('end', unpipe);
+ src.removeListener('data', ondata);
+ cleanedUp = true;
+
+ // if the reader is waiting for a drain event from this
+ // specific writer, then it would cause it to never start
+ // flowing again.
+ // So, if this is awaiting a drain, then we just call it now.
+ // If we don't know, then assume that we are waiting for one.
+ if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
+ }
+ src.on('data', ondata);
+ function ondata(chunk) {
+ debug('ondata');
+ var ret = dest.write(chunk);
+ debug('dest.write', ret);
+ if (ret === false) {
+ // If the user unpiped during `dest.write()`, it is possible
+ // to get stuck in a permanently paused state if that write
+ // also returned false.
+ // => Check whether `dest` is still a piping destination.
+ if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
+ debug('false write response, pause', state.awaitDrain);
+ state.awaitDrain++;
+ }
+ src.pause();
+ }
+ }
+
+ // if the dest has an error, then stop piping into it.
+ // however, don't suppress the throwing behavior for this.
+ function onerror(er) {
+ debug('onerror', er);
+ unpipe();
+ dest.removeListener('error', onerror);
+ if (EElistenerCount(dest, 'error') === 0) errorOrDestroy(dest, er);
+ }
+
+ // Make sure our error handler is attached before userland ones.
+ prependListener(dest, 'error', onerror);
+
+ // Both close and finish should trigger unpipe, but only once.
+ function onclose() {
+ dest.removeListener('finish', onfinish);
+ unpipe();
+ }
+ dest.once('close', onclose);
+ function onfinish() {
+ debug('onfinish');
+ dest.removeListener('close', onclose);
+ unpipe();
+ }
+ dest.once('finish', onfinish);
+ function unpipe() {
+ debug('unpipe');
+ src.unpipe(dest);
+ }
+
+ // tell the dest that it's being piped to
+ dest.emit('pipe', src);
+
+ // start the flow if it hasn't been started already.
+ if (!state.flowing) {
+ debug('pipe resume');
+ src.resume();
+ }
+ return dest;
+ };
+ function pipeOnDrain(src) {
+ return function pipeOnDrainFunctionResult() {
+ var state = src._readableState;
+ debug('pipeOnDrain', state.awaitDrain);
+ if (state.awaitDrain) state.awaitDrain--;
+ if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
+ state.flowing = true;
+ flow(src);
+ }
+ };
+ }
+ Readable.prototype.unpipe = function (dest) {
+ var state = this._readableState;
+ var unpipeInfo = {
+ hasUnpiped: false
+ };
+
+ // if we're not piping anywhere, then do nothing.
+ if (state.pipesCount === 0) return this;
+
+ // just one destination. most common case.
+ if (state.pipesCount === 1) {
+ // passed in one, but it's not the right one.
+ if (dest && dest !== state.pipes) return this;
+ if (!dest) dest = state.pipes;
+
+ // got a match.
+ state.pipes = null;
+ state.pipesCount = 0;
+ state.flowing = false;
+ if (dest) dest.emit('unpipe', this, unpipeInfo);
+ return this;
+ }
+
+ // slow case. multiple pipe destinations.
+
+ if (!dest) {
+ // remove all.
+ var dests = state.pipes;
+ var len = state.pipesCount;
+ state.pipes = null;
+ state.pipesCount = 0;
+ state.flowing = false;
+ for (var i = 0; i < len; i++) dests[i].emit('unpipe', this, {
+ hasUnpiped: false
+ });
+ return this;
+ }
+
+ // try to find the right one.
+ var index = indexOf(state.pipes, dest);
+ if (index === -1) return this;
+ state.pipes.splice(index, 1);
+ state.pipesCount -= 1;
+ if (state.pipesCount === 1) state.pipes = state.pipes[0];
+ dest.emit('unpipe', this, unpipeInfo);
+ return this;
+ };
+
+ // set up data events if they are asked for
+ // Ensure readable listeners eventually get something
+ Readable.prototype.on = function (ev, fn) {
+ var res = Stream.prototype.on.call(this, ev, fn);
+ var state = this._readableState;
+ if (ev === 'data') {
+ // update readableListening so that resume() may be a no-op
+ // a few lines down. This is needed to support once('readable').
+ state.readableListening = this.listenerCount('readable') > 0;
+
+ // Try start flowing on next tick if stream isn't explicitly paused
+ if (state.flowing !== false) this.resume();
+ } else if (ev === 'readable') {
+ if (!state.endEmitted && !state.readableListening) {
+ state.readableListening = state.needReadable = true;
+ state.flowing = false;
+ state.emittedReadable = false;
+ debug('on readable', state.length, state.reading);
+ if (state.length) {
+ emitReadable(this);
+ } else if (!state.reading) {
+ process.nextTick(nReadingNextTick, this);
+ }
+ }
+ }
+ return res;
+ };
+ Readable.prototype.addListener = Readable.prototype.on;
+ Readable.prototype.removeListener = function (ev, fn) {
+ var res = Stream.prototype.removeListener.call(this, ev, fn);
+ if (ev === 'readable') {
+ // We need to check if there is someone still listening to
+ // readable and reset the state. However this needs to happen
+ // after readable has been emitted but before I/O (nextTick) to
+ // support once('readable', fn) cycles. This means that calling
+ // resume within the same tick will have no
+ // effect.
+ process.nextTick(updateReadableListening, this);
+ }
+ return res;
+ };
+ Readable.prototype.removeAllListeners = function (ev) {
+ var res = Stream.prototype.removeAllListeners.apply(this, arguments);
+ if (ev === 'readable' || ev === undefined) {
+ // We need to check if there is someone still listening to
+ // readable and reset the state. However this needs to happen
+ // after readable has been emitted but before I/O (nextTick) to
+ // support once('readable', fn) cycles. This means that calling
+ // resume within the same tick will have no
+ // effect.
+ process.nextTick(updateReadableListening, this);
+ }
+ return res;
+ };
+ function updateReadableListening(self) {
+ var state = self._readableState;
+ state.readableListening = self.listenerCount('readable') > 0;
+ if (state.resumeScheduled && !state.paused) {
+ // flowing needs to be set to true now, otherwise
+ // the upcoming resume will not flow.
+ state.flowing = true;
+
+ // crude way to check if we should resume
+ } else if (self.listenerCount('data') > 0) {
+ self.resume();
+ }
+ }
+ function nReadingNextTick(self) {
+ debug('readable nexttick read 0');
+ self.read(0);
+ }
+
+ // pause() and resume() are remnants of the legacy readable stream API
+ // If the user uses them, then switch into old mode.
+ Readable.prototype.resume = function () {
+ var state = this._readableState;
+ if (!state.flowing) {
+ debug('resume');
+ // we flow only if there is no one listening
+ // for readable, but we still have to call
+ // resume()
+ state.flowing = !state.readableListening;
+ resume(this, state);
+ }
+ state.paused = false;
+ return this;
+ };
+ function resume(stream, state) {
+ if (!state.resumeScheduled) {
+ state.resumeScheduled = true;
+ process.nextTick(resume_, stream, state);
+ }
+ }
+ function resume_(stream, state) {
+ debug('resume', state.reading);
+ if (!state.reading) {
+ stream.read(0);
+ }
+ state.resumeScheduled = false;
+ stream.emit('resume');
+ flow(stream);
+ if (state.flowing && !state.reading) stream.read(0);
+ }
+ Readable.prototype.pause = function () {
+ debug('call pause flowing=%j', this._readableState.flowing);
+ if (this._readableState.flowing !== false) {
+ debug('pause');
+ this._readableState.flowing = false;
+ this.emit('pause');
+ }
+ this._readableState.paused = true;
+ return this;
+ };
+ function flow(stream) {
+ var state = stream._readableState;
+ debug('flow', state.flowing);
+ while (state.flowing && stream.read() !== null);
+ }
+
+ // wrap an old-style stream as the async data source.
+ // This is *not* part of the readable stream interface.
+ // It is an ugly unfortunate mess of history.
+ Readable.prototype.wrap = function (stream) {
+ var _this = this;
+ var state = this._readableState;
+ var paused = false;
+ stream.on('end', function () {
+ debug('wrapped end');
+ if (state.decoder && !state.ended) {
+ var chunk = state.decoder.end();
+ if (chunk && chunk.length) _this.push(chunk);
+ }
+ _this.push(null);
+ });
+ stream.on('data', function (chunk) {
+ debug('wrapped data');
+ if (state.decoder) chunk = state.decoder.write(chunk);
+
+ // don't skip over falsy values in objectMode
+ if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;
+ var ret = _this.push(chunk);
+ if (!ret) {
+ paused = true;
+ stream.pause();
+ }
+ });
+
+ // proxy all the other methods.
+ // important when wrapping filters and duplexes.
+ for (var i in stream) {
+ if (this[i] === undefined && typeof stream[i] === 'function') {
+ this[i] = function methodWrap(method) {
+ return function methodWrapReturnFunction() {
+ return stream[method].apply(stream, arguments);
+ };
+ }(i);
+ }
+ }
+
+ // proxy certain important events.
+ for (var n = 0; n < kProxyEvents.length; n++) {
+ stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));
+ }
+
+ // when we try to consume some more bytes, simply unpause the
+ // underlying stream.
+ this._read = function (n) {
+ debug('wrapped _read', n);
+ if (paused) {
+ paused = false;
+ stream.resume();
+ }
+ };
+ return this;
+ };
+ if (typeof Symbol === 'function') {
+ Readable.prototype[Symbol.asyncIterator] = function () {
+ if (createReadableStreamAsyncIterator === undefined) {
+ createReadableStreamAsyncIterator = requireAsync_iterator();
+ }
+ return createReadableStreamAsyncIterator(this);
+ };
+ }
+ Object.defineProperty(Readable.prototype, 'readableHighWaterMark', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function get() {
+ return this._readableState.highWaterMark;
+ }
+ });
+ Object.defineProperty(Readable.prototype, 'readableBuffer', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function get() {
+ return this._readableState && this._readableState.buffer;
+ }
+ });
+ Object.defineProperty(Readable.prototype, 'readableFlowing', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function get() {
+ return this._readableState.flowing;
+ },
+ set: function set(state) {
+ if (this._readableState) {
+ this._readableState.flowing = state;
+ }
+ }
+ });
+
+ // exposed for testing purposes only.
+ Readable._fromList = fromList;
+ Object.defineProperty(Readable.prototype, 'readableLength', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function get() {
+ return this._readableState.length;
+ }
+ });
+
+ // Pluck off n bytes from an array of buffers.
+ // Length is the combined lengths of all the buffers in the list.
+ // This function is designed to be inlinable, so please take care when making
+ // changes to the function body.
+ function fromList(n, state) {
+ // nothing buffered
+ if (state.length === 0) return null;
+ var ret;
+ if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
+ // read it all, truncate the list
+ if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.first();else ret = state.buffer.concat(state.length);
+ state.buffer.clear();
+ } else {
+ // read part of list
+ ret = state.buffer.consume(n, state.decoder);
+ }
+ return ret;
+ }
+ function endReadable(stream) {
+ var state = stream._readableState;
+ debug('endReadable', state.endEmitted);
+ if (!state.endEmitted) {
+ state.ended = true;
+ process.nextTick(endReadableNT, state, stream);
+ }
+ }
+ function endReadableNT(state, stream) {
+ debug('endReadableNT', state.endEmitted, state.length);
+
+ // Check that we didn't get one last unshift.
+ if (!state.endEmitted && state.length === 0) {
+ state.endEmitted = true;
+ stream.readable = false;
+ stream.emit('end');
+ if (state.autoDestroy) {
+ // In case of duplex streams we need a way to detect
+ // if the writable side is ready for autoDestroy as well
+ var wState = stream._writableState;
+ if (!wState || wState.autoDestroy && wState.finished) {
+ stream.destroy();
+ }
+ }
+ }
+ }
+ if (typeof Symbol === 'function') {
+ Readable.from = function (iterable, opts) {
+ if (from === undefined) {
+ from = requireFrom();
+ }
+ return from(Readable, iterable, opts);
+ };
+ }
+ function indexOf(xs, x) {
+ for (var i = 0, l = xs.length; i < l; i++) {
+ if (xs[i] === x) return i;
+ }
+ return -1;
+ }
+ return _stream_readable;
+}
+
+var _stream_transform;
+var hasRequired_stream_transform;
+
+function require_stream_transform () {
+ if (hasRequired_stream_transform) return _stream_transform;
+ hasRequired_stream_transform = 1;
+
+ _stream_transform = Transform;
+ var _require$codes = requireErrors().codes,
+ ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,
+ ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK,
+ ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING,
+ ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0;
+ var Duplex = require_stream_duplex();
+ requireInherits()(Transform, Duplex);
+ function afterTransform(er, data) {
+ var ts = this._transformState;
+ ts.transforming = false;
+ var cb = ts.writecb;
+ if (cb === null) {
+ return this.emit('error', new ERR_MULTIPLE_CALLBACK());
+ }
+ ts.writechunk = null;
+ ts.writecb = null;
+ if (data != null)
+ // single equals check for both `null` and `undefined`
+ this.push(data);
+ cb(er);
+ var rs = this._readableState;
+ rs.reading = false;
+ if (rs.needReadable || rs.length < rs.highWaterMark) {
+ this._read(rs.highWaterMark);
+ }
+ }
+ function Transform(options) {
+ if (!(this instanceof Transform)) return new Transform(options);
+ Duplex.call(this, options);
+ this._transformState = {
+ afterTransform: afterTransform.bind(this),
+ needTransform: false,
+ transforming: false,
+ writecb: null,
+ writechunk: null,
+ writeencoding: null
+ };
+
+ // start out asking for a readable event once data is transformed.
+ this._readableState.needReadable = true;
+
+ // we have implemented the _read method, and done the other things
+ // that Readable wants before the first _read call, so unset the
+ // sync guard flag.
+ this._readableState.sync = false;
+ if (options) {
+ if (typeof options.transform === 'function') this._transform = options.transform;
+ if (typeof options.flush === 'function') this._flush = options.flush;
+ }
+
+ // When the writable side finishes, then flush out anything remaining.
+ this.on('prefinish', prefinish);
+ }
+ function prefinish() {
+ var _this = this;
+ if (typeof this._flush === 'function' && !this._readableState.destroyed) {
+ this._flush(function (er, data) {
+ done(_this, er, data);
+ });
+ } else {
+ done(this, null, null);
+ }
+ }
+ Transform.prototype.push = function (chunk, encoding) {
+ this._transformState.needTransform = false;
+ return Duplex.prototype.push.call(this, chunk, encoding);
+ };
+
+ // This is the part where you do stuff!
+ // override this function in implementation classes.
+ // 'chunk' is an input chunk.
+ //
+ // Call `push(newChunk)` to pass along transformed output
+ // to the readable side. You may call 'push' zero or more times.
+ //
+ // Call `cb(err)` when you are done with this chunk. If you pass
+ // an error, then that'll put the hurt on the whole operation. If you
+ // never call cb(), then you'll never get another chunk.
+ Transform.prototype._transform = function (chunk, encoding, cb) {
+ cb(new ERR_METHOD_NOT_IMPLEMENTED('_transform()'));
+ };
+ Transform.prototype._write = function (chunk, encoding, cb) {
+ var ts = this._transformState;
+ ts.writecb = cb;
+ ts.writechunk = chunk;
+ ts.writeencoding = encoding;
+ if (!ts.transforming) {
+ var rs = this._readableState;
+ if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
+ }
+ };
+
+ // Doesn't matter what the args are here.
+ // _transform does all the work.
+ // That we got here means that the readable side wants more data.
+ Transform.prototype._read = function (n) {
+ var ts = this._transformState;
+ if (ts.writechunk !== null && !ts.transforming) {
+ ts.transforming = true;
+ this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
+ } else {
+ // mark that we need a transform, so that any data that comes in
+ // will get processed, now that we've asked for it.
+ ts.needTransform = true;
+ }
+ };
+ Transform.prototype._destroy = function (err, cb) {
+ Duplex.prototype._destroy.call(this, err, function (err2) {
+ cb(err2);
+ });
+ };
+ function done(stream, er, data) {
+ if (er) return stream.emit('error', er);
+ if (data != null)
+ // single equals check for both `null` and `undefined`
+ stream.push(data);
+
+ // TODO(BridgeAR): Write a test for these two error cases
+ // if there's nothing in the write buffer, then that means
+ // that nothing more will ever be provided
+ if (stream._writableState.length) throw new ERR_TRANSFORM_WITH_LENGTH_0();
+ if (stream._transformState.transforming) throw new ERR_TRANSFORM_ALREADY_TRANSFORMING();
+ return stream.push(null);
+ }
+ return _stream_transform;
+}
+
+var _stream_passthrough;
+var hasRequired_stream_passthrough;
+
+function require_stream_passthrough () {
+ if (hasRequired_stream_passthrough) return _stream_passthrough;
+ hasRequired_stream_passthrough = 1;
+
+ _stream_passthrough = PassThrough;
+ var Transform = require_stream_transform();
+ requireInherits()(PassThrough, Transform);
+ function PassThrough(options) {
+ if (!(this instanceof PassThrough)) return new PassThrough(options);
+ Transform.call(this, options);
+ }
+ PassThrough.prototype._transform = function (chunk, encoding, cb) {
+ cb(null, chunk);
+ };
+ return _stream_passthrough;
+}
+
+var pipeline_1;
+var hasRequiredPipeline;
+
+function requirePipeline () {
+ if (hasRequiredPipeline) return pipeline_1;
+ hasRequiredPipeline = 1;
+
+ var eos;
+ function once(callback) {
+ var called = false;
+ return function () {
+ if (called) return;
+ called = true;
+ callback.apply(void 0, arguments);
+ };
+ }
+ var _require$codes = requireErrors().codes,
+ ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS,
+ ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED;
+ function noop(err) {
+ // Rethrow the error if it exists to avoid swallowing it
+ if (err) throw err;
+ }
+ function isRequest(stream) {
+ return stream.setHeader && typeof stream.abort === 'function';
+ }
+ function destroyer(stream, reading, writing, callback) {
+ callback = once(callback);
+ var closed = false;
+ stream.on('close', function () {
+ closed = true;
+ });
+ if (eos === undefined) eos = requireEndOfStream();
+ eos(stream, {
+ readable: reading,
+ writable: writing
+ }, function (err) {
+ if (err) return callback(err);
+ closed = true;
+ callback();
+ });
+ var destroyed = false;
+ return function (err) {
+ if (closed) return;
+ if (destroyed) return;
+ destroyed = true;
+
+ // request.destroy just do .end - .abort is what we want
+ if (isRequest(stream)) return stream.abort();
+ if (typeof stream.destroy === 'function') return stream.destroy();
+ callback(err || new ERR_STREAM_DESTROYED('pipe'));
+ };
+ }
+ function call(fn) {
+ fn();
+ }
+ function pipe(from, to) {
+ return from.pipe(to);
+ }
+ function popCallback(streams) {
+ if (!streams.length) return noop;
+ if (typeof streams[streams.length - 1] !== 'function') return noop;
+ return streams.pop();
+ }
+ function pipeline() {
+ for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) {
+ streams[_key] = arguments[_key];
+ }
+ var callback = popCallback(streams);
+ if (Array.isArray(streams[0])) streams = streams[0];
+ if (streams.length < 2) {
+ throw new ERR_MISSING_ARGS('streams');
+ }
+ var error;
+ var destroys = streams.map(function (stream, i) {
+ var reading = i < streams.length - 1;
+ var writing = i > 0;
+ return destroyer(stream, reading, writing, function (err) {
+ if (!error) error = err;
+ if (err) destroys.forEach(call);
+ if (reading) return;
+ destroys.forEach(call);
+ callback(error);
+ });
+ });
+ return streams.reduce(pipe);
+ }
+ pipeline_1 = pipeline;
+ return pipeline_1;
+}
+
+(function (module, exports) {
+ var Stream = require$$0$5;
+ if (process.env.READABLE_STREAM === 'disable' && Stream) {
+ module.exports = Stream.Readable;
+ Object.assign(module.exports, Stream);
+ module.exports.Stream = Stream;
+ } else {
+ exports = module.exports = require_stream_readable();
+ exports.Stream = Stream || exports;
+ exports.Readable = exports;
+ exports.Writable = require_stream_writable();
+ exports.Duplex = require_stream_duplex();
+ exports.Transform = require_stream_transform();
+ exports.PassThrough = require_stream_passthrough();
+ exports.finished = requireEndOfStream();
+ exports.pipeline = requirePipeline();
+ }
+} (readable, readable.exports));
+
+var readableExports = readable.exports;
+
+Object.defineProperty(lib, "__esModule", { value: true });
+lib.ReadableWebToNodeStream = void 0;
+const readable_stream_1 = readableExports;
+/**
+ * Converts a Web-API stream into Node stream.Readable class
+ * Node stream readable: https://nodejs.org/api/stream.html#stream_readable_streams
+ * Web API readable-stream: https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream
+ * Node readable stream: https://nodejs.org/api/stream.html#stream_readable_streams
+ */
+class ReadableWebToNodeStream extends readable_stream_1.Readable {
+ /**
+ *
+ * @param stream ReadableStream: https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream
+ */
+ constructor(stream) {
+ super();
+ this.bytesRead = 0;
+ this.released = false;
+ this.reader = stream.getReader();
+ }
+ /**
+ * Implementation of readable._read(size).
+ * When readable._read() is called, if data is available from the resource,
+ * the implementation should begin pushing that data into the read queue
+ * https://nodejs.org/api/stream.html#stream_readable_read_size_1
+ */
+ async _read() {
+ // Should start pushing data into the queue
+ // Read data from the underlying Web-API-readable-stream
+ if (this.released) {
+ this.push(null); // Signal EOF
+ return;
+ }
+ this.pendingRead = this.reader.read();
+ const data = await this.pendingRead;
+ // clear the promise before pushing pushing new data to the queue and allow sequential calls to _read()
+ delete this.pendingRead;
+ if (data.done || this.released) {
+ this.push(null); // Signal EOF
+ }
+ else {
+ this.bytesRead += data.value.length;
+ this.push(data.value); // Push new data to the queue
+ }
+ }
+ /**
+ * If there is no unresolved read call to Web-API ReadableStream immediately returns;
+ * otherwise will wait until the read is resolved.
+ */
+ async waitForReadToComplete() {
+ if (this.pendingRead) {
+ await this.pendingRead;
+ }
+ }
+ /**
+ * Close wrapper
+ */
+ async close() {
+ await this.syncAndRelease();
+ }
+ async syncAndRelease() {
+ this.released = true;
+ await this.waitForReadToComplete();
+ await this.reader.releaseLock();
+ }
+}
+lib.ReadableWebToNodeStream = ReadableWebToNodeStream;
+
+// Primitive types
+function dv(array) {
+ return new DataView(array.buffer, array.byteOffset);
+}
+/**
+ * 8-bit unsigned integer
+ */
+const UINT8 = {
+ len: 1,
+ get(array, offset) {
+ return dv(array).getUint8(offset);
+ },
+ put(array, offset, value) {
+ dv(array).setUint8(offset, value);
+ return offset + 1;
+ }
+};
+/**
+ * 16-bit unsigned integer, Little Endian byte order
+ */
+const UINT16_LE = {
+ len: 2,
+ get(array, offset) {
+ return dv(array).getUint16(offset, true);
+ },
+ put(array, offset, value) {
+ dv(array).setUint16(offset, value, true);
+ return offset + 2;
+ }
+};
+/**
+ * 16-bit unsigned integer, Big Endian byte order
+ */
+const UINT16_BE = {
+ len: 2,
+ get(array, offset) {
+ return dv(array).getUint16(offset);
+ },
+ put(array, offset, value) {
+ dv(array).setUint16(offset, value);
+ return offset + 2;
+ }
+};
+/**
+ * 32-bit unsigned integer, Little Endian byte order
+ */
+const UINT32_LE = {
+ len: 4,
+ get(array, offset) {
+ return dv(array).getUint32(offset, true);
+ },
+ put(array, offset, value) {
+ dv(array).setUint32(offset, value, true);
+ return offset + 4;
+ }
+};
+/**
+ * 32-bit unsigned integer, Big Endian byte order
+ */
+const UINT32_BE = {
+ len: 4,
+ get(array, offset) {
+ return dv(array).getUint32(offset);
+ },
+ put(array, offset, value) {
+ dv(array).setUint32(offset, value);
+ return offset + 4;
+ }
+};
+/**
+ * 32-bit signed integer, Big Endian byte order
+ */
+const INT32_BE = {
+ len: 4,
+ get(array, offset) {
+ return dv(array).getInt32(offset);
+ },
+ put(array, offset, value) {
+ dv(array).setInt32(offset, value);
+ return offset + 4;
+ }
+};
+/**
+ * 64-bit unsigned integer, Little Endian byte order
+ */
+const UINT64_LE = {
+ len: 8,
+ get(array, offset) {
+ return dv(array).getBigUint64(offset, true);
+ },
+ put(array, offset, value) {
+ dv(array).setBigUint64(offset, value, true);
+ return offset + 8;
+ }
+};
+/**
+ * Consume a fixed number of bytes from the stream and return a string with a specified encoding.
+ */
+class StringType {
+ constructor(len, encoding) {
+ this.len = len;
+ this.encoding = encoding;
+ }
+ get(uint8Array, offset) {
+ return node_buffer.Buffer.from(uint8Array).toString(this.encoding, offset, offset + this.len);
+ }
+}
+
+const defaultMessages = 'End-Of-Stream';
+/**
+ * Thrown on read operation of the end of file or stream has been reached
+ */
+class EndOfStreamError extends Error {
+ constructor() {
+ super(defaultMessages);
+ }
+}
+
+/**
+ * Core tokenizer
+ */
+class AbstractTokenizer {
+ constructor(fileInfo) {
+ /**
+ * Tokenizer-stream position
+ */
+ this.position = 0;
+ this.numBuffer = new Uint8Array(8);
+ this.fileInfo = fileInfo ? fileInfo : {};
+ }
+ /**
+ * Read a token from the tokenizer-stream
+ * @param token - The token to read
+ * @param position - If provided, the desired position in the tokenizer-stream
+ * @returns Promise with token data
+ */
+ async readToken(token, position = this.position) {
+ const uint8Array = node_buffer.Buffer.alloc(token.len);
+ const len = await this.readBuffer(uint8Array, { position });
+ if (len < token.len)
+ throw new EndOfStreamError();
+ return token.get(uint8Array, 0);
+ }
+ /**
+ * Peek a token from the tokenizer-stream.
+ * @param token - Token to peek from the tokenizer-stream.
+ * @param position - Offset where to begin reading within the file. If position is null, data will be read from the current file position.
+ * @returns Promise with token data
+ */
+ async peekToken(token, position = this.position) {
+ const uint8Array = node_buffer.Buffer.alloc(token.len);
+ const len = await this.peekBuffer(uint8Array, { position });
+ if (len < token.len)
+ throw new EndOfStreamError();
+ return token.get(uint8Array, 0);
+ }
+ /**
+ * Read a numeric token from the stream
+ * @param token - Numeric token
+ * @returns Promise with number
+ */
+ async readNumber(token) {
+ const len = await this.readBuffer(this.numBuffer, { length: token.len });
+ if (len < token.len)
+ throw new EndOfStreamError();
+ return token.get(this.numBuffer, 0);
+ }
+ /**
+ * Read a numeric token from the stream
+ * @param token - Numeric token
+ * @returns Promise with number
+ */
+ async peekNumber(token) {
+ const len = await this.peekBuffer(this.numBuffer, { length: token.len });
+ if (len < token.len)
+ throw new EndOfStreamError();
+ return token.get(this.numBuffer, 0);
+ }
+ /**
+ * Ignore number of bytes, advances the pointer in under tokenizer-stream.
+ * @param length - Number of bytes to ignore
+ * @return resolves the number of bytes ignored, equals length if this available, otherwise the number of bytes available
+ */
+ async ignore(length) {
+ if (this.fileInfo.size !== undefined) {
+ const bytesLeft = this.fileInfo.size - this.position;
+ if (length > bytesLeft) {
+ this.position += bytesLeft;
+ return bytesLeft;
+ }
+ }
+ this.position += length;
+ return length;
+ }
+ async close() {
+ // empty
+ }
+ normalizeOptions(uint8Array, options) {
+ if (options && options.position !== undefined && options.position < this.position) {
+ throw new Error('`options.position` must be equal or greater than `tokenizer.position`');
+ }
+ if (options) {
+ return {
+ mayBeLess: options.mayBeLess === true,
+ offset: options.offset ? options.offset : 0,
+ length: options.length ? options.length : (uint8Array.length - (options.offset ? options.offset : 0)),
+ position: options.position ? options.position : this.position
+ };
+ }
+ return {
+ mayBeLess: false,
+ offset: 0,
+ length: uint8Array.length,
+ position: this.position
+ };
+ }
+}
+
+class BufferTokenizer extends AbstractTokenizer {
+ /**
+ * Construct BufferTokenizer
+ * @param uint8Array - Uint8Array to tokenize
+ * @param fileInfo - Pass additional file information to the tokenizer
+ */
+ constructor(uint8Array, fileInfo) {
+ super(fileInfo);
+ this.uint8Array = uint8Array;
+ this.fileInfo.size = this.fileInfo.size ? this.fileInfo.size : uint8Array.length;
+ }
+ /**
+ * Read buffer from tokenizer
+ * @param uint8Array - Uint8Array to tokenize
+ * @param options - Read behaviour options
+ * @returns {Promise}
+ */
+ async readBuffer(uint8Array, options) {
+ if (options && options.position) {
+ if (options.position < this.position) {
+ throw new Error('`options.position` must be equal or greater than `tokenizer.position`');
+ }
+ this.position = options.position;
+ }
+ const bytesRead = await this.peekBuffer(uint8Array, options);
+ this.position += bytesRead;
+ return bytesRead;
+ }
+ /**
+ * Peek (read ahead) buffer from tokenizer
+ * @param uint8Array
+ * @param options - Read behaviour options
+ * @returns {Promise}
+ */
+ async peekBuffer(uint8Array, options) {
+ const normOptions = this.normalizeOptions(uint8Array, options);
+ const bytes2read = Math.min(this.uint8Array.length - normOptions.position, normOptions.length);
+ if ((!normOptions.mayBeLess) && bytes2read < normOptions.length) {
+ throw new EndOfStreamError();
+ }
+ else {
+ uint8Array.set(this.uint8Array.subarray(normOptions.position, normOptions.position + bytes2read), normOptions.offset);
+ return bytes2read;
+ }
+ }
+ async close() {
+ // empty
+ }
+}
+
+/**
+ * Construct ReadStreamTokenizer from given Buffer.
+ * @param uint8Array - Uint8Array to tokenize
+ * @param fileInfo - Pass additional file information to the tokenizer
+ * @returns BufferTokenizer
+ */
+function fromBuffer(uint8Array, fileInfo) {
+ return new BufferTokenizer(uint8Array, fileInfo);
+}
+
+function stringToBytes(string) {
+ return [...string].map(character => character.charCodeAt(0)); // eslint-disable-line unicorn/prefer-code-point
+}
+
+/**
+Checks whether the TAR checksum is valid.
+
+@param {Buffer} buffer - The TAR header `[offset ... offset + 512]`.
+@param {number} offset - TAR header offset.
+@returns {boolean} `true` if the TAR checksum is valid, otherwise `false`.
+*/
+function tarHeaderChecksumMatches(buffer, offset = 0) {
+ const readSum = Number.parseInt(buffer.toString('utf8', 148, 154).replace(/\0.*$/, '').trim(), 8); // Read sum in header
+ if (Number.isNaN(readSum)) {
+ return false;
+ }
+
+ let sum = 8 * 0x20; // Initialize signed bit sum
+
+ for (let index = offset; index < offset + 148; index++) {
+ sum += buffer[index];
+ }
+
+ for (let index = offset + 156; index < offset + 512; index++) {
+ sum += buffer[index];
+ }
+
+ return readSum === sum;
+}
+
+/**
+ID3 UINT32 sync-safe tokenizer token.
+28 bits (representing up to 256MB) integer, the msb is 0 to avoid "false syncsignals".
+*/
+const uint32SyncSafeToken = {
+ get: (buffer, offset) => (buffer[offset + 3] & 0x7F) | ((buffer[offset + 2]) << 7) | ((buffer[offset + 1]) << 14) | ((buffer[offset]) << 21),
+ len: 4,
+};
+
+const extensions = [
+ 'jpg',
+ 'png',
+ 'apng',
+ 'gif',
+ 'webp',
+ 'flif',
+ 'xcf',
+ 'cr2',
+ 'cr3',
+ 'orf',
+ 'arw',
+ 'dng',
+ 'nef',
+ 'rw2',
+ 'raf',
+ 'tif',
+ 'bmp',
+ 'icns',
+ 'jxr',
+ 'psd',
+ 'indd',
+ 'zip',
+ 'tar',
+ 'rar',
+ 'gz',
+ 'bz2',
+ '7z',
+ 'dmg',
+ 'mp4',
+ 'mid',
+ 'mkv',
+ 'webm',
+ 'mov',
+ 'avi',
+ 'mpg',
+ 'mp2',
+ 'mp3',
+ 'm4a',
+ 'oga',
+ 'ogg',
+ 'ogv',
+ 'opus',
+ 'flac',
+ 'wav',
+ 'spx',
+ 'amr',
+ 'pdf',
+ 'epub',
+ 'elf',
+ 'exe',
+ 'swf',
+ 'rtf',
+ 'wasm',
+ 'woff',
+ 'woff2',
+ 'eot',
+ 'ttf',
+ 'otf',
+ 'ico',
+ 'flv',
+ 'ps',
+ 'xz',
+ 'sqlite',
+ 'nes',
+ 'crx',
+ 'xpi',
+ 'cab',
+ 'deb',
+ 'ar',
+ 'rpm',
+ 'Z',
+ 'lz',
+ 'cfb',
+ 'mxf',
+ 'mts',
+ 'blend',
+ 'bpg',
+ 'docx',
+ 'pptx',
+ 'xlsx',
+ '3gp',
+ '3g2',
+ 'j2c',
+ 'jp2',
+ 'jpm',
+ 'jpx',
+ 'mj2',
+ 'aif',
+ 'qcp',
+ 'odt',
+ 'ods',
+ 'odp',
+ 'xml',
+ 'mobi',
+ 'heic',
+ 'cur',
+ 'ktx',
+ 'ape',
+ 'wv',
+ 'dcm',
+ 'ics',
+ 'glb',
+ 'pcap',
+ 'dsf',
+ 'lnk',
+ 'alias',
+ 'voc',
+ 'ac3',
+ 'm4v',
+ 'm4p',
+ 'm4b',
+ 'f4v',
+ 'f4p',
+ 'f4b',
+ 'f4a',
+ 'mie',
+ 'asf',
+ 'ogm',
+ 'ogx',
+ 'mpc',
+ 'arrow',
+ 'shp',
+ 'aac',
+ 'mp1',
+ 'it',
+ 's3m',
+ 'xm',
+ 'ai',
+ 'skp',
+ 'avif',
+ 'eps',
+ 'lzh',
+ 'pgp',
+ 'asar',
+ 'stl',
+ 'chm',
+ '3mf',
+ 'zst',
+ 'jxl',
+ 'vcf',
+ 'jls',
+ 'pst',
+ 'dwg',
+ 'parquet',
+ 'class',
+ 'arj',
+ 'cpio',
+ 'ace',
+ 'avro',
+];
+
+const mimeTypes = [
+ 'image/jpeg',
+ 'image/png',
+ 'image/gif',
+ 'image/webp',
+ 'image/flif',
+ 'image/x-xcf',
+ 'image/x-canon-cr2',
+ 'image/x-canon-cr3',
+ 'image/tiff',
+ 'image/bmp',
+ 'image/vnd.ms-photo',
+ 'image/vnd.adobe.photoshop',
+ 'application/x-indesign',
+ 'application/epub+zip',
+ 'application/x-xpinstall',
+ 'application/vnd.oasis.opendocument.text',
+ 'application/vnd.oasis.opendocument.spreadsheet',
+ 'application/vnd.oasis.opendocument.presentation',
+ 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+ 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
+ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+ 'application/zip',
+ 'application/x-tar',
+ 'application/x-rar-compressed',
+ 'application/gzip',
+ 'application/x-bzip2',
+ 'application/x-7z-compressed',
+ 'application/x-apple-diskimage',
+ 'application/x-apache-arrow',
+ 'video/mp4',
+ 'audio/midi',
+ 'video/x-matroska',
+ 'video/webm',
+ 'video/quicktime',
+ 'video/vnd.avi',
+ 'audio/vnd.wave',
+ 'audio/qcelp',
+ 'audio/x-ms-asf',
+ 'video/x-ms-asf',
+ 'application/vnd.ms-asf',
+ 'video/mpeg',
+ 'video/3gpp',
+ 'audio/mpeg',
+ 'audio/mp4', // RFC 4337
+ 'audio/opus',
+ 'video/ogg',
+ 'audio/ogg',
+ 'application/ogg',
+ 'audio/x-flac',
+ 'audio/ape',
+ 'audio/wavpack',
+ 'audio/amr',
+ 'application/pdf',
+ 'application/x-elf',
+ 'application/x-msdownload',
+ 'application/x-shockwave-flash',
+ 'application/rtf',
+ 'application/wasm',
+ 'font/woff',
+ 'font/woff2',
+ 'application/vnd.ms-fontobject',
+ 'font/ttf',
+ 'font/otf',
+ 'image/x-icon',
+ 'video/x-flv',
+ 'application/postscript',
+ 'application/eps',
+ 'application/x-xz',
+ 'application/x-sqlite3',
+ 'application/x-nintendo-nes-rom',
+ 'application/x-google-chrome-extension',
+ 'application/vnd.ms-cab-compressed',
+ 'application/x-deb',
+ 'application/x-unix-archive',
+ 'application/x-rpm',
+ 'application/x-compress',
+ 'application/x-lzip',
+ 'application/x-cfb',
+ 'application/x-mie',
+ 'application/mxf',
+ 'video/mp2t',
+ 'application/x-blender',
+ 'image/bpg',
+ 'image/j2c',
+ 'image/jp2',
+ 'image/jpx',
+ 'image/jpm',
+ 'image/mj2',
+ 'audio/aiff',
+ 'application/xml',
+ 'application/x-mobipocket-ebook',
+ 'image/heif',
+ 'image/heif-sequence',
+ 'image/heic',
+ 'image/heic-sequence',
+ 'image/icns',
+ 'image/ktx',
+ 'application/dicom',
+ 'audio/x-musepack',
+ 'text/calendar',
+ 'text/vcard',
+ 'model/gltf-binary',
+ 'application/vnd.tcpdump.pcap',
+ 'audio/x-dsf', // Non-standard
+ 'application/x.ms.shortcut', // Invented by us
+ 'application/x.apple.alias', // Invented by us
+ 'audio/x-voc',
+ 'audio/vnd.dolby.dd-raw',
+ 'audio/x-m4a',
+ 'image/apng',
+ 'image/x-olympus-orf',
+ 'image/x-sony-arw',
+ 'image/x-adobe-dng',
+ 'image/x-nikon-nef',
+ 'image/x-panasonic-rw2',
+ 'image/x-fujifilm-raf',
+ 'video/x-m4v',
+ 'video/3gpp2',
+ 'application/x-esri-shape',
+ 'audio/aac',
+ 'audio/x-it',
+ 'audio/x-s3m',
+ 'audio/x-xm',
+ 'video/MP1S',
+ 'video/MP2P',
+ 'application/vnd.sketchup.skp',
+ 'image/avif',
+ 'application/x-lzh-compressed',
+ 'application/pgp-encrypted',
+ 'application/x-asar',
+ 'model/stl',
+ 'application/vnd.ms-htmlhelp',
+ 'model/3mf',
+ 'image/jxl',
+ 'application/zstd',
+ 'image/jls',
+ 'application/vnd.ms-outlook',
+ 'image/vnd.dwg',
+ 'application/x-parquet',
+ 'application/java-vm',
+ 'application/x-arj',
+ 'application/x-cpio',
+ 'application/x-ace-compressed',
+ 'application/avro',
+];
+
+const minimumBytes = 4100; // A fair amount of file-types are detectable within this range.
+
+async function fileTypeFromBuffer(input) {
+ if (!(input instanceof Uint8Array || input instanceof ArrayBuffer)) {
+ throw new TypeError(`Expected the \`input\` argument to be of type \`Uint8Array\` or \`Buffer\` or \`ArrayBuffer\`, got \`${typeof input}\``);
+ }
+
+ const buffer = input instanceof Uint8Array ? input : new Uint8Array(input);
+
+ if (!(buffer?.length > 1)) {
+ return;
+ }
+
+ return fileTypeFromTokenizer(fromBuffer(buffer));
+}
+
+function _check(buffer, headers, options) {
+ options = {
+ offset: 0,
+ ...options,
+ };
+
+ for (const [index, header] of headers.entries()) {
+ // If a bitmask is set
+ if (options.mask) {
+ // If header doesn't equal `buf` with bits masked off
+ if (header !== (options.mask[index] & buffer[index + options.offset])) {
+ return false;
+ }
+ } else if (header !== buffer[index + options.offset]) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+async function fileTypeFromTokenizer(tokenizer) {
+ try {
+ return new FileTypeParser().parse(tokenizer);
+ } catch (error) {
+ if (!(error instanceof EndOfStreamError)) {
+ throw error;
+ }
+ }
+}
+
+class FileTypeParser {
+ check(header, options) {
+ return _check(this.buffer, header, options);
+ }
+
+ checkString(header, options) {
+ return this.check(stringToBytes(header), options);
+ }
+
+ async parse(tokenizer) {
+ this.buffer = node_buffer.Buffer.alloc(minimumBytes);
+
+ // Keep reading until EOF if the file size is unknown.
+ if (tokenizer.fileInfo.size === undefined) {
+ tokenizer.fileInfo.size = Number.MAX_SAFE_INTEGER;
+ }
+
+ this.tokenizer = tokenizer;
+
+ await tokenizer.peekBuffer(this.buffer, {length: 12, mayBeLess: true});
+
+ // -- 2-byte signatures --
+
+ if (this.check([0x42, 0x4D])) {
+ return {
+ ext: 'bmp',
+ mime: 'image/bmp',
+ };
+ }
+
+ if (this.check([0x0B, 0x77])) {
+ return {
+ ext: 'ac3',
+ mime: 'audio/vnd.dolby.dd-raw',
+ };
+ }
+
+ if (this.check([0x78, 0x01])) {
+ return {
+ ext: 'dmg',
+ mime: 'application/x-apple-diskimage',
+ };
+ }
+
+ if (this.check([0x4D, 0x5A])) {
+ return {
+ ext: 'exe',
+ mime: 'application/x-msdownload',
+ };
+ }
+
+ if (this.check([0x25, 0x21])) {
+ await tokenizer.peekBuffer(this.buffer, {length: 24, mayBeLess: true});
+
+ if (
+ this.checkString('PS-Adobe-', {offset: 2})
+ && this.checkString(' EPSF-', {offset: 14})
+ ) {
+ return {
+ ext: 'eps',
+ mime: 'application/eps',
+ };
+ }
+
+ return {
+ ext: 'ps',
+ mime: 'application/postscript',
+ };
+ }
+
+ if (
+ this.check([0x1F, 0xA0])
+ || this.check([0x1F, 0x9D])
+ ) {
+ return {
+ ext: 'Z',
+ mime: 'application/x-compress',
+ };
+ }
+
+ if (this.check([0xC7, 0x71])) {
+ return {
+ ext: 'cpio',
+ mime: 'application/x-cpio',
+ };
+ }
+
+ if (this.check([0x60, 0xEA])) {
+ return {
+ ext: 'arj',
+ mime: 'application/x-arj',
+ };
+ }
+
+ // -- 3-byte signatures --
+
+ if (this.check([0xEF, 0xBB, 0xBF])) { // UTF-8-BOM
+ // Strip off UTF-8-BOM
+ this.tokenizer.ignore(3);
+ return this.parse(tokenizer);
+ }
+
+ if (this.check([0x47, 0x49, 0x46])) {
+ return {
+ ext: 'gif',
+ mime: 'image/gif',
+ };
+ }
+
+ if (this.check([0x49, 0x49, 0xBC])) {
+ return {
+ ext: 'jxr',
+ mime: 'image/vnd.ms-photo',
+ };
+ }
+
+ if (this.check([0x1F, 0x8B, 0x8])) {
+ return {
+ ext: 'gz',
+ mime: 'application/gzip',
+ };
+ }
+
+ if (this.check([0x42, 0x5A, 0x68])) {
+ return {
+ ext: 'bz2',
+ mime: 'application/x-bzip2',
+ };
+ }
+
+ if (this.checkString('ID3')) {
+ await tokenizer.ignore(6); // Skip ID3 header until the header size
+ const id3HeaderLength = await tokenizer.readToken(uint32SyncSafeToken);
+ if (tokenizer.position + id3HeaderLength > tokenizer.fileInfo.size) {
+ // Guess file type based on ID3 header for backward compatibility
+ return {
+ ext: 'mp3',
+ mime: 'audio/mpeg',
+ };
+ }
+
+ await tokenizer.ignore(id3HeaderLength);
+ return fileTypeFromTokenizer(tokenizer); // Skip ID3 header, recursion
+ }
+
+ // Musepack, SV7
+ if (this.checkString('MP+')) {
+ return {
+ ext: 'mpc',
+ mime: 'audio/x-musepack',
+ };
+ }
+
+ if (
+ (this.buffer[0] === 0x43 || this.buffer[0] === 0x46)
+ && this.check([0x57, 0x53], {offset: 1})
+ ) {
+ return {
+ ext: 'swf',
+ mime: 'application/x-shockwave-flash',
+ };
+ }
+
+ // -- 4-byte signatures --
+
+ // Requires a sample size of 4 bytes
+ if (this.check([0xFF, 0xD8, 0xFF])) {
+ if (this.check([0xF7], {offset: 3})) { // JPG7/SOF55, indicating a ISO/IEC 14495 / JPEG-LS file
+ return {
+ ext: 'jls',
+ mime: 'image/jls',
+ };
+ }
+
+ return {
+ ext: 'jpg',
+ mime: 'image/jpeg',
+ };
+ }
+
+ if (this.check([0x4F, 0x62, 0x6A, 0x01])) {
+ return {
+ ext: 'avro',
+ mime: 'application/avro',
+ };
+ }
+
+ if (this.checkString('FLIF')) {
+ return {
+ ext: 'flif',
+ mime: 'image/flif',
+ };
+ }
+
+ if (this.checkString('8BPS')) {
+ return {
+ ext: 'psd',
+ mime: 'image/vnd.adobe.photoshop',
+ };
+ }
+
+ if (this.checkString('WEBP', {offset: 8})) {
+ return {
+ ext: 'webp',
+ mime: 'image/webp',
+ };
+ }
+
+ // Musepack, SV8
+ if (this.checkString('MPCK')) {
+ return {
+ ext: 'mpc',
+ mime: 'audio/x-musepack',
+ };
+ }
+
+ if (this.checkString('FORM')) {
+ return {
+ ext: 'aif',
+ mime: 'audio/aiff',
+ };
+ }
+
+ if (this.checkString('icns', {offset: 0})) {
+ return {
+ ext: 'icns',
+ mime: 'image/icns',
+ };
+ }
+
+ // Zip-based file formats
+ // Need to be before the `zip` check
+ if (this.check([0x50, 0x4B, 0x3, 0x4])) { // Local file header signature
+ try {
+ while (tokenizer.position + 30 < tokenizer.fileInfo.size) {
+ await tokenizer.readBuffer(this.buffer, {length: 30});
+
+ // https://en.wikipedia.org/wiki/Zip_(file_format)#File_headers
+ const zipHeader = {
+ compressedSize: this.buffer.readUInt32LE(18),
+ uncompressedSize: this.buffer.readUInt32LE(22),
+ filenameLength: this.buffer.readUInt16LE(26),
+ extraFieldLength: this.buffer.readUInt16LE(28),
+ };
+
+ zipHeader.filename = await tokenizer.readToken(new StringType(zipHeader.filenameLength, 'utf-8'));
+ await tokenizer.ignore(zipHeader.extraFieldLength);
+
+ // Assumes signed `.xpi` from addons.mozilla.org
+ if (zipHeader.filename === 'META-INF/mozilla.rsa') {
+ return {
+ ext: 'xpi',
+ mime: 'application/x-xpinstall',
+ };
+ }
+
+ if (zipHeader.filename.endsWith('.rels') || zipHeader.filename.endsWith('.xml')) {
+ const type = zipHeader.filename.split('/')[0];
+ switch (type) {
+ case '_rels':
+ break;
+ case 'word':
+ return {
+ ext: 'docx',
+ mime: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+ };
+ case 'ppt':
+ return {
+ ext: 'pptx',
+ mime: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
+ };
+ case 'xl':
+ return {
+ ext: 'xlsx',
+ mime: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+ };
+ default:
+ break;
+ }
+ }
+
+ if (zipHeader.filename.startsWith('xl/')) {
+ return {
+ ext: 'xlsx',
+ mime: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+ };
+ }
+
+ if (zipHeader.filename.startsWith('3D/') && zipHeader.filename.endsWith('.model')) {
+ return {
+ ext: '3mf',
+ mime: 'model/3mf',
+ };
+ }
+
+ // The docx, xlsx and pptx file types extend the Office Open XML file format:
+ // https://en.wikipedia.org/wiki/Office_Open_XML_file_formats
+ // We look for:
+ // - one entry named '[Content_Types].xml' or '_rels/.rels',
+ // - one entry indicating specific type of file.
+ // MS Office, OpenOffice and LibreOffice may put the parts in different order, so the check should not rely on it.
+ if (zipHeader.filename === 'mimetype' && zipHeader.compressedSize === zipHeader.uncompressedSize) {
+ let mimeType = await tokenizer.readToken(new StringType(zipHeader.compressedSize, 'utf-8'));
+ mimeType = mimeType.trim();
+
+ switch (mimeType) {
+ case 'application/epub+zip':
+ return {
+ ext: 'epub',
+ mime: 'application/epub+zip',
+ };
+ case 'application/vnd.oasis.opendocument.text':
+ return {
+ ext: 'odt',
+ mime: 'application/vnd.oasis.opendocument.text',
+ };
+ case 'application/vnd.oasis.opendocument.spreadsheet':
+ return {
+ ext: 'ods',
+ mime: 'application/vnd.oasis.opendocument.spreadsheet',
+ };
+ case 'application/vnd.oasis.opendocument.presentation':
+ return {
+ ext: 'odp',
+ mime: 'application/vnd.oasis.opendocument.presentation',
+ };
+ default:
+ }
+ }
+
+ // Try to find next header manually when current one is corrupted
+ if (zipHeader.compressedSize === 0) {
+ let nextHeaderIndex = -1;
+
+ while (nextHeaderIndex < 0 && (tokenizer.position < tokenizer.fileInfo.size)) {
+ await tokenizer.peekBuffer(this.buffer, {mayBeLess: true});
+
+ nextHeaderIndex = this.buffer.indexOf('504B0304', 0, 'hex');
+ // Move position to the next header if found, skip the whole buffer otherwise
+ await tokenizer.ignore(nextHeaderIndex >= 0 ? nextHeaderIndex : this.buffer.length);
+ }
+ } else {
+ await tokenizer.ignore(zipHeader.compressedSize);
+ }
+ }
+ } catch (error) {
+ if (!(error instanceof EndOfStreamError)) {
+ throw error;
+ }
+ }
+
+ return {
+ ext: 'zip',
+ mime: 'application/zip',
+ };
+ }
+
+ if (this.checkString('OggS')) {
+ // This is an OGG container
+ await tokenizer.ignore(28);
+ const type = node_buffer.Buffer.alloc(8);
+ await tokenizer.readBuffer(type);
+
+ // Needs to be before `ogg` check
+ if (_check(type, [0x4F, 0x70, 0x75, 0x73, 0x48, 0x65, 0x61, 0x64])) {
+ return {
+ ext: 'opus',
+ mime: 'audio/opus',
+ };
+ }
+
+ // If ' theora' in header.
+ if (_check(type, [0x80, 0x74, 0x68, 0x65, 0x6F, 0x72, 0x61])) {
+ return {
+ ext: 'ogv',
+ mime: 'video/ogg',
+ };
+ }
+
+ // If '\x01video' in header.
+ if (_check(type, [0x01, 0x76, 0x69, 0x64, 0x65, 0x6F, 0x00])) {
+ return {
+ ext: 'ogm',
+ mime: 'video/ogg',
+ };
+ }
+
+ // If ' FLAC' in header https://xiph.org/flac/faq.html
+ if (_check(type, [0x7F, 0x46, 0x4C, 0x41, 0x43])) {
+ return {
+ ext: 'oga',
+ mime: 'audio/ogg',
+ };
+ }
+
+ // 'Speex ' in header https://en.wikipedia.org/wiki/Speex
+ if (_check(type, [0x53, 0x70, 0x65, 0x65, 0x78, 0x20, 0x20])) {
+ return {
+ ext: 'spx',
+ mime: 'audio/ogg',
+ };
+ }
+
+ // If '\x01vorbis' in header
+ if (_check(type, [0x01, 0x76, 0x6F, 0x72, 0x62, 0x69, 0x73])) {
+ return {
+ ext: 'ogg',
+ mime: 'audio/ogg',
+ };
+ }
+
+ // Default OGG container https://www.iana.org/assignments/media-types/application/ogg
+ return {
+ ext: 'ogx',
+ mime: 'application/ogg',
+ };
+ }
+
+ if (
+ this.check([0x50, 0x4B])
+ && (this.buffer[2] === 0x3 || this.buffer[2] === 0x5 || this.buffer[2] === 0x7)
+ && (this.buffer[3] === 0x4 || this.buffer[3] === 0x6 || this.buffer[3] === 0x8)
+ ) {
+ return {
+ ext: 'zip',
+ mime: 'application/zip',
+ };
+ }
+
+ //
+
+ // File Type Box (https://en.wikipedia.org/wiki/ISO_base_media_file_format)
+ // It's not required to be first, but it's recommended to be. Almost all ISO base media files start with `ftyp` box.
+ // `ftyp` box must contain a brand major identifier, which must consist of ISO 8859-1 printable characters.
+ // Here we check for 8859-1 printable characters (for simplicity, it's a mask which also catches one non-printable character).
+ if (
+ this.checkString('ftyp', {offset: 4})
+ && (this.buffer[8] & 0x60) !== 0x00 // Brand major, first character ASCII?
+ ) {
+ // They all can have MIME `video/mp4` except `application/mp4` special-case which is hard to detect.
+ // For some cases, we're specific, everything else falls to `video/mp4` with `mp4` extension.
+ const brandMajor = this.buffer.toString('binary', 8, 12).replace('\0', ' ').trim();
+ switch (brandMajor) {
+ case 'avif':
+ case 'avis':
+ return {ext: 'avif', mime: 'image/avif'};
+ case 'mif1':
+ return {ext: 'heic', mime: 'image/heif'};
+ case 'msf1':
+ return {ext: 'heic', mime: 'image/heif-sequence'};
+ case 'heic':
+ case 'heix':
+ return {ext: 'heic', mime: 'image/heic'};
+ case 'hevc':
+ case 'hevx':
+ return {ext: 'heic', mime: 'image/heic-sequence'};
+ case 'qt':
+ return {ext: 'mov', mime: 'video/quicktime'};
+ case 'M4V':
+ case 'M4VH':
+ case 'M4VP':
+ return {ext: 'm4v', mime: 'video/x-m4v'};
+ case 'M4P':
+ return {ext: 'm4p', mime: 'video/mp4'};
+ case 'M4B':
+ return {ext: 'm4b', mime: 'audio/mp4'};
+ case 'M4A':
+ return {ext: 'm4a', mime: 'audio/x-m4a'};
+ case 'F4V':
+ return {ext: 'f4v', mime: 'video/mp4'};
+ case 'F4P':
+ return {ext: 'f4p', mime: 'video/mp4'};
+ case 'F4A':
+ return {ext: 'f4a', mime: 'audio/mp4'};
+ case 'F4B':
+ return {ext: 'f4b', mime: 'audio/mp4'};
+ case 'crx':
+ return {ext: 'cr3', mime: 'image/x-canon-cr3'};
+ default:
+ if (brandMajor.startsWith('3g')) {
+ if (brandMajor.startsWith('3g2')) {
+ return {ext: '3g2', mime: 'video/3gpp2'};
+ }
+
+ return {ext: '3gp', mime: 'video/3gpp'};
+ }
+
+ return {ext: 'mp4', mime: 'video/mp4'};
+ }
+ }
+
+ if (this.checkString('MThd')) {
+ return {
+ ext: 'mid',
+ mime: 'audio/midi',
+ };
+ }
+
+ if (
+ this.checkString('wOFF')
+ && (
+ this.check([0x00, 0x01, 0x00, 0x00], {offset: 4})
+ || this.checkString('OTTO', {offset: 4})
+ )
+ ) {
+ return {
+ ext: 'woff',
+ mime: 'font/woff',
+ };
+ }
+
+ if (
+ this.checkString('wOF2')
+ && (
+ this.check([0x00, 0x01, 0x00, 0x00], {offset: 4})
+ || this.checkString('OTTO', {offset: 4})
+ )
+ ) {
+ return {
+ ext: 'woff2',
+ mime: 'font/woff2',
+ };
+ }
+
+ if (this.check([0xD4, 0xC3, 0xB2, 0xA1]) || this.check([0xA1, 0xB2, 0xC3, 0xD4])) {
+ return {
+ ext: 'pcap',
+ mime: 'application/vnd.tcpdump.pcap',
+ };
+ }
+
+ // Sony DSD Stream File (DSF)
+ if (this.checkString('DSD ')) {
+ return {
+ ext: 'dsf',
+ mime: 'audio/x-dsf', // Non-standard
+ };
+ }
+
+ if (this.checkString('LZIP')) {
+ return {
+ ext: 'lz',
+ mime: 'application/x-lzip',
+ };
+ }
+
+ if (this.checkString('fLaC')) {
+ return {
+ ext: 'flac',
+ mime: 'audio/x-flac',
+ };
+ }
+
+ if (this.check([0x42, 0x50, 0x47, 0xFB])) {
+ return {
+ ext: 'bpg',
+ mime: 'image/bpg',
+ };
+ }
+
+ if (this.checkString('wvpk')) {
+ return {
+ ext: 'wv',
+ mime: 'audio/wavpack',
+ };
+ }
+
+ if (this.checkString('%PDF')) {
+ try {
+ await tokenizer.ignore(1350);
+ const maxBufferSize = 10 * 1024 * 1024;
+ const buffer = node_buffer.Buffer.alloc(Math.min(maxBufferSize, tokenizer.fileInfo.size));
+ await tokenizer.readBuffer(buffer, {mayBeLess: true});
+
+ // Check if this is an Adobe Illustrator file
+ if (buffer.includes(node_buffer.Buffer.from('AIPrivateData'))) {
+ return {
+ ext: 'ai',
+ mime: 'application/postscript',
+ };
+ }
+ } catch (error) {
+ // Swallow end of stream error if file is too small for the Adobe AI check
+ if (!(error instanceof EndOfStreamError)) {
+ throw error;
+ }
+ }
+
+ // Assume this is just a normal PDF
+ return {
+ ext: 'pdf',
+ mime: 'application/pdf',
+ };
+ }
+
+ if (this.check([0x00, 0x61, 0x73, 0x6D])) {
+ return {
+ ext: 'wasm',
+ mime: 'application/wasm',
+ };
+ }
+
+ // TIFF, little-endian type
+ if (this.check([0x49, 0x49])) {
+ const fileType = await this.readTiffHeader(false);
+ if (fileType) {
+ return fileType;
+ }
+ }
+
+ // TIFF, big-endian type
+ if (this.check([0x4D, 0x4D])) {
+ const fileType = await this.readTiffHeader(true);
+ if (fileType) {
+ return fileType;
+ }
+ }
+
+ if (this.checkString('MAC ')) {
+ return {
+ ext: 'ape',
+ mime: 'audio/ape',
+ };
+ }
+
+ // https://github.com/threatstack/libmagic/blob/master/magic/Magdir/matroska
+ if (this.check([0x1A, 0x45, 0xDF, 0xA3])) { // Root element: EBML
+ async function readField() {
+ const msb = await tokenizer.peekNumber(UINT8);
+ let mask = 0x80;
+ let ic = 0; // 0 = A, 1 = B, 2 = C, 3
+ // = D
+
+ while ((msb & mask) === 0 && mask !== 0) {
+ ++ic;
+ mask >>= 1;
+ }
+
+ const id = node_buffer.Buffer.alloc(ic + 1);
+ await tokenizer.readBuffer(id);
+ return id;
+ }
+
+ async function readElement() {
+ const id = await readField();
+ const lengthField = await readField();
+ lengthField[0] ^= 0x80 >> (lengthField.length - 1);
+ const nrLength = Math.min(6, lengthField.length); // JavaScript can max read 6 bytes integer
+ return {
+ id: id.readUIntBE(0, id.length),
+ len: lengthField.readUIntBE(lengthField.length - nrLength, nrLength),
+ };
+ }
+
+ async function readChildren(children) {
+ while (children > 0) {
+ const element = await readElement();
+ if (element.id === 0x42_82) {
+ const rawValue = await tokenizer.readToken(new StringType(element.len, 'utf-8'));
+ return rawValue.replace(/\00.*$/g, ''); // Return DocType
+ }
+
+ await tokenizer.ignore(element.len); // ignore payload
+ --children;
+ }
+ }
+
+ const re = await readElement();
+ const docType = await readChildren(re.len);
+
+ switch (docType) {
+ case 'webm':
+ return {
+ ext: 'webm',
+ mime: 'video/webm',
+ };
+
+ case 'matroska':
+ return {
+ ext: 'mkv',
+ mime: 'video/x-matroska',
+ };
+
+ default:
+ return;
+ }
+ }
+
+ // RIFF file format which might be AVI, WAV, QCP, etc
+ if (this.check([0x52, 0x49, 0x46, 0x46])) {
+ if (this.check([0x41, 0x56, 0x49], {offset: 8})) {
+ return {
+ ext: 'avi',
+ mime: 'video/vnd.avi',
+ };
+ }
+
+ if (this.check([0x57, 0x41, 0x56, 0x45], {offset: 8})) {
+ return {
+ ext: 'wav',
+ mime: 'audio/vnd.wave',
+ };
+ }
+
+ // QLCM, QCP file
+ if (this.check([0x51, 0x4C, 0x43, 0x4D], {offset: 8})) {
+ return {
+ ext: 'qcp',
+ mime: 'audio/qcelp',
+ };
+ }
+ }
+
+ if (this.checkString('SQLi')) {
+ return {
+ ext: 'sqlite',
+ mime: 'application/x-sqlite3',
+ };
+ }
+
+ if (this.check([0x4E, 0x45, 0x53, 0x1A])) {
+ return {
+ ext: 'nes',
+ mime: 'application/x-nintendo-nes-rom',
+ };
+ }
+
+ if (this.checkString('Cr24')) {
+ return {
+ ext: 'crx',
+ mime: 'application/x-google-chrome-extension',
+ };
+ }
+
+ if (
+ this.checkString('MSCF')
+ || this.checkString('ISc(')
+ ) {
+ return {
+ ext: 'cab',
+ mime: 'application/vnd.ms-cab-compressed',
+ };
+ }
+
+ if (this.check([0xED, 0xAB, 0xEE, 0xDB])) {
+ return {
+ ext: 'rpm',
+ mime: 'application/x-rpm',
+ };
+ }
+
+ if (this.check([0xC5, 0xD0, 0xD3, 0xC6])) {
+ return {
+ ext: 'eps',
+ mime: 'application/eps',
+ };
+ }
+
+ if (this.check([0x28, 0xB5, 0x2F, 0xFD])) {
+ return {
+ ext: 'zst',
+ mime: 'application/zstd',
+ };
+ }
+
+ if (this.check([0x7F, 0x45, 0x4C, 0x46])) {
+ return {
+ ext: 'elf',
+ mime: 'application/x-elf',
+ };
+ }
+
+ if (this.check([0x21, 0x42, 0x44, 0x4E])) {
+ return {
+ ext: 'pst',
+ mime: 'application/vnd.ms-outlook',
+ };
+ }
+
+ if (this.checkString('PAR1')) {
+ return {
+ ext: 'parquet',
+ mime: 'application/x-parquet',
+ };
+ }
+
+ // -- 5-byte signatures --
+
+ if (this.check([0x4F, 0x54, 0x54, 0x4F, 0x00])) {
+ return {
+ ext: 'otf',
+ mime: 'font/otf',
+ };
+ }
+
+ if (this.checkString('#!AMR')) {
+ return {
+ ext: 'amr',
+ mime: 'audio/amr',
+ };
+ }
+
+ if (this.checkString('{\\rtf')) {
+ return {
+ ext: 'rtf',
+ mime: 'application/rtf',
+ };
+ }
+
+ if (this.check([0x46, 0x4C, 0x56, 0x01])) {
+ return {
+ ext: 'flv',
+ mime: 'video/x-flv',
+ };
+ }
+
+ if (this.checkString('IMPM')) {
+ return {
+ ext: 'it',
+ mime: 'audio/x-it',
+ };
+ }
+
+ if (
+ this.checkString('-lh0-', {offset: 2})
+ || this.checkString('-lh1-', {offset: 2})
+ || this.checkString('-lh2-', {offset: 2})
+ || this.checkString('-lh3-', {offset: 2})
+ || this.checkString('-lh4-', {offset: 2})
+ || this.checkString('-lh5-', {offset: 2})
+ || this.checkString('-lh6-', {offset: 2})
+ || this.checkString('-lh7-', {offset: 2})
+ || this.checkString('-lzs-', {offset: 2})
+ || this.checkString('-lz4-', {offset: 2})
+ || this.checkString('-lz5-', {offset: 2})
+ || this.checkString('-lhd-', {offset: 2})
+ ) {
+ return {
+ ext: 'lzh',
+ mime: 'application/x-lzh-compressed',
+ };
+ }
+
+ // MPEG program stream (PS or MPEG-PS)
+ if (this.check([0x00, 0x00, 0x01, 0xBA])) {
+ // MPEG-PS, MPEG-1 Part 1
+ if (this.check([0x21], {offset: 4, mask: [0xF1]})) {
+ return {
+ ext: 'mpg', // May also be .ps, .mpeg
+ mime: 'video/MP1S',
+ };
+ }
+
+ // MPEG-PS, MPEG-2 Part 1
+ if (this.check([0x44], {offset: 4, mask: [0xC4]})) {
+ return {
+ ext: 'mpg', // May also be .mpg, .m2p, .vob or .sub
+ mime: 'video/MP2P',
+ };
+ }
+ }
+
+ if (this.checkString('ITSF')) {
+ return {
+ ext: 'chm',
+ mime: 'application/vnd.ms-htmlhelp',
+ };
+ }
+
+ if (this.check([0xCA, 0xFE, 0xBA, 0xBE])) {
+ return {
+ ext: 'class',
+ mime: 'application/java-vm',
+ };
+ }
+
+ // -- 6-byte signatures --
+
+ if (this.check([0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00])) {
+ return {
+ ext: 'xz',
+ mime: 'application/x-xz',
+ };
+ }
+
+ if (this.checkString('= 1000 && version <= 1050) {
+ return {
+ ext: 'dwg',
+ mime: 'image/vnd.dwg',
+ };
+ }
+ }
+
+ if (this.checkString('070707')) {
+ return {
+ ext: 'cpio',
+ mime: 'application/x-cpio',
+ };
+ }
+
+ // -- 7-byte signatures --
+
+ if (this.checkString('BLENDER')) {
+ return {
+ ext: 'blend',
+ mime: 'application/x-blender',
+ };
+ }
+
+ if (this.checkString('!')) {
+ await tokenizer.ignore(8);
+ const string = await tokenizer.readToken(new StringType(13, 'ascii'));
+ if (string === 'debian-binary') {
+ return {
+ ext: 'deb',
+ mime: 'application/x-deb',
+ };
+ }
+
+ return {
+ ext: 'ar',
+ mime: 'application/x-unix-archive',
+ };
+ }
+
+ if (this.checkString('**ACE', {offset: 7})) {
+ await tokenizer.peekBuffer(this.buffer, {length: 14, mayBeLess: true});
+ if (this.checkString('**', {offset: 12})) {
+ return {
+ ext: 'ace',
+ mime: 'application/x-ace-compressed',
+ };
+ }
+ }
+
+ // -- 8-byte signatures --
+
+ if (this.check([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A])) {
+ // APNG format (https://wiki.mozilla.org/APNG_Specification)
+ // 1. Find the first IDAT (image data) chunk (49 44 41 54)
+ // 2. Check if there is an "acTL" chunk before the IDAT one (61 63 54 4C)
+
+ // Offset calculated as follows:
+ // - 8 bytes: PNG signature
+ // - 4 (length) + 4 (chunk type) + 13 (chunk data) + 4 (CRC): IHDR chunk
+
+ await tokenizer.ignore(8); // ignore PNG signature
+
+ async function readChunkHeader() {
+ return {
+ length: await tokenizer.readToken(INT32_BE),
+ type: await tokenizer.readToken(new StringType(4, 'binary')),
+ };
+ }
+
+ do {
+ const chunk = await readChunkHeader();
+ if (chunk.length < 0) {
+ return; // Invalid chunk length
+ }
+
+ switch (chunk.type) {
+ case 'IDAT':
+ return {
+ ext: 'png',
+ mime: 'image/png',
+ };
+ case 'acTL':
+ return {
+ ext: 'apng',
+ mime: 'image/apng',
+ };
+ default:
+ await tokenizer.ignore(chunk.length + 4); // Ignore chunk-data + CRC
+ }
+ } while (tokenizer.position + 8 < tokenizer.fileInfo.size);
+
+ return {
+ ext: 'png',
+ mime: 'image/png',
+ };
+ }
+
+ if (this.check([0x41, 0x52, 0x52, 0x4F, 0x57, 0x31, 0x00, 0x00])) {
+ return {
+ ext: 'arrow',
+ mime: 'application/x-apache-arrow',
+ };
+ }
+
+ if (this.check([0x67, 0x6C, 0x54, 0x46, 0x02, 0x00, 0x00, 0x00])) {
+ return {
+ ext: 'glb',
+ mime: 'model/gltf-binary',
+ };
+ }
+
+ // `mov` format variants
+ if (
+ this.check([0x66, 0x72, 0x65, 0x65], {offset: 4}) // `free`
+ || this.check([0x6D, 0x64, 0x61, 0x74], {offset: 4}) // `mdat` MJPEG
+ || this.check([0x6D, 0x6F, 0x6F, 0x76], {offset: 4}) // `moov`
+ || this.check([0x77, 0x69, 0x64, 0x65], {offset: 4}) // `wide`
+ ) {
+ return {
+ ext: 'mov',
+ mime: 'video/quicktime',
+ };
+ }
+
+ // -- 9-byte signatures --
+
+ if (this.check([0x49, 0x49, 0x52, 0x4F, 0x08, 0x00, 0x00, 0x00, 0x18])) {
+ return {
+ ext: 'orf',
+ mime: 'image/x-olympus-orf',
+ };
+ }
+
+ if (this.checkString('gimp xcf ')) {
+ return {
+ ext: 'xcf',
+ mime: 'image/x-xcf',
+ };
+ }
+
+ // -- 12-byte signatures --
+
+ if (this.check([0x49, 0x49, 0x55, 0x00, 0x18, 0x00, 0x00, 0x00, 0x88, 0xE7, 0x74, 0xD8])) {
+ return {
+ ext: 'rw2',
+ mime: 'image/x-panasonic-rw2',
+ };
+ }
+
+ // ASF_Header_Object first 80 bytes
+ if (this.check([0x30, 0x26, 0xB2, 0x75, 0x8E, 0x66, 0xCF, 0x11, 0xA6, 0xD9])) {
+ async function readHeader() {
+ const guid = node_buffer.Buffer.alloc(16);
+ await tokenizer.readBuffer(guid);
+ return {
+ id: guid,
+ size: Number(await tokenizer.readToken(UINT64_LE)),
+ };
+ }
+
+ await tokenizer.ignore(30);
+ // Search for header should be in first 1KB of file.
+ while (tokenizer.position + 24 < tokenizer.fileInfo.size) {
+ const header = await readHeader();
+ let payload = header.size - 24;
+ if (_check(header.id, [0x91, 0x07, 0xDC, 0xB7, 0xB7, 0xA9, 0xCF, 0x11, 0x8E, 0xE6, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65])) {
+ // Sync on Stream-Properties-Object (B7DC0791-A9B7-11CF-8EE6-00C00C205365)
+ const typeId = node_buffer.Buffer.alloc(16);
+ payload -= await tokenizer.readBuffer(typeId);
+
+ if (_check(typeId, [0x40, 0x9E, 0x69, 0xF8, 0x4D, 0x5B, 0xCF, 0x11, 0xA8, 0xFD, 0x00, 0x80, 0x5F, 0x5C, 0x44, 0x2B])) {
+ // Found audio:
+ return {
+ ext: 'asf',
+ mime: 'audio/x-ms-asf',
+ };
+ }
+
+ if (_check(typeId, [0xC0, 0xEF, 0x19, 0xBC, 0x4D, 0x5B, 0xCF, 0x11, 0xA8, 0xFD, 0x00, 0x80, 0x5F, 0x5C, 0x44, 0x2B])) {
+ // Found video:
+ return {
+ ext: 'asf',
+ mime: 'video/x-ms-asf',
+ };
+ }
+
+ break;
+ }
+
+ await tokenizer.ignore(payload);
+ }
+
+ // Default to ASF generic extension
+ return {
+ ext: 'asf',
+ mime: 'application/vnd.ms-asf',
+ };
+ }
+
+ if (this.check([0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A])) {
+ return {
+ ext: 'ktx',
+ mime: 'image/ktx',
+ };
+ }
+
+ if ((this.check([0x7E, 0x10, 0x04]) || this.check([0x7E, 0x18, 0x04])) && this.check([0x30, 0x4D, 0x49, 0x45], {offset: 4})) {
+ return {
+ ext: 'mie',
+ mime: 'application/x-mie',
+ };
+ }
+
+ if (this.check([0x27, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], {offset: 2})) {
+ return {
+ ext: 'shp',
+ mime: 'application/x-esri-shape',
+ };
+ }
+
+ if (this.check([0xFF, 0x4F, 0xFF, 0x51])) {
+ return {
+ ext: 'j2c',
+ mime: 'image/j2c',
+ };
+ }
+
+ if (this.check([0x00, 0x00, 0x00, 0x0C, 0x6A, 0x50, 0x20, 0x20, 0x0D, 0x0A, 0x87, 0x0A])) {
+ // JPEG-2000 family
+
+ await tokenizer.ignore(20);
+ const type = await tokenizer.readToken(new StringType(4, 'ascii'));
+ switch (type) {
+ case 'jp2 ':
+ return {
+ ext: 'jp2',
+ mime: 'image/jp2',
+ };
+ case 'jpx ':
+ return {
+ ext: 'jpx',
+ mime: 'image/jpx',
+ };
+ case 'jpm ':
+ return {
+ ext: 'jpm',
+ mime: 'image/jpm',
+ };
+ case 'mjp2':
+ return {
+ ext: 'mj2',
+ mime: 'image/mj2',
+ };
+ default:
+ return;
+ }
+ }
+
+ if (
+ this.check([0xFF, 0x0A])
+ || this.check([0x00, 0x00, 0x00, 0x0C, 0x4A, 0x58, 0x4C, 0x20, 0x0D, 0x0A, 0x87, 0x0A])
+ ) {
+ return {
+ ext: 'jxl',
+ mime: 'image/jxl',
+ };
+ }
+
+ if (this.check([0xFE, 0xFF])) { // UTF-16-BOM-LE
+ if (this.check([0, 60, 0, 63, 0, 120, 0, 109, 0, 108], {offset: 2})) {
+ return {
+ ext: 'xml',
+ mime: 'application/xml',
+ };
+ }
+
+ return undefined; // Some unknown text based format
+ }
+
+ // -- Unsafe signatures --
+
+ if (
+ this.check([0x0, 0x0, 0x1, 0xBA])
+ || this.check([0x0, 0x0, 0x1, 0xB3])
+ ) {
+ return {
+ ext: 'mpg',
+ mime: 'video/mpeg',
+ };
+ }
+
+ if (this.check([0x00, 0x01, 0x00, 0x00, 0x00])) {
+ return {
+ ext: 'ttf',
+ mime: 'font/ttf',
+ };
+ }
+
+ if (this.check([0x00, 0x00, 0x01, 0x00])) {
+ return {
+ ext: 'ico',
+ mime: 'image/x-icon',
+ };
+ }
+
+ if (this.check([0x00, 0x00, 0x02, 0x00])) {
+ return {
+ ext: 'cur',
+ mime: 'image/x-icon',
+ };
+ }
+
+ if (this.check([0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1])) {
+ // Detected Microsoft Compound File Binary File (MS-CFB) Format.
+ return {
+ ext: 'cfb',
+ mime: 'application/x-cfb',
+ };
+ }
+
+ // Increase sample size from 12 to 256.
+ await tokenizer.peekBuffer(this.buffer, {length: Math.min(256, tokenizer.fileInfo.size), mayBeLess: true});
+
+ // -- 15-byte signatures --
+
+ if (this.checkString('BEGIN:')) {
+ if (this.checkString('VCARD', {offset: 6})) {
+ return {
+ ext: 'vcf',
+ mime: 'text/vcard',
+ };
+ }
+
+ if (this.checkString('VCALENDAR', {offset: 6})) {
+ return {
+ ext: 'ics',
+ mime: 'text/calendar',
+ };
+ }
+ }
+
+ // `raf` is here just to keep all the raw image detectors together.
+ if (this.checkString('FUJIFILMCCD-RAW')) {
+ return {
+ ext: 'raf',
+ mime: 'image/x-fujifilm-raf',
+ };
+ }
+
+ if (this.checkString('Extended Module:')) {
+ return {
+ ext: 'xm',
+ mime: 'audio/x-xm',
+ };
+ }
+
+ if (this.checkString('Creative Voice File')) {
+ return {
+ ext: 'voc',
+ mime: 'audio/x-voc',
+ };
+ }
+
+ if (this.check([0x04, 0x00, 0x00, 0x00]) && this.buffer.length >= 16) { // Rough & quick check Pickle/ASAR
+ const jsonSize = this.buffer.readUInt32LE(12);
+ if (jsonSize > 12 && this.buffer.length >= jsonSize + 16) {
+ try {
+ const header = this.buffer.slice(16, jsonSize + 16).toString();
+ const json = JSON.parse(header);
+ // Check if Pickle is ASAR
+ if (json.files) { // Final check, assuring Pickle/ASAR format
+ return {
+ ext: 'asar',
+ mime: 'application/x-asar',
+ };
+ }
+ } catch {}
+ }
+ }
+
+ if (this.check([0x06, 0x0E, 0x2B, 0x34, 0x02, 0x05, 0x01, 0x01, 0x0D, 0x01, 0x02, 0x01, 0x01, 0x02])) {
+ return {
+ ext: 'mxf',
+ mime: 'application/mxf',
+ };
+ }
+
+ if (this.checkString('SCRM', {offset: 44})) {
+ return {
+ ext: 's3m',
+ mime: 'audio/x-s3m',
+ };
+ }
+
+ // Raw MPEG-2 transport stream (188-byte packets)
+ if (this.check([0x47]) && this.check([0x47], {offset: 188})) {
+ return {
+ ext: 'mts',
+ mime: 'video/mp2t',
+ };
+ }
+
+ // Blu-ray Disc Audio-Video (BDAV) MPEG-2 transport stream has 4-byte TP_extra_header before each 188-byte packet
+ if (this.check([0x47], {offset: 4}) && this.check([0x47], {offset: 196})) {
+ return {
+ ext: 'mts',
+ mime: 'video/mp2t',
+ };
+ }
+
+ if (this.check([0x42, 0x4F, 0x4F, 0x4B, 0x4D, 0x4F, 0x42, 0x49], {offset: 60})) {
+ return {
+ ext: 'mobi',
+ mime: 'application/x-mobipocket-ebook',
+ };
+ }
+
+ if (this.check([0x44, 0x49, 0x43, 0x4D], {offset: 128})) {
+ return {
+ ext: 'dcm',
+ mime: 'application/dicom',
+ };
+ }
+
+ if (this.check([0x4C, 0x00, 0x00, 0x00, 0x01, 0x14, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46])) {
+ return {
+ ext: 'lnk',
+ mime: 'application/x.ms.shortcut', // Invented by us
+ };
+ }
+
+ if (this.check([0x62, 0x6F, 0x6F, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x61, 0x72, 0x6B, 0x00, 0x00, 0x00, 0x00])) {
+ return {
+ ext: 'alias',
+ mime: 'application/x.apple.alias', // Invented by us
+ };
+ }
+
+ if (
+ this.check([0x4C, 0x50], {offset: 34})
+ && (
+ this.check([0x00, 0x00, 0x01], {offset: 8})
+ || this.check([0x01, 0x00, 0x02], {offset: 8})
+ || this.check([0x02, 0x00, 0x02], {offset: 8})
+ )
+ ) {
+ return {
+ ext: 'eot',
+ mime: 'application/vnd.ms-fontobject',
+ };
+ }
+
+ if (this.check([0x06, 0x06, 0xED, 0xF5, 0xD8, 0x1D, 0x46, 0xE5, 0xBD, 0x31, 0xEF, 0xE7, 0xFE, 0x74, 0xB7, 0x1D])) {
+ return {
+ ext: 'indd',
+ mime: 'application/x-indesign',
+ };
+ }
+
+ // Increase sample size from 256 to 512
+ await tokenizer.peekBuffer(this.buffer, {length: Math.min(512, tokenizer.fileInfo.size), mayBeLess: true});
+
+ // Requires a buffer size of 512 bytes
+ if (tarHeaderChecksumMatches(this.buffer)) {
+ return {
+ ext: 'tar',
+ mime: 'application/x-tar',
+ };
+ }
+
+ if (this.check([0xFF, 0xFE])) { // UTF-16-BOM-BE
+ if (this.check([60, 0, 63, 0, 120, 0, 109, 0, 108, 0], {offset: 2})) {
+ return {
+ ext: 'xml',
+ mime: 'application/xml',
+ };
+ }
+
+ if (this.check([0xFF, 0x0E, 0x53, 0x00, 0x6B, 0x00, 0x65, 0x00, 0x74, 0x00, 0x63, 0x00, 0x68, 0x00, 0x55, 0x00, 0x70, 0x00, 0x20, 0x00, 0x4D, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6C, 0x00], {offset: 2})) {
+ return {
+ ext: 'skp',
+ mime: 'application/vnd.sketchup.skp',
+ };
+ }
+
+ return undefined; // Some text based format
+ }
+
+ if (this.checkString('-----BEGIN PGP MESSAGE-----')) {
+ return {
+ ext: 'pgp',
+ mime: 'application/pgp-encrypted',
+ };
+ }
+
+ // Check MPEG 1 or 2 Layer 3 header, or 'layer 0' for ADTS (MPEG sync-word 0xFFE)
+ if (this.buffer.length >= 2 && this.check([0xFF, 0xE0], {offset: 0, mask: [0xFF, 0xE0]})) {
+ if (this.check([0x10], {offset: 1, mask: [0x16]})) {
+ // Check for (ADTS) MPEG-2
+ if (this.check([0x08], {offset: 1, mask: [0x08]})) {
+ return {
+ ext: 'aac',
+ mime: 'audio/aac',
+ };
+ }
+
+ // Must be (ADTS) MPEG-4
+ return {
+ ext: 'aac',
+ mime: 'audio/aac',
+ };
+ }
+
+ // MPEG 1 or 2 Layer 3 header
+ // Check for MPEG layer 3
+ if (this.check([0x02], {offset: 1, mask: [0x06]})) {
+ return {
+ ext: 'mp3',
+ mime: 'audio/mpeg',
+ };
+ }
+
+ // Check for MPEG layer 2
+ if (this.check([0x04], {offset: 1, mask: [0x06]})) {
+ return {
+ ext: 'mp2',
+ mime: 'audio/mpeg',
+ };
+ }
+
+ // Check for MPEG layer 1
+ if (this.check([0x06], {offset: 1, mask: [0x06]})) {
+ return {
+ ext: 'mp1',
+ mime: 'audio/mpeg',
+ };
+ }
+ }
+ }
+
+ async readTiffTag(bigEndian) {
+ const tagId = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE);
+ this.tokenizer.ignore(10);
+ switch (tagId) {
+ case 50_341:
+ return {
+ ext: 'arw',
+ mime: 'image/x-sony-arw',
+ };
+ case 50_706:
+ return {
+ ext: 'dng',
+ mime: 'image/x-adobe-dng',
+ };
+ }
+ }
+
+ async readTiffIFD(bigEndian) {
+ const numberOfTags = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE);
+ for (let n = 0; n < numberOfTags; ++n) {
+ const fileType = await this.readTiffTag(bigEndian);
+ if (fileType) {
+ return fileType;
+ }
+ }
+ }
+
+ async readTiffHeader(bigEndian) {
+ const version = (bigEndian ? UINT16_BE : UINT16_LE).get(this.buffer, 2);
+ const ifdOffset = (bigEndian ? UINT32_BE : UINT32_LE).get(this.buffer, 4);
+
+ if (version === 42) {
+ // TIFF file header
+ if (ifdOffset >= 6) {
+ if (this.checkString('CR', {offset: 8})) {
+ return {
+ ext: 'cr2',
+ mime: 'image/x-canon-cr2',
+ };
+ }
+
+ if (ifdOffset >= 8 && (this.check([0x1C, 0x00, 0xFE, 0x00], {offset: 8}) || this.check([0x1F, 0x00, 0x0B, 0x00], {offset: 8}))) {
+ return {
+ ext: 'nef',
+ mime: 'image/x-nikon-nef',
+ };
+ }
+ }
+
+ await this.tokenizer.ignore(ifdOffset);
+ const fileType = await this.readTiffIFD(bigEndian);
+ return fileType ?? {
+ ext: 'tif',
+ mime: 'image/tiff',
+ };
+ }
+
+ if (version === 43) { // Big TIFF file header
+ return {
+ ext: 'tif',
+ mime: 'image/tiff',
+ };
+ }
+ }
+}
+
+new Set(extensions);
+new Set(mimeTypes);
+
+const imageExtensions = new Set([
+ 'jpg',
+ 'png',
+ 'gif',
+ 'webp',
+ 'flif',
+ 'cr2',
+ 'tif',
+ 'bmp',
+ 'jxr',
+ 'psd',
+ 'ico',
+ 'bpg',
+ 'jp2',
+ 'jpm',
+ 'jpx',
+ 'heic',
+ 'cur',
+ 'dcm',
+ 'avif',
+]);
+
+async function imageType(input) {
+ const result = await fileTypeFromBuffer(input);
+ return imageExtensions.has(result?.ext) && result;
+}
+
+var IMAGE_EXT_LIST = [
+ ".png",
+ ".jpg",
+ ".jpeg",
+ ".bmp",
+ ".gif",
+ ".svg",
+ ".tiff",
+ ".webp",
+ ".avif",
+];
+function isAnImage(ext) {
+ return IMAGE_EXT_LIST.includes(ext.toLowerCase());
+}
+function isAssetTypeAnImage(path) {
+ return isAnImage(require$$0$1.extname(path));
+}
+function getOS() {
+ var appVersion = navigator.appVersion;
+ if (appVersion.indexOf("Win") !== -1) {
+ return "Windows";
+ }
+ else if (appVersion.indexOf("Mac") !== -1) {
+ return "MacOS";
+ }
+ else if (appVersion.indexOf("X11") !== -1) {
+ return "Linux";
+ }
+ else {
+ return "Unknown OS";
+ }
+}
+function streamToString(stream) {
+ var _a, stream_1, stream_1_1;
+ var _b, e_1, _c, _d;
+ return __awaiter(this, void 0, void 0, function () {
+ var chunks, chunk, e_1_1;
+ return __generator(this, function (_e) {
+ switch (_e.label) {
+ case 0:
+ chunks = [];
+ _e.label = 1;
+ case 1:
+ _e.trys.push([1, 6, 7, 12]);
+ _a = true, stream_1 = __asyncValues(stream);
+ _e.label = 2;
+ case 2: return [4 /*yield*/, stream_1.next()];
+ case 3:
+ if (!(stream_1_1 = _e.sent(), _b = stream_1_1.done, !_b)) return [3 /*break*/, 5];
+ _d = stream_1_1.value;
+ _a = false;
+ try {
+ chunk = _d;
+ chunks.push(Buffer.from(chunk));
+ }
+ finally {
+ _a = true;
+ }
+ _e.label = 4;
+ case 4: return [3 /*break*/, 2];
+ case 5: return [3 /*break*/, 12];
+ case 6:
+ e_1_1 = _e.sent();
+ e_1 = { error: e_1_1 };
+ return [3 /*break*/, 12];
+ case 7:
+ _e.trys.push([7, , 10, 11]);
+ if (!(!_a && !_b && (_c = stream_1.return))) return [3 /*break*/, 9];
+ return [4 /*yield*/, _c.call(stream_1)];
+ case 8:
+ _e.sent();
+ _e.label = 9;
+ case 9: return [3 /*break*/, 11];
+ case 10:
+ if (e_1) throw e_1.error;
+ return [7 /*endfinally*/];
+ case 11: return [7 /*endfinally*/];
+ case 12: return [2 /*return*/, Buffer.concat(chunks).toString("utf-8")];
+ }
+ });
+ });
+}
+function getUrlAsset(url) {
+ return (url = url.substr(1 + url.lastIndexOf("/")).split("?")[0]).split("#")[0];
+}
+function getLastImage(list) {
+ var reversedList = list.reverse();
+ var lastImage;
+ reversedList.forEach(function (item) {
+ if (item && item.startsWith("http")) {
+ lastImage = item;
+ return item;
+ }
+ });
+ return lastImage;
+}
+function arrayToObject(arr, key) {
+ var obj = {};
+ arr.forEach(function (element) {
+ obj[element[key]] = element;
+ });
+ return obj;
+}
+function bufferToArrayBuffer(buffer) {
+ var arrayBuffer = new ArrayBuffer(buffer.length);
+ var view = new Uint8Array(arrayBuffer);
+ for (var i = 0; i < buffer.length; i++) {
+ view[i] = buffer[i];
+ }
+ return arrayBuffer;
+}
+
+const a=globalThis.FormData,l=globalThis.fetch||(()=>{throw new Error("[node-fetch-native] Failed to fetch: `globalThis.fetch` is not available!")});
+
+var PicGoUploader = /** @class */ (function () {
+ function PicGoUploader(settings, plugin) {
+ this.settings = settings;
+ this.plugin = plugin;
+ }
+ PicGoUploader.prototype.uploadFiles = function (fileList) {
+ return __awaiter(this, void 0, void 0, function () {
+ var response, data, files, _loop_1, i, uploadUrlFullResultList;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ if (!this.settings.remoteServerMode) return [3 /*break*/, 7];
+ files = [];
+ _loop_1 = function (i) {
+ var file, buffer, arrayBuffer;
+ return __generator(this, function (_b) {
+ switch (_b.label) {
+ case 0:
+ file = fileList[i];
+ return [4 /*yield*/, new Promise(function (resolve, reject) {
+ require$$0.readFile(file, function (err, data) {
+ if (err) {
+ reject(err);
+ }
+ resolve(data);
+ });
+ })];
+ case 1:
+ buffer = _b.sent();
+ arrayBuffer = bufferToArrayBuffer(buffer);
+ files.push(new File([arrayBuffer], file));
+ return [2 /*return*/];
+ }
+ });
+ };
+ i = 0;
+ _a.label = 1;
+ case 1:
+ if (!(i < fileList.length)) return [3 /*break*/, 4];
+ return [5 /*yield**/, _loop_1(i)];
+ case 2:
+ _a.sent();
+ _a.label = 3;
+ case 3:
+ i++;
+ return [3 /*break*/, 1];
+ case 4: return [4 /*yield*/, this.uploadFileByData(files)];
+ case 5:
+ response = _a.sent();
+ return [4 /*yield*/, response.json()];
+ case 6:
+ data = _a.sent();
+ return [3 /*break*/, 10];
+ case 7: return [4 /*yield*/, obsidian.requestUrl({
+ url: this.settings.uploadServer,
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({ list: fileList }),
+ })];
+ case 8:
+ response = _a.sent();
+ return [4 /*yield*/, response.json];
+ case 9:
+ data = _a.sent();
+ _a.label = 10;
+ case 10:
+ // piclist
+ if (data.fullResult) {
+ uploadUrlFullResultList = data.fullResult || [];
+ this.settings.uploadedImages = __spreadArray(__spreadArray([], __read((this.settings.uploadedImages || [])), false), __read(uploadUrlFullResultList), false);
+ }
+ return [2 /*return*/, data];
+ }
+ });
+ });
+ };
+ PicGoUploader.prototype.uploadFileByData = function (fileList) {
+ return __awaiter(this, void 0, void 0, function () {
+ var form, i, options, response;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ form = new a();
+ for (i = 0; i < fileList.length; i++) {
+ form.append("list", fileList[i]);
+ }
+ options = {
+ method: "post",
+ body: form,
+ };
+ return [4 /*yield*/, l(this.settings.uploadServer, options)];
+ case 1:
+ response = _a.sent();
+ console.log("response", response);
+ return [2 /*return*/, response];
+ }
+ });
+ });
+ };
+ PicGoUploader.prototype.uploadFileByClipboard = function (fileList) {
+ return __awaiter(this, void 0, void 0, function () {
+ var data, res, uploadUrlFullResultList;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ if (!this.settings.remoteServerMode) return [3 /*break*/, 3];
+ return [4 /*yield*/, this.uploadFileByData(fileList)];
+ case 1:
+ res = _a.sent();
+ return [4 /*yield*/, res.json()];
+ case 2:
+ data = _a.sent();
+ return [3 /*break*/, 6];
+ case 3: return [4 /*yield*/, obsidian.requestUrl({
+ url: this.settings.uploadServer,
+ method: "POST",
+ })];
+ case 4:
+ res = _a.sent();
+ return [4 /*yield*/, res.json];
+ case 5:
+ data = _a.sent();
+ _a.label = 6;
+ case 6:
+ if (res.status !== 200) {
+ return [2 /*return*/, {
+ code: -1,
+ msg: data.msg,
+ data: "",
+ }];
+ }
+ // piclist
+ if (data.fullResult) {
+ uploadUrlFullResultList = data.fullResult || [];
+ this.settings.uploadedImages = __spreadArray(__spreadArray([], __read((this.settings.uploadedImages || [])), false), __read(uploadUrlFullResultList), false);
+ this.plugin.saveSettings();
+ }
+ return [2 /*return*/, {
+ code: 0,
+ msg: "success",
+ data: typeof data.result == "string" ? data.result : data.result[0],
+ }];
+ }
+ });
+ });
+ };
+ return PicGoUploader;
+}());
+var PicGoCoreUploader = /** @class */ (function () {
+ function PicGoCoreUploader(settings, plugin) {
+ this.settings = settings;
+ this.plugin = plugin;
+ }
+ PicGoCoreUploader.prototype.uploadFiles = function (fileList) {
+ return __awaiter(this, void 0, void 0, function () {
+ var length, cli, command, res, splitList, splitListLength, data;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ length = fileList.length;
+ cli = this.settings.picgoCorePath || "picgo";
+ command = "".concat(cli, " upload ").concat(fileList
+ .map(function (item) { return "\"".concat(item, "\""); })
+ .join(" "));
+ return [4 /*yield*/, this.exec(command)];
+ case 1:
+ res = _a.sent();
+ splitList = res.split("\n");
+ splitListLength = splitList.length;
+ data = splitList.splice(splitListLength - 1 - length, length);
+ if (res.includes("PicGo ERROR")) {
+ console.log(command, res);
+ return [2 /*return*/, {
+ success: false,
+ msg: "失败",
+ }];
+ }
+ else {
+ return [2 /*return*/, {
+ success: true,
+ result: data,
+ }];
+ }
+ }
+ });
+ });
+ };
+ // PicGo-Core 上传处理
+ PicGoCoreUploader.prototype.uploadFileByClipboard = function () {
+ return __awaiter(this, void 0, void 0, function () {
+ var res, splitList, lastImage;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, this.uploadByClip()];
+ case 1:
+ res = _a.sent();
+ splitList = res.split("\n");
+ lastImage = getLastImage(splitList);
+ if (lastImage) {
+ return [2 /*return*/, {
+ code: 0,
+ msg: "success",
+ data: lastImage,
+ }];
+ }
+ else {
+ console.log(splitList);
+ // new Notice(`"Please check PicGo-Core config"\n${res}`);
+ return [2 /*return*/, {
+ code: -1,
+ msg: "\"Please check PicGo-Core config\"\n".concat(res),
+ data: "",
+ }];
+ }
+ }
+ });
+ });
+ };
+ // PicGo-Core的剪切上传反馈
+ PicGoCoreUploader.prototype.uploadByClip = function () {
+ return __awaiter(this, void 0, void 0, function () {
+ var command, res;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ if (this.settings.picgoCorePath) {
+ command = "".concat(this.settings.picgoCorePath, " upload");
+ }
+ else {
+ command = "picgo upload";
+ }
+ return [4 /*yield*/, this.exec(command)];
+ case 1:
+ res = _a.sent();
+ // const res = await this.spawnChild();
+ return [2 /*return*/, res];
+ }
+ });
+ });
+ };
+ PicGoCoreUploader.prototype.exec = function (command) {
+ return __awaiter(this, void 0, void 0, function () {
+ var stdout, res;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, require$$0$2.exec(command)];
+ case 1:
+ stdout = (_a.sent()).stdout;
+ return [4 /*yield*/, streamToString(stdout)];
+ case 2:
+ res = _a.sent();
+ return [2 /*return*/, res];
+ }
+ });
+ });
+ };
+ PicGoCoreUploader.prototype.spawnChild = function () {
+ var _a, e_1, _b, _c, _d, e_2, _e, _f;
+ return __awaiter(this, void 0, void 0, function () {
+ var spawn, child, data, _g, _h, _j, chunk, e_1_1, error, _k, _l, _m, chunk, e_2_1, exitCode;
+ return __generator(this, function (_o) {
+ switch (_o.label) {
+ case 0:
+ spawn = require("child_process").spawn;
+ child = spawn("picgo", ["upload"], {
+ shell: true,
+ });
+ data = "";
+ _o.label = 1;
+ case 1:
+ _o.trys.push([1, 6, 7, 12]);
+ _g = true, _h = __asyncValues(child.stdout);
+ _o.label = 2;
+ case 2: return [4 /*yield*/, _h.next()];
+ case 3:
+ if (!(_j = _o.sent(), _a = _j.done, !_a)) return [3 /*break*/, 5];
+ _c = _j.value;
+ _g = false;
+ try {
+ chunk = _c;
+ data += chunk;
+ }
+ finally {
+ _g = true;
+ }
+ _o.label = 4;
+ case 4: return [3 /*break*/, 2];
+ case 5: return [3 /*break*/, 12];
+ case 6:
+ e_1_1 = _o.sent();
+ e_1 = { error: e_1_1 };
+ return [3 /*break*/, 12];
+ case 7:
+ _o.trys.push([7, , 10, 11]);
+ if (!(!_g && !_a && (_b = _h.return))) return [3 /*break*/, 9];
+ return [4 /*yield*/, _b.call(_h)];
+ case 8:
+ _o.sent();
+ _o.label = 9;
+ case 9: return [3 /*break*/, 11];
+ case 10:
+ if (e_1) throw e_1.error;
+ return [7 /*endfinally*/];
+ case 11: return [7 /*endfinally*/];
+ case 12:
+ error = "";
+ _o.label = 13;
+ case 13:
+ _o.trys.push([13, 18, 19, 24]);
+ _k = true, _l = __asyncValues(child.stderr);
+ _o.label = 14;
+ case 14: return [4 /*yield*/, _l.next()];
+ case 15:
+ if (!(_m = _o.sent(), _d = _m.done, !_d)) return [3 /*break*/, 17];
+ _f = _m.value;
+ _k = false;
+ try {
+ chunk = _f;
+ error += chunk;
+ }
+ finally {
+ _k = true;
+ }
+ _o.label = 16;
+ case 16: return [3 /*break*/, 14];
+ case 17: return [3 /*break*/, 24];
+ case 18:
+ e_2_1 = _o.sent();
+ e_2 = { error: e_2_1 };
+ return [3 /*break*/, 24];
+ case 19:
+ _o.trys.push([19, , 22, 23]);
+ if (!(!_k && !_d && (_e = _l.return))) return [3 /*break*/, 21];
+ return [4 /*yield*/, _e.call(_l)];
+ case 20:
+ _o.sent();
+ _o.label = 21;
+ case 21: return [3 /*break*/, 23];
+ case 22:
+ if (e_2) throw e_2.error;
+ return [7 /*endfinally*/];
+ case 23: return [7 /*endfinally*/];
+ case 24: return [4 /*yield*/, new Promise(function (resolve, reject) {
+ child.on("close", resolve);
+ })];
+ case 25:
+ exitCode = _o.sent();
+ if (exitCode) {
+ throw new Error("subprocess error exit ".concat(exitCode, ", ").concat(error));
+ }
+ return [2 /*return*/, data];
+ }
+ });
+ });
+ };
+ return PicGoCoreUploader;
+}());
+
+var PicGoDeleter = /** @class */ (function () {
+ function PicGoDeleter(plugin) {
+ this.plugin = plugin;
+ }
+ PicGoDeleter.prototype.deleteImage = function (configMap) {
+ return __awaiter(this, void 0, void 0, function () {
+ var response, data;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, obsidian.requestUrl({
+ url: this.plugin.settings.deleteServer,
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({
+ list: configMap,
+ }),
+ })];
+ case 1:
+ response = _a.sent();
+ data = response.json;
+ return [2 /*return*/, data];
+ }
+ });
+ });
+ };
+ return PicGoDeleter;
+}());
+
+//  local image should has ext
+//  internet image should not has ext
+var REGEX_FILE = /\!\[(.*?)\]\((\S+\.\w+)\)|\!\[(.*?)\]\((https?:\/\/.*?)\)/g;
+var REGEX_WIKI_FILE = /\!\[\[(.*?)(\s*?\|.*?)?\]\]/g;
+var Helper = /** @class */ (function () {
+ function Helper(app) {
+ this.app = app;
+ }
+ Helper.prototype.getFrontmatterValue = function (key, defaultValue) {
+ if (defaultValue === void 0) { defaultValue = undefined; }
+ var file = this.app.workspace.getActiveFile();
+ if (!file) {
+ return undefined;
+ }
+ var path = file.path;
+ var cache = this.app.metadataCache.getCache(path);
+ var value = defaultValue;
+ if ((cache === null || cache === void 0 ? void 0 : cache.frontmatter) && cache.frontmatter.hasOwnProperty(key)) {
+ value = cache.frontmatter[key];
+ }
+ return value;
+ };
+ Helper.prototype.getEditor = function () {
+ var mdView = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
+ if (mdView) {
+ return mdView.editor;
+ }
+ else {
+ return null;
+ }
+ };
+ Helper.prototype.getValue = function () {
+ var editor = this.getEditor();
+ return editor.getValue();
+ };
+ Helper.prototype.setValue = function (value) {
+ var editor = this.getEditor();
+ var _a = editor.getScrollInfo(), left = _a.left, top = _a.top;
+ var position = editor.getCursor();
+ editor.setValue(value);
+ editor.scrollTo(left, top);
+ editor.setCursor(position);
+ };
+ // get all file urls, include local and internet
+ Helper.prototype.getAllFiles = function () {
+ var editor = this.getEditor();
+ var value = editor.getValue();
+ return this.getImageLink(value);
+ };
+ Helper.prototype.getImageLink = function (value) {
+ var e_1, _a, e_2, _b;
+ var matches = value.matchAll(REGEX_FILE);
+ var WikiMatches = value.matchAll(REGEX_WIKI_FILE);
+ var fileArray = [];
+ try {
+ for (var matches_1 = __values(matches), matches_1_1 = matches_1.next(); !matches_1_1.done; matches_1_1 = matches_1.next()) {
+ var match = matches_1_1.value;
+ var source = match[0];
+ var name_1 = match[1];
+ var path = match[2];
+ if (name_1 === undefined) {
+ name_1 = match[3];
+ }
+ if (path === undefined) {
+ path = match[4];
+ }
+ fileArray.push({
+ path: path,
+ name: name_1,
+ source: source,
+ });
+ }
+ }
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
+ finally {
+ try {
+ if (matches_1_1 && !matches_1_1.done && (_a = matches_1.return)) _a.call(matches_1);
+ }
+ finally { if (e_1) throw e_1.error; }
+ }
+ try {
+ for (var WikiMatches_1 = __values(WikiMatches), WikiMatches_1_1 = WikiMatches_1.next(); !WikiMatches_1_1.done; WikiMatches_1_1 = WikiMatches_1.next()) {
+ var match = WikiMatches_1_1.value;
+ var name_2 = require$$0$1.parse(match[1]).name;
+ var path = match[1];
+ var source = match[0];
+ if (match[2]) {
+ name_2 = "".concat(name_2).concat(match[2]);
+ }
+ fileArray.push({
+ path: path,
+ name: name_2,
+ source: source,
+ });
+ }
+ }
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
+ finally {
+ try {
+ if (WikiMatches_1_1 && !WikiMatches_1_1.done && (_b = WikiMatches_1.return)) _b.call(WikiMatches_1);
+ }
+ finally { if (e_2) throw e_2.error; }
+ }
+ return fileArray;
+ };
+ Helper.prototype.hasBlackDomain = function (src, blackDomains) {
+ if (blackDomains.trim() === "") {
+ return false;
+ }
+ var blackDomainList = blackDomains.split(",").filter(function (item) { return item !== ""; });
+ var url = new URL(src);
+ var domain = url.hostname;
+ return blackDomainList.some(function (blackDomain) { return domain.includes(blackDomain); });
+ };
+ return Helper;
+}());
+
+// العربية
+var ar = {};
+
+// čeština
+var cz = {};
+
+// Dansk
+var da = {};
+
+// Deutsch
+var de = {};
+
+// English
+var en = {
+ // setting.ts
+ "Plugin Settings": "Plugin Settings",
+ "Auto pasted upload": "Auto pasted upload",
+ "If you set this value true, when you paste image, it will be auto uploaded(you should set the picGo server rightly)": "If you set this value true, when you paste image, it will be auto uploaded(you should set the picGo server rightly)",
+ "Default uploader": "Default uploader",
+ "PicGo server": "PicGo server upload route",
+ "PicGo server desc": "upload route, use PicList will be able to set picbed and config through query",
+ "Please input PicGo server": "Please input upload route",
+ "PicGo delete server": "PicGo server delete route(you need to use PicList app)",
+ "PicList desc": "Search PicList on Github to download and install",
+ "Please input PicGo delete server": "Please input delete server",
+ "Delete image using PicList": "Delete image using PicList",
+ "PicGo-Core path": "PicGo-Core path",
+ "Delete successfully": "Delete successfully",
+ "Delete failed": "Delete failed",
+ "Image size suffix": "Image size suffix",
+ "Image size suffix Description": "like |300 for resize image in ob.",
+ "Please input image size suffix": "Please input image size suffix",
+ "Error, could not delete": "Error, could not delete",
+ "Please input PicGo-Core path, default using environment variables": "Please input PicGo-Core path, default using environment variables",
+ "Work on network": "Work on network",
+ "Work on network Description": "Allow upload network image by 'Upload all' command.\n Or when you paste, md standard image link in your clipboard will be auto upload.",
+ fixPath: "fixPath",
+ fixPathWarning: "This option is used to fix PicGo-core upload failures on Linux and Mac. It modifies the PATH variable within Obsidian. If Obsidian encounters any bugs, turn off the option, try again! ",
+ "Upload when clipboard has image and text together": "Upload when clipboard has image and text together",
+ "When you copy, some application like Excel will image and text to clipboard, you can upload or not.": "When you copy, some application like Excel will image and text to clipboard, you can upload or not.",
+ "Network Domain Black List": "Network Domain Black List",
+ "Network Domain Black List Description": "Image in the domain list will not be upload,use comma separated",
+ "Delete source file after you upload file": "Delete source file after you upload file",
+ "Delete source file in ob assets after you upload file.": "Delete source file in ob assets after you upload file.",
+ "Image desc": "Image desc",
+ reserve: "default",
+ "remove all": "none",
+ "remove default": "remove image.png",
+ "Remote server mode": "Remote server mode",
+ "Remote server mode desc": "If you have deployed piclist-core or piclist on the server.",
+ "Can not find image file": "Can not find image file",
+ "File has been changedd, upload failure": "File has been changedd, upload failure",
+ "File has been changedd, download failure": "File has been changedd, download failure",
+ "Warning: upload files is different of reciver files from api": "Warning: upload files num is different of reciver files from api",
+};
+
+// British English
+var enGB = {};
+
+// Español
+var es = {};
+
+// français
+var fr = {};
+
+// हिन्दी
+var hi = {};
+
+// Bahasa Indonesia
+var id = {};
+
+// Italiano
+var it = {};
+
+// 日本語
+var ja = {};
+
+// 한국어
+var ko = {};
+
+// Nederlands
+var nl = {};
+
+// Norsk
+var no = {};
+
+// język polski
+var pl = {};
+
+// Português
+var pt = {};
+
+// Português do Brasil
+// Brazilian Portuguese
+var ptBR = {};
+
+// Română
+var ro = {};
+
+// русский
+var ru = {};
+
+// Türkçe
+var tr = {};
+
+// 简体中文
+var zhCN = {
+ // setting.ts
+ "Plugin Settings": "插件设置",
+ "Auto pasted upload": "剪切板自动上传",
+ "If you set this value true, when you paste image, it will be auto uploaded(you should set the picGo server rightly)": "启用该选项后,黏贴图片时会自动上传(你需要正确配置picgo)",
+ "Default uploader": "默认上传器",
+ "PicGo server": "PicGo server 上传接口",
+ "PicGo server desc": "上传接口,使用PicList时可通过设置URL参数指定图床和配置",
+ "Please input PicGo server": "请输入上传接口地址",
+ "PicGo delete server": "PicGo server 删除接口(请使用PicList来启用此功能)",
+ "PicList desc": "PicList是PicGo二次开发版,请Github搜索PicList下载",
+ "Please input PicGo delete server": "请输入删除接口地址",
+ "Delete image using PicList": "使用 PicList 删除图片",
+ "PicGo-Core path": "PicGo-Core 路径",
+ "Delete successfully": "删除成功",
+ "Delete failed": "删除失败",
+ "Error, could not delete": "错误,无法删除",
+ "Image size suffix": "图片大小后缀",
+ "Image size suffix Description": "比如:|300 用于调整图片大小",
+ "Please input image size suffix": "请输入图片大小后缀",
+ "Please input PicGo-Core path, default using environment variables": "请输入 PicGo-Core path,默认使用环境变量",
+ "Work on network": "应用网络图片",
+ "Work on network Description": "当你上传所有图片时,也会上传网络图片。以及当你进行黏贴时,剪切板中的标准 md 图片会被上传",
+ fixPath: "修正PATH变量",
+ fixPathWarning: "此选项用于修复Linux和Mac上 PicGo-Core 上传失败的问题。它会修改 Obsidian 内的 PATH 变量,如果 Obsidian 遇到任何BUG,先关闭这个选项试试!",
+ "Upload when clipboard has image and text together": "当剪切板同时拥有文本和图片剪切板数据时是否上传图片",
+ "When you copy, some application like Excel will image and text to clipboard, you can upload or not.": "当你复制时,某些应用例如 Excel 会在剪切板同时文本和图像数据,确认是否上传。",
+ "Network Domain Black List": "网络图片域名黑名单",
+ "Network Domain Black List Description": "黑名单域名中的图片将不会被上传,用英文逗号分割",
+ "Delete source file after you upload file": "上传文件后移除源文件",
+ "Delete source file in ob assets after you upload file.": "上传文件后移除在ob附件文件夹中的文件",
+ "Image desc": "图片描述",
+ reserve: "默认",
+ "remove all": "无",
+ "remove default": "移除image.png",
+ "Remote server mode": "远程服务器模式",
+ "Remote server mode desc": "如果你在服务器部署了piclist-core或者piclist",
+ "Can not find image file": "没有解析到图像文件",
+ "File has been changedd, upload failure": "当前文件已变更,上传失败",
+ "File has been changedd, download failure": "当前文件已变更,下载失败",
+ "Warning: upload files is different of reciver files from api": "警告:上传的文件与接口返回的文件数量不一致",
+};
+
+// 繁體中文
+var zhTW = {};
+
+var localeMap = {
+ ar: ar,
+ cs: cz,
+ da: da,
+ de: de,
+ en: en,
+ 'en-gb': enGB,
+ es: es,
+ fr: fr,
+ hi: hi,
+ id: id,
+ it: it,
+ ja: ja,
+ ko: ko,
+ nl: nl,
+ nn: no,
+ pl: pl,
+ pt: pt,
+ 'pt-br': ptBR,
+ ro: ro,
+ ru: ru,
+ tr: tr,
+ 'zh-cn': zhCN,
+ 'zh-tw': zhTW,
+};
+var locale = localeMap[obsidian.moment.locale()];
+function t(str) {
+ return (locale && locale[str]) || en[str];
+}
+
+var DEFAULT_SETTINGS = {
+ uploadByClipSwitch: true,
+ uploader: "PicGo",
+ uploadServer: "http://127.0.0.1:36677/upload",
+ deleteServer: "http://127.0.0.1:36677/delete",
+ imageSizeSuffix: "",
+ picgoCorePath: "",
+ workOnNetWork: false,
+ fixPath: false,
+ applyImage: true,
+ newWorkBlackDomains: "",
+ deleteSource: false,
+ imageDesc: "origin",
+ remoteServerMode: false,
+};
+var SettingTab = /** @class */ (function (_super) {
+ __extends(SettingTab, _super);
+ function SettingTab(app, plugin) {
+ var _this = _super.call(this, app, plugin) || this;
+ _this.plugin = plugin;
+ return _this;
+ }
+ SettingTab.prototype.display = function () {
+ var _this = this;
+ var containerEl = this.containerEl;
+ var os = getOS();
+ containerEl.empty();
+ containerEl.createEl("h2", { text: t("Plugin Settings") });
+ new obsidian.Setting(containerEl)
+ .setName(t("Auto pasted upload"))
+ .setDesc(t("If you set this value true, when you paste image, it will be auto uploaded(you should set the picGo server rightly)"))
+ .addToggle(function (toggle) {
+ return toggle
+ .setValue(_this.plugin.settings.uploadByClipSwitch)
+ .onChange(function (value) { return __awaiter(_this, void 0, void 0, function () {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ this.plugin.settings.uploadByClipSwitch = value;
+ return [4 /*yield*/, this.plugin.saveSettings()];
+ case 1:
+ _a.sent();
+ return [2 /*return*/];
+ }
+ });
+ }); });
+ });
+ new obsidian.Setting(containerEl)
+ .setName(t("Default uploader"))
+ .setDesc(t("Default uploader"))
+ .addDropdown(function (cb) {
+ return cb
+ .addOption("PicGo", "PicGo(app)")
+ .addOption("PicGo-Core", "PicGo-Core")
+ .setValue(_this.plugin.settings.uploader)
+ .onChange(function (value) { return __awaiter(_this, void 0, void 0, function () {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ this.plugin.settings.uploader = value;
+ this.display();
+ return [4 /*yield*/, this.plugin.saveSettings()];
+ case 1:
+ _a.sent();
+ return [2 /*return*/];
+ }
+ });
+ }); });
+ });
+ if (this.plugin.settings.uploader === "PicGo") {
+ new obsidian.Setting(containerEl)
+ .setName(t("PicGo server"))
+ .setDesc(t("PicGo server desc"))
+ .addText(function (text) {
+ return text
+ .setPlaceholder(t("Please input PicGo server"))
+ .setValue(_this.plugin.settings.uploadServer)
+ .onChange(function (key) { return __awaiter(_this, void 0, void 0, function () {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ this.plugin.settings.uploadServer = key;
+ return [4 /*yield*/, this.plugin.saveSettings()];
+ case 1:
+ _a.sent();
+ return [2 /*return*/];
+ }
+ });
+ }); });
+ });
+ new obsidian.Setting(containerEl)
+ .setName(t("PicGo delete server"))
+ .setDesc(t("PicList desc"))
+ .addText(function (text) {
+ return text
+ .setPlaceholder(t("Please input PicGo delete server"))
+ .setValue(_this.plugin.settings.deleteServer)
+ .onChange(function (key) { return __awaiter(_this, void 0, void 0, function () {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ this.plugin.settings.deleteServer = key;
+ return [4 /*yield*/, this.plugin.saveSettings()];
+ case 1:
+ _a.sent();
+ return [2 /*return*/];
+ }
+ });
+ }); });
+ });
+ }
+ new obsidian.Setting(containerEl)
+ .setName(t("Remote server mode"))
+ .setDesc(t("Remote server mode desc"))
+ .addToggle(function (toggle) {
+ return toggle
+ .setValue(_this.plugin.settings.remoteServerMode)
+ .onChange(function (value) { return __awaiter(_this, void 0, void 0, function () {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ this.plugin.settings.remoteServerMode = value;
+ if (value) {
+ this.plugin.settings.workOnNetWork = false;
+ }
+ this.display();
+ return [4 /*yield*/, this.plugin.saveSettings()];
+ case 1:
+ _a.sent();
+ return [2 /*return*/];
+ }
+ });
+ }); });
+ });
+ if (this.plugin.settings.uploader === "PicGo-Core") {
+ new obsidian.Setting(containerEl)
+ .setName(t("PicGo-Core path"))
+ .setDesc(t("Please input PicGo-Core path, default using environment variables"))
+ .addText(function (text) {
+ return text
+ .setPlaceholder("")
+ .setValue(_this.plugin.settings.picgoCorePath)
+ .onChange(function (value) { return __awaiter(_this, void 0, void 0, function () {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ this.plugin.settings.picgoCorePath = value;
+ return [4 /*yield*/, this.plugin.saveSettings()];
+ case 1:
+ _a.sent();
+ return [2 /*return*/];
+ }
+ });
+ }); });
+ });
+ if (os !== "Windows") {
+ new obsidian.Setting(containerEl)
+ .setName(t("fixPath"))
+ .setDesc(t("fixPathWarning"))
+ .addToggle(function (toggle) {
+ return toggle
+ .setValue(_this.plugin.settings.fixPath)
+ .onChange(function (value) { return __awaiter(_this, void 0, void 0, function () {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ this.plugin.settings.fixPath = value;
+ return [4 /*yield*/, this.plugin.saveSettings()];
+ case 1:
+ _a.sent();
+ return [2 /*return*/];
+ }
+ });
+ }); });
+ });
+ }
+ }
+ // image desc setting
+ new obsidian.Setting(containerEl)
+ .setName(t("Image desc"))
+ .setDesc(t("Image desc"))
+ .addDropdown(function (cb) {
+ return cb
+ .addOption("origin", t("reserve")) // 保留全部
+ .addOption("none", t("remove all")) // 移除全部
+ .addOption("removeDefault", t("remove default")) // 只移除默认即 image.png
+ .setValue(_this.plugin.settings.imageDesc)
+ .onChange(function (value) { return __awaiter(_this, void 0, void 0, function () {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ this.plugin.settings.imageDesc = value;
+ this.display();
+ return [4 /*yield*/, this.plugin.saveSettings()];
+ case 1:
+ _a.sent();
+ return [2 /*return*/];
+ }
+ });
+ }); });
+ });
+ new obsidian.Setting(containerEl)
+ .setName(t("Image size suffix"))
+ .setDesc(t("Image size suffix Description"))
+ .addText(function (text) {
+ return text
+ .setPlaceholder(t("Please input image size suffix"))
+ .setValue(_this.plugin.settings.imageSizeSuffix)
+ .onChange(function (key) { return __awaiter(_this, void 0, void 0, function () {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ this.plugin.settings.imageSizeSuffix = key;
+ return [4 /*yield*/, this.plugin.saveSettings()];
+ case 1:
+ _a.sent();
+ return [2 /*return*/];
+ }
+ });
+ }); });
+ });
+ new obsidian.Setting(containerEl)
+ .setName(t("Work on network"))
+ .setDesc(t("Work on network Description"))
+ .addToggle(function (toggle) {
+ return toggle
+ .setValue(_this.plugin.settings.workOnNetWork)
+ .onChange(function (value) { return __awaiter(_this, void 0, void 0, function () {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ if (this.plugin.settings.remoteServerMode) {
+ new obsidian.Notice("Can only work when remote server mode is off.");
+ this.plugin.settings.workOnNetWork = false;
+ }
+ else {
+ this.plugin.settings.workOnNetWork = value;
+ }
+ this.display();
+ return [4 /*yield*/, this.plugin.saveSettings()];
+ case 1:
+ _a.sent();
+ return [2 /*return*/];
+ }
+ });
+ }); });
+ });
+ new obsidian.Setting(containerEl)
+ .setName(t("Network Domain Black List"))
+ .setDesc(t("Network Domain Black List Description"))
+ .addTextArea(function (textArea) {
+ return textArea
+ .setValue(_this.plugin.settings.newWorkBlackDomains)
+ .onChange(function (value) { return __awaiter(_this, void 0, void 0, function () {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ this.plugin.settings.newWorkBlackDomains = value;
+ return [4 /*yield*/, this.plugin.saveSettings()];
+ case 1:
+ _a.sent();
+ return [2 /*return*/];
+ }
+ });
+ }); });
+ });
+ new obsidian.Setting(containerEl)
+ .setName(t("Upload when clipboard has image and text together"))
+ .setDesc(t("When you copy, some application like Excel will image and text to clipboard, you can upload or not."))
+ .addToggle(function (toggle) {
+ return toggle
+ .setValue(_this.plugin.settings.applyImage)
+ .onChange(function (value) { return __awaiter(_this, void 0, void 0, function () {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ this.plugin.settings.applyImage = value;
+ this.display();
+ return [4 /*yield*/, this.plugin.saveSettings()];
+ case 1:
+ _a.sent();
+ return [2 /*return*/];
+ }
+ });
+ }); });
+ });
+ new obsidian.Setting(containerEl)
+ .setName(t("Delete source file after you upload file"))
+ .setDesc(t("Delete source file in ob assets after you upload file."))
+ .addToggle(function (toggle) {
+ return toggle
+ .setValue(_this.plugin.settings.deleteSource)
+ .onChange(function (value) { return __awaiter(_this, void 0, void 0, function () {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ this.plugin.settings.deleteSource = value;
+ this.display();
+ return [4 /*yield*/, this.plugin.saveSettings()];
+ case 1:
+ _a.sent();
+ return [2 /*return*/];
+ }
+ });
+ }); });
+ });
+ };
+ return SettingTab;
+}(obsidian.PluginSettingTab));
+
+var imageAutoUploadPlugin = /** @class */ (function (_super) {
+ __extends(imageAutoUploadPlugin, _super);
+ function imageAutoUploadPlugin() {
+ var _this = _super !== null && _super.apply(this, arguments) || this;
+ _this.addMenu = function (menu, imgPath, editor) {
+ menu.addItem(function (item) {
+ return item
+ .setIcon("trash-2")
+ .setTitle(t("Delete image using PicList"))
+ .onClick(function () { return __awaiter(_this, void 0, void 0, function () {
+ var selectedItem, res, selection;
+ return __generator(this, function (_b) {
+ switch (_b.label) {
+ case 0:
+ _b.trys.push([0, 3, , 4]);
+ selectedItem = this.settings.uploadedImages.find(function (item) { return item.imgUrl === imgPath; });
+ if (!selectedItem) return [3 /*break*/, 2];
+ return [4 /*yield*/, this.picGoDeleter.deleteImage([selectedItem])];
+ case 1:
+ res = _b.sent();
+ if (res.success) {
+ new obsidian.Notice(t("Delete successfully"));
+ selection = editor.getSelection();
+ if (selection) {
+ editor.replaceSelection("");
+ }
+ this.settings.uploadedImages =
+ this.settings.uploadedImages.filter(function (item) { return item.imgUrl !== imgPath; });
+ this.saveSettings();
+ }
+ else {
+ new obsidian.Notice(t("Delete failed"));
+ }
+ _b.label = 2;
+ case 2: return [3 /*break*/, 4];
+ case 3:
+ _b.sent();
+ new obsidian.Notice(t("Error, could not delete"));
+ return [3 /*break*/, 4];
+ case 4: return [2 /*return*/];
+ }
+ });
+ }); });
+ });
+ };
+ return _this;
+ }
+ imageAutoUploadPlugin.prototype.loadSettings = function () {
+ return __awaiter(this, void 0, void 0, function () {
+ var _a, _b, _c, _d;
+ return __generator(this, function (_e) {
+ switch (_e.label) {
+ case 0:
+ _a = this;
+ _c = (_b = Object).assign;
+ _d = [DEFAULT_SETTINGS];
+ return [4 /*yield*/, this.loadData()];
+ case 1:
+ _a.settings = _c.apply(_b, _d.concat([_e.sent()]));
+ return [2 /*return*/];
+ }
+ });
+ });
+ };
+ imageAutoUploadPlugin.prototype.saveSettings = function () {
+ return __awaiter(this, void 0, void 0, function () {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, this.saveData(this.settings)];
+ case 1:
+ _a.sent();
+ return [2 /*return*/];
+ }
+ });
+ });
+ };
+ imageAutoUploadPlugin.prototype.onunload = function () { };
+ imageAutoUploadPlugin.prototype.onload = function () {
+ return __awaiter(this, void 0, void 0, function () {
+ var _this = this;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, this.loadSettings()];
+ case 1:
+ _a.sent();
+ this.helper = new Helper(this.app);
+ this.picGoUploader = new PicGoUploader(this.settings, this);
+ this.picGoDeleter = new PicGoDeleter(this);
+ this.picGoCoreUploader = new PicGoCoreUploader(this.settings, this);
+ if (this.settings.uploader === "PicGo") {
+ this.uploader = this.picGoUploader;
+ }
+ else if (this.settings.uploader === "PicGo-Core") {
+ this.uploader = this.picGoCoreUploader;
+ if (this.settings.fixPath) {
+ fixPath();
+ }
+ }
+ else {
+ new obsidian.Notice("unknown uploader");
+ }
+ obsidian.addIcon("upload", "");
+ this.addSettingTab(new SettingTab(this.app, this));
+ this.addCommand({
+ id: "Upload all images",
+ name: "Upload all images",
+ checkCallback: function (checking) {
+ var leaf = _this.app.workspace.activeLeaf;
+ if (leaf) {
+ if (!checking) {
+ _this.uploadAllFile();
+ }
+ return true;
+ }
+ return false;
+ },
+ });
+ this.addCommand({
+ id: "Download all images",
+ name: "Download all images",
+ checkCallback: function (checking) {
+ var leaf = _this.app.workspace.activeLeaf;
+ if (leaf) {
+ if (!checking) {
+ _this.downloadAllImageFiles();
+ }
+ return true;
+ }
+ return false;
+ },
+ });
+ this.setupPasteHandler();
+ this.registerFileMenu();
+ this.registerSelection();
+ return [2 /*return*/];
+ }
+ });
+ });
+ };
+ imageAutoUploadPlugin.prototype.registerSelection = function () {
+ var _this = this;
+ this.registerEvent(this.app.workspace.on("editor-menu", function (menu, editor, info) {
+ if (_this.app.workspace.getLeavesOfType("markdown").length === 0) {
+ return;
+ }
+ var selection = editor.getSelection();
+ if (selection) {
+ var markdownRegex = /!\[.*\]\((.*)\)/g;
+ var markdownMatch = markdownRegex.exec(selection);
+ if (markdownMatch && markdownMatch.length > 1) {
+ var markdownUrl_1 = markdownMatch[1];
+ if (_this.settings.uploadedImages.find(function (item) { return item.imgUrl === markdownUrl_1; })) {
+ _this.addMenu(menu, markdownUrl_1, editor);
+ }
+ }
+ }
+ }));
+ };
+ imageAutoUploadPlugin.prototype.downloadAllImageFiles = function () {
+ return __awaiter(this, void 0, void 0, function () {
+ var activeFile, folderPath, fileArray, imageArray, nameSet, fileArray_1, fileArray_1_1, file, url, asset, name_1, response, activeFolder, abstractActiveFolder, e_1_1, value, currentFile;
+ var e_1, _a;
+ var _this = this;
+ return __generator(this, function (_b) {
+ switch (_b.label) {
+ case 0:
+ activeFile = this.app.workspace.getActiveFile();
+ folderPath = this.getFileAssetPath();
+ fileArray = this.helper.getAllFiles();
+ if (!require$$0.existsSync(folderPath)) {
+ require$$0.mkdirSync(folderPath);
+ }
+ imageArray = [];
+ nameSet = new Set();
+ _b.label = 1;
+ case 1:
+ _b.trys.push([1, 6, 7, 8]);
+ fileArray_1 = __values(fileArray), fileArray_1_1 = fileArray_1.next();
+ _b.label = 2;
+ case 2:
+ if (!!fileArray_1_1.done) return [3 /*break*/, 5];
+ file = fileArray_1_1.value;
+ if (!file.path.startsWith("http")) {
+ return [3 /*break*/, 4];
+ }
+ url = file.path;
+ asset = getUrlAsset(url);
+ name_1 = decodeURI(require$$0$1.parse(asset).name).replaceAll(/[\\\\/:*?\"<>|]/g, "-");
+ // 如果文件名已存在,则用随机值替换,不对文件后缀进行判断
+ if (require$$0.existsSync(require$$0$1.join(folderPath))) {
+ name_1 = (Math.random() + 1).toString(36).substr(2, 5);
+ }
+ if (nameSet.has(name_1)) {
+ name_1 = "".concat(name_1, "-").concat((Math.random() + 1).toString(36).substr(2, 5));
+ }
+ nameSet.add(name_1);
+ return [4 /*yield*/, this.download(url, folderPath, name_1)];
+ case 3:
+ response = _b.sent();
+ if (response.ok) {
+ activeFolder = obsidian.normalizePath(this.app.workspace.getActiveFile().parent.path);
+ abstractActiveFolder = this.app.vault.adapter.getFullPath(activeFolder);
+ imageArray.push({
+ source: file.source,
+ name: name_1,
+ path: obsidian.normalizePath(require$$0$1.relative(abstractActiveFolder, response.path)),
+ });
+ }
+ _b.label = 4;
+ case 4:
+ fileArray_1_1 = fileArray_1.next();
+ return [3 /*break*/, 2];
+ case 5: return [3 /*break*/, 8];
+ case 6:
+ e_1_1 = _b.sent();
+ e_1 = { error: e_1_1 };
+ return [3 /*break*/, 8];
+ case 7:
+ try {
+ if (fileArray_1_1 && !fileArray_1_1.done && (_a = fileArray_1.return)) _a.call(fileArray_1);
+ }
+ finally { if (e_1) throw e_1.error; }
+ return [7 /*endfinally*/];
+ case 8:
+ value = this.helper.getValue();
+ imageArray.map(function (image) {
+ var name = _this.handleName(image.name);
+ value = value.replace(image.source, ".concat(encodeURI(image.path), ")"));
+ });
+ currentFile = this.app.workspace.getActiveFile();
+ if (activeFile.path !== currentFile.path) {
+ new obsidian.Notice(t("File has been changedd, download failure"));
+ return [2 /*return*/];
+ }
+ this.helper.setValue(value);
+ new obsidian.Notice("all: ".concat(fileArray.length, "\nsuccess: ").concat(imageArray.length, "\nfailed: ").concat(fileArray.length - imageArray.length));
+ return [2 /*return*/];
+ }
+ });
+ });
+ };
+ // 获取当前文件所属的附件文件夹
+ imageAutoUploadPlugin.prototype.getFileAssetPath = function () {
+ var basePath = this.app.vault.adapter.getBasePath();
+ // @ts-ignore
+ var assetFolder = this.app.vault.config.attachmentFolderPath;
+ var activeFile = this.app.vault.getAbstractFileByPath(this.app.workspace.getActiveFile().path);
+ // 当前文件夹下的子文件夹
+ if (assetFolder.startsWith("./")) {
+ var activeFolder = decodeURI(require$$0$1.resolve(basePath, activeFile.parent.path));
+ return require$$0$1.join(activeFolder, assetFolder);
+ }
+ else {
+ // 根文件夹
+ return require$$0$1.join(basePath, assetFolder);
+ }
+ };
+ imageAutoUploadPlugin.prototype.download = function (url, folderPath, name) {
+ return __awaiter(this, void 0, void 0, function () {
+ var response, type, buffer, path;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, obsidian.requestUrl({ url: url })];
+ case 1:
+ response = _a.sent();
+ return [4 /*yield*/, imageType(new Uint8Array(response.arrayBuffer))];
+ case 2:
+ type = _a.sent();
+ if (response.status !== 200) {
+ return [2 /*return*/, {
+ ok: false,
+ msg: "error",
+ }];
+ }
+ if (!type) {
+ return [2 /*return*/, {
+ ok: false,
+ msg: "error",
+ }];
+ }
+ buffer = Buffer.from(response.arrayBuffer);
+ try {
+ path = require$$0$1.join(folderPath, "".concat(name, ".").concat(type.ext));
+ require$$0.writeFileSync(path, buffer);
+ return [2 /*return*/, {
+ ok: true,
+ msg: "ok",
+ path: path,
+ type: type,
+ }];
+ }
+ catch (err) {
+ return [2 /*return*/, {
+ ok: false,
+ msg: err,
+ }];
+ }
+ return [2 /*return*/];
+ }
+ });
+ });
+ };
+ imageAutoUploadPlugin.prototype.registerFileMenu = function () {
+ var _this = this;
+ this.registerEvent(this.app.workspace.on("file-menu", function (menu, file, source, leaf) {
+ if (source === "canvas-menu")
+ return false;
+ if (!isAssetTypeAnImage(file.path))
+ return false;
+ menu.addItem(function (item) {
+ item
+ .setTitle("Upload")
+ .setIcon("upload")
+ .onClick(function () {
+ if (!(file instanceof obsidian.TFile)) {
+ return false;
+ }
+ _this.fileMenuUpload(file);
+ });
+ });
+ }));
+ };
+ imageAutoUploadPlugin.prototype.fileMenuUpload = function (file) {
+ var e_2, _a;
+ var _this = this;
+ var content = this.helper.getValue();
+ var basePath = this.app.vault.adapter.getBasePath();
+ var imageList = [];
+ var fileArray = this.helper.getAllFiles();
+ try {
+ for (var fileArray_2 = __values(fileArray), fileArray_2_1 = fileArray_2.next(); !fileArray_2_1.done; fileArray_2_1 = fileArray_2.next()) {
+ var match = fileArray_2_1.value;
+ var imageName = match.name;
+ var encodedUri = match.path;
+ var fileName = require$$0$1.basename(decodeURI(encodedUri));
+ if (file && file.name === fileName) {
+ var abstractImageFile = require$$0$1.join(basePath, file.path);
+ if (isAssetTypeAnImage(abstractImageFile)) {
+ imageList.push({
+ path: abstractImageFile,
+ name: imageName,
+ source: match.source,
+ });
+ }
+ }
+ }
+ }
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
+ finally {
+ try {
+ if (fileArray_2_1 && !fileArray_2_1.done && (_a = fileArray_2.return)) _a.call(fileArray_2);
+ }
+ finally { if (e_2) throw e_2.error; }
+ }
+ if (imageList.length === 0) {
+ new obsidian.Notice(t("Can not find image file"));
+ return;
+ }
+ this.uploader.uploadFiles(imageList.map(function (item) { return item.path; })).then(function (res) {
+ if (res.success) {
+ var uploadUrlList_1 = res.result;
+ imageList.map(function (item) {
+ var uploadImage = uploadUrlList_1.shift();
+ var name = _this.handleName(item.name);
+ content = content.replaceAll(item.source, ".concat(uploadImage, ")"));
+ });
+ _this.helper.setValue(content);
+ if (_this.settings.deleteSource) {
+ imageList.map(function (image) {
+ if (!image.path.startsWith("http")) {
+ require$$0.unlink(image.path, function () { });
+ }
+ });
+ }
+ }
+ else {
+ new obsidian.Notice("Upload error");
+ }
+ });
+ };
+ imageAutoUploadPlugin.prototype.filterFile = function (fileArray) {
+ var e_3, _a;
+ var imageList = [];
+ try {
+ for (var fileArray_3 = __values(fileArray), fileArray_3_1 = fileArray_3.next(); !fileArray_3_1.done; fileArray_3_1 = fileArray_3.next()) {
+ var match = fileArray_3_1.value;
+ if (match.path.startsWith("http")) {
+ if (this.settings.workOnNetWork) {
+ if (!this.helper.hasBlackDomain(match.path, this.settings.newWorkBlackDomains)) {
+ imageList.push({
+ path: match.path,
+ name: match.name,
+ source: match.source,
+ });
+ }
+ }
+ }
+ else {
+ imageList.push({
+ path: match.path,
+ name: match.name,
+ source: match.source,
+ });
+ }
+ }
+ }
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
+ finally {
+ try {
+ if (fileArray_3_1 && !fileArray_3_1.done && (_a = fileArray_3.return)) _a.call(fileArray_3);
+ }
+ finally { if (e_3) throw e_3.error; }
+ }
+ return imageList;
+ };
+ imageAutoUploadPlugin.prototype.getFile = function (fileName, fileMap) {
+ if (!fileMap) {
+ fileMap = arrayToObject(this.app.vault.getFiles(), "name");
+ }
+ return fileMap[fileName];
+ };
+ // uploda all file
+ imageAutoUploadPlugin.prototype.uploadAllFile = function () {
+ var e_4, _a;
+ var _this = this;
+ var content = this.helper.getValue();
+ var basePath = this.app.vault.adapter.getBasePath();
+ var activeFile = this.app.workspace.getActiveFile();
+ var fileMap = arrayToObject(this.app.vault.getFiles(), "name");
+ var filePathMap = arrayToObject(this.app.vault.getFiles(), "path");
+ var imageList = [];
+ var fileArray = this.filterFile(this.helper.getAllFiles());
+ try {
+ for (var fileArray_4 = __values(fileArray), fileArray_4_1 = fileArray_4.next(); !fileArray_4_1.done; fileArray_4_1 = fileArray_4.next()) {
+ var match = fileArray_4_1.value;
+ var imageName = match.name;
+ var encodedUri = match.path;
+ if (encodedUri.startsWith("http")) {
+ imageList.push({
+ path: match.path,
+ name: imageName,
+ source: match.source,
+ });
+ }
+ else {
+ var fileName = require$$0$1.basename(decodeURI(encodedUri));
+ var file = void 0;
+ // 绝对路径
+ if (filePathMap[decodeURI(encodedUri)]) {
+ file = filePathMap[decodeURI(encodedUri)];
+ }
+ // 相对路径
+ if ((!file && decodeURI(encodedUri).startsWith("./")) ||
+ decodeURI(encodedUri).startsWith("../")) {
+ var filePath = require$$0$1.resolve(require$$0$1.join(basePath, require$$0$1.dirname(activeFile.path)), decodeURI(encodedUri));
+ if (require$$0.existsSync(filePath)) {
+ var path = obsidian.normalizePath(require$$0$1.relative(basePath, require$$0$1.resolve(require$$0$1.join(basePath, require$$0$1.dirname(activeFile.path)), decodeURI(encodedUri))));
+ file = filePathMap[path];
+ }
+ }
+ // 尽可能短路径
+ if (!file) {
+ file = this.getFile(fileName, fileMap);
+ }
+ if (file) {
+ var abstractImageFile = require$$0$1.join(basePath, file.path);
+ if (isAssetTypeAnImage(abstractImageFile)) {
+ imageList.push({
+ path: abstractImageFile,
+ name: imageName,
+ source: match.source,
+ });
+ }
+ }
+ }
+ }
+ }
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
+ finally {
+ try {
+ if (fileArray_4_1 && !fileArray_4_1.done && (_a = fileArray_4.return)) _a.call(fileArray_4);
+ }
+ finally { if (e_4) throw e_4.error; }
+ }
+ if (imageList.length === 0) {
+ new obsidian.Notice(t("Can not find image file"));
+ return;
+ }
+ else {
+ new obsidian.Notice("\u5171\u627E\u5230".concat(imageList.length, "\u4E2A\u56FE\u50CF\u6587\u4EF6\uFF0C\u5F00\u59CB\u4E0A\u4F20"));
+ }
+ this.uploader.uploadFiles(imageList.map(function (item) { return item.path; })).then(function (res) {
+ if (res.success) {
+ var uploadUrlList_2 = res.result;
+ if (imageList.length !== uploadUrlList_2.length) {
+ new obsidian.Notice(t("Warning: upload files is different of reciver files from api"));
+ }
+ imageList.map(function (item) {
+ var uploadImage = uploadUrlList_2.shift();
+ var name = _this.handleName(item.name);
+ content = content.replaceAll(item.source, ".concat(uploadImage, ")"));
+ });
+ var currentFile = _this.app.workspace.getActiveFile();
+ if (activeFile.path !== currentFile.path) {
+ new obsidian.Notice(t("File has been changedd, upload failure"));
+ return;
+ }
+ _this.helper.setValue(content);
+ if (_this.settings.deleteSource) {
+ imageList.map(function (image) {
+ if (!image.path.startsWith("http")) {
+ require$$0.unlink(image.path, function () { });
+ }
+ });
+ }
+ }
+ else {
+ new obsidian.Notice("Upload error");
+ }
+ });
+ };
+ imageAutoUploadPlugin.prototype.setupPasteHandler = function () {
+ var _this = this;
+ this.registerEvent(this.app.workspace.on("editor-paste", function (evt, editor, markdownView) {
+ var allowUpload = _this.helper.getFrontmatterValue("image-auto-upload", _this.settings.uploadByClipSwitch);
+ evt.clipboardData.files;
+ if (!allowUpload) {
+ return;
+ }
+ // 剪贴板内容有md格式的图片时
+ if (_this.settings.workOnNetWork) {
+ var clipboardValue = evt.clipboardData.getData("text/plain");
+ var imageList_1 = _this.helper
+ .getImageLink(clipboardValue)
+ .filter(function (image) { return image.path.startsWith("http"); })
+ .filter(function (image) {
+ return !_this.helper.hasBlackDomain(image.path, _this.settings.newWorkBlackDomains);
+ });
+ if (imageList_1.length !== 0) {
+ _this.uploader
+ .uploadFiles(imageList_1.map(function (item) { return item.path; }))
+ .then(function (res) {
+ var value = _this.helper.getValue();
+ if (res.success) {
+ var uploadUrlList_3 = res.result;
+ imageList_1.map(function (item) {
+ var uploadImage = uploadUrlList_3.shift();
+ var name = _this.handleName(item.name);
+ value = value.replaceAll(item.source, ".concat(uploadImage, ")"));
+ });
+ _this.helper.setValue(value);
+ }
+ else {
+ new obsidian.Notice("Upload error");
+ }
+ });
+ }
+ }
+ // 剪贴板中是图片时进行上传
+ if (_this.canUpload(evt.clipboardData)) {
+ _this.uploadFileAndEmbedImgurImage(editor, function (editor, pasteId) { return __awaiter(_this, void 0, void 0, function () {
+ var res, url;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, this.uploader.uploadFileByClipboard(evt.clipboardData.files)];
+ case 1:
+ res = _a.sent();
+ if (res.code !== 0) {
+ this.handleFailedUpload(editor, pasteId, res.msg);
+ return [2 /*return*/];
+ }
+ url = res.data;
+ return [2 /*return*/, url];
+ }
+ });
+ }); }, evt.clipboardData).catch();
+ evt.preventDefault();
+ }
+ }));
+ this.registerEvent(this.app.workspace.on("editor-drop", function (evt, editor, markdownView) { return __awaiter(_this, void 0, void 0, function () {
+ var allowUpload, files, sendFiles_1, files_1, data;
+ var _this = this;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ allowUpload = this.helper.getFrontmatterValue("image-auto-upload", this.settings.uploadByClipSwitch);
+ files = evt.dataTransfer.files;
+ if (!allowUpload) {
+ return [2 /*return*/];
+ }
+ if (!(files.length !== 0 && files[0].type.startsWith("image"))) return [3 /*break*/, 2];
+ sendFiles_1 = [];
+ files_1 = evt.dataTransfer.files;
+ Array.from(files_1).forEach(function (item, index) {
+ sendFiles_1.push(item.path);
+ });
+ evt.preventDefault();
+ return [4 /*yield*/, this.uploader.uploadFiles(sendFiles_1)];
+ case 1:
+ data = _a.sent();
+ if (data.success) {
+ data.result.map(function (value) {
+ var pasteId = (Math.random() + 1).toString(36).substr(2, 5);
+ _this.insertTemporaryText(editor, pasteId);
+ _this.embedMarkDownImage(editor, pasteId, value, files_1[0].name);
+ });
+ }
+ else {
+ new obsidian.Notice("Upload error");
+ }
+ _a.label = 2;
+ case 2: return [2 /*return*/];
+ }
+ });
+ }); }));
+ };
+ imageAutoUploadPlugin.prototype.canUpload = function (clipboardData) {
+ this.settings.applyImage;
+ var files = clipboardData.files;
+ var text = clipboardData.getData("text");
+ var hasImageFile = files.length !== 0 && files[0].type.startsWith("image");
+ if (hasImageFile) {
+ if (!!text) {
+ return this.settings.applyImage;
+ }
+ else {
+ return true;
+ }
+ }
+ else {
+ return false;
+ }
+ };
+ imageAutoUploadPlugin.prototype.uploadFileAndEmbedImgurImage = function (editor, callback, clipboardData) {
+ return __awaiter(this, void 0, void 0, function () {
+ var pasteId, name, url, e_5;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ pasteId = (Math.random() + 1).toString(36).substr(2, 5);
+ this.insertTemporaryText(editor, pasteId);
+ name = clipboardData.files[0].name;
+ _a.label = 1;
+ case 1:
+ _a.trys.push([1, 3, , 4]);
+ return [4 /*yield*/, callback(editor, pasteId)];
+ case 2:
+ url = _a.sent();
+ this.embedMarkDownImage(editor, pasteId, url, name);
+ return [3 /*break*/, 4];
+ case 3:
+ e_5 = _a.sent();
+ this.handleFailedUpload(editor, pasteId, e_5);
+ return [3 /*break*/, 4];
+ case 4: return [2 /*return*/];
+ }
+ });
+ });
+ };
+ imageAutoUploadPlugin.prototype.insertTemporaryText = function (editor, pasteId) {
+ var progressText = imageAutoUploadPlugin.progressTextFor(pasteId);
+ editor.replaceSelection(progressText + "\n");
+ };
+ imageAutoUploadPlugin.progressTextFor = function (id) {
+ return "![Uploading file...".concat(id, "]()");
+ };
+ imageAutoUploadPlugin.prototype.embedMarkDownImage = function (editor, pasteId, imageUrl, name) {
+ if (name === void 0) { name = ""; }
+ var progressText = imageAutoUploadPlugin.progressTextFor(pasteId);
+ name = this.handleName(name);
+ var markDownImage = ".concat(imageUrl, ")");
+ imageAutoUploadPlugin.replaceFirstOccurrence(editor, progressText, markDownImage);
+ };
+ imageAutoUploadPlugin.prototype.handleFailedUpload = function (editor, pasteId, reason) {
+ new obsidian.Notice(reason);
+ console.error("Failed request: ", reason);
+ var progressText = imageAutoUploadPlugin.progressTextFor(pasteId);
+ imageAutoUploadPlugin.replaceFirstOccurrence(editor, progressText, "⚠️upload failed, check dev console");
+ };
+ imageAutoUploadPlugin.prototype.handleName = function (name) {
+ var imageSizeSuffix = this.settings.imageSizeSuffix || "";
+ if (this.settings.imageDesc === "origin") {
+ return "".concat(name).concat(imageSizeSuffix);
+ }
+ else if (this.settings.imageDesc === "none") {
+ return "";
+ }
+ else if (this.settings.imageDesc === "removeDefault") {
+ if (name === "image.png") {
+ return "";
+ }
+ else {
+ return "".concat(name).concat(imageSizeSuffix);
+ }
+ }
+ else {
+ return "".concat(name).concat(imageSizeSuffix);
+ }
+ };
+ imageAutoUploadPlugin.replaceFirstOccurrence = function (editor, target, replacement) {
+ var lines = editor.getValue().split("\n");
+ for (var i = 0; i < lines.length; i++) {
+ var ch = lines[i].indexOf(target);
+ if (ch != -1) {
+ var from = { line: i, ch: ch };
+ var to = { line: i, ch: ch + target.length };
+ editor.replaceRange(replacement, from, to);
+ break;
+ }
+ }
+ };
+ return imageAutoUploadPlugin;
+}(obsidian.Plugin));
+
+module.exports = imageAutoUploadPlugin;
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm5vZGVfbW9kdWxlcy9pc2V4ZS93aW5kb3dzLmpzIiwibm9kZV9tb2R1bGVzL2lzZXhlL21vZGUuanMiLCJub2RlX21vZHVsZXMvaXNleGUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvd2hpY2gvd2hpY2guanMiLCJub2RlX21vZHVsZXMvcGF0aC1rZXkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY3Jvc3Mtc3Bhd24vbGliL3V0aWwvcmVzb2x2ZUNvbW1hbmQuanMiLCJub2RlX21vZHVsZXMvY3Jvc3Mtc3Bhd24vbGliL3V0aWwvZXNjYXBlLmpzIiwibm9kZV9tb2R1bGVzL3NoZWJhbmctcmVnZXgvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc2hlYmFuZy1jb21tYW5kL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Nyb3NzLXNwYXduL2xpYi91dGlsL3JlYWRTaGViYW5nLmpzIiwibm9kZV9tb2R1bGVzL2Nyb3NzLXNwYXduL2xpYi9wYXJzZS5qcyIsIm5vZGVfbW9kdWxlcy9jcm9zcy1zcGF3bi9saWIvZW5vZW50LmpzIiwibm9kZV9tb2R1bGVzL2Nyb3NzLXNwYXduL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3N0cmlwLWZpbmFsLW5ld2xpbmUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbnBtLXJ1bi1wYXRoL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21pbWljLWZuL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL29uZXRpbWUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaHVtYW4tc2lnbmFscy9idWlsZC9zcmMvY29yZS5qcyIsIm5vZGVfbW9kdWxlcy9odW1hbi1zaWduYWxzL2J1aWxkL3NyYy9yZWFsdGltZS5qcyIsIm5vZGVfbW9kdWxlcy9odW1hbi1zaWduYWxzL2J1aWxkL3NyYy9zaWduYWxzLmpzIiwibm9kZV9tb2R1bGVzL2h1bWFuLXNpZ25hbHMvYnVpbGQvc3JjL21haW4uanMiLCJub2RlX21vZHVsZXMvZXhlY2EvbGliL2Vycm9yLmpzIiwibm9kZV9tb2R1bGVzL2V4ZWNhL2xpYi9zdGRpby5qcyIsIm5vZGVfbW9kdWxlcy9zaWduYWwtZXhpdC9zaWduYWxzLmpzIiwibm9kZV9tb2R1bGVzL3NpZ25hbC1leGl0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2V4ZWNhL2xpYi9raWxsLmpzIiwibm9kZV9tb2R1bGVzL2lzLXN0cmVhbS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9leGVjYS9ub2RlX21vZHVsZXMvZ2V0LXN0cmVhbS9idWZmZXItc3RyZWFtLmpzIiwibm9kZV9tb2R1bGVzL2V4ZWNhL25vZGVfbW9kdWxlcy9nZXQtc3RyZWFtL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21lcmdlLXN0cmVhbS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9leGVjYS9saWIvc3RyZWFtLmpzIiwibm9kZV9tb2R1bGVzL2V4ZWNhL2xpYi9wcm9taXNlLmpzIiwibm9kZV9tb2R1bGVzL2V4ZWNhL2xpYi9jb21tYW5kLmpzIiwibm9kZV9tb2R1bGVzL2V4ZWNhL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Fuc2ktcmVnZXgvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc3RyaXAtYW5zaS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9kZWZhdWx0LXNoZWxsL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3NoZWxsLWVudi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zaGVsbC1wYXRoL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2ZpeC1wYXRoL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9zdHJlYW0uanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2J1ZmZlcl9saXN0LmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9kZXN0cm95LmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9lcnJvcnMuanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3N0YXRlLmpzIiwibm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHMuanMiLCJub2RlX21vZHVsZXMvdXRpbC1kZXByZWNhdGUvbm9kZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fd3JpdGFibGUuanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX2R1cGxleC5qcyIsIm5vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zdHJpbmdfZGVjb2Rlci9saWIvc3RyaW5nX2RlY29kZXIuanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2VuZC1vZi1zdHJlYW0uanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2FzeW5jX2l0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9mcm9tLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fdHJhbnNmb3JtLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9wYXNzdGhyb3VnaC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvcGlwZWxpbmUuanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL3JlYWRhYmxlLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXdlYi10by1ub2RlLXN0cmVhbS9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdG9rZW4tdHlwZXMvbGliL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3BlZWstcmVhZGFibGUvbGliL0VuZE9mRmlsZVN0cmVhbS5qcyIsIm5vZGVfbW9kdWxlcy9zdHJ0b2szL2xpYi9BYnN0cmFjdFRva2VuaXplci5qcyIsIm5vZGVfbW9kdWxlcy9zdHJ0b2szL2xpYi9CdWZmZXJUb2tlbml6ZXIuanMiLCJub2RlX21vZHVsZXMvc3RydG9rMy9saWIvY29yZS5qcyIsIm5vZGVfbW9kdWxlcy9maWxlLXR5cGUvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9maWxlLXR5cGUvc3VwcG9ydGVkLmpzIiwibm9kZV9tb2R1bGVzL2ZpbGUtdHlwZS9jb3JlLmpzIiwibm9kZV9tb2R1bGVzL2ltYWdlLXR5cGUvaW5kZXguanMiLCJzcmMvdXRpbHMudHMiLCJub2RlX21vZHVsZXMvbm9kZS1mZXRjaC1uYXRpdmUvZGlzdC9uYXRpdmUubWpzIiwic3JjL3VwbG9hZGVyLnRzIiwic3JjL2RlbGV0ZXIudHMiLCJzcmMvaGVscGVyLnRzIiwic3JjL2xhbmcvbG9jYWxlL2FyLnRzIiwic3JjL2xhbmcvbG9jYWxlL2N6LnRzIiwic3JjL2xhbmcvbG9jYWxlL2RhLnRzIiwic3JjL2xhbmcvbG9jYWxlL2RlLnRzIiwic3JjL2xhbmcvbG9jYWxlL2VuLnRzIiwic3JjL2xhbmcvbG9jYWxlL2VuLWdiLnRzIiwic3JjL2xhbmcvbG9jYWxlL2VzLnRzIiwic3JjL2xhbmcvbG9jYWxlL2ZyLnRzIiwic3JjL2xhbmcvbG9jYWxlL2hpLnRzIiwic3JjL2xhbmcvbG9jYWxlL2lkLnRzIiwic3JjL2xhbmcvbG9jYWxlL2l0LnRzIiwic3JjL2xhbmcvbG9jYWxlL2phLnRzIiwic3JjL2xhbmcvbG9jYWxlL2tvLnRzIiwic3JjL2xhbmcvbG9jYWxlL25sLnRzIiwic3JjL2xhbmcvbG9jYWxlL25vLnRzIiwic3JjL2xhbmcvbG9jYWxlL3BsLnRzIiwic3JjL2xhbmcvbG9jYWxlL3B0LnRzIiwic3JjL2xhbmcvbG9jYWxlL3B0LWJyLnRzIiwic3JjL2xhbmcvbG9jYWxlL3JvLnRzIiwic3JjL2xhbmcvbG9jYWxlL3J1LnRzIiwic3JjL2xhbmcvbG9jYWxlL3RyLnRzIiwic3JjL2xhbmcvbG9jYWxlL3poLWNuLnRzIiwic3JjL2xhbmcvbG9jYWxlL3poLXR3LnRzIiwic3JjL2xhbmcvaGVscGVycy50cyIsInNyYy9zZXR0aW5nLnRzIiwic3JjL21haW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2VzRGVjb3JhdGUoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcclxuICAgIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxyXG4gICAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5ID0ga2luZCA9PT0gXCJnZXR0ZXJcIiA/IFwiZ2V0XCIgOiBraW5kID09PSBcInNldHRlclwiID8gXCJzZXRcIiA6IFwidmFsdWVcIjtcclxuICAgIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xyXG4gICAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XHJcbiAgICB2YXIgXywgZG9uZSA9IGZhbHNlO1xyXG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICB2YXIgY29udGV4dCA9IHt9O1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluKSBjb250ZXh0W3BdID0gcCA9PT0gXCJhY2Nlc3NcIiA/IHt9IDogY29udGV4dEluW3BdO1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xyXG4gICAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2ldKShraW5kID09PSBcImFjY2Vzc29yXCIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5XSwgY29udGV4dCk7XHJcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWRcIik7XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnB1c2goXyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xyXG4gICAgICAgICAgICBpZiAoa2luZCA9PT0gXCJmaWVsZFwiKSBpbml0aWFsaXplcnMucHVzaChfKTtcclxuICAgICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcclxuICAgIGRvbmUgPSB0cnVlO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcclxuICAgIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Byb3BLZXkoeCkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geCA6IFwiXCIuY29uY2F0KHgpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGYsIG5hbWUsIHByZWZpeCkge1xyXG4gICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN5bWJvbFwiKSBuYW1lID0gbmFtZS5kZXNjcmlwdGlvbiA/IFwiW1wiLmNvbmNhdChuYW1lLmRlc2NyaXB0aW9uLCBcIl1cIikgOiBcIlwiO1xyXG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCBcIm5hbWVcIiwgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiIFwiLCBuYW1lKSA6IG5hbWUgfSk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xyXG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XHJcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xyXG4gICAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XHJcbiAgICB9XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xyXG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIG9bazJdID0gbVtrXTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcclxuICAgIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xyXG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxyXG4gICAgICAgICAgICByW2tdID0gYVtqXTtcclxuICAgIHJldHVybiByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xyXG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XHJcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XHJcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcclxuICAgIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCAodHlwZW9mIHJlY2VpdmVyICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gXCJmdW5jdGlvblwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgJ2luJyBvcGVyYXRvciBvbiBub24tb2JqZWN0XCIpO1xyXG4gICAgcmV0dXJuIHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgPT09IHN0YXRlIDogc3RhdGUuaGFzKHJlY2VpdmVyKTtcclxufVxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IGlzZXhlXG5pc2V4ZS5zeW5jID0gc3luY1xuXG52YXIgZnMgPSByZXF1aXJlKCdmcycpXG5cbmZ1bmN0aW9uIGNoZWNrUGF0aEV4dCAocGF0aCwgb3B0aW9ucykge1xuICB2YXIgcGF0aGV4dCA9IG9wdGlvbnMucGF0aEV4dCAhPT0gdW5kZWZpbmVkID9cbiAgICBvcHRpb25zLnBhdGhFeHQgOiBwcm9jZXNzLmVudi5QQVRIRVhUXG5cbiAgaWYgKCFwYXRoZXh0KSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHBhdGhleHQgPSBwYXRoZXh0LnNwbGl0KCc7JylcbiAgaWYgKHBhdGhleHQuaW5kZXhPZignJykgIT09IC0xKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhleHQubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcCA9IHBhdGhleHRbaV0udG9Mb3dlckNhc2UoKVxuICAgIGlmIChwICYmIHBhdGguc3Vic3RyKC1wLmxlbmd0aCkudG9Mb3dlckNhc2UoKSA9PT0gcCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIGNoZWNrU3RhdCAoc3RhdCwgcGF0aCwgb3B0aW9ucykge1xuICBpZiAoIXN0YXQuaXNTeW1ib2xpY0xpbmsoKSAmJiAhc3RhdC5pc0ZpbGUoKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIHJldHVybiBjaGVja1BhdGhFeHQocGF0aCwgb3B0aW9ucylcbn1cblxuZnVuY3Rpb24gaXNleGUgKHBhdGgsIG9wdGlvbnMsIGNiKSB7XG4gIGZzLnN0YXQocGF0aCwgZnVuY3Rpb24gKGVyLCBzdGF0KSB7XG4gICAgY2IoZXIsIGVyID8gZmFsc2UgOiBjaGVja1N0YXQoc3RhdCwgcGF0aCwgb3B0aW9ucykpXG4gIH0pXG59XG5cbmZ1bmN0aW9uIHN5bmMgKHBhdGgsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGNoZWNrU3RhdChmcy5zdGF0U3luYyhwYXRoKSwgcGF0aCwgb3B0aW9ucylcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gaXNleGVcbmlzZXhlLnN5bmMgPSBzeW5jXG5cbnZhciBmcyA9IHJlcXVpcmUoJ2ZzJylcblxuZnVuY3Rpb24gaXNleGUgKHBhdGgsIG9wdGlvbnMsIGNiKSB7XG4gIGZzLnN0YXQocGF0aCwgZnVuY3Rpb24gKGVyLCBzdGF0KSB7XG4gICAgY2IoZXIsIGVyID8gZmFsc2UgOiBjaGVja1N0YXQoc3RhdCwgb3B0aW9ucykpXG4gIH0pXG59XG5cbmZ1bmN0aW9uIHN5bmMgKHBhdGgsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGNoZWNrU3RhdChmcy5zdGF0U3luYyhwYXRoKSwgb3B0aW9ucylcbn1cblxuZnVuY3Rpb24gY2hlY2tTdGF0IChzdGF0LCBvcHRpb25zKSB7XG4gIHJldHVybiBzdGF0LmlzRmlsZSgpICYmIGNoZWNrTW9kZShzdGF0LCBvcHRpb25zKVxufVxuXG5mdW5jdGlvbiBjaGVja01vZGUgKHN0YXQsIG9wdGlvbnMpIHtcbiAgdmFyIG1vZCA9IHN0YXQubW9kZVxuICB2YXIgdWlkID0gc3RhdC51aWRcbiAgdmFyIGdpZCA9IHN0YXQuZ2lkXG5cbiAgdmFyIG15VWlkID0gb3B0aW9ucy51aWQgIT09IHVuZGVmaW5lZCA/XG4gICAgb3B0aW9ucy51aWQgOiBwcm9jZXNzLmdldHVpZCAmJiBwcm9jZXNzLmdldHVpZCgpXG4gIHZhciBteUdpZCA9IG9wdGlvbnMuZ2lkICE9PSB1bmRlZmluZWQgP1xuICAgIG9wdGlvbnMuZ2lkIDogcHJvY2Vzcy5nZXRnaWQgJiYgcHJvY2Vzcy5nZXRnaWQoKVxuXG4gIHZhciB1ID0gcGFyc2VJbnQoJzEwMCcsIDgpXG4gIHZhciBnID0gcGFyc2VJbnQoJzAxMCcsIDgpXG4gIHZhciBvID0gcGFyc2VJbnQoJzAwMScsIDgpXG4gIHZhciB1ZyA9IHUgfCBnXG5cbiAgdmFyIHJldCA9IChtb2QgJiBvKSB8fFxuICAgIChtb2QgJiBnKSAmJiBnaWQgPT09IG15R2lkIHx8XG4gICAgKG1vZCAmIHUpICYmIHVpZCA9PT0gbXlVaWQgfHxcbiAgICAobW9kICYgdWcpICYmIG15VWlkID09PSAwXG5cbiAgcmV0dXJuIHJldFxufVxuIiwidmFyIGZzID0gcmVxdWlyZSgnZnMnKVxudmFyIGNvcmVcbmlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInIHx8IGdsb2JhbC5URVNUSU5HX1dJTkRPV1MpIHtcbiAgY29yZSA9IHJlcXVpcmUoJy4vd2luZG93cy5qcycpXG59IGVsc2Uge1xuICBjb3JlID0gcmVxdWlyZSgnLi9tb2RlLmpzJylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc2V4ZVxuaXNleGUuc3luYyA9IHN5bmNcblxuZnVuY3Rpb24gaXNleGUgKHBhdGgsIG9wdGlvbnMsIGNiKSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gb3B0aW9uc1xuICAgIG9wdGlvbnMgPSB7fVxuICB9XG5cbiAgaWYgKCFjYikge1xuICAgIGlmICh0eXBlb2YgUHJvbWlzZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgbm90IHByb3ZpZGVkJylcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgaXNleGUocGF0aCwgb3B0aW9ucyB8fCB7fSwgZnVuY3Rpb24gKGVyLCBpcykge1xuICAgICAgICBpZiAoZXIpIHtcbiAgICAgICAgICByZWplY3QoZXIpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZShpcylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgY29yZShwYXRoLCBvcHRpb25zIHx8IHt9LCBmdW5jdGlvbiAoZXIsIGlzKSB7XG4gICAgLy8gaWdub3JlIEVBQ0NFUyBiZWNhdXNlIHRoYXQganVzdCBtZWFucyB3ZSBhcmVuJ3QgYWxsb3dlZCB0byBydW4gaXRcbiAgICBpZiAoZXIpIHtcbiAgICAgIGlmIChlci5jb2RlID09PSAnRUFDQ0VTJyB8fCBvcHRpb25zICYmIG9wdGlvbnMuaWdub3JlRXJyb3JzKSB7XG4gICAgICAgIGVyID0gbnVsbFxuICAgICAgICBpcyA9IGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIGNiKGVyLCBpcylcbiAgfSlcbn1cblxuZnVuY3Rpb24gc3luYyAocGF0aCwgb3B0aW9ucykge1xuICAvLyBteSBraW5nZG9tIGZvciBhIGZpbHRlcmVkIGNhdGNoXG4gIHRyeSB7XG4gICAgcmV0dXJuIGNvcmUuc3luYyhwYXRoLCBvcHRpb25zIHx8IHt9KVxuICB9IGNhdGNoIChlcikge1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuaWdub3JlRXJyb3JzIHx8IGVyLmNvZGUgPT09ICdFQUNDRVMnKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZXJcbiAgICB9XG4gIH1cbn1cbiIsImNvbnN0IGlzV2luZG93cyA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgfHxcbiAgICBwcm9jZXNzLmVudi5PU1RZUEUgPT09ICdjeWd3aW4nIHx8XG4gICAgcHJvY2Vzcy5lbnYuT1NUWVBFID09PSAnbXN5cydcblxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuY29uc3QgQ09MT04gPSBpc1dpbmRvd3MgPyAnOycgOiAnOidcbmNvbnN0IGlzZXhlID0gcmVxdWlyZSgnaXNleGUnKVxuXG5jb25zdCBnZXROb3RGb3VuZEVycm9yID0gKGNtZCkgPT5cbiAgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoYG5vdCBmb3VuZDogJHtjbWR9YCksIHsgY29kZTogJ0VOT0VOVCcgfSlcblxuY29uc3QgZ2V0UGF0aEluZm8gPSAoY21kLCBvcHQpID0+IHtcbiAgY29uc3QgY29sb24gPSBvcHQuY29sb24gfHwgQ09MT05cblxuICAvLyBJZiBpdCBoYXMgYSBzbGFzaCwgdGhlbiB3ZSBkb24ndCBib3RoZXIgc2VhcmNoaW5nIHRoZSBwYXRoZW52LlxuICAvLyBqdXN0IGNoZWNrIHRoZSBmaWxlIGl0c2VsZiwgYW5kIHRoYXQncyBpdC5cbiAgY29uc3QgcGF0aEVudiA9IGNtZC5tYXRjaCgvXFwvLykgfHwgaXNXaW5kb3dzICYmIGNtZC5tYXRjaCgvXFxcXC8pID8gWycnXVxuICAgIDogKFxuICAgICAgW1xuICAgICAgICAvLyB3aW5kb3dzIGFsd2F5cyBjaGVja3MgdGhlIGN3ZCBmaXJzdFxuICAgICAgICAuLi4oaXNXaW5kb3dzID8gW3Byb2Nlc3MuY3dkKCldIDogW10pLFxuICAgICAgICAuLi4ob3B0LnBhdGggfHwgcHJvY2Vzcy5lbnYuUEFUSCB8fFxuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiB2ZXJ5IHVudXN1YWwgKi8gJycpLnNwbGl0KGNvbG9uKSxcbiAgICAgIF1cbiAgICApXG4gIGNvbnN0IHBhdGhFeHRFeGUgPSBpc1dpbmRvd3NcbiAgICA/IG9wdC5wYXRoRXh0IHx8IHByb2Nlc3MuZW52LlBBVEhFWFQgfHwgJy5FWEU7LkNNRDsuQkFUOy5DT00nXG4gICAgOiAnJ1xuICBjb25zdCBwYXRoRXh0ID0gaXNXaW5kb3dzID8gcGF0aEV4dEV4ZS5zcGxpdChjb2xvbikgOiBbJyddXG5cbiAgaWYgKGlzV2luZG93cykge1xuICAgIGlmIChjbWQuaW5kZXhPZignLicpICE9PSAtMSAmJiBwYXRoRXh0WzBdICE9PSAnJylcbiAgICAgIHBhdGhFeHQudW5zaGlmdCgnJylcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGF0aEVudixcbiAgICBwYXRoRXh0LFxuICAgIHBhdGhFeHRFeGUsXG4gIH1cbn1cblxuY29uc3Qgd2hpY2ggPSAoY21kLCBvcHQsIGNiKSA9PiB7XG4gIGlmICh0eXBlb2Ygb3B0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBvcHRcbiAgICBvcHQgPSB7fVxuICB9XG4gIGlmICghb3B0KVxuICAgIG9wdCA9IHt9XG5cbiAgY29uc3QgeyBwYXRoRW52LCBwYXRoRXh0LCBwYXRoRXh0RXhlIH0gPSBnZXRQYXRoSW5mbyhjbWQsIG9wdClcbiAgY29uc3QgZm91bmQgPSBbXVxuXG4gIGNvbnN0IHN0ZXAgPSBpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBpZiAoaSA9PT0gcGF0aEVudi5sZW5ndGgpXG4gICAgICByZXR1cm4gb3B0LmFsbCAmJiBmb3VuZC5sZW5ndGggPyByZXNvbHZlKGZvdW5kKVxuICAgICAgICA6IHJlamVjdChnZXROb3RGb3VuZEVycm9yKGNtZCkpXG5cbiAgICBjb25zdCBwcFJhdyA9IHBhdGhFbnZbaV1cbiAgICBjb25zdCBwYXRoUGFydCA9IC9eXCIuKlwiJC8udGVzdChwcFJhdykgPyBwcFJhdy5zbGljZSgxLCAtMSkgOiBwcFJhd1xuXG4gICAgY29uc3QgcENtZCA9IHBhdGguam9pbihwYXRoUGFydCwgY21kKVxuICAgIGNvbnN0IHAgPSAhcGF0aFBhcnQgJiYgL15cXC5bXFxcXFxcL10vLnRlc3QoY21kKSA/IGNtZC5zbGljZSgwLCAyKSArIHBDbWRcbiAgICAgIDogcENtZFxuXG4gICAgcmVzb2x2ZShzdWJTdGVwKHAsIGksIDApKVxuICB9KVxuXG4gIGNvbnN0IHN1YlN0ZXAgPSAocCwgaSwgaWkpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBpZiAoaWkgPT09IHBhdGhFeHQubGVuZ3RoKVxuICAgICAgcmV0dXJuIHJlc29sdmUoc3RlcChpICsgMSkpXG4gICAgY29uc3QgZXh0ID0gcGF0aEV4dFtpaV1cbiAgICBpc2V4ZShwICsgZXh0LCB7IHBhdGhFeHQ6IHBhdGhFeHRFeGUgfSwgKGVyLCBpcykgPT4ge1xuICAgICAgaWYgKCFlciAmJiBpcykge1xuICAgICAgICBpZiAob3B0LmFsbClcbiAgICAgICAgICBmb3VuZC5wdXNoKHAgKyBleHQpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShwICsgZXh0KVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc29sdmUoc3ViU3RlcChwLCBpLCBpaSArIDEpKVxuICAgIH0pXG4gIH0pXG5cbiAgcmV0dXJuIGNiID8gc3RlcCgwKS50aGVuKHJlcyA9PiBjYihudWxsLCByZXMpLCBjYikgOiBzdGVwKDApXG59XG5cbmNvbnN0IHdoaWNoU3luYyA9IChjbWQsIG9wdCkgPT4ge1xuICBvcHQgPSBvcHQgfHwge31cblxuICBjb25zdCB7IHBhdGhFbnYsIHBhdGhFeHQsIHBhdGhFeHRFeGUgfSA9IGdldFBhdGhJbmZvKGNtZCwgb3B0KVxuICBjb25zdCBmb3VuZCA9IFtdXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoRW52Lmxlbmd0aDsgaSArKykge1xuICAgIGNvbnN0IHBwUmF3ID0gcGF0aEVudltpXVxuICAgIGNvbnN0IHBhdGhQYXJ0ID0gL15cIi4qXCIkLy50ZXN0KHBwUmF3KSA/IHBwUmF3LnNsaWNlKDEsIC0xKSA6IHBwUmF3XG5cbiAgICBjb25zdCBwQ21kID0gcGF0aC5qb2luKHBhdGhQYXJ0LCBjbWQpXG4gICAgY29uc3QgcCA9ICFwYXRoUGFydCAmJiAvXlxcLltcXFxcXFwvXS8udGVzdChjbWQpID8gY21kLnNsaWNlKDAsIDIpICsgcENtZFxuICAgICAgOiBwQ21kXG5cbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHBhdGhFeHQubGVuZ3RoOyBqICsrKSB7XG4gICAgICBjb25zdCBjdXIgPSBwICsgcGF0aEV4dFtqXVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaXMgPSBpc2V4ZS5zeW5jKGN1ciwgeyBwYXRoRXh0OiBwYXRoRXh0RXhlIH0pXG4gICAgICAgIGlmIChpcykge1xuICAgICAgICAgIGlmIChvcHQuYWxsKVxuICAgICAgICAgICAgZm91bmQucHVzaChjdXIpXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIGN1clxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChleCkge31cbiAgICB9XG4gIH1cblxuICBpZiAob3B0LmFsbCAmJiBmb3VuZC5sZW5ndGgpXG4gICAgcmV0dXJuIGZvdW5kXG5cbiAgaWYgKG9wdC5ub3Rocm93KVxuICAgIHJldHVybiBudWxsXG5cbiAgdGhyb3cgZ2V0Tm90Rm91bmRFcnJvcihjbWQpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gd2hpY2hcbndoaWNoLnN5bmMgPSB3aGljaFN5bmNcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgcGF0aEtleSA9IChvcHRpb25zID0ge30pID0+IHtcblx0Y29uc3QgZW52aXJvbm1lbnQgPSBvcHRpb25zLmVudiB8fCBwcm9jZXNzLmVudjtcblx0Y29uc3QgcGxhdGZvcm0gPSBvcHRpb25zLnBsYXRmb3JtIHx8IHByb2Nlc3MucGxhdGZvcm07XG5cblx0aWYgKHBsYXRmb3JtICE9PSAnd2luMzInKSB7XG5cdFx0cmV0dXJuICdQQVRIJztcblx0fVxuXG5cdHJldHVybiBPYmplY3Qua2V5cyhlbnZpcm9ubWVudCkucmV2ZXJzZSgpLmZpbmQoa2V5ID0+IGtleS50b1VwcGVyQ2FzZSgpID09PSAnUEFUSCcpIHx8ICdQYXRoJztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aEtleTtcbi8vIFRPRE86IFJlbW92ZSB0aGlzIGZvciB0aGUgbmV4dCBtYWpvciByZWxlYXNlXG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0ID0gcGF0aEtleTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbmNvbnN0IHdoaWNoID0gcmVxdWlyZSgnd2hpY2gnKTtcbmNvbnN0IGdldFBhdGhLZXkgPSByZXF1aXJlKCdwYXRoLWtleScpO1xuXG5mdW5jdGlvbiByZXNvbHZlQ29tbWFuZEF0dGVtcHQocGFyc2VkLCB3aXRob3V0UGF0aEV4dCkge1xuICAgIGNvbnN0IGVudiA9IHBhcnNlZC5vcHRpb25zLmVudiB8fCBwcm9jZXNzLmVudjtcbiAgICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuICAgIGNvbnN0IGhhc0N1c3RvbUN3ZCA9IHBhcnNlZC5vcHRpb25zLmN3ZCAhPSBudWxsO1xuICAgIC8vIFdvcmtlciB0aHJlYWRzIGRvIG5vdCBoYXZlIHByb2Nlc3MuY2hkaXIoKVxuICAgIGNvbnN0IHNob3VsZFN3aXRjaEN3ZCA9IGhhc0N1c3RvbUN3ZCAmJiBwcm9jZXNzLmNoZGlyICE9PSB1bmRlZmluZWQgJiYgIXByb2Nlc3MuY2hkaXIuZGlzYWJsZWQ7XG5cbiAgICAvLyBJZiBhIGN1c3RvbSBgY3dkYCB3YXMgc3BlY2lmaWVkLCB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgcHJvY2VzcyBjd2RcbiAgICAvLyBiZWNhdXNlIGB3aGljaGAgd2lsbCBkbyBzdGF0IGNhbGxzIGJ1dCBkb2VzIG5vdCBzdXBwb3J0IGEgY3VzdG9tIGN3ZFxuICAgIGlmIChzaG91bGRTd2l0Y2hDd2QpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHByb2Nlc3MuY2hkaXIocGFyc2VkLm9wdGlvbnMuY3dkKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAvKiBFbXB0eSAqL1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHJlc29sdmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgcmVzb2x2ZWQgPSB3aGljaC5zeW5jKHBhcnNlZC5jb21tYW5kLCB7XG4gICAgICAgICAgICBwYXRoOiBlbnZbZ2V0UGF0aEtleSh7IGVudiB9KV0sXG4gICAgICAgICAgICBwYXRoRXh0OiB3aXRob3V0UGF0aEV4dCA/IHBhdGguZGVsaW1pdGVyIDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8qIEVtcHR5ICovXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHNob3VsZFN3aXRjaEN3ZCkge1xuICAgICAgICAgICAgcHJvY2Vzcy5jaGRpcihjd2QpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgd2Ugc3VjY2Vzc2Z1bGx5IHJlc29sdmVkLCBlbnN1cmUgdGhhdCBhbiBhYnNvbHV0ZSBwYXRoIGlzIHJldHVybmVkXG4gICAgLy8gTm90ZSB0aGF0IHdoZW4gYSBjdXN0b20gYGN3ZGAgd2FzIHVzZWQsIHdlIG5lZWQgdG8gcmVzb2x2ZSB0byBhbiBhYnNvbHV0ZSBwYXRoIGJhc2VkIG9uIGl0XG4gICAgaWYgKHJlc29sdmVkKSB7XG4gICAgICAgIHJlc29sdmVkID0gcGF0aC5yZXNvbHZlKGhhc0N1c3RvbUN3ZCA/IHBhcnNlZC5vcHRpb25zLmN3ZCA6ICcnLCByZXNvbHZlZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc29sdmVkO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlQ29tbWFuZChwYXJzZWQpIHtcbiAgICByZXR1cm4gcmVzb2x2ZUNvbW1hbmRBdHRlbXB0KHBhcnNlZCkgfHwgcmVzb2x2ZUNvbW1hbmRBdHRlbXB0KHBhcnNlZCwgdHJ1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVzb2x2ZUNvbW1hbmQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIFNlZSBodHRwOi8vd3d3LnJvYnZhbmRlcndvdWRlLmNvbS9lc2NhcGVjaGFycy5waHBcbmNvbnN0IG1ldGFDaGFyc1JlZ0V4cCA9IC8oWygpXFxdWyUhXlwiYDw+Jnw7LCAqP10pL2c7XG5cbmZ1bmN0aW9uIGVzY2FwZUNvbW1hbmQoYXJnKSB7XG4gICAgLy8gRXNjYXBlIG1ldGEgY2hhcnNcbiAgICBhcmcgPSBhcmcucmVwbGFjZShtZXRhQ2hhcnNSZWdFeHAsICdeJDEnKTtcblxuICAgIHJldHVybiBhcmc7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZUFyZ3VtZW50KGFyZywgZG91YmxlRXNjYXBlTWV0YUNoYXJzKSB7XG4gICAgLy8gQ29udmVydCB0byBzdHJpbmdcbiAgICBhcmcgPSBgJHthcmd9YDtcblxuICAgIC8vIEFsZ29yaXRobSBiZWxvdyBpcyBiYXNlZCBvbiBodHRwczovL3FudG0ub3JnL2NtZFxuXG4gICAgLy8gU2VxdWVuY2Ugb2YgYmFja3NsYXNoZXMgZm9sbG93ZWQgYnkgYSBkb3VibGUgcXVvdGU6XG4gICAgLy8gZG91YmxlIHVwIGFsbCB0aGUgYmFja3NsYXNoZXMgYW5kIGVzY2FwZSB0aGUgZG91YmxlIHF1b3RlXG4gICAgYXJnID0gYXJnLnJlcGxhY2UoLyhcXFxcKilcIi9nLCAnJDEkMVxcXFxcIicpO1xuXG4gICAgLy8gU2VxdWVuY2Ugb2YgYmFja3NsYXNoZXMgZm9sbG93ZWQgYnkgdGhlIGVuZCBvZiB0aGUgc3RyaW5nXG4gICAgLy8gKHdoaWNoIHdpbGwgYmVjb21lIGEgZG91YmxlIHF1b3RlIGxhdGVyKTpcbiAgICAvLyBkb3VibGUgdXAgYWxsIHRoZSBiYWNrc2xhc2hlc1xuICAgIGFyZyA9IGFyZy5yZXBsYWNlKC8oXFxcXCopJC8sICckMSQxJyk7XG5cbiAgICAvLyBBbGwgb3RoZXIgYmFja3NsYXNoZXMgb2NjdXIgbGl0ZXJhbGx5XG5cbiAgICAvLyBRdW90ZSB0aGUgd2hvbGUgdGhpbmc6XG4gICAgYXJnID0gYFwiJHthcmd9XCJgO1xuXG4gICAgLy8gRXNjYXBlIG1ldGEgY2hhcnNcbiAgICBhcmcgPSBhcmcucmVwbGFjZShtZXRhQ2hhcnNSZWdFeHAsICdeJDEnKTtcblxuICAgIC8vIERvdWJsZSBlc2NhcGUgbWV0YSBjaGFycyBpZiBuZWNlc3NhcnlcbiAgICBpZiAoZG91YmxlRXNjYXBlTWV0YUNoYXJzKSB7XG4gICAgICAgIGFyZyA9IGFyZy5yZXBsYWNlKG1ldGFDaGFyc1JlZ0V4cCwgJ14kMScpO1xuICAgIH1cblxuICAgIHJldHVybiBhcmc7XG59XG5cbm1vZHVsZS5leHBvcnRzLmNvbW1hbmQgPSBlc2NhcGVDb21tYW5kO1xubW9kdWxlLmV4cG9ydHMuYXJndW1lbnQgPSBlc2NhcGVBcmd1bWVudDtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gL14jISguKikvO1xuIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3Qgc2hlYmFuZ1JlZ2V4ID0gcmVxdWlyZSgnc2hlYmFuZy1yZWdleCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChzdHJpbmcgPSAnJykgPT4ge1xuXHRjb25zdCBtYXRjaCA9IHN0cmluZy5tYXRjaChzaGViYW5nUmVnZXgpO1xuXG5cdGlmICghbWF0Y2gpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdGNvbnN0IFtwYXRoLCBhcmd1bWVudF0gPSBtYXRjaFswXS5yZXBsYWNlKC8jISA/LywgJycpLnNwbGl0KCcgJyk7XG5cdGNvbnN0IGJpbmFyeSA9IHBhdGguc3BsaXQoJy8nKS5wb3AoKTtcblxuXHRpZiAoYmluYXJ5ID09PSAnZW52Jykge1xuXHRcdHJldHVybiBhcmd1bWVudDtcblx0fVxuXG5cdHJldHVybiBhcmd1bWVudCA/IGAke2JpbmFyeX0gJHthcmd1bWVudH1gIDogYmluYXJ5O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3Qgc2hlYmFuZ0NvbW1hbmQgPSByZXF1aXJlKCdzaGViYW5nLWNvbW1hbmQnKTtcblxuZnVuY3Rpb24gcmVhZFNoZWJhbmcoY29tbWFuZCkge1xuICAgIC8vIFJlYWQgdGhlIGZpcnN0IDE1MCBieXRlcyBmcm9tIHRoZSBmaWxlXG4gICAgY29uc3Qgc2l6ZSA9IDE1MDtcbiAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2Moc2l6ZSk7XG5cbiAgICBsZXQgZmQ7XG5cbiAgICB0cnkge1xuICAgICAgICBmZCA9IGZzLm9wZW5TeW5jKGNvbW1hbmQsICdyJyk7XG4gICAgICAgIGZzLnJlYWRTeW5jKGZkLCBidWZmZXIsIDAsIHNpemUsIDApO1xuICAgICAgICBmcy5jbG9zZVN5bmMoZmQpO1xuICAgIH0gY2F0Y2ggKGUpIHsgLyogRW1wdHkgKi8gfVxuXG4gICAgLy8gQXR0ZW1wdCB0byBleHRyYWN0IHNoZWJhbmcgKG51bGwgaXMgcmV0dXJuZWQgaWYgbm90IGEgc2hlYmFuZylcbiAgICByZXR1cm4gc2hlYmFuZ0NvbW1hbmQoYnVmZmVyLnRvU3RyaW5nKCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlYWRTaGViYW5nO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuY29uc3QgcmVzb2x2ZUNvbW1hbmQgPSByZXF1aXJlKCcuL3V0aWwvcmVzb2x2ZUNvbW1hbmQnKTtcbmNvbnN0IGVzY2FwZSA9IHJlcXVpcmUoJy4vdXRpbC9lc2NhcGUnKTtcbmNvbnN0IHJlYWRTaGViYW5nID0gcmVxdWlyZSgnLi91dGlsL3JlYWRTaGViYW5nJyk7XG5cbmNvbnN0IGlzV2luID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcbmNvbnN0IGlzRXhlY3V0YWJsZVJlZ0V4cCA9IC9cXC4oPzpjb218ZXhlKSQvaTtcbmNvbnN0IGlzQ21kU2hpbVJlZ0V4cCA9IC9ub2RlX21vZHVsZXNbXFxcXC9dLmJpbltcXFxcL11bXlxcXFwvXStcXC5jbWQkL2k7XG5cbmZ1bmN0aW9uIGRldGVjdFNoZWJhbmcocGFyc2VkKSB7XG4gICAgcGFyc2VkLmZpbGUgPSByZXNvbHZlQ29tbWFuZChwYXJzZWQpO1xuXG4gICAgY29uc3Qgc2hlYmFuZyA9IHBhcnNlZC5maWxlICYmIHJlYWRTaGViYW5nKHBhcnNlZC5maWxlKTtcblxuICAgIGlmIChzaGViYW5nKSB7XG4gICAgICAgIHBhcnNlZC5hcmdzLnVuc2hpZnQocGFyc2VkLmZpbGUpO1xuICAgICAgICBwYXJzZWQuY29tbWFuZCA9IHNoZWJhbmc7XG5cbiAgICAgICAgcmV0dXJuIHJlc29sdmVDb21tYW5kKHBhcnNlZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlZC5maWxlO1xufVxuXG5mdW5jdGlvbiBwYXJzZU5vblNoZWxsKHBhcnNlZCkge1xuICAgIGlmICghaXNXaW4pIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICB9XG5cbiAgICAvLyBEZXRlY3QgJiBhZGQgc3VwcG9ydCBmb3Igc2hlYmFuZ3NcbiAgICBjb25zdCBjb21tYW5kRmlsZSA9IGRldGVjdFNoZWJhbmcocGFyc2VkKTtcblxuICAgIC8vIFdlIGRvbid0IG5lZWQgYSBzaGVsbCBpZiB0aGUgY29tbWFuZCBmaWxlbmFtZSBpcyBhbiBleGVjdXRhYmxlXG4gICAgY29uc3QgbmVlZHNTaGVsbCA9ICFpc0V4ZWN1dGFibGVSZWdFeHAudGVzdChjb21tYW5kRmlsZSk7XG5cbiAgICAvLyBJZiBhIHNoZWxsIGlzIHJlcXVpcmVkLCB1c2UgY21kLmV4ZSBhbmQgdGFrZSBjYXJlIG9mIGVzY2FwaW5nIGV2ZXJ5dGhpbmcgY29ycmVjdGx5XG4gICAgLy8gTm90ZSB0aGF0IGBmb3JjZVNoZWxsYCBpcyBhbiBoaWRkZW4gb3B0aW9uIHVzZWQgb25seSBpbiB0ZXN0c1xuICAgIGlmIChwYXJzZWQub3B0aW9ucy5mb3JjZVNoZWxsIHx8IG5lZWRzU2hlbGwpIHtcbiAgICAgICAgLy8gTmVlZCB0byBkb3VibGUgZXNjYXBlIG1ldGEgY2hhcnMgaWYgdGhlIGNvbW1hbmQgaXMgYSBjbWQtc2hpbSBsb2NhdGVkIGluIGBub2RlX21vZHVsZXMvLmJpbi9gXG4gICAgICAgIC8vIFRoZSBjbWQtc2hpbSBzaW1wbHkgY2FsbHMgZXhlY3V0ZSB0aGUgcGFja2FnZSBiaW4gZmlsZSB3aXRoIE5vZGVKUywgcHJveHlpbmcgYW55IGFyZ3VtZW50XG4gICAgICAgIC8vIEJlY2F1c2UgdGhlIGVzY2FwZSBvZiBtZXRhY2hhcnMgd2l0aCBeIGdldHMgaW50ZXJwcmV0ZWQgd2hlbiB0aGUgY21kLmV4ZSBpcyBmaXJzdCBjYWxsZWQsXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gZG91YmxlIGVzY2FwZSB0aGVtXG4gICAgICAgIGNvbnN0IG5lZWRzRG91YmxlRXNjYXBlTWV0YUNoYXJzID0gaXNDbWRTaGltUmVnRXhwLnRlc3QoY29tbWFuZEZpbGUpO1xuXG4gICAgICAgIC8vIE5vcm1hbGl6ZSBwb3NpeCBwYXRocyBpbnRvIE9TIGNvbXBhdGlibGUgcGF0aHMgKGUuZy46IGZvby9iYXIgLT4gZm9vXFxiYXIpXG4gICAgICAgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IG90aGVyd2lzZSBpdCB3aWxsIGFsd2F5cyBmYWlsIHdpdGggRU5PRU5UIGluIHRob3NlIGNhc2VzXG4gICAgICAgIHBhcnNlZC5jb21tYW5kID0gcGF0aC5ub3JtYWxpemUocGFyc2VkLmNvbW1hbmQpO1xuXG4gICAgICAgIC8vIEVzY2FwZSBjb21tYW5kICYgYXJndW1lbnRzXG4gICAgICAgIHBhcnNlZC5jb21tYW5kID0gZXNjYXBlLmNvbW1hbmQocGFyc2VkLmNvbW1hbmQpO1xuICAgICAgICBwYXJzZWQuYXJncyA9IHBhcnNlZC5hcmdzLm1hcCgoYXJnKSA9PiBlc2NhcGUuYXJndW1lbnQoYXJnLCBuZWVkc0RvdWJsZUVzY2FwZU1ldGFDaGFycykpO1xuXG4gICAgICAgIGNvbnN0IHNoZWxsQ29tbWFuZCA9IFtwYXJzZWQuY29tbWFuZF0uY29uY2F0KHBhcnNlZC5hcmdzKS5qb2luKCcgJyk7XG5cbiAgICAgICAgcGFyc2VkLmFyZ3MgPSBbJy9kJywgJy9zJywgJy9jJywgYFwiJHtzaGVsbENvbW1hbmR9XCJgXTtcbiAgICAgICAgcGFyc2VkLmNvbW1hbmQgPSBwcm9jZXNzLmVudi5jb21zcGVjIHx8ICdjbWQuZXhlJztcbiAgICAgICAgcGFyc2VkLm9wdGlvbnMud2luZG93c1ZlcmJhdGltQXJndW1lbnRzID0gdHJ1ZTsgLy8gVGVsbCBub2RlJ3Mgc3Bhd24gdGhhdCB0aGUgYXJndW1lbnRzIGFyZSBhbHJlYWR5IGVzY2FwZWRcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VkO1xufVxuXG5mdW5jdGlvbiBwYXJzZShjb21tYW5kLCBhcmdzLCBvcHRpb25zKSB7XG4gICAgLy8gTm9ybWFsaXplIGFyZ3VtZW50cywgc2ltaWxhciB0byBub2RlanNcbiAgICBpZiAoYXJncyAmJiAhQXJyYXkuaXNBcnJheShhcmdzKSkge1xuICAgICAgICBvcHRpb25zID0gYXJncztcbiAgICAgICAgYXJncyA9IG51bGw7XG4gICAgfVxuXG4gICAgYXJncyA9IGFyZ3MgPyBhcmdzLnNsaWNlKDApIDogW107IC8vIENsb25lIGFycmF5IHRvIGF2b2lkIGNoYW5naW5nIHRoZSBvcmlnaW5hbFxuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKTsgLy8gQ2xvbmUgb2JqZWN0IHRvIGF2b2lkIGNoYW5naW5nIHRoZSBvcmlnaW5hbFxuXG4gICAgLy8gQnVpbGQgb3VyIHBhcnNlZCBvYmplY3RcbiAgICBjb25zdCBwYXJzZWQgPSB7XG4gICAgICAgIGNvbW1hbmQsXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIGZpbGU6IHVuZGVmaW5lZCxcbiAgICAgICAgb3JpZ2luYWw6IHtcbiAgICAgICAgICAgIGNvbW1hbmQsXG4gICAgICAgICAgICBhcmdzLFxuICAgICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBEZWxlZ2F0ZSBmdXJ0aGVyIHBhcnNpbmcgdG8gc2hlbGwgb3Igbm9uLXNoZWxsXG4gICAgcmV0dXJuIG9wdGlvbnMuc2hlbGwgPyBwYXJzZWQgOiBwYXJzZU5vblNoZWxsKHBhcnNlZCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyc2U7XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGlzV2luID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcblxuZnVuY3Rpb24gbm90Rm91bmRFcnJvcihvcmlnaW5hbCwgc3lzY2FsbCkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgJHtzeXNjYWxsfSAke29yaWdpbmFsLmNvbW1hbmR9IEVOT0VOVGApLCB7XG4gICAgICAgIGNvZGU6ICdFTk9FTlQnLFxuICAgICAgICBlcnJubzogJ0VOT0VOVCcsXG4gICAgICAgIHN5c2NhbGw6IGAke3N5c2NhbGx9ICR7b3JpZ2luYWwuY29tbWFuZH1gLFxuICAgICAgICBwYXRoOiBvcmlnaW5hbC5jb21tYW5kLFxuICAgICAgICBzcGF3bmFyZ3M6IG9yaWdpbmFsLmFyZ3MsXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGhvb2tDaGlsZFByb2Nlc3MoY3AsIHBhcnNlZCkge1xuICAgIGlmICghaXNXaW4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9yaWdpbmFsRW1pdCA9IGNwLmVtaXQ7XG5cbiAgICBjcC5lbWl0ID0gZnVuY3Rpb24gKG5hbWUsIGFyZzEpIHtcbiAgICAgICAgLy8gSWYgZW1pdHRpbmcgXCJleGl0XCIgZXZlbnQgYW5kIGV4aXQgY29kZSBpcyAxLCB3ZSBuZWVkIHRvIGNoZWNrIGlmXG4gICAgICAgIC8vIHRoZSBjb21tYW5kIGV4aXN0cyBhbmQgZW1pdCBhbiBcImVycm9yXCIgaW5zdGVhZFxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0luZGlnb1VuaXRlZC9ub2RlLWNyb3NzLXNwYXduL2lzc3Vlcy8xNlxuICAgICAgICBpZiAobmFtZSA9PT0gJ2V4aXQnKSB7XG4gICAgICAgICAgICBjb25zdCBlcnIgPSB2ZXJpZnlFTk9FTlQoYXJnMSwgcGFyc2VkLCAnc3Bhd24nKTtcblxuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbEVtaXQuY2FsbChjcCwgJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcmlnaW5hbEVtaXQuYXBwbHkoY3AsIGFyZ3VtZW50cyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJlZmVyLXJlc3QtcGFyYW1zXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5RU5PRU5UKHN0YXR1cywgcGFyc2VkKSB7XG4gICAgaWYgKGlzV2luICYmIHN0YXR1cyA9PT0gMSAmJiAhcGFyc2VkLmZpbGUpIHtcbiAgICAgICAgcmV0dXJuIG5vdEZvdW5kRXJyb3IocGFyc2VkLm9yaWdpbmFsLCAnc3Bhd24nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5RU5PRU5UU3luYyhzdGF0dXMsIHBhcnNlZCkge1xuICAgIGlmIChpc1dpbiAmJiBzdGF0dXMgPT09IDEgJiYgIXBhcnNlZC5maWxlKSB7XG4gICAgICAgIHJldHVybiBub3RGb3VuZEVycm9yKHBhcnNlZC5vcmlnaW5hbCwgJ3NwYXduU3luYycpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBob29rQ2hpbGRQcm9jZXNzLFxuICAgIHZlcmlmeUVOT0VOVCxcbiAgICB2ZXJpZnlFTk9FTlRTeW5jLFxuICAgIG5vdEZvdW5kRXJyb3IsXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBjcCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKTtcbmNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9saWIvcGFyc2UnKTtcbmNvbnN0IGVub2VudCA9IHJlcXVpcmUoJy4vbGliL2Vub2VudCcpO1xuXG5mdW5jdGlvbiBzcGF3bihjb21tYW5kLCBhcmdzLCBvcHRpb25zKSB7XG4gICAgLy8gUGFyc2UgdGhlIGFyZ3VtZW50c1xuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlKGNvbW1hbmQsIGFyZ3MsIG9wdGlvbnMpO1xuXG4gICAgLy8gU3Bhd24gdGhlIGNoaWxkIHByb2Nlc3NcbiAgICBjb25zdCBzcGF3bmVkID0gY3Auc3Bhd24ocGFyc2VkLmNvbW1hbmQsIHBhcnNlZC5hcmdzLCBwYXJzZWQub3B0aW9ucyk7XG5cbiAgICAvLyBIb29rIGludG8gY2hpbGQgcHJvY2VzcyBcImV4aXRcIiBldmVudCB0byBlbWl0IGFuIGVycm9yIGlmIHRoZSBjb21tYW5kXG4gICAgLy8gZG9lcyBub3QgZXhpc3RzLCBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9JbmRpZ29Vbml0ZWQvbm9kZS1jcm9zcy1zcGF3bi9pc3N1ZXMvMTZcbiAgICBlbm9lbnQuaG9va0NoaWxkUHJvY2VzcyhzcGF3bmVkLCBwYXJzZWQpO1xuXG4gICAgcmV0dXJuIHNwYXduZWQ7XG59XG5cbmZ1bmN0aW9uIHNwYXduU3luYyhjb21tYW5kLCBhcmdzLCBvcHRpb25zKSB7XG4gICAgLy8gUGFyc2UgdGhlIGFyZ3VtZW50c1xuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlKGNvbW1hbmQsIGFyZ3MsIG9wdGlvbnMpO1xuXG4gICAgLy8gU3Bhd24gdGhlIGNoaWxkIHByb2Nlc3NcbiAgICBjb25zdCByZXN1bHQgPSBjcC5zcGF3blN5bmMocGFyc2VkLmNvbW1hbmQsIHBhcnNlZC5hcmdzLCBwYXJzZWQub3B0aW9ucyk7XG5cbiAgICAvLyBBbmFseXplIGlmIHRoZSBjb21tYW5kIGRvZXMgbm90IGV4aXN0LCBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9JbmRpZ29Vbml0ZWQvbm9kZS1jcm9zcy1zcGF3bi9pc3N1ZXMvMTZcbiAgICByZXN1bHQuZXJyb3IgPSByZXN1bHQuZXJyb3IgfHwgZW5vZW50LnZlcmlmeUVOT0VOVFN5bmMocmVzdWx0LnN0YXR1cywgcGFyc2VkKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3Bhd247XG5tb2R1bGUuZXhwb3J0cy5zcGF3biA9IHNwYXduO1xubW9kdWxlLmV4cG9ydHMuc3luYyA9IHNwYXduU3luYztcblxubW9kdWxlLmV4cG9ydHMuX3BhcnNlID0gcGFyc2U7XG5tb2R1bGUuZXhwb3J0cy5fZW5vZW50ID0gZW5vZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlucHV0ID0+IHtcblx0Y29uc3QgTEYgPSB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnID8gJ1xcbicgOiAnXFxuJy5jaGFyQ29kZUF0KCk7XG5cdGNvbnN0IENSID0gdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyA/ICdcXHInIDogJ1xccicuY2hhckNvZGVBdCgpO1xuXG5cdGlmIChpbnB1dFtpbnB1dC5sZW5ndGggLSAxXSA9PT0gTEYpIHtcblx0XHRpbnB1dCA9IGlucHV0LnNsaWNlKDAsIGlucHV0Lmxlbmd0aCAtIDEpO1xuXHR9XG5cblx0aWYgKGlucHV0W2lucHV0Lmxlbmd0aCAtIDFdID09PSBDUikge1xuXHRcdGlucHV0ID0gaW5wdXQuc2xpY2UoMCwgaW5wdXQubGVuZ3RoIC0gMSk7XG5cdH1cblxuXHRyZXR1cm4gaW5wdXQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbmNvbnN0IHBhdGhLZXkgPSByZXF1aXJlKCdwYXRoLWtleScpO1xuXG5jb25zdCBucG1SdW5QYXRoID0gb3B0aW9ucyA9PiB7XG5cdG9wdGlvbnMgPSB7XG5cdFx0Y3dkOiBwcm9jZXNzLmN3ZCgpLFxuXHRcdHBhdGg6IHByb2Nlc3MuZW52W3BhdGhLZXkoKV0sXG5cdFx0ZXhlY1BhdGg6IHByb2Nlc3MuZXhlY1BhdGgsXG5cdFx0Li4ub3B0aW9uc1xuXHR9O1xuXG5cdGxldCBwcmV2aW91cztcblx0bGV0IGN3ZFBhdGggPSBwYXRoLnJlc29sdmUob3B0aW9ucy5jd2QpO1xuXHRjb25zdCByZXN1bHQgPSBbXTtcblxuXHR3aGlsZSAocHJldmlvdXMgIT09IGN3ZFBhdGgpIHtcblx0XHRyZXN1bHQucHVzaChwYXRoLmpvaW4oY3dkUGF0aCwgJ25vZGVfbW9kdWxlcy8uYmluJykpO1xuXHRcdHByZXZpb3VzID0gY3dkUGF0aDtcblx0XHRjd2RQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZFBhdGgsICcuLicpO1xuXHR9XG5cblx0Ly8gRW5zdXJlIHRoZSBydW5uaW5nIGBub2RlYCBiaW5hcnkgaXMgdXNlZFxuXHRjb25zdCBleGVjUGF0aERpciA9IHBhdGgucmVzb2x2ZShvcHRpb25zLmN3ZCwgb3B0aW9ucy5leGVjUGF0aCwgJy4uJyk7XG5cdHJlc3VsdC5wdXNoKGV4ZWNQYXRoRGlyKTtcblxuXHRyZXR1cm4gcmVzdWx0LmNvbmNhdChvcHRpb25zLnBhdGgpLmpvaW4ocGF0aC5kZWxpbWl0ZXIpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBucG1SdW5QYXRoO1xuLy8gVE9ETzogUmVtb3ZlIHRoaXMgZm9yIHRoZSBuZXh0IG1ham9yIHJlbGVhc2Vcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBucG1SdW5QYXRoO1xuXG5tb2R1bGUuZXhwb3J0cy5lbnYgPSBvcHRpb25zID0+IHtcblx0b3B0aW9ucyA9IHtcblx0XHRlbnY6IHByb2Nlc3MuZW52LFxuXHRcdC4uLm9wdGlvbnNcblx0fTtcblxuXHRjb25zdCBlbnYgPSB7Li4ub3B0aW9ucy5lbnZ9O1xuXHRjb25zdCBwYXRoID0gcGF0aEtleSh7ZW52fSk7XG5cblx0b3B0aW9ucy5wYXRoID0gZW52W3BhdGhdO1xuXHRlbnZbcGF0aF0gPSBtb2R1bGUuZXhwb3J0cyhvcHRpb25zKTtcblxuXHRyZXR1cm4gZW52O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgbWltaWNGbiA9ICh0bywgZnJvbSkgPT4ge1xuXHRmb3IgKGNvbnN0IHByb3Agb2YgUmVmbGVjdC5vd25LZXlzKGZyb20pKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRvLCBwcm9wLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGZyb20sIHByb3ApKTtcblx0fVxuXG5cdHJldHVybiB0bztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gbWltaWNGbjtcbi8vIFRPRE86IFJlbW92ZSB0aGlzIGZvciB0aGUgbmV4dCBtYWpvciByZWxlYXNlXG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0ID0gbWltaWNGbjtcbiIsIid1c2Ugc3RyaWN0JztcbmNvbnN0IG1pbWljRm4gPSByZXF1aXJlKCdtaW1pYy1mbicpO1xuXG5jb25zdCBjYWxsZWRGdW5jdGlvbnMgPSBuZXcgV2Vha01hcCgpO1xuXG5jb25zdCBvbmV0aW1lID0gKGZ1bmN0aW9uXywgb3B0aW9ucyA9IHt9KSA9PiB7XG5cdGlmICh0eXBlb2YgZnVuY3Rpb25fICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBmdW5jdGlvbicpO1xuXHR9XG5cblx0bGV0IHJldHVyblZhbHVlO1xuXHRsZXQgY2FsbENvdW50ID0gMDtcblx0Y29uc3QgZnVuY3Rpb25OYW1lID0gZnVuY3Rpb25fLmRpc3BsYXlOYW1lIHx8IGZ1bmN0aW9uXy5uYW1lIHx8ICc8YW5vbnltb3VzPic7XG5cblx0Y29uc3Qgb25ldGltZSA9IGZ1bmN0aW9uICguLi5hcmd1bWVudHNfKSB7XG5cdFx0Y2FsbGVkRnVuY3Rpb25zLnNldChvbmV0aW1lLCArK2NhbGxDb3VudCk7XG5cblx0XHRpZiAoY2FsbENvdW50ID09PSAxKSB7XG5cdFx0XHRyZXR1cm5WYWx1ZSA9IGZ1bmN0aW9uXy5hcHBseSh0aGlzLCBhcmd1bWVudHNfKTtcblx0XHRcdGZ1bmN0aW9uXyA9IG51bGw7XG5cdFx0fSBlbHNlIGlmIChvcHRpb25zLnRocm93ID09PSB0cnVlKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEZ1bmN0aW9uIFxcYCR7ZnVuY3Rpb25OYW1lfVxcYCBjYW4gb25seSBiZSBjYWxsZWQgb25jZWApO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXR1cm5WYWx1ZTtcblx0fTtcblxuXHRtaW1pY0ZuKG9uZXRpbWUsIGZ1bmN0aW9uXyk7XG5cdGNhbGxlZEZ1bmN0aW9ucy5zZXQob25ldGltZSwgY2FsbENvdW50KTtcblxuXHRyZXR1cm4gb25ldGltZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gb25ldGltZTtcbi8vIFRPRE86IFJlbW92ZSB0aGlzIGZvciB0aGUgbmV4dCBtYWpvciByZWxlYXNlXG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0ID0gb25ldGltZTtcblxubW9kdWxlLmV4cG9ydHMuY2FsbENvdW50ID0gZnVuY3Rpb25fID0+IHtcblx0aWYgKCFjYWxsZWRGdW5jdGlvbnMuaGFzKGZ1bmN0aW9uXykpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYFRoZSBnaXZlbiBmdW5jdGlvbiBcXGAke2Z1bmN0aW9uXy5uYW1lfVxcYCBpcyBub3Qgd3JhcHBlZCBieSB0aGUgXFxgb25ldGltZVxcYCBwYWNrYWdlYCk7XG5cdH1cblxuXHRyZXR1cm4gY2FsbGVkRnVuY3Rpb25zLmdldChmdW5jdGlvbl8pO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLFwiX19lc01vZHVsZVwiLHt2YWx1ZTp0cnVlfSk7ZXhwb3J0cy5TSUdOQUxTPXZvaWQgMDtcblxuY29uc3QgU0lHTkFMUz1bXG57XG5uYW1lOlwiU0lHSFVQXCIsXG5udW1iZXI6MSxcbmFjdGlvbjpcInRlcm1pbmF0ZVwiLFxuZGVzY3JpcHRpb246XCJUZXJtaW5hbCBjbG9zZWRcIixcbnN0YW5kYXJkOlwicG9zaXhcIn0sXG5cbntcbm5hbWU6XCJTSUdJTlRcIixcbm51bWJlcjoyLFxuYWN0aW9uOlwidGVybWluYXRlXCIsXG5kZXNjcmlwdGlvbjpcIlVzZXIgaW50ZXJydXB0aW9uIHdpdGggQ1RSTC1DXCIsXG5zdGFuZGFyZDpcImFuc2lcIn0sXG5cbntcbm5hbWU6XCJTSUdRVUlUXCIsXG5udW1iZXI6MyxcbmFjdGlvbjpcImNvcmVcIixcbmRlc2NyaXB0aW9uOlwiVXNlciBpbnRlcnJ1cHRpb24gd2l0aCBDVFJMLVxcXFxcIixcbnN0YW5kYXJkOlwicG9zaXhcIn0sXG5cbntcbm5hbWU6XCJTSUdJTExcIixcbm51bWJlcjo0LFxuYWN0aW9uOlwiY29yZVwiLFxuZGVzY3JpcHRpb246XCJJbnZhbGlkIG1hY2hpbmUgaW5zdHJ1Y3Rpb25cIixcbnN0YW5kYXJkOlwiYW5zaVwifSxcblxue1xubmFtZTpcIlNJR1RSQVBcIixcbm51bWJlcjo1LFxuYWN0aW9uOlwiY29yZVwiLFxuZGVzY3JpcHRpb246XCJEZWJ1Z2dlciBicmVha3BvaW50XCIsXG5zdGFuZGFyZDpcInBvc2l4XCJ9LFxuXG57XG5uYW1lOlwiU0lHQUJSVFwiLFxubnVtYmVyOjYsXG5hY3Rpb246XCJjb3JlXCIsXG5kZXNjcmlwdGlvbjpcIkFib3J0ZWRcIixcbnN0YW5kYXJkOlwiYW5zaVwifSxcblxue1xubmFtZTpcIlNJR0lPVFwiLFxubnVtYmVyOjYsXG5hY3Rpb246XCJjb3JlXCIsXG5kZXNjcmlwdGlvbjpcIkFib3J0ZWRcIixcbnN0YW5kYXJkOlwiYnNkXCJ9LFxuXG57XG5uYW1lOlwiU0lHQlVTXCIsXG5udW1iZXI6NyxcbmFjdGlvbjpcImNvcmVcIixcbmRlc2NyaXB0aW9uOlxuXCJCdXMgZXJyb3IgZHVlIHRvIG1pc2FsaWduZWQsIG5vbi1leGlzdGluZyBhZGRyZXNzIG9yIHBhZ2luZyBlcnJvclwiLFxuc3RhbmRhcmQ6XCJic2RcIn0sXG5cbntcbm5hbWU6XCJTSUdFTVRcIixcbm51bWJlcjo3LFxuYWN0aW9uOlwidGVybWluYXRlXCIsXG5kZXNjcmlwdGlvbjpcIkNvbW1hbmQgc2hvdWxkIGJlIGVtdWxhdGVkIGJ1dCBpcyBub3QgaW1wbGVtZW50ZWRcIixcbnN0YW5kYXJkOlwib3RoZXJcIn0sXG5cbntcbm5hbWU6XCJTSUdGUEVcIixcbm51bWJlcjo4LFxuYWN0aW9uOlwiY29yZVwiLFxuZGVzY3JpcHRpb246XCJGbG9hdGluZyBwb2ludCBhcml0aG1ldGljIGVycm9yXCIsXG5zdGFuZGFyZDpcImFuc2lcIn0sXG5cbntcbm5hbWU6XCJTSUdLSUxMXCIsXG5udW1iZXI6OSxcbmFjdGlvbjpcInRlcm1pbmF0ZVwiLFxuZGVzY3JpcHRpb246XCJGb3JjZWQgdGVybWluYXRpb25cIixcbnN0YW5kYXJkOlwicG9zaXhcIixcbmZvcmNlZDp0cnVlfSxcblxue1xubmFtZTpcIlNJR1VTUjFcIixcbm51bWJlcjoxMCxcbmFjdGlvbjpcInRlcm1pbmF0ZVwiLFxuZGVzY3JpcHRpb246XCJBcHBsaWNhdGlvbi1zcGVjaWZpYyBzaWduYWxcIixcbnN0YW5kYXJkOlwicG9zaXhcIn0sXG5cbntcbm5hbWU6XCJTSUdTRUdWXCIsXG5udW1iZXI6MTEsXG5hY3Rpb246XCJjb3JlXCIsXG5kZXNjcmlwdGlvbjpcIlNlZ21lbnRhdGlvbiBmYXVsdFwiLFxuc3RhbmRhcmQ6XCJhbnNpXCJ9LFxuXG57XG5uYW1lOlwiU0lHVVNSMlwiLFxubnVtYmVyOjEyLFxuYWN0aW9uOlwidGVybWluYXRlXCIsXG5kZXNjcmlwdGlvbjpcIkFwcGxpY2F0aW9uLXNwZWNpZmljIHNpZ25hbFwiLFxuc3RhbmRhcmQ6XCJwb3NpeFwifSxcblxue1xubmFtZTpcIlNJR1BJUEVcIixcbm51bWJlcjoxMyxcbmFjdGlvbjpcInRlcm1pbmF0ZVwiLFxuZGVzY3JpcHRpb246XCJCcm9rZW4gcGlwZSBvciBzb2NrZXRcIixcbnN0YW5kYXJkOlwicG9zaXhcIn0sXG5cbntcbm5hbWU6XCJTSUdBTFJNXCIsXG5udW1iZXI6MTQsXG5hY3Rpb246XCJ0ZXJtaW5hdGVcIixcbmRlc2NyaXB0aW9uOlwiVGltZW91dCBvciB0aW1lclwiLFxuc3RhbmRhcmQ6XCJwb3NpeFwifSxcblxue1xubmFtZTpcIlNJR1RFUk1cIixcbm51bWJlcjoxNSxcbmFjdGlvbjpcInRlcm1pbmF0ZVwiLFxuZGVzY3JpcHRpb246XCJUZXJtaW5hdGlvblwiLFxuc3RhbmRhcmQ6XCJhbnNpXCJ9LFxuXG57XG5uYW1lOlwiU0lHU1RLRkxUXCIsXG5udW1iZXI6MTYsXG5hY3Rpb246XCJ0ZXJtaW5hdGVcIixcbmRlc2NyaXB0aW9uOlwiU3RhY2sgaXMgZW1wdHkgb3Igb3ZlcmZsb3dlZFwiLFxuc3RhbmRhcmQ6XCJvdGhlclwifSxcblxue1xubmFtZTpcIlNJR0NITERcIixcbm51bWJlcjoxNyxcbmFjdGlvbjpcImlnbm9yZVwiLFxuZGVzY3JpcHRpb246XCJDaGlsZCBwcm9jZXNzIHRlcm1pbmF0ZWQsIHBhdXNlZCBvciB1bnBhdXNlZFwiLFxuc3RhbmRhcmQ6XCJwb3NpeFwifSxcblxue1xubmFtZTpcIlNJR0NMRFwiLFxubnVtYmVyOjE3LFxuYWN0aW9uOlwiaWdub3JlXCIsXG5kZXNjcmlwdGlvbjpcIkNoaWxkIHByb2Nlc3MgdGVybWluYXRlZCwgcGF1c2VkIG9yIHVucGF1c2VkXCIsXG5zdGFuZGFyZDpcIm90aGVyXCJ9LFxuXG57XG5uYW1lOlwiU0lHQ09OVFwiLFxubnVtYmVyOjE4LFxuYWN0aW9uOlwidW5wYXVzZVwiLFxuZGVzY3JpcHRpb246XCJVbnBhdXNlZFwiLFxuc3RhbmRhcmQ6XCJwb3NpeFwiLFxuZm9yY2VkOnRydWV9LFxuXG57XG5uYW1lOlwiU0lHU1RPUFwiLFxubnVtYmVyOjE5LFxuYWN0aW9uOlwicGF1c2VcIixcbmRlc2NyaXB0aW9uOlwiUGF1c2VkXCIsXG5zdGFuZGFyZDpcInBvc2l4XCIsXG5mb3JjZWQ6dHJ1ZX0sXG5cbntcbm5hbWU6XCJTSUdUU1RQXCIsXG5udW1iZXI6MjAsXG5hY3Rpb246XCJwYXVzZVwiLFxuZGVzY3JpcHRpb246XCJQYXVzZWQgdXNpbmcgQ1RSTC1aIG9yIFxcXCJzdXNwZW5kXFxcIlwiLFxuc3RhbmRhcmQ6XCJwb3NpeFwifSxcblxue1xubmFtZTpcIlNJR1RUSU5cIixcbm51bWJlcjoyMSxcbmFjdGlvbjpcInBhdXNlXCIsXG5kZXNjcmlwdGlvbjpcIkJhY2tncm91bmQgcHJvY2VzcyBjYW5ub3QgcmVhZCB0ZXJtaW5hbCBpbnB1dFwiLFxuc3RhbmRhcmQ6XCJwb3NpeFwifSxcblxue1xubmFtZTpcIlNJR0JSRUFLXCIsXG5udW1iZXI6MjEsXG5hY3Rpb246XCJ0ZXJtaW5hdGVcIixcbmRlc2NyaXB0aW9uOlwiVXNlciBpbnRlcnJ1cHRpb24gd2l0aCBDVFJMLUJSRUFLXCIsXG5zdGFuZGFyZDpcIm90aGVyXCJ9LFxuXG57XG5uYW1lOlwiU0lHVFRPVVwiLFxubnVtYmVyOjIyLFxuYWN0aW9uOlwicGF1c2VcIixcbmRlc2NyaXB0aW9uOlwiQmFja2dyb3VuZCBwcm9jZXNzIGNhbm5vdCB3cml0ZSB0byB0ZXJtaW5hbCBvdXRwdXRcIixcbnN0YW5kYXJkOlwicG9zaXhcIn0sXG5cbntcbm5hbWU6XCJTSUdVUkdcIixcbm51bWJlcjoyMyxcbmFjdGlvbjpcImlnbm9yZVwiLFxuZGVzY3JpcHRpb246XCJTb2NrZXQgcmVjZWl2ZWQgb3V0LW9mLWJhbmQgZGF0YVwiLFxuc3RhbmRhcmQ6XCJic2RcIn0sXG5cbntcbm5hbWU6XCJTSUdYQ1BVXCIsXG5udW1iZXI6MjQsXG5hY3Rpb246XCJjb3JlXCIsXG5kZXNjcmlwdGlvbjpcIlByb2Nlc3MgdGltZWQgb3V0XCIsXG5zdGFuZGFyZDpcImJzZFwifSxcblxue1xubmFtZTpcIlNJR1hGU1pcIixcbm51bWJlcjoyNSxcbmFjdGlvbjpcImNvcmVcIixcbmRlc2NyaXB0aW9uOlwiRmlsZSB0b28gYmlnXCIsXG5zdGFuZGFyZDpcImJzZFwifSxcblxue1xubmFtZTpcIlNJR1ZUQUxSTVwiLFxubnVtYmVyOjI2LFxuYWN0aW9uOlwidGVybWluYXRlXCIsXG5kZXNjcmlwdGlvbjpcIlRpbWVvdXQgb3IgdGltZXJcIixcbnN0YW5kYXJkOlwiYnNkXCJ9LFxuXG57XG5uYW1lOlwiU0lHUFJPRlwiLFxubnVtYmVyOjI3LFxuYWN0aW9uOlwidGVybWluYXRlXCIsXG5kZXNjcmlwdGlvbjpcIlRpbWVvdXQgb3IgdGltZXJcIixcbnN0YW5kYXJkOlwiYnNkXCJ9LFxuXG57XG5uYW1lOlwiU0lHV0lOQ0hcIixcbm51bWJlcjoyOCxcbmFjdGlvbjpcImlnbm9yZVwiLFxuZGVzY3JpcHRpb246XCJUZXJtaW5hbCB3aW5kb3cgc2l6ZSBjaGFuZ2VkXCIsXG5zdGFuZGFyZDpcImJzZFwifSxcblxue1xubmFtZTpcIlNJR0lPXCIsXG5udW1iZXI6MjksXG5hY3Rpb246XCJ0ZXJtaW5hdGVcIixcbmRlc2NyaXB0aW9uOlwiSS9PIGlzIGF2YWlsYWJsZVwiLFxuc3RhbmRhcmQ6XCJvdGhlclwifSxcblxue1xubmFtZTpcIlNJR1BPTExcIixcbm51bWJlcjoyOSxcbmFjdGlvbjpcInRlcm1pbmF0ZVwiLFxuZGVzY3JpcHRpb246XCJXYXRjaGVkIGV2ZW50XCIsXG5zdGFuZGFyZDpcIm90aGVyXCJ9LFxuXG57XG5uYW1lOlwiU0lHSU5GT1wiLFxubnVtYmVyOjI5LFxuYWN0aW9uOlwiaWdub3JlXCIsXG5kZXNjcmlwdGlvbjpcIlJlcXVlc3QgZm9yIHByb2Nlc3MgaW5mb3JtYXRpb25cIixcbnN0YW5kYXJkOlwib3RoZXJcIn0sXG5cbntcbm5hbWU6XCJTSUdQV1JcIixcbm51bWJlcjozMCxcbmFjdGlvbjpcInRlcm1pbmF0ZVwiLFxuZGVzY3JpcHRpb246XCJEZXZpY2UgcnVubmluZyBvdXQgb2YgcG93ZXJcIixcbnN0YW5kYXJkOlwic3lzdGVtdlwifSxcblxue1xubmFtZTpcIlNJR1NZU1wiLFxubnVtYmVyOjMxLFxuYWN0aW9uOlwiY29yZVwiLFxuZGVzY3JpcHRpb246XCJJbnZhbGlkIHN5c3RlbSBjYWxsXCIsXG5zdGFuZGFyZDpcIm90aGVyXCJ9LFxuXG57XG5uYW1lOlwiU0lHVU5VU0VEXCIsXG5udW1iZXI6MzEsXG5hY3Rpb246XCJ0ZXJtaW5hdGVcIixcbmRlc2NyaXB0aW9uOlwiSW52YWxpZCBzeXN0ZW0gY2FsbFwiLFxuc3RhbmRhcmQ6XCJvdGhlclwifV07ZXhwb3J0cy5TSUdOQUxTPVNJR05BTFM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb3JlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLFwiX19lc01vZHVsZVwiLHt2YWx1ZTp0cnVlfSk7ZXhwb3J0cy5TSUdSVE1BWD1leHBvcnRzLmdldFJlYWx0aW1lU2lnbmFscz12b2lkIDA7XG5jb25zdCBnZXRSZWFsdGltZVNpZ25hbHM9ZnVuY3Rpb24oKXtcbmNvbnN0IGxlbmd0aD1TSUdSVE1BWC1TSUdSVE1JTisxO1xucmV0dXJuIEFycmF5LmZyb20oe2xlbmd0aH0sZ2V0UmVhbHRpbWVTaWduYWwpO1xufTtleHBvcnRzLmdldFJlYWx0aW1lU2lnbmFscz1nZXRSZWFsdGltZVNpZ25hbHM7XG5cbmNvbnN0IGdldFJlYWx0aW1lU2lnbmFsPWZ1bmN0aW9uKHZhbHVlLGluZGV4KXtcbnJldHVybntcbm5hbWU6YFNJR1JUJHtpbmRleCsxfWAsXG5udW1iZXI6U0lHUlRNSU4raW5kZXgsXG5hY3Rpb246XCJ0ZXJtaW5hdGVcIixcbmRlc2NyaXB0aW9uOlwiQXBwbGljYXRpb24tc3BlY2lmaWMgc2lnbmFsIChyZWFsdGltZSlcIixcbnN0YW5kYXJkOlwicG9zaXhcIn07XG5cbn07XG5cbmNvbnN0IFNJR1JUTUlOPTM0O1xuY29uc3QgU0lHUlRNQVg9NjQ7ZXhwb3J0cy5TSUdSVE1BWD1TSUdSVE1BWDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlYWx0aW1lLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLFwiX19lc01vZHVsZVwiLHt2YWx1ZTp0cnVlfSk7ZXhwb3J0cy5nZXRTaWduYWxzPXZvaWQgMDt2YXIgX29zPXJlcXVpcmUoXCJvc1wiKTtcblxudmFyIF9jb3JlPXJlcXVpcmUoXCIuL2NvcmUuanNcIik7XG52YXIgX3JlYWx0aW1lPXJlcXVpcmUoXCIuL3JlYWx0aW1lLmpzXCIpO1xuXG5cblxuY29uc3QgZ2V0U2lnbmFscz1mdW5jdGlvbigpe1xuY29uc3QgcmVhbHRpbWVTaWduYWxzPSgwLF9yZWFsdGltZS5nZXRSZWFsdGltZVNpZ25hbHMpKCk7XG5jb25zdCBzaWduYWxzPVsuLi5fY29yZS5TSUdOQUxTLC4uLnJlYWx0aW1lU2lnbmFsc10ubWFwKG5vcm1hbGl6ZVNpZ25hbCk7XG5yZXR1cm4gc2lnbmFscztcbn07ZXhwb3J0cy5nZXRTaWduYWxzPWdldFNpZ25hbHM7XG5cblxuXG5cblxuXG5cbmNvbnN0IG5vcm1hbGl6ZVNpZ25hbD1mdW5jdGlvbih7XG5uYW1lLFxubnVtYmVyOmRlZmF1bHROdW1iZXIsXG5kZXNjcmlwdGlvbixcbmFjdGlvbixcbmZvcmNlZD1mYWxzZSxcbnN0YW5kYXJkfSlcbntcbmNvbnN0e1xuc2lnbmFsczp7W25hbWVdOmNvbnN0YW50U2lnbmFsfX09XG5fb3MuY29uc3RhbnRzO1xuY29uc3Qgc3VwcG9ydGVkPWNvbnN0YW50U2lnbmFsIT09dW5kZWZpbmVkO1xuY29uc3QgbnVtYmVyPXN1cHBvcnRlZD9jb25zdGFudFNpZ25hbDpkZWZhdWx0TnVtYmVyO1xucmV0dXJue25hbWUsbnVtYmVyLGRlc2NyaXB0aW9uLHN1cHBvcnRlZCxhY3Rpb24sZm9yY2VkLHN0YW5kYXJkfTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaWduYWxzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLFwiX19lc01vZHVsZVwiLHt2YWx1ZTp0cnVlfSk7ZXhwb3J0cy5zaWduYWxzQnlOdW1iZXI9ZXhwb3J0cy5zaWduYWxzQnlOYW1lPXZvaWQgMDt2YXIgX29zPXJlcXVpcmUoXCJvc1wiKTtcblxudmFyIF9zaWduYWxzPXJlcXVpcmUoXCIuL3NpZ25hbHMuanNcIik7XG52YXIgX3JlYWx0aW1lPXJlcXVpcmUoXCIuL3JlYWx0aW1lLmpzXCIpO1xuXG5cblxuY29uc3QgZ2V0U2lnbmFsc0J5TmFtZT1mdW5jdGlvbigpe1xuY29uc3Qgc2lnbmFscz0oMCxfc2lnbmFscy5nZXRTaWduYWxzKSgpO1xucmV0dXJuIHNpZ25hbHMucmVkdWNlKGdldFNpZ25hbEJ5TmFtZSx7fSk7XG59O1xuXG5jb25zdCBnZXRTaWduYWxCeU5hbWU9ZnVuY3Rpb24oXG5zaWduYWxCeU5hbWVNZW1vLFxue25hbWUsbnVtYmVyLGRlc2NyaXB0aW9uLHN1cHBvcnRlZCxhY3Rpb24sZm9yY2VkLHN0YW5kYXJkfSlcbntcbnJldHVybntcbi4uLnNpZ25hbEJ5TmFtZU1lbW8sXG5bbmFtZV06e25hbWUsbnVtYmVyLGRlc2NyaXB0aW9uLHN1cHBvcnRlZCxhY3Rpb24sZm9yY2VkLHN0YW5kYXJkfX07XG5cbn07XG5cbmNvbnN0IHNpZ25hbHNCeU5hbWU9Z2V0U2lnbmFsc0J5TmFtZSgpO2V4cG9ydHMuc2lnbmFsc0J5TmFtZT1zaWduYWxzQnlOYW1lO1xuXG5cblxuXG5jb25zdCBnZXRTaWduYWxzQnlOdW1iZXI9ZnVuY3Rpb24oKXtcbmNvbnN0IHNpZ25hbHM9KDAsX3NpZ25hbHMuZ2V0U2lnbmFscykoKTtcbmNvbnN0IGxlbmd0aD1fcmVhbHRpbWUuU0lHUlRNQVgrMTtcbmNvbnN0IHNpZ25hbHNBPUFycmF5LmZyb20oe2xlbmd0aH0sKHZhbHVlLG51bWJlcik9PlxuZ2V0U2lnbmFsQnlOdW1iZXIobnVtYmVyLHNpZ25hbHMpKTtcblxucmV0dXJuIE9iamVjdC5hc3NpZ24oe30sLi4uc2lnbmFsc0EpO1xufTtcblxuY29uc3QgZ2V0U2lnbmFsQnlOdW1iZXI9ZnVuY3Rpb24obnVtYmVyLHNpZ25hbHMpe1xuY29uc3Qgc2lnbmFsPWZpbmRTaWduYWxCeU51bWJlcihudW1iZXIsc2lnbmFscyk7XG5cbmlmKHNpZ25hbD09PXVuZGVmaW5lZCl7XG5yZXR1cm57fTtcbn1cblxuY29uc3R7bmFtZSxkZXNjcmlwdGlvbixzdXBwb3J0ZWQsYWN0aW9uLGZvcmNlZCxzdGFuZGFyZH09c2lnbmFsO1xucmV0dXJue1xuW251bWJlcl06e1xubmFtZSxcbm51bWJlcixcbmRlc2NyaXB0aW9uLFxuc3VwcG9ydGVkLFxuYWN0aW9uLFxuZm9yY2VkLFxuc3RhbmRhcmR9fTtcblxuXG59O1xuXG5cblxuY29uc3QgZmluZFNpZ25hbEJ5TnVtYmVyPWZ1bmN0aW9uKG51bWJlcixzaWduYWxzKXtcbmNvbnN0IHNpZ25hbD1zaWduYWxzLmZpbmQoKHtuYW1lfSk9Pl9vcy5jb25zdGFudHMuc2lnbmFsc1tuYW1lXT09PW51bWJlcik7XG5cbmlmKHNpZ25hbCE9PXVuZGVmaW5lZCl7XG5yZXR1cm4gc2lnbmFsO1xufVxuXG5yZXR1cm4gc2lnbmFscy5maW5kKHNpZ25hbEE9PnNpZ25hbEEubnVtYmVyPT09bnVtYmVyKTtcbn07XG5cbmNvbnN0IHNpZ25hbHNCeU51bWJlcj1nZXRTaWduYWxzQnlOdW1iZXIoKTtleHBvcnRzLnNpZ25hbHNCeU51bWJlcj1zaWduYWxzQnlOdW1iZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYWluLmpzLm1hcCIsIid1c2Ugc3RyaWN0JztcbmNvbnN0IHtzaWduYWxzQnlOYW1lfSA9IHJlcXVpcmUoJ2h1bWFuLXNpZ25hbHMnKTtcblxuY29uc3QgZ2V0RXJyb3JQcmVmaXggPSAoe3RpbWVkT3V0LCB0aW1lb3V0LCBlcnJvckNvZGUsIHNpZ25hbCwgc2lnbmFsRGVzY3JpcHRpb24sIGV4aXRDb2RlLCBpc0NhbmNlbGVkfSkgPT4ge1xuXHRpZiAodGltZWRPdXQpIHtcblx0XHRyZXR1cm4gYHRpbWVkIG91dCBhZnRlciAke3RpbWVvdXR9IG1pbGxpc2Vjb25kc2A7XG5cdH1cblxuXHRpZiAoaXNDYW5jZWxlZCkge1xuXHRcdHJldHVybiAnd2FzIGNhbmNlbGVkJztcblx0fVxuXG5cdGlmIChlcnJvckNvZGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBgZmFpbGVkIHdpdGggJHtlcnJvckNvZGV9YDtcblx0fVxuXG5cdGlmIChzaWduYWwgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBgd2FzIGtpbGxlZCB3aXRoICR7c2lnbmFsfSAoJHtzaWduYWxEZXNjcmlwdGlvbn0pYDtcblx0fVxuXG5cdGlmIChleGl0Q29kZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGBmYWlsZWQgd2l0aCBleGl0IGNvZGUgJHtleGl0Q29kZX1gO1xuXHR9XG5cblx0cmV0dXJuICdmYWlsZWQnO1xufTtcblxuY29uc3QgbWFrZUVycm9yID0gKHtcblx0c3Rkb3V0LFxuXHRzdGRlcnIsXG5cdGFsbCxcblx0ZXJyb3IsXG5cdHNpZ25hbCxcblx0ZXhpdENvZGUsXG5cdGNvbW1hbmQsXG5cdGVzY2FwZWRDb21tYW5kLFxuXHR0aW1lZE91dCxcblx0aXNDYW5jZWxlZCxcblx0a2lsbGVkLFxuXHRwYXJzZWQ6IHtvcHRpb25zOiB7dGltZW91dH19XG59KSA9PiB7XG5cdC8vIGBzaWduYWxgIGFuZCBgZXhpdENvZGVgIGVtaXR0ZWQgb24gYHNwYXduZWQub24oJ2V4aXQnKWAgZXZlbnQgY2FuIGJlIGBudWxsYC5cblx0Ly8gV2Ugbm9ybWFsaXplIHRoZW0gdG8gYHVuZGVmaW5lZGBcblx0ZXhpdENvZGUgPSBleGl0Q29kZSA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGV4aXRDb2RlO1xuXHRzaWduYWwgPSBzaWduYWwgPT09IG51bGwgPyB1bmRlZmluZWQgOiBzaWduYWw7XG5cdGNvbnN0IHNpZ25hbERlc2NyaXB0aW9uID0gc2lnbmFsID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzaWduYWxzQnlOYW1lW3NpZ25hbF0uZGVzY3JpcHRpb247XG5cblx0Y29uc3QgZXJyb3JDb2RlID0gZXJyb3IgJiYgZXJyb3IuY29kZTtcblxuXHRjb25zdCBwcmVmaXggPSBnZXRFcnJvclByZWZpeCh7dGltZWRPdXQsIHRpbWVvdXQsIGVycm9yQ29kZSwgc2lnbmFsLCBzaWduYWxEZXNjcmlwdGlvbiwgZXhpdENvZGUsIGlzQ2FuY2VsZWR9KTtcblx0Y29uc3QgZXhlY2FNZXNzYWdlID0gYENvbW1hbmQgJHtwcmVmaXh9OiAke2NvbW1hbmR9YDtcblx0Y29uc3QgaXNFcnJvciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlcnJvcikgPT09ICdbb2JqZWN0IEVycm9yXSc7XG5cdGNvbnN0IHNob3J0TWVzc2FnZSA9IGlzRXJyb3IgPyBgJHtleGVjYU1lc3NhZ2V9XFxuJHtlcnJvci5tZXNzYWdlfWAgOiBleGVjYU1lc3NhZ2U7XG5cdGNvbnN0IG1lc3NhZ2UgPSBbc2hvcnRNZXNzYWdlLCBzdGRlcnIsIHN0ZG91dF0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJ1xcbicpO1xuXG5cdGlmIChpc0Vycm9yKSB7XG5cdFx0ZXJyb3Iub3JpZ2luYWxNZXNzYWdlID0gZXJyb3IubWVzc2FnZTtcblx0XHRlcnJvci5tZXNzYWdlID0gbWVzc2FnZTtcblx0fSBlbHNlIHtcblx0XHRlcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcblx0fVxuXG5cdGVycm9yLnNob3J0TWVzc2FnZSA9IHNob3J0TWVzc2FnZTtcblx0ZXJyb3IuY29tbWFuZCA9IGNvbW1hbmQ7XG5cdGVycm9yLmVzY2FwZWRDb21tYW5kID0gZXNjYXBlZENvbW1hbmQ7XG5cdGVycm9yLmV4aXRDb2RlID0gZXhpdENvZGU7XG5cdGVycm9yLnNpZ25hbCA9IHNpZ25hbDtcblx0ZXJyb3Iuc2lnbmFsRGVzY3JpcHRpb24gPSBzaWduYWxEZXNjcmlwdGlvbjtcblx0ZXJyb3Iuc3Rkb3V0ID0gc3Rkb3V0O1xuXHRlcnJvci5zdGRlcnIgPSBzdGRlcnI7XG5cblx0aWYgKGFsbCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0ZXJyb3IuYWxsID0gYWxsO1xuXHR9XG5cblx0aWYgKCdidWZmZXJlZERhdGEnIGluIGVycm9yKSB7XG5cdFx0ZGVsZXRlIGVycm9yLmJ1ZmZlcmVkRGF0YTtcblx0fVxuXG5cdGVycm9yLmZhaWxlZCA9IHRydWU7XG5cdGVycm9yLnRpbWVkT3V0ID0gQm9vbGVhbih0aW1lZE91dCk7XG5cdGVycm9yLmlzQ2FuY2VsZWQgPSBpc0NhbmNlbGVkO1xuXHRlcnJvci5raWxsZWQgPSBraWxsZWQgJiYgIXRpbWVkT3V0O1xuXG5cdHJldHVybiBlcnJvcjtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gbWFrZUVycm9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3QgYWxpYXNlcyA9IFsnc3RkaW4nLCAnc3Rkb3V0JywgJ3N0ZGVyciddO1xuXG5jb25zdCBoYXNBbGlhcyA9IG9wdGlvbnMgPT4gYWxpYXNlcy5zb21lKGFsaWFzID0+IG9wdGlvbnNbYWxpYXNdICE9PSB1bmRlZmluZWQpO1xuXG5jb25zdCBub3JtYWxpemVTdGRpbyA9IG9wdGlvbnMgPT4ge1xuXHRpZiAoIW9wdGlvbnMpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCB7c3RkaW99ID0gb3B0aW9ucztcblxuXHRpZiAoc3RkaW8gPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBhbGlhc2VzLm1hcChhbGlhcyA9PiBvcHRpb25zW2FsaWFzXSk7XG5cdH1cblxuXHRpZiAoaGFzQWxpYXMob3B0aW9ucykpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYEl0J3Mgbm90IHBvc3NpYmxlIHRvIHByb3ZpZGUgXFxgc3RkaW9cXGAgaW4gY29tYmluYXRpb24gd2l0aCBvbmUgb2YgJHthbGlhc2VzLm1hcChhbGlhcyA9PiBgXFxgJHthbGlhc31cXGBgKS5qb2luKCcsICcpfWApO1xuXHR9XG5cblx0aWYgKHR5cGVvZiBzdGRpbyA9PT0gJ3N0cmluZycpIHtcblx0XHRyZXR1cm4gc3RkaW87XG5cdH1cblxuXHRpZiAoIUFycmF5LmlzQXJyYXkoc3RkaW8pKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgXFxgc3RkaW9cXGAgdG8gYmUgb2YgdHlwZSBcXGBzdHJpbmdcXGAgb3IgXFxgQXJyYXlcXGAsIGdvdCBcXGAke3R5cGVvZiBzdGRpb31cXGBgKTtcblx0fVxuXG5cdGNvbnN0IGxlbmd0aCA9IE1hdGgubWF4KHN0ZGlvLmxlbmd0aCwgYWxpYXNlcy5sZW5ndGgpO1xuXHRyZXR1cm4gQXJyYXkuZnJvbSh7bGVuZ3RofSwgKHZhbHVlLCBpbmRleCkgPT4gc3RkaW9baW5kZXhdKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gbm9ybWFsaXplU3RkaW87XG5cbi8vIGBpcGNgIGlzIHB1c2hlZCB1bmxlc3MgaXQgaXMgYWxyZWFkeSBwcmVzZW50XG5tb2R1bGUuZXhwb3J0cy5ub2RlID0gb3B0aW9ucyA9PiB7XG5cdGNvbnN0IHN0ZGlvID0gbm9ybWFsaXplU3RkaW8ob3B0aW9ucyk7XG5cblx0aWYgKHN0ZGlvID09PSAnaXBjJykge1xuXHRcdHJldHVybiAnaXBjJztcblx0fVxuXG5cdGlmIChzdGRpbyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBzdGRpbyA9PT0gJ3N0cmluZycpIHtcblx0XHRyZXR1cm4gW3N0ZGlvLCBzdGRpbywgc3RkaW8sICdpcGMnXTtcblx0fVxuXG5cdGlmIChzdGRpby5pbmNsdWRlcygnaXBjJykpIHtcblx0XHRyZXR1cm4gc3RkaW87XG5cdH1cblxuXHRyZXR1cm4gWy4uLnN0ZGlvLCAnaXBjJ107XG59O1xuIiwiLy8gVGhpcyBpcyBub3QgdGhlIHNldCBvZiBhbGwgcG9zc2libGUgc2lnbmFscy5cbi8vXG4vLyBJdCBJUywgaG93ZXZlciwgdGhlIHNldCBvZiBhbGwgc2lnbmFscyB0aGF0IHRyaWdnZXJcbi8vIGFuIGV4aXQgb24gZWl0aGVyIExpbnV4IG9yIEJTRCBzeXN0ZW1zLiAgTGludXggaXMgYVxuLy8gc3VwZXJzZXQgb2YgdGhlIHNpZ25hbCBuYW1lcyBzdXBwb3J0ZWQgb24gQlNELCBhbmRcbi8vIHRoZSB1bmtub3duIHNpZ25hbHMganVzdCBmYWlsIHRvIHJlZ2lzdGVyLCBzbyB3ZSBjYW5cbi8vIGNhdGNoIHRoYXQgZWFzaWx5IGVub3VnaC5cbi8vXG4vLyBEb24ndCBib3RoZXIgd2l0aCBTSUdLSUxMLiAgSXQncyB1bmNhdGNoYWJsZSwgd2hpY2hcbi8vIG1lYW5zIHRoYXQgd2UgY2FuJ3QgZmlyZSBhbnkgY2FsbGJhY2tzIGFueXdheS5cbi8vXG4vLyBJZiBhIHVzZXIgZG9lcyBoYXBwZW4gdG8gcmVnaXN0ZXIgYSBoYW5kbGVyIG9uIGEgbm9uLVxuLy8gZmF0YWwgc2lnbmFsIGxpa2UgU0lHV0lOQ0ggb3Igc29tZXRoaW5nLCBhbmQgdGhlblxuLy8gZXhpdCwgaXQnbGwgZW5kIHVwIGZpcmluZyBgcHJvY2Vzcy5lbWl0KCdleGl0JylgLCBzb1xuLy8gdGhlIGhhbmRsZXIgd2lsbCBiZSBmaXJlZCBhbnl3YXkuXG4vL1xuLy8gU0lHQlVTLCBTSUdGUEUsIFNJR1NFR1YgYW5kIFNJR0lMTCwgd2hlbiBub3QgcmFpc2VkXG4vLyBhcnRpZmljaWFsbHksIGluaGVyZW50bHkgbGVhdmUgdGhlIHByb2Nlc3MgaW4gYVxuLy8gc3RhdGUgZnJvbSB3aGljaCBpdCBpcyBub3Qgc2FmZSB0byB0cnkgYW5kIGVudGVyIEpTXG4vLyBsaXN0ZW5lcnMuXG5tb2R1bGUuZXhwb3J0cyA9IFtcbiAgJ1NJR0FCUlQnLFxuICAnU0lHQUxSTScsXG4gICdTSUdIVVAnLFxuICAnU0lHSU5UJyxcbiAgJ1NJR1RFUk0nXG5dXG5cbmlmIChwcm9jZXNzLnBsYXRmb3JtICE9PSAnd2luMzInKSB7XG4gIG1vZHVsZS5leHBvcnRzLnB1c2goXG4gICAgJ1NJR1ZUQUxSTScsXG4gICAgJ1NJR1hDUFUnLFxuICAgICdTSUdYRlNaJyxcbiAgICAnU0lHVVNSMicsXG4gICAgJ1NJR1RSQVAnLFxuICAgICdTSUdTWVMnLFxuICAgICdTSUdRVUlUJyxcbiAgICAnU0lHSU9UJ1xuICAgIC8vIHNob3VsZCBkZXRlY3QgcHJvZmlsZXIgYW5kIGVuYWJsZS9kaXNhYmxlIGFjY29yZGluZ2x5LlxuICAgIC8vIHNlZSAjMjFcbiAgICAvLyAnU0lHUFJPRidcbiAgKVxufVxuXG5pZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2xpbnV4Jykge1xuICBtb2R1bGUuZXhwb3J0cy5wdXNoKFxuICAgICdTSUdJTycsXG4gICAgJ1NJR1BPTEwnLFxuICAgICdTSUdQV1InLFxuICAgICdTSUdTVEtGTFQnLFxuICAgICdTSUdVTlVTRUQnXG4gIClcbn1cbiIsIi8vIE5vdGU6IHNpbmNlIG55YyB1c2VzIHRoaXMgbW9kdWxlIHRvIG91dHB1dCBjb3ZlcmFnZSwgYW55IGxpbmVzXG4vLyB0aGF0IGFyZSBpbiB0aGUgZGlyZWN0IHN5bmMgZmxvdyBvZiBueWMncyBvdXRwdXRDb3ZlcmFnZSBhcmVcbi8vIGlnbm9yZWQsIHNpbmNlIHdlIGNhbiBuZXZlciBnZXQgY292ZXJhZ2UgZm9yIHRoZW0uXG4vLyBncmFiIGEgcmVmZXJlbmNlIHRvIG5vZGUncyByZWFsIHByb2Nlc3Mgb2JqZWN0IHJpZ2h0IGF3YXlcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3NcblxuY29uc3QgcHJvY2Vzc09rID0gZnVuY3Rpb24gKHByb2Nlc3MpIHtcbiAgcmV0dXJuIHByb2Nlc3MgJiZcbiAgICB0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiZcbiAgICB0eXBlb2YgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBwcm9jZXNzLmVtaXQgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgcHJvY2Vzcy5yZWFsbHlFeGl0ID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIHByb2Nlc3MubGlzdGVuZXJzID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIHByb2Nlc3Mua2lsbCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBwcm9jZXNzLnBpZCA9PT0gJ251bWJlcicgJiZcbiAgICB0eXBlb2YgcHJvY2Vzcy5vbiA9PT0gJ2Z1bmN0aW9uJ1xufVxuXG4vLyBzb21lIGtpbmQgb2Ygbm9uLW5vZGUgZW52aXJvbm1lbnQsIGp1c3Qgbm8tb3Bcbi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuaWYgKCFwcm9jZXNzT2socHJvY2VzcykpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHt9XG4gIH1cbn0gZWxzZSB7XG4gIHZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuICB2YXIgc2lnbmFscyA9IHJlcXVpcmUoJy4vc2lnbmFscy5qcycpXG4gIHZhciBpc1dpbiA9IC9ed2luL2kudGVzdChwcm9jZXNzLnBsYXRmb3JtKVxuXG4gIHZhciBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAodHlwZW9mIEVFICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgRUUgPSBFRS5FdmVudEVtaXR0ZXJcbiAgfVxuXG4gIHZhciBlbWl0dGVyXG4gIGlmIChwcm9jZXNzLl9fc2lnbmFsX2V4aXRfZW1pdHRlcl9fKSB7XG4gICAgZW1pdHRlciA9IHByb2Nlc3MuX19zaWduYWxfZXhpdF9lbWl0dGVyX19cbiAgfSBlbHNlIHtcbiAgICBlbWl0dGVyID0gcHJvY2Vzcy5fX3NpZ25hbF9leGl0X2VtaXR0ZXJfXyA9IG5ldyBFRSgpXG4gICAgZW1pdHRlci5jb3VudCA9IDBcbiAgICBlbWl0dGVyLmVtaXR0ZWQgPSB7fVxuICB9XG5cbiAgLy8gQmVjYXVzZSB0aGlzIGVtaXR0ZXIgaXMgYSBnbG9iYWwsIHdlIGhhdmUgdG8gY2hlY2sgdG8gc2VlIGlmIGFcbiAgLy8gcHJldmlvdXMgdmVyc2lvbiBvZiB0aGlzIGxpYnJhcnkgZmFpbGVkIHRvIGVuYWJsZSBpbmZpbml0ZSBsaXN0ZW5lcnMuXG4gIC8vIEkga25vdyB3aGF0IHlvdSdyZSBhYm91dCB0byBzYXkuICBCdXQgbGl0ZXJhbGx5IGV2ZXJ5dGhpbmcgYWJvdXRcbiAgLy8gc2lnbmFsLWV4aXQgaXMgYSBjb21wcm9taXNlIHdpdGggZXZpbC4gIEdldCB1c2VkIHRvIGl0LlxuICBpZiAoIWVtaXR0ZXIuaW5maW5pdGUpIHtcbiAgICBlbWl0dGVyLnNldE1heExpc3RlbmVycyhJbmZpbml0eSlcbiAgICBlbWl0dGVyLmluZmluaXRlID0gdHJ1ZVxuICB9XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY2IsIG9wdHMpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoIXByb2Nlc3NPayhnbG9iYWwucHJvY2VzcykpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7fVxuICAgIH1cbiAgICBhc3NlcnQuZXF1YWwodHlwZW9mIGNiLCAnZnVuY3Rpb24nLCAnYSBjYWxsYmFjayBtdXN0IGJlIHByb3ZpZGVkIGZvciBleGl0IGhhbmRsZXInKVxuXG4gICAgaWYgKGxvYWRlZCA9PT0gZmFsc2UpIHtcbiAgICAgIGxvYWQoKVxuICAgIH1cblxuICAgIHZhciBldiA9ICdleGl0J1xuICAgIGlmIChvcHRzICYmIG9wdHMuYWx3YXlzTGFzdCkge1xuICAgICAgZXYgPSAnYWZ0ZXJleGl0J1xuICAgIH1cblxuICAgIHZhciByZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKGV2LCBjYilcbiAgICAgIGlmIChlbWl0dGVyLmxpc3RlbmVycygnZXhpdCcpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgIGVtaXR0ZXIubGlzdGVuZXJzKCdhZnRlcmV4aXQnKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdW5sb2FkKClcbiAgICAgIH1cbiAgICB9XG4gICAgZW1pdHRlci5vbihldiwgY2IpXG5cbiAgICByZXR1cm4gcmVtb3ZlXG4gIH1cblxuICB2YXIgdW5sb2FkID0gZnVuY3Rpb24gdW5sb2FkICgpIHtcbiAgICBpZiAoIWxvYWRlZCB8fCAhcHJvY2Vzc09rKGdsb2JhbC5wcm9jZXNzKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGxvYWRlZCA9IGZhbHNlXG5cbiAgICBzaWduYWxzLmZvckVhY2goZnVuY3Rpb24gKHNpZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcihzaWcsIHNpZ0xpc3RlbmVyc1tzaWddKVxuICAgICAgfSBjYXRjaCAoZXIpIHt9XG4gICAgfSlcbiAgICBwcm9jZXNzLmVtaXQgPSBvcmlnaW5hbFByb2Nlc3NFbWl0XG4gICAgcHJvY2Vzcy5yZWFsbHlFeGl0ID0gb3JpZ2luYWxQcm9jZXNzUmVhbGx5RXhpdFxuICAgIGVtaXR0ZXIuY291bnQgLT0gMVxuICB9XG4gIG1vZHVsZS5leHBvcnRzLnVubG9hZCA9IHVubG9hZFxuXG4gIHZhciBlbWl0ID0gZnVuY3Rpb24gZW1pdCAoZXZlbnQsIGNvZGUsIHNpZ25hbCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChlbWl0dGVyLmVtaXR0ZWRbZXZlbnRdKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgZW1pdHRlci5lbWl0dGVkW2V2ZW50XSA9IHRydWVcbiAgICBlbWl0dGVyLmVtaXQoZXZlbnQsIGNvZGUsIHNpZ25hbClcbiAgfVxuXG4gIC8vIHsgPHNpZ25hbD46IDxsaXN0ZW5lciBmbj4sIC4uLiB9XG4gIHZhciBzaWdMaXN0ZW5lcnMgPSB7fVxuICBzaWduYWxzLmZvckVhY2goZnVuY3Rpb24gKHNpZykge1xuICAgIHNpZ0xpc3RlbmVyc1tzaWddID0gZnVuY3Rpb24gbGlzdGVuZXIgKCkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoIXByb2Nlc3NPayhnbG9iYWwucHJvY2VzcykpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gb3RoZXIgbGlzdGVuZXJzLCBhbiBleGl0IGlzIGNvbWluZyFcbiAgICAgIC8vIFNpbXBsZXN0IHdheTogcmVtb3ZlIHVzIGFuZCB0aGVuIHJlLXNlbmQgdGhlIHNpZ25hbC5cbiAgICAgIC8vIFdlIGtub3cgdGhhdCB0aGlzIHdpbGwga2lsbCB0aGUgcHJvY2Vzcywgc28gd2UgY2FuXG4gICAgICAvLyBzYWZlbHkgZW1pdCBub3cuXG4gICAgICB2YXIgbGlzdGVuZXJzID0gcHJvY2Vzcy5saXN0ZW5lcnMoc2lnKVxuICAgICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IGVtaXR0ZXIuY291bnQpIHtcbiAgICAgICAgdW5sb2FkKClcbiAgICAgICAgZW1pdCgnZXhpdCcsIG51bGwsIHNpZylcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgZW1pdCgnYWZ0ZXJleGl0JywgbnVsbCwgc2lnKVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBpZiAoaXNXaW4gJiYgc2lnID09PSAnU0lHSFVQJykge1xuICAgICAgICAgIC8vIFwiU0lHSFVQXCIgdGhyb3dzIGFuIGBFTk9TWVNgIGVycm9yIG9uIFdpbmRvd3MsXG4gICAgICAgICAgLy8gc28gdXNlIGEgc3VwcG9ydGVkIHNpZ25hbCBpbnN0ZWFkXG4gICAgICAgICAgc2lnID0gJ1NJR0lOVCdcbiAgICAgICAgfVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZylcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgbW9kdWxlLmV4cG9ydHMuc2lnbmFscyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gc2lnbmFsc1xuICB9XG5cbiAgdmFyIGxvYWRlZCA9IGZhbHNlXG5cbiAgdmFyIGxvYWQgPSBmdW5jdGlvbiBsb2FkICgpIHtcbiAgICBpZiAobG9hZGVkIHx8ICFwcm9jZXNzT2soZ2xvYmFsLnByb2Nlc3MpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgbG9hZGVkID0gdHJ1ZVxuXG4gICAgLy8gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIG9uU2lnbmFsRXhpdCdzIHRoYXQgYXJlIGluIHBsYXkuXG4gICAgLy8gSXQncyBpbXBvcnRhbnQgc28gdGhhdCB3ZSBjYW4gY291bnQgdGhlIGNvcnJlY3QgbnVtYmVyIG9mXG4gICAgLy8gbGlzdGVuZXJzIG9uIHNpZ25hbHMsIGFuZCBkb24ndCB3YWl0IGZvciB0aGUgb3RoZXIgb25lIHRvXG4gICAgLy8gaGFuZGxlIGl0IGluc3RlYWQgb2YgdXMuXG4gICAgZW1pdHRlci5jb3VudCArPSAxXG5cbiAgICBzaWduYWxzID0gc2lnbmFscy5maWx0ZXIoZnVuY3Rpb24gKHNpZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcHJvY2Vzcy5vbihzaWcsIHNpZ0xpc3RlbmVyc1tzaWddKVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfSlcblxuICAgIHByb2Nlc3MuZW1pdCA9IHByb2Nlc3NFbWl0XG4gICAgcHJvY2Vzcy5yZWFsbHlFeGl0ID0gcHJvY2Vzc1JlYWxseUV4aXRcbiAgfVxuICBtb2R1bGUuZXhwb3J0cy5sb2FkID0gbG9hZFxuXG4gIHZhciBvcmlnaW5hbFByb2Nlc3NSZWFsbHlFeGl0ID0gcHJvY2Vzcy5yZWFsbHlFeGl0XG4gIHZhciBwcm9jZXNzUmVhbGx5RXhpdCA9IGZ1bmN0aW9uIHByb2Nlc3NSZWFsbHlFeGl0IChjb2RlKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCFwcm9jZXNzT2soZ2xvYmFsLnByb2Nlc3MpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0Q29kZSA9IGNvZGUgfHwgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gMFxuICAgIGVtaXQoJ2V4aXQnLCBwcm9jZXNzLmV4aXRDb2RlLCBudWxsKVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgZW1pdCgnYWZ0ZXJleGl0JywgcHJvY2Vzcy5leGl0Q29kZSwgbnVsbClcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIG9yaWdpbmFsUHJvY2Vzc1JlYWxseUV4aXQuY2FsbChwcm9jZXNzLCBwcm9jZXNzLmV4aXRDb2RlKVxuICB9XG5cbiAgdmFyIG9yaWdpbmFsUHJvY2Vzc0VtaXQgPSBwcm9jZXNzLmVtaXRcbiAgdmFyIHByb2Nlc3NFbWl0ID0gZnVuY3Rpb24gcHJvY2Vzc0VtaXQgKGV2LCBhcmcpIHtcbiAgICBpZiAoZXYgPT09ICdleGl0JyAmJiBwcm9jZXNzT2soZ2xvYmFsLnByb2Nlc3MpKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKGFyZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBhcmdcbiAgICAgIH1cbiAgICAgIHZhciByZXQgPSBvcmlnaW5hbFByb2Nlc3NFbWl0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBlbWl0KCdleGl0JywgcHJvY2Vzcy5leGl0Q29kZSwgbnVsbClcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBlbWl0KCdhZnRlcmV4aXQnLCBwcm9jZXNzLmV4aXRDb2RlLCBudWxsKVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHJldHVybiByZXRcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9yaWdpbmFsUHJvY2Vzc0VtaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgIH1cbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3Qgb3MgPSByZXF1aXJlKCdvcycpO1xuY29uc3Qgb25FeGl0ID0gcmVxdWlyZSgnc2lnbmFsLWV4aXQnKTtcblxuY29uc3QgREVGQVVMVF9GT1JDRV9LSUxMX1RJTUVPVVQgPSAxMDAwICogNTtcblxuLy8gTW9ua2V5LXBhdGNoZXMgYGNoaWxkUHJvY2Vzcy5raWxsKClgIHRvIGFkZCBgZm9yY2VLaWxsQWZ0ZXJUaW1lb3V0YCBiZWhhdmlvclxuY29uc3Qgc3Bhd25lZEtpbGwgPSAoa2lsbCwgc2lnbmFsID0gJ1NJR1RFUk0nLCBvcHRpb25zID0ge30pID0+IHtcblx0Y29uc3Qga2lsbFJlc3VsdCA9IGtpbGwoc2lnbmFsKTtcblx0c2V0S2lsbFRpbWVvdXQoa2lsbCwgc2lnbmFsLCBvcHRpb25zLCBraWxsUmVzdWx0KTtcblx0cmV0dXJuIGtpbGxSZXN1bHQ7XG59O1xuXG5jb25zdCBzZXRLaWxsVGltZW91dCA9IChraWxsLCBzaWduYWwsIG9wdGlvbnMsIGtpbGxSZXN1bHQpID0+IHtcblx0aWYgKCFzaG91bGRGb3JjZUtpbGwoc2lnbmFsLCBvcHRpb25zLCBraWxsUmVzdWx0KSkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IHRpbWVvdXQgPSBnZXRGb3JjZUtpbGxBZnRlclRpbWVvdXQob3B0aW9ucyk7XG5cdGNvbnN0IHQgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRraWxsKCdTSUdLSUxMJyk7XG5cdH0sIHRpbWVvdXQpO1xuXG5cdC8vIEd1YXJkZWQgYmVjYXVzZSB0aGVyZSdzIG5vIGAudW5yZWYoKWAgd2hlbiBgZXhlY2FgIGlzIHVzZWQgaW4gdGhlIHJlbmRlcmVyXG5cdC8vIHByb2Nlc3MgaW4gRWxlY3Ryb24uIFRoaXMgY2Fubm90IGJlIHRlc3RlZCBzaW5jZSB3ZSBkb24ndCBydW4gdGVzdHMgaW5cblx0Ly8gRWxlY3Ryb24uXG5cdC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlXG5cdGlmICh0LnVucmVmKSB7XG5cdFx0dC51bnJlZigpO1xuXHR9XG59O1xuXG5jb25zdCBzaG91bGRGb3JjZUtpbGwgPSAoc2lnbmFsLCB7Zm9yY2VLaWxsQWZ0ZXJUaW1lb3V0fSwga2lsbFJlc3VsdCkgPT4ge1xuXHRyZXR1cm4gaXNTaWd0ZXJtKHNpZ25hbCkgJiYgZm9yY2VLaWxsQWZ0ZXJUaW1lb3V0ICE9PSBmYWxzZSAmJiBraWxsUmVzdWx0O1xufTtcblxuY29uc3QgaXNTaWd0ZXJtID0gc2lnbmFsID0+IHtcblx0cmV0dXJuIHNpZ25hbCA9PT0gb3MuY29uc3RhbnRzLnNpZ25hbHMuU0lHVEVSTSB8fFxuXHRcdCh0eXBlb2Ygc2lnbmFsID09PSAnc3RyaW5nJyAmJiBzaWduYWwudG9VcHBlckNhc2UoKSA9PT0gJ1NJR1RFUk0nKTtcbn07XG5cbmNvbnN0IGdldEZvcmNlS2lsbEFmdGVyVGltZW91dCA9ICh7Zm9yY2VLaWxsQWZ0ZXJUaW1lb3V0ID0gdHJ1ZX0pID0+IHtcblx0aWYgKGZvcmNlS2lsbEFmdGVyVGltZW91dCA9PT0gdHJ1ZSkge1xuXHRcdHJldHVybiBERUZBVUxUX0ZPUkNFX0tJTExfVElNRU9VVDtcblx0fVxuXG5cdGlmICghTnVtYmVyLmlzRmluaXRlKGZvcmNlS2lsbEFmdGVyVGltZW91dCkgfHwgZm9yY2VLaWxsQWZ0ZXJUaW1lb3V0IDwgMCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIHRoZSBcXGBmb3JjZUtpbGxBZnRlclRpbWVvdXRcXGAgb3B0aW9uIHRvIGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIsIGdvdCBcXGAke2ZvcmNlS2lsbEFmdGVyVGltZW91dH1cXGAgKCR7dHlwZW9mIGZvcmNlS2lsbEFmdGVyVGltZW91dH0pYCk7XG5cdH1cblxuXHRyZXR1cm4gZm9yY2VLaWxsQWZ0ZXJUaW1lb3V0O1xufTtcblxuLy8gYGNoaWxkUHJvY2Vzcy5jYW5jZWwoKWBcbmNvbnN0IHNwYXduZWRDYW5jZWwgPSAoc3Bhd25lZCwgY29udGV4dCkgPT4ge1xuXHRjb25zdCBraWxsUmVzdWx0ID0gc3Bhd25lZC5raWxsKCk7XG5cblx0aWYgKGtpbGxSZXN1bHQpIHtcblx0XHRjb250ZXh0LmlzQ2FuY2VsZWQgPSB0cnVlO1xuXHR9XG59O1xuXG5jb25zdCB0aW1lb3V0S2lsbCA9IChzcGF3bmVkLCBzaWduYWwsIHJlamVjdCkgPT4ge1xuXHRzcGF3bmVkLmtpbGwoc2lnbmFsKTtcblx0cmVqZWN0KE9iamVjdC5hc3NpZ24obmV3IEVycm9yKCdUaW1lZCBvdXQnKSwge3RpbWVkT3V0OiB0cnVlLCBzaWduYWx9KSk7XG59O1xuXG4vLyBgdGltZW91dGAgb3B0aW9uIGhhbmRsaW5nXG5jb25zdCBzZXR1cFRpbWVvdXQgPSAoc3Bhd25lZCwge3RpbWVvdXQsIGtpbGxTaWduYWwgPSAnU0lHVEVSTSd9LCBzcGF3bmVkUHJvbWlzZSkgPT4ge1xuXHRpZiAodGltZW91dCA9PT0gMCB8fCB0aW1lb3V0ID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gc3Bhd25lZFByb21pc2U7XG5cdH1cblxuXHRsZXQgdGltZW91dElkO1xuXHRjb25zdCB0aW1lb3V0UHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHR0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdHRpbWVvdXRLaWxsKHNwYXduZWQsIGtpbGxTaWduYWwsIHJlamVjdCk7XG5cdFx0fSwgdGltZW91dCk7XG5cdH0pO1xuXG5cdGNvbnN0IHNhZmVTcGF3bmVkUHJvbWlzZSA9IHNwYXduZWRQcm9taXNlLmZpbmFsbHkoKCkgPT4ge1xuXHRcdGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuXHR9KTtcblxuXHRyZXR1cm4gUHJvbWlzZS5yYWNlKFt0aW1lb3V0UHJvbWlzZSwgc2FmZVNwYXduZWRQcm9taXNlXSk7XG59O1xuXG5jb25zdCB2YWxpZGF0ZVRpbWVvdXQgPSAoe3RpbWVvdXR9KSA9PiB7XG5cdGlmICh0aW1lb3V0ICE9PSB1bmRlZmluZWQgJiYgKCFOdW1iZXIuaXNGaW5pdGUodGltZW91dCkgfHwgdGltZW91dCA8IDApKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgdGhlIFxcYHRpbWVvdXRcXGAgb3B0aW9uIHRvIGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIsIGdvdCBcXGAke3RpbWVvdXR9XFxgICgke3R5cGVvZiB0aW1lb3V0fSlgKTtcblx0fVxufTtcblxuLy8gYGNsZWFudXBgIG9wdGlvbiBoYW5kbGluZ1xuY29uc3Qgc2V0RXhpdEhhbmRsZXIgPSBhc3luYyAoc3Bhd25lZCwge2NsZWFudXAsIGRldGFjaGVkfSwgdGltZWRQcm9taXNlKSA9PiB7XG5cdGlmICghY2xlYW51cCB8fCBkZXRhY2hlZCkge1xuXHRcdHJldHVybiB0aW1lZFByb21pc2U7XG5cdH1cblxuXHRjb25zdCByZW1vdmVFeGl0SGFuZGxlciA9IG9uRXhpdCgoKSA9PiB7XG5cdFx0c3Bhd25lZC5raWxsKCk7XG5cdH0pO1xuXG5cdHJldHVybiB0aW1lZFByb21pc2UuZmluYWxseSgoKSA9PiB7XG5cdFx0cmVtb3ZlRXhpdEhhbmRsZXIoKTtcblx0fSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0c3Bhd25lZEtpbGwsXG5cdHNwYXduZWRDYW5jZWwsXG5cdHNldHVwVGltZW91dCxcblx0dmFsaWRhdGVUaW1lb3V0LFxuXHRzZXRFeGl0SGFuZGxlclxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgaXNTdHJlYW0gPSBzdHJlYW0gPT5cblx0c3RyZWFtICE9PSBudWxsICYmXG5cdHR5cGVvZiBzdHJlYW0gPT09ICdvYmplY3QnICYmXG5cdHR5cGVvZiBzdHJlYW0ucGlwZSA9PT0gJ2Z1bmN0aW9uJztcblxuaXNTdHJlYW0ud3JpdGFibGUgPSBzdHJlYW0gPT5cblx0aXNTdHJlYW0oc3RyZWFtKSAmJlxuXHRzdHJlYW0ud3JpdGFibGUgIT09IGZhbHNlICYmXG5cdHR5cGVvZiBzdHJlYW0uX3dyaXRlID09PSAnZnVuY3Rpb24nICYmXG5cdHR5cGVvZiBzdHJlYW0uX3dyaXRhYmxlU3RhdGUgPT09ICdvYmplY3QnO1xuXG5pc1N0cmVhbS5yZWFkYWJsZSA9IHN0cmVhbSA9PlxuXHRpc1N0cmVhbShzdHJlYW0pICYmXG5cdHN0cmVhbS5yZWFkYWJsZSAhPT0gZmFsc2UgJiZcblx0dHlwZW9mIHN0cmVhbS5fcmVhZCA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHR0eXBlb2Ygc3RyZWFtLl9yZWFkYWJsZVN0YXRlID09PSAnb2JqZWN0JztcblxuaXNTdHJlYW0uZHVwbGV4ID0gc3RyZWFtID0+XG5cdGlzU3RyZWFtLndyaXRhYmxlKHN0cmVhbSkgJiZcblx0aXNTdHJlYW0ucmVhZGFibGUoc3RyZWFtKTtcblxuaXNTdHJlYW0udHJhbnNmb3JtID0gc3RyZWFtID0+XG5cdGlzU3RyZWFtLmR1cGxleChzdHJlYW0pICYmXG5cdHR5cGVvZiBzdHJlYW0uX3RyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJztcblxubW9kdWxlLmV4cG9ydHMgPSBpc1N0cmVhbTtcbiIsIid1c2Ugc3RyaWN0JztcbmNvbnN0IHtQYXNzVGhyb3VnaDogUGFzc1Rocm91Z2hTdHJlYW19ID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gb3B0aW9ucyA9PiB7XG5cdG9wdGlvbnMgPSB7Li4ub3B0aW9uc307XG5cblx0Y29uc3Qge2FycmF5fSA9IG9wdGlvbnM7XG5cdGxldCB7ZW5jb2Rpbmd9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNCdWZmZXIgPSBlbmNvZGluZyA9PT0gJ2J1ZmZlcic7XG5cdGxldCBvYmplY3RNb2RlID0gZmFsc2U7XG5cblx0aWYgKGFycmF5KSB7XG5cdFx0b2JqZWN0TW9kZSA9ICEoZW5jb2RpbmcgfHwgaXNCdWZmZXIpO1xuXHR9IGVsc2Uge1xuXHRcdGVuY29kaW5nID0gZW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXHR9XG5cblx0aWYgKGlzQnVmZmVyKSB7XG5cdFx0ZW5jb2RpbmcgPSBudWxsO1xuXHR9XG5cblx0Y29uc3Qgc3RyZWFtID0gbmV3IFBhc3NUaHJvdWdoU3RyZWFtKHtvYmplY3RNb2RlfSk7XG5cblx0aWYgKGVuY29kaW5nKSB7XG5cdFx0c3RyZWFtLnNldEVuY29kaW5nKGVuY29kaW5nKTtcblx0fVxuXG5cdGxldCBsZW5ndGggPSAwO1xuXHRjb25zdCBjaHVua3MgPSBbXTtcblxuXHRzdHJlYW0ub24oJ2RhdGEnLCBjaHVuayA9PiB7XG5cdFx0Y2h1bmtzLnB1c2goY2h1bmspO1xuXG5cdFx0aWYgKG9iamVjdE1vZGUpIHtcblx0XHRcdGxlbmd0aCA9IGNodW5rcy5sZW5ndGg7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGxlbmd0aCArPSBjaHVuay5sZW5ndGg7XG5cdFx0fVxuXHR9KTtcblxuXHRzdHJlYW0uZ2V0QnVmZmVyZWRWYWx1ZSA9ICgpID0+IHtcblx0XHRpZiAoYXJyYXkpIHtcblx0XHRcdHJldHVybiBjaHVua3M7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGlzQnVmZmVyID8gQnVmZmVyLmNvbmNhdChjaHVua3MsIGxlbmd0aCkgOiBjaHVua3Muam9pbignJyk7XG5cdH07XG5cblx0c3RyZWFtLmdldEJ1ZmZlcmVkTGVuZ3RoID0gKCkgPT4gbGVuZ3RoO1xuXG5cdHJldHVybiBzdHJlYW07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3Qge2NvbnN0YW50czogQnVmZmVyQ29uc3RhbnRzfSA9IHJlcXVpcmUoJ2J1ZmZlcicpO1xuY29uc3Qgc3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5jb25zdCB7cHJvbWlzaWZ5fSA9IHJlcXVpcmUoJ3V0aWwnKTtcbmNvbnN0IGJ1ZmZlclN0cmVhbSA9IHJlcXVpcmUoJy4vYnVmZmVyLXN0cmVhbScpO1xuXG5jb25zdCBzdHJlYW1QaXBlbGluZVByb21pc2lmaWVkID0gcHJvbWlzaWZ5KHN0cmVhbS5waXBlbGluZSk7XG5cbmNsYXNzIE1heEJ1ZmZlckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcignbWF4QnVmZmVyIGV4Y2VlZGVkJyk7XG5cdFx0dGhpcy5uYW1lID0gJ01heEJ1ZmZlckVycm9yJztcblx0fVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRTdHJlYW0oaW5wdXRTdHJlYW0sIG9wdGlvbnMpIHtcblx0aWYgKCFpbnB1dFN0cmVhbSkge1xuXHRcdHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYSBzdHJlYW0nKTtcblx0fVxuXG5cdG9wdGlvbnMgPSB7XG5cdFx0bWF4QnVmZmVyOiBJbmZpbml0eSxcblx0XHQuLi5vcHRpb25zXG5cdH07XG5cblx0Y29uc3Qge21heEJ1ZmZlcn0gPSBvcHRpb25zO1xuXHRjb25zdCBzdHJlYW0gPSBidWZmZXJTdHJlYW0ob3B0aW9ucyk7XG5cblx0YXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdGNvbnN0IHJlamVjdFByb21pc2UgPSBlcnJvciA9PiB7XG5cdFx0XHQvLyBEb24ndCByZXRyaWV2ZSBhbiBvdmVyc2l6ZWQgYnVmZmVyLlxuXHRcdFx0aWYgKGVycm9yICYmIHN0cmVhbS5nZXRCdWZmZXJlZExlbmd0aCgpIDw9IEJ1ZmZlckNvbnN0YW50cy5NQVhfTEVOR1RIKSB7XG5cdFx0XHRcdGVycm9yLmJ1ZmZlcmVkRGF0YSA9IHN0cmVhbS5nZXRCdWZmZXJlZFZhbHVlKCk7XG5cdFx0XHR9XG5cblx0XHRcdHJlamVjdChlcnJvcik7XG5cdFx0fTtcblxuXHRcdChhc3luYyAoKSA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCBzdHJlYW1QaXBlbGluZVByb21pc2lmaWVkKGlucHV0U3RyZWFtLCBzdHJlYW0pO1xuXHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRyZWplY3RQcm9taXNlKGVycm9yKTtcblx0XHRcdH1cblx0XHR9KSgpO1xuXG5cdFx0c3RyZWFtLm9uKCdkYXRhJywgKCkgPT4ge1xuXHRcdFx0aWYgKHN0cmVhbS5nZXRCdWZmZXJlZExlbmd0aCgpID4gbWF4QnVmZmVyKSB7XG5cdFx0XHRcdHJlamVjdFByb21pc2UobmV3IE1heEJ1ZmZlckVycm9yKCkpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9KTtcblxuXHRyZXR1cm4gc3RyZWFtLmdldEJ1ZmZlcmVkVmFsdWUoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRTdHJlYW07XG5tb2R1bGUuZXhwb3J0cy5idWZmZXIgPSAoc3RyZWFtLCBvcHRpb25zKSA9PiBnZXRTdHJlYW0oc3RyZWFtLCB7Li4ub3B0aW9ucywgZW5jb2Rpbmc6ICdidWZmZXInfSk7XG5tb2R1bGUuZXhwb3J0cy5hcnJheSA9IChzdHJlYW0sIG9wdGlvbnMpID0+IGdldFN0cmVhbShzdHJlYW0sIHsuLi5vcHRpb25zLCBhcnJheTogdHJ1ZX0pO1xubW9kdWxlLmV4cG9ydHMuTWF4QnVmZmVyRXJyb3IgPSBNYXhCdWZmZXJFcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgeyBQYXNzVGhyb3VnaCB9ID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKC8qc3RyZWFtcy4uLiovKSB7XG4gIHZhciBzb3VyY2VzID0gW11cbiAgdmFyIG91dHB1dCAgPSBuZXcgUGFzc1Rocm91Z2goe29iamVjdE1vZGU6IHRydWV9KVxuXG4gIG91dHB1dC5zZXRNYXhMaXN0ZW5lcnMoMClcblxuICBvdXRwdXQuYWRkID0gYWRkXG4gIG91dHB1dC5pc0VtcHR5ID0gaXNFbXB0eVxuXG4gIG91dHB1dC5vbigndW5waXBlJywgcmVtb3ZlKVxuXG4gIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykuZm9yRWFjaChhZGQpXG5cbiAgcmV0dXJuIG91dHB1dFxuXG4gIGZ1bmN0aW9uIGFkZCAoc291cmNlKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlKSkge1xuICAgICAgc291cmNlLmZvckVhY2goYWRkKVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBzb3VyY2VzLnB1c2goc291cmNlKTtcbiAgICBzb3VyY2Uub25jZSgnZW5kJywgcmVtb3ZlLmJpbmQobnVsbCwgc291cmNlKSlcbiAgICBzb3VyY2Uub25jZSgnZXJyb3InLCBvdXRwdXQuZW1pdC5iaW5kKG91dHB1dCwgJ2Vycm9yJykpXG4gICAgc291cmNlLnBpcGUob3V0cHV0LCB7ZW5kOiBmYWxzZX0pXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzRW1wdHkgKCkge1xuICAgIHJldHVybiBzb3VyY2VzLmxlbmd0aCA9PSAwO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZlIChzb3VyY2UpIHtcbiAgICBzb3VyY2VzID0gc291cmNlcy5maWx0ZXIoZnVuY3Rpb24gKGl0KSB7IHJldHVybiBpdCAhPT0gc291cmNlIH0pXG4gICAgaWYgKCFzb3VyY2VzLmxlbmd0aCAmJiBvdXRwdXQucmVhZGFibGUpIHsgb3V0cHV0LmVuZCgpIH1cbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3QgaXNTdHJlYW0gPSByZXF1aXJlKCdpcy1zdHJlYW0nKTtcbmNvbnN0IGdldFN0cmVhbSA9IHJlcXVpcmUoJ2dldC1zdHJlYW0nKTtcbmNvbnN0IG1lcmdlU3RyZWFtID0gcmVxdWlyZSgnbWVyZ2Utc3RyZWFtJyk7XG5cbi8vIGBpbnB1dGAgb3B0aW9uXG5jb25zdCBoYW5kbGVJbnB1dCA9IChzcGF3bmVkLCBpbnB1dCkgPT4ge1xuXHQvLyBDaGVja2luZyBmb3Igc3RkaW4gaXMgd29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy8yNjg1MlxuXHQvLyBAdG9kbyByZW1vdmUgYHx8IHNwYXduZWQuc3RkaW4gPT09IHVuZGVmaW5lZGAgb25jZSB3ZSBkcm9wIHN1cHBvcnQgZm9yIE5vZGUuanMgPD0xMi4yLjBcblx0aWYgKGlucHV0ID09PSB1bmRlZmluZWQgfHwgc3Bhd25lZC5zdGRpbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0aWYgKGlzU3RyZWFtKGlucHV0KSkge1xuXHRcdGlucHV0LnBpcGUoc3Bhd25lZC5zdGRpbik7XG5cdH0gZWxzZSB7XG5cdFx0c3Bhd25lZC5zdGRpbi5lbmQoaW5wdXQpO1xuXHR9XG59O1xuXG4vLyBgYWxsYCBpbnRlcmxlYXZlcyBgc3Rkb3V0YCBhbmQgYHN0ZGVycmBcbmNvbnN0IG1ha2VBbGxTdHJlYW0gPSAoc3Bhd25lZCwge2FsbH0pID0+IHtcblx0aWYgKCFhbGwgfHwgKCFzcGF3bmVkLnN0ZG91dCAmJiAhc3Bhd25lZC5zdGRlcnIpKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgbWl4ZWQgPSBtZXJnZVN0cmVhbSgpO1xuXG5cdGlmIChzcGF3bmVkLnN0ZG91dCkge1xuXHRcdG1peGVkLmFkZChzcGF3bmVkLnN0ZG91dCk7XG5cdH1cblxuXHRpZiAoc3Bhd25lZC5zdGRlcnIpIHtcblx0XHRtaXhlZC5hZGQoc3Bhd25lZC5zdGRlcnIpO1xuXHR9XG5cblx0cmV0dXJuIG1peGVkO1xufTtcblxuLy8gT24gZmFpbHVyZSwgYHJlc3VsdC5zdGRvdXR8c3RkZXJyfGFsbGAgc2hvdWxkIGNvbnRhaW4gdGhlIGN1cnJlbnRseSBidWZmZXJlZCBzdHJlYW1cbmNvbnN0IGdldEJ1ZmZlcmVkRGF0YSA9IGFzeW5jIChzdHJlYW0sIHN0cmVhbVByb21pc2UpID0+IHtcblx0aWYgKCFzdHJlYW0pIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRzdHJlYW0uZGVzdHJveSgpO1xuXG5cdHRyeSB7XG5cdFx0cmV0dXJuIGF3YWl0IHN0cmVhbVByb21pc2U7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0cmV0dXJuIGVycm9yLmJ1ZmZlcmVkRGF0YTtcblx0fVxufTtcblxuY29uc3QgZ2V0U3RyZWFtUHJvbWlzZSA9IChzdHJlYW0sIHtlbmNvZGluZywgYnVmZmVyLCBtYXhCdWZmZXJ9KSA9PiB7XG5cdGlmICghc3RyZWFtIHx8ICFidWZmZXIpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRpZiAoZW5jb2RpbmcpIHtcblx0XHRyZXR1cm4gZ2V0U3RyZWFtKHN0cmVhbSwge2VuY29kaW5nLCBtYXhCdWZmZXJ9KTtcblx0fVxuXG5cdHJldHVybiBnZXRTdHJlYW0uYnVmZmVyKHN0cmVhbSwge21heEJ1ZmZlcn0pO1xufTtcblxuLy8gUmV0cmlldmUgcmVzdWx0IG9mIGNoaWxkIHByb2Nlc3M6IGV4aXQgY29kZSwgc2lnbmFsLCBlcnJvciwgc3RyZWFtcyAoc3Rkb3V0L3N0ZGVyci9hbGwpXG5jb25zdCBnZXRTcGF3bmVkUmVzdWx0ID0gYXN5bmMgKHtzdGRvdXQsIHN0ZGVyciwgYWxsfSwge2VuY29kaW5nLCBidWZmZXIsIG1heEJ1ZmZlcn0sIHByb2Nlc3NEb25lKSA9PiB7XG5cdGNvbnN0IHN0ZG91dFByb21pc2UgPSBnZXRTdHJlYW1Qcm9taXNlKHN0ZG91dCwge2VuY29kaW5nLCBidWZmZXIsIG1heEJ1ZmZlcn0pO1xuXHRjb25zdCBzdGRlcnJQcm9taXNlID0gZ2V0U3RyZWFtUHJvbWlzZShzdGRlcnIsIHtlbmNvZGluZywgYnVmZmVyLCBtYXhCdWZmZXJ9KTtcblx0Y29uc3QgYWxsUHJvbWlzZSA9IGdldFN0cmVhbVByb21pc2UoYWxsLCB7ZW5jb2RpbmcsIGJ1ZmZlciwgbWF4QnVmZmVyOiBtYXhCdWZmZXIgKiAyfSk7XG5cblx0dHJ5IHtcblx0XHRyZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoW3Byb2Nlc3NEb25lLCBzdGRvdXRQcm9taXNlLCBzdGRlcnJQcm9taXNlLCBhbGxQcm9taXNlXSk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0cmV0dXJuIFByb21pc2UuYWxsKFtcblx0XHRcdHtlcnJvciwgc2lnbmFsOiBlcnJvci5zaWduYWwsIHRpbWVkT3V0OiBlcnJvci50aW1lZE91dH0sXG5cdFx0XHRnZXRCdWZmZXJlZERhdGEoc3Rkb3V0LCBzdGRvdXRQcm9taXNlKSxcblx0XHRcdGdldEJ1ZmZlcmVkRGF0YShzdGRlcnIsIHN0ZGVyclByb21pc2UpLFxuXHRcdFx0Z2V0QnVmZmVyZWREYXRhKGFsbCwgYWxsUHJvbWlzZSlcblx0XHRdKTtcblx0fVxufTtcblxuY29uc3QgdmFsaWRhdGVJbnB1dFN5bmMgPSAoe2lucHV0fSkgPT4ge1xuXHRpZiAoaXNTdHJlYW0oaW5wdXQpKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGBpbnB1dGAgb3B0aW9uIGNhbm5vdCBiZSBhIHN0cmVhbSBpbiBzeW5jIG1vZGUnKTtcblx0fVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdGhhbmRsZUlucHV0LFxuXHRtYWtlQWxsU3RyZWFtLFxuXHRnZXRTcGF3bmVkUmVzdWx0LFxuXHR2YWxpZGF0ZUlucHV0U3luY1xufTtcblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBuYXRpdmVQcm9taXNlUHJvdG90eXBlID0gKGFzeW5jICgpID0+IHt9KSgpLmNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbmNvbnN0IGRlc2NyaXB0b3JzID0gWyd0aGVuJywgJ2NhdGNoJywgJ2ZpbmFsbHknXS5tYXAocHJvcGVydHkgPT4gW1xuXHRwcm9wZXJ0eSxcblx0UmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobmF0aXZlUHJvbWlzZVByb3RvdHlwZSwgcHJvcGVydHkpXG5dKTtcblxuLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBhIG1peGluIG9mIGBjaGlsZFByb2Nlc3NgIGFuZCBgUHJvbWlzZWBcbmNvbnN0IG1lcmdlUHJvbWlzZSA9IChzcGF3bmVkLCBwcm9taXNlKSA9PiB7XG5cdGZvciAoY29uc3QgW3Byb3BlcnR5LCBkZXNjcmlwdG9yXSBvZiBkZXNjcmlwdG9ycykge1xuXHRcdC8vIFN0YXJ0aW5nIHRoZSBtYWluIGBwcm9taXNlYCBpcyBkZWZlcnJlZCB0byBhdm9pZCBjb25zdW1pbmcgc3RyZWFtc1xuXHRcdGNvbnN0IHZhbHVlID0gdHlwZW9mIHByb21pc2UgPT09ICdmdW5jdGlvbicgP1xuXHRcdFx0KC4uLmFyZ3MpID0+IFJlZmxlY3QuYXBwbHkoZGVzY3JpcHRvci52YWx1ZSwgcHJvbWlzZSgpLCBhcmdzKSA6XG5cdFx0XHRkZXNjcmlwdG9yLnZhbHVlLmJpbmQocHJvbWlzZSk7XG5cblx0XHRSZWZsZWN0LmRlZmluZVByb3BlcnR5KHNwYXduZWQsIHByb3BlcnR5LCB7Li4uZGVzY3JpcHRvciwgdmFsdWV9KTtcblx0fVxuXG5cdHJldHVybiBzcGF3bmVkO1xufTtcblxuLy8gVXNlIHByb21pc2VzIGluc3RlYWQgb2YgYGNoaWxkX3Byb2Nlc3NgIGV2ZW50c1xuY29uc3QgZ2V0U3Bhd25lZFByb21pc2UgPSBzcGF3bmVkID0+IHtcblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRzcGF3bmVkLm9uKCdleGl0JywgKGV4aXRDb2RlLCBzaWduYWwpID0+IHtcblx0XHRcdHJlc29sdmUoe2V4aXRDb2RlLCBzaWduYWx9KTtcblx0XHR9KTtcblxuXHRcdHNwYXduZWQub24oJ2Vycm9yJywgZXJyb3IgPT4ge1xuXHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHR9KTtcblxuXHRcdGlmIChzcGF3bmVkLnN0ZGluKSB7XG5cdFx0XHRzcGF3bmVkLnN0ZGluLm9uKCdlcnJvcicsIGVycm9yID0+IHtcblx0XHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0bWVyZ2VQcm9taXNlLFxuXHRnZXRTcGF3bmVkUHJvbWlzZVxufTtcblxuIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3Qgbm9ybWFsaXplQXJncyA9IChmaWxlLCBhcmdzID0gW10pID0+IHtcblx0aWYgKCFBcnJheS5pc0FycmF5KGFyZ3MpKSB7XG5cdFx0cmV0dXJuIFtmaWxlXTtcblx0fVxuXG5cdHJldHVybiBbZmlsZSwgLi4uYXJnc107XG59O1xuXG5jb25zdCBOT19FU0NBUEVfUkVHRVhQID0gL15bXFx3Li1dKyQvO1xuY29uc3QgRE9VQkxFX1FVT1RFU19SRUdFWFAgPSAvXCIvZztcblxuY29uc3QgZXNjYXBlQXJnID0gYXJnID0+IHtcblx0aWYgKHR5cGVvZiBhcmcgIT09ICdzdHJpbmcnIHx8IE5PX0VTQ0FQRV9SRUdFWFAudGVzdChhcmcpKSB7XG5cdFx0cmV0dXJuIGFyZztcblx0fVxuXG5cdHJldHVybiBgXCIke2FyZy5yZXBsYWNlKERPVUJMRV9RVU9URVNfUkVHRVhQLCAnXFxcXFwiJyl9XCJgO1xufTtcblxuY29uc3Qgam9pbkNvbW1hbmQgPSAoZmlsZSwgYXJncykgPT4ge1xuXHRyZXR1cm4gbm9ybWFsaXplQXJncyhmaWxlLCBhcmdzKS5qb2luKCcgJyk7XG59O1xuXG5jb25zdCBnZXRFc2NhcGVkQ29tbWFuZCA9IChmaWxlLCBhcmdzKSA9PiB7XG5cdHJldHVybiBub3JtYWxpemVBcmdzKGZpbGUsIGFyZ3MpLm1hcChhcmcgPT4gZXNjYXBlQXJnKGFyZykpLmpvaW4oJyAnKTtcbn07XG5cbmNvbnN0IFNQQUNFU19SRUdFWFAgPSAvICsvZztcblxuLy8gSGFuZGxlIGBleGVjYS5jb21tYW5kKClgXG5jb25zdCBwYXJzZUNvbW1hbmQgPSBjb21tYW5kID0+IHtcblx0Y29uc3QgdG9rZW5zID0gW107XG5cdGZvciAoY29uc3QgdG9rZW4gb2YgY29tbWFuZC50cmltKCkuc3BsaXQoU1BBQ0VTX1JFR0VYUCkpIHtcblx0XHQvLyBBbGxvdyBzcGFjZXMgdG8gYmUgZXNjYXBlZCBieSBhIGJhY2tzbGFzaCBpZiBub3QgbWVhbnQgYXMgYSBkZWxpbWl0ZXJcblx0XHRjb25zdCBwcmV2aW91c1Rva2VuID0gdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXTtcblx0XHRpZiAocHJldmlvdXNUb2tlbiAmJiBwcmV2aW91c1Rva2VuLmVuZHNXaXRoKCdcXFxcJykpIHtcblx0XHRcdC8vIE1lcmdlIHByZXZpb3VzIHRva2VuIHdpdGggY3VycmVudCBvbmVcblx0XHRcdHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV0gPSBgJHtwcmV2aW91c1Rva2VuLnNsaWNlKDAsIC0xKX0gJHt0b2tlbn1gO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0b2tlbnMucHVzaCh0b2tlbik7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRva2Vucztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRqb2luQ29tbWFuZCxcblx0Z2V0RXNjYXBlZENvbW1hbmQsXG5cdHBhcnNlQ29tbWFuZFxufTtcbiIsIid1c2Ugc3RyaWN0JztcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCBjaGlsZFByb2Nlc3MgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7XG5jb25zdCBjcm9zc1NwYXduID0gcmVxdWlyZSgnY3Jvc3Mtc3Bhd24nKTtcbmNvbnN0IHN0cmlwRmluYWxOZXdsaW5lID0gcmVxdWlyZSgnc3RyaXAtZmluYWwtbmV3bGluZScpO1xuY29uc3QgbnBtUnVuUGF0aCA9IHJlcXVpcmUoJ25wbS1ydW4tcGF0aCcpO1xuY29uc3Qgb25ldGltZSA9IHJlcXVpcmUoJ29uZXRpbWUnKTtcbmNvbnN0IG1ha2VFcnJvciA9IHJlcXVpcmUoJy4vbGliL2Vycm9yJyk7XG5jb25zdCBub3JtYWxpemVTdGRpbyA9IHJlcXVpcmUoJy4vbGliL3N0ZGlvJyk7XG5jb25zdCB7c3Bhd25lZEtpbGwsIHNwYXduZWRDYW5jZWwsIHNldHVwVGltZW91dCwgdmFsaWRhdGVUaW1lb3V0LCBzZXRFeGl0SGFuZGxlcn0gPSByZXF1aXJlKCcuL2xpYi9raWxsJyk7XG5jb25zdCB7aGFuZGxlSW5wdXQsIGdldFNwYXduZWRSZXN1bHQsIG1ha2VBbGxTdHJlYW0sIHZhbGlkYXRlSW5wdXRTeW5jfSA9IHJlcXVpcmUoJy4vbGliL3N0cmVhbScpO1xuY29uc3Qge21lcmdlUHJvbWlzZSwgZ2V0U3Bhd25lZFByb21pc2V9ID0gcmVxdWlyZSgnLi9saWIvcHJvbWlzZScpO1xuY29uc3Qge2pvaW5Db21tYW5kLCBwYXJzZUNvbW1hbmQsIGdldEVzY2FwZWRDb21tYW5kfSA9IHJlcXVpcmUoJy4vbGliL2NvbW1hbmQnKTtcblxuY29uc3QgREVGQVVMVF9NQVhfQlVGRkVSID0gMTAwMCAqIDEwMDAgKiAxMDA7XG5cbmNvbnN0IGdldEVudiA9ICh7ZW52OiBlbnZPcHRpb24sIGV4dGVuZEVudiwgcHJlZmVyTG9jYWwsIGxvY2FsRGlyLCBleGVjUGF0aH0pID0+IHtcblx0Y29uc3QgZW52ID0gZXh0ZW5kRW52ID8gey4uLnByb2Nlc3MuZW52LCAuLi5lbnZPcHRpb259IDogZW52T3B0aW9uO1xuXG5cdGlmIChwcmVmZXJMb2NhbCkge1xuXHRcdHJldHVybiBucG1SdW5QYXRoLmVudih7ZW52LCBjd2Q6IGxvY2FsRGlyLCBleGVjUGF0aH0pO1xuXHR9XG5cblx0cmV0dXJuIGVudjtcbn07XG5cbmNvbnN0IGhhbmRsZUFyZ3VtZW50cyA9IChmaWxlLCBhcmdzLCBvcHRpb25zID0ge30pID0+IHtcblx0Y29uc3QgcGFyc2VkID0gY3Jvc3NTcGF3bi5fcGFyc2UoZmlsZSwgYXJncywgb3B0aW9ucyk7XG5cdGZpbGUgPSBwYXJzZWQuY29tbWFuZDtcblx0YXJncyA9IHBhcnNlZC5hcmdzO1xuXHRvcHRpb25zID0gcGFyc2VkLm9wdGlvbnM7XG5cblx0b3B0aW9ucyA9IHtcblx0XHRtYXhCdWZmZXI6IERFRkFVTFRfTUFYX0JVRkZFUixcblx0XHRidWZmZXI6IHRydWUsXG5cdFx0c3RyaXBGaW5hbE5ld2xpbmU6IHRydWUsXG5cdFx0ZXh0ZW5kRW52OiB0cnVlLFxuXHRcdHByZWZlckxvY2FsOiBmYWxzZSxcblx0XHRsb2NhbERpcjogb3B0aW9ucy5jd2QgfHwgcHJvY2Vzcy5jd2QoKSxcblx0XHRleGVjUGF0aDogcHJvY2Vzcy5leGVjUGF0aCxcblx0XHRlbmNvZGluZzogJ3V0ZjgnLFxuXHRcdHJlamVjdDogdHJ1ZSxcblx0XHRjbGVhbnVwOiB0cnVlLFxuXHRcdGFsbDogZmFsc2UsXG5cdFx0d2luZG93c0hpZGU6IHRydWUsXG5cdFx0Li4ub3B0aW9uc1xuXHR9O1xuXG5cdG9wdGlvbnMuZW52ID0gZ2V0RW52KG9wdGlvbnMpO1xuXG5cdG9wdGlvbnMuc3RkaW8gPSBub3JtYWxpemVTdGRpbyhvcHRpb25zKTtcblxuXHRpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyAmJiBwYXRoLmJhc2VuYW1lKGZpbGUsICcuZXhlJykgPT09ICdjbWQnKSB7XG5cdFx0Ly8gIzExNlxuXHRcdGFyZ3MudW5zaGlmdCgnL3EnKTtcblx0fVxuXG5cdHJldHVybiB7ZmlsZSwgYXJncywgb3B0aW9ucywgcGFyc2VkfTtcbn07XG5cbmNvbnN0IGhhbmRsZU91dHB1dCA9IChvcHRpb25zLCB2YWx1ZSwgZXJyb3IpID0+IHtcblx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgJiYgIUJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkpIHtcblx0XHQvLyBXaGVuIGBleGVjYS5zeW5jKClgIGVycm9ycywgd2Ugbm9ybWFsaXplIGl0IHRvICcnIHRvIG1pbWljIGBleGVjYSgpYFxuXHRcdHJldHVybiBlcnJvciA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogJyc7XG5cdH1cblxuXHRpZiAob3B0aW9ucy5zdHJpcEZpbmFsTmV3bGluZSkge1xuXHRcdHJldHVybiBzdHJpcEZpbmFsTmV3bGluZSh2YWx1ZSk7XG5cdH1cblxuXHRyZXR1cm4gdmFsdWU7XG59O1xuXG5jb25zdCBleGVjYSA9IChmaWxlLCBhcmdzLCBvcHRpb25zKSA9PiB7XG5cdGNvbnN0IHBhcnNlZCA9IGhhbmRsZUFyZ3VtZW50cyhmaWxlLCBhcmdzLCBvcHRpb25zKTtcblx0Y29uc3QgY29tbWFuZCA9IGpvaW5Db21tYW5kKGZpbGUsIGFyZ3MpO1xuXHRjb25zdCBlc2NhcGVkQ29tbWFuZCA9IGdldEVzY2FwZWRDb21tYW5kKGZpbGUsIGFyZ3MpO1xuXG5cdHZhbGlkYXRlVGltZW91dChwYXJzZWQub3B0aW9ucyk7XG5cblx0bGV0IHNwYXduZWQ7XG5cdHRyeSB7XG5cdFx0c3Bhd25lZCA9IGNoaWxkUHJvY2Vzcy5zcGF3bihwYXJzZWQuZmlsZSwgcGFyc2VkLmFyZ3MsIHBhcnNlZC5vcHRpb25zKTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBFbnN1cmUgdGhlIHJldHVybmVkIGVycm9yIGlzIGFsd2F5cyBib3RoIGEgcHJvbWlzZSBhbmQgYSBjaGlsZCBwcm9jZXNzXG5cdFx0Y29uc3QgZHVtbXlTcGF3bmVkID0gbmV3IGNoaWxkUHJvY2Vzcy5DaGlsZFByb2Nlc3MoKTtcblx0XHRjb25zdCBlcnJvclByb21pc2UgPSBQcm9taXNlLnJlamVjdChtYWtlRXJyb3Ioe1xuXHRcdFx0ZXJyb3IsXG5cdFx0XHRzdGRvdXQ6ICcnLFxuXHRcdFx0c3RkZXJyOiAnJyxcblx0XHRcdGFsbDogJycsXG5cdFx0XHRjb21tYW5kLFxuXHRcdFx0ZXNjYXBlZENvbW1hbmQsXG5cdFx0XHRwYXJzZWQsXG5cdFx0XHR0aW1lZE91dDogZmFsc2UsXG5cdFx0XHRpc0NhbmNlbGVkOiBmYWxzZSxcblx0XHRcdGtpbGxlZDogZmFsc2Vcblx0XHR9KSk7XG5cdFx0cmV0dXJuIG1lcmdlUHJvbWlzZShkdW1teVNwYXduZWQsIGVycm9yUHJvbWlzZSk7XG5cdH1cblxuXHRjb25zdCBzcGF3bmVkUHJvbWlzZSA9IGdldFNwYXduZWRQcm9taXNlKHNwYXduZWQpO1xuXHRjb25zdCB0aW1lZFByb21pc2UgPSBzZXR1cFRpbWVvdXQoc3Bhd25lZCwgcGFyc2VkLm9wdGlvbnMsIHNwYXduZWRQcm9taXNlKTtcblx0Y29uc3QgcHJvY2Vzc0RvbmUgPSBzZXRFeGl0SGFuZGxlcihzcGF3bmVkLCBwYXJzZWQub3B0aW9ucywgdGltZWRQcm9taXNlKTtcblxuXHRjb25zdCBjb250ZXh0ID0ge2lzQ2FuY2VsZWQ6IGZhbHNlfTtcblxuXHRzcGF3bmVkLmtpbGwgPSBzcGF3bmVkS2lsbC5iaW5kKG51bGwsIHNwYXduZWQua2lsbC5iaW5kKHNwYXduZWQpKTtcblx0c3Bhd25lZC5jYW5jZWwgPSBzcGF3bmVkQ2FuY2VsLmJpbmQobnVsbCwgc3Bhd25lZCwgY29udGV4dCk7XG5cblx0Y29uc3QgaGFuZGxlUHJvbWlzZSA9IGFzeW5jICgpID0+IHtcblx0XHRjb25zdCBbe2Vycm9yLCBleGl0Q29kZSwgc2lnbmFsLCB0aW1lZE91dH0sIHN0ZG91dFJlc3VsdCwgc3RkZXJyUmVzdWx0LCBhbGxSZXN1bHRdID0gYXdhaXQgZ2V0U3Bhd25lZFJlc3VsdChzcGF3bmVkLCBwYXJzZWQub3B0aW9ucywgcHJvY2Vzc0RvbmUpO1xuXHRcdGNvbnN0IHN0ZG91dCA9IGhhbmRsZU91dHB1dChwYXJzZWQub3B0aW9ucywgc3Rkb3V0UmVzdWx0KTtcblx0XHRjb25zdCBzdGRlcnIgPSBoYW5kbGVPdXRwdXQocGFyc2VkLm9wdGlvbnMsIHN0ZGVyclJlc3VsdCk7XG5cdFx0Y29uc3QgYWxsID0gaGFuZGxlT3V0cHV0KHBhcnNlZC5vcHRpb25zLCBhbGxSZXN1bHQpO1xuXG5cdFx0aWYgKGVycm9yIHx8IGV4aXRDb2RlICE9PSAwIHx8IHNpZ25hbCAhPT0gbnVsbCkge1xuXHRcdFx0Y29uc3QgcmV0dXJuZWRFcnJvciA9IG1ha2VFcnJvcih7XG5cdFx0XHRcdGVycm9yLFxuXHRcdFx0XHRleGl0Q29kZSxcblx0XHRcdFx0c2lnbmFsLFxuXHRcdFx0XHRzdGRvdXQsXG5cdFx0XHRcdHN0ZGVycixcblx0XHRcdFx0YWxsLFxuXHRcdFx0XHRjb21tYW5kLFxuXHRcdFx0XHRlc2NhcGVkQ29tbWFuZCxcblx0XHRcdFx0cGFyc2VkLFxuXHRcdFx0XHR0aW1lZE91dCxcblx0XHRcdFx0aXNDYW5jZWxlZDogY29udGV4dC5pc0NhbmNlbGVkLFxuXHRcdFx0XHRraWxsZWQ6IHNwYXduZWQua2lsbGVkXG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKCFwYXJzZWQub3B0aW9ucy5yZWplY3QpIHtcblx0XHRcdFx0cmV0dXJuIHJldHVybmVkRXJyb3I7XG5cdFx0XHR9XG5cblx0XHRcdHRocm93IHJldHVybmVkRXJyb3I7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGNvbW1hbmQsXG5cdFx0XHRlc2NhcGVkQ29tbWFuZCxcblx0XHRcdGV4aXRDb2RlOiAwLFxuXHRcdFx0c3Rkb3V0LFxuXHRcdFx0c3RkZXJyLFxuXHRcdFx0YWxsLFxuXHRcdFx0ZmFpbGVkOiBmYWxzZSxcblx0XHRcdHRpbWVkT3V0OiBmYWxzZSxcblx0XHRcdGlzQ2FuY2VsZWQ6IGZhbHNlLFxuXHRcdFx0a2lsbGVkOiBmYWxzZVxuXHRcdH07XG5cdH07XG5cblx0Y29uc3QgaGFuZGxlUHJvbWlzZU9uY2UgPSBvbmV0aW1lKGhhbmRsZVByb21pc2UpO1xuXG5cdGhhbmRsZUlucHV0KHNwYXduZWQsIHBhcnNlZC5vcHRpb25zLmlucHV0KTtcblxuXHRzcGF3bmVkLmFsbCA9IG1ha2VBbGxTdHJlYW0oc3Bhd25lZCwgcGFyc2VkLm9wdGlvbnMpO1xuXG5cdHJldHVybiBtZXJnZVByb21pc2Uoc3Bhd25lZCwgaGFuZGxlUHJvbWlzZU9uY2UpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBleGVjYTtcblxubW9kdWxlLmV4cG9ydHMuc3luYyA9IChmaWxlLCBhcmdzLCBvcHRpb25zKSA9PiB7XG5cdGNvbnN0IHBhcnNlZCA9IGhhbmRsZUFyZ3VtZW50cyhmaWxlLCBhcmdzLCBvcHRpb25zKTtcblx0Y29uc3QgY29tbWFuZCA9IGpvaW5Db21tYW5kKGZpbGUsIGFyZ3MpO1xuXHRjb25zdCBlc2NhcGVkQ29tbWFuZCA9IGdldEVzY2FwZWRDb21tYW5kKGZpbGUsIGFyZ3MpO1xuXG5cdHZhbGlkYXRlSW5wdXRTeW5jKHBhcnNlZC5vcHRpb25zKTtcblxuXHRsZXQgcmVzdWx0O1xuXHR0cnkge1xuXHRcdHJlc3VsdCA9IGNoaWxkUHJvY2Vzcy5zcGF3blN5bmMocGFyc2VkLmZpbGUsIHBhcnNlZC5hcmdzLCBwYXJzZWQub3B0aW9ucyk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0dGhyb3cgbWFrZUVycm9yKHtcblx0XHRcdGVycm9yLFxuXHRcdFx0c3Rkb3V0OiAnJyxcblx0XHRcdHN0ZGVycjogJycsXG5cdFx0XHRhbGw6ICcnLFxuXHRcdFx0Y29tbWFuZCxcblx0XHRcdGVzY2FwZWRDb21tYW5kLFxuXHRcdFx0cGFyc2VkLFxuXHRcdFx0dGltZWRPdXQ6IGZhbHNlLFxuXHRcdFx0aXNDYW5jZWxlZDogZmFsc2UsXG5cdFx0XHRraWxsZWQ6IGZhbHNlXG5cdFx0fSk7XG5cdH1cblxuXHRjb25zdCBzdGRvdXQgPSBoYW5kbGVPdXRwdXQocGFyc2VkLm9wdGlvbnMsIHJlc3VsdC5zdGRvdXQsIHJlc3VsdC5lcnJvcik7XG5cdGNvbnN0IHN0ZGVyciA9IGhhbmRsZU91dHB1dChwYXJzZWQub3B0aW9ucywgcmVzdWx0LnN0ZGVyciwgcmVzdWx0LmVycm9yKTtcblxuXHRpZiAocmVzdWx0LmVycm9yIHx8IHJlc3VsdC5zdGF0dXMgIT09IDAgfHwgcmVzdWx0LnNpZ25hbCAhPT0gbnVsbCkge1xuXHRcdGNvbnN0IGVycm9yID0gbWFrZUVycm9yKHtcblx0XHRcdHN0ZG91dCxcblx0XHRcdHN0ZGVycixcblx0XHRcdGVycm9yOiByZXN1bHQuZXJyb3IsXG5cdFx0XHRzaWduYWw6IHJlc3VsdC5zaWduYWwsXG5cdFx0XHRleGl0Q29kZTogcmVzdWx0LnN0YXR1cyxcblx0XHRcdGNvbW1hbmQsXG5cdFx0XHRlc2NhcGVkQ29tbWFuZCxcblx0XHRcdHBhcnNlZCxcblx0XHRcdHRpbWVkT3V0OiByZXN1bHQuZXJyb3IgJiYgcmVzdWx0LmVycm9yLmNvZGUgPT09ICdFVElNRURPVVQnLFxuXHRcdFx0aXNDYW5jZWxlZDogZmFsc2UsXG5cdFx0XHRraWxsZWQ6IHJlc3VsdC5zaWduYWwgIT09IG51bGxcblx0XHR9KTtcblxuXHRcdGlmICghcGFyc2VkLm9wdGlvbnMucmVqZWN0KSB7XG5cdFx0XHRyZXR1cm4gZXJyb3I7XG5cdFx0fVxuXG5cdFx0dGhyb3cgZXJyb3I7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGNvbW1hbmQsXG5cdFx0ZXNjYXBlZENvbW1hbmQsXG5cdFx0ZXhpdENvZGU6IDAsXG5cdFx0c3Rkb3V0LFxuXHRcdHN0ZGVycixcblx0XHRmYWlsZWQ6IGZhbHNlLFxuXHRcdHRpbWVkT3V0OiBmYWxzZSxcblx0XHRpc0NhbmNlbGVkOiBmYWxzZSxcblx0XHRraWxsZWQ6IGZhbHNlXG5cdH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5jb21tYW5kID0gKGNvbW1hbmQsIG9wdGlvbnMpID0+IHtcblx0Y29uc3QgW2ZpbGUsIC4uLmFyZ3NdID0gcGFyc2VDb21tYW5kKGNvbW1hbmQpO1xuXHRyZXR1cm4gZXhlY2EoZmlsZSwgYXJncywgb3B0aW9ucyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5jb21tYW5kU3luYyA9IChjb21tYW5kLCBvcHRpb25zKSA9PiB7XG5cdGNvbnN0IFtmaWxlLCAuLi5hcmdzXSA9IHBhcnNlQ29tbWFuZChjb21tYW5kKTtcblx0cmV0dXJuIGV4ZWNhLnN5bmMoZmlsZSwgYXJncywgb3B0aW9ucyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5ub2RlID0gKHNjcmlwdFBhdGgsIGFyZ3MsIG9wdGlvbnMgPSB7fSkgPT4ge1xuXHRpZiAoYXJncyAmJiAhQXJyYXkuaXNBcnJheShhcmdzKSAmJiB0eXBlb2YgYXJncyA9PT0gJ29iamVjdCcpIHtcblx0XHRvcHRpb25zID0gYXJncztcblx0XHRhcmdzID0gW107XG5cdH1cblxuXHRjb25zdCBzdGRpbyA9IG5vcm1hbGl6ZVN0ZGlvLm5vZGUob3B0aW9ucyk7XG5cdGNvbnN0IGRlZmF1bHRFeGVjQXJndiA9IHByb2Nlc3MuZXhlY0FyZ3YuZmlsdGVyKGFyZyA9PiAhYXJnLnN0YXJ0c1dpdGgoJy0taW5zcGVjdCcpKTtcblxuXHRjb25zdCB7XG5cdFx0bm9kZVBhdGggPSBwcm9jZXNzLmV4ZWNQYXRoLFxuXHRcdG5vZGVPcHRpb25zID0gZGVmYXVsdEV4ZWNBcmd2XG5cdH0gPSBvcHRpb25zO1xuXG5cdHJldHVybiBleGVjYShcblx0XHRub2RlUGF0aCxcblx0XHRbXG5cdFx0XHQuLi5ub2RlT3B0aW9ucyxcblx0XHRcdHNjcmlwdFBhdGgsXG5cdFx0XHQuLi4oQXJyYXkuaXNBcnJheShhcmdzKSA/IGFyZ3MgOiBbXSlcblx0XHRdLFxuXHRcdHtcblx0XHRcdC4uLm9wdGlvbnMsXG5cdFx0XHRzdGRpbjogdW5kZWZpbmVkLFxuXHRcdFx0c3Rkb3V0OiB1bmRlZmluZWQsXG5cdFx0XHRzdGRlcnI6IHVuZGVmaW5lZCxcblx0XHRcdHN0ZGlvLFxuXHRcdFx0c2hlbGw6IGZhbHNlXG5cdFx0fVxuXHQpO1xufTtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFuc2lSZWdleCh7b25seUZpcnN0ID0gZmFsc2V9ID0ge30pIHtcblx0Y29uc3QgcGF0dGVybiA9IFtcblx0ICAgICdbXFxcXHUwMDFCXFxcXHUwMDlCXVtbXFxcXF0oKSM7P10qKD86KD86KD86KD86O1stYS16QS1aXFxcXGRcXFxcLyMmLjo9PyVAfl9dKykqfFthLXpBLVpcXFxcZF0rKD86O1stYS16QS1aXFxcXGRcXFxcLyMmLjo9PyVAfl9dKikqKT9cXFxcdTAwMDcpJyxcblx0XHQnKD86KD86XFxcXGR7MSw0fSg/OjtcXFxcZHswLDR9KSopP1tcXFxcZEEtUFItVFpjZi1udHFyeT0+PH5dKSknXG5cdF0uam9pbignfCcpO1xuXG5cdHJldHVybiBuZXcgUmVnRXhwKHBhdHRlcm4sIG9ubHlGaXJzdCA/IHVuZGVmaW5lZCA6ICdnJyk7XG59XG4iLCJpbXBvcnQgYW5zaVJlZ2V4IGZyb20gJ2Fuc2ktcmVnZXgnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdHJpcEFuc2koc3RyaW5nKSB7XG5cdGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGEgXFxgc3RyaW5nXFxgLCBnb3QgXFxgJHt0eXBlb2Ygc3RyaW5nfVxcYGApO1xuXHR9XG5cblx0cmV0dXJuIHN0cmluZy5yZXBsYWNlKGFuc2lSZWdleCgpLCAnJyk7XG59XG4iLCJpbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHt1c2VySW5mb30gZnJvbSAnbm9kZTpvcyc7XG5cbmV4cG9ydCBjb25zdCBkZXRlY3REZWZhdWx0U2hlbGwgPSAoKSA9PiB7XG5cdGNvbnN0IHtlbnZ9ID0gcHJvY2VzcztcblxuXHRpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuXHRcdHJldHVybiBlbnYuQ09NU1BFQyB8fCAnY21kLmV4ZSc7XG5cdH1cblxuXHR0cnkge1xuXHRcdGNvbnN0IHtzaGVsbH0gPSB1c2VySW5mbygpO1xuXHRcdGlmIChzaGVsbCkge1xuXHRcdFx0cmV0dXJuIHNoZWxsO1xuXHRcdH1cblx0fSBjYXRjaCB7fVxuXG5cdGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJykge1xuXHRcdHJldHVybiBlbnYuU0hFTEwgfHwgJy9iaW4venNoJztcblx0fVxuXG5cdHJldHVybiBlbnYuU0hFTEwgfHwgJy9iaW4vc2gnO1xufTtcblxuLy8gU3RvcmVzIGRlZmF1bHQgc2hlbGwgd2hlbiBpbXBvcnRlZC5cbmNvbnN0IGRlZmF1bHRTaGVsbCA9IGRldGVjdERlZmF1bHRTaGVsbCgpO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZhdWx0U2hlbGw7XG4iLCJpbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IGV4ZWNhIGZyb20gJ2V4ZWNhJztcbmltcG9ydCBzdHJpcEFuc2kgZnJvbSAnc3RyaXAtYW5zaSc7XG5pbXBvcnQgZGVmYXVsdFNoZWxsIGZyb20gJ2RlZmF1bHQtc2hlbGwnO1xuXG5jb25zdCBhcmdzID0gW1xuXHQnLWlsYycsXG5cdCdlY2hvIC1uIFwiX1NIRUxMX0VOVl9ERUxJTUlURVJfXCI7IGVudjsgZWNobyAtbiBcIl9TSEVMTF9FTlZfREVMSU1JVEVSX1wiOyBleGl0Jyxcbl07XG5cbmNvbnN0IGVudiA9IHtcblx0Ly8gRGlzYWJsZXMgT2ggTXkgWnNoIGF1dG8tdXBkYXRlIHRoaW5nIHRoYXQgY2FuIGJsb2NrIHRoZSBwcm9jZXNzLlxuXHRESVNBQkxFX0FVVE9fVVBEQVRFOiAndHJ1ZScsXG59O1xuXG5jb25zdCBwYXJzZUVudiA9IGVudiA9PiB7XG5cdGVudiA9IGVudi5zcGxpdCgnX1NIRUxMX0VOVl9ERUxJTUlURVJfJylbMV07XG5cdGNvbnN0IHJldHVyblZhbHVlID0ge307XG5cblx0Zm9yIChjb25zdCBsaW5lIG9mIHN0cmlwQW5zaShlbnYpLnNwbGl0KCdcXG4nKS5maWx0ZXIobGluZSA9PiBCb29sZWFuKGxpbmUpKSkge1xuXHRcdGNvbnN0IFtrZXksIC4uLnZhbHVlc10gPSBsaW5lLnNwbGl0KCc9Jyk7XG5cdFx0cmV0dXJuVmFsdWVba2V5XSA9IHZhbHVlcy5qb2luKCc9Jyk7XG5cdH1cblxuXHRyZXR1cm4gcmV0dXJuVmFsdWU7XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2hlbGxFbnYoc2hlbGwpIHtcblx0aWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcblx0XHRyZXR1cm4gcHJvY2Vzcy5lbnY7XG5cdH1cblxuXHR0cnkge1xuXHRcdGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgZXhlY2Eoc2hlbGwgfHwgZGVmYXVsdFNoZWxsLCBhcmdzLCB7ZW52fSk7XG5cdFx0cmV0dXJuIHBhcnNlRW52KHN0ZG91dCk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0aWYgKHNoZWxsKSB7XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHByb2Nlc3MuZW52O1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hlbGxFbnZTeW5jKHNoZWxsKSB7XG5cdGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG5cdFx0cmV0dXJuIHByb2Nlc3MuZW52O1xuXHR9XG5cblx0dHJ5IHtcblx0XHRjb25zdCB7c3Rkb3V0fSA9IGV4ZWNhLnN5bmMoc2hlbGwgfHwgZGVmYXVsdFNoZWxsLCBhcmdzLCB7ZW52fSk7XG5cdFx0cmV0dXJuIHBhcnNlRW52KHN0ZG91dCk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0aWYgKHNoZWxsKSB7XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHByb2Nlc3MuZW52O1xuXHRcdH1cblx0fVxufVxuIiwiaW1wb3J0IHtzaGVsbEVudiwgc2hlbGxFbnZTeW5jfSBmcm9tICdzaGVsbC1lbnYnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2hlbGxQYXRoKCkge1xuXHRjb25zdCB7UEFUSH0gPSBhd2FpdCBzaGVsbEVudigpO1xuXHRyZXR1cm4gUEFUSDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNoZWxsUGF0aFN5bmMoKSB7XG5cdGNvbnN0IHtQQVRIfSA9IHNoZWxsRW52U3luYygpO1xuXHRyZXR1cm4gUEFUSDtcbn1cbiIsImltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQge3NoZWxsUGF0aFN5bmN9IGZyb20gJ3NoZWxsLXBhdGgnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmaXhQYXRoKCkge1xuXHRpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdHByb2Nlc3MuZW52LlBBVEggPSBzaGVsbFBhdGhTeW5jKCkgfHwgW1xuXHRcdCcuL25vZGVfbW9kdWxlcy8uYmluJyxcblx0XHQnLy5ub2RlYnJldy9jdXJyZW50L2JpbicsXG5cdFx0Jy91c3IvbG9jYWwvYmluJyxcblx0XHRwcm9jZXNzLmVudi5QQVRILFxuXHRdLmpvaW4oJzonKTtcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnc3RyZWFtJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIF90b1Byb3BlcnR5S2V5KGRlc2NyaXB0b3Iua2V5KSwgZGVzY3JpcHRvcik7IH0gfVxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHsgd3JpdGFibGU6IGZhbHNlIH0pOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KGFyZykgeyB2YXIga2V5ID0gX3RvUHJpbWl0aXZlKGFyZywgXCJzdHJpbmdcIik7IHJldHVybiB0eXBlb2Yga2V5ID09PSBcInN5bWJvbFwiID8ga2V5IDogU3RyaW5nKGtleSk7IH1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZShpbnB1dCwgaGludCkgeyBpZiAodHlwZW9mIGlucHV0ICE9PSBcIm9iamVjdFwiIHx8IGlucHV0ID09PSBudWxsKSByZXR1cm4gaW5wdXQ7IHZhciBwcmltID0gaW5wdXRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHByaW0gIT09IHVuZGVmaW5lZCkgeyB2YXIgcmVzID0gcHJpbS5jYWxsKGlucHV0LCBoaW50IHx8IFwiZGVmYXVsdFwiKTsgaWYgKHR5cGVvZiByZXMgIT09IFwib2JqZWN0XCIpIHJldHVybiByZXM7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKGhpbnQgPT09IFwic3RyaW5nXCIgPyBTdHJpbmcgOiBOdW1iZXIpKGlucHV0KTsgfVxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnYnVmZmVyJyksXG4gIEJ1ZmZlciA9IF9yZXF1aXJlLkJ1ZmZlcjtcbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCd1dGlsJyksXG4gIGluc3BlY3QgPSBfcmVxdWlyZTIuaW5zcGVjdDtcbnZhciBjdXN0b20gPSBpbnNwZWN0ICYmIGluc3BlY3QuY3VzdG9tIHx8ICdpbnNwZWN0JztcbmZ1bmN0aW9uIGNvcHlCdWZmZXIoc3JjLCB0YXJnZXQsIG9mZnNldCkge1xuICBCdWZmZXIucHJvdG90eXBlLmNvcHkuY2FsbChzcmMsIHRhcmdldCwgb2Zmc2V0KTtcbn1cbm1vZHVsZS5leHBvcnRzID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQnVmZmVyTGlzdCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQnVmZmVyTGlzdCk7XG4gICAgdGhpcy5oZWFkID0gbnVsbDtcbiAgICB0aGlzLnRhaWwgPSBudWxsO1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgfVxuICBfY3JlYXRlQ2xhc3MoQnVmZmVyTGlzdCwgW3tcbiAgICBrZXk6IFwicHVzaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwdXNoKHYpIHtcbiAgICAgIHZhciBlbnRyeSA9IHtcbiAgICAgICAgZGF0YTogdixcbiAgICAgICAgbmV4dDogbnVsbFxuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLmxlbmd0aCA+IDApIHRoaXMudGFpbC5uZXh0ID0gZW50cnk7ZWxzZSB0aGlzLmhlYWQgPSBlbnRyeTtcbiAgICAgIHRoaXMudGFpbCA9IGVudHJ5O1xuICAgICAgKyt0aGlzLmxlbmd0aDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidW5zaGlmdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bnNoaWZ0KHYpIHtcbiAgICAgIHZhciBlbnRyeSA9IHtcbiAgICAgICAgZGF0YTogdixcbiAgICAgICAgbmV4dDogdGhpcy5oZWFkXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSB0aGlzLnRhaWwgPSBlbnRyeTtcbiAgICAgIHRoaXMuaGVhZCA9IGVudHJ5O1xuICAgICAgKyt0aGlzLmxlbmd0aDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2hpZnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hpZnQoKSB7XG4gICAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgIHZhciByZXQgPSB0aGlzLmhlYWQuZGF0YTtcbiAgICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSkgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbDtlbHNlIHRoaXMuaGVhZCA9IHRoaXMuaGVhZC5uZXh0O1xuICAgICAgLS10aGlzLmxlbmd0aDtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNsZWFyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbDtcbiAgICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiam9pblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBqb2luKHMpIHtcbiAgICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuICAgICAgdmFyIHAgPSB0aGlzLmhlYWQ7XG4gICAgICB2YXIgcmV0ID0gJycgKyBwLmRhdGE7XG4gICAgICB3aGlsZSAocCA9IHAubmV4dCkgcmV0ICs9IHMgKyBwLmRhdGE7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb25jYXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29uY2F0KG4pIHtcbiAgICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKTtcbiAgICAgIHZhciByZXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUobiA+Pj4gMCk7XG4gICAgICB2YXIgcCA9IHRoaXMuaGVhZDtcbiAgICAgIHZhciBpID0gMDtcbiAgICAgIHdoaWxlIChwKSB7XG4gICAgICAgIGNvcHlCdWZmZXIocC5kYXRhLCByZXQsIGkpO1xuICAgICAgICBpICs9IHAuZGF0YS5sZW5ndGg7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIC8vIENvbnN1bWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBieXRlcyBvciBjaGFyYWN0ZXJzIGZyb20gdGhlIGJ1ZmZlcmVkIGRhdGEuXG4gIH0sIHtcbiAgICBrZXk6IFwiY29uc3VtZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb25zdW1lKG4sIGhhc1N0cmluZ3MpIHtcbiAgICAgIHZhciByZXQ7XG4gICAgICBpZiAobiA8IHRoaXMuaGVhZC5kYXRhLmxlbmd0aCkge1xuICAgICAgICAvLyBgc2xpY2VgIGlzIHRoZSBzYW1lIGZvciBidWZmZXJzIGFuZCBzdHJpbmdzLlxuICAgICAgICByZXQgPSB0aGlzLmhlYWQuZGF0YS5zbGljZSgwLCBuKTtcbiAgICAgICAgdGhpcy5oZWFkLmRhdGEgPSB0aGlzLmhlYWQuZGF0YS5zbGljZShuKTtcbiAgICAgIH0gZWxzZSBpZiAobiA9PT0gdGhpcy5oZWFkLmRhdGEubGVuZ3RoKSB7XG4gICAgICAgIC8vIEZpcnN0IGNodW5rIGlzIGEgcGVyZmVjdCBtYXRjaC5cbiAgICAgICAgcmV0ID0gdGhpcy5zaGlmdCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVzdWx0IHNwYW5zIG1vcmUgdGhhbiBvbmUgYnVmZmVyLlxuICAgICAgICByZXQgPSBoYXNTdHJpbmdzID8gdGhpcy5fZ2V0U3RyaW5nKG4pIDogdGhpcy5fZ2V0QnVmZmVyKG4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZmlyc3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZmlyc3QoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oZWFkLmRhdGE7XG4gICAgfVxuXG4gICAgLy8gQ29uc3VtZXMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgYnVmZmVyZWQgZGF0YS5cbiAgfSwge1xuICAgIGtleTogXCJfZ2V0U3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9nZXRTdHJpbmcobikge1xuICAgICAgdmFyIHAgPSB0aGlzLmhlYWQ7XG4gICAgICB2YXIgYyA9IDE7XG4gICAgICB2YXIgcmV0ID0gcC5kYXRhO1xuICAgICAgbiAtPSByZXQubGVuZ3RoO1xuICAgICAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICAgICAgdmFyIHN0ciA9IHAuZGF0YTtcbiAgICAgICAgdmFyIG5iID0gbiA+IHN0ci5sZW5ndGggPyBzdHIubGVuZ3RoIDogbjtcbiAgICAgICAgaWYgKG5iID09PSBzdHIubGVuZ3RoKSByZXQgKz0gc3RyO2Vsc2UgcmV0ICs9IHN0ci5zbGljZSgwLCBuKTtcbiAgICAgICAgbiAtPSBuYjtcbiAgICAgICAgaWYgKG4gPT09IDApIHtcbiAgICAgICAgICBpZiAobmIgPT09IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgICAgICsrYztcbiAgICAgICAgICAgIGlmIChwLm5leHQpIHRoaXMuaGVhZCA9IHAubmV4dDtlbHNlIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGVhZCA9IHA7XG4gICAgICAgICAgICBwLmRhdGEgPSBzdHIuc2xpY2UobmIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICArK2M7XG4gICAgICB9XG4gICAgICB0aGlzLmxlbmd0aCAtPSBjO1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICAvLyBDb25zdW1lcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgYnl0ZXMgZnJvbSB0aGUgYnVmZmVyZWQgZGF0YS5cbiAgfSwge1xuICAgIGtleTogXCJfZ2V0QnVmZmVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9nZXRCdWZmZXIobikge1xuICAgICAgdmFyIHJldCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShuKTtcbiAgICAgIHZhciBwID0gdGhpcy5oZWFkO1xuICAgICAgdmFyIGMgPSAxO1xuICAgICAgcC5kYXRhLmNvcHkocmV0KTtcbiAgICAgIG4gLT0gcC5kYXRhLmxlbmd0aDtcbiAgICAgIHdoaWxlIChwID0gcC5uZXh0KSB7XG4gICAgICAgIHZhciBidWYgPSBwLmRhdGE7XG4gICAgICAgIHZhciBuYiA9IG4gPiBidWYubGVuZ3RoID8gYnVmLmxlbmd0aCA6IG47XG4gICAgICAgIGJ1Zi5jb3B5KHJldCwgcmV0Lmxlbmd0aCAtIG4sIDAsIG5iKTtcbiAgICAgICAgbiAtPSBuYjtcbiAgICAgICAgaWYgKG4gPT09IDApIHtcbiAgICAgICAgICBpZiAobmIgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICAgICAgICAgICsrYztcbiAgICAgICAgICAgIGlmIChwLm5leHQpIHRoaXMuaGVhZCA9IHAubmV4dDtlbHNlIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGVhZCA9IHA7XG4gICAgICAgICAgICBwLmRhdGEgPSBidWYuc2xpY2UobmIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICArK2M7XG4gICAgICB9XG4gICAgICB0aGlzLmxlbmd0aCAtPSBjO1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICAvLyBNYWtlIHN1cmUgdGhlIGxpbmtlZCBsaXN0IG9ubHkgc2hvd3MgdGhlIG1pbmltYWwgbmVjZXNzYXJ5IGluZm9ybWF0aW9uLlxuICB9LCB7XG4gICAga2V5OiBjdXN0b20sXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKF8sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBpbnNwZWN0KHRoaXMsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb3B0aW9ucyksIHt9LCB7XG4gICAgICAgIC8vIE9ubHkgaW5zcGVjdCBvbmUgbGV2ZWwuXG4gICAgICAgIGRlcHRoOiAwLFxuICAgICAgICAvLyBJdCBzaG91bGQgbm90IHJlY3Vyc2UuXG4gICAgICAgIGN1c3RvbUluc3BlY3Q6IGZhbHNlXG4gICAgICB9KSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBCdWZmZXJMaXN0O1xufSgpOyIsIid1c2Ugc3RyaWN0JztcblxuLy8gdW5kb2N1bWVudGVkIGNiKCkgQVBJLCBuZWVkZWQgZm9yIGNvcmUsIG5vdCBmb3IgcHVibGljIEFQSVxuZnVuY3Rpb24gZGVzdHJveShlcnIsIGNiKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG4gIHZhciByZWFkYWJsZURlc3Ryb3llZCA9IHRoaXMuX3JlYWRhYmxlU3RhdGUgJiYgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ7XG4gIHZhciB3cml0YWJsZURlc3Ryb3llZCA9IHRoaXMuX3dyaXRhYmxlU3RhdGUgJiYgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ7XG4gIGlmIChyZWFkYWJsZURlc3Ryb3llZCB8fCB3cml0YWJsZURlc3Ryb3llZCkge1xuICAgIGlmIChjYikge1xuICAgICAgY2IoZXJyKTtcbiAgICB9IGVsc2UgaWYgKGVycikge1xuICAgICAgaWYgKCF0aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdEVycm9yTlQsIHRoaXMsIGVycik7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCkge1xuICAgICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdEVycm9yTlQsIHRoaXMsIGVycik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gd2Ugc2V0IGRlc3Ryb3llZCB0byB0cnVlIGJlZm9yZSBmaXJpbmcgZXJyb3IgY2FsbGJhY2tzIGluIG9yZGVyXG4gIC8vIHRvIG1ha2UgaXQgcmUtZW50cmFuY2Ugc2FmZSBpbiBjYXNlIGRlc3Ryb3koKSBpcyBjYWxsZWQgd2l0aGluIGNhbGxiYWNrc1xuXG4gIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB0cnVlO1xuICB9XG5cbiAgLy8gaWYgdGhpcyBpcyBhIGR1cGxleCBzdHJlYW0gbWFyayB0aGUgd3JpdGFibGUgcGFydCBhcyBkZXN0cm95ZWQgYXMgd2VsbFxuICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gdHJ1ZTtcbiAgfVxuICB0aGlzLl9kZXN0cm95KGVyciB8fCBudWxsLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKCFjYiAmJiBlcnIpIHtcbiAgICAgIGlmICghX3RoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0RXJyb3JBbmRDbG9zZU5ULCBfdGhpcywgZXJyKTtcbiAgICAgIH0gZWxzZSBpZiAoIV90aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCkge1xuICAgICAgICBfdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGVtaXRFcnJvckFuZENsb3NlTlQsIF90aGlzLCBlcnIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2VOVCwgX3RoaXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2IpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdENsb3NlTlQsIF90aGlzKTtcbiAgICAgIGNiKGVycik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdENsb3NlTlQsIF90aGlzKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gdGhpcztcbn1cbmZ1bmN0aW9uIGVtaXRFcnJvckFuZENsb3NlTlQoc2VsZiwgZXJyKSB7XG4gIGVtaXRFcnJvck5UKHNlbGYsIGVycik7XG4gIGVtaXRDbG9zZU5UKHNlbGYpO1xufVxuZnVuY3Rpb24gZW1pdENsb3NlTlQoc2VsZikge1xuICBpZiAoc2VsZi5fd3JpdGFibGVTdGF0ZSAmJiAhc2VsZi5fd3JpdGFibGVTdGF0ZS5lbWl0Q2xvc2UpIHJldHVybjtcbiAgaWYgKHNlbGYuX3JlYWRhYmxlU3RhdGUgJiYgIXNlbGYuX3JlYWRhYmxlU3RhdGUuZW1pdENsb3NlKSByZXR1cm47XG4gIHNlbGYuZW1pdCgnY2xvc2UnKTtcbn1cbmZ1bmN0aW9uIHVuZGVzdHJveSgpIHtcbiAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQgPSBmYWxzZTtcbiAgfVxuICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kaW5nID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5hbENhbGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUucHJlZmluaXNoZWQgPSBmYWxzZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmZpbmlzaGVkID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gZW1pdEVycm9yTlQoc2VsZiwgZXJyKSB7XG4gIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpO1xufVxuZnVuY3Rpb24gZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcnIpIHtcbiAgLy8gV2UgaGF2ZSB0ZXN0cyB0aGF0IHJlbHkgb24gZXJyb3JzIGJlaW5nIGVtaXR0ZWRcbiAgLy8gaW4gdGhlIHNhbWUgdGljaywgc28gY2hhbmdpbmcgdGhpcyBpcyBzZW12ZXIgbWFqb3IuXG4gIC8vIEZvciBub3cgd2hlbiB5b3Ugb3B0LWluIHRvIGF1dG9EZXN0cm95IHdlIGFsbG93XG4gIC8vIHRoZSBlcnJvciB0byBiZSBlbWl0dGVkIG5leHRUaWNrLiBJbiBhIGZ1dHVyZVxuICAvLyBzZW12ZXIgbWFqb3IgdXBkYXRlIHdlIHNob3VsZCBjaGFuZ2UgdGhlIGRlZmF1bHQgdG8gdGhpcy5cblxuICB2YXIgclN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgd1N0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuICBpZiAoclN0YXRlICYmIHJTdGF0ZS5hdXRvRGVzdHJveSB8fCB3U3RhdGUgJiYgd1N0YXRlLmF1dG9EZXN0cm95KSBzdHJlYW0uZGVzdHJveShlcnIpO2Vsc2Ugc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKTtcbn1cbm1vZHVsZS5leHBvcnRzID0ge1xuICBkZXN0cm95OiBkZXN0cm95LFxuICB1bmRlc3Ryb3k6IHVuZGVzdHJveSxcbiAgZXJyb3JPckRlc3Ryb3k6IGVycm9yT3JEZXN0cm95XG59OyIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgY29kZXMgPSB7fTtcblxuZnVuY3Rpb24gY3JlYXRlRXJyb3JUeXBlKGNvZGUsIG1lc3NhZ2UsIEJhc2UpIHtcbiAgaWYgKCFCYXNlKSB7XG4gICAgQmFzZSA9IEVycm9yXG4gIH1cblxuICBmdW5jdGlvbiBnZXRNZXNzYWdlIChhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG1lc3NhZ2VcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1lc3NhZ2UoYXJnMSwgYXJnMiwgYXJnMylcbiAgICB9XG4gIH1cblxuICBjbGFzcyBOb2RlRXJyb3IgZXh0ZW5kcyBCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgICAgc3VwZXIoZ2V0TWVzc2FnZShhcmcxLCBhcmcyLCBhcmczKSk7XG4gICAgfVxuICB9XG5cbiAgTm9kZUVycm9yLnByb3RvdHlwZS5uYW1lID0gQmFzZS5uYW1lO1xuICBOb2RlRXJyb3IucHJvdG90eXBlLmNvZGUgPSBjb2RlO1xuXG4gIGNvZGVzW2NvZGVdID0gTm9kZUVycm9yO1xufVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi92MTAuOC4wL2xpYi9pbnRlcm5hbC9lcnJvcnMuanNcbmZ1bmN0aW9uIG9uZU9mKGV4cGVjdGVkLCB0aGluZykge1xuICBpZiAoQXJyYXkuaXNBcnJheShleHBlY3RlZCkpIHtcbiAgICBjb25zdCBsZW4gPSBleHBlY3RlZC5sZW5ndGg7XG4gICAgZXhwZWN0ZWQgPSBleHBlY3RlZC5tYXAoKGkpID0+IFN0cmluZyhpKSk7XG4gICAgaWYgKGxlbiA+IDIpIHtcbiAgICAgIHJldHVybiBgb25lIG9mICR7dGhpbmd9ICR7ZXhwZWN0ZWQuc2xpY2UoMCwgbGVuIC0gMSkuam9pbignLCAnKX0sIG9yIGAgK1xuICAgICAgICAgICAgIGV4cGVjdGVkW2xlbiAtIDFdO1xuICAgIH0gZWxzZSBpZiAobGVuID09PSAyKSB7XG4gICAgICByZXR1cm4gYG9uZSBvZiAke3RoaW5nfSAke2V4cGVjdGVkWzBdfSBvciAke2V4cGVjdGVkWzFdfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgb2YgJHt0aGluZ30gJHtleHBlY3RlZFswXX1gO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYG9mICR7dGhpbmd9ICR7U3RyaW5nKGV4cGVjdGVkKX1gO1xuICB9XG59XG5cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1N0cmluZy9zdGFydHNXaXRoXG5mdW5jdGlvbiBzdGFydHNXaXRoKHN0ciwgc2VhcmNoLCBwb3MpIHtcblx0cmV0dXJuIHN0ci5zdWJzdHIoIXBvcyB8fCBwb3MgPCAwID8gMCA6ICtwb3MsIHNlYXJjaC5sZW5ndGgpID09PSBzZWFyY2g7XG59XG5cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1N0cmluZy9lbmRzV2l0aFxuZnVuY3Rpb24gZW5kc1dpdGgoc3RyLCBzZWFyY2gsIHRoaXNfbGVuKSB7XG5cdGlmICh0aGlzX2xlbiA9PT0gdW5kZWZpbmVkIHx8IHRoaXNfbGVuID4gc3RyLmxlbmd0aCkge1xuXHRcdHRoaXNfbGVuID0gc3RyLmxlbmd0aDtcblx0fVxuXHRyZXR1cm4gc3RyLnN1YnN0cmluZyh0aGlzX2xlbiAtIHNlYXJjaC5sZW5ndGgsIHRoaXNfbGVuKSA9PT0gc2VhcmNoO1xufVxuXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TdHJpbmcvaW5jbHVkZXNcbmZ1bmN0aW9uIGluY2x1ZGVzKHN0ciwgc2VhcmNoLCBzdGFydCkge1xuICBpZiAodHlwZW9mIHN0YXJ0ICE9PSAnbnVtYmVyJykge1xuICAgIHN0YXJ0ID0gMDtcbiAgfVxuXG4gIGlmIChzdGFydCArIHNlYXJjaC5sZW5ndGggPiBzdHIubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHIuaW5kZXhPZihzZWFyY2gsIHN0YXJ0KSAhPT0gLTE7XG4gIH1cbn1cblxuY3JlYXRlRXJyb3JUeXBlKCdFUlJfSU5WQUxJRF9PUFRfVkFMVUUnLCBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuICdUaGUgdmFsdWUgXCInICsgdmFsdWUgKyAnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwiJyArIG5hbWUgKyAnXCInXG59LCBUeXBlRXJyb3IpO1xuY3JlYXRlRXJyb3JUeXBlKCdFUlJfSU5WQUxJRF9BUkdfVFlQRScsIGZ1bmN0aW9uIChuYW1lLCBleHBlY3RlZCwgYWN0dWFsKSB7XG4gIC8vIGRldGVybWluZXI6ICdtdXN0IGJlJyBvciAnbXVzdCBub3QgYmUnXG4gIGxldCBkZXRlcm1pbmVyO1xuICBpZiAodHlwZW9mIGV4cGVjdGVkID09PSAnc3RyaW5nJyAmJiBzdGFydHNXaXRoKGV4cGVjdGVkLCAnbm90ICcpKSB7XG4gICAgZGV0ZXJtaW5lciA9ICdtdXN0IG5vdCBiZSc7XG4gICAgZXhwZWN0ZWQgPSBleHBlY3RlZC5yZXBsYWNlKC9ebm90IC8sICcnKTtcbiAgfSBlbHNlIHtcbiAgICBkZXRlcm1pbmVyID0gJ211c3QgYmUnO1xuICB9XG5cbiAgbGV0IG1zZztcbiAgaWYgKGVuZHNXaXRoKG5hbWUsICcgYXJndW1lbnQnKSkge1xuICAgIC8vIEZvciBjYXNlcyBsaWtlICdmaXJzdCBhcmd1bWVudCdcbiAgICBtc2cgPSBgVGhlICR7bmFtZX0gJHtkZXRlcm1pbmVyfSAke29uZU9mKGV4cGVjdGVkLCAndHlwZScpfWA7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgdHlwZSA9IGluY2x1ZGVzKG5hbWUsICcuJykgPyAncHJvcGVydHknIDogJ2FyZ3VtZW50JztcbiAgICBtc2cgPSBgVGhlIFwiJHtuYW1lfVwiICR7dHlwZX0gJHtkZXRlcm1pbmVyfSAke29uZU9mKGV4cGVjdGVkLCAndHlwZScpfWA7XG4gIH1cblxuICBtc2cgKz0gYC4gUmVjZWl2ZWQgdHlwZSAke3R5cGVvZiBhY3R1YWx9YDtcbiAgcmV0dXJuIG1zZztcbn0sIFR5cGVFcnJvcik7XG5jcmVhdGVFcnJvclR5cGUoJ0VSUl9TVFJFQU1fUFVTSF9BRlRFUl9FT0YnLCAnc3RyZWFtLnB1c2goKSBhZnRlciBFT0YnKTtcbmNyZWF0ZUVycm9yVHlwZSgnRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQnLCBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gJ1RoZSAnICsgbmFtZSArICcgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZCdcbn0pO1xuY3JlYXRlRXJyb3JUeXBlKCdFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRScsICdQcmVtYXR1cmUgY2xvc2UnKTtcbmNyZWF0ZUVycm9yVHlwZSgnRVJSX1NUUkVBTV9ERVNUUk9ZRUQnLCBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gJ0Nhbm5vdCBjYWxsICcgKyBuYW1lICsgJyBhZnRlciBhIHN0cmVhbSB3YXMgZGVzdHJveWVkJztcbn0pO1xuY3JlYXRlRXJyb3JUeXBlKCdFUlJfTVVMVElQTEVfQ0FMTEJBQ0snLCAnQ2FsbGJhY2sgY2FsbGVkIG11bHRpcGxlIHRpbWVzJyk7XG5jcmVhdGVFcnJvclR5cGUoJ0VSUl9TVFJFQU1fQ0FOTk9UX1BJUEUnLCAnQ2Fubm90IHBpcGUsIG5vdCByZWFkYWJsZScpO1xuY3JlYXRlRXJyb3JUeXBlKCdFUlJfU1RSRUFNX1dSSVRFX0FGVEVSX0VORCcsICd3cml0ZSBhZnRlciBlbmQnKTtcbmNyZWF0ZUVycm9yVHlwZSgnRVJSX1NUUkVBTV9OVUxMX1ZBTFVFUycsICdNYXkgbm90IHdyaXRlIG51bGwgdmFsdWVzIHRvIHN0cmVhbScsIFR5cGVFcnJvcik7XG5jcmVhdGVFcnJvclR5cGUoJ0VSUl9VTktOT1dOX0VOQ09ESU5HJywgZnVuY3Rpb24gKGFyZykge1xuICByZXR1cm4gJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBhcmdcbn0sIFR5cGVFcnJvcik7XG5jcmVhdGVFcnJvclR5cGUoJ0VSUl9TVFJFQU1fVU5TSElGVF9BRlRFUl9FTkRfRVZFTlQnLCAnc3RyZWFtLnVuc2hpZnQoKSBhZnRlciBlbmQgZXZlbnQnKTtcblxubW9kdWxlLmV4cG9ydHMuY29kZXMgPSBjb2RlcztcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEVSUl9JTlZBTElEX09QVF9WQUxVRSA9IHJlcXVpcmUoJy4uLy4uLy4uL2Vycm9ycycpLmNvZGVzLkVSUl9JTlZBTElEX09QVF9WQUxVRTtcbmZ1bmN0aW9uIGhpZ2hXYXRlck1hcmtGcm9tKG9wdGlvbnMsIGlzRHVwbGV4LCBkdXBsZXhLZXkpIHtcbiAgcmV0dXJuIG9wdGlvbnMuaGlnaFdhdGVyTWFyayAhPSBudWxsID8gb3B0aW9ucy5oaWdoV2F0ZXJNYXJrIDogaXNEdXBsZXggPyBvcHRpb25zW2R1cGxleEtleV0gOiBudWxsO1xufVxuZnVuY3Rpb24gZ2V0SGlnaFdhdGVyTWFyayhzdGF0ZSwgb3B0aW9ucywgZHVwbGV4S2V5LCBpc0R1cGxleCkge1xuICB2YXIgaHdtID0gaGlnaFdhdGVyTWFya0Zyb20ob3B0aW9ucywgaXNEdXBsZXgsIGR1cGxleEtleSk7XG4gIGlmIChod20gIT0gbnVsbCkge1xuICAgIGlmICghKGlzRmluaXRlKGh3bSkgJiYgTWF0aC5mbG9vcihod20pID09PSBod20pIHx8IGh3bSA8IDApIHtcbiAgICAgIHZhciBuYW1lID0gaXNEdXBsZXggPyBkdXBsZXhLZXkgOiAnaGlnaFdhdGVyTWFyayc7XG4gICAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfT1BUX1ZBTFVFKG5hbWUsIGh3bSk7XG4gICAgfVxuICAgIHJldHVybiBNYXRoLmZsb29yKGh3bSk7XG4gIH1cblxuICAvLyBEZWZhdWx0IHZhbHVlXG4gIHJldHVybiBzdGF0ZS5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0SGlnaFdhdGVyTWFyazogZ2V0SGlnaFdhdGVyTWFya1xufTsiLCJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBpZiAoc3VwZXJDdG9yKSB7XG4gICAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGlmIChzdXBlckN0b3IpIHtcbiAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZVxuICAgICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gICAgfVxuICB9XG59XG4iLCJ0cnkge1xuICB2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKHR5cGVvZiB1dGlsLmluaGVyaXRzICE9PSAnZnVuY3Rpb24nKSB0aHJvdyAnJztcbiAgbW9kdWxlLmV4cG9ydHMgPSB1dGlsLmluaGVyaXRzO1xufSBjYXRjaCAoZSkge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vaW5oZXJpdHNfYnJvd3Nlci5qcycpO1xufVxuIiwiXG4vKipcbiAqIEZvciBOb2RlLmpzLCBzaW1wbHkgcmUtZXhwb3J0IHRoZSBjb3JlIGB1dGlsLmRlcHJlY2F0ZWAgZnVuY3Rpb24uXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCd1dGlsJykuZGVwcmVjYXRlO1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIEEgYml0IHNpbXBsZXIgdGhhbiByZWFkYWJsZSBzdHJlYW1zLlxuLy8gSW1wbGVtZW50IGFuIGFzeW5jIC5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBjYiksIGFuZCBpdCdsbCBoYW5kbGUgYWxsXG4vLyB0aGUgZHJhaW4gZXZlbnQgZW1pc3Npb24gYW5kIGJ1ZmZlcmluZy5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdyaXRhYmxlO1xuXG4vKiA8cmVwbGFjZW1lbnQ+ICovXG5mdW5jdGlvbiBXcml0ZVJlcShjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRoaXMuY2h1bmsgPSBjaHVuaztcbiAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nO1xuICB0aGlzLmNhbGxiYWNrID0gY2I7XG4gIHRoaXMubmV4dCA9IG51bGw7XG59XG5cbi8vIEl0IHNlZW1zIGEgbGlua2VkIGxpc3QgYnV0IGl0IGlzIG5vdFxuLy8gdGhlcmUgd2lsbCBiZSBvbmx5IDIgb2YgdGhlc2UgZm9yIGVhY2ggc3RyZWFtXG5mdW5jdGlvbiBDb3JrZWRSZXF1ZXN0KHN0YXRlKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG4gIHRoaXMubmV4dCA9IG51bGw7XG4gIHRoaXMuZW50cnkgPSBudWxsO1xuICB0aGlzLmZpbmlzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICBvbkNvcmtlZEZpbmlzaChfdGhpcywgc3RhdGUpO1xuICB9O1xufVxuLyogPC9yZXBsYWNlbWVudD4gKi9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBEdXBsZXg7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuV3JpdGFibGUuV3JpdGFibGVTdGF0ZSA9IFdyaXRhYmxlU3RhdGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgaW50ZXJuYWxVdGlsID0ge1xuICBkZXByZWNhdGU6IHJlcXVpcmUoJ3V0aWwtZGVwcmVjYXRlJylcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvc3RyZWFtJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbnZhciBPdXJVaW50OEFycmF5ID0gKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDoge30pLlVpbnQ4QXJyYXkgfHwgZnVuY3Rpb24gKCkge307XG5mdW5jdGlvbiBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKSB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShjaHVuayk7XG59XG5mdW5jdGlvbiBfaXNVaW50OEFycmF5KG9iaikge1xuICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKG9iaikgfHwgb2JqIGluc3RhbmNlb2YgT3VyVWludDhBcnJheTtcbn1cbnZhciBkZXN0cm95SW1wbCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9kZXN0cm95Jyk7XG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvc3RhdGUnKSxcbiAgZ2V0SGlnaFdhdGVyTWFyayA9IF9yZXF1aXJlLmdldEhpZ2hXYXRlck1hcms7XG52YXIgX3JlcXVpcmUkY29kZXMgPSByZXF1aXJlKCcuLi9lcnJvcnMnKS5jb2RlcyxcbiAgRVJSX0lOVkFMSURfQVJHX1RZUEUgPSBfcmVxdWlyZSRjb2Rlcy5FUlJfSU5WQUxJRF9BUkdfVFlQRSxcbiAgRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQgPSBfcmVxdWlyZSRjb2Rlcy5FUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCxcbiAgRVJSX01VTFRJUExFX0NBTExCQUNLID0gX3JlcXVpcmUkY29kZXMuRVJSX01VTFRJUExFX0NBTExCQUNLLFxuICBFUlJfU1RSRUFNX0NBTk5PVF9QSVBFID0gX3JlcXVpcmUkY29kZXMuRVJSX1NUUkVBTV9DQU5OT1RfUElQRSxcbiAgRVJSX1NUUkVBTV9ERVNUUk9ZRUQgPSBfcmVxdWlyZSRjb2Rlcy5FUlJfU1RSRUFNX0RFU1RST1lFRCxcbiAgRVJSX1NUUkVBTV9OVUxMX1ZBTFVFUyA9IF9yZXF1aXJlJGNvZGVzLkVSUl9TVFJFQU1fTlVMTF9WQUxVRVMsXG4gIEVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5EID0gX3JlcXVpcmUkY29kZXMuRVJSX1NUUkVBTV9XUklURV9BRlRFUl9FTkQsXG4gIEVSUl9VTktOT1dOX0VOQ09ESU5HID0gX3JlcXVpcmUkY29kZXMuRVJSX1VOS05PV05fRU5DT0RJTkc7XG52YXIgZXJyb3JPckRlc3Ryb3kgPSBkZXN0cm95SW1wbC5lcnJvck9yRGVzdHJveTtcbnJlcXVpcmUoJ2luaGVyaXRzJykoV3JpdGFibGUsIFN0cmVhbSk7XG5mdW5jdGlvbiBub3AoKSB7fVxuZnVuY3Rpb24gV3JpdGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0sIGlzRHVwbGV4KSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIER1cGxleCBzdHJlYW1zIGFyZSBib3RoIHJlYWRhYmxlIGFuZCB3cml0YWJsZSwgYnV0IHNoYXJlXG4gIC8vIHRoZSBzYW1lIG9wdGlvbnMgb2JqZWN0LlxuICAvLyBIb3dldmVyLCBzb21lIGNhc2VzIHJlcXVpcmUgc2V0dGluZyBvcHRpb25zIHRvIGRpZmZlcmVudFxuICAvLyB2YWx1ZXMgZm9yIHRoZSByZWFkYWJsZSBhbmQgdGhlIHdyaXRhYmxlIHNpZGVzIG9mIHRoZSBkdXBsZXggc3RyZWFtLFxuICAvLyBlLmcuIG9wdGlvbnMucmVhZGFibGVPYmplY3RNb2RlIHZzLiBvcHRpb25zLndyaXRhYmxlT2JqZWN0TW9kZSwgZXRjLlxuICBpZiAodHlwZW9mIGlzRHVwbGV4ICE9PSAnYm9vbGVhbicpIGlzRHVwbGV4ID0gc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4O1xuXG4gIC8vIG9iamVjdCBzdHJlYW0gZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB0aGlzIHN0cmVhbVxuICAvLyBjb250YWlucyBidWZmZXJzIG9yIG9iamVjdHMuXG4gIHRoaXMub2JqZWN0TW9kZSA9ICEhb3B0aW9ucy5vYmplY3RNb2RlO1xuICBpZiAoaXNEdXBsZXgpIHRoaXMub2JqZWN0TW9kZSA9IHRoaXMub2JqZWN0TW9kZSB8fCAhIW9wdGlvbnMud3JpdGFibGVPYmplY3RNb2RlO1xuXG4gIC8vIHRoZSBwb2ludCBhdCB3aGljaCB3cml0ZSgpIHN0YXJ0cyByZXR1cm5pbmcgZmFsc2VcbiAgLy8gTm90ZTogMCBpcyBhIHZhbGlkIHZhbHVlLCBtZWFucyB0aGF0IHdlIGFsd2F5cyByZXR1cm4gZmFsc2UgaWZcbiAgLy8gdGhlIGVudGlyZSBidWZmZXIgaXMgbm90IGZsdXNoZWQgaW1tZWRpYXRlbHkgb24gd3JpdGUoKVxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBnZXRIaWdoV2F0ZXJNYXJrKHRoaXMsIG9wdGlvbnMsICd3cml0YWJsZUhpZ2hXYXRlck1hcmsnLCBpc0R1cGxleCk7XG5cbiAgLy8gaWYgX2ZpbmFsIGhhcyBiZWVuIGNhbGxlZFxuICB0aGlzLmZpbmFsQ2FsbGVkID0gZmFsc2U7XG5cbiAgLy8gZHJhaW4gZXZlbnQgZmxhZy5cbiAgdGhpcy5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgLy8gYXQgdGhlIHN0YXJ0IG9mIGNhbGxpbmcgZW5kKClcbiAgdGhpcy5lbmRpbmcgPSBmYWxzZTtcbiAgLy8gd2hlbiBlbmQoKSBoYXMgYmVlbiBjYWxsZWQsIGFuZCByZXR1cm5lZFxuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIC8vIHdoZW4gJ2ZpbmlzaCcgaXMgZW1pdHRlZFxuICB0aGlzLmZpbmlzaGVkID0gZmFsc2U7XG5cbiAgLy8gaGFzIGl0IGJlZW4gZGVzdHJveWVkXG4gIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG5cbiAgLy8gc2hvdWxkIHdlIGRlY29kZSBzdHJpbmdzIGludG8gYnVmZmVycyBiZWZvcmUgcGFzc2luZyB0byBfd3JpdGU/XG4gIC8vIHRoaXMgaXMgaGVyZSBzbyB0aGF0IHNvbWUgbm9kZS1jb3JlIHN0cmVhbXMgY2FuIG9wdGltaXplIHN0cmluZ1xuICAvLyBoYW5kbGluZyBhdCBhIGxvd2VyIGxldmVsLlxuICB2YXIgbm9EZWNvZGUgPSBvcHRpb25zLmRlY29kZVN0cmluZ3MgPT09IGZhbHNlO1xuICB0aGlzLmRlY29kZVN0cmluZ3MgPSAhbm9EZWNvZGU7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gbm90IGFuIGFjdHVhbCBidWZmZXIgd2Uga2VlcCB0cmFjayBvZiwgYnV0IGEgbWVhc3VyZW1lbnRcbiAgLy8gb2YgaG93IG11Y2ggd2UncmUgd2FpdGluZyB0byBnZXQgcHVzaGVkIHRvIHNvbWUgdW5kZXJseWluZ1xuICAvLyBzb2NrZXQgb3IgZmlsZS5cbiAgdGhpcy5sZW5ndGggPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBzZWUgd2hlbiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgd3JpdGUuXG4gIHRoaXMud3JpdGluZyA9IGZhbHNlO1xuXG4gIC8vIHdoZW4gdHJ1ZSBhbGwgd3JpdGVzIHdpbGwgYmUgYnVmZmVyZWQgdW50aWwgLnVuY29yaygpIGNhbGxcbiAgdGhpcy5jb3JrZWQgPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIGEgZmxhZyB0byBrbm93IGlmIHdlJ3JlIHByb2Nlc3NpbmcgcHJldmlvdXNseSBidWZmZXJlZCBpdGVtcywgd2hpY2hcbiAgLy8gbWF5IGNhbGwgdGhlIF93cml0ZSgpIGNhbGxiYWNrIGluIHRoZSBzYW1lIHRpY2ssIHNvIHRoYXQgd2UgZG9uJ3RcbiAgLy8gZW5kIHVwIGluIGFuIG92ZXJsYXBwZWQgb253cml0ZSBzaXR1YXRpb24uXG4gIHRoaXMuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xuXG4gIC8vIHRoZSBjYWxsYmFjayB0aGF0J3MgcGFzc2VkIHRvIF93cml0ZShjaHVuayxjYilcbiAgdGhpcy5vbndyaXRlID0gZnVuY3Rpb24gKGVyKSB7XG4gICAgb253cml0ZShzdHJlYW0sIGVyKTtcbiAgfTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCB0aGUgdXNlciBzdXBwbGllcyB0byB3cml0ZShjaHVuayxlbmNvZGluZyxjYilcbiAgdGhpcy53cml0ZWNiID0gbnVsbDtcblxuICAvLyB0aGUgYW1vdW50IHRoYXQgaXMgYmVpbmcgd3JpdHRlbiB3aGVuIF93cml0ZSBpcyBjYWxsZWQuXG4gIHRoaXMud3JpdGVsZW4gPSAwO1xuICB0aGlzLmJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gIHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG5cbiAgLy8gbnVtYmVyIG9mIHBlbmRpbmcgdXNlci1zdXBwbGllZCB3cml0ZSBjYWxsYmFja3NcbiAgLy8gdGhpcyBtdXN0IGJlIDAgYmVmb3JlICdmaW5pc2gnIGNhbiBiZSBlbWl0dGVkXG4gIHRoaXMucGVuZGluZ2NiID0gMDtcblxuICAvLyBlbWl0IHByZWZpbmlzaCBpZiB0aGUgb25seSB0aGluZyB3ZSdyZSB3YWl0aW5nIGZvciBpcyBfd3JpdGUgY2JzXG4gIC8vIFRoaXMgaXMgcmVsZXZhbnQgZm9yIHN5bmNocm9ub3VzIFRyYW5zZm9ybSBzdHJlYW1zXG4gIHRoaXMucHJlZmluaXNoZWQgPSBmYWxzZTtcblxuICAvLyBUcnVlIGlmIHRoZSBlcnJvciB3YXMgYWxyZWFkeSBlbWl0dGVkIGFuZCBzaG91bGQgbm90IGJlIHRocm93biBhZ2FpblxuICB0aGlzLmVycm9yRW1pdHRlZCA9IGZhbHNlO1xuXG4gIC8vIFNob3VsZCBjbG9zZSBiZSBlbWl0dGVkIG9uIGRlc3Ryb3kuIERlZmF1bHRzIHRvIHRydWUuXG4gIHRoaXMuZW1pdENsb3NlID0gb3B0aW9ucy5lbWl0Q2xvc2UgIT09IGZhbHNlO1xuXG4gIC8vIFNob3VsZCAuZGVzdHJveSgpIGJlIGNhbGxlZCBhZnRlciAnZmluaXNoJyAoYW5kIHBvdGVudGlhbGx5ICdlbmQnKVxuICB0aGlzLmF1dG9EZXN0cm95ID0gISFvcHRpb25zLmF1dG9EZXN0cm95O1xuXG4gIC8vIGNvdW50IGJ1ZmZlcmVkIHJlcXVlc3RzXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuXG4gIC8vIGFsbG9jYXRlIHRoZSBmaXJzdCBDb3JrZWRSZXF1ZXN0LCB0aGVyZSBpcyBhbHdheXNcbiAgLy8gb25lIGFsbG9jYXRlZCBhbmQgZnJlZSB0byB1c2UsIGFuZCB3ZSBtYWludGFpbiBhdCBtb3N0IHR3b1xuICB0aGlzLmNvcmtlZFJlcXVlc3RzRnJlZSA9IG5ldyBDb3JrZWRSZXF1ZXN0KHRoaXMpO1xufVxuV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUuZ2V0QnVmZmVyID0gZnVuY3Rpb24gZ2V0QnVmZmVyKCkge1xuICB2YXIgY3VycmVudCA9IHRoaXMuYnVmZmVyZWRSZXF1ZXN0O1xuICB2YXIgb3V0ID0gW107XG4gIHdoaWxlIChjdXJyZW50KSB7XG4gICAgb3V0LnB1c2goY3VycmVudCk7XG4gICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgfVxuICByZXR1cm4gb3V0O1xufTtcbihmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlU3RhdGUucHJvdG90eXBlLCAnYnVmZmVyJywge1xuICAgICAgZ2V0OiBpbnRlcm5hbFV0aWwuZGVwcmVjYXRlKGZ1bmN0aW9uIHdyaXRhYmxlU3RhdGVCdWZmZXJHZXR0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJ1ZmZlcigpO1xuICAgICAgfSwgJ193cml0YWJsZVN0YXRlLmJ1ZmZlciBpcyBkZXByZWNhdGVkLiBVc2UgX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyICcgKyAnaW5zdGVhZC4nLCAnREVQMDAwMycpXG4gICAgfSk7XG4gIH0gY2F0Y2ggKF8pIHt9XG59KSgpO1xuXG4vLyBUZXN0IF93cml0YWJsZVN0YXRlIGZvciBpbmhlcml0YW5jZSB0byBhY2NvdW50IGZvciBEdXBsZXggc3RyZWFtcyxcbi8vIHdob3NlIHByb3RvdHlwZSBjaGFpbiBvbmx5IHBvaW50cyB0byBSZWFkYWJsZS5cbnZhciByZWFsSGFzSW5zdGFuY2U7XG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuaGFzSW5zdGFuY2UgJiYgdHlwZW9mIEZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdID09PSAnZnVuY3Rpb24nKSB7XG4gIHJlYWxIYXNJbnN0YW5jZSA9IEZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUsIFN5bWJvbC5oYXNJbnN0YW5jZSwge1xuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZShvYmplY3QpIHtcbiAgICAgIGlmIChyZWFsSGFzSW5zdGFuY2UuY2FsbCh0aGlzLCBvYmplY3QpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmICh0aGlzICE9PSBXcml0YWJsZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBvYmplY3QuX3dyaXRhYmxlU3RhdGUgaW5zdGFuY2VvZiBXcml0YWJsZVN0YXRlO1xuICAgIH1cbiAgfSk7XG59IGVsc2Uge1xuICByZWFsSGFzSW5zdGFuY2UgPSBmdW5jdGlvbiByZWFsSGFzSW5zdGFuY2Uob2JqZWN0KSB7XG4gICAgcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mIHRoaXM7XG4gIH07XG59XG5mdW5jdGlvbiBXcml0YWJsZShvcHRpb25zKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgLy8gV3JpdGFibGUgY3RvciBpcyBhcHBsaWVkIHRvIER1cGxleGVzLCB0b28uXG4gIC8vIGByZWFsSGFzSW5zdGFuY2VgIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHVzaW5nIHBsYWluIGBpbnN0YW5jZW9mYFxuICAvLyB3b3VsZCByZXR1cm4gZmFsc2UsIGFzIG5vIGBfd3JpdGFibGVTdGF0ZWAgcHJvcGVydHkgaXMgYXR0YWNoZWQuXG5cbiAgLy8gVHJ5aW5nIHRvIHVzZSB0aGUgY3VzdG9tIGBpbnN0YW5jZW9mYCBmb3IgV3JpdGFibGUgaGVyZSB3aWxsIGFsc28gYnJlYWsgdGhlXG4gIC8vIE5vZGUuanMgTGF6eVRyYW5zZm9ybSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaGFzIGEgbm9uLXRyaXZpYWwgZ2V0dGVyIGZvclxuICAvLyBgX3dyaXRhYmxlU3RhdGVgIHRoYXQgd291bGQgbGVhZCB0byBpbmZpbml0ZSByZWN1cnNpb24uXG5cbiAgLy8gQ2hlY2tpbmcgZm9yIGEgU3RyZWFtLkR1cGxleCBpbnN0YW5jZSBpcyBmYXN0ZXIgaGVyZSBpbnN0ZWFkIG9mIGluc2lkZVxuICAvLyB0aGUgV3JpdGFibGVTdGF0ZSBjb25zdHJ1Y3RvciwgYXQgbGVhc3Qgd2l0aCBWOCA2LjVcbiAgdmFyIGlzRHVwbGV4ID0gdGhpcyBpbnN0YW5jZW9mIER1cGxleDtcbiAgaWYgKCFpc0R1cGxleCAmJiAhcmVhbEhhc0luc3RhbmNlLmNhbGwoV3JpdGFibGUsIHRoaXMpKSByZXR1cm4gbmV3IFdyaXRhYmxlKG9wdGlvbnMpO1xuICB0aGlzLl93cml0YWJsZVN0YXRlID0gbmV3IFdyaXRhYmxlU3RhdGUob3B0aW9ucywgdGhpcywgaXNEdXBsZXgpO1xuXG4gIC8vIGxlZ2FjeS5cbiAgdGhpcy53cml0YWJsZSA9IHRydWU7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLndyaXRlID09PSAnZnVuY3Rpb24nKSB0aGlzLl93cml0ZSA9IG9wdGlvbnMud3JpdGU7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLndyaXRldiA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fd3JpdGV2ID0gb3B0aW9ucy53cml0ZXY7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHRoaXMuX2Rlc3Ryb3kgPSBvcHRpb25zLmRlc3Ryb3k7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZpbmFsID09PSAnZnVuY3Rpb24nKSB0aGlzLl9maW5hbCA9IG9wdGlvbnMuZmluYWw7XG4gIH1cbiAgU3RyZWFtLmNhbGwodGhpcyk7XG59XG5cbi8vIE90aGVyd2lzZSBwZW9wbGUgY2FuIHBpcGUgV3JpdGFibGUgc3RyZWFtcywgd2hpY2ggaXMganVzdCB3cm9uZy5cbldyaXRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKCkge1xuICBlcnJvck9yRGVzdHJveSh0aGlzLCBuZXcgRVJSX1NUUkVBTV9DQU5OT1RfUElQRSgpKTtcbn07XG5mdW5jdGlvbiB3cml0ZUFmdGVyRW5kKHN0cmVhbSwgY2IpIHtcbiAgdmFyIGVyID0gbmV3IEVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5EKCk7XG4gIC8vIFRPRE86IGRlZmVyIGVycm9yIGV2ZW50cyBjb25zaXN0ZW50bHkgZXZlcnl3aGVyZSwgbm90IGp1c3QgdGhlIGNiXG4gIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgZXIpO1xuICBwcm9jZXNzLm5leHRUaWNrKGNiLCBlcik7XG59XG5cbi8vIENoZWNrcyB0aGF0IGEgdXNlci1zdXBwbGllZCBjaHVuayBpcyB2YWxpZCwgZXNwZWNpYWxseSBmb3IgdGhlIHBhcnRpY3VsYXJcbi8vIG1vZGUgdGhlIHN0cmVhbSBpcyBpbi4gQ3VycmVudGx5IHRoaXMgbWVhbnMgdGhhdCBgbnVsbGAgaXMgbmV2ZXIgYWNjZXB0ZWRcbi8vIGFuZCB1bmRlZmluZWQvbm9uLXN0cmluZyB2YWx1ZXMgYXJlIG9ubHkgYWxsb3dlZCBpbiBvYmplY3QgbW9kZS5cbmZ1bmN0aW9uIHZhbGlkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGNiKSB7XG4gIHZhciBlcjtcbiAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgZXIgPSBuZXcgRVJSX1NUUkVBTV9OVUxMX1ZBTFVFUygpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBlciA9IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnY2h1bmsnLCBbJ3N0cmluZycsICdCdWZmZXInXSwgY2h1bmspO1xuICB9XG4gIGlmIChlcikge1xuICAgIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgZXIpO1xuICAgIHByb2Nlc3MubmV4dFRpY2soY2IsIGVyKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5Xcml0YWJsZS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuICB2YXIgcmV0ID0gZmFsc2U7XG4gIHZhciBpc0J1ZiA9ICFzdGF0ZS5vYmplY3RNb2RlICYmIF9pc1VpbnQ4QXJyYXkoY2h1bmspO1xuICBpZiAoaXNCdWYgJiYgIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpIHtcbiAgICBjaHVuayA9IF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspO1xuICB9XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGVuY29kaW5nO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfVxuICBpZiAoaXNCdWYpIGVuY29kaW5nID0gJ2J1ZmZlcic7ZWxzZSBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9IHN0YXRlLmRlZmF1bHRFbmNvZGluZztcbiAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJykgY2IgPSBub3A7XG4gIGlmIChzdGF0ZS5lbmRpbmcpIHdyaXRlQWZ0ZXJFbmQodGhpcywgY2IpO2Vsc2UgaWYgKGlzQnVmIHx8IHZhbGlkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCBjYikpIHtcbiAgICBzdGF0ZS5wZW5kaW5nY2IrKztcbiAgICByZXQgPSB3cml0ZU9yQnVmZmVyKHRoaXMsIHN0YXRlLCBpc0J1ZiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn07XG5Xcml0YWJsZS5wcm90b3R5cGUuY29yayA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5fd3JpdGFibGVTdGF0ZS5jb3JrZWQrKztcbn07XG5Xcml0YWJsZS5wcm90b3R5cGUudW5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkLS07XG4gICAgaWYgKCFzdGF0ZS53cml0aW5nICYmICFzdGF0ZS5jb3JrZWQgJiYgIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0KSBjbGVhckJ1ZmZlcih0aGlzLCBzdGF0ZSk7XG4gIH1cbn07XG5Xcml0YWJsZS5wcm90b3R5cGUuc2V0RGVmYXVsdEVuY29kaW5nID0gZnVuY3Rpb24gc2V0RGVmYXVsdEVuY29kaW5nKGVuY29kaW5nKSB7XG4gIC8vIG5vZGU6OlBhcnNlRW5jb2RpbmcoKSByZXF1aXJlcyBsb3dlciBjYXNlLlxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykgZW5jb2RpbmcgPSBlbmNvZGluZy50b0xvd2VyQ2FzZSgpO1xuICBpZiAoIShbJ2hleCcsICd1dGY4JywgJ3V0Zi04JywgJ2FzY2lpJywgJ2JpbmFyeScsICdiYXNlNjQnLCAndWNzMicsICd1Y3MtMicsICd1dGYxNmxlJywgJ3V0Zi0xNmxlJywgJ3JhdyddLmluZGV4T2YoKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKCkpID4gLTEpKSB0aHJvdyBuZXcgRVJSX1VOS05PV05fRU5DT0RJTkcoZW5jb2RpbmcpO1xuICB0aGlzLl93cml0YWJsZVN0YXRlLmRlZmF1bHRFbmNvZGluZyA9IGVuY29kaW5nO1xuICByZXR1cm4gdGhpcztcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUucHJvdG90eXBlLCAnd3JpdGFibGVCdWZmZXInLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyKCk7XG4gIH1cbn0pO1xuZnVuY3Rpb24gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZykge1xuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgc3RhdGUuZGVjb2RlU3RyaW5ncyAhPT0gZmFsc2UgJiYgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgfVxuICByZXR1cm4gY2h1bms7XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUucHJvdG90eXBlLCAnd3JpdGFibGVIaWdoV2F0ZXJNYXJrJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICB9XG59KTtcblxuLy8gaWYgd2UncmUgYWxyZWFkeSB3cml0aW5nIHNvbWV0aGluZywgdGhlbiBqdXN0IHB1dCB0aGlzXG4vLyBpbiB0aGUgcXVldWUsIGFuZCB3YWl0IG91ciB0dXJuLiAgT3RoZXJ3aXNlLCBjYWxsIF93cml0ZVxuLy8gSWYgd2UgcmV0dXJuIGZhbHNlLCB0aGVuIHdlIG5lZWQgYSBkcmFpbiBldmVudCwgc28gc2V0IHRoYXQgZmxhZy5cbmZ1bmN0aW9uIHdyaXRlT3JCdWZmZXIoc3RyZWFtLCBzdGF0ZSwgaXNCdWYsIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgaWYgKCFpc0J1Zikge1xuICAgIHZhciBuZXdDaHVuayA9IGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpO1xuICAgIGlmIChjaHVuayAhPT0gbmV3Q2h1bmspIHtcbiAgICAgIGlzQnVmID0gdHJ1ZTtcbiAgICAgIGVuY29kaW5nID0gJ2J1ZmZlcic7XG4gICAgICBjaHVuayA9IG5ld0NodW5rO1xuICAgIH1cbiAgfVxuICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gIHN0YXRlLmxlbmd0aCArPSBsZW47XG4gIHZhciByZXQgPSBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICAvLyB3ZSBtdXN0IGVuc3VyZSB0aGF0IHByZXZpb3VzIG5lZWREcmFpbiB3aWxsIG5vdCBiZSByZXNldCB0byBmYWxzZS5cbiAgaWYgKCFyZXQpIHN0YXRlLm5lZWREcmFpbiA9IHRydWU7XG4gIGlmIChzdGF0ZS53cml0aW5nIHx8IHN0YXRlLmNvcmtlZCkge1xuICAgIHZhciBsYXN0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0ge1xuICAgICAgY2h1bms6IGNodW5rLFxuICAgICAgZW5jb2Rpbmc6IGVuY29kaW5nLFxuICAgICAgaXNCdWY6IGlzQnVmLFxuICAgICAgY2FsbGJhY2s6IGNiLFxuICAgICAgbmV4dDogbnVsbFxuICAgIH07XG4gICAgaWYgKGxhc3QpIHtcbiAgICAgIGxhc3QubmV4dCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfVxuICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ICs9IDE7XG4gIH0gZWxzZSB7XG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuZnVuY3Rpb24gZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB3cml0ZXYsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBzdGF0ZS53cml0ZWxlbiA9IGxlbjtcbiAgc3RhdGUud3JpdGVjYiA9IGNiO1xuICBzdGF0ZS53cml0aW5nID0gdHJ1ZTtcbiAgc3RhdGUuc3luYyA9IHRydWU7XG4gIGlmIChzdGF0ZS5kZXN0cm95ZWQpIHN0YXRlLm9ud3JpdGUobmV3IEVSUl9TVFJFQU1fREVTVFJPWUVEKCd3cml0ZScpKTtlbHNlIGlmICh3cml0ZXYpIHN0cmVhbS5fd3JpdGV2KGNodW5rLCBzdGF0ZS5vbndyaXRlKTtlbHNlIHN0cmVhbS5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBzdGF0ZS5vbndyaXRlKTtcbiAgc3RhdGUuc3luYyA9IGZhbHNlO1xufVxuZnVuY3Rpb24gb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYikge1xuICAtLXN0YXRlLnBlbmRpbmdjYjtcbiAgaWYgKHN5bmMpIHtcbiAgICAvLyBkZWZlciB0aGUgY2FsbGJhY2sgaWYgd2UgYXJlIGJlaW5nIGNhbGxlZCBzeW5jaHJvbm91c2x5XG4gICAgLy8gdG8gYXZvaWQgcGlsaW5nIHVwIHRoaW5ncyBvbiB0aGUgc3RhY2tcbiAgICBwcm9jZXNzLm5leHRUaWNrKGNiLCBlcik7XG4gICAgLy8gdGhpcyBjYW4gZW1pdCBmaW5pc2gsIGFuZCBpdCB3aWxsIGFsd2F5cyBoYXBwZW5cbiAgICAvLyBhZnRlciBlcnJvclxuICAgIHByb2Nlc3MubmV4dFRpY2soZmluaXNoTWF5YmUsIHN0cmVhbSwgc3RhdGUpO1xuICAgIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICAgIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgZXIpO1xuICB9IGVsc2Uge1xuICAgIC8vIHRoZSBjYWxsZXIgZXhwZWN0IHRoaXMgdG8gaGFwcGVuIGJlZm9yZSBpZlxuICAgIC8vIGl0IGlzIGFzeW5jXG4gICAgY2IoZXIpO1xuICAgIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICAgIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgZXIpO1xuICAgIC8vIHRoaXMgY2FuIGVtaXQgZmluaXNoLCBidXQgZmluaXNoIG11c3RcbiAgICAvLyBhbHdheXMgZm9sbG93IGVycm9yXG4gICAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSkge1xuICBzdGF0ZS53cml0aW5nID0gZmFsc2U7XG4gIHN0YXRlLndyaXRlY2IgPSBudWxsO1xuICBzdGF0ZS5sZW5ndGggLT0gc3RhdGUud3JpdGVsZW47XG4gIHN0YXRlLndyaXRlbGVuID0gMDtcbn1cbmZ1bmN0aW9uIG9ud3JpdGUoc3RyZWFtLCBlcikge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGU7XG4gIHZhciBzeW5jID0gc3RhdGUuc3luYztcbiAgdmFyIGNiID0gc3RhdGUud3JpdGVjYjtcbiAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IEVSUl9NVUxUSVBMRV9DQUxMQkFDSygpO1xuICBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpO1xuICBpZiAoZXIpIG9ud3JpdGVFcnJvcihzdHJlYW0sIHN0YXRlLCBzeW5jLCBlciwgY2IpO2Vsc2Uge1xuICAgIC8vIENoZWNrIGlmIHdlJ3JlIGFjdHVhbGx5IHJlYWR5IHRvIGZpbmlzaCwgYnV0IGRvbid0IGVtaXQgeWV0XG4gICAgdmFyIGZpbmlzaGVkID0gbmVlZEZpbmlzaChzdGF0ZSkgfHwgc3RyZWFtLmRlc3Ryb3llZDtcbiAgICBpZiAoIWZpbmlzaGVkICYmICFzdGF0ZS5jb3JrZWQgJiYgIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0KSB7XG4gICAgICBjbGVhckJ1ZmZlcihzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gICAgaWYgKHN5bmMpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soYWZ0ZXJXcml0ZSwgc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpIHtcbiAgaWYgKCFmaW5pc2hlZCkgb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpO1xuICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgY2IoKTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG59XG5cbi8vIE11c3QgZm9yY2UgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIG9uIG5leHRUaWNrLCBzbyB0aGF0IHdlIGRvbid0XG4vLyBlbWl0ICdkcmFpbicgYmVmb3JlIHRoZSB3cml0ZSgpIGNvbnN1bWVyIGdldHMgdGhlICdmYWxzZScgcmV0dXJuXG4vLyB2YWx1ZSwgYW5kIGhhcyBhIGNoYW5jZSB0byBhdHRhY2ggYSAnZHJhaW4nIGxpc3RlbmVyLlxuZnVuY3Rpb24gb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5uZWVkRHJhaW4pIHtcbiAgICBzdGF0ZS5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZHJhaW4nKTtcbiAgfVxufVxuXG4vLyBpZiB0aGVyZSdzIHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyIHdhaXRpbmcsIHRoZW4gcHJvY2VzcyBpdFxuZnVuY3Rpb24gY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSkge1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gdHJ1ZTtcbiAgdmFyIGVudHJ5ID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0O1xuICBpZiAoc3RyZWFtLl93cml0ZXYgJiYgZW50cnkgJiYgZW50cnkubmV4dCkge1xuICAgIC8vIEZhc3QgY2FzZSwgd3JpdGUgZXZlcnl0aGluZyB1c2luZyBfd3JpdGV2KClcbiAgICB2YXIgbCA9IHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50O1xuICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXkobCk7XG4gICAgdmFyIGhvbGRlciA9IHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZTtcbiAgICBob2xkZXIuZW50cnkgPSBlbnRyeTtcbiAgICB2YXIgY291bnQgPSAwO1xuICAgIHZhciBhbGxCdWZmZXJzID0gdHJ1ZTtcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIGJ1ZmZlcltjb3VudF0gPSBlbnRyeTtcbiAgICAgIGlmICghZW50cnkuaXNCdWYpIGFsbEJ1ZmZlcnMgPSBmYWxzZTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuICAgIGJ1ZmZlci5hbGxCdWZmZXJzID0gYWxsQnVmZmVycztcbiAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIHRydWUsIHN0YXRlLmxlbmd0aCwgYnVmZmVyLCAnJywgaG9sZGVyLmZpbmlzaCk7XG5cbiAgICAvLyBkb1dyaXRlIGlzIGFsbW9zdCBhbHdheXMgYXN5bmMsIGRlZmVyIHRoZXNlIHRvIHNhdmUgYSBiaXQgb2YgdGltZVxuICAgIC8vIGFzIHRoZSBob3QgcGF0aCBlbmRzIHdpdGggZG9Xcml0ZVxuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICAgIGlmIChob2xkZXIubmV4dCkge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gaG9sZGVyLm5leHQ7XG4gICAgICBob2xkZXIubmV4dCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IG5ldyBDb3JrZWRSZXF1ZXN0KHN0YXRlKTtcbiAgICB9XG4gICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIFNsb3cgY2FzZSwgd3JpdGUgY2h1bmtzIG9uZS1ieS1vbmVcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIHZhciBjaHVuayA9IGVudHJ5LmNodW5rO1xuICAgICAgdmFyIGVuY29kaW5nID0gZW50cnkuZW5jb2Rpbmc7XG4gICAgICB2YXIgY2IgPSBlbnRyeS5jYWxsYmFjaztcbiAgICAgIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmFsc2UsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudC0tO1xuICAgICAgLy8gaWYgd2UgZGlkbid0IGNhbGwgdGhlIG9ud3JpdGUgaW1tZWRpYXRlbHksIHRoZW5cbiAgICAgIC8vIGl0IG1lYW5zIHRoYXQgd2UgbmVlZCB0byB3YWl0IHVudGlsIGl0IGRvZXMuXG4gICAgICAvLyBhbHNvLCB0aGF0IG1lYW5zIHRoYXQgdGhlIGNodW5rIGFuZCBjYiBhcmUgY3VycmVudGx5XG4gICAgICAvLyBiZWluZyBwcm9jZXNzZWQsIHNvIG1vdmUgdGhlIGJ1ZmZlciBjb3VudGVyIHBhc3QgdGhlbS5cbiAgICAgIGlmIChzdGF0ZS53cml0aW5nKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW50cnkgPT09IG51bGwpIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICB9XG4gIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IGVudHJ5O1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gZmFsc2U7XG59XG5Xcml0YWJsZS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobmV3IEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEKCdfd3JpdGUoKScpKTtcbn07XG5Xcml0YWJsZS5wcm90b3R5cGUuX3dyaXRldiA9IG51bGw7XG5Xcml0YWJsZS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcbiAgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gY2h1bms7XG4gICAgY2h1bmsgPSBudWxsO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGVuY29kaW5nO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfVxuICBpZiAoY2h1bmsgIT09IG51bGwgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCkgdGhpcy53cml0ZShjaHVuaywgZW5jb2RpbmcpO1xuXG4gIC8vIC5lbmQoKSBmdWxseSB1bmNvcmtzXG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQgPSAxO1xuICAgIHRoaXMudW5jb3JrKCk7XG4gIH1cblxuICAvLyBpZ25vcmUgdW5uZWNlc3NhcnkgZW5kKCkgY2FsbHMuXG4gIGlmICghc3RhdGUuZW5kaW5nKSBlbmRXcml0YWJsZSh0aGlzLCBzdGF0ZSwgY2IpO1xuICByZXR1cm4gdGhpcztcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUucHJvdG90eXBlLCAnd3JpdGFibGVMZW5ndGgnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmxlbmd0aDtcbiAgfVxufSk7XG5mdW5jdGlvbiBuZWVkRmluaXNoKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5lbmRpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9PT0gbnVsbCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLndyaXRpbmc7XG59XG5mdW5jdGlvbiBjYWxsRmluYWwoc3RyZWFtLCBzdGF0ZSkge1xuICBzdHJlYW0uX2ZpbmFsKGZ1bmN0aW9uIChlcnIpIHtcbiAgICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBlcnJvck9yRGVzdHJveShzdHJlYW0sIGVycik7XG4gICAgfVxuICAgIHN0YXRlLnByZWZpbmlzaGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0uZW1pdCgncHJlZmluaXNoJyk7XG4gICAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG4gIH0pO1xufVxuZnVuY3Rpb24gcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5wcmVmaW5pc2hlZCAmJiAhc3RhdGUuZmluYWxDYWxsZWQpIHtcbiAgICBpZiAodHlwZW9mIHN0cmVhbS5fZmluYWwgPT09ICdmdW5jdGlvbicgJiYgIXN0YXRlLmRlc3Ryb3llZCkge1xuICAgICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgICBzdGF0ZS5maW5hbENhbGxlZCA9IHRydWU7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxGaW5hbCwgc3RyZWFtLCBzdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLnByZWZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5lbWl0KCdwcmVmaW5pc2gnKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIG5lZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcbiAgaWYgKG5lZWQpIHtcbiAgICBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSk7XG4gICAgaWYgKHN0YXRlLnBlbmRpbmdjYiA9PT0gMCkge1xuICAgICAgc3RhdGUuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLmVtaXQoJ2ZpbmlzaCcpO1xuICAgICAgaWYgKHN0YXRlLmF1dG9EZXN0cm95KSB7XG4gICAgICAgIC8vIEluIGNhc2Ugb2YgZHVwbGV4IHN0cmVhbXMgd2UgbmVlZCBhIHdheSB0byBkZXRlY3RcbiAgICAgICAgLy8gaWYgdGhlIHJlYWRhYmxlIHNpZGUgaXMgcmVhZHkgZm9yIGF1dG9EZXN0cm95IGFzIHdlbGxcbiAgICAgICAgdmFyIHJTdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgICAgICAgaWYgKCFyU3RhdGUgfHwgclN0YXRlLmF1dG9EZXN0cm95ICYmIHJTdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgICAgICAgc3RyZWFtLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbmVlZDtcbn1cbmZ1bmN0aW9uIGVuZFdyaXRhYmxlKHN0cmVhbSwgc3RhdGUsIGNiKSB7XG4gIHN0YXRlLmVuZGluZyA9IHRydWU7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICBpZiAoY2IpIHtcbiAgICBpZiAoc3RhdGUuZmluaXNoZWQpIHByb2Nlc3MubmV4dFRpY2soY2IpO2Vsc2Ugc3RyZWFtLm9uY2UoJ2ZpbmlzaCcsIGNiKTtcbiAgfVxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG4gIHN0cmVhbS53cml0YWJsZSA9IGZhbHNlO1xufVxuZnVuY3Rpb24gb25Db3JrZWRGaW5pc2goY29ya1JlcSwgc3RhdGUsIGVycikge1xuICB2YXIgZW50cnkgPSBjb3JrUmVxLmVudHJ5O1xuICBjb3JrUmVxLmVudHJ5ID0gbnVsbDtcbiAgd2hpbGUgKGVudHJ5KSB7XG4gICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgc3RhdGUucGVuZGluZ2NiLS07XG4gICAgY2IoZXJyKTtcbiAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gIH1cblxuICAvLyByZXVzZSB0aGUgZnJlZSBjb3JrUmVxLlxuICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dCA9IGNvcmtSZXE7XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUucHJvdG90eXBlLCAnZGVzdHJveWVkJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAvLyB3ZSBpZ25vcmUgdGhlIHZhbHVlIGlmIHRoZSBzdHJlYW1cbiAgICAvLyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0XG4gICAgaWYgKCF0aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhlIHVzZXIgaXMgZXhwbGljaXRseVxuICAgIC8vIG1hbmFnaW5nIGRlc3Ryb3llZFxuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gdmFsdWU7XG4gIH1cbn0pO1xuV3JpdGFibGUucHJvdG90eXBlLmRlc3Ryb3kgPSBkZXN0cm95SW1wbC5kZXN0cm95O1xuV3JpdGFibGUucHJvdG90eXBlLl91bmRlc3Ryb3kgPSBkZXN0cm95SW1wbC51bmRlc3Ryb3k7XG5Xcml0YWJsZS5wcm90b3R5cGUuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAoZXJyLCBjYikge1xuICBjYihlcnIpO1xufTsiLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gYSBkdXBsZXggc3RyZWFtIGlzIGp1c3QgYSBzdHJlYW0gdGhhdCBpcyBib3RoIHJlYWRhYmxlIGFuZCB3cml0YWJsZS5cbi8vIFNpbmNlIEpTIGRvZXNuJ3QgaGF2ZSBtdWx0aXBsZSBwcm90b3R5cGFsIGluaGVyaXRhbmNlLCB0aGlzIGNsYXNzXG4vLyBwcm90b3R5cGFsbHkgaW5oZXJpdHMgZnJvbSBSZWFkYWJsZSwgYW5kIHRoZW4gcGFyYXNpdGljYWxseSBmcm9tXG4vLyBXcml0YWJsZS5cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIGtleXMucHVzaChrZXkpO1xuICByZXR1cm4ga2V5cztcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxubW9kdWxlLmV4cG9ydHMgPSBEdXBsZXg7XG52YXIgUmVhZGFibGUgPSByZXF1aXJlKCcuL19zdHJlYW1fcmVhZGFibGUnKTtcbnZhciBXcml0YWJsZSA9IHJlcXVpcmUoJy4vX3N0cmVhbV93cml0YWJsZScpO1xucmVxdWlyZSgnaW5oZXJpdHMnKShEdXBsZXgsIFJlYWRhYmxlKTtcbntcbiAgLy8gQWxsb3cgdGhlIGtleXMgYXJyYXkgdG8gYmUgR0MnZWQuXG4gIHZhciBrZXlzID0gb2JqZWN0S2V5cyhXcml0YWJsZS5wcm90b3R5cGUpO1xuICBmb3IgKHZhciB2ID0gMDsgdiA8IGtleXMubGVuZ3RoOyB2KyspIHtcbiAgICB2YXIgbWV0aG9kID0ga2V5c1t2XTtcbiAgICBpZiAoIUR1cGxleC5wcm90b3R5cGVbbWV0aG9kXSkgRHVwbGV4LnByb3RvdHlwZVttZXRob2RdID0gV3JpdGFibGUucHJvdG90eXBlW21ldGhvZF07XG4gIH1cbn1cbmZ1bmN0aW9uIER1cGxleChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBEdXBsZXgpKSByZXR1cm4gbmV3IER1cGxleChvcHRpb25zKTtcbiAgUmVhZGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgV3JpdGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgdGhpcy5hbGxvd0hhbGZPcGVuID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5yZWFkYWJsZSA9PT0gZmFsc2UpIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcbiAgICBpZiAob3B0aW9ucy53cml0YWJsZSA9PT0gZmFsc2UpIHRoaXMud3JpdGFibGUgPSBmYWxzZTtcbiAgICBpZiAob3B0aW9ucy5hbGxvd0hhbGZPcGVuID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5hbGxvd0hhbGZPcGVuID0gZmFsc2U7XG4gICAgICB0aGlzLm9uY2UoJ2VuZCcsIG9uZW5kKTtcbiAgICB9XG4gIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShEdXBsZXgucHJvdG90eXBlLCAnd3JpdGFibGVIaWdoV2F0ZXJNYXJrJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShEdXBsZXgucHJvdG90eXBlLCAnd3JpdGFibGVCdWZmZXInLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyKCk7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KER1cGxleC5wcm90b3R5cGUsICd3cml0YWJsZUxlbmd0aCcsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUubGVuZ3RoO1xuICB9XG59KTtcblxuLy8gdGhlIG5vLWhhbGYtb3BlbiBlbmZvcmNlclxuZnVuY3Rpb24gb25lbmQoKSB7XG4gIC8vIElmIHRoZSB3cml0YWJsZSBzaWRlIGVuZGVkLCB0aGVuIHdlJ3JlIG9rLlxuICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZCkgcmV0dXJuO1xuXG4gIC8vIG5vIG1vcmUgZGF0YSBjYW4gYmUgd3JpdHRlbi5cbiAgLy8gQnV0IGFsbG93IG1vcmUgd3JpdGVzIHRvIGhhcHBlbiBpbiB0aGlzIHRpY2suXG4gIHByb2Nlc3MubmV4dFRpY2sob25FbmROVCwgdGhpcyk7XG59XG5mdW5jdGlvbiBvbkVuZE5UKHNlbGYpIHtcbiAgc2VsZi5lbmQoKTtcbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShEdXBsZXgucHJvdG90eXBlLCAnZGVzdHJveWVkJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgJiYgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgLy8gd2UgaWdub3JlIHRoZSB2YWx1ZSBpZiB0aGUgc3RyZWFtXG4gICAgLy8gaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldFxuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQgfHwgdGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhlIHVzZXIgaXMgZXhwbGljaXRseVxuICAgIC8vIG1hbmFnaW5nIGRlc3Ryb3llZFxuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkID0gdmFsdWU7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgfVxufSk7IiwiLyohIHNhZmUtYnVmZmVyLiBNSVQgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBub2RlL25vLWRlcHJlY2F0ZWQtYXBpICovXG52YXIgYnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJylcbnZhciBCdWZmZXIgPSBidWZmZXIuQnVmZmVyXG5cbi8vIGFsdGVybmF0aXZlIHRvIHVzaW5nIE9iamVjdC5rZXlzIGZvciBvbGQgYnJvd3NlcnNcbmZ1bmN0aW9uIGNvcHlQcm9wcyAoc3JjLCBkc3QpIHtcbiAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgIGRzdFtrZXldID0gc3JjW2tleV1cbiAgfVxufVxuaWYgKEJ1ZmZlci5mcm9tICYmIEJ1ZmZlci5hbGxvYyAmJiBCdWZmZXIuYWxsb2NVbnNhZmUgJiYgQnVmZmVyLmFsbG9jVW5zYWZlU2xvdykge1xuICBtb2R1bGUuZXhwb3J0cyA9IGJ1ZmZlclxufSBlbHNlIHtcbiAgLy8gQ29weSBwcm9wZXJ0aWVzIGZyb20gcmVxdWlyZSgnYnVmZmVyJylcbiAgY29weVByb3BzKGJ1ZmZlciwgZXhwb3J0cylcbiAgZXhwb3J0cy5CdWZmZXIgPSBTYWZlQnVmZmVyXG59XG5cbmZ1bmN0aW9uIFNhZmVCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cblNhZmVCdWZmZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShCdWZmZXIucHJvdG90eXBlKVxuXG4vLyBDb3B5IHN0YXRpYyBtZXRob2RzIGZyb20gQnVmZmVyXG5jb3B5UHJvcHMoQnVmZmVyLCBTYWZlQnVmZmVyKVxuXG5TYWZlQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cblNhZmVCdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHZhciBidWYgPSBCdWZmZXIoc2l6ZSlcbiAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnKSB7XG4gICAgICBidWYuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICB9IGVsc2Uge1xuICAgICAgYnVmLmZpbGwoZmlsbClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYnVmLmZpbGwoMClcbiAgfVxuICByZXR1cm4gYnVmXG59XG5cblNhZmVCdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlcihzaXplKVxufVxuXG5TYWZlQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gYnVmZmVyLlNsb3dCdWZmZXIoc2l6ZSlcbn1cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgaXNFbmNvZGluZyA9IEJ1ZmZlci5pc0VuY29kaW5nIHx8IGZ1bmN0aW9uIChlbmNvZGluZykge1xuICBlbmNvZGluZyA9ICcnICsgZW5jb2Rpbmc7XG4gIHN3aXRjaCAoZW5jb2RpbmcgJiYgZW5jb2RpbmcudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2hleCc6Y2FzZSAndXRmOCc6Y2FzZSAndXRmLTgnOmNhc2UgJ2FzY2lpJzpjYXNlICdiaW5hcnknOmNhc2UgJ2Jhc2U2NCc6Y2FzZSAndWNzMic6Y2FzZSAndWNzLTInOmNhc2UgJ3V0ZjE2bGUnOmNhc2UgJ3V0Zi0xNmxlJzpjYXNlICdyYXcnOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuZnVuY3Rpb24gX25vcm1hbGl6ZUVuY29kaW5nKGVuYykge1xuICBpZiAoIWVuYykgcmV0dXJuICd1dGY4JztcbiAgdmFyIHJldHJpZWQ7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgc3dpdGNoIChlbmMpIHtcbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gJ3V0ZjgnO1xuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuICd1dGYxNmxlJztcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gJ2xhdGluMSc7XG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGVuYztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChyZXRyaWVkKSByZXR1cm47IC8vIHVuZGVmaW5lZFxuICAgICAgICBlbmMgPSAoJycgKyBlbmMpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHJpZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufTtcblxuLy8gRG8gbm90IGNhY2hlIGBCdWZmZXIuaXNFbmNvZGluZ2Agd2hlbiBjaGVja2luZyBlbmNvZGluZyBuYW1lcyBhcyBzb21lXG4vLyBtb2R1bGVzIG1vbmtleS1wYXRjaCBpdCB0byBzdXBwb3J0IGFkZGl0aW9uYWwgZW5jb2RpbmdzXG5mdW5jdGlvbiBub3JtYWxpemVFbmNvZGluZyhlbmMpIHtcbiAgdmFyIG5lbmMgPSBfbm9ybWFsaXplRW5jb2RpbmcoZW5jKTtcbiAgaWYgKHR5cGVvZiBuZW5jICE9PSAnc3RyaW5nJyAmJiAoQnVmZmVyLmlzRW5jb2RpbmcgPT09IGlzRW5jb2RpbmcgfHwgIWlzRW5jb2RpbmcoZW5jKSkpIHRocm93IG5ldyBFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuYyk7XG4gIHJldHVybiBuZW5jIHx8IGVuYztcbn1cblxuLy8gU3RyaW5nRGVjb2RlciBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIGVmZmljaWVudGx5IHNwbGl0dGluZyBhIHNlcmllcyBvZlxuLy8gYnVmZmVycyBpbnRvIGEgc2VyaWVzIG9mIEpTIHN0cmluZ3Mgd2l0aG91dCBicmVha2luZyBhcGFydCBtdWx0aS1ieXRlXG4vLyBjaGFyYWN0ZXJzLlxuZXhwb3J0cy5TdHJpbmdEZWNvZGVyID0gU3RyaW5nRGVjb2RlcjtcbmZ1bmN0aW9uIFN0cmluZ0RlY29kZXIoZW5jb2RpbmcpIHtcbiAgdGhpcy5lbmNvZGluZyA9IG5vcm1hbGl6ZUVuY29kaW5nKGVuY29kaW5nKTtcbiAgdmFyIG5iO1xuICBzd2l0Y2ggKHRoaXMuZW5jb2RpbmcpIHtcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIHRoaXMudGV4dCA9IHV0ZjE2VGV4dDtcbiAgICAgIHRoaXMuZW5kID0gdXRmMTZFbmQ7XG4gICAgICBuYiA9IDQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd1dGY4JzpcbiAgICAgIHRoaXMuZmlsbExhc3QgPSB1dGY4RmlsbExhc3Q7XG4gICAgICBuYiA9IDQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgdGhpcy50ZXh0ID0gYmFzZTY0VGV4dDtcbiAgICAgIHRoaXMuZW5kID0gYmFzZTY0RW5kO1xuICAgICAgbmIgPSAzO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRoaXMud3JpdGUgPSBzaW1wbGVXcml0ZTtcbiAgICAgIHRoaXMuZW5kID0gc2ltcGxlRW5kO1xuICAgICAgcmV0dXJuO1xuICB9XG4gIHRoaXMubGFzdE5lZWQgPSAwO1xuICB0aGlzLmxhc3RUb3RhbCA9IDA7XG4gIHRoaXMubGFzdENoYXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobmIpO1xufVxuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChidWYpIHtcbiAgaWYgKGJ1Zi5sZW5ndGggPT09IDApIHJldHVybiAnJztcbiAgdmFyIHI7XG4gIHZhciBpO1xuICBpZiAodGhpcy5sYXN0TmVlZCkge1xuICAgIHIgPSB0aGlzLmZpbGxMYXN0KGJ1Zik7XG4gICAgaWYgKHIgPT09IHVuZGVmaW5lZCkgcmV0dXJuICcnO1xuICAgIGkgPSB0aGlzLmxhc3ROZWVkO1xuICAgIHRoaXMubGFzdE5lZWQgPSAwO1xuICB9IGVsc2Uge1xuICAgIGkgPSAwO1xuICB9XG4gIGlmIChpIDwgYnVmLmxlbmd0aCkgcmV0dXJuIHIgPyByICsgdGhpcy50ZXh0KGJ1ZiwgaSkgOiB0aGlzLnRleHQoYnVmLCBpKTtcbiAgcmV0dXJuIHIgfHwgJyc7XG59O1xuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5lbmQgPSB1dGY4RW5kO1xuXG4vLyBSZXR1cm5zIG9ubHkgY29tcGxldGUgY2hhcmFjdGVycyBpbiBhIEJ1ZmZlclxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUudGV4dCA9IHV0ZjhUZXh0O1xuXG4vLyBBdHRlbXB0cyB0byBjb21wbGV0ZSBhIHBhcnRpYWwgbm9uLVVURi04IGNoYXJhY3RlciB1c2luZyBieXRlcyBmcm9tIGEgQnVmZmVyXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5maWxsTGFzdCA9IGZ1bmN0aW9uIChidWYpIHtcbiAgaWYgKHRoaXMubGFzdE5lZWQgPD0gYnVmLmxlbmd0aCkge1xuICAgIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIHRoaXMubGFzdFRvdGFsIC0gdGhpcy5sYXN0TmVlZCwgMCwgdGhpcy5sYXN0TmVlZCk7XG4gICAgcmV0dXJuIHRoaXMubGFzdENoYXIudG9TdHJpbmcodGhpcy5lbmNvZGluZywgMCwgdGhpcy5sYXN0VG90YWwpO1xuICB9XG4gIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIHRoaXMubGFzdFRvdGFsIC0gdGhpcy5sYXN0TmVlZCwgMCwgYnVmLmxlbmd0aCk7XG4gIHRoaXMubGFzdE5lZWQgLT0gYnVmLmxlbmd0aDtcbn07XG5cbi8vIENoZWNrcyB0aGUgdHlwZSBvZiBhIFVURi04IGJ5dGUsIHdoZXRoZXIgaXQncyBBU0NJSSwgYSBsZWFkaW5nIGJ5dGUsIG9yIGFcbi8vIGNvbnRpbnVhdGlvbiBieXRlLiBJZiBhbiBpbnZhbGlkIGJ5dGUgaXMgZGV0ZWN0ZWQsIC0yIGlzIHJldHVybmVkLlxuZnVuY3Rpb24gdXRmOENoZWNrQnl0ZShieXRlKSB7XG4gIGlmIChieXRlIDw9IDB4N0YpIHJldHVybiAwO2Vsc2UgaWYgKGJ5dGUgPj4gNSA9PT0gMHgwNikgcmV0dXJuIDI7ZWxzZSBpZiAoYnl0ZSA+PiA0ID09PSAweDBFKSByZXR1cm4gMztlbHNlIGlmIChieXRlID4+IDMgPT09IDB4MUUpIHJldHVybiA0O1xuICByZXR1cm4gYnl0ZSA+PiA2ID09PSAweDAyID8gLTEgOiAtMjtcbn1cblxuLy8gQ2hlY2tzIGF0IG1vc3QgMyBieXRlcyBhdCB0aGUgZW5kIG9mIGEgQnVmZmVyIGluIG9yZGVyIHRvIGRldGVjdCBhblxuLy8gaW5jb21wbGV0ZSBtdWx0aS1ieXRlIFVURi04IGNoYXJhY3Rlci4gVGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyAoMiwgMywgb3IgNClcbi8vIG5lZWRlZCB0byBjb21wbGV0ZSB0aGUgVVRGLTggY2hhcmFjdGVyIChpZiBhcHBsaWNhYmxlKSBhcmUgcmV0dXJuZWQuXG5mdW5jdGlvbiB1dGY4Q2hlY2tJbmNvbXBsZXRlKHNlbGYsIGJ1ZiwgaSkge1xuICB2YXIgaiA9IGJ1Zi5sZW5ndGggLSAxO1xuICBpZiAoaiA8IGkpIHJldHVybiAwO1xuICB2YXIgbmIgPSB1dGY4Q2hlY2tCeXRlKGJ1ZltqXSk7XG4gIGlmIChuYiA+PSAwKSB7XG4gICAgaWYgKG5iID4gMCkgc2VsZi5sYXN0TmVlZCA9IG5iIC0gMTtcbiAgICByZXR1cm4gbmI7XG4gIH1cbiAgaWYgKC0taiA8IGkgfHwgbmIgPT09IC0yKSByZXR1cm4gMDtcbiAgbmIgPSB1dGY4Q2hlY2tCeXRlKGJ1ZltqXSk7XG4gIGlmIChuYiA+PSAwKSB7XG4gICAgaWYgKG5iID4gMCkgc2VsZi5sYXN0TmVlZCA9IG5iIC0gMjtcbiAgICByZXR1cm4gbmI7XG4gIH1cbiAgaWYgKC0taiA8IGkgfHwgbmIgPT09IC0yKSByZXR1cm4gMDtcbiAgbmIgPSB1dGY4Q2hlY2tCeXRlKGJ1ZltqXSk7XG4gIGlmIChuYiA+PSAwKSB7XG4gICAgaWYgKG5iID4gMCkge1xuICAgICAgaWYgKG5iID09PSAyKSBuYiA9IDA7ZWxzZSBzZWxmLmxhc3ROZWVkID0gbmIgLSAzO1xuICAgIH1cbiAgICByZXR1cm4gbmI7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vIFZhbGlkYXRlcyBhcyBtYW55IGNvbnRpbnVhdGlvbiBieXRlcyBmb3IgYSBtdWx0aS1ieXRlIFVURi04IGNoYXJhY3RlciBhc1xuLy8gbmVlZGVkIG9yIGFyZSBhdmFpbGFibGUuIElmIHdlIHNlZSBhIG5vbi1jb250aW51YXRpb24gYnl0ZSB3aGVyZSB3ZSBleHBlY3Rcbi8vIG9uZSwgd2UgXCJyZXBsYWNlXCIgdGhlIHZhbGlkYXRlZCBjb250aW51YXRpb24gYnl0ZXMgd2UndmUgc2VlbiBzbyBmYXIgd2l0aFxuLy8gYSBzaW5nbGUgVVRGLTggcmVwbGFjZW1lbnQgY2hhcmFjdGVyICgnXFx1ZmZmZCcpLCB0byBtYXRjaCB2OCdzIFVURi04IGRlY29kaW5nXG4vLyBiZWhhdmlvci4gVGhlIGNvbnRpbnVhdGlvbiBieXRlIGNoZWNrIGlzIGluY2x1ZGVkIHRocmVlIHRpbWVzIGluIHRoZSBjYXNlXG4vLyB3aGVyZSBhbGwgb2YgdGhlIGNvbnRpbnVhdGlvbiBieXRlcyBmb3IgYSBjaGFyYWN0ZXIgZXhpc3QgaW4gdGhlIHNhbWUgYnVmZmVyLlxuLy8gSXQgaXMgYWxzbyBkb25lIHRoaXMgd2F5IGFzIGEgc2xpZ2h0IHBlcmZvcm1hbmNlIGluY3JlYXNlIGluc3RlYWQgb2YgdXNpbmcgYVxuLy8gbG9vcC5cbmZ1bmN0aW9uIHV0ZjhDaGVja0V4dHJhQnl0ZXMoc2VsZiwgYnVmLCBwKSB7XG4gIGlmICgoYnVmWzBdICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICBzZWxmLmxhc3ROZWVkID0gMDtcbiAgICByZXR1cm4gJ1xcdWZmZmQnO1xuICB9XG4gIGlmIChzZWxmLmxhc3ROZWVkID4gMSAmJiBidWYubGVuZ3RoID4gMSkge1xuICAgIGlmICgoYnVmWzFdICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICAgIHNlbGYubGFzdE5lZWQgPSAxO1xuICAgICAgcmV0dXJuICdcXHVmZmZkJztcbiAgICB9XG4gICAgaWYgKHNlbGYubGFzdE5lZWQgPiAyICYmIGJ1Zi5sZW5ndGggPiAyKSB7XG4gICAgICBpZiAoKGJ1ZlsyXSAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICAgIHNlbGYubGFzdE5lZWQgPSAyO1xuICAgICAgICByZXR1cm4gJ1xcdWZmZmQnO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBBdHRlbXB0cyB0byBjb21wbGV0ZSBhIG11bHRpLWJ5dGUgVVRGLTggY2hhcmFjdGVyIHVzaW5nIGJ5dGVzIGZyb20gYSBCdWZmZXIuXG5mdW5jdGlvbiB1dGY4RmlsbExhc3QoYnVmKSB7XG4gIHZhciBwID0gdGhpcy5sYXN0VG90YWwgLSB0aGlzLmxhc3ROZWVkO1xuICB2YXIgciA9IHV0ZjhDaGVja0V4dHJhQnl0ZXModGhpcywgYnVmLCBwKTtcbiAgaWYgKHIgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHI7XG4gIGlmICh0aGlzLmxhc3ROZWVkIDw9IGJ1Zi5sZW5ndGgpIHtcbiAgICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCBwLCAwLCB0aGlzLmxhc3ROZWVkKTtcbiAgICByZXR1cm4gdGhpcy5sYXN0Q2hhci50b1N0cmluZyh0aGlzLmVuY29kaW5nLCAwLCB0aGlzLmxhc3RUb3RhbCk7XG4gIH1cbiAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgcCwgMCwgYnVmLmxlbmd0aCk7XG4gIHRoaXMubGFzdE5lZWQgLT0gYnVmLmxlbmd0aDtcbn1cblxuLy8gUmV0dXJucyBhbGwgY29tcGxldGUgVVRGLTggY2hhcmFjdGVycyBpbiBhIEJ1ZmZlci4gSWYgdGhlIEJ1ZmZlciBlbmRlZCBvbiBhXG4vLyBwYXJ0aWFsIGNoYXJhY3RlciwgdGhlIGNoYXJhY3RlcidzIGJ5dGVzIGFyZSBidWZmZXJlZCB1bnRpbCB0aGUgcmVxdWlyZWRcbi8vIG51bWJlciBvZiBieXRlcyBhcmUgYXZhaWxhYmxlLlxuZnVuY3Rpb24gdXRmOFRleHQoYnVmLCBpKSB7XG4gIHZhciB0b3RhbCA9IHV0ZjhDaGVja0luY29tcGxldGUodGhpcywgYnVmLCBpKTtcbiAgaWYgKCF0aGlzLmxhc3ROZWVkKSByZXR1cm4gYnVmLnRvU3RyaW5nKCd1dGY4JywgaSk7XG4gIHRoaXMubGFzdFRvdGFsID0gdG90YWw7XG4gIHZhciBlbmQgPSBidWYubGVuZ3RoIC0gKHRvdGFsIC0gdGhpcy5sYXN0TmVlZCk7XG4gIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIDAsIGVuZCk7XG4gIHJldHVybiBidWYudG9TdHJpbmcoJ3V0ZjgnLCBpLCBlbmQpO1xufVxuXG4vLyBGb3IgVVRGLTgsIGEgcmVwbGFjZW1lbnQgY2hhcmFjdGVyIGlzIGFkZGVkIHdoZW4gZW5kaW5nIG9uIGEgcGFydGlhbFxuLy8gY2hhcmFjdGVyLlxuZnVuY3Rpb24gdXRmOEVuZChidWYpIHtcbiAgdmFyIHIgPSBidWYgJiYgYnVmLmxlbmd0aCA/IHRoaXMud3JpdGUoYnVmKSA6ICcnO1xuICBpZiAodGhpcy5sYXN0TmVlZCkgcmV0dXJuIHIgKyAnXFx1ZmZmZCc7XG4gIHJldHVybiByO1xufVxuXG4vLyBVVEYtMTZMRSB0eXBpY2FsbHkgbmVlZHMgdHdvIGJ5dGVzIHBlciBjaGFyYWN0ZXIsIGJ1dCBldmVuIGlmIHdlIGhhdmUgYW4gZXZlblxuLy8gbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSwgd2UgbmVlZCB0byBjaGVjayBpZiB3ZSBlbmQgb24gYSBsZWFkaW5nL2hpZ2hcbi8vIHN1cnJvZ2F0ZS4gSW4gdGhhdCBjYXNlLCB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBuZXh0IHR3byBieXRlcyBpbiBvcmRlciB0b1xuLy8gZGVjb2RlIHRoZSBsYXN0IGNoYXJhY3RlciBwcm9wZXJseS5cbmZ1bmN0aW9uIHV0ZjE2VGV4dChidWYsIGkpIHtcbiAgaWYgKChidWYubGVuZ3RoIC0gaSkgJSAyID09PSAwKSB7XG4gICAgdmFyIHIgPSBidWYudG9TdHJpbmcoJ3V0ZjE2bGUnLCBpKTtcbiAgICBpZiAocikge1xuICAgICAgdmFyIGMgPSByLmNoYXJDb2RlQXQoci5sZW5ndGggLSAxKTtcbiAgICAgIGlmIChjID49IDB4RDgwMCAmJiBjIDw9IDB4REJGRikge1xuICAgICAgICB0aGlzLmxhc3ROZWVkID0gMjtcbiAgICAgICAgdGhpcy5sYXN0VG90YWwgPSA0O1xuICAgICAgICB0aGlzLmxhc3RDaGFyWzBdID0gYnVmW2J1Zi5sZW5ndGggLSAyXTtcbiAgICAgICAgdGhpcy5sYXN0Q2hhclsxXSA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gICAgICAgIHJldHVybiByLnNsaWNlKDAsIC0xKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cbiAgdGhpcy5sYXN0TmVlZCA9IDE7XG4gIHRoaXMubGFzdFRvdGFsID0gMjtcbiAgdGhpcy5sYXN0Q2hhclswXSA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gIHJldHVybiBidWYudG9TdHJpbmcoJ3V0ZjE2bGUnLCBpLCBidWYubGVuZ3RoIC0gMSk7XG59XG5cbi8vIEZvciBVVEYtMTZMRSB3ZSBkbyBub3QgZXhwbGljaXRseSBhcHBlbmQgc3BlY2lhbCByZXBsYWNlbWVudCBjaGFyYWN0ZXJzIGlmIHdlXG4vLyBlbmQgb24gYSBwYXJ0aWFsIGNoYXJhY3Rlciwgd2Ugc2ltcGx5IGxldCB2OCBoYW5kbGUgdGhhdC5cbmZ1bmN0aW9uIHV0ZjE2RW5kKGJ1Zikge1xuICB2YXIgciA9IGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogJyc7XG4gIGlmICh0aGlzLmxhc3ROZWVkKSB7XG4gICAgdmFyIGVuZCA9IHRoaXMubGFzdFRvdGFsIC0gdGhpcy5sYXN0TmVlZDtcbiAgICByZXR1cm4gciArIHRoaXMubGFzdENoYXIudG9TdHJpbmcoJ3V0ZjE2bGUnLCAwLCBlbmQpO1xuICB9XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBiYXNlNjRUZXh0KGJ1ZiwgaSkge1xuICB2YXIgbiA9IChidWYubGVuZ3RoIC0gaSkgJSAzO1xuICBpZiAobiA9PT0gMCkgcmV0dXJuIGJ1Zi50b1N0cmluZygnYmFzZTY0JywgaSk7XG4gIHRoaXMubGFzdE5lZWQgPSAzIC0gbjtcbiAgdGhpcy5sYXN0VG90YWwgPSAzO1xuICBpZiAobiA9PT0gMSkge1xuICAgIHRoaXMubGFzdENoYXJbMF0gPSBidWZbYnVmLmxlbmd0aCAtIDFdO1xuICB9IGVsc2Uge1xuICAgIHRoaXMubGFzdENoYXJbMF0gPSBidWZbYnVmLmxlbmd0aCAtIDJdO1xuICAgIHRoaXMubGFzdENoYXJbMV0gPSBidWZbYnVmLmxlbmd0aCAtIDFdO1xuICB9XG4gIHJldHVybiBidWYudG9TdHJpbmcoJ2Jhc2U2NCcsIGksIGJ1Zi5sZW5ndGggLSBuKTtcbn1cblxuZnVuY3Rpb24gYmFzZTY0RW5kKGJ1Zikge1xuICB2YXIgciA9IGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogJyc7XG4gIGlmICh0aGlzLmxhc3ROZWVkKSByZXR1cm4gciArIHRoaXMubGFzdENoYXIudG9TdHJpbmcoJ2Jhc2U2NCcsIDAsIDMgLSB0aGlzLmxhc3ROZWVkKTtcbiAgcmV0dXJuIHI7XG59XG5cbi8vIFBhc3MgYnl0ZXMgb24gdGhyb3VnaCBmb3Igc2luZ2xlLWJ5dGUgZW5jb2RpbmdzIChlLmcuIGFzY2lpLCBsYXRpbjEsIGhleClcbmZ1bmN0aW9uIHNpbXBsZVdyaXRlKGJ1Zikge1xuICByZXR1cm4gYnVmLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO1xufVxuXG5mdW5jdGlvbiBzaW1wbGVFbmQoYnVmKSB7XG4gIHJldHVybiBidWYgJiYgYnVmLmxlbmd0aCA/IHRoaXMud3JpdGUoYnVmKSA6ICcnO1xufSIsIi8vIFBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYWZpbnRvc2gvZW5kLW9mLXN0cmVhbSB3aXRoXG4vLyBwZXJtaXNzaW9uIGZyb20gdGhlIGF1dGhvciwgTWF0aGlhcyBCdXVzIChAbWFmaW50b3NoKS5cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UgPSByZXF1aXJlKCcuLi8uLi8uLi9lcnJvcnMnKS5jb2Rlcy5FUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRTtcbmZ1bmN0aW9uIG9uY2UoY2FsbGJhY2spIHtcbiAgdmFyIGNhbGxlZCA9IGZhbHNlO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmIChjYWxsZWQpIHJldHVybjtcbiAgICBjYWxsZWQgPSB0cnVlO1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgY2FsbGJhY2suYXBwbHkodGhpcywgYXJncyk7XG4gIH07XG59XG5mdW5jdGlvbiBub29wKCkge31cbmZ1bmN0aW9uIGlzUmVxdWVzdChzdHJlYW0pIHtcbiAgcmV0dXJuIHN0cmVhbS5zZXRIZWFkZXIgJiYgdHlwZW9mIHN0cmVhbS5hYm9ydCA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIGVvcyhzdHJlYW0sIG9wdHMsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGVvcyhzdHJlYW0sIG51bGwsIG9wdHMpO1xuICBpZiAoIW9wdHMpIG9wdHMgPSB7fTtcbiAgY2FsbGJhY2sgPSBvbmNlKGNhbGxiYWNrIHx8IG5vb3ApO1xuICB2YXIgcmVhZGFibGUgPSBvcHRzLnJlYWRhYmxlIHx8IG9wdHMucmVhZGFibGUgIT09IGZhbHNlICYmIHN0cmVhbS5yZWFkYWJsZTtcbiAgdmFyIHdyaXRhYmxlID0gb3B0cy53cml0YWJsZSB8fCBvcHRzLndyaXRhYmxlICE9PSBmYWxzZSAmJiBzdHJlYW0ud3JpdGFibGU7XG4gIHZhciBvbmxlZ2FjeWZpbmlzaCA9IGZ1bmN0aW9uIG9ubGVnYWN5ZmluaXNoKCkge1xuICAgIGlmICghc3RyZWFtLndyaXRhYmxlKSBvbmZpbmlzaCgpO1xuICB9O1xuICB2YXIgd3JpdGFibGVFbmRlZCA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZSAmJiBzdHJlYW0uX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQ7XG4gIHZhciBvbmZpbmlzaCA9IGZ1bmN0aW9uIG9uZmluaXNoKCkge1xuICAgIHdyaXRhYmxlID0gZmFsc2U7XG4gICAgd3JpdGFibGVFbmRlZCA9IHRydWU7XG4gICAgaWYgKCFyZWFkYWJsZSkgY2FsbGJhY2suY2FsbChzdHJlYW0pO1xuICB9O1xuICB2YXIgcmVhZGFibGVFbmRlZCA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZSAmJiBzdHJlYW0uX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZDtcbiAgdmFyIG9uZW5kID0gZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgcmVhZGFibGUgPSBmYWxzZTtcbiAgICByZWFkYWJsZUVuZGVkID0gdHJ1ZTtcbiAgICBpZiAoIXdyaXRhYmxlKSBjYWxsYmFjay5jYWxsKHN0cmVhbSk7XG4gIH07XG4gIHZhciBvbmVycm9yID0gZnVuY3Rpb24gb25lcnJvcihlcnIpIHtcbiAgICBjYWxsYmFjay5jYWxsKHN0cmVhbSwgZXJyKTtcbiAgfTtcbiAgdmFyIG9uY2xvc2UgPSBmdW5jdGlvbiBvbmNsb3NlKCkge1xuICAgIHZhciBlcnI7XG4gICAgaWYgKHJlYWRhYmxlICYmICFyZWFkYWJsZUVuZGVkKSB7XG4gICAgICBpZiAoIXN0cmVhbS5fcmVhZGFibGVTdGF0ZSB8fCAhc3RyZWFtLl9yZWFkYWJsZVN0YXRlLmVuZGVkKSBlcnIgPSBuZXcgRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UoKTtcbiAgICAgIHJldHVybiBjYWxsYmFjay5jYWxsKHN0cmVhbSwgZXJyKTtcbiAgICB9XG4gICAgaWYgKHdyaXRhYmxlICYmICF3cml0YWJsZUVuZGVkKSB7XG4gICAgICBpZiAoIXN0cmVhbS5fd3JpdGFibGVTdGF0ZSB8fCAhc3RyZWFtLl93cml0YWJsZVN0YXRlLmVuZGVkKSBlcnIgPSBuZXcgRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UoKTtcbiAgICAgIHJldHVybiBjYWxsYmFjay5jYWxsKHN0cmVhbSwgZXJyKTtcbiAgICB9XG4gIH07XG4gIHZhciBvbnJlcXVlc3QgPSBmdW5jdGlvbiBvbnJlcXVlc3QoKSB7XG4gICAgc3RyZWFtLnJlcS5vbignZmluaXNoJywgb25maW5pc2gpO1xuICB9O1xuICBpZiAoaXNSZXF1ZXN0KHN0cmVhbSkpIHtcbiAgICBzdHJlYW0ub24oJ2NvbXBsZXRlJywgb25maW5pc2gpO1xuICAgIHN0cmVhbS5vbignYWJvcnQnLCBvbmNsb3NlKTtcbiAgICBpZiAoc3RyZWFtLnJlcSkgb25yZXF1ZXN0KCk7ZWxzZSBzdHJlYW0ub24oJ3JlcXVlc3QnLCBvbnJlcXVlc3QpO1xuICB9IGVsc2UgaWYgKHdyaXRhYmxlICYmICFzdHJlYW0uX3dyaXRhYmxlU3RhdGUpIHtcbiAgICAvLyBsZWdhY3kgc3RyZWFtc1xuICAgIHN0cmVhbS5vbignZW5kJywgb25sZWdhY3lmaW5pc2gpO1xuICAgIHN0cmVhbS5vbignY2xvc2UnLCBvbmxlZ2FjeWZpbmlzaCk7XG4gIH1cbiAgc3RyZWFtLm9uKCdlbmQnLCBvbmVuZCk7XG4gIHN0cmVhbS5vbignZmluaXNoJywgb25maW5pc2gpO1xuICBpZiAob3B0cy5lcnJvciAhPT0gZmFsc2UpIHN0cmVhbS5vbignZXJyb3InLCBvbmVycm9yKTtcbiAgc3RyZWFtLm9uKCdjbG9zZScsIG9uY2xvc2UpO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignY29tcGxldGUnLCBvbmZpbmlzaCk7XG4gICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdhYm9ydCcsIG9uY2xvc2UpO1xuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcigncmVxdWVzdCcsIG9ucmVxdWVzdCk7XG4gICAgaWYgKHN0cmVhbS5yZXEpIHN0cmVhbS5yZXEucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9ubGVnYWN5ZmluaXNoKTtcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25sZWdhY3lmaW5pc2gpO1xuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGVvczsiLCIndXNlIHN0cmljdCc7XG5cbnZhciBfT2JqZWN0JHNldFByb3RvdHlwZU87XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkoYXJnKSB7IHZhciBrZXkgPSBfdG9QcmltaXRpdmUoYXJnLCBcInN0cmluZ1wiKTsgcmV0dXJuIHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIgPyBrZXkgOiBTdHJpbmcoa2V5KTsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKGlucHV0LCBoaW50KSB7IGlmICh0eXBlb2YgaW5wdXQgIT09IFwib2JqZWN0XCIgfHwgaW5wdXQgPT09IG51bGwpIHJldHVybiBpbnB1dDsgdmFyIHByaW0gPSBpbnB1dFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAocHJpbSAhPT0gdW5kZWZpbmVkKSB7IHZhciByZXMgPSBwcmltLmNhbGwoaW5wdXQsIGhpbnQgfHwgXCJkZWZhdWx0XCIpOyBpZiAodHlwZW9mIHJlcyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHJlczsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoaGludCA9PT0gXCJzdHJpbmdcIiA/IFN0cmluZyA6IE51bWJlcikoaW5wdXQpOyB9XG52YXIgZmluaXNoZWQgPSByZXF1aXJlKCcuL2VuZC1vZi1zdHJlYW0nKTtcbnZhciBrTGFzdFJlc29sdmUgPSBTeW1ib2woJ2xhc3RSZXNvbHZlJyk7XG52YXIga0xhc3RSZWplY3QgPSBTeW1ib2woJ2xhc3RSZWplY3QnKTtcbnZhciBrRXJyb3IgPSBTeW1ib2woJ2Vycm9yJyk7XG52YXIga0VuZGVkID0gU3ltYm9sKCdlbmRlZCcpO1xudmFyIGtMYXN0UHJvbWlzZSA9IFN5bWJvbCgnbGFzdFByb21pc2UnKTtcbnZhciBrSGFuZGxlUHJvbWlzZSA9IFN5bWJvbCgnaGFuZGxlUHJvbWlzZScpO1xudmFyIGtTdHJlYW0gPSBTeW1ib2woJ3N0cmVhbScpO1xuZnVuY3Rpb24gY3JlYXRlSXRlclJlc3VsdCh2YWx1ZSwgZG9uZSkge1xuICByZXR1cm4ge1xuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBkb25lOiBkb25lXG4gIH07XG59XG5mdW5jdGlvbiByZWFkQW5kUmVzb2x2ZShpdGVyKSB7XG4gIHZhciByZXNvbHZlID0gaXRlcltrTGFzdFJlc29sdmVdO1xuICBpZiAocmVzb2x2ZSAhPT0gbnVsbCkge1xuICAgIHZhciBkYXRhID0gaXRlcltrU3RyZWFtXS5yZWFkKCk7XG4gICAgLy8gd2UgZGVmZXIgaWYgZGF0YSBpcyBudWxsXG4gICAgLy8gd2UgY2FuIGJlIGV4cGVjdGluZyBlaXRoZXIgJ2VuZCcgb3JcbiAgICAvLyAnZXJyb3InXG4gICAgaWYgKGRhdGEgIT09IG51bGwpIHtcbiAgICAgIGl0ZXJba0xhc3RQcm9taXNlXSA9IG51bGw7XG4gICAgICBpdGVyW2tMYXN0UmVzb2x2ZV0gPSBudWxsO1xuICAgICAgaXRlcltrTGFzdFJlamVjdF0gPSBudWxsO1xuICAgICAgcmVzb2x2ZShjcmVhdGVJdGVyUmVzdWx0KGRhdGEsIGZhbHNlKSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBvblJlYWRhYmxlKGl0ZXIpIHtcbiAgLy8gd2Ugd2FpdCBmb3IgdGhlIG5leHQgdGljaywgYmVjYXVzZSBpdCBtaWdodFxuICAvLyBlbWl0IGFuIGVycm9yIHdpdGggcHJvY2Vzcy5uZXh0VGlja1xuICBwcm9jZXNzLm5leHRUaWNrKHJlYWRBbmRSZXNvbHZlLCBpdGVyKTtcbn1cbmZ1bmN0aW9uIHdyYXBGb3JOZXh0KGxhc3RQcm9taXNlLCBpdGVyKSB7XG4gIHJldHVybiBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgbGFzdFByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoaXRlcltrRW5kZWRdKSB7XG4gICAgICAgIHJlc29sdmUoY3JlYXRlSXRlclJlc3VsdCh1bmRlZmluZWQsIHRydWUpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaXRlcltrSGFuZGxlUHJvbWlzZV0ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICB9LCByZWplY3QpO1xuICB9O1xufVxudmFyIEFzeW5jSXRlcmF0b3JQcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZnVuY3Rpb24gKCkge30pO1xudmFyIFJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvclByb3RvdHlwZSA9IE9iamVjdC5zZXRQcm90b3R5cGVPZigoX09iamVjdCRzZXRQcm90b3R5cGVPID0ge1xuICBnZXQgc3RyZWFtKCkge1xuICAgIHJldHVybiB0aGlzW2tTdHJlYW1dO1xuICB9LFxuICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgLy8gaWYgd2UgaGF2ZSBkZXRlY3RlZCBhbiBlcnJvciBpbiB0aGUgbWVhbndoaWxlXG4gICAgLy8gcmVqZWN0IHN0cmFpZ2h0IGF3YXlcbiAgICB2YXIgZXJyb3IgPSB0aGlzW2tFcnJvcl07XG4gICAgaWYgKGVycm9yICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgIH1cbiAgICBpZiAodGhpc1trRW5kZWRdKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNyZWF0ZUl0ZXJSZXN1bHQodW5kZWZpbmVkLCB0cnVlKSk7XG4gICAgfVxuICAgIGlmICh0aGlzW2tTdHJlYW1dLmRlc3Ryb3llZCkge1xuICAgICAgLy8gV2UgbmVlZCB0byBkZWZlciB2aWEgbmV4dFRpY2sgYmVjYXVzZSBpZiAuZGVzdHJveShlcnIpIGlzXG4gICAgICAvLyBjYWxsZWQsIHRoZSBlcnJvciB3aWxsIGJlIGVtaXR0ZWQgdmlhIG5leHRUaWNrLCBhbmRcbiAgICAgIC8vIHdlIGNhbm5vdCBndWFyYW50ZWUgdGhhdCB0aGVyZSBpcyBubyBlcnJvciBsaW5nZXJpbmcgYXJvdW5kXG4gICAgICAvLyB3YWl0aW5nIHRvIGJlIGVtaXR0ZWQuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoX3RoaXNba0Vycm9yXSkge1xuICAgICAgICAgICAgcmVqZWN0KF90aGlzW2tFcnJvcl0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKGNyZWF0ZUl0ZXJSZXN1bHQodW5kZWZpbmVkLCB0cnVlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGlmIHdlIGhhdmUgbXVsdGlwbGUgbmV4dCgpIGNhbGxzXG4gICAgLy8gd2Ugd2lsbCB3YWl0IGZvciB0aGUgcHJldmlvdXMgUHJvbWlzZSB0byBmaW5pc2hcbiAgICAvLyB0aGlzIGxvZ2ljIGlzIG9wdGltaXplZCB0byBzdXBwb3J0IGZvciBhd2FpdCBsb29wcyxcbiAgICAvLyB3aGVyZSBuZXh0KCkgaXMgb25seSBjYWxsZWQgb25jZSBhdCBhIHRpbWVcbiAgICB2YXIgbGFzdFByb21pc2UgPSB0aGlzW2tMYXN0UHJvbWlzZV07XG4gICAgdmFyIHByb21pc2U7XG4gICAgaWYgKGxhc3RQcm9taXNlKSB7XG4gICAgICBwcm9taXNlID0gbmV3IFByb21pc2Uod3JhcEZvck5leHQobGFzdFByb21pc2UsIHRoaXMpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZmFzdCBwYXRoIG5lZWRlZCB0byBzdXBwb3J0IG11bHRpcGxlIHRoaXMucHVzaCgpXG4gICAgICAvLyB3aXRob3V0IHRyaWdnZXJpbmcgdGhlIG5leHQoKSBxdWV1ZVxuICAgICAgdmFyIGRhdGEgPSB0aGlzW2tTdHJlYW1dLnJlYWQoKTtcbiAgICAgIGlmIChkYXRhICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY3JlYXRlSXRlclJlc3VsdChkYXRhLCBmYWxzZSkpO1xuICAgICAgfVxuICAgICAgcHJvbWlzZSA9IG5ldyBQcm9taXNlKHRoaXNba0hhbmRsZVByb21pc2VdKTtcbiAgICB9XG4gICAgdGhpc1trTGFzdFByb21pc2VdID0gcHJvbWlzZTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxufSwgX2RlZmluZVByb3BlcnR5KF9PYmplY3Qkc2V0UHJvdG90eXBlTywgU3ltYm9sLmFzeW5jSXRlcmF0b3IsIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXM7XG59KSwgX2RlZmluZVByb3BlcnR5KF9PYmplY3Qkc2V0UHJvdG90eXBlTywgXCJyZXR1cm5cIiwgZnVuY3Rpb24gX3JldHVybigpIHtcbiAgdmFyIF90aGlzMiA9IHRoaXM7XG4gIC8vIGRlc3Ryb3koZXJyLCBjYikgaXMgYSBwcml2YXRlIEFQSVxuICAvLyB3ZSBjYW4gZ3VhcmFudGVlIHdlIGhhdmUgdGhhdCBoZXJlLCBiZWNhdXNlIHdlIGNvbnRyb2wgdGhlXG4gIC8vIFJlYWRhYmxlIGNsYXNzIHRoaXMgaXMgYXR0YWNoZWQgdG9cbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBfdGhpczJba1N0cmVhbV0uZGVzdHJveShudWxsLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKGNyZWF0ZUl0ZXJSZXN1bHQodW5kZWZpbmVkLCB0cnVlKSk7XG4gICAgfSk7XG4gIH0pO1xufSksIF9PYmplY3Qkc2V0UHJvdG90eXBlTyksIEFzeW5jSXRlcmF0b3JQcm90b3R5cGUpO1xudmFyIGNyZWF0ZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvciA9IGZ1bmN0aW9uIGNyZWF0ZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcihzdHJlYW0pIHtcbiAgdmFyIF9PYmplY3QkY3JlYXRlO1xuICB2YXIgaXRlcmF0b3IgPSBPYmplY3QuY3JlYXRlKFJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvclByb3RvdHlwZSwgKF9PYmplY3QkY3JlYXRlID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfT2JqZWN0JGNyZWF0ZSwga1N0cmVhbSwge1xuICAgIHZhbHVlOiBzdHJlYW0sXG4gICAgd3JpdGFibGU6IHRydWVcbiAgfSksIF9kZWZpbmVQcm9wZXJ0eShfT2JqZWN0JGNyZWF0ZSwga0xhc3RSZXNvbHZlLCB7XG4gICAgdmFsdWU6IG51bGwsXG4gICAgd3JpdGFibGU6IHRydWVcbiAgfSksIF9kZWZpbmVQcm9wZXJ0eShfT2JqZWN0JGNyZWF0ZSwga0xhc3RSZWplY3QsIHtcbiAgICB2YWx1ZTogbnVsbCxcbiAgICB3cml0YWJsZTogdHJ1ZVxuICB9KSwgX2RlZmluZVByb3BlcnR5KF9PYmplY3QkY3JlYXRlLCBrRXJyb3IsIHtcbiAgICB2YWx1ZTogbnVsbCxcbiAgICB3cml0YWJsZTogdHJ1ZVxuICB9KSwgX2RlZmluZVByb3BlcnR5KF9PYmplY3QkY3JlYXRlLCBrRW5kZWQsIHtcbiAgICB2YWx1ZTogc3RyZWFtLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQsXG4gICAgd3JpdGFibGU6IHRydWVcbiAgfSksIF9kZWZpbmVQcm9wZXJ0eShfT2JqZWN0JGNyZWF0ZSwga0hhbmRsZVByb21pc2UsIHtcbiAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgZGF0YSA9IGl0ZXJhdG9yW2tTdHJlYW1dLnJlYWQoKTtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGl0ZXJhdG9yW2tMYXN0UHJvbWlzZV0gPSBudWxsO1xuICAgICAgICBpdGVyYXRvcltrTGFzdFJlc29sdmVdID0gbnVsbDtcbiAgICAgICAgaXRlcmF0b3Jba0xhc3RSZWplY3RdID0gbnVsbDtcbiAgICAgICAgcmVzb2x2ZShjcmVhdGVJdGVyUmVzdWx0KGRhdGEsIGZhbHNlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVyYXRvcltrTGFzdFJlc29sdmVdID0gcmVzb2x2ZTtcbiAgICAgICAgaXRlcmF0b3Jba0xhc3RSZWplY3RdID0gcmVqZWN0O1xuICAgICAgfVxuICAgIH0sXG4gICAgd3JpdGFibGU6IHRydWVcbiAgfSksIF9PYmplY3QkY3JlYXRlKSk7XG4gIGl0ZXJhdG9yW2tMYXN0UHJvbWlzZV0gPSBudWxsO1xuICBmaW5pc2hlZChzdHJlYW0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoZXJyICYmIGVyci5jb2RlICE9PSAnRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UnKSB7XG4gICAgICB2YXIgcmVqZWN0ID0gaXRlcmF0b3Jba0xhc3RSZWplY3RdO1xuICAgICAgLy8gcmVqZWN0IGlmIHdlIGFyZSB3YWl0aW5nIGZvciBkYXRhIGluIHRoZSBQcm9taXNlXG4gICAgICAvLyByZXR1cm5lZCBieSBuZXh0KCkgYW5kIHN0b3JlIHRoZSBlcnJvclxuICAgICAgaWYgKHJlamVjdCAhPT0gbnVsbCkge1xuICAgICAgICBpdGVyYXRvcltrTGFzdFByb21pc2VdID0gbnVsbDtcbiAgICAgICAgaXRlcmF0b3Jba0xhc3RSZXNvbHZlXSA9IG51bGw7XG4gICAgICAgIGl0ZXJhdG9yW2tMYXN0UmVqZWN0XSA9IG51bGw7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgfVxuICAgICAgaXRlcmF0b3Jba0Vycm9yXSA9IGVycjtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHJlc29sdmUgPSBpdGVyYXRvcltrTGFzdFJlc29sdmVdO1xuICAgIGlmIChyZXNvbHZlICE9PSBudWxsKSB7XG4gICAgICBpdGVyYXRvcltrTGFzdFByb21pc2VdID0gbnVsbDtcbiAgICAgIGl0ZXJhdG9yW2tMYXN0UmVzb2x2ZV0gPSBudWxsO1xuICAgICAgaXRlcmF0b3Jba0xhc3RSZWplY3RdID0gbnVsbDtcbiAgICAgIHJlc29sdmUoY3JlYXRlSXRlclJlc3VsdCh1bmRlZmluZWQsIHRydWUpKTtcbiAgICB9XG4gICAgaXRlcmF0b3Jba0VuZGVkXSA9IHRydWU7XG4gIH0pO1xuICBzdHJlYW0ub24oJ3JlYWRhYmxlJywgb25SZWFkYWJsZS5iaW5kKG51bGwsIGl0ZXJhdG9yKSk7XG4gIHJldHVybiBpdGVyYXRvcjtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcjsiLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHsgdHJ5IHsgdmFyIGluZm8gPSBnZW5ba2V5XShhcmcpOyB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlOyB9IGNhdGNoIChlcnJvcikgeyByZWplY3QoZXJyb3IpOyByZXR1cm47IH0gaWYgKGluZm8uZG9uZSkgeyByZXNvbHZlKHZhbHVlKTsgfSBlbHNlIHsgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpOyB9IH1cbmZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHZhciBzZWxmID0gdGhpcywgYXJncyA9IGFyZ3VtZW50czsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpOyBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkgeyBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwibmV4dFwiLCB2YWx1ZSk7IH0gZnVuY3Rpb24gX3Rocm93KGVycikgeyBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwidGhyb3dcIiwgZXJyKTsgfSBfbmV4dCh1bmRlZmluZWQpOyB9KTsgfTsgfVxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkoYXJnKSB7IHZhciBrZXkgPSBfdG9QcmltaXRpdmUoYXJnLCBcInN0cmluZ1wiKTsgcmV0dXJuIHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIgPyBrZXkgOiBTdHJpbmcoa2V5KTsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKGlucHV0LCBoaW50KSB7IGlmICh0eXBlb2YgaW5wdXQgIT09IFwib2JqZWN0XCIgfHwgaW5wdXQgPT09IG51bGwpIHJldHVybiBpbnB1dDsgdmFyIHByaW0gPSBpbnB1dFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAocHJpbSAhPT0gdW5kZWZpbmVkKSB7IHZhciByZXMgPSBwcmltLmNhbGwoaW5wdXQsIGhpbnQgfHwgXCJkZWZhdWx0XCIpOyBpZiAodHlwZW9mIHJlcyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHJlczsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoaGludCA9PT0gXCJzdHJpbmdcIiA/IFN0cmluZyA6IE51bWJlcikoaW5wdXQpOyB9XG52YXIgRVJSX0lOVkFMSURfQVJHX1RZUEUgPSByZXF1aXJlKCcuLi8uLi8uLi9lcnJvcnMnKS5jb2Rlcy5FUlJfSU5WQUxJRF9BUkdfVFlQRTtcbmZ1bmN0aW9uIGZyb20oUmVhZGFibGUsIGl0ZXJhYmxlLCBvcHRzKSB7XG4gIHZhciBpdGVyYXRvcjtcbiAgaWYgKGl0ZXJhYmxlICYmIHR5cGVvZiBpdGVyYWJsZS5uZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaXRlcmF0b3IgPSBpdGVyYWJsZTtcbiAgfSBlbHNlIGlmIChpdGVyYWJsZSAmJiBpdGVyYWJsZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0pIGl0ZXJhdG9yID0gaXRlcmFibGVbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7ZWxzZSBpZiAoaXRlcmFibGUgJiYgaXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSkgaXRlcmF0b3IgPSBpdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7ZWxzZSB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2l0ZXJhYmxlJywgWydJdGVyYWJsZSddLCBpdGVyYWJsZSk7XG4gIHZhciByZWFkYWJsZSA9IG5ldyBSZWFkYWJsZShfb2JqZWN0U3ByZWFkKHtcbiAgICBvYmplY3RNb2RlOiB0cnVlXG4gIH0sIG9wdHMpKTtcbiAgLy8gUmVhZGluZyBib29sZWFuIHRvIHByb3RlY3QgYWdhaW5zdCBfcmVhZFxuICAvLyBiZWluZyBjYWxsZWQgYmVmb3JlIGxhc3QgaXRlcmF0aW9uIGNvbXBsZXRpb24uXG4gIHZhciByZWFkaW5nID0gZmFsc2U7XG4gIHJlYWRhYmxlLl9yZWFkID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghcmVhZGluZykge1xuICAgICAgcmVhZGluZyA9IHRydWU7XG4gICAgICBuZXh0KCk7XG4gICAgfVxuICB9O1xuICBmdW5jdGlvbiBuZXh0KCkge1xuICAgIHJldHVybiBfbmV4dDIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuICBmdW5jdGlvbiBfbmV4dDIoKSB7XG4gICAgX25leHQyID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qICgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBfeWllbGQkaXRlcmF0b3IkbmV4dCA9IHlpZWxkIGl0ZXJhdG9yLm5leHQoKSxcbiAgICAgICAgICB2YWx1ZSA9IF95aWVsZCRpdGVyYXRvciRuZXh0LnZhbHVlLFxuICAgICAgICAgIGRvbmUgPSBfeWllbGQkaXRlcmF0b3IkbmV4dC5kb25lO1xuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgIHJlYWRhYmxlLnB1c2gobnVsbCk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVhZGFibGUucHVzaCh5aWVsZCB2YWx1ZSkpIHtcbiAgICAgICAgICBuZXh0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVhZGluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmVhZGFibGUuZGVzdHJveShlcnIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBfbmV4dDIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuICByZXR1cm4gcmVhZGFibGU7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGZyb207XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWRhYmxlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIER1cGxleDtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5SZWFkYWJsZS5SZWFkYWJsZVN0YXRlID0gUmVhZGFibGVTdGF0ZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcbnZhciBFRWxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbiBFRWxpc3RlbmVyQ291bnQoZW1pdHRlciwgdHlwZSkge1xuICByZXR1cm4gZW1pdHRlci5saXN0ZW5lcnModHlwZSkubGVuZ3RoO1xufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIFN0cmVhbSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9zdHJlYW0nKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xudmFyIE91clVpbnQ4QXJyYXkgPSAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fSkuVWludDhBcnJheSB8fCBmdW5jdGlvbiAoKSB7fTtcbmZ1bmN0aW9uIF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGNodW5rKTtcbn1cbmZ1bmN0aW9uIF9pc1VpbnQ4QXJyYXkob2JqKSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIob2JqKSB8fCBvYmogaW5zdGFuY2VvZiBPdXJVaW50OEFycmF5O1xufVxuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGRlYnVnVXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBkZWJ1ZztcbmlmIChkZWJ1Z1V0aWwgJiYgZGVidWdVdGlsLmRlYnVnbG9nKSB7XG4gIGRlYnVnID0gZGVidWdVdGlsLmRlYnVnbG9nKCdzdHJlYW0nKTtcbn0gZWxzZSB7XG4gIGRlYnVnID0gZnVuY3Rpb24gZGVidWcoKSB7fTtcbn1cbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgQnVmZmVyTGlzdCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9idWZmZXJfbGlzdCcpO1xudmFyIGRlc3Ryb3lJbXBsID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3knKTtcbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9zdGF0ZScpLFxuICBnZXRIaWdoV2F0ZXJNYXJrID0gX3JlcXVpcmUuZ2V0SGlnaFdhdGVyTWFyaztcbnZhciBfcmVxdWlyZSRjb2RlcyA9IHJlcXVpcmUoJy4uL2Vycm9ycycpLmNvZGVzLFxuICBFUlJfSU5WQUxJRF9BUkdfVFlQRSA9IF9yZXF1aXJlJGNvZGVzLkVSUl9JTlZBTElEX0FSR19UWVBFLFxuICBFUlJfU1RSRUFNX1BVU0hfQUZURVJfRU9GID0gX3JlcXVpcmUkY29kZXMuRVJSX1NUUkVBTV9QVVNIX0FGVEVSX0VPRixcbiAgRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQgPSBfcmVxdWlyZSRjb2Rlcy5FUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCxcbiAgRVJSX1NUUkVBTV9VTlNISUZUX0FGVEVSX0VORF9FVkVOVCA9IF9yZXF1aXJlJGNvZGVzLkVSUl9TVFJFQU1fVU5TSElGVF9BRlRFUl9FTkRfRVZFTlQ7XG5cbi8vIExhenkgbG9hZGVkIHRvIGltcHJvdmUgdGhlIHN0YXJ0dXAgcGVyZm9ybWFuY2UuXG52YXIgU3RyaW5nRGVjb2RlcjtcbnZhciBjcmVhdGVSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3I7XG52YXIgZnJvbTtcbnJlcXVpcmUoJ2luaGVyaXRzJykoUmVhZGFibGUsIFN0cmVhbSk7XG52YXIgZXJyb3JPckRlc3Ryb3kgPSBkZXN0cm95SW1wbC5lcnJvck9yRGVzdHJveTtcbnZhciBrUHJveHlFdmVudHMgPSBbJ2Vycm9yJywgJ2Nsb3NlJywgJ2Rlc3Ryb3knLCAncGF1c2UnLCAncmVzdW1lJ107XG5mdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIoZW1pdHRlciwgZXZlbnQsIGZuKSB7XG4gIC8vIFNhZGx5IHRoaXMgaXMgbm90IGNhY2hlYWJsZSBhcyBzb21lIGxpYnJhcmllcyBidW5kbGUgdGhlaXIgb3duXG4gIC8vIGV2ZW50IGVtaXR0ZXIgaW1wbGVtZW50YXRpb24gd2l0aCB0aGVtLlxuICBpZiAodHlwZW9mIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSByZXR1cm4gZW1pdHRlci5wcmVwZW5kTGlzdGVuZXIoZXZlbnQsIGZuKTtcblxuICAvLyBUaGlzIGlzIGEgaGFjayB0byBtYWtlIHN1cmUgdGhhdCBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgYW55XG4gIC8vIHVzZXJsYW5kIG9uZXMuICBORVZFUiBETyBUSElTLiBUaGlzIGlzIGhlcmUgb25seSBiZWNhdXNlIHRoaXMgY29kZSBuZWVkc1xuICAvLyB0byBjb250aW51ZSB0byB3b3JrIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgTm9kZS5qcyB0aGF0IGRvIG5vdCBpbmNsdWRlXG4gIC8vIHRoZSBwcmVwZW5kTGlzdGVuZXIoKSBtZXRob2QuIFRoZSBnb2FsIGlzIHRvIGV2ZW50dWFsbHkgcmVtb3ZlIHRoaXMgaGFjay5cbiAgaWYgKCFlbWl0dGVyLl9ldmVudHMgfHwgIWVtaXR0ZXIuX2V2ZW50c1tldmVudF0pIGVtaXR0ZXIub24oZXZlbnQsIGZuKTtlbHNlIGlmIChBcnJheS5pc0FycmF5KGVtaXR0ZXIuX2V2ZW50c1tldmVudF0pKSBlbWl0dGVyLl9ldmVudHNbZXZlbnRdLnVuc2hpZnQoZm4pO2Vsc2UgZW1pdHRlci5fZXZlbnRzW2V2ZW50XSA9IFtmbiwgZW1pdHRlci5fZXZlbnRzW2V2ZW50XV07XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHN0cmVhbSwgaXNEdXBsZXgpIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gRHVwbGV4IHN0cmVhbXMgYXJlIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLCBidXQgc2hhcmVcbiAgLy8gdGhlIHNhbWUgb3B0aW9ucyBvYmplY3QuXG4gIC8vIEhvd2V2ZXIsIHNvbWUgY2FzZXMgcmVxdWlyZSBzZXR0aW5nIG9wdGlvbnMgdG8gZGlmZmVyZW50XG4gIC8vIHZhbHVlcyBmb3IgdGhlIHJlYWRhYmxlIGFuZCB0aGUgd3JpdGFibGUgc2lkZXMgb2YgdGhlIGR1cGxleCBzdHJlYW0uXG4gIC8vIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHByb3ZpZGVkIHNlcGFyYXRlbHkgYXMgcmVhZGFibGVYWFggYW5kIHdyaXRhYmxlWFhYLlxuICBpZiAodHlwZW9mIGlzRHVwbGV4ICE9PSAnYm9vbGVhbicpIGlzRHVwbGV4ID0gc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4O1xuXG4gIC8vIG9iamVjdCBzdHJlYW0gZmxhZy4gVXNlZCB0byBtYWtlIHJlYWQobikgaWdub3JlIG4gYW5kIHRvXG4gIC8vIG1ha2UgYWxsIHRoZSBidWZmZXIgbWVyZ2luZyBhbmQgbGVuZ3RoIGNoZWNrcyBnbyBhd2F5XG4gIHRoaXMub2JqZWN0TW9kZSA9ICEhb3B0aW9ucy5vYmplY3RNb2RlO1xuICBpZiAoaXNEdXBsZXgpIHRoaXMub2JqZWN0TW9kZSA9IHRoaXMub2JqZWN0TW9kZSB8fCAhIW9wdGlvbnMucmVhZGFibGVPYmplY3RNb2RlO1xuXG4gIC8vIHRoZSBwb2ludCBhdCB3aGljaCBpdCBzdG9wcyBjYWxsaW5nIF9yZWFkKCkgdG8gZmlsbCB0aGUgYnVmZmVyXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgXCJkb24ndCBjYWxsIF9yZWFkIHByZWVtcHRpdmVseSBldmVyXCJcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gZ2V0SGlnaFdhdGVyTWFyayh0aGlzLCBvcHRpb25zLCAncmVhZGFibGVIaWdoV2F0ZXJNYXJrJywgaXNEdXBsZXgpO1xuXG4gIC8vIEEgbGlua2VkIGxpc3QgaXMgdXNlZCB0byBzdG9yZSBkYXRhIGNodW5rcyBpbnN0ZWFkIG9mIGFuIGFycmF5IGJlY2F1c2UgdGhlXG4gIC8vIGxpbmtlZCBsaXN0IGNhbiByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgYmVnaW5uaW5nIGZhc3RlciB0aGFuXG4gIC8vIGFycmF5LnNoaWZ0KClcbiAgdGhpcy5idWZmZXIgPSBuZXcgQnVmZmVyTGlzdCgpO1xuICB0aGlzLmxlbmd0aCA9IDA7XG4gIHRoaXMucGlwZXMgPSBudWxsO1xuICB0aGlzLnBpcGVzQ291bnQgPSAwO1xuICB0aGlzLmZsb3dpbmcgPSBudWxsO1xuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIHRoaXMuZW5kRW1pdHRlZCA9IGZhbHNlO1xuICB0aGlzLnJlYWRpbmcgPSBmYWxzZTtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBldmVudCAncmVhZGFibGUnLydkYXRhJyBpcyBlbWl0dGVkXG4gIC8vIGltbWVkaWF0ZWx5LCBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlXG4gIC8vIGFueSBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCByZWFkIGNhbGwuXG4gIHRoaXMuc3luYyA9IHRydWU7XG5cbiAgLy8gd2hlbmV2ZXIgd2UgcmV0dXJuIG51bGwsIHRoZW4gd2Ugc2V0IGEgZmxhZyB0byBzYXlcbiAgLy8gdGhhdCB3ZSdyZSBhd2FpdGluZyBhICdyZWFkYWJsZScgZXZlbnQgZW1pc3Npb24uXG4gIHRoaXMubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMucmVhZGFibGVMaXN0ZW5pbmcgPSBmYWxzZTtcbiAgdGhpcy5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgdGhpcy5wYXVzZWQgPSB0cnVlO1xuXG4gIC8vIFNob3VsZCBjbG9zZSBiZSBlbWl0dGVkIG9uIGRlc3Ryb3kuIERlZmF1bHRzIHRvIHRydWUuXG4gIHRoaXMuZW1pdENsb3NlID0gb3B0aW9ucy5lbWl0Q2xvc2UgIT09IGZhbHNlO1xuXG4gIC8vIFNob3VsZCAuZGVzdHJveSgpIGJlIGNhbGxlZCBhZnRlciAnZW5kJyAoYW5kIHBvdGVudGlhbGx5ICdmaW5pc2gnKVxuICB0aGlzLmF1dG9EZXN0cm95ID0gISFvcHRpb25zLmF1dG9EZXN0cm95O1xuXG4gIC8vIGhhcyBpdCBiZWVuIGRlc3Ryb3llZFxuICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIHRoZSBudW1iZXIgb2Ygd3JpdGVycyB0aGF0IGFyZSBhd2FpdGluZyBhIGRyYWluIGV2ZW50IGluIC5waXBlKClzXG4gIHRoaXMuYXdhaXREcmFpbiA9IDA7XG5cbiAgLy8gaWYgdHJ1ZSwgYSBtYXliZVJlYWRNb3JlIGhhcyBiZWVuIHNjaGVkdWxlZFxuICB0aGlzLnJlYWRpbmdNb3JlID0gZmFsc2U7XG4gIHRoaXMuZGVjb2RlciA9IG51bGw7XG4gIHRoaXMuZW5jb2RpbmcgPSBudWxsO1xuICBpZiAob3B0aW9ucy5lbmNvZGluZykge1xuICAgIGlmICghU3RyaW5nRGVjb2RlcikgU3RyaW5nRGVjb2RlciA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyLycpLlN0cmluZ0RlY29kZXI7XG4gICAgdGhpcy5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIob3B0aW9ucy5lbmNvZGluZyk7XG4gICAgdGhpcy5lbmNvZGluZyA9IG9wdGlvbnMuZW5jb2Rpbmc7XG4gIH1cbn1cbmZ1bmN0aW9uIFJlYWRhYmxlKG9wdGlvbnMpIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlYWRhYmxlKSkgcmV0dXJuIG5ldyBSZWFkYWJsZShvcHRpb25zKTtcblxuICAvLyBDaGVja2luZyBmb3IgYSBTdHJlYW0uRHVwbGV4IGluc3RhbmNlIGlzIGZhc3RlciBoZXJlIGluc3RlYWQgb2YgaW5zaWRlXG4gIC8vIHRoZSBSZWFkYWJsZVN0YXRlIGNvbnN0cnVjdG9yLCBhdCBsZWFzdCB3aXRoIFY4IDYuNVxuICB2YXIgaXNEdXBsZXggPSB0aGlzIGluc3RhbmNlb2YgRHVwbGV4O1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlID0gbmV3IFJlYWRhYmxlU3RhdGUob3B0aW9ucywgdGhpcywgaXNEdXBsZXgpO1xuXG4gIC8vIGxlZ2FjeVxuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVhZCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fcmVhZCA9IG9wdGlvbnMucmVhZDtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZGVzdHJveSA9IG9wdGlvbnMuZGVzdHJveTtcbiAgfVxuICBTdHJlYW0uY2FsbCh0aGlzKTtcbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsICdkZXN0cm95ZWQnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgIC8vIHdlIGlnbm9yZSB0aGUgdmFsdWUgaWYgdGhlIHN0cmVhbVxuICAgIC8vIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcbiAgICBpZiAoIXRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgLy8gbWFuYWdpbmcgZGVzdHJveWVkXG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgfVxufSk7XG5SZWFkYWJsZS5wcm90b3R5cGUuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLmRlc3Ryb3k7XG5SZWFkYWJsZS5wcm90b3R5cGUuX3VuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLnVuZGVzdHJveTtcblJlYWRhYmxlLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIGNiKGVycik7XG59O1xuXG4vLyBNYW51YWxseSBzaG92ZSBzb21ldGhpbmcgaW50byB0aGUgcmVhZCgpIGJ1ZmZlci5cbi8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBoaWdoV2F0ZXJNYXJrIGhhcyBub3QgYmVlbiBoaXQgeWV0LFxuLy8gc2ltaWxhciB0byBob3cgV3JpdGFibGUud3JpdGUoKSByZXR1cm5zIHRydWUgaWYgeW91IHNob3VsZFxuLy8gd3JpdGUoKSBzb21lIG1vcmUuXG5SZWFkYWJsZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHNraXBDaHVua0NoZWNrO1xuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBpZiAodHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG4gICAgICBpZiAoZW5jb2RpbmcgIT09IHN0YXRlLmVuY29kaW5nKSB7XG4gICAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgICAgICAgZW5jb2RpbmcgPSAnJztcbiAgICAgIH1cbiAgICAgIHNraXBDaHVua0NoZWNrID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc2tpcENodW5rQ2hlY2sgPSB0cnVlO1xuICB9XG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIGNodW5rLCBlbmNvZGluZywgZmFsc2UsIHNraXBDaHVua0NoZWNrKTtcbn07XG5cbi8vIFVuc2hpZnQgc2hvdWxkICphbHdheXMqIGJlIHNvbWV0aGluZyBkaXJlY3RseSBvdXQgb2YgcmVhZCgpXG5SZWFkYWJsZS5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uIChjaHVuaykge1xuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBjaHVuaywgbnVsbCwgdHJ1ZSwgZmFsc2UpO1xufTtcbmZ1bmN0aW9uIHJlYWRhYmxlQWRkQ2h1bmsoc3RyZWFtLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQsIHNraXBDaHVua0NoZWNrKSB7XG4gIGRlYnVnKCdyZWFkYWJsZUFkZENodW5rJywgY2h1bmspO1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBlcjtcbiAgICBpZiAoIXNraXBDaHVua0NoZWNrKSBlciA9IGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspO1xuICAgIGlmIChlcikge1xuICAgICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcik7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rICYmIGNodW5rLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICh0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmICFzdGF0ZS5vYmplY3RNb2RlICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihjaHVuaykgIT09IEJ1ZmZlci5wcm90b3R5cGUpIHtcbiAgICAgICAgY2h1bmsgPSBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKTtcbiAgICAgIH1cbiAgICAgIGlmIChhZGRUb0Zyb250KSB7XG4gICAgICAgIGlmIChzdGF0ZS5lbmRFbWl0dGVkKSBlcnJvck9yRGVzdHJveShzdHJlYW0sIG5ldyBFUlJfU1RSRUFNX1VOU0hJRlRfQUZURVJfRU5EX0VWRU5UKCkpO2Vsc2UgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIHRydWUpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5lbmRlZCkge1xuICAgICAgICBlcnJvck9yRGVzdHJveShzdHJlYW0sIG5ldyBFUlJfU1RSRUFNX1BVU0hfQUZURVJfRU9GKCkpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5kZXN0cm95ZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhZW5jb2RpbmcpIHtcbiAgICAgICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuICAgICAgICAgIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rLmxlbmd0aCAhPT0gMCkgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGZhbHNlKTtlbHNlIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWFkZFRvRnJvbnQpIHtcbiAgICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICAgIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gV2UgY2FuIHB1c2ggbW9yZSBkYXRhIGlmIHdlIGFyZSBiZWxvdyB0aGUgaGlnaFdhdGVyTWFyay5cbiAgLy8gQWxzbywgaWYgd2UgaGF2ZSBubyBkYXRhIHlldCwgd2UgY2FuIHN0YW5kIHNvbWUgbW9yZSBieXRlcy5cbiAgLy8gVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBjYXNlcyB3aGVyZSBod209MCwgc3VjaCBhcyB0aGUgcmVwbC5cbiAgcmV0dXJuICFzdGF0ZS5lbmRlZCAmJiAoc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5sZW5ndGggPT09IDApO1xufVxuZnVuY3Rpb24gYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGFkZFRvRnJvbnQpIHtcbiAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmICFzdGF0ZS5zeW5jKSB7XG4gICAgc3RhdGUuYXdhaXREcmFpbiA9IDA7XG4gICAgc3RyZWFtLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG4gIH0gZWxzZSB7XG4gICAgLy8gdXBkYXRlIHRoZSBidWZmZXIgaW5mby5cbiAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgaWYgKGFkZFRvRnJvbnQpIHN0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTtlbHNlIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcbiAgICBpZiAoc3RhdGUubmVlZFJlYWRhYmxlKSBlbWl0UmVhZGFibGUoc3RyZWFtKTtcbiAgfVxuICBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpO1xufVxuZnVuY3Rpb24gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuaykge1xuICB2YXIgZXI7XG4gIGlmICghX2lzVWludDhBcnJheShjaHVuaykgJiYgdHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2NodW5rJywgWydzdHJpbmcnLCAnQnVmZmVyJywgJ1VpbnQ4QXJyYXknXSwgY2h1bmspO1xuICB9XG4gIHJldHVybiBlcjtcbn1cblJlYWRhYmxlLnByb3RvdHlwZS5pc1BhdXNlZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9PT0gZmFsc2U7XG59O1xuXG4vLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgdmFyIGRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihlbmMpO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXIgPSBkZWNvZGVyO1xuICAvLyBJZiBzZXRFbmNvZGluZyhudWxsKSwgZGVjb2Rlci5lbmNvZGluZyBlcXVhbHMgdXRmOFxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nID0gdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyLmVuY29kaW5nO1xuXG4gIC8vIEl0ZXJhdGUgb3ZlciBjdXJyZW50IGJ1ZmZlciB0byBjb252ZXJ0IGFscmVhZHkgc3RvcmVkIEJ1ZmZlcnM6XG4gIHZhciBwID0gdGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXIuaGVhZDtcbiAgdmFyIGNvbnRlbnQgPSAnJztcbiAgd2hpbGUgKHAgIT09IG51bGwpIHtcbiAgICBjb250ZW50ICs9IGRlY29kZXIud3JpdGUocC5kYXRhKTtcbiAgICBwID0gcC5uZXh0O1xuICB9XG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyLmNsZWFyKCk7XG4gIGlmIChjb250ZW50ICE9PSAnJykgdGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXIucHVzaChjb250ZW50KTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5sZW5ndGggPSBjb250ZW50Lmxlbmd0aDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBEb24ndCByYWlzZSB0aGUgaHdtID4gMUdCXG52YXIgTUFYX0hXTSA9IDB4NDAwMDAwMDA7XG5mdW5jdGlvbiBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKSB7XG4gIGlmIChuID49IE1BWF9IV00pIHtcbiAgICAvLyBUT0RPKHJvbmFnKTogVGhyb3cgRVJSX1ZBTFVFX09VVF9PRl9SQU5HRS5cbiAgICBuID0gTUFYX0hXTTtcbiAgfSBlbHNlIHtcbiAgICAvLyBHZXQgdGhlIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyIHRvIHByZXZlbnQgaW5jcmVhc2luZyBod20gZXhjZXNzaXZlbHkgaW5cbiAgICAvLyB0aW55IGFtb3VudHNcbiAgICBuLS07XG4gICAgbiB8PSBuID4+PiAxO1xuICAgIG4gfD0gbiA+Pj4gMjtcbiAgICBuIHw9IG4gPj4+IDQ7XG4gICAgbiB8PSBuID4+PiA4O1xuICAgIG4gfD0gbiA+Pj4gMTY7XG4gICAgbisrO1xuICB9XG4gIHJldHVybiBuO1xufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUpIHtcbiAgaWYgKG4gPD0gMCB8fCBzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuZW5kZWQpIHJldHVybiAwO1xuICBpZiAoc3RhdGUub2JqZWN0TW9kZSkgcmV0dXJuIDE7XG4gIGlmIChuICE9PSBuKSB7XG4gICAgLy8gT25seSBmbG93IG9uZSBidWZmZXIgYXQgYSB0aW1lXG4gICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoKSByZXR1cm4gc3RhdGUuYnVmZmVyLmhlYWQuZGF0YS5sZW5ndGg7ZWxzZSByZXR1cm4gc3RhdGUubGVuZ3RoO1xuICB9XG4gIC8vIElmIHdlJ3JlIGFza2luZyBmb3IgbW9yZSB0aGFuIHRoZSBjdXJyZW50IGh3bSwgdGhlbiByYWlzZSB0aGUgaHdtLlxuICBpZiAobiA+IHN0YXRlLmhpZ2hXYXRlck1hcmspIHN0YXRlLmhpZ2hXYXRlck1hcmsgPSBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKTtcbiAgaWYgKG4gPD0gc3RhdGUubGVuZ3RoKSByZXR1cm4gbjtcbiAgLy8gRG9uJ3QgaGF2ZSBlbm91Z2hcbiAgaWYgKCFzdGF0ZS5lbmRlZCkge1xuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbn1cblxuLy8geW91IGNhbiBvdmVycmlkZSBlaXRoZXIgdGhpcyBtZXRob2QsIG9yIHRoZSBhc3luYyBfcmVhZChuKSBiZWxvdy5cblJlYWRhYmxlLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgZGVidWcoJ3JlYWQnLCBuKTtcbiAgbiA9IHBhcnNlSW50KG4sIDEwKTtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIG5PcmlnID0gbjtcbiAgaWYgKG4gIT09IDApIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuXG4gIC8vIGlmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cbiAgaWYgKG4gPT09IDAgJiYgc3RhdGUubmVlZFJlYWRhYmxlICYmICgoc3RhdGUuaGlnaFdhdGVyTWFyayAhPT0gMCA/IHN0YXRlLmxlbmd0aCA+PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrIDogc3RhdGUubGVuZ3RoID4gMCkgfHwgc3RhdGUuZW5kZWQpKSB7XG4gICAgZGVidWcoJ3JlYWQ6IGVtaXRSZWFkYWJsZScsIHN0YXRlLmxlbmd0aCwgc3RhdGUuZW5kZWQpO1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuZW5kZWQpIGVuZFJlYWRhYmxlKHRoaXMpO2Vsc2UgZW1pdFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIG4gPSBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKTtcblxuICAvLyBpZiB3ZSd2ZSBlbmRlZCwgYW5kIHdlJ3JlIG5vdyBjbGVhciwgdGhlbiBmaW5pc2ggaXQgdXAuXG4gIGlmIChuID09PSAwICYmIHN0YXRlLmVuZGVkKSB7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgZW5kUmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBBbGwgdGhlIGFjdHVhbCBjaHVuayBnZW5lcmF0aW9uIGxvZ2ljIG5lZWRzIHRvIGJlXG4gIC8vICpiZWxvdyogdGhlIGNhbGwgdG8gX3JlYWQuICBUaGUgcmVhc29uIGlzIHRoYXQgaW4gY2VydGFpblxuICAvLyBzeW50aGV0aWMgc3RyZWFtIGNhc2VzLCBzdWNoIGFzIHBhc3N0aHJvdWdoIHN0cmVhbXMsIF9yZWFkXG4gIC8vIG1heSBiZSBhIGNvbXBsZXRlbHkgc3luY2hyb25vdXMgb3BlcmF0aW9uIHdoaWNoIG1heSBjaGFuZ2VcbiAgLy8gdGhlIHN0YXRlIG9mIHRoZSByZWFkIGJ1ZmZlciwgcHJvdmlkaW5nIGVub3VnaCBkYXRhIHdoZW5cbiAgLy8gYmVmb3JlIHRoZXJlIHdhcyAqbm90KiBlbm91Z2guXG4gIC8vXG4gIC8vIFNvLCB0aGUgc3RlcHMgYXJlOlxuICAvLyAxLiBGaWd1cmUgb3V0IHdoYXQgdGhlIHN0YXRlIG9mIHRoaW5ncyB3aWxsIGJlIGFmdGVyIHdlIGRvXG4gIC8vIGEgcmVhZCBmcm9tIHRoZSBidWZmZXIuXG4gIC8vXG4gIC8vIDIuIElmIHRoYXQgcmVzdWx0aW5nIHN0YXRlIHdpbGwgdHJpZ2dlciBhIF9yZWFkLCB0aGVuIGNhbGwgX3JlYWQuXG4gIC8vIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBhc3luY2hyb25vdXMsIG9yIHN5bmNocm9ub3VzLiAgWWVzLCBpdCBpc1xuICAvLyBkZWVwbHkgdWdseSB0byB3cml0ZSBBUElzIHRoaXMgd2F5LCBidXQgdGhhdCBzdGlsbCBkb2Vzbid0IG1lYW5cbiAgLy8gdGhhdCB0aGUgUmVhZGFibGUgY2xhc3Mgc2hvdWxkIGJlaGF2ZSBpbXByb3Blcmx5LCBhcyBzdHJlYW1zIGFyZVxuICAvLyBkZXNpZ25lZCB0byBiZSBzeW5jL2FzeW5jIGFnbm9zdGljLlxuICAvLyBUYWtlIG5vdGUgaWYgdGhlIF9yZWFkIGNhbGwgaXMgc3luYyBvciBhc3luYyAoaWUsIGlmIHRoZSByZWFkIGNhbGxcbiAgLy8gaGFzIHJldHVybmVkIHlldCksIHNvIHRoYXQgd2Uga25vdyB3aGV0aGVyIG9yIG5vdCBpdCdzIHNhZmUgdG8gZW1pdFxuICAvLyAncmVhZGFibGUnIGV0Yy5cbiAgLy9cbiAgLy8gMy4gQWN0dWFsbHkgcHVsbCB0aGUgcmVxdWVzdGVkIGNodW5rcyBvdXQgb2YgdGhlIGJ1ZmZlciBhbmQgcmV0dXJuLlxuXG4gIC8vIGlmIHdlIG5lZWQgYSByZWFkYWJsZSBldmVudCwgdGhlbiB3ZSBuZWVkIHRvIGRvIHNvbWUgcmVhZGluZy5cbiAgdmFyIGRvUmVhZCA9IHN0YXRlLm5lZWRSZWFkYWJsZTtcbiAgZGVidWcoJ25lZWQgcmVhZGFibGUnLCBkb1JlYWQpO1xuXG4gIC8vIGlmIHdlIGN1cnJlbnRseSBoYXZlIGxlc3MgdGhhbiB0aGUgaGlnaFdhdGVyTWFyaywgdGhlbiBhbHNvIHJlYWQgc29tZVxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwIHx8IHN0YXRlLmxlbmd0aCAtIG4gPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZG9SZWFkID0gdHJ1ZTtcbiAgICBkZWJ1ZygnbGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsnLCBkb1JlYWQpO1xuICB9XG5cbiAgLy8gaG93ZXZlciwgaWYgd2UndmUgZW5kZWQsIHRoZW4gdGhlcmUncyBubyBwb2ludCwgYW5kIGlmIHdlJ3JlIGFscmVhZHlcbiAgLy8gcmVhZGluZywgdGhlbiBpdCdzIHVubmVjZXNzYXJ5LlxuICBpZiAoc3RhdGUuZW5kZWQgfHwgc3RhdGUucmVhZGluZykge1xuICAgIGRvUmVhZCA9IGZhbHNlO1xuICAgIGRlYnVnKCdyZWFkaW5nIG9yIGVuZGVkJywgZG9SZWFkKTtcbiAgfSBlbHNlIGlmIChkb1JlYWQpIHtcbiAgICBkZWJ1ZygnZG8gcmVhZCcpO1xuICAgIHN0YXRlLnJlYWRpbmcgPSB0cnVlO1xuICAgIHN0YXRlLnN5bmMgPSB0cnVlO1xuICAgIC8vIGlmIHRoZSBsZW5ndGggaXMgY3VycmVudGx5IHplcm8sIHRoZW4gd2UgKm5lZWQqIGEgcmVhZGFibGUgZXZlbnQuXG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAvLyBjYWxsIGludGVybmFsIHJlYWQgbWV0aG9kXG4gICAgdGhpcy5fcmVhZChzdGF0ZS5oaWdoV2F0ZXJNYXJrKTtcbiAgICBzdGF0ZS5zeW5jID0gZmFsc2U7XG4gICAgLy8gSWYgX3JlYWQgcHVzaGVkIGRhdGEgc3luY2hyb25vdXNseSwgdGhlbiBgcmVhZGluZ2Agd2lsbCBiZSBmYWxzZSxcbiAgICAvLyBhbmQgd2UgbmVlZCB0byByZS1ldmFsdWF0ZSBob3cgbXVjaCBkYXRhIHdlIGNhbiByZXR1cm4gdG8gdGhlIHVzZXIuXG4gICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpO1xuICB9XG4gIHZhciByZXQ7XG4gIGlmIChuID4gMCkgcmV0ID0gZnJvbUxpc3Qobiwgc3RhdGUpO2Vsc2UgcmV0ID0gbnVsbDtcbiAgaWYgKHJldCA9PT0gbnVsbCkge1xuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHN0YXRlLmxlbmd0aCA8PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICAgIG4gPSAwO1xuICB9IGVsc2Uge1xuICAgIHN0YXRlLmxlbmd0aCAtPSBuO1xuICAgIHN0YXRlLmF3YWl0RHJhaW4gPSAwO1xuICB9XG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAvLyBJZiB3ZSBoYXZlIG5vdGhpbmcgaW4gdGhlIGJ1ZmZlciwgdGhlbiB3ZSB3YW50IHRvIGtub3dcbiAgICAvLyBhcyBzb29uIGFzIHdlICpkbyogZ2V0IHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIuXG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAgIC8vIElmIHdlIHRyaWVkIHRvIHJlYWQoKSBwYXN0IHRoZSBFT0YsIHRoZW4gZW1pdCBlbmQgb24gdGhlIG5leHQgdGljay5cbiAgICBpZiAobk9yaWcgIT09IG4gJiYgc3RhdGUuZW5kZWQpIGVuZFJlYWRhYmxlKHRoaXMpO1xuICB9XG4gIGlmIChyZXQgIT09IG51bGwpIHRoaXMuZW1pdCgnZGF0YScsIHJldCk7XG4gIHJldHVybiByZXQ7XG59O1xuZnVuY3Rpb24gb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKSB7XG4gIGRlYnVnKCdvbkVvZkNodW5rJyk7XG4gIGlmIChzdGF0ZS5lbmRlZCkgcmV0dXJuO1xuICBpZiAoc3RhdGUuZGVjb2Rlcikge1xuICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkge1xuICAgICAgc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgIH1cbiAgfVxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG4gIGlmIChzdGF0ZS5zeW5jKSB7XG4gICAgLy8gaWYgd2UgYXJlIHN5bmMsIHdhaXQgdW50aWwgbmV4dCB0aWNrIHRvIGVtaXQgdGhlIGRhdGEuXG4gICAgLy8gT3RoZXJ3aXNlIHdlIHJpc2sgZW1pdHRpbmcgZGF0YSBpbiB0aGUgZmxvdygpXG4gICAgLy8gdGhlIHJlYWRhYmxlIGNvZGUgdHJpZ2dlcnMgZHVyaW5nIGEgcmVhZCgpIGNhbGxcbiAgICBlbWl0UmVhZGFibGUoc3RyZWFtKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBlbWl0ICdyZWFkYWJsZScgbm93IHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHBpY2tlZCB1cC5cbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgICBpZiAoIXN0YXRlLmVtaXR0ZWRSZWFkYWJsZSkge1xuICAgICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIGVtaXRSZWFkYWJsZV8oc3RyZWFtKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gRG9uJ3QgZW1pdCByZWFkYWJsZSByaWdodCBhd2F5IGluIHN5bmMgbW9kZSwgYmVjYXVzZSB0aGlzIGNhbiB0cmlnZ2VyXG4vLyBhbm90aGVyIHJlYWQoKSBjYWxsID0+IHN0YWNrIG92ZXJmbG93LiAgVGhpcyB3YXksIGl0IG1pZ2h0IHRyaWdnZXJcbi8vIGEgbmV4dFRpY2sgcmVjdXJzaW9uIHdhcm5pbmcsIGJ1dCB0aGF0J3Mgbm90IHNvIGJhZC5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBkZWJ1ZygnZW1pdFJlYWRhYmxlJywgc3RhdGUubmVlZFJlYWRhYmxlLCBzdGF0ZS5lbWl0dGVkUmVhZGFibGUpO1xuICBzdGF0ZS5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgaWYgKCFzdGF0ZS5lbWl0dGVkUmVhZGFibGUpIHtcbiAgICBkZWJ1ZygnZW1pdFJlYWRhYmxlJywgc3RhdGUuZmxvd2luZyk7XG4gICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGVtaXRSZWFkYWJsZV8sIHN0cmVhbSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgZGVidWcoJ2VtaXRSZWFkYWJsZV8nLCBzdGF0ZS5kZXN0cm95ZWQsIHN0YXRlLmxlbmd0aCwgc3RhdGUuZW5kZWQpO1xuICBpZiAoIXN0YXRlLmRlc3Ryb3llZCAmJiAoc3RhdGUubGVuZ3RoIHx8IHN0YXRlLmVuZGVkKSkge1xuICAgIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB9XG5cbiAgLy8gVGhlIHN0cmVhbSBuZWVkcyBhbm90aGVyIHJlYWRhYmxlIGV2ZW50IGlmXG4gIC8vIDEuIEl0IGlzIG5vdCBmbG93aW5nLCBhcyB0aGUgZmxvdyBtZWNoYW5pc20gd2lsbCB0YWtlXG4gIC8vICAgIGNhcmUgb2YgaXQuXG4gIC8vIDIuIEl0IGlzIG5vdCBlbmRlZC5cbiAgLy8gMy4gSXQgaXMgYmVsb3cgdGhlIGhpZ2hXYXRlck1hcmssIHNvIHdlIGNhbiBzY2hlZHVsZVxuICAvLyAgICBhbm90aGVyIHJlYWRhYmxlIGxhdGVyLlxuICBzdGF0ZS5uZWVkUmVhZGFibGUgPSAhc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoIDw9IHN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIGZsb3coc3RyZWFtKTtcbn1cblxuLy8gYXQgdGhpcyBwb2ludCwgdGhlIHVzZXIgaGFzIHByZXN1bWFibHkgc2VlbiB0aGUgJ3JlYWRhYmxlJyBldmVudCxcbi8vIGFuZCBjYWxsZWQgcmVhZCgpIHRvIGNvbnN1bWUgc29tZSBkYXRhLiAgdGhhdCBtYXkgaGF2ZSB0cmlnZ2VyZWRcbi8vIGluIHR1cm4gYW5vdGhlciBfcmVhZChuKSBjYWxsLCBpbiB3aGljaCBjYXNlIHJlYWRpbmcgPSB0cnVlIGlmXG4vLyBpdCdzIGluIHByb2dyZXNzLlxuLy8gSG93ZXZlciwgaWYgd2UncmUgbm90IGVuZGVkLCBvciByZWFkaW5nLCBhbmQgdGhlIGxlbmd0aCA8IGh3bSxcbi8vIHRoZW4gZ28gYWhlYWQgYW5kIHRyeSB0byByZWFkIHNvbWUgbW9yZSBwcmVlbXB0aXZlbHkuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nTW9yZSkge1xuICAgIHN0YXRlLnJlYWRpbmdNb3JlID0gdHJ1ZTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZV8oc3RyZWFtLCBzdGF0ZSkge1xuICAvLyBBdHRlbXB0IHRvIHJlYWQgbW9yZSBkYXRhIGlmIHdlIHNob3VsZC5cbiAgLy9cbiAgLy8gVGhlIGNvbmRpdGlvbnMgZm9yIHJlYWRpbmcgbW9yZSBkYXRhIGFyZSAob25lIG9mKTpcbiAgLy8gLSBOb3QgZW5vdWdoIGRhdGEgYnVmZmVyZWQgKHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmspLiBUaGUgbG9vcFxuICAvLyAgIGlzIHJlc3BvbnNpYmxlIGZvciBmaWxsaW5nIHRoZSBidWZmZXIgd2l0aCBlbm91Z2ggZGF0YSBpZiBzdWNoIGRhdGFcbiAgLy8gICBpcyBhdmFpbGFibGUuIElmIGhpZ2hXYXRlck1hcmsgaXMgMCBhbmQgd2UgYXJlIG5vdCBpbiB0aGUgZmxvd2luZyBtb2RlXG4gIC8vICAgd2Ugc2hvdWxkIF9ub3RfIGF0dGVtcHQgdG8gYnVmZmVyIGFueSBleHRyYSBkYXRhLiBXZSdsbCBnZXQgbW9yZSBkYXRhXG4gIC8vICAgd2hlbiB0aGUgc3RyZWFtIGNvbnN1bWVyIGNhbGxzIHJlYWQoKSBpbnN0ZWFkLlxuICAvLyAtIE5vIGRhdGEgaW4gdGhlIGJ1ZmZlciwgYW5kIHRoZSBzdHJlYW0gaXMgaW4gZmxvd2luZyBtb2RlLiBJbiB0aGlzIG1vZGVcbiAgLy8gICB0aGUgbG9vcCBiZWxvdyBpcyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgcmVhZCgpIGlzIGNhbGxlZC4gRmFpbGluZyB0b1xuICAvLyAgIGNhbGwgcmVhZCBoZXJlIHdvdWxkIGFib3J0IHRoZSBmbG93IGFuZCB0aGVyZSdzIG5vIG90aGVyIG1lY2hhbmlzbSBmb3JcbiAgLy8gICBjb250aW51aW5nIHRoZSBmbG93IGlmIHRoZSBzdHJlYW0gY29uc3VtZXIgaGFzIGp1c3Qgc3Vic2NyaWJlZCB0byB0aGVcbiAgLy8gICAnZGF0YScgZXZlbnQuXG4gIC8vXG4gIC8vIEluIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSBjb25kaXRpb25zIHRvIGtlZXAgcmVhZGluZyBkYXRhLCB0aGUgZm9sbG93aW5nXG4gIC8vIGNvbmRpdGlvbnMgcHJldmVudCB0aGUgZGF0YSBmcm9tIGJlaW5nIHJlYWQ6XG4gIC8vIC0gVGhlIHN0cmVhbSBoYXMgZW5kZWQgKHN0YXRlLmVuZGVkKS5cbiAgLy8gLSBUaGVyZSBpcyBhbHJlYWR5IGEgcGVuZGluZyAncmVhZCcgb3BlcmF0aW9uIChzdGF0ZS5yZWFkaW5nKS4gVGhpcyBpcyBhXG4gIC8vICAgY2FzZSB3aGVyZSB0aGUgdGhlIHN0cmVhbSBoYXMgY2FsbGVkIHRoZSBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIF9yZWFkKClcbiAgLy8gICBtZXRob2QsIGJ1dCB0aGV5IGFyZSBwcm9jZXNzaW5nIHRoZSBjYWxsIGFzeW5jaHJvbm91c2x5IGFuZCBoYXZlIF9ub3RfXG4gIC8vICAgY2FsbGVkIHB1c2goKSB3aXRoIG5ldyBkYXRhLiBJbiB0aGlzIGNhc2Ugd2Ugc2tpcCBwZXJmb3JtaW5nIG1vcmVcbiAgLy8gICByZWFkKClzLiBUaGUgZXhlY3V0aW9uIGVuZHMgaW4gdGhpcyBtZXRob2QgYWdhaW4gYWZ0ZXIgdGhlIF9yZWFkKCkgZW5kc1xuICAvLyAgIHVwIGNhbGxpbmcgcHVzaCgpIHdpdGggbW9yZSBkYXRhLlxuICB3aGlsZSAoIXN0YXRlLnJlYWRpbmcgJiYgIXN0YXRlLmVuZGVkICYmIChzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwKSkge1xuICAgIHZhciBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gICAgZGVidWcoJ21heWJlUmVhZE1vcmUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgaWYgKGxlbiA9PT0gc3RhdGUubGVuZ3RoKVxuICAgICAgLy8gZGlkbid0IGdldCBhbnkgZGF0YSwgc3RvcCBzcGlubmluZy5cbiAgICAgIGJyZWFrO1xuICB9XG4gIHN0YXRlLnJlYWRpbmdNb3JlID0gZmFsc2U7XG59XG5cbi8vIGFic3RyYWN0IG1ldGhvZC4gIHRvIGJlIG92ZXJyaWRkZW4gaW4gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gY2xhc3Nlcy5cbi8vIGNhbGwgY2IoZXIsIGRhdGEpIHdoZXJlIGRhdGEgaXMgPD0gbiBpbiBsZW5ndGguXG4vLyBmb3IgdmlydHVhbCAobm9uLXN0cmluZywgbm9uLWJ1ZmZlcikgc3RyZWFtcywgXCJsZW5ndGhcIiBpcyBzb21ld2hhdFxuLy8gYXJiaXRyYXJ5LCBhbmQgcGVyaGFwcyBub3QgdmVyeSBtZWFuaW5nZnVsLlxuUmVhZGFibGUucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgZXJyb3JPckRlc3Ryb3kodGhpcywgbmV3IEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEKCdfcmVhZCgpJykpO1xufTtcblJlYWRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKGRlc3QsIHBpcGVPcHRzKSB7XG4gIHZhciBzcmMgPSB0aGlzO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBzd2l0Y2ggKHN0YXRlLnBpcGVzQ291bnQpIHtcbiAgICBjYXNlIDA6XG4gICAgICBzdGF0ZS5waXBlcyA9IGRlc3Q7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE6XG4gICAgICBzdGF0ZS5waXBlcyA9IFtzdGF0ZS5waXBlcywgZGVzdF07XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgc3RhdGUucGlwZXMucHVzaChkZXN0KTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHN0YXRlLnBpcGVzQ291bnQgKz0gMTtcbiAgZGVidWcoJ3BpcGUgY291bnQ9JWQgb3B0cz0laicsIHN0YXRlLnBpcGVzQ291bnQsIHBpcGVPcHRzKTtcbiAgdmFyIGRvRW5kID0gKCFwaXBlT3B0cyB8fCBwaXBlT3B0cy5lbmQgIT09IGZhbHNlKSAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZG91dCAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZGVycjtcbiAgdmFyIGVuZEZuID0gZG9FbmQgPyBvbmVuZCA6IHVucGlwZTtcbiAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIHByb2Nlc3MubmV4dFRpY2soZW5kRm4pO2Vsc2Ugc3JjLm9uY2UoJ2VuZCcsIGVuZEZuKTtcbiAgZGVzdC5vbigndW5waXBlJywgb251bnBpcGUpO1xuICBmdW5jdGlvbiBvbnVucGlwZShyZWFkYWJsZSwgdW5waXBlSW5mbykge1xuICAgIGRlYnVnKCdvbnVucGlwZScpO1xuICAgIGlmIChyZWFkYWJsZSA9PT0gc3JjKSB7XG4gICAgICBpZiAodW5waXBlSW5mbyAmJiB1bnBpcGVJbmZvLmhhc1VucGlwZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIHVucGlwZUluZm8uaGFzVW5waXBlZCA9IHRydWU7XG4gICAgICAgIGNsZWFudXAoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgZGVidWcoJ29uZW5kJyk7XG4gICAgZGVzdC5lbmQoKTtcbiAgfVxuXG4gIC8vIHdoZW4gdGhlIGRlc3QgZHJhaW5zLCBpdCByZWR1Y2VzIHRoZSBhd2FpdERyYWluIGNvdW50ZXJcbiAgLy8gb24gdGhlIHNvdXJjZS4gIFRoaXMgd291bGQgYmUgbW9yZSBlbGVnYW50IHdpdGggYSAub25jZSgpXG4gIC8vIGhhbmRsZXIgaW4gZmxvdygpLCBidXQgYWRkaW5nIGFuZCByZW1vdmluZyByZXBlYXRlZGx5IGlzXG4gIC8vIHRvbyBzbG93LlxuICB2YXIgb25kcmFpbiA9IHBpcGVPbkRyYWluKHNyYyk7XG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbik7XG4gIHZhciBjbGVhbmVkVXAgPSBmYWxzZTtcbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBkZWJ1ZygnY2xlYW51cCcpO1xuICAgIC8vIGNsZWFudXAgZXZlbnQgaGFuZGxlcnMgb25jZSB0aGUgcGlwZSBpcyBicm9rZW5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uZHJhaW4pO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcigndW5waXBlJywgb251bnBpcGUpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgdW5waXBlKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBvbmRhdGEpO1xuICAgIGNsZWFuZWRVcCA9IHRydWU7XG5cbiAgICAvLyBpZiB0aGUgcmVhZGVyIGlzIHdhaXRpbmcgZm9yIGEgZHJhaW4gZXZlbnQgZnJvbSB0aGlzXG4gICAgLy8gc3BlY2lmaWMgd3JpdGVyLCB0aGVuIGl0IHdvdWxkIGNhdXNlIGl0IHRvIG5ldmVyIHN0YXJ0XG4gICAgLy8gZmxvd2luZyBhZ2Fpbi5cbiAgICAvLyBTbywgaWYgdGhpcyBpcyBhd2FpdGluZyBhIGRyYWluLCB0aGVuIHdlIGp1c3QgY2FsbCBpdCBub3cuXG4gICAgLy8gSWYgd2UgZG9uJ3Qga25vdywgdGhlbiBhc3N1bWUgdGhhdCB3ZSBhcmUgd2FpdGluZyBmb3Igb25lLlxuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluICYmICghZGVzdC5fd3JpdGFibGVTdGF0ZSB8fCBkZXN0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbikpIG9uZHJhaW4oKTtcbiAgfVxuICBzcmMub24oJ2RhdGEnLCBvbmRhdGEpO1xuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBkZWJ1Zygnb25kYXRhJyk7XG4gICAgdmFyIHJldCA9IGRlc3Qud3JpdGUoY2h1bmspO1xuICAgIGRlYnVnKCdkZXN0LndyaXRlJywgcmV0KTtcbiAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgLy8gSWYgdGhlIHVzZXIgdW5waXBlZCBkdXJpbmcgYGRlc3Qud3JpdGUoKWAsIGl0IGlzIHBvc3NpYmxlXG4gICAgICAvLyB0byBnZXQgc3R1Y2sgaW4gYSBwZXJtYW5lbnRseSBwYXVzZWQgc3RhdGUgaWYgdGhhdCB3cml0ZVxuICAgICAgLy8gYWxzbyByZXR1cm5lZCBmYWxzZS5cbiAgICAgIC8vID0+IENoZWNrIHdoZXRoZXIgYGRlc3RgIGlzIHN0aWxsIGEgcGlwaW5nIGRlc3RpbmF0aW9uLlxuICAgICAgaWYgKChzdGF0ZS5waXBlc0NvdW50ID09PSAxICYmIHN0YXRlLnBpcGVzID09PSBkZXN0IHx8IHN0YXRlLnBpcGVzQ291bnQgPiAxICYmIGluZGV4T2Yoc3RhdGUucGlwZXMsIGRlc3QpICE9PSAtMSkgJiYgIWNsZWFuZWRVcCkge1xuICAgICAgICBkZWJ1ZygnZmFsc2Ugd3JpdGUgcmVzcG9uc2UsIHBhdXNlJywgc3RhdGUuYXdhaXREcmFpbik7XG4gICAgICAgIHN0YXRlLmF3YWl0RHJhaW4rKztcbiAgICAgIH1cbiAgICAgIHNyYy5wYXVzZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBkZXN0IGhhcyBhbiBlcnJvciwgdGhlbiBzdG9wIHBpcGluZyBpbnRvIGl0LlxuICAvLyBob3dldmVyLCBkb24ndCBzdXBwcmVzcyB0aGUgdGhyb3dpbmcgYmVoYXZpb3IgZm9yIHRoaXMuXG4gIGZ1bmN0aW9uIG9uZXJyb3IoZXIpIHtcbiAgICBkZWJ1Zygnb25lcnJvcicsIGVyKTtcbiAgICB1bnBpcGUoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGlmIChFRWxpc3RlbmVyQ291bnQoZGVzdCwgJ2Vycm9yJykgPT09IDApIGVycm9yT3JEZXN0cm95KGRlc3QsIGVyKTtcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgdXNlcmxhbmQgb25lcy5cbiAgcHJlcGVuZExpc3RlbmVyKGRlc3QsICdlcnJvcicsIG9uZXJyb3IpO1xuXG4gIC8vIEJvdGggY2xvc2UgYW5kIGZpbmlzaCBzaG91bGQgdHJpZ2dlciB1bnBpcGUsIGJ1dCBvbmx5IG9uY2UuXG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnY2xvc2UnLCBvbmNsb3NlKTtcbiAgZnVuY3Rpb24gb25maW5pc2goKSB7XG4gICAgZGVidWcoJ29uZmluaXNoJyk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgZnVuY3Rpb24gdW5waXBlKCkge1xuICAgIGRlYnVnKCd1bnBpcGUnKTtcbiAgICBzcmMudW5waXBlKGRlc3QpO1xuICB9XG5cbiAgLy8gdGVsbCB0aGUgZGVzdCB0aGF0IGl0J3MgYmVpbmcgcGlwZWQgdG9cbiAgZGVzdC5lbWl0KCdwaXBlJywgc3JjKTtcblxuICAvLyBzdGFydCB0aGUgZmxvdyBpZiBpdCBoYXNuJ3QgYmVlbiBzdGFydGVkIGFscmVhZHkuXG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdwaXBlIHJlc3VtZScpO1xuICAgIHNyYy5yZXN1bWUoKTtcbiAgfVxuICByZXR1cm4gZGVzdDtcbn07XG5mdW5jdGlvbiBwaXBlT25EcmFpbihzcmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHBpcGVPbkRyYWluRnVuY3Rpb25SZXN1bHQoKSB7XG4gICAgdmFyIHN0YXRlID0gc3JjLl9yZWFkYWJsZVN0YXRlO1xuICAgIGRlYnVnKCdwaXBlT25EcmFpbicsIHN0YXRlLmF3YWl0RHJhaW4pO1xuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluKSBzdGF0ZS5hd2FpdERyYWluLS07XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gPT09IDAgJiYgRUVsaXN0ZW5lckNvdW50KHNyYywgJ2RhdGEnKSkge1xuICAgICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgICBmbG93KHNyYyk7XG4gICAgfVxuICB9O1xufVxuUmVhZGFibGUucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uIChkZXN0KSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciB1bnBpcGVJbmZvID0ge1xuICAgIGhhc1VucGlwZWQ6IGZhbHNlXG4gIH07XG5cbiAgLy8gaWYgd2UncmUgbm90IHBpcGluZyBhbnl3aGVyZSwgdGhlbiBkbyBub3RoaW5nLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMCkgcmV0dXJuIHRoaXM7XG5cbiAgLy8ganVzdCBvbmUgZGVzdGluYXRpb24uICBtb3N0IGNvbW1vbiBjYXNlLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkge1xuICAgIC8vIHBhc3NlZCBpbiBvbmUsIGJ1dCBpdCdzIG5vdCB0aGUgcmlnaHQgb25lLlxuICAgIGlmIChkZXN0ICYmIGRlc3QgIT09IHN0YXRlLnBpcGVzKSByZXR1cm4gdGhpcztcbiAgICBpZiAoIWRlc3QpIGRlc3QgPSBzdGF0ZS5waXBlcztcblxuICAgIC8vIGdvdCBhIG1hdGNoLlxuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgaWYgKGRlc3QpIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcywgdW5waXBlSW5mbyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBzbG93IGNhc2UuIG11bHRpcGxlIHBpcGUgZGVzdGluYXRpb25zLlxuXG4gIGlmICghZGVzdCkge1xuICAgIC8vIHJlbW92ZSBhbGwuXG4gICAgdmFyIGRlc3RzID0gc3RhdGUucGlwZXM7XG4gICAgdmFyIGxlbiA9IHN0YXRlLnBpcGVzQ291bnQ7XG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSBkZXN0c1tpXS5lbWl0KCd1bnBpcGUnLCB0aGlzLCB7XG4gICAgICBoYXNVbnBpcGVkOiBmYWxzZVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gdHJ5IHRvIGZpbmQgdGhlIHJpZ2h0IG9uZS5cbiAgdmFyIGluZGV4ID0gaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCk7XG4gIGlmIChpbmRleCA9PT0gLTEpIHJldHVybiB0aGlzO1xuICBzdGF0ZS5waXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICBzdGF0ZS5waXBlc0NvdW50IC09IDE7XG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSBzdGF0ZS5waXBlcyA9IHN0YXRlLnBpcGVzWzBdO1xuICBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMsIHVucGlwZUluZm8pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIHNldCB1cCBkYXRhIGV2ZW50cyBpZiB0aGV5IGFyZSBhc2tlZCBmb3Jcbi8vIEVuc3VyZSByZWFkYWJsZSBsaXN0ZW5lcnMgZXZlbnR1YWxseSBnZXQgc29tZXRoaW5nXG5SZWFkYWJsZS5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAoZXYsIGZuKSB7XG4gIHZhciByZXMgPSBTdHJlYW0ucHJvdG90eXBlLm9uLmNhbGwodGhpcywgZXYsIGZuKTtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgaWYgKGV2ID09PSAnZGF0YScpIHtcbiAgICAvLyB1cGRhdGUgcmVhZGFibGVMaXN0ZW5pbmcgc28gdGhhdCByZXN1bWUoKSBtYXkgYmUgYSBuby1vcFxuICAgIC8vIGEgZmV3IGxpbmVzIGRvd24uIFRoaXMgaXMgbmVlZGVkIHRvIHN1cHBvcnQgb25jZSgncmVhZGFibGUnKS5cbiAgICBzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZyA9IHRoaXMubGlzdGVuZXJDb3VudCgncmVhZGFibGUnKSA+IDA7XG5cbiAgICAvLyBUcnkgc3RhcnQgZmxvd2luZyBvbiBuZXh0IHRpY2sgaWYgc3RyZWFtIGlzbid0IGV4cGxpY2l0bHkgcGF1c2VkXG4gICAgaWYgKHN0YXRlLmZsb3dpbmcgIT09IGZhbHNlKSB0aGlzLnJlc3VtZSgpO1xuICB9IGVsc2UgaWYgKGV2ID09PSAncmVhZGFibGUnKSB7XG4gICAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkICYmICFzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZykge1xuICAgICAgc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcgPSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuICAgICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gICAgICBkZWJ1Zygnb24gcmVhZGFibGUnLCBzdGF0ZS5sZW5ndGgsIHN0YXRlLnJlYWRpbmcpO1xuICAgICAgaWYgKHN0YXRlLmxlbmd0aCkge1xuICAgICAgICBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgICB9IGVsc2UgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soblJlYWRpbmdOZXh0VGljaywgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59O1xuUmVhZGFibGUucHJvdG90eXBlLmFkZExpc3RlbmVyID0gUmVhZGFibGUucHJvdG90eXBlLm9uO1xuUmVhZGFibGUucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24gKGV2LCBmbikge1xuICB2YXIgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lci5jYWxsKHRoaXMsIGV2LCBmbik7XG4gIGlmIChldiA9PT0gJ3JlYWRhYmxlJykge1xuICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlcmUgaXMgc29tZW9uZSBzdGlsbCBsaXN0ZW5pbmcgdG9cbiAgICAvLyByZWFkYWJsZSBhbmQgcmVzZXQgdGhlIHN0YXRlLiBIb3dldmVyIHRoaXMgbmVlZHMgdG8gaGFwcGVuXG4gICAgLy8gYWZ0ZXIgcmVhZGFibGUgaGFzIGJlZW4gZW1pdHRlZCBidXQgYmVmb3JlIEkvTyAobmV4dFRpY2spIHRvXG4gICAgLy8gc3VwcG9ydCBvbmNlKCdyZWFkYWJsZScsIGZuKSBjeWNsZXMuIFRoaXMgbWVhbnMgdGhhdCBjYWxsaW5nXG4gICAgLy8gcmVzdW1lIHdpdGhpbiB0aGUgc2FtZSB0aWNrIHdpbGwgaGF2ZSBub1xuICAgIC8vIGVmZmVjdC5cbiAgICBwcm9jZXNzLm5leHRUaWNrKHVwZGF0ZVJlYWRhYmxlTGlzdGVuaW5nLCB0aGlzKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufTtcblJlYWRhYmxlLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbiAoZXYpIHtcbiAgdmFyIHJlcyA9IFN0cmVhbS5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIGlmIChldiA9PT0gJ3JlYWRhYmxlJyB8fCBldiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gV2UgbmVlZCB0byBjaGVjayBpZiB0aGVyZSBpcyBzb21lb25lIHN0aWxsIGxpc3RlbmluZyB0b1xuICAgIC8vIHJlYWRhYmxlIGFuZCByZXNldCB0aGUgc3RhdGUuIEhvd2V2ZXIgdGhpcyBuZWVkcyB0byBoYXBwZW5cbiAgICAvLyBhZnRlciByZWFkYWJsZSBoYXMgYmVlbiBlbWl0dGVkIGJ1dCBiZWZvcmUgSS9PIChuZXh0VGljaykgdG9cbiAgICAvLyBzdXBwb3J0IG9uY2UoJ3JlYWRhYmxlJywgZm4pIGN5Y2xlcy4gVGhpcyBtZWFucyB0aGF0IGNhbGxpbmdcbiAgICAvLyByZXN1bWUgd2l0aGluIHRoZSBzYW1lIHRpY2sgd2lsbCBoYXZlIG5vXG4gICAgLy8gZWZmZWN0LlxuICAgIHByb2Nlc3MubmV4dFRpY2sodXBkYXRlUmVhZGFibGVMaXN0ZW5pbmcsIHRoaXMpO1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuZnVuY3Rpb24gdXBkYXRlUmVhZGFibGVMaXN0ZW5pbmcoc2VsZikge1xuICB2YXIgc3RhdGUgPSBzZWxmLl9yZWFkYWJsZVN0YXRlO1xuICBzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZyA9IHNlbGYubGlzdGVuZXJDb3VudCgncmVhZGFibGUnKSA+IDA7XG4gIGlmIChzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgJiYgIXN0YXRlLnBhdXNlZCkge1xuICAgIC8vIGZsb3dpbmcgbmVlZHMgdG8gYmUgc2V0IHRvIHRydWUgbm93LCBvdGhlcndpc2VcbiAgICAvLyB0aGUgdXBjb21pbmcgcmVzdW1lIHdpbGwgbm90IGZsb3cuXG4gICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG5cbiAgICAvLyBjcnVkZSB3YXkgdG8gY2hlY2sgaWYgd2Ugc2hvdWxkIHJlc3VtZVxuICB9IGVsc2UgaWYgKHNlbGYubGlzdGVuZXJDb3VudCgnZGF0YScpID4gMCkge1xuICAgIHNlbGYucmVzdW1lKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIG5SZWFkaW5nTmV4dFRpY2soc2VsZikge1xuICBkZWJ1ZygncmVhZGFibGUgbmV4dHRpY2sgcmVhZCAwJyk7XG4gIHNlbGYucmVhZCgwKTtcbn1cblxuLy8gcGF1c2UoKSBhbmQgcmVzdW1lKCkgYXJlIHJlbW5hbnRzIG9mIHRoZSBsZWdhY3kgcmVhZGFibGUgc3RyZWFtIEFQSVxuLy8gSWYgdGhlIHVzZXIgdXNlcyB0aGVtLCB0aGVuIHN3aXRjaCBpbnRvIG9sZCBtb2RlLlxuUmVhZGFibGUucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3Jlc3VtZScpO1xuICAgIC8vIHdlIGZsb3cgb25seSBpZiB0aGVyZSBpcyBubyBvbmUgbGlzdGVuaW5nXG4gICAgLy8gZm9yIHJlYWRhYmxlLCBidXQgd2Ugc3RpbGwgaGF2ZSB0byBjYWxsXG4gICAgLy8gcmVzdW1lKClcbiAgICBzdGF0ZS5mbG93aW5nID0gIXN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nO1xuICAgIHJlc3VtZSh0aGlzLCBzdGF0ZSk7XG4gIH1cbiAgc3RhdGUucGF1c2VkID0gZmFsc2U7XG4gIHJldHVybiB0aGlzO1xufTtcbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVzdW1lU2NoZWR1bGVkKSB7XG4gICAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKHJlc3VtZV8sIHN0cmVhbSwgc3RhdGUpO1xuICB9XG59XG5mdW5jdGlvbiByZXN1bWVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgZGVidWcoJ3Jlc3VtZScsIHN0YXRlLnJlYWRpbmcpO1xuICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgfVxuICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpO1xuICBmbG93KHN0cmVhbSk7XG4gIGlmIChzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5yZWFkaW5nKSBzdHJlYW0ucmVhZCgwKTtcbn1cblJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgZGVidWcoJ2NhbGwgcGF1c2UgZmxvd2luZz0laicsIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyk7XG4gIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgIT09IGZhbHNlKSB7XG4gICAgZGVidWcoJ3BhdXNlJyk7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0KCdwYXVzZScpO1xuICB9XG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUucGF1c2VkID0gdHJ1ZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuZnVuY3Rpb24gZmxvdyhzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBkZWJ1ZygnZmxvdycsIHN0YXRlLmZsb3dpbmcpO1xuICB3aGlsZSAoc3RhdGUuZmxvd2luZyAmJiBzdHJlYW0ucmVhZCgpICE9PSBudWxsKTtcbn1cblxuLy8gd3JhcCBhbiBvbGQtc3R5bGUgc3RyZWFtIGFzIHRoZSBhc3luYyBkYXRhIHNvdXJjZS5cbi8vIFRoaXMgaXMgKm5vdCogcGFydCBvZiB0aGUgcmVhZGFibGUgc3RyZWFtIGludGVyZmFjZS5cbi8vIEl0IGlzIGFuIHVnbHkgdW5mb3J0dW5hdGUgbWVzcyBvZiBoaXN0b3J5LlxuUmVhZGFibGUucHJvdG90eXBlLndyYXAgPSBmdW5jdGlvbiAoc3RyZWFtKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBwYXVzZWQgPSBmYWxzZTtcbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZW5kJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIXN0YXRlLmVuZGVkKSB7XG4gICAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkgX3RoaXMucHVzaChjaHVuayk7XG4gICAgfVxuICAgIF90aGlzLnB1c2gobnVsbCk7XG4gIH0pO1xuICBzdHJlYW0ub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBkYXRhJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIpIGNodW5rID0gc3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7XG5cbiAgICAvLyBkb24ndCBza2lwIG92ZXIgZmFsc3kgdmFsdWVzIGluIG9iamVjdE1vZGVcbiAgICBpZiAoc3RhdGUub2JqZWN0TW9kZSAmJiAoY2h1bmsgPT09IG51bGwgfHwgY2h1bmsgPT09IHVuZGVmaW5lZCkpIHJldHVybjtlbHNlIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiAoIWNodW5rIHx8ICFjaHVuay5sZW5ndGgpKSByZXR1cm47XG4gICAgdmFyIHJldCA9IF90aGlzLnB1c2goY2h1bmspO1xuICAgIGlmICghcmV0KSB7XG4gICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBwcm94eSBhbGwgdGhlIG90aGVyIG1ldGhvZHMuXG4gIC8vIGltcG9ydGFudCB3aGVuIHdyYXBwaW5nIGZpbHRlcnMgYW5kIGR1cGxleGVzLlxuICBmb3IgKHZhciBpIGluIHN0cmVhbSkge1xuICAgIGlmICh0aGlzW2ldID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHN0cmVhbVtpXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1tpXSA9IGZ1bmN0aW9uIG1ldGhvZFdyYXAobWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBtZXRob2RXcmFwUmV0dXJuRnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIHN0cmVhbVttZXRob2RdLmFwcGx5KHN0cmVhbSwgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgIH0oaSk7XG4gICAgfVxuICB9XG5cbiAgLy8gcHJveHkgY2VydGFpbiBpbXBvcnRhbnQgZXZlbnRzLlxuICBmb3IgKHZhciBuID0gMDsgbiA8IGtQcm94eUV2ZW50cy5sZW5ndGg7IG4rKykge1xuICAgIHN0cmVhbS5vbihrUHJveHlFdmVudHNbbl0sIHRoaXMuZW1pdC5iaW5kKHRoaXMsIGtQcm94eUV2ZW50c1tuXSkpO1xuICB9XG5cbiAgLy8gd2hlbiB3ZSB0cnkgdG8gY29uc3VtZSBzb21lIG1vcmUgYnl0ZXMsIHNpbXBseSB1bnBhdXNlIHRoZVxuICAvLyB1bmRlcmx5aW5nIHN0cmVhbS5cbiAgdGhpcy5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgX3JlYWQnLCBuKTtcbiAgICBpZiAocGF1c2VkKSB7XG4gICAgICBwYXVzZWQgPSBmYWxzZTtcbiAgICAgIHN0cmVhbS5yZXN1bWUoKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB0aGlzO1xufTtcbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XG4gIFJlYWRhYmxlLnByb3RvdHlwZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGNyZWF0ZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjcmVhdGVSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3IgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvYXN5bmNfaXRlcmF0b3InKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcih0aGlzKTtcbiAgfTtcbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsICdyZWFkYWJsZUhpZ2hXYXRlck1hcmsnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlLnByb3RvdHlwZSwgJ3JlYWRhYmxlQnVmZmVyJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZSAmJiB0aGlzLl9yZWFkYWJsZVN0YXRlLmJ1ZmZlcjtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGUucHJvdG90eXBlLCAncmVhZGFibGVGbG93aW5nJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uIHNldChzdGF0ZSkge1xuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlKSB7XG4gICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPSBzdGF0ZTtcbiAgICB9XG4gIH1cbn0pO1xuXG4vLyBleHBvc2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuXG5SZWFkYWJsZS5fZnJvbUxpc3QgPSBmcm9tTGlzdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsICdyZWFkYWJsZUxlbmd0aCcsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUubGVuZ3RoO1xuICB9XG59KTtcblxuLy8gUGx1Y2sgb2ZmIG4gYnl0ZXMgZnJvbSBhbiBhcnJheSBvZiBidWZmZXJzLlxuLy8gTGVuZ3RoIGlzIHRoZSBjb21iaW5lZCBsZW5ndGhzIG9mIGFsbCB0aGUgYnVmZmVycyBpbiB0aGUgbGlzdC5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuZnVuY3Rpb24gZnJvbUxpc3Qobiwgc3RhdGUpIHtcbiAgLy8gbm90aGluZyBidWZmZXJlZFxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgdmFyIHJldDtcbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldCA9IHN0YXRlLmJ1ZmZlci5zaGlmdCgpO2Vsc2UgaWYgKCFuIHx8IG4gPj0gc3RhdGUubGVuZ3RoKSB7XG4gICAgLy8gcmVhZCBpdCBhbGwsIHRydW5jYXRlIHRoZSBsaXN0XG4gICAgaWYgKHN0YXRlLmRlY29kZXIpIHJldCA9IHN0YXRlLmJ1ZmZlci5qb2luKCcnKTtlbHNlIGlmIChzdGF0ZS5idWZmZXIubGVuZ3RoID09PSAxKSByZXQgPSBzdGF0ZS5idWZmZXIuZmlyc3QoKTtlbHNlIHJldCA9IHN0YXRlLmJ1ZmZlci5jb25jYXQoc3RhdGUubGVuZ3RoKTtcbiAgICBzdGF0ZS5idWZmZXIuY2xlYXIoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIHBhcnQgb2YgbGlzdFxuICAgIHJldCA9IHN0YXRlLmJ1ZmZlci5jb25zdW1lKG4sIHN0YXRlLmRlY29kZXIpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5mdW5jdGlvbiBlbmRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBkZWJ1ZygnZW5kUmVhZGFibGUnLCBzdGF0ZS5lbmRFbWl0dGVkKTtcbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICAgIHByb2Nlc3MubmV4dFRpY2soZW5kUmVhZGFibGVOVCwgc3RhdGUsIHN0cmVhbSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlTlQoc3RhdGUsIHN0cmVhbSkge1xuICBkZWJ1ZygnZW5kUmVhZGFibGVOVCcsIHN0YXRlLmVuZEVtaXR0ZWQsIHN0YXRlLmxlbmd0aCk7XG5cbiAgLy8gQ2hlY2sgdGhhdCB3ZSBkaWRuJ3QgZ2V0IG9uZSBsYXN0IHVuc2hpZnQuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICBzdGF0ZS5lbmRFbWl0dGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0ucmVhZGFibGUgPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZW5kJyk7XG4gICAgaWYgKHN0YXRlLmF1dG9EZXN0cm95KSB7XG4gICAgICAvLyBJbiBjYXNlIG9mIGR1cGxleCBzdHJlYW1zIHdlIG5lZWQgYSB3YXkgdG8gZGV0ZWN0XG4gICAgICAvLyBpZiB0aGUgd3JpdGFibGUgc2lkZSBpcyByZWFkeSBmb3IgYXV0b0Rlc3Ryb3kgYXMgd2VsbFxuICAgICAgdmFyIHdTdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgICAgIGlmICghd1N0YXRlIHx8IHdTdGF0ZS5hdXRvRGVzdHJveSAmJiB3U3RhdGUuZmluaXNoZWQpIHtcbiAgICAgICAgc3RyZWFtLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XG4gIFJlYWRhYmxlLmZyb20gPSBmdW5jdGlvbiAoaXRlcmFibGUsIG9wdHMpIHtcbiAgICBpZiAoZnJvbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmcm9tID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL2Zyb20nKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyb20oUmVhZGFibGUsIGl0ZXJhYmxlLCBvcHRzKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGluZGV4T2YoeHMsIHgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoeHNbaV0gPT09IHgpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn0iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gYSB0cmFuc2Zvcm0gc3RyZWFtIGlzIGEgcmVhZGFibGUvd3JpdGFibGUgc3RyZWFtIHdoZXJlIHlvdSBkb1xuLy8gc29tZXRoaW5nIHdpdGggdGhlIGRhdGEuICBTb21ldGltZXMgaXQncyBjYWxsZWQgYSBcImZpbHRlclwiLFxuLy8gYnV0IHRoYXQncyBub3QgYSBncmVhdCBuYW1lIGZvciBpdCwgc2luY2UgdGhhdCBpbXBsaWVzIGEgdGhpbmcgd2hlcmVcbi8vIHNvbWUgYml0cyBwYXNzIHRocm91Z2gsIGFuZCBvdGhlcnMgYXJlIHNpbXBseSBpZ25vcmVkLiAgKFRoYXQgd291bGRcbi8vIGJlIGEgdmFsaWQgZXhhbXBsZSBvZiBhIHRyYW5zZm9ybSwgb2YgY291cnNlLilcbi8vXG4vLyBXaGlsZSB0aGUgb3V0cHV0IGlzIGNhdXNhbGx5IHJlbGF0ZWQgdG8gdGhlIGlucHV0LCBpdCdzIG5vdCBhXG4vLyBuZWNlc3NhcmlseSBzeW1tZXRyaWMgb3Igc3luY2hyb25vdXMgdHJhbnNmb3JtYXRpb24uICBGb3IgZXhhbXBsZSxcbi8vIGEgemxpYiBzdHJlYW0gbWlnaHQgdGFrZSBtdWx0aXBsZSBwbGFpbi10ZXh0IHdyaXRlcygpLCBhbmQgdGhlblxuLy8gZW1pdCBhIHNpbmdsZSBjb21wcmVzc2VkIGNodW5rIHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlLlxuLy9cbi8vIEhlcmUncyBob3cgdGhpcyB3b3Jrczpcbi8vXG4vLyBUaGUgVHJhbnNmb3JtIHN0cmVhbSBoYXMgYWxsIHRoZSBhc3BlY3RzIG9mIHRoZSByZWFkYWJsZSBhbmQgd3JpdGFibGVcbi8vIHN0cmVhbSBjbGFzc2VzLiAgV2hlbiB5b3Ugd3JpdGUoY2h1bmspLCB0aGF0IGNhbGxzIF93cml0ZShjaHVuayxjYilcbi8vIGludGVybmFsbHksIGFuZCByZXR1cm5zIGZhbHNlIGlmIHRoZXJlJ3MgYSBsb3Qgb2YgcGVuZGluZyB3cml0ZXNcbi8vIGJ1ZmZlcmVkIHVwLiAgV2hlbiB5b3UgY2FsbCByZWFkKCksIHRoYXQgY2FsbHMgX3JlYWQobikgdW50aWxcbi8vIHRoZXJlJ3MgZW5vdWdoIHBlbmRpbmcgcmVhZGFibGUgZGF0YSBidWZmZXJlZCB1cC5cbi8vXG4vLyBJbiBhIHRyYW5zZm9ybSBzdHJlYW0sIHRoZSB3cml0dGVuIGRhdGEgaXMgcGxhY2VkIGluIGEgYnVmZmVyLiAgV2hlblxuLy8gX3JlYWQobikgaXMgY2FsbGVkLCBpdCB0cmFuc2Zvcm1zIHRoZSBxdWV1ZWQgdXAgZGF0YSwgY2FsbGluZyB0aGVcbi8vIGJ1ZmZlcmVkIF93cml0ZSBjYidzIGFzIGl0IGNvbnN1bWVzIGNodW5rcy4gIElmIGNvbnN1bWluZyBhIHNpbmdsZVxuLy8gd3JpdHRlbiBjaHVuayB3b3VsZCByZXN1bHQgaW4gbXVsdGlwbGUgb3V0cHV0IGNodW5rcywgdGhlbiB0aGUgZmlyc3Rcbi8vIG91dHB1dHRlZCBiaXQgY2FsbHMgdGhlIHJlYWRjYiwgYW5kIHN1YnNlcXVlbnQgY2h1bmtzIGp1c3QgZ28gaW50b1xuLy8gdGhlIHJlYWQgYnVmZmVyLCBhbmQgd2lsbCBjYXVzZSBpdCB0byBlbWl0ICdyZWFkYWJsZScgaWYgbmVjZXNzYXJ5LlxuLy9cbi8vIFRoaXMgd2F5LCBiYWNrLXByZXNzdXJlIGlzIGFjdHVhbGx5IGRldGVybWluZWQgYnkgdGhlIHJlYWRpbmcgc2lkZSxcbi8vIHNpbmNlIF9yZWFkIGhhcyB0byBiZSBjYWxsZWQgdG8gc3RhcnQgcHJvY2Vzc2luZyBhIG5ldyBjaHVuay4gIEhvd2V2ZXIsXG4vLyBhIHBhdGhvbG9naWNhbCBpbmZsYXRlIHR5cGUgb2YgdHJhbnNmb3JtIGNhbiBjYXVzZSBleGNlc3NpdmUgYnVmZmVyaW5nXG4vLyBoZXJlLiAgRm9yIGV4YW1wbGUsIGltYWdpbmUgYSBzdHJlYW0gd2hlcmUgZXZlcnkgYnl0ZSBvZiBpbnB1dCBpc1xuLy8gaW50ZXJwcmV0ZWQgYXMgYW4gaW50ZWdlciBmcm9tIDAtMjU1LCBhbmQgdGhlbiByZXN1bHRzIGluIHRoYXQgbWFueVxuLy8gYnl0ZXMgb2Ygb3V0cHV0LiAgV3JpdGluZyB0aGUgNCBieXRlcyB7ZmYsZmYsZmYsZmZ9IHdvdWxkIHJlc3VsdCBpblxuLy8gMWtiIG9mIGRhdGEgYmVpbmcgb3V0cHV0LiAgSW4gdGhpcyBjYXNlLCB5b3UgY291bGQgd3JpdGUgYSB2ZXJ5IHNtYWxsXG4vLyBhbW91bnQgb2YgaW5wdXQsIGFuZCBlbmQgdXAgd2l0aCBhIHZlcnkgbGFyZ2UgYW1vdW50IG9mIG91dHB1dC4gIEluXG4vLyBzdWNoIGEgcGF0aG9sb2dpY2FsIGluZmxhdGluZyBtZWNoYW5pc20sIHRoZXJlJ2QgYmUgbm8gd2F5IHRvIHRlbGxcbi8vIHRoZSBzeXN0ZW0gdG8gc3RvcCBkb2luZyB0aGUgdHJhbnNmb3JtLiAgQSBzaW5nbGUgNE1CIHdyaXRlIGNvdWxkXG4vLyBjYXVzZSB0aGUgc3lzdGVtIHRvIHJ1biBvdXQgb2YgbWVtb3J5LlxuLy9cbi8vIEhvd2V2ZXIsIGV2ZW4gaW4gc3VjaCBhIHBhdGhvbG9naWNhbCBjYXNlLCBvbmx5IGEgc2luZ2xlIHdyaXR0ZW4gY2h1bmtcbi8vIHdvdWxkIGJlIGNvbnN1bWVkLCBhbmQgdGhlbiB0aGUgcmVzdCB3b3VsZCB3YWl0ICh1bi10cmFuc2Zvcm1lZCkgdW50aWxcbi8vIHRoZSByZXN1bHRzIG9mIHRoZSBwcmV2aW91cyB0cmFuc2Zvcm1lZCBjaHVuayB3ZXJlIGNvbnN1bWVkLlxuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gVHJhbnNmb3JtO1xudmFyIF9yZXF1aXJlJGNvZGVzID0gcmVxdWlyZSgnLi4vZXJyb3JzJykuY29kZXMsXG4gIEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEID0gX3JlcXVpcmUkY29kZXMuRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQsXG4gIEVSUl9NVUxUSVBMRV9DQUxMQkFDSyA9IF9yZXF1aXJlJGNvZGVzLkVSUl9NVUxUSVBMRV9DQUxMQkFDSyxcbiAgRVJSX1RSQU5TRk9STV9BTFJFQURZX1RSQU5TRk9STUlORyA9IF9yZXF1aXJlJGNvZGVzLkVSUl9UUkFOU0ZPUk1fQUxSRUFEWV9UUkFOU0ZPUk1JTkcsXG4gIEVSUl9UUkFOU0ZPUk1fV0lUSF9MRU5HVEhfMCA9IF9yZXF1aXJlJGNvZGVzLkVSUl9UUkFOU0ZPUk1fV0lUSF9MRU5HVEhfMDtcbnZhciBEdXBsZXggPSByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5yZXF1aXJlKCdpbmhlcml0cycpKFRyYW5zZm9ybSwgRHVwbGV4KTtcbmZ1bmN0aW9uIGFmdGVyVHJhbnNmb3JtKGVyLCBkYXRhKSB7XG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlO1xuICB0cy50cmFuc2Zvcm1pbmcgPSBmYWxzZTtcbiAgdmFyIGNiID0gdHMud3JpdGVjYjtcbiAgaWYgKGNiID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRVJSX01VTFRJUExFX0NBTExCQUNLKCkpO1xuICB9XG4gIHRzLndyaXRlY2h1bmsgPSBudWxsO1xuICB0cy53cml0ZWNiID0gbnVsbDtcbiAgaWYgKGRhdGEgIT0gbnVsbClcbiAgICAvLyBzaW5nbGUgZXF1YWxzIGNoZWNrIGZvciBib3RoIGBudWxsYCBhbmQgYHVuZGVmaW5lZGBcbiAgICB0aGlzLnB1c2goZGF0YSk7XG4gIGNiKGVyKTtcbiAgdmFyIHJzID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgcnMucmVhZGluZyA9IGZhbHNlO1xuICBpZiAocnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHtcbiAgICB0aGlzLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspO1xuICB9XG59XG5mdW5jdGlvbiBUcmFuc2Zvcm0ob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVHJhbnNmb3JtKSkgcmV0dXJuIG5ldyBUcmFuc2Zvcm0ob3B0aW9ucyk7XG4gIER1cGxleC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICB0aGlzLl90cmFuc2Zvcm1TdGF0ZSA9IHtcbiAgICBhZnRlclRyYW5zZm9ybTogYWZ0ZXJUcmFuc2Zvcm0uYmluZCh0aGlzKSxcbiAgICBuZWVkVHJhbnNmb3JtOiBmYWxzZSxcbiAgICB0cmFuc2Zvcm1pbmc6IGZhbHNlLFxuICAgIHdyaXRlY2I6IG51bGwsXG4gICAgd3JpdGVjaHVuazogbnVsbCxcbiAgICB3cml0ZWVuY29kaW5nOiBudWxsXG4gIH07XG5cbiAgLy8gc3RhcnQgb3V0IGFza2luZyBmb3IgYSByZWFkYWJsZSBldmVudCBvbmNlIGRhdGEgaXMgdHJhbnNmb3JtZWQuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAvLyB3ZSBoYXZlIGltcGxlbWVudGVkIHRoZSBfcmVhZCBtZXRob2QsIGFuZCBkb25lIHRoZSBvdGhlciB0aGluZ3NcbiAgLy8gdGhhdCBSZWFkYWJsZSB3YW50cyBiZWZvcmUgdGhlIGZpcnN0IF9yZWFkIGNhbGwsIHNvIHVuc2V0IHRoZVxuICAvLyBzeW5jIGd1YXJkIGZsYWcuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYyA9IGZhbHNlO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy50cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHRoaXMuX3RyYW5zZm9ybSA9IG9wdGlvbnMudHJhbnNmb3JtO1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5mbHVzaCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZmx1c2ggPSBvcHRpb25zLmZsdXNoO1xuICB9XG5cbiAgLy8gV2hlbiB0aGUgd3JpdGFibGUgc2lkZSBmaW5pc2hlcywgdGhlbiBmbHVzaCBvdXQgYW55dGhpbmcgcmVtYWluaW5nLlxuICB0aGlzLm9uKCdwcmVmaW5pc2gnLCBwcmVmaW5pc2gpO1xufVxuZnVuY3Rpb24gcHJlZmluaXNoKCkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuICBpZiAodHlwZW9mIHRoaXMuX2ZsdXNoID09PSAnZnVuY3Rpb24nICYmICF0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCkge1xuICAgIHRoaXMuX2ZsdXNoKGZ1bmN0aW9uIChlciwgZGF0YSkge1xuICAgICAgZG9uZShfdGhpcywgZXIsIGRhdGEpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGRvbmUodGhpcywgbnVsbCwgbnVsbCk7XG4gIH1cbn1cblRyYW5zZm9ybS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICByZXR1cm4gRHVwbGV4LnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcywgY2h1bmssIGVuY29kaW5nKTtcbn07XG5cbi8vIFRoaXMgaXMgdGhlIHBhcnQgd2hlcmUgeW91IGRvIHN0dWZmIVxuLy8gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiBpbiBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gJ2NodW5rJyBpcyBhbiBpbnB1dCBjaHVuay5cbi8vXG4vLyBDYWxsIGBwdXNoKG5ld0NodW5rKWAgdG8gcGFzcyBhbG9uZyB0cmFuc2Zvcm1lZCBvdXRwdXRcbi8vIHRvIHRoZSByZWFkYWJsZSBzaWRlLiAgWW91IG1heSBjYWxsICdwdXNoJyB6ZXJvIG9yIG1vcmUgdGltZXMuXG4vL1xuLy8gQ2FsbCBgY2IoZXJyKWAgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCB0aGlzIGNodW5rLiAgSWYgeW91IHBhc3Ncbi8vIGFuIGVycm9yLCB0aGVuIHRoYXQnbGwgcHV0IHRoZSBodXJ0IG9uIHRoZSB3aG9sZSBvcGVyYXRpb24uICBJZiB5b3Vcbi8vIG5ldmVyIGNhbGwgY2IoKSwgdGhlbiB5b3UnbGwgbmV2ZXIgZ2V0IGFub3RoZXIgY2h1bmsuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjYihuZXcgRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQoJ190cmFuc2Zvcm0oKScpKTtcbn07XG5UcmFuc2Zvcm0ucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlO1xuICB0cy53cml0ZWNiID0gY2I7XG4gIHRzLndyaXRlY2h1bmsgPSBjaHVuaztcbiAgdHMud3JpdGVlbmNvZGluZyA9IGVuY29kaW5nO1xuICBpZiAoIXRzLnRyYW5zZm9ybWluZykge1xuICAgIHZhciBycyA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKHRzLm5lZWRUcmFuc2Zvcm0gfHwgcnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHRoaXMuX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn07XG5cbi8vIERvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIGFyZ3MgYXJlIGhlcmUuXG4vLyBfdHJhbnNmb3JtIGRvZXMgYWxsIHRoZSB3b3JrLlxuLy8gVGhhdCB3ZSBnb3QgaGVyZSBtZWFucyB0aGF0IHRoZSByZWFkYWJsZSBzaWRlIHdhbnRzIG1vcmUgZGF0YS5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcbiAgaWYgKHRzLndyaXRlY2h1bmsgIT09IG51bGwgJiYgIXRzLnRyYW5zZm9ybWluZykge1xuICAgIHRzLnRyYW5zZm9ybWluZyA9IHRydWU7XG4gICAgdGhpcy5fdHJhbnNmb3JtKHRzLndyaXRlY2h1bmssIHRzLndyaXRlZW5jb2RpbmcsIHRzLmFmdGVyVHJhbnNmb3JtKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBtYXJrIHRoYXQgd2UgbmVlZCBhIHRyYW5zZm9ybSwgc28gdGhhdCBhbnkgZGF0YSB0aGF0IGNvbWVzIGluXG4gICAgLy8gd2lsbCBnZXQgcHJvY2Vzc2VkLCBub3cgdGhhdCB3ZSd2ZSBhc2tlZCBmb3IgaXQuXG4gICAgdHMubmVlZFRyYW5zZm9ybSA9IHRydWU7XG4gIH1cbn07XG5UcmFuc2Zvcm0ucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgRHVwbGV4LnByb3RvdHlwZS5fZGVzdHJveS5jYWxsKHRoaXMsIGVyciwgZnVuY3Rpb24gKGVycjIpIHtcbiAgICBjYihlcnIyKTtcbiAgfSk7XG59O1xuZnVuY3Rpb24gZG9uZShzdHJlYW0sIGVyLCBkYXRhKSB7XG4gIGlmIChlcikgcmV0dXJuIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgaWYgKGRhdGEgIT0gbnVsbClcbiAgICAvLyBzaW5nbGUgZXF1YWxzIGNoZWNrIGZvciBib3RoIGBudWxsYCBhbmQgYHVuZGVmaW5lZGBcbiAgICBzdHJlYW0ucHVzaChkYXRhKTtcblxuICAvLyBUT0RPKEJyaWRnZUFSKTogV3JpdGUgYSB0ZXN0IGZvciB0aGVzZSB0d28gZXJyb3IgY2FzZXNcbiAgLy8gaWYgdGhlcmUncyBub3RoaW5nIGluIHRoZSB3cml0ZSBidWZmZXIsIHRoZW4gdGhhdCBtZWFuc1xuICAvLyB0aGF0IG5vdGhpbmcgbW9yZSB3aWxsIGV2ZXIgYmUgcHJvdmlkZWRcbiAgaWYgKHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5sZW5ndGgpIHRocm93IG5ldyBFUlJfVFJBTlNGT1JNX1dJVEhfTEVOR1RIXzAoKTtcbiAgaWYgKHN0cmVhbS5fdHJhbnNmb3JtU3RhdGUudHJhbnNmb3JtaW5nKSB0aHJvdyBuZXcgRVJSX1RSQU5TRk9STV9BTFJFQURZX1RSQU5TRk9STUlORygpO1xuICByZXR1cm4gc3RyZWFtLnB1c2gobnVsbCk7XG59IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGEgcGFzc3Rocm91Z2ggc3RyZWFtLlxuLy8gYmFzaWNhbGx5IGp1c3QgdGhlIG1vc3QgbWluaW1hbCBzb3J0IG9mIFRyYW5zZm9ybSBzdHJlYW0uXG4vLyBFdmVyeSB3cml0dGVuIGNodW5rIGdldHMgb3V0cHV0IGFzLWlzLlxuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUGFzc1Rocm91Z2g7XG52YXIgVHJhbnNmb3JtID0gcmVxdWlyZSgnLi9fc3RyZWFtX3RyYW5zZm9ybScpO1xucmVxdWlyZSgnaW5oZXJpdHMnKShQYXNzVGhyb3VnaCwgVHJhbnNmb3JtKTtcbmZ1bmN0aW9uIFBhc3NUaHJvdWdoKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFBhc3NUaHJvdWdoKSkgcmV0dXJuIG5ldyBQYXNzVGhyb3VnaChvcHRpb25zKTtcbiAgVHJhbnNmb3JtLmNhbGwodGhpcywgb3B0aW9ucyk7XG59XG5QYXNzVGhyb3VnaC5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG51bGwsIGNodW5rKTtcbn07IiwiLy8gUG9ydGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL21hZmludG9zaC9wdW1wIHdpdGhcbi8vIHBlcm1pc3Npb24gZnJvbSB0aGUgYXV0aG9yLCBNYXRoaWFzIEJ1dXMgKEBtYWZpbnRvc2gpLlxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBlb3M7XG5mdW5jdGlvbiBvbmNlKGNhbGxiYWNrKSB7XG4gIHZhciBjYWxsZWQgPSBmYWxzZTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY2FsbGVkKSByZXR1cm47XG4gICAgY2FsbGVkID0gdHJ1ZTtcbiAgICBjYWxsYmFjay5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gIH07XG59XG52YXIgX3JlcXVpcmUkY29kZXMgPSByZXF1aXJlKCcuLi8uLi8uLi9lcnJvcnMnKS5jb2RlcyxcbiAgRVJSX01JU1NJTkdfQVJHUyA9IF9yZXF1aXJlJGNvZGVzLkVSUl9NSVNTSU5HX0FSR1MsXG4gIEVSUl9TVFJFQU1fREVTVFJPWUVEID0gX3JlcXVpcmUkY29kZXMuRVJSX1NUUkVBTV9ERVNUUk9ZRUQ7XG5mdW5jdGlvbiBub29wKGVycikge1xuICAvLyBSZXRocm93IHRoZSBlcnJvciBpZiBpdCBleGlzdHMgdG8gYXZvaWQgc3dhbGxvd2luZyBpdFxuICBpZiAoZXJyKSB0aHJvdyBlcnI7XG59XG5mdW5jdGlvbiBpc1JlcXVlc3Qoc3RyZWFtKSB7XG4gIHJldHVybiBzdHJlYW0uc2V0SGVhZGVyICYmIHR5cGVvZiBzdHJlYW0uYWJvcnQgPT09ICdmdW5jdGlvbic7XG59XG5mdW5jdGlvbiBkZXN0cm95ZXIoc3RyZWFtLCByZWFkaW5nLCB3cml0aW5nLCBjYWxsYmFjaykge1xuICBjYWxsYmFjayA9IG9uY2UoY2FsbGJhY2spO1xuICB2YXIgY2xvc2VkID0gZmFsc2U7XG4gIHN0cmVhbS5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgY2xvc2VkID0gdHJ1ZTtcbiAgfSk7XG4gIGlmIChlb3MgPT09IHVuZGVmaW5lZCkgZW9zID0gcmVxdWlyZSgnLi9lbmQtb2Ytc3RyZWFtJyk7XG4gIGVvcyhzdHJlYW0sIHtcbiAgICByZWFkYWJsZTogcmVhZGluZyxcbiAgICB3cml0YWJsZTogd3JpdGluZ1xuICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgY2xvc2VkID0gdHJ1ZTtcbiAgICBjYWxsYmFjaygpO1xuICB9KTtcbiAgdmFyIGRlc3Ryb3llZCA9IGZhbHNlO1xuICByZXR1cm4gZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChjbG9zZWQpIHJldHVybjtcbiAgICBpZiAoZGVzdHJveWVkKSByZXR1cm47XG4gICAgZGVzdHJveWVkID0gdHJ1ZTtcblxuICAgIC8vIHJlcXVlc3QuZGVzdHJveSBqdXN0IGRvIC5lbmQgLSAuYWJvcnQgaXMgd2hhdCB3ZSB3YW50XG4gICAgaWYgKGlzUmVxdWVzdChzdHJlYW0pKSByZXR1cm4gc3RyZWFtLmFib3J0KCk7XG4gICAgaWYgKHR5cGVvZiBzdHJlYW0uZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHN0cmVhbS5kZXN0cm95KCk7XG4gICAgY2FsbGJhY2soZXJyIHx8IG5ldyBFUlJfU1RSRUFNX0RFU1RST1lFRCgncGlwZScpKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGNhbGwoZm4pIHtcbiAgZm4oKTtcbn1cbmZ1bmN0aW9uIHBpcGUoZnJvbSwgdG8pIHtcbiAgcmV0dXJuIGZyb20ucGlwZSh0byk7XG59XG5mdW5jdGlvbiBwb3BDYWxsYmFjayhzdHJlYW1zKSB7XG4gIGlmICghc3RyZWFtcy5sZW5ndGgpIHJldHVybiBub29wO1xuICBpZiAodHlwZW9mIHN0cmVhbXNbc3RyZWFtcy5sZW5ndGggLSAxXSAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIG5vb3A7XG4gIHJldHVybiBzdHJlYW1zLnBvcCgpO1xufVxuZnVuY3Rpb24gcGlwZWxpbmUoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBzdHJlYW1zID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIHN0cmVhbXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cbiAgdmFyIGNhbGxiYWNrID0gcG9wQ2FsbGJhY2soc3RyZWFtcyk7XG4gIGlmIChBcnJheS5pc0FycmF5KHN0cmVhbXNbMF0pKSBzdHJlYW1zID0gc3RyZWFtc1swXTtcbiAgaWYgKHN0cmVhbXMubGVuZ3RoIDwgMikge1xuICAgIHRocm93IG5ldyBFUlJfTUlTU0lOR19BUkdTKCdzdHJlYW1zJyk7XG4gIH1cbiAgdmFyIGVycm9yO1xuICB2YXIgZGVzdHJveXMgPSBzdHJlYW1zLm1hcChmdW5jdGlvbiAoc3RyZWFtLCBpKSB7XG4gICAgdmFyIHJlYWRpbmcgPSBpIDwgc3RyZWFtcy5sZW5ndGggLSAxO1xuICAgIHZhciB3cml0aW5nID0gaSA+IDA7XG4gICAgcmV0dXJuIGRlc3Ryb3llcihzdHJlYW0sIHJlYWRpbmcsIHdyaXRpbmcsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmICghZXJyb3IpIGVycm9yID0gZXJyO1xuICAgICAgaWYgKGVycikgZGVzdHJveXMuZm9yRWFjaChjYWxsKTtcbiAgICAgIGlmIChyZWFkaW5nKSByZXR1cm47XG4gICAgICBkZXN0cm95cy5mb3JFYWNoKGNhbGwpO1xuICAgICAgY2FsbGJhY2soZXJyb3IpO1xuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHN0cmVhbXMucmVkdWNlKHBpcGUpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBwaXBlbGluZTsiLCJ2YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5pZiAocHJvY2Vzcy5lbnYuUkVBREFCTEVfU1RSRUFNID09PSAnZGlzYWJsZScgJiYgU3RyZWFtKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gU3RyZWFtLlJlYWRhYmxlO1xuICBPYmplY3QuYXNzaWduKG1vZHVsZS5leHBvcnRzLCBTdHJlYW0pO1xuICBtb2R1bGUuZXhwb3J0cy5TdHJlYW0gPSBTdHJlYW07XG59IGVsc2Uge1xuICBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzJyk7XG4gIGV4cG9ydHMuU3RyZWFtID0gU3RyZWFtIHx8IGV4cG9ydHM7XG4gIGV4cG9ydHMuUmVhZGFibGUgPSBleHBvcnRzO1xuICBleHBvcnRzLldyaXRhYmxlID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV93cml0YWJsZS5qcycpO1xuICBleHBvcnRzLkR1cGxleCA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fZHVwbGV4LmpzJyk7XG4gIGV4cG9ydHMuVHJhbnNmb3JtID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanMnKTtcbiAgZXhwb3J0cy5QYXNzVGhyb3VnaCA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMnKTtcbiAgZXhwb3J0cy5maW5pc2hlZCA9IHJlcXVpcmUoJy4vbGliL2ludGVybmFsL3N0cmVhbXMvZW5kLW9mLXN0cmVhbS5qcycpO1xuICBleHBvcnRzLnBpcGVsaW5lID0gcmVxdWlyZSgnLi9saWIvaW50ZXJuYWwvc3RyZWFtcy9waXBlbGluZS5qcycpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlJlYWRhYmxlV2ViVG9Ob2RlU3RyZWFtID0gdm9pZCAwO1xuY29uc3QgcmVhZGFibGVfc3RyZWFtXzEgPSByZXF1aXJlKFwicmVhZGFibGUtc3RyZWFtXCIpO1xuLyoqXG4gKiBDb252ZXJ0cyBhIFdlYi1BUEkgc3RyZWFtIGludG8gTm9kZSBzdHJlYW0uUmVhZGFibGUgY2xhc3NcbiAqIE5vZGUgc3RyZWFtIHJlYWRhYmxlOiBodHRwczovL25vZGVqcy5vcmcvYXBpL3N0cmVhbS5odG1sI3N0cmVhbV9yZWFkYWJsZV9zdHJlYW1zXG4gKiBXZWIgQVBJIHJlYWRhYmxlLXN0cmVhbTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1JlYWRhYmxlU3RyZWFtXG4gKiBOb2RlIHJlYWRhYmxlIHN0cmVhbTogaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9zdHJlYW0uaHRtbCNzdHJlYW1fcmVhZGFibGVfc3RyZWFtc1xuICovXG5jbGFzcyBSZWFkYWJsZVdlYlRvTm9kZVN0cmVhbSBleHRlbmRzIHJlYWRhYmxlX3N0cmVhbV8xLlJlYWRhYmxlIHtcbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdHJlYW0gUmVhZGFibGXigItTdHJlYW06IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9SZWFkYWJsZVN0cmVhbVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHN0cmVhbSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmJ5dGVzUmVhZCA9IDA7XG4gICAgICAgIHRoaXMucmVsZWFzZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEltcGxlbWVudGF0aW9uIG9mIHJlYWRhYmxlLl9yZWFkKHNpemUpLlxuICAgICAqIFdoZW4gcmVhZGFibGUuX3JlYWQoKSBpcyBjYWxsZWQsIGlmIGRhdGEgaXMgYXZhaWxhYmxlIGZyb20gdGhlIHJlc291cmNlLFxuICAgICAqIHRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmVnaW4gcHVzaGluZyB0aGF0IGRhdGEgaW50byB0aGUgcmVhZCBxdWV1ZVxuICAgICAqIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvc3RyZWFtLmh0bWwjc3RyZWFtX3JlYWRhYmxlX3JlYWRfc2l6ZV8xXG4gICAgICovXG4gICAgYXN5bmMgX3JlYWQoKSB7XG4gICAgICAgIC8vIFNob3VsZCBzdGFydCBwdXNoaW5nIGRhdGEgaW50byB0aGUgcXVldWVcbiAgICAgICAgLy8gUmVhZCBkYXRhIGZyb20gdGhlIHVuZGVybHlpbmcgV2ViLUFQSS1yZWFkYWJsZS1zdHJlYW1cbiAgICAgICAgaWYgKHRoaXMucmVsZWFzZWQpIHtcbiAgICAgICAgICAgIHRoaXMucHVzaChudWxsKTsgLy8gU2lnbmFsIEVPRlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGVuZGluZ1JlYWQgPSB0aGlzLnJlYWRlci5yZWFkKCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLnBlbmRpbmdSZWFkO1xuICAgICAgICAvLyBjbGVhciB0aGUgcHJvbWlzZSBiZWZvcmUgcHVzaGluZyBwdXNoaW5nIG5ldyBkYXRhIHRvIHRoZSBxdWV1ZSBhbmQgYWxsb3cgc2VxdWVudGlhbCBjYWxscyB0byBfcmVhZCgpXG4gICAgICAgIGRlbGV0ZSB0aGlzLnBlbmRpbmdSZWFkO1xuICAgICAgICBpZiAoZGF0YS5kb25lIHx8IHRoaXMucmVsZWFzZWQpIHtcbiAgICAgICAgICAgIHRoaXMucHVzaChudWxsKTsgLy8gU2lnbmFsIEVPRlxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ieXRlc1JlYWQgKz0gZGF0YS52YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLnB1c2goZGF0YS52YWx1ZSk7IC8vIFB1c2ggbmV3IGRhdGEgdG8gdGhlIHF1ZXVlXG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlcmUgaXMgbm8gdW5yZXNvbHZlZCByZWFkIGNhbGwgdG8gV2ViLUFQSSBSZWFkYWJsZeKAi1N0cmVhbSBpbW1lZGlhdGVseSByZXR1cm5zO1xuICAgICAqIG90aGVyd2lzZSB3aWxsIHdhaXQgdW50aWwgdGhlIHJlYWQgaXMgcmVzb2x2ZWQuXG4gICAgICovXG4gICAgYXN5bmMgd2FpdEZvclJlYWRUb0NvbXBsZXRlKCkge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nUmVhZCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wZW5kaW5nUmVhZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbG9zZSB3cmFwcGVyXG4gICAgICovXG4gICAgYXN5bmMgY2xvc2UoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3luY0FuZFJlbGVhc2UoKTtcbiAgICB9XG4gICAgYXN5bmMgc3luY0FuZFJlbGVhc2UoKSB7XG4gICAgICAgIHRoaXMucmVsZWFzZWQgPSB0cnVlO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JSZWFkVG9Db21wbGV0ZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLnJlYWRlci5yZWxlYXNlTG9jaygpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVhZGFibGVXZWJUb05vZGVTdHJlYW0gPSBSZWFkYWJsZVdlYlRvTm9kZVN0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCAqIGFzIGllZWU3NTQgZnJvbSAnaWVlZTc1NCc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdub2RlOmJ1ZmZlcic7XG4vLyBQcmltaXRpdmUgdHlwZXNcbmZ1bmN0aW9uIGR2KGFycmF5KSB7XG4gICAgcmV0dXJuIG5ldyBEYXRhVmlldyhhcnJheS5idWZmZXIsIGFycmF5LmJ5dGVPZmZzZXQpO1xufVxuLyoqXG4gKiA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VyXG4gKi9cbmV4cG9ydCBjb25zdCBVSU5UOCA9IHtcbiAgICBsZW46IDEsXG4gICAgZ2V0KGFycmF5LCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIGR2KGFycmF5KS5nZXRVaW50OChvZmZzZXQpO1xuICAgIH0sXG4gICAgcHV0KGFycmF5LCBvZmZzZXQsIHZhbHVlKSB7XG4gICAgICAgIGR2KGFycmF5KS5zZXRVaW50OChvZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCArIDE7XG4gICAgfVxufTtcbi8qKlxuICogMTYtYml0IHVuc2lnbmVkIGludGVnZXIsIExpdHRsZSBFbmRpYW4gYnl0ZSBvcmRlclxuICovXG5leHBvcnQgY29uc3QgVUlOVDE2X0xFID0ge1xuICAgIGxlbjogMixcbiAgICBnZXQoYXJyYXksIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gZHYoYXJyYXkpLmdldFVpbnQxNihvZmZzZXQsIHRydWUpO1xuICAgIH0sXG4gICAgcHV0KGFycmF5LCBvZmZzZXQsIHZhbHVlKSB7XG4gICAgICAgIGR2KGFycmF5KS5zZXRVaW50MTYob2Zmc2V0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgKyAyO1xuICAgIH1cbn07XG4vKipcbiAqIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLCBCaWcgRW5kaWFuIGJ5dGUgb3JkZXJcbiAqL1xuZXhwb3J0IGNvbnN0IFVJTlQxNl9CRSA9IHtcbiAgICBsZW46IDIsXG4gICAgZ2V0KGFycmF5LCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIGR2KGFycmF5KS5nZXRVaW50MTYob2Zmc2V0KTtcbiAgICB9LFxuICAgIHB1dChhcnJheSwgb2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgICBkdihhcnJheSkuc2V0VWludDE2KG9mZnNldCwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ICsgMjtcbiAgICB9XG59O1xuLyoqXG4gKiAyNC1iaXQgdW5zaWduZWQgaW50ZWdlciwgTGl0dGxlIEVuZGlhbiBieXRlIG9yZGVyXG4gKi9cbmV4cG9ydCBjb25zdCBVSU5UMjRfTEUgPSB7XG4gICAgbGVuOiAzLFxuICAgIGdldChhcnJheSwgb2Zmc2V0KSB7XG4gICAgICAgIGNvbnN0IGRhdGFWaWV3ID0gZHYoYXJyYXkpO1xuICAgICAgICByZXR1cm4gZGF0YVZpZXcuZ2V0VWludDgob2Zmc2V0KSArIChkYXRhVmlldy5nZXRVaW50MTYob2Zmc2V0ICsgMSwgdHJ1ZSkgPDwgOCk7XG4gICAgfSxcbiAgICBwdXQoYXJyYXksIG9mZnNldCwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgZGF0YVZpZXcgPSBkdihhcnJheSk7XG4gICAgICAgIGRhdGFWaWV3LnNldFVpbnQ4KG9mZnNldCwgdmFsdWUgJiAweGZmKTtcbiAgICAgICAgZGF0YVZpZXcuc2V0VWludDE2KG9mZnNldCArIDEsIHZhbHVlID4+IDgsIHRydWUpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ICsgMztcbiAgICB9XG59O1xuLyoqXG4gKiAyNC1iaXQgdW5zaWduZWQgaW50ZWdlciwgQmlnIEVuZGlhbiBieXRlIG9yZGVyXG4gKi9cbmV4cG9ydCBjb25zdCBVSU5UMjRfQkUgPSB7XG4gICAgbGVuOiAzLFxuICAgIGdldChhcnJheSwgb2Zmc2V0KSB7XG4gICAgICAgIGNvbnN0IGRhdGFWaWV3ID0gZHYoYXJyYXkpO1xuICAgICAgICByZXR1cm4gKGRhdGFWaWV3LmdldFVpbnQxNihvZmZzZXQpIDw8IDgpICsgZGF0YVZpZXcuZ2V0VWludDgob2Zmc2V0ICsgMik7XG4gICAgfSxcbiAgICBwdXQoYXJyYXksIG9mZnNldCwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgZGF0YVZpZXcgPSBkdihhcnJheSk7XG4gICAgICAgIGRhdGFWaWV3LnNldFVpbnQxNihvZmZzZXQsIHZhbHVlID4+IDgpO1xuICAgICAgICBkYXRhVmlldy5zZXRVaW50OChvZmZzZXQgKyAyLCB2YWx1ZSAmIDB4ZmYpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ICsgMztcbiAgICB9XG59O1xuLyoqXG4gKiAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciwgTGl0dGxlIEVuZGlhbiBieXRlIG9yZGVyXG4gKi9cbmV4cG9ydCBjb25zdCBVSU5UMzJfTEUgPSB7XG4gICAgbGVuOiA0LFxuICAgIGdldChhcnJheSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBkdihhcnJheSkuZ2V0VWludDMyKG9mZnNldCwgdHJ1ZSk7XG4gICAgfSxcbiAgICBwdXQoYXJyYXksIG9mZnNldCwgdmFsdWUpIHtcbiAgICAgICAgZHYoYXJyYXkpLnNldFVpbnQzMihvZmZzZXQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCArIDQ7XG4gICAgfVxufTtcbi8qKlxuICogMzItYml0IHVuc2lnbmVkIGludGVnZXIsIEJpZyBFbmRpYW4gYnl0ZSBvcmRlclxuICovXG5leHBvcnQgY29uc3QgVUlOVDMyX0JFID0ge1xuICAgIGxlbjogNCxcbiAgICBnZXQoYXJyYXksIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gZHYoYXJyYXkpLmdldFVpbnQzMihvZmZzZXQpO1xuICAgIH0sXG4gICAgcHV0KGFycmF5LCBvZmZzZXQsIHZhbHVlKSB7XG4gICAgICAgIGR2KGFycmF5KS5zZXRVaW50MzIob2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgKyA0O1xuICAgIH1cbn07XG4vKipcbiAqIDgtYml0IHNpZ25lZCBpbnRlZ2VyXG4gKi9cbmV4cG9ydCBjb25zdCBJTlQ4ID0ge1xuICAgIGxlbjogMSxcbiAgICBnZXQoYXJyYXksIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gZHYoYXJyYXkpLmdldEludDgob2Zmc2V0KTtcbiAgICB9LFxuICAgIHB1dChhcnJheSwgb2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgICBkdihhcnJheSkuc2V0SW50OChvZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCArIDE7XG4gICAgfVxufTtcbi8qKlxuICogMTYtYml0IHNpZ25lZCBpbnRlZ2VyLCBCaWcgRW5kaWFuIGJ5dGUgb3JkZXJcbiAqL1xuZXhwb3J0IGNvbnN0IElOVDE2X0JFID0ge1xuICAgIGxlbjogMixcbiAgICBnZXQoYXJyYXksIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gZHYoYXJyYXkpLmdldEludDE2KG9mZnNldCk7XG4gICAgfSxcbiAgICBwdXQoYXJyYXksIG9mZnNldCwgdmFsdWUpIHtcbiAgICAgICAgZHYoYXJyYXkpLnNldEludDE2KG9mZnNldCwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ICsgMjtcbiAgICB9XG59O1xuLyoqXG4gKiAxNi1iaXQgc2lnbmVkIGludGVnZXIsIExpdHRsZSBFbmRpYW4gYnl0ZSBvcmRlclxuICovXG5leHBvcnQgY29uc3QgSU5UMTZfTEUgPSB7XG4gICAgbGVuOiAyLFxuICAgIGdldChhcnJheSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBkdihhcnJheSkuZ2V0SW50MTYob2Zmc2V0LCB0cnVlKTtcbiAgICB9LFxuICAgIHB1dChhcnJheSwgb2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgICBkdihhcnJheSkuc2V0SW50MTYob2Zmc2V0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgKyAyO1xuICAgIH1cbn07XG4vKipcbiAqIDI0LWJpdCBzaWduZWQgaW50ZWdlciwgTGl0dGxlIEVuZGlhbiBieXRlIG9yZGVyXG4gKi9cbmV4cG9ydCBjb25zdCBJTlQyNF9MRSA9IHtcbiAgICBsZW46IDMsXG4gICAgZ2V0KGFycmF5LCBvZmZzZXQpIHtcbiAgICAgICAgY29uc3QgdW5zaWduZWQgPSBVSU5UMjRfTEUuZ2V0KGFycmF5LCBvZmZzZXQpO1xuICAgICAgICByZXR1cm4gdW5zaWduZWQgPiAweDdmZmZmZiA/IHVuc2lnbmVkIC0gMHgxMDAwMDAwIDogdW5zaWduZWQ7XG4gICAgfSxcbiAgICBwdXQoYXJyYXksIG9mZnNldCwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgZGF0YVZpZXcgPSBkdihhcnJheSk7XG4gICAgICAgIGRhdGFWaWV3LnNldFVpbnQ4KG9mZnNldCwgdmFsdWUgJiAweGZmKTtcbiAgICAgICAgZGF0YVZpZXcuc2V0VWludDE2KG9mZnNldCArIDEsIHZhbHVlID4+IDgsIHRydWUpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ICsgMztcbiAgICB9XG59O1xuLyoqXG4gKiAyNC1iaXQgc2lnbmVkIGludGVnZXIsIEJpZyBFbmRpYW4gYnl0ZSBvcmRlclxuICovXG5leHBvcnQgY29uc3QgSU5UMjRfQkUgPSB7XG4gICAgbGVuOiAzLFxuICAgIGdldChhcnJheSwgb2Zmc2V0KSB7XG4gICAgICAgIGNvbnN0IHVuc2lnbmVkID0gVUlOVDI0X0JFLmdldChhcnJheSwgb2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIHVuc2lnbmVkID4gMHg3ZmZmZmYgPyB1bnNpZ25lZCAtIDB4MTAwMDAwMCA6IHVuc2lnbmVkO1xuICAgIH0sXG4gICAgcHV0KGFycmF5LCBvZmZzZXQsIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGRhdGFWaWV3ID0gZHYoYXJyYXkpO1xuICAgICAgICBkYXRhVmlldy5zZXRVaW50MTYob2Zmc2V0LCB2YWx1ZSA+PiA4KTtcbiAgICAgICAgZGF0YVZpZXcuc2V0VWludDgob2Zmc2V0ICsgMiwgdmFsdWUgJiAweGZmKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCArIDM7XG4gICAgfVxufTtcbi8qKlxuICogMzItYml0IHNpZ25lZCBpbnRlZ2VyLCBCaWcgRW5kaWFuIGJ5dGUgb3JkZXJcbiAqL1xuZXhwb3J0IGNvbnN0IElOVDMyX0JFID0ge1xuICAgIGxlbjogNCxcbiAgICBnZXQoYXJyYXksIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gZHYoYXJyYXkpLmdldEludDMyKG9mZnNldCk7XG4gICAgfSxcbiAgICBwdXQoYXJyYXksIG9mZnNldCwgdmFsdWUpIHtcbiAgICAgICAgZHYoYXJyYXkpLnNldEludDMyKG9mZnNldCwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ICsgNDtcbiAgICB9XG59O1xuLyoqXG4gKiAzMi1iaXQgc2lnbmVkIGludGVnZXIsIEJpZyBFbmRpYW4gYnl0ZSBvcmRlclxuICovXG5leHBvcnQgY29uc3QgSU5UMzJfTEUgPSB7XG4gICAgbGVuOiA0LFxuICAgIGdldChhcnJheSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBkdihhcnJheSkuZ2V0SW50MzIob2Zmc2V0LCB0cnVlKTtcbiAgICB9LFxuICAgIHB1dChhcnJheSwgb2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgICBkdihhcnJheSkuc2V0SW50MzIob2Zmc2V0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgKyA0O1xuICAgIH1cbn07XG4vKipcbiAqIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLCBMaXR0bGUgRW5kaWFuIGJ5dGUgb3JkZXJcbiAqL1xuZXhwb3J0IGNvbnN0IFVJTlQ2NF9MRSA9IHtcbiAgICBsZW46IDgsXG4gICAgZ2V0KGFycmF5LCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIGR2KGFycmF5KS5nZXRCaWdVaW50NjQob2Zmc2V0LCB0cnVlKTtcbiAgICB9LFxuICAgIHB1dChhcnJheSwgb2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgICBkdihhcnJheSkuc2V0QmlnVWludDY0KG9mZnNldCwgdmFsdWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ICsgODtcbiAgICB9XG59O1xuLyoqXG4gKiA2NC1iaXQgc2lnbmVkIGludGVnZXIsIExpdHRsZSBFbmRpYW4gYnl0ZSBvcmRlclxuICovXG5leHBvcnQgY29uc3QgSU5UNjRfTEUgPSB7XG4gICAgbGVuOiA4LFxuICAgIGdldChhcnJheSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBkdihhcnJheSkuZ2V0QmlnSW50NjQob2Zmc2V0LCB0cnVlKTtcbiAgICB9LFxuICAgIHB1dChhcnJheSwgb2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgICBkdihhcnJheSkuc2V0QmlnSW50NjQob2Zmc2V0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgKyA4O1xuICAgIH1cbn07XG4vKipcbiAqIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLCBCaWcgRW5kaWFuIGJ5dGUgb3JkZXJcbiAqL1xuZXhwb3J0IGNvbnN0IFVJTlQ2NF9CRSA9IHtcbiAgICBsZW46IDgsXG4gICAgZ2V0KGFycmF5LCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIGR2KGFycmF5KS5nZXRCaWdVaW50NjQob2Zmc2V0KTtcbiAgICB9LFxuICAgIHB1dChhcnJheSwgb2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgICBkdihhcnJheSkuc2V0QmlnVWludDY0KG9mZnNldCwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ICsgODtcbiAgICB9XG59O1xuLyoqXG4gKiA2NC1iaXQgc2lnbmVkIGludGVnZXIsIEJpZyBFbmRpYW4gYnl0ZSBvcmRlclxuICovXG5leHBvcnQgY29uc3QgSU5UNjRfQkUgPSB7XG4gICAgbGVuOiA4LFxuICAgIGdldChhcnJheSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBkdihhcnJheSkuZ2V0QmlnSW50NjQob2Zmc2V0KTtcbiAgICB9LFxuICAgIHB1dChhcnJheSwgb2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgICBkdihhcnJheSkuc2V0QmlnSW50NjQob2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgKyA4O1xuICAgIH1cbn07XG4vKipcbiAqIElFRUUgNzU0IDE2LWJpdCAoaGFsZiBwcmVjaXNpb24pIGZsb2F0LCBiaWcgZW5kaWFuXG4gKi9cbmV4cG9ydCBjb25zdCBGbG9hdDE2X0JFID0ge1xuICAgIGxlbjogMixcbiAgICBnZXQoZGF0YVZpZXcsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gaWVlZTc1NC5yZWFkKGRhdGFWaWV3LCBvZmZzZXQsIGZhbHNlLCAxMCwgdGhpcy5sZW4pO1xuICAgIH0sXG4gICAgcHV0KGRhdGFWaWV3LCBvZmZzZXQsIHZhbHVlKSB7XG4gICAgICAgIGllZWU3NTQud3JpdGUoZGF0YVZpZXcsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCAxMCwgdGhpcy5sZW4pO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ICsgdGhpcy5sZW47XG4gICAgfVxufTtcbi8qKlxuICogSUVFRSA3NTQgMTYtYml0IChoYWxmIHByZWNpc2lvbikgZmxvYXQsIGxpdHRsZSBlbmRpYW5cbiAqL1xuZXhwb3J0IGNvbnN0IEZsb2F0MTZfTEUgPSB7XG4gICAgbGVuOiAyLFxuICAgIGdldChhcnJheSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBpZWVlNzU0LnJlYWQoYXJyYXksIG9mZnNldCwgdHJ1ZSwgMTAsIHRoaXMubGVuKTtcbiAgICB9LFxuICAgIHB1dChhcnJheSwgb2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgICBpZWVlNzU0LndyaXRlKGFycmF5LCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCAxMCwgdGhpcy5sZW4pO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ICsgdGhpcy5sZW47XG4gICAgfVxufTtcbi8qKlxuICogSUVFRSA3NTQgMzItYml0IChzaW5nbGUgcHJlY2lzaW9uKSBmbG9hdCwgYmlnIGVuZGlhblxuICovXG5leHBvcnQgY29uc3QgRmxvYXQzMl9CRSA9IHtcbiAgICBsZW46IDQsXG4gICAgZ2V0KGFycmF5LCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIGR2KGFycmF5KS5nZXRGbG9hdDMyKG9mZnNldCk7XG4gICAgfSxcbiAgICBwdXQoYXJyYXksIG9mZnNldCwgdmFsdWUpIHtcbiAgICAgICAgZHYoYXJyYXkpLnNldEZsb2F0MzIob2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgKyA0O1xuICAgIH1cbn07XG4vKipcbiAqIElFRUUgNzU0IDMyLWJpdCAoc2luZ2xlIHByZWNpc2lvbikgZmxvYXQsIGxpdHRsZSBlbmRpYW5cbiAqL1xuZXhwb3J0IGNvbnN0IEZsb2F0MzJfTEUgPSB7XG4gICAgbGVuOiA0LFxuICAgIGdldChhcnJheSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBkdihhcnJheSkuZ2V0RmxvYXQzMihvZmZzZXQsIHRydWUpO1xuICAgIH0sXG4gICAgcHV0KGFycmF5LCBvZmZzZXQsIHZhbHVlKSB7XG4gICAgICAgIGR2KGFycmF5KS5zZXRGbG9hdDMyKG9mZnNldCwgdmFsdWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ICsgNDtcbiAgICB9XG59O1xuLyoqXG4gKiBJRUVFIDc1NCA2NC1iaXQgKGRvdWJsZSBwcmVjaXNpb24pIGZsb2F0LCBiaWcgZW5kaWFuXG4gKi9cbmV4cG9ydCBjb25zdCBGbG9hdDY0X0JFID0ge1xuICAgIGxlbjogOCxcbiAgICBnZXQoYXJyYXksIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gZHYoYXJyYXkpLmdldEZsb2F0NjQob2Zmc2V0KTtcbiAgICB9LFxuICAgIHB1dChhcnJheSwgb2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgICBkdihhcnJheSkuc2V0RmxvYXQ2NChvZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCArIDg7XG4gICAgfVxufTtcbi8qKlxuICogSUVFRSA3NTQgNjQtYml0IChkb3VibGUgcHJlY2lzaW9uKSBmbG9hdCwgbGl0dGxlIGVuZGlhblxuICovXG5leHBvcnQgY29uc3QgRmxvYXQ2NF9MRSA9IHtcbiAgICBsZW46IDgsXG4gICAgZ2V0KGFycmF5LCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIGR2KGFycmF5KS5nZXRGbG9hdDY0KG9mZnNldCwgdHJ1ZSk7XG4gICAgfSxcbiAgICBwdXQoYXJyYXksIG9mZnNldCwgdmFsdWUpIHtcbiAgICAgICAgZHYoYXJyYXkpLnNldEZsb2F0NjQob2Zmc2V0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgKyA4O1xuICAgIH1cbn07XG4vKipcbiAqIElFRUUgNzU0IDgwLWJpdCAoZXh0ZW5kZWQgcHJlY2lzaW9uKSBmbG9hdCwgYmlnIGVuZGlhblxuICovXG5leHBvcnQgY29uc3QgRmxvYXQ4MF9CRSA9IHtcbiAgICBsZW46IDEwLFxuICAgIGdldChhcnJheSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBpZWVlNzU0LnJlYWQoYXJyYXksIG9mZnNldCwgZmFsc2UsIDYzLCB0aGlzLmxlbik7XG4gICAgfSxcbiAgICBwdXQoYXJyYXksIG9mZnNldCwgdmFsdWUpIHtcbiAgICAgICAgaWVlZTc1NC53cml0ZShhcnJheSwgdmFsdWUsIG9mZnNldCwgZmFsc2UsIDYzLCB0aGlzLmxlbik7XG4gICAgICAgIHJldHVybiBvZmZzZXQgKyB0aGlzLmxlbjtcbiAgICB9XG59O1xuLyoqXG4gKiBJRUVFIDc1NCA4MC1iaXQgKGV4dGVuZGVkIHByZWNpc2lvbikgZmxvYXQsIGxpdHRsZSBlbmRpYW5cbiAqL1xuZXhwb3J0IGNvbnN0IEZsb2F0ODBfTEUgPSB7XG4gICAgbGVuOiAxMCxcbiAgICBnZXQoYXJyYXksIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gaWVlZTc1NC5yZWFkKGFycmF5LCBvZmZzZXQsIHRydWUsIDYzLCB0aGlzLmxlbik7XG4gICAgfSxcbiAgICBwdXQoYXJyYXksIG9mZnNldCwgdmFsdWUpIHtcbiAgICAgICAgaWVlZTc1NC53cml0ZShhcnJheSwgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgNjMsIHRoaXMubGVuKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCArIHRoaXMubGVuO1xuICAgIH1cbn07XG4vKipcbiAqIElnbm9yZSBhIGdpdmVuIG51bWJlciBvZiBieXRlc1xuICovXG5leHBvcnQgY2xhc3MgSWdub3JlVHlwZSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGxlbiBudW1iZXIgb2YgYnl0ZXMgdG8gaWdub3JlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobGVuKSB7XG4gICAgICAgIHRoaXMubGVuID0gbGVuO1xuICAgIH1cbiAgICAvLyBUb0RvOiBkb24ndCByZWFkLCBidXQgc2tpcCBkYXRhXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgIGdldChhcnJheSwgb2ZmKSB7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFVpbnQ4QXJyYXlUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcihsZW4pIHtcbiAgICAgICAgdGhpcy5sZW4gPSBsZW47XG4gICAgfVxuICAgIGdldChhcnJheSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBhcnJheS5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIHRoaXMubGVuKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQnVmZmVyVHlwZSB7XG4gICAgY29uc3RydWN0b3IobGVuKSB7XG4gICAgICAgIHRoaXMubGVuID0gbGVuO1xuICAgIH1cbiAgICBnZXQodWludDhBcnJheSwgb2ZmKSB7XG4gICAgICAgIHJldHVybiBCdWZmZXIuZnJvbSh1aW50OEFycmF5LnN1YmFycmF5KG9mZiwgb2ZmICsgdGhpcy5sZW4pKTtcbiAgICB9XG59XG4vKipcbiAqIENvbnN1bWUgYSBmaXhlZCBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtIGFuZCByZXR1cm4gYSBzdHJpbmcgd2l0aCBhIHNwZWNpZmllZCBlbmNvZGluZy5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0cmluZ1R5cGUge1xuICAgIGNvbnN0cnVjdG9yKGxlbiwgZW5jb2RpbmcpIHtcbiAgICAgICAgdGhpcy5sZW4gPSBsZW47XG4gICAgICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgICB9XG4gICAgZ2V0KHVpbnQ4QXJyYXksIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20odWludDhBcnJheSkudG9TdHJpbmcodGhpcy5lbmNvZGluZywgb2Zmc2V0LCBvZmZzZXQgKyB0aGlzLmxlbik7XG4gICAgfVxufVxuLyoqXG4gKiBBTlNJIExhdGluIDEgU3RyaW5nXG4gKiBVc2luZyB3aW5kb3dzLTEyNTIgLyBJU08gODg1OS0xIGRlY29kaW5nXG4gKi9cbmV4cG9ydCBjbGFzcyBBbnNpU3RyaW5nVHlwZSB7XG4gICAgY29uc3RydWN0b3IobGVuKSB7XG4gICAgICAgIHRoaXMubGVuID0gbGVuO1xuICAgIH1cbiAgICBzdGF0aWMgZGVjb2RlKGJ1ZmZlciwgb2Zmc2V0LCB1bnRpbCkge1xuICAgICAgICBsZXQgc3RyID0gJyc7XG4gICAgICAgIGZvciAobGV0IGkgPSBvZmZzZXQ7IGkgPCB1bnRpbDsgKytpKSB7XG4gICAgICAgICAgICBzdHIgKz0gQW5zaVN0cmluZ1R5cGUuY29kZVBvaW50VG9TdHJpbmcoQW5zaVN0cmluZ1R5cGUuc2luZ2xlQnl0ZURlY29kZXIoYnVmZmVyW2ldKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgc3RhdGljIGluUmFuZ2UoYSwgbWluLCBtYXgpIHtcbiAgICAgICAgcmV0dXJuIG1pbiA8PSBhICYmIGEgPD0gbWF4O1xuICAgIH1cbiAgICBzdGF0aWMgY29kZVBvaW50VG9TdHJpbmcoY3ApIHtcbiAgICAgICAgaWYgKGNwIDw9IDB4RkZGRikge1xuICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY3ApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY3AgLT0gMHgxMDAwMDtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKChjcCA+PiAxMCkgKyAweEQ4MDAsIChjcCAmIDB4M0ZGKSArIDB4REMwMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIHNpbmdsZUJ5dGVEZWNvZGVyKGJpdGUpIHtcbiAgICAgICAgaWYgKEFuc2lTdHJpbmdUeXBlLmluUmFuZ2UoYml0ZSwgMHgwMCwgMHg3RikpIHtcbiAgICAgICAgICAgIHJldHVybiBiaXRlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGVQb2ludCA9IEFuc2lTdHJpbmdUeXBlLndpbmRvd3MxMjUyW2JpdGUgLSAweDgwXTtcbiAgICAgICAgaWYgKGNvZGVQb2ludCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ2ludmFsaWRpbmcgZW5jb2RpbmcnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29kZVBvaW50O1xuICAgIH1cbiAgICBnZXQoYnVmZmVyLCBvZmZzZXQgPSAwKSB7XG4gICAgICAgIHJldHVybiBBbnNpU3RyaW5nVHlwZS5kZWNvZGUoYnVmZmVyLCBvZmZzZXQsIG9mZnNldCArIHRoaXMubGVuKTtcbiAgICB9XG59XG5BbnNpU3RyaW5nVHlwZS53aW5kb3dzMTI1MiA9IFs4MzY0LCAxMjksIDgyMTgsIDQwMiwgODIyMiwgODIzMCwgODIyNCwgODIyNSwgNzEwLCA4MjQwLCAzNTIsXG4gICAgODI0OSwgMzM4LCAxNDEsIDM4MSwgMTQzLCAxNDQsIDgyMTYsIDgyMTcsIDgyMjAsIDgyMjEsIDgyMjYsIDgyMTEsIDgyMTIsIDczMixcbiAgICA4NDgyLCAzNTMsIDgyNTAsIDMzOSwgMTU3LCAzODIsIDM3NiwgMTYwLCAxNjEsIDE2MiwgMTYzLCAxNjQsIDE2NSwgMTY2LCAxNjcsIDE2OCxcbiAgICAxNjksIDE3MCwgMTcxLCAxNzIsIDE3MywgMTc0LCAxNzUsIDE3NiwgMTc3LCAxNzgsIDE3OSwgMTgwLCAxODEsIDE4MiwgMTgzLCAxODQsXG4gICAgMTg1LCAxODYsIDE4NywgMTg4LCAxODksIDE5MCwgMTkxLCAxOTIsIDE5MywgMTk0LCAxOTUsIDE5NiwgMTk3LCAxOTgsIDE5OSwgMjAwLFxuICAgIDIwMSwgMjAyLCAyMDMsIDIwNCwgMjA1LCAyMDYsIDIwNywgMjA4LCAyMDksIDIxMCwgMjExLCAyMTIsIDIxMywgMjE0LCAyMTUsIDIxNixcbiAgICAyMTcsIDIxOCwgMjE5LCAyMjAsIDIyMSwgMjIyLCAyMjMsIDIyNCwgMjI1LCAyMjYsIDIyNywgMjI4LCAyMjksIDIzMCwgMjMxLCAyMzIsXG4gICAgMjMzLCAyMzQsIDIzNSwgMjM2LCAyMzcsIDIzOCwgMjM5LCAyNDAsIDI0MSwgMjQyLCAyNDMsIDI0NCwgMjQ1LCAyNDYsIDI0NyxcbiAgICAyNDgsIDI0OSwgMjUwLCAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NV07XG4iLCJleHBvcnQgY29uc3QgZGVmYXVsdE1lc3NhZ2VzID0gJ0VuZC1PZi1TdHJlYW0nO1xuLyoqXG4gKiBUaHJvd24gb24gcmVhZCBvcGVyYXRpb24gb2YgdGhlIGVuZCBvZiBmaWxlIG9yIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkXG4gKi9cbmV4cG9ydCBjbGFzcyBFbmRPZlN0cmVhbUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihkZWZhdWx0TWVzc2FnZXMpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEVuZE9mU3RyZWFtRXJyb3IgfSBmcm9tICdwZWVrLXJlYWRhYmxlJztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ25vZGU6YnVmZmVyJztcbi8qKlxuICogQ29yZSB0b2tlbml6ZXJcbiAqL1xuZXhwb3J0IGNsYXNzIEFic3RyYWN0VG9rZW5pemVyIHtcbiAgICBjb25zdHJ1Y3RvcihmaWxlSW5mbykge1xuICAgICAgICAvKipcbiAgICAgICAgICogVG9rZW5pemVyLXN0cmVhbSBwb3NpdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IDA7XG4gICAgICAgIHRoaXMubnVtQnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoOCk7XG4gICAgICAgIHRoaXMuZmlsZUluZm8gPSBmaWxlSW5mbyA/IGZpbGVJbmZvIDoge307XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSB0b2tlbiBmcm9tIHRoZSB0b2tlbml6ZXItc3RyZWFtXG4gICAgICogQHBhcmFtIHRva2VuIC0gVGhlIHRva2VuIHRvIHJlYWRcbiAgICAgKiBAcGFyYW0gcG9zaXRpb24gLSBJZiBwcm92aWRlZCwgdGhlIGRlc2lyZWQgcG9zaXRpb24gaW4gdGhlIHRva2VuaXplci1zdHJlYW1cbiAgICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggdG9rZW4gZGF0YVxuICAgICAqL1xuICAgIGFzeW5jIHJlYWRUb2tlbih0b2tlbiwgcG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IHVpbnQ4QXJyYXkgPSBCdWZmZXIuYWxsb2ModG9rZW4ubGVuKTtcbiAgICAgICAgY29uc3QgbGVuID0gYXdhaXQgdGhpcy5yZWFkQnVmZmVyKHVpbnQ4QXJyYXksIHsgcG9zaXRpb24gfSk7XG4gICAgICAgIGlmIChsZW4gPCB0b2tlbi5sZW4pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRW5kT2ZTdHJlYW1FcnJvcigpO1xuICAgICAgICByZXR1cm4gdG9rZW4uZ2V0KHVpbnQ4QXJyYXksIDApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQZWVrIGEgdG9rZW4gZnJvbSB0aGUgdG9rZW5pemVyLXN0cmVhbS5cbiAgICAgKiBAcGFyYW0gdG9rZW4gLSBUb2tlbiB0byBwZWVrIGZyb20gdGhlIHRva2VuaXplci1zdHJlYW0uXG4gICAgICogQHBhcmFtIHBvc2l0aW9uIC0gT2Zmc2V0IHdoZXJlIHRvIGJlZ2luIHJlYWRpbmcgd2l0aGluIHRoZSBmaWxlLiBJZiBwb3NpdGlvbiBpcyBudWxsLCBkYXRhIHdpbGwgYmUgcmVhZCBmcm9tIHRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHRva2VuIGRhdGFcbiAgICAgKi9cbiAgICBhc3luYyBwZWVrVG9rZW4odG9rZW4sIHBvc2l0aW9uID0gdGhpcy5wb3NpdGlvbikge1xuICAgICAgICBjb25zdCB1aW50OEFycmF5ID0gQnVmZmVyLmFsbG9jKHRva2VuLmxlbik7XG4gICAgICAgIGNvbnN0IGxlbiA9IGF3YWl0IHRoaXMucGVla0J1ZmZlcih1aW50OEFycmF5LCB7IHBvc2l0aW9uIH0pO1xuICAgICAgICBpZiAobGVuIDwgdG9rZW4ubGVuKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVuZE9mU3RyZWFtRXJyb3IoKTtcbiAgICAgICAgcmV0dXJuIHRva2VuLmdldCh1aW50OEFycmF5LCAwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIG51bWVyaWMgdG9rZW4gZnJvbSB0aGUgc3RyZWFtXG4gICAgICogQHBhcmFtIHRva2VuIC0gTnVtZXJpYyB0b2tlblxuICAgICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBudW1iZXJcbiAgICAgKi9cbiAgICBhc3luYyByZWFkTnVtYmVyKHRva2VuKSB7XG4gICAgICAgIGNvbnN0IGxlbiA9IGF3YWl0IHRoaXMucmVhZEJ1ZmZlcih0aGlzLm51bUJ1ZmZlciwgeyBsZW5ndGg6IHRva2VuLmxlbiB9KTtcbiAgICAgICAgaWYgKGxlbiA8IHRva2VuLmxlbilcbiAgICAgICAgICAgIHRocm93IG5ldyBFbmRPZlN0cmVhbUVycm9yKCk7XG4gICAgICAgIHJldHVybiB0b2tlbi5nZXQodGhpcy5udW1CdWZmZXIsIDApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgbnVtZXJpYyB0b2tlbiBmcm9tIHRoZSBzdHJlYW1cbiAgICAgKiBAcGFyYW0gdG9rZW4gLSBOdW1lcmljIHRva2VuXG4gICAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIG51bWJlclxuICAgICAqL1xuICAgIGFzeW5jIHBlZWtOdW1iZXIodG9rZW4pIHtcbiAgICAgICAgY29uc3QgbGVuID0gYXdhaXQgdGhpcy5wZWVrQnVmZmVyKHRoaXMubnVtQnVmZmVyLCB7IGxlbmd0aDogdG9rZW4ubGVuIH0pO1xuICAgICAgICBpZiAobGVuIDwgdG9rZW4ubGVuKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVuZE9mU3RyZWFtRXJyb3IoKTtcbiAgICAgICAgcmV0dXJuIHRva2VuLmdldCh0aGlzLm51bUJ1ZmZlciwgMCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElnbm9yZSBudW1iZXIgb2YgYnl0ZXMsIGFkdmFuY2VzIHRoZSBwb2ludGVyIGluIHVuZGVyIHRva2VuaXplci1zdHJlYW0uXG4gICAgICogQHBhcmFtIGxlbmd0aCAtIE51bWJlciBvZiBieXRlcyB0byBpZ25vcmVcbiAgICAgKiBAcmV0dXJuIHJlc29sdmVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaWdub3JlZCwgZXF1YWxzIGxlbmd0aCBpZiB0aGlzIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlXG4gICAgICovXG4gICAgYXN5bmMgaWdub3JlKGxlbmd0aCkge1xuICAgICAgICBpZiAodGhpcy5maWxlSW5mby5zaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGJ5dGVzTGVmdCA9IHRoaXMuZmlsZUluZm8uc2l6ZSAtIHRoaXMucG9zaXRpb247XG4gICAgICAgICAgICBpZiAobGVuZ3RoID4gYnl0ZXNMZWZ0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiArPSBieXRlc0xlZnQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJ5dGVzTGVmdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBvc2l0aW9uICs9IGxlbmd0aDtcbiAgICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICB9XG4gICAgYXN5bmMgY2xvc2UoKSB7XG4gICAgICAgIC8vIGVtcHR5XG4gICAgfVxuICAgIG5vcm1hbGl6ZU9wdGlvbnModWludDhBcnJheSwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnBvc2l0aW9uICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5wb3NpdGlvbiA8IHRoaXMucG9zaXRpb24pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYG9wdGlvbnMucG9zaXRpb25gIG11c3QgYmUgZXF1YWwgb3IgZ3JlYXRlciB0aGFuIGB0b2tlbml6ZXIucG9zaXRpb25gJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbWF5QmVMZXNzOiBvcHRpb25zLm1heUJlTGVzcyA9PT0gdHJ1ZSxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IG9wdGlvbnMub2Zmc2V0ID8gb3B0aW9ucy5vZmZzZXQgOiAwLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogb3B0aW9ucy5sZW5ndGggPyBvcHRpb25zLmxlbmd0aCA6ICh1aW50OEFycmF5Lmxlbmd0aCAtIChvcHRpb25zLm9mZnNldCA/IG9wdGlvbnMub2Zmc2V0IDogMCkpLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBvcHRpb25zLnBvc2l0aW9uID8gb3B0aW9ucy5wb3NpdGlvbiA6IHRoaXMucG9zaXRpb25cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1heUJlTGVzczogZmFsc2UsXG4gICAgICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgICAgICBsZW5ndGg6IHVpbnQ4QXJyYXkubGVuZ3RoLFxuICAgICAgICAgICAgcG9zaXRpb246IHRoaXMucG9zaXRpb25cbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBFbmRPZlN0cmVhbUVycm9yIH0gZnJvbSAncGVlay1yZWFkYWJsZSc7XG5pbXBvcnQgeyBBYnN0cmFjdFRva2VuaXplciB9IGZyb20gJy4vQWJzdHJhY3RUb2tlbml6ZXIuanMnO1xuZXhwb3J0IGNsYXNzIEJ1ZmZlclRva2VuaXplciBleHRlbmRzIEFic3RyYWN0VG9rZW5pemVyIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgQnVmZmVyVG9rZW5pemVyXG4gICAgICogQHBhcmFtIHVpbnQ4QXJyYXkgLSBVaW50OEFycmF5IHRvIHRva2VuaXplXG4gICAgICogQHBhcmFtIGZpbGVJbmZvIC0gUGFzcyBhZGRpdGlvbmFsIGZpbGUgaW5mb3JtYXRpb24gdG8gdGhlIHRva2VuaXplclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHVpbnQ4QXJyYXksIGZpbGVJbmZvKSB7XG4gICAgICAgIHN1cGVyKGZpbGVJbmZvKTtcbiAgICAgICAgdGhpcy51aW50OEFycmF5ID0gdWludDhBcnJheTtcbiAgICAgICAgdGhpcy5maWxlSW5mby5zaXplID0gdGhpcy5maWxlSW5mby5zaXplID8gdGhpcy5maWxlSW5mby5zaXplIDogdWludDhBcnJheS5sZW5ndGg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYnVmZmVyIGZyb20gdG9rZW5pemVyXG4gICAgICogQHBhcmFtIHVpbnQ4QXJyYXkgLSBVaW50OEFycmF5IHRvIHRva2VuaXplXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBSZWFkIGJlaGF2aW91ciBvcHRpb25zXG4gICAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn1cbiAgICAgKi9cbiAgICBhc3luYyByZWFkQnVmZmVyKHVpbnQ4QXJyYXksIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5wb3NpdGlvbikge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucG9zaXRpb24gPCB0aGlzLnBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdgb3B0aW9ucy5wb3NpdGlvbmAgbXVzdCBiZSBlcXVhbCBvciBncmVhdGVyIHRoYW4gYHRva2VuaXplci5wb3NpdGlvbmAnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSBvcHRpb25zLnBvc2l0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ5dGVzUmVhZCA9IGF3YWl0IHRoaXMucGVla0J1ZmZlcih1aW50OEFycmF5LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbiArPSBieXRlc1JlYWQ7XG4gICAgICAgIHJldHVybiBieXRlc1JlYWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBlZWsgKHJlYWQgYWhlYWQpIGJ1ZmZlciBmcm9tIHRva2VuaXplclxuICAgICAqIEBwYXJhbSB1aW50OEFycmF5XG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBSZWFkIGJlaGF2aW91ciBvcHRpb25zXG4gICAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn1cbiAgICAgKi9cbiAgICBhc3luYyBwZWVrQnVmZmVyKHVpbnQ4QXJyYXksIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgbm9ybU9wdGlvbnMgPSB0aGlzLm5vcm1hbGl6ZU9wdGlvbnModWludDhBcnJheSwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGJ5dGVzMnJlYWQgPSBNYXRoLm1pbih0aGlzLnVpbnQ4QXJyYXkubGVuZ3RoIC0gbm9ybU9wdGlvbnMucG9zaXRpb24sIG5vcm1PcHRpb25zLmxlbmd0aCk7XG4gICAgICAgIGlmICgoIW5vcm1PcHRpb25zLm1heUJlTGVzcykgJiYgYnl0ZXMycmVhZCA8IG5vcm1PcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVuZE9mU3RyZWFtRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHVpbnQ4QXJyYXkuc2V0KHRoaXMudWludDhBcnJheS5zdWJhcnJheShub3JtT3B0aW9ucy5wb3NpdGlvbiwgbm9ybU9wdGlvbnMucG9zaXRpb24gKyBieXRlczJyZWFkKSwgbm9ybU9wdGlvbnMub2Zmc2V0KTtcbiAgICAgICAgICAgIHJldHVybiBieXRlczJyZWFkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgICAvLyBlbXB0eVxuICAgIH1cbn1cbiIsImltcG9ydCB7IFJlYWRTdHJlYW1Ub2tlbml6ZXIgfSBmcm9tICcuL1JlYWRTdHJlYW1Ub2tlbml6ZXIuanMnO1xuaW1wb3J0IHsgQnVmZmVyVG9rZW5pemVyIH0gZnJvbSAnLi9CdWZmZXJUb2tlbml6ZXIuanMnO1xuZXhwb3J0IHsgRW5kT2ZTdHJlYW1FcnJvciB9IGZyb20gJ3BlZWstcmVhZGFibGUnO1xuLyoqXG4gKiBDb25zdHJ1Y3QgUmVhZFN0cmVhbVRva2VuaXplciBmcm9tIGdpdmVuIFN0cmVhbS5cbiAqIFdpbGwgc2V0IGZpbGVTaXplLCBpZiBwcm92aWRlZCBnaXZlbiBTdHJlYW0gaGFzIHNldCB0aGUgLnBhdGggcHJvcGVydHkvXG4gKiBAcGFyYW0gc3RyZWFtIC0gUmVhZCBmcm9tIE5vZGUuanMgU3RyZWFtLlJlYWRhYmxlXG4gKiBAcGFyYW0gZmlsZUluZm8gLSBQYXNzIHRoZSBmaWxlIGluZm9ybWF0aW9uLCBsaWtlIHNpemUgYW5kIE1JTUUtdHlwZSBvZiB0aGUgY29ycmVzcG9uZGluZyBzdHJlYW0uXG4gKiBAcmV0dXJucyBSZWFkU3RyZWFtVG9rZW5pemVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tU3RyZWFtKHN0cmVhbSwgZmlsZUluZm8pIHtcbiAgICBmaWxlSW5mbyA9IGZpbGVJbmZvID8gZmlsZUluZm8gOiB7fTtcbiAgICByZXR1cm4gbmV3IFJlYWRTdHJlYW1Ub2tlbml6ZXIoc3RyZWFtLCBmaWxlSW5mbyk7XG59XG4vKipcbiAqIENvbnN0cnVjdCBSZWFkU3RyZWFtVG9rZW5pemVyIGZyb20gZ2l2ZW4gQnVmZmVyLlxuICogQHBhcmFtIHVpbnQ4QXJyYXkgLSBVaW50OEFycmF5IHRvIHRva2VuaXplXG4gKiBAcGFyYW0gZmlsZUluZm8gLSBQYXNzIGFkZGl0aW9uYWwgZmlsZSBpbmZvcm1hdGlvbiB0byB0aGUgdG9rZW5pemVyXG4gKiBAcmV0dXJucyBCdWZmZXJUb2tlbml6ZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21CdWZmZXIodWludDhBcnJheSwgZmlsZUluZm8pIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlclRva2VuaXplcih1aW50OEFycmF5LCBmaWxlSW5mbyk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyhzdHJpbmcpIHtcblx0cmV0dXJuIFsuLi5zdHJpbmddLm1hcChjaGFyYWN0ZXIgPT4gY2hhcmFjdGVyLmNoYXJDb2RlQXQoMCkpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHVuaWNvcm4vcHJlZmVyLWNvZGUtcG9pbnRcbn1cblxuLyoqXG5DaGVja3Mgd2hldGhlciB0aGUgVEFSIGNoZWNrc3VtIGlzIHZhbGlkLlxuXG5AcGFyYW0ge0J1ZmZlcn0gYnVmZmVyIC0gVGhlIFRBUiBoZWFkZXIgYFtvZmZzZXQgLi4uIG9mZnNldCArIDUxMl1gLlxuQHBhcmFtIHtudW1iZXJ9IG9mZnNldCAtIFRBUiBoZWFkZXIgb2Zmc2V0LlxuQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgVEFSIGNoZWNrc3VtIGlzIHZhbGlkLCBvdGhlcndpc2UgYGZhbHNlYC5cbiovXG5leHBvcnQgZnVuY3Rpb24gdGFySGVhZGVyQ2hlY2tzdW1NYXRjaGVzKGJ1ZmZlciwgb2Zmc2V0ID0gMCkge1xuXHRjb25zdCByZWFkU3VtID0gTnVtYmVyLnBhcnNlSW50KGJ1ZmZlci50b1N0cmluZygndXRmOCcsIDE0OCwgMTU0KS5yZXBsYWNlKC9cXDAuKiQvLCAnJykudHJpbSgpLCA4KTsgLy8gUmVhZCBzdW0gaW4gaGVhZGVyXG5cdGlmIChOdW1iZXIuaXNOYU4ocmVhZFN1bSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRsZXQgc3VtID0gOCAqIDB4MjA7IC8vIEluaXRpYWxpemUgc2lnbmVkIGJpdCBzdW1cblxuXHRmb3IgKGxldCBpbmRleCA9IG9mZnNldDsgaW5kZXggPCBvZmZzZXQgKyAxNDg7IGluZGV4KyspIHtcblx0XHRzdW0gKz0gYnVmZmVyW2luZGV4XTtcblx0fVxuXG5cdGZvciAobGV0IGluZGV4ID0gb2Zmc2V0ICsgMTU2OyBpbmRleCA8IG9mZnNldCArIDUxMjsgaW5kZXgrKykge1xuXHRcdHN1bSArPSBidWZmZXJbaW5kZXhdO1xuXHR9XG5cblx0cmV0dXJuIHJlYWRTdW0gPT09IHN1bTtcbn1cblxuLyoqXG5JRDMgVUlOVDMyIHN5bmMtc2FmZSB0b2tlbml6ZXIgdG9rZW4uXG4yOCBiaXRzIChyZXByZXNlbnRpbmcgdXAgdG8gMjU2TUIpIGludGVnZXIsIHRoZSBtc2IgaXMgMCB0byBhdm9pZCBcImZhbHNlIHN5bmNzaWduYWxzXCIuXG4qL1xuZXhwb3J0IGNvbnN0IHVpbnQzMlN5bmNTYWZlVG9rZW4gPSB7XG5cdGdldDogKGJ1ZmZlciwgb2Zmc2V0KSA9PiAoYnVmZmVyW29mZnNldCArIDNdICYgMHg3RikgfCAoKGJ1ZmZlcltvZmZzZXQgKyAyXSkgPDwgNykgfCAoKGJ1ZmZlcltvZmZzZXQgKyAxXSkgPDwgMTQpIHwgKChidWZmZXJbb2Zmc2V0XSkgPDwgMjEpLFxuXHRsZW46IDQsXG59O1xuIiwiZXhwb3J0IGNvbnN0IGV4dGVuc2lvbnMgPSBbXG5cdCdqcGcnLFxuXHQncG5nJyxcblx0J2FwbmcnLFxuXHQnZ2lmJyxcblx0J3dlYnAnLFxuXHQnZmxpZicsXG5cdCd4Y2YnLFxuXHQnY3IyJyxcblx0J2NyMycsXG5cdCdvcmYnLFxuXHQnYXJ3Jyxcblx0J2RuZycsXG5cdCduZWYnLFxuXHQncncyJyxcblx0J3JhZicsXG5cdCd0aWYnLFxuXHQnYm1wJyxcblx0J2ljbnMnLFxuXHQnanhyJyxcblx0J3BzZCcsXG5cdCdpbmRkJyxcblx0J3ppcCcsXG5cdCd0YXInLFxuXHQncmFyJyxcblx0J2d6Jyxcblx0J2J6MicsXG5cdCc3eicsXG5cdCdkbWcnLFxuXHQnbXA0Jyxcblx0J21pZCcsXG5cdCdta3YnLFxuXHQnd2VibScsXG5cdCdtb3YnLFxuXHQnYXZpJyxcblx0J21wZycsXG5cdCdtcDInLFxuXHQnbXAzJyxcblx0J200YScsXG5cdCdvZ2EnLFxuXHQnb2dnJyxcblx0J29ndicsXG5cdCdvcHVzJyxcblx0J2ZsYWMnLFxuXHQnd2F2Jyxcblx0J3NweCcsXG5cdCdhbXInLFxuXHQncGRmJyxcblx0J2VwdWInLFxuXHQnZWxmJyxcblx0J2V4ZScsXG5cdCdzd2YnLFxuXHQncnRmJyxcblx0J3dhc20nLFxuXHQnd29mZicsXG5cdCd3b2ZmMicsXG5cdCdlb3QnLFxuXHQndHRmJyxcblx0J290ZicsXG5cdCdpY28nLFxuXHQnZmx2Jyxcblx0J3BzJyxcblx0J3h6Jyxcblx0J3NxbGl0ZScsXG5cdCduZXMnLFxuXHQnY3J4Jyxcblx0J3hwaScsXG5cdCdjYWInLFxuXHQnZGViJyxcblx0J2FyJyxcblx0J3JwbScsXG5cdCdaJyxcblx0J2x6Jyxcblx0J2NmYicsXG5cdCdteGYnLFxuXHQnbXRzJyxcblx0J2JsZW5kJyxcblx0J2JwZycsXG5cdCdkb2N4Jyxcblx0J3BwdHgnLFxuXHQneGxzeCcsXG5cdCczZ3AnLFxuXHQnM2cyJyxcblx0J2oyYycsXG5cdCdqcDInLFxuXHQnanBtJyxcblx0J2pweCcsXG5cdCdtajInLFxuXHQnYWlmJyxcblx0J3FjcCcsXG5cdCdvZHQnLFxuXHQnb2RzJyxcblx0J29kcCcsXG5cdCd4bWwnLFxuXHQnbW9iaScsXG5cdCdoZWljJyxcblx0J2N1cicsXG5cdCdrdHgnLFxuXHQnYXBlJyxcblx0J3d2Jyxcblx0J2RjbScsXG5cdCdpY3MnLFxuXHQnZ2xiJyxcblx0J3BjYXAnLFxuXHQnZHNmJyxcblx0J2xuaycsXG5cdCdhbGlhcycsXG5cdCd2b2MnLFxuXHQnYWMzJyxcblx0J200dicsXG5cdCdtNHAnLFxuXHQnbTRiJyxcblx0J2Y0dicsXG5cdCdmNHAnLFxuXHQnZjRiJyxcblx0J2Y0YScsXG5cdCdtaWUnLFxuXHQnYXNmJyxcblx0J29nbScsXG5cdCdvZ3gnLFxuXHQnbXBjJyxcblx0J2Fycm93Jyxcblx0J3NocCcsXG5cdCdhYWMnLFxuXHQnbXAxJyxcblx0J2l0Jyxcblx0J3MzbScsXG5cdCd4bScsXG5cdCdhaScsXG5cdCdza3AnLFxuXHQnYXZpZicsXG5cdCdlcHMnLFxuXHQnbHpoJyxcblx0J3BncCcsXG5cdCdhc2FyJyxcblx0J3N0bCcsXG5cdCdjaG0nLFxuXHQnM21mJyxcblx0J3pzdCcsXG5cdCdqeGwnLFxuXHQndmNmJyxcblx0J2pscycsXG5cdCdwc3QnLFxuXHQnZHdnJyxcblx0J3BhcnF1ZXQnLFxuXHQnY2xhc3MnLFxuXHQnYXJqJyxcblx0J2NwaW8nLFxuXHQnYWNlJyxcblx0J2F2cm8nLFxuXTtcblxuZXhwb3J0IGNvbnN0IG1pbWVUeXBlcyA9IFtcblx0J2ltYWdlL2pwZWcnLFxuXHQnaW1hZ2UvcG5nJyxcblx0J2ltYWdlL2dpZicsXG5cdCdpbWFnZS93ZWJwJyxcblx0J2ltYWdlL2ZsaWYnLFxuXHQnaW1hZ2UveC14Y2YnLFxuXHQnaW1hZ2UveC1jYW5vbi1jcjInLFxuXHQnaW1hZ2UveC1jYW5vbi1jcjMnLFxuXHQnaW1hZ2UvdGlmZicsXG5cdCdpbWFnZS9ibXAnLFxuXHQnaW1hZ2Uvdm5kLm1zLXBob3RvJyxcblx0J2ltYWdlL3ZuZC5hZG9iZS5waG90b3Nob3AnLFxuXHQnYXBwbGljYXRpb24veC1pbmRlc2lnbicsXG5cdCdhcHBsaWNhdGlvbi9lcHViK3ppcCcsXG5cdCdhcHBsaWNhdGlvbi94LXhwaW5zdGFsbCcsXG5cdCdhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQnLFxuXHQnYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldCcsXG5cdCdhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnByZXNlbnRhdGlvbicsXG5cdCdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCcsXG5cdCdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwucHJlc2VudGF0aW9uJyxcblx0J2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0Jyxcblx0J2FwcGxpY2F0aW9uL3ppcCcsXG5cdCdhcHBsaWNhdGlvbi94LXRhcicsXG5cdCdhcHBsaWNhdGlvbi94LXJhci1jb21wcmVzc2VkJyxcblx0J2FwcGxpY2F0aW9uL2d6aXAnLFxuXHQnYXBwbGljYXRpb24veC1iemlwMicsXG5cdCdhcHBsaWNhdGlvbi94LTd6LWNvbXByZXNzZWQnLFxuXHQnYXBwbGljYXRpb24veC1hcHBsZS1kaXNraW1hZ2UnLFxuXHQnYXBwbGljYXRpb24veC1hcGFjaGUtYXJyb3cnLFxuXHQndmlkZW8vbXA0Jyxcblx0J2F1ZGlvL21pZGknLFxuXHQndmlkZW8veC1tYXRyb3NrYScsXG5cdCd2aWRlby93ZWJtJyxcblx0J3ZpZGVvL3F1aWNrdGltZScsXG5cdCd2aWRlby92bmQuYXZpJyxcblx0J2F1ZGlvL3ZuZC53YXZlJyxcblx0J2F1ZGlvL3FjZWxwJyxcblx0J2F1ZGlvL3gtbXMtYXNmJyxcblx0J3ZpZGVvL3gtbXMtYXNmJyxcblx0J2FwcGxpY2F0aW9uL3ZuZC5tcy1hc2YnLFxuXHQndmlkZW8vbXBlZycsXG5cdCd2aWRlby8zZ3BwJyxcblx0J2F1ZGlvL21wZWcnLFxuXHQnYXVkaW8vbXA0JywgLy8gUkZDIDQzMzdcblx0J2F1ZGlvL29wdXMnLFxuXHQndmlkZW8vb2dnJyxcblx0J2F1ZGlvL29nZycsXG5cdCdhcHBsaWNhdGlvbi9vZ2cnLFxuXHQnYXVkaW8veC1mbGFjJyxcblx0J2F1ZGlvL2FwZScsXG5cdCdhdWRpby93YXZwYWNrJyxcblx0J2F1ZGlvL2FtcicsXG5cdCdhcHBsaWNhdGlvbi9wZGYnLFxuXHQnYXBwbGljYXRpb24veC1lbGYnLFxuXHQnYXBwbGljYXRpb24veC1tc2Rvd25sb2FkJyxcblx0J2FwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoJyxcblx0J2FwcGxpY2F0aW9uL3J0ZicsXG5cdCdhcHBsaWNhdGlvbi93YXNtJyxcblx0J2ZvbnQvd29mZicsXG5cdCdmb250L3dvZmYyJyxcblx0J2FwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0Jyxcblx0J2ZvbnQvdHRmJyxcblx0J2ZvbnQvb3RmJyxcblx0J2ltYWdlL3gtaWNvbicsXG5cdCd2aWRlby94LWZsdicsXG5cdCdhcHBsaWNhdGlvbi9wb3N0c2NyaXB0Jyxcblx0J2FwcGxpY2F0aW9uL2VwcycsXG5cdCdhcHBsaWNhdGlvbi94LXh6Jyxcblx0J2FwcGxpY2F0aW9uL3gtc3FsaXRlMycsXG5cdCdhcHBsaWNhdGlvbi94LW5pbnRlbmRvLW5lcy1yb20nLFxuXHQnYXBwbGljYXRpb24veC1nb29nbGUtY2hyb21lLWV4dGVuc2lvbicsXG5cdCdhcHBsaWNhdGlvbi92bmQubXMtY2FiLWNvbXByZXNzZWQnLFxuXHQnYXBwbGljYXRpb24veC1kZWInLFxuXHQnYXBwbGljYXRpb24veC11bml4LWFyY2hpdmUnLFxuXHQnYXBwbGljYXRpb24veC1ycG0nLFxuXHQnYXBwbGljYXRpb24veC1jb21wcmVzcycsXG5cdCdhcHBsaWNhdGlvbi94LWx6aXAnLFxuXHQnYXBwbGljYXRpb24veC1jZmInLFxuXHQnYXBwbGljYXRpb24veC1taWUnLFxuXHQnYXBwbGljYXRpb24vbXhmJyxcblx0J3ZpZGVvL21wMnQnLFxuXHQnYXBwbGljYXRpb24veC1ibGVuZGVyJyxcblx0J2ltYWdlL2JwZycsXG5cdCdpbWFnZS9qMmMnLFxuXHQnaW1hZ2UvanAyJyxcblx0J2ltYWdlL2pweCcsXG5cdCdpbWFnZS9qcG0nLFxuXHQnaW1hZ2UvbWoyJyxcblx0J2F1ZGlvL2FpZmYnLFxuXHQnYXBwbGljYXRpb24veG1sJyxcblx0J2FwcGxpY2F0aW9uL3gtbW9iaXBvY2tldC1lYm9vaycsXG5cdCdpbWFnZS9oZWlmJyxcblx0J2ltYWdlL2hlaWYtc2VxdWVuY2UnLFxuXHQnaW1hZ2UvaGVpYycsXG5cdCdpbWFnZS9oZWljLXNlcXVlbmNlJyxcblx0J2ltYWdlL2ljbnMnLFxuXHQnaW1hZ2Uva3R4Jyxcblx0J2FwcGxpY2F0aW9uL2RpY29tJyxcblx0J2F1ZGlvL3gtbXVzZXBhY2snLFxuXHQndGV4dC9jYWxlbmRhcicsXG5cdCd0ZXh0L3ZjYXJkJyxcblx0J21vZGVsL2dsdGYtYmluYXJ5Jyxcblx0J2FwcGxpY2F0aW9uL3ZuZC50Y3BkdW1wLnBjYXAnLFxuXHQnYXVkaW8veC1kc2YnLCAvLyBOb24tc3RhbmRhcmRcblx0J2FwcGxpY2F0aW9uL3gubXMuc2hvcnRjdXQnLCAvLyBJbnZlbnRlZCBieSB1c1xuXHQnYXBwbGljYXRpb24veC5hcHBsZS5hbGlhcycsIC8vIEludmVudGVkIGJ5IHVzXG5cdCdhdWRpby94LXZvYycsXG5cdCdhdWRpby92bmQuZG9sYnkuZGQtcmF3Jyxcblx0J2F1ZGlvL3gtbTRhJyxcblx0J2ltYWdlL2FwbmcnLFxuXHQnaW1hZ2UveC1vbHltcHVzLW9yZicsXG5cdCdpbWFnZS94LXNvbnktYXJ3Jyxcblx0J2ltYWdlL3gtYWRvYmUtZG5nJyxcblx0J2ltYWdlL3gtbmlrb24tbmVmJyxcblx0J2ltYWdlL3gtcGFuYXNvbmljLXJ3MicsXG5cdCdpbWFnZS94LWZ1amlmaWxtLXJhZicsXG5cdCd2aWRlby94LW00dicsXG5cdCd2aWRlby8zZ3BwMicsXG5cdCdhcHBsaWNhdGlvbi94LWVzcmktc2hhcGUnLFxuXHQnYXVkaW8vYWFjJyxcblx0J2F1ZGlvL3gtaXQnLFxuXHQnYXVkaW8veC1zM20nLFxuXHQnYXVkaW8veC14bScsXG5cdCd2aWRlby9NUDFTJyxcblx0J3ZpZGVvL01QMlAnLFxuXHQnYXBwbGljYXRpb24vdm5kLnNrZXRjaHVwLnNrcCcsXG5cdCdpbWFnZS9hdmlmJyxcblx0J2FwcGxpY2F0aW9uL3gtbHpoLWNvbXByZXNzZWQnLFxuXHQnYXBwbGljYXRpb24vcGdwLWVuY3J5cHRlZCcsXG5cdCdhcHBsaWNhdGlvbi94LWFzYXInLFxuXHQnbW9kZWwvc3RsJyxcblx0J2FwcGxpY2F0aW9uL3ZuZC5tcy1odG1saGVscCcsXG5cdCdtb2RlbC8zbWYnLFxuXHQnaW1hZ2UvanhsJyxcblx0J2FwcGxpY2F0aW9uL3pzdGQnLFxuXHQnaW1hZ2UvamxzJyxcblx0J2FwcGxpY2F0aW9uL3ZuZC5tcy1vdXRsb29rJyxcblx0J2ltYWdlL3ZuZC5kd2cnLFxuXHQnYXBwbGljYXRpb24veC1wYXJxdWV0Jyxcblx0J2FwcGxpY2F0aW9uL2phdmEtdm0nLFxuXHQnYXBwbGljYXRpb24veC1hcmonLFxuXHQnYXBwbGljYXRpb24veC1jcGlvJyxcblx0J2FwcGxpY2F0aW9uL3gtYWNlLWNvbXByZXNzZWQnLFxuXHQnYXBwbGljYXRpb24vYXZybycsXG5dO1xuIiwiaW1wb3J0IHtCdWZmZXJ9IGZyb20gJ25vZGU6YnVmZmVyJztcbmltcG9ydCAqIGFzIFRva2VuIGZyb20gJ3Rva2VuLXR5cGVzJztcbmltcG9ydCAqIGFzIHN0cnRvazMgZnJvbSAnc3RydG9rMy9jb3JlJzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuL2ZpbGUtZXh0ZW5zaW9uLWluLWltcG9ydFxuaW1wb3J0IHtcblx0c3RyaW5nVG9CeXRlcyxcblx0dGFySGVhZGVyQ2hlY2tzdW1NYXRjaGVzLFxuXHR1aW50MzJTeW5jU2FmZVRva2VuLFxufSBmcm9tICcuL3V0aWwuanMnO1xuaW1wb3J0IHtleHRlbnNpb25zLCBtaW1lVHlwZXN9IGZyb20gJy4vc3VwcG9ydGVkLmpzJztcblxuY29uc3QgbWluaW11bUJ5dGVzID0gNDEwMDsgLy8gQSBmYWlyIGFtb3VudCBvZiBmaWxlLXR5cGVzIGFyZSBkZXRlY3RhYmxlIHdpdGhpbiB0aGlzIHJhbmdlLlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmlsZVR5cGVGcm9tU3RyZWFtKHN0cmVhbSkge1xuXHRjb25zdCB0b2tlbml6ZXIgPSBhd2FpdCBzdHJ0b2szLmZyb21TdHJlYW0oc3RyZWFtKTtcblx0dHJ5IHtcblx0XHRyZXR1cm4gYXdhaXQgZmlsZVR5cGVGcm9tVG9rZW5pemVyKHRva2VuaXplcik7XG5cdH0gZmluYWxseSB7XG5cdFx0YXdhaXQgdG9rZW5pemVyLmNsb3NlKCk7XG5cdH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbGVUeXBlRnJvbUJ1ZmZlcihpbnB1dCkge1xuXHRpZiAoIShpbnB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgfHwgaW5wdXQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCB0aGUgXFxgaW5wdXRcXGAgYXJndW1lbnQgdG8gYmUgb2YgdHlwZSBcXGBVaW50OEFycmF5XFxgIG9yIFxcYEJ1ZmZlclxcYCBvciBcXGBBcnJheUJ1ZmZlclxcYCwgZ290IFxcYCR7dHlwZW9mIGlucHV0fVxcYGApO1xuXHR9XG5cblx0Y29uc3QgYnVmZmVyID0gaW5wdXQgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gaW5wdXQgOiBuZXcgVWludDhBcnJheShpbnB1dCk7XG5cblx0aWYgKCEoYnVmZmVyPy5sZW5ndGggPiAxKSkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdHJldHVybiBmaWxlVHlwZUZyb21Ub2tlbml6ZXIoc3RydG9rMy5mcm9tQnVmZmVyKGJ1ZmZlcikpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmlsZVR5cGVGcm9tQmxvYihibG9iKSB7XG5cdGNvbnN0IGJ1ZmZlciA9IGF3YWl0IGJsb2IuYXJyYXlCdWZmZXIoKTtcblx0cmV0dXJuIGZpbGVUeXBlRnJvbUJ1ZmZlcihuZXcgVWludDhBcnJheShidWZmZXIpKTtcbn1cblxuZnVuY3Rpb24gX2NoZWNrKGJ1ZmZlciwgaGVhZGVycywgb3B0aW9ucykge1xuXHRvcHRpb25zID0ge1xuXHRcdG9mZnNldDogMCxcblx0XHQuLi5vcHRpb25zLFxuXHR9O1xuXG5cdGZvciAoY29uc3QgW2luZGV4LCBoZWFkZXJdIG9mIGhlYWRlcnMuZW50cmllcygpKSB7XG5cdFx0Ly8gSWYgYSBiaXRtYXNrIGlzIHNldFxuXHRcdGlmIChvcHRpb25zLm1hc2spIHtcblx0XHRcdC8vIElmIGhlYWRlciBkb2Vzbid0IGVxdWFsIGBidWZgIHdpdGggYml0cyBtYXNrZWQgb2ZmXG5cdFx0XHRpZiAoaGVhZGVyICE9PSAob3B0aW9ucy5tYXNrW2luZGV4XSAmIGJ1ZmZlcltpbmRleCArIG9wdGlvbnMub2Zmc2V0XSkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoaGVhZGVyICE9PSBidWZmZXJbaW5kZXggKyBvcHRpb25zLm9mZnNldF0pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbGVUeXBlRnJvbVRva2VuaXplcih0b2tlbml6ZXIpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gbmV3IEZpbGVUeXBlUGFyc2VyKCkucGFyc2UodG9rZW5pemVyKTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRpZiAoIShlcnJvciBpbnN0YW5jZW9mIHN0cnRvazMuRW5kT2ZTdHJlYW1FcnJvcikpIHtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxufVxuXG5jbGFzcyBGaWxlVHlwZVBhcnNlciB7XG5cdGNoZWNrKGhlYWRlciwgb3B0aW9ucykge1xuXHRcdHJldHVybiBfY2hlY2sodGhpcy5idWZmZXIsIGhlYWRlciwgb3B0aW9ucyk7XG5cdH1cblxuXHRjaGVja1N0cmluZyhoZWFkZXIsIG9wdGlvbnMpIHtcblx0XHRyZXR1cm4gdGhpcy5jaGVjayhzdHJpbmdUb0J5dGVzKGhlYWRlciksIG9wdGlvbnMpO1xuXHR9XG5cblx0YXN5bmMgcGFyc2UodG9rZW5pemVyKSB7XG5cdFx0dGhpcy5idWZmZXIgPSBCdWZmZXIuYWxsb2MobWluaW11bUJ5dGVzKTtcblxuXHRcdC8vIEtlZXAgcmVhZGluZyB1bnRpbCBFT0YgaWYgdGhlIGZpbGUgc2l6ZSBpcyB1bmtub3duLlxuXHRcdGlmICh0b2tlbml6ZXIuZmlsZUluZm8uc2l6ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0b2tlbml6ZXIuZmlsZUluZm8uc2l6ZSA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuXHRcdH1cblxuXHRcdHRoaXMudG9rZW5pemVyID0gdG9rZW5pemVyO1xuXG5cdFx0YXdhaXQgdG9rZW5pemVyLnBlZWtCdWZmZXIodGhpcy5idWZmZXIsIHtsZW5ndGg6IDEyLCBtYXlCZUxlc3M6IHRydWV9KTtcblxuXHRcdC8vIC0tIDItYnl0ZSBzaWduYXR1cmVzIC0tXG5cblx0XHRpZiAodGhpcy5jaGVjayhbMHg0MiwgMHg0RF0pKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICdibXAnLFxuXHRcdFx0XHRtaW1lOiAnaW1hZ2UvYm1wJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2soWzB4MEIsIDB4NzddKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAnYWMzJyxcblx0XHRcdFx0bWltZTogJ2F1ZGlvL3ZuZC5kb2xieS5kZC1yYXcnLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5jaGVjayhbMHg3OCwgMHgwMV0pKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICdkbWcnLFxuXHRcdFx0XHRtaW1lOiAnYXBwbGljYXRpb24veC1hcHBsZS1kaXNraW1hZ2UnLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5jaGVjayhbMHg0RCwgMHg1QV0pKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICdleGUnLFxuXHRcdFx0XHRtaW1lOiAnYXBwbGljYXRpb24veC1tc2Rvd25sb2FkJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2soWzB4MjUsIDB4MjFdKSkge1xuXHRcdFx0YXdhaXQgdG9rZW5pemVyLnBlZWtCdWZmZXIodGhpcy5idWZmZXIsIHtsZW5ndGg6IDI0LCBtYXlCZUxlc3M6IHRydWV9KTtcblxuXHRcdFx0aWYgKFxuXHRcdFx0XHR0aGlzLmNoZWNrU3RyaW5nKCdQUy1BZG9iZS0nLCB7b2Zmc2V0OiAyfSlcblx0XHRcdFx0JiYgdGhpcy5jaGVja1N0cmluZygnIEVQU0YtJywge29mZnNldDogMTR9KVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0ZXh0OiAnZXBzJyxcblx0XHRcdFx0XHRtaW1lOiAnYXBwbGljYXRpb24vZXBzJyxcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAncHMnLFxuXHRcdFx0XHRtaW1lOiAnYXBwbGljYXRpb24vcG9zdHNjcmlwdCcsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdHRoaXMuY2hlY2soWzB4MUYsIDB4QTBdKVxuXHRcdFx0fHwgdGhpcy5jaGVjayhbMHgxRiwgMHg5RF0pXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICdaJyxcblx0XHRcdFx0bWltZTogJ2FwcGxpY2F0aW9uL3gtY29tcHJlc3MnLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5jaGVjayhbMHhDNywgMHg3MV0pKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICdjcGlvJyxcblx0XHRcdFx0bWltZTogJ2FwcGxpY2F0aW9uL3gtY3BpbycsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmNoZWNrKFsweDYwLCAweEVBXSkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGV4dDogJ2FyaicsXG5cdFx0XHRcdG1pbWU6ICdhcHBsaWNhdGlvbi94LWFyaicsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIC0tIDMtYnl0ZSBzaWduYXR1cmVzIC0tXG5cblx0XHRpZiAodGhpcy5jaGVjayhbMHhFRiwgMHhCQiwgMHhCRl0pKSB7IC8vIFVURi04LUJPTVxuXHRcdFx0Ly8gU3RyaXAgb2ZmIFVURi04LUJPTVxuXHRcdFx0dGhpcy50b2tlbml6ZXIuaWdub3JlKDMpO1xuXHRcdFx0cmV0dXJuIHRoaXMucGFyc2UodG9rZW5pemVyKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5jaGVjayhbMHg0NywgMHg0OSwgMHg0Nl0pKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICdnaWYnLFxuXHRcdFx0XHRtaW1lOiAnaW1hZ2UvZ2lmJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2soWzB4NDksIDB4NDksIDB4QkNdKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAnanhyJyxcblx0XHRcdFx0bWltZTogJ2ltYWdlL3ZuZC5tcy1waG90bycsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmNoZWNrKFsweDFGLCAweDhCLCAweDhdKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAnZ3onLFxuXHRcdFx0XHRtaW1lOiAnYXBwbGljYXRpb24vZ3ppcCcsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmNoZWNrKFsweDQyLCAweDVBLCAweDY4XSkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGV4dDogJ2J6MicsXG5cdFx0XHRcdG1pbWU6ICdhcHBsaWNhdGlvbi94LWJ6aXAyJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2tTdHJpbmcoJ0lEMycpKSB7XG5cdFx0XHRhd2FpdCB0b2tlbml6ZXIuaWdub3JlKDYpOyAvLyBTa2lwIElEMyBoZWFkZXIgdW50aWwgdGhlIGhlYWRlciBzaXplXG5cdFx0XHRjb25zdCBpZDNIZWFkZXJMZW5ndGggPSBhd2FpdCB0b2tlbml6ZXIucmVhZFRva2VuKHVpbnQzMlN5bmNTYWZlVG9rZW4pO1xuXHRcdFx0aWYgKHRva2VuaXplci5wb3NpdGlvbiArIGlkM0hlYWRlckxlbmd0aCA+IHRva2VuaXplci5maWxlSW5mby5zaXplKSB7XG5cdFx0XHRcdC8vIEd1ZXNzIGZpbGUgdHlwZSBiYXNlZCBvbiBJRDMgaGVhZGVyIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0ZXh0OiAnbXAzJyxcblx0XHRcdFx0XHRtaW1lOiAnYXVkaW8vbXBlZycsXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IHRva2VuaXplci5pZ25vcmUoaWQzSGVhZGVyTGVuZ3RoKTtcblx0XHRcdHJldHVybiBmaWxlVHlwZUZyb21Ub2tlbml6ZXIodG9rZW5pemVyKTsgLy8gU2tpcCBJRDMgaGVhZGVyLCByZWN1cnNpb25cblx0XHR9XG5cblx0XHQvLyBNdXNlcGFjaywgU1Y3XG5cdFx0aWYgKHRoaXMuY2hlY2tTdHJpbmcoJ01QKycpKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICdtcGMnLFxuXHRcdFx0XHRtaW1lOiAnYXVkaW8veC1tdXNlcGFjaycsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdCh0aGlzLmJ1ZmZlclswXSA9PT0gMHg0MyB8fCB0aGlzLmJ1ZmZlclswXSA9PT0gMHg0Nilcblx0XHRcdCYmIHRoaXMuY2hlY2soWzB4NTcsIDB4NTNdLCB7b2Zmc2V0OiAxfSlcblx0XHQpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGV4dDogJ3N3ZicsXG5cdFx0XHRcdG1pbWU6ICdhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCcsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIC0tIDQtYnl0ZSBzaWduYXR1cmVzIC0tXG5cblx0XHQvLyBSZXF1aXJlcyBhIHNhbXBsZSBzaXplIG9mIDQgYnl0ZXNcblx0XHRpZiAodGhpcy5jaGVjayhbMHhGRiwgMHhEOCwgMHhGRl0pKSB7XG5cdFx0XHRpZiAodGhpcy5jaGVjayhbMHhGN10sIHtvZmZzZXQ6IDN9KSkgeyAvLyBKUEc3L1NPRjU1LCBpbmRpY2F0aW5nIGEgSVNPL0lFQyAxNDQ5NSAvIEpQRUctTFMgZmlsZVxuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdGV4dDogJ2pscycsXG5cdFx0XHRcdFx0bWltZTogJ2ltYWdlL2pscycsXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGV4dDogJ2pwZycsXG5cdFx0XHRcdG1pbWU6ICdpbWFnZS9qcGVnJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2soWzB4NEYsIDB4NjIsIDB4NkEsIDB4MDFdKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAnYXZybycsXG5cdFx0XHRcdG1pbWU6ICdhcHBsaWNhdGlvbi9hdnJvJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2tTdHJpbmcoJ0ZMSUYnKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAnZmxpZicsXG5cdFx0XHRcdG1pbWU6ICdpbWFnZS9mbGlmJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2tTdHJpbmcoJzhCUFMnKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAncHNkJyxcblx0XHRcdFx0bWltZTogJ2ltYWdlL3ZuZC5hZG9iZS5waG90b3Nob3AnLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5jaGVja1N0cmluZygnV0VCUCcsIHtvZmZzZXQ6IDh9KSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAnd2VicCcsXG5cdFx0XHRcdG1pbWU6ICdpbWFnZS93ZWJwJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Ly8gTXVzZXBhY2ssIFNWOFxuXHRcdGlmICh0aGlzLmNoZWNrU3RyaW5nKCdNUENLJykpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGV4dDogJ21wYycsXG5cdFx0XHRcdG1pbWU6ICdhdWRpby94LW11c2VwYWNrJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2tTdHJpbmcoJ0ZPUk0nKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAnYWlmJyxcblx0XHRcdFx0bWltZTogJ2F1ZGlvL2FpZmYnLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5jaGVja1N0cmluZygnaWNucycsIHtvZmZzZXQ6IDB9KSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAnaWNucycsXG5cdFx0XHRcdG1pbWU6ICdpbWFnZS9pY25zJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Ly8gWmlwLWJhc2VkIGZpbGUgZm9ybWF0c1xuXHRcdC8vIE5lZWQgdG8gYmUgYmVmb3JlIHRoZSBgemlwYCBjaGVja1xuXHRcdGlmICh0aGlzLmNoZWNrKFsweDUwLCAweDRCLCAweDMsIDB4NF0pKSB7IC8vIExvY2FsIGZpbGUgaGVhZGVyIHNpZ25hdHVyZVxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0d2hpbGUgKHRva2VuaXplci5wb3NpdGlvbiArIDMwIDwgdG9rZW5pemVyLmZpbGVJbmZvLnNpemUpIHtcblx0XHRcdFx0XHRhd2FpdCB0b2tlbml6ZXIucmVhZEJ1ZmZlcih0aGlzLmJ1ZmZlciwge2xlbmd0aDogMzB9KTtcblxuXHRcdFx0XHRcdC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ppcF8oZmlsZV9mb3JtYXQpI0ZpbGVfaGVhZGVyc1xuXHRcdFx0XHRcdGNvbnN0IHppcEhlYWRlciA9IHtcblx0XHRcdFx0XHRcdGNvbXByZXNzZWRTaXplOiB0aGlzLmJ1ZmZlci5yZWFkVUludDMyTEUoMTgpLFxuXHRcdFx0XHRcdFx0dW5jb21wcmVzc2VkU2l6ZTogdGhpcy5idWZmZXIucmVhZFVJbnQzMkxFKDIyKSxcblx0XHRcdFx0XHRcdGZpbGVuYW1lTGVuZ3RoOiB0aGlzLmJ1ZmZlci5yZWFkVUludDE2TEUoMjYpLFxuXHRcdFx0XHRcdFx0ZXh0cmFGaWVsZExlbmd0aDogdGhpcy5idWZmZXIucmVhZFVJbnQxNkxFKDI4KSxcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0emlwSGVhZGVyLmZpbGVuYW1lID0gYXdhaXQgdG9rZW5pemVyLnJlYWRUb2tlbihuZXcgVG9rZW4uU3RyaW5nVHlwZSh6aXBIZWFkZXIuZmlsZW5hbWVMZW5ndGgsICd1dGYtOCcpKTtcblx0XHRcdFx0XHRhd2FpdCB0b2tlbml6ZXIuaWdub3JlKHppcEhlYWRlci5leHRyYUZpZWxkTGVuZ3RoKTtcblxuXHRcdFx0XHRcdC8vIEFzc3VtZXMgc2lnbmVkIGAueHBpYCBmcm9tIGFkZG9ucy5tb3ppbGxhLm9yZ1xuXHRcdFx0XHRcdGlmICh6aXBIZWFkZXIuZmlsZW5hbWUgPT09ICdNRVRBLUlORi9tb3ppbGxhLnJzYScpIHtcblx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdGV4dDogJ3hwaScsXG5cdFx0XHRcdFx0XHRcdG1pbWU6ICdhcHBsaWNhdGlvbi94LXhwaW5zdGFsbCcsXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICh6aXBIZWFkZXIuZmlsZW5hbWUuZW5kc1dpdGgoJy5yZWxzJykgfHwgemlwSGVhZGVyLmZpbGVuYW1lLmVuZHNXaXRoKCcueG1sJykpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHR5cGUgPSB6aXBIZWFkZXIuZmlsZW5hbWUuc3BsaXQoJy8nKVswXTtcblx0XHRcdFx0XHRcdHN3aXRjaCAodHlwZSkge1xuXHRcdFx0XHRcdFx0XHRjYXNlICdfcmVscyc6XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgJ3dvcmQnOlxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRleHQ6ICdkb2N4Jyxcblx0XHRcdFx0XHRcdFx0XHRcdG1pbWU6ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCcsXG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0Y2FzZSAncHB0Jzpcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZXh0OiAncHB0eCcsXG5cdFx0XHRcdFx0XHRcdFx0XHRtaW1lOiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnByZXNlbnRhdGlvbicsXG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0Y2FzZSAneGwnOlxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRleHQ6ICd4bHN4Jyxcblx0XHRcdFx0XHRcdFx0XHRcdG1pbWU6ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCcsXG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoemlwSGVhZGVyLmZpbGVuYW1lLnN0YXJ0c1dpdGgoJ3hsLycpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRleHQ6ICd4bHN4Jyxcblx0XHRcdFx0XHRcdFx0bWltZTogJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0Jyxcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKHppcEhlYWRlci5maWxlbmFtZS5zdGFydHNXaXRoKCczRC8nKSAmJiB6aXBIZWFkZXIuZmlsZW5hbWUuZW5kc1dpdGgoJy5tb2RlbCcpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRleHQ6ICczbWYnLFxuXHRcdFx0XHRcdFx0XHRtaW1lOiAnbW9kZWwvM21mJyxcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gVGhlIGRvY3gsIHhsc3ggYW5kIHBwdHggZmlsZSB0eXBlcyBleHRlbmQgdGhlIE9mZmljZSBPcGVuIFhNTCBmaWxlIGZvcm1hdDpcblx0XHRcdFx0XHQvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9PZmZpY2VfT3Blbl9YTUxfZmlsZV9mb3JtYXRzXG5cdFx0XHRcdFx0Ly8gV2UgbG9vayBmb3I6XG5cdFx0XHRcdFx0Ly8gLSBvbmUgZW50cnkgbmFtZWQgJ1tDb250ZW50X1R5cGVzXS54bWwnIG9yICdfcmVscy8ucmVscycsXG5cdFx0XHRcdFx0Ly8gLSBvbmUgZW50cnkgaW5kaWNhdGluZyBzcGVjaWZpYyB0eXBlIG9mIGZpbGUuXG5cdFx0XHRcdFx0Ly8gTVMgT2ZmaWNlLCBPcGVuT2ZmaWNlIGFuZCBMaWJyZU9mZmljZSBtYXkgcHV0IHRoZSBwYXJ0cyBpbiBkaWZmZXJlbnQgb3JkZXIsIHNvIHRoZSBjaGVjayBzaG91bGQgbm90IHJlbHkgb24gaXQuXG5cdFx0XHRcdFx0aWYgKHppcEhlYWRlci5maWxlbmFtZSA9PT0gJ21pbWV0eXBlJyAmJiB6aXBIZWFkZXIuY29tcHJlc3NlZFNpemUgPT09IHppcEhlYWRlci51bmNvbXByZXNzZWRTaXplKSB7XG5cdFx0XHRcdFx0XHRsZXQgbWltZVR5cGUgPSBhd2FpdCB0b2tlbml6ZXIucmVhZFRva2VuKG5ldyBUb2tlbi5TdHJpbmdUeXBlKHppcEhlYWRlci5jb21wcmVzc2VkU2l6ZSwgJ3V0Zi04JykpO1xuXHRcdFx0XHRcdFx0bWltZVR5cGUgPSBtaW1lVHlwZS50cmltKCk7XG5cblx0XHRcdFx0XHRcdHN3aXRjaCAobWltZVR5cGUpIHtcblx0XHRcdFx0XHRcdFx0Y2FzZSAnYXBwbGljYXRpb24vZXB1Yit6aXAnOlxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRleHQ6ICdlcHViJyxcblx0XHRcdFx0XHRcdFx0XHRcdG1pbWU6ICdhcHBsaWNhdGlvbi9lcHViK3ppcCcsXG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0Y2FzZSAnYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0Jzpcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZXh0OiAnb2R0Jyxcblx0XHRcdFx0XHRcdFx0XHRcdG1pbWU6ICdhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQnLFxuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdGNhc2UgJ2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuc3ByZWFkc2hlZXQnOlxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRleHQ6ICdvZHMnLFxuXHRcdFx0XHRcdFx0XHRcdFx0bWltZTogJ2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuc3ByZWFkc2hlZXQnLFxuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdGNhc2UgJ2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQucHJlc2VudGF0aW9uJzpcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZXh0OiAnb2RwJyxcblx0XHRcdFx0XHRcdFx0XHRcdG1pbWU6ICdhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnByZXNlbnRhdGlvbicsXG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBUcnkgdG8gZmluZCBuZXh0IGhlYWRlciBtYW51YWxseSB3aGVuIGN1cnJlbnQgb25lIGlzIGNvcnJ1cHRlZFxuXHRcdFx0XHRcdGlmICh6aXBIZWFkZXIuY29tcHJlc3NlZFNpemUgPT09IDApIHtcblx0XHRcdFx0XHRcdGxldCBuZXh0SGVhZGVySW5kZXggPSAtMTtcblxuXHRcdFx0XHRcdFx0d2hpbGUgKG5leHRIZWFkZXJJbmRleCA8IDAgJiYgKHRva2VuaXplci5wb3NpdGlvbiA8IHRva2VuaXplci5maWxlSW5mby5zaXplKSkge1xuXHRcdFx0XHRcdFx0XHRhd2FpdCB0b2tlbml6ZXIucGVla0J1ZmZlcih0aGlzLmJ1ZmZlciwge21heUJlTGVzczogdHJ1ZX0pO1xuXG5cdFx0XHRcdFx0XHRcdG5leHRIZWFkZXJJbmRleCA9IHRoaXMuYnVmZmVyLmluZGV4T2YoJzUwNEIwMzA0JywgMCwgJ2hleCcpO1xuXHRcdFx0XHRcdFx0XHQvLyBNb3ZlIHBvc2l0aW9uIHRvIHRoZSBuZXh0IGhlYWRlciBpZiBmb3VuZCwgc2tpcCB0aGUgd2hvbGUgYnVmZmVyIG90aGVyd2lzZVxuXHRcdFx0XHRcdFx0XHRhd2FpdCB0b2tlbml6ZXIuaWdub3JlKG5leHRIZWFkZXJJbmRleCA+PSAwID8gbmV4dEhlYWRlckluZGV4IDogdGhpcy5idWZmZXIubGVuZ3RoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0YXdhaXQgdG9rZW5pemVyLmlnbm9yZSh6aXBIZWFkZXIuY29tcHJlc3NlZFNpemUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0aWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBzdHJ0b2szLkVuZE9mU3RyZWFtRXJyb3IpKSB7XG5cdFx0XHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAnemlwJyxcblx0XHRcdFx0bWltZTogJ2FwcGxpY2F0aW9uL3ppcCcsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmNoZWNrU3RyaW5nKCdPZ2dTJykpIHtcblx0XHRcdC8vIFRoaXMgaXMgYW4gT0dHIGNvbnRhaW5lclxuXHRcdFx0YXdhaXQgdG9rZW5pemVyLmlnbm9yZSgyOCk7XG5cdFx0XHRjb25zdCB0eXBlID0gQnVmZmVyLmFsbG9jKDgpO1xuXHRcdFx0YXdhaXQgdG9rZW5pemVyLnJlYWRCdWZmZXIodHlwZSk7XG5cblx0XHRcdC8vIE5lZWRzIHRvIGJlIGJlZm9yZSBgb2dnYCBjaGVja1xuXHRcdFx0aWYgKF9jaGVjayh0eXBlLCBbMHg0RiwgMHg3MCwgMHg3NSwgMHg3MywgMHg0OCwgMHg2NSwgMHg2MSwgMHg2NF0pKSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0ZXh0OiAnb3B1cycsXG5cdFx0XHRcdFx0bWltZTogJ2F1ZGlvL29wdXMnLFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiAnIHRoZW9yYScgaW4gaGVhZGVyLlxuXHRcdFx0aWYgKF9jaGVjayh0eXBlLCBbMHg4MCwgMHg3NCwgMHg2OCwgMHg2NSwgMHg2RiwgMHg3MiwgMHg2MV0pKSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0ZXh0OiAnb2d2Jyxcblx0XHRcdFx0XHRtaW1lOiAndmlkZW8vb2dnJyxcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgJ1xceDAxdmlkZW8nIGluIGhlYWRlci5cblx0XHRcdGlmIChfY2hlY2sodHlwZSwgWzB4MDEsIDB4NzYsIDB4NjksIDB4NjQsIDB4NjUsIDB4NkYsIDB4MDBdKSkge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdGV4dDogJ29nbScsXG5cdFx0XHRcdFx0bWltZTogJ3ZpZGVvL29nZycsXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmICcgRkxBQycgaW4gaGVhZGVyICBodHRwczovL3hpcGgub3JnL2ZsYWMvZmFxLmh0bWxcblx0XHRcdGlmIChfY2hlY2sodHlwZSwgWzB4N0YsIDB4NDYsIDB4NEMsIDB4NDEsIDB4NDNdKSkge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdGV4dDogJ29nYScsXG5cdFx0XHRcdFx0bWltZTogJ2F1ZGlvL29nZycsXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdC8vICdTcGVleCAgJyBpbiBoZWFkZXIgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3BlZXhcblx0XHRcdGlmIChfY2hlY2sodHlwZSwgWzB4NTMsIDB4NzAsIDB4NjUsIDB4NjUsIDB4NzgsIDB4MjAsIDB4MjBdKSkge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdGV4dDogJ3NweCcsXG5cdFx0XHRcdFx0bWltZTogJ2F1ZGlvL29nZycsXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmICdcXHgwMXZvcmJpcycgaW4gaGVhZGVyXG5cdFx0XHRpZiAoX2NoZWNrKHR5cGUsIFsweDAxLCAweDc2LCAweDZGLCAweDcyLCAweDYyLCAweDY5LCAweDczXSkpIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRleHQ6ICdvZ2cnLFxuXHRcdFx0XHRcdG1pbWU6ICdhdWRpby9vZ2cnLFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBEZWZhdWx0IE9HRyBjb250YWluZXIgaHR0cHM6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvbWVkaWEtdHlwZXMvYXBwbGljYXRpb24vb2dnXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICdvZ3gnLFxuXHRcdFx0XHRtaW1lOiAnYXBwbGljYXRpb24vb2dnJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKFxuXHRcdFx0dGhpcy5jaGVjayhbMHg1MCwgMHg0Ql0pXG5cdFx0XHQmJiAodGhpcy5idWZmZXJbMl0gPT09IDB4MyB8fCB0aGlzLmJ1ZmZlclsyXSA9PT0gMHg1IHx8IHRoaXMuYnVmZmVyWzJdID09PSAweDcpXG5cdFx0XHQmJiAodGhpcy5idWZmZXJbM10gPT09IDB4NCB8fCB0aGlzLmJ1ZmZlclszXSA9PT0gMHg2IHx8IHRoaXMuYnVmZmVyWzNdID09PSAweDgpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICd6aXAnLFxuXHRcdFx0XHRtaW1lOiAnYXBwbGljYXRpb24vemlwJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdC8vIEZpbGUgVHlwZSBCb3ggKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT19iYXNlX21lZGlhX2ZpbGVfZm9ybWF0KVxuXHRcdC8vIEl0J3Mgbm90IHJlcXVpcmVkIHRvIGJlIGZpcnN0LCBidXQgaXQncyByZWNvbW1lbmRlZCB0byBiZS4gQWxtb3N0IGFsbCBJU08gYmFzZSBtZWRpYSBmaWxlcyBzdGFydCB3aXRoIGBmdHlwYCBib3guXG5cdFx0Ly8gYGZ0eXBgIGJveCBtdXN0IGNvbnRhaW4gYSBicmFuZCBtYWpvciBpZGVudGlmaWVyLCB3aGljaCBtdXN0IGNvbnNpc3Qgb2YgSVNPIDg4NTktMSBwcmludGFibGUgY2hhcmFjdGVycy5cblx0XHQvLyBIZXJlIHdlIGNoZWNrIGZvciA4ODU5LTEgcHJpbnRhYmxlIGNoYXJhY3RlcnMgKGZvciBzaW1wbGljaXR5LCBpdCdzIGEgbWFzayB3aGljaCBhbHNvIGNhdGNoZXMgb25lIG5vbi1wcmludGFibGUgY2hhcmFjdGVyKS5cblx0XHRpZiAoXG5cdFx0XHR0aGlzLmNoZWNrU3RyaW5nKCdmdHlwJywge29mZnNldDogNH0pXG5cdFx0XHQmJiAodGhpcy5idWZmZXJbOF0gJiAweDYwKSAhPT0gMHgwMCAvLyBCcmFuZCBtYWpvciwgZmlyc3QgY2hhcmFjdGVyIEFTQ0lJP1xuXHRcdCkge1xuXHRcdFx0Ly8gVGhleSBhbGwgY2FuIGhhdmUgTUlNRSBgdmlkZW8vbXA0YCBleGNlcHQgYGFwcGxpY2F0aW9uL21wNGAgc3BlY2lhbC1jYXNlIHdoaWNoIGlzIGhhcmQgdG8gZGV0ZWN0LlxuXHRcdFx0Ly8gRm9yIHNvbWUgY2FzZXMsIHdlJ3JlIHNwZWNpZmljLCBldmVyeXRoaW5nIGVsc2UgZmFsbHMgdG8gYHZpZGVvL21wNGAgd2l0aCBgbXA0YCBleHRlbnNpb24uXG5cdFx0XHRjb25zdCBicmFuZE1ham9yID0gdGhpcy5idWZmZXIudG9TdHJpbmcoJ2JpbmFyeScsIDgsIDEyKS5yZXBsYWNlKCdcXDAnLCAnICcpLnRyaW0oKTtcblx0XHRcdHN3aXRjaCAoYnJhbmRNYWpvcikge1xuXHRcdFx0XHRjYXNlICdhdmlmJzpcblx0XHRcdFx0Y2FzZSAnYXZpcyc6XG5cdFx0XHRcdFx0cmV0dXJuIHtleHQ6ICdhdmlmJywgbWltZTogJ2ltYWdlL2F2aWYnfTtcblx0XHRcdFx0Y2FzZSAnbWlmMSc6XG5cdFx0XHRcdFx0cmV0dXJuIHtleHQ6ICdoZWljJywgbWltZTogJ2ltYWdlL2hlaWYnfTtcblx0XHRcdFx0Y2FzZSAnbXNmMSc6XG5cdFx0XHRcdFx0cmV0dXJuIHtleHQ6ICdoZWljJywgbWltZTogJ2ltYWdlL2hlaWYtc2VxdWVuY2UnfTtcblx0XHRcdFx0Y2FzZSAnaGVpYyc6XG5cdFx0XHRcdGNhc2UgJ2hlaXgnOlxuXHRcdFx0XHRcdHJldHVybiB7ZXh0OiAnaGVpYycsIG1pbWU6ICdpbWFnZS9oZWljJ307XG5cdFx0XHRcdGNhc2UgJ2hldmMnOlxuXHRcdFx0XHRjYXNlICdoZXZ4Jzpcblx0XHRcdFx0XHRyZXR1cm4ge2V4dDogJ2hlaWMnLCBtaW1lOiAnaW1hZ2UvaGVpYy1zZXF1ZW5jZSd9O1xuXHRcdFx0XHRjYXNlICdxdCc6XG5cdFx0XHRcdFx0cmV0dXJuIHtleHQ6ICdtb3YnLCBtaW1lOiAndmlkZW8vcXVpY2t0aW1lJ307XG5cdFx0XHRcdGNhc2UgJ000Vic6XG5cdFx0XHRcdGNhc2UgJ000VkgnOlxuXHRcdFx0XHRjYXNlICdNNFZQJzpcblx0XHRcdFx0XHRyZXR1cm4ge2V4dDogJ200dicsIG1pbWU6ICd2aWRlby94LW00did9O1xuXHRcdFx0XHRjYXNlICdNNFAnOlxuXHRcdFx0XHRcdHJldHVybiB7ZXh0OiAnbTRwJywgbWltZTogJ3ZpZGVvL21wNCd9O1xuXHRcdFx0XHRjYXNlICdNNEInOlxuXHRcdFx0XHRcdHJldHVybiB7ZXh0OiAnbTRiJywgbWltZTogJ2F1ZGlvL21wNCd9O1xuXHRcdFx0XHRjYXNlICdNNEEnOlxuXHRcdFx0XHRcdHJldHVybiB7ZXh0OiAnbTRhJywgbWltZTogJ2F1ZGlvL3gtbTRhJ307XG5cdFx0XHRcdGNhc2UgJ0Y0Vic6XG5cdFx0XHRcdFx0cmV0dXJuIHtleHQ6ICdmNHYnLCBtaW1lOiAndmlkZW8vbXA0J307XG5cdFx0XHRcdGNhc2UgJ0Y0UCc6XG5cdFx0XHRcdFx0cmV0dXJuIHtleHQ6ICdmNHAnLCBtaW1lOiAndmlkZW8vbXA0J307XG5cdFx0XHRcdGNhc2UgJ0Y0QSc6XG5cdFx0XHRcdFx0cmV0dXJuIHtleHQ6ICdmNGEnLCBtaW1lOiAnYXVkaW8vbXA0J307XG5cdFx0XHRcdGNhc2UgJ0Y0Qic6XG5cdFx0XHRcdFx0cmV0dXJuIHtleHQ6ICdmNGInLCBtaW1lOiAnYXVkaW8vbXA0J307XG5cdFx0XHRcdGNhc2UgJ2NyeCc6XG5cdFx0XHRcdFx0cmV0dXJuIHtleHQ6ICdjcjMnLCBtaW1lOiAnaW1hZ2UveC1jYW5vbi1jcjMnfTtcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRpZiAoYnJhbmRNYWpvci5zdGFydHNXaXRoKCczZycpKSB7XG5cdFx0XHRcdFx0XHRpZiAoYnJhbmRNYWpvci5zdGFydHNXaXRoKCczZzInKSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4ge2V4dDogJzNnMicsIG1pbWU6ICd2aWRlby8zZ3BwMid9O1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRyZXR1cm4ge2V4dDogJzNncCcsIG1pbWU6ICd2aWRlby8zZ3BwJ307XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHtleHQ6ICdtcDQnLCBtaW1lOiAndmlkZW8vbXA0J307XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2tTdHJpbmcoJ01UaGQnKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAnbWlkJyxcblx0XHRcdFx0bWltZTogJ2F1ZGlvL21pZGknLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAoXG5cdFx0XHR0aGlzLmNoZWNrU3RyaW5nKCd3T0ZGJylcblx0XHRcdCYmIChcblx0XHRcdFx0dGhpcy5jaGVjayhbMHgwMCwgMHgwMSwgMHgwMCwgMHgwMF0sIHtvZmZzZXQ6IDR9KVxuXHRcdFx0XHR8fCB0aGlzLmNoZWNrU3RyaW5nKCdPVFRPJywge29mZnNldDogNH0pXG5cdFx0XHQpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICd3b2ZmJyxcblx0XHRcdFx0bWltZTogJ2ZvbnQvd29mZicsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdHRoaXMuY2hlY2tTdHJpbmcoJ3dPRjInKVxuXHRcdFx0JiYgKFxuXHRcdFx0XHR0aGlzLmNoZWNrKFsweDAwLCAweDAxLCAweDAwLCAweDAwXSwge29mZnNldDogNH0pXG5cdFx0XHRcdHx8IHRoaXMuY2hlY2tTdHJpbmcoJ09UVE8nLCB7b2Zmc2V0OiA0fSlcblx0XHRcdClcblx0XHQpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGV4dDogJ3dvZmYyJyxcblx0XHRcdFx0bWltZTogJ2ZvbnQvd29mZjInLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5jaGVjayhbMHhENCwgMHhDMywgMHhCMiwgMHhBMV0pIHx8IHRoaXMuY2hlY2soWzB4QTEsIDB4QjIsIDB4QzMsIDB4RDRdKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAncGNhcCcsXG5cdFx0XHRcdG1pbWU6ICdhcHBsaWNhdGlvbi92bmQudGNwZHVtcC5wY2FwJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Ly8gU29ueSBEU0QgU3RyZWFtIEZpbGUgKERTRilcblx0XHRpZiAodGhpcy5jaGVja1N0cmluZygnRFNEICcpKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICdkc2YnLFxuXHRcdFx0XHRtaW1lOiAnYXVkaW8veC1kc2YnLCAvLyBOb24tc3RhbmRhcmRcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2tTdHJpbmcoJ0xaSVAnKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAnbHonLFxuXHRcdFx0XHRtaW1lOiAnYXBwbGljYXRpb24veC1semlwJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2tTdHJpbmcoJ2ZMYUMnKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAnZmxhYycsXG5cdFx0XHRcdG1pbWU6ICdhdWRpby94LWZsYWMnLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5jaGVjayhbMHg0MiwgMHg1MCwgMHg0NywgMHhGQl0pKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICdicGcnLFxuXHRcdFx0XHRtaW1lOiAnaW1hZ2UvYnBnJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2tTdHJpbmcoJ3d2cGsnKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAnd3YnLFxuXHRcdFx0XHRtaW1lOiAnYXVkaW8vd2F2cGFjaycsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmNoZWNrU3RyaW5nKCclUERGJykpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IHRva2VuaXplci5pZ25vcmUoMTM1MCk7XG5cdFx0XHRcdGNvbnN0IG1heEJ1ZmZlclNpemUgPSAxMCAqIDEwMjQgKiAxMDI0O1xuXHRcdFx0XHRjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2MoTWF0aC5taW4obWF4QnVmZmVyU2l6ZSwgdG9rZW5pemVyLmZpbGVJbmZvLnNpemUpKTtcblx0XHRcdFx0YXdhaXQgdG9rZW5pemVyLnJlYWRCdWZmZXIoYnVmZmVyLCB7bWF5QmVMZXNzOiB0cnVlfSk7XG5cblx0XHRcdFx0Ly8gQ2hlY2sgaWYgdGhpcyBpcyBhbiBBZG9iZSBJbGx1c3RyYXRvciBmaWxlXG5cdFx0XHRcdGlmIChidWZmZXIuaW5jbHVkZXMoQnVmZmVyLmZyb20oJ0FJUHJpdmF0ZURhdGEnKSkpIHtcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0ZXh0OiAnYWknLFxuXHRcdFx0XHRcdFx0bWltZTogJ2FwcGxpY2F0aW9uL3Bvc3RzY3JpcHQnLFxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdC8vIFN3YWxsb3cgZW5kIG9mIHN0cmVhbSBlcnJvciBpZiBmaWxlIGlzIHRvbyBzbWFsbCBmb3IgdGhlIEFkb2JlIEFJIGNoZWNrXG5cdFx0XHRcdGlmICghKGVycm9yIGluc3RhbmNlb2Ygc3RydG9rMy5FbmRPZlN0cmVhbUVycm9yKSkge1xuXHRcdFx0XHRcdHRocm93IGVycm9yO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFzc3VtZSB0aGlzIGlzIGp1c3QgYSBub3JtYWwgUERGXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICdwZGYnLFxuXHRcdFx0XHRtaW1lOiAnYXBwbGljYXRpb24vcGRmJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2soWzB4MDAsIDB4NjEsIDB4NzMsIDB4NkRdKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAnd2FzbScsXG5cdFx0XHRcdG1pbWU6ICdhcHBsaWNhdGlvbi93YXNtJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Ly8gVElGRiwgbGl0dGxlLWVuZGlhbiB0eXBlXG5cdFx0aWYgKHRoaXMuY2hlY2soWzB4NDksIDB4NDldKSkge1xuXHRcdFx0Y29uc3QgZmlsZVR5cGUgPSBhd2FpdCB0aGlzLnJlYWRUaWZmSGVhZGVyKGZhbHNlKTtcblx0XHRcdGlmIChmaWxlVHlwZSkge1xuXHRcdFx0XHRyZXR1cm4gZmlsZVR5cGU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gVElGRiwgYmlnLWVuZGlhbiB0eXBlXG5cdFx0aWYgKHRoaXMuY2hlY2soWzB4NEQsIDB4NERdKSkge1xuXHRcdFx0Y29uc3QgZmlsZVR5cGUgPSBhd2FpdCB0aGlzLnJlYWRUaWZmSGVhZGVyKHRydWUpO1xuXHRcdFx0aWYgKGZpbGVUeXBlKSB7XG5cdFx0XHRcdHJldHVybiBmaWxlVHlwZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGhpcy5jaGVja1N0cmluZygnTUFDICcpKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICdhcGUnLFxuXHRcdFx0XHRtaW1lOiAnYXVkaW8vYXBlJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3RocmVhdHN0YWNrL2xpYm1hZ2ljL2Jsb2IvbWFzdGVyL21hZ2ljL01hZ2Rpci9tYXRyb3NrYVxuXHRcdGlmICh0aGlzLmNoZWNrKFsweDFBLCAweDQ1LCAweERGLCAweEEzXSkpIHsgLy8gUm9vdCBlbGVtZW50OiBFQk1MXG5cdFx0XHRhc3luYyBmdW5jdGlvbiByZWFkRmllbGQoKSB7XG5cdFx0XHRcdGNvbnN0IG1zYiA9IGF3YWl0IHRva2VuaXplci5wZWVrTnVtYmVyKFRva2VuLlVJTlQ4KTtcblx0XHRcdFx0bGV0IG1hc2sgPSAweDgwO1xuXHRcdFx0XHRsZXQgaWMgPSAwOyAvLyAwID0gQSwgMSA9IEIsIDIgPSBDLCAzXG5cdFx0XHRcdC8vID0gRFxuXG5cdFx0XHRcdHdoaWxlICgobXNiICYgbWFzaykgPT09IDAgJiYgbWFzayAhPT0gMCkge1xuXHRcdFx0XHRcdCsraWM7XG5cdFx0XHRcdFx0bWFzayA+Pj0gMTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGlkID0gQnVmZmVyLmFsbG9jKGljICsgMSk7XG5cdFx0XHRcdGF3YWl0IHRva2VuaXplci5yZWFkQnVmZmVyKGlkKTtcblx0XHRcdFx0cmV0dXJuIGlkO1xuXHRcdFx0fVxuXG5cdFx0XHRhc3luYyBmdW5jdGlvbiByZWFkRWxlbWVudCgpIHtcblx0XHRcdFx0Y29uc3QgaWQgPSBhd2FpdCByZWFkRmllbGQoKTtcblx0XHRcdFx0Y29uc3QgbGVuZ3RoRmllbGQgPSBhd2FpdCByZWFkRmllbGQoKTtcblx0XHRcdFx0bGVuZ3RoRmllbGRbMF0gXj0gMHg4MCA+PiAobGVuZ3RoRmllbGQubGVuZ3RoIC0gMSk7XG5cdFx0XHRcdGNvbnN0IG5yTGVuZ3RoID0gTWF0aC5taW4oNiwgbGVuZ3RoRmllbGQubGVuZ3RoKTsgLy8gSmF2YVNjcmlwdCBjYW4gbWF4IHJlYWQgNiBieXRlcyBpbnRlZ2VyXG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0aWQ6IGlkLnJlYWRVSW50QkUoMCwgaWQubGVuZ3RoKSxcblx0XHRcdFx0XHRsZW46IGxlbmd0aEZpZWxkLnJlYWRVSW50QkUobGVuZ3RoRmllbGQubGVuZ3RoIC0gbnJMZW5ndGgsIG5yTGVuZ3RoKSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0YXN5bmMgZnVuY3Rpb24gcmVhZENoaWxkcmVuKGNoaWxkcmVuKSB7XG5cdFx0XHRcdHdoaWxlIChjaGlsZHJlbiA+IDApIHtcblx0XHRcdFx0XHRjb25zdCBlbGVtZW50ID0gYXdhaXQgcmVhZEVsZW1lbnQoKTtcblx0XHRcdFx0XHRpZiAoZWxlbWVudC5pZCA9PT0gMHg0Ml84Mikge1xuXHRcdFx0XHRcdFx0Y29uc3QgcmF3VmFsdWUgPSBhd2FpdCB0b2tlbml6ZXIucmVhZFRva2VuKG5ldyBUb2tlbi5TdHJpbmdUeXBlKGVsZW1lbnQubGVuLCAndXRmLTgnKSk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmF3VmFsdWUucmVwbGFjZSgvXFwwMC4qJC9nLCAnJyk7IC8vIFJldHVybiBEb2NUeXBlXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YXdhaXQgdG9rZW5pemVyLmlnbm9yZShlbGVtZW50Lmxlbik7IC8vIGlnbm9yZSBwYXlsb2FkXG5cdFx0XHRcdFx0LS1jaGlsZHJlbjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCByZSA9IGF3YWl0IHJlYWRFbGVtZW50KCk7XG5cdFx0XHRjb25zdCBkb2NUeXBlID0gYXdhaXQgcmVhZENoaWxkcmVuKHJlLmxlbik7XG5cblx0XHRcdHN3aXRjaCAoZG9jVHlwZSkge1xuXHRcdFx0XHRjYXNlICd3ZWJtJzpcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0ZXh0OiAnd2VibScsXG5cdFx0XHRcdFx0XHRtaW1lOiAndmlkZW8vd2VibScsXG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRjYXNlICdtYXRyb3NrYSc6XG5cdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdGV4dDogJ21rdicsXG5cdFx0XHRcdFx0XHRtaW1lOiAndmlkZW8veC1tYXRyb3NrYScsXG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSSUZGIGZpbGUgZm9ybWF0IHdoaWNoIG1pZ2h0IGJlIEFWSSwgV0FWLCBRQ1AsIGV0Y1xuXHRcdGlmICh0aGlzLmNoZWNrKFsweDUyLCAweDQ5LCAweDQ2LCAweDQ2XSkpIHtcblx0XHRcdGlmICh0aGlzLmNoZWNrKFsweDQxLCAweDU2LCAweDQ5XSwge29mZnNldDogOH0pKSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0ZXh0OiAnYXZpJyxcblx0XHRcdFx0XHRtaW1lOiAndmlkZW8vdm5kLmF2aScsXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmNoZWNrKFsweDU3LCAweDQxLCAweDU2LCAweDQ1XSwge29mZnNldDogOH0pKSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0ZXh0OiAnd2F2Jyxcblx0XHRcdFx0XHRtaW1lOiAnYXVkaW8vdm5kLndhdmUnLFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBRTENNLCBRQ1AgZmlsZVxuXHRcdFx0aWYgKHRoaXMuY2hlY2soWzB4NTEsIDB4NEMsIDB4NDMsIDB4NERdLCB7b2Zmc2V0OiA4fSkpIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRleHQ6ICdxY3AnLFxuXHRcdFx0XHRcdG1pbWU6ICdhdWRpby9xY2VscCcsXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2tTdHJpbmcoJ1NRTGknKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAnc3FsaXRlJyxcblx0XHRcdFx0bWltZTogJ2FwcGxpY2F0aW9uL3gtc3FsaXRlMycsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmNoZWNrKFsweDRFLCAweDQ1LCAweDUzLCAweDFBXSkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGV4dDogJ25lcycsXG5cdFx0XHRcdG1pbWU6ICdhcHBsaWNhdGlvbi94LW5pbnRlbmRvLW5lcy1yb20nLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5jaGVja1N0cmluZygnQ3IyNCcpKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICdjcngnLFxuXHRcdFx0XHRtaW1lOiAnYXBwbGljYXRpb24veC1nb29nbGUtY2hyb21lLWV4dGVuc2lvbicsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdHRoaXMuY2hlY2tTdHJpbmcoJ01TQ0YnKVxuXHRcdFx0fHwgdGhpcy5jaGVja1N0cmluZygnSVNjKCcpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICdjYWInLFxuXHRcdFx0XHRtaW1lOiAnYXBwbGljYXRpb24vdm5kLm1zLWNhYi1jb21wcmVzc2VkJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2soWzB4RUQsIDB4QUIsIDB4RUUsIDB4REJdKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAncnBtJyxcblx0XHRcdFx0bWltZTogJ2FwcGxpY2F0aW9uL3gtcnBtJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2soWzB4QzUsIDB4RDAsIDB4RDMsIDB4QzZdKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAnZXBzJyxcblx0XHRcdFx0bWltZTogJ2FwcGxpY2F0aW9uL2VwcycsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmNoZWNrKFsweDI4LCAweEI1LCAweDJGLCAweEZEXSkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGV4dDogJ3pzdCcsXG5cdFx0XHRcdG1pbWU6ICdhcHBsaWNhdGlvbi96c3RkJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2soWzB4N0YsIDB4NDUsIDB4NEMsIDB4NDZdKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAnZWxmJyxcblx0XHRcdFx0bWltZTogJ2FwcGxpY2F0aW9uL3gtZWxmJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2soWzB4MjEsIDB4NDIsIDB4NDQsIDB4NEVdKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAncHN0Jyxcblx0XHRcdFx0bWltZTogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1vdXRsb29rJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2tTdHJpbmcoJ1BBUjEnKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAncGFycXVldCcsXG5cdFx0XHRcdG1pbWU6ICdhcHBsaWNhdGlvbi94LXBhcnF1ZXQnLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHQvLyAtLSA1LWJ5dGUgc2lnbmF0dXJlcyAtLVxuXG5cdFx0aWYgKHRoaXMuY2hlY2soWzB4NEYsIDB4NTQsIDB4NTQsIDB4NEYsIDB4MDBdKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAnb3RmJyxcblx0XHRcdFx0bWltZTogJ2ZvbnQvb3RmJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2tTdHJpbmcoJyMhQU1SJykpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGV4dDogJ2FtcicsXG5cdFx0XHRcdG1pbWU6ICdhdWRpby9hbXInLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5jaGVja1N0cmluZygne1xcXFxydGYnKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAncnRmJyxcblx0XHRcdFx0bWltZTogJ2FwcGxpY2F0aW9uL3J0ZicsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmNoZWNrKFsweDQ2LCAweDRDLCAweDU2LCAweDAxXSkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGV4dDogJ2ZsdicsXG5cdFx0XHRcdG1pbWU6ICd2aWRlby94LWZsdicsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmNoZWNrU3RyaW5nKCdJTVBNJykpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGV4dDogJ2l0Jyxcblx0XHRcdFx0bWltZTogJ2F1ZGlvL3gtaXQnLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAoXG5cdFx0XHR0aGlzLmNoZWNrU3RyaW5nKCctbGgwLScsIHtvZmZzZXQ6IDJ9KVxuXHRcdFx0fHwgdGhpcy5jaGVja1N0cmluZygnLWxoMS0nLCB7b2Zmc2V0OiAyfSlcblx0XHRcdHx8IHRoaXMuY2hlY2tTdHJpbmcoJy1saDItJywge29mZnNldDogMn0pXG5cdFx0XHR8fCB0aGlzLmNoZWNrU3RyaW5nKCctbGgzLScsIHtvZmZzZXQ6IDJ9KVxuXHRcdFx0fHwgdGhpcy5jaGVja1N0cmluZygnLWxoNC0nLCB7b2Zmc2V0OiAyfSlcblx0XHRcdHx8IHRoaXMuY2hlY2tTdHJpbmcoJy1saDUtJywge29mZnNldDogMn0pXG5cdFx0XHR8fCB0aGlzLmNoZWNrU3RyaW5nKCctbGg2LScsIHtvZmZzZXQ6IDJ9KVxuXHRcdFx0fHwgdGhpcy5jaGVja1N0cmluZygnLWxoNy0nLCB7b2Zmc2V0OiAyfSlcblx0XHRcdHx8IHRoaXMuY2hlY2tTdHJpbmcoJy1senMtJywge29mZnNldDogMn0pXG5cdFx0XHR8fCB0aGlzLmNoZWNrU3RyaW5nKCctbHo0LScsIHtvZmZzZXQ6IDJ9KVxuXHRcdFx0fHwgdGhpcy5jaGVja1N0cmluZygnLWx6NS0nLCB7b2Zmc2V0OiAyfSlcblx0XHRcdHx8IHRoaXMuY2hlY2tTdHJpbmcoJy1saGQtJywge29mZnNldDogMn0pXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICdsemgnLFxuXHRcdFx0XHRtaW1lOiAnYXBwbGljYXRpb24veC1semgtY29tcHJlc3NlZCcsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIE1QRUcgcHJvZ3JhbSBzdHJlYW0gKFBTIG9yIE1QRUctUFMpXG5cdFx0aWYgKHRoaXMuY2hlY2soWzB4MDAsIDB4MDAsIDB4MDEsIDB4QkFdKSkge1xuXHRcdFx0Ly8gIE1QRUctUFMsIE1QRUctMSBQYXJ0IDFcblx0XHRcdGlmICh0aGlzLmNoZWNrKFsweDIxXSwge29mZnNldDogNCwgbWFzazogWzB4RjFdfSkpIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRleHQ6ICdtcGcnLCAvLyBNYXkgYWxzbyBiZSAucHMsIC5tcGVnXG5cdFx0XHRcdFx0bWltZTogJ3ZpZGVvL01QMVMnLFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNUEVHLVBTLCBNUEVHLTIgUGFydCAxXG5cdFx0XHRpZiAodGhpcy5jaGVjayhbMHg0NF0sIHtvZmZzZXQ6IDQsIG1hc2s6IFsweEM0XX0pKSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0ZXh0OiAnbXBnJywgLy8gTWF5IGFsc28gYmUgLm1wZywgLm0ycCwgLnZvYiBvciAuc3ViXG5cdFx0XHRcdFx0bWltZTogJ3ZpZGVvL01QMlAnLFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLmNoZWNrU3RyaW5nKCdJVFNGJykpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGV4dDogJ2NobScsXG5cdFx0XHRcdG1pbWU6ICdhcHBsaWNhdGlvbi92bmQubXMtaHRtbGhlbHAnLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5jaGVjayhbMHhDQSwgMHhGRSwgMHhCQSwgMHhCRV0pKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICdjbGFzcycsXG5cdFx0XHRcdG1pbWU6ICdhcHBsaWNhdGlvbi9qYXZhLXZtJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Ly8gLS0gNi1ieXRlIHNpZ25hdHVyZXMgLS1cblxuXHRcdGlmICh0aGlzLmNoZWNrKFsweEZELCAweDM3LCAweDdBLCAweDU4LCAweDVBLCAweDAwXSkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGV4dDogJ3h6Jyxcblx0XHRcdFx0bWltZTogJ2FwcGxpY2F0aW9uL3gteHonLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5jaGVja1N0cmluZygnPD94bWwgJykpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGV4dDogJ3htbCcsXG5cdFx0XHRcdG1pbWU6ICdhcHBsaWNhdGlvbi94bWwnLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5jaGVjayhbMHgzNywgMHg3QSwgMHhCQywgMHhBRiwgMHgyNywgMHgxQ10pKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICc3eicsXG5cdFx0XHRcdG1pbWU6ICdhcHBsaWNhdGlvbi94LTd6LWNvbXByZXNzZWQnLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAoXG5cdFx0XHR0aGlzLmNoZWNrKFsweDUyLCAweDYxLCAweDcyLCAweDIxLCAweDFBLCAweDddKVxuXHRcdFx0JiYgKHRoaXMuYnVmZmVyWzZdID09PSAweDAgfHwgdGhpcy5idWZmZXJbNl0gPT09IDB4MSlcblx0XHQpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGV4dDogJ3JhcicsXG5cdFx0XHRcdG1pbWU6ICdhcHBsaWNhdGlvbi94LXJhci1jb21wcmVzc2VkJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2tTdHJpbmcoJ3NvbGlkICcpKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICdzdGwnLFxuXHRcdFx0XHRtaW1lOiAnbW9kZWwvc3RsJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2tTdHJpbmcoJ0FDJykpIHtcblx0XHRcdGNvbnN0IHZlcnNpb24gPSB0aGlzLmJ1ZmZlci50b1N0cmluZygnYmluYXJ5JywgMiwgNik7XG5cdFx0XHRpZiAodmVyc2lvbi5tYXRjaCgnXmQqJykgJiYgdmVyc2lvbiA+PSAxMDAwICYmIHZlcnNpb24gPD0gMTA1MCkge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdGV4dDogJ2R3ZycsXG5cdFx0XHRcdFx0bWltZTogJ2ltYWdlL3ZuZC5kd2cnLFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLmNoZWNrU3RyaW5nKCcwNzA3MDcnKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAnY3BpbycsXG5cdFx0XHRcdG1pbWU6ICdhcHBsaWNhdGlvbi94LWNwaW8nLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHQvLyAtLSA3LWJ5dGUgc2lnbmF0dXJlcyAtLVxuXG5cdFx0aWYgKHRoaXMuY2hlY2tTdHJpbmcoJ0JMRU5ERVInKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAnYmxlbmQnLFxuXHRcdFx0XHRtaW1lOiAnYXBwbGljYXRpb24veC1ibGVuZGVyJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2tTdHJpbmcoJyE8YXJjaD4nKSkge1xuXHRcdFx0YXdhaXQgdG9rZW5pemVyLmlnbm9yZSg4KTtcblx0XHRcdGNvbnN0IHN0cmluZyA9IGF3YWl0IHRva2VuaXplci5yZWFkVG9rZW4obmV3IFRva2VuLlN0cmluZ1R5cGUoMTMsICdhc2NpaScpKTtcblx0XHRcdGlmIChzdHJpbmcgPT09ICdkZWJpYW4tYmluYXJ5Jykge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdGV4dDogJ2RlYicsXG5cdFx0XHRcdFx0bWltZTogJ2FwcGxpY2F0aW9uL3gtZGViJyxcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAnYXInLFxuXHRcdFx0XHRtaW1lOiAnYXBwbGljYXRpb24veC11bml4LWFyY2hpdmUnLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5jaGVja1N0cmluZygnKipBQ0UnLCB7b2Zmc2V0OiA3fSkpIHtcblx0XHRcdGF3YWl0IHRva2VuaXplci5wZWVrQnVmZmVyKHRoaXMuYnVmZmVyLCB7bGVuZ3RoOiAxNCwgbWF5QmVMZXNzOiB0cnVlfSk7XG5cdFx0XHRpZiAodGhpcy5jaGVja1N0cmluZygnKionLCB7b2Zmc2V0OiAxMn0pKSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0ZXh0OiAnYWNlJyxcblx0XHRcdFx0XHRtaW1lOiAnYXBwbGljYXRpb24veC1hY2UtY29tcHJlc3NlZCcsXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gLS0gOC1ieXRlIHNpZ25hdHVyZXMgLS1cblxuXHRcdGlmICh0aGlzLmNoZWNrKFsweDg5LCAweDUwLCAweDRFLCAweDQ3LCAweDBELCAweDBBLCAweDFBLCAweDBBXSkpIHtcblx0XHRcdC8vIEFQTkcgZm9ybWF0IChodHRwczovL3dpa2kubW96aWxsYS5vcmcvQVBOR19TcGVjaWZpY2F0aW9uKVxuXHRcdFx0Ly8gMS4gRmluZCB0aGUgZmlyc3QgSURBVCAoaW1hZ2UgZGF0YSkgY2h1bmsgKDQ5IDQ0IDQxIDU0KVxuXHRcdFx0Ly8gMi4gQ2hlY2sgaWYgdGhlcmUgaXMgYW4gXCJhY1RMXCIgY2h1bmsgYmVmb3JlIHRoZSBJREFUIG9uZSAoNjEgNjMgNTQgNEMpXG5cblx0XHRcdC8vIE9mZnNldCBjYWxjdWxhdGVkIGFzIGZvbGxvd3M6XG5cdFx0XHQvLyAtIDggYnl0ZXM6IFBORyBzaWduYXR1cmVcblx0XHRcdC8vIC0gNCAobGVuZ3RoKSArIDQgKGNodW5rIHR5cGUpICsgMTMgKGNodW5rIGRhdGEpICsgNCAoQ1JDKTogSUhEUiBjaHVua1xuXG5cdFx0XHRhd2FpdCB0b2tlbml6ZXIuaWdub3JlKDgpOyAvLyBpZ25vcmUgUE5HIHNpZ25hdHVyZVxuXG5cdFx0XHRhc3luYyBmdW5jdGlvbiByZWFkQ2h1bmtIZWFkZXIoKSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0bGVuZ3RoOiBhd2FpdCB0b2tlbml6ZXIucmVhZFRva2VuKFRva2VuLklOVDMyX0JFKSxcblx0XHRcdFx0XHR0eXBlOiBhd2FpdCB0b2tlbml6ZXIucmVhZFRva2VuKG5ldyBUb2tlbi5TdHJpbmdUeXBlKDQsICdiaW5hcnknKSksXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdGRvIHtcblx0XHRcdFx0Y29uc3QgY2h1bmsgPSBhd2FpdCByZWFkQ2h1bmtIZWFkZXIoKTtcblx0XHRcdFx0aWYgKGNodW5rLmxlbmd0aCA8IDApIHtcblx0XHRcdFx0XHRyZXR1cm47IC8vIEludmFsaWQgY2h1bmsgbGVuZ3RoXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzd2l0Y2ggKGNodW5rLnR5cGUpIHtcblx0XHRcdFx0XHRjYXNlICdJREFUJzpcblx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdGV4dDogJ3BuZycsXG5cdFx0XHRcdFx0XHRcdG1pbWU6ICdpbWFnZS9wbmcnLFxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRjYXNlICdhY1RMJzpcblx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdGV4dDogJ2FwbmcnLFxuXHRcdFx0XHRcdFx0XHRtaW1lOiAnaW1hZ2UvYXBuZycsXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRhd2FpdCB0b2tlbml6ZXIuaWdub3JlKGNodW5rLmxlbmd0aCArIDQpOyAvLyBJZ25vcmUgY2h1bmstZGF0YSArIENSQ1xuXHRcdFx0XHR9XG5cdFx0XHR9IHdoaWxlICh0b2tlbml6ZXIucG9zaXRpb24gKyA4IDwgdG9rZW5pemVyLmZpbGVJbmZvLnNpemUpO1xuXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICdwbmcnLFxuXHRcdFx0XHRtaW1lOiAnaW1hZ2UvcG5nJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2soWzB4NDEsIDB4NTIsIDB4NTIsIDB4NEYsIDB4NTcsIDB4MzEsIDB4MDAsIDB4MDBdKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAnYXJyb3cnLFxuXHRcdFx0XHRtaW1lOiAnYXBwbGljYXRpb24veC1hcGFjaGUtYXJyb3cnLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5jaGVjayhbMHg2NywgMHg2QywgMHg1NCwgMHg0NiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMF0pKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICdnbGInLFxuXHRcdFx0XHRtaW1lOiAnbW9kZWwvZ2x0Zi1iaW5hcnknLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHQvLyBgbW92YCBmb3JtYXQgdmFyaWFudHNcblx0XHRpZiAoXG5cdFx0XHR0aGlzLmNoZWNrKFsweDY2LCAweDcyLCAweDY1LCAweDY1XSwge29mZnNldDogNH0pIC8vIGBmcmVlYFxuXHRcdFx0fHwgdGhpcy5jaGVjayhbMHg2RCwgMHg2NCwgMHg2MSwgMHg3NF0sIHtvZmZzZXQ6IDR9KSAvLyBgbWRhdGAgTUpQRUdcblx0XHRcdHx8IHRoaXMuY2hlY2soWzB4NkQsIDB4NkYsIDB4NkYsIDB4NzZdLCB7b2Zmc2V0OiA0fSkgLy8gYG1vb3ZgXG5cdFx0XHR8fCB0aGlzLmNoZWNrKFsweDc3LCAweDY5LCAweDY0LCAweDY1XSwge29mZnNldDogNH0pIC8vIGB3aWRlYFxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAnbW92Jyxcblx0XHRcdFx0bWltZTogJ3ZpZGVvL3F1aWNrdGltZScsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIC0tIDktYnl0ZSBzaWduYXR1cmVzIC0tXG5cblx0XHRpZiAodGhpcy5jaGVjayhbMHg0OSwgMHg0OSwgMHg1MiwgMHg0RiwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOF0pKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICdvcmYnLFxuXHRcdFx0XHRtaW1lOiAnaW1hZ2UveC1vbHltcHVzLW9yZicsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmNoZWNrU3RyaW5nKCdnaW1wIHhjZiAnKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAneGNmJyxcblx0XHRcdFx0bWltZTogJ2ltYWdlL3gteGNmJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Ly8gLS0gMTItYnl0ZSBzaWduYXR1cmVzIC0tXG5cblx0XHRpZiAodGhpcy5jaGVjayhbMHg0OSwgMHg0OSwgMHg1NSwgMHgwMCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHhFNywgMHg3NCwgMHhEOF0pKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICdydzInLFxuXHRcdFx0XHRtaW1lOiAnaW1hZ2UveC1wYW5hc29uaWMtcncyJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Ly8gQVNGX0hlYWRlcl9PYmplY3QgZmlyc3QgODAgYnl0ZXNcblx0XHRpZiAodGhpcy5jaGVjayhbMHgzMCwgMHgyNiwgMHhCMiwgMHg3NSwgMHg4RSwgMHg2NiwgMHhDRiwgMHgxMSwgMHhBNiwgMHhEOV0pKSB7XG5cdFx0XHRhc3luYyBmdW5jdGlvbiByZWFkSGVhZGVyKCkge1xuXHRcdFx0XHRjb25zdCBndWlkID0gQnVmZmVyLmFsbG9jKDE2KTtcblx0XHRcdFx0YXdhaXQgdG9rZW5pemVyLnJlYWRCdWZmZXIoZ3VpZCk7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0aWQ6IGd1aWQsXG5cdFx0XHRcdFx0c2l6ZTogTnVtYmVyKGF3YWl0IHRva2VuaXplci5yZWFkVG9rZW4oVG9rZW4uVUlOVDY0X0xFKSksXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IHRva2VuaXplci5pZ25vcmUoMzApO1xuXHRcdFx0Ly8gU2VhcmNoIGZvciBoZWFkZXIgc2hvdWxkIGJlIGluIGZpcnN0IDFLQiBvZiBmaWxlLlxuXHRcdFx0d2hpbGUgKHRva2VuaXplci5wb3NpdGlvbiArIDI0IDwgdG9rZW5pemVyLmZpbGVJbmZvLnNpemUpIHtcblx0XHRcdFx0Y29uc3QgaGVhZGVyID0gYXdhaXQgcmVhZEhlYWRlcigpO1xuXHRcdFx0XHRsZXQgcGF5bG9hZCA9IGhlYWRlci5zaXplIC0gMjQ7XG5cdFx0XHRcdGlmIChfY2hlY2soaGVhZGVyLmlkLCBbMHg5MSwgMHgwNywgMHhEQywgMHhCNywgMHhCNywgMHhBOSwgMHhDRiwgMHgxMSwgMHg4RSwgMHhFNiwgMHgwMCwgMHhDMCwgMHgwQywgMHgyMCwgMHg1MywgMHg2NV0pKSB7XG5cdFx0XHRcdFx0Ly8gU3luYyBvbiBTdHJlYW0tUHJvcGVydGllcy1PYmplY3QgKEI3REMwNzkxLUE5QjctMTFDRi04RUU2LTAwQzAwQzIwNTM2NSlcblx0XHRcdFx0XHRjb25zdCB0eXBlSWQgPSBCdWZmZXIuYWxsb2MoMTYpO1xuXHRcdFx0XHRcdHBheWxvYWQgLT0gYXdhaXQgdG9rZW5pemVyLnJlYWRCdWZmZXIodHlwZUlkKTtcblxuXHRcdFx0XHRcdGlmIChfY2hlY2sodHlwZUlkLCBbMHg0MCwgMHg5RSwgMHg2OSwgMHhGOCwgMHg0RCwgMHg1QiwgMHhDRiwgMHgxMSwgMHhBOCwgMHhGRCwgMHgwMCwgMHg4MCwgMHg1RiwgMHg1QywgMHg0NCwgMHgyQl0pKSB7XG5cdFx0XHRcdFx0XHQvLyBGb3VuZCBhdWRpbzpcblx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdGV4dDogJ2FzZicsXG5cdFx0XHRcdFx0XHRcdG1pbWU6ICdhdWRpby94LW1zLWFzZicsXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChfY2hlY2sodHlwZUlkLCBbMHhDMCwgMHhFRiwgMHgxOSwgMHhCQywgMHg0RCwgMHg1QiwgMHhDRiwgMHgxMSwgMHhBOCwgMHhGRCwgMHgwMCwgMHg4MCwgMHg1RiwgMHg1QywgMHg0NCwgMHgyQl0pKSB7XG5cdFx0XHRcdFx0XHQvLyBGb3VuZCB2aWRlbzpcblx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdGV4dDogJ2FzZicsXG5cdFx0XHRcdFx0XHRcdG1pbWU6ICd2aWRlby94LW1zLWFzZicsXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YXdhaXQgdG9rZW5pemVyLmlnbm9yZShwYXlsb2FkKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRGVmYXVsdCB0byBBU0YgZ2VuZXJpYyBleHRlbnNpb25cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGV4dDogJ2FzZicsXG5cdFx0XHRcdG1pbWU6ICdhcHBsaWNhdGlvbi92bmQubXMtYXNmJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2soWzB4QUIsIDB4NEIsIDB4NTQsIDB4NTgsIDB4MjAsIDB4MzEsIDB4MzEsIDB4QkIsIDB4MEQsIDB4MEEsIDB4MUEsIDB4MEFdKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAna3R4Jyxcblx0XHRcdFx0bWltZTogJ2ltYWdlL2t0eCcsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmICgodGhpcy5jaGVjayhbMHg3RSwgMHgxMCwgMHgwNF0pIHx8IHRoaXMuY2hlY2soWzB4N0UsIDB4MTgsIDB4MDRdKSkgJiYgdGhpcy5jaGVjayhbMHgzMCwgMHg0RCwgMHg0OSwgMHg0NV0sIHtvZmZzZXQ6IDR9KSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAnbWllJyxcblx0XHRcdFx0bWltZTogJ2FwcGxpY2F0aW9uL3gtbWllJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2soWzB4MjcsIDB4MEEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLCB7b2Zmc2V0OiAyfSkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGV4dDogJ3NocCcsXG5cdFx0XHRcdG1pbWU6ICdhcHBsaWNhdGlvbi94LWVzcmktc2hhcGUnLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5jaGVjayhbMHhGRiwgMHg0RiwgMHhGRiwgMHg1MV0pKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICdqMmMnLFxuXHRcdFx0XHRtaW1lOiAnaW1hZ2UvajJjJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2soWzB4MDAsIDB4MDAsIDB4MDAsIDB4MEMsIDB4NkEsIDB4NTAsIDB4MjAsIDB4MjAsIDB4MEQsIDB4MEEsIDB4ODcsIDB4MEFdKSkge1xuXHRcdFx0Ly8gSlBFRy0yMDAwIGZhbWlseVxuXG5cdFx0XHRhd2FpdCB0b2tlbml6ZXIuaWdub3JlKDIwKTtcblx0XHRcdGNvbnN0IHR5cGUgPSBhd2FpdCB0b2tlbml6ZXIucmVhZFRva2VuKG5ldyBUb2tlbi5TdHJpbmdUeXBlKDQsICdhc2NpaScpKTtcblx0XHRcdHN3aXRjaCAodHlwZSkge1xuXHRcdFx0XHRjYXNlICdqcDIgJzpcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0ZXh0OiAnanAyJyxcblx0XHRcdFx0XHRcdG1pbWU6ICdpbWFnZS9qcDInLFxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdGNhc2UgJ2pweCAnOlxuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRleHQ6ICdqcHgnLFxuXHRcdFx0XHRcdFx0bWltZTogJ2ltYWdlL2pweCcsXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0Y2FzZSAnanBtICc6XG5cdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdGV4dDogJ2pwbScsXG5cdFx0XHRcdFx0XHRtaW1lOiAnaW1hZ2UvanBtJyxcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRjYXNlICdtanAyJzpcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0ZXh0OiAnbWoyJyxcblx0XHRcdFx0XHRcdG1pbWU6ICdpbWFnZS9tajInLFxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdHRoaXMuY2hlY2soWzB4RkYsIDB4MEFdKVxuXHRcdFx0fHwgdGhpcy5jaGVjayhbMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywgMHg0QSwgMHg1OCwgMHg0QywgMHgyMCwgMHgwRCwgMHgwQSwgMHg4NywgMHgwQV0pXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICdqeGwnLFxuXHRcdFx0XHRtaW1lOiAnaW1hZ2UvanhsJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2soWzB4RkUsIDB4RkZdKSkgeyAvLyBVVEYtMTYtQk9NLUxFXG5cdFx0XHRpZiAodGhpcy5jaGVjayhbMCwgNjAsIDAsIDYzLCAwLCAxMjAsIDAsIDEwOSwgMCwgMTA4XSwge29mZnNldDogMn0pKSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0ZXh0OiAneG1sJyxcblx0XHRcdFx0XHRtaW1lOiAnYXBwbGljYXRpb24veG1sJyxcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDsgLy8gU29tZSB1bmtub3duIHRleHQgYmFzZWQgZm9ybWF0XG5cdFx0fVxuXG5cdFx0Ly8gLS0gVW5zYWZlIHNpZ25hdHVyZXMgLS1cblxuXHRcdGlmIChcblx0XHRcdHRoaXMuY2hlY2soWzB4MCwgMHgwLCAweDEsIDB4QkFdKVxuXHRcdFx0fHwgdGhpcy5jaGVjayhbMHgwLCAweDAsIDB4MSwgMHhCM10pXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICdtcGcnLFxuXHRcdFx0XHRtaW1lOiAndmlkZW8vbXBlZycsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmNoZWNrKFsweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwXSkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGV4dDogJ3R0ZicsXG5cdFx0XHRcdG1pbWU6ICdmb250L3R0ZicsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmNoZWNrKFsweDAwLCAweDAwLCAweDAxLCAweDAwXSkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGV4dDogJ2ljbycsXG5cdFx0XHRcdG1pbWU6ICdpbWFnZS94LWljb24nLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5jaGVjayhbMHgwMCwgMHgwMCwgMHgwMiwgMHgwMF0pKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICdjdXInLFxuXHRcdFx0XHRtaW1lOiAnaW1hZ2UveC1pY29uJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2soWzB4RDAsIDB4Q0YsIDB4MTEsIDB4RTAsIDB4QTEsIDB4QjEsIDB4MUEsIDB4RTFdKSkge1xuXHRcdFx0Ly8gRGV0ZWN0ZWQgTWljcm9zb2Z0IENvbXBvdW5kIEZpbGUgQmluYXJ5IEZpbGUgKE1TLUNGQikgRm9ybWF0LlxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAnY2ZiJyxcblx0XHRcdFx0bWltZTogJ2FwcGxpY2F0aW9uL3gtY2ZiJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Ly8gSW5jcmVhc2Ugc2FtcGxlIHNpemUgZnJvbSAxMiB0byAyNTYuXG5cdFx0YXdhaXQgdG9rZW5pemVyLnBlZWtCdWZmZXIodGhpcy5idWZmZXIsIHtsZW5ndGg6IE1hdGgubWluKDI1NiwgdG9rZW5pemVyLmZpbGVJbmZvLnNpemUpLCBtYXlCZUxlc3M6IHRydWV9KTtcblxuXHRcdC8vIC0tIDE1LWJ5dGUgc2lnbmF0dXJlcyAtLVxuXG5cdFx0aWYgKHRoaXMuY2hlY2tTdHJpbmcoJ0JFR0lOOicpKSB7XG5cdFx0XHRpZiAodGhpcy5jaGVja1N0cmluZygnVkNBUkQnLCB7b2Zmc2V0OiA2fSkpIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRleHQ6ICd2Y2YnLFxuXHRcdFx0XHRcdG1pbWU6ICd0ZXh0L3ZjYXJkJyxcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuY2hlY2tTdHJpbmcoJ1ZDQUxFTkRBUicsIHtvZmZzZXQ6IDZ9KSkge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdGV4dDogJ2ljcycsXG5cdFx0XHRcdFx0bWltZTogJ3RleHQvY2FsZW5kYXInLFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIGByYWZgIGlzIGhlcmUganVzdCB0byBrZWVwIGFsbCB0aGUgcmF3IGltYWdlIGRldGVjdG9ycyB0b2dldGhlci5cblx0XHRpZiAodGhpcy5jaGVja1N0cmluZygnRlVKSUZJTE1DQ0QtUkFXJykpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGV4dDogJ3JhZicsXG5cdFx0XHRcdG1pbWU6ICdpbWFnZS94LWZ1amlmaWxtLXJhZicsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmNoZWNrU3RyaW5nKCdFeHRlbmRlZCBNb2R1bGU6JykpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGV4dDogJ3htJyxcblx0XHRcdFx0bWltZTogJ2F1ZGlvL3gteG0nLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5jaGVja1N0cmluZygnQ3JlYXRpdmUgVm9pY2UgRmlsZScpKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICd2b2MnLFxuXHRcdFx0XHRtaW1lOiAnYXVkaW8veC12b2MnLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5jaGVjayhbMHgwNCwgMHgwMCwgMHgwMCwgMHgwMF0pICYmIHRoaXMuYnVmZmVyLmxlbmd0aCA+PSAxNikgeyAvLyBSb3VnaCAmIHF1aWNrIGNoZWNrIFBpY2tsZS9BU0FSXG5cdFx0XHRjb25zdCBqc29uU2l6ZSA9IHRoaXMuYnVmZmVyLnJlYWRVSW50MzJMRSgxMik7XG5cdFx0XHRpZiAoanNvblNpemUgPiAxMiAmJiB0aGlzLmJ1ZmZlci5sZW5ndGggPj0ganNvblNpemUgKyAxNikge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IGhlYWRlciA9IHRoaXMuYnVmZmVyLnNsaWNlKDE2LCBqc29uU2l6ZSArIDE2KS50b1N0cmluZygpO1xuXHRcdFx0XHRcdGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGhlYWRlcik7XG5cdFx0XHRcdFx0Ly8gQ2hlY2sgaWYgUGlja2xlIGlzIEFTQVJcblx0XHRcdFx0XHRpZiAoanNvbi5maWxlcykgeyAvLyBGaW5hbCBjaGVjaywgYXNzdXJpbmcgUGlja2xlL0FTQVIgZm9ybWF0XG5cdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRleHQ6ICdhc2FyJyxcblx0XHRcdFx0XHRcdFx0bWltZTogJ2FwcGxpY2F0aW9uL3gtYXNhcicsXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBjYXRjaCB7fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLmNoZWNrKFsweDA2LCAweDBFLCAweDJCLCAweDM0LCAweDAyLCAweDA1LCAweDAxLCAweDAxLCAweDBELCAweDAxLCAweDAyLCAweDAxLCAweDAxLCAweDAyXSkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGV4dDogJ214ZicsXG5cdFx0XHRcdG1pbWU6ICdhcHBsaWNhdGlvbi9teGYnLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5jaGVja1N0cmluZygnU0NSTScsIHtvZmZzZXQ6IDQ0fSkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGV4dDogJ3MzbScsXG5cdFx0XHRcdG1pbWU6ICdhdWRpby94LXMzbScsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIFJhdyBNUEVHLTIgdHJhbnNwb3J0IHN0cmVhbSAoMTg4LWJ5dGUgcGFja2V0cylcblx0XHRpZiAodGhpcy5jaGVjayhbMHg0N10pICYmIHRoaXMuY2hlY2soWzB4NDddLCB7b2Zmc2V0OiAxODh9KSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAnbXRzJyxcblx0XHRcdFx0bWltZTogJ3ZpZGVvL21wMnQnLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHQvLyBCbHUtcmF5IERpc2MgQXVkaW8tVmlkZW8gKEJEQVYpIE1QRUctMiB0cmFuc3BvcnQgc3RyZWFtIGhhcyA0LWJ5dGUgVFBfZXh0cmFfaGVhZGVyIGJlZm9yZSBlYWNoIDE4OC1ieXRlIHBhY2tldFxuXHRcdGlmICh0aGlzLmNoZWNrKFsweDQ3XSwge29mZnNldDogNH0pICYmIHRoaXMuY2hlY2soWzB4NDddLCB7b2Zmc2V0OiAxOTZ9KSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAnbXRzJyxcblx0XHRcdFx0bWltZTogJ3ZpZGVvL21wMnQnLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5jaGVjayhbMHg0MiwgMHg0RiwgMHg0RiwgMHg0QiwgMHg0RCwgMHg0RiwgMHg0MiwgMHg0OV0sIHtvZmZzZXQ6IDYwfSkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGV4dDogJ21vYmknLFxuXHRcdFx0XHRtaW1lOiAnYXBwbGljYXRpb24veC1tb2JpcG9ja2V0LWVib29rJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2soWzB4NDQsIDB4NDksIDB4NDMsIDB4NERdLCB7b2Zmc2V0OiAxMjh9KSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAnZGNtJyxcblx0XHRcdFx0bWltZTogJ2FwcGxpY2F0aW9uL2RpY29tJyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2soWzB4NEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MTQsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDZdKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXh0OiAnbG5rJyxcblx0XHRcdFx0bWltZTogJ2FwcGxpY2F0aW9uL3gubXMuc2hvcnRjdXQnLCAvLyBJbnZlbnRlZCBieSB1c1xuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5jaGVjayhbMHg2MiwgMHg2RiwgMHg2RiwgMHg2QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2RCwgMHg2MSwgMHg3MiwgMHg2QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICdhbGlhcycsXG5cdFx0XHRcdG1pbWU6ICdhcHBsaWNhdGlvbi94LmFwcGxlLmFsaWFzJywgLy8gSW52ZW50ZWQgYnkgdXNcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKFxuXHRcdFx0dGhpcy5jaGVjayhbMHg0QywgMHg1MF0sIHtvZmZzZXQ6IDM0fSlcblx0XHRcdCYmIChcblx0XHRcdFx0dGhpcy5jaGVjayhbMHgwMCwgMHgwMCwgMHgwMV0sIHtvZmZzZXQ6IDh9KVxuXHRcdFx0XHR8fCB0aGlzLmNoZWNrKFsweDAxLCAweDAwLCAweDAyXSwge29mZnNldDogOH0pXG5cdFx0XHRcdHx8IHRoaXMuY2hlY2soWzB4MDIsIDB4MDAsIDB4MDJdLCB7b2Zmc2V0OiA4fSlcblx0XHRcdClcblx0XHQpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGV4dDogJ2VvdCcsXG5cdFx0XHRcdG1pbWU6ICdhcHBsaWNhdGlvbi92bmQubXMtZm9udG9iamVjdCcsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmNoZWNrKFsweDA2LCAweDA2LCAweEVELCAweEY1LCAweEQ4LCAweDFELCAweDQ2LCAweEU1LCAweEJELCAweDMxLCAweEVGLCAweEU3LCAweEZFLCAweDc0LCAweEI3LCAweDFEXSkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGV4dDogJ2luZGQnLFxuXHRcdFx0XHRtaW1lOiAnYXBwbGljYXRpb24veC1pbmRlc2lnbicsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIEluY3JlYXNlIHNhbXBsZSBzaXplIGZyb20gMjU2IHRvIDUxMlxuXHRcdGF3YWl0IHRva2VuaXplci5wZWVrQnVmZmVyKHRoaXMuYnVmZmVyLCB7bGVuZ3RoOiBNYXRoLm1pbig1MTIsIHRva2VuaXplci5maWxlSW5mby5zaXplKSwgbWF5QmVMZXNzOiB0cnVlfSk7XG5cblx0XHQvLyBSZXF1aXJlcyBhIGJ1ZmZlciBzaXplIG9mIDUxMiBieXRlc1xuXHRcdGlmICh0YXJIZWFkZXJDaGVja3N1bU1hdGNoZXModGhpcy5idWZmZXIpKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICd0YXInLFxuXHRcdFx0XHRtaW1lOiAnYXBwbGljYXRpb24veC10YXInLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5jaGVjayhbMHhGRiwgMHhGRV0pKSB7IC8vIFVURi0xNi1CT00tQkVcblx0XHRcdGlmICh0aGlzLmNoZWNrKFs2MCwgMCwgNjMsIDAsIDEyMCwgMCwgMTA5LCAwLCAxMDgsIDBdLCB7b2Zmc2V0OiAyfSkpIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRleHQ6ICd4bWwnLFxuXHRcdFx0XHRcdG1pbWU6ICdhcHBsaWNhdGlvbi94bWwnLFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5jaGVjayhbMHhGRiwgMHgwRSwgMHg1MywgMHgwMCwgMHg2QiwgMHgwMCwgMHg2NSwgMHgwMCwgMHg3NCwgMHgwMCwgMHg2MywgMHgwMCwgMHg2OCwgMHgwMCwgMHg1NSwgMHgwMCwgMHg3MCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg0RCwgMHgwMCwgMHg2RiwgMHgwMCwgMHg2NCwgMHgwMCwgMHg2NSwgMHgwMCwgMHg2QywgMHgwMF0sIHtvZmZzZXQ6IDJ9KSkge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdGV4dDogJ3NrcCcsXG5cdFx0XHRcdFx0bWltZTogJ2FwcGxpY2F0aW9uL3ZuZC5za2V0Y2h1cC5za3AnLFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkOyAvLyBTb21lIHRleHQgYmFzZWQgZm9ybWF0XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2tTdHJpbmcoJy0tLS0tQkVHSU4gUEdQIE1FU1NBR0UtLS0tLScpKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRleHQ6ICdwZ3AnLFxuXHRcdFx0XHRtaW1lOiAnYXBwbGljYXRpb24vcGdwLWVuY3J5cHRlZCcsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIENoZWNrIE1QRUcgMSBvciAyIExheWVyIDMgaGVhZGVyLCBvciAnbGF5ZXIgMCcgZm9yIEFEVFMgKE1QRUcgc3luYy13b3JkIDB4RkZFKVxuXHRcdGlmICh0aGlzLmJ1ZmZlci5sZW5ndGggPj0gMiAmJiB0aGlzLmNoZWNrKFsweEZGLCAweEUwXSwge29mZnNldDogMCwgbWFzazogWzB4RkYsIDB4RTBdfSkpIHtcblx0XHRcdGlmICh0aGlzLmNoZWNrKFsweDEwXSwge29mZnNldDogMSwgbWFzazogWzB4MTZdfSkpIHtcblx0XHRcdFx0Ly8gQ2hlY2sgZm9yIChBRFRTKSBNUEVHLTJcblx0XHRcdFx0aWYgKHRoaXMuY2hlY2soWzB4MDhdLCB7b2Zmc2V0OiAxLCBtYXNrOiBbMHgwOF19KSkge1xuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRleHQ6ICdhYWMnLFxuXHRcdFx0XHRcdFx0bWltZTogJ2F1ZGlvL2FhYycsXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIE11c3QgYmUgKEFEVFMpIE1QRUctNFxuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdGV4dDogJ2FhYycsXG5cdFx0XHRcdFx0bWltZTogJ2F1ZGlvL2FhYycsXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdC8vIE1QRUcgMSBvciAyIExheWVyIDMgaGVhZGVyXG5cdFx0XHQvLyBDaGVjayBmb3IgTVBFRyBsYXllciAzXG5cdFx0XHRpZiAodGhpcy5jaGVjayhbMHgwMl0sIHtvZmZzZXQ6IDEsIG1hc2s6IFsweDA2XX0pKSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0ZXh0OiAnbXAzJyxcblx0XHRcdFx0XHRtaW1lOiAnYXVkaW8vbXBlZycsXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdC8vIENoZWNrIGZvciBNUEVHIGxheWVyIDJcblx0XHRcdGlmICh0aGlzLmNoZWNrKFsweDA0XSwge29mZnNldDogMSwgbWFzazogWzB4MDZdfSkpIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRleHQ6ICdtcDInLFxuXHRcdFx0XHRcdG1pbWU6ICdhdWRpby9tcGVnJyxcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2hlY2sgZm9yIE1QRUcgbGF5ZXIgMVxuXHRcdFx0aWYgKHRoaXMuY2hlY2soWzB4MDZdLCB7b2Zmc2V0OiAxLCBtYXNrOiBbMHgwNl19KSkge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdGV4dDogJ21wMScsXG5cdFx0XHRcdFx0bWltZTogJ2F1ZGlvL21wZWcnLFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGFzeW5jIHJlYWRUaWZmVGFnKGJpZ0VuZGlhbikge1xuXHRcdGNvbnN0IHRhZ0lkID0gYXdhaXQgdGhpcy50b2tlbml6ZXIucmVhZFRva2VuKGJpZ0VuZGlhbiA/IFRva2VuLlVJTlQxNl9CRSA6IFRva2VuLlVJTlQxNl9MRSk7XG5cdFx0dGhpcy50b2tlbml6ZXIuaWdub3JlKDEwKTtcblx0XHRzd2l0Y2ggKHRhZ0lkKSB7XG5cdFx0XHRjYXNlIDUwXzM0MTpcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRleHQ6ICdhcncnLFxuXHRcdFx0XHRcdG1pbWU6ICdpbWFnZS94LXNvbnktYXJ3Jyxcblx0XHRcdFx0fTtcblx0XHRcdGNhc2UgNTBfNzA2OlxuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdGV4dDogJ2RuZycsXG5cdFx0XHRcdFx0bWltZTogJ2ltYWdlL3gtYWRvYmUtZG5nJyxcblx0XHRcdFx0fTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgcmVhZFRpZmZJRkQoYmlnRW5kaWFuKSB7XG5cdFx0Y29uc3QgbnVtYmVyT2ZUYWdzID0gYXdhaXQgdGhpcy50b2tlbml6ZXIucmVhZFRva2VuKGJpZ0VuZGlhbiA/IFRva2VuLlVJTlQxNl9CRSA6IFRva2VuLlVJTlQxNl9MRSk7XG5cdFx0Zm9yIChsZXQgbiA9IDA7IG4gPCBudW1iZXJPZlRhZ3M7ICsrbikge1xuXHRcdFx0Y29uc3QgZmlsZVR5cGUgPSBhd2FpdCB0aGlzLnJlYWRUaWZmVGFnKGJpZ0VuZGlhbik7XG5cdFx0XHRpZiAoZmlsZVR5cGUpIHtcblx0XHRcdFx0cmV0dXJuIGZpbGVUeXBlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGFzeW5jIHJlYWRUaWZmSGVhZGVyKGJpZ0VuZGlhbikge1xuXHRcdGNvbnN0IHZlcnNpb24gPSAoYmlnRW5kaWFuID8gVG9rZW4uVUlOVDE2X0JFIDogVG9rZW4uVUlOVDE2X0xFKS5nZXQodGhpcy5idWZmZXIsIDIpO1xuXHRcdGNvbnN0IGlmZE9mZnNldCA9IChiaWdFbmRpYW4gPyBUb2tlbi5VSU5UMzJfQkUgOiBUb2tlbi5VSU5UMzJfTEUpLmdldCh0aGlzLmJ1ZmZlciwgNCk7XG5cblx0XHRpZiAodmVyc2lvbiA9PT0gNDIpIHtcblx0XHRcdC8vIFRJRkYgZmlsZSBoZWFkZXJcblx0XHRcdGlmIChpZmRPZmZzZXQgPj0gNikge1xuXHRcdFx0XHRpZiAodGhpcy5jaGVja1N0cmluZygnQ1InLCB7b2Zmc2V0OiA4fSkpIHtcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0ZXh0OiAnY3IyJyxcblx0XHRcdFx0XHRcdG1pbWU6ICdpbWFnZS94LWNhbm9uLWNyMicsXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChpZmRPZmZzZXQgPj0gOCAmJiAodGhpcy5jaGVjayhbMHgxQywgMHgwMCwgMHhGRSwgMHgwMF0sIHtvZmZzZXQ6IDh9KSB8fCB0aGlzLmNoZWNrKFsweDFGLCAweDAwLCAweDBCLCAweDAwXSwge29mZnNldDogOH0pKSkge1xuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRleHQ6ICduZWYnLFxuXHRcdFx0XHRcdFx0bWltZTogJ2ltYWdlL3gtbmlrb24tbmVmJyxcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IHRoaXMudG9rZW5pemVyLmlnbm9yZShpZmRPZmZzZXQpO1xuXHRcdFx0Y29uc3QgZmlsZVR5cGUgPSBhd2FpdCB0aGlzLnJlYWRUaWZmSUZEKGJpZ0VuZGlhbik7XG5cdFx0XHRyZXR1cm4gZmlsZVR5cGUgPz8ge1xuXHRcdFx0XHRleHQ6ICd0aWYnLFxuXHRcdFx0XHRtaW1lOiAnaW1hZ2UvdGlmZicsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmICh2ZXJzaW9uID09PSA0Mykge1x0Ly8gQmlnIFRJRkYgZmlsZSBoZWFkZXJcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGV4dDogJ3RpZicsXG5cdFx0XHRcdG1pbWU6ICdpbWFnZS90aWZmJyxcblx0XHRcdH07XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaWxlVHlwZVN0cmVhbShyZWFkYWJsZVN0cmVhbSwge3NhbXBsZVNpemUgPSBtaW5pbXVtQnl0ZXN9ID0ge30pIHtcblx0Y29uc3Qge2RlZmF1bHQ6IHN0cmVhbX0gPSBhd2FpdCBpbXBvcnQoJ25vZGU6c3RyZWFtJyk7XG5cblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRyZWFkYWJsZVN0cmVhbS5vbignZXJyb3InLCByZWplY3QpO1xuXG5cdFx0cmVhZGFibGVTdHJlYW0ub25jZSgncmVhZGFibGUnLCAoKSA9PiB7XG5cdFx0XHQoYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdC8vIFNldCB1cCBvdXRwdXQgc3RyZWFtXG5cdFx0XHRcdFx0Y29uc3QgcGFzcyA9IG5ldyBzdHJlYW0uUGFzc1Rocm91Z2goKTtcblx0XHRcdFx0XHRjb25zdCBvdXRwdXRTdHJlYW0gPSBzdHJlYW0ucGlwZWxpbmUgPyBzdHJlYW0ucGlwZWxpbmUocmVhZGFibGVTdHJlYW0sIHBhc3MsICgpID0+IHt9KSA6IHJlYWRhYmxlU3RyZWFtLnBpcGUocGFzcyk7XG5cblx0XHRcdFx0XHQvLyBSZWFkIHRoZSBpbnB1dCBzdHJlYW0gYW5kIGRldGVjdCB0aGUgZmlsZXR5cGVcblx0XHRcdFx0XHRjb25zdCBjaHVuayA9IHJlYWRhYmxlU3RyZWFtLnJlYWQoc2FtcGxlU2l6ZSkgPz8gcmVhZGFibGVTdHJlYW0ucmVhZCgpID8/IEJ1ZmZlci5hbGxvYygwKTtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0Y29uc3QgZmlsZVR5cGUgPSBhd2FpdCBmaWxlVHlwZUZyb21CdWZmZXIoY2h1bmspO1xuXHRcdFx0XHRcdFx0cGFzcy5maWxlVHlwZSA9IGZpbGVUeXBlO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRpZiAoZXJyb3IgaW5zdGFuY2VvZiBzdHJ0b2szLkVuZE9mU3RyZWFtRXJyb3IpIHtcblx0XHRcdFx0XHRcdFx0cGFzcy5maWxlVHlwZSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJlamVjdChlcnJvcik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmVzb2x2ZShvdXRwdXRTdHJlYW0pO1xuXHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdHJlamVjdChlcnJvcik7XG5cdFx0XHRcdH1cblx0XHRcdH0pKCk7XG5cdFx0fSk7XG5cdH0pO1xufVxuXG5leHBvcnQgY29uc3Qgc3VwcG9ydGVkRXh0ZW5zaW9ucyA9IG5ldyBTZXQoZXh0ZW5zaW9ucyk7XG5leHBvcnQgY29uc3Qgc3VwcG9ydGVkTWltZVR5cGVzID0gbmV3IFNldChtaW1lVHlwZXMpO1xuIiwiaW1wb3J0IHtmaWxlVHlwZUZyb21CdWZmZXJ9IGZyb20gJ2ZpbGUtdHlwZSc7XG5cbmNvbnN0IGltYWdlRXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuXHQnanBnJyxcblx0J3BuZycsXG5cdCdnaWYnLFxuXHQnd2VicCcsXG5cdCdmbGlmJyxcblx0J2NyMicsXG5cdCd0aWYnLFxuXHQnYm1wJyxcblx0J2p4cicsXG5cdCdwc2QnLFxuXHQnaWNvJyxcblx0J2JwZycsXG5cdCdqcDInLFxuXHQnanBtJyxcblx0J2pweCcsXG5cdCdoZWljJyxcblx0J2N1cicsXG5cdCdkY20nLFxuXHQnYXZpZicsXG5dKTtcblxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gaW1hZ2VUeXBlKGlucHV0KSB7XG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZpbGVUeXBlRnJvbUJ1ZmZlcihpbnB1dCk7XG5cdHJldHVybiBpbWFnZUV4dGVuc2lvbnMuaGFzKHJlc3VsdD8uZXh0KSAmJiByZXN1bHQ7XG59XG5cbmV4cG9ydCBjb25zdCBtaW5pbXVtQnl0ZXMgPSA0MTAwO1xuIiwiaW1wb3J0IHsgcmVzb2x2ZSwgZXh0bmFtZSwgcmVsYXRpdmUsIGpvaW4sIHBhcnNlLCBwb3NpeCB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gXCJzdHJlYW1cIjtcbmltcG9ydCB7IGNsaXBib2FyZCB9IGZyb20gXCJlbGVjdHJvblwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElTdHJpbmdLZXlNYXA8VD4ge1xuICBba2V5OiBzdHJpbmddOiBUO1xufVxuXG5jb25zdCBJTUFHRV9FWFRfTElTVCA9IFtcbiAgXCIucG5nXCIsXG4gIFwiLmpwZ1wiLFxuICBcIi5qcGVnXCIsXG4gIFwiLmJtcFwiLFxuICBcIi5naWZcIixcbiAgXCIuc3ZnXCIsXG4gIFwiLnRpZmZcIixcbiAgXCIud2VicFwiLFxuICBcIi5hdmlmXCIsXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNBbkltYWdlKGV4dDogc3RyaW5nKSB7XG4gIHJldHVybiBJTUFHRV9FWFRfTElTVC5pbmNsdWRlcyhleHQudG9Mb3dlckNhc2UoKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNBc3NldFR5cGVBbkltYWdlKHBhdGg6IHN0cmluZyk6IEJvb2xlYW4ge1xuICByZXR1cm4gaXNBbkltYWdlKGV4dG5hbWUocGF0aCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T1MoKSB7XG4gIGNvbnN0IHsgYXBwVmVyc2lvbiB9ID0gbmF2aWdhdG9yO1xuICBpZiAoYXBwVmVyc2lvbi5pbmRleE9mKFwiV2luXCIpICE9PSAtMSkge1xuICAgIHJldHVybiBcIldpbmRvd3NcIjtcbiAgfSBlbHNlIGlmIChhcHBWZXJzaW9uLmluZGV4T2YoXCJNYWNcIikgIT09IC0xKSB7XG4gICAgcmV0dXJuIFwiTWFjT1NcIjtcbiAgfSBlbHNlIGlmIChhcHBWZXJzaW9uLmluZGV4T2YoXCJYMTFcIikgIT09IC0xKSB7XG4gICAgcmV0dXJuIFwiTGludXhcIjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gXCJVbmtub3duIE9TXCI7XG4gIH1cbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdHJlYW1Ub1N0cmluZyhzdHJlYW06IFJlYWRhYmxlKSB7XG4gIGNvbnN0IGNodW5rcyA9IFtdO1xuXG4gIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2Ygc3RyZWFtKSB7XG4gICAgY2h1bmtzLnB1c2goQnVmZmVyLmZyb20oY2h1bmspKTtcbiAgfVxuXG4gIHJldHVybiBCdWZmZXIuY29uY2F0KGNodW5rcykudG9TdHJpbmcoXCJ1dGYtOFwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVybEFzc2V0KHVybDogc3RyaW5nKSB7XG4gIHJldHVybiAodXJsID0gdXJsLnN1YnN0cigxICsgdXJsLmxhc3RJbmRleE9mKFwiL1wiKSkuc3BsaXQoXCI/XCIpWzBdKS5zcGxpdChcbiAgICBcIiNcIlxuICApWzBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb3B5SW1hZ2VGaWxlKCkge1xuICBsZXQgZmlsZVBhdGggPSBcIlwiO1xuICBjb25zdCBvcyA9IGdldE9TKCk7XG5cbiAgaWYgKG9zID09PSBcIldpbmRvd3NcIikge1xuICAgIHZhciByYXdGaWxlUGF0aCA9IGNsaXBib2FyZC5yZWFkKFwiRmlsZU5hbWVXXCIpO1xuICAgIGZpbGVQYXRoID0gcmF3RmlsZVBhdGgucmVwbGFjZShuZXcgUmVnRXhwKFN0cmluZy5mcm9tQ2hhckNvZGUoMCksIFwiZ1wiKSwgXCJcIik7XG4gIH0gZWxzZSBpZiAob3MgPT09IFwiTWFjT1NcIikge1xuICAgIGZpbGVQYXRoID0gY2xpcGJvYXJkLnJlYWQoXCJwdWJsaWMuZmlsZS11cmxcIikucmVwbGFjZShcImZpbGU6Ly9cIiwgXCJcIik7XG4gIH0gZWxzZSB7XG4gICAgZmlsZVBhdGggPSBcIlwiO1xuICB9XG4gIHJldHVybiBpc0Fzc2V0VHlwZUFuSW1hZ2UoZmlsZVBhdGgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGFzdEltYWdlKGxpc3Q6IHN0cmluZ1tdKSB7XG4gIGNvbnN0IHJldmVyc2VkTGlzdCA9IGxpc3QucmV2ZXJzZSgpO1xuICBsZXQgbGFzdEltYWdlO1xuICByZXZlcnNlZExpc3QuZm9yRWFjaChpdGVtID0+IHtcbiAgICBpZiAoaXRlbSAmJiBpdGVtLnN0YXJ0c1dpdGgoXCJodHRwXCIpKSB7XG4gICAgICBsYXN0SW1hZ2UgPSBpdGVtO1xuICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGxhc3RJbWFnZTtcbn1cblxuaW50ZXJmYWNlIEFueU9iaiB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5VG9PYmplY3Q8VCBleHRlbmRzIEFueU9iaj4oXG4gIGFycjogVFtdLFxuICBrZXk6IHN0cmluZ1xuKTogeyBba2V5OiBzdHJpbmddOiBUIH0ge1xuICBjb25zdCBvYmo6IHsgW2tleTogc3RyaW5nXTogVCB9ID0ge307XG4gIGFyci5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgIG9ialtlbGVtZW50W2tleV1dID0gZWxlbWVudDtcbiAgfSk7XG4gIHJldHVybiBvYmo7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWZmZXJUb0FycmF5QnVmZmVyKGJ1ZmZlcjogQnVmZmVyKSB7XG4gIGNvbnN0IGFycmF5QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ1ZmZlci5sZW5ndGgpO1xuICBjb25zdCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKykge1xuICAgIHZpZXdbaV0gPSBidWZmZXJbaV07XG4gIH1cbiAgcmV0dXJuIGFycmF5QnVmZmVyO1xufVxuIiwiY29uc3QgZT1nbG9iYWxUaGlzLkJsb2Isbz1nbG9iYWxUaGlzLkZpbGUsYT1nbG9iYWxUaGlzLkZvcm1EYXRhLHM9Z2xvYmFsVGhpcy5IZWFkZXJzLHQ9Z2xvYmFsVGhpcy5SZXF1ZXN0LGg9Z2xvYmFsVGhpcy5SZXNwb25zZSxpPWdsb2JhbFRoaXMuQWJvcnRDb250cm9sbGVyLGw9Z2xvYmFsVGhpcy5mZXRjaHx8KCgpPT57dGhyb3cgbmV3IEVycm9yKFwiW25vZGUtZmV0Y2gtbmF0aXZlXSBGYWlsZWQgdG8gZmV0Y2g6IGBnbG9iYWxUaGlzLmZldGNoYCBpcyBub3QgYXZhaWxhYmxlIVwiKX0pO2V4cG9ydHtpIGFzIEFib3J0Q29udHJvbGxlcixlIGFzIEJsb2IsbyBhcyBGaWxlLGEgYXMgRm9ybURhdGEscyBhcyBIZWFkZXJzLHQgYXMgUmVxdWVzdCxoIGFzIFJlc3BvbnNlLGwgYXMgZGVmYXVsdCxsIGFzIGZldGNofTtcbiIsImltcG9ydCB7IHJlYWRGaWxlIH0gZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBmZXRjaCwgRm9ybURhdGEgfSBmcm9tIFwibm9kZS1mZXRjaC1uYXRpdmVcIjtcblxuaW1wb3J0IHsgUGx1Z2luU2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5nXCI7XG5pbXBvcnQgeyBzdHJlYW1Ub1N0cmluZywgZ2V0TGFzdEltYWdlLCBidWZmZXJUb0FycmF5QnVmZmVyIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IGV4ZWMsIHNwYXduU3luYywgc3Bhd24gfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgTm90aWNlLCByZXF1ZXN0VXJsIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgaW1hZ2VBdXRvVXBsb2FkUGx1Z2luIGZyb20gXCIuL21haW5cIjtcblxuZXhwb3J0IGludGVyZmFjZSBQaWNHb1Jlc3BvbnNlIHtcbiAgbXNnOiBzdHJpbmc7XG4gIHJlc3VsdDogc3RyaW5nW107XG4gIGZ1bGxSZXN1bHQ6IFJlY29yZDxzdHJpbmcsIGFueT5bXTtcbn1cblxuZXhwb3J0IGNsYXNzIFBpY0dvVXBsb2FkZXIge1xuICBzZXR0aW5nczogUGx1Z2luU2V0dGluZ3M7XG4gIHBsdWdpbjogaW1hZ2VBdXRvVXBsb2FkUGx1Z2luO1xuXG4gIGNvbnN0cnVjdG9yKHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncywgcGx1Z2luOiBpbWFnZUF1dG9VcGxvYWRQbHVnaW4pIHtcbiAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XG4gIH1cblxuICBhc3luYyB1cGxvYWRGaWxlcyhmaWxlTGlzdDogQXJyYXk8c3RyaW5nPik6IFByb21pc2U8YW55PiB7XG4gICAgbGV0IHJlc3BvbnNlOiBhbnk7XG4gICAgbGV0IGRhdGE6IFBpY0dvUmVzcG9uc2U7XG5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy5yZW1vdGVTZXJ2ZXJNb2RlKSB7XG4gICAgICBjb25zdCBmaWxlcyA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBmaWxlID0gZmlsZUxpc3RbaV07XG4gICAgICAgIGNvbnN0IGJ1ZmZlcjogQnVmZmVyID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIHJlYWRGaWxlKGZpbGUsIChlcnIsIGRhdGEpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBidWZmZXJUb0FycmF5QnVmZmVyKGJ1ZmZlcik7XG4gICAgICAgIGZpbGVzLnB1c2gobmV3IEZpbGUoW2FycmF5QnVmZmVyXSwgZmlsZSkpO1xuICAgICAgfVxuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnVwbG9hZEZpbGVCeURhdGEoZmlsZXMpO1xuICAgICAgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0VXJsKHtcbiAgICAgICAgdXJsOiB0aGlzLnNldHRpbmdzLnVwbG9hZFNlcnZlcixcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVyczogeyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGxpc3Q6IGZpbGVMaXN0IH0pLFxuICAgICAgfSk7XG4gICAgICBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbjtcbiAgICB9XG5cbiAgICAvLyBwaWNsaXN0XG4gICAgaWYgKGRhdGEuZnVsbFJlc3VsdCkge1xuICAgICAgY29uc3QgdXBsb2FkVXJsRnVsbFJlc3VsdExpc3QgPSBkYXRhLmZ1bGxSZXN1bHQgfHwgW107XG4gICAgICB0aGlzLnNldHRpbmdzLnVwbG9hZGVkSW1hZ2VzID0gW1xuICAgICAgICAuLi4odGhpcy5zZXR0aW5ncy51cGxvYWRlZEltYWdlcyB8fCBbXSksXG4gICAgICAgIC4uLnVwbG9hZFVybEZ1bGxSZXN1bHRMaXN0LFxuICAgICAgXTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGFzeW5jIHVwbG9hZEZpbGVCeURhdGEoZmlsZUxpc3Q6IEZpbGVMaXN0IHwgRmlsZVtdKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgZm9ybS5hcHBlbmQoXCJsaXN0XCIsIGZpbGVMaXN0W2ldKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIGJvZHk6IGZvcm0sXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godGhpcy5zZXR0aW5ncy51cGxvYWRTZXJ2ZXIsIG9wdGlvbnMpO1xuICAgIGNvbnNvbGUubG9nKFwicmVzcG9uc2VcIiwgcmVzcG9uc2UpO1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIGFzeW5jIHVwbG9hZEZpbGVCeUNsaXBib2FyZChmaWxlTGlzdD86IEZpbGVMaXN0KTogUHJvbWlzZTxhbnk+IHtcbiAgICBsZXQgZGF0YTogUGljR29SZXNwb25zZTtcbiAgICBsZXQgcmVzOiBhbnk7XG5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy5yZW1vdGVTZXJ2ZXJNb2RlKSB7XG4gICAgICByZXMgPSBhd2FpdCB0aGlzLnVwbG9hZEZpbGVCeURhdGEoZmlsZUxpc3QpO1xuICAgICAgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcyA9IGF3YWl0IHJlcXVlc3RVcmwoe1xuICAgICAgICB1cmw6IHRoaXMuc2V0dGluZ3MudXBsb2FkU2VydmVyLFxuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgfSk7XG5cbiAgICAgIGRhdGEgPSBhd2FpdCByZXMuanNvbjtcbiAgICB9XG5cbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2RlOiAtMSxcbiAgICAgICAgbXNnOiBkYXRhLm1zZyxcbiAgICAgICAgZGF0YTogXCJcIixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gcGljbGlzdFxuICAgIGlmIChkYXRhLmZ1bGxSZXN1bHQpIHtcbiAgICAgIGNvbnN0IHVwbG9hZFVybEZ1bGxSZXN1bHRMaXN0ID0gZGF0YS5mdWxsUmVzdWx0IHx8IFtdO1xuICAgICAgdGhpcy5zZXR0aW5ncy51cGxvYWRlZEltYWdlcyA9IFtcbiAgICAgICAgLi4uKHRoaXMuc2V0dGluZ3MudXBsb2FkZWRJbWFnZXMgfHwgW10pLFxuICAgICAgICAuLi51cGxvYWRVcmxGdWxsUmVzdWx0TGlzdCxcbiAgICAgIF07XG4gICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogMCxcbiAgICAgIG1zZzogXCJzdWNjZXNzXCIsXG4gICAgICBkYXRhOiB0eXBlb2YgZGF0YS5yZXN1bHQgPT0gXCJzdHJpbmdcIiA/IGRhdGEucmVzdWx0IDogZGF0YS5yZXN1bHRbMF0sXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGljR29Db3JlVXBsb2FkZXIge1xuICBzZXR0aW5nczogUGx1Z2luU2V0dGluZ3M7XG4gIHBsdWdpbjogaW1hZ2VBdXRvVXBsb2FkUGx1Z2luO1xuXG4gIGNvbnN0cnVjdG9yKHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncywgcGx1Z2luOiBpbWFnZUF1dG9VcGxvYWRQbHVnaW4pIHtcbiAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XG4gIH1cblxuICBhc3luYyB1cGxvYWRGaWxlcyhmaWxlTGlzdDogQXJyYXk8U3RyaW5nPik6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgbGVuZ3RoID0gZmlsZUxpc3QubGVuZ3RoO1xuICAgIGxldCBjbGkgPSB0aGlzLnNldHRpbmdzLnBpY2dvQ29yZVBhdGggfHwgXCJwaWNnb1wiO1xuICAgIGxldCBjb21tYW5kID0gYCR7Y2xpfSB1cGxvYWQgJHtmaWxlTGlzdFxuICAgICAgLm1hcChpdGVtID0+IGBcIiR7aXRlbX1cImApXG4gICAgICAuam9pbihcIiBcIil9YDtcblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuZXhlYyhjb21tYW5kKTtcbiAgICBjb25zdCBzcGxpdExpc3QgPSByZXMuc3BsaXQoXCJcXG5cIik7XG4gICAgY29uc3Qgc3BsaXRMaXN0TGVuZ3RoID0gc3BsaXRMaXN0Lmxlbmd0aDtcblxuICAgIGNvbnN0IGRhdGEgPSBzcGxpdExpc3Quc3BsaWNlKHNwbGl0TGlzdExlbmd0aCAtIDEgLSBsZW5ndGgsIGxlbmd0aCk7XG5cbiAgICBpZiAocmVzLmluY2x1ZGVzKFwiUGljR28gRVJST1JcIikpIHtcbiAgICAgIGNvbnNvbGUubG9nKGNvbW1hbmQsIHJlcyk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtc2c6IFwi5aSx6LSlXCIsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICByZXN1bHQ6IGRhdGEsXG4gICAgICB9O1xuICAgIH1cbiAgICAvLyB7c3VjY2Vzczp0cnVlLHJlc3VsdDpbXX1cbiAgfVxuXG4gIC8vIFBpY0dvLUNvcmUg5LiK5Lyg5aSE55CGXG4gIGFzeW5jIHVwbG9hZEZpbGVCeUNsaXBib2FyZCgpIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnVwbG9hZEJ5Q2xpcCgpO1xuICAgIGNvbnN0IHNwbGl0TGlzdCA9IHJlcy5zcGxpdChcIlxcblwiKTtcbiAgICBjb25zdCBsYXN0SW1hZ2UgPSBnZXRMYXN0SW1hZ2Uoc3BsaXRMaXN0KTtcblxuICAgIGlmIChsYXN0SW1hZ2UpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IDAsXG4gICAgICAgIG1zZzogXCJzdWNjZXNzXCIsXG4gICAgICAgIGRhdGE6IGxhc3RJbWFnZSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKHNwbGl0TGlzdCk7XG5cbiAgICAgIC8vIG5ldyBOb3RpY2UoYFwiUGxlYXNlIGNoZWNrIFBpY0dvLUNvcmUgY29uZmlnXCJcXG4ke3Jlc31gKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IC0xLFxuICAgICAgICBtc2c6IGBcIlBsZWFzZSBjaGVjayBQaWNHby1Db3JlIGNvbmZpZ1wiXFxuJHtyZXN9YCxcbiAgICAgICAgZGF0YTogXCJcIixcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLy8gUGljR28tQ29yZeeahOWJquWIh+S4iuS8oOWPjemmiFxuICBhc3luYyB1cGxvYWRCeUNsaXAoKSB7XG4gICAgbGV0IGNvbW1hbmQ7XG4gICAgaWYgKHRoaXMuc2V0dGluZ3MucGljZ29Db3JlUGF0aCkge1xuICAgICAgY29tbWFuZCA9IGAke3RoaXMuc2V0dGluZ3MucGljZ29Db3JlUGF0aH0gdXBsb2FkYDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tbWFuZCA9IGBwaWNnbyB1cGxvYWRgO1xuICAgIH1cbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmV4ZWMoY29tbWFuZCk7XG4gICAgLy8gY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zcGF3bkNoaWxkKCk7XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgYXN5bmMgZXhlYyhjb21tYW5kOiBzdHJpbmcpIHtcbiAgICBsZXQgeyBzdGRvdXQgfSA9IGF3YWl0IGV4ZWMoY29tbWFuZCk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgc3RyZWFtVG9TdHJpbmcoc3Rkb3V0KTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgYXN5bmMgc3Bhd25DaGlsZCgpIHtcbiAgICBjb25zdCB7IHNwYXduIH0gPSByZXF1aXJlKFwiY2hpbGRfcHJvY2Vzc1wiKTtcbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKFwicGljZ29cIiwgW1widXBsb2FkXCJdLCB7XG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGxldCBkYXRhID0gXCJcIjtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIGNoaWxkLnN0ZG91dCkge1xuICAgICAgZGF0YSArPSBjaHVuaztcbiAgICB9XG4gICAgbGV0IGVycm9yID0gXCJcIjtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIGNoaWxkLnN0ZGVycikge1xuICAgICAgZXJyb3IgKz0gY2h1bms7XG4gICAgfVxuICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY2hpbGQub24oXCJjbG9zZVwiLCByZXNvbHZlKTtcbiAgICB9KTtcblxuICAgIGlmIChleGl0Q29kZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBzdWJwcm9jZXNzIGVycm9yIGV4aXQgJHtleGl0Q29kZX0sICR7ZXJyb3J9YCk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJU3RyaW5nS2V5TWFwIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IEFwcCwgcmVxdWVzdFVybCB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IGltYWdlQXV0b1VwbG9hZFBsdWdpbiBmcm9tIFwiLi9tYWluXCI7XG5cbmV4cG9ydCBjbGFzcyBQaWNHb0RlbGV0ZXIge1xuICBwbHVnaW46IGltYWdlQXV0b1VwbG9hZFBsdWdpbjtcblxuICBjb25zdHJ1Y3RvcihwbHVnaW46IGltYWdlQXV0b1VwbG9hZFBsdWdpbikge1xuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlSW1hZ2UoY29uZmlnTWFwOiBJU3RyaW5nS2V5TWFwPGFueT5bXSkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdFVybCh7XG4gICAgICB1cmw6IHRoaXMucGx1Z2luLnNldHRpbmdzLmRlbGV0ZVNlcnZlcixcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICBoZWFkZXJzOiB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGxpc3Q6IGNvbmZpZ01hcCxcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSByZXNwb25zZS5qc29uO1xuICAgIHJldHVybiBkYXRhO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNYXJrZG93blZpZXcsIEFwcCB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHsgcGFyc2UgfSBmcm9tIFwicGF0aFwiO1xuXG5pbnRlcmZhY2UgSW1hZ2Uge1xuICBwYXRoOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgc291cmNlOiBzdHJpbmc7XG59XG4vLyAhW10oLi9kc2EvYWEucG5nKSBsb2NhbCBpbWFnZSBzaG91bGQgaGFzIGV4dFxuLy8gIVtdKGh0dHBzOi8vZGFzZGFzZGEpIGludGVybmV0IGltYWdlIHNob3VsZCBub3QgaGFzIGV4dFxuY29uc3QgUkVHRVhfRklMRSA9IC9cXCFcXFsoLio/KVxcXVxcKChcXFMrXFwuXFx3KylcXCl8XFwhXFxbKC4qPylcXF1cXCgoaHR0cHM/OlxcL1xcLy4qPylcXCkvZztcbmNvbnN0IFJFR0VYX1dJS0lfRklMRSA9IC9cXCFcXFtcXFsoLio/KShcXHMqP1xcfC4qPyk/XFxdXFxdL2c7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIZWxwZXIge1xuICBhcHA6IEFwcDtcblxuICBjb25zdHJ1Y3RvcihhcHA6IEFwcCkge1xuICAgIHRoaXMuYXBwID0gYXBwO1xuICB9XG4gIGdldEZyb250bWF0dGVyVmFsdWUoa2V5OiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogYW55ID0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZmlsZSA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVGaWxlKCk7XG4gICAgaWYgKCFmaWxlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBwYXRoID0gZmlsZS5wYXRoO1xuICAgIGNvbnN0IGNhY2hlID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShwYXRoKTtcblxuICAgIGxldCB2YWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICBpZiAoY2FjaGU/LmZyb250bWF0dGVyICYmIGNhY2hlLmZyb250bWF0dGVyLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIHZhbHVlID0gY2FjaGUuZnJvbnRtYXR0ZXJba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgZ2V0RWRpdG9yKCkge1xuICAgIGNvbnN0IG1kVmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XG4gICAgaWYgKG1kVmlldykge1xuICAgICAgcmV0dXJuIG1kVmlldy5lZGl0b3I7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICBnZXRWYWx1ZSgpIHtcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmdldEVkaXRvcigpO1xuICAgIHJldHVybiBlZGl0b3IuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHNldFZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmdldEVkaXRvcigpO1xuICAgIGNvbnN0IHsgbGVmdCwgdG9wIH0gPSBlZGl0b3IuZ2V0U2Nyb2xsSW5mbygpO1xuICAgIGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpO1xuXG4gICAgZWRpdG9yLnNldFZhbHVlKHZhbHVlKTtcbiAgICBlZGl0b3Iuc2Nyb2xsVG8obGVmdCwgdG9wKTtcbiAgICBlZGl0b3Iuc2V0Q3Vyc29yKHBvc2l0aW9uKTtcbiAgfVxuXG4gIC8vIGdldCBhbGwgZmlsZSB1cmxzLCBpbmNsdWRlIGxvY2FsIGFuZCBpbnRlcm5ldFxuICBnZXRBbGxGaWxlcygpOiBJbWFnZVtdIHtcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmdldEVkaXRvcigpO1xuICAgIGxldCB2YWx1ZSA9IGVkaXRvci5nZXRWYWx1ZSgpO1xuICAgIHJldHVybiB0aGlzLmdldEltYWdlTGluayh2YWx1ZSk7XG4gIH1cbiAgZ2V0SW1hZ2VMaW5rKHZhbHVlOiBzdHJpbmcpOiBJbWFnZVtdIHtcbiAgICBjb25zdCBtYXRjaGVzID0gdmFsdWUubWF0Y2hBbGwoUkVHRVhfRklMRSk7XG4gICAgY29uc3QgV2lraU1hdGNoZXMgPSB2YWx1ZS5tYXRjaEFsbChSRUdFWF9XSUtJX0ZJTEUpO1xuXG4gICAgbGV0IGZpbGVBcnJheTogSW1hZ2VbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBtYXRjaFswXTtcblxuICAgICAgbGV0IG5hbWUgPSBtYXRjaFsxXTtcbiAgICAgIGxldCBwYXRoID0gbWF0Y2hbMl07XG4gICAgICBpZiAobmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5hbWUgPSBtYXRjaFszXTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGF0aCA9IG1hdGNoWzRdO1xuICAgICAgfVxuXG4gICAgICBmaWxlQXJyYXkucHVzaCh7XG4gICAgICAgIHBhdGg6IHBhdGgsXG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBXaWtpTWF0Y2hlcykge1xuICAgICAgbGV0IG5hbWUgPSBwYXJzZShtYXRjaFsxXSkubmFtZTtcbiAgICAgIGNvbnN0IHBhdGggPSBtYXRjaFsxXTtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IG1hdGNoWzBdO1xuICAgICAgaWYgKG1hdGNoWzJdKSB7XG4gICAgICAgIG5hbWUgPSBgJHtuYW1lfSR7bWF0Y2hbMl19YDtcbiAgICAgIH1cbiAgICAgIGZpbGVBcnJheS5wdXNoKHtcbiAgICAgICAgcGF0aDogcGF0aCxcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmlsZUFycmF5O1xuICB9XG5cbiAgaGFzQmxhY2tEb21haW4oc3JjOiBzdHJpbmcsIGJsYWNrRG9tYWluczogc3RyaW5nKSB7XG4gICAgaWYgKGJsYWNrRG9tYWlucy50cmltKCkgPT09IFwiXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgYmxhY2tEb21haW5MaXN0ID0gYmxhY2tEb21haW5zLnNwbGl0KFwiLFwiKS5maWx0ZXIoaXRlbSA9PiBpdGVtICE9PSBcIlwiKTtcbiAgICBsZXQgdXJsID0gbmV3IFVSTChzcmMpO1xuICAgIGNvbnN0IGRvbWFpbiA9IHVybC5ob3N0bmFtZTtcblxuICAgIHJldHVybiBibGFja0RvbWFpbkxpc3Quc29tZShibGFja0RvbWFpbiA9PiBkb21haW4uaW5jbHVkZXMoYmxhY2tEb21haW4pKTtcbiAgfVxufVxuIiwiLy8g2KfZhNi52LHYqNmK2KlcblxuZXhwb3J0IGRlZmF1bHQge307XG4iLCIvLyDEjWXFoXRpbmFcblxuZXhwb3J0IGRlZmF1bHQge307XG4iLCIvLyBEYW5za1xuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsIi8vIERldXRzY2hcblxuZXhwb3J0IGRlZmF1bHQge307IiwiLy8gRW5nbGlzaFxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC8vIHNldHRpbmcudHNcbiAgXCJQbHVnaW4gU2V0dGluZ3NcIjogXCJQbHVnaW4gU2V0dGluZ3NcIixcbiAgXCJBdXRvIHBhc3RlZCB1cGxvYWRcIjogXCJBdXRvIHBhc3RlZCB1cGxvYWRcIixcbiAgXCJJZiB5b3Ugc2V0IHRoaXMgdmFsdWUgdHJ1ZSwgd2hlbiB5b3UgcGFzdGUgaW1hZ2UsIGl0IHdpbGwgYmUgYXV0byB1cGxvYWRlZCh5b3Ugc2hvdWxkIHNldCB0aGUgcGljR28gc2VydmVyIHJpZ2h0bHkpXCI6XG4gICAgXCJJZiB5b3Ugc2V0IHRoaXMgdmFsdWUgdHJ1ZSwgd2hlbiB5b3UgcGFzdGUgaW1hZ2UsIGl0IHdpbGwgYmUgYXV0byB1cGxvYWRlZCh5b3Ugc2hvdWxkIHNldCB0aGUgcGljR28gc2VydmVyIHJpZ2h0bHkpXCIsXG4gIFwiRGVmYXVsdCB1cGxvYWRlclwiOiBcIkRlZmF1bHQgdXBsb2FkZXJcIixcbiAgXCJQaWNHbyBzZXJ2ZXJcIjogXCJQaWNHbyBzZXJ2ZXIgdXBsb2FkIHJvdXRlXCIsXG4gIFwiUGljR28gc2VydmVyIGRlc2NcIjpcbiAgICBcInVwbG9hZCByb3V0ZSwgdXNlIFBpY0xpc3Qgd2lsbCBiZSBhYmxlIHRvIHNldCBwaWNiZWQgYW5kIGNvbmZpZyB0aHJvdWdoIHF1ZXJ5XCIsXG4gIFwiUGxlYXNlIGlucHV0IFBpY0dvIHNlcnZlclwiOiBcIlBsZWFzZSBpbnB1dCB1cGxvYWQgcm91dGVcIixcbiAgXCJQaWNHbyBkZWxldGUgc2VydmVyXCI6XG4gICAgXCJQaWNHbyBzZXJ2ZXIgZGVsZXRlIHJvdXRlKHlvdSBuZWVkIHRvIHVzZSBQaWNMaXN0IGFwcClcIixcbiAgXCJQaWNMaXN0IGRlc2NcIjogXCJTZWFyY2ggUGljTGlzdCBvbiBHaXRodWIgdG8gZG93bmxvYWQgYW5kIGluc3RhbGxcIixcbiAgXCJQbGVhc2UgaW5wdXQgUGljR28gZGVsZXRlIHNlcnZlclwiOiBcIlBsZWFzZSBpbnB1dCBkZWxldGUgc2VydmVyXCIsXG4gIFwiRGVsZXRlIGltYWdlIHVzaW5nIFBpY0xpc3RcIjogXCJEZWxldGUgaW1hZ2UgdXNpbmcgUGljTGlzdFwiLFxuICBcIlBpY0dvLUNvcmUgcGF0aFwiOiBcIlBpY0dvLUNvcmUgcGF0aFwiLFxuICBcIkRlbGV0ZSBzdWNjZXNzZnVsbHlcIjogXCJEZWxldGUgc3VjY2Vzc2Z1bGx5XCIsXG4gIFwiRGVsZXRlIGZhaWxlZFwiOiBcIkRlbGV0ZSBmYWlsZWRcIixcbiAgXCJJbWFnZSBzaXplIHN1ZmZpeFwiOiBcIkltYWdlIHNpemUgc3VmZml4XCIsXG4gIFwiSW1hZ2Ugc2l6ZSBzdWZmaXggRGVzY3JpcHRpb25cIjogXCJsaWtlIHwzMDAgZm9yIHJlc2l6ZSBpbWFnZSBpbiBvYi5cIixcbiAgXCJQbGVhc2UgaW5wdXQgaW1hZ2Ugc2l6ZSBzdWZmaXhcIjogXCJQbGVhc2UgaW5wdXQgaW1hZ2Ugc2l6ZSBzdWZmaXhcIixcbiAgXCJFcnJvciwgY291bGQgbm90IGRlbGV0ZVwiOiBcIkVycm9yLCBjb3VsZCBub3QgZGVsZXRlXCIsXG4gIFwiUGxlYXNlIGlucHV0IFBpY0dvLUNvcmUgcGF0aCwgZGVmYXVsdCB1c2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXNcIjpcbiAgICBcIlBsZWFzZSBpbnB1dCBQaWNHby1Db3JlIHBhdGgsIGRlZmF1bHQgdXNpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzXCIsXG4gIFwiV29yayBvbiBuZXR3b3JrXCI6IFwiV29yayBvbiBuZXR3b3JrXCIsXG4gIFwiV29yayBvbiBuZXR3b3JrIERlc2NyaXB0aW9uXCI6XG4gICAgXCJBbGxvdyB1cGxvYWQgbmV0d29yayBpbWFnZSBieSAnVXBsb2FkIGFsbCcgY29tbWFuZC5cXG4gT3Igd2hlbiB5b3UgcGFzdGUsIG1kIHN0YW5kYXJkIGltYWdlIGxpbmsgaW4geW91ciBjbGlwYm9hcmQgd2lsbCBiZSBhdXRvIHVwbG9hZC5cIixcbiAgZml4UGF0aDogXCJmaXhQYXRoXCIsXG4gIGZpeFBhdGhXYXJuaW5nOlxuICAgIFwiVGhpcyBvcHRpb24gaXMgdXNlZCB0byBmaXggUGljR28tY29yZSB1cGxvYWQgZmFpbHVyZXMgb24gTGludXggYW5kIE1hYy4gSXQgbW9kaWZpZXMgdGhlIFBBVEggdmFyaWFibGUgd2l0aGluIE9ic2lkaWFuLiBJZiBPYnNpZGlhbiBlbmNvdW50ZXJzIGFueSBidWdzLCB0dXJuIG9mZiB0aGUgb3B0aW9uLCB0cnkgYWdhaW4hIFwiLFxuICBcIlVwbG9hZCB3aGVuIGNsaXBib2FyZCBoYXMgaW1hZ2UgYW5kIHRleHQgdG9nZXRoZXJcIjpcbiAgICBcIlVwbG9hZCB3aGVuIGNsaXBib2FyZCBoYXMgaW1hZ2UgYW5kIHRleHQgdG9nZXRoZXJcIixcbiAgXCJXaGVuIHlvdSBjb3B5LCBzb21lIGFwcGxpY2F0aW9uIGxpa2UgRXhjZWwgd2lsbCBpbWFnZSBhbmQgdGV4dCB0byBjbGlwYm9hcmQsIHlvdSBjYW4gdXBsb2FkIG9yIG5vdC5cIjpcbiAgICBcIldoZW4geW91IGNvcHksIHNvbWUgYXBwbGljYXRpb24gbGlrZSBFeGNlbCB3aWxsIGltYWdlIGFuZCB0ZXh0IHRvIGNsaXBib2FyZCwgeW91IGNhbiB1cGxvYWQgb3Igbm90LlwiLFxuICBcIk5ldHdvcmsgRG9tYWluIEJsYWNrIExpc3RcIjogXCJOZXR3b3JrIERvbWFpbiBCbGFjayBMaXN0XCIsXG4gIFwiTmV0d29yayBEb21haW4gQmxhY2sgTGlzdCBEZXNjcmlwdGlvblwiOlxuICAgIFwiSW1hZ2UgaW4gdGhlIGRvbWFpbiBsaXN0IHdpbGwgbm90IGJlIHVwbG9hZCx1c2UgY29tbWEgc2VwYXJhdGVkXCIsXG4gIFwiRGVsZXRlIHNvdXJjZSBmaWxlIGFmdGVyIHlvdSB1cGxvYWQgZmlsZVwiOlxuICAgIFwiRGVsZXRlIHNvdXJjZSBmaWxlIGFmdGVyIHlvdSB1cGxvYWQgZmlsZVwiLFxuICBcIkRlbGV0ZSBzb3VyY2UgZmlsZSBpbiBvYiBhc3NldHMgYWZ0ZXIgeW91IHVwbG9hZCBmaWxlLlwiOlxuICAgIFwiRGVsZXRlIHNvdXJjZSBmaWxlIGluIG9iIGFzc2V0cyBhZnRlciB5b3UgdXBsb2FkIGZpbGUuXCIsXG4gIFwiSW1hZ2UgZGVzY1wiOiBcIkltYWdlIGRlc2NcIixcbiAgcmVzZXJ2ZTogXCJkZWZhdWx0XCIsXG4gIFwicmVtb3ZlIGFsbFwiOiBcIm5vbmVcIixcbiAgXCJyZW1vdmUgZGVmYXVsdFwiOiBcInJlbW92ZSBpbWFnZS5wbmdcIixcbiAgXCJSZW1vdGUgc2VydmVyIG1vZGVcIjogXCJSZW1vdGUgc2VydmVyIG1vZGVcIixcbiAgXCJSZW1vdGUgc2VydmVyIG1vZGUgZGVzY1wiOlxuICAgIFwiSWYgeW91IGhhdmUgZGVwbG95ZWQgcGljbGlzdC1jb3JlIG9yIHBpY2xpc3Qgb24gdGhlIHNlcnZlci5cIixcbiAgXCJDYW4gbm90IGZpbmQgaW1hZ2UgZmlsZVwiOiBcIkNhbiBub3QgZmluZCBpbWFnZSBmaWxlXCIsXG4gIFwiRmlsZSBoYXMgYmVlbiBjaGFuZ2VkZCwgdXBsb2FkIGZhaWx1cmVcIjpcbiAgICBcIkZpbGUgaGFzIGJlZW4gY2hhbmdlZGQsIHVwbG9hZCBmYWlsdXJlXCIsXG4gIFwiRmlsZSBoYXMgYmVlbiBjaGFuZ2VkZCwgZG93bmxvYWQgZmFpbHVyZVwiOlxuICAgIFwiRmlsZSBoYXMgYmVlbiBjaGFuZ2VkZCwgZG93bmxvYWQgZmFpbHVyZVwiLFxuICBcIldhcm5pbmc6IHVwbG9hZCBmaWxlcyBpcyBkaWZmZXJlbnQgb2YgcmVjaXZlciBmaWxlcyBmcm9tIGFwaVwiOlxuICAgIFwiV2FybmluZzogdXBsb2FkIGZpbGVzIG51bSBpcyBkaWZmZXJlbnQgb2YgcmVjaXZlciBmaWxlcyBmcm9tIGFwaVwiLFxufTtcbiIsIi8vIEJyaXRpc2ggRW5nbGlzaFxuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsIi8vIEVzcGHDsW9sXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwiLy8gZnJhbsOnYWlzXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwiLy8g4KS54KS/4KSo4KWN4KSm4KWAXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwiLy8gQmFoYXNhIEluZG9uZXNpYVxuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsIi8vIEl0YWxpYW5vXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwiLy8g5pel5pys6KqeXG5cbmV4cG9ydCBkZWZhdWx0IHt9OyIsIi8vIO2VnOq1reyWtFxuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsIi8vIE5lZGVybGFuZHNcblxuZXhwb3J0IGRlZmF1bHQge307XG4iLCIvLyBOb3Jza1xuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsIi8vIGrEmXp5ayBwb2xza2lcblxuZXhwb3J0IGRlZmF1bHQge307XG4iLCIvLyBQb3J0dWd1w6pzXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwiLy8gUG9ydHVndcOqcyBkbyBCcmFzaWxcbi8vIEJyYXppbGlhbiBQb3J0dWd1ZXNlXG5cbmV4cG9ydCBkZWZhdWx0IHt9OyIsIi8vIFJvbcOibsSDXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwiLy8g0YDRg9GB0YHQutC40LlcblxuZXhwb3J0IGRlZmF1bHQge307XG4iLCIvLyBUw7xya8OnZVxuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsIi8vIOeugOS9k+S4reaWh1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC8vIHNldHRpbmcudHNcbiAgXCJQbHVnaW4gU2V0dGluZ3NcIjogXCLmj5Lku7borr7nva5cIixcbiAgXCJBdXRvIHBhc3RlZCB1cGxvYWRcIjogXCLliarliIfmnb/oh6rliqjkuIrkvKBcIixcbiAgXCJJZiB5b3Ugc2V0IHRoaXMgdmFsdWUgdHJ1ZSwgd2hlbiB5b3UgcGFzdGUgaW1hZ2UsIGl0IHdpbGwgYmUgYXV0byB1cGxvYWRlZCh5b3Ugc2hvdWxkIHNldCB0aGUgcGljR28gc2VydmVyIHJpZ2h0bHkpXCI6XG4gICAgXCLlkK/nlKjor6XpgInpobnlkI7vvIzpu4/otLTlm77niYfml7bkvJroh6rliqjkuIrkvKDvvIjkvaDpnIDopoHmraPnoa7phY3nva5waWNnb++8iVwiLFxuICBcIkRlZmF1bHQgdXBsb2FkZXJcIjogXCLpu5jorqTkuIrkvKDlmahcIixcbiAgXCJQaWNHbyBzZXJ2ZXJcIjogXCJQaWNHbyBzZXJ2ZXIg5LiK5Lyg5o6l5Y+jXCIsXG4gIFwiUGljR28gc2VydmVyIGRlc2NcIjogXCLkuIrkvKDmjqXlj6PvvIzkvb/nlKhQaWNMaXN05pe25Y+v6YCa6L+H6K6+572uVVJM5Y+C5pWw5oyH5a6a5Zu+5bqK5ZKM6YWN572uXCIsXG4gIFwiUGxlYXNlIGlucHV0IFBpY0dvIHNlcnZlclwiOiBcIuivt+i+k+WFpeS4iuS8oOaOpeWPo+WcsOWdgFwiLFxuICBcIlBpY0dvIGRlbGV0ZSBzZXJ2ZXJcIjogXCJQaWNHbyBzZXJ2ZXIg5Yig6Zmk5o6l5Y+jKOivt+S9v+eUqFBpY0xpc3TmnaXlkK/nlKjmraTlip/og70pXCIsXG4gIFwiUGljTGlzdCBkZXNjXCI6IFwiUGljTGlzdOaYr1BpY0dv5LqM5qyh5byA5Y+R54mI77yM6K+3R2l0aHVi5pCc57SiUGljTGlzdOS4i+i9vVwiLFxuICBcIlBsZWFzZSBpbnB1dCBQaWNHbyBkZWxldGUgc2VydmVyXCI6IFwi6K+36L6T5YWl5Yig6Zmk5o6l5Y+j5Zyw5Z2AXCIsXG4gIFwiRGVsZXRlIGltYWdlIHVzaW5nIFBpY0xpc3RcIjogXCLkvb/nlKggUGljTGlzdCDliKDpmaTlm77niYdcIixcbiAgXCJQaWNHby1Db3JlIHBhdGhcIjogXCJQaWNHby1Db3JlIOi3r+W+hFwiLFxuICBcIkRlbGV0ZSBzdWNjZXNzZnVsbHlcIjogXCLliKDpmaTmiJDlip9cIixcbiAgXCJEZWxldGUgZmFpbGVkXCI6IFwi5Yig6Zmk5aSx6LSlXCIsXG4gIFwiRXJyb3IsIGNvdWxkIG5vdCBkZWxldGVcIjogXCLplJnor6/vvIzml6Dms5XliKDpmaRcIixcbiAgXCJJbWFnZSBzaXplIHN1ZmZpeFwiOiBcIuWbvueJh+Wkp+Wwj+WQjue8gFwiLFxuICBcIkltYWdlIHNpemUgc3VmZml4IERlc2NyaXB0aW9uXCI6IFwi5q+U5aaC77yafDMwMCDnlKjkuo7osIPmlbTlm77niYflpKflsI9cIixcbiAgXCJQbGVhc2UgaW5wdXQgaW1hZ2Ugc2l6ZSBzdWZmaXhcIjogXCLor7fovpPlhaXlm77niYflpKflsI/lkI7nvIBcIixcbiAgXCJQbGVhc2UgaW5wdXQgUGljR28tQ29yZSBwYXRoLCBkZWZhdWx0IHVzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlc1wiOlxuICAgIFwi6K+36L6T5YWlIFBpY0dvLUNvcmUgcGF0aO+8jOm7mOiupOS9v+eUqOeOr+Wig+WPmOmHj1wiLFxuICBcIldvcmsgb24gbmV0d29ya1wiOiBcIuW6lOeUqOe9kee7nOWbvueJh1wiLFxuICBcIldvcmsgb24gbmV0d29yayBEZXNjcmlwdGlvblwiOlxuICAgIFwi5b2T5L2g5LiK5Lyg5omA5pyJ5Zu+54mH5pe277yM5Lmf5Lya5LiK5Lyg572R57uc5Zu+54mH44CC5Lul5Y+K5b2T5L2g6L+b6KGM6buP6LS05pe277yM5Ymq5YiH5p2/5Lit55qE5qCH5YeGIG1kIOWbvueJh+S8muiiq+S4iuS8oFwiLFxuICBmaXhQYXRoOiBcIuS/ruato1BBVEjlj5jph49cIixcbiAgZml4UGF0aFdhcm5pbmc6XG4gICAgXCLmraTpgInpobnnlKjkuo7kv67lpI1MaW51eOWSjE1hY+S4iiBQaWNHby1Db3JlIOS4iuS8oOWksei0peeahOmXrumimOOAguWug+S8muS/ruaUuSBPYnNpZGlhbiDlhoXnmoQgUEFUSCDlj5jph4/vvIzlpoLmnpwgT2JzaWRpYW4g6YGH5Yiw5Lu75L2VQlVH77yM5YWI5YWz6Zet6L+Z5Liq6YCJ6aG56K+V6K+V77yBXCIsXG4gIFwiVXBsb2FkIHdoZW4gY2xpcGJvYXJkIGhhcyBpbWFnZSBhbmQgdGV4dCB0b2dldGhlclwiOlxuICAgIFwi5b2T5Ymq5YiH5p2/5ZCM5pe25oul5pyJ5paH5pys5ZKM5Zu+54mH5Ymq5YiH5p2/5pWw5o2u5pe25piv5ZCm5LiK5Lyg5Zu+54mHXCIsXG4gIFwiV2hlbiB5b3UgY29weSwgc29tZSBhcHBsaWNhdGlvbiBsaWtlIEV4Y2VsIHdpbGwgaW1hZ2UgYW5kIHRleHQgdG8gY2xpcGJvYXJkLCB5b3UgY2FuIHVwbG9hZCBvciBub3QuXCI6XG4gICAgXCLlvZPkvaDlpI3liLbml7bvvIzmn5DkupvlupTnlKjkvovlpoIgRXhjZWwg5Lya5Zyo5Ymq5YiH5p2/5ZCM5pe25paH5pys5ZKM5Zu+5YOP5pWw5o2u77yM56Gu6K6k5piv5ZCm5LiK5Lyg44CCXCIsXG4gIFwiTmV0d29yayBEb21haW4gQmxhY2sgTGlzdFwiOiBcIue9kee7nOWbvueJh+Wfn+WQjem7keWQjeWNlVwiLFxuICBcIk5ldHdvcmsgRG9tYWluIEJsYWNrIExpc3QgRGVzY3JpcHRpb25cIjpcbiAgICBcIum7keWQjeWNleWfn+WQjeS4reeahOWbvueJh+WwhuS4jeS8muiiq+S4iuS8oO+8jOeUqOiLseaWh+mAl+WPt+WIhuWJslwiLFxuICBcIkRlbGV0ZSBzb3VyY2UgZmlsZSBhZnRlciB5b3UgdXBsb2FkIGZpbGVcIjogXCLkuIrkvKDmlofku7blkI7np7vpmaTmupDmlofku7ZcIixcbiAgXCJEZWxldGUgc291cmNlIGZpbGUgaW4gb2IgYXNzZXRzIGFmdGVyIHlvdSB1cGxvYWQgZmlsZS5cIjpcbiAgICBcIuS4iuS8oOaWh+S7tuWQjuenu+mZpOWcqG9i6ZmE5Lu25paH5Lu25aS55Lit55qE5paH5Lu2XCIsXG4gIFwiSW1hZ2UgZGVzY1wiOiBcIuWbvueJh+aPj+i/sFwiLFxuICByZXNlcnZlOiBcIum7mOiupFwiLFxuICBcInJlbW92ZSBhbGxcIjogXCLml6BcIixcbiAgXCJyZW1vdmUgZGVmYXVsdFwiOiBcIuenu+mZpGltYWdlLnBuZ1wiLFxuICBcIlJlbW90ZSBzZXJ2ZXIgbW9kZVwiOiBcIui/nOeoi+acjeWKoeWZqOaooeW8j1wiLFxuICBcIlJlbW90ZSBzZXJ2ZXIgbW9kZSBkZXNjXCI6IFwi5aaC5p6c5L2g5Zyo5pyN5Yqh5Zmo6YOo572y5LqGcGljbGlzdC1jb3Jl5oiW6ICFcGljbGlzdFwiLFxuICBcIkNhbiBub3QgZmluZCBpbWFnZSBmaWxlXCI6IFwi5rKh5pyJ6Kej5p6Q5Yiw5Zu+5YOP5paH5Lu2XCIsXG4gIFwiRmlsZSBoYXMgYmVlbiBjaGFuZ2VkZCwgdXBsb2FkIGZhaWx1cmVcIjogXCLlvZPliY3mlofku7blt7Llj5jmm7TvvIzkuIrkvKDlpLHotKVcIixcbiAgXCJGaWxlIGhhcyBiZWVuIGNoYW5nZWRkLCBkb3dubG9hZCBmYWlsdXJlXCI6IFwi5b2T5YmN5paH5Lu25bey5Y+Y5pu077yM5LiL6L295aSx6LSlXCIsXG4gIFwiV2FybmluZzogdXBsb2FkIGZpbGVzIGlzIGRpZmZlcmVudCBvZiByZWNpdmVyIGZpbGVzIGZyb20gYXBpXCI6XG4gICAgXCLorablkYrvvJrkuIrkvKDnmoTmlofku7bkuI7mjqXlj6Pov5Tlm57nmoTmlofku7bmlbDph4/kuI3kuIDoh7RcIixcbn07XG4iLCIvLyDnuYHpq5TkuK3mlodcblxuZXhwb3J0IGRlZmF1bHQge307XG4iLCJpbXBvcnQgeyBtb21lbnQgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCBhciBmcm9tICcuL2xvY2FsZS9hcic7XG5pbXBvcnQgY3ogZnJvbSAnLi9sb2NhbGUvY3onO1xuaW1wb3J0IGRhIGZyb20gJy4vbG9jYWxlL2RhJztcbmltcG9ydCBkZSBmcm9tICcuL2xvY2FsZS9kZSc7XG5pbXBvcnQgZW4gZnJvbSAnLi9sb2NhbGUvZW4nO1xuaW1wb3J0IGVuR0IgZnJvbSAnLi9sb2NhbGUvZW4tZ2InO1xuaW1wb3J0IGVzIGZyb20gJy4vbG9jYWxlL2VzJztcbmltcG9ydCBmciBmcm9tICcuL2xvY2FsZS9mcic7XG5pbXBvcnQgaGkgZnJvbSAnLi9sb2NhbGUvaGknO1xuaW1wb3J0IGlkIGZyb20gJy4vbG9jYWxlL2lkJztcbmltcG9ydCBpdCBmcm9tICcuL2xvY2FsZS9pdCc7XG5pbXBvcnQgamEgZnJvbSAnLi9sb2NhbGUvamEnO1xuaW1wb3J0IGtvIGZyb20gJy4vbG9jYWxlL2tvJztcbmltcG9ydCBubCBmcm9tICcuL2xvY2FsZS9ubCc7XG5pbXBvcnQgbm8gZnJvbSAnLi9sb2NhbGUvbm8nO1xuaW1wb3J0IHBsIGZyb20gJy4vbG9jYWxlL3BsJztcbmltcG9ydCBwdCBmcm9tICcuL2xvY2FsZS9wdCc7XG5pbXBvcnQgcHRCUiBmcm9tICcuL2xvY2FsZS9wdC1icic7XG5pbXBvcnQgcm8gZnJvbSAnLi9sb2NhbGUvcm8nO1xuaW1wb3J0IHJ1IGZyb20gJy4vbG9jYWxlL3J1JztcbmltcG9ydCB0ciBmcm9tICcuL2xvY2FsZS90cic7XG5pbXBvcnQgemhDTiBmcm9tICcuL2xvY2FsZS96aC1jbic7XG5pbXBvcnQgemhUVyBmcm9tICcuL2xvY2FsZS96aC10dyc7XG5cbmNvbnN0IGxvY2FsZU1hcDogeyBbazogc3RyaW5nXTogUGFydGlhbDx0eXBlb2YgZW4+IH0gPSB7XG4gIGFyLFxuICBjczogY3osXG4gIGRhLFxuICBkZSxcbiAgZW4sXG4gICdlbi1nYic6IGVuR0IsXG4gIGVzLFxuICBmcixcbiAgaGksXG4gIGlkLFxuICBpdCxcbiAgamEsXG4gIGtvLFxuICBubCxcbiAgbm46IG5vLFxuICBwbCxcbiAgcHQsXG4gICdwdC1icic6IHB0QlIsXG4gIHJvLFxuICBydSxcbiAgdHIsXG4gICd6aC1jbic6IHpoQ04sXG4gICd6aC10dyc6IHpoVFcsXG59O1xuXG5jb25zdCBsb2NhbGUgPSBsb2NhbGVNYXBbbW9tZW50LmxvY2FsZSgpXTtcblxuZXhwb3J0IGZ1bmN0aW9uIHQoc3RyOiBrZXlvZiB0eXBlb2YgZW4pOiBzdHJpbmcge1xuICByZXR1cm4gKGxvY2FsZSAmJiBsb2NhbGVbc3RyXSkgfHwgZW5bc3RyXTtcbn1cbiIsImltcG9ydCB7IEFwcCwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZywgTm90aWNlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgaW1hZ2VBdXRvVXBsb2FkUGx1Z2luIGZyb20gXCIuL21haW5cIjtcbmltcG9ydCB7IHQgfSBmcm9tIFwiLi9sYW5nL2hlbHBlcnNcIjtcbmltcG9ydCB7IGdldE9TIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5TZXR0aW5ncyB7XG4gIHVwbG9hZEJ5Q2xpcFN3aXRjaDogYm9vbGVhbjtcbiAgdXBsb2FkU2VydmVyOiBzdHJpbmc7XG4gIGRlbGV0ZVNlcnZlcjogc3RyaW5nO1xuICBpbWFnZVNpemVTdWZmaXg6IHN0cmluZztcbiAgdXBsb2FkZXI6IHN0cmluZztcbiAgcGljZ29Db3JlUGF0aDogc3RyaW5nO1xuICB3b3JrT25OZXRXb3JrOiBib29sZWFuO1xuICBuZXdXb3JrQmxhY2tEb21haW5zOiBzdHJpbmc7XG4gIGZpeFBhdGg6IGJvb2xlYW47XG4gIGFwcGx5SW1hZ2U6IGJvb2xlYW47XG4gIGRlbGV0ZVNvdXJjZTogYm9vbGVhbjtcbiAgaW1hZ2VEZXNjOiBcIm9yaWdpblwiIHwgXCJub25lXCIgfCBcInJlbW92ZURlZmF1bHRcIjtcbiAgcmVtb3RlU2VydmVyTW9kZTogYm9vbGVhbjtcbiAgW3Byb3BOYW1lOiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NFVFRJTkdTOiBQbHVnaW5TZXR0aW5ncyA9IHtcbiAgdXBsb2FkQnlDbGlwU3dpdGNoOiB0cnVlLFxuICB1cGxvYWRlcjogXCJQaWNHb1wiLFxuICB1cGxvYWRTZXJ2ZXI6IFwiaHR0cDovLzEyNy4wLjAuMTozNjY3Ny91cGxvYWRcIixcbiAgZGVsZXRlU2VydmVyOiBcImh0dHA6Ly8xMjcuMC4wLjE6MzY2NzcvZGVsZXRlXCIsXG4gIGltYWdlU2l6ZVN1ZmZpeDogXCJcIixcbiAgcGljZ29Db3JlUGF0aDogXCJcIixcbiAgd29ya09uTmV0V29yazogZmFsc2UsXG4gIGZpeFBhdGg6IGZhbHNlLFxuICBhcHBseUltYWdlOiB0cnVlLFxuICBuZXdXb3JrQmxhY2tEb21haW5zOiBcIlwiLFxuICBkZWxldGVTb3VyY2U6IGZhbHNlLFxuICBpbWFnZURlc2M6IFwib3JpZ2luXCIsXG4gIHJlbW90ZVNlcnZlck1vZGU6IGZhbHNlLFxufTtcblxuZXhwb3J0IGNsYXNzIFNldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcbiAgcGx1Z2luOiBpbWFnZUF1dG9VcGxvYWRQbHVnaW47XG5cbiAgY29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogaW1hZ2VBdXRvVXBsb2FkUGx1Z2luKSB7XG4gICAgc3VwZXIoYXBwLCBwbHVnaW4pO1xuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xuICB9XG5cbiAgZGlzcGxheSgpOiB2b2lkIHtcbiAgICBsZXQgeyBjb250YWluZXJFbCB9ID0gdGhpcztcblxuICAgIGNvbnN0IG9zID0gZ2V0T1MoKTtcblxuICAgIGNvbnRhaW5lckVsLmVtcHR5KCk7XG4gICAgY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoMlwiLCB7IHRleHQ6IHQoXCJQbHVnaW4gU2V0dGluZ3NcIikgfSk7XG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAuc2V0TmFtZSh0KFwiQXV0byBwYXN0ZWQgdXBsb2FkXCIpKVxuICAgICAgLnNldERlc2MoXG4gICAgICAgIHQoXG4gICAgICAgICAgXCJJZiB5b3Ugc2V0IHRoaXMgdmFsdWUgdHJ1ZSwgd2hlbiB5b3UgcGFzdGUgaW1hZ2UsIGl0IHdpbGwgYmUgYXV0byB1cGxvYWRlZCh5b3Ugc2hvdWxkIHNldCB0aGUgcGljR28gc2VydmVyIHJpZ2h0bHkpXCJcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLmFkZFRvZ2dsZSh0b2dnbGUgPT5cbiAgICAgICAgdG9nZ2xlXG4gICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVwbG9hZEJ5Q2xpcFN3aXRjaClcbiAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgdmFsdWUgPT4ge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MudXBsb2FkQnlDbGlwU3dpdGNoID0gdmFsdWU7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICB9KVxuICAgICAgKTtcblxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgLnNldE5hbWUodChcIkRlZmF1bHQgdXBsb2FkZXJcIikpXG4gICAgICAuc2V0RGVzYyh0KFwiRGVmYXVsdCB1cGxvYWRlclwiKSlcbiAgICAgIC5hZGREcm9wZG93bihjYiA9PlxuICAgICAgICBjYlxuICAgICAgICAgIC5hZGRPcHRpb24oXCJQaWNHb1wiLCBcIlBpY0dvKGFwcClcIilcbiAgICAgICAgICAuYWRkT3B0aW9uKFwiUGljR28tQ29yZVwiLCBcIlBpY0dvLUNvcmVcIilcbiAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudXBsb2FkZXIpXG4gICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jIHZhbHVlID0+IHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLnVwbG9hZGVyID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXkoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgaWYgKHRoaXMucGx1Z2luLnNldHRpbmdzLnVwbG9hZGVyID09PSBcIlBpY0dvXCIpIHtcbiAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAuc2V0TmFtZSh0KFwiUGljR28gc2VydmVyXCIpKVxuICAgICAgICAuc2V0RGVzYyh0KFwiUGljR28gc2VydmVyIGRlc2NcIikpXG4gICAgICAgIC5hZGRUZXh0KHRleHQgPT5cbiAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIodChcIlBsZWFzZSBpbnB1dCBQaWNHbyBzZXJ2ZXJcIikpXG4gICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudXBsb2FkU2VydmVyKVxuICAgICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jIGtleSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLnVwbG9hZFNlcnZlciA9IGtleTtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgLnNldE5hbWUodChcIlBpY0dvIGRlbGV0ZSBzZXJ2ZXJcIikpXG4gICAgICAgIC5zZXREZXNjKHQoXCJQaWNMaXN0IGRlc2NcIikpXG4gICAgICAgIC5hZGRUZXh0KHRleHQgPT5cbiAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIodChcIlBsZWFzZSBpbnB1dCBQaWNHbyBkZWxldGUgc2VydmVyXCIpKVxuICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmRlbGV0ZVNlcnZlcilcbiAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyBrZXkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWxldGVTZXJ2ZXIgPSBrZXk7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgIC5zZXROYW1lKHQoXCJSZW1vdGUgc2VydmVyIG1vZGVcIikpXG4gICAgICAuc2V0RGVzYyh0KFwiUmVtb3RlIHNlcnZlciBtb2RlIGRlc2NcIikpXG4gICAgICAuYWRkVG9nZ2xlKHRvZ2dsZSA9PlxuICAgICAgICB0b2dnbGVcbiAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MucmVtb3RlU2VydmVyTW9kZSlcbiAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgdmFsdWUgPT4ge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MucmVtb3RlU2VydmVyTW9kZSA9IHZhbHVlO1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLndvcmtPbk5ldFdvcmsgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGlzcGxheSgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy5wbHVnaW4uc2V0dGluZ3MudXBsb2FkZXIgPT09IFwiUGljR28tQ29yZVwiKSB7XG4gICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgLnNldE5hbWUodChcIlBpY0dvLUNvcmUgcGF0aFwiKSlcbiAgICAgICAgLnNldERlc2MoXG4gICAgICAgICAgdChcIlBsZWFzZSBpbnB1dCBQaWNHby1Db3JlIHBhdGgsIGRlZmF1bHQgdXNpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzXCIpXG4gICAgICAgIClcbiAgICAgICAgLmFkZFRleHQodGV4dCA9PlxuICAgICAgICAgIHRleHRcbiAgICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihcIlwiKVxuICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnBpY2dvQ29yZVBhdGgpXG4gICAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgdmFsdWUgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5waWNnb0NvcmVQYXRoID0gdmFsdWU7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgaWYgKG9zICE9PSBcIldpbmRvd3NcIikge1xuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAuc2V0TmFtZSh0KFwiZml4UGF0aFwiKSlcbiAgICAgICAgICAuc2V0RGVzYyh0KFwiZml4UGF0aFdhcm5pbmdcIikpXG4gICAgICAgICAgLmFkZFRvZ2dsZSh0b2dnbGUgPT5cbiAgICAgICAgICAgIHRvZ2dsZVxuICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZml4UGF0aClcbiAgICAgICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jIHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5maXhQYXRoID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpbWFnZSBkZXNjIHNldHRpbmdcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgIC5zZXROYW1lKHQoXCJJbWFnZSBkZXNjXCIpKVxuICAgICAgLnNldERlc2ModChcIkltYWdlIGRlc2NcIikpXG4gICAgICAuYWRkRHJvcGRvd24oY2IgPT5cbiAgICAgICAgY2JcbiAgICAgICAgICAuYWRkT3B0aW9uKFwib3JpZ2luXCIsIHQoXCJyZXNlcnZlXCIpKSAvLyDkv53nlZnlhajpg6hcbiAgICAgICAgICAuYWRkT3B0aW9uKFwibm9uZVwiLCB0KFwicmVtb3ZlIGFsbFwiKSkgLy8g56e76Zmk5YWo6YOoXG4gICAgICAgICAgLmFkZE9wdGlvbihcInJlbW92ZURlZmF1bHRcIiwgdChcInJlbW92ZSBkZWZhdWx0XCIpKSAvLyDlj6rnp7vpmaTpu5jorqTljbMgaW1hZ2UucG5nXG4gICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmltYWdlRGVzYylcbiAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBcIm9yaWdpblwiIHwgXCJub25lXCIgfCBcInJlbW92ZURlZmF1bHRcIikgPT4ge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuaW1hZ2VEZXNjID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXkoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAuc2V0TmFtZSh0KFwiSW1hZ2Ugc2l6ZSBzdWZmaXhcIikpXG4gICAgICAuc2V0RGVzYyh0KFwiSW1hZ2Ugc2l6ZSBzdWZmaXggRGVzY3JpcHRpb25cIikpXG4gICAgICAuYWRkVGV4dCh0ZXh0ID0+XG4gICAgICAgIHRleHRcbiAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIodChcIlBsZWFzZSBpbnB1dCBpbWFnZSBzaXplIHN1ZmZpeFwiKSlcbiAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuaW1hZ2VTaXplU3VmZml4KVxuICAgICAgICAgIC5vbkNoYW5nZShhc3luYyBrZXkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuaW1hZ2VTaXplU3VmZml4ID0ga2V5O1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgIC5zZXROYW1lKHQoXCJXb3JrIG9uIG5ldHdvcmtcIikpXG4gICAgICAuc2V0RGVzYyh0KFwiV29yayBvbiBuZXR3b3JrIERlc2NyaXB0aW9uXCIpKVxuICAgICAgLmFkZFRvZ2dsZSh0b2dnbGUgPT5cbiAgICAgICAgdG9nZ2xlXG4gICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLndvcmtPbk5ldFdvcmspXG4gICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jIHZhbHVlID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBsdWdpbi5zZXR0aW5ncy5yZW1vdGVTZXJ2ZXJNb2RlKSB7XG4gICAgICAgICAgICAgIG5ldyBOb3RpY2UoXCJDYW4gb25seSB3b3JrIHdoZW4gcmVtb3RlIHNlcnZlciBtb2RlIGlzIG9mZi5cIik7XG4gICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLndvcmtPbk5ldFdvcmsgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLndvcmtPbk5ldFdvcmsgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGlzcGxheSgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgIC5zZXROYW1lKHQoXCJOZXR3b3JrIERvbWFpbiBCbGFjayBMaXN0XCIpKVxuICAgICAgLnNldERlc2ModChcIk5ldHdvcmsgRG9tYWluIEJsYWNrIExpc3QgRGVzY3JpcHRpb25cIikpXG4gICAgICAuYWRkVGV4dEFyZWEodGV4dEFyZWEgPT5cbiAgICAgICAgdGV4dEFyZWFcbiAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MubmV3V29ya0JsYWNrRG9tYWlucylcbiAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgdmFsdWUgPT4ge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MubmV3V29ya0JsYWNrRG9tYWlucyA9IHZhbHVlO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgIC5zZXROYW1lKHQoXCJVcGxvYWQgd2hlbiBjbGlwYm9hcmQgaGFzIGltYWdlIGFuZCB0ZXh0IHRvZ2V0aGVyXCIpKVxuICAgICAgLnNldERlc2MoXG4gICAgICAgIHQoXG4gICAgICAgICAgXCJXaGVuIHlvdSBjb3B5LCBzb21lIGFwcGxpY2F0aW9uIGxpa2UgRXhjZWwgd2lsbCBpbWFnZSBhbmQgdGV4dCB0byBjbGlwYm9hcmQsIHlvdSBjYW4gdXBsb2FkIG9yIG5vdC5cIlxuICAgICAgICApXG4gICAgICApXG4gICAgICAuYWRkVG9nZ2xlKHRvZ2dsZSA9PlxuICAgICAgICB0b2dnbGVcbiAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuYXBwbHlJbWFnZSlcbiAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgdmFsdWUgPT4ge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuYXBwbHlJbWFnZSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5KCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICB9KVxuICAgICAgKTtcblxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgLnNldE5hbWUodChcIkRlbGV0ZSBzb3VyY2UgZmlsZSBhZnRlciB5b3UgdXBsb2FkIGZpbGVcIikpXG4gICAgICAuc2V0RGVzYyh0KFwiRGVsZXRlIHNvdXJjZSBmaWxlIGluIG9iIGFzc2V0cyBhZnRlciB5b3UgdXBsb2FkIGZpbGUuXCIpKVxuICAgICAgLmFkZFRvZ2dsZSh0b2dnbGUgPT5cbiAgICAgICAgdG9nZ2xlXG4gICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmRlbGV0ZVNvdXJjZSlcbiAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgdmFsdWUgPT4ge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVsZXRlU291cmNlID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXkoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgIH0pXG4gICAgICApO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBNYXJrZG93blZpZXcsXG4gIFBsdWdpbixcbiAgRmlsZVN5c3RlbUFkYXB0ZXIsXG4gIEVkaXRvcixcbiAgTWVudSxcbiAgTWVudUl0ZW0sXG4gIFRGaWxlLFxuICBub3JtYWxpemVQYXRoLFxuICBOb3RpY2UsXG4gIGFkZEljb24sXG4gIHJlcXVlc3RVcmwsXG4gIE1hcmtkb3duRmlsZUluZm8sXG59IGZyb20gXCJvYnNpZGlhblwiO1xuXG5pbXBvcnQgeyByZXNvbHZlLCByZWxhdGl2ZSwgam9pbiwgcGFyc2UsIHBvc2l4LCBiYXNlbmFtZSwgZGlybmFtZSB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBleGlzdHNTeW5jLCBta2RpclN5bmMsIHdyaXRlRmlsZVN5bmMsIHVubGluayB9IGZyb20gXCJmc1wiO1xuXG5pbXBvcnQgZml4UGF0aCBmcm9tIFwiZml4LXBhdGhcIjtcbmltcG9ydCBpbWFnZVR5cGUgZnJvbSBcImltYWdlLXR5cGVcIjtcblxuaW1wb3J0IHtcbiAgaXNBc3NldFR5cGVBbkltYWdlLFxuICBpc0FuSW1hZ2UsXG4gIGdldFVybEFzc2V0LFxuICBhcnJheVRvT2JqZWN0LFxufSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgUGljR29VcGxvYWRlciwgUGljR29Db3JlVXBsb2FkZXIgfSBmcm9tIFwiLi91cGxvYWRlclwiO1xuaW1wb3J0IHsgUGljR29EZWxldGVyIH0gZnJvbSBcIi4vZGVsZXRlclwiO1xuaW1wb3J0IEhlbHBlciBmcm9tIFwiLi9oZWxwZXJcIjtcbmltcG9ydCB7IHQgfSBmcm9tIFwiLi9sYW5nL2hlbHBlcnNcIjtcblxuaW1wb3J0IHsgU2V0dGluZ1RhYiwgUGx1Z2luU2V0dGluZ3MsIERFRkFVTFRfU0VUVElOR1MgfSBmcm9tIFwiLi9zZXR0aW5nXCI7XG5cbmludGVyZmFjZSBJbWFnZSB7XG4gIHBhdGg6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBzb3VyY2U6IHN0cmluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgaW1hZ2VBdXRvVXBsb2FkUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcbiAgc2V0dGluZ3M6IFBsdWdpblNldHRpbmdzO1xuICBoZWxwZXI6IEhlbHBlcjtcbiAgZWRpdG9yOiBFZGl0b3I7XG4gIHBpY0dvVXBsb2FkZXI6IFBpY0dvVXBsb2FkZXI7XG4gIHBpY0dvRGVsZXRlcjogUGljR29EZWxldGVyO1xuICBwaWNHb0NvcmVVcGxvYWRlcjogUGljR29Db3JlVXBsb2FkZXI7XG4gIHVwbG9hZGVyOiBQaWNHb1VwbG9hZGVyIHwgUGljR29Db3JlVXBsb2FkZXI7XG5cbiAgYXN5bmMgbG9hZFNldHRpbmdzKCkge1xuICAgIHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKERFRkFVTFRfU0VUVElOR1MsIGF3YWl0IHRoaXMubG9hZERhdGEoKSk7XG4gIH1cblxuICBhc3luYyBzYXZlU2V0dGluZ3MoKSB7XG4gICAgYXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcbiAgfVxuXG4gIG9udW5sb2FkKCkge31cblxuICBhc3luYyBvbmxvYWQoKSB7XG4gICAgYXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKTtcblxuICAgIHRoaXMuaGVscGVyID0gbmV3IEhlbHBlcih0aGlzLmFwcCk7XG4gICAgdGhpcy5waWNHb1VwbG9hZGVyID0gbmV3IFBpY0dvVXBsb2FkZXIodGhpcy5zZXR0aW5ncywgdGhpcyk7XG4gICAgdGhpcy5waWNHb0RlbGV0ZXIgPSBuZXcgUGljR29EZWxldGVyKHRoaXMpO1xuICAgIHRoaXMucGljR29Db3JlVXBsb2FkZXIgPSBuZXcgUGljR29Db3JlVXBsb2FkZXIodGhpcy5zZXR0aW5ncywgdGhpcyk7XG5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy51cGxvYWRlciA9PT0gXCJQaWNHb1wiKSB7XG4gICAgICB0aGlzLnVwbG9hZGVyID0gdGhpcy5waWNHb1VwbG9hZGVyO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zZXR0aW5ncy51cGxvYWRlciA9PT0gXCJQaWNHby1Db3JlXCIpIHtcbiAgICAgIHRoaXMudXBsb2FkZXIgPSB0aGlzLnBpY0dvQ29yZVVwbG9hZGVyO1xuICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuZml4UGF0aCkge1xuICAgICAgICBmaXhQYXRoKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ldyBOb3RpY2UoXCJ1bmtub3duIHVwbG9hZGVyXCIpO1xuICAgIH1cblxuICAgIGFkZEljb24oXG4gICAgICBcInVwbG9hZFwiLFxuICAgICAgYDxzdmcgdD1cIjE2MzY2MzA3ODM0MjlcIiBjbGFzcz1cImljb25cIiB2aWV3Qm94PVwiMCAwIDEwMCAxMDBcIiB2ZXJzaW9uPVwiMS4xXCIgcC1pZD1cIjQ2NDlcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICA8cGF0aCBkPVwiTSA3MS42MzggMzUuMzM2IEwgNzkuNDA4IDM1LjMzNiBDIDgzLjcgMzUuMzM2IDg3LjE3OCAzOC42NjIgODcuMTc4IDQyLjc2NSBMIDg3LjE3OCA4NC44NjQgQyA4Ny4xNzggODguOTY5IDgzLjcgOTIuMjk1IDc5LjQwOCA5Mi4yOTUgTCAxNy4yNDkgOTIuMjk1IEMgMTIuOTU3IDkyLjI5NSA5LjQ3OSA4OC45NjkgOS40NzkgODQuODY0IEwgOS40NzkgNDIuNzY1IEMgOS40NzkgMzguNjYyIDEyLjk1NyAzNS4zMzYgMTcuMjQ5IDM1LjMzNiBMIDI1LjAxOSAzNS4zMzYgTCAyNS4wMTkgNDIuNzY1IEwgMTcuMjQ5IDQyLjc2NSBMIDE3LjI0OSA4NC44NjQgTCA3OS40MDggODQuODY0IEwgNzkuNDA4IDQyLjc2NSBMIDcxLjYzOCA0Mi43NjUgTCA3MS42MzggMzUuMzM2IFogTSA0OS4wMTQgMTAuMTc5IEwgNjcuMzI2IDI3LjY4OCBMIDYxLjgzNSAzMi45NDIgTCA1Mi44NDkgMjQuMzUyIEwgNTIuODQ5IDU5LjczMSBMIDQ1LjA3OCA1OS43MzEgTCA0NS4wNzggMjQuNDU1IEwgMzYuMTk0IDMyLjk0NyBMIDMwLjcwMiAyNy42OTIgTCA0OS4wMTIgMTAuMTgxIFpcIiBwLWlkPVwiNDY1MFwiIGZpbGw9XCIjOGE4YThhXCI+PC9wYXRoPlxuICAgIDwvc3ZnPmBcbiAgICApO1xuXG4gICAgdGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBTZXR0aW5nVGFiKHRoaXMuYXBwLCB0aGlzKSk7XG5cbiAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgaWQ6IFwiVXBsb2FkIGFsbCBpbWFnZXNcIixcbiAgICAgIG5hbWU6IFwiVXBsb2FkIGFsbCBpbWFnZXNcIixcbiAgICAgIGNoZWNrQ2FsbGJhY2s6IChjaGVja2luZzogYm9vbGVhbikgPT4ge1xuICAgICAgICBsZXQgbGVhZiA9IHRoaXMuYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmO1xuICAgICAgICBpZiAobGVhZikge1xuICAgICAgICAgIGlmICghY2hlY2tpbmcpIHtcbiAgICAgICAgICAgIHRoaXMudXBsb2FkQWxsRmlsZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICBpZDogXCJEb3dubG9hZCBhbGwgaW1hZ2VzXCIsXG4gICAgICBuYW1lOiBcIkRvd25sb2FkIGFsbCBpbWFnZXNcIixcbiAgICAgIGNoZWNrQ2FsbGJhY2s6IChjaGVja2luZzogYm9vbGVhbikgPT4ge1xuICAgICAgICBsZXQgbGVhZiA9IHRoaXMuYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmO1xuICAgICAgICBpZiAobGVhZikge1xuICAgICAgICAgIGlmICghY2hlY2tpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZG93bmxvYWRBbGxJbWFnZUZpbGVzKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLnNldHVwUGFzdGVIYW5kbGVyKCk7XG4gICAgdGhpcy5yZWdpc3RlckZpbGVNZW51KCk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyU2VsZWN0aW9uKCk7XG4gIH1cblxuICByZWdpc3RlclNlbGVjdGlvbigpIHtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQoXG4gICAgICB0aGlzLmFwcC53b3Jrc3BhY2Uub24oXG4gICAgICAgIFwiZWRpdG9yLW1lbnVcIixcbiAgICAgICAgKG1lbnU6IE1lbnUsIGVkaXRvcjogRWRpdG9yLCBpbmZvOiBNYXJrZG93blZpZXcgfCBNYXJrZG93bkZpbGVJbmZvKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoXCJtYXJrZG93blwiKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvbigpO1xuICAgICAgICAgIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IG1hcmtkb3duUmVnZXggPSAvIVxcWy4qXFxdXFwoKC4qKVxcKS9nO1xuICAgICAgICAgICAgY29uc3QgbWFya2Rvd25NYXRjaCA9IG1hcmtkb3duUmVnZXguZXhlYyhzZWxlY3Rpb24pO1xuICAgICAgICAgICAgaWYgKG1hcmtkb3duTWF0Y2ggJiYgbWFya2Rvd25NYXRjaC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG1hcmtkb3duVXJsID0gbWFya2Rvd25NYXRjaFsxXTtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MudXBsb2FkZWRJbWFnZXMuZmluZChcbiAgICAgICAgICAgICAgICAgIChpdGVtOiB7IGltZ1VybDogc3RyaW5nIH0pID0+IGl0ZW0uaW1nVXJsID09PSBtYXJrZG93blVybFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRNZW51KG1lbnUsIG1hcmtkb3duVXJsLCBlZGl0b3IpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIGFkZE1lbnUgPSAobWVudTogTWVudSwgaW1nUGF0aDogc3RyaW5nLCBlZGl0b3I6IEVkaXRvcikgPT4ge1xuICAgIG1lbnUuYWRkSXRlbSgoaXRlbTogTWVudUl0ZW0pID0+XG4gICAgICBpdGVtXG4gICAgICAgIC5zZXRJY29uKFwidHJhc2gtMlwiKVxuICAgICAgICAuc2V0VGl0bGUodChcIkRlbGV0ZSBpbWFnZSB1c2luZyBQaWNMaXN0XCIpKVxuICAgICAgICAub25DbGljayhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IHRoaXMuc2V0dGluZ3MudXBsb2FkZWRJbWFnZXMuZmluZChcbiAgICAgICAgICAgICAgKGl0ZW06IHsgaW1nVXJsOiBzdHJpbmcgfSkgPT4gaXRlbS5pbWdVcmwgPT09IGltZ1BhdGhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMucGljR29EZWxldGVyLmRlbGV0ZUltYWdlKFtzZWxlY3RlZEl0ZW1dKTtcbiAgICAgICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgbmV3IE5vdGljZSh0KFwiRGVsZXRlIHN1Y2Nlc3NmdWxseVwiKSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgIGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKFwiXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmdzLnVwbG9hZGVkSW1hZ2VzID1cbiAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MudXBsb2FkZWRJbWFnZXMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAoaXRlbTogeyBpbWdVcmw6IHN0cmluZyB9KSA9PiBpdGVtLmltZ1VybCAhPT0gaW1nUGF0aFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UodChcIkRlbGV0ZSBmYWlsZWRcIikpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBuZXcgTm90aWNlKHQoXCJFcnJvciwgY291bGQgbm90IGRlbGV0ZVwiKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICk7XG4gIH07XG5cbiAgYXN5bmMgZG93bmxvYWRBbGxJbWFnZUZpbGVzKCkge1xuICAgIGNvbnN0IGFjdGl2ZUZpbGUgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlRmlsZSgpO1xuICAgIGNvbnN0IGZvbGRlclBhdGggPSB0aGlzLmdldEZpbGVBc3NldFBhdGgoKTtcbiAgICBjb25zdCBmaWxlQXJyYXkgPSB0aGlzLmhlbHBlci5nZXRBbGxGaWxlcygpO1xuICAgIGlmICghZXhpc3RzU3luYyhmb2xkZXJQYXRoKSkge1xuICAgICAgbWtkaXJTeW5jKGZvbGRlclBhdGgpO1xuICAgIH1cblxuICAgIGxldCBpbWFnZUFycmF5ID0gW107XG4gICAgY29uc3QgbmFtZVNldCA9IG5ldyBTZXQoKTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZUFycmF5KSB7XG4gICAgICBpZiAoIWZpbGUucGF0aC5zdGFydHNXaXRoKFwiaHR0cFwiKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdXJsID0gZmlsZS5wYXRoO1xuICAgICAgY29uc3QgYXNzZXQgPSBnZXRVcmxBc3NldCh1cmwpO1xuICAgICAgbGV0IG5hbWUgPSBkZWNvZGVVUkkocGFyc2UoYXNzZXQpLm5hbWUpLnJlcGxhY2VBbGwoXG4gICAgICAgIC9bXFxcXFxcXFwvOio/XFxcIjw+fF0vZyxcbiAgICAgICAgXCItXCJcbiAgICAgICk7XG5cbiAgICAgIC8vIOWmguaenOaWh+S7tuWQjeW3suWtmOWcqO+8jOWImeeUqOmaj+acuuWAvOabv+aNou+8jOS4jeWvueaWh+S7tuWQjue8gOi/m+ihjOWIpOaWrVxuICAgICAgaWYgKGV4aXN0c1N5bmMoam9pbihmb2xkZXJQYXRoKSkpIHtcbiAgICAgICAgbmFtZSA9IChNYXRoLnJhbmRvbSgpICsgMSkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA1KTtcbiAgICAgIH1cbiAgICAgIGlmIChuYW1lU2V0LmhhcyhuYW1lKSkge1xuICAgICAgICBuYW1lID0gYCR7bmFtZX0tJHsoTWF0aC5yYW5kb20oKSArIDEpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgNSl9YDtcbiAgICAgIH1cbiAgICAgIG5hbWVTZXQuYWRkKG5hbWUpO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZG93bmxvYWQodXJsLCBmb2xkZXJQYXRoLCBuYW1lKTtcbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBhY3RpdmVGb2xkZXIgPSBub3JtYWxpemVQYXRoKFxuICAgICAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVGaWxlKCkucGFyZW50LnBhdGhcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgYWJzdHJhY3RBY3RpdmVGb2xkZXIgPSAoXG4gICAgICAgICAgdGhpcy5hcHAudmF1bHQuYWRhcHRlciBhcyBGaWxlU3lzdGVtQWRhcHRlclxuICAgICAgICApLmdldEZ1bGxQYXRoKGFjdGl2ZUZvbGRlcik7XG5cbiAgICAgICAgaW1hZ2VBcnJheS5wdXNoKHtcbiAgICAgICAgICBzb3VyY2U6IGZpbGUuc291cmNlLFxuICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgcGF0aDogbm9ybWFsaXplUGF0aChyZWxhdGl2ZShhYnN0cmFjdEFjdGl2ZUZvbGRlciwgcmVzcG9uc2UucGF0aCkpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgdmFsdWUgPSB0aGlzLmhlbHBlci5nZXRWYWx1ZSgpO1xuICAgIGltYWdlQXJyYXkubWFwKGltYWdlID0+IHtcbiAgICAgIGxldCBuYW1lID0gdGhpcy5oYW5kbGVOYW1lKGltYWdlLm5hbWUpO1xuXG4gICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoXG4gICAgICAgIGltYWdlLnNvdXJjZSxcbiAgICAgICAgYCFbJHtuYW1lfV0oJHtlbmNvZGVVUkkoaW1hZ2UucGF0aCl9KWBcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjdXJyZW50RmlsZSA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVGaWxlKCk7XG4gICAgaWYgKGFjdGl2ZUZpbGUucGF0aCAhPT0gY3VycmVudEZpbGUucGF0aCkge1xuICAgICAgbmV3IE5vdGljZSh0KFwiRmlsZSBoYXMgYmVlbiBjaGFuZ2VkZCwgZG93bmxvYWQgZmFpbHVyZVwiKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaGVscGVyLnNldFZhbHVlKHZhbHVlKTtcblxuICAgIG5ldyBOb3RpY2UoXG4gICAgICBgYWxsOiAke2ZpbGVBcnJheS5sZW5ndGh9XFxuc3VjY2VzczogJHtpbWFnZUFycmF5Lmxlbmd0aH1cXG5mYWlsZWQ6ICR7XG4gICAgICAgIGZpbGVBcnJheS5sZW5ndGggLSBpbWFnZUFycmF5Lmxlbmd0aFxuICAgICAgfWBcbiAgICApO1xuICB9XG5cbiAgLy8g6I635Y+W5b2T5YmN5paH5Lu25omA5bGe55qE6ZmE5Lu25paH5Lu25aS5XG4gIGdldEZpbGVBc3NldFBhdGgoKSB7XG4gICAgY29uc3QgYmFzZVBhdGggPSAoXG4gICAgICB0aGlzLmFwcC52YXVsdC5hZGFwdGVyIGFzIEZpbGVTeXN0ZW1BZGFwdGVyXG4gICAgKS5nZXRCYXNlUGF0aCgpO1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IGFzc2V0Rm9sZGVyOiBzdHJpbmcgPSB0aGlzLmFwcC52YXVsdC5jb25maWcuYXR0YWNobWVudEZvbGRlclBhdGg7XG4gICAgY29uc3QgYWN0aXZlRmlsZSA9IHRoaXMuYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChcbiAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVGaWxlKCkucGF0aFxuICAgICk7XG5cbiAgICAvLyDlvZPliY3mlofku7blpLnkuIvnmoTlrZDmlofku7blpLlcbiAgICBpZiAoYXNzZXRGb2xkZXIuc3RhcnRzV2l0aChcIi4vXCIpKSB7XG4gICAgICBjb25zdCBhY3RpdmVGb2xkZXIgPSBkZWNvZGVVUkkocmVzb2x2ZShiYXNlUGF0aCwgYWN0aXZlRmlsZS5wYXJlbnQucGF0aCkpO1xuICAgICAgcmV0dXJuIGpvaW4oYWN0aXZlRm9sZGVyLCBhc3NldEZvbGRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOagueaWh+S7tuWkuVxuICAgICAgcmV0dXJuIGpvaW4oYmFzZVBhdGgsIGFzc2V0Rm9sZGVyKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBkb3dubG9hZCh1cmw6IHN0cmluZywgZm9sZGVyUGF0aDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3RVcmwoeyB1cmwgfSk7XG4gICAgY29uc3QgdHlwZSA9IGF3YWl0IGltYWdlVHlwZShuZXcgVWludDhBcnJheShyZXNwb25zZS5hcnJheUJ1ZmZlcikpO1xuXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvazogZmFsc2UsXG4gICAgICAgIG1zZzogXCJlcnJvclwiLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKCF0eXBlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvazogZmFsc2UsXG4gICAgICAgIG1zZzogXCJlcnJvclwiLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShyZXNwb25zZS5hcnJheUJ1ZmZlcik7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcGF0aCA9IGpvaW4oZm9sZGVyUGF0aCwgYCR7bmFtZX0uJHt0eXBlLmV4dH1gKTtcblxuICAgICAgd3JpdGVGaWxlU3luYyhwYXRoLCBidWZmZXIpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb2s6IHRydWUsXG4gICAgICAgIG1zZzogXCJva1wiLFxuICAgICAgICBwYXRoOiBwYXRoLFxuICAgICAgICB0eXBlLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgbXNnOiBlcnIsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyRmlsZU1lbnUoKSB7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KFxuICAgICAgdGhpcy5hcHAud29ya3NwYWNlLm9uKFxuICAgICAgICBcImZpbGUtbWVudVwiLFxuICAgICAgICAobWVudTogTWVudSwgZmlsZTogVEZpbGUsIHNvdXJjZTogc3RyaW5nLCBsZWFmKSA9PiB7XG4gICAgICAgICAgaWYgKHNvdXJjZSA9PT0gXCJjYW52YXMtbWVudVwiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgaWYgKCFpc0Fzc2V0VHlwZUFuSW1hZ2UoZmlsZS5wYXRoKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgbWVudS5hZGRJdGVtKChpdGVtOiBNZW51SXRlbSkgPT4ge1xuICAgICAgICAgICAgaXRlbVxuICAgICAgICAgICAgICAuc2V0VGl0bGUoXCJVcGxvYWRcIilcbiAgICAgICAgICAgICAgLnNldEljb24oXCJ1cGxvYWRcIilcbiAgICAgICAgICAgICAgLm9uQ2xpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghKGZpbGUgaW5zdGFuY2VvZiBURmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlTWVudVVwbG9hZChmaWxlKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgZmlsZU1lbnVVcGxvYWQoZmlsZTogVEZpbGUpIHtcbiAgICBsZXQgY29udGVudCA9IHRoaXMuaGVscGVyLmdldFZhbHVlKCk7XG5cbiAgICBjb25zdCBiYXNlUGF0aCA9IChcbiAgICAgIHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIgYXMgRmlsZVN5c3RlbUFkYXB0ZXJcbiAgICApLmdldEJhc2VQYXRoKCk7XG4gICAgbGV0IGltYWdlTGlzdDogSW1hZ2VbXSA9IFtdO1xuICAgIGNvbnN0IGZpbGVBcnJheSA9IHRoaXMuaGVscGVyLmdldEFsbEZpbGVzKCk7XG5cbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGZpbGVBcnJheSkge1xuICAgICAgY29uc3QgaW1hZ2VOYW1lID0gbWF0Y2gubmFtZTtcbiAgICAgIGNvbnN0IGVuY29kZWRVcmkgPSBtYXRjaC5wYXRoO1xuXG4gICAgICBjb25zdCBmaWxlTmFtZSA9IGJhc2VuYW1lKGRlY29kZVVSSShlbmNvZGVkVXJpKSk7XG5cbiAgICAgIGlmIChmaWxlICYmIGZpbGUubmFtZSA9PT0gZmlsZU5hbWUpIHtcbiAgICAgICAgY29uc3QgYWJzdHJhY3RJbWFnZUZpbGUgPSBqb2luKGJhc2VQYXRoLCBmaWxlLnBhdGgpO1xuXG4gICAgICAgIGlmIChpc0Fzc2V0VHlwZUFuSW1hZ2UoYWJzdHJhY3RJbWFnZUZpbGUpKSB7XG4gICAgICAgICAgaW1hZ2VMaXN0LnB1c2goe1xuICAgICAgICAgICAgcGF0aDogYWJzdHJhY3RJbWFnZUZpbGUsXG4gICAgICAgICAgICBuYW1lOiBpbWFnZU5hbWUsXG4gICAgICAgICAgICBzb3VyY2U6IG1hdGNoLnNvdXJjZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpbWFnZUxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICBuZXcgTm90aWNlKHQoXCJDYW4gbm90IGZpbmQgaW1hZ2UgZmlsZVwiKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy51cGxvYWRlci51cGxvYWRGaWxlcyhpbWFnZUxpc3QubWFwKGl0ZW0gPT4gaXRlbS5wYXRoKSkudGhlbihyZXMgPT4ge1xuICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XG4gICAgICAgIGxldCB1cGxvYWRVcmxMaXN0ID0gcmVzLnJlc3VsdDtcbiAgICAgICAgaW1hZ2VMaXN0Lm1hcChpdGVtID0+IHtcbiAgICAgICAgICBjb25zdCB1cGxvYWRJbWFnZSA9IHVwbG9hZFVybExpc3Quc2hpZnQoKTtcbiAgICAgICAgICBsZXQgbmFtZSA9IHRoaXMuaGFuZGxlTmFtZShpdGVtLm5hbWUpO1xuXG4gICAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZUFsbChcbiAgICAgICAgICAgIGl0ZW0uc291cmNlLFxuICAgICAgICAgICAgYCFbJHtuYW1lfV0oJHt1cGxvYWRJbWFnZX0pYFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmhlbHBlci5zZXRWYWx1ZShjb250ZW50KTtcblxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5kZWxldGVTb3VyY2UpIHtcbiAgICAgICAgICBpbWFnZUxpc3QubWFwKGltYWdlID0+IHtcbiAgICAgICAgICAgIGlmICghaW1hZ2UucGF0aC5zdGFydHNXaXRoKFwiaHR0cFwiKSkge1xuICAgICAgICAgICAgICB1bmxpbmsoaW1hZ2UucGF0aCwgKCkgPT4ge30pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXcgTm90aWNlKFwiVXBsb2FkIGVycm9yXCIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZmlsdGVyRmlsZShmaWxlQXJyYXk6IEltYWdlW10pIHtcbiAgICBjb25zdCBpbWFnZUxpc3Q6IEltYWdlW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgZmlsZUFycmF5KSB7XG4gICAgICBpZiAobWF0Y2gucGF0aC5zdGFydHNXaXRoKFwiaHR0cFwiKSkge1xuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy53b3JrT25OZXRXb3JrKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRoaXMuaGVscGVyLmhhc0JsYWNrRG9tYWluKFxuICAgICAgICAgICAgICBtYXRjaC5wYXRoLFxuICAgICAgICAgICAgICB0aGlzLnNldHRpbmdzLm5ld1dvcmtCbGFja0RvbWFpbnNcbiAgICAgICAgICAgIClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGltYWdlTGlzdC5wdXNoKHtcbiAgICAgICAgICAgICAgcGF0aDogbWF0Y2gucGF0aCxcbiAgICAgICAgICAgICAgbmFtZTogbWF0Y2gubmFtZSxcbiAgICAgICAgICAgICAgc291cmNlOiBtYXRjaC5zb3VyY2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGltYWdlTGlzdC5wdXNoKHtcbiAgICAgICAgICBwYXRoOiBtYXRjaC5wYXRoLFxuICAgICAgICAgIG5hbWU6IG1hdGNoLm5hbWUsXG4gICAgICAgICAgc291cmNlOiBtYXRjaC5zb3VyY2UsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbWFnZUxpc3Q7XG4gIH1cbiAgZ2V0RmlsZShmaWxlTmFtZTogc3RyaW5nLCBmaWxlTWFwOiBhbnkpIHtcbiAgICBpZiAoIWZpbGVNYXApIHtcbiAgICAgIGZpbGVNYXAgPSBhcnJheVRvT2JqZWN0KHRoaXMuYXBwLnZhdWx0LmdldEZpbGVzKCksIFwibmFtZVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbGVNYXBbZmlsZU5hbWVdO1xuICB9XG4gIC8vIHVwbG9kYSBhbGwgZmlsZVxuICB1cGxvYWRBbGxGaWxlKCkge1xuICAgIGxldCBjb250ZW50ID0gdGhpcy5oZWxwZXIuZ2V0VmFsdWUoKTtcblxuICAgIGNvbnN0IGJhc2VQYXRoID0gKFxuICAgICAgdGhpcy5hcHAudmF1bHQuYWRhcHRlciBhcyBGaWxlU3lzdGVtQWRhcHRlclxuICAgICkuZ2V0QmFzZVBhdGgoKTtcbiAgICBjb25zdCBhY3RpdmVGaWxlID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcbiAgICBjb25zdCBmaWxlTWFwID0gYXJyYXlUb09iamVjdCh0aGlzLmFwcC52YXVsdC5nZXRGaWxlcygpLCBcIm5hbWVcIik7XG4gICAgY29uc3QgZmlsZVBhdGhNYXAgPSBhcnJheVRvT2JqZWN0KHRoaXMuYXBwLnZhdWx0LmdldEZpbGVzKCksIFwicGF0aFwiKTtcbiAgICBsZXQgaW1hZ2VMaXN0OiBJbWFnZVtdID0gW107XG4gICAgY29uc3QgZmlsZUFycmF5ID0gdGhpcy5maWx0ZXJGaWxlKHRoaXMuaGVscGVyLmdldEFsbEZpbGVzKCkpO1xuXG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBmaWxlQXJyYXkpIHtcbiAgICAgIGNvbnN0IGltYWdlTmFtZSA9IG1hdGNoLm5hbWU7XG4gICAgICBjb25zdCBlbmNvZGVkVXJpID0gbWF0Y2gucGF0aDtcblxuICAgICAgaWYgKGVuY29kZWRVcmkuc3RhcnRzV2l0aChcImh0dHBcIikpIHtcbiAgICAgICAgaW1hZ2VMaXN0LnB1c2goe1xuICAgICAgICAgIHBhdGg6IG1hdGNoLnBhdGgsXG4gICAgICAgICAgbmFtZTogaW1hZ2VOYW1lLFxuICAgICAgICAgIHNvdXJjZTogbWF0Y2guc291cmNlLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gYmFzZW5hbWUoZGVjb2RlVVJJKGVuY29kZWRVcmkpKTtcbiAgICAgICAgbGV0IGZpbGU7XG4gICAgICAgIC8vIOe7neWvuei3r+W+hFxuICAgICAgICBpZiAoZmlsZVBhdGhNYXBbZGVjb2RlVVJJKGVuY29kZWRVcmkpXSkge1xuICAgICAgICAgIGZpbGUgPSBmaWxlUGF0aE1hcFtkZWNvZGVVUkkoZW5jb2RlZFVyaSldO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g55u45a+56Lev5b6EXG4gICAgICAgIGlmIChcbiAgICAgICAgICAoIWZpbGUgJiYgZGVjb2RlVVJJKGVuY29kZWRVcmkpLnN0YXJ0c1dpdGgoXCIuL1wiKSkgfHxcbiAgICAgICAgICBkZWNvZGVVUkkoZW5jb2RlZFVyaSkuc3RhcnRzV2l0aChcIi4uL1wiKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHJlc29sdmUoXG4gICAgICAgICAgICBqb2luKGJhc2VQYXRoLCBkaXJuYW1lKGFjdGl2ZUZpbGUucGF0aCkpLFxuICAgICAgICAgICAgZGVjb2RlVVJJKGVuY29kZWRVcmkpXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChleGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgICAgICAgICAgY29uc3QgcGF0aCA9IG5vcm1hbGl6ZVBhdGgoXG4gICAgICAgICAgICAgIHJlbGF0aXZlKFxuICAgICAgICAgICAgICAgIGJhc2VQYXRoLFxuICAgICAgICAgICAgICAgIHJlc29sdmUoXG4gICAgICAgICAgICAgICAgICBqb2luKGJhc2VQYXRoLCBkaXJuYW1lKGFjdGl2ZUZpbGUucGF0aCkpLFxuICAgICAgICAgICAgICAgICAgZGVjb2RlVVJJKGVuY29kZWRVcmkpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBmaWxlID0gZmlsZVBhdGhNYXBbcGF0aF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIOWwveWPr+iDveefrei3r+W+hFxuICAgICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgICBmaWxlID0gdGhpcy5nZXRGaWxlKGZpbGVOYW1lLCBmaWxlTWFwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgICAgY29uc3QgYWJzdHJhY3RJbWFnZUZpbGUgPSBqb2luKGJhc2VQYXRoLCBmaWxlLnBhdGgpO1xuXG4gICAgICAgICAgaWYgKGlzQXNzZXRUeXBlQW5JbWFnZShhYnN0cmFjdEltYWdlRmlsZSkpIHtcbiAgICAgICAgICAgIGltYWdlTGlzdC5wdXNoKHtcbiAgICAgICAgICAgICAgcGF0aDogYWJzdHJhY3RJbWFnZUZpbGUsXG4gICAgICAgICAgICAgIG5hbWU6IGltYWdlTmFtZSxcbiAgICAgICAgICAgICAgc291cmNlOiBtYXRjaC5zb3VyY2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaW1hZ2VMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgbmV3IE5vdGljZSh0KFwiQ2FuIG5vdCBmaW5kIGltYWdlIGZpbGVcIikpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXcgTm90aWNlKGDlhbHmib7liLAke2ltYWdlTGlzdC5sZW5ndGh95Liq5Zu+5YOP5paH5Lu277yM5byA5aeL5LiK5LygYCk7XG4gICAgfVxuXG4gICAgdGhpcy51cGxvYWRlci51cGxvYWRGaWxlcyhpbWFnZUxpc3QubWFwKGl0ZW0gPT4gaXRlbS5wYXRoKSkudGhlbihyZXMgPT4ge1xuICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XG4gICAgICAgIGxldCB1cGxvYWRVcmxMaXN0ID0gcmVzLnJlc3VsdDtcblxuICAgICAgICBpZiAoaW1hZ2VMaXN0Lmxlbmd0aCAhPT0gdXBsb2FkVXJsTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICBuZXcgTm90aWNlKFxuICAgICAgICAgICAgdChcIldhcm5pbmc6IHVwbG9hZCBmaWxlcyBpcyBkaWZmZXJlbnQgb2YgcmVjaXZlciBmaWxlcyBmcm9tIGFwaVwiKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpbWFnZUxpc3QubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgIGNvbnN0IHVwbG9hZEltYWdlID0gdXBsb2FkVXJsTGlzdC5zaGlmdCgpO1xuXG4gICAgICAgICAgbGV0IG5hbWUgPSB0aGlzLmhhbmRsZU5hbWUoaXRlbS5uYW1lKTtcbiAgICAgICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKFxuICAgICAgICAgICAgaXRlbS5zb3VyY2UsXG4gICAgICAgICAgICBgIVske25hbWV9XSgke3VwbG9hZEltYWdlfSlgXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRGaWxlID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcbiAgICAgICAgaWYgKGFjdGl2ZUZpbGUucGF0aCAhPT0gY3VycmVudEZpbGUucGF0aCkge1xuICAgICAgICAgIG5ldyBOb3RpY2UodChcIkZpbGUgaGFzIGJlZW4gY2hhbmdlZGQsIHVwbG9hZCBmYWlsdXJlXCIpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oZWxwZXIuc2V0VmFsdWUoY29udGVudCk7XG5cbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuZGVsZXRlU291cmNlKSB7XG4gICAgICAgICAgaW1hZ2VMaXN0Lm1hcChpbWFnZSA9PiB7XG4gICAgICAgICAgICBpZiAoIWltYWdlLnBhdGguc3RhcnRzV2l0aChcImh0dHBcIikpIHtcbiAgICAgICAgICAgICAgdW5saW5rKGltYWdlLnBhdGgsICgpID0+IHt9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3IE5vdGljZShcIlVwbG9hZCBlcnJvclwiKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldHVwUGFzdGVIYW5kbGVyKCkge1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudChcbiAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5vbihcbiAgICAgICAgXCJlZGl0b3ItcGFzdGVcIixcbiAgICAgICAgKGV2dDogQ2xpcGJvYXJkRXZlbnQsIGVkaXRvcjogRWRpdG9yLCBtYXJrZG93blZpZXc6IE1hcmtkb3duVmlldykgPT4ge1xuICAgICAgICAgIGNvbnN0IGFsbG93VXBsb2FkID0gdGhpcy5oZWxwZXIuZ2V0RnJvbnRtYXR0ZXJWYWx1ZShcbiAgICAgICAgICAgIFwiaW1hZ2UtYXV0by11cGxvYWRcIixcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MudXBsb2FkQnlDbGlwU3dpdGNoXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGxldCBmaWxlcyA9IGV2dC5jbGlwYm9hcmREYXRhLmZpbGVzO1xuICAgICAgICAgIGlmICghYWxsb3dVcGxvYWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyDliarotLTmnb/lhoXlrrnmnIltZOagvOW8j+eahOWbvueJh+aXtlxuICAgICAgICAgIGlmICh0aGlzLnNldHRpbmdzLndvcmtPbk5ldFdvcmspIHtcbiAgICAgICAgICAgIGNvbnN0IGNsaXBib2FyZFZhbHVlID0gZXZ0LmNsaXBib2FyZERhdGEuZ2V0RGF0YShcInRleHQvcGxhaW5cIik7XG4gICAgICAgICAgICBjb25zdCBpbWFnZUxpc3QgPSB0aGlzLmhlbHBlclxuICAgICAgICAgICAgICAuZ2V0SW1hZ2VMaW5rKGNsaXBib2FyZFZhbHVlKVxuICAgICAgICAgICAgICAuZmlsdGVyKGltYWdlID0+IGltYWdlLnBhdGguc3RhcnRzV2l0aChcImh0dHBcIikpXG4gICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgaW1hZ2UgPT5cbiAgICAgICAgICAgICAgICAgICF0aGlzLmhlbHBlci5oYXNCbGFja0RvbWFpbihcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2UucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5uZXdXb3JrQmxhY2tEb21haW5zXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChpbWFnZUxpc3QubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgIHRoaXMudXBsb2FkZXJcbiAgICAgICAgICAgICAgICAudXBsb2FkRmlsZXMoaW1hZ2VMaXN0Lm1hcChpdGVtID0+IGl0ZW0ucGF0aCkpXG4gICAgICAgICAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuaGVscGVyLmdldFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVwbG9hZFVybExpc3QgPSByZXMucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICBpbWFnZUxpc3QubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwbG9hZEltYWdlID0gdXBsb2FkVXJsTGlzdC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gdGhpcy5oYW5kbGVOYW1lKGl0ZW0ubmFtZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2VBbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGAhWyR7bmFtZX1dKCR7dXBsb2FkSW1hZ2V9KWBcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWxwZXIuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZShcIlVwbG9hZCBlcnJvclwiKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyDliarotLTmnb/kuK3mmK/lm77niYfml7bov5vooYzkuIrkvKBcbiAgICAgICAgICBpZiAodGhpcy5jYW5VcGxvYWQoZXZ0LmNsaXBib2FyZERhdGEpKSB7XG4gICAgICAgICAgICB0aGlzLnVwbG9hZEZpbGVBbmRFbWJlZEltZ3VySW1hZ2UoXG4gICAgICAgICAgICAgIGVkaXRvcixcbiAgICAgICAgICAgICAgYXN5bmMgKGVkaXRvcjogRWRpdG9yLCBwYXN0ZUlkOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzOiBhbnk7XG4gICAgICAgICAgICAgICAgcmVzID0gYXdhaXQgdGhpcy51cGxvYWRlci51cGxvYWRGaWxlQnlDbGlwYm9hcmQoXG4gICAgICAgICAgICAgICAgICBldnQuY2xpcGJvYXJkRGF0YS5maWxlc1xuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVzLmNvZGUgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRmFpbGVkVXBsb2FkKGVkaXRvciwgcGFzdGVJZCwgcmVzLm1zZyk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IHJlcy5kYXRhO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVybDtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZXZ0LmNsaXBib2FyZERhdGFcbiAgICAgICAgICAgICkuY2F0Y2goKTtcbiAgICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KFxuICAgICAgdGhpcy5hcHAud29ya3NwYWNlLm9uKFxuICAgICAgICBcImVkaXRvci1kcm9wXCIsXG4gICAgICAgIGFzeW5jIChldnQ6IERyYWdFdmVudCwgZWRpdG9yOiBFZGl0b3IsIG1hcmtkb3duVmlldzogTWFya2Rvd25WaWV3KSA9PiB7XG4gICAgICAgICAgY29uc3QgYWxsb3dVcGxvYWQgPSB0aGlzLmhlbHBlci5nZXRGcm9udG1hdHRlclZhbHVlKFxuICAgICAgICAgICAgXCJpbWFnZS1hdXRvLXVwbG9hZFwiLFxuICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy51cGxvYWRCeUNsaXBTd2l0Y2hcbiAgICAgICAgICApO1xuICAgICAgICAgIGxldCBmaWxlcyA9IGV2dC5kYXRhVHJhbnNmZXIuZmlsZXM7XG5cbiAgICAgICAgICBpZiAoIWFsbG93VXBsb2FkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZpbGVzLmxlbmd0aCAhPT0gMCAmJiBmaWxlc1swXS50eXBlLnN0YXJ0c1dpdGgoXCJpbWFnZVwiKSkge1xuICAgICAgICAgICAgbGV0IHNlbmRGaWxlczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgICAgICAgICAgbGV0IGZpbGVzID0gZXZ0LmRhdGFUcmFuc2Zlci5maWxlcztcbiAgICAgICAgICAgIEFycmF5LmZyb20oZmlsZXMpLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgIHNlbmRGaWxlcy5wdXNoKGl0ZW0ucGF0aCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy51cGxvYWRlci51cGxvYWRGaWxlcyhzZW5kRmlsZXMpO1xuXG4gICAgICAgICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgIGRhdGEucmVzdWx0Lm1hcCgodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBwYXN0ZUlkID0gKE1hdGgucmFuZG9tKCkgKyAxKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDUpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0VGVtcG9yYXJ5VGV4dChlZGl0b3IsIHBhc3RlSWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1iZWRNYXJrRG93bkltYWdlKGVkaXRvciwgcGFzdGVJZCwgdmFsdWUsIGZpbGVzWzBdLm5hbWUpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG5ldyBOb3RpY2UoXCJVcGxvYWQgZXJyb3JcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIGNhblVwbG9hZChjbGlwYm9hcmREYXRhOiBEYXRhVHJhbnNmZXIpIHtcbiAgICB0aGlzLnNldHRpbmdzLmFwcGx5SW1hZ2U7XG4gICAgY29uc3QgZmlsZXMgPSBjbGlwYm9hcmREYXRhLmZpbGVzO1xuICAgIGNvbnN0IHRleHQgPSBjbGlwYm9hcmREYXRhLmdldERhdGEoXCJ0ZXh0XCIpO1xuXG4gICAgY29uc3QgaGFzSW1hZ2VGaWxlID1cbiAgICAgIGZpbGVzLmxlbmd0aCAhPT0gMCAmJiBmaWxlc1swXS50eXBlLnN0YXJ0c1dpdGgoXCJpbWFnZVwiKTtcbiAgICBpZiAoaGFzSW1hZ2VGaWxlKSB7XG4gICAgICBpZiAoISF0ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLmFwcGx5SW1hZ2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwbG9hZEZpbGVBbmRFbWJlZEltZ3VySW1hZ2UoXG4gICAgZWRpdG9yOiBFZGl0b3IsXG4gICAgY2FsbGJhY2s6IEZ1bmN0aW9uLFxuICAgIGNsaXBib2FyZERhdGE6IERhdGFUcmFuc2ZlclxuICApIHtcbiAgICBsZXQgcGFzdGVJZCA9IChNYXRoLnJhbmRvbSgpICsgMSkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA1KTtcbiAgICB0aGlzLmluc2VydFRlbXBvcmFyeVRleHQoZWRpdG9yLCBwYXN0ZUlkKTtcbiAgICBjb25zdCBuYW1lID0gY2xpcGJvYXJkRGF0YS5maWxlc1swXS5uYW1lO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IGF3YWl0IGNhbGxiYWNrKGVkaXRvciwgcGFzdGVJZCk7XG4gICAgICB0aGlzLmVtYmVkTWFya0Rvd25JbWFnZShlZGl0b3IsIHBhc3RlSWQsIHVybCwgbmFtZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5oYW5kbGVGYWlsZWRVcGxvYWQoZWRpdG9yLCBwYXN0ZUlkLCBlKTtcbiAgICB9XG4gIH1cblxuICBpbnNlcnRUZW1wb3JhcnlUZXh0KGVkaXRvcjogRWRpdG9yLCBwYXN0ZUlkOiBzdHJpbmcpIHtcbiAgICBsZXQgcHJvZ3Jlc3NUZXh0ID0gaW1hZ2VBdXRvVXBsb2FkUGx1Z2luLnByb2dyZXNzVGV4dEZvcihwYXN0ZUlkKTtcbiAgICBlZGl0b3IucmVwbGFjZVNlbGVjdGlvbihwcm9ncmVzc1RleHQgKyBcIlxcblwiKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHByb2dyZXNzVGV4dEZvcihpZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGAhW1VwbG9hZGluZyBmaWxlLi4uJHtpZH1dKClgO1xuICB9XG5cbiAgZW1iZWRNYXJrRG93bkltYWdlKFxuICAgIGVkaXRvcjogRWRpdG9yLFxuICAgIHBhc3RlSWQ6IHN0cmluZyxcbiAgICBpbWFnZVVybDogYW55LFxuICAgIG5hbWU6IHN0cmluZyA9IFwiXCJcbiAgKSB7XG4gICAgbGV0IHByb2dyZXNzVGV4dCA9IGltYWdlQXV0b1VwbG9hZFBsdWdpbi5wcm9ncmVzc1RleHRGb3IocGFzdGVJZCk7XG4gICAgbmFtZSA9IHRoaXMuaGFuZGxlTmFtZShuYW1lKTtcblxuICAgIGxldCBtYXJrRG93bkltYWdlID0gYCFbJHtuYW1lfV0oJHtpbWFnZVVybH0pYDtcblxuICAgIGltYWdlQXV0b1VwbG9hZFBsdWdpbi5yZXBsYWNlRmlyc3RPY2N1cnJlbmNlKFxuICAgICAgZWRpdG9yLFxuICAgICAgcHJvZ3Jlc3NUZXh0LFxuICAgICAgbWFya0Rvd25JbWFnZVxuICAgICk7XG4gIH1cblxuICBoYW5kbGVGYWlsZWRVcGxvYWQoZWRpdG9yOiBFZGl0b3IsIHBhc3RlSWQ6IHN0cmluZywgcmVhc29uOiBhbnkpIHtcbiAgICBuZXcgTm90aWNlKHJlYXNvbik7XG4gICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCByZXF1ZXN0OiBcIiwgcmVhc29uKTtcbiAgICBsZXQgcHJvZ3Jlc3NUZXh0ID0gaW1hZ2VBdXRvVXBsb2FkUGx1Z2luLnByb2dyZXNzVGV4dEZvcihwYXN0ZUlkKTtcbiAgICBpbWFnZUF1dG9VcGxvYWRQbHVnaW4ucmVwbGFjZUZpcnN0T2NjdXJyZW5jZShcbiAgICAgIGVkaXRvcixcbiAgICAgIHByb2dyZXNzVGV4dCxcbiAgICAgIFwi4pqg77iPdXBsb2FkIGZhaWxlZCwgY2hlY2sgZGV2IGNvbnNvbGVcIlxuICAgICk7XG4gIH1cblxuICBoYW5kbGVOYW1lKG5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IGltYWdlU2l6ZVN1ZmZpeCA9IHRoaXMuc2V0dGluZ3MuaW1hZ2VTaXplU3VmZml4IHx8IFwiXCI7XG5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy5pbWFnZURlc2MgPT09IFwib3JpZ2luXCIpIHtcbiAgICAgIHJldHVybiBgJHtuYW1lfSR7aW1hZ2VTaXplU3VmZml4fWA7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNldHRpbmdzLmltYWdlRGVzYyA9PT0gXCJub25lXCIpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zZXR0aW5ncy5pbWFnZURlc2MgPT09IFwicmVtb3ZlRGVmYXVsdFwiKSB7XG4gICAgICBpZiAobmFtZSA9PT0gXCJpbWFnZS5wbmdcIikge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBgJHtuYW1lfSR7aW1hZ2VTaXplU3VmZml4fWA7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgJHtuYW1lfSR7aW1hZ2VTaXplU3VmZml4fWA7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHJlcGxhY2VGaXJzdE9jY3VycmVuY2UoXG4gICAgZWRpdG9yOiBFZGl0b3IsXG4gICAgdGFyZ2V0OiBzdHJpbmcsXG4gICAgcmVwbGFjZW1lbnQ6IHN0cmluZ1xuICApIHtcbiAgICBsZXQgbGluZXMgPSBlZGl0b3IuZ2V0VmFsdWUoKS5zcGxpdChcIlxcblwiKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgY2ggPSBsaW5lc1tpXS5pbmRleE9mKHRhcmdldCk7XG4gICAgICBpZiAoY2ggIT0gLTEpIHtcbiAgICAgICAgbGV0IGZyb20gPSB7IGxpbmU6IGksIGNoOiBjaCB9O1xuICAgICAgICBsZXQgdG8gPSB7IGxpbmU6IGksIGNoOiBjaCArIHRhcmdldC5sZW5ndGggfTtcbiAgICAgICAgZWRpdG9yLnJlcGxhY2VSYW5nZShyZXBsYWNlbWVudCwgZnJvbSwgdG8pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJjb3JlIiwiZ2xvYmFsIiwicmVxdWlyZSQkMSIsInJlcXVpcmUkJDIiLCJpc2V4ZSIsInBhdGgiLCJyZXF1aXJlJCQwIiwid2hpY2giLCJwYXRoS2V5TW9kdWxlIiwicmVzb2x2ZUNvbW1hbmQiLCJzaGViYW5nUmVnZXgiLCJzaGViYW5nQ29tbWFuZCIsInJlYWRTaGViYW5nIiwicmVxdWlyZSQkMyIsImlzV2luIiwicGFyc2UiLCJlbm9lbnQiLCJjcm9zc1NwYXduTW9kdWxlIiwic3RyaXBGaW5hbE5ld2xpbmUiLCJtaW1pY0ZuIiwibWltaWNGbk1vZHVsZSIsIm9uZXRpbWUiLCJvbmV0aW1lTW9kdWxlIiwic2lnbmFscyIsIl9vcyIsIl9yZWFsdGltZSIsInNpZ25hbHNCeU5hbWUiLCJtYWtlRXJyb3IiLCJub3JtYWxpemVTdGRpbyIsInN0ZGlvTW9kdWxlIiwicHJvY2VzcyIsInNpZ25hbEV4aXRNb2R1bGUiLCJzcGF3bmVkS2lsbCIsInNwYXduZWRDYW5jZWwiLCJzZXR1cFRpbWVvdXQiLCJ2YWxpZGF0ZVRpbWVvdXQiLCJzZXRFeGl0SGFuZGxlciIsImlzU3RyZWFtIiwiYnVmZmVyU3RyZWFtIiwic3RyZWFtIiwiZ2V0U3RyZWFtIiwiZ2V0U3RyZWFtTW9kdWxlIiwibWVyZ2VTdHJlYW0iLCJoYW5kbGVJbnB1dCIsIm1ha2VBbGxTdHJlYW0iLCJnZXRTcGF3bmVkUmVzdWx0IiwidmFsaWRhdGVJbnB1dFN5bmMiLCJtZXJnZVByb21pc2UiLCJnZXRTcGF3bmVkUHJvbWlzZSIsImpvaW5Db21tYW5kIiwiZ2V0RXNjYXBlZENvbW1hbmQiLCJwYXJzZUNvbW1hbmQiLCJyZXF1aXJlJCQ0IiwicmVxdWlyZSQkNSIsInJlcXVpcmUkJDYiLCJyZXF1aXJlJCQ3IiwicmVxdWlyZSQkOCIsInJlcXVpcmUkJDkiLCJyZXF1aXJlJCQxMCIsInJlcXVpcmUkJDExIiwiZXhlY2FNb2R1bGUiLCJ1c2VySW5mbyIsImV4ZWNhIiwiaW5oZXJpdHNfYnJvd3Nlck1vZHVsZSIsImluaGVyaXRzTW9kdWxlIiwicmVxdWlyZSQkMTIiLCJCdWZmZXIiLCJzdHJ0b2szLmZyb21CdWZmZXIiLCJzdHJ0b2szLkVuZE9mU3RyZWFtRXJyb3IiLCJUb2tlbi5TdHJpbmdUeXBlIiwiVG9rZW4uVUlOVDgiLCJUb2tlbi5JTlQzMl9CRSIsIlRva2VuLlVJTlQ2NF9MRSIsIlRva2VuLlVJTlQxNl9CRSIsIlRva2VuLlVJTlQxNl9MRSIsIlRva2VuLlVJTlQzMl9CRSIsIlRva2VuLlVJTlQzMl9MRSIsImV4dG5hbWUiLCJyZWFkRmlsZSIsInJlcXVlc3RVcmwiLCJGb3JtRGF0YSIsImZldGNoIiwiZXhlYyIsIk1hcmtkb3duVmlldyIsIm1vbWVudCIsIlNldHRpbmciLCJOb3RpY2UiLCJQbHVnaW5TZXR0aW5nVGFiIiwiYWRkSWNvbiIsImV4aXN0c1N5bmMiLCJta2RpclN5bmMiLCJqb2luIiwibm9ybWFsaXplUGF0aCIsInJlbGF0aXZlIiwicmVzb2x2ZSIsIndyaXRlRmlsZVN5bmMiLCJURmlsZSIsImJhc2VuYW1lIiwidW5saW5rIiwiZGlybmFtZSIsIlBsdWdpbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksYUFBYSxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNuQyxJQUFJLGFBQWEsR0FBRyxNQUFNLENBQUMsY0FBYztBQUN6QyxTQUFTLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxZQUFZLEtBQUssSUFBSSxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDcEYsUUFBUSxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDMUcsSUFBSSxPQUFPLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0IsQ0FBQyxDQUFDO0FBQ0Y7QUFDTyxTQUFTLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2hDLElBQUksSUFBSSxPQUFPLENBQUMsS0FBSyxVQUFVLElBQUksQ0FBQyxLQUFLLElBQUk7QUFDN0MsUUFBUSxNQUFNLElBQUksU0FBUyxDQUFDLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRywrQkFBK0IsQ0FBQyxDQUFDO0FBQ2xHLElBQUksYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN4QixJQUFJLFNBQVMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsRUFBRTtBQUMzQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxLQUFLLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDekYsQ0FBQztBQW9GRDtBQUNPLFNBQVMsU0FBUyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRTtBQUM3RCxJQUFJLFNBQVMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sS0FBSyxZQUFZLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsVUFBVSxPQUFPLEVBQUUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUNoSCxJQUFJLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUFFLFVBQVUsT0FBTyxFQUFFLE1BQU0sRUFBRTtBQUMvRCxRQUFRLFNBQVMsU0FBUyxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7QUFDbkcsUUFBUSxTQUFTLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7QUFDdEcsUUFBUSxTQUFTLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUU7QUFDdEgsUUFBUSxJQUFJLENBQUMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUUsS0FBSyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBQ0Q7QUFDTyxTQUFTLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFO0FBQzNDLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNySCxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLE1BQU0sS0FBSyxVQUFVLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxXQUFXLEVBQUUsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzdKLElBQUksU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxVQUFVLENBQUMsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDdEUsSUFBSSxTQUFTLElBQUksQ0FBQyxFQUFFLEVBQUU7QUFDdEIsUUFBUSxJQUFJLENBQUMsRUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7QUFDdEUsUUFBUSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSTtBQUN0RCxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FB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QyxJQUFJLENBQUMsR0FBRyxPQUFPLFFBQVEsS0FBSyxVQUFVLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsWUFBWSxFQUFFLE9BQU8sSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNyTixJQUFJLFNBQVMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksT0FBTyxDQUFDLFVBQVUsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEssSUFBSSxTQUFTLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUU7QUFDaEk7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzNQQSxDQUFBLE9BQWMsR0FBRyxNQUFLO0NBQ3RCLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSTtBQUNqQjtDQUNBLElBQUksRUFBRSxHQUFHLFdBQWE7QUFDdEI7QUFDQSxDQUFBLFNBQVMsWUFBWSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7QUFDdEMsR0FBRSxJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxLQUFLLFNBQVM7S0FDekMsT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQU87QUFDekM7R0FDRSxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQ2hCLEtBQUksT0FBTyxJQUFJO0lBQ1o7QUFDSDtBQUNBLEdBQUUsT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFDO0dBQzVCLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtBQUNsQyxLQUFJLE9BQU8sSUFBSTtJQUNaO0FBQ0gsR0FBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtLQUN2QyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxHQUFFO0FBQ3BDLEtBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLEVBQUU7QUFDekQsT0FBTSxPQUFPLElBQUk7TUFDWjtJQUNGO0FBQ0gsR0FBRSxPQUFPLEtBQUs7RUFDYjtBQUNEO0FBQ0EsQ0FBQSxTQUFTLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtBQUN6QyxHQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUU7QUFDaEQsS0FBSSxPQUFPLEtBQUs7SUFDYjtBQUNILEdBQUUsT0FBTyxZQUFZLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQztFQUNuQztBQUNEO0FBQ0EsQ0FBQSxTQUFTLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRTtHQUNqQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUU7QUFDcEMsS0FBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxLQUFLLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLEVBQUM7QUFDdkQsSUFBRyxFQUFDO0VBQ0g7QUFDRDtBQUNBLENBQUEsU0FBUyxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtBQUM5QixHQUFFLE9BQU8sU0FBUyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQztBQUNwRCxFQUFBOzs7Ozs7Ozs7O0FDekNBLENBQUEsSUFBYyxHQUFHLE1BQUs7Q0FDdEIsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFJO0FBQ2pCO0NBQ0EsSUFBSSxFQUFFLEdBQUcsV0FBYTtBQUN0QjtBQUNBLENBQUEsU0FBUyxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7R0FDakMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFO0FBQ3BDLEtBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsS0FBSyxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEVBQUM7QUFDakQsSUFBRyxFQUFDO0VBQ0g7QUFDRDtBQUNBLENBQUEsU0FBUyxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtHQUM1QixPQUFPLFNBQVMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQztFQUM3QztBQUNEO0FBQ0EsQ0FBQSxTQUFTLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO0dBQ2pDLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDO0VBQ2pEO0FBQ0Q7QUFDQSxDQUFBLFNBQVMsU0FBUyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7QUFDbkMsR0FBRSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSTtBQUNyQixHQUFFLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFHO0FBQ3BCLEdBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUc7QUFDcEI7QUFDQSxHQUFFLElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEtBQUssU0FBUztLQUNuQyxPQUFPLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRTtBQUNwRCxHQUFFLElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEtBQUssU0FBUztLQUNuQyxPQUFPLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRTtBQUNwRDtHQUNFLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFDO0dBQzFCLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFDO0dBQzFCLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFDO0FBQzVCLEdBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUM7QUFDaEI7QUFDQSxHQUFFLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDcEIsS0FBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssR0FBRyxLQUFLLEtBQUs7QUFDOUIsS0FBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssR0FBRyxLQUFLLEtBQUs7QUFDOUIsS0FBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLEtBQUssS0FBSyxLQUFLLEVBQUM7QUFDN0I7QUFDQSxHQUFFLE9BQU8sR0FBRztBQUNaLEVBQUE7Ozs7QUN2Q0EsSUFBSUEsT0FBSTtBQUNSLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLElBQUlDLGNBQU0sQ0FBQyxlQUFlLEVBQUU7QUFDNUQsRUFBRUQsTUFBSSxHQUFHRSxjQUF1QixHQUFBO0FBQ2hDLENBQUMsTUFBTTtBQUNQLEVBQUVGLE1BQUksR0FBR0csV0FBb0IsR0FBQTtBQUM3QixDQUFDO0FBQ0Q7QUFDQSxJQUFBLE9BQWMsR0FBR0MsUUFBSztBQUN0QkEsT0FBSyxDQUFDLElBQUksR0FBRyxLQUFJO0FBQ2pCO0FBQ0EsU0FBU0EsT0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFO0FBQ25DLEVBQUUsSUFBSSxPQUFPLE9BQU8sS0FBSyxVQUFVLEVBQUU7QUFDckMsSUFBSSxFQUFFLEdBQUcsUUFBTztBQUNoQixJQUFJLE9BQU8sR0FBRyxHQUFFO0FBQ2hCLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtBQUNYLElBQUksSUFBSSxPQUFPLE9BQU8sS0FBSyxVQUFVLEVBQUU7QUFDdkMsTUFBTSxNQUFNLElBQUksU0FBUyxDQUFDLHVCQUF1QixDQUFDO0FBQ2xELEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxVQUFVLE9BQU8sRUFBRSxNQUFNLEVBQUU7QUFDbEQsTUFBTUEsT0FBSyxDQUFDLElBQUksRUFBRSxPQUFPLElBQUksRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUNuRCxRQUFRLElBQUksRUFBRSxFQUFFO0FBQ2hCLFVBQVUsTUFBTSxDQUFDLEVBQUUsRUFBQztBQUNwQixTQUFTLE1BQU07QUFDZixVQUFVLE9BQU8sQ0FBQyxFQUFFLEVBQUM7QUFDckIsU0FBUztBQUNULE9BQU8sRUFBQztBQUNSLEtBQUssQ0FBQztBQUNOLEdBQUc7QUFDSDtBQUNBLEVBQUVKLE1BQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxJQUFJLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDOUM7QUFDQSxJQUFJLElBQUksRUFBRSxFQUFFO0FBQ1osTUFBTSxJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFO0FBQ25FLFFBQVEsRUFBRSxHQUFHLEtBQUk7QUFDakIsUUFBUSxFQUFFLEdBQUcsTUFBSztBQUNsQixPQUFPO0FBQ1AsS0FBSztBQUNMLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUM7QUFDZCxHQUFHLEVBQUM7QUFDSixDQUFDO0FBQ0Q7QUFDQSxTQUFTLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO0FBQzlCO0FBQ0EsRUFBRSxJQUFJO0FBQ04sSUFBSSxPQUFPQSxNQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDO0FBQ3pDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsRUFBRTtBQUNmLElBQUksSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtBQUNqRSxNQUFNLE9BQU8sS0FBSztBQUNsQixLQUFLLE1BQU07QUFDWCxNQUFNLE1BQU0sRUFBRTtBQUNkLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FDeERBLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxRQUFRLEtBQUssT0FBTztBQUM5QyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLFFBQVE7QUFDbkMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxPQUFNO0FBQ2pDO0FBQ0EsTUFBTUssTUFBSSxHQUFHQyxhQUFlO0FBQzVCLE1BQU0sS0FBSyxHQUFHLFNBQVMsR0FBRyxHQUFHLEdBQUcsSUFBRztBQUNuQyxNQUFNLEtBQUssR0FBR0osUUFBZ0I7QUFDOUI7QUFDQSxNQUFNLGdCQUFnQixHQUFHLENBQUMsR0FBRztBQUM3QixFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFDO0FBQ25FO0FBQ0EsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLO0FBQ2xDLEVBQUUsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssSUFBSSxNQUFLO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBLEVBQUUsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztBQUN4RTtBQUNBLE1BQU07QUFDTjtBQUNBLFFBQVEsSUFBSSxTQUFTLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDN0MsUUFBUSxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUk7QUFDeEMsbURBQW1ELEVBQUUsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDO0FBQ25FLE9BQU87QUFDUCxNQUFLO0FBQ0wsRUFBRSxNQUFNLFVBQVUsR0FBRyxTQUFTO0FBQzlCLE1BQU0sR0FBRyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxxQkFBcUI7QUFDakUsTUFBTSxHQUFFO0FBQ1IsRUFBRSxNQUFNLE9BQU8sR0FBRyxTQUFTLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBQztBQUM1RDtBQUNBLEVBQUUsSUFBSSxTQUFTLEVBQUU7QUFDakIsSUFBSSxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUU7QUFDcEQsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBQztBQUN6QixHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU87QUFDVCxJQUFJLE9BQU87QUFDWCxJQUFJLE9BQU87QUFDWCxJQUFJLFVBQVU7QUFDZCxHQUFHO0FBQ0gsRUFBQztBQUNEO0FBQ0EsTUFBTUssT0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEtBQUs7QUFDaEMsRUFBRSxJQUFJLE9BQU8sR0FBRyxLQUFLLFVBQVUsRUFBRTtBQUNqQyxJQUFJLEVBQUUsR0FBRyxJQUFHO0FBQ1osSUFBSSxHQUFHLEdBQUcsR0FBRTtBQUNaLEdBQUc7QUFDSCxFQUFFLElBQUksQ0FBQyxHQUFHO0FBQ1YsSUFBSSxHQUFHLEdBQUcsR0FBRTtBQUNaO0FBQ0EsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBQztBQUNoRSxFQUFFLE1BQU0sS0FBSyxHQUFHLEdBQUU7QUFDbEI7QUFDQSxFQUFFLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEtBQUs7QUFDckQsSUFBSSxJQUFJLENBQUMsS0FBSyxPQUFPLENBQUMsTUFBTTtBQUM1QixNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7QUFDckQsVUFBVSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkM7QUFDQSxJQUFJLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUM7QUFDNUIsSUFBSSxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBSztBQUN0RTtBQUNBLElBQUksTUFBTSxJQUFJLEdBQUdGLE1BQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBQztBQUN6QyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSTtBQUN6RSxRQUFRLEtBQUk7QUFDWjtBQUNBLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFDO0FBQzdCLEdBQUcsRUFBQztBQUNKO0FBQ0EsRUFBRSxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxLQUFLLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sS0FBSztBQUNqRSxJQUFJLElBQUksRUFBRSxLQUFLLE9BQU8sQ0FBQyxNQUFNO0FBQzdCLE1BQU0sT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNqQyxJQUFJLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUM7QUFDM0IsSUFBSSxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUs7QUFDeEQsTUFBTSxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRTtBQUNyQixRQUFRLElBQUksR0FBRyxDQUFDLEdBQUc7QUFDbkIsVUFBVSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUM7QUFDN0I7QUFDQSxVQUFVLE9BQU8sT0FBTyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakMsT0FBTztBQUNQLE1BQU0sT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzNDLEtBQUssRUFBQztBQUNOLEdBQUcsRUFBQztBQUNKO0FBQ0EsRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDOUQsRUFBQztBQUNEO0FBQ0EsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLO0FBQ2hDLEVBQUUsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFFO0FBQ2pCO0FBQ0EsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBQztBQUNoRSxFQUFFLE1BQU0sS0FBSyxHQUFHLEdBQUU7QUFDbEI7QUFDQSxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFO0FBQzVDLElBQUksTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFBQztBQUM1QixJQUFJLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFLO0FBQ3RFO0FBQ0EsSUFBSSxNQUFNLElBQUksR0FBR0EsTUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFDO0FBQ3pDLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJO0FBQ3pFLFFBQVEsS0FBSTtBQUNaO0FBQ0EsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRTtBQUM5QyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxFQUFDO0FBQ2hDLE1BQU0sSUFBSTtBQUNWLFFBQVEsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEVBQUM7QUFDM0QsUUFBUSxJQUFJLEVBQUUsRUFBRTtBQUNoQixVQUFVLElBQUksR0FBRyxDQUFDLEdBQUc7QUFDckIsWUFBWSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBQztBQUMzQjtBQUNBLFlBQVksT0FBTyxHQUFHO0FBQ3RCLFNBQVM7QUFDVCxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRTtBQUNyQixLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLE1BQU07QUFDN0IsSUFBSSxPQUFPLEtBQUs7QUFDaEI7QUFDQSxFQUFFLElBQUksR0FBRyxDQUFDLE9BQU87QUFDakIsSUFBSSxPQUFPLElBQUk7QUFDZjtBQUNBLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUM7QUFDN0IsRUFBQztBQUNEO0FBQ0EsSUFBQSxPQUFjLEdBQUdFLFFBQUs7QUFDdEJBLE9BQUssQ0FBQyxJQUFJLEdBQUc7Ozs7QUMxSGIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxPQUFPLEdBQUcsRUFBRSxLQUFLO0FBQ2xDLENBQUMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDO0FBQ2hELENBQUMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDO0FBQ3ZEO0FBQ0EsQ0FBQyxJQUFJLFFBQVEsS0FBSyxPQUFPLEVBQUU7QUFDM0IsRUFBRSxPQUFPLE1BQU0sQ0FBQztBQUNoQixFQUFFO0FBQ0Y7QUFDQSxDQUFDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxXQUFXLEVBQUUsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUM7QUFDL0YsQ0FBQyxDQUFDO0FBQ0Y7QUFDQUMsU0FBYyxDQUFBLE9BQUEsR0FBRyxPQUFPLENBQUM7QUFDekI7QUFDQUEsU0FBQSxDQUFBLE9BQUEsQ0FBQSxPQUFzQixHQUFHLFFBQU87Ozs7QUNiaEMsTUFBTUgsTUFBSSxHQUFHQyxZQUFlLENBQUM7QUFDN0IsTUFBTSxLQUFLLEdBQUdKLE9BQWdCLENBQUM7QUFDL0IsTUFBTSxVQUFVLEdBQUdDLGNBQW1CLENBQUM7QUFDdkM7QUFDQSxTQUFTLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUU7QUFDdkQsSUFBSSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDO0FBQ2xELElBQUksTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQzlCLElBQUksTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDO0FBQ3BEO0FBQ0EsSUFBSSxNQUFNLGVBQWUsR0FBRyxZQUFZLElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztBQUNuRztBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUksZUFBZSxFQUFFO0FBQ3pCLFFBQVEsSUFBSTtBQUNaLFlBQVksT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzlDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsRUFBRTtBQUN0QjtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksUUFBUSxDQUFDO0FBQ2pCO0FBQ0EsSUFBSSxJQUFJO0FBQ1IsUUFBUSxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO0FBQzlDLFlBQVksSUFBSSxFQUFFLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQzFDLFlBQVksT0FBTyxFQUFFLGNBQWMsR0FBR0UsTUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTO0FBQ2hFLFNBQVMsQ0FBQyxDQUFDO0FBQ1gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFO0FBQ2hCO0FBQ0EsS0FBSyxTQUFTO0FBQ2QsUUFBUSxJQUFJLGVBQWUsRUFBRTtBQUM3QixZQUFZLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDL0IsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUksUUFBUSxFQUFFO0FBQ2xCLFFBQVEsUUFBUSxHQUFHQSxNQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDbEYsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLFFBQVEsQ0FBQztBQUNwQixDQUFDO0FBQ0Q7QUFDQSxTQUFTSSxnQkFBYyxDQUFDLE1BQU0sRUFBRTtBQUNoQyxJQUFJLE9BQU8scUJBQXFCLENBQUMsTUFBTSxDQUFDLElBQUkscUJBQXFCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2hGLENBQUM7QUFDRDtBQUNBLElBQUEsZ0JBQWMsR0FBR0EsZ0JBQWM7Ozs7QUNqRC9CO0FBQ0EsTUFBTSxlQUFlLEdBQUcsMEJBQTBCLENBQUM7QUFDbkQ7QUFDQSxTQUFTLGFBQWEsQ0FBQyxHQUFHLEVBQUU7QUFDNUI7QUFDQSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUM5QztBQUNBLElBQUksT0FBTyxHQUFHLENBQUM7QUFDZixDQUFDO0FBQ0Q7QUFDQSxTQUFTLGNBQWMsQ0FBQyxHQUFHLEVBQUUscUJBQXFCLEVBQUU7QUFDcEQ7QUFDQSxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQjtBQUNBO0FBQ0EsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDOUM7QUFDQTtBQUNBLElBQUksSUFBSSxxQkFBcUIsRUFBRTtBQUMvQixRQUFRLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNsRCxLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sR0FBRyxDQUFDO0FBQ2YsQ0FBQztBQUNEO0FBQ3NCLE9BQUEsQ0FBQSxPQUFBLEdBQUcsY0FBYztBQUN2QyxPQUFBLENBQUEsUUFBdUIsR0FBRzs7QUMzQzFCLElBQUFDLGNBQWMsR0FBRyxTQUFTOztBQ0ExQixNQUFNLFlBQVksR0FBR0osY0FBd0IsQ0FBQztBQUM5QztBQUNBLElBQUFLLGdCQUFjLEdBQUcsQ0FBQyxNQUFNLEdBQUcsRUFBRSxLQUFLO0FBQ2xDLENBQUMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUMxQztBQUNBLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtBQUNiLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFDZCxFQUFFO0FBQ0Y7QUFDQSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2xFLENBQUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUN0QztBQUNBLENBQUMsSUFBSSxNQUFNLEtBQUssS0FBSyxFQUFFO0FBQ3ZCLEVBQUUsT0FBTyxRQUFRLENBQUM7QUFDbEIsRUFBRTtBQUNGO0FBQ0EsQ0FBQyxPQUFPLFFBQVEsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUNwRCxDQUFDOztBQ2hCRCxNQUFNLEVBQUUsR0FBRyxVQUFhLENBQUM7QUFDekIsTUFBTSxjQUFjLEdBQUdULGdCQUEwQixDQUFDO0FBQ2xEO0FBQ0EsU0FBU1UsYUFBVyxDQUFDLE9BQU8sRUFBRTtBQUM5QjtBQUNBLElBQUksTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDO0FBQ3JCLElBQUksTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN0QztBQUNBLElBQUksSUFBSSxFQUFFLENBQUM7QUFDWDtBQUNBLElBQUksSUFBSTtBQUNSLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUMsUUFBUSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3pCLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxlQUFlO0FBQy9CO0FBQ0E7QUFDQSxJQUFJLE9BQU8sY0FBYyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUFDRDtBQUNBLElBQUEsYUFBYyxHQUFHQSxhQUFXOztBQ3BCNUIsTUFBTVAsTUFBSSxHQUFHQyxZQUFlLENBQUM7QUFDN0IsTUFBTSxjQUFjLEdBQUdKLGdCQUFnQyxDQUFDO0FBQ3hELE1BQU0sTUFBTSxHQUFHQyxPQUF3QixDQUFDO0FBQ3hDLE1BQU0sV0FBVyxHQUFHVSxhQUE2QixDQUFDO0FBQ2xEO0FBQ0EsTUFBTUMsT0FBSyxHQUFHLE9BQU8sQ0FBQyxRQUFRLEtBQUssT0FBTyxDQUFDO0FBQzNDLE1BQU0sa0JBQWtCLEdBQUcsaUJBQWlCLENBQUM7QUFDN0MsTUFBTSxlQUFlLEdBQUcsMENBQTBDLENBQUM7QUFDbkU7QUFDQSxTQUFTLGFBQWEsQ0FBQyxNQUFNLEVBQUU7QUFDL0IsSUFBSSxNQUFNLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN6QztBQUNBLElBQUksTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzVEO0FBQ0EsSUFBSSxJQUFJLE9BQU8sRUFBRTtBQUNqQixRQUFRLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxRQUFRLE1BQU0sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0FBQ2pDO0FBQ0EsUUFBUSxPQUFPLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN0QyxLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQztBQUN2QixDQUFDO0FBQ0Q7QUFDQSxTQUFTLGFBQWEsQ0FBQyxNQUFNLEVBQUU7QUFDL0IsSUFBSSxJQUFJLENBQUNBLE9BQUssRUFBRTtBQUNoQixRQUFRLE9BQU8sTUFBTSxDQUFDO0FBQ3RCLEtBQUs7QUFDTDtBQUNBO0FBQ0EsSUFBSSxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDOUM7QUFDQTtBQUNBLElBQUksTUFBTSxVQUFVLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDN0Q7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxJQUFJLFVBQVUsRUFBRTtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsTUFBTSwwQkFBMEIsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQzdFO0FBQ0E7QUFDQTtBQUNBLFFBQVEsTUFBTSxDQUFDLE9BQU8sR0FBR1QsTUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDeEQ7QUFDQTtBQUNBLFFBQVEsTUFBTSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN4RCxRQUFRLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsMEJBQTBCLENBQUMsQ0FBQyxDQUFDO0FBQ2pHO0FBQ0EsUUFBUSxNQUFNLFlBQVksR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM1RTtBQUNBLFFBQVEsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlELFFBQVEsTUFBTSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxTQUFTLENBQUM7QUFDMUQsUUFBUSxNQUFNLENBQUMsT0FBTyxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQztBQUN2RCxLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFDRDtBQUNBLFNBQVNVLE9BQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtBQUN2QztBQUNBLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ3RDLFFBQVEsT0FBTyxHQUFHLElBQUksQ0FBQztBQUN2QixRQUFRLElBQUksR0FBRyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3JDLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3pDO0FBQ0E7QUFDQSxJQUFJLE1BQU0sTUFBTSxHQUFHO0FBQ25CLFFBQVEsT0FBTztBQUNmLFFBQVEsSUFBSTtBQUNaLFFBQVEsT0FBTztBQUNmLFFBQVEsSUFBSSxFQUFFLFNBQVM7QUFDdkIsUUFBUSxRQUFRLEVBQUU7QUFDbEIsWUFBWSxPQUFPO0FBQ25CLFlBQVksSUFBSTtBQUNoQixTQUFTO0FBQ1QsS0FBSyxDQUFDO0FBQ047QUFDQTtBQUNBLElBQUksT0FBTyxPQUFPLENBQUMsS0FBSyxHQUFHLE1BQU0sR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUNEO0FBQ0EsSUFBQSxPQUFjLEdBQUdBLE9BQUs7O0FDeEZ0QixNQUFNRCxPQUFLLEdBQUcsT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUM7QUFDM0M7QUFDQSxTQUFTLGFBQWEsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFO0FBQzFDLElBQUksT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRTtBQUM3RSxRQUFRLElBQUksRUFBRSxRQUFRO0FBQ3RCLFFBQVEsS0FBSyxFQUFFLFFBQVE7QUFDdkIsUUFBUSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2pELFFBQVEsSUFBSSxFQUFFLFFBQVEsQ0FBQyxPQUFPO0FBQzlCLFFBQVEsU0FBUyxFQUFFLFFBQVEsQ0FBQyxJQUFJO0FBQ2hDLEtBQUssQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUNEO0FBQ0EsU0FBUyxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFO0FBQ3RDLElBQUksSUFBSSxDQUFDQSxPQUFLLEVBQUU7QUFDaEIsUUFBUSxPQUFPO0FBQ2YsS0FBSztBQUNMO0FBQ0EsSUFBSSxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO0FBQ2pDO0FBQ0EsSUFBSSxFQUFFLENBQUMsSUFBSSxHQUFHLFVBQVUsSUFBSSxFQUFFLElBQUksRUFBRTtBQUNwQztBQUNBO0FBQ0E7QUFDQSxRQUFRLElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRTtBQUM3QixZQUFZLE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxJQUFJLEVBQUUsTUFBZSxDQUFDLENBQUM7QUFDNUQ7QUFDQSxZQUFZLElBQUksR0FBRyxFQUFFO0FBQ3JCLGdCQUFnQixPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMzRCxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0EsUUFBUSxPQUFPLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ2pELEtBQUssQ0FBQztBQUNOLENBQUM7QUFDRDtBQUNBLFNBQVMsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUU7QUFDdEMsSUFBSSxJQUFJQSxPQUFLLElBQUksTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUU7QUFDL0MsUUFBUSxPQUFPLGFBQWEsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZELEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQztBQUNEO0FBQ0EsU0FBUyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFO0FBQzFDLElBQUksSUFBSUEsT0FBSyxJQUFJLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFO0FBQy9DLFFBQVEsT0FBTyxhQUFhLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUMzRCxLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sSUFBSSxDQUFDO0FBQ2hCLENBQUM7QUFDRDtBQUNBLElBQUFFLFFBQWMsR0FBRztBQUNqQixJQUFJLGdCQUFnQjtBQUNwQixJQUFJLFlBQVk7QUFDaEIsSUFBSSxnQkFBZ0I7QUFDcEIsSUFBSSxhQUFhO0FBQ2pCLENBQUM7O0FDeERELE1BQU0sRUFBRSxHQUFHVixZQUF3QixDQUFDO0FBQ3BDLE1BQU0sS0FBSyxHQUFHSixPQUFzQixDQUFDO0FBQ3JDLE1BQU0sTUFBTSxHQUFHQyxRQUF1QixDQUFDO0FBQ3ZDO0FBQ0EsU0FBUyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7QUFDdkM7QUFDQSxJQUFJLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2pEO0FBQ0E7QUFDQSxJQUFJLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUMxRTtBQUNBO0FBQ0E7QUFDQSxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDN0M7QUFDQSxJQUFJLE9BQU8sT0FBTyxDQUFDO0FBQ25CLENBQUM7QUFDRDtBQUNBLFNBQVMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO0FBQzNDO0FBQ0EsSUFBSSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNqRDtBQUNBO0FBQ0EsSUFBSSxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDN0U7QUFDQTtBQUNBLElBQUksTUFBTSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ2xGO0FBQ0EsSUFBSSxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBQ0Q7QUFDQWMsWUFBYyxDQUFBLE9BQUEsR0FBRyxLQUFLLENBQUM7QUFDSEEsWUFBQSxDQUFBLE9BQUEsQ0FBQSxLQUFBLEdBQUcsTUFBTTtBQUNWQSxZQUFBLENBQUEsT0FBQSxDQUFBLElBQUEsR0FBRyxVQUFVO0FBQ2hDO0FBQ3FCQSxZQUFBLENBQUEsT0FBQSxDQUFBLE1BQUEsR0FBRyxNQUFNO0FBQzlCQSxZQUFBLENBQUEsT0FBQSxDQUFBLE9BQXNCLEdBQUcsT0FBTTs7OztJQ3BDL0JDLG1CQUFjLEdBQUcsS0FBSyxJQUFJO0FBQzFCLENBQUMsTUFBTSxFQUFFLEdBQUcsT0FBTyxLQUFLLEtBQUssUUFBUSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDakUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxPQUFPLEtBQUssS0FBSyxRQUFRLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUNqRTtBQUNBLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7QUFDckMsRUFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMzQyxFQUFFO0FBQ0Y7QUFDQSxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO0FBQ3JDLEVBQUUsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDM0MsRUFBRTtBQUNGO0FBQ0EsQ0FBQyxPQUFPLEtBQUssQ0FBQztBQUNkLENBQUM7Ozs7Ozs7Q0NkRCxNQUFNLElBQUksR0FBR1osWUFBZSxDQUFDO0NBQzdCLE1BQU0sT0FBTyxHQUFHSixjQUFtQixDQUFDO0FBQ3BDO0NBQ0EsTUFBTSxVQUFVLEdBQUcsT0FBTyxJQUFJO0FBQzlCLEVBQUMsT0FBTyxHQUFHO0FBQ1gsR0FBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRTtHQUNsQixJQUFJLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUM5QixHQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtBQUM1QixHQUFFLEdBQUcsT0FBTztBQUNaLEdBQUUsQ0FBQztBQUNIO0VBQ0MsSUFBSSxRQUFRLENBQUM7RUFDYixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6QyxFQUFDLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNuQjtBQUNBLEVBQUMsT0FBTyxRQUFRLEtBQUssT0FBTyxFQUFFO0FBQzlCLEdBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7R0FDckQsUUFBUSxHQUFHLE9BQU8sQ0FBQztHQUNuQixPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7R0FDdEM7QUFDRjtBQUNBO0FBQ0EsRUFBQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN2RSxFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDMUI7QUFDQSxFQUFDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN6RCxFQUFDLENBQUM7QUFDRjtBQUNBLENBQUEsTUFBQSxDQUFBLE9BQUEsR0FBaUIsVUFBVSxDQUFDO0FBQzVCO0FBQ0EsQ0FBQSxNQUFBLENBQUEsT0FBQSxDQUFBLE9BQUEsR0FBeUIsVUFBVSxDQUFDO0FBQ3BDO0FBQ0EsQ0FBQSxNQUFBLENBQUEsT0FBQSxDQUFBLEdBQUEsR0FBcUIsT0FBTyxJQUFJO0FBQ2hDLEVBQUMsT0FBTyxHQUFHO0FBQ1gsR0FBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7QUFDbEIsR0FBRSxHQUFHLE9BQU87QUFDWixHQUFFLENBQUM7QUFDSDtFQUNDLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDN0IsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3QjtFQUNDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0VBQ3pCLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3JDO0VBQ0MsT0FBTyxHQUFHLENBQUM7RUFDWCxDQUFBOzs7Ozs7Ozs7QUM1Q0QsTUFBTWlCLFNBQU8sR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLEtBQUs7QUFDOUIsQ0FBQyxLQUFLLE1BQU0sSUFBSSxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDM0MsRUFBRSxNQUFNLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQy9FLEVBQUU7QUFDRjtBQUNBLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDWCxDQUFDLENBQUM7QUFDRjtBQUNBQyxTQUFjLENBQUEsT0FBQSxHQUFHRCxTQUFPLENBQUM7QUFDekI7QUFDQUMsU0FBQSxDQUFBLE9BQUEsQ0FBQSxPQUFzQixHQUFHRCxVQUFPOzs7O0FDWGhDLE1BQU0sT0FBTyxHQUFHYixjQUFtQixDQUFDO0FBQ3BDO0FBQ0EsTUFBTSxlQUFlLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUN0QztBQUNBLE1BQU1lLFNBQU8sR0FBRyxDQUFDLFNBQVMsRUFBRSxPQUFPLEdBQUcsRUFBRSxLQUFLO0FBQzdDLENBQUMsSUFBSSxPQUFPLFNBQVMsS0FBSyxVQUFVLEVBQUU7QUFDdEMsRUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLHFCQUFxQixDQUFDLENBQUM7QUFDN0MsRUFBRTtBQUNGO0FBQ0EsQ0FBQyxJQUFJLFdBQVcsQ0FBQztBQUNqQixDQUFDLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztBQUNuQixDQUFDLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxXQUFXLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxhQUFhLENBQUM7QUFDL0U7QUFDQSxDQUFDLE1BQU0sT0FBTyxHQUFHLFVBQVUsR0FBRyxVQUFVLEVBQUU7QUFDMUMsRUFBRSxlQUFlLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzVDO0FBQ0EsRUFBRSxJQUFJLFNBQVMsS0FBSyxDQUFDLEVBQUU7QUFDdkIsR0FBRyxXQUFXLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDbkQsR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDO0FBQ3BCLEdBQUcsTUFBTSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssSUFBSSxFQUFFO0FBQ3JDLEdBQUcsTUFBTSxJQUFJLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDO0FBQzNFLEdBQUc7QUFDSDtBQUNBLEVBQUUsT0FBTyxXQUFXLENBQUM7QUFDckIsRUFBRSxDQUFDO0FBQ0g7QUFDQSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDN0IsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN6QztBQUNBLENBQUMsT0FBTyxPQUFPLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBQ0Y7QUFDQUMsU0FBYyxDQUFBLE9BQUEsR0FBR0QsU0FBTyxDQUFDO0FBQ3pCO0FBQ3NCQyxTQUFBLENBQUEsT0FBQSxDQUFBLE9BQUEsR0FBR0QsVUFBUTtBQUNqQztBQUN3QkMsU0FBQSxDQUFBLE9BQUEsQ0FBQSxTQUFBLEdBQUcsU0FBUyxJQUFJO0FBQ3hDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUU7QUFDdEMsRUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLENBQUMscUJBQXFCLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDLENBQUM7QUFDeEcsRUFBRTtBQUNGO0FBQ0EsQ0FBQyxPQUFPLGVBQWUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDdkMsRUFBQzs7Ozs7Ozs7OztBQzNDWSxNQUFNLENBQUMsY0FBYyxDQUFDLElBQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBZ0IsQ0FBQyxLQUFLLEVBQUU7QUFDN0Y7QUFDQSxNQUFNLE9BQU8sQ0FBQztBQUNkO0FBQ0EsSUFBSSxDQUFDLFFBQVE7QUFDYixNQUFNLENBQUMsQ0FBQztBQUNSLE1BQU0sQ0FBQyxXQUFXO0FBQ2xCLFdBQVcsQ0FBQyxpQkFBaUI7QUFDN0IsUUFBUSxDQUFDLE9BQU8sQ0FBQztBQUNqQjtBQUNBO0FBQ0EsSUFBSSxDQUFDLFFBQVE7QUFDYixNQUFNLENBQUMsQ0FBQztBQUNSLE1BQU0sQ0FBQyxXQUFXO0FBQ2xCLFdBQVcsQ0FBQywrQkFBK0I7QUFDM0MsUUFBUSxDQUFDLE1BQU0sQ0FBQztBQUNoQjtBQUNBO0FBQ0EsSUFBSSxDQUFDLFNBQVM7QUFDZCxNQUFNLENBQUMsQ0FBQztBQUNSLE1BQU0sQ0FBQyxNQUFNO0FBQ2IsV0FBVyxDQUFDLGdDQUFnQztBQUM1QyxRQUFRLENBQUMsT0FBTyxDQUFDO0FBQ2pCO0FBQ0E7QUFDQSxJQUFJLENBQUMsUUFBUTtBQUNiLE1BQU0sQ0FBQyxDQUFDO0FBQ1IsTUFBTSxDQUFDLE1BQU07QUFDYixXQUFXLENBQUMsNkJBQTZCO0FBQ3pDLFFBQVEsQ0FBQyxNQUFNLENBQUM7QUFDaEI7QUFDQTtBQUNBLElBQUksQ0FBQyxTQUFTO0FBQ2QsTUFBTSxDQUFDLENBQUM7QUFDUixNQUFNLENBQUMsTUFBTTtBQUNiLFdBQVcsQ0FBQyxxQkFBcUI7QUFDakMsUUFBUSxDQUFDLE9BQU8sQ0FBQztBQUNqQjtBQUNBO0FBQ0EsSUFBSSxDQUFDLFNBQVM7QUFDZCxNQUFNLENBQUMsQ0FBQztBQUNSLE1BQU0sQ0FBQyxNQUFNO0FBQ2IsV0FBVyxDQUFDLFNBQVM7QUFDckIsUUFBUSxDQUFDLE1BQU0sQ0FBQztBQUNoQjtBQUNBO0FBQ0EsSUFBSSxDQUFDLFFBQVE7QUFDYixNQUFNLENBQUMsQ0FBQztBQUNSLE1BQU0sQ0FBQyxNQUFNO0FBQ2IsV0FBVyxDQUFDLFNBQVM7QUFDckIsUUFBUSxDQUFDLEtBQUssQ0FBQztBQUNmO0FBQ0E7QUFDQSxJQUFJLENBQUMsUUFBUTtBQUNiLE1BQU0sQ0FBQyxDQUFDO0FBQ1IsTUFBTSxDQUFDLE1BQU07QUFDYixXQUFXO0FBQ1gsbUVBQW1FO0FBQ25FLFFBQVEsQ0FBQyxLQUFLLENBQUM7QUFDZjtBQUNBO0FBQ0EsSUFBSSxDQUFDLFFBQVE7QUFDYixNQUFNLENBQUMsQ0FBQztBQUNSLE1BQU0sQ0FBQyxXQUFXO0FBQ2xCLFdBQVcsQ0FBQyxtREFBbUQ7QUFDL0QsUUFBUSxDQUFDLE9BQU8sQ0FBQztBQUNqQjtBQUNBO0FBQ0EsSUFBSSxDQUFDLFFBQVE7QUFDYixNQUFNLENBQUMsQ0FBQztBQUNSLE1BQU0sQ0FBQyxNQUFNO0FBQ2IsV0FBVyxDQUFDLGlDQUFpQztBQUM3QyxRQUFRLENBQUMsTUFBTSxDQUFDO0FBQ2hCO0FBQ0E7QUFDQSxJQUFJLENBQUMsU0FBUztBQUNkLE1BQU0sQ0FBQyxDQUFDO0FBQ1IsTUFBTSxDQUFDLFdBQVc7QUFDbEIsV0FBVyxDQUFDLG9CQUFvQjtBQUNoQyxRQUFRLENBQUMsT0FBTztBQUNoQixNQUFNLENBQUMsSUFBSSxDQUFDO0FBQ1o7QUFDQTtBQUNBLElBQUksQ0FBQyxTQUFTO0FBQ2QsTUFBTSxDQUFDLEVBQUU7QUFDVCxNQUFNLENBQUMsV0FBVztBQUNsQixXQUFXLENBQUMsNkJBQTZCO0FBQ3pDLFFBQVEsQ0FBQyxPQUFPLENBQUM7QUFDakI7QUFDQTtBQUNBLElBQUksQ0FBQyxTQUFTO0FBQ2QsTUFBTSxDQUFDLEVBQUU7QUFDVCxNQUFNLENBQUMsTUFBTTtBQUNiLFdBQVcsQ0FBQyxvQkFBb0I7QUFDaEMsUUFBUSxDQUFDLE1BQU0sQ0FBQztBQUNoQjtBQUNBO0FBQ0EsSUFBSSxDQUFDLFNBQVM7QUFDZCxNQUFNLENBQUMsRUFBRTtBQUNULE1BQU0sQ0FBQyxXQUFXO0FBQ2xCLFdBQVcsQ0FBQyw2QkFBNkI7QUFDekMsUUFBUSxDQUFDLE9BQU8sQ0FBQztBQUNqQjtBQUNBO0FBQ0EsSUFBSSxDQUFDLFNBQVM7QUFDZCxNQUFNLENBQUMsRUFBRTtBQUNULE1BQU0sQ0FBQyxXQUFXO0FBQ2xCLFdBQVcsQ0FBQyx1QkFBdUI7QUFDbkMsUUFBUSxDQUFDLE9BQU8sQ0FBQztBQUNqQjtBQUNBO0FBQ0EsSUFBSSxDQUFDLFNBQVM7QUFDZCxNQUFNLENBQUMsRUFBRTtBQUNULE1BQU0sQ0FBQyxXQUFXO0FBQ2xCLFdBQVcsQ0FBQyxrQkFBa0I7QUFDOUIsUUFBUSxDQUFDLE9BQU8sQ0FBQztBQUNqQjtBQUNBO0FBQ0EsSUFBSSxDQUFDLFNBQVM7QUFDZCxNQUFNLENBQUMsRUFBRTtBQUNULE1BQU0sQ0FBQyxXQUFXO0FBQ2xCLFdBQVcsQ0FBQyxhQUFhO0FBQ3pCLFFBQVEsQ0FBQyxNQUFNLENBQUM7QUFDaEI7QUFDQTtBQUNBLElBQUksQ0FBQyxXQUFXO0FBQ2hCLE1BQU0sQ0FBQyxFQUFFO0FBQ1QsTUFBTSxDQUFDLFdBQVc7QUFDbEIsV0FBVyxDQUFDLDhCQUE4QjtBQUMxQyxRQUFRLENBQUMsT0FBTyxDQUFDO0FBQ2pCO0FBQ0E7QUFDQSxJQUFJLENBQUMsU0FBUztBQUNkLE1BQU0sQ0FBQyxFQUFFO0FBQ1QsTUFBTSxDQUFDLFFBQVE7QUFDZixXQUFXLENBQUMsOENBQThDO0FBQzFELFFBQVEsQ0FBQyxPQUFPLENBQUM7QUFDakI7QUFDQTtBQUNBLElBQUksQ0FBQyxRQUFRO0FBQ2IsTUFBTSxDQUFDLEVBQUU7QUFDVCxNQUFNLENBQUMsUUFBUTtBQUNmLFdBQVcsQ0FBQyw4Q0FBOEM7QUFDMUQsUUFBUSxDQUFDLE9BQU8sQ0FBQztBQUNqQjtBQUNBO0FBQ0EsSUFBSSxDQUFDLFNBQVM7QUFDZCxNQUFNLENBQUMsRUFBRTtBQUNULE1BQU0sQ0FBQyxTQUFTO0FBQ2hCLFdBQVcsQ0FBQyxVQUFVO0FBQ3RCLFFBQVEsQ0FBQyxPQUFPO0FBQ2hCLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDWjtBQUNBO0FBQ0EsSUFBSSxDQUFDLFNBQVM7QUFDZCxNQUFNLENBQUMsRUFBRTtBQUNULE1BQU0sQ0FBQyxPQUFPO0FBQ2QsV0FBVyxDQUFDLFFBQVE7QUFDcEIsUUFBUSxDQUFDLE9BQU87QUFDaEIsTUFBTSxDQUFDLElBQUksQ0FBQztBQUNaO0FBQ0E7QUFDQSxJQUFJLENBQUMsU0FBUztBQUNkLE1BQU0sQ0FBQyxFQUFFO0FBQ1QsTUFBTSxDQUFDLE9BQU87QUFDZCxXQUFXLENBQUMsb0NBQW9DO0FBQ2hELFFBQVEsQ0FBQyxPQUFPLENBQUM7QUFDakI7QUFDQTtBQUNBLElBQUksQ0FBQyxTQUFTO0FBQ2QsTUFBTSxDQUFDLEVBQUU7QUFDVCxNQUFNLENBQUMsT0FBTztBQUNkLFdBQVcsQ0FBQywrQ0FBK0M7QUFDM0QsUUFBUSxDQUFDLE9BQU8sQ0FBQztBQUNqQjtBQUNBO0FBQ0EsSUFBSSxDQUFDLFVBQVU7QUFDZixNQUFNLENBQUMsRUFBRTtBQUNULE1BQU0sQ0FBQyxXQUFXO0FBQ2xCLFdBQVcsQ0FBQyxtQ0FBbUM7QUFDL0MsUUFBUSxDQUFDLE9BQU8sQ0FBQztBQUNqQjtBQUNBO0FBQ0EsSUFBSSxDQUFDLFNBQVM7QUFDZCxNQUFNLENBQUMsRUFBRTtBQUNULE1BQU0sQ0FBQyxPQUFPO0FBQ2QsV0FBVyxDQUFDLG9EQUFvRDtBQUNoRSxRQUFRLENBQUMsT0FBTyxDQUFDO0FBQ2pCO0FBQ0E7QUFDQSxJQUFJLENBQUMsUUFBUTtBQUNiLE1BQU0sQ0FBQyxFQUFFO0FBQ1QsTUFBTSxDQUFDLFFBQVE7QUFDZixXQUFXLENBQUMsa0NBQWtDO0FBQzlDLFFBQVEsQ0FBQyxLQUFLLENBQUM7QUFDZjtBQUNBO0FBQ0EsSUFBSSxDQUFDLFNBQVM7QUFDZCxNQUFNLENBQUMsRUFBRTtBQUNULE1BQU0sQ0FBQyxNQUFNO0FBQ2IsV0FBVyxDQUFDLG1CQUFtQjtBQUMvQixRQUFRLENBQUMsS0FBSyxDQUFDO0FBQ2Y7QUFDQTtBQUNBLElBQUksQ0FBQyxTQUFTO0FBQ2QsTUFBTSxDQUFDLEVBQUU7QUFDVCxNQUFNLENBQUMsTUFBTTtBQUNiLFdBQVcsQ0FBQyxjQUFjO0FBQzFCLFFBQVEsQ0FBQyxLQUFLLENBQUM7QUFDZjtBQUNBO0FBQ0EsSUFBSSxDQUFDLFdBQVc7QUFDaEIsTUFBTSxDQUFDLEVBQUU7QUFDVCxNQUFNLENBQUMsV0FBVztBQUNsQixXQUFXLENBQUMsa0JBQWtCO0FBQzlCLFFBQVEsQ0FBQyxLQUFLLENBQUM7QUFDZjtBQUNBO0FBQ0EsSUFBSSxDQUFDLFNBQVM7QUFDZCxNQUFNLENBQUMsRUFBRTtBQUNULE1BQU0sQ0FBQyxXQUFXO0FBQ2xCLFdBQVcsQ0FBQyxrQkFBa0I7QUFDOUIsUUFBUSxDQUFDLEtBQUssQ0FBQztBQUNmO0FBQ0E7QUFDQSxJQUFJLENBQUMsVUFBVTtBQUNmLE1BQU0sQ0FBQyxFQUFFO0FBQ1QsTUFBTSxDQUFDLFFBQVE7QUFDZixXQUFXLENBQUMsOEJBQThCO0FBQzFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7QUFDZjtBQUNBO0FBQ0EsSUFBSSxDQUFDLE9BQU87QUFDWixNQUFNLENBQUMsRUFBRTtBQUNULE1BQU0sQ0FBQyxXQUFXO0FBQ2xCLFdBQVcsQ0FBQyxrQkFBa0I7QUFDOUIsUUFBUSxDQUFDLE9BQU8sQ0FBQztBQUNqQjtBQUNBO0FBQ0EsSUFBSSxDQUFDLFNBQVM7QUFDZCxNQUFNLENBQUMsRUFBRTtBQUNULE1BQU0sQ0FBQyxXQUFXO0FBQ2xCLFdBQVcsQ0FBQyxlQUFlO0FBQzNCLFFBQVEsQ0FBQyxPQUFPLENBQUM7QUFDakI7QUFDQTtBQUNBLElBQUksQ0FBQyxTQUFTO0FBQ2QsTUFBTSxDQUFDLEVBQUU7QUFDVCxNQUFNLENBQUMsUUFBUTtBQUNmLFdBQVcsQ0FBQyxpQ0FBaUM7QUFDN0MsUUFBUSxDQUFDLE9BQU8sQ0FBQztBQUNqQjtBQUNBO0FBQ0EsSUFBSSxDQUFDLFFBQVE7QUFDYixNQUFNLENBQUMsRUFBRTtBQUNULE1BQU0sQ0FBQyxXQUFXO0FBQ2xCLFdBQVcsQ0FBQyw2QkFBNkI7QUFDekMsUUFBUSxDQUFDLFNBQVMsQ0FBQztBQUNuQjtBQUNBO0FBQ0EsSUFBSSxDQUFDLFFBQVE7QUFDYixNQUFNLENBQUMsRUFBRTtBQUNULE1BQU0sQ0FBQyxNQUFNO0FBQ2IsV0FBVyxDQUFDLHFCQUFxQjtBQUNqQyxRQUFRLENBQUMsT0FBTyxDQUFDO0FBQ2pCO0FBQ0E7QUFDQSxJQUFJLENBQUMsV0FBVztBQUNoQixNQUFNLENBQUMsRUFBRTtBQUNULE1BQU0sQ0FBQyxXQUFXO0FBQ2xCLFdBQVcsQ0FBQyxxQkFBcUI7QUFDakMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQWdCLElBQUEsQ0FBQSxPQUFBLENBQUMsT0FBTzs7OztBQy9RN0IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBQSxDQUFBLFFBQWdCLENBQTJCLFFBQUEsQ0FBQSxrQkFBQSxDQUFDLEtBQUssRUFBRTtBQUN6SCxNQUFNLGtCQUFrQixDQUFDLFVBQVU7QUFDbkMsTUFBTSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDakMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUM5QyxDQUFDLENBQUMsUUFBQSxDQUFBLGtCQUEwQixDQUFDLG1CQUFtQjtBQUNoRDtBQUNBLE1BQU0saUJBQWlCLENBQUMsU0FBUyxLQUFLLENBQUMsS0FBSyxDQUFDO0FBQzdDLE9BQU07QUFDTixJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSztBQUNyQixNQUFNLENBQUMsV0FBVztBQUNsQixXQUFXLENBQUMsd0NBQXdDO0FBQ3BELFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNsQjtBQUNBLENBQUMsQ0FBQztBQUNGO0FBQ0EsTUFBTSxRQUFRLENBQUMsRUFBRSxDQUFDO0FBQ2xCLE1BQU0sUUFBUSxDQUFDLEVBQUUsQ0FBaUIsUUFBQSxDQUFBLFFBQUEsQ0FBQyxRQUFROztBQ2pCOUIsTUFBTSxDQUFDLGNBQWMsQ0FBQ0MsU0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDQSxTQUFBLENBQUEsVUFBa0IsQ0FBQyxLQUFLLEVBQUUsSUFBSUMsS0FBRyxDQUFDbEIsWUFBYSxDQUFDO0FBQ3RIO0FBQ0EsSUFBSSxLQUFLLENBQUNKLElBQW9CLENBQUM7QUFDL0IsSUFBSXVCLFdBQVMsQ0FBQ3RCLFFBQXdCLENBQUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0EsTUFBTSxVQUFVLENBQUMsVUFBVTtBQUMzQixNQUFNLGVBQWUsQ0FBQyxJQUFHc0IsV0FBUyxDQUFDLGtCQUFrQixHQUFHLENBQUM7QUFDekQsTUFBTSxPQUFPLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxlQUFlLENBQUMsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDekUsT0FBTyxPQUFPLENBQUM7QUFDZixDQUFDLENBQUNGLFNBQUEsQ0FBQSxVQUFrQixDQUFDLFVBQVUsQ0FBQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sZUFBZSxDQUFDLFNBQVM7QUFDL0IsSUFBSTtBQUNKLE1BQU0sQ0FBQyxhQUFhO0FBQ3BCLFdBQVc7QUFDWCxNQUFNO0FBQ04sTUFBTSxDQUFDLEtBQUs7QUFDWixRQUFRLENBQUM7QUFDVDtBQUNBLEtBQUs7QUFDTCxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQztBQUNoQ0MsS0FBRyxDQUFDLFNBQVMsQ0FBQztBQUNkLE1BQU0sU0FBUyxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUM7QUFDM0MsTUFBTSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUM7QUFDcEQsT0FBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7O0FDakNZLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUEsQ0FBQSxlQUF1QixDQUFDLElBQUEsQ0FBQSxhQUFxQixDQUFDLEtBQUssRUFBRSxJQUFJLEdBQUcsQ0FBQ2xCLFlBQWEsQ0FBQztBQUNqSjtBQUNBLElBQUksUUFBUSxDQUFDSixTQUF1QixDQUFDO0FBQ3JDLElBQUksU0FBUyxDQUFDQyxRQUF3QixDQUFDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBLE1BQU0sZ0JBQWdCLENBQUMsVUFBVTtBQUNqQyxNQUFNLE9BQU8sQ0FBQyxJQUFHLFFBQVEsQ0FBQyxVQUFVLEdBQUcsQ0FBQztBQUN4QyxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFDLENBQUMsQ0FBQztBQUNGO0FBQ0EsTUFBTSxlQUFlLENBQUM7QUFDdEIsZ0JBQWdCO0FBQ2hCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO0FBQzFEO0FBQ0EsT0FBTTtBQUNOLEdBQUcsZ0JBQWdCO0FBQ25CLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUNuRTtBQUNBLENBQUMsQ0FBQztBQUNGO0FBQ0EsTUFBTXVCLGVBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFzQixJQUFBLENBQUEsYUFBQSxDQUFDQSxnQkFBYztBQUMzRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sa0JBQWtCLENBQUMsVUFBVTtBQUNuQyxNQUFNLE9BQU8sQ0FBQyxJQUFHLFFBQVEsQ0FBQyxVQUFVLEdBQUcsQ0FBQztBQUN4QyxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUNsQyxNQUFNLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTTtBQUNoRCxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUNuQztBQUNBLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQztBQUNyQyxDQUFDLENBQUM7QUFDRjtBQUNBLE1BQU0saUJBQWlCLENBQUMsU0FBUyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ2hELE1BQU0sTUFBTSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNoRDtBQUNBLEdBQUcsTUFBTSxHQUFHLFNBQVMsQ0FBQztBQUN0QixPQUFNLEVBQUUsQ0FBQztBQUNULENBQUM7QUFDRDtBQUNBLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNoRSxPQUFNO0FBQ04sQ0FBQyxNQUFNLEVBQUU7QUFDVCxJQUFJO0FBQ0osTUFBTTtBQUNOLFdBQVc7QUFDWCxTQUFTO0FBQ1QsTUFBTTtBQUNOLE1BQU07QUFDTixRQUFRLENBQUMsQ0FBQyxDQUFDO0FBQ1g7QUFDQTtBQUNBLENBQUMsQ0FBQztBQUNGO0FBQ0E7QUFDQTtBQUNBLE1BQU0sa0JBQWtCLENBQUMsU0FBUyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ2pELE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQzFFO0FBQ0EsR0FBRyxNQUFNLEdBQUcsU0FBUyxDQUFDO0FBQ3RCLE9BQU8sTUFBTSxDQUFDO0FBQ2QsQ0FBQztBQUNEO0FBQ0EsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQ3RELENBQUMsQ0FBQztBQUNGO0FBQ0EsTUFBTSxlQUFlLENBQUMsa0JBQWtCLEVBQUUsQ0FBd0IsSUFBQSxDQUFBLGVBQUEsQ0FBQyxlQUFlOztBQ3BFbEYsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHcEIsSUFBd0IsQ0FBQztBQUNqRDtBQUNBLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxLQUFLO0FBQzVHLENBQUMsSUFBSSxRQUFRLEVBQUU7QUFDZixFQUFFLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDbkQsRUFBRTtBQUNGO0FBQ0EsQ0FBQyxJQUFJLFVBQVUsRUFBRTtBQUNqQixFQUFFLE9BQU8sY0FBYyxDQUFDO0FBQ3hCLEVBQUU7QUFDRjtBQUNBLENBQUMsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFO0FBQzlCLEVBQUUsT0FBTyxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQ3BDLEVBQUU7QUFDRjtBQUNBLENBQUMsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO0FBQzNCLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUQsRUFBRTtBQUNGO0FBQ0EsQ0FBQyxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7QUFDN0IsRUFBRSxPQUFPLENBQUMsc0JBQXNCLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUM3QyxFQUFFO0FBQ0Y7QUFDQSxDQUFDLE9BQU8sUUFBUSxDQUFDO0FBQ2pCLENBQUMsQ0FBQztBQUNGO0FBQ0EsTUFBTXFCLFdBQVMsR0FBRyxDQUFDO0FBQ25CLENBQUMsTUFBTTtBQUNQLENBQUMsTUFBTTtBQUNQLENBQUMsR0FBRztBQUNKLENBQUMsS0FBSztBQUNOLENBQUMsTUFBTTtBQUNQLENBQUMsUUFBUTtBQUNULENBQUMsT0FBTztBQUNSLENBQUMsY0FBYztBQUNmLENBQUMsUUFBUTtBQUNULENBQUMsVUFBVTtBQUNYLENBQUMsTUFBTTtBQUNQLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDN0IsQ0FBQyxLQUFLO0FBQ047QUFDQTtBQUNBLENBQUMsUUFBUSxHQUFHLFFBQVEsS0FBSyxJQUFJLEdBQUcsU0FBUyxHQUFHLFFBQVEsQ0FBQztBQUNyRCxDQUFDLE1BQU0sR0FBRyxNQUFNLEtBQUssSUFBSSxHQUFHLFNBQVMsR0FBRyxNQUFNLENBQUM7QUFDL0MsQ0FBQyxNQUFNLGlCQUFpQixHQUFHLE1BQU0sS0FBSyxTQUFTLEdBQUcsU0FBUyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLENBQUM7QUFDaEc7QUFDQSxDQUFDLE1BQU0sU0FBUyxHQUFHLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDO0FBQ3ZDO0FBQ0EsQ0FBQyxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDaEgsQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDdEQsQ0FBQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssZ0JBQWdCLENBQUM7QUFDNUUsQ0FBQyxNQUFNLFlBQVksR0FBRyxPQUFPLEdBQUcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDO0FBQ25GLENBQUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDM0U7QUFDQSxDQUFDLElBQUksT0FBTyxFQUFFO0FBQ2QsRUFBRSxLQUFLLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7QUFDeEMsRUFBRSxLQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUMxQixFQUFFLE1BQU07QUFDUixFQUFFLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM3QixFQUFFO0FBQ0Y7QUFDQSxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0FBQ25DLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7QUFDekIsQ0FBQyxLQUFLLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztBQUN2QyxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0FBQzNCLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDdkIsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUM7QUFDN0MsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUN2QixDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBQ3ZCO0FBQ0EsQ0FBQyxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUU7QUFDeEIsRUFBRSxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQixFQUFFO0FBQ0Y7QUFDQSxDQUFDLElBQUksY0FBYyxJQUFJLEtBQUssRUFBRTtBQUM5QixFQUFFLE9BQU8sS0FBSyxDQUFDLFlBQVksQ0FBQztBQUM1QixFQUFFO0FBQ0Y7QUFDQSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0FBQ3JCLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDcEMsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztBQUMvQixDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDO0FBQ3BDO0FBQ0EsQ0FBQyxPQUFPLEtBQUssQ0FBQztBQUNkLENBQUMsQ0FBQztBQUNGO0FBQ0EsSUFBQSxLQUFjLEdBQUdBLFdBQVM7Ozs7QUN0RjFCLE1BQU0sT0FBTyxHQUFHLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUM5QztBQUNBLE1BQU0sUUFBUSxHQUFHLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUM7QUFDaEY7QUFDQSxNQUFNQyxnQkFBYyxHQUFHLE9BQU8sSUFBSTtBQUNsQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDZixFQUFFLE9BQU87QUFDVCxFQUFFO0FBQ0Y7QUFDQSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDekI7QUFDQSxDQUFDLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtBQUMxQixFQUFFLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDOUMsRUFBRTtBQUNGO0FBQ0EsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTtBQUN4QixFQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsQ0FBQyxrRUFBa0UsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUksRUFBRTtBQUNGO0FBQ0EsQ0FBQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtBQUNoQyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQ2YsRUFBRTtBQUNGO0FBQ0EsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUM1QixFQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsQ0FBQyxnRUFBZ0UsRUFBRSxPQUFPLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzNHLEVBQUU7QUFDRjtBQUNBLENBQUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN2RCxDQUFDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssS0FBSyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUM3RCxDQUFDLENBQUM7QUFDRjtBQUNBQyxLQUFjLENBQUEsT0FBQSxHQUFHRCxnQkFBYyxDQUFDO0FBQ2hDO0FBQ0E7QUFDbUJDLEtBQUEsQ0FBQSxPQUFBLENBQUEsSUFBQSxHQUFHLE9BQU8sSUFBSTtBQUNqQyxDQUFDLE1BQU0sS0FBSyxHQUFHRCxnQkFBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZDO0FBQ0EsQ0FBQyxJQUFJLEtBQUssS0FBSyxLQUFLLEVBQUU7QUFDdEIsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUNmLEVBQUU7QUFDRjtBQUNBLENBQUMsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtBQUN2RCxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN0QyxFQUFFO0FBQ0Y7QUFDQSxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUM1QixFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQ2YsRUFBRTtBQUNGO0FBQ0EsQ0FBQyxPQUFPLENBQUMsR0FBRyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDMUIsRUFBQzs7Ozs7Ozs7Ozs7Ozs7QUNuREQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLE1BQWlCLENBQUEsT0FBQSxHQUFBO0FBQ2pCLElBQUUsU0FBUztBQUNYLElBQUUsU0FBUztBQUNYLElBQUUsUUFBUTtBQUNWLElBQUUsUUFBUTtBQUNWLElBQUUsU0FBUztJQUNWO0FBQ0Q7QUFDQSxFQUFBLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLEVBQUU7QUFDbEMsSUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUk7QUFDckIsTUFBSSxXQUFXO0FBQ2YsTUFBSSxTQUFTO0FBQ2IsTUFBSSxTQUFTO0FBQ2IsTUFBSSxTQUFTO0FBQ2IsTUFBSSxTQUFTO0FBQ2IsTUFBSSxRQUFRO0FBQ1osTUFBSSxTQUFTO0FBQ2IsTUFBSSxRQUFRO0FBQ1o7QUFDQTtBQUNBO01BQ0c7R0FDRjtBQUNEO0FBQ0EsRUFBQSxJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssT0FBTyxFQUFFO0FBQ2xDLElBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJO0FBQ3JCLE1BQUksT0FBTztBQUNYLE1BQUksU0FBUztBQUNiLE1BQUksUUFBUTtBQUNaLE1BQUksV0FBVztBQUNmLE1BQUksV0FBVztNQUNaO0FBQ0gsR0FBQTs7Ozs7QUNwREE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJRSxTQUFPLEdBQUc3QixjQUFNLENBQUMsUUFBTztBQUM1QjtBQUNBLE1BQU0sU0FBUyxHQUFHLFVBQVUsT0FBTyxFQUFFO0FBQ3JDLEVBQUUsT0FBTyxPQUFPO0FBQ2hCLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUTtBQUMvQixJQUFJLE9BQU8sT0FBTyxDQUFDLGNBQWMsS0FBSyxVQUFVO0FBQ2hELElBQUksT0FBTyxPQUFPLENBQUMsSUFBSSxLQUFLLFVBQVU7QUFDdEMsSUFBSSxPQUFPLE9BQU8sQ0FBQyxVQUFVLEtBQUssVUFBVTtBQUM1QyxJQUFJLE9BQU8sT0FBTyxDQUFDLFNBQVMsS0FBSyxVQUFVO0FBQzNDLElBQUksT0FBTyxPQUFPLENBQUMsSUFBSSxLQUFLLFVBQVU7QUFDdEMsSUFBSSxPQUFPLE9BQU8sQ0FBQyxHQUFHLEtBQUssUUFBUTtBQUNuQyxJQUFJLE9BQU8sT0FBTyxDQUFDLEVBQUUsS0FBSyxVQUFVO0FBQ3BDLEVBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxJQUFJLENBQUMsU0FBUyxDQUFDNkIsU0FBTyxDQUFDLEVBQUU7QUFDekIsRUFBRUMsVUFBQSxDQUFBLE9BQWMsR0FBRyxZQUFZO0FBQy9CLElBQUksT0FBTyxZQUFZLEVBQUU7QUFDekIsSUFBRztBQUNILENBQUMsTUFBTTtBQUNQLEVBQUUsSUFBSSxNQUFNLEdBQUd6QixhQUFpQjtBQUNoQyxFQUFFLElBQUksT0FBTyxHQUFHSixjQUF1QixHQUFBO0FBQ3ZDLEVBQUUsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQzRCLFNBQU8sQ0FBQyxRQUFRLEVBQUM7QUFDNUM7QUFDQSxFQUFFLElBQUksRUFBRSxHQUFHLFdBQWlCO0FBQzVCO0FBQ0EsRUFBRSxJQUFJLE9BQU8sRUFBRSxLQUFLLFVBQVUsRUFBRTtBQUNoQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsYUFBWTtBQUN4QixHQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUksUUFBTztBQUNiLEVBQUUsSUFBSUEsU0FBTyxDQUFDLHVCQUF1QixFQUFFO0FBQ3ZDLElBQUksT0FBTyxHQUFHQSxTQUFPLENBQUMsd0JBQXVCO0FBQzdDLEdBQUcsTUFBTTtBQUNULElBQUksT0FBTyxHQUFHQSxTQUFPLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxFQUFFLEdBQUU7QUFDeEQsSUFBSSxPQUFPLENBQUMsS0FBSyxHQUFHLEVBQUM7QUFDckIsSUFBSSxPQUFPLENBQUMsT0FBTyxHQUFHLEdBQUU7QUFDeEIsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFO0FBQ3pCLElBQUksT0FBTyxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUM7QUFDckMsSUFBSSxPQUFPLENBQUMsUUFBUSxHQUFHLEtBQUk7QUFDM0IsR0FBRztBQUNIO0FBQ0EsRUFBRUMsa0JBQWMsR0FBRyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUU7QUFDdkM7QUFDQSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUM5QixjQUFNLENBQUMsT0FBTyxDQUFDLEVBQUU7QUFDcEMsTUFBTSxPQUFPLFlBQVksRUFBRTtBQUMzQixLQUFLO0FBQ0wsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLFVBQVUsRUFBRSw4Q0FBOEMsRUFBQztBQUN2RjtBQUNBLElBQUksSUFBSSxNQUFNLEtBQUssS0FBSyxFQUFFO0FBQzFCLE1BQU0sSUFBSSxHQUFFO0FBQ1osS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLEVBQUUsR0FBRyxPQUFNO0FBQ25CLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtBQUNqQyxNQUFNLEVBQUUsR0FBRyxZQUFXO0FBQ3RCLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxNQUFNLEdBQUcsWUFBWTtBQUM3QixNQUFNLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBQztBQUNwQyxNQUFNLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztBQUNoRCxVQUFVLE9BQU8sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtBQUN2RCxRQUFRLE1BQU0sR0FBRTtBQUNoQixPQUFPO0FBQ1AsTUFBSztBQUNMLElBQUksT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFDO0FBQ3RCO0FBQ0EsSUFBSSxPQUFPLE1BQU07QUFDakIsSUFBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLE1BQU0sR0FBRyxTQUFTLE1BQU0sSUFBSTtBQUNsQyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUNBLGNBQU0sQ0FBQyxPQUFPLENBQUMsRUFBRTtBQUMvQyxNQUFNLE1BQU07QUFDWixLQUFLO0FBQ0wsSUFBSSxNQUFNLEdBQUcsTUFBSztBQUNsQjtBQUNBLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsRUFBRTtBQUNuQyxNQUFNLElBQUk7QUFDVixRQUFRNkIsU0FBTyxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFDO0FBQ3RELE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFO0FBQ3JCLEtBQUssRUFBQztBQUNOLElBQUlBLFNBQU8sQ0FBQyxJQUFJLEdBQUcsb0JBQW1CO0FBQ3RDLElBQUlBLFNBQU8sQ0FBQyxVQUFVLEdBQUcsMEJBQXlCO0FBQ2xELElBQUksT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFDO0FBQ3RCLElBQUc7QUFDSCxFQUFFQyxVQUFBLENBQUEsT0FBQSxDQUFBLE1BQXFCLEdBQUcsT0FBTTtBQUNoQztBQUNBLEVBQUUsSUFBSSxJQUFJLEdBQUcsU0FBUyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7QUFDakQ7QUFDQSxJQUFJLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUNoQyxNQUFNLE1BQU07QUFDWixLQUFLO0FBQ0wsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUk7QUFDakMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFDO0FBQ3JDLElBQUc7QUFDSDtBQUNBO0FBQ0EsRUFBRSxJQUFJLFlBQVksR0FBRyxHQUFFO0FBQ3ZCLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsRUFBRTtBQUNqQyxJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxTQUFTLFFBQVEsSUFBSTtBQUM3QztBQUNBLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQzlCLGNBQU0sQ0FBQyxPQUFPLENBQUMsRUFBRTtBQUN0QyxRQUFRLE1BQU07QUFDZCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLElBQUksU0FBUyxHQUFHNkIsU0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUM7QUFDNUMsTUFBTSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLEtBQUssRUFBRTtBQUM5QyxRQUFRLE1BQU0sR0FBRTtBQUNoQixRQUFRLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBQztBQUMvQjtBQUNBLFFBQVEsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFDO0FBQ3BDO0FBQ0EsUUFBUSxJQUFJLEtBQUssSUFBSSxHQUFHLEtBQUssUUFBUSxFQUFFO0FBQ3ZDO0FBQ0E7QUFDQSxVQUFVLEdBQUcsR0FBRyxTQUFRO0FBQ3hCLFNBQVM7QUFDVDtBQUNBLFFBQVFBLFNBQU8sQ0FBQyxJQUFJLENBQUNBLFNBQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFDO0FBQ3RDLE9BQU87QUFDUCxNQUFLO0FBQ0wsR0FBRyxFQUFDO0FBQ0o7QUFDQSxFQUFFQyxVQUFBLENBQUEsT0FBQSxDQUFBLE9BQXNCLEdBQUcsWUFBWTtBQUN2QyxJQUFJLE9BQU8sT0FBTztBQUNsQixJQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUksTUFBTSxHQUFHLE1BQUs7QUFDcEI7QUFDQSxFQUFFLElBQUksSUFBSSxHQUFHLFNBQVMsSUFBSSxJQUFJO0FBQzlCLElBQUksSUFBSSxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUM5QixjQUFNLENBQUMsT0FBTyxDQUFDLEVBQUU7QUFDOUMsTUFBTSxNQUFNO0FBQ1osS0FBSztBQUNMLElBQUksTUFBTSxHQUFHLEtBQUk7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFDO0FBQ3RCO0FBQ0EsSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsRUFBRTtBQUM1QyxNQUFNLElBQUk7QUFDVixRQUFRNkIsU0FBTyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFDO0FBQzFDLFFBQVEsT0FBTyxJQUFJO0FBQ25CLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRTtBQUNuQixRQUFRLE9BQU8sS0FBSztBQUNwQixPQUFPO0FBQ1AsS0FBSyxFQUFDO0FBQ047QUFDQSxJQUFJQSxTQUFPLENBQUMsSUFBSSxHQUFHLFlBQVc7QUFDOUIsSUFBSUEsU0FBTyxDQUFDLFVBQVUsR0FBRyxrQkFBaUI7QUFDMUMsSUFBRztBQUNILEVBQUVDLFVBQUEsQ0FBQSxPQUFBLENBQUEsSUFBbUIsR0FBRyxLQUFJO0FBQzVCO0FBQ0EsRUFBRSxJQUFJLHlCQUF5QixHQUFHRCxTQUFPLENBQUMsV0FBVTtBQUNwRCxFQUFFLElBQUksaUJBQWlCLEdBQUcsU0FBUyxpQkFBaUIsRUFBRSxJQUFJLEVBQUU7QUFDNUQ7QUFDQSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUM3QixjQUFNLENBQUMsT0FBTyxDQUFDLEVBQUU7QUFDcEMsTUFBTSxNQUFNO0FBQ1osS0FBSztBQUNMLElBQUk2QixTQUFPLENBQUMsUUFBUSxHQUFHLElBQUksK0JBQStCLEVBQUM7QUFDM0QsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFQSxTQUFPLENBQUMsUUFBUSxFQUFFLElBQUksRUFBQztBQUN4QztBQUNBLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRUEsU0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUM7QUFDN0M7QUFDQSxJQUFJLHlCQUF5QixDQUFDLElBQUksQ0FBQ0EsU0FBTyxFQUFFQSxTQUFPLENBQUMsUUFBUSxFQUFDO0FBQzdELElBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxtQkFBbUIsR0FBR0EsU0FBTyxDQUFDLEtBQUk7QUFDeEMsRUFBRSxJQUFJLFdBQVcsR0FBRyxTQUFTLFdBQVcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFO0FBQ25ELElBQUksSUFBSSxFQUFFLEtBQUssTUFBTSxJQUFJLFNBQVMsQ0FBQzdCLGNBQU0sQ0FBQyxPQUFPLENBQUMsRUFBRTtBQUNwRDtBQUNBLE1BQU0sSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFO0FBQzdCLFFBQVE2QixTQUFPLENBQUMsUUFBUSxHQUFHLElBQUc7QUFDOUIsT0FBTztBQUNQLE1BQU0sSUFBSSxHQUFHLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUM7QUFDMUQ7QUFDQSxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUVBLFNBQU8sQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFDO0FBQzFDO0FBQ0EsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFQSxTQUFPLENBQUMsUUFBUSxFQUFFLElBQUksRUFBQztBQUMvQztBQUNBLE1BQU0sT0FBTyxHQUFHO0FBQ2hCLEtBQUssTUFBTTtBQUNYLE1BQU0sT0FBTyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQztBQUN2RCxLQUFLO0FBQ0wsSUFBRztBQUNILENBQUE7Ozs7QUN4TUEsTUFBTSxFQUFFLEdBQUd4QixZQUFhLENBQUM7QUFDekIsTUFBTSxNQUFNLEdBQUdKLGlCQUFzQixDQUFDO0FBQ3RDO0FBQ0EsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQzVDO0FBQ0E7QUFDQSxNQUFNOEIsYUFBVyxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sR0FBRyxTQUFTLEVBQUUsT0FBTyxHQUFHLEVBQUUsS0FBSztBQUNoRSxDQUFDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNqQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztBQUNuRCxDQUFDLE9BQU8sVUFBVSxDQUFDO0FBQ25CLENBQUMsQ0FBQztBQUNGO0FBQ0EsTUFBTSxjQUFjLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxVQUFVLEtBQUs7QUFDOUQsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLEVBQUU7QUFDcEQsRUFBRSxPQUFPO0FBQ1QsRUFBRTtBQUNGO0FBQ0EsQ0FBQyxNQUFNLE9BQU8sR0FBRyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNuRCxDQUFDLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNO0FBQzVCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRTtBQUNkLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ1osRUFBRTtBQUNGLENBQUMsQ0FBQztBQUNGO0FBQ0EsTUFBTSxlQUFlLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLFVBQVUsS0FBSztBQUN6RSxDQUFDLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLHFCQUFxQixLQUFLLEtBQUssSUFBSSxVQUFVLENBQUM7QUFDM0UsQ0FBQyxDQUFDO0FBQ0Y7QUFDQSxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUk7QUFDNUIsQ0FBQyxPQUFPLE1BQU0sS0FBSyxFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPO0FBQy9DLEdBQUcsT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUUsS0FBSyxTQUFTLENBQUMsQ0FBQztBQUNyRSxDQUFDLENBQUM7QUFDRjtBQUNBLE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxLQUFLO0FBQ3JFLENBQUMsSUFBSSxxQkFBcUIsS0FBSyxJQUFJLEVBQUU7QUFDckMsRUFBRSxPQUFPLDBCQUEwQixDQUFDO0FBQ3BDLEVBQUU7QUFDRjtBQUNBLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsSUFBSSxxQkFBcUIsR0FBRyxDQUFDLEVBQUU7QUFDM0UsRUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLENBQUMsa0ZBQWtGLEVBQUUscUJBQXFCLENBQUMsSUFBSSxFQUFFLE9BQU8scUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4SyxFQUFFO0FBQ0Y7QUFDQSxDQUFDLE9BQU8scUJBQXFCLENBQUM7QUFDOUIsQ0FBQyxDQUFDO0FBQ0Y7QUFDQTtBQUNBLE1BQU1DLGVBQWEsR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLEtBQUs7QUFDNUMsQ0FBQyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDbkM7QUFDQSxDQUFDLElBQUksVUFBVSxFQUFFO0FBQ2pCLEVBQUUsT0FBTyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7QUFDNUIsRUFBRTtBQUNGLENBQUMsQ0FBQztBQUNGO0FBQ0EsTUFBTSxXQUFXLEdBQUcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sS0FBSztBQUNqRCxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdEIsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pFLENBQUMsQ0FBQztBQUNGO0FBQ0E7QUFDQSxNQUFNQyxjQUFZLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxHQUFHLFNBQVMsQ0FBQyxFQUFFLGNBQWMsS0FBSztBQUNyRixDQUFDLElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFO0FBQzdDLEVBQUUsT0FBTyxjQUFjLENBQUM7QUFDeEIsRUFBRTtBQUNGO0FBQ0EsQ0FBQyxJQUFJLFNBQVMsQ0FBQztBQUNmLENBQUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxLQUFLO0FBQ3pELEVBQUUsU0FBUyxHQUFHLFVBQVUsQ0FBQyxNQUFNO0FBQy9CLEdBQUcsV0FBVyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDNUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2QsRUFBRSxDQUFDLENBQUM7QUFDSjtBQUNBLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLE1BQU07QUFDekQsRUFBRSxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDMUIsRUFBRSxDQUFDLENBQUM7QUFDSjtBQUNBLENBQUMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQztBQUMzRCxDQUFDLENBQUM7QUFDRjtBQUNBLE1BQU1DLGlCQUFlLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLO0FBQ3ZDLENBQUMsSUFBSSxPQUFPLEtBQUssU0FBUyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDMUUsRUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLENBQUMsb0VBQW9FLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlILEVBQUU7QUFDRixDQUFDLENBQUM7QUFDRjtBQUNBO0FBQ0EsTUFBTUMsZ0JBQWMsR0FBRyxPQUFPLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsRUFBRSxZQUFZLEtBQUs7QUFDN0UsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLFFBQVEsRUFBRTtBQUMzQixFQUFFLE9BQU8sWUFBWSxDQUFDO0FBQ3RCLEVBQUU7QUFDRjtBQUNBLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsTUFBTTtBQUN4QyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNqQixFQUFFLENBQUMsQ0FBQztBQUNKO0FBQ0EsQ0FBQyxPQUFPLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTTtBQUNuQyxFQUFFLGlCQUFpQixFQUFFLENBQUM7QUFDdEIsRUFBRSxDQUFDLENBQUM7QUFDSixDQUFDLENBQUM7QUFDRjtBQUNBLElBQUEsSUFBYyxHQUFHO0FBQ2pCLGNBQUNKLGFBQVc7QUFDWixnQkFBQ0MsZUFBYTtBQUNkLGVBQUNDLGNBQVk7QUFDYixrQkFBQ0MsaUJBQWU7QUFDaEIsaUJBQUNDLGdCQUFjO0FBQ2YsQ0FBQzs7QUNoSEQsTUFBTUMsVUFBUSxHQUFHLE1BQU07QUFDdkIsQ0FBQyxNQUFNLEtBQUssSUFBSTtBQUNoQixDQUFDLE9BQU8sTUFBTSxLQUFLLFFBQVE7QUFDM0IsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDO0FBQ25DO0FBQ0FBLFVBQVEsQ0FBQyxRQUFRLEdBQUcsTUFBTTtBQUMxQixDQUFDQSxVQUFRLENBQUMsTUFBTSxDQUFDO0FBQ2pCLENBQUMsTUFBTSxDQUFDLFFBQVEsS0FBSyxLQUFLO0FBQzFCLENBQUMsT0FBTyxNQUFNLENBQUMsTUFBTSxLQUFLLFVBQVU7QUFDcEMsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxjQUFjLEtBQUssUUFBUSxDQUFDO0FBQzNDO0FBQ0FBLFVBQVEsQ0FBQyxRQUFRLEdBQUcsTUFBTTtBQUMxQixDQUFDQSxVQUFRLENBQUMsTUFBTSxDQUFDO0FBQ2pCLENBQUMsTUFBTSxDQUFDLFFBQVEsS0FBSyxLQUFLO0FBQzFCLENBQUMsT0FBTyxNQUFNLENBQUMsS0FBSyxLQUFLLFVBQVU7QUFDbkMsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxjQUFjLEtBQUssUUFBUSxDQUFDO0FBQzNDO0FBQ0FBLFVBQVEsQ0FBQyxNQUFNLEdBQUcsTUFBTTtBQUN4QixDQUFDQSxVQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztBQUMxQixDQUFDQSxVQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzNCO0FBQ0FBLFVBQVEsQ0FBQyxTQUFTLEdBQUcsTUFBTTtBQUMzQixDQUFDQSxVQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztBQUN4QixDQUFDLE9BQU8sTUFBTSxDQUFDLFVBQVUsS0FBSyxVQUFVLENBQUM7QUFDekM7QUFDQSxJQUFBLFVBQWMsR0FBR0EsVUFBUTs7OztBQzFCekIsTUFBTSxDQUFDLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQyxHQUFHL0IsWUFBaUIsQ0FBQztBQUMzRDtJQUNBZ0MsY0FBYyxHQUFHLE9BQU8sSUFBSTtBQUM1QixDQUFDLE9BQU8sR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUM7QUFDeEI7QUFDQSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDekIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsT0FBTyxDQUFDO0FBQzFCLENBQUMsTUFBTSxRQUFRLEdBQUcsUUFBUSxLQUFLLFFBQVEsQ0FBQztBQUN4QyxDQUFDLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQztBQUN4QjtBQUNBLENBQUMsSUFBSSxLQUFLLEVBQUU7QUFDWixFQUFFLFVBQVUsR0FBRyxFQUFFLFFBQVEsSUFBSSxRQUFRLENBQUMsQ0FBQztBQUN2QyxFQUFFLE1BQU07QUFDUixFQUFFLFFBQVEsR0FBRyxRQUFRLElBQUksTUFBTSxDQUFDO0FBQ2hDLEVBQUU7QUFDRjtBQUNBLENBQUMsSUFBSSxRQUFRLEVBQUU7QUFDZixFQUFFLFFBQVEsR0FBRyxJQUFJLENBQUM7QUFDbEIsRUFBRTtBQUNGO0FBQ0EsQ0FBQyxNQUFNLE1BQU0sR0FBRyxJQUFJLGlCQUFpQixDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUNwRDtBQUNBLENBQUMsSUFBSSxRQUFRLEVBQUU7QUFDZixFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDL0IsRUFBRTtBQUNGO0FBQ0EsQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDaEIsQ0FBQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDbkI7QUFDQSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSTtBQUM1QixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDckI7QUFDQSxFQUFFLElBQUksVUFBVSxFQUFFO0FBQ2xCLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7QUFDMUIsR0FBRyxNQUFNO0FBQ1QsR0FBRyxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQztBQUMxQixHQUFHO0FBQ0gsRUFBRSxDQUFDLENBQUM7QUFDSjtBQUNBLENBQUMsTUFBTSxDQUFDLGdCQUFnQixHQUFHLE1BQU07QUFDakMsRUFBRSxJQUFJLEtBQUssRUFBRTtBQUNiLEdBQUcsT0FBTyxNQUFNLENBQUM7QUFDakIsR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BFLEVBQUUsQ0FBQztBQUNIO0FBQ0EsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxNQUFNLENBQUM7QUFDekM7QUFDQSxDQUFDLE9BQU8sTUFBTSxDQUFDO0FBQ2YsQ0FBQzs7QUNsREQsTUFBTSxDQUFDLFNBQVMsRUFBRSxlQUFlLENBQUMsR0FBR2hDLFlBQWlCLENBQUM7QUFDdkQsTUFBTWlDLFFBQU0sR0FBR3JDLFlBQWlCLENBQUM7QUFDakMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHQyxZQUFlLENBQUM7QUFDcEMsTUFBTSxZQUFZLEdBQUdVLGNBQTBCLENBQUM7QUFDaEQ7QUFDQSxNQUFNLHlCQUF5QixHQUFHLFNBQVMsQ0FBQzBCLFFBQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM3RDtBQUNBLE1BQU0sY0FBYyxTQUFTLEtBQUssQ0FBQztBQUNuQyxDQUFDLFdBQVcsR0FBRztBQUNmLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDOUIsRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLGdCQUFnQixDQUFDO0FBQy9CLEVBQUU7QUFDRixDQUFDO0FBQ0Q7QUFDQSxlQUFlQyxXQUFTLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRTtBQUMvQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7QUFDbkIsRUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFDdkMsRUFBRTtBQUNGO0FBQ0EsQ0FBQyxPQUFPLEdBQUc7QUFDWCxFQUFFLFNBQVMsRUFBRSxRQUFRO0FBQ3JCLEVBQUUsR0FBRyxPQUFPO0FBQ1osRUFBRSxDQUFDO0FBQ0g7QUFDQSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDN0IsQ0FBQyxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdEM7QUFDQSxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxLQUFLO0FBQ3hDLEVBQUUsTUFBTSxhQUFhLEdBQUcsS0FBSyxJQUFJO0FBQ2pDO0FBQ0EsR0FBRyxJQUFJLEtBQUssSUFBSSxNQUFNLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxlQUFlLENBQUMsVUFBVSxFQUFFO0FBQzFFLElBQUksS0FBSyxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztBQUNuRCxJQUFJO0FBQ0o7QUFDQSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNqQixHQUFHLENBQUM7QUFDSjtBQUNBLEVBQUUsQ0FBQyxZQUFZO0FBQ2YsR0FBRyxJQUFJO0FBQ1AsSUFBSSxNQUFNLHlCQUF5QixDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN6RCxJQUFJLE9BQU8sRUFBRSxDQUFDO0FBQ2QsSUFBSSxDQUFDLE9BQU8sS0FBSyxFQUFFO0FBQ25CLElBQUksYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3pCLElBQUk7QUFDSixHQUFHLEdBQUcsQ0FBQztBQUNQO0FBQ0EsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNO0FBQzFCLEdBQUcsSUFBSSxNQUFNLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxTQUFTLEVBQUU7QUFDL0MsSUFBSSxhQUFhLENBQUMsSUFBSSxjQUFjLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDLElBQUk7QUFDSixHQUFHLENBQUMsQ0FBQztBQUNMLEVBQUUsQ0FBQyxDQUFDO0FBQ0o7QUFDQSxDQUFDLE9BQU8sTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUM7QUFDbEMsQ0FBQztBQUNEO0FBQ0FDLFdBQWMsQ0FBQSxPQUFBLEdBQUdELFdBQVMsQ0FBQztBQUMzQkMsV0FBQSxDQUFBLE9BQUEsQ0FBQSxNQUFxQixHQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sS0FBS0QsV0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsRUFBRTtBQUNqR0MsV0FBQSxDQUFBLE9BQUEsQ0FBQSxLQUFvQixHQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sS0FBS0QsV0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRTtBQUN6RkMsV0FBQSxDQUFBLE9BQUEsQ0FBQSxjQUE2QixHQUFHLGVBQWM7Ozs7QUMxRDlDLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBR25DLFlBQWlCLENBQUM7QUFDMUM7QUFDQSxJQUFBb0MsYUFBYyxHQUFHLDBCQUEwQjtBQUMzQyxFQUFFLElBQUksT0FBTyxHQUFHLEdBQUU7QUFDbEIsRUFBRSxJQUFJLE1BQU0sSUFBSSxJQUFJLFdBQVcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsRUFBQztBQUNuRDtBQUNBLEVBQUUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUM7QUFDM0I7QUFDQSxFQUFFLE1BQU0sQ0FBQyxHQUFHLEdBQUcsSUFBRztBQUNsQixFQUFFLE1BQU0sQ0FBQyxPQUFPLEdBQUcsUUFBTztBQUMxQjtBQUNBLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFDO0FBQzdCO0FBQ0EsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBQztBQUNwRDtBQUNBLEVBQUUsT0FBTyxNQUFNO0FBQ2Y7QUFDQSxFQUFFLFNBQVMsR0FBRyxFQUFFLE1BQU0sRUFBRTtBQUN4QixJQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUMvQixNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFDO0FBQ3pCLE1BQU0sT0FBTyxJQUFJO0FBQ2pCLEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN6QixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFDO0FBQ2pELElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxFQUFDO0FBQzNELElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUM7QUFDckMsSUFBSSxPQUFPLElBQUk7QUFDZixHQUFHO0FBQ0g7QUFDQSxFQUFFLFNBQVMsT0FBTyxJQUFJO0FBQ3RCLElBQUksT0FBTyxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztBQUMvQixHQUFHO0FBQ0g7QUFDQSxFQUFFLFNBQVMsTUFBTSxFQUFFLE1BQU0sRUFBRTtBQUMzQixJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFFLEVBQUM7QUFDcEUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxDQUFDLEdBQUcsR0FBRSxFQUFFO0FBQzVELEdBQUc7QUFDSDs7QUN2Q0EsTUFBTSxRQUFRLEdBQUdwQyxVQUFvQixDQUFDO0FBQ3RDLE1BQU0sU0FBUyxHQUFHSixnQkFBcUIsQ0FBQztBQUN4QyxNQUFNLFdBQVcsR0FBR0MsYUFBdUIsQ0FBQztBQUM1QztBQUNBO0FBQ0EsTUFBTXdDLGFBQVcsR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLEtBQUs7QUFDeEM7QUFDQTtBQUNBLENBQUMsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFO0FBQ3pELEVBQUUsT0FBTztBQUNULEVBQUU7QUFDRjtBQUNBLENBQUMsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDdEIsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM1QixFQUFFLE1BQU07QUFDUixFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzNCLEVBQUU7QUFDRixDQUFDLENBQUM7QUFDRjtBQUNBO0FBQ0EsTUFBTUMsZUFBYSxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUs7QUFDMUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUNuRCxFQUFFLE9BQU87QUFDVCxFQUFFO0FBQ0Y7QUFDQSxDQUFDLE1BQU0sS0FBSyxHQUFHLFdBQVcsRUFBRSxDQUFDO0FBQzdCO0FBQ0EsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7QUFDckIsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM1QixFQUFFO0FBQ0Y7QUFDQSxDQUFDLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtBQUNyQixFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzVCLEVBQUU7QUFDRjtBQUNBLENBQUMsT0FBTyxLQUFLLENBQUM7QUFDZCxDQUFDLENBQUM7QUFDRjtBQUNBO0FBQ0EsTUFBTSxlQUFlLEdBQUcsT0FBTyxNQUFNLEVBQUUsYUFBYSxLQUFLO0FBQ3pELENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtBQUNkLEVBQUUsT0FBTztBQUNULEVBQUU7QUFDRjtBQUNBLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ2xCO0FBQ0EsQ0FBQyxJQUFJO0FBQ0wsRUFBRSxPQUFPLE1BQU0sYUFBYSxDQUFDO0FBQzdCLEVBQUUsQ0FBQyxPQUFPLEtBQUssRUFBRTtBQUNqQixFQUFFLE9BQU8sS0FBSyxDQUFDLFlBQVksQ0FBQztBQUM1QixFQUFFO0FBQ0YsQ0FBQyxDQUFDO0FBQ0Y7QUFDQSxNQUFNLGdCQUFnQixHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsS0FBSztBQUNwRSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUU7QUFDekIsRUFBRSxPQUFPO0FBQ1QsRUFBRTtBQUNGO0FBQ0EsQ0FBQyxJQUFJLFFBQVEsRUFBRTtBQUNmLEVBQUUsT0FBTyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDbEQsRUFBRTtBQUNGO0FBQ0EsQ0FBQyxPQUFPLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUM5QyxDQUFDLENBQUM7QUFDRjtBQUNBO0FBQ0EsTUFBTUMsa0JBQWdCLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxFQUFFLFdBQVcsS0FBSztBQUN0RyxDQUFDLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUMvRSxDQUFDLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUMvRSxDQUFDLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hGO0FBQ0EsQ0FBQyxJQUFJO0FBQ0wsRUFBRSxPQUFPLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDcEYsRUFBRSxDQUFDLE9BQU8sS0FBSyxFQUFFO0FBQ2pCLEVBQUUsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDO0FBQ3JCLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUM7QUFDMUQsR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQztBQUN6QyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDO0FBQ3pDLEdBQUcsZUFBZSxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUM7QUFDbkMsR0FBRyxDQUFDLENBQUM7QUFDTCxFQUFFO0FBQ0YsQ0FBQyxDQUFDO0FBQ0Y7QUFDQSxNQUFNQyxtQkFBaUIsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUs7QUFDdkMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUN0QixFQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsb0RBQW9ELENBQUMsQ0FBQztBQUM1RSxFQUFFO0FBQ0YsQ0FBQyxDQUFDO0FBQ0Y7QUFDQSxJQUFBUCxRQUFjLEdBQUc7QUFDakIsY0FBQ0ksYUFBVztBQUNaLGdCQUFDQyxlQUFhO0FBQ2QsbUJBQUNDLGtCQUFnQjtBQUNqQixvQkFBQ0MsbUJBQWlCO0FBQ2xCLENBQUM7O0FDN0ZELE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUM7QUFDeEUsTUFBTSxXQUFXLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLElBQUk7QUFDakUsQ0FBQyxRQUFRO0FBQ1QsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUMsc0JBQXNCLEVBQUUsUUFBUSxDQUFDO0FBQ25FLENBQUMsQ0FBQyxDQUFDO0FBQ0g7QUFDQTtBQUNBLE1BQU1DLGNBQVksR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLEtBQUs7QUFDM0MsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLElBQUksV0FBVyxFQUFFO0FBQ25EO0FBQ0EsRUFBRSxNQUFNLEtBQUssR0FBRyxPQUFPLE9BQU8sS0FBSyxVQUFVO0FBQzdDLEdBQUcsQ0FBQyxHQUFHLElBQUksS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUUsSUFBSSxDQUFDO0FBQ2hFLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDbEM7QUFDQSxFQUFFLE9BQU8sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDcEUsRUFBRTtBQUNGO0FBQ0EsQ0FBQyxPQUFPLE9BQU8sQ0FBQztBQUNoQixDQUFDLENBQUM7QUFDRjtBQUNBO0FBQ0EsTUFBTUMsbUJBQWlCLEdBQUcsT0FBTyxJQUFJO0FBQ3JDLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEtBQUs7QUFDekMsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFNLEtBQUs7QUFDM0MsR0FBRyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUMvQixHQUFHLENBQUMsQ0FBQztBQUNMO0FBQ0EsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUk7QUFDL0IsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDakIsR0FBRyxDQUFDLENBQUM7QUFDTDtBQUNBLEVBQUUsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFO0FBQ3JCLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssSUFBSTtBQUN0QyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNsQixJQUFJLENBQUMsQ0FBQztBQUNOLEdBQUc7QUFDSCxFQUFFLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUNGO0FBQ0EsSUFBQSxPQUFjLEdBQUc7QUFDakIsZUFBQ0QsY0FBWTtBQUNiLG9CQUFDQyxtQkFBaUI7QUFDbEIsQ0FBQzs7QUMzQ0QsTUFBTSxhQUFhLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxHQUFHLEVBQUUsS0FBSztBQUMzQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQzNCLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2hCLEVBQUU7QUFDRjtBQUNBLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3hCLENBQUMsQ0FBQztBQUNGO0FBQ0EsTUFBTSxnQkFBZ0IsR0FBRyxXQUFXLENBQUM7QUFDckMsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUM7QUFDbEM7QUFDQSxNQUFNLFNBQVMsR0FBRyxHQUFHLElBQUk7QUFDekIsQ0FBQyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDNUQsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLEVBQUU7QUFDRjtBQUNBLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hELENBQUMsQ0FBQztBQUNGO0FBQ0EsTUFBTUMsYUFBVyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksS0FBSztBQUNwQyxDQUFDLE9BQU8sYUFBYSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDNUMsQ0FBQyxDQUFDO0FBQ0Y7QUFDQSxNQUFNQyxtQkFBaUIsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEtBQUs7QUFDMUMsQ0FBQyxPQUFPLGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkUsQ0FBQyxDQUFDO0FBQ0Y7QUFDQSxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUM7QUFDNUI7QUFDQTtBQUNBLE1BQU1DLGNBQVksR0FBRyxPQUFPLElBQUk7QUFDaEMsQ0FBQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDbkIsQ0FBQyxLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEVBQUU7QUFDMUQ7QUFDQSxFQUFFLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2xELEVBQUUsSUFBSSxhQUFhLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUNyRDtBQUNBLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDeEUsR0FBRyxNQUFNO0FBQ1QsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3RCLEdBQUc7QUFDSCxFQUFFO0FBQ0Y7QUFDQSxDQUFDLE9BQU8sTUFBTSxDQUFDO0FBQ2YsQ0FBQyxDQUFDO0FBQ0Y7QUFDQSxJQUFBLE9BQWMsR0FBRztBQUNqQixjQUFDRixhQUFXO0FBQ1osb0JBQUNDLG1CQUFpQjtBQUNsQixlQUFDQyxjQUFZO0FBQ2IsQ0FBQzs7QUNsREQsTUFBTSxJQUFJLEdBQUc3QyxZQUFlLENBQUM7QUFDN0IsTUFBTSxZQUFZLEdBQUdKLFlBQXdCLENBQUM7QUFDOUMsTUFBTSxVQUFVLEdBQUdDLGlCQUFzQixDQUFDO0FBQzFDLE1BQU0saUJBQWlCLEdBQUdVLG1CQUE4QixDQUFDO0FBQ3pELE1BQU0sVUFBVSxHQUFHdUMsaUJBQXVCLENBQUM7QUFDM0MsTUFBTSxPQUFPLEdBQUdDLGNBQWtCLENBQUM7QUFDbkMsTUFBTSxTQUFTLEdBQUdDLEtBQXNCLENBQUM7QUFDekMsTUFBTSxjQUFjLEdBQUdDLFlBQXNCLENBQUM7QUFDOUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUMsR0FBR0MsSUFBcUIsQ0FBQztBQUMxRyxNQUFNLENBQUMsV0FBVyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxHQUFHQyxRQUF1QixDQUFDO0FBQ2xHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLENBQUMsR0FBR0MsT0FBd0IsQ0FBQztBQUNuRSxNQUFNLENBQUMsV0FBVyxFQUFFLFlBQVksRUFBRSxpQkFBaUIsQ0FBQyxHQUFHQyxPQUF3QixDQUFDO0FBQ2hGO0FBQ0EsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQztBQUM3QztBQUNBLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxLQUFLO0FBQ2pGLENBQUMsTUFBTSxHQUFHLEdBQUcsU0FBUyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDLEdBQUcsU0FBUyxDQUFDO0FBQ3BFO0FBQ0EsQ0FBQyxJQUFJLFdBQVcsRUFBRTtBQUNsQixFQUFFLE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDeEQsRUFBRTtBQUNGO0FBQ0EsQ0FBQyxPQUFPLEdBQUcsQ0FBQztBQUNaLENBQUMsQ0FBQztBQUNGO0FBQ0EsTUFBTSxlQUFlLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sR0FBRyxFQUFFLEtBQUs7QUFDdEQsQ0FBQyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDdkQsQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUN2QixDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQ3BCLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUI7QUFDQSxDQUFDLE9BQU8sR0FBRztBQUNYLEVBQUUsU0FBUyxFQUFFLGtCQUFrQjtBQUMvQixFQUFFLE1BQU0sRUFBRSxJQUFJO0FBQ2QsRUFBRSxpQkFBaUIsRUFBRSxJQUFJO0FBQ3pCLEVBQUUsU0FBUyxFQUFFLElBQUk7QUFDakIsRUFBRSxXQUFXLEVBQUUsS0FBSztBQUNwQixFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUU7QUFDeEMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7QUFDNUIsRUFBRSxRQUFRLEVBQUUsTUFBTTtBQUNsQixFQUFFLE1BQU0sRUFBRSxJQUFJO0FBQ2QsRUFBRSxPQUFPLEVBQUUsSUFBSTtBQUNmLEVBQUUsR0FBRyxFQUFFLEtBQUs7QUFDWixFQUFFLFdBQVcsRUFBRSxJQUFJO0FBQ25CLEVBQUUsR0FBRyxPQUFPO0FBQ1osRUFBRSxDQUFDO0FBQ0g7QUFDQSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQy9CO0FBQ0EsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN6QztBQUNBLENBQUMsSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxLQUFLLEVBQUU7QUFDNUU7QUFDQSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckIsRUFBRTtBQUNGO0FBQ0EsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDdEMsQ0FBQyxDQUFDO0FBQ0Y7QUFDQSxNQUFNLFlBQVksR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxLQUFLO0FBQ2hELENBQUMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQzNEO0FBQ0EsRUFBRSxPQUFPLEtBQUssS0FBSyxTQUFTLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQztBQUM5QyxFQUFFO0FBQ0Y7QUFDQSxDQUFDLElBQUksT0FBTyxDQUFDLGlCQUFpQixFQUFFO0FBQ2hDLEVBQUUsT0FBTyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNsQyxFQUFFO0FBQ0Y7QUFDQSxDQUFDLE9BQU8sS0FBSyxDQUFDO0FBQ2QsQ0FBQyxDQUFDO0FBQ0Y7QUFDQSxNQUFNLEtBQUssR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxLQUFLO0FBQ3ZDLENBQUMsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDckQsQ0FBQyxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3pDLENBQUMsTUFBTSxjQUFjLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3REO0FBQ0EsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2pDO0FBQ0EsQ0FBQyxJQUFJLE9BQU8sQ0FBQztBQUNiLENBQUMsSUFBSTtBQUNMLEVBQUUsT0FBTyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN6RSxFQUFFLENBQUMsT0FBTyxLQUFLLEVBQUU7QUFDakI7QUFDQSxFQUFFLE1BQU0sWUFBWSxHQUFHLElBQUksWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDO0FBQ3ZELEVBQUUsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7QUFDaEQsR0FBRyxLQUFLO0FBQ1IsR0FBRyxNQUFNLEVBQUUsRUFBRTtBQUNiLEdBQUcsTUFBTSxFQUFFLEVBQUU7QUFDYixHQUFHLEdBQUcsRUFBRSxFQUFFO0FBQ1YsR0FBRyxPQUFPO0FBQ1YsR0FBRyxjQUFjO0FBQ2pCLEdBQUcsTUFBTTtBQUNULEdBQUcsUUFBUSxFQUFFLEtBQUs7QUFDbEIsR0FBRyxVQUFVLEVBQUUsS0FBSztBQUNwQixHQUFHLE1BQU0sRUFBRSxLQUFLO0FBQ2hCLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDTixFQUFFLE9BQU8sWUFBWSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsQ0FBQztBQUNsRCxFQUFFO0FBQ0Y7QUFDQSxDQUFDLE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ25ELENBQUMsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQzVFLENBQUMsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQzNFO0FBQ0EsQ0FBQyxNQUFNLE9BQU8sR0FBRyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNyQztBQUNBLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ25FLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDN0Q7QUFDQSxDQUFDLE1BQU0sYUFBYSxHQUFHLFlBQVk7QUFDbkMsRUFBRSxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFNBQVMsQ0FBQyxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDcEosRUFBRSxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztBQUM1RCxFQUFFLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQzVELEVBQUUsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDdEQ7QUFDQSxFQUFFLElBQUksS0FBSyxJQUFJLFFBQVEsS0FBSyxDQUFDLElBQUksTUFBTSxLQUFLLElBQUksRUFBRTtBQUNsRCxHQUFHLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQztBQUNuQyxJQUFJLEtBQUs7QUFDVCxJQUFJLFFBQVE7QUFDWixJQUFJLE1BQU07QUFDVixJQUFJLE1BQU07QUFDVixJQUFJLE1BQU07QUFDVixJQUFJLEdBQUc7QUFDUCxJQUFJLE9BQU87QUFDWCxJQUFJLGNBQWM7QUFDbEIsSUFBSSxNQUFNO0FBQ1YsSUFBSSxRQUFRO0FBQ1osSUFBSSxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7QUFDbEMsSUFBSSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07QUFDMUIsSUFBSSxDQUFDLENBQUM7QUFDTjtBQUNBLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO0FBQy9CLElBQUksT0FBTyxhQUFhLENBQUM7QUFDekIsSUFBSTtBQUNKO0FBQ0EsR0FBRyxNQUFNLGFBQWEsQ0FBQztBQUN2QixHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU87QUFDVCxHQUFHLE9BQU87QUFDVixHQUFHLGNBQWM7QUFDakIsR0FBRyxRQUFRLEVBQUUsQ0FBQztBQUNkLEdBQUcsTUFBTTtBQUNULEdBQUcsTUFBTTtBQUNULEdBQUcsR0FBRztBQUNOLEdBQUcsTUFBTSxFQUFFLEtBQUs7QUFDaEIsR0FBRyxRQUFRLEVBQUUsS0FBSztBQUNsQixHQUFHLFVBQVUsRUFBRSxLQUFLO0FBQ3BCLEdBQUcsTUFBTSxFQUFFLEtBQUs7QUFDaEIsR0FBRyxDQUFDO0FBQ0osRUFBRSxDQUFDO0FBQ0g7QUFDQSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBQ2xEO0FBQ0EsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUM7QUFDQSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsYUFBYSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdEQ7QUFDQSxDQUFDLE9BQU8sWUFBWSxDQUFDLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0FBQ2pELENBQUMsQ0FBQztBQUNGO0FBQ0FDLE9BQWMsQ0FBQSxPQUFBLEdBQUcsS0FBSyxDQUFDO0FBQ3ZCO0FBQ0FBLE9BQUEsQ0FBQSxPQUFBLENBQUEsSUFBbUIsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxLQUFLO0FBQy9DLENBQUMsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDckQsQ0FBQyxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3pDLENBQUMsTUFBTSxjQUFjLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3REO0FBQ0EsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDbkM7QUFDQSxDQUFDLElBQUksTUFBTSxDQUFDO0FBQ1osQ0FBQyxJQUFJO0FBQ0wsRUFBRSxNQUFNLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzVFLEVBQUUsQ0FBQyxPQUFPLEtBQUssRUFBRTtBQUNqQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2xCLEdBQUcsS0FBSztBQUNSLEdBQUcsTUFBTSxFQUFFLEVBQUU7QUFDYixHQUFHLE1BQU0sRUFBRSxFQUFFO0FBQ2IsR0FBRyxHQUFHLEVBQUUsRUFBRTtBQUNWLEdBQUcsT0FBTztBQUNWLEdBQUcsY0FBYztBQUNqQixHQUFHLE1BQU07QUFDVCxHQUFHLFFBQVEsRUFBRSxLQUFLO0FBQ2xCLEdBQUcsVUFBVSxFQUFFLEtBQUs7QUFDcEIsR0FBRyxNQUFNLEVBQUUsS0FBSztBQUNoQixHQUFHLENBQUMsQ0FBQztBQUNMLEVBQUU7QUFDRjtBQUNBLENBQUMsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDMUUsQ0FBQyxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMxRTtBQUNBLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUFFO0FBQ3BFLEVBQUUsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDO0FBQzFCLEdBQUcsTUFBTTtBQUNULEdBQUcsTUFBTTtBQUNULEdBQUcsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO0FBQ3RCLEdBQUcsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO0FBQ3hCLEdBQUcsUUFBUSxFQUFFLE1BQU0sQ0FBQyxNQUFNO0FBQzFCLEdBQUcsT0FBTztBQUNWLEdBQUcsY0FBYztBQUNqQixHQUFHLE1BQU07QUFDVCxHQUFHLFFBQVEsRUFBRSxNQUFNLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLFdBQVc7QUFDOUQsR0FBRyxVQUFVLEVBQUUsS0FBSztBQUNwQixHQUFHLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxLQUFLLElBQUk7QUFDakMsR0FBRyxDQUFDLENBQUM7QUFDTDtBQUNBLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO0FBQzlCLEdBQUcsT0FBTyxLQUFLLENBQUM7QUFDaEIsR0FBRztBQUNIO0FBQ0EsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUNkLEVBQUU7QUFDRjtBQUNBLENBQUMsT0FBTztBQUNSLEVBQUUsT0FBTztBQUNULEVBQUUsY0FBYztBQUNoQixFQUFFLFFBQVEsRUFBRSxDQUFDO0FBQ2IsRUFBRSxNQUFNO0FBQ1IsRUFBRSxNQUFNO0FBQ1IsRUFBRSxNQUFNLEVBQUUsS0FBSztBQUNmLEVBQUUsUUFBUSxFQUFFLEtBQUs7QUFDakIsRUFBRSxVQUFVLEVBQUUsS0FBSztBQUNuQixFQUFFLE1BQU0sRUFBRSxLQUFLO0FBQ2YsRUFBRSxDQUFDO0FBQ0gsRUFBRTtBQUNGO0FBQ0FBLE9BQUEsQ0FBQSxPQUFBLENBQUEsT0FBc0IsR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLEtBQUs7QUFDL0MsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQy9DLENBQUMsT0FBTyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNuQyxFQUFFO0FBQ0Y7QUFDQUEsT0FBQSxDQUFBLE9BQUEsQ0FBQSxXQUEwQixHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sS0FBSztBQUNuRCxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDL0MsQ0FBQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN4QyxFQUFFO0FBQ0Y7QUFDbUJBLE9BQUEsQ0FBQSxPQUFBLENBQUEsSUFBQSxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxPQUFPLEdBQUcsRUFBRSxLQUFLO0FBQzFELENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtBQUMvRCxFQUFFLE9BQU8sR0FBRyxJQUFJLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ1osRUFBRTtBQUNGO0FBQ0EsQ0FBQyxNQUFNLEtBQUssR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzVDLENBQUMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBQ3RGO0FBQ0EsQ0FBQyxNQUFNO0FBQ1AsRUFBRSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVE7QUFDN0IsRUFBRSxXQUFXLEdBQUcsZUFBZTtBQUMvQixFQUFFLEdBQUcsT0FBTyxDQUFDO0FBQ2I7QUFDQSxDQUFDLE9BQU8sS0FBSztBQUNiLEVBQUUsUUFBUTtBQUNWLEVBQUU7QUFDRixHQUFHLEdBQUcsV0FBVztBQUNqQixHQUFHLFVBQVU7QUFDYixHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ3ZDLEdBQUc7QUFDSCxFQUFFO0FBQ0YsR0FBRyxHQUFHLE9BQU87QUFDYixHQUFHLEtBQUssRUFBRSxTQUFTO0FBQ25CLEdBQUcsTUFBTSxFQUFFLFNBQVM7QUFDcEIsR0FBRyxNQUFNLEVBQUUsU0FBUztBQUNwQixHQUFHLEtBQUs7QUFDUixHQUFHLEtBQUssRUFBRSxLQUFLO0FBQ2YsR0FBRztBQUNILEVBQUUsQ0FBQztBQUNILEVBQUM7Ozs7O0FDM1FjLFNBQVMsU0FBUyxDQUFDLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsRUFBRTtBQUM1RCxDQUFDLE1BQU0sT0FBTyxHQUFHO0FBQ2pCLEtBQUssOEhBQThIO0FBQ25JLEVBQUUsMERBQTBEO0FBQzVELEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYjtBQUNBLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsU0FBUyxHQUFHLFNBQVMsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUN6RDs7QUNMZSxTQUFTLFNBQVMsQ0FBQyxNQUFNLEVBQUU7QUFDMUMsQ0FBQyxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRTtBQUNqQyxFQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsQ0FBQyw2QkFBNkIsRUFBRSxPQUFPLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3pFLEVBQUU7QUFDRjtBQUNBLENBQUMsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDOztBQ0xPLE1BQU0sa0JBQWtCLEdBQUcsTUFBTTtBQUN4QyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRzlCLFNBQU8sQ0FBQztBQUN2QjtBQUNBLENBQUMsSUFBSUEsU0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLEVBQUU7QUFDbkMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxPQUFPLElBQUksU0FBUyxDQUFDO0FBQ2xDLEVBQUU7QUFDRjtBQUNBLENBQUMsSUFBSTtBQUNMLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHK0IsZ0JBQVEsRUFBRSxDQUFDO0FBQzdCLEVBQUUsSUFBSSxLQUFLLEVBQUU7QUFDYixHQUFHLE9BQU8sS0FBSyxDQUFDO0FBQ2hCLEdBQUc7QUFDSCxFQUFFLENBQUMsTUFBTSxFQUFFO0FBQ1g7QUFDQSxDQUFDLElBQUkvQixTQUFPLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRTtBQUNwQyxFQUFFLE9BQU8sR0FBRyxDQUFDLEtBQUssSUFBSSxVQUFVLENBQUM7QUFDakMsRUFBRTtBQUNGO0FBQ0EsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxLQUFLLElBQUksU0FBUyxDQUFDO0FBQy9CLENBQUMsQ0FBQztBQUNGO0FBQ0E7QUFDQSxNQUFNLFlBQVksR0FBRyxrQkFBa0IsRUFBRTs7QUNwQnpDLE1BQU0sSUFBSSxHQUFHO0FBQ2IsQ0FBQyxNQUFNO0FBQ1AsQ0FBQyw2RUFBNkU7QUFDOUUsQ0FBQyxDQUFDO0FBQ0Y7QUFDQSxNQUFNLEdBQUcsR0FBRztBQUNaO0FBQ0EsQ0FBQyxtQkFBbUIsRUFBRSxNQUFNO0FBQzVCLENBQUMsQ0FBQztBQUNGO0FBQ0EsTUFBTSxRQUFRLEdBQUcsR0FBRyxJQUFJO0FBQ3hCLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QyxDQUFDLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztBQUN4QjtBQUNBLENBQUMsS0FBSyxNQUFNLElBQUksSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7QUFDOUUsRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzQyxFQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RDLEVBQUU7QUFDRjtBQUNBLENBQUMsT0FBTyxXQUFXLENBQUM7QUFDcEIsQ0FBQyxDQUFDO0FBa0JGO0FBQ08sU0FBUyxZQUFZLENBQUMsS0FBSyxFQUFFO0FBQ3BDLENBQUMsSUFBSUEsU0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLEVBQUU7QUFDbkMsRUFBRSxPQUFPQSxTQUFPLENBQUMsR0FBRyxDQUFDO0FBQ3JCLEVBQUU7QUFDRjtBQUNBLENBQUMsSUFBSTtBQUNMLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHZ0MsT0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbEUsRUFBRSxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMxQixFQUFFLENBQUMsT0FBTyxLQUFLLEVBQUU7QUFDakIsRUFBRSxJQUFJLEtBQUssRUFBRTtBQUNiLEdBQUcsTUFBTSxLQUFLLENBQUM7QUFDZixHQUFHLE1BQU07QUFDVCxHQUFHLE9BQU9oQyxTQUFPLENBQUMsR0FBRyxDQUFDO0FBQ3RCLEdBQUc7QUFDSCxFQUFFO0FBQ0Y7O0FDcERPLFNBQVMsYUFBYSxHQUFHO0FBQ2hDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLFlBQVksRUFBRSxDQUFDO0FBQy9CLENBQUMsT0FBTyxJQUFJLENBQUM7QUFDYjs7QUNQZSxTQUFTLE9BQU8sR0FBRztBQUNsQyxDQUFDLElBQUlBLFNBQU8sQ0FBQyxRQUFRLEtBQUssT0FBTyxFQUFFO0FBQ25DLEVBQUUsT0FBTztBQUNULEVBQUU7QUFDRjtBQUNBLENBQUNBLFNBQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLGFBQWEsRUFBRSxJQUFJO0FBQ3ZDLEVBQUUscUJBQXFCO0FBQ3ZCLEVBQUUsd0JBQXdCO0FBQzFCLEVBQUUsZ0JBQWdCO0FBQ2xCLEVBQUVBLFNBQU8sQ0FBQyxHQUFHLENBQUMsSUFBSTtBQUNsQixFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2I7Ozs7Ozs7Ozs7OztBQ2RBLENBQUEsTUFBYyxHQUFHeEIsWUFBaUIsQ0FBQTs7Ozs7Ozs7OztBQ0NsQztBQUNBLENBQUEsU0FBUyxPQUFPLENBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxFQUFFLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGNBQWMsS0FBSyxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsRUFBRSxFQUFFLE9BQU8sTUFBTSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLEVBQUU7QUFDclYsQ0FBQSxTQUFTLGFBQWEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksTUFBTSxHQUFHLElBQUksSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsRUFBRSxFQUFFLGVBQWUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyx5QkFBeUIsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxHQUFHLEVBQUUsRUFBRSxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFD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SyxFQUFFLEVBQUUsa0JBQWtCLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDclksQ0FBQSxTQUFTLE9BQU8sQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLEVBQUUsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLHFCQUFxQixFQUFFLEVBQUUsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsY0FBYyxLQUFLLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxFQUFFLEVBQUUsT0FBTyxNQUFNLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxJQUFJLENBQUMsRUFBRTtBQUNyVixDQUFBLFNBQVMsYUFBYSxDQUFDLE1BQU0sRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxD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QUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsTUFBTTtBQUNQLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsTUFBTTtBQUNQLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsSUFBSTtBQUNMLENBQUMsS0FBSztBQUNOLENBQUMsSUFBSTtBQUNMLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsTUFBTTtBQUNQLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsTUFBTTtBQUNQLENBQUMsTUFBTTtBQUNQLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsTUFBTTtBQUNQLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsTUFBTTtBQUNQLENBQUMsTUFBTTtBQUNQLENBQUMsT0FBTztBQUNSLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsSUFBSTtBQUNMLENBQUMsSUFBSTtBQUNMLENBQUMsUUFBUTtBQUNULENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsSUFBSTtBQUNMLENBQUMsS0FBSztBQUNOLENBQUMsR0FBRztBQUNKLENBQUMsSUFBSTtBQUNMLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsT0FBTztBQUNSLENBQUMsS0FBSztBQUNOLENBQUMsTUFBTTtBQUNQLENBQUMsTUFBTTtBQUNQLENBQUMsTUFBTTtBQUNQLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsTUFBTTtBQUNQLENBQUMsTUFBTTtBQUNQLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsSUFBSTtBQUNMLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsTUFBTTtBQUNQLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsT0FBTztBQUNSLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsT0FBTztBQUNSLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsSUFBSTtBQUNMLENBQUMsS0FBSztBQUNOLENBQUMsSUFBSTtBQUNMLENBQUMsSUFBSTtBQUNMLENBQUMsS0FBSztBQUNOLENBQUMsTUFBTTtBQUNQLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsS0FBSztBQUNOLENBQUMsTUFBTTtBQUNQLENBQUMsS0FBSztBQUNOLENB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TSxDQUFDO0FBQzlCLElBQUk7QUFDSixHQUFHLE9BQU87QUFDVixJQUFJLEdBQUcsRUFBRSxLQUFLO0FBQ2QsSUFBSSxJQUFJLEVBQUUsbUNBQW1DO0FBQzdDLElBQUksQ0FBQztBQUNMLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRTtBQUM1QyxHQUFHLE9BQU87QUFDVixJQUFJLEdBQUcsRUFBRSxLQUFLO0FBQ2QsSUFBSSxJQUFJLEVBQUUsbUJBQW1CO0FBQzdCLElBQUksQ0FBQztBQUNMLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRTtBQUM1QyxHQUFHLE9BQU87QUFDVixJQUFJLEdBQUcsRUFBRSxLQUFLO0FBQ2QsSUFBSSxJQUFJLEVBQUUsaUJBQWlCO0FBQzNCLElBQUksQ0FBQztBQUNMLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRTtBQUM1QyxHQUFHLE9BQU87QUFDVixJQUFJLEdBQUcsRUFBRSxLQUFLO0FBQ2QsSUFBSSxJQUFJLEVBQUUsa0JBQWtCO0FBQzVCLElBQUksQ0FBQztBQUNMLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRTtBQUM1QyxHQUFHLE9BQU87QUFDVixJQUFJLEdBQUcsRUFBRSxLQUFLO0FBQ2QsSUFBSSxJQUFJLEVBQUUsbUJBQW1CO0FBQzdCLElBQUksQ0FBQztBQUNMLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FB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Q0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRTtBQUM3SDtBQUNBLEtBQUssTUFBTSxNQUFNLEdBQUdOLGtCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JDLEtBQUssT0FBTyxJQUFJLE1BQU0sU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNuRDtBQUNBLEtBQUssSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRTtBQUMzSDtBQUNBLE1BQU0sT0FBTztBQUNiLE9BQU8sR0FBRyxFQUFFLEtBQUs7QUFDakIsT0FBTyxJQUFJLEVBQUUsZ0JBQWdCO0FBQzdCLE9BQU8sQ0FBQztBQUNSLE1BQU07QUFDTjtBQUNBLEtBQUssSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRTtBQUMzSDtBQUNBLE1BQU0sT0FBTztBQUNiLE9BQU8sR0FBRyxFQUFF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QVEsQ0FBQyxTQUFTLEtBQUssZUFBZSxFQUFFO1lBQ3RELElBQUksSUFBSSxLQUFLLFdBQVcsRUFBRTtBQUN4QixnQkFBQSxPQUFPLEVBQUUsQ0FBQztBQUNYLGFBQUE7QUFBTSxpQkFBQTtBQUNMLGdCQUFBLE9BQU8sRUFBRyxDQUFBLE1BQUEsQ0FBQSxJQUFJLENBQUcsQ0FBQSxNQUFBLENBQUEsZUFBZSxDQUFFLENBQUM7QUFDcEMsYUFBQTtBQUNGLFNBQUE7QUFBTSxhQUFBO0FBQ0wsWUFBQSxPQUFPLEVBQUcsQ0FBQSxNQUFBLENBQUEsSUFBSSxDQUFHLENBQUEsTUFBQSxDQUFBLGVBQWUsQ0FBRSxDQUFDO0FBQ3BDLFNBQUE7S0FDRixDQUFBO0FBRU0sSUFBQSxxQkFBQSxDQUFBLHNCQUFzQixHQUE3QixVQUNFLE1BQWMsRUFDZCxNQUFjLEVBQ2QsV0FBbUIsRUFBQTtRQUVuQixJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFDLFFBQUEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDckMsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNsQyxZQUFBLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFO2dCQUNaLElBQUksSUFBSSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFDL0IsZ0JBQUEsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUM3QyxNQUFNLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQzNDLE1BQU07QUFDUCxhQUFBO0FBQ0YsU0FBQTtLQUNGLENBQUE7SUFDSCxPQUFDLHFCQUFBLENBQUE7QUFBRCxDQW51QkEsQ0FBbURjLGVBQU0sQ0FtdUJ4RDs7OzsiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwzNiwzNywzOCwzOSw0MCw0MSw0Miw0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSw1Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSw2Miw2Myw2NCw2NSw2Niw2Nyw2OCw2OSw3MCw3Ml19
diff --git a/.obsidian/plugins/obsidian-image-auto-upload-plugin/manifest.json b/.obsidian/plugins/obsidian-image-auto-upload-plugin/manifest.json
new file mode 100644
index 00000000000..04f60550598
--- /dev/null
+++ b/.obsidian/plugins/obsidian-image-auto-upload-plugin/manifest.json
@@ -0,0 +1,10 @@
+{
+ "id": "obsidian-image-auto-upload-plugin",
+ "name": "Image auto upload Plugin",
+ "version": "3.7.0",
+ "minAppVersion": "0.10.7",
+ "description": "This plugin uploads images from your clipboard by PicGo",
+ "author": "renmu",
+ "authorUrl": "https://github.com/renmu123/obsidian-image-auto-upload-plugin",
+ "isDesktopOnly": true
+}
diff --git a/.obsidian/plugins/obsidian-linter/data.json b/.obsidian/plugins/obsidian-linter/data.json
new file mode 100644
index 00000000000..c79f16bc796
--- /dev/null
+++ b/.obsidian/plugins/obsidian-linter/data.json
@@ -0,0 +1,264 @@
+{
+ "ruleConfigs": {
+ "add-blank-line-after-yaml": {
+ "enabled": false
+ },
+ "escape-yaml-special-characters": {
+ "enabled": false,
+ "try-to-escape-single-line-arrays": false
+ },
+ "force-yaml-escape": {
+ "enabled": false,
+ "force-yaml-escape-keys": ""
+ },
+ "format-tags-in-yaml": {
+ "enabled": false
+ },
+ "format-yaml-array": {
+ "enabled": false,
+ "alias-key": true,
+ "tag-key": true,
+ "default-array-style": "single-line",
+ "default-array-keys": true,
+ "force-single-line-array-style": "",
+ "force-multi-line-array-style": ""
+ },
+ "insert-yaml-attributes": {
+ "enabled": true,
+ "text-to-insert": "layout: post\ntitle: \nsubtitle: \ndate: \nauthor: Ajiao\nheader-img: img/post-bg-1.jpg\ncatalog: true\ntags:\n - 工作"
+ },
+ "move-tags-to-yaml": {
+ "enabled": false,
+ "how-to-handle-existing-tags": "Nothing",
+ "tags-to-ignore": ""
+ },
+ "remove-yaml-keys": {
+ "enabled": false,
+ "yaml-keys-to-remove": ""
+ },
+ "yaml-key-sort": {
+ "enabled": false,
+ "yaml-key-priority-sort-order": "",
+ "priority-keys-at-start-of-yaml": true,
+ "yaml-sort-order-for-other-keys": "None"
+ },
+ "yaml-timestamp": {
+ "enabled": false,
+ "date-created": true,
+ "date-created-key": "date created",
+ "force-retention-of-create-value": false,
+ "date-modified": true,
+ "date-modified-key": "date modified",
+ "format": "dddd, MMMM Do YYYY, h:mm:ss a"
+ },
+ "yaml-title": {
+ "enabled": false,
+ "title-key": "title",
+ "mode": "first-h1-or-filename-if-h1-missing"
+ },
+ "yaml-title-alias": {
+ "enabled": false,
+ "preserve-existing-alias-section-style": true,
+ "keep-alias-that-matches-the-filename": false,
+ "use-yaml-key-to-keep-track-of-old-filename-or-heading": true
+ },
+ "capitalize-headings": {
+ "enabled": false,
+ "style": "Title Case",
+ "ignore-case-words": true,
+ "ignore-words": "macOS, iOS, iPhone, iPad, JavaScript, TypeScript, AppleScript, I",
+ "lowercase-words": "a, an, the, aboard, about, abt., above, abreast, absent, across, after, against, along, aloft, alongside, amid, amidst, mid, midst, among, amongst, anti, apropos, around, round, as, aslant, astride, at, atop, ontop, bar, barring, before, B4, behind, below, beneath, neath, beside, besides, between, 'tween, beyond, but, by, chez, circa, c., ca., come, concerning, contra, counting, cum, despite, spite, down, during, effective, ere, except, excepting, excluding, failing, following, for, from, in, including, inside, into, less, like, minus, modulo, mod, near, nearer, nearest, next, notwithstanding, of, o', off, offshore, on, onto, opposite, out, outside, over, o'er, pace, past, pending, per, plus, post, pre, pro, qua, re, regarding, respecting, sans, save, saving, short, since, sub, than, through, thru, throughout, thruout, till, times, to, t', touching, toward, towards, under, underneath, unlike, until, unto, up, upon, versus, vs., v., via, vice, vis-à-vis, wanting, with, w/, w., c̄, within, w/i, without, 'thout, w/o, abroad, adrift, aft, afterward, afterwards, ahead, apart, ashore, aside, away, back, backward, backwards, beforehand, downhill, downstage, downstairs, downstream, downward, downwards, downwind, east, eastward, eastwards, forth, forward, forwards, heavenward, heavenwards, hence, henceforth, here, hereby, herein, hereof, hereto, herewith, home, homeward, homewards, indoors, inward, inwards, leftward, leftwards, north, northeast, northward, northwards, northwest, now, onward, onwards, outdoors, outward, outwards, overboard, overhead, overland, overseas, rightward, rightwards, seaward, seawards, skywards, skyward, south, southeast, southwards, southward, southwest, then, thence, thenceforth, there, thereby, therein, thereof, thereto, therewith, together, underfoot, underground, uphill, upstage, upstairs, upstream, upward, upwards, upwind, west, westward, westwards, when, whence, where, whereby, wherein, whereto, wherewith, although, because, considering, given, granted, if, lest, once, provided, providing, seeing, so, supposing, though, unless, whenever, whereas, wherever, while, whilst, ago, according to, as regards, counter to, instead of, owing to, pertaining to, at the behest of, at the expense of, at the hands of, at risk of, at the risk of, at variance with, by dint of, by means of, by virtue of, by way of, for the sake of, for sake of, for lack of, for want of, from want of, in accordance with, in addition to, in case of, in charge of, in compliance with, in conformity with, in contact with, in exchange for, in favor of, in front of, in lieu of, in light of, in the light of, in line with, in place of, in point of, in quest of, in relation to, in regard to, with regard to, in respect to, with respect to, in return for, in search of, in step with, in touch with, in terms of, in the name of, in view of, on account of, on behalf of, on grounds of, on the grounds of, on the part of, on top of, with a view to, with the exception of, à la, a la, as soon as, as well as, close to, due to, far from, in case, other than, prior to, pursuant to, regardless of, subsequent to, as long as, as much as, as far as, by the time, in as much as, inasmuch, in order to, in order that, even, provide that, if only, whether, whose, whoever, why, how, or not, whatever, what, both, and, or, not only, but also, either, neither, nor, just, rather, no sooner, such, that, yet, is, it"
+ },
+ "file-name-heading": {
+ "enabled": false
+ },
+ "header-increment": {
+ "enabled": false,
+ "start-at-h2": false
+ },
+ "headings-start-line": {
+ "enabled": false
+ },
+ "remove-trailing-punctuation-in-heading": {
+ "enabled": false,
+ "punctuation-to-remove": ".,;:!。,;:!"
+ },
+ "footnote-after-punctuation": {
+ "enabled": false
+ },
+ "move-footnotes-to-the-bottom": {
+ "enabled": false
+ },
+ "re-index-footnotes": {
+ "enabled": false
+ },
+ "auto-correct-common-misspellings": {
+ "enabled": true,
+ "ignore-words": ""
+ },
+ "blockquote-style": {
+ "enabled": false,
+ "style": "space"
+ },
+ "convert-bullet-list-markers": {
+ "enabled": false
+ },
+ "default-language-for-code-fences": {
+ "enabled": false,
+ "default-language": ""
+ },
+ "emphasis-style": {
+ "enabled": false,
+ "style": "consistent"
+ },
+ "no-bare-urls": {
+ "enabled": false,
+ "no-bare-uris": false
+ },
+ "ordered-list-style": {
+ "enabled": false,
+ "number-style": "ascending",
+ "list-end-style": "."
+ },
+ "proper-ellipsis": {
+ "enabled": false
+ },
+ "quote-style": {
+ "enabled": false,
+ "single-quote-enabled": true,
+ "single-quote-style": "''",
+ "double-quote-enabled": true,
+ "double-quote-style": "\"\""
+ },
+ "remove-consecutive-list-markers": {
+ "enabled": false
+ },
+ "remove-empty-list-markers": {
+ "enabled": false
+ },
+ "remove-hyphenated-line-breaks": {
+ "enabled": false
+ },
+ "remove-multiple-spaces": {
+ "enabled": false
+ },
+ "strong-style": {
+ "enabled": false,
+ "style": "consistent"
+ },
+ "two-spaces-between-lines-with-content": {
+ "enabled": false
+ },
+ "unordered-list-style": {
+ "enabled": false,
+ "list-style": "consistent"
+ },
+ "compact-yaml": {
+ "enabled": false,
+ "inner-new-lines": false
+ },
+ "consecutive-blank-lines": {
+ "enabled": false
+ },
+ "convert-spaces-to-tabs": {
+ "enabled": false,
+ "tabsize": 4
+ },
+ "empty-line-around-blockquotes": {
+ "enabled": false
+ },
+ "empty-line-around-code-fences": {
+ "enabled": false
+ },
+ "empty-line-around-math-blocks": {
+ "enabled": false
+ },
+ "empty-line-around-tables": {
+ "enabled": false
+ },
+ "heading-blank-lines": {
+ "enabled": false,
+ "bottom": true,
+ "empty-line-after-yaml": true
+ },
+ "line-break-at-document-end": {
+ "enabled": false
+ },
+ "move-math-block-indicators-to-their-own-line": {
+ "enabled": false
+ },
+ "paragraph-blank-lines": {
+ "enabled": false
+ },
+ "remove-empty-lines-between-list-markers-and-checklists": {
+ "enabled": false
+ },
+ "remove-link-spacing": {
+ "enabled": false
+ },
+ "remove-space-around-characters": {
+ "enabled": false,
+ "include-fullwidth-forms": true,
+ "include-cjk-symbols-and-punctuation": true,
+ "include-dashes": true,
+ "other-symbols": ""
+ },
+ "remove-space-before-or-after-characters": {
+ "enabled": false,
+ "characters-to-remove-space-before": ",!?;:).’”]",
+ "characters-to-remove-space-after": "¿¡‘“(["
+ },
+ "space-after-list-markers": {
+ "enabled": false
+ },
+ "space-between-chinese-japanese-or-korean-and-english-or-numbers": {
+ "enabled": false
+ },
+ "trailing-spaces": {
+ "enabled": false,
+ "twp-space-line-break": false
+ },
+ "add-blockquote-indentation-on-paste": {
+ "enabled": false
+ },
+ "prevent-double-checklist-indicator-on-paste": {
+ "enabled": false
+ },
+ "prevent-double-list-item-indicator-on-paste": {
+ "enabled": false
+ },
+ "proper-ellipsis-on-paste": {
+ "enabled": false
+ },
+ "remove-hyphens-on-paste": {
+ "enabled": false
+ },
+ "remove-leading-or-trailing-whitespace-on-paste": {
+ "enabled": false
+ },
+ "remove-leftover-footnotes-from-quote-on-paste": {
+ "enabled": false
+ },
+ "remove-multiple-blank-lines-on-paste": {
+ "enabled": false
+ }
+ },
+ "lintOnSave": false,
+ "recordLintOnSaveLogs": false,
+ "displayChanged": true,
+ "lintOnFileChange": false,
+ "displayLintOnFileChangeNotice": false,
+ "settingsConvertedToConfigKeyValues": true,
+ "foldersToIgnore": [],
+ "linterLocale": "system-default",
+ "logLevel": "ERROR",
+ "lintCommands": [],
+ "customRegexes": [],
+ "commonStyles": {
+ "aliasArrayStyle": "single-line",
+ "tagArrayStyle": "single-line",
+ "minimumNumberOfDollarSignsToBeAMathBlock": 2,
+ "escapeCharacter": "\"",
+ "removeUnnecessaryEscapeCharsForMultiLineArrays": false
+ }
+}
\ No newline at end of file
diff --git a/.obsidian/plugins/obsidian-linter/main.js b/.obsidian/plugins/obsidian-linter/main.js
new file mode 100644
index 00000000000..a547c073980
--- /dev/null
+++ b/.obsidian/plugins/obsidian-linter/main.js
@@ -0,0 +1,2725 @@
+/*
+THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
+if you want to view the source, please visit the github repository of this plugin
+*/
+
+var zm=Object.create;var Rn=Object.defineProperty;var Oc=Object.getOwnPropertyDescriptor;var Sm=Object.getOwnPropertyNames;var Am=Object.getPrototypeOf,Tm=Object.prototype.hasOwnProperty;var nn=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),Cc=(e,t)=>{for(var i in t)Rn(e,i,{get:t[i],enumerable:!0})},Mc=(e,t,i,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Sm(t))!Tm.call(e,r)&&r!==i&&Rn(e,r,{get:()=>t[r],enumerable:!(n=Oc(t,r))||n.enumerable});return e};var rn=(e,t,i)=>(i=e!=null?zm(Am(e)):{},Mc(t||!e||!e.__esModule?Rn(i,"default",{value:e,enumerable:!0}):i,e)),Lm=e=>Mc(Rn({},"__esModule",{value:!0}),e),A=(e,t,i,n)=>{for(var r=n>1?void 0:n?Oc(t,i):t,a=e.length-1,s;a>=0;a--)(s=e[a])&&(r=(n?s(t,i,r):s(r))||r);return n&&r&&Rn(t,i,r),r};var To=(e,t,i)=>{if(!t.has(e))throw TypeError("Cannot "+i)};var j=(e,t,i)=>(To(e,t,"read from private field"),i?i.call(e):t.get(e)),he=(e,t,i)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,i)},Ee=(e,t,i,n)=>(To(e,t,"write to private field"),n?n.call(e,i):t.set(e,i),i);var Lo=(e,t,i,n)=>({set _(r){Ee(e,t,r,i)},get _(){return j(e,t,n)}}),pe=(e,t,i)=>(To(e,t,"access private method"),i);var Da=nn((wd,Ra)=>{(function(e,t){"use strict";typeof define=="function"&&define.amd?define(t):typeof Ra=="object"&&Ra.exports?Ra.exports=t():e.log=t()})(wd,function(){"use strict";var e=function(){},t="undefined",i=typeof window!==t&&typeof window.navigator!==t&&/Trident\/|MSIE /.test(window.navigator.userAgent),n=["trace","debug","info","warn","error"];function r(f,w){var x=f[w];if(typeof x.bind=="function")return x.bind(f);try{return Function.prototype.bind.call(x,f)}catch{return function(){return Function.prototype.apply.apply(x,[f,arguments])}}}function a(){console.log&&(console.log.apply?console.log.apply(console,arguments):Function.prototype.apply.apply(console.log,[console,arguments])),console.trace&&console.trace()}function s(f){return f==="debug"&&(f="log"),typeof console===t?!1:f==="trace"&&i?a:console[f]!==void 0?r(console,f):console.log!==void 0?r(console,"log"):e}function o(f,w){for(var x=0;x=0&&q<=b.levels.SILENT){if(S=q,_!==!1&&C(q),o.call(b,q,f),typeof console===t&&q{var M=function(){this.Diff_Timeout=1,this.Diff_EditCost=4,this.Match_Threshold=.5,this.Match_Distance=1e3,this.Patch_DeleteThreshold=.5,this.Patch_Margin=4,this.Match_MaxBits=32},ne=-1,ae=1,V=0;M.Diff=function(e,t){return[e,t]};M.prototype.diff_main=function(e,t,i,n){typeof n>"u"&&(this.Diff_Timeout<=0?n=Number.MAX_VALUE:n=new Date().getTime()+this.Diff_Timeout*1e3);var r=n;if(e==null||t==null)throw new Error("Null input. (diff_main)");if(e==t)return e?[new M.Diff(V,e)]:[];typeof i>"u"&&(i=!0);var a=i,s=this.diff_commonPrefix(e,t),o=e.substring(0,s);e=e.substring(s),t=t.substring(s),s=this.diff_commonSuffix(e,t);var l=e.substring(e.length-s);e=e.substring(0,e.length-s),t=t.substring(0,t.length-s);var c=this.diff_compute_(e,t,a,r);return o&&c.unshift(new M.Diff(V,o)),l&&c.push(new M.Diff(V,l)),this.diff_cleanupMerge(c),c};M.prototype.diff_compute_=function(e,t,i,n){var r;if(!e)return[new M.Diff(ae,t)];if(!t)return[new M.Diff(ne,e)];var a=e.length>t.length?e:t,s=e.length>t.length?t:e,o=a.indexOf(s);if(o!=-1)return r=[new M.Diff(ae,a.substring(0,o)),new M.Diff(V,s),new M.Diff(ae,a.substring(o+s.length))],e.length>t.length&&(r[0][0]=r[2][0]=ne),r;if(s.length==1)return[new M.Diff(ne,e),new M.Diff(ae,t)];var l=this.diff_halfMatch_(e,t);if(l){var c=l[0],d=l[1],u=l[2],g=l[3],p=l[4],f=this.diff_main(c,u,i,n),w=this.diff_main(d,g,i,n);return f.concat([new M.Diff(V,p)],w)}return i&&e.length>100&&t.length>100?this.diff_lineMode_(e,t,n):this.diff_bisect_(e,t,n)};M.prototype.diff_lineMode_=function(e,t,i){var n=this.diff_linesToChars_(e,t);e=n.chars1,t=n.chars2;var r=n.lineArray,a=this.diff_main(e,t,!1,i);this.diff_charsToLines_(a,r),this.diff_cleanupSemantic(a),a.push(new M.Diff(V,""));for(var s=0,o=0,l=0,c="",d="";s=1&&l>=1){a.splice(s-o-l,o+l),s=s-o-l;for(var u=this.diff_main(c,d,!1,i),g=u.length-1;g>=0;g--)a.splice(s,0,u[g]);s=s+u.length}l=0,o=0,c="",d="";break}s++}return a.pop(),a};M.prototype.diff_bisect_=function(e,t,i){for(var n=e.length,r=t.length,a=Math.ceil((n+r)/2),s=a,o=2*a,l=new Array(o),c=new Array(o),d=0;di);b++){for(var S=-b+p;S<=b-f;S+=2){var L=s+S,C;S==-b||S!=b&&l[L-1]n)f+=2;else if(R>r)p+=2;else if(g){var T=s+u-S;if(T>=0&&T=B)return this.diff_bisectSplit_(e,t,C,R,i)}}}for(var q=-b+w;q<=b-x;q+=2){var T=s+q,B;q==-b||q!=b&&c[T-1]n)x+=2;else if(_>r)w+=2;else if(!g){var L=s+u-q;if(L>=0&&L=B)return this.diff_bisectSplit_(e,t,C,R,i)}}}}return[new M.Diff(ne,e),new M.Diff(ae,t)]};M.prototype.diff_bisectSplit_=function(e,t,i,n,r){var a=e.substring(0,i),s=t.substring(0,n),o=e.substring(i),l=t.substring(n),c=this.diff_main(a,s,!1,r),d=this.diff_main(o,l,!1,r);return c.concat(d)};M.prototype.diff_linesToChars_=function(e,t){var i=[],n={};i[0]="";function r(l){for(var c="",d=0,u=-1,g=i.length;un?e=e.substring(i-n):it.length?e:t,n=e.length>t.length?t:e;if(i.length<4||n.length*2=f.length?[C,R,T,B,L]:null}var s=a(i,n,Math.ceil(i.length/4)),o=a(i,n,Math.ceil(i.length/2)),l;if(!s&&!o)return null;o?s?l=s[4].length>o[4].length?s:o:l=o:l=s;var c,d,u,g;e.length>t.length?(c=l[0],d=l[1],u=l[2],g=l[3]):(u=l[0],g=l[1],c=l[2],d=l[3]);var p=l[4];return[c,d,u,g,p]};M.prototype.diff_cleanupSemantic=function(e){for(var t=!1,i=[],n=0,r=null,a=0,s=0,o=0,l=0,c=0;a0?i[n-1]:-1,s=0,o=0,l=0,c=0,r=null,t=!0)),a++;for(t&&this.diff_cleanupMerge(e),this.diff_cleanupSemanticLossless(e),a=1;a=p?(g>=d.length/2||g>=u.length/2)&&(e.splice(a,0,new M.Diff(V,u.substring(0,g))),e[a-1][1]=d.substring(0,d.length-g),e[a+1][1]=u.substring(g),a++):(p>=d.length/2||p>=u.length/2)&&(e.splice(a,0,new M.Diff(V,d.substring(0,p))),e[a-1][0]=ae,e[a-1][1]=u.substring(0,u.length-p),e[a+1][0]=ne,e[a+1][1]=d.substring(p),a++),a++}a++}};M.prototype.diff_cleanupSemanticLossless=function(e){function t(p,f){if(!p||!f)return 6;var w=p.charAt(p.length-1),x=f.charAt(0),b=w.match(M.nonAlphaNumericRegex_),S=x.match(M.nonAlphaNumericRegex_),L=b&&w.match(M.whitespaceRegex_),C=S&&x.match(M.whitespaceRegex_),R=L&&w.match(M.linebreakRegex_),T=C&&x.match(M.linebreakRegex_),B=R&&p.match(M.blanklineEndRegex_),q=T&&f.match(M.blanklineStartRegex_);return B||q?5:R||T?4:b&&!L&&C?3:L||C?2:b||S?1:0}for(var i=1;i=u&&(u=g,l=n,c=r,d=a)}e[i-1][1]!=l&&(l?e[i-1][1]=l:(e.splice(i-1,1),i--),e[i][1]=c,d?e[i+1][1]=d:(e.splice(i+1,1),i--))}i++}};M.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;M.whitespaceRegex_=/\s/;M.linebreakRegex_=/[\r\n]/;M.blanklineEndRegex_=/\n\r?\n$/;M.blanklineStartRegex_=/^\r?\n\r?\n/;M.prototype.diff_cleanupEfficiency=function(e){for(var t=!1,i=[],n=0,r=null,a=0,s=!1,o=!1,l=!1,c=!1;a0?i[n-1]:-1,l=c=!1),t=!0)),a++;t&&this.diff_cleanupMerge(e)};M.prototype.diff_cleanupMerge=function(e){e.push(new M.Diff(V,""));for(var t=0,i=0,n=0,r="",a="",s;t1?(i!==0&&n!==0&&(s=this.diff_commonPrefix(a,r),s!==0&&(t-i-n>0&&e[t-i-n-1][0]==V?e[t-i-n-1][1]+=a.substring(0,s):(e.splice(0,0,new M.Diff(V,a.substring(0,s))),t++),a=a.substring(s),r=r.substring(s)),s=this.diff_commonSuffix(a,r),s!==0&&(e[t][1]=a.substring(a.length-s)+e[t][1],a=a.substring(0,a.length-s),r=r.substring(0,r.length-s))),t-=i+n,e.splice(t,i+n),r.length&&(e.splice(t,0,new M.Diff(ne,r)),t++),a.length&&(e.splice(t,0,new M.Diff(ae,a)),t++),t++):t!==0&&e[t-1][0]==V?(e[t-1][1]+=e[t][1],e.splice(t,1)):t++,n=0,i=0,r="",a="";break}e[e.length-1][1]===""&&e.pop();var o=!1;for(t=1;tt));s++)r=i,a=n;return e.length!=s&&e[s][0]===ne?a:a+(t-r)};M.prototype.diff_prettyHtml=function(e){for(var t=[],i=/&/g,n=//g,a=/\n/g,s=0;s");switch(o){case ae:t[s]=''+c+"";break;case ne:t[s]=''+c+"";break;case V:t[s]=""+c+"";break}}return t.join("")};M.prototype.diff_text1=function(e){for(var t=[],i=0;ithis.Match_MaxBits)throw new Error("Pattern too long for this browser.");var n=this.match_alphabet_(t),r=this;function a(C,R){var T=C/t.length,B=Math.abs(i-R);return r.Match_Distance?T+B/r.Match_Distance:B?1:T}var s=this.Match_Threshold,o=e.indexOf(t,i);o!=-1&&(s=Math.min(a(0,o),s),o=e.lastIndexOf(t,i+t.length),o!=-1&&(s=Math.min(a(0,o),s)));var l=1<=f;b--){var S=n[e.charAt(b-1)];if(p===0?x[b]=(x[b+1]<<1|1)&S:x[b]=(x[b+1]<<1|1)&S|((g[b+1]|g[b])<<1|1)|g[b+1],x[b]&l){var L=a(p,b-1);if(L<=s)if(s=L,o=b-1,o>i)f=Math.max(1,2*i-o);else break}}if(a(p+1,i)>s)break;g=x}return o};M.prototype.match_alphabet_=function(e){for(var t={},i=0;i"u")n=e,r=this.diff_main(n,t,!0),r.length>2&&(this.diff_cleanupSemantic(r),this.diff_cleanupEfficiency(r));else if(e&&typeof e=="object"&&typeof t>"u"&&typeof i>"u")r=e,n=this.diff_text1(r);else if(typeof e=="string"&&t&&typeof t=="object"&&typeof i>"u")n=e,r=t;else if(typeof e=="string"&&typeof t=="string"&&i&&typeof i=="object")n=e,r=i;else throw new Error("Unknown call format to patch_make.");if(r.length===0)return[];for(var a=[],s=new M.patch_obj,o=0,l=0,c=0,d=n,u=n,g=0;g=2*this.Patch_Margin&&o&&(this.patch_addContext_(s,d),a.push(s),s=new M.patch_obj,o=0,d=u,l=c);break}p!==ae&&(l+=f.length),p!==ne&&(c+=f.length)}return o&&(this.patch_addContext_(s,d),a.push(s)),a};M.prototype.patch_deepCopy=function(e){for(var t=[],i=0;ithis.Match_MaxBits?(l=this.match_main(t,o.substring(0,this.Match_MaxBits),s),l!=-1&&(c=this.match_main(t,o.substring(o.length-this.Match_MaxBits),s+o.length-this.Match_MaxBits),(c==-1||l>=c)&&(l=-1))):l=this.match_main(t,o,s),l==-1)r[a]=!1,n-=e[a].length2-e[a].length1;else{r[a]=!0,n=l-s;var d;if(c==-1?d=t.substring(l,l+o.length):d=t.substring(l,c+this.Match_MaxBits),o==d)t=t.substring(0,l)+this.diff_text2(e[a].diffs)+t.substring(l+o.length);else{var u=this.diff_main(o,d,!1);if(o.length>this.Match_MaxBits&&this.diff_levenshtein(u)/o.length>this.Patch_DeleteThreshold)r[a]=!1;else{this.diff_cleanupSemanticLossless(u);for(var g=0,p,f=0;fa[0][1].length){var s=t-a[0][1].length;a[0][1]=i.substring(a[0][1].length)+a[0][1],r.start1-=s,r.start2-=s,r.length1+=s,r.length2+=s}if(r=e[e.length-1],a=r.diffs,a.length==0||a[a.length-1][0]!=V)a.push(new M.Diff(V,i)),r.length1+=t,r.length2+=t;else if(t>a[a.length-1][1].length){var s=t-a[a.length-1][1].length;a[a.length-1][1]+=i.substring(0,s),r.length1+=s,r.length2+=s}return i};M.prototype.patch_splitMax=function(e){for(var t=this.Match_MaxBits,i=0;i2*t?(o.length1+=d.length,r+=d.length,l=!1,o.diffs.push(new M.Diff(c,d)),n.diffs.shift()):(d=d.substring(0,t-o.length1-this.Patch_Margin),o.length1+=d.length,r+=d.length,c===V?(o.length2+=d.length,a+=d.length):l=!1,o.diffs.push(new M.Diff(c,d)),d==n.diffs[0][1]?n.diffs.shift():n.diffs[0][1]=n.diffs[0][1].substring(d.length))}s=this.diff_text2(o.diffs),s=s.substring(s.length-this.Patch_Margin);var u=this.diff_text1(n.diffs).substring(0,this.Patch_Margin);u!==""&&(o.length1+=u.length,o.length2+=u.length,o.diffs.length!==0&&o.diffs[o.diffs.length-1][0]===V?o.diffs[o.diffs.length-1][1]+=u:o.diffs.push(new M.Diff(V,u))),l||e.splice(++i,0,o)}}};M.prototype.patch_toText=function(e){for(var t=[],i=0;i{Cp.exports=Kx;var Rv=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],Dv=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],Nv=["Su","Mo","Tu","We","Th","Fr","Sa"],to=["January","February","March","April","May","June","July","August","September","October","November","December"],jv=["ACDT","ACST","ACWT","ADT","ACT","AEDT","AEST","AFT","AKDT","AKST","ALMT","AMT","AMST","ANAT","ANAST","AQTT","ART","AST","AWDT","AWST","AZOT","AZOST","AZT","AZST","BNT","BDT","BOT","BRT","BRST","BST","BTT","B","CAST","CAT","CCT","CDT","CEDT","CEST","CET","CHADT","CHAST","CHOT","CHOST","CHsT","CHUT","CIT","CKT","CLST","CLT","COT","CST","CVT","CWST","CXT","C","DAVT","DDUT","DST","EASST","EAST","EAT","ECT","EDT","EEDT","EEST","EET","EGT","EGST","EST","E","EIT","FET","FJT","FJST","FKST","FKT","FNT","F","GALT","GAMT","GET","GFT","GILT","GMT","GST","GYT","G","HADT","HAST","HKT","HOVT","HOVST","HST","ICT","IDT","IOT","IRDT","IRKT","IRKST","IRST","IST","JST","KGT","KOST","KRAT","KRAST","KST","KUYT","LHDT","LHST","LINT","L","MAGT","MAGST","MART","MAWT","MDT","MeST","MHT","MIST","MMT","MSD","MSK","MST","MUT","MVT","MYT","NCT","NDT","NFT","N","NOVT","NOVST","NPT","NRT","NST","NT","NUT","NZDT","NZST","OMST","OMSST","ORAT","O","PDT","PET","PETT","PETST","PGT","PHT","PHOT","PKT","PMDT","PMST","PONT","PST","PWT","PYT","PYST","P","QYZT","RET","ROTT","R","SAKT","SAMT","SAST","SBT","SCT","SGT","SRT","SLT","SLST","SRET","SST","SYOT","TAHT","TFT","TJT","TKT","TLT","TMT","TOT","TRUT","TVT","T","ULAT","ULAST","UTC","UYST","UYT","UZT","U","VET","VLAT","VLAST","VOLT","VUT","V","WAKT","WAT","WAST","WDT","WEDT","WEST","WET","WFT","WGT","WGST","WIB","WIT","WITA","WST","WT","YAKT","YAKST","YAP","YEK","YEKS"],no=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],Kv=new RegExp(Rv.join("|"),"i"),Yv=new RegExp(Dv.join("|"),"i"),Pv=new RegExp("\\b("+Nv.join("|")+")\\b","i"),Hv=new RegExp(to.join("|"),"i"),$v=new RegExp(no.join("|"),"i"),Wv=new RegExp("\\b("+jv.join("|")+")\\b","i"),Uv=/(\d+)(st|nd|rd|th)\b/i,Vv=/(\d{1,4})([/.-])(\d{1,2})[/.-](\d{1,4})/,Gv=/((\+|-)(12:00|11:00|10:00|09:30|09:00|08:00|07:00|06:00|05:00|04:00|03:30|03:00|02:00|01:00|00:00|01:00|02:00|03:00|03:30|04:00|04:30|05:00|05:30|05:45|06:00|06:30|07:00|08:00|08:45|09:00|09:30|10:00|10:30|11:00|12:00|12:45|13:00|14:00))$/,Qv=/((\+|-)(1200|1100|1000|0930|0900|0800|0700|0600|0500|0400|0330|0300|0200|0100|0000|0100|0200|0300|0330|0400|0430|0500|0530|0545|0600|0630|0700|0800|0845|0900|0930|1000|1030|1100|1200|1245|1300|1400))$/,zn="("+["AM?","PM?"].join("|")+")",Zv=new RegExp("0\\d\\:\\d{1,2}\\:\\d{1,2}(\\s*)"+zn,"i"),Jv=new RegExp("0\\d\\:\\d{1,2}(\\s*)"+zn,"i"),Xv=new RegExp("0\\d(\\s*)"+zn,"i"),ex=new RegExp("\\d{1,2}\\:\\d{1,2}\\:\\d{1,2}(\\s*)"+zn,"i"),ix=new RegExp("\\d{1,2}\\:\\d{1,2}(\\s*)"+zn,"i"),tx=new RegExp("\\d{1,2}(\\s*)"+zn,"i"),nx=new RegExp("\\d{1,2}"),rx=new RegExp(to.join("|")+"-\\d{2}","i"),ax=new RegExp(no.join("|")+"-\\d{2}","i"),dc=new RegExp("(\\d{1,2})(\\D+)("+to.join("|")+"|"+no.join("|")+")(\\2)('?\\d{2,4})"),sx=/\d{2}:\d{2}:\d{2}\.\d{3}/,ox=/\d{2}:\d{2}:\d{2}\.\d{2}/,lx=/\d{2}:\d{2}:\d{2}\.\d{1}/,cx=/T\d{2}:\d{2}:\d{2}/,dx=/0\d:\d{2}:\d{2}/,ux=/0\d:\d{2}/,px=/\b([01]?[0-9]|2[0-3]):[0-5][0-9]:\d{2}/,mx=/\b([01]?[0-9]|2[0-3]):[0-5][0-9]:\d{2}\.\d{3}/,gx=/\b([01]?[0-9]|2[0-3]):[0-5][0-9]:\d{2}\.\d{2}/,hx=/\b([01]?[0-9]|2[0-3]):[0-5][0-9]:\d{2}\.\d{1}/,fx=/\b([01]?[0-9]|2[0-3]):[0-5][0-9]/,yx=/24:00:\d{2}/,bx=/24:00:\d{2}\.\d{3}/,vx=/24:00:\d{2}\.\d{2}/,xx=/24:00:\d{2}\.\d{1}/,wx=/24:00/,kx=/\d{4}/,zx=/\d{2}/,Sx=/'\d{2}/,Ap=/0\d/,Tp=/\d{1,2}/,Ax=/0\d/,Tx=/\d{1,2}/,Lx=/^([1-9])\/([1-9]|0[1-9])$/,Ex=/^([1-9])\/(1[012])$/,Ox=/^(0[1-9]|[12][0-9]|3[01])\/([1-9])$/,Cx=/^(0[1-9]|[12][0-9]|3[01])\/(1[012]|0[1-9])$/,Mx=/^([1-9])(\D)([1-9][0-9])$/,qx=/^([1-9])(\D)([0][0-9])$/,Ix=/^(0[1-9]|1[012])(\D)([1-9][0-9])$/,Bx=/^(0[1-9]|1[012])(\D)([0][0-9])$/,uc=/([/][M]|[M][/]|[MM]|[MMMM])/,Lp=/(D)/,pc=/(Y)/,Ep=/\d+\D.+$/,Op=/\D+(\d+)($|Z)/,_x=/M\s*\d{1,2}\b.+$/,Fx=/M\D+(0[1-9])\b.+$/,io=/\d+\s+(H|h|k)/,Rx=/\b(at)\b/i,Dx=/\d{13}/,Nx=/\d{10}/,jx={"/":"MDY",".":"DMY","-":"YMD"};function Kx(e,t){var i=e.toString();if(t=t||{},t.preferredOrder=t.preferredOrder||jx,i=i.replace(Dx,"x"),i=i.replace(Nx,"X"),i=i.replace(Rx,"[$1]"),i.match(dc)){let[,c,d,u,g,p]=i.match(dc),f=[];c.length===2&&c[0]==="0"||t.preferLongFormat?f.push("DD"):f.push("D"),f.push(d),u.match(to)?f.push("MMMM"):u.match(no)?f.push("MMM"):f.push(u),f.push(g),p[0]==="'"?f.push("'YY"):p.length===2?f.push("YY"):(p.length,f.push("YYYY"));var n=f.join("");i=i.replace(dc,n)}i=i.replace(Kv,"dddd"),i=i.replace(Yv,"ddd"),i=i.replace(Pv,"dd"),i=i.replace(Uv,"Do"),i=i.replace(Hv,"MMMM"),i=i.replace($v,"MMM"),i=i.replace(Vv,Yx.bind(null,t)),i=i.replace(Wv,c=>"["+c+"]"),i=i.replace(Gv,"Z"),i=i.replace(Qv,"ZZ"),i=i.replace(sx,"HH:mm:ss.SSS"),i=i.replace(ox,"HH:mm:ss.SS"),i=i.replace(lx,"HH:mm:ss.S"),i=i.replace(cx,"THH:mm:ss");function r(c){return function(d,u,g){return c+u+(g[0].toUpperCase()===g[0]?"A":"a")}}if(i=i.replace(Zv,r("hh:mm:ss")),i=i.replace(ex,r("h:mm:ss")),i=i.replace(Jv,r("hh:mm")),i=i.replace(ix,r("h:mm")),i=i.replace(Xv,r("hh")),i=i.replace(tx,r("h")),i=i.replace(dx,"HH:mm:ss"),i=i.replace(mx,"H:mm:ss.SSS"),i=i.replace(bx,(t.preferLongFormat?"kk":"k")+":mm:ss.SSS"),i=i.replace(gx,"H:mm:ss.SS"),i=i.replace(vx,(t.preferLongFormat?"kk":"k")+":mm:ss.SS"),i=i.replace(hx,"H:mm:ss.S"),i=i.replace(xx,(t.preferLongFormat?"kk":"k")+":mm:ss.S"),i=i.replace(px,"H:mm:ss"),i=i.replace(yx,(t.preferLongFormat?"kk":"k")+":mm:ss"),i=i.replace(ux,"HH:mm"),i=i.replace(fx,"H:mm"),i=i.replace(wx,(t.preferLongFormat?"kk":"k")+":mm"),i=i.replace(kx,"YYYY"),i=i.replace(Sx,"'YY"),i=i.replace(rx,"MMMM-YY"),i=i.replace(ax,"MMM-YY"),i=i.replace(Lx,"D/M"),i=i.replace(Ex,"D/MM"),i=i.replace(Ox,"DD/M"),i=i.replace(Cx,"DD/MM"),i=i.replace(Mx,"M$2YY"),i=i.replace(Ix,"MM$2YY"),i=i.replace(qx,"M$2DD"),i=i.replace(Bx,"MM$2DD"),i.match(uc)){var a=/0\d\.\d{2}|\d{2}\.\d{2}/,s=/\d{1}\.\d{2}/;i=i.replace(a,"H.mm"),i=i.replace(s,"h.mm")}if(!i.match(uc)&&i.match(pc)&&(i=i.replace(Ax,"MM")),!i.match(uc)&&i.match(pc)&&(i=i.replace(Tx,t.preferLongFormat?"MM":"M")),i.match(Fx)&&!i.match(io)&&(i=i.replace(Ap,"DD")),i.match(_x)&&!i.match(io)&&(i=i.replace(Tp,t.preferLongFormat?"DD":"D")),!i.match(Lp)&&i.match(Ep)&&!i.match(io)&&(i=i.replace(Ap,"DD")),!i.match(Lp)&&i.match(Ep)&&!i.match(io)&&(i=i.replace(Tp,t.preferLongFormat?"DD":"D")),i.match(pc)||(i=i.replace(zx,"YY")),i.match(Op)){var o=i.match(Op)[1],l;o==="00"?l="HH":o==="24"?l=t.preferLongFormat?"kk":"k":o>12?l=t.preferLongFormat?"HH":"H":o[0]==="0"?l=t.preferLongFormat?"hh":"h":l=t.preferLongFormat?"hh":"k",i=i.replace(nx,l)}return i.length<1&&(i=void 0),i}function Yx(e,t,i,n,r,a){var s,o=0,l=1,c=2,d=[i.length===1,r.length===1,a.length===1],u=[i[0]==="0",r[0]==="0",a[0]==="0"],g=i.length===4,p=r.length===4,f=a.length===4,w=typeof e.preferredOrder=="string"?e.preferredOrder:e.preferredOrder[n];i=parseInt(i,10),r=parseInt(r,10),a=parseInt(a,10),s=[i,r,a],w=w.toUpperCase();var x=function(S,L){d[S]!==d[L]&&!u[S]&&!u[L]&&(d[S]=!0,d[L]=!0)};if(i>31)return x(l,c),s[0]=g?"YYYY":"YY",s[1]=d[l]?"M":"MM",s[2]=d[c]?"D":"DD",s.join(n);if(i>12)return x(o,l),s[0]=d[o]?"D":"DD",s[1]=d[l]?"M":"MM",s[2]=f?"YYYY":"YY",s.join(n);if(r>12)return x(o,l),s[0]=d[o]?"M":"MM",s[1]=d[l]?"D":"DD",s[2]=f?"YYYY":"YY",s.join(n);if(a>31)return s[2]=f?"YYYY":"YY",w[0]==="M"&&i<13?(x(o,l),s[0]=d[o]?"M":"MM",s[1]=d[l]?"D":"DD",s.join(n)):(x(o,l),s[0]=d[o]?"D":"DD",s[1]=d[l]?"M":"MM",s.join(n));let b=[g,p,f];return x(w.indexOf("D"),w.indexOf("M")),s[w.indexOf("D")]=d[w.indexOf("D")]?"D":"DD",s[w.indexOf("M")]=d[w.indexOf("M")]?"M":"MM",s[w.indexOf("Y")]=b[w.indexOf("Y")]?"YYYY":"YY",s.join(n)}});var Bp=nn((PB,Ip)=>{var qp=Mp();Ip.exports=qp;typeof window<"u"&&window.moment&&(window.moment.parseFormat=qp)});var bm=nn((Wj,ym)=>{"use strict";var si=function(e){if(e=e||{},this.Promise=e.Promise||Promise,this.queues=Object.create(null),this.domainReentrant=e.domainReentrant||!1,this.domainReentrant){if(typeof process>"u"||typeof process.domain>"u")throw new Error("Domain-reentrant locks require `process.domain` to exist. Please flip `opts.domainReentrant = false`, use a NodeJS version that still implements Domain, or install a browser polyfill.");this.domains=Object.create(null)}this.timeout=e.timeout||si.DEFAULT_TIMEOUT,this.maxOccupationTime=e.maxOccupationTime||si.DEFAULT_MAX_OCCUPATION_TIME,this.maxExecutionTime=e.maxExecutionTime||si.DEFAULT_MAX_EXECUTION_TIME,e.maxPending===1/0||Number.isInteger(e.maxPending)&&e.maxPending>=0?this.maxPending=e.maxPending:this.maxPending=si.DEFAULT_MAX_PENDING};si.DEFAULT_TIMEOUT=0;si.DEFAULT_MAX_OCCUPATION_TIME=0;si.DEFAULT_MAX_EXECUTION_TIME=0;si.DEFAULT_MAX_PENDING=1e3;si.prototype.acquire=function(e,t,i,n){if(Array.isArray(e))return this._acquireBatch(e,t,i,n);if(typeof t!="function")throw new Error("You must pass a function to execute");var r=null,a=null,s=null;typeof i!="function"&&(n=i,i=null,s=new this.Promise(function(b,S){r=b,a=S})),n=n||{};var o=!1,l=null,c=null,d=null,u=this,g=function(b,S,L){c&&(clearTimeout(c),c=null),d&&(clearTimeout(d),d=null),b&&(u.queues[e]&&u.queues[e].length===0&&delete u.queues[e],u.domainReentrant&&delete u.domains[e]),o||(s?S?a(S):r(L):typeof i=="function"&&i(S,L),o=!0),b&&u.queues[e]&&u.queues[e].length>0&&u.queues[e].shift()()},p=function(b){if(o)return g(b);l&&(clearTimeout(l),l=null),u.domainReentrant&&b&&(u.domains[e]=process.domain);var S=n.maxExecutionTime||u.maxExecutionTime;if(S&&(d=setTimeout(function(){u.queues[e]&&g(b,new Error("Maximum execution time is exceeded "+e))},S)),t.length===1){var L=!1;try{t(function(C,R){L||(L=!0,g(b,C,R))})}catch(C){L||(L=!0,g(b,C))}}else u._promiseTry(function(){return t()}).then(function(C){g(b,void 0,C)},function(C){g(b,C)})};if(u.domainReentrant&&process.domain&&(p=process.domain.bind(p)),!u.queues[e])u.queues[e]=[],p(!0);else if(u.domainReentrant&&process.domain&&process.domain===u.domains[e])p(!1);else if(u.queues[e].length>=u.maxPending)g(!1,new Error("Too many pending tasks in queue "+e));else{var f=function(){p(!0)};n.skipQueue?u.queues[e].unshift(f):u.queues[e].push(f);var w=n.timeout||u.timeout;w&&(l=setTimeout(function(){l=null,g(!1,new Error("async-lock timed out in queue "+e))},w))}var x=n.maxOccupationTime||u.maxOccupationTime;if(x&&(c=setTimeout(function(){u.queues[e]&&g(!1,new Error("Maximum occupation time is exceeded in queue "+e))},x)),s)return s};si.prototype._acquireBatch=function(e,t,i,n){typeof i!="function"&&(n=i,i=null);var r=this,a=function(o,l){return function(c){r.acquire(o,l,c,n)}},s=e.reduceRight(function(o,l){return a(l,o)},t);if(typeof i=="function")s(i);else return new this.Promise(function(o,l){s.length===1?s(function(c,d){c?l(c):o(d)}):o(s())})};si.prototype.isBusy=function(e){return e?!!this.queues[e]:Object.keys(this.queues).length>0};si.prototype._promiseTry=function(e){try{return this.Promise.resolve(e())}catch(t){return this.Promise.reject(t)}};ym.exports=si});var xm=nn((Uj,vm)=>{"use strict";vm.exports=bm()});var Vw={};Cc(Vw,{default:()=>Ao});module.exports=Lm(Vw);var de=require("obsidian");function Uc(e){return typeof e>"u"||e===null}function Em(e){return typeof e=="object"&&e!==null}function Om(e){return Array.isArray(e)?e:Uc(e)?[]:[e]}function Cm(e,t){var i,n,r,a;if(t)for(a=Object.keys(t),i=0,n=a.length;io&&(a=" ... ",t=n-o+a.length),i-n>o&&(s=" ...",i=n+o-s.length),{str:a+e.slice(t,i).replace(/\t/g,"\u2192")+s,pos:n-t+a.length}}function Oo(e,t){return ke.repeat(" ",t-e.length)+e}function Nm(e,t){if(t=Object.create(t||null),!e.buffer)return null;t.maxLength||(t.maxLength=79),typeof t.indent!="number"&&(t.indent=1),typeof t.linesBefore!="number"&&(t.linesBefore=3),typeof t.linesAfter!="number"&&(t.linesAfter=2);for(var i=/\r?\n|\r|\0/g,n=[0],r=[],a,s=-1;a=i.exec(e.buffer);)r.push(a.index),n.push(a.index+a[0].length),e.position<=a.index&&s<0&&(s=n.length-2);s<0&&(s=n.length-1);var o="",l,c,d=Math.min(e.line+t.linesAfter,r.length).toString().length,u=t.maxLength-(t.indent+d+3);for(l=1;l<=t.linesBefore&&!(s-l<0);l++)c=Eo(e.buffer,n[s-l],r[s-l],e.position-(n[s]-n[s-l]),u),o=ke.repeat(" ",t.indent)+Oo((e.line-l+1).toString(),d)+" | "+c.str+`
+`+o;for(c=Eo(e.buffer,n[s],r[s],e.position,u),o+=ke.repeat(" ",t.indent)+Oo((e.line+1).toString(),d)+" | "+c.str+`
+`,o+=ke.repeat("-",t.indent+d+3+c.pos)+`^
+`,l=1;l<=t.linesAfter&&!(s+l>=r.length);l++)c=Eo(e.buffer,n[s+l],r[s+l],e.position-(n[s]-n[s+l]),u),o+=ke.repeat(" ",t.indent)+Oo((e.line+l+1).toString(),d)+" | "+c.str+`
+`;return o.replace(/\n$/,"")}var jm=Nm,Km=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],Ym=["scalar","sequence","mapping"];function Pm(e){var t={};return e!==null&&Object.keys(e).forEach(function(i){e[i].forEach(function(n){t[String(n)]=i})}),t}function Hm(e,t){if(t=t||{},Object.keys(t).forEach(function(i){if(Km.indexOf(i)===-1)throw new $e('Unknown option "'+i+'" is met in definition of "'+e+'" YAML type.')}),this.options=t,this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(i){return i},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.representName=t.representName||null,this.defaultStyle=t.defaultStyle||null,this.multi=t.multi||!1,this.styleAliases=Pm(t.styleAliases||null),Ym.indexOf(this.kind)===-1)throw new $e('Unknown kind "'+this.kind+'" is specified for "'+e+'" YAML type.')}var Ne=Hm;function qc(e,t){var i=[];return e[t].forEach(function(n){var r=i.length;i.forEach(function(a,s){a.tag===n.tag&&a.kind===n.kind&&a.multi===n.multi&&(r=s)}),i[r]=n}),i}function $m(){var e={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}},t,i;function n(r){r.multi?(e.multi[r.kind].push(r),e.multi.fallback.push(r)):e[r.kind][r.tag]=e.fallback[r.tag]=r}for(t=0,i=arguments.length;t=0?"0b"+e.toString(2):"-0b"+e.toString(2).slice(1)},octal:function(e){return e>=0?"0o"+e.toString(8):"-0o"+e.toString(8).slice(1)},decimal:function(e){return e.toString(10)},hexadecimal:function(e){return e>=0?"0x"+e.toString(16).toUpperCase():"-0x"+e.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),pg=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function mg(e){return!(e===null||!pg.test(e)||e[e.length-1]==="_")}function gg(e){var t,i;return t=e.replace(/_/g,"").toLowerCase(),i=t[0]==="-"?-1:1,"+-".indexOf(t[0])>=0&&(t=t.slice(1)),t===".inf"?i===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:t===".nan"?NaN:i*parseFloat(t,10)}var hg=/^[-+]?[0-9]+e/;function fg(e,t){var i;if(isNaN(e))switch(t){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===e)switch(t){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===e)switch(t){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(ke.isNegativeZero(e))return"-0.0";return i=e.toString(10),hg.test(i)?i.replace("e",".e"):i}function yg(e){return Object.prototype.toString.call(e)==="[object Number]"&&(e%1!==0||ke.isNegativeZero(e))}var bg=new Ne("tag:yaml.org,2002:float",{kind:"scalar",resolve:mg,construct:gg,predicate:yg,represent:fg,defaultStyle:"lowercase"}),vg=Qm.extend({implicit:[eg,rg,ug,bg]}),xg=vg,Gc=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),Qc=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function wg(e){return e===null?!1:Gc.exec(e)!==null||Qc.exec(e)!==null}function kg(e){var t,i,n,r,a,s,o,l=0,c=null,d,u,g;if(t=Gc.exec(e),t===null&&(t=Qc.exec(e)),t===null)throw new Error("Date resolve error");if(i=+t[1],n=+t[2]-1,r=+t[3],!t[4])return new Date(Date.UTC(i,n,r));if(a=+t[4],s=+t[5],o=+t[6],t[7]){for(l=t[7].slice(0,3);l.length<3;)l+="0";l=+l}return t[9]&&(d=+t[10],u=+(t[11]||0),c=(d*60+u)*6e4,t[9]==="-"&&(c=-c)),g=new Date(Date.UTC(i,n,r,a,s,o,l)),c&&g.setTime(g.getTime()-c),g}function zg(e){return e.toISOString()}var Sg=new Ne("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:wg,construct:kg,instanceOf:Date,represent:zg});function Ag(e){return e==="<<"||e===null}var Tg=new Ne("tag:yaml.org,2002:merge",{kind:"scalar",resolve:Ag}),Fo=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
+\r`;function Lg(e){if(e===null)return!1;var t,i,n=0,r=e.length,a=Fo;for(i=0;i64)){if(t<0)return!1;n+=6}return n%8===0}function Eg(e){var t,i,n=e.replace(/[\r\n=]/g,""),r=n.length,a=Fo,s=0,o=[];for(t=0;t>16&255),o.push(s>>8&255),o.push(s&255)),s=s<<6|a.indexOf(n.charAt(t));return i=r%4*6,i===0?(o.push(s>>16&255),o.push(s>>8&255),o.push(s&255)):i===18?(o.push(s>>10&255),o.push(s>>2&255)):i===12&&o.push(s>>4&255),new Uint8Array(o)}function Og(e){var t="",i=0,n,r,a=e.length,s=Fo;for(n=0;n>18&63],t+=s[i>>12&63],t+=s[i>>6&63],t+=s[i&63]),i=(i<<8)+e[n];return r=a%3,r===0?(t+=s[i>>18&63],t+=s[i>>12&63],t+=s[i>>6&63],t+=s[i&63]):r===2?(t+=s[i>>10&63],t+=s[i>>4&63],t+=s[i<<2&63],t+=s[64]):r===1&&(t+=s[i>>2&63],t+=s[i<<4&63],t+=s[64],t+=s[64]),t}function Cg(e){return Object.prototype.toString.call(e)==="[object Uint8Array]"}var Mg=new Ne("tag:yaml.org,2002:binary",{kind:"scalar",resolve:Lg,construct:Eg,predicate:Cg,represent:Og}),qg=Object.prototype.hasOwnProperty,Ig=Object.prototype.toString;function Bg(e){if(e===null)return!0;var t=[],i,n,r,a,s,o=e;for(i=0,n=o.length;i>10)+55296,(e-65536&1023)+56320)}var td=new Array(256),nd=new Array(256);for(pt=0;pt<256;pt++)td[pt]=_c(pt)?1:0,nd[pt]=_c(pt);var pt;function Xg(e,t){this.input=e,this.filename=t.filename||null,this.schema=t.schema||Zc,this.onWarning=t.onWarning||null,this.legacy=t.legacy||!1,this.json=t.json||!1,this.listener=t.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=e.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function rd(e,t){var i={name:e.filename,buffer:e.input.slice(0,-1),position:e.position,line:e.line,column:e.position-e.lineStart};return i.snippet=jm(i),new $e(t,i)}function K(e,t){throw rd(e,t)}function Ia(e,t){e.onWarning&&e.onWarning.call(null,rd(e,t))}var Fc={YAML:function(t,i,n){var r,a,s;t.version!==null&&K(t,"duplication of %YAML directive"),n.length!==1&&K(t,"YAML directive accepts exactly one argument"),r=/^([0-9]+)\.([0-9]+)$/.exec(n[0]),r===null&&K(t,"ill-formed argument of the YAML directive"),a=parseInt(r[1],10),s=parseInt(r[2],10),a!==1&&K(t,"unacceptable YAML version of the document"),t.version=n[0],t.checkLineBreaks=s<2,s!==1&&s!==2&&Ia(t,"unsupported YAML version of the document")},TAG:function(t,i,n){var r,a;n.length!==2&&K(t,"TAG directive accepts exactly two arguments"),r=n[0],a=n[1],ed.test(r)||K(t,"ill-formed tag handle (first argument) of the TAG directive"),Wi.call(t.tagMap,r)&&K(t,'there is a previously declared suffix for "'+r+'" tag handle'),id.test(a)||K(t,"ill-formed tag prefix (second argument) of the TAG directive");try{a=decodeURIComponent(a)}catch{K(t,"tag prefix is malformed: "+a)}t.tagMap[r]=a}};function $i(e,t,i,n){var r,a,s,o;if(t1&&(e.result+=ke.repeat(`
+`,t-1))}function eh(e,t,i){var n,r,a,s,o,l,c,d,u=e.kind,g=e.result,p;if(p=e.input.charCodeAt(e.position),Xe(p)||sn(p)||p===35||p===38||p===42||p===33||p===124||p===62||p===39||p===34||p===37||p===64||p===96||(p===63||p===45)&&(r=e.input.charCodeAt(e.position+1),Xe(r)||i&&sn(r)))return!1;for(e.kind="scalar",e.result="",a=s=e.position,o=!1;p!==0;){if(p===58){if(r=e.input.charCodeAt(e.position+1),Xe(r)||i&&sn(r))break}else if(p===35){if(n=e.input.charCodeAt(e.position-1),Xe(n))break}else{if(e.position===e.lineStart&&Fa(e)||i&&sn(p))break;if(wi(p))if(l=e.line,c=e.lineStart,d=e.lineIndent,ve(e,!1,-1),e.lineIndent>=t){o=!0,p=e.input.charCodeAt(e.position);continue}else{e.position=s,e.line=l,e.lineStart=c,e.lineIndent=d;break}}o&&($i(e,a,s,!1),Do(e,e.line-l),a=s=e.position,o=!1),mt(p)||(s=e.position+1),p=e.input.charCodeAt(++e.position)}return $i(e,a,s,!1),e.result?!0:(e.kind=u,e.result=g,!1)}function ih(e,t){var i,n,r;if(i=e.input.charCodeAt(e.position),i!==39)return!1;for(e.kind="scalar",e.result="",e.position++,n=r=e.position;(i=e.input.charCodeAt(e.position))!==0;)if(i===39)if($i(e,n,e.position,!0),i=e.input.charCodeAt(++e.position),i===39)n=e.position,e.position++,r=e.position;else return!0;else wi(i)?($i(e,n,r,!0),Do(e,ve(e,!1,t)),n=r=e.position):e.position===e.lineStart&&Fa(e)?K(e,"unexpected end of the document within a single quoted scalar"):(e.position++,r=e.position);K(e,"unexpected end of the stream within a single quoted scalar")}function th(e,t){var i,n,r,a,s,o;if(o=e.input.charCodeAt(e.position),o!==34)return!1;for(e.kind="scalar",e.result="",e.position++,i=n=e.position;(o=e.input.charCodeAt(e.position))!==0;){if(o===34)return $i(e,i,e.position,!0),e.position++,!0;if(o===92){if($i(e,i,e.position,!0),o=e.input.charCodeAt(++e.position),wi(o))ve(e,!1,t);else if(o<256&&td[o])e.result+=nd[o],e.position++;else if((s=Qg(o))>0){for(r=s,a=0;r>0;r--)o=e.input.charCodeAt(++e.position),(s=Gg(o))>=0?a=(a<<4)+s:K(e,"expected hexadecimal character");e.result+=Jg(a),e.position++}else K(e,"unknown escape sequence");i=n=e.position}else wi(o)?($i(e,i,n,!0),Do(e,ve(e,!1,t)),i=n=e.position):e.position===e.lineStart&&Fa(e)?K(e,"unexpected end of the document within a double quoted scalar"):(e.position++,n=e.position)}K(e,"unexpected end of the stream within a double quoted scalar")}function nh(e,t){var i=!0,n,r,a,s=e.tag,o,l=e.anchor,c,d,u,g,p,f=Object.create(null),w,x,b,S;if(S=e.input.charCodeAt(e.position),S===91)d=93,p=!1,o=[];else if(S===123)d=125,p=!0,o={};else return!1;for(e.anchor!==null&&(e.anchorMap[e.anchor]=o),S=e.input.charCodeAt(++e.position);S!==0;){if(ve(e,!0,t),S=e.input.charCodeAt(e.position),S===d)return e.position++,e.tag=s,e.anchor=l,e.kind=p?"mapping":"sequence",e.result=o,!0;i?S===44&&K(e,"expected the node content, but found ','"):K(e,"missed comma between flow collection entries"),x=w=b=null,u=g=!1,S===63&&(c=e.input.charCodeAt(e.position+1),Xe(c)&&(u=g=!0,e.position++,ve(e,!0,t))),n=e.line,r=e.lineStart,a=e.position,ln(e,t,Ma,!1,!0),x=e.tag,w=e.result,ve(e,!0,t),S=e.input.charCodeAt(e.position),(g||e.line===n)&&S===58&&(u=!0,S=e.input.charCodeAt(++e.position),ve(e,!0,t),ln(e,t,Ma,!1,!0),b=e.result),p?on(e,o,f,x,w,b,n,r,a):u?o.push(on(e,null,f,x,w,b,n,r,a)):o.push(w),ve(e,!0,t),S=e.input.charCodeAt(e.position),S===44?(i=!0,S=e.input.charCodeAt(++e.position)):i=!1}K(e,"unexpected end of the stream within a flow collection")}function rh(e,t){var i,n,r=Co,a=!1,s=!1,o=t,l=0,c=!1,d,u;if(u=e.input.charCodeAt(e.position),u===124)n=!1;else if(u===62)n=!0;else return!1;for(e.kind="scalar",e.result="";u!==0;)if(u=e.input.charCodeAt(++e.position),u===43||u===45)Co===r?r=u===43?Ic:$g:K(e,"repeat of a chomping mode identifier");else if((d=Zg(u))>=0)d===0?K(e,"bad explicit indentation width of a block scalar; it cannot be less than one"):s?K(e,"repeat of an indentation width identifier"):(o=t+d-1,s=!0);else break;if(mt(u)){do u=e.input.charCodeAt(++e.position);while(mt(u));if(u===35)do u=e.input.charCodeAt(++e.position);while(!wi(u)&&u!==0)}for(;u!==0;){for(Ro(e),e.lineIndent=0,u=e.input.charCodeAt(e.position);(!s||e.lineIndento&&(o=e.lineIndent),wi(u)){l++;continue}if(e.lineIndentt)&&l!==0)K(e,"bad indentation of a sequence entry");else if(e.lineIndentt)&&(x&&(s=e.line,o=e.lineStart,l=e.position),ln(e,t,qa,!0,r)&&(x?f=e.result:w=e.result),x||(on(e,u,g,p,f,w,s,o,l),p=f=w=null),ve(e,!0,-1),S=e.input.charCodeAt(e.position)),(e.line===a||e.lineIndent>t)&&S!==0)K(e,"bad indentation of a mapping entry");else if(e.lineIndentt?l=1:e.lineIndent===t?l=0:e.lineIndentt?l=1:e.lineIndent===t?l=0:e.lineIndent tag; it should be "scalar", not "'+e.kind+'"'),u=0,g=e.implicitTypes.length;u"),e.result!==null&&f.kind!==e.kind&&K(e,"unacceptable node kind for !<"+e.tag+'> tag; it should be "'+f.kind+'", not "'+e.kind+'"'),f.resolve(e.result,e.tag)?(e.result=f.construct(e.result,e.tag),e.anchor!==null&&(e.anchorMap[e.anchor]=e.result)):K(e,"cannot resolve a node with !<"+e.tag+"> explicit tag")}return e.listener!==null&&e.listener("close",e),e.tag!==null||e.anchor!==null||d}function ch(e){var t=e.position,i,n,r,a=!1,s;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap=Object.create(null),e.anchorMap=Object.create(null);(s=e.input.charCodeAt(e.position))!==0&&(ve(e,!0,-1),s=e.input.charCodeAt(e.position),!(e.lineIndent>0||s!==37));){for(a=!0,s=e.input.charCodeAt(++e.position),i=e.position;s!==0&&!Xe(s);)s=e.input.charCodeAt(++e.position);for(n=e.input.slice(i,e.position),r=[],n.length<1&&K(e,"directive name must not be less than one character in length");s!==0;){for(;mt(s);)s=e.input.charCodeAt(++e.position);if(s===35){do s=e.input.charCodeAt(++e.position);while(s!==0&&!wi(s));break}if(wi(s))break;for(i=e.position;s!==0&&!Xe(s);)s=e.input.charCodeAt(++e.position);r.push(e.input.slice(i,e.position))}s!==0&&Ro(e),Wi.call(Fc,n)?Fc[n](e,n,r):Ia(e,'unknown document directive "'+n+'"')}if(ve(e,!0,-1),e.lineIndent===0&&e.input.charCodeAt(e.position)===45&&e.input.charCodeAt(e.position+1)===45&&e.input.charCodeAt(e.position+2)===45?(e.position+=3,ve(e,!0,-1)):a&&K(e,"directives end mark is expected"),ln(e,e.lineIndent-1,qa,!1,!0),ve(e,!0,-1),e.checkLineBreaks&&Ug.test(e.input.slice(t,e.position))&&Ia(e,"non-ASCII line breaks are interpreted as content"),e.documents.push(e.result),e.position===e.lineStart&&Fa(e)){e.input.charCodeAt(e.position)===46&&(e.position+=3,ve(e,!0,-1));return}if(e.position"u"&&(i=t,t=null);var n=ad(e,i);if(typeof t!="function")return n;for(var r=0,a=n.length;r=55296&&i<=56319&&t+1=56320&&n<=57343)?(i-55296)*1024+n-56320+65536:i}function gd(e){var t=/^\n* /;return t.test(e)}var hd=1,Bo=2,fd=3,yd=4,an=5;function Nh(e,t,i,n,r,a,s,o){var l,c=0,d=null,u=!1,g=!1,p=n!==-1,f=-1,w=Rh(Dn(e,0))&&Dh(Dn(e,e.length-1));if(t||s)for(l=0;l=65536?l+=2:l++){if(c=Dn(e,l),!Yn(c))return an;w=w&&Kc(c,d,o),d=c}else{for(l=0;l=65536?l+=2:l++){if(c=Dn(e,l),c===jn)u=!0,p&&(g=g||l-f-1>n&&e[f+1]!==" ",f=l);else if(!Yn(c))return an;w=w&&Kc(c,d,o),d=c}g=g||p&&l-f-1>n&&e[f+1]!==" "}return!u&&!g?w&&!s&&!r(e)?hd:a===Kn?an:Bo:i>9&&gd(e)?an:s?a===Kn?an:Bo:g?yd:fd}function jh(e,t,i,n,r){e.dump=function(){if(t.length===0)return e.quotingType===Kn?'""':"''";if(!e.noCompatMode&&(Ch.indexOf(t)!==-1||Mh.test(t)))return e.quotingType===Kn?'"'+t+'"':"'"+t+"'";var a=e.indent*Math.max(1,i),s=e.lineWidth===-1?-1:Math.max(Math.min(e.lineWidth,40),e.lineWidth-a),o=n||e.flowLevel>-1&&i>=e.flowLevel;function l(c){return Fh(e,c)}switch(Nh(t,o,e.indent,s,l,e.quotingType,e.forceQuotes&&!n,r)){case hd:return t;case Bo:return"'"+t.replace(/'/g,"''")+"'";case fd:return"|"+Yc(t,e.indent)+Pc(Nc(t,a));case yd:return">"+Yc(t,e.indent)+Pc(Nc(Kh(t,s),a));case an:return'"'+Yh(t)+'"';default:throw new $e("impossible error: invalid scalar style")}}()}function Yc(e,t){var i=gd(e)?String(t):"",n=e[e.length-1]===`
+`,r=n&&(e[e.length-2]===`
+`||e===`
+`),a=r?"+":n?"":"-";return i+a+`
+`}function Pc(e){return e[e.length-1]===`
+`?e.slice(0,-1):e}function Kh(e,t){for(var i=/(\n+)([^\n]*)/g,n=function(){var c=e.indexOf(`
+`);return c=c!==-1?c:e.length,i.lastIndex=c,Hc(e.slice(0,c),t)}(),r=e[0]===`
+`||e[0]===" ",a,s;s=i.exec(e);){var o=s[1],l=s[2];a=l[0]===" ",n+=o+(!r&&!a&&l!==""?`
+`:"")+Hc(l,t),r=a}return n}function Hc(e,t){if(e===""||e[0]===" ")return e;for(var i=/ [^ ]/g,n,r=0,a,s=0,o=0,l="";n=i.exec(e);)o=n.index,o-r>t&&(a=s>r?s:o,l+=`
+`+e.slice(r,a),r=a+1),s=o;return l+=`
+`,e.length-r>t&&s>r?l+=e.slice(r,s)+`
+`+e.slice(s+1):l+=e.slice(r),l.slice(1)}function Yh(e){for(var t="",i=0,n,r=0;r=65536?r+=2:r++)i=Dn(e,r),n=je[i],!n&&Yn(i)?(t+=e[r],i>=65536&&(t+=e[r+1])):t+=n||Ih(i);return t}function Ph(e,t,i){var n="",r=e.tag,a,s,o;for(a=0,s=i.length;a"u"&&Ri(e,t,null,!1,!1))&&(n!==""&&(n+=","+(e.condenseFlow?"":" ")),n+=e.dump);e.tag=r,e.dump="["+n+"]"}function $c(e,t,i,n){var r="",a=e.tag,s,o,l;for(s=0,o=i.length;s"u"&&Ri(e,t+1,null,!0,!0,!1,!0))&&((!n||r!=="")&&(r+=Io(e,t)),e.dump&&jn===e.dump.charCodeAt(0)?r+="-":r+="- ",r+=e.dump);e.tag=a,e.dump=r||"[]"}function Hh(e,t,i){var n="",r=e.tag,a=Object.keys(i),s,o,l,c,d;for(s=0,o=a.length;s1024&&(d+="? "),d+=e.dump+(e.condenseFlow?'"':"")+":"+(e.condenseFlow?"":" "),Ri(e,t,c,!1,!1)&&(d+=e.dump,n+=d));e.tag=r,e.dump="{"+n+"}"}function $h(e,t,i,n){var r="",a=e.tag,s=Object.keys(i),o,l,c,d,u,g;if(e.sortKeys===!0)s.sort();else if(typeof e.sortKeys=="function")s.sort(e.sortKeys);else if(e.sortKeys)throw new $e("sortKeys must be a boolean or a function");for(o=0,l=s.length;o1024,u&&(e.dump&&jn===e.dump.charCodeAt(0)?g+="?":g+="? "),g+=e.dump,u&&(g+=Io(e,t)),Ri(e,t+1,d,!0,u)&&(e.dump&&jn===e.dump.charCodeAt(0)?g+=":":g+=": ",g+=e.dump,r+=g));e.tag=a,e.dump=r||"{}"}function Wc(e,t,i){var n,r,a,s,o,l;for(r=i?e.explicitTypes:e.implicitTypes,a=0,s=r.length;a tag resolver accepts not "'+l+'" style');e.dump=n}return!0}return!1}function Ri(e,t,i,n,r,a,s){e.tag=null,e.dump=i,Wc(e,i,!1)||Wc(e,i,!0);var o=od.call(e.dump),l=n,c;n&&(n=e.flowLevel<0||e.flowLevel>t);var d=o==="[object Object]"||o==="[object Array]",u,g;if(d&&(u=e.duplicates.indexOf(i),g=u!==-1),(e.tag!==null&&e.tag!=="?"||g||e.indent!==2&&t>0)&&(r=!1),g&&e.usedDuplicates[u])e.dump="*ref_"+u;else{if(d&&g&&!e.usedDuplicates[u]&&(e.usedDuplicates[u]=!0),o==="[object Object]")n&&Object.keys(e.dump).length!==0?($h(e,t,e.dump,r),g&&(e.dump="&ref_"+u+e.dump)):(Hh(e,t,e.dump),g&&(e.dump="&ref_"+u+" "+e.dump));else if(o==="[object Array]")n&&e.dump.length!==0?(e.noArrayIndent&&!s&&t>0?$c(e,t-1,e.dump,r):$c(e,t,e.dump,r),g&&(e.dump="&ref_"+u+e.dump)):(Ph(e,t,e.dump),g&&(e.dump="&ref_"+u+" "+e.dump));else if(o==="[object String]")e.tag!=="?"&&jh(e,e.dump,t,a,l);else{if(o==="[object Undefined]")return!1;if(e.skipInvalid)return!1;throw new $e("unacceptable kind of an object to dump "+o)}e.tag!==null&&e.tag!=="?"&&(c=encodeURI(e.tag[0]==="!"?e.tag.slice(1):e.tag).replace(/!/g,"%21"),e.tag[0]==="!"?c="!"+c:c.slice(0,18)==="tag:yaml.org,2002:"?c="!!"+c.slice(18):c="!<"+c+">",e.dump=c+" "+e.dump)}return!0}function Wh(e,t){var i=[],n=[],r,a;for(_o(e,i,n),r=0,a=n.length;rre.default.levels.DEBUG||Ho.set(e,performance.now())}function Ui(e){if(re.default.getLevel()>re.default.levels.DEBUG)return;Ho.has(e)||gt(E("logs.timing-key-not-found").replace("{TIMING_KEY}",e));let t=performance.now()-Ho.get(e);gi(`${e}: ${t} `+E("logs.milliseconds-abbreviation"))}function Ka(e,t){re.default.getLevel()<=t&&ja.push(e)}function zd(){ja=[]}function $o(e){Hn=e}function Ya(e){switch(e){case"INFO":{re.default.setLevel("info");break}case"TRACE":{re.default.setLevel("trace");break}case"DEBUG":{re.default.setLevel("debug");break}case"SILENT":{re.default.setLevel("silent");break}case"ERROR":{re.default.setLevel("error");break}case"WARN":{re.default.setLevel("warn");break}}}function Sd(e){switch(e){case re.default.levels.INFO:return"INFO";case re.default.levels.TRACE:return"TRACE";case re.default.levels.DEBUG:return"DEBUG";case re.default.levels.SILENT:return"SILENT";case re.default.levels.ERROR:return"ERROR";case re.default.levels.WARN:return"WARN"}}var Ad={};var Td={};var Ld={};var Ed={commands:{"lint-file":{name:"Linten Sie die aktuelle Datei","error-message":"Lint-Datei-Fehler in der Datei"},"lint-file-unless-ignored":{name:"Linten Sie die aktuelle Datei, es sei denn, sie wird ignoriert"},"lint-all-files":{name:"Linten Sie alle Dateien im Vault","error-message":"Beim Linten aller Dateien Fehler in der Datei","success-message":"Alle Dateien gelinted","errors-message-singular":"Beim Linten aller Dateien gab es einen Fehler.","errors-message-plural":"Beim Linten aller Dateien gab es {NUM} Fehler.","start-message":"Dadurch werden alle Ihre Dateien ver\xE4ndert und es k\xF6nnen Fehler entstehen.","submit-button-text":"Linte alle","submit-button-notice-text":"Linte alle Dateien..."},"lint-all-files-in-folder":{name:"Linte alle Dateien im aktuellen Ordner","start-message":"Dadurch werden alle Ihre Dateien in {FOLDER_NAME} bearbeitet, einschlie\xDFlich der Dateien in den Unterordnern, was zu Fehlern f\xFChren kann.","submit-button-text":"Linte alle Dateien in {FOLDER_NAME}","submit-button-notice-text":"Linten aller Dateien in {FOLDER_NAME}...","error-message":"Beim Linten aller Dateien im Ordner gab es Fehler in der Datei","success-message":"Alle {NUM}-Dateien in {FOLDER_NAME} wurden gelinted.","message-singular":"Alle {NUM}-Dateien in {FOLDER_NAME} wurden gelinted und es trat ein Fehler auf.","message-plural":"Alle {FILE_COUNT}-Dateien in {FOLDER_NAME} wurden gelinted und es gab {ERROR_COUNT} Fehler."},"paste-as-plain-text":{name:"Einf\xFCgen als reiner Text und ohne \xC4nderungen"},"lint-file-pop-up-menu-text":{name:"Linte Datei"},"lint-folder-pop-up-menu-text":{name:"Linte Ordner"}},logs:{"plugin-load":"Plugin wird geladen","plugin-unload":"Plugin entladen","folder-lint":"Linting-Ordner ","linter-run":"Laufender Linter","paste-link-warning":"Abgebrochenes Einf\xFCgen des Lints, da der Inhalt der Zwischenablage ein Link ist, wodurch Konflikte mit anderen Plugins vermieden werden, die das Einf\xFCgen \xE4ndern.","see-console":"Weitere Informationen finden Sie in der Konsole.","unknown-error":"Beim Linten ist ein unbekannter Fehler aufgetreten.","moment-locale-not-found":"Beim Versuch, Moment.js locale auf {MOMENT_LOCALE} umzustellen, wurde {CURRENT_LOCALE} angezeigt","file-change-lint-message-start":"Linted","pre-rules":"Regeln vor regul\xE4ren Regeln","post-rules":"Regeln nach regul\xE4ren Regeln","rule-running":"Laufende Regeln","custom-regex":"Benutzerdefinierte Regex-Regeln","running-custom-regex":"Ausf\xFChren von benutzerdefinierten Regex","running-custom-lint-command":"Ausf\xFChren von benutzerdefinierten Lint-Befehlen","custom-lint-duplicate-warning":'Sie k\xF6nnen denselben Befehl ("{COMMAND_NAME}") nicht zweimal als benutzerdefinierte Lint-Regel ausf\xFChren.',"custom-lint-error-message":"Benutzerdefinierter Lint-Befehl","disabled-text":"ist deaktiviert","run-rule-text":"L\xE4uft","timing-key-not-found":"Der Timing-Schl\xFCssel '{TIMING_KEY}' ist in der Timing-Info-Liste nicht vorhanden, daher wurde er ignoriert","milliseconds-abbreviation":"ms","invalid-date-format-error":"Das Format des Erstellungsdatums '{DATE}' konnte nicht analysiert oder bestimmt werden, sodass das Erstellungsdatum in '{FILE_NAME}","invalid-delimiter-error-message":"Trennzeichen darf nur ein einzelnes Zeichen sein","missing-footnote-error-message":"Die Fu\xDFnote '{FOOTNOTE}' hat keinen entsprechenden Fu\xDFnotenverweis vor dem Fu\xDFnoteninhalt und kann nicht verarbeitet werden. Bitte achten Sie darauf, dass alle Fu\xDFnoten vor dem Inhalt der Fu\xDFnote einen entsprechenden Verweis haben.","too-many-footnotes-error-message":"Der Fu\xDFnotenschl\xFCssel '{FOOTNOTE_KEY}' hat mehr als 1 Fu\xDFnote, die darauf verweist. Bitte aktualisieren Sie die Fu\xDFnoten so, dass es nur noch eine Fu\xDFnote pro Fu\xDFnotenschl\xFCssel gibt.","wrapper-yaml-error":"Fehler in der YAML: {ERROR_MESSAGE}","wrapper-unknown-error":"Unbekannter Fehler: {ERROR_MESSAGE}"},"notice-text":{"empty-clipboard":"Es gibt keinen Inhalt in der Zwischenablage.","characters-added":"Zeichen hinzugef\xFCgt","characters-removed":"Zeichen entfernt","copy-to-clipboard-failed":"Kopieren des Textes in die Zwischenablage fehlgeschlagen: "},"all-rules-option":"Alle","linter-title":"Linter","empty-search-results-text":"Keine Einstellungen stimmen mit der Suche \xFCberein","warning-text":"Warnung","file-backup-text":"Stellen Sie sicher, dass Sie Ihre Dateien gesichert haben.",tabs:{names:{general:"Allgemein",custom:"Individuell",yaml:"YAML",heading:"\xDCberschrift",content:"Inhalt",footnote:"Fu\xDFnote",spacing:"Abstand",paste:"Einf\xFCgen",debug:"Debuggen"},"default-search-bar-text":"Alle Einstellungen durchsuchen",general:{"lint-on-save":{name:"Linten beim Speichern",description:"Linten der Datei beim manuellen Speichern (wenn `Strg + S` gedr\xFCckt wird oder wenn `:w` ausgef\xFChrt wird, w\xE4hrend vim-Tastenkombinationen verwendet werden)"},"display-message":{name:"Meldung beim Linten anzeigen",description:"Zeigen Sie die Anzahl der Zeichen an, die sich nach dem Linten ge\xE4ndert haben"},"lint-on-file-change":{name:"Linten bei Datei\xE4nderungen",description:"Wenn eine Datei geschlossen oder zu einer neuen Datei gewechselt wird, wird die vorherige Datei gelinted."},"display-lint-on-file-change-message":{name:"Nachricht beim Linten nach einer Datei\xE4nderung anzeigen",description:"Zeigt eine Meldung an, wenn `Linten bei Datei\xE4nderungen` ausgel\xF6st wurde"},"folders-to-ignore":{name:"Ordner, die ignoriert werden sollen",description:"Ordner, die ignoriert werden sollen, wenn alle Dateien gelinted oder beim Speichern gelinted werden. Geben Sie Ordnerpfade ein, die durch Zeilenumbr\xFCche getrennt sind","folder-search-placeholder-text":"Ordner-Name","add-input-button-text":"Einen anderen zu ignorierenden Ordner hinzuf\xFCgen","delete-tooltip":"L\xF6schen"},"override-locale":{name:"Gebietsschema \xFCberschreiben",description:"Legen Sie diese Option fest, wenn Sie ein anderes Gebietsschema als das Standardgebietsschema verwenden m\xF6chten"},"same-as-system-locale":"Identisch mit System ({SYS_LOCALE})","yaml-aliases-section-style":{name:"YAML-Aliase-Abschnittsstil",description:"Der Stil des YAML-Aliasabschnitts"},"yaml-tags-section-style":{name:"Abschnittsstil f\xFCr YAML-Tags",description:"Der Stil des YAML-Tags-Abschnitts"},"default-escape-character":{name:"Standard-Escape-Zeichen",description:"Das Standardzeichen, das zum Maskieren von YAML-Werten verwendet werden soll, wenn ein einfaches Anf\xFChrungszeichen und kein doppeltes Anf\xFChrungszeichen vorhanden sind."},"remove-unnecessary-escape-chars-in-multi-line-arrays":{name:"Entfernen Sie unn\xF6tige Escape-Zeichen im mehrzeiligen Array-Format",description:"Escape-Zeichen f\xFCr mehrzeilige YAML-Arrays ben\xF6tigen nicht die gleiche Escape-Funktion wie einzeilige Arrays. Entfernen Sie also im mehrzeiligen Format zus\xE4tzliche Escapezeichen, die nicht erforderlich sind"},"number-of-dollar-signs-to-indicate-math-block":{name:"Anzahl der Dollarzeichen, die den Matheblock anzeigen",description:"Die Anzahl der Dollarzeichen, um den mathematischen Inhalt als mathematischen Block anstelle von Inline-Mathematik zu betrachten"}},debug:{"log-level":{name:"Log-Ebene",description:"Die Arten von Logmeldungen, die vom Dienst protokolliert werden d\xFCrfen. Der Standardwert ist Fehler."},"linter-config":{name:"Linter-Konfiguration",description:"Der Inhalt der data.json f\xFCr den Linter zum Zeitpunkt des Ladens der Einstellungsseite"},"log-collection":{name:"Sammeln Sie Protokolle bei aktiviertem `Linten beim Speichern` und dem Linten der aktuellen Datei",description:"Sammelt die Log-Meldungen, wenn Sie `Linten beim Speichern` aktiviert haben und die aktuelle Datei linten. Diese Protokolle k\xF6nnen beim Debuggen und Erstellen von Fehlerberichten hilfreich sein."},"linter-logs":{name:"Linter-Protokolle",description:"Die Protokolle des letzten `Linten beim Speichern`-Durchlaufes oder dem letzten Linten der aktuellen Datei werden gesammelt, wenn die Option aktiviert ist."}}},options:{"custom-command":{name:"Benutzerdefinierte Befehle",description:"Benutzerdefinierte Befehle sind Obsidian-Befehle, die ausgef\xFChrt werden, nachdem der Linter seine regul\xE4ren Regeln ausgef\xFChrt hat. Dies bedeutet, dass sie nicht ausgef\xFChrt werden, bevor die YAML-Zeitstempellogik ausgef\xFChrt wird, sodass sie dazu f\xFChren k\xF6nnen, dass der YAML-Zeitstempel bei der n\xE4chsten Ausf\xFChrung des Linters ausgel\xF6st wird. Sie k\xF6nnen einen Obsidian-Befehl nur einmal ausw\xE4hlen. **_Beachten Sie, dass dies derzeit nur beim Linten der aktuellen Datei funktioniert._**",warning:"Wenn Sie eine Option ausw\xE4hlen, stellen Sie sicher, dass Sie die Option entweder mit der Maus oder durch Dr\xFCcken der Eingabetaste ausw\xE4hlen. Andere Auswahlmethoden funktionieren m\xF6glicherweise nicht und es werden nur Auswahlen eines tats\xE4chlichen Obsidian-Befehls oder einer leeren Zeichenfolge gespeichert.","add-input-button-text":"Neuen Befehl hinzuf\xFCgen","command-search-placeholder-text":"Obsidian-Befehl","move-up-tooltip":"Aufr\xFCcken","move-down-tooltip":"Bewegen Sie sich nach unten","delete-tooltip":"L\xF6schen"},"custom-replace":{name:"Benutzerdefinierter Regex-Ersatz",description:"Der benutzerdefinierte Regex-Ersatz kann verwendet werden, um alles zu ersetzen, was mit dem Such-Regex mit dem Ersatzwert \xFCbereinstimmt. Bei den Werten replace und find muss es sich um g\xFCltige Regex-Werte handeln.",warning:"Verwenden Sie dies mit Vorsicht, wenn Sie Regex nicht kennen. Stellen Sie au\xDFerdem sicher, dass Sie keine Lookbehinds in Ihrem regul\xE4ren Ausdruck auf iOS-Mobilger\xE4ten verwenden, da dies dazu f\xFChrt, dass Lints fehlschlagen, da dies auf dieser Plattform nicht unterst\xFCtzt wird.","add-input-button-text":"Neuen Regex-Ersatz hinzuf\xFCgen","regex-to-find-placeholder-text":"Regex zu finden","flags-placeholder-text":"Flaggen","regex-to-replace-placeholder-text":"Regex zu ersetzen","label-placeholder-text":"Etikett","move-up-tooltip":"Aufr\xFCcken","move-down-tooltip":"Bewegen Sie sich nach unten","delete-tooltip":"L\xF6schen"}},rules:{"auto-correct-common-misspellings":{name:"H\xE4ufige Rechtschreibfehler automatisch korrigieren",description:"Verwendet ein W\xF6rterbuch mit h\xE4ufigen Rechtschreibfehlern, um sie automatisch in die richtige Schreibweise umzuwandeln. Siehe [Autokorrekturkarte](https://github.com/platers/obsidian-linter/tree/master/src/utils/auto-correct-misspellings.ts) f\xFCr die vollst\xE4ndige Liste der automatisch korrigierten W\xF6rter.","ignore-words":{name:"Ignorieren Sie W\xF6rter",description:"Eine durch Kommas getrennte Liste von W\xF6rtern in Kleinbuchstaben, die bei der automatischen Korrektur ignoriert werden sollen"}},"add-blockquote-indentation-on-paste":{name:"Blockquote-Einr\xFCckung beim Einf\xFCgen hinzuf\xFCgen",description:"F\xFCgt Blockzitate zu allen au\xDFer der ersten Zeile hinzu, wenn sich der Cursor w\xE4hrend des Einf\xFCgens in einer Blockquote/Callout-Zeile befindet"},"blockquote-style":{name:"Blockquote-Stil",description:"Stellt sicher, dass der Blockquote-Stil konsistent ist.",style:{name:"Stil",description:"Der f\xFCr Blockquote-Indikatoren verwendete Stil"}},"capitalize-headings":{name:"\xDCberschriften gro\xDF schreiben",description:"\xDCberschriften sollten mit Gro\xDF- und Kleinschreibung formatiert werden",style:{name:"Stil",description:"Die Art der zu verwendenden Gro\xDFschreibung"},"ignore-case-words":{name:"Ignore Cased Words",description:"Only apply title case style to words that are all lowercase"},"ignore-words":{name:"Ignorieren Sie Gro\xDF-/Kleinschreibungsw\xF6rter",description:"Eine durch Kommas getrennte Liste von W\xF6rtern, die bei der Gro\xDFschreibung ignoriert werden sollen"},"lowercase-words":{name:"W\xF6rter in Kleinbuchstaben",description:"Eine durch Kommas getrennte Liste von W\xF6rtern, um Kleinbuchstaben zu behalten"}},"compact-yaml":{name:"YAML komprimieren",description:"Entfernt f\xFChrende und nachfolgende Leerzeilen im YAML-Frontmatter.","inner-new-lines":{name:"Innere neue Zeilen",description:"Entfernen Sie neue Zeilen, die sich nicht am Anfang oder am Ende der YAML befinden"}},"consecutive-blank-lines":{name:"aufeinanderfolgende Leerzeilen zusammenfassen",description:"Es sollte h\xF6chstens eine aufeinanderfolgende Leerzeile geben."},"convert-bullet-list-markers":{name:"Konvertiere Aufz\xE4hlungszeichen",description:"Konvertiert g\xE4ngige Symbole f\xFCr Aufz\xE4hlungslisten in Markdown-Listenmarkierungen."},"convert-spaces-to-tabs":{name:"Leerzeichen in Tabulatoren konvertieren",description:"Konvertiert f\xFChrende Leerzeichen in Tabulatoren.",tabsize:{name:"Tabgr\xF6\xDFe",description:"Anzahl der Leerzeichen, die in einen Tabulator umgewandelt werden"}},"emphasis-style":{name:"Hervorhebungsstil",description:"Stellt sicher, dass der Hervorhebungsstil konsistent ist.",style:{name:"Stil",description:"Der Stil, der verwendet wird, um hervorgehobene Inhalte zu kennzeichnen"}},"empty-line-around-blockquotes":{name:"Leere Zeile um Blockquotes",description:"Stellt sicher, dass Blockzitate in einer leeren Zeile stehen, es sei denn, sie beginnen oder beenden ein Dokument. **Beachten Sie, dass eine leere Zeile entweder eine Verschachtelungsebene weniger f\xFCr Blockzitate oder ein Zeilenumbruchzeichen ist.**"},"empty-line-around-code-fences":{name:"Leere Zeile um Code-Bereiche",description:"Stellt sicher, dass Codebereiche mit einer leeren Zeile versehen sind, es sei denn, sie beginnen oder beenden ein Dokument."},"empty-line-around-math-blocks":{name:"Leere Zeile um mathematische Bl\xF6cke",description:"Stellt sicher, dass es eine leere Zeile um mathematische Bl\xF6cke gibt, indem `Anzahl der Dollarzeichen, die einen mathematischen Block anzeigen` verwendet wird, um zu bestimmen, wie viele Dollarzeichen einen mathematischen Block f\xFCr einzeilige Mathematik anzeigen."},"empty-line-around-tables":{name:"Leere Zeile um Tabellen",description:"Stellt sicher, dass es eine leere Zeile um Github-formatierte Tabellen gibt, es sei denn, sie beginnen oder beenden ein Dokument."},"escape-yaml-special-characters":{name:"Escape-YAML-Sonderzeichen",description:`Maskiert Doppelpunkte mit einem Leerzeichen nach ihnen (: ), einfache Anf\xFChrungszeichen (') und doppelte Anf\xFChrungszeichen (") in YAML.`,"try-to-escape-single-line-arrays":{name:"Versucht, Single-Line-Arrays zu vermeiden",description:'Versucht, Arraywerte zu maskieren, wobei davon ausgegangen wird, dass ein Array mit "[" beginnt, mit "]" endet und Elemente enth\xE4lt, die durch "," getrennt sind.'}},"file-name-heading":{name:"\xDCberschrift des Dateinamens",description:"F\xFCgt den Dateinamen als H1-\xDCberschrift ein, wenn keine H1-\xDCberschrift vorhanden ist."},"footnote-after-punctuation":{name:"Fu\xDFnote nach Interpunktion",description:"Stellt sicher, dass Fu\xDFnotenverweise nach der Interpunktion und nicht davor platziert werden."},"force-yaml-escape":{name:"YAML-Escape erzwingen",description:"Maskiert die Werte f\xFCr die angegebenen YAML-Schl\xFCssel.","force-yaml-escape-keys":{name:"Erzwingen Sie die YAML-Escape-Klausel f\xFCr Schl\xFCssel",description:"Verwendet das YAML-Escapezeichen f\xFCr die angegebenen YAML-Schl\xFCssel, die durch ein Zeilenumbruchzeichen getrennt sind, wenn es nicht bereits mit Escapezeichen versehen ist. Nicht auf YAML-Arrays verwenden."}},"format-tags-in-yaml":{name:"Formatieren von Tags in YAML",description:"Entfernen Sie Hashtags aus Tags im YAML-Frontmatter, da sie die Tags dort ung\xFCltig machen."},"format-yaml-array":{name:"Formatieren des YAML-Arrays",description:"Erm\xF6glicht die Formatierung von regul\xE4ren YAML-Arrays als mehrzeilig oder einzeilig und `tags` und `aliases` d\xFCrfen einige Obsidian-spezifische YAML-Formate haben. Beachten Sie, dass eine einzelne Zeichenfolge zu einer einzelnen Zeile von einem einzelnen Zeichenfolgeneintrag zu einem einzeiligen Array wechselt, wenn mehr als 1 Eintrag vorhanden ist. Das Gleiche gilt f\xFCr eine einzelne Zeichenfolge bis zu einer mehrzeiligen Zeichenfolge, mit der Ausnahme, dass sie zu einem mehrzeiligen Array wird.","alias-key":{name:'Abschnitt "YAML-Aliase" formatieren',description:"Aktiviert die Formatierung f\xFCr den Abschnitt YAML-Aliase. Sie sollten diese Option nicht zusammen mit der Regel `YAML-Titel-Alias` aktivieren, da sie m\xF6glicherweise nicht gut zusammenarbeiten oder unterschiedliche Formatstile ausgew\xE4hlt haben, was zu unerwarteten Ergebnissen f\xFChrt."},"tag-key":{name:'Abschnitt "YAML-Tags formatieren"',description:"Aktiviert die Formatierung f\xFCr den Abschnitt YAML-Tags."},"default-array-style":{name:"Standardm\xE4\xDFiger YAML-Array-Abschnittsstil",description:"Der Stil anderer YAML-Arrays, die nicht `tags` oder `aliases` sind oder bei `Erzwingt f\xFCr Schl\xFCsselwerte einzeilige Arrays` und `Erzwingt f\xFCr Schl\xFCsselwerte mehrzeilige Arrays`"},"default-array-keys":{name:"Formatieren von YAML-Array-Abschnitten",description:"Aktiviert die Formatierung f\xFCr regul\xE4re YAML-Arrays"},"force-single-line-array-style":{name:"Erzwingt f\xFCr Schl\xFCsselwerte einzeilige Arrays",description:"Erzwingt, dass das YAML-Array f\xFCr die neuen zeilengetrennten Schl\xFCssel im einzeiligen Format vorliegt (leer lassen, um diese Option zu deaktivieren)"},"force-multi-line-array-style":{name:"Erzwingt f\xFCr Schl\xFCsselwerte mehrzeilige Arrays",description:"Erzwingt, dass das YAML-Array f\xFCr die neuen zeilengetrennten Schl\xFCssel im mehrzeiligen Format vorliegt (leer lassen, um diese Option zu deaktivieren)"}},"header-increment":{name:"Header-Inkrement",description:"\xDCberschriftenebenen sollten jeweils nur um eine Ebene erh\xF6ht werden","start-at-h2":{name:"Start-Header-Inkrement auf \xDCberschriftenebene 2",description:"Legt die \xDCberschriftenebene 2 als minimale \xDCberschriftenebene in einer Datei f\xFCr das Kopfzeileninkrement fest und verschiebt alle \xDCberschriften entsprechend, sodass sie beginnend mit einer \xDCberschrift der Ebene 2 inkrementiert werden."}},"heading-blank-lines":{name:"\xDCberschriften mit Leerzeilen",description:"Alle \xDCberschriften haben sowohl davor als auch danach eine Leerzeile (au\xDFer wenn sich die \xDCberschrift am Anfang oder Ende des Dokuments befindet).",bottom:{name:"Darunter",description:"Einf\xFCgen einer Leerzeile unter \xDCberschriften"},"empty-line-after-yaml":{name:"Leere Zeile zwischen YAML und Header",description:"Behalten Sie die leere Zeile zwischen dem YAML-Frontmatter und dem Header bei"}},"headings-start-line":{name:"\xDCberschriften am Zeilenbeginn",description:"Bei \xDCberschriften, die keine Zeile beginnen, wird der vorangehende Leerraum entfernt, um sicherzustellen, dass sie als \xDCberschriften erkannt werden."},"insert-yaml-attributes":{name:"Einf\xFCgen von YAML-Attributen",description:"F\xFCgt die angegebenen YAML-Attribute in den YAML-Frontmatter ein. Setzen Sie jedes Attribut in eine einzelne Zeile.","text-to-insert":{name:"Text zum Einf\xFCgen",description:"Text, der in den YAML-Frontmatter eingef\xFCgt werden soll"}},"line-break-at-document-end":{name:"Zeilenumbruch am Dokumentende",description:"Stellt sicher, dass am Ende eines Dokuments genau ein Zeilenumbruch steht."},"move-footnotes-to-the-bottom":{name:"Fu\xDFnoten nach unten verschieben",description:"Verschieben Sie alle Fu\xDFnoten an das Ende des Dokuments."},"move-math-block-indicators-to-their-own-line":{name:"Verschieben Sie mathematische Blockindikatoren in eine eigene Zeile",description:"Verschieben Sie alle Anfangs- und Endindikatoren f\xFCr mathematische Bl\xF6cke in ihre eigenen Zeilen, indem Sie `Anzahl der Dollarzeichen, die einen mathematischen Block anzeigen` verwenden, um zu bestimmen, wie viele Dollarzeichen einen mathematischen Block f\xFCr einzeilige Mathematik anzeigen."},"move-tags-to-yaml":{name:"Tags nach YAML verschieben",description:"Verschieben Sie alle Tags in den YAML-Frontmatter des Dokuments.","how-to-handle-existing-tags":{name:"Body-Tag-Operation",description:"Die Aktion, die mit nicht ignorierten Tags im Hauptteil der Datei ausgef\xFChrt werden soll, nachdem sie in den Frontmatter verschoben wurden"},"tags-to-ignore":{name:"ignorierte Tags",description:"Die Tags, die nicht in das Tags-Array verschoben oder aus dem Textinhalt entfernt werden, wenn `Entfernen Sie den Hashtag aus Tags im Inhaltstext` aktiviert ist. Jedes Tag sollte in einer neuen Zeile und ohne das `#`` stehen. **Stellen Sie sicher, dass Sie den Hashtag nicht in den Tag-Namen aufnehmen.**"}},"no-bare-urls":{name:"Keine blo\xDFen URLs",description:"Umschlie\xDFt blo\xDFe URLs mit spitzen Klammern, es sei denn, sie sind in Back-Ticks, eckige Klammern oder einfache oder doppelte Anf\xFChrungszeichen eingeschlossen."},"ordered-list-style":{name:"Geordneter Listenstil",description:"Stellt sicher, dass geordnete Listen dem angegebenen Stil entsprechen. Beachten Sie, dass 2 Leerzeichen oder 1 Tabulator als Einr\xFCckungsebene betrachtet werden.","number-style":{name:"Zahlen-Stil",description:"Der Zahlenstil, der in geordneten Listenindikatoren verwendet wird"},"list-end-style":{name:"Endestil des Indikators f\xFCr eine geordnete Liste",description:"Das Endezeichen eines geordneten Listenkennzeichens"}},"paragraph-blank-lines":{name:"Leere Absatzzeilen",description:"Alle Abs\xE4tze sollten sowohl davor als auch danach genau eine Leerzeile haben."},"prevent-double-checklist-indicator-on-paste":{name:"Verhindern Sie eine doppelte Checklistenanzeige beim Einf\xFCgen",description:"Entfernt die Start-Checklisten-Anzeige aus dem Text, um sie einzuf\xFCgen, wenn die Zeile, auf der sich der Cursor in der Datei befindet, \xFCber eine Checklistenanzeige verf\xFCgt"},"prevent-double-list-item-indicator-on-paste":{name:"Verhindern Sie die Anzeige f\xFCr doppelte Listenelemente beim Einf\xFCgen",description:"Entfernt den Startlistenindikator aus dem Text, der eingef\xFCgt werden soll, wenn die Zeile, auf der sich der Cursor in der Datei befindet, einen Listenindikator hat"},"proper-ellipsis-on-paste":{name:"Richtige Auslassungspunkte auf Paste",description:"Ersetzt drei aufeinanderfolgende Punkte durch Auslassungspunkte, auch wenn sie im Text ein Leerzeichen zum Einf\xFCgen haben"},"proper-ellipsis":{name:"Richtige Auslassungspunkte",description:"Ersetzt drei aufeinanderfolgende Punkte durch Auslassungspunkte."},"quote-style":{name:"Zitatstil",description:"Aktualisiert die Anf\xFChrungszeichen im Textk\xF6rperinhalt, sodass sie auf die angegebenen einfachen und doppelten Anf\xFChrungszeichenstile aktualisiert werden.","single-quote-enabled":{name:"Aktivieren Sie `Stil f\xFCr einfache Anf\xFChrungszeichen`",description:"Gibt an, dass der ausgew\xE4hlte einfache Anf\xFChrungszeichenstil verwendet werden soll."},"single-quote-style":{name:"Stil f\xFCr einfache Anf\xFChrungszeichen",description:"Der Stil der zu verwendenden einfachen Anf\xFChrungszeichen."},"double-quote-enabled":{name:"Aktivieren Sie `Stil f\xFCr doppelte Anf\xFChrungszeichen`",description:"Gibt an, dass der ausgew\xE4hlte doppelte Anf\xFChrungszeichenstil verwendet werden soll."},"double-quote-style":{name:"Stil f\xFCr doppelte Anf\xFChrungszeichen",description:"Der zu verwendende Stil der doppelten Anf\xFChrungszeichen."}},"re-index-footnotes":{name:"Fu\xDFnoten neu indizieren",description:"Indiziert Fu\xDFnotenschl\xFCssel und Fu\xDFnoten basierend auf der Reihenfolge des Auftretens neu (HINWEIS: Diese Regel funktioniert *nicht*, wenn es mehr als eine Fu\xDFnote f\xFCr einen Schl\xFCssel gibt.)"},"remove-consecutive-list-markers":{name:"Entfernen Sie aufeinanderfolgende Listenmarkierungen",description:"Entfernt aufeinanderfolgende Listenmarkierungen. N\xFCtzlich beim Kopieren und Einf\xFCgen von Listenelementen."},"remove-empty-lines-between-list-markers-and-checklists":{name:"Entfernen Sie leere Zeilen zwischen Listenmarkierungen und Checklisten",description:"Es sollten keine leeren Zeilen zwischen Listenmarkierungen und Checklisten stehen."},"remove-empty-list-markers":{name:"Entfernen Sie leere Listenmarkierungen",description:"Entfernt leere Listenmarkierungen, d.h. Listenelemente ohne Inhalt."},"remove-hyphenated-line-breaks":{name:"Entfernen Sie Zeilenumbr\xFCche mit Bindestrich",description:"Entfernt Zeilenumbr\xFCche mit Bindestrich. N\xFCtzlich beim Einf\xFCgen von Text aus Lehrb\xFCchern."},"remove-hyphens-on-paste":{name:"Entfernen Sie Bindestriche auf Paste",description:"Entfernt Bindestriche aus dem Text zum Einf\xFCgen"},"remove-leading-or-trailing-whitespace-on-paste":{name:"Entfernen Sie f\xFChrende oder nachgestellte Leerzeichen beim Einf\xFCgen",description:"Entfernt alle f\xFChrenden Leerzeichen ohne Tabulatoren und alle nachgestellten Leerzeichen, die der Text einf\xFCgen kann"},"remove-leftover-footnotes-from-quote-on-paste":{name:"Entfernen Sie \xFCbrig gebliebene Fu\xDFnoten aus dem Zitat beim Einf\xFCgen",description:"Entfernt alle \xFCbrig gebliebenen Fu\xDFnotenverweise, die der Text einf\xFCgen kann"},"remove-link-spacing":{name:"Linkabstand entfernen",description:"Entfernt den Abstand um den Linktext."},"remove-multiple-blank-lines-on-paste":{name:"Entfernen Sie mehrfache Leerzeilen beim Einf\xFCgen",description:"Verdichtet mehrere Leerzeilen zu einer Leerzeile, damit der Text eingef\xFCgt werden kann"},"remove-multiple-spaces":{name:"Entfernen Sie mehrfache Leerzeichen",description:"Entfernt zwei oder mehr aufeinanderfolgende Leerzeichen. Ignoriert Leerzeichen am Anfang und am Ende der Zeile."},"remove-space-around-characters":{name:"Entfernen Sie den Abstand um die Zeichen",description:"Stellt sicher, dass bestimmte Zeichen nicht von Leerzeichen umgeben sind (entweder einzelne Leerzeichen oder ein Tabulator). Beachten Sie, dass dies in einigen F\xE4llen zu Problemen mit dem Markdown-Format f\xFChren kann.","include-fullwidth-forms":{name:"Einf\xFCgen von Formularen in voller Breite",description:'Einschlie\xDFen Unicode-Block "Formulare" in voller Breite'},"include-cjk-symbols-and-punctuation":{name:"CJK-Symbole und Satzzeichen einschlie\xDFen",description:'Einschlie\xDFen CJK-Symbole und Satzzeichen Unicode-Block'},"include-dashes":{name:"Bindestriche einschlie\xDFen",description:"F\xFCgen Sie den Gedankenstrich (\u2013) und den Gedankenstrich (\u2014) ein"},"other-symbols":{name:"Andere Symbole",description:"Andere Symbole, die enthalten sind"}},"remove-space-before-or-after-characters":{name:"Entfernen Sie Leerzeichen vor oder nach Zeichen",description:"Entfernt Leerzeichen vor und nach den angegebenen Zeichen. Beachten Sie, dass dies in einigen F\xE4llen zu Problemen mit dem Markdown-Format f\xFChren kann.","characters-to-remove-space-before":{name:"Leerzeichen vor Zeichen entfernen",description:"Entfernt Leerzeichen vor den angegebenen Zeichen. **Hinweis: Die Verwendung von `{` oder `}` in der Zeichenliste wirkt sich unerwartet auf Dateien aus, da es in der Ignoriersyntax hinter den Kulissen verwendet wird.**"},"characters-to-remove-space-after":{name:"Leerzeichen nach Zeichen entfernen",description:"Entfernt Leerzeichen vor den angegebenen Zeichen. **Hinweis: Die Verwendung von `{` oder `}` in der Zeichenliste wirkt sich unerwartet auf Dateien aus, da es in der Ignoriersyntax hinter den Kulissen verwendet wird.**"}},"remove-trailing-punctuation-in-heading":{name:"Entfernen Sie nachgestellte Satzzeichen in der \xDCberschrift",description:"Entfernt die angegebene Interpunktion am Ende von \xDCberschriften, wobei darauf zu achten ist, dass das Semikolon am Ende von [HTML-Entit\xE4tsreferenzen](https://de.wikipedia.org/wiki/Typografische_Zeichen_in_XML_und_HTML) ignoriert wird.","punctuation-to-remove":{name:"Nachfolgende Interpunktion",description:"Das nachfolgende Satzzeichen, das aus den \xDCberschriften in der Datei entfernt werden soll."}},"remove-yaml-keys":{name:"Entfernen von YAML-Schl\xFCsseln",description:"Entfernt die angegebenen YAML-Schl\xFCssel","yaml-keys-to-remove":{name:"Zu entfernende YAML-Schl\xFCssel",description:"Die zu entfernenden YAML-Schl\xFCssel aus dem YAML-Frontmatter mit oder ohne Doppelpunkt"}},"space-after-list-markers":{name:"Leerzeichen nach Listenmarkierungen",description:"Es sollte ein einzelnes Leerzeichen nach Listenmarkierungen und Kontrollk\xE4stchen geben."},"space-between-chinese-japanese-or-korean-and-english-or-numbers":{name:"Leerzeichen zwischen Chinesisch, Japanisch oder Koreanisch und Englisch oder Zahlen",description:"Stellt sicher, dass Chinesisch, Japanisch oder Koreanisch und Englisch oder Zahlen durch ein einziges Leerzeichen getrennt werden. Folgt diesen [Richtlinien](https://github.com/sparanoid/chinese-copywriting-guidelines)"},"strong-style":{name:"Starker Stil",description:"Stellt sicher, dass der starke Stil konsistent ist.",style:{name:"Stil",description:"Der Stil, der verwendet wird, um starke/fettgedruckte Inhalte zu kennzeichnen"}},"trailing-spaces":{name:"Nachgestellte Leerzeichen",description:"Entfernt zus\xE4tzliche Leerzeichen nach jeder Zeile.","twp-space-line-break":{name:"Zwei Leerzeichen Zeilenumbruch",description:'Ignorieren Sie zwei Leerzeichen, gefolgt von einem Zeilenumbruch ("Zwei-Leerzeichen-Regel").'}},"two-spaces-between-lines-with-content":{name:"Zwei Leerzeichen zwischen Zeilen mit Inhalt",description:"Stellt sicher, dass zwei Leerzeichen an den Zeilenenden hinzugef\xFCgt werden, wobei der Inhalt in der n\xE4chsten Zeile f\xFCr Abs\xE4tze, Blockzitate und Listenelemente fortgesetzt wird"},"unordered-list-style":{name:"Ungeordneter Listenstil",description:"Stellt sicher, dass ungeordnete Listen dem angegebenen Stil folgen.","list-style":{name:"Stil des Listenelements",description:"Das Listenelementformat, das in ungeordneten Listen verwendet werden soll"}},"yaml-key-sort":{name:"Sortierung von YAML-Schl\xFCsseln",description:"Sortiert die YAML-Schl\xFCssel basierend auf der angegebenen Reihenfolge und Priorit\xE4t. Hinweis: Kann auch Leerzeilen entfernen.","yaml-key-priority-sort-order":{name:"Priorit\xE4tssortierreihenfolge der YAML-Schl\xFCssel",description:"Die Reihenfolge, in der die Schl\xFCssel sortiert werden sollen, wobei in jeder Zeile ein Schl\xFCssel in der Reihenfolge der Liste sortiert wird"},"priority-keys-at-start-of-yaml":{name:"Priorit\xE4tsschl\xFCssel am Anfang von YAML",description:"Die priorisierte Sortierreihenfolge der YAML-Schl\xFCssel wird am Anfang des YAML-Frontmatters platziert"},"yaml-sort-order-for-other-keys":{name:"YAML-Sortierreihenfolge f\xFCr andere Schl\xFCssel",description:"Die Art und Weise, wie die Schl\xFCssel sortiert werden, die nicht im Textbereich der priorisierten Sortierreihenfolge von YAML-Keys vorhanden sind"}},"yaml-timestamp":{name:"YAML-Zeitstempel",description:"Verfolgen Sie das Datum, an dem die Datei zuletzt bearbeitet wurde, im YAML-Frontmatter. Ruft Datumsangaben aus Dateimetadaten ab.","date-created":{name:"Erstellungsdatum",description:"Geben Sie das Datum ein, an dem die Datei erstellt wurde"},"date-created-key":{name:"Schl\xFCssel f\xFCr das Erstellungsdatum",description:"Der YAML-Schl\xFCssel, der f\xFCr das Erstellungsdatum verwendet werden soll"},"force-retention-of-create-value":{name:"Erzwinge die Beibehaltung des Schl\xFCsselwertes f\xFCr das Erstellungsdatum",description:"Verwendet den Wert im YAML-Frontmatter f\xFCr das Erstellungsdatum anstelle den Dateimetadaten, was n\xFCtzlich ist, um zu verhindern, dass \xC4nderungen an Dateimetadaten dazu f\xFChren, dass der Wert in einen anderen Wert ge\xE4ndert wird."},"date-modified":{name:"\xC4nderungsdatum",description:"Geben Sie das Datum ein, an dem die Datei zuletzt ge\xE4ndert wurde"},"date-modified-key":{name:"Schl\xFCssel f\xFCr das \xC4nderungsdatum",description:"Der YAML-Schl\xFCssel, der f\xFCr das \xC4nderungsdatum verwendet werden soll"},format:{name:"Format",description:"Zu verwendendes Datumsformat f\xFCr Moment.js (siehe [Momentformatoptionen](https://momentjscom.readthedocs.io/en/latest/moment/04-displaying/01-format/))"}},"yaml-title-alias":{name:"YAML-Titel-Alias",description:"F\xFCgt den Titel der Datei in den Aliasabschnitt des YAML-Frontmatters ein. Ruft den Titel aus dem ersten H1- oder Dateinamen ab.","preserve-existing-alias-section-style":{name:"Vorhandenes Alias-Abschnittsformat beibehalten",description:"Wenn diese Option festgelegt ist, gilt die Einstellung `YAML-Aliase-Abschnittsstil` nur f\xFCr die neu erstellten Abschnitte"},"keep-alias-that-matches-the-filename":{name:"Behalten Sie einen Alias bei, der mit dem Dateinamen \xFCbereinstimmt",description:"Solche Aliase sind in der Regel redundant"},"use-yaml-key-to-keep-track-of-old-filename-or-heading":{name:"Verwenden Sie den YAML-Schl\xFCssel `linter-yaml-title-alias`, um bei \xC4nderungen von Dateinamen und \xDCberschriften zu helfen",description:"Wenn sich die erste H1-\xDCberschrift \xE4ndert oder der Dateiname ge\xE4ndert wird, wenn der erste H1 nicht vorhanden ist, wird der alte Alias, der in diesem Schl\xFCssel gespeichert ist, durch den neuen Wert ersetzt, anstatt nur einen neuen Eintrag in das Alias-Array einzuf\xFCgen"}},"yaml-title":{name:"YAML-Titel",description:"F\xFCgt den Titel der Datei in das YAML-Frontmatter ein. Ruft den Titel basierend auf dem ausgew\xE4hlten Modus ab.","title-key":{name:"Titel-Schl\xFCssel",description:"Der YAML-Schl\xFCssel, der f\xFCr den Titel verwendet werden soll"},mode:{name:"Modus",description:"Die zum Abrufen des Titels zu verwendende Methode"}}},enums:{"Title Case":"Titel Gro\xDF- und Kleinschreibung","ALL CAPS":"GROSSBUCHSTABEN","First letter":"Anfangsbuchstabe",".":".",")":")",ERROR:"Fehler",TRACE:"Spur",DEBUG:"Debuggen",INFO:"Info",WARN:"Warnen",SILENT:"Leise",ascending:"aufsteigend",lazy:"lazy",Nothing:"Faul","Remove hashtag":"Hashtag entfernen","Remove whole tag":"Ganzes Tag entfernen",asterisk:"Sternchen",underscore:"unterstreichen",consistent:"folgerichtig","-":"-","*":"*","+":"+",space:"Raum","no space":"kein Platz",None:"Nichts","Ascending Alphabetical":"Aufsteigend Alphabetisch","Descending Alphabetical":"Absteigend Alphabetisch","multi-line":"mehrzeilig","single-line":"einzeilig","single string to single-line":"Single String zu Single-Line","single string to multi-line":"Single String zu Multi-Line","single string comma delimited":"Komma mit Trennzeichen f\xFCr eine Zeichenfolge","single string space delimited":"Einzelzeichenfolgenabstand durch Trennzeichen","single-line space delimited":"einzeiliger Abstand durch Trennzeichen","first-h1":"erste \xDCberschrift der Ebene 1","first-h1-or-filename-if-h1-missing":"Erste \xDCberschrift der Ebene 1 oder Dateiname, wenn die \xDCberschrift der Ebene 1 fehlt",filename:"Dateinamen","''":"''","\u2018\u2019":"\u2018\u2019",'""':'""',"\u201C\u201D":"\u201C\u201D"}};var Wo={commands:{"lint-file":{name:"Lint the current file","error-message":"Lint File Error in File"},"lint-file-unless-ignored":{name:"Lint the current file unless ignored"},"lint-all-files":{name:"Lint all files in the vault","error-message":"Lint All Files Error in File","success-message":"Linted all files","errors-message-singular":"Linted all files and there was 1 error.","errors-message-plural":"Linted all files and there were {NUM} errors.","start-message":"This will edit all of your files and may introduce errors.","submit-button-text":"Lint All","submit-button-notice-text":"Linting all files..."},"lint-all-files-in-folder":{name:"Lint all files in the current folder","start-message":"This will edit all of your files in {FOLDER_NAME} including files in its subfolders which may introduce errors.","submit-button-text":"Lint All Files in {FOLDER_NAME}","submit-button-notice-text":"Linting all files in {FOLDER_NAME}...","error-message":"Lint All Files in Folder Error in File","success-message":"Linted all {NUM} files in {FOLDER_NAME}.","message-singular":"Linted all {NUM} files in {FOLDER_NAME} and there was 1 error.","message-plural":"Linted all {FILE_COUNT} files in {FOLDER_NAME} and there were {ERROR_COUNT} error."},"paste-as-plain-text":{name:"Paste as Plain Text & without Modifications"},"lint-file-pop-up-menu-text":{name:"Lint file"},"lint-folder-pop-up-menu-text":{name:"Lint folder"}},logs:{"plugin-load":"Loading plugin","plugin-unload":"Unloading plugin","folder-lint":"Linting folder ","linter-run":"Running linter","paste-link-warning":"aborted paste lint as the clipboard content is a link and doing so will avoid conflicts with other plugins that modify pasting.","see-console":"See console for more details.","unknown-error":"An unknown error occurred during linting.","moment-locale-not-found":"Trying to switch Moment.js locale to {MOMENT_LOCALE}, got {CURRENT_LOCALE}","file-change-lint-message-start":"Linted","custom-command-callback-warning":"Please only set the custom command callback for integration tests.","pre-rules":"rules before regular rules","post-rules":"rules after regular rules","rule-running":"rules running","custom-regex":"custom regex rules","running-custom-regex":"Running Custom Regex","running-custom-lint-command":"Running Custom Lint Commands","custom-lint-duplicate-warning":'You cannot run the same command ("{COMMAND_NAME}") as a custom lint rule twice.',"custom-lint-error-message":"Custom Lint Command","disabled-text":"is disabled","run-rule-text":"Running","timing-key-not-found":"timing key '{TIMING_KEY}' does not exist in the timing info list, so it was ignored","milliseconds-abbreviation":"ms","invalid-date-format-error":"The format of the created date '{DATE}' could not be parsed or determined so the created date was left alone in '{FILE_NAME}'","invalid-delimiter-error-message":"delimiter is only allowed to be a single character","missing-footnote-error-message":"Footnote '{FOOTNOTE}' has no corresponding footnote reference before the footnote contents and cannot be processed. Please make sure that all footnotes have a corresponding reference before the content of the footnote.","too-many-footnotes-error-message":"Footnote key '{FOOTNOTE_KEY}' has more than 1 footnote referencing it. Please update the footnotes so that there is only one footnote per footnote key.","wrapper-yaml-error":"error in the YAML: {ERROR_MESSAGE}","wrapper-unknown-error":"unknown error: {ERROR_MESSAGE}"},"notice-text":{"empty-clipboard":"There is no clipboard content.","characters-added":"characters added","characters-removed":"characters removed","copy-to-clipboard-failed":"Failed to copy text to clipboard: "},"all-rules-option":"All","linter-title":"Linter","empty-search-results-text":"No settings match search","warning-text":"Warning","file-backup-text":"Make sure you have backed up your files.","custom-command-warning":"Linting multiple files with custom commands enabled is a slow process that requires the ability to open panes in the side panel. It is noticeably slower than running without custom commands enabled. Please proceed with caution.","copy-aria-label":"Copy",tabs:{names:{general:"General",custom:"Custom",yaml:"YAML",heading:"Heading",content:"Content",footnote:"Footnote",spacing:"Spacing",paste:"Paste",debug:"Debug"},"default-search-bar-text":"Search all settings",general:{"lint-on-save":{name:"Lint on save",description:"Lint the file on manual save (when `Ctrl + S` is pressed or when `:w` is executed while using vim keybindings)"},"display-message":{name:"Display message on lint",description:"Display the number of characters changed after linting"},"lint-on-file-change":{name:"Lint on File Change",description:"When the a file is closed or a new file is swapped to, the previous file is linted."},"display-lint-on-file-change-message":{name:"Display Lint on File Change Message",description:"Displays a message when `Lint on File Change` occurs"},"folders-to-ignore":{name:"Folders to ignore",description:"Folders to ignore when linting all files or linting on save.","folder-search-placeholder-text":"Folder name","add-input-button-text":"Add another folder to ignore","delete-tooltip":"Delete"},"override-locale":{name:"Override locale",description:"Set this if you want to use a locale different from the default"},"same-as-system-locale":"Same as system ({SYS_LOCALE})","yaml-aliases-section-style":{name:"YAML aliases section style",description:"The style of the YAML aliases section"},"yaml-tags-section-style":{name:"YAML tags section style",description:"The style of the YAML tags section"},"default-escape-character":{name:"Default Escape Character",description:"The default character to use to escape YAML values when a single quote and double quote are not present."},"remove-unnecessary-escape-chars-in-multi-line-arrays":{name:"Remove Unnecessary Escape Characters when in Multi-Line Array Format",description:"Escape characters for multi-line YAML arrays don't need the same escaping as single-line arrays, so when in multi-line format remove extra escapes that are not necessary"},"number-of-dollar-signs-to-indicate-math-block":{name:"Number of Dollar Signs to Indicate Math Block",description:"The amount of dollar signs to consider the math content to be a math block instead of inline math"}},debug:{"log-level":{name:"Log Level",description:"The types of logs that will be allowed to be logged by the service. The default is ERROR."},"linter-config":{name:"Linter Config",description:"The contents of the data.json for the Linter as of the setting page loading"},"log-collection":{name:"Collect logs when linting on save and linting the current file",description:"Goes ahead and collects logs when you `Lint on save` and linting the current file. These logs can be helpful for debugging and create bug reports."},"linter-logs":{name:"Linter Logs",description:"The logs from the last `Lint on save` or the last lint current file run if enabled."}}},options:{"custom-command":{name:"Custom Commands",description:"Custom commands are Obsidian commands that get run after the linter is finished running its regular rules. This means that they do not run before the YAML timestamp logic runs, so they can cause YAML timestamp to be triggered on the next run of the linter. You may only select an Obsidian command once. **_Note that this currently only works on linting the current file._**",warning:"When selecting an option, make sure to select the option either by using the mouse or by hitting the enter key. Other selection methods may not work and only selections of an actual Obsidian command or an empty string will be saved.","add-input-button-text":"Add new command","command-search-placeholder-text":"Obsidian command","move-up-tooltip":"Move up","move-down-tooltip":"Move down","delete-tooltip":"Delete"},"custom-replace":{name:"Custom Regex Replacement",description:"Custom regex replacement can be used to replace anything that matches the find regex with the replacement value. The replace and find values will need to be valid regex values.",warning:"Use this with caution if you do not know regex. Also, please make sure that you do not use lookbehinds in your regex on iOS mobile as that will cause linting to fail since that is not supported on that platform.","add-input-button-text":"Add new regex replacement","regex-to-find-placeholder-text":"regex to find","flags-placeholder-text":"flags","regex-to-replace-placeholder-text":"regex to replace","label-placeholder-text":"label","move-up-tooltip":"Move up","move-down-tooltip":"Move down","delete-tooltip":"Delete"}},rules:{"auto-correct-common-misspellings":{name:"Auto-correct Common Misspellings",description:"Uses a dictionary of common misspellings to automatically convert them to their proper spellings. See [auto-correct map](https://github.com/platers/obsidian-linter/tree/master/src/utils/auto-correct-misspellings.ts) for the full list of auto-corrected words.","ignore-words":{name:"Ignore Words",description:"A comma separated list of lowercased words to ignore when auto-correcting"}},"add-blank-line-after-yaml":{name:"Add Blank Line After YAML",description:"Adds a blank line after the YAML block if it does not end the current file or it is not already followed by at least 1 blank line"},"add-blockquote-indentation-on-paste":{name:"Add Blockquote Indentation on Paste",description:"Adds blockquotes to all but the first line, when the cursor is in a blockquote/callout line during pasting"},"blockquote-style":{name:"Blockquote Style",description:"Makes sure the blockquote style is consistent.",style:{name:"Style",description:"The style used on blockquote indicators"}},"capitalize-headings":{name:"Capitalize Headings",description:"Headings should be formatted with capitalization",style:{name:"Style",description:"The style of capitalization to use"},"ignore-case-words":{name:"Ignore Cased Words",description:"Only apply title case style to words that are all lowercase"},"ignore-words":{name:"Ignore Words",description:"A comma separated list of words to ignore when capitalizing"},"lowercase-words":{name:"Lowercase Words",description:"A comma separated list of words to keep lowercase"}},"compact-yaml":{name:"Compact YAML",description:"Removes leading and trailing blank lines in the YAML front matter.","inner-new-lines":{name:"Inner New Lines",description:"Remove new lines that are not at the start or the end of the YAML"}},"consecutive-blank-lines":{name:"Consecutive blank lines",description:"There should be at most one consecutive blank line."},"convert-bullet-list-markers":{name:"Convert Bullet List Markers",description:"Converts common bullet list marker symbols to markdown list markers."},"convert-spaces-to-tabs":{name:"Convert Spaces to Tabs",description:"Converts leading spaces to tabs.",tabsize:{name:"Tabsize",description:"Number of spaces that will be converted to a tab"}},"default-language-for-code-fences":{name:"Default Language For Code Fences",description:"Add a default language to code fences that do not have a language specified.","default-language":{name:"Programming Language",description:"Leave empty to do nothing. Languages tags can be found [here](https://prismjs.com/#supported-languages)."}},"emphasis-style":{name:"Emphasis Style",description:"Makes sure the emphasis style is consistent.",style:{name:"Style",description:"The style used to denote emphasized content"}},"empty-line-around-blockquotes":{name:"Empty Line Around Blockquotes",description:"Ensures that there is an empty line around blockquotes unless they start or end a document. **Note: an empty line is either one less level of nesting for blockquotes or a newline character.**"},"empty-line-around-code-fences":{name:"Empty Line Around Code Fences",description:"Ensures that there is an empty line around code fences unless they start or end a document."},"empty-line-around-math-blocks":{name:"Empty Line Around Math Blocks",description:"Ensures that there is an empty line around math blocks using `Number of Dollar Signs to Indicate a Math Block` to determine how many dollar signs indicates a math block for single-line math."},"empty-line-around-tables":{name:"Empty Line Around Tables",description:"Ensures that there is an empty line around github flavored tables unless they start or end a document."},"escape-yaml-special-characters":{name:"Escape YAML Special Characters",description:`Escapes colons with a space after them (: ), single quotes ('), and double quotes (") in YAML.`,"try-to-escape-single-line-arrays":{name:"Try to Escape Single Line Arrays",description:'Tries to escape array values assuming that an array starts with "[", ends with "]", and has items that are delimited by ",".'}},"file-name-heading":{name:"File Name Heading",description:"Inserts the file name as a H1 heading if no H1 heading exists."},"footnote-after-punctuation":{name:"Footnote after Punctuation",description:"Ensures that footnote references are placed after punctuation, not before."},"force-yaml-escape":{name:"Force YAML Escape",description:"Escapes the values for the specified YAML keys.","force-yaml-escape-keys":{name:"Force YAML Escape on Keys",description:"Uses the YAML escape character on the specified YAML keys separated by a new line character if it is not already escaped. Do not use on YAML arrays."}},"format-tags-in-yaml":{name:"Format Tags in YAML",description:"Remove Hashtags from tags in the YAML frontmatter, as they make the tags there invalid."},"format-yaml-array":{name:"Format YAML Array",description:"Allows for the formatting of regular YAML arrays as either multi-line or single-line and `tags` and `aliases` are allowed to have some Obsidian specific YAML formats. **Note: that single string to single-line goes from a single string entry to a single-line array if more than 1 entry is present. The same is true for single string to multi-line except it becomes a multi-line array.**","alias-key":{name:"Format YAML aliases section",description:"Turns on formatting for the YAML aliases section. You should not enable this option alongside the rule `YAML Title Alias` as they may not work well together or they may have different format styles selected causing unexpected results."},"tag-key":{name:"Format YAML tags section",description:"Turns on formatting for the YAML tags section."},"default-array-style":{name:"Default YAML array section style",description:"The style of other YAML arrays that are not `tags`, `aliases` or in `Force key values to be single-line arrays` and `Force key values to be multi-line arrays`"},"default-array-keys":{name:"Format YAML array sections",description:"Turns on formatting for regular YAML arrays"},"force-single-line-array-style":{name:"Force key values to be single-line arrays",description:"Forces the YAML array for the new line separated keys to be in single-line format (leave empty to disable this option)"},"force-multi-line-array-style":{name:"Force key values to be multi-line arrays",description:"Forces the YAML array for the new line separated keys to be in multi-line format (leave empty to disable this option)"}},"header-increment":{name:"Header Increment",description:"Heading levels should only increment by one level at a time","start-at-h2":{name:"Start Header Increment at Heading Level 2",description:"Makes heading level 2 the minimum heading level in a file for header increment and shifts all headings accordingly so they increment starting with a level 2 heading."}},"heading-blank-lines":{name:"Heading blank lines",description:"All headings have a blank line both before and after (except where the heading is at the beginning or end of the document).",bottom:{name:"Bottom",description:"Insert a blank line after headings"},"empty-line-after-yaml":{name:"Empty Line Between YAML and Header",description:"Keep the empty line between the YAML frontmatter and header"}},"headings-start-line":{name:"Headings Start Line",description:"Headings that do not start a line will have their preceding whitespace removed to make sure they get recognized as headers."},"insert-yaml-attributes":{name:"Insert YAML attributes",description:"Inserts the given YAML attributes into the YAML frontmatter. Put each attribute on a single line.","text-to-insert":{name:"Text to insert",description:"Text to insert into the YAML frontmatter"}},"line-break-at-document-end":{name:"Line Break at Document End",description:"Ensures that there is exactly one line break at the end of a document."},"move-footnotes-to-the-bottom":{name:"Move Footnotes to the bottom",description:"Move all footnotes to the bottom of the document and makes sure they are sorted based on the order they are referenced in the file's body."},"move-math-block-indicators-to-their-own-line":{name:"Move Math Block Indicators to Their Own Line",description:"Move all starting and ending math block indicators to their own lines using `Number of Dollar Signs to Indicate a Math Block` to determine how many dollar signs indicates a math block for single-line math."},"move-tags-to-yaml":{name:"Move Tags to YAML",description:"Move all tags to YAML frontmatter of the document.","how-to-handle-existing-tags":{name:"Body tag operation",description:"What to do with non-ignored tags in the body of the file once they have been moved to the frontmatter"},"tags-to-ignore":{name:"Tags to ignore",description:"The tags that will not be moved to the tags array or removed from the body content if `Remove the hashtag from tags in content body` is enabled. Each tag should be on a new line and without the `#`. **Make sure not to include the hashtag in the tag name.**"}},"no-bare-urls":{name:"No Bare URLs",description:"Encloses bare URLs with angle brackets except when enclosed in back ticks, square braces, or single or double quotes.","no-bare-uris":{name:"No Bare URIs",description:"Attempts to enclose bare URIs with angle brackets except when enclosed in back ticks, square braces, or single or double quotes."}},"ordered-list-style":{name:"Ordered List Style",description:"Makes sure that ordered lists follow the style specified. **Note: that 2 spaces or 1 tab is considered to be an indentation level.**","number-style":{name:"Number Style",description:"The number style used in ordered list indicators"},"list-end-style":{name:"Ordered List Indicator End Style",description:"The ending character of an ordered list indicator"}},"paragraph-blank-lines":{name:"Paragraph blank lines",description:"All paragraphs should have exactly one blank line both before and after."},"prevent-double-checklist-indicator-on-paste":{name:"Prevent Double Checklist Indicator on Paste",description:"Removes starting checklist indicator from the text to paste if the line the cursor is on in the file has a checklist indicator"},"prevent-double-list-item-indicator-on-paste":{name:"Prevent Double List Item Indicator on Paste",description:"Removes starting list indicator from the text to paste if the line the cursor is on in the file has a list indicator"},"proper-ellipsis-on-paste":{name:"Proper Ellipsis on Paste",description:"Replaces three consecutive dots with an ellipsis even if they have a space between them in the text to paste"},"proper-ellipsis":{name:"Proper Ellipsis",description:"Replaces three consecutive dots with an ellipsis."},"quote-style":{name:"Quote Style",description:"Updates the quotes in the body content to be updated to the specified single and double quote styles.","single-quote-enabled":{name:"Enable `Single Quote Style`",description:"Specifies that the selected single quote style should be used."},"single-quote-style":{name:"Single Quote Style",description:"The style of single quotes to use."},"double-quote-enabled":{name:"Enable `Double Quote Style`",description:"Specifies that the selected double quote style should be used."},"double-quote-style":{name:"Double Quote Style",description:"The style of double quotes to use."}},"re-index-footnotes":{name:"Re-Index Footnotes",description:"Re-indexes footnote keys and footnote, based on the order of occurrence. **Note: This rule does _not_ work if there is more than one footnote for a key.**"},"remove-consecutive-list-markers":{name:"Remove Consecutive List Markers",description:"Removes consecutive list markers. Useful when copy-pasting list items."},"remove-empty-lines-between-list-markers-and-checklists":{name:"Remove Empty Lines Between List Markers and Checklists",description:"There should not be any empty lines between list markers and checklists."},"remove-empty-list-markers":{name:"Remove Empty List Markers",description:"Removes empty list markers, i.e. list items without content."},"remove-hyphenated-line-breaks":{name:"Remove Hyphenated Line Breaks",description:"Removes hyphenated line breaks. Useful when pasting text from textbooks."},"remove-hyphens-on-paste":{name:"Remove Hyphens on Paste",description:"Removes hyphens from the text to paste"},"remove-leading-or-trailing-whitespace-on-paste":{name:"Remove Leading or Trailing Whitespace on Paste",description:"Removes any leading non-tab whitespace and all trailing whitespace for the text to paste"},"remove-leftover-footnotes-from-quote-on-paste":{name:"Remove Leftover Footnotes from Quote on Paste",description:"Removes any leftover footnote references for the text to paste"},"remove-link-spacing":{name:"Remove link spacing",description:"Removes spacing around link text."},"remove-multiple-blank-lines-on-paste":{name:"Remove Multiple Blank Lines on Paste",description:"Condenses multiple blank lines down into one blank line for the text to paste"},"remove-multiple-spaces":{name:"Remove Multiple Spaces",description:"Removes two or more consecutive spaces. Ignores spaces at the beginning and ending of the line. "},"remove-space-around-characters":{name:"Remove Space around Characters",description:"Ensures that certain characters are not surrounded by whitespace (either single spaces or a tab). **Note: this may causes issues with markdown format in some cases.**","include-fullwidth-forms":{name:"Include Fullwidth Forms",description:'Include Fullwidth Forms Unicode block'},"include-cjk-symbols-and-punctuation":{name:"Include CJK Symbols and Punctuation",description:'Include CJK Symbols and Punctuation Unicode block'},"include-dashes":{name:"Include Dashes",description:"Include en dash (\u2013) and em dash (\u2014)"},"other-symbols":{name:"Other symbols",description:"Other symbols to include"}},"remove-space-before-or-after-characters":{name:"Remove Space Before or After Characters",description:"Removes space before the specified characters and after the specified characters. **Note: this may causes issues with markdown format in some cases.**","characters-to-remove-space-before":{name:"Remove Space Before Characters",description:"Removes space before the specified characters. **Note: using `{` or `}` in the list of characters will unexpectedly affect files as it is used in the ignore syntax behind the scenes.**"},"characters-to-remove-space-after":{name:"Remove Space After Characters",description:"Removes space after the specified characters. **Note: using `{` or `}` in the list of characters will unexpectedly affect files as it is used in the ignore syntax behind the scenes.**"}},"remove-trailing-punctuation-in-heading":{name:"Remove Trailing Punctuation in Heading",description:"Removes the specified punctuation from the end of headings making sure to ignore the semicolon at the end of [HTML entity references](https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references).","punctuation-to-remove":{name:"Trailing Punctuation",description:"The trailing punctuation to remove from the headings in the file."}},"remove-yaml-keys":{name:"Remove YAML Keys",description:"Removes the YAML keys specified","yaml-keys-to-remove":{name:"YAML Keys to Remove",description:"The YAML keys to remove from the YAML frontmatter with or without colons"}},"space-after-list-markers":{name:"Space after list markers",description:"There should be a single space after list markers and checkboxes."},"space-between-chinese-japanese-or-korean-and-english-or-numbers":{name:"Space between Chinese Japanese or Korean and English or numbers",description:"Ensures that Chinese, Japanese, or Korean and English or numbers are separated by a single space. Follows these [guidelines](https://github.com/sparanoid/chinese-copywriting-guidelines)"},"strong-style":{name:"Strong Style",description:"Makes sure the strong style is consistent.",style:{name:"Style",description:"The style used to denote strong/bolded content"}},"trailing-spaces":{name:"Trailing spaces",description:"Removes extra spaces after every line.","twp-space-line-break":{name:"Two Space Linebreak",description:'Ignore two spaces followed by a line break ("Two Space Rule").'}},"two-spaces-between-lines-with-content":{name:"Two Spaces Between Lines with Content",description:"Makes sure that two spaces are added to the ends of lines with content continued on the next line for paragraphs, blockquotes, and list items"},"unordered-list-style":{name:"Unordered List Style",description:"Makes sure that unordered lists follow the style specified.","list-style":{name:"List item style",description:"The list item style to use in unordered lists"}},"yaml-key-sort":{name:"YAML Key Sort",description:"Sorts the YAML keys based on the order and priority specified. **Note: may remove blank lines as well. Only works on non-nested keys.**","yaml-key-priority-sort-order":{name:"YAML Key Priority Sort Order",description:"The order in which to sort keys with one on each line where it sorts in the order found in the list"},"priority-keys-at-start-of-yaml":{name:"Priority Keys at Start of YAML",description:"YAML Key Priority Sort Order is placed at the start of the YAML frontmatter"},"yaml-sort-order-for-other-keys":{name:"YAML Sort Order for Other Keys",description:"The way in which to sort the keys that are not found in the YAML Key Priority Sort Order text area"}},"yaml-timestamp":{name:"YAML Timestamp",description:"Keep track of the date the file was last edited in the YAML front matter. Gets dates from file metadata.","date-created":{name:"Date Created",description:"Insert the file creation date"},"date-created-key":{name:"Date Created Key",description:"Which YAML key to use for creation date"},"force-retention-of-create-value":{name:"Force Date Created Key Value Retention",description:"Reuses the value in the YAML frontmatter for date created instead of the file metadata which is useful for preventing file metadata changes from causing the value to change to a different value."},"date-modified":{name:"Date Modified",description:"Insert the date the file was last modified"},"date-modified-key":{name:"Date Modified Key",description:"Which YAML key to use for modification date"},format:{name:"Format",description:"Moment date format to use (see [Moment format options](https://momentjscom.readthedocs.io/en/latest/moment/04-displaying/01-format/))"}},"yaml-title-alias":{name:"YAML Title Alias",description:"Inserts the title of the file into the YAML frontmatter's aliases section. Gets the title from the first H1 or filename.","preserve-existing-alias-section-style":{name:"Preserve existing aliases section style",description:"If set, the `YAML aliases section style` setting applies only to the newly created sections"},"keep-alias-that-matches-the-filename":{name:"Keep alias that matches the filename",description:"Such aliases are usually redundant"},"use-yaml-key-to-keep-track-of-old-filename-or-heading":{name:"Use the YAML key `linter-yaml-title-alias` to help with filename and heading changes",description:"If set, when the first H1 heading changes or filename if first H1 is not present changes, then the old alias stored in this key will be replaced with the new value instead of just inserting a new entry in the aliases array"}},"yaml-title":{name:"YAML Title",description:"Inserts the title of the file into the YAML frontmatter. Gets the title based on the selected mode.","title-key":{name:"Title Key",description:"Which YAML key to use for title"},mode:{name:"Mode",description:"The method to use to get the title"}}},enums:{"Title Case":"Title Case","ALL CAPS":"ALL CAPS","First letter":"First letter",".":".",")":")",ERROR:"error",TRACE:"trace",DEBUG:"debug",INFO:"info",WARN:"warn",SILENT:"silent",ascending:"ascending",lazy:"lazy",Nothing:"Nothing","Remove hashtag":"Remove hashtag","Remove whole tag":"Remove whole tag",asterisk:"asterisk",underscore:"underscore",consistent:"consistent","-":"-","*":"*","+":"+",space:"space","no space":"no space",None:"None","Ascending Alphabetical":"Ascending Alphabetical","Descending Alphabetical":"Descending Alphabetical","multi-line":"multi-line","single-line":"single-line","single string to single-line":"single string to single-line","single string to multi-line":"single string to multi-line","single string comma delimited":"single string comma delimited","single string space delimited":"single string space delimited","single-line space delimited":"single-line space delimited","first-h1":"First H1","first-h1-or-filename-if-h1-missing":"First H1 or Filename if H1 is Missing",filename:"Filename","''":"''","\u2018\u2019":"\u2018\u2019",'""':'""',"\u201C\u201D":"\u201C\u201D"}};var Od={commands:{"lint-file":{name:"Analizar este archivo","error-message":"Error Analizando un Archivooccuri\xF3 en el Archivo"},"lint-file-unless-ignored":{name:"Analizar este archivo si no es ignorado"},"lint-all-files":{name:"Analizar todos los archivos en la b\xF3veda","error-message":"Error Analizando Todos los Archivos en Archivo","success-message":"Analiz\xF3 todos los archivos","errors-message-singular":"Analiz\xF3 todos los archivos y un error ocurri\xF3.","errors-message-plural":"Analiz\xF3 todos los archivos y {NUM} errores ocurrieron","start-message":"Esto editar\xE1 todos de sus archivos y es possible que introduzca errores","submit-button-text":"Analizar Todo","submit-button-notice-text":"Analizando todos los archivos..."},"lint-all-files-in-folder":{name:"Analizar todos los archivos en esta carpeta","start-message":"Esto editar\xE1 todos de sus archivos en {FOLDER_NAME} incluyendo los archivos que existen en las subcarpetas y es possible que introduzca errores.","submit-button-text":"Analizar Todos los Archivos en {FOLDER_NAME}","submit-button-notice-text":"Analizando todos los archivos en {FOLDER_NAME}...","error-message":"Error Analizando Todos los Archivos en Carpeta en Archivo","success-message":"Analiz\xF3 los {NUM} archivos en {FOLDER_NAME}.","message-singular":"Analiz\xF3 los {NUM} archivos en {FOLDER_NAME} y un error ocurri\xF3.","message-plural":"Analiz\xF3 los {FILE_COUNT} archivos en {FOLDER_NAME} y {ERROR_COUNT} errores ocurrieron."},"paste-as-plain-text":{name:"Pegar como texto sin formato y sin modificaciones"},"lint-file-pop-up-menu-text":{name:"Analizar el archivo"},"lint-folder-pop-up-menu-text":{name:"Analizar la carpeta"}},logs:{"plugin-load":"Cargando el programa adicional","plugin-unload":"Descargando el programa adicional","folder-lint":"Analizando la carpeta ","linter-run":"Usando linter","paste-link-warning":"abort\xF3 lint de pagar porque el contento del portapapeles es un enlace y no lo hizo para evitar conflictos con otros programas adicionales que modifican lo que hace el pegar.","see-console":"Consulte la consola para obtener m\xE1s detalles.","unknown-error":"Se ha producido un error desconocido durante el linting.","moment-locale-not-found":"Intentando cambiar la zona de Moment.js a {MOMENT_LOCALE}, el resulto fue {CURRENT_LOCALE}","file-change-lint-message-start":"Analiz\xF3","pre-rules":"Las reglas antes de las reglas normales","post-rules":"las reglas despu\xE9s de las reglas normales","rule-running":"usando las reglas","custom-regex":"las reglas regex personalizadas","running-custom-regex":"Usando regex personalizada","running-custom-lint-command":"Usando comandos de lint personalizados","custom-lint-duplicate-warning":'No se puede usar el mismo comando ("{COMMAND_NAME}") dos veces como un comando de lint.',"custom-lint-error-message":"El commando de lint personalizado","disabled-text":"es inhabilitado","run-rule-text":"Usando","timing-key-not-found":"clave de ritmo '{TIMING_KEY}' no ya existe en la lista de claves de ritmo y fue ignorado por eso","milliseconds-abbreviation":"ms","invalid-date-format-error":"No se pudo analizar ni identificar el formato de la fech de creaci\xF3n `{DATE}` entonces la fecha de creaci\xF3n se dej\xF3 sola en `{FILE_NAME}`","invalid-delimiter-error-message":"El delimitador solo puede ser de un solo car\xE1cter","missing-footnote-error-message":"La nota al pie `{FOOTNOTE}` no tiene ninguna referencia de nota al pie correspondiente antes del contenido de la nota al pie y no se puede procesar. Aseg\xFArese de que todas las notas a pie de p\xE1gina tengan una referencia correspondiente antes del contenido de la nota al pie de p\xE1gina.","too-many-footnotes-error-message":"La clave de nota al pie '{FOOTNOTE_KEY}' tiene m\xE1s de 1 nota al pie que hace referencia a ella. Actualice las notas al pie para que solo haya una nota al pie por clave de nota al pie.","wrapper-yaml-error":"hubo un error en el YAML: {ERROR_MESSAGE}","wrapper-unknown-error":"huno un error desconocido: {ERROR_MESSAGE}"},"notice-text":{"empty-clipboard":"No hay contenido del portapapeles.","characters-added":"Caracteres a\xF1adidos","characters-removed":"Caracteres eliminados"},"all-rules-option":"Todo","linter-title":"Linter","empty-search-results-text":"No hay configuraci\xF3n que coincida con la b\xFAsqueda","warning-text":"Advertencia","file-backup-text":"Aseg\xFArese de haber realizado una copia de seguridad de sus archivos.","copy-aria-label":"Copiar",tabs:{names:{general:"General",custom:"Personalizado",yaml:"YAML",heading:"Encabezado",content:"Contenido",footnote:"Notas al pie",spacing:"Espacio en blanco",paste:"Pegar",debug:"Depurar"},"default-search-bar-text":"Buscar en todos los ajustes",general:{"lint-on-save":{name:"Analizar en guardar",description:"Analizar el archivo en el guardado manual (cuando se presiona `Ctrl + S` o cuando se ejecuta `:w` mientras se usan combinaciones de claves de vim)"},"display-message":{name:"Mostrar mensaje en analizar",description:"Mostrar el n\xFAmero de caracteres modificados despu\xE9s de analizar"},"folders-to-ignore":{name:"Carpetas para omitir",description:"Carpetas que se deben omitir al analizar todos los archivos o al guardar en l\xEDnea.","folder-search-placeholder-text":"El nombre de la carpeta","add-input-button-text":"Agregar otra carpeta para ignorar","delete-tooltip":"Borrar"},"lint-on-file-change":{name:"Analizar archivo en cambiar",description:"Cuando se cierra un archivo o se cambia a un nuevo archivo, el archivo anterior se analiza."},"display-lint-on-file-change-message":{name:"Mostrar mensaje en cambiar el archivo",description:"Muestra un mensaje cuando se produce `Analizar archivo en cambiar`"},"override-locale":{name:"Anular configuraci\xF3n regional",description:"Establezca esta opci\xF3n si desea utilizar una configuraci\xF3n regional diferente de la predeterminada"},"same-as-system-locale":"Igual que el sistema ({SYS_LOCALE})","yaml-aliases-section-style":{name:"Estilo de secci\xF3n de alias de YAML",description:"El estilo de la secci\xF3n de alias de YAML"},"yaml-tags-section-style":{name:"Estilo de secci\xF3n de etiquetas de YAML",description:"El estilo de la secci\xF3n de etiquetas de YAML"},"default-escape-character":{name:"Car\xE1cter de escape predeterminado",description:"El car\xE1cter predeterminado que se va a usar para escapar de los valores YAML cuando no hay comillas simples y comillas dobles."},"remove-unnecessary-escape-chars-in-multi-line-arrays":{name:"Eliminaci\xF3n de caracteres de escape innecesarios cuando est\xE1 en formato de matriz multil\xEDnea",description:"Los caracteres de escape para matrices de YAML multil\xEDnea no necesitan el mismo escape que las matrices de una sola l\xEDnea, por lo que cuando est\xE1n en formato multil\xEDnea, elimine los escapes adicionales que no son necesarios"},"number-of-dollar-signs-to-indicate-math-block":{name:"N\xFAmero de signos de d\xF3lar para indicar el bloque matem\xE1tico",description:"La cantidad de signos de d\xF3lar para considerar el contenido matem\xE1tico como un bloque matem\xE1tico en lugar de matem\xE1ticas en l\xEDnea"}},debug:{"log-level":{name:"Nivel de registro",description:"Los tipos de registros que el servicio permitir\xE1 registrar. El valor predeterminado es error."},"linter-config":{name:"Configuraci\xF3n de Linter",description:"El contenido del archivo data.json para Linter a partir de la carga de la p\xE1gina de configuraci\xF3n"},"log-collection":{name:"Recopilar registros al activar y desactivar el archivo actual",description:"Contin\xFAa y recopila registros cuando `Analizar en guardar` y analizar el archivo actual. Estos registros pueden ser \xFAtiles para depurar y crear informes de errores."},"linter-logs":{name:"Registros de Linter",description:"Los registros del \xFAltimo `Analizar en guardar` o del \xFAltimo archivo actual de analizar se ejecutan si est\xE1n habilitados."}}},options:{"custom-command":{name:"Comandos personalizados",description:"Los comandos personalizados son comandos de Obsidian que se ejecutan despu\xE9s de que Linter termina de ejecutar sus reglas regulares. Esto significa que no se ejecutan antes de que se ejecute la l\xF3gica de marca de tiempo YAML, por lo que pueden hacer que la marca de tiempo de YAML se active en la siguiente ejecuci\xF3n del Linter. Solo puede seleccionar un comando de Obsidian una vez. **_Note que esto actualmente solo funciona para analizar el archivo actual._**",warning:"Al seleccionar una opci\xF3n, aseg\xFArese de seleccionar la opci\xF3n usando el rat\xF3n o presionando la clave Intro. Es posible que otros m\xE9todos de selecci\xF3n no funcionen y solo se guardar\xE1n las selecciones de un comando de Obsidian real o una cadena vac\xEDa.","add-input-button-text":"Agregar nuevo comando","command-search-placeholder-text":"Comando de Obsidian","move-up-tooltip":"Desplazar hacia arriba","move-down-tooltip":"Desplazar hacia abajo","delete-tooltip":"Borrar"},"custom-replace":{name:"Reemplazo regex personalizado",description:"El reemplazo de regex personalizado se puede usar para reemplazar cualquier cosa que coincida con el valor de b\xFAsqueda de regex con el valor de reemplazo. Los valores de reemplazo y b\xFAsqueda deber\xE1n ser valores regex v\xE1lidos.",warning:"Use esto con precauci\xF3n si no conoce regex. Adem\xE1s, aseg\xFArese de no usar lookbehinds en su regex en dispositivos m\xF3viles iOS, ya que eso har\xE1 que falle analizar ya que no es compatible con esa plataforma.","add-input-button-text":"Agregar nuevo reemplazo de regex","regex-to-find-placeholder-text":"Regex para encontrar","flags-placeholder-text":"Marcas","regex-to-replace-placeholder-text":"Regex para reemplazar","label-placeholder-text":"etiqueta","move-up-tooltip":"Desplazar hacia arriba","move-down-tooltip":"Desplazar hacia abajo","delete-tooltip":"Borrar"}},rules:{"auto-correct-common-misspellings":{name:"Correcci\xF3n autom\xE1tica de errores ortogr\xE1ficos comunes",description:"Utiliza un diccionario de errores ortogr\xE1ficos comunes para convertirlos autom\xE1ticamente a su ortograf\xEDa correcta. Consulte [mapa de autocorrecci\xF3n](https://github.com/platers/obsidian-linter/tree/master/src/utils/auto-correct-misspellings.ts) para obtener la lista completa de palabras corregidas autom\xE1ticamente.","ignore-words":{name:"Ignorar palabras",description:"Una lista separada por comas de palabras en min\xFAsculas para ignorar al corregir autom\xE1ticamente"}},"add-blockquote-indentation-on-paste":{name:"Agregar sangr\xEDa de blockquote en pegar",description:"Agrega blockquotes a todas menos a la primera l\xEDnea, cuando el cursor est\xE1 en una l\xEDnea blockquote/callout durante el pegado"},"blockquote-style":{name:"Estilo de cotizaci\xF3n en bloque",description:"Se asegura de que el estilo de la cita en bloque sea consistente.",style:{name:"Estilo",description:"El estilo utilizado en los indicadores de cotizaci\xF3n en bloque"}},"capitalize-headings":{name:"Poner may\xFAsculas en los encabezados",description:"Los encabezados deben estar formateados con may\xFAsculas",style:{name:"Estilo",description:"El estilo de may\xFAsculas que se va a utilizar"},"ignore-case-words":{name:"Ignorar palabras en may\xFAsculas y min\xFAsculas",description:"Solo aplique el estilo de may\xFAsculas y min\xFAsculas a las palabras que est\xE9n todas en min\xFAsculas"},"ignore-words":{name:"Ignorar palabras",description:"Una lista de palabras separadas por comas para ignorar al poner en may\xFAsculas"},"lowercase-words":{name:"Palabras en min\xFAsculas",description:"Una lista de palabras separadas por comas para mantener min\xFAsculas"}},"compact-yaml":{name:"YAML compacto",description:"Elimina las l\xEDneas en blanco iniciales y finales en la materia frontal de YAML.","inner-new-lines":{name:"Nuevas l\xEDneas internas",description:"Quitar nuevas l\xEDneas que no est\xE9n al principio o al final del YAML"}},"consecutive-blank-lines":{name:"L\xEDneas en blanco consecutivas",description:"Debe haber como m\xE1ximo una l\xEDnea en blanco consecutiva."},"convert-bullet-list-markers":{name:"Convertir marcadores de lista de vi\xF1etas",description:"Convierte s\xEDmbolos de marcador de lista de vi\xF1etas comunes en marcadores de lista de rebajas."},"convert-spaces-to-tabs":{name:"Convertir espacios en pesta\xF1as",description:"Convierte los espacios iniciales en pesta\xF1as.",tabsize:{name:"Tama\xF1o de la pesta\xF1a",description:"N\xFAmero de espacios que se convertir\xE1n en una pesta\xF1a"}},"emphasis-style":{name:"Estilo de \xE9nfasis",description:"Se asegura de que el estilo de \xE9nfasis sea consistente.",style:{name:"Estilo",description:"El estilo utilizado para denotar el contenido enfatizado"}},"empty-line-around-blockquotes":{name:"L\xEDnea vac\xEDa alrededor de blockquotes",description:"Asegura que haya una l\xEDnea vac\xEDa alrededor de blockquotes a menos que inicien o finalicen un documento. **Tenga en cuenta que una l\xEDnea vac\xEDa es un nivel menos de anidamiento para blockquotes o un car\xE1cter de nueva l\xEDnea.**"},"empty-line-around-code-fences":{name:"L\xEDnea vac\xEDa alrededor de las vallas de c\xF3digo",description:"Garantiza que haya una l\xEDnea vac\xEDa alrededor de las vallas de c\xF3digo a menos que inicien o finalicen un documento."},"empty-line-around-math-blocks":{name:"L\xEDnea vac\xEDa alrededor de los bloques matem\xE1ticos",description:"Asegura que haya una l\xEDnea vac\xEDa alrededor de los bloques matem\xE1ticos usando `N\xFAmero de signos de d\xF3lar para indicar un bloque matem\xE1tico` para determinar cu\xE1ntos signos de d\xF3lar indica un bloque matem\xE1tico para matem\xE1ticas de una sola l\xEDnea."},"empty-line-around-tables":{name:"L\xEDnea vac\xEDa alrededor de las tablas",description:"Asegura que haya una l\xEDnea vac\xEDa alrededor de las tablas con sabor a github a menos que inicien o finalicen un documento."},"escape-yaml-special-characters":{name:"Evitar los caracteres especiales de YAML",description:`Escapa dos puntos con un espacio despu\xE9s de ellos (:), comillas simples (') y comillas dobles (") en YAML.`,"try-to-escape-single-line-arrays":{name:"Intente escapar las matrices de una sola l\xEDnea",description:'Intenta escapar de los valores de matriz suponiendo que una matriz comienza con "[", termina con "]" y tiene elementos que est\xE1n delimitados por ",".'}},"file-name-heading":{name:"Encabezado de nombre de archivo",description:"Inserta el nombre de archivo como un encabezado H1 si no existe ning\xFAn encabezado H1."},"footnote-after-punctuation":{name:"Nota al pie despu\xE9s de la puntuaci\xF3n",description:"Asegura que las referencias de notas al pie se coloquen despu\xE9s de la puntuaci\xF3n, no antes."},"force-yaml-escape":{name:"Forzar escape de YAML",description:"Escapa los valores de las claves YAML especificadas.","force-yaml-escape-keys":{name:"Forzar escape de YAML en las claves",description:"Utiliza el car\xE1cter de escape de YAML en las claves de YAML especificadas separadas por un nuevo car\xE1cter de l\xEDnea si a\xFAn no est\xE1 escapado. No lo use en matrices de YAML."}},"format-tags-in-yaml":{name:"Dar formato a las etiquetas de formato en YAML",description:"Elimine los hashtags de las etiquetas en el frontmatter del YAML, ya que hacen que las etiquetas no sean v\xE1lidas."},"format-yaml-array":{name:"Dar formato a las matrices de YAML",description:"Permite el formato de matrices regulares de YAML como multil\xEDnea o de una sola l\xEDnea y las `etiquetas` y `alias` pueden tener algunos formatos espec\xEDficos de YAML de Obsidian. Tenga en cuenta que una sola cadena a una sola l\xEDnea pasa de una sola entrada de cadena a una matriz de una sola l\xEDnea si hay m\xE1s de 1 entrada presente. Lo mismo es cierto para una sola cadena a multil\xEDnea, excepto que se convierte en una matriz multil\xEDnea.","alias-key":{name:"Dar formato a la secci\xF3n de alias de YAML",description:"Activa el formato para la secci\xF3n de alias YAML. No debe habilitar esta opci\xF3n junto con la regla `Alias de t\xEDtulo YAML`, ya que es posible que no funcionen bien juntos o que tengan diferentes estilos de formato seleccionados que causen resultados inesperados."},"tag-key":{name:"Dar formato a la secci\xF3n de etiquetas de YAML",description:"Activa el formato para la secci\xF3n de etiquetas de YAML."},"default-array-style":{name:"Estilo de secci\xF3n de matriz predeterminado de YAML",description:"El estilo de otras matrices de YAML que no son `etiquetas`, `alias` o en `Forzar valores de clave para que sean matrices de una sola l\xEDnea` y `Forzar valores de clave para que sean matrices multil\xEDnea`"},"default-array-keys":{name:"Dar formato a las secciones de matrices de YAML",description:"Activa el formato para matrices normales de YAML"},"force-single-line-array-style":{name:"Forzar que los valores de clave sean matrices de una sola l\xEDnea",description:"Fuerza la matriz de YAML para que las nuevas claves separadas por l\xEDnea est\xE9n en formato de una sola l\xEDnea (deje vac\xEDo para deshabilitar esta opci\xF3n)"},"force-multi-line-array-style":{name:"Forzar que los valores de las claves sean matrices multil\xEDneas",description:"Fuerza la matriz de YAML para que las nuevas claves separadas por l\xEDnea est\xE9n en formato multil\xEDnea (deje vac\xEDa para deshabilitar esta opci\xF3n)"}},"header-increment":{name:"Incremento de encabezado",description:"Los niveles de encabezado solo deben aumentar en un nivel a la vez","start-at-h2":{name:"Iniciar el incremento de encabezado en el nivel de encabezado 2",description:"Hace que el nivel de encabezado 2 sea el nivel de t\xEDtulo m\xEDnimo en un archivo para el incremento de encabezado y desplaza todos los encabezados en consecuencia para que se incrementen a partir de un encabezado de nivel 2."}},"heading-blank-lines":{name:"L\xEDneas en blanco de encabezado",description:"Todos los encabezados tienen una l\xEDnea en blanco antes y despu\xE9s (excepto cuando el encabezado est\xE1 al principio o al final del documento).",bottom:{name:"Abajo",description:"Insertar una l\xEDnea en blanco despu\xE9s de los encabezados"},"empty-line-after-yaml":{name:"L\xEDnea vac\xEDa entre el YAML y el encabezado",description:"Mantenga la l\xEDnea vac\xEDa entre el frontmatter del YAML y el encabezado"}},"headings-start-line":{name:"Comenzar los encabezados al principio de la l\xEDnea",description:"Los encabezados que no inician una l\xEDnea tendr\xE1n su espacio en blanco anterior eliminado para asegurarse de que se reconozcan como encabezados."},"insert-yaml-attributes":{name:"Insertar atributos de YAML",description:"Inserta los atributos especificados de YAML en el frontmatter del YAML. Coloque cada atributo en una sola l\xEDnea.","text-to-insert":{name:"Texto a insertar",description:"Texto para insertar en el frontmatter del YAML"}},"line-break-at-document-end":{name:"Salto de l\xEDnea al final del documento",description:"Asegura que haya exactamente un salto de l\xEDnea al final de un documento."},"move-footnotes-to-the-bottom":{name:"Mover las notas al pie a la parte inferior",description:"Mueva todas las notas al pie de p\xE1gina a la parte inferior del documento."},"move-math-block-indicators-to-their-own-line":{name:"Mover los indicadores de bloques matem\xE1ticos a su propia l\xEDnea",description:"Mueva todos los indicadores de bloques matem\xE1ticos iniciales y finales a sus propias l\xEDneas usando `N\xFAmero de signos de d\xF3lar para indicar un bloque matem\xE1tico` para determinar cu\xE1ntos signos de d\xF3lar indica un bloque matem\xE1tico para matem\xE1ticas de una sola l\xEDnea."},"move-tags-to-yaml":{name:"Mover etiquetas a YAML",description:"Mueva todas las etiquetas al frontmatter del YAML del documento.","how-to-handle-existing-tags":{name:"Operaci\xF3n de etiqueta corporal",description:"Lo qur se debe hacer con las etiquetas no ignoradas en el cuerpo del archivo una vez que se han movido al frontmatter"},"tags-to-ignore":{name:"Etiquetas para omitir",description:"Las etiquetas que no se mover\xE1n a la matriz de etiquetas ni se eliminar\xE1n del contenido del cuerpo si est\xE1 habilitado `Eliminar el hashtag de las etiquetas en el cuerpo del contenido`. Cada etiqueta debe estar en una nueva l\xEDnea y sin el `#`. **Aseg\xFArese de no incluir el hashtag en el nombre de la etiqueta.**"}},"no-bare-urls":{name:"Sin URL desnuda",description:"Encierra las direcciones URL desnudas con corchetes angulares, excepto cuando est\xE1n encerradas en marcas traseras, llaves cuadradas o comillas simples o dobles.","no-bare-uris":{name:"Sin URI desnuda",description:"Encierra las direcciones URI desnudas con corchetes angulares, excepto cuando est\xE1n encerradas en marcas traseras, llaves cuadradas o comillas simples o dobles."}},"ordered-list-style":{name:"Estilo de lista ordenada",description:"Se asegura de que las listas ordenadas siguen el estilo especificado. Tenga en cuenta que 2 espacios o 1 tabulaci\xF3n se considera un nivel de sangr\xEDa.","number-style":{name:"Estilo num\xE9rico",description:"El estilo num\xE9rico utilizado en los indicadores de lista ordenada"},"list-end-style":{name:"Estilo final del indicador de lista ordenada",description:"El car\xE1cter final de un indicador de lista ordenada"}},"paragraph-blank-lines":{name:"L\xEDneas en blanco del p\xE1rrafo",description:"Todos los p\xE1rrafos deben tener exactamente una l\xEDnea en blanco antes y despu\xE9s."},"prevent-double-checklist-indicator-on-paste":{name:"Evitar el indicador de doble lista de verificaci\xF3n en pegar",description:"Elimina el indicador de lista de verificaci\xF3n inicial del texto para pegar si la l\xEDnea en la que se encuentra el cursor en el archivo tiene un indicador de lista de verificaci\xF3n"},"prevent-double-list-item-indicator-on-paste":{name:"Prevenir el indicador de elemento de lista doble al pegar",description:"Elimina el indicador de lista inicial del texto para pegar si la l\xEDnea en la que se encuentra el cursor en el archivo tiene un indicador de lista"},"proper-ellipsis-on-paste":{name:"Puntos suspensivos adecuados al pegar",description:"Reemplaza tres puntos consecutivos por puntos suspensivos aunque tengan un espacio entre ellos en el texto a pegar"},"proper-ellipsis":{name:"Puntos suspensivos propios",description:"Reemplaza tres puntos consecutivos con puntos suspensivos."},"quote-style":{name:"Estilo de cotizaci\xF3n",description:"Actualiza las comillas en el contenido del cuerpo para que se actualicen a los estilos de comillas simples y dobles especificados.","single-quote-enabled":{name:"Habilitar `Estilo de comillas simples`",description:"Especifica que se debe utilizar el estilo de comillas simples seleccionado."},"single-quote-style":{name:"Estilo de comillas simples",description:"El estilo de las comillas simples a utilizar."},"double-quote-enabled":{name:"Habilitar `Estilo de comillas dobles`",description:"Especifica que se debe utilizar el estilo de comillas dobles seleccionado."},"double-quote-style":{name:"Estilo de comillas dobles",description:"El estilo de comillas dobles a utilizar."}},"re-index-footnotes":{name:"Volver a indexar notas al pie",description:"Vuelve a indexar las notas al pie de p\xE1gina y las notas al pie, seg\xFAn el orden de aparici\xF3n (NOTA: esta regla *no* funciona si hay m\xE1s de una nota al pie para una clave)."},"remove-consecutive-list-markers":{name:"Eliminar marcadores de lista consecutiva",description:"Elimina marcadores de lista consecutivos. \xDAtil al copiar y pegar elementos de la lista."},"remove-empty-lines-between-list-markers-and-checklists":{name:"Eliminar l\xEDneas vac\xEDas entre marcadores de lista y listas de verificaci\xF3n",description:"No debe haber l\xEDneas vac\xEDas entre los marcadores de lista y las listas de verificaci\xF3n."},"remove-empty-list-markers":{name:"Eliminar marcadores de lista vac\xEDa",description:"Elimina marcadores de listas vac\xEDas, es decir, lista de elementos sin contenido."},"remove-hyphenated-line-breaks":{name:"Eliminar saltos de l\xEDnea con gui\xF3n",description:"Elimina los saltos de l\xEDnea con gui\xF3n. \xDAtil al pegar texto de libros de texto."},"remove-hyphens-on-paste":{name:"Eliminar guiones al pegar",description:"Elimina guiones del texto al pegar"},"remove-leading-or-trailing-whitespace-on-paste":{name:"Eliminar espacios en blanco iniciales o finales al pegar",description:"Elimina cualquier espacio en blanco inicial que no sea una pesta\xF1a y todos los espacios en blanco finales para que el texto se pegue"},"remove-leftover-footnotes-from-quote-on-paste":{name:"Eliminar las notas al pie sobrantes de la cita al pegar",description:"Elimina las referencias de notas al pie sobrantes para que el texto se pegue"},"remove-link-spacing":{name:"Quitar el espacio entre enlaces",description:"Elimina el espacio alrededor del texto del enlace."},"remove-multiple-blank-lines-on-paste":{name:"Eliminar varias l\xEDneas en blanco al pegar",description:"Condensa varias l\xEDneas en blanco en una l\xEDnea en blanco para que el texto se pegue"},"remove-multiple-spaces":{name:"Quitar varios espacios",description:"Elimina dos o m\xE1s espacios consecutivos. Ignora los espacios al principio y al final de la l\xEDnea."},"remove-space-around-characters":{name:"Quitar el espacio alrededor de los caracteres",description:"Garantiza que determinados caracteres no est\xE9n rodeados de espacios en blanco (ya sean espacios individuales o tabulaciones). Tenga en cuenta que esto puede causar problemas con el formato de descuento en algunos casos.","include-fullwidth-forms":{name:"Incluir formularios de ancho completo",description:'Incluir bloque Unicode de formularios de ancho completo'},"include-cjk-symbols-and-punctuation":{name:"Incluir s\xEDmbolos de CJK y puntuaci\xF3n",description:'Incluir Bloque Unicode de s\xEDmbolos y puntuaci\xF3n de CJK'},"include-dashes":{name:"Incluir guiones",description:"Incluir gui\xF3n corto (\u2013) y gui\xF3n largo (\u2014)"},"other-symbols":{name:"Otros s\xEDmbolos",description:"Otros s\xEDmbolos para incluir"}},"remove-space-before-or-after-characters":{name:"Quitar el espacio antes o despu\xE9s de los caracteres",description:"Elimina el espacio antes de los caracteres especificados y despu\xE9s de los caracteres especificados. Tenga en cuenta que esto puede causar problemas con el formato de descuento en algunos casos.","characters-to-remove-space-before":{name:"Eliminar espacio antes de los caracteres",description:"Elimina el espacio antes de los caracteres especificados. **Nota: el uso de `{` o `}` en la lista de caracteres afectar\xE1 inesperadamente a los archivos, ya que se usa en la sintaxis de ignorar en segundo plano.**"},"characters-to-remove-space-after":{name:"Eliminar espacio despu\xE9s de los caracteres",description:"Elimina el espacio despu\xE9s de los caracteres especificados. **Nota: el uso de `{` o `}` en la lista de caracteres afectar\xE1 inesperadamente a los archivos, ya que se usa en la sintaxis de ignorar en segundo plano.**"}},"remove-trailing-punctuation-in-heading":{name:"Eliminar la puntuaci\xF3n final en el encabezado",description:"Elimina la puntuaci\xF3n especificada al final de los encabezados, asegur\xE1ndose de ignorar el punto y coma al final de [referencias de entidades de HTML](https://es.wikipedia.org/wiki/Anexo:Referencias_a_entidades_de_caracteres_XML_y_HTML).","punctuation-to-remove":{name:"Puntuaci\xF3n final",description:"La puntuaci\xF3n final que se eliminar\xE1 de los encabezados del archivo."}},"remove-yaml-keys":{name:"Eliminar claves de YAML",description:"Elimina las claves especificadas de YAML","yaml-keys-to-remove":{name:"Claves de YAML para eliminar",description:"Las claves de YAML para eliminar del frontmatter del YAML con o sin dos puntos"}},"space-after-list-markers":{name:"Espacio despu\xE9s de los marcadores de lista",description:"Debe haber un solo espacio despu\xE9s de los marcadores de lista y las casillas de verificaci\xF3n."},"space-between-chinese-japanese-or-korean-and-english-or-numbers":{name:"Espacio entre chino japon\xE9s o coreano e ingl\xE9s o n\xFAmeros",description:"Garantiza que el chino, el japon\xE9s o el coreano y el ingl\xE9s o los n\xFAmeros est\xE9n separados por un solo espacio. Sigue estas [directrices](https://github.com/sparanoid/chinese-copywriting-guidelines)"},"strong-style":{name:"Estilo fuerte",description:"Se asegura de que el estilo fuerte sea consistente.",style:{name:"Estilo",description:"El estilo utilizado para denotar contenido fuerte/en negrita"}},"trailing-spaces":{name:"Espacios finales",description:"Elimina espacios adicionales despu\xE9s de cada l\xEDnea.","twp-space-line-break":{name:"Salto de l\xEDnea de dos espacios",description:'Ignore dos espacios seguidos de un salto de l\xEDnea ("Regla de dos espacios").'}},"two-spaces-between-lines-with-content":{name:"Dos espacios entre l\xEDneas con contenido",description:"Se asegura de que se agreguen dos espacios al final de las l\xEDneas con contenido que contin\xFAa en la siguiente l\xEDnea para p\xE1rrafos, comillas y elementos de lista"},"unordered-list-style":{name:"Estilo de lista desordenada",description:"Se asegura de que las listas desordenadas sigan el estilo especificado.","list-style":{name:"Estilo de elemento de lista",description:"El estilo de elemento de lista para usar en listas desordenadas"}},"yaml-key-sort":{name:"Clasificaci\xF3n de clave de YAML",description:"Ordena las claves de YAML seg\xFAn el orden y la prioridad especificados. Nota: tambi\xE9n puede eliminar las l\xEDneas en blanco.","yaml-key-priority-sort-order":{name:"Orden de clasificaci\xF3n de prioridad de clave de YAML",description:"El orden en el que se ordenan las claves con una en cada l\xEDnea donde se ordena en el orden que se encuentra en la lista"},"priority-keys-at-start-of-yaml":{name:"Claves de prioridad al inicio del YAML",description:"El orden de clasificaci\xF3n de prioridad clave de YAML se coloca al comienzo del frontmatter del YAML"},"yaml-sort-order-for-other-keys":{name:"Orden de clasificaci\xF3n de YAML para otras claves",description:"La forma en que ordenar las claves que no se encuentran en el \xE1rea de texto `Orden de clasificaci\xF3n de prioridad de clave de YAML`"}},"yaml-timestamp":{name:"Marca de tiempo de YAML",description:"Lleve un registro de la fecha en que se edit\xF3 el archivo por \xFAltima vez en el frente del YAML. Obtiene las fechas de los metadatos del archivo.","date-created":{name:"Fecha de creaci\xF3n",description:"Inserte la fecha de creaci\xF3n del archivo"},"date-created-key":{name:"Clave de fecha de creaci\xF3n",description:"La clave de YAML para usar para la fecha de creaci\xF3n"},"force-retention-of-create-value":{name:"Forzar la fecha de creaci\xF3n de la retenci\xF3n del valor clave",description:"Reutiliza el valor en el frontmatter del YAML para la fecha de creaci\xF3n en lugar de los metadatos del archivo, lo que es \xFAtil para evitar que los cambios en los metadatos del archivo provoquen que el valor cambie a un valor diferente."},"date-modified":{name:"Fecha modificada",description:"Inserte la fecha en que se modific\xF3 el archivo por \xFAltima vez"},"date-modified-key":{name:"Clave de fecha modificada",description:"La clave de YAML para usar para la fecha de modificaci\xF3n"},format:{name:"Formato",description:"Formato de fecha de Moment a usar (ver [Opciones de formato de Moment](https://momentjscom.readthedocs.io/en/latest/moment/04-displaying/01-format/))"}},"yaml-title-alias":{name:"Alias de t\xEDtulo de YAML",description:"Inserta el t\xEDtulo del archivo en la secci\xF3n de alias de YAML frontmatter. Obtiene el t\xEDtulo del primer H1 o nombre de archivo.","preserve-existing-alias-section-style":{name:"Conservar el estilo de secci\xF3n de alias existente",description:"Si se establece, la configuraci\xF3n `Estilo de secci\xF3n de alias de YAML` se aplica solo a las secciones reci\xE9n creadas"},"keep-alias-that-matches-the-filename":{name:"Mantenga el alias que coincida con el nombre del archivo",description:"Estos alias suelen ser redundantes."},"use-yaml-key-to-keep-track-of-old-filename-or-heading":{name:"Use la clave de YAML `linter-yaml-title-alias` para ayudar con los cambios de nombre de archivo y encabezado",description:"Si se establece, cuando cambia el primer encabezado H1 o cambia el nombre de archivo si el primer H1 no est\xE1 presente, el alias anterior almacenado en esta clave se reemplazar\xE1 con el nuevo valor en lugar de simplemente insertar una nueva entrada en la matriz de alias."}},"yaml-title":{name:"T\xEDtulo de YAML",description:"Inserta el t\xEDtulo del archivo en el frontmatter de YAML. Obtiene el t\xEDtulo seg\xFAn el modo seleccionado.","title-key":{name:"Clave de t\xEDtulo",description:"La clave de YAML para usar para el t\xEDtulo"},mode:{name:"Modo",description:"El m\xE9todo a utilizar para obtener el t\xEDtulo"}}},enums:{"Title Case":"Titulo del Caso","ALL CAPS":"TODO MAY\xDASCULAS","First letter":"Primera letra",".":".",")":")",ERROR:"error",TRACE:"trazar",DEBUG:"depurar",INFO:"informaci\xF3n",WARN:"advertencia",SILENT:"silencio",ascending:"ascendente",lazy:"perezoso",Nothing:"nada","Remove hashtag":"Remove hashtag","Remove whole tag":"Remove whole tag",asterisk:"asterisco",underscore:"guion bajo",consistent:"congruente","-":"-","*":"*","+":"+",space:"espacio","no space":"sin espacio",None:"nada","Ascending Alphabetical":"Ascendente alfab\xE9tico","Descending Alphabetical":"Descendiente alfab\xE9tico","multi-line":"multil\xEDnea","single-line":"linea sola","single string to single-line":"una sola cadena a una sola l\xEDnea","single string to multi-line":"cadena \xFAnica a multil\xEDnea","single string comma delimited":"cadena \xFAnica delimitada por comas","single string space delimited":"espacio de una sola cadena delimitado","single-line space delimited":"espacio de una sola l\xEDnea delimitado","first-h1":"primer encabezado de nivel 1","first-h1-or-filename-if-h1-missing":"primer encabezado de nivel 1 o nombre de archivo si falta el encabezado de primer nivel 1",filename:"nombre del archivo","''":"''","\u2018\u2019":"\u2018\u2019",'""':'""',"\u201C\u201D":"\u201C\u201D"}};var Cd={};var Md={};var qd={};var Id={};var Bd={};var _d={};var Fd={};var Rd={};var Dd={};var Nd={};var jd={};var Kd={};var Yd={};var Pd={};var Hd={commands:{"lint-file":{name:"Ge\xE7erli dosyay\u0131 lintle","error-message":"Dosyada Lintleme Hatas\u0131"},"lint-file-unless-ignored":{name:"Yoksay\u0131lmad\u0131k\xE7a ge\xE7erli dosyay\u0131 lintle"},"lint-all-files":{name:"Kasadaki t\xFCm dosyalar\u0131 lintle","error-message":"Dosyada T\xFCm Dosyalar\u0131 Lintleme Hatas\u0131","success-message":"T\xFCm dosyalar lintlendi","errors-message-singular":"T\xFCm dosyalar lintlendi ve 1 hata vard\u0131.","errors-message-plural":"T\xFCm dosyalar lintlendi ve {NUM} hata vard\u0131.","start-message":"Bu, t\xFCm dosyalar\u0131n\u0131z\u0131 d\xFCzenler ve hatalara yol a\xE7abilir.","submit-button-text":"T\xFCm\xFCn\xFC Lintle","submit-button-notice-text":"T\xFCm dosyalar lintleniyor..."},"lint-all-files-in-folder":{name:"Ge\xE7erli klas\xF6rdeki t\xFCm dosyalar\u0131 lintle","start-message":"Bu, {FOLDER_NAME} dahilindeki t\xFCm dosyalar\u0131n\u0131z\u0131 ve alt klas\xF6rlerini d\xFCzenler ve hatalara yol a\xE7abilir.","submit-button-text":"{FOLDER_NAME} i\xE7indeki T\xFCm Dosyalar\u0131 Lintle","submit-button-notice-text":"{FOLDER_NAME} i\xE7indeki t\xFCm dosyalar lintleniyor...","error-message":"Klas\xF6rdeki T\xFCm Dosyalar\u0131 Lintleme Hatas\u0131 Dosyada","success-message":"{FOLDER_NAME} i\xE7indeki t\xFCm {NUM} dosya lintlendi.","message-singular":"{FOLDER_NAME} i\xE7indeki t\xFCm {NUM} dosya lintlendi ve 1 hata vard\u0131.","message-plural":"{FOLDER_NAME} i\xE7indeki t\xFCm {FILE_COUNT} dosya lintlendi ve {ERROR_COUNT} hata vard\u0131."},"paste-as-plain-text":{name:"D\xFCz Metin Olarak & Modifikasyonsuz Yap\u0131\u015Ft\u0131r"},"lint-file-pop-up-menu-text":{name:"Dosyay\u0131 lintle"},"lint-folder-pop-up-menu-text":{name:"Klas\xF6r\xFC lintle"}},logs:{"plugin-load":"Eklenti y\xFCkleniyor","plugin-unload":"Eklenti kald\u0131r\u0131l\u0131yor","folder-lint":"Klas\xF6r lintleniyor ","linter-run":"Lintleme \xE7al\u0131\u015Ft\u0131r\u0131l\u0131yor","paste-link-warning":"pano i\xE7eri\u011Fi bir link oldu\u011Fu ve yap\u0131\u015Ft\u0131rmay\u0131 de\u011Fi\u015Ftiren di\u011Fer eklentilerle \xE7ak\u0131\u015Fmay\u0131 \xF6nlemek i\xE7in lintleme yap\u0131\u015Ft\u0131rmas\u0131 iptal edildi.","see-console":"Daha fazla detay i\xE7in konsolu kontrol edin.","unknown-error":"Lintleme s\u0131ras\u0131nda bilinmeyen bir hata olu\u015Ftu.","moment-locale-not-found":"Moment.js yerelini {MOMENT_LOCALE} olarak de\u011Fi\u015Ftirmeye \xE7al\u0131\u015F\u0131yor, elde edilen {CURRENT_LOCALE}","file-change-lint-message-start":"Lintlendi","pre-rules":"normal kurallardan \xF6nceki kurallar","post-rules":"normal kurallardan sonraki kurallar","rule-running":"kurallar \xE7al\u0131\u015Ft\u0131r\u0131l\u0131yor","custom-regex":"\xF6zel regex kurallar\u0131","running-custom-regex":"\xD6zel Regex \xC7al\u0131\u015Ft\u0131r\u0131l\u0131yor","running-custom-lint-command":"\xD6zel Lint Komutlar\u0131 \xC7al\u0131\u015Ft\u0131r\u0131l\u0131yor","custom-lint-duplicate-warning":'Ayn\u0131 komutu ("{COMMAND_NAME}") \xF6zel bir lint kural\u0131 olarak iki kez \xE7al\u0131\u015Ft\u0131ramazs\u0131n\u0131z.',"custom-lint-error-message":"\xD6zel Lint Komutu Hatas\u0131","disabled-text":"devre d\u0131\u015F\u0131","run-rule-text":"\xC7al\u0131\u015Ft\u0131r\u0131l\u0131yor","timing-key-not-found":"'{TIMING_KEY}' zamanlama anahtar\u0131 zamanlama bilgisi listesinde bulunamad\u0131, bu y\xFCzden yoksay\u0131ld\u0131","milliseconds-abbreviation":"ms","invalid-date-format-error":"Olu\u015Fturulan tarih format\u0131 '{DATE}' ayr\u0131\u015Ft\u0131r\u0131lamad\u0131 veya belirlenemedi, bu y\xFCzden '{FILE_NAME}' dosyas\u0131ndaki olu\u015Fturulan tarih ayn\u0131 b\u0131rak\u0131ld\u0131","invalid-delimiter-error-message":"ayra\xE7 sadece tek bir karakter olabilir","missing-footnote-error-message":"'{FOOTNOTE}' dipnotunun i\xE7eri\u011Finden \xF6nce kar\u015F\u0131l\u0131k gelen bir dipnot referans\u0131 yok ve i\u015Flenemez. L\xFCtfen t\xFCm dipnotlar\u0131n, dipnot i\xE7eri\u011Finden \xF6nce kar\u015F\u0131l\u0131k gelen bir referans\u0131 oldu\u011Fundan emin olun.","too-many-footnotes-error-message":"'{FOOTNOTE_KEY}' dipnot anahtar\u0131 birden fazla dipnota at\u0131fta bulunuyor. L\xFCtfen dipnotlar\u0131 g\xFCncelleyin, b\xF6ylece her dipnot anahtar\u0131 i\xE7in yaln\u0131zca bir dipnot olur.","wrapper-yaml-error":"YAML'da hata: {ERROR_MESSAGE}","wrapper-unknown-error":"bilinmeyen hata: {ERROR_MESSAGE}"},"notice-text":{"empty-clipboard":"Panoda i\xE7erik yok.","characters-added":"karakterler eklendi","characters-removed":"karakterler kald\u0131r\u0131ld\u0131"},"all-rules-option":"T\xFCm\xFC","linter-title":"Linter","empty-search-results-text":"Arama ile e\u015Fle\u015Fen ayar bulunamad\u0131","warning-text":"Uyar\u0131","file-backup-text":"Dosyalar\u0131n\u0131z\u0131n yede\u011Fini ald\u0131\u011F\u0131n\u0131zdan emin olun.",tabs:{names:{general:"Genel",custom:"\xD6zel",yaml:"YAML",heading:"Ba\u015Fl\u0131k",content:"\u0130\xE7erik",footnote:"Dipnot",spacing:"Bo\u015Fluk",paste:"Yap\u0131\u015Ft\u0131r",debug:"Hata ay\u0131kla"},"default-search-bar-text":"T\xFCm ayarlar\u0131 ara",general:{"lint-on-save":{name:"Kaydederken d\xFCzelt",description:"Manuel kaydetme (Ctrl + S tu\u015Funa bas\u0131ld\u0131\u011F\u0131nda veya vim tu\u015F ba\u011Flamalar\u0131n\u0131 kullan\u0131rken :w komutu \xE7al\u0131\u015Ft\u0131r\u0131ld\u0131\u011F\u0131nda) dosyay\u0131 d\xFCzeltir"},"display-message":{name:"D\xFCzeltme sonras\u0131 mesaj\u0131 g\xF6ster",description:"D\xFCzeltme sonras\u0131 de\u011Fi\u015Fen karakter say\u0131s\u0131n\u0131 g\xF6sterir"},"lint-on-file-change":{name:"Dosya De\u011Fi\u015Fikli\u011Finde D\xFCzeltme",description:"Bir dosya kapat\u0131ld\u0131\u011F\u0131nda veya yeni bir dosya a\xE7\u0131ld\u0131\u011F\u0131nda, \xF6nceki dosya d\xFCzeltilir."},"display-lint-on-file-change-message":{name:"Dosya De\u011Fi\u015Fikli\u011Finde D\xFCzeltme Mesaj\u0131n\u0131 G\xF6ster",description:"`Dosya De\u011Fi\u015Fikli\u011Finde D\xFCzeltme` oldu\u011Funda bir mesaj g\xF6sterir"},"folders-to-ignore":{name:"Yoksay\u0131lacak klas\xF6rler",description:"T\xFCm dosyalar\u0131 d\xFCzeltirken veya kaydederken d\xFCzeltme i\u015Fleminin yoksay\u0131laca\u011F\u0131 klas\xF6rler. Klas\xF6r yollar\u0131n\u0131 yeni sat\u0131rlarla ay\u0131rarak girin"},"override-locale":{name:"Yerel ayarlar\u0131n \xFCzerine yaz",description:"Varsay\u0131lan\u0131n d\u0131\u015F\u0131nda bir yerel ayar kullanmak istiyorsan\u0131z bunu ayarlay\u0131n"},"same-as-system-locale":"Sistemle ayn\u0131 ({SYS_LOCALE})","yaml-aliases-section-style":{name:"YAML takma adlar\u0131 b\xF6l\xFCm\xFC stili",description:"YAML takma adlar\u0131 b\xF6l\xFCm\xFCn\xFCn stili"},"yaml-tags-section-style":{name:"YAML etiketleri b\xF6l\xFCm\xFC stili",description:"YAML etiketleri b\xF6l\xFCm\xFCn\xFCn stili"},"default-escape-character":{name:"Varsay\u0131lan Ka\xE7\u0131\u015F Karakteri",description:"Tek t\u0131rnak ve \xE7ift t\u0131rnak bulunmayan YAML de\u011Ferlerinden ka\xE7mak i\xE7in kullan\u0131lacak varsay\u0131lan karakter."},"remove-unnecessary-escape-chars-in-multi-line-arrays":{name:"\xC7ok Sat\u0131rl\u0131 Dizi Format\u0131ndayken Gereksiz Ka\xE7\u0131\u015F Karakterlerini Kald\u0131r",description:"\xC7ok sat\u0131rl\u0131 YAML dizileri i\xE7in ka\xE7\u0131\u015F karakterleri tek sat\u0131rl\u0131 dizilere g\xF6re ayn\u0131 ka\xE7\u0131\u015Fa ihtiya\xE7 duymaz, bu y\xFCzden \xE7ok sat\u0131rl\u0131 format i\xE7erisinde gerekli olmayan ekstra ka\xE7\u0131\u015Flar\u0131 kald\u0131r\u0131r"},"number-of-dollar-signs-to-indicate-math-block":{name:"Matematiksel Blo\u011Fu Belirtmek \u0130\xE7in Dolar \u0130\u015Fareti Say\u0131s\u0131",description:"Matematik i\xE7eri\u011Finin bir matematiksel blok yerine inline matematik olup olmad\u0131\u011F\u0131n\u0131 belirlemek i\xE7in kullan\u0131lacak dolar i\u015Fareti say\u0131s\u0131"}},debug:{"log-level":{name:"Log D\xFCzeyi",description:"Hizmetin loglamaya izin verdi\u011Fi log t\xFCrleri. Varsay\u0131lan ERROR'dur."},"linter-config":{name:"Linter Yap\u0131land\u0131rmas\u0131",description:"Ayar sayfas\u0131n\u0131n y\xFCklenmesi s\u0131ras\u0131nda Linter i\xE7in data.json i\xE7eri\u011Fi"},"log-collection":{name:"Kaydetme d\xFCzeltmesi ve mevcut dosyan\u0131n d\xFCzeltilmesi s\u0131ras\u0131nda loglar\u0131 topla",description:"`Kaydetme d\xFCzeltmesi` yapt\u0131\u011F\u0131n\u0131zda ve mevcut dosyay\u0131 d\xFCzeltirken loglar\u0131 toplar. Bu loglar hata ay\u0131klama ve hata raporlar\u0131 olu\u015Fturma i\xE7in yard\u0131mc\u0131 olabilir."},"linter-logs":{name:"Linter Loglar\u0131",description:"Son `Kaydetme d\xFCzeltmesi` veya son mevcut dosya \xE7al\u0131\u015Ft\u0131rmas\u0131ndan elde edilen loglar (e\u011Fer etkinle\u015Ftirilmi\u015Fse)."}}},options:{"custom-command":{name:"\xD6zel Komutlar",description:"\xD6zel komutlar, linter normal kurallar\u0131n\u0131 \xE7al\u0131\u015Ft\u0131rmay\u0131 bitirdikten sonra \xE7al\u0131\u015Ft\u0131r\u0131lan Obsidyen komutlard\u0131r. Bu, YAML zaman damgas\u0131 mant\u0131\u011F\u0131 \xE7al\u0131\u015Fmadan \xF6nce \xE7al\u0131\u015Fmad\u0131klar\u0131 anlam\u0131na gelir, dolay\u0131s\u0131yla linterin bir sonraki \xE7al\u0131\u015Fmas\u0131nda YAML zaman damgas\u0131n\u0131n tetiklenmesine neden olabilirler. Bir Obsidyen komutunu yaln\u0131zca bir kez se\xE7ebilirsiniz. **_Bunun \u015Fu anda yaln\u0131zca ge\xE7erli dosyaya sat\u0131r dizilirken \xE7al\u0131\u015Ft\u0131\u011F\u0131n\u0131 unutmay\u0131n._**",warning:"Bir se\xE7ene\u011Fi se\xE7erken, se\xE7ene\u011Fi fareyi kullanarak veya enter tu\u015Funa basarak se\xE7ti\u011Finizden emin olun. Di\u011Fer se\xE7im y\xF6ntemleri \xE7al\u0131\u015Fmayabilir ve yaln\u0131zca ger\xE7ek bir Obsidian komutunun veya bo\u015F bir dizinin se\xE7imleri kaydedilir.","add-input-button-text":"Yeni komut ekle","command-search-placeholder-text":"Obsidian komutu","move-up-tooltip":"Yukar\u0131","move-down-tooltip":"A\u015Fa\u011F\u0131","delete-tooltip":"Sil"},"custom-replace":{name:"\xD6zel Regex De\u011Fi\u015Ftirme",description:"\xD6zel regex de\u011Fi\u015Ftirme, bulunan regex ile e\u015Fle\u015Fen her \u015Feyi de\u011Fi\u015Ftirme de\u011Feri ile de\u011Fi\u015Ftirmek i\xE7in kullan\u0131labilir. De\u011Fi\u015Ftirme ve bulma de\u011Ferleri ge\xE7erli regex de\u011Ferleri olmal\u0131d\u0131r.",warning:"Regex hakk\u0131nda bilginiz yoksa dikkatli kullan\u0131n. Ayr\u0131ca, l\xFCtle iOS mobil platformunda regexinizde geriye d\xF6n\xFCk aramalar\u0131 kullanmay\u0131n \xE7\xFCnk\xFC bu, o platformda desteklenmedi\u011Fi i\xE7in lint i\u015Fleminin ba\u015Far\u0131s\u0131z olmas\u0131na neden olur.","add-input-button-text":"Yeni regex de\u011Fi\u015Ftirme ekle","regex-to-find-placeholder-text":"bulunacak regex","flags-placeholder-text":"bayraklar","regex-to-replace-placeholder-text":"de\u011Fi\u015Ftirilecek regex","label-placeholder-text":"etiket","move-up-tooltip":"Yukar\u0131 ta\u015F\u0131","move-down-tooltip":"A\u015Fa\u011F\u0131 ta\u015F\u0131","delete-tooltip":"Sil"}},rules:{"auto-correct-common-misspellings":{name:"Yayg\u0131n Yanl\u0131\u015F Yaz\u0131mlar\u0131 Otomatik D\xFCzelt",description:"Yayg\u0131n yanl\u0131\u015F yaz\u0131mlar\u0131n s\xF6zl\xFC\u011F\xFCn\xFC kullanarak bunlar\u0131 do\u011Fru yaz\u0131mlar\u0131na otomatik olarak d\xF6n\xFC\u015Ft\xFCr\xFCr. Otomatik d\xFCzeltilen kelimelerin tam listesi i\xE7in [otomatik-d\xFCzeltme haritas\u0131na](https://github.com/platers/obsidian-linter/tree/master/src/utils/auto-correct-misspellings.ts) bak\u0131n.","ignore-words":{name:"Kelimeleri Yoksay",description:"Otomatik d\xFCzeltme s\u0131ras\u0131nda yoksay\u0131lacak k\xFC\xE7\xFCk harfli kelimelerin virg\xFClle ayr\u0131lm\u0131\u015F listesi"}},"add-blockquote-indentation-on-paste":{name:"Yap\u0131\u015Ft\u0131rma S\u0131ras\u0131nda Blok Al\u0131nt\u0131 Girintisini Ekle",description:"\u0130mle\xE7 bir blok al\u0131nt\u0131/callout sat\u0131r\u0131nda oldu\u011Funda, t\xFCm sat\u0131rlara, ilk sat\u0131r hari\xE7, blok al\u0131nt\u0131lar ekler"},"blockquote-style":{name:"Blok Al\u0131nt\u0131 Stili",description:"Blok al\u0131nt\u0131 stili tutarl\u0131 olmal\u0131d\u0131r.",style:{name:"Stil",description:"Blok al\u0131nt\u0131 g\xF6stergelerinde kullan\u0131lan stil"}},"capitalize-headings":{name:"B\xFCy\xFCk Harfli Ba\u015Fl\u0131klar",description:"Ba\u015Fl\u0131klar b\xFCy\xFCk harfle bi\xE7imlendirilmelidir",style:{name:"Stil",description:"Kullan\u0131lacak b\xFCy\xFCk harfle ba\u015Flatma stili"},"ignore-case-words":{name:"Durum S\xF6zc\xFCklerini Yoksay",description:"Ba\u015Fl\u0131k durum stilini sadece t\xFCm k\xFC\xE7\xFCk harfli s\xF6zc\xFCklere uygula"},"ignore-words":{name:"S\xF6zc\xFCkleri Yoksay",description:"B\xFCy\xFCk harfle ba\u015Flat\u0131rken yoksay\u0131lacak s\xF6zc\xFCklerin virg\xFClle ayr\u0131lm\u0131\u015F listesi"},"lowercase-words":{name:"K\xFC\xE7\xFCk Harfli S\xF6zc\xFCkler",description:"K\xFC\xE7\xFCk harfli tutulacak s\xF6zc\xFCklerin virg\xFClle ayr\u0131lm\u0131\u015F listesi"}},"compact-yaml":{name:"S\u0131k\u0131\u015Ft\u0131r\u0131lm\u0131\u015F YAML",description:"YAML \xF6n bilgisindeki ba\u015Ftaki ve sondaki bo\u015F sat\u0131rlar\u0131 kald\u0131r\u0131r.","inner-new-lines":{name:"\u0130\xE7 Yeni Sat\u0131rlar",description:"YAML'\u0131n ba\u015F\u0131nda veya sonunda olmayan yeni sat\u0131rlar\u0131 kald\u0131r\u0131r."}},"consecutive-blank-lines":{name:"Ard\u0131\u015F\u0131k bo\u015F sat\u0131rlar",description:"En fazla bir ard\u0131\u015F\u0131k bo\u015F sat\u0131r olmal\u0131d\u0131r."},"convert-bullet-list-markers":{name:"Bullet List Markerlar\u0131n\u0131 D\xF6n\xFC\u015Ft\xFCr",description:"Bullet list marker sembollerini markdown list markerlar\u0131na d\xF6n\xFC\u015Ft\xFCr\xFCr."},"convert-spaces-to-tabs":{name:"Bo\u015Fluklar\u0131 Sekmeye D\xF6n\xFC\u015Ft\xFCr",description:"Ba\u015Ftaki bo\u015Fluklar\u0131 sekmeye d\xF6n\xFC\u015Ft\xFCr\xFCr.",tabsize:{name:"Sekme Boyutu",description:"Bir sekme haline d\xF6n\xFC\u015Ft\xFCr\xFClecek bo\u015Fluk say\u0131s\u0131"}},"emphasis-style":{name:"Vurgu Stili",description:"Vurgu stilinin tutarl\u0131 olmas\u0131n\u0131 sa\u011Flar.",style:{name:"Stil",description:"Vurgulanan i\xE7eri\u011Fi belirtmek i\xE7in kullan\u0131lan stil"}},"empty-line-around-blockquotes":{name:"Al\u0131nt\u0131 Bloklar\u0131n\u0131n Etraf\u0131nda Bo\u015F Sat\u0131r",description:"Bir belgenin ba\u015F\u0131n\u0131 veya sonunu ba\u015Flatmayan al\u0131nt\u0131 bloklar\u0131n etraf\u0131nda bo\u015F bir sat\u0131r olmal\u0131d\u0131r. **Not: bo\u015F bir sat\u0131r ya al\u0131nt\u0131 bloklar i\xE7in bir seviye daha az girinti veya yeni bir sat\u0131r karakteri demektir.**"},"empty-line-around-code-fences":{name:"Kod \xC7itlerinin Etraf\u0131nda Bo\u015F Sat\u0131r",description:"Bir belgenin ba\u015F\u0131n\u0131 veya sonunu ba\u015Flatmayan kod \xE7itlerinin etraf\u0131nda bo\u015F bir sat\u0131r olmal\u0131d\u0131r."},"empty-line-around-math-blocks":{name:"Matematik Bloklar\u0131n\u0131n Etraf\u0131nda Bo\u015F Sat\u0131r",description:"Tek sat\u0131rl\u0131k matematik i\xE7in bir matematik blo\u011Funu belirtmek i\xE7in ka\xE7 dolar i\u015Fareti oldu\u011Funu belirleyen `Dolar \u0130\u015Faretlerinin Say\u0131s\u0131yla Matematik Blo\u011Funu Belirt` kullan\u0131larak matematik bloklar\u0131n\u0131n etraf\u0131nda bo\u015F bir sat\u0131r olmal\u0131d\u0131r."},"empty-line-around-tables":{name:"Tablolar\u0131n Etraf\u0131nda Bo\u015F Sat\u0131r",description:"Bir belgenin ba\u015F\u0131n\u0131 veya sonunu ba\u015Flatmayan github flavored tablolar\u0131n etraf\u0131nda bo\u015F bir sat\u0131r olmal\u0131d\u0131r."},"escape-yaml-special-characters":{name:"YAML \xD6zel Karakterlerine Ka\xE7\u0131\u015F \u0130\u015Flemi Yap",description:`YAML i\xE7indeki bo\u015Flukla beraber gelen iki nokta \xFCst \xFCste (:), tek t\u0131rnak (') ve \xE7ift t\u0131rnak (") karakterlerini ka\xE7\u0131\u015F i\u015Flemine tabi tutar.`,"try-to-escape-single-line-arrays":{name:"Tek Sat\u0131rl\u0131k Listeleri Ka\xE7\u0131\u015F Denemesi",description:'Bir dizinin "[" ile ba\u015Flad\u0131\u011F\u0131n\u0131, "]" ile bitti\u011Fini ve \xF6\u011Felerin "," ile ayr\u0131ld\u0131\u011F\u0131n\u0131 varsayarak dizi de\u011Ferlerini ka\xE7\u0131\u015F i\u015Flemine tabi tutmaya \xE7al\u0131\u015F\u0131r.'}},"file-name-heading":{name:"Dosya Ad\u0131 Ba\u015Fl\u0131\u011F\u0131",description:"E\u011Fer hi\xE7 H1 ba\u015Fl\u0131\u011F\u0131 yoksa dosya ad\u0131n\u0131 H1 ba\u015Fl\u0131\u011F\u0131 olarak ekler."},"footnote-after-punctuation":{name:"Noktalama \u0130\u015Faretinden Sonra Dipnot",description:"Dipnot referanslar\u0131n\u0131n noktalama i\u015Faretinden \xF6nce de\u011Fil, sonra yerle\u015Ftirildi\u011Finden emin olur."},"force-yaml-escape":{name:"YAML Ka\xE7\u0131\u015F\u0131n\u0131 Zorla",description:"Belirtilen YAML anahtarlar\u0131 i\xE7in ka\xE7\u0131\u015F de\u011Ferleri.","force-yaml-escape-keys":{name:"Anahtarlarda YAML Ka\xE7\u0131\u015F\u0131n\u0131 Zorla",description:"Yeni bir sat\u0131r karakteri ile ayr\u0131lm\u0131\u015F belirtilen YAML anahtarlar\u0131nda YAML ka\xE7\u0131\u015F karakterini kullan\u0131r, e\u011Fer zaten ka\xE7\u0131\u015F yap\u0131lmam\u0131\u015Fsa. YAML dizilerinde kullanmay\u0131n"}},"format-tags-in-yaml":{name:"YAML Etiketlerini Bi\xE7imlendir",description:"YAML \xF6n madde i\xE7indeki etiketlerden hashtagleri kald\u0131r\u0131r, \xE7\xFCnk\xFC bunlar etiketleri ge\xE7ersiz k\u0131lar."},"format-yaml-array":{name:"YAML Dizisini Bi\xE7imlendir",description:"Normal YAML dizilerinin \xE7ok sat\u0131rl\u0131 veya tek sat\u0131rl\u0131 olarak bi\xE7imlendirilmesine izin verir ve `tags` ve `aliases` baz\u0131 Obsidian \xF6zg\xFC \xF6zelliklerine sahip YAML formatlar\u0131nda bulunabilir. **Not: Tek giri\u015Fli bir diziden birden fazla giri\u015Fi olan tek sat\u0131rl\u0131 bir diziye ge\xE7mek ayn\u0131d\u0131r, tek fark \xE7ok sat\u0131rl\u0131 bir dizi olmas\u0131d\u0131r.**","alias-key":{name:"YAML takma adlar\u0131 b\xF6l\xFCm\xFCn\xFC bi\xE7imlendir",description:"YAML takma adlar\u0131 b\xF6l\xFCm\xFC i\xE7in bi\xE7imlendirmeyi a\xE7ar. Bu se\xE7ene\u011Fi `YAML Title Alias` kural\u0131yla birlikte kullanmaman\u0131z \xF6nerilir \xE7\xFCnk\xFC birlikte d\xFCzg\xFCn \xE7al\u0131\u015Fmayabilir veya farkl\u0131 bi\xE7imlendirme stilleri se\xE7ilmi\u015F olabilir, bu beklenmeyen sonu\xE7lara yol a\xE7abilir."},"tag-key":{name:"YAML etiketleri b\xF6l\xFCm\xFCn\xFC bi\xE7imlendir",description:"YAML etiketleri b\xF6l\xFCm\xFC i\xE7in bi\xE7imlendirmeyi a\xE7ar."},"default-array-style":{name:"Varsay\u0131lan YAML dizi b\xF6l\xFCm\xFC stili",description:"`tags`, `aliases` veya `Force key values to be single-line arrays` ve `Force key values to be multi-line arrays` olmayan di\u011Fer YAML dizilerinin stili"},"default-array-keys":{name:"YAML dizi b\xF6l\xFCmlerini bi\xE7imlendir",description:"Normal YAML dizileri i\xE7in bi\xE7imlendirmeyi a\xE7ar"},"force-single-line-array-style":{name:"Anahtar de\u011Ferlerini tek sat\u0131rl\u0131 dizilere zorla",description:"Yeni sat\u0131r ile ayr\u0131lan anahtarlar i\xE7in YAML dizisini tek sat\u0131rl\u0131 formatta olmaya zorlar (bu se\xE7ene\u011Fi devre d\u0131\u015F\u0131 b\u0131rakmak i\xE7in bo\u015F b\u0131rak\u0131n)"},"force-multi-line-array-style":{name:"Anahtar de\u011Ferlerini \xE7ok sat\u0131rl\u0131 dizilere zorla",description:"Yeni sat\u0131r ile ayr\u0131lan anahtarlar i\xE7in YAML dizisini \xE7ok sat\u0131rl\u0131 formatta olmaya zorlar (bu se\xE7ene\u011Fi devre d\u0131\u015F\u0131 b\u0131rakmak i\xE7in bo\u015F b\u0131rak\u0131n)"}},"header-increment":{name:"Ba\u015Fl\u0131k Art\u0131r\u0131m\u0131",description:"Ba\u015Fl\u0131k seviyeleri bir seferde sadece bir seviye artmal\u0131d\u0131r","start-at-h2":{name:"Ba\u015Fl\u0131k Art\u0131r\u0131m\u0131n\u0131 Ba\u015Fl\u0131k Seviyesi 2\u2019de Ba\u015Flat",description:"Bir dosyadaki minimum ba\u015Fl\u0131k seviyesini ba\u015Fl\u0131k seviyesi 2 yapar ve buna g\xF6re t\xFCm ba\u015Fl\u0131klar\u0131 kayd\u0131r\u0131r, b\xF6ylece ba\u015Fl\u0131k art\u0131\u015F\u0131 seviye 2 ba\u015Fl\u0131\u011F\u0131 ile ba\u015Flar."}},"heading-blank-lines":{name:"Ba\u015Fl\u0131k Bo\u015F Sat\u0131rlar\u0131",description:"T\xFCm ba\u015Fl\u0131klar\u0131n hem \xF6ncesinde hem de sonras\u0131nda birer bo\u015F sat\u0131r olmal\u0131d\u0131r (ba\u015Fl\u0131k belgenin ba\u015F\u0131nda veya sonunda oldu\u011Funda bu durum ge\xE7erli de\u011Fildir).",bottom:{name:"Alt",description:"Ba\u015Fl\u0131klar\u0131n sonras\u0131na bo\u015F sat\u0131r ekler"},"empty-line-after-yaml":{name:"YAML ve Ba\u015Fl\u0131k Aras\u0131nda Bo\u015F Sat\u0131r",description:"YAML \xF6n madde ve ba\u015Fl\u0131k aras\u0131ndaki bo\u015F sat\u0131r\u0131 korur"}},"headings-start-line":{name:"Ba\u015Fl\u0131klar Sat\u0131r\u0131 Ba\u015Flat\u0131r",description:"Bir sat\u0131r\u0131 ba\u015Flatmayan ba\u015Fl\u0131klar\u0131n \xF6ncesi bo\u015Fluklar\u0131 kald\u0131r\u0131l\u0131r ki ba\u015Fl\u0131klar ba\u015Fl\u0131k olarak tan\u0131nabilsin."},"insert-yaml-attributes":{name:"YAML \xD6zniteliklerini Ekle",description:"Verilen YAML \xF6zniteliklerini YAML \xF6n maddesine ekler. Her \xF6zniteli\u011Fi tek bir sat\u0131ra koyun.","text-to-insert":{name:"Eklenecek metin",description:"YAML \xF6n maddesine eklenen metin"}},"line-break-at-document-end":{name:"Belge Sonunda Sat\u0131r Sonu",description:"Bir belgenin sonunda tam olarak bir sat\u0131r sonu oldu\u011Funu garanti eder."},"move-footnotes-to-the-bottom":{name:"Dipnotlar\u0131 Altbilgiye Ta\u015F\u0131",description:"T\xFCm dipnotlar\u0131 belgenin alt\u0131na ta\u015F\u0131r."},"move-math-block-indicators-to-their-own-line":{name:"Matematik Blok G\xF6stergelerini Kendi Sat\u0131rlar\u0131na Ta\u015F\u0131",description:'Tek sat\u0131rl\u0131 matematik i\xE7in ka\xE7 dolar i\u015Faretinin bir matematik blo\u011Funu g\xF6sterdi\u011Fini belirlemek i\xE7in "Bir Matematik Blo\u011Fu G\xF6stermek \u0130\xE7in Dolar \u0130\u015Fareti Say\u0131s\u0131"n\u0131 kullanarak t\xFCm ba\u015Flang\u0131\xE7 ve biti\u015F matematik blo\u011Fu g\xF6stergelerini kendi sat\u0131rlar\u0131na ta\u015F\u0131y\u0131n.'},"move-tags-to-yaml":{name:"Etiketleri YAML'a Ta\u015F\u0131",description:"T\xFCm etiketleri belgenin YAML \xF6n maddesine ta\u015F\u0131r.","how-to-handle-existing-tags":{name:"Metin i\xE7indeki etiket i\u015Flemi",description:"\xD6n maddeye ta\u015F\u0131nd\u0131ktan sonra dosyan\u0131n i\xE7eri\u011Finde bulunan ve yoksay\u0131lmayan etiketlerle ne yap\u0131laca\u011F\u0131"},"tags-to-ignore":{name:"Yoksay\u0131lacak etiketler",description:"\u0130\xE7erik g\xF6vdesindeki hashtag'lerden kald\u0131rma etkinle\u015Ftirilmi\u015Fse, etiketler dizisine ta\u015F\u0131nmayacak veya i\xE7erik g\xF6vdesinden kald\u0131r\u0131lmayacak etiketler. Her etiket yeni bir sat\u0131rda ve `#` olmadan olmal\u0131d\u0131r. **Etiket ad\u0131nda hashtag i\xE7ermedi\u011Finizden emin olun.**"}},"no-bare-urls":{name:"Yal\u0131n URL'ler Olmas\u0131n",description:"Yal\u0131n URL'leri a\xE7\u0131l\u0131 ayra\xE7lar ile ku\u015Fat\u0131r, tek veya \xE7ift t\u0131rnak, k\xF6\u015Feli parantez veya e\u011Fik kesme i\u015Fareti i\xE7inde de\u011Filse."},"ordered-list-style":{name:"S\u0131ral\u0131 Liste Stili",description:"S\u0131ral\u0131 listelerin belirtilen stili izlemesini sa\u011Flar. **Not: 2 bo\u015Fluk veya 1 sekme bir girinti seviyesi olarak kabul edilir.**","number-style":{name:"Numara Stili",description:"S\u0131ral\u0131 liste g\xF6stergelerinde kullan\u0131lan numara stili"},"list-end-style":{name:"S\u0131ral\u0131 Liste G\xF6sterge Sonu Stili",description:"Bir s\u0131ral\u0131 liste g\xF6stergesinin biti\u015F karakteri"}},"paragraph-blank-lines":{name:"Paragraf Bo\u015F Sat\u0131rlar\u0131",description:"T\xFCm paragraflar\u0131n hem \xF6nce hem sonra tam olarak bir bo\u015F sat\u0131r\u0131 olmal\u0131d\u0131r."},"prevent-double-checklist-indicator-on-paste":{name:"Yap\u0131\u015Ft\u0131rmada \xC7ift Kontrol Listesi G\xF6stergesini \xD6nle",description:"Kurs\xF6r\xFCn dosyadaki sat\u0131rda bir kontrol listesi g\xF6stergesi varsa, yap\u0131\u015Ft\u0131r\u0131lacak metinden ba\u015Flang\u0131\xE7 kontrol listesi g\xF6stergesini kald\u0131r\u0131r"},"prevent-double-list-item-indicator-on-paste":{name:"Yap\u0131\u015Ft\u0131rmada \xC7ift Liste \xD6\u011Fesi G\xF6stergesini \xD6nle",description:"Kurs\xF6r\xFCn dosyadaki sat\u0131rda bir liste g\xF6stergesi varsa, yap\u0131\u015Ft\u0131r\u0131lacak metinden ba\u015Flang\u0131\xE7 listesi g\xF6stergesini kald\u0131r\u0131r"},"proper-ellipsis-on-paste":{name:"Yap\u0131\u015Ft\u0131rmada Uygun \xDC\xE7 Nokta",description:"Yap\u0131\u015Ft\u0131r\u0131lacak metinde aralar\u0131nda bo\u015Fluk olsa bile ard\u0131\u015F\u0131k \xFC\xE7 noktay\u0131, \xFC\xE7 nokta karakteriyle ile de\u011Fi\u015Ftirir"},"proper-ellipsis":{name:"Uygun \xDC\xE7 Nokta",description:"Ard\u0131\u015F\u0131k \xFC\xE7 tane noktay\u0131, \xFC\xE7 nokta karakteriyle de\u011Fi\u015Ftirir."},"quote-style":{name:"\xFC\xE7 nokta karakteriyle",description:"G\xF6vde i\xE7eri\u011Findeki al\u0131nt\u0131lar\u0131 belirtilen tek ve \xE7ift al\u0131nt\u0131 stillerine g\xFCnceller.","single-quote-enabled":{name:"`Tek Al\u0131nt\u0131 Stili` Kullan\u0131m\u0131",description:"Se\xE7ilen tek al\u0131nt\u0131 stilinin kullan\u0131laca\u011F\u0131n\u0131 belirtir."},"single-quote-style":{name:"Tek Al\u0131nt\u0131 Stili",description:"Kullan\u0131lacak tek al\u0131nt\u0131 stilidir."},"double-quote-enabled":{name:"`\xC7ift Al\u0131nt\u0131 Stili` Kullan\u0131m\u0131",description:"Se\xE7ilen \xE7ift al\u0131nt\u0131 stilinin kullan\u0131laca\u011F\u0131n\u0131 belirtir."},"double-quote-style":{name:"\xC7ift Al\u0131nt\u0131 Stili",description:"Kullan\u0131lacak \xE7ift al\u0131nt\u0131 stilidir."}},"re-index-footnotes":{name:"Dipnotlar\u0131 Yeniden \u0130ndeksle",description:"Dipnot anahtarlar\u0131n\u0131 ve dipnotlar\u0131, olu\u015Fum s\u0131ras\u0131na g\xF6re yeniden indeksler. **Not: Bir anahtar i\xE7in birden fazla dipnot varsa, bu kural \xE7al\u0131\u015Fmaz.**"},"remove-consecutive-list-markers":{name:"Ard\u0131\u015F\u0131k Liste \u0130\u015Faretlerini Kald\u0131r",description:"Ard\u0131\u015F\u0131k liste i\u015Faretlerini kald\u0131r\u0131r. Liste \xF6\u011Felerini kopyala-yap\u0131\u015Ft\u0131r yaparken kullan\u0131\u015Fl\u0131d\u0131r."},"remove-empty-lines-between-list-markers-and-checklists":{name:"Liste \u0130\u015Faretleri ve Kontrol Listeleri Aras\u0131ndaki Bo\u015F Sat\u0131rlar\u0131 Kald\u0131r",description:"Liste i\u015Faretleri ve kontrol listeleri aras\u0131nda bo\u015F sat\u0131r olmamal\u0131d\u0131r."},"remove-empty-list-markers":{name:"Bo\u015F Liste \u0130\u015Faret\xE7ilerini Kald\u0131r",description:"Bo\u015F liste i\u015Faret\xE7ilerini, yani i\xE7eriksiz liste \xF6\u011Felerini kald\u0131r\u0131r."},"remove-hyphenated-line-breaks":{name:"Tireli Sat\u0131r Sonlar\u0131n\u0131 Kald\u0131r",description:"Removes hyphenated line breaks. Useful when pasting text from textbooks."},"remove-hyphens-on-paste":{name:"Yap\u0131\u015Ft\u0131r\u0131rken Tireleri Kald\u0131r",description:"Yap\u0131\u015Ft\u0131r\u0131lacak metindeki tireleri kald\u0131r\u0131r"},"remove-leading-or-trailing-whitespace-on-paste":{name:"Yap\u0131\u015Ft\u0131rda \xD6ndeki veya Sondaki Bo\u015Fluklar\u0131 Kald\u0131r",description:"Yap\u0131\u015Ft\u0131r\u0131lacak metnin ba\u015F\u0131ndaki sekme olmayan bo\u015Fluklar\u0131 ve sonundaki t\xFCm bo\u015Fluklar\u0131 kald\u0131r\u0131r"},"remove-leftover-footnotes-from-quote-on-paste":{name:"Yap\u0131\u015Ft\u0131rmada Al\u0131nt\u0131dan Kalan Dipnotlar\u0131 Kald\u0131r",description:"Yap\u0131\u015Ft\u0131r\u0131lacak metinden herhangi bir kal\u0131nt\u0131 dipnot referanslar\u0131n\u0131 kald\u0131r\u0131r"},"remove-link-spacing":{name:"Link Aral\u0131\u011F\u0131n\u0131 Kald\u0131r",description:"Link metninin etraf\u0131ndaki bo\u015Fluklar\u0131 kald\u0131r\u0131r."},"remove-multiple-blank-lines-on-paste":{name:"Yap\u0131\u015Ft\u0131r\u0131rken Birden Fazla Bo\u015F Sat\u0131r\u0131 Kald\u0131r",description:"Metnin yap\u0131\u015Ft\u0131r\u0131lmas\u0131 i\xE7in birden \xE7ok bo\u015F sat\u0131r\u0131 tek bir bo\u015F sat\u0131ra s\u0131k\u0131\u015Ft\u0131r\u0131r"},"remove-multiple-spaces":{name:"Birden Fazla Bo\u015Flu\u011Fu Kald\u0131r",description:"\u0130ki veya daha fazla ard\u0131\u015F\u0131k bo\u015Flu\u011Fu kald\u0131r\u0131r. Sat\u0131r\u0131n ba\u015F\u0131ndaki ve sonundaki bo\u015Fluklar\u0131 g\xF6rmezden gelir. "},"remove-space-around-characters":{name:"Karakterler Etraf\u0131ndaki Bo\u015Flu\u011Fu Kald\u0131r",description:"Belirli karakterlerin bo\u015Fluklarla (tek bo\u015Fluk veya sekme) \xE7evrelenmemesini sa\u011Flar. **Not: Bu, baz\u0131 durumlarda indirim bi\xE7imiyle ilgili sorunlara neden olabilir.**","include-fullwidth-forms":{name:"Tam Geni\u015Flikte Formlar\u0131 Dahil Et",description:'Tam Geni\u015Flikte Formlar Unicode blo\u011Funu dahil eder'},"include-cjk-symbols-and-punctuation":{name:"CJK Sembol ve Noktalama \u0130\u015Faretlerini Dahil Et",description:'CJK Sembol ve Noktalama Unicode blo\u011Funu dahil eder'},"include-dashes":{name:"Tireleri Dahil Et",description:"En tire (\u2013) ve em tireyi (\u2014) dahil eder"},"other-symbols":{name:"Di\u011Fer Semboller",description:"Dahil edilecek di\u011Fer semboller"}},"remove-space-before-or-after-characters":{name:"Karakterlerden \xD6nce veya Sonra Bo\u015Flu\u011Fu Kald\u0131r",description:"Belirtilen karakterlerden \xF6nceki ve sonraki bo\u015Flu\u011Fu kald\u0131r\u0131r. **Not: bu durum baz\u0131 durumlarda markdown format\u0131nda sorunlara neden olabilir.**","characters-to-remove-space-before":{name:"\xD6nceki Bo\u015Flu\u011Fu Kald\u0131r\u0131lacak Karakterler",description:"Belirtilen karakterlerden \xF6nceki bo\u015Flu\u011Fu kald\u0131r\u0131r. **Not: karakter listesinde `{` veya `}` kullanmak, sahne arkas\u0131nda yoksayma s\xF6zdizimi kullan\u0131ld\u0131\u011F\u0131 i\xE7in dosyalar\u0131 beklenmedik \u015Fekilde etkiler.**"},"characters-to-remove-space-after":{name:"Sonraki Bo\u015Flu\u011Fu Kald\u0131r\u0131lacak Karakterler",description:"Belirtilen karakterlerden sonraki bo\u015Flu\u011Fu kald\u0131r\u0131r. **Not: karakter listesinde `{` veya `}` kullanmak, sahne arkas\u0131nda yoksayma s\xF6zdizimi kullan\u0131ld\u0131\u011F\u0131 i\xE7in dosyalar\u0131 beklenmedik \u015Fekilde etkiler.**"}},"remove-trailing-punctuation-in-heading":{name:"Ba\u015Fl\u0131klardaki Son Noktalama \u0130\u015Faretlerini Kald\u0131r",description:"Belirtilen noktalama i\u015Faretlerini ba\u015Fl\u0131klar\u0131n sonundan kald\u0131r\u0131r ve [HTML varl\u0131k referanslar\u0131n\u0131n](https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references) sonundaki noktal\u0131 virg\xFCl\xFC yoksayar.","punctuation-to-remove":{name:"Sondaki Noktalama",description:"Dosyadaki ba\u015Fl\u0131klardan kald\u0131r\u0131lacak noktalama i\u015Faretleri."}},"remove-yaml-keys":{name:"YAML Anahtarlar\u0131n\u0131 Kald\u0131r",description:"Belirtilen YAML anahtarlar\u0131n\u0131 kald\u0131r\u0131r","yaml-keys-to-remove":{name:"Kald\u0131r\u0131lacak YAML Anahtarlar\u0131",description:"YAML \xF6n maddesinden iki nokta \xFCst \xFCste ile veya olmadan kald\u0131r\u0131lacak YAML anahtarlar\u0131"}},"space-after-list-markers":{name:"Liste \u0130\u015Faretlerinden Sonra Bo\u015Fluk",description:"Liste i\u015Faretleri ve onay kutular\u0131ndan sonra tek bir bo\u015Fluk olmal\u0131d\u0131r"},"space-between-chinese-japanese-or-korean-and-english-or-numbers":{name:"\xC7ince, Japonca veya Korece ve \u0130ngilizce veya Say\u0131lar Aras\u0131nda Bo\u015Fluk",description:"\xC7ince, Japonca veya Korece ve \u0130ngilizce veya say\u0131lar aras\u0131nda tek bir bo\u015Fluk olmas\u0131 gerekti\u011Fini sa\u011Flar. Bu [kurallar\u0131](https://github.com/sparanoid/chinese-copywriting-guidelines) takip eder"},"strong-style":{name:"Kal\u0131n Stil",description:"Kal\u0131n stilin tutarl\u0131 oldu\u011Funu garanti eder.",style:{name:"Stil",description:"Kal\u0131n/yo\u011Fun i\xE7eri\u011Fi belirtmek i\xE7in kullan\u0131lan stil"}},"trailing-spaces":{name:"Sondaki bo\u015Fluklar",description:"Her sat\u0131r\u0131n sonundaki fazladan bo\u015Fluklar\u0131 kald\u0131r\u0131r.","twp-space-line-break":{name:"\u0130ki Bo\u015Fluklu Sat\u0131r Sonu",description:'Bir sat\u0131r sonunu takiben iki bo\u015Flu\u011Fu g\xF6z ard\u0131 et ("\u0130ki Bo\u015Fluk Kural\u0131").'}},"two-spaces-between-lines-with-content":{name:"\u0130\xE7eri\u011Fi Olan Sat\u0131rlar Aras\u0131nda \u0130ki Bo\u015Fluk",description:"\u0130\xE7eri\u011Fi devam eden sat\u0131rlar\u0131n sonuna paragraflar, blok al\u0131nt\u0131lar\u0131 ve liste \xF6\u011Feleri i\xE7in iki bo\u015Fluk eklenmesini sa\u011Flar"},"unordered-list-style":{name:"S\u0131ras\u0131z Liste Stili",description:"S\u0131ras\u0131z listelerin belirtilen stili takip etti\u011Finden emin olur.","list-style":{name:"Liste \xF6\u011Fesi stili",description:"S\u0131ras\u0131z listelerde kullan\u0131lacak liste \xF6\u011Fesi stili"}},"yaml-key-sort":{name:"YAML Anahtar S\u0131ralamas\u0131",description:"YAML anahtarlar\u0131n\u0131 belirtilen s\u0131ra ve \xF6nceli\u011Fe g\xF6re s\u0131ralar. **Not: bo\u015F sat\u0131rlar\u0131 da kald\u0131rabilir.**","yaml-key-priority-sort-order":{name:"YAML Anahtar \xD6ncelik S\u0131ralama D\xFCzeni",description:"Her sat\u0131rda bir tane olacak \u015Fekilde anahtarlar\u0131n hangi s\u0131rayla s\u0131ralanaca\u011F\u0131"},"priority-keys-at-start-of-yaml":{name:"\xD6ncelikli Anahtarlar YAML'\u0131n Ba\u015F\u0131nda",description:"YAML Anahtar \xD6ncelik S\u0131ralama D\xFCzeni, YAML \xF6n maddesinin ba\u015F\u0131nda yer al\u0131r"},"yaml-sort-order-for-other-keys":{name:"Di\u011Fer Anahtarlar \u0130\xE7in YAML S\u0131ralama D\xFCzeni",description:"YAML Anahtar \xD6ncelik S\u0131ralama D\xFCzeni metin alan\u0131nda bulunmayan anahtarlar\u0131 nas\u0131l s\u0131ralayaca\u011F\u0131"}},"yaml-timestamp":{name:"YAML Zaman Damgas\u0131",description:"Dosyan\u0131n son d\xFCzenlendi\u011Fi tarihi YAML \xF6n maddesinde takip eder. Tarihler dosya metadatas\u0131ndan al\u0131n\u0131r.","date-created":{name:"Olu\u015Fturma Tarihi",description:"Dosyan\u0131n olu\u015Fturma tarihini ekler"},"date-created-key":{name:"Olu\u015Fturma Tarihi Anahtar\u0131",description:"Olu\u015Fturma tarihi i\xE7in hangi YAML anahtar\u0131n\u0131 kullanaca\u011F\u0131"},"force-retention-of-create-value":{name:"Olu\u015Fturma Tarihi Anahtar De\u011Ferinin Korunmas\u0131n\u0131 Zorla",description:"Dosya metadatas\u0131 yerine YAML \xF6n maddesindeki tarihi yeniden kullan\u0131r, bu da dosya metadatas\u0131ndaki de\u011Fi\u015Fikliklerin de\u011Ferin farkl\u0131 bir de\u011Fere de\u011Fi\u015Fmesine neden olmas\u0131n\u0131 \xF6nler."},"date-modified":{name:"De\u011Fi\u015Ftirme Tarihi",description:"Dosyan\u0131n son de\u011Fi\u015Ftirildi\u011Fi tarihi ekler"},"date-modified-key":{name:"De\u011Fi\u015Ftirme Tarihi Anahtar\u0131",description:"De\u011Fi\u015Ftirme tarihi i\xE7in hangi YAML anahtar\u0131n\u0131 kullanaca\u011F\u0131"},format:{name:"Format",description:"Kullan\u0131lacak Zaman format\u0131 (bak\u0131n\u0131z [Moment format options](https://momentjscom.readthedocs.io/en/latest/moment/04-displaying/01-format/))"}},"yaml-title-alias":{name:"YAML Ba\u015Fl\u0131k Takma Ad\u0131",description:"Dosyan\u0131n ba\u015Fl\u0131\u011F\u0131n\u0131 YAML \xF6n maddesinin takma adlar\u0131 b\xF6l\xFCm\xFCne ekler. Ba\u015Fl\u0131\u011F\u0131 ilk H1 veya dosya ad\u0131ndan al\u0131r.","preserve-existing-alias-section-style":{name:"Mevcut takma adlar b\xF6l\xFCm stilini koru",description:"Ayarlan\u0131rsa, `YAML takma adlar b\xF6l\xFCm\xFC stili` ayar\u0131 yaln\u0131zca yeni olu\u015Fturulan b\xF6l\xFCmlere uygulan\u0131r"},"keep-alias-that-matches-the-filename":{name:"Dosya ad\u0131na uyan takma ad\u0131 koru",description:"Bu t\xFCr takma adlar genellikle gereksizdir"},"use-yaml-key-to-keep-track-of-old-filename-or-heading":{name:"`linter-yaml-title-alias` YAML anahtar\u0131n\u0131 kullanarak eski dosya ad\u0131 ve ba\u015Fl\u0131k de\u011Fi\u015Fikliklerini takip et",description:"Ayarlan\u0131rsa, ilk H1 ba\u015Fl\u0131\u011F\u0131 de\u011Fi\u015Fti\u011Finde veya ilk H1 yoksa dosya ad\u0131 de\u011Fi\u015Fti\u011Finde, bu anahtarda saklanan eski takma ad, takma adlar dizisine yeni bir giri\u015F eklemek yerine yeni de\u011Ferle de\u011Fi\u015Ftirilir"}},"yaml-title":{name:"YAML Ba\u015Fl\u0131k",description:"Dosyan\u0131n ba\u015Fl\u0131\u011F\u0131n\u0131 YAML \xF6n maddesine ekler. Ba\u015Fl\u0131k se\xE7ilen moda g\xF6re al\u0131n\u0131r.","title-key":{name:"Ba\u015Fl\u0131k Anahtar\u0131",description:"Ba\u015Fl\u0131k i\xE7in hangi YAML anahtar\u0131n\u0131 kullanaca\u011F\u0131"},mode:{name:"Mod",description:"Ba\u015Fl\u0131\u011F\u0131 almak i\xE7in kullan\u0131lacak y\xF6ntem"}}},enums:{"Title Case":"Ba\u015F Harfleri B\xFCy\xFCk","ALL CAPS":"T\xDCM\xDC B\xDCY\xDCK HARF","First letter":"\u0130lk Harf",".":".",")":")",ERROR:"hata",TRACE:"i\u015Faret",DEBUG:"hata ay\u0131klama",INFO:"bilgi",WARN:"uyar\u0131",SILENT:"sessiz",ascending:"artan",lazy:"tembel",Nothing:"Hi\xE7biri","Remove hashtag":"Hashtagi Kald\u0131r","Remove whole tag":"T\xFCm Etiketi Kald\u0131r",asterisk:"y\u0131ld\u0131z",underscore:"alt \xE7izgi",consistent:"tutarl\u0131","-":"-","*":"*","+":"+",space:"bo\u015Fluk","no space":"bo\u015Fluk yok",None:"Yok","Ascending Alphabetical":"Artan Alfabetik","Descending Alphabetical":"Azalan Alfabetik","multi-line":"\xE7oklu-sat\u0131r","single-line":"tek-sat\u0131r","single string to single-line":"tek dizeden tek sat\u0131ra","single string to multi-line":"tek dizeden \xE7ok sat\u0131ra","single string comma delimited":"virg\xFClle ayr\u0131lm\u0131\u015F tek dize","single string space delimited":"bo\u015Flukla ayr\u0131lm\u0131\u015F tek dize","single-line space delimited":"bo\u015Flukla ayr\u0131lm\u0131\u015F tek sat\u0131r","first-h1":"\u0130lk H1","first-h1-or-filename-if-h1-missing":"\u0130lk H1 veya H1 Eksikse Dosya Ad\u0131",filename:"Dosya Ad\u0131","''":"''","\u2018\u2019":"\u2018\u2019",'""':'""',"\u201C\u201D":"\u201C\u201D"}};var $d={};var Wd={commands:{"lint-file":{name:"\u683C\u5F0F\u5316\u5F53\u524D\u6587\u4EF6","error-message":"\u683C\u5F0F\u5316\u5F53\u524D\u6587\u4EF6\u65F6\u51FA\u9519"},"lint-file-unless-ignored":{name:"\u683C\u5F0F\u5316\u6240\u6709\u6587\u4EF6\uFF08\u9664\u4E86\u88AB\u5FFD\u7565\u7684\u6587\u4EF6\uFF09"},"lint-all-files":{name:"\u683C\u5F0F\u5316\u6240\u6709\u6587\u4EF6","error-message":"\u683C\u5F0F\u5316\u6240\u6709\u6587\u4EF6\u65F6\u51FA\u9519","success-message":"\u5DF2\u683C\u5F0F\u5316\u6240\u6709\u6587\u4EF6","errors-message-singular":"\u5DF2\u683C\u5F0F\u5316\u6240\u6709\u6587\u4EF6\uFF0C\u5176\u4E2D\u6709 1 \u4E2A\u9519\u8BEF","errors-message-plural":"\u5DF2\u683C\u5F0F\u5316\u6240\u6709\u6587\u4EF6\uFF0C\u5176\u4E2D\u6709 {NUM} \u4E2A\u9519\u8BEF","start-message":"\u8FD9\u5C06\u6539\u52A8\u6240\u6709\u6587\u4EF6\uFF0C\u5305\u62EC\u5B50\u6587\u4EF6\u5939\u4E2D\u7684\u6587\u4EF6\uFF0C\u53EF\u80FD\u4F1A\u5F15\u5165\u9519\u8BEF","submit-button-text":"\u683C\u5F0F\u5316\u6240\u6709\u6587\u4EF6","submit-button-notice-text":"\u6B63\u5728\u683C\u5F0F\u5316\u6240\u6709\u6587\u4EF6..."},"lint-all-files-in-folder":{name:"\u683C\u5F0F\u5316\u6587\u4EF6\u5939\u4E2D\u7684\u6240\u6709\u6587\u4EF6","start-message":"\u8FD9\u5C06\u6539\u52A8\u6587\u4EF6\u5939 {FOLDER_NAME} \u4E2D\u7684\u6240\u6709\u6587\u4EF6\uFF0C\u5305\u62EC\u5B50\u6587\u4EF6\u5939\u4E2D\u7684\u6587\u4EF6\uFF0C\u53EF\u80FD\u4F1A\u5F15\u5165\u9519\u8BEF","submit-button-text":"\u683C\u5F0F\u5316\u6587\u4EF6\u5939 {FOLDER_NAME} \u4E2D\u7684\u6240\u6709\u6587\u4EF6","submit-button-notice-text":"\u6B63\u5728\u683C\u5F0F\u5316\u6587\u4EF6\u5939 {FOLDER_NAME} \u4E2D\u7684\u6240\u6709\u6587\u4EF6...","error-message":"\u683C\u5F0F\u5316\u6587\u4EF6\u5939\u4E2D\u7684\u6240\u6709\u6587\u4EF6\u65F6\u51FA\u9519","success-message":"\u5DF2\u683C\u5F0F\u5316\u6587\u4EF6\u5939 {FOLDER_NAME} \u4E2D\u7684\u6240\u6709 {NUM} \u4E2A\u6587\u4EF6","message-singular":"\u5DF2\u683C\u5F0F\u5316\u6587\u4EF6\u5939 {FOLDER_NAME} \u4E2D\u7684\u6240\u6709 {NUM} \u4E2A\u6587\u4EF6\uFF0C\u5176\u4E2D\u6709 1 \u4E2A\u9519\u8BEF","message-plural":"\u5DF2\u683C\u5F0F\u5316\u6587\u4EF6\u5939 {FOLDER_NAME} \u4E2D\u7684 {FILE_COUNT} \u4E2A\u6587\u4EF6\uFF0C\u5176\u4E2D\u6709 {ERROR_COUNT} \u4E2A\u9519\u8BEF."},"paste-as-plain-text":{name:"\u7C98\u8D34\u4E3A\u7EAF\u6587\u672C\u4E14\u4E0D\u63D0\u9192"},"lint-file-pop-up-menu-text":{name:"\u683C\u5F0F\u5316\u6587\u4EF6"},"lint-folder-pop-up-menu-text":{name:"\u683C\u5F0F\u5316\u6587\u4EF6\u5939"}},logs:{"plugin-load":"\u6B63\u5728\u52A0\u8F7D\u63D2\u4EF6","plugin-unload":"\u6B63\u5728\u5378\u8F7D\u63D2\u4EF6","folder-lint":"\u6B63\u5728\u683C\u5F0F\u5316\u6587\u4EF6\u5939","linter-run":"\u6B63\u5728\u8FD0\u884C Linter","paste-link-warning":"\u4E2D\u6B62\u7C98\u8D34\u683C\u5F0F\u5316 \uFF0C\u56E0\u4E3A\u526A\u8D34\u677F\u5185\u5BB9\u662F\u4E00\u4E2A\u94FE\u63A5\uFF0C\u8FD9\u6837\u505A\u5C06\u907F\u514D\u4E0E\u5176\u4ED6\u4FEE\u6539\u7C98\u8D34\u884C\u4E3A\u7684\u63D2\u4EF6\u53D1\u751F\u51B2\u7A81","see-console":"\u8BF7\u67E5\u770B\u63A7\u5236\u53F0\u4EE5\u83B7\u53D6\u66F4\u591A\u4FE1\u606F","unknown-error":"\u683C\u5F0F\u5316\u8FC7\u7A0B\u53D1\u751F\u672A\u77E5\u9519\u8BEF","moment-locale-not-found":"\u5C1D\u8BD5\u5C06 Moment.js \u7684\u9ED8\u8BA4\u5730\u533A\u8BED\u8A00\u5207\u6362\u5230 {MOMENT_LOCALE}, \u5B9E\u9645\u5207\u6362\u5230 {CURRENT_LOCALE}","file-change-lint-message-start":"\u683C\u5F0F\u5316\u5DF2\u5B8C\u6210","pre-rules":"\u6BD4\u6B63\u5E38\u89C4\u5219\u4F18\u5148\u7EA7\u66F4\u9AD8\u7684\u89C4\u5219","post-rules":"\u6BD4\u6B63\u5E38\u89C4\u5219\u4F18\u5148\u7EA7\u66F4\u4F4E\u7684\u89C4\u5219","rule-running":"\u6B63\u5728\u8FD0\u884C\u89C4\u5219","custom-regex":"\u81EA\u5B9A\u4E49\u6B63\u5219\u8868\u8FBE\u5F0F\u89C4\u5219","running-custom-regex":"\u6B63\u5728\u8FD0\u884C\u81EA\u5B9A\u4E49\u6B63\u5219\u8868\u8FBE\u5F0F\u89C4\u5219","running-custom-lint-command":"\u6B63\u5728\u8FD0\u884C\u81EA\u5B9A\u4E49\u683C\u5F0F\u5316\u547D\u4EE4","custom-lint-duplicate-warning":'\u4F60\u4E0D\u80FD\u8FD0\u884C\u540C\u4E00\u4E2A\u81EA\u5B9A\u4E49\u89C4\u5219 ("{COMMAND_NAME}") \u4E24\u6B21',"custom-lint-error-message":"\u81EA\u5B9A\u4E49\u683C\u5F0F\u5316\u547D\u4EE4","disabled-text":"\u5DF2\u7981\u7528","run-rule-text":"\u8FD0\u884C\u4E2D","timing-key-not-found":"\u8BA1\u65F6\u952E '{TIMING_KEY}' \u5728\u8BA1\u65F6\u4FE1\u606F\u5217\u8868\u4E2D\u4E0D\u5B58\u5728\uFF0C\u5DF2\u5FFD\u7565","milliseconds-abbreviation":"\u6BEB\u79D2","invalid-date-format-error":"\u65E0\u6CD5\u89E3\u6790\u6216\u786E\u5B9A'{FILE_NAME}'\u4E2D\u7684\u521B\u5EFA\u65E5\u671F'{DATE}'\u7684\u683C\u5F0F\uFF0C\u521B\u5EFA\u65E5\u671F\u672A\u8FDB\u884C\u4FEE\u6539","invalid-delimiter-error-message":"\u5206\u9694\u7B26\u53EA\u80FD\u4E3A\u5355\u4E2A\u5B57\u7B26","missing-footnote-error-message":"\u811A\u6CE8 '{FOOTNOTE}' \u6CA1\u6709\u5BF9\u5E94\u7684\u5F15\u7528\uFF0C\u65E0\u6CD5\u5904\u7406\u3002\u8BF7\u786E\u4FDD\u6240\u6709\u811A\u6CE8\u90FD\u6709\u76F8\u5E94\u7684\u5F15\u7528\u3002","too-many-footnotes-error-message":"\u811A\u6CE8\u7F16\u53F7 '{FOOTNOTE_KEY}' \u6709\u8D85\u8FC71\u4E2A\u811A\u6CE8\u5728\u4F7F\u7528\uFF0C\u8BF7\u4FEE\u6539\u811A\u6CE8\u4F7F\u5F97\u4E00\u4E2A\u811A\u6CE8\u7F16\u53F7\u5BF9\u5E94\u4E00\u4E2A\u811A\u6CE8","wrapper-yaml-error":"yaml\u51FA\u73B0\u9519\u8BEF: {ERROR_MESSAGE}","wrapper-unknown-error":"\u672A\u77E5\u9519\u8BEF: {ERROR_MESSAGE}"},"notice-text":{"empty-clipboard":"\u526A\u8D34\u677F\u4E3A\u7A7A","characters-added":"\u4E2A\u5B57\u7B26\u88AB\u6DFB\u52A0","characters-removed":"\u4E2A\u5B57\u7B26\u88AB\u79FB\u9664"},"all-rules-option":"\u5168\u90E8","linter-title":"Linter","empty-search-results-text":"\u6CA1\u6709\u5339\u914D\u7684\u8BBE\u7F6E\u9879","warning-text":"\u8B66\u544A","file-backup-text":"\u8BF7\u786E\u4FDD\u4F60\u5DF2\u5907\u4EFD\u6587\u4EF6",tabs:{names:{general:"\u57FA\u7840",custom:"\u81EA\u5B9A\u4E49",yaml:"YAML",heading:"\u6807\u9898",content:"\u5185\u5BB9",footnote:"\u811A\u6CE8",spacing:"\u7A7A\u884C",paste:"\u7C98\u8D34",debug:"Debug"},"default-search-bar-text":"\u641C\u7D22\u8BBE\u7F6E\u9879",general:{"lint-on-save":{name:"\u4FDD\u5B58\u65F6\u683C\u5F0F\u5316\u6587\u4EF6",description:"\u624B\u52A8\u4FDD\u5B58\u65F6\u683C\u5F0F\u5316\u6587\u4EF6\uFF08\u5F53\u6309 `Ctrl + S` \u65F6\u6216\u5728 vim \u6A21\u5F0F\u4E2D\u4F7F\u7528 `:w` \u65F6\uFF09"},"display-message":{name:"\u683C\u5F0F\u5316\u540E\u663E\u793A\u6D88\u606F",description:"\u683C\u5F0F\u5316\u540E\u663E\u793A\u4FEE\u6539\u4E86\u591A\u5C11\u5B57\u7B26"},"lint-on-file-change":{name:"\u6587\u4EF6\u4FEE\u6539\u65F6\u683C\u5F0F\u5316",description:"\u5F53\u6587\u4EF6\u5173\u95ED\u6216\u662F\u5207\u6362\u5230\u65B0\u6587\u4EF6\u65F6\uFF0C\u683C\u5F0F\u5316\u4E4B\u524D\u7684\u6587\u4EF6"},"display-lint-on-file-change-message":{name:"\u63D0\u9192\u6587\u4EF6\u4FEE\u6539\u65F6\u683C\u5F0F\u5316",description:"\u5F53`\u6587\u4EF6\u4FEE\u6539\u65F6\u683C\u5F0F\u5316`\u89E6\u53D1\u65F6\uFF0C\u5F39\u51FA\u4E00\u6761\u63D0\u793A\u4FE1\u606F"},"folders-to-ignore":{name:"\u5FFD\u7565\u6587\u4EF6\u5939",description:"\u9700\u8981\u5FFD\u7565\u7684\u6587\u4EF6\u5939\uFF08\u683C\u5F0F\u5316\u6240\u6709\u6587\u4EF6\u6216\u4FDD\u5B58\u65F6\u683C\u5F0F\u5316\u65F6\u751F\u6548\uFF09\uFF0C\u6BCF\u884C\u8F93\u5165\u4E00\u4E2A\u6587\u4EF6\u5939\u8DEF\u5F84"},"override-locale":{name:"\u8986\u76D6\u9ED8\u8BA4\u5730\u533A\u8BED\u8A00",description:"\u4F7F\u7528\u4E0D\u540C\u4E8E\u9ED8\u8BA4\u5730\u533A\u8BED\u8A00\u65F6\u9700\u8981\u8BBE\u7F6E\u6B64\u9879"},"same-as-system-locale":"\u9ED8\u8BA4 ({SYS_LOCALE}) ","yaml-aliases-section-style":{name:"YAML aliases \u6837\u5F0F",description:"YAML aliases \u6837\u5F0F"},"yaml-tags-section-style":{name:"YAML tags \u6837\u5F0F",description:"YAML tags \u6837\u5F0F"},"default-escape-character":{name:"\u9ED8\u8BA4\u8F6C\u4E49\u5B57\u7B26",description:"\u5F53\u5355\u5F15\u53F7\u6216\u53CC\u5F15\u53F7\u4E0D\u5B58\u5728\u65F6\u7528\u4E8E\u8F6C\u4E49 YAML \u503C\u7684\u9ED8\u8BA4\u5B57\u7B26"},"remove-unnecessary-escape-chars-in-multi-line-arrays":{name:"\u5F53\u4F7F\u7528 YAML \u591A\u884C\u6570\u7EC4\u65F6\u5220\u9664\u4E0D\u5FC5\u8981\u7684\u8F6C\u4E49\u5B57\u7B26",description:"YAML \u591A\u884C\u6570\u7EC4\u7684\u8F6C\u4E49\u5B57\u7B26\u548C YAML \u5355\u884C\u6570\u7EC4\u4E0D\u540C\uFF0C\u56E0\u6B64\u5728\u4F7F\u7528\u591A\u884C\u6570\u7EC4\u65F6\uFF0C\u5220\u9664\u4E0D\u5FC5\u8981\u7684\u8F6C\u4E49\u5B57\u7B26"},"number-of-dollar-signs-to-indicate-math-block":{name:"\u6307\u793A Latex \u5757\u7684 $ \u7B26\u53F7\u6570\u91CF",description:"\u5C06 Latex \u5185\u5BB9\u89C6\u4E3A Latex \u5757\u800C\u4E0D\u662F\u884C\u5185 Latex \u7684 $ \u7B26\u53F7\u7684\u6570\u91CF"}},debug:{"log-level":{name:"\u65E5\u5FD7\u7EA7\u522B",description:"\u5141\u8BB8\u6253\u5370\u7684\u65E5\u5FD7\u7C7B\u578B\uFF0C\u9ED8\u8BA4\u662F ERROR"},"linter-config":{name:"\u683C\u5F0F\u5316\u914D\u7F6E",description:"\u5728\u8BBE\u7F6E\u9875\u9762\u52A0\u8F7D\u65F6\uFF0CLinter \u4E2D data.json \u7684\u5185\u5BB9"},"log-collection":{name:"\u5728\u4FDD\u5B58\u65F6\u683C\u5F0F\u5316\u548C\u683C\u5F0F\u5316\u5F53\u524D\u6587\u4EF6\u65F6\u6536\u96C6\u65E5\u5FD7",description:"\u5728\u4FDD\u5B58\u65F6\u683C\u5F0F\u5316\u548C\u683C\u683C\u5F0F\u5316\u5F53\u524D\u6587\u4EF6\u65F6\u6536\u96C6\u65E5\u5FD7\u3002\u8FD9\u4E9B\u65E5\u5FD7\u6709\u52A9\u4E8E\u8C03\u8BD5\u548C\u521B\u5EFA\u9519\u8BEF\u62A5\u544A"},"linter-logs":{name:"Linter \u65E5\u5FD7",description:"\u5982\u679C\u5F00\u542F\uFF0C\u5219\u663E\u793A\u6700\u540E\u4E00\u6B21\u683C\u5F0F\u5316\u65F6\u4FDD\u5B58\u6216\u8005\u683C\u5F0F\u5316\u5F53\u524D\u6587\u4EF6\u65F6\u751F\u6210\u7684\u65E5\u5FD7"}}},options:{"custom-command":{name:"\u81EA\u5B9A\u4E49\u547D\u4EE4",description:"\u81EA\u5B9A\u4E49\u547D\u4EE4\u662F\u5728 Linter \u5B8C\u6210\u683C\u5F0F\u5316\u540E\u8FD0\u884C\u7684 Obsidian \u547D\u4EE4\u3002\u8FD9\u610F\u5473\u7740 Obsidian \u547D\u4EE4\u4F1A\u5728 YAML \u65F6\u95F4\u6233\u4FEE\u6539\u4E4B\u540E\u8FD0\u884C\uFF0C\u56E0\u6B64\u5B83\u4EEC\u53EF\u80FD\u4F1A\u5BFC\u81F4\u5728\u4E0B\u6B21\u8FD0\u884C Linter \u65F6\u89E6\u53D1 YAML \u65F6\u95F4\u6233\u4FEE\u6539\u3002\u4E00\u4E2A Obsidian \u547D\u4EE4\u53EA\u80FD\u9009\u62E9\u4E00\u6B21\u3002**_\u6CE8\u610F\uFF0C\u8FD9\u76EE\u524D\u4EC5\u9002\u7528\u4E8E\u683C\u5F0F\u5316\u5F53\u524D\u6587\u4EF6_**",warning:"\u9009\u62E9\u547D\u4EE4\u65F6\uFF0C\u8BF7\u786E\u4FDD\u4F7F\u7528\u9F20\u6807\u6216\u6309\u56DE\u8F66\u952E\u9009\u62E9\u8BE5\u9009\u9879\uFF0C\u5176\u4ED6\u9009\u62E9\u65B9\u6CD5\u53EF\u80FD\u4E0D\u8D77\u4F5C\u7528\u3002\u53EA\u6709 Obsidian \u547D\u4EE4\u6216\u7A7A\u5B57\u7B26\u4E32\u4F1A\u88AB\u4FDD\u5B58","add-input-button-text":"\u6DFB\u52A0\u65B0\u547D\u4EE4","command-search-placeholder-text":"Obsidian \u547D\u4EE4","move-up-tooltip":"\u4E0A\u79FB","move-down-tooltip":"\u4E0B\u79FB","delete-tooltip":"\u5220\u9664"},"custom-replace":{name:"\u81EA\u5B9A\u4E49\u6B63\u5219\u8868\u8FBE\u5F0F\u66FF\u6362",description:"\u81EA\u5B9A\u4E49\u6B63\u5219\u8868\u8FBE\u5F0F\u66FF\u6362\u53EF\u5C06\u4EFB\u610F\u7684\u6B63\u5219\u5339\u914D\u5185\u5BB9\u66FF\u6362\u4E3A\u6307\u5B9A\u503C\u3002\u67E5\u627E\u503C\u548C\u66FF\u6362\u503C\u5FC5\u987B\u662F\u6709\u6548\u7684\u6B63\u5219\u8868\u8FBE\u5F0F",warning:"\u5982\u679C\u60A8\u4E0D\u77E5\u9053\u6B63\u5219\u8868\u8FBE\u5F0F\u662F\u4EC0\u4E48\uFF0C\u8BF7\u8C28\u614E\u4F7F\u7528\u3002\u53E6\u5916\uFF0C\u8BF7\u786E\u4FDD\u60A8\u4E0D\u8981\u5728 iOS \u79FB\u52A8\u8BBE\u5907\u4E0A\u4F7F\u7528\u540E\u884C\u65AD\u8A00\uFF0C\u7531\u4E8E\u8BE5\u5E73\u53F0\u4E0D\u652F\u6301\uFF0C\u4F1A\u5BFC\u81F4\u683C\u5F0F\u5316\u5931\u8D25","add-input-button-text":"\u6DFB\u52A0\u65B0\u7684\u6B63\u5219\u66FF\u6362\u89C4\u5219","regex-to-find-placeholder-text":"\u67E5\u627E\u6B63\u5219\u5F0F","flags-placeholder-text":"\u53C2\u6570","regex-to-replace-placeholder-text":"\u66FF\u6362\u6B63\u5219\u5F0F","label-placeholder-text":"\u7B80\u79F0","move-up-tooltip":"\u4E0A\u79FB","move-down-tooltip":"\u4E0B\u79FB","delete-tooltip":"\u5220\u9664"}},rules:{"auto-correct-common-misspellings":{name:"\u81EA\u52A8\u66F4\u6B63\u5E38\u89C1\u7684\u62FC\u5199\u9519\u8BEF",description:"\u901A\u8FC7\u5E38\u89C1\u62FC\u5199\u9519\u8BEF\u5B57\u5178\u81EA\u52A8\u5C06\u9519\u8BEF\u62FC\u5199\u66F4\u6B63\u4E3A\u6B63\u786E\u62FC\u5199\u3002\u6709\u5173\u81EA\u52A8\u66F4\u6B63\u5355\u8BCD\u7684\u5B8C\u6574\u5217\u8868\uFF0C\u8BF7\u53C2\u9605 [auto-correct map](https://github.com/platers/obsidian-linter/tree/master/src/utils/auto-correct-misspellings.ts)","ignore-words":{name:"\u5FFD\u7565\u5355\u8BCD",description:"\u4EE5\u9017\u53F7\u5206\u9694\u7684\u5C0F\u5199\u5355\u8BCD\u5217\u8868\uFF0C\u5728\u81EA\u52A8\u66F4\u6B63\u65F6\u4F1A\u5FFD\u7565"}},"add-blockquote-indentation-on-paste":{name:"\u6DFB\u52A0\u5F15\u7528\u5757\u7F29\u8FDB",description:"\u7C98\u8D34\u65F6\uFF0C\u5982\u679C\u5149\u6807\u4F4D\u4E8E\u5F15\u7528\u884C\u6216\u6807\u6CE8\u884C\uFF0C\u5219\u5C06\u5F15\u7528\u6DFB\u52A0\u5230\u9664\u7B2C\u4E00\u884C\u4EE5\u5916\u7684\u6240\u6709\u884C"},"blockquote-style":{name:"\u5F15\u7528\u5757\u6837\u5F0F",description:"\u786E\u4FDD\u5F15\u7528\u5757\u6837\u5F0F\u4E00\u81F4",style:{name:"\u6837\u5F0F",description:"\u5F15\u7528\u5757\u6807\u5FD7\u5B57\u7B26\u7684\u6837\u5F0F"}},"capitalize-headings":{name:"\u5927\u5199\u6807\u9898",description:"\u6807\u9898\u4F1A\u5728\u683C\u5F0F\u5316\u540E\u5927\u5199",style:{name:"\u6837\u5F0F",description:"\u5927\u5199\u7684\u65B9\u5F0F"},"ignore-case-words":{name:"\u5FFD\u7565\u5927\u5199\u5355\u8BCD",description:"\u5728\u6837\u5F0F\u8BBE\u4E3A\u6BCF\u8BCD\u9996\u5B57\u6BCD\u5927\u5199\u65F6\uFF0C\u4EC5\u683C\u5F0F\u5316\u5168\u5C0F\u5199\u7684\u5355\u8BCD"},"ignore-words":{name:"\u5FFD\u7565\u5355\u8BCD",description:"\u4E0D\u683C\u5F0F\u5316\u7684\u5355\u8BCD\uFF0C\u4EE5\u9017\u53F7\u5206\u9694"},"lowercase-words":{name:"\u5C0F\u5199\u5355\u8BCD",description:"\u4FDD\u6301\u5C0F\u5199\u7684\u5355\u8BCD\uFF0C\u4EE5\u9017\u53F7\u5206\u9694"}},"compact-yaml":{name:"\u7CBE\u7B80 YAML",description:"\u79FB\u9664 YAML Front-matter \u5F00\u5934\u7ED3\u5C3E\u7684\u7A7A\u884C","inner-new-lines":{name:"\u5185\u90E8\u7A7A\u884C",description:"\u79FB\u9664 YAML Front-matter \u5185\u90E8\u7684\u7A7A\u884C"}},"consecutive-blank-lines":{name:"\u8FDE\u7EED\u7A7A\u884C",description:"\u6700\u591A\u5141\u8BB8\u4E00\u4E2A\u8FDE\u7EED\u7A7A\u884C"},"convert-bullet-list-markers":{name:"\u8F6C\u6362\u65E0\u5E8F\u5217\u8868\u6807\u5FD7",description:"\u5C06\u5176\u4ED6\u683C\u5F0F\u65E0\u5E8F\u5217\u8868\u6807\u5FD7\u8F6C\u6362\u4E3A Markdown \u683C\u5F0F\u65E0\u5E8F\u5217\u8868\u6807\u5FD7"},"convert-spaces-to-tabs":{name:"\u8F6C\u6362\u7A7A\u683C\u4E3A\u5236\u8868\u7B26",description:"\u5C06\u524D\u5BFC\u7A7A\u683C\u8F6C\u6362\u4E3A\u5236\u8868\u7B26",tabsize:{name:"\u5236\u8868\u7B26\u5BBD\u5EA6",description:"\u5236\u8868\u7B26\u5BF9\u5E94\u7684\u7A7A\u683C\u5BBD\u5EA6"}},"default-language-for-code-fences":{name:"\u4EE3\u7801\u5757\u9ED8\u8BA4\u8BED\u8A00",description:"\u4E3A\u6CA1\u6709\u6307\u5B9A\u8BED\u8A00\u7684\u4EE3\u7801\u5757\u6DFB\u52A0\u9ED8\u8BA4\u8BED\u8A00\u3002","default-language":{name:"\u7F16\u7A0B\u8BED\u8A00",description:"\u7559\u7A7A\u4E0D\u8FDB\u884C\u4EFB\u4F55\u64CD\u4F5C\u3002\u53EF\u4EE5\u5728[\u8FD9\u91CC](https://prismjs.com/#supported-languages)\u627E\u5230\u8BED\u8A00\u6807\u7B7E\u3002"}},"emphasis-style":{name:"\u7A81\u51FA\u6837\u5F0F",description:"\u4FDD\u6301\u7A81\u51FA\u6837\u5F0F\u4E00\u81F4\u6027",style:{name:"\u6837\u5F0F",description:"\u7528\u4E8E\u8868\u793A\u7A81\u51FA\u5185\u5BB9\u7684\u6837\u5F0F"}},"empty-line-around-blockquotes":{name:"\u5F15\u7528\u5757\u524D\u540E\u7A7A\u884C",description:"\u786E\u4FDD\u5F15\u7528\u5757\u524D\u540E\u6709\u7A7A\u884C\uFF0C\u9664\u975E\u5B83\u5728\u6587\u6863\u7684\u5F00\u5934\u6216\u7ED3\u5C3E\u3002**\u6CE8\u610F\uFF0C\u8FD9\u91CC\u5D4C\u5957\u5F15\u7528\u5757\u4E5F\u4F1A\u6709\u5BF9\u5E94\u7684\u7A7A\u884C**"},"empty-line-around-code-fences":{name:"\u4EE3\u7801\u5757\u524D\u540E\u7A7A\u884C",description:"\u786E\u4FDD\u4EE3\u7801\u5757\u524D\u540E\u6709\u7A7A\u884C\uFF0C\u9664\u975E\u5B83\u5728\u6587\u6863\u7684\u5F00\u5934\u6216\u7ED3\u5C3E"},"empty-line-around-math-blocks":{name:"Latex \u5757\u524D\u540E\u7A7A\u884C",description:"\u786E\u4FDDLatex \u5757\u524D\u540E\u6709\u7A7A\u884C\u3002\u4F7F\u7528**\u6307\u793A Latex \u5757\u7684 `$` \u7B26\u53F7\u6570\u91CF**\u6765\u786E\u5B9A\u5355\u884C Latex \u662F\u5426\u88AB\u8BA4\u5B9A\u4E3A Latex \u5757"},"empty-line-around-tables":{name:"\u8868\u683C\u524D\u540E\u7A7A\u884C",description:"\u786E\u4FDD\u8868\u683C\u524D\u540E\u6709\u7A7A\u884C\uFF0C\u9664\u975E\u5B83\u5728\u6587\u6863\u7684\u5F00\u5934\u6216\u7ED3\u5C3E"},"escape-yaml-special-characters":{name:"\u8F6C\u4E49 YAML \u7279\u6B8A\u5B57\u7B26",description:`\u8F6C\u4E49 YAML \u4E2D\u7684\u5192\u53F7(: )\uFF0C\u5355\u5F15\u53F7 (') \u548C\u53CC\u5F15\u53F7 (")`,"try-to-escape-single-line-arrays":{name:"\u5C1D\u8BD5\u8F6C\u4E49\u5355\u884C\u6570\u7EC4",description:"\u5C1D\u8BD5\u8F6C\u4E49\u6570\u7EC4\u503C\uFF0C\u5047\u8BBE\u6570\u7EC4\u4EE5`[`\u5F00\u5934\uFF0C`]`\u7ED3\u5C3E\uFF0C\u5E76\u4E14\u7531`,`\u5206\u9694"}},"file-name-heading":{name:"\u6587\u4EF6\u540D\u4F5C\u4E3A\u6807\u9898",description:"\u5982\u679C\u6CA1\u6709 H1 \u6807\u9898\uFF0C\u5219\u63D2\u5165\u6587\u4EF6\u540D\u4F5C\u4E3A H1 \u6807\u9898"},"footnote-after-punctuation":{name:"\u811A\u6CE8\u5728\u6807\u70B9\u7B26\u53F7\u540E",description:"\u786E\u4FDD\u811A\u6CE8\u5F15\u7528\u7F6E\u4E8E\u6807\u70B9\u7B26\u53F7\u4E4B\u540E\uFF0C\u800C\u4E0D\u662F\u4E4B\u524D"},"force-yaml-escape":{name:"\u5F3A\u5236 YAML \u8F6C\u4E49",description:"\u8F6C\u4E49\u6307\u5B9A YAML \u952E\u7684\u503C","force-yaml-escape-keys":{name:"\u8981\u5F3A\u5236\u8F6C\u79FB\u7684 YAML \u952E",description:"\u5982\u679C\u672A\u8F6C\u4E49\uFF0C\u5219\u4F7F\u7528 YAML \u8F6C\u4E49\u5B57\u7B26\u5BF9\u6307\u5B9A YAML \u952E\u8FDB\u884C\u8F6C\u4E49\uFF0C\u6BCF\u4E2A\u952E\u4E00\u884C\u3002 \u4E0D\u8981\u5BF9 YAML \u6570\u7EC4\u4F7F\u7528"}},"format-tags-in-yaml":{name:"\u683C\u5F0F\u5316 YAML \u4E2D\u7684 tags",description:"\u628A YAML Front-matter \u4E2D tag \u7684\u4E95\u53F7\u5220\u9664\uFF0C\u56E0\u4E3A\u4E95\u53F7\u4F1A\u4F7F tag \u65E0\u6548"},"format-yaml-array":{name:"\u683C\u5F0F\u5316 YAML \u6570\u7EC4",description:"\u5141\u8BB8\u5C06\u5E38\u89C4 YAML \u6570\u7EC4\u683C\u5F0F\u5316\u4E3A\u591A\u884C\u6216\u5355\u884C\uFF0C\u5E76\u5141\u8BB8\u90E8\u5206\u6570\u7EC4(`tags`, `aliases`) \u4FDD\u7559 Obsidian \u539F\u6709\u7684 YAML \u683C\u5F0F\u3002\u8BF7\u6CE8\u610F\uFF0C\u5355\u5B57\u7B26\u4E32\u8F6C\u6362\u4E3A\u5355\u884C\uFF0C\u5982\u679C\u5B58\u5728\u591A\u4E2A\u6761\u76EE\uFF0C\u5219\u4F1A\u53D8\u4E3A\u5355\u884C\u6570\u7EC4\u3002\u5BF9\u4E8E\u5355\u5B57\u7B26\u4E32\u8F6C\u6362\u4E3A\u591A\u884C\uFF0C\u60C5\u51B5\u4E5F\u662F\u5982\u6B64\uFF0C\u53EA\u662F\u5B83\u53D8\u6210\u4E86\u591A\u884C\u6570\u7EC4","alias-key":{name:"\u683C\u5F0F\u5316 YAML aliases",description:"\u6253\u5F00 YAML aliases \u90E8\u5206\u7684\u683C\u5F0F\u8BBE\u7F6E\u3002\u4E0D\u5E94\u4E0E\u89C4\u5219`YAML \u6807\u9898\u522B\u540D`\u540C\u65F6\u542F\u7528\uFF0C\u56E0\u4E3A\u5B83\u4EEC\u53EF\u80FD\u4E0D\u4F1A\u5F88\u597D\u5730\u534F\u540C\u5DE5\u4F5C\uFF0C\u6216\u8005\u5B83\u4EEC\u53EF\u80FD\u6709\u4E0D\u540C\u7684\u683C\u5F0F\u6837\u5F0F\u9009\u62E9\uFF0C\u4ECE\u800C\u5BFC\u81F4\u610F\u5916\u7ED3\u679C"},"tag-key":{name:"\u683C\u5F0F\u5316 YAML tags",description:"\u6253\u5F00 YAML tags \u90E8\u5206\u7684\u683C\u5F0F\u8BBE\u7F6E"},"default-array-style":{name:"\u9ED8\u8BA4\u7684 YAML \u6570\u7EC4\u683C\u5F0F",description:"\u9664\u4E86 tags, aliases \u6216\u5C06\u952E\u503C\u5F3A\u5236\u4E3A\u5355\u884C\u6570\u7EC4\u548C\u5C06\u952E\u503C\u5F3A\u5236\u4E3A\u591A\u884C\u6570\u7EC4\u4E4B\u5916\uFF0C\u5176\u4ED6\u4E3A\u5E38\u89C4 YAML \u6570\u7EC4\u7684\u6837\u5F0F"},"default-array-keys":{name:"\u683C\u5F0F\u5316 YAML \u6570\u7EC4",description:"\u5BF9 YAML \u6570\u7EC4\u8FDB\u884C\u683C\u5F0F\u5316"},"force-single-line-array-style":{name:"\u5F3A\u5236\u8F6C\u4E3A\u5355\u884C\u6570\u7EC4",description:"\u5F3A\u5236\u5C06\u6307\u5B9A\u952E\u7684 YAML \u6570\u7EC4\u8F6C\u4E3A\u5355\u884C\u6570\u7EC4\uFF0C\u6309\u884C\u5206\u9694\uFF08\u7559\u7A7A\u4EE5\u7981\u7528\u6B64\u9009\u9879\uFF09"},"force-multi-line-array-style":{name:"\u5F3A\u5236\u8F6C\u4E3A\u591A\u884C\u6570\u7EC4",description:"\u5F3A\u5236\u5C06\u6307\u5B9A\u952E\u7684 YAML \u6570\u7EC4\u8F6C\u4E3A\u591A\u884C\u6570\u7EC4\uFF0C\u6309\u884C\u5206\u9694\uFF08\u7559\u7A7A\u4EE5\u7981\u7528\u6B64\u9009\u9879\uFF09"}},"header-increment":{name:"\u6807\u9898\u7EA7\u522B\u9012\u589E",description:"\u6807\u9898\u4E00\u6B21\u4EC5\u9012\u589E\u4E00\u4E2A\u7EA7\u522B","start-at-h2":{name:"\u4ECE H2 \u6807\u9898\u5F00\u59CB\u9012\u589E",description:"\u4F7F H2 \u6807\u9898\u6210\u4E3A\u6587\u4EF6\u4E2D\u7684\u6700\u5C0F\u6807\u9898\u7EA7\u522B\uFF0C\u5176\u4ED6\u7EA7\u522B\u7684\u6807\u9898\u8FDB\u884C\u76F8\u5E94\u7684\u9012\u63A8"}},"heading-blank-lines":{name:"\u6807\u9898\u7A7A\u884C",description:"\u4FDD\u8BC1\u6240\u6709\u6807\u9898\u524D\u540E\u5747\u6709\u4E00\u4E2A\u7A7A\u884C\uFF08\u9664\u975E\u6807\u9898\u4F4D\u4E8E\u6587\u6863\u5F00\u5934\u6216\u7ED3\u5C3E\u5904\uFF09",bottom:{name:"\u5E95\u90E8",description:"\u5728\u6807\u9898\u540E\u63D2\u5165\u4E00\u4E2A\u7A7A\u884C"},"empty-line-after-yaml":{name:"YAML \u4E0E\u6807\u9898\u4E4B\u95F4\u7684\u7A7A\u884C",description:"\u4FDD\u7559 YAML Front-matter \u548C\u6807\u9898\u4E4B\u95F4\u7684\u7A7A\u884C"}},"headings-start-line":{name:"\u6807\u9898\u5BF9\u9F50\u884C\u9996",description:"\u5C06\u4E0D\u4EE5\u884C\u9996\u5F00\u59CB\u7684\u6807\u9898\u524D\u9762\u7684\u7A7A\u767D\u5220\u9664\uFF0C\u6807\u9898\u80FD\u88AB\u6B63\u786E\u8BC6\u522B"},"insert-yaml-attributes":{name:"\u63D2\u5165 YAML \u5C5E\u6027",description:"\u628A\u6307\u5B9A\u7684 YAML \u952E\u63D2\u5165\u5230 YAML Front-matter \u4E2D\u3002\u6BCF\u4E2A\u952E\u5360\u4E00\u884C","text-to-insert":{name:"\u8981\u63D2\u5165\u7684\u952E",description:"\u8981\u63D2\u5165\u5230 YAML Front-matter \u4E2D\u7684\u952E"}},"line-break-at-document-end":{name:"\u6587\u4EF6\u7ED3\u5C3E\u6362\u884C",description:"\u786E\u4FDD\u6587\u6863\u7ED3\u5C3E\u6709\u4E00\u884C\u7A7A\u884C"},"move-footnotes-to-the-bottom":{name:"\u79FB\u52A8\u811A\u6CE8\u81F3\u5E95\u90E8",description:"\u5C06\u6240\u6709\u811A\u6CE8\u79FB\u52A8\u5230\u6587\u6863\u5E95\u90E8"},"move-math-block-indicators-to-their-own-line":{name:"\u683C\u5F0F\u5316 Latex \u5757\u6807\u5FD7",description:"\u5C06 Latex \u5757\u6807\u5FD7\u79FB\u5230\u65B0\u884C\u3002\u4F7F\u7528**\u6307\u793A Latex \u5757\u7684 `$` \u7B26\u53F7\u6570\u91CF**\u6765\u786E\u5B9A\u5355\u884C Latex \u662F\u5426\u88AB\u8BA4\u5B9A\u4E3A Latex \u5757"},"move-tags-to-yaml":{name:"\u5C06 tags \u79FB\u81F3 YAML",description:"\u5C06\u6587\u6863\u5185\u6240\u6709\u7684 tags \u79FB\u52A8\u5230 YAML Front-matter \u5185","how-to-handle-existing-tags":{name:"\u5982\u4F55\u5904\u7406\u539F\u6709\u7684 tag",description:"\u5BF9\u4E8E\u6587\u6863\u4E2D\u975E\u88AB\u5FFD\u7565\u7684 tag\uFF0C\u79FB\u52A8\u5230 YAML Front-matter \u540E\u5E94\u8BE5\u91C7\u53D6\u4F55\u79CD\u64CD\u4F5C\uFF1F"},"tags-to-ignore":{name:"\u5FFD\u7565\u7684 tag",description:"\u8FD9\u4E9B tags \u4E0D\u4F1A\u88AB\u79FB\u52A8 YAML Front-matter \u4E2D\u3002\u6BCF\u4E2A tag \u6309\u884C\u5206\u9694\uFF0C\u4E0D\u8981\u5305\u542B`#`"}},"no-bare-urls":{name:"\u7981\u6B62\u539F\u59CB URL",description:"\u9664\u975E\u88AB\u53CD\u5F15\u53F7\u3001\u65B9\u62EC\u53F7\u6216\u5355\u5F15\u53F7/\u53CC\u5F15\u53F7\u5305\u56F4\uFF0C\u5426\u5219\u5C06\u539F\u59CB URL \u7528\u5C16\u62EC\u53F7\u5305\u56F4"},"ordered-list-style":{name:"\u6709\u5E8F\u5217\u8868\u6837\u5F0F",description:"\u786E\u4FDD\u6709\u5E8F\u5217\u8868\u9075\u5FAA\u6307\u5B9A\u7684\u6837\u5F0F\u3002\u8BF7\u6CE8\u610F\uFF0C2\u4E2A\u7A7A\u683C\u62161\u4E2A\u5236\u8868\u7B26\u88AB\u89C6\u4E3A\u4E00\u4E2A\u7F29\u8FDB\u7EA7\u522B","number-style":{name:"\u6392\u5E8F\u65B9\u5F0F",description:"\u6709\u5E8F\u5217\u8868\u5E8F\u53F7\u683C\u5F0F\u5316\u65B9\u5F0F"},"list-end-style":{name:"\u6709\u5E8F\u5217\u8868\u6807\u5FD7\u6837\u5F0F",description:"\u6709\u5E8F\u5217\u8868\u6807\u5FD7\u6837\u5F0F"}},"paragraph-blank-lines":{name:"\u6BB5\u843D\u7A7A\u884C",description:"\u6BCF\u4E2A\u6BB5\u843D\u524D\u540E\u4FDD\u8BC1\u6709\u4E14\u4EC5\u6709\u4E00\u884C\u7A7A\u884C"},"prevent-double-checklist-indicator-on-paste":{name:"\u9632\u6B62\u91CD\u590D\u7684 checklist \u6807\u5FD7",description:"\u7C98\u8D34\u65F6\uFF0C\u5982\u679C\u5149\u6807\u6240\u5728\u884C\u6709 checklist \u6807\u5FD7\uFF0C\u5219\u4ECE\u8981\u7C98\u8D34\u7684\u6587\u672C\u4E2D\u79FB\u9664 checklist \u6807\u5FD7"},"prevent-double-list-item-indicator-on-paste":{name:"\u9632\u6B62\u91CD\u590D\u7684\u5217\u8868\u6807\u5FD7",description:"\u7C98\u8D34\u65F6\uFF0C\u5982\u679C\u5149\u6807\u6240\u5728\u884C\u6709\u5217\u8868\u6807\u5FD7\uFF0C\u5219\u4ECE\u8981\u7C98\u8D34\u7684\u6587\u672C\u4E2D\u79FB\u9664\u5217\u8868\u6807\u5FD7"},"proper-ellipsis-on-paste":{name:"\u6B63\u786E\u7684\u7701\u7565\u53F7",description:"\u7C98\u8D34\u65F6\uFF0C\u5373\u4F7F\u8981\u7C98\u8D34\u7684\u6587\u672C\u4E2D\u6709\u7A7A\u683C\uFF0C\u4E5F\u7528\u7701\u7565\u53F7\u66FF\u6362\u4E09\u4E2A\u8FDE\u7EED\u7684\u70B9"},"proper-ellipsis":{name:"\u6B63\u786E\u7684\u7701\u7565\u53F7",description:"\u7528\u7701\u7565\u53F7\u66FF\u6362\u4E09\u4E2A\u8FDE\u7EED\u7684\u70B9"},"quote-style":{name:"\u5F15\u53F7\u6837\u5F0F",description:"\u683C\u5F0F\u5316\u6B63\u6587\u5185\u5BB9\u4E2D\u7684\u5F15\u53F7\u6837\u5F0F\u4E3A\u5355\u5F15\u53F7\u6216\u53CC\u5F15\u53F7","single-quote-enabled":{name:"\u542F\u7528\u5355\u5F15\u53F7\u6837\u5F0F",description:"\u6307\u5B9A\u5E94\u4F7F\u7528\u9009\u5B9A\u7684\u5355\u5F15\u53F7\u6837\u5F0F"},"single-quote-style":{name:"\u5355\u5F15\u53F7\u6837\u5F0F",description:"\u8981\u4F7F\u7528\u7684\u5355\u5F15\u53F7\u6837\u5F0F"},"double-quote-enabled":{name:"\u542F\u7528\u53CC\u5F15\u53F7\u6837\u5F0F",description:"\u6307\u5B9A\u5E94\u4F7F\u7528\u9009\u5B9A\u7684\u53CC\u5F15\u53F7\u6837\u5F0F"},"double-quote-style":{name:"\u53CC\u5F15\u53F7\u6837\u5F0F",description:"\u8981\u4F7F\u7528\u7684\u53CC\u5F15\u53F7\u6837\u5F0F"}},"re-index-footnotes":{name:"\u91CD\u65B0\u7D22\u5F15\u811A\u6CE8",description:"\u57FA\u4E8E\u51FA\u73B0\u7684\u987A\u5E8F\u91CD\u65B0\u7D22\u5F15\u811A\u6CE8\u3002**\u6CE8\u610F\uFF0C\u5982\u679C\u4E00\u4E2A\u952E\u5BF9\u5E94\u591A\u4E2A\u811A\u6CE8\uFF0C\u5219\u6B64\u89C4\u5219\u4E0D\u9002\u7528**"},"remove-consecutive-list-markers":{name:"\u79FB\u9664\u91CD\u590D\u7684\u5217\u8868\u6807\u5FD7",description:"\u79FB\u9664\u91CD\u590D\u7684\u5217\u8868\u6807\u5FD7\u3002\u590D\u5236\u7C98\u8D34\u5217\u8868\u9879\u65F6\u5F88\u6709\u7528"},"remove-empty-lines-between-list-markers-and-checklists":{name:"\u79FB\u9664\u5217\u8868\u548C checklist \u9879\u76EE\u4E4B\u95F4\u7684\u7A7A\u884C",description:"\u5217\u8868\u548C checklist \u9879\u76EE\u4E4B\u95F4\u4E0D\u5E94\u6709\u7A7A\u884C"},"remove-empty-list-markers":{name:"\u79FB\u9664\u7A7A\u7684\u5217\u8868\u6807\u5FD7",description:"\u79FB\u9664\u7A7A\u7684\u5217\u8868\u6807\u5FD7\uFF0C\u6BD4\u5982\u5217\u8868\u540E\u6CA1\u5185\u5BB9"},"remove-hyphenated-line-breaks":{name:"\u79FB\u9664\u8FDE\u5B57\u7B26",description:"\u79FB\u9664\u4E2D\u5212\u7EBF\u8FDE\u5B57\u7B26\u3002\u4ECE\u6587\u7AE0\u4E2D\u7C98\u8D34\u65F6\u5F88\u6709\u7528"},"remove-hyphens-on-paste":{name:"\u79FB\u9664\u8FDE\u5B57\u7B26",description:"\u7C98\u8D34\u65F6\uFF0C\u4ECE\u8981\u7C98\u8D34\u7684\u6587\u672C\u4E2D\u79FB\u9664\u8FDE\u5B57\u7B26"},"remove-leading-or-trailing-whitespace-on-paste":{name:"\u79FB\u9664\u524D\u5BFC\u6216\u5C3E\u968F\u7A7A\u683C",description:"\u7C98\u8D34\u65F6\uFF0C\u4ECE\u8981\u7C98\u8D34\u7684\u6587\u672C\u4E2D\u79FB\u9664\u4EFB\u4F55\u524D\u5BFC\u975E\u5236\u8868\u7B26\u7A7A\u683C\u548C\u6240\u6709\u5C3E\u968F\u7A7A\u683C"},"remove-leftover-footnotes-from-quote-on-paste":{name:"\u79FB\u9664\u591A\u4F59\u811A\u6CE8",description:"\u7C98\u8D34\u65F6\uFF0C\u4ECE\u8981\u7C98\u8D34\u7684\u6587\u672C\u4E2D\u79FB\u9664\u591A\u4F59\u811A\u6CE8"},"remove-link-spacing":{name:"\u79FB\u9664\u94FE\u63A5\u7A7A\u683C",description:"\u79FB\u9664\u94FE\u63A5\u6587\u672C\u9996\u5C3E\u7684\u7A7A\u683C"},"remove-multiple-blank-lines-on-paste":{name:"\u79FB\u9664\u91CD\u590D\u7A7A\u884C",description:"\u7C98\u8D34\u65F6\uFF0C\u4ECE\u8981\u7C98\u8D34\u7684\u6587\u672C\u4E2D\u5C06\u591A\u4E2A\u7A7A\u884C\u538B\u7F29\u4E3A\u4E00\u4E2A\u7A7A\u884C"},"remove-multiple-spaces":{name:"\u79FB\u9664\u91CD\u590D\u7A7A\u683C",description:"\u79FB\u9664\u4E24\u4E2A\u6216\u66F4\u591A\u8FDE\u7EED\u7684\u7A7A\u683C\uFF0C\u5FFD\u7565\u884C\u9996\u548C\u884C\u5C3E\u7684\u7A7A\u683C"},"remove-space-around-characters":{name:"\u79FB\u9664\u5B57\u7B26\u5468\u56F4\u7684\u7A7A\u683C",description:"\u786E\u4FDD\u67D0\u4E9B\u5B57\u7B26\u5468\u56F4\u6CA1\u6709\u7A7A\u683C\uFF08\u5305\u62EC\u5355\u4E2A\u7A7A\u683C\u6216\u5236\u8868\u7B26\uFF09\u3002**\u6CE8\u610F\uFF0C\u8FD9\u53EF\u80FD\u4F1A\u5728\u67D0\u4E9B\u60C5\u51B5\u4E0B\u5F71\u54CD markdown \u683C\u5F0F**","include-fullwidth-forms":{name:"\u5305\u62EC\u5168\u89D2\u5F62\u5F0F",description:'\u5305\u62EC\u5168\u89D2\u5F62\u5F0FUnicode\u5757'},"include-cjk-symbols-and-punctuation":{name:"\u5305\u62ECCJK\u7B26\u53F7\u548C\u6807\u70B9",description:'\u5305\u62ECCJK\u7B26\u53F7\u548C\u6807\u70B9Unicode\u5757'},"include-dashes":{name:"\u5305\u62EC\u7834\u6298\u53F7",description:"\u5305\u62EC en dash (\u2013) \u548C em dash (\u2014)"},"other-symbols":{name:"\u5176\u4ED6\u7B26\u53F7",description:"\u8981\u5305\u62EC\u7684\u5176\u4ED6\u7B26\u53F7"}},"remove-space-before-or-after-characters":{name:"\u79FB\u9664\u5B57\u7B26\u524D\u540E\u7684\u7A7A\u683C",description:"\u79FB\u9664\u6307\u5B9A\u5B57\u7B26\u4E4B\u524D\u548C\u6307\u5B9A\u5B57\u7B26\u4E4B\u540E\u7684\u7A7A\u683C\u3002 **\u6CE8\u610F\uFF0C\u5728\u67D0\u4E9B\u60C5\u51B5\u4E0B\uFF0C\u8FD9\u53EF\u80FD\u4F1A\u5BFC\u81F4 markdown \u683C\u5F0F\u51FA\u73B0\u95EE\u9898**","characters-to-remove-space-before":{name:"\u79FB\u9664\u5B57\u7B26\u524D\u7684\u7A7A\u683C",description:"\u79FB\u9664\u6307\u5B9A\u5B57\u7B26\u524D\u7684\u7A7A\u683C\u3002 **\u6CE8\u610F\uFF0C\u5728\u5B57\u7B26\u5217\u8868\u4E2D\u4F7F\u7528`{`\u6216`}`\u4F1A\u610F\u5916\u5F71\u54CD\u6587\u4EF6\uFF0C\u56E0\u4E3A\u5B83\u5728\u7A0B\u5E8F\u540E\u53F0\u7684\u5FFD\u7565\u8BED\u6CD5\u4E2D\u4F7F\u7528**"},"characters-to-remove-space-after":{name:"\u79FB\u9664\u5B57\u7B26\u540E\u7684\u7A7A\u683C",description:"\u79FB\u9664\u6307\u5B9A\u5B57\u7B26\u540E\u7684\u7A7A\u683C\u3002 **\u6CE8\u610F\uFF0C\u5728\u5B57\u7B26\u5217\u8868\u4E2D\u4F7F\u7528`{`\u6216`}`\u4F1A\u610F\u5916\u5F71\u54CD\u6587\u4EF6\uFF0C\u56E0\u4E3A\u5B83\u5728\u7A0B\u5E8F\u540E\u53F0\u7684\u5FFD\u7565\u8BED\u6CD5\u4E2D\u4F7F\u7528**"}},"remove-trailing-punctuation-in-heading":{name:"\u79FB\u9664\u6807\u9898\u4E2D\u7684\u7ED3\u5C3E\u6807\u70B9\u7B26\u53F7",description:"\u4ECE\u6807\u9898\u7684\u672B\u5C3E\u5220\u9664\u6307\u5B9A\u7684\u6807\u70B9\u7B26\u53F7\uFF0C\u786E\u4FDD\u5FFD\u7565[HTML \u5B57\u7B26\u5B9E\u4F53](https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references)\u672B\u5C3E\u7684\u5206\u53F7","punctuation-to-remove":{name:"\u8981\u5220\u9664\u7684\u7ED3\u5C3E\u6807\u70B9\u7B26\u53F7",description:"\u8981\u4ECE\u6587\u4EF6\u6807\u9898\u7ED3\u5C3E\u4E2D\u5220\u9664\u7684\u6807\u70B9\u7B26\u53F7"}},"remove-yaml-keys":{name:"\u79FB\u9664 YAML \u952E",description:"\u79FB\u9664\u6307\u5B9A\u7684 YAML \u952E","yaml-keys-to-remove":{name:"\u9700\u8981\u79FB\u9664\u7684 YAML \u952E",description:"\u8981\u4ECE YAML Front-matter \u4E2D\u5220\u9664\u7684 YAML \u952E \uFF08\u53EF\u5E26\u6216\u4E0D\u5E26\u5192\u53F7\uFF09"}},"space-after-list-markers":{name:"\u5217\u8868\u6807\u5FD7\u7A7A\u683C",description:"\u5217\u8868\u6807\u5FD7\u548C checkbox \u540E\u5E94\u6709\u4E00\u4E2A\u7A7A\u683C"},"space-between-chinese-japanese-or-korean-and-english-or-numbers":{name:"\u4E2D\u65E5\u97E9\u8BED\u4E0E\u82F1\u8BED\u6216\u6570\u5B57\u4E4B\u95F4\u7684\u7A7A\u683C",description:"\u786E\u4FDD\u4E2D\u6587\u3001\u65E5\u6587\u6216\u97E9\u6587\u548C\u82F1\u6587\u6216\u6570\u5B57\u7531\u5355\u4E2A\u7A7A\u683C\u5206\u9694. [\u53C2\u8003\u94FE\u63A5](https://github.com/sparanoid/chinese-copywriting-guidelines)"},"strong-style":{name:"\u7C97\u4F53\u6837\u5F0F",description:"\u786E\u4FDD\u7C97\u4F53\u6837\u5F0F\u4E00\u81F4",style:{name:"\u6837\u5F0F",description:"\u7528\u4E8E\u8868\u793A\u7C97\u4F53\u7684\u6837\u5F0F"}},"trailing-spaces":{name:"\u672B\u5C3E\u7A7A\u683C",description:"\u79FB\u9664\u6BCF\u884C\u672B\u5C3E\u591A\u4F59\u7684\u7A7A\u683C","twp-space-line-break":{name:"\u4E24\u7A7A\u683C\u6362\u884C",description:'\u5FFD\u7565\u4E24\u4E2A\u7A7A\u683C\u540E\u63A5\u6362\u884C\u7B26\u7684\u60C5\u51B5\uFF08"\u4E24\u7A7A\u683C\u89C4\u5219"\uFF09'}},"two-spaces-between-lines-with-content":{name:"\u5185\u5BB9\u95F4\u9694\u4E24\u4E2A\u7A7A\u683C",description:"\u786E\u4FDD\u5728\u6BB5\u843D\u3001\u5F15\u7528\u548C\u5217\u8868\u9879\u4E2D\uFF0C\u6700\u540E\u4E00\u884C\u5185\u5BB9\u7684\u884C\u672B\u6DFB\u52A0\u4E24\u4E2A\u7A7A\u683C"},"unordered-list-style":{name:"\u65E0\u5E8F\u5217\u8868\u6837\u5F0F",description:"\u786E\u4FDD\u65E0\u5E8F\u5217\u8868\u7B26\u5408\u6307\u5B9A\u7684\u6837\u5F0F","list-style":{name:"\u5217\u8868\u9879\u6837\u5F0F",description:"\u5217\u8868\u9879\u9700\u8981\u6307\u5B9A\u7684\u6837\u5F0F"}},"yaml-key-sort":{name:"YAML \u952E\u6392\u5E8F",description:"\u6839\u636E\u6307\u5B9A\u7684\u987A\u5E8F\u548C\u4F18\u5148\u7EA7\u5BF9 YAML \u952E\u8FDB\u884C\u6392\u5E8F\u3002**\u6CE8\u610F\uFF0C\u4E5F\u8BB8\u4E5F\u4F1A\u5220\u9664\u7A7A\u884C**","yaml-key-priority-sort-order":{name:"YAML \u952E\u4F18\u5148\u7EA7\u6392\u5E8F\u987A\u5E8F",description:"\u5BF9\u952E\u8FDB\u884C\u6392\u5E8F\u7684\u987A\u5E8F\uFF0C\u6BCF\u884C\u4E00\u4E2A\u952E\uFF0C\u6309\u5217\u8868\u4E2D\u7684\u987A\u5E8F\u8FDB\u884C\u6392\u5E8F"},"priority-keys-at-start-of-yaml":{name:"\u6392\u5E8F\u952E\u653E\u5728 YAML \u5F00\u5934",description:"\u6309\u7167 `YAML \u952E\u4F18\u5148\u7EA7\u6392\u5E8F\u987A\u5E8F`\u5C06\u952E\u653E\u4E8E YAML Front-matter \u5F00\u5934"},"yaml-sort-order-for-other-keys":{name:"YAML \u5176\u5B83\u952E\u7684\u6392\u5E8F\u987A\u5E8F",description:"\u5BF9 `YAML \u952E\u4F18\u5148\u7EA7\u6392\u5E8F\u987A\u5E8F`\u4E2D\u672A\u627E\u5230\u7684\u952E\u8FDB\u884C\u6392\u5E8F"}},"yaml-timestamp":{name:"YAML \u65F6\u95F4\u6233",description:"\u5728 YAML Front-matter \u4E2D\u8BB0\u5F55\u4E0A\u6B21\u7F16\u8F91\u6587\u6863\u7684\u65E5\u671F\u3002\u4ECE\u6587\u6863\u5143\u6570\u636E\u4E2D\u83B7\u53D6\u65E5\u671F\u6570\u636E","date-created":{name:"\u521B\u5EFA\u65E5\u671F",description:"\u63D2\u5165\u6587\u4EF6\u7684\u521B\u5EFA\u65E5\u671F"},"date-created-key":{name:"\u521B\u5EFA\u65E5\u671F\u952E\u540D",description:"\u4F7F\u7528\u54EA\u4E2A YAML \u952E\u6765\u8868\u793A\u521B\u5EFA\u65E5\u671F"},"force-retention-of-create-value":{name:"\u5F3A\u5236\u4FDD\u7559\u521B\u5EFA\u65E5\u671F\u503C",description:"\u6CBF\u7528 YAML Front-matter \u4E2D\u5DF2\u6709\u7684\u521B\u5EFA\u65E5\u671F\uFF0C\u5FFD\u7565\u6587\u6863\u5143\u6570\u636E\u3002\u5BF9\u4E8E\u6587\u6863\u5143\u6570\u636E\u66F4\u6539\uFF08\u6BD4\u5982\u590D\u5236\u6587\u4EF6\uFF09\u5BFC\u81F4\u7684\u521B\u5EFA\u65F6\u95F4\u66F4\u6539\u975E\u5E38\u6709\u7528"},"date-modified":{name:"\u4FEE\u6539\u65E5\u671F",description:"\u63D2\u5165\u6587\u4EF6\u7684\u6700\u8FD1\u4E00\u6B21\u7684\u4FEE\u6539\u65E5\u671F"},"date-modified-key":{name:"\u4FEE\u6539\u65E5\u671F\u952E\u540D",description:"\u4F7F\u7528\u54EA\u4E2A YAML \u952E\u6765\u8868\u793A\u4FEE\u6539\u65E5\u671F"},format:{name:"\u683C\u5F0F",description:"Moment.js \u8BED\u6CD5\u683C\u5F0F\uFF08\u8BE6\u60C5\u8BBE\u7F6E\u89C1[Moment format options](https://momentjscom.readthedocs.io/en/latest/moment/04-displaying/01-format/)"}},"yaml-title-alias":{name:"YAML \u6807\u9898\u522B\u540D",description:"\u5C06\u6587\u6863\u7684\u6807\u9898\u63D2\u5165 YAML Front-matter \u7684 aliases \u90E8\u5206\u3002\u4ECE\u7B2C\u4E00\u4E2A H1 \u6807\u9898\u6216\u6587\u6863\u540D\u4E2D\u83B7\u53D6\u503C","preserve-existing-alias-section-style":{name:"\u4FDD\u7559\u73B0\u6709\u522B\u540D\u90E8\u5206\u6837\u5F0F",description:"\u5982\u679C\u8BBE\u7F6E\uFF0C\u6B64\u9879\u4EC5\u5728\u65B0\u521B\u5EFA\u7684\u522B\u540D\u90E8\u5206\u751F\u6548"},"keep-alias-that-matches-the-filename":{name:"\u786E\u4FDD\u522B\u540D\u4E0E\u6587\u4EF6\u540D\u5339\u914D",description:"\u8FD9\u6837\u7684\u522B\u540D\u901A\u5E38\u662F\u5197\u4F59\u7684"},"use-yaml-key-to-keep-track-of-old-filename-or-heading":{name:"\u4F7F\u7528 YAML \u952E `linter-yaml-title-alias` \u6765\u4FDD\u7559\u6807\u9898\u4FEE\u6539\u8BB0\u5F55",description:"\u5982\u679C\u8BBE\u7F6E\uFF0C\u5F53\u7B2C\u4E00\u4E2A H1 \u6807\u9898\u66F4\u6539\u6216\u6587\u6863\u540D\u66F4\u6539\u65F6\uFF0C\u6B64\u952E\u4E2D\u5B58\u50A8\u7684\u65E7 aliases \u5C06\u66FF\u6362\u4E3A\u65B0\u503C\uFF0C\u800C\u4E0D\u4EC5\u4EC5\u662F\u5728 aliases \u4E2D\u63D2\u5165\u65B0\u6761\u76EE"}},"yaml-title":{name:"YAML \u6807\u9898",description:"\u5C06\u6587\u4EF6\u7684\u6807\u9898\u63D2\u5165\u5230 YAML Front-matter \u4E2D\u3002 \u6839\u636E\u6240\u9009\u6A21\u5F0F\u83B7\u53D6\u6807\u9898","title-key":{name:"\u6807\u9898\u952E",description:"\u6807\u9898\u4F7F\u7528\u54EA\u4E00\u4E2A YAML \u952E"},mode:{name:"\u6A21\u5F0F",description:"\u7528\u4E8E\u83B7\u53D6\u6807\u9898\u7684\u65B9\u6CD5"}}},enums:{"Title Case":"\u6BCF\u8BCD\u9996\u5B57\u6BCD\u5927\u5199","ALL CAPS":"\u5168\u90E8\u5927\u5199","First letter":"\u4EC5\u9996\u5B57\u6BCD\u5927\u5199",".":".",")":")",ERROR:"ERROR",TRACE:"TRACE",DEBUG:"DEBUG",INFO:"INFO",WARN:"WARN",SILENT:"SILENT",ascending:"\u5347\u5E8F",lazy:"\u5168\u4E3A1",Nothing:"\u65E0","Remove hashtag":"\u79FB\u9664hashtag","Remove whole tag":"\u79FB\u9664\u6574\u4E2A tag",asterisk:"\u661F\u53F7(*)",underscore:"\u4E0B\u5212\u7EBF(_)",consistent:"\u4FDD\u6301\u4E00\u81F4","-":"-","*":"*","+":"+",space:"\u6709\u7A7A\u683C","no space":"\u65E0\u7A7A\u683C",None:"\u65E0","Ascending Alphabetical":"\u6309\u5B57\u6BCD\u987A\u5E8F\u5347\u5E8F","Descending Alphabetical":"\u6309\u5B57\u6BCD\u987A\u5E8F\u964D\u5E8F","multi-line":"\u591A\u884C\u6570\u7EC4","single-line":"\u5355\u884C\u6570\u7EC4","single string to single-line":"\u5B57\u7B26\u4E32\u8F6C\u5355\u884C\u6570\u7EC4","single string to multi-line":"\u5B57\u7B26\u4E32\u8F6C\u591A\u884C\u6570\u7EC4","single string comma delimited":"\u9017\u53F7\u5206\u9694\u5B57\u7B26\u4E32","single string space delimited":"\u7A7A\u683C\u5206\u9694\u5B57\u7B26\u4E32","single-line space delimited":"\u7A7A\u683C\u5206\u9694\u5355\u884C\u6570\u7EC4","first-h1":"\u7B2C\u4E00\u4E2A H1 \u6807\u9898","first-h1-or-filename-if-h1-missing":"\u7B2C\u4E00\u4E2A H1 \u6807\u9898\u6216\u6587\u4EF6\u540D\uFF08\u7B2C\u4E00\u4E2A H1 \u6807\u9898\u4E0D\u5B58\u5728\u65F6\uFF09",filename:"\u6587\u4EF6\u540D","''":"''","\u2018\u2019":"\u2018\u2019",'""':'""',"\u201C\u201D":"\u201C\u201D"}};var Ud={};var Vd={ar:Ad,cz:Td,da:Ld,de:Ed,en:Wo,es:Od,fr:Cd,hi:Md,id:qd,it:Id,ja:Bd,ko:_d,nl:Fd,no:Rd,pl:Dd,"pt-BR":jd,pt:Nd,ro:Kd,ru:Yd,sq:Pd,tr:Hd,uk:$d,"zh-TW":Ud,zh:Wd};var Ha="en",Pa=Vd[Ha];function $a(e){Ha=e,Pa=Vd[Ha||"en"]}function E(e){return Pa||gt(`locale not found for '${Ha}'`),Pa&&Pn(Pa,e)||Pn(Wo,e)}var Wa=function(e){if(e==null)return Xh;if(typeof e=="function")return Ua(e);if(typeof e=="object")return Array.isArray(e)?Qh(e):Zh(e);if(typeof e=="string")return Jh(e);throw new Error("Expected function, string, or object as test")};function Qh(e){let t=[],i=-1;for(;++i":""))+")"})}return g;function g(){let p=Gd,f,w,x;if((!t||a(l,c,d[d.length-1]||void 0))&&(p=tf(i(l,d)),p[0]===Va))return p;if("children"in l&&l.children){let b=l;if(b.children&&p[0]!==Vo)for(w=(n?b.children.length:-1)+s,x=d.concat(b);w>-1&&w=0;){let r=e.charAt(n);if(r===`
+`)break;r.trim()===""||r===">"?i=r+i:i="",n--}return[i,n]}function Za(e=""){let[t]=Qa(e,e.length);return`
+`+t.trim()}function nf(e="",t=!1,i=1){let n=Za(e),r=Vi(n,">");return(t||Xa.test(e))&&i===r||i")):n}function rf(e="",t=!1,i=1){let n=Za(e),r=Vi(n,">");return(t||Xa.test(e))&&i===r?n.substring(0,n.lastIndexOf(">")):i>=r?n:n.substring(0,n.lastIndexOf(">"))}function af(e,t){if(t===0)return e;let i=t,n=t;for(;i>=0;){let r=e.charAt(i);if(r.trim()!=="")break;r===`
+`&&(n=i),i--}return i<0||n===0?e.substring(t+1):e.substring(0,n)+`
+`+e.substring(t)}function sf(e,t,i,n=!1,r=!1){if(i===0)return e;let a=t.split(">").length-1,s=i,o=i,l=0,c=!1,d="";for(;s>=0;){let x=e.charAt(s);if(x.trim()!==""&&x!==">")break;if(x===">"){if(c)break;l++}else if(x===`
+`)if(l===0||l===a||l+1===a)o=s,l=0,d===`
+`&&(c=!0);else break;s--,d=x}if(s<0||o===0)return e.substring(i+1);let u=e.substring(o,i);if(u===`
+`||u.startsWith(`
+
+`))return e.substring(0,o)+`
+`+e.substring(i);let p=e.lastIndexOf(`
+`,o-1),f="";p===-1?f=e.substring(0,o):f=e.substring(p,o);let w=r?rf(f,n,a):Za(f);return e.substring(0,o)+w+e.substring(i)}function of(e,t){if(t===e.length-1)return e;let i=t,n=t,r=!0;for(;i").length-1,s=i,o=i,l=!0,c=0,d=!1,u="",g=!0,p=e.charAt(s-1);for(;s")break;if(L===">"){if(d)break;c++}else if(L===`
+`)if(c===0||c===a||c+1===a)c=0,l?l=!1:o=s,u===`
+`&&(d=!0);else break;if(s++,u=L,g&&L===`
+`&&r&&p===`
+`){o=s;break}g=!1}if(s===e.length||o===e.length-1)return e.substring(0,i);let f=e.substring(i,o);if(f===`
+`||f.endsWith(`
+
+`))return e.substring(0,i)+`
+`+e.substring(o);let x=e.indexOf(`
+`,o+1),b="";x===-1?b=e.substring(o):b=e.substring(o+1,x);let S=r?nf(b,n,a):Za(b);return e.substring(0,i)+S+e.substring(o)}function yt(e,t,i,n=!1){let[r,a]=Qa(e,t);if(r.trim()!==""){let o=Xa.test(e.substring(t,i)),l=Vi(r,">"),c=df(e,i,l),d=lf(e,r,c,o,n);return a=cf(d,a,l),sf(d,r,a,o,n)}let s=of(e,i);return af(s,a)}function Zd(e,t=0){let i=3735928559^t,n=1103547991^t;for(let r=0,a;r>>16,2246822507)^Math.imul(n^n>>>13,3266489909),n=Math.imul(n^n>>>16,2246822507)^Math.imul(i^i>>>13,3266489909),4294967296*(2097151&n)+(i>>>0)}function Jd(e){return e=e.replaceAll("\\b","\b"),e=e.replaceAll("\\f","\f"),e=e.replaceAll("\\n",`
+`),e=e.replaceAll("\\r","\r"),e=e.replaceAll("\\t"," "),e=e.replaceAll("\\v","\v"),e}function $n(e,t){if(t==0)return t;let i=t;for(;i>0&&e.charAt(i-1)!==`
+`;)i--;return i}function Xd(e,t,i,n){return n>e.length-1?e:e.slice(0,n)+e.slice(n,e.length).replace(t,i)}function Vi(e,t){let i=0;for(let n=0,r=e.length;n-1&&(i++,n=a)}return i}function Ja(e){let t=typeof e;return t!="string"?t==="number":!isNaN(e)&&!isNaN(parseFloat(e))}function eu(e,t){let i=[],n=-1;for(;(n=t.indexOf(e,n+1))>=0;)i.push(n);return i}function cf(e,t,i){let n=t,r=t+1,a="",s=!1,o=0;for(;r"){s=!0;break}else if(a===`
+`){if(o!==i)break;o=0,n=r}else a===">"&&o++;r++}return s?n:t}function df(e,t,i){let n=t,r=t-1,a="",s=!1,o=0;for(;r>=0;){if(a=e.charAt(r),a.trim()!==""&&a!==">"){s=!0;break}else if(a===`
+`){if(o!==i)break;o=0,n=r}else a===">"&&o++;r--}return s?n:t}function Ie(e,t,i,n){let r=e.length,a=0,s;if(t<0?t=-t>r?0:r+t:t=t>r?r:t,i=i>0?i:0,n.length<1e4)s=Array.from(n),s.unshift(t,i),e.splice(...s);else for(i&&e.splice(t,i);a0?(Ie(e,e.length,0,t),e):t}var uf=Gi(/\p{P}/u),ii=Gi(/[A-Za-z]/),Ue=Gi(/[\dA-Za-z]/),iu=Gi(/[#-'*+\--9=?A-Z^-~]/);function Wn(e){return e!==null&&(e<32||e===127)}var Un=Gi(/\d/),tu=Gi(/[\dA-Fa-f]/),Qo=Gi(/[!-/:-@[-`{-~]/);function F(e){return e!==null&&e<-2}function te(e){return e!==null&&(e<0||e===32)}function W(e){return e===-2||e===-1||e===32}function nu(e){return Qo(e)||uf(e)}var ru=Gi(/\s/);function Gi(e){return t;function t(i){return i!==null&&i>-1&&e.test(String.fromCharCode(i))}}function Zo(e){if(e===null||te(e)||ru(e))return 1;if(nu(e))return 2}function dn(e,t,i){let n=[],r=-1;for(;++r1&&e[i][1].end.offset-e[i][1].start.offset>1?2:1;let u=Object.assign({},e[n][1].end),g=Object.assign({},e[i][1].start);au(u,-l),au(g,l),s={type:l>1?"strongSequence":"emphasisSequence",start:u,end:Object.assign({},e[n][1].end)},o={type:l>1?"strongSequence":"emphasisSequence",start:Object.assign({},e[i][1].start),end:g},a={type:l>1?"strongText":"emphasisText",start:Object.assign({},e[n][1].end),end:Object.assign({},e[i][1].start)},r={type:l>1?"strong":"emphasis",start:Object.assign({},s.start),end:Object.assign({},o.end)},e[n][1].end=Object.assign({},s.start),e[i][1].start=Object.assign({},o.end),c=[],e[n][1].end.offset-e[n][1].start.offset&&(c=We(c,[["enter",e[n][1],t],["exit",e[n][1],t]])),c=We(c,[["enter",r,t],["enter",s,t],["exit",s,t],["enter",a,t]]),c=We(c,dn(t.parser.constructs.insideSpan.null,e.slice(n+1,i),t)),c=We(c,[["exit",a,t],["enter",o,t],["exit",o,t],["exit",r,t]]),e[i][1].end.offset-e[i][1].start.offset?(d=2,c=We(c,[["enter",e[i][1],t],["exit",e[i][1],t]])):d=0,Ie(e,n-1,i-n+3,c),i=n+c.length-d-2;break}}for(i=-1;++i0&&W(T)?Y(e,S,"linePrefix",a+1)(T):S(T)}function S(T){return T===null||F(T)?e.check(ou,w,C)(T):(e.enter("codeFlowValue"),L(T))}function L(T){return T===null||F(T)?(e.exit("codeFlowValue"),S(T)):(e.consume(T),L)}function C(T){return e.exit("codeFenced"),t(T)}function R(T,B,q){let _=0;return P;function P(H){return T.enter("lineEnding"),T.consume(H),T.exit("lineEnding"),X}function X(H){return T.enter("codeFencedFence"),W(H)?Y(T,G,"linePrefix",n.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(H):G(H)}function G(H){return H===o?(T.enter("codeFencedFenceSequence"),D(H)):q(H)}function D(H){return H===o?(_++,T.consume(H),D):_>=s?(T.exit("codeFencedFenceSequence"),W(H)?Y(T,U,"whitespace")(H):U(H)):q(H)}function U(H){return H===null||F(H)?(T.exit("codeFencedFence"),B(H)):q(H)}}}function kf(e,t,i){let n=this;return r;function r(s){return s===null?i(s):(e.enter("lineEnding"),e.consume(s),e.exit("lineEnding"),a)}function a(s){return n.parser.lazy[n.now().line]?i(s):t(s)}}var Gn={name:"codeIndented",tokenize:Sf},zf={tokenize:Af,partial:!0};function Sf(e,t,i){let n=this;return r;function r(c){return e.enter("codeIndented"),Y(e,a,"linePrefix",4+1)(c)}function a(c){let d=n.events[n.events.length-1];return d&&d[1].type==="linePrefix"&&d[2].sliceSerialize(d[1],!0).length>=4?s(c):i(c)}function s(c){return c===null?l(c):F(c)?e.attempt(zf,s,l)(c):(e.enter("codeFlowValue"),o(c))}function o(c){return c===null||F(c)?(e.exit("codeFlowValue"),s(c)):(e.consume(c),o)}function l(c){return e.exit("codeIndented"),t(c)}}function Af(e,t,i){let n=this;return r;function r(s){return n.parser.lazy[n.now().line]?i(s):F(s)?(e.enter("lineEnding"),e.consume(s),e.exit("lineEnding"),r):Y(e,a,"linePrefix",4+1)(s)}function a(s){let o=n.events[n.events.length-1];return o&&o[1].type==="linePrefix"&&o[2].sliceSerialize(o[1],!0).length>=4?t(s):F(s)?r(s):i(s)}}var Xo={name:"codeText",tokenize:Ef,resolve:Tf,previous:Lf};function Tf(e){let t=e.length-4,i=3,n,r;if((e[i][1].type==="lineEnding"||e[i][1].type==="space")&&(e[t][1].type==="lineEnding"||e[t][1].type==="space")){for(n=i;++n=4?t(s):e.interrupt(n.parser.constructs.flow,i,t)(s)}}function as(e,t,i,n,r,a,s,o,l){let c=l||Number.POSITIVE_INFINITY,d=0;return u;function u(b){return b===60?(e.enter(n),e.enter(r),e.enter(a),e.consume(b),e.exit(a),g):b===null||b===32||b===41||Wn(b)?i(b):(e.enter(n),e.enter(s),e.enter(o),e.enter("chunkString",{contentType:"string"}),w(b))}function g(b){return b===62?(e.enter(a),e.consume(b),e.exit(a),e.exit(r),e.exit(n),t):(e.enter(o),e.enter("chunkString",{contentType:"string"}),p(b))}function p(b){return b===62?(e.exit("chunkString"),e.exit(o),g(b)):b===null||b===60||F(b)?i(b):(e.consume(b),b===92?f:p)}function f(b){return b===60||b===62||b===92?(e.consume(b),p):p(b)}function w(b){return!d&&(b===null||b===41||te(b))?(e.exit("chunkString"),e.exit(o),e.exit(s),e.exit(n),t(b)):d999||p===null||p===91||p===93&&!l||p===94&&!o&&"_hiddenFootnoteSupport"in s.parser.constructs?i(p):p===93?(e.exit(a),e.enter(r),e.consume(p),e.exit(r),e.exit(n),t):F(p)?(e.enter("lineEnding"),e.consume(p),e.exit("lineEnding"),d):(e.enter("chunkString",{contentType:"string"}),u(p))}function u(p){return p===null||p===91||p===93||F(p)||o++>999?(e.exit("chunkString"),d(p)):(e.consume(p),l||(l=!W(p)),p===92?g:u)}function g(p){return p===91||p===92||p===93?(e.consume(p),o++,u):u(p)}}function os(e,t,i,n,r,a){let s;return o;function o(g){return g===34||g===39||g===40?(e.enter(n),e.enter(r),e.consume(g),e.exit(r),s=g===40?41:g,l):i(g)}function l(g){return g===s?(e.enter(r),e.consume(g),e.exit(r),e.exit(n),t):(e.enter(a),c(g))}function c(g){return g===s?(e.exit(a),l(s)):g===null?i(g):F(g)?(e.enter("lineEnding"),e.consume(g),e.exit("lineEnding"),Y(e,c,"linePrefix")):(e.enter("chunkString",{contentType:"string"}),d(g))}function d(g){return g===s||g===null||F(g)?(e.exit("chunkString"),c(g)):(e.consume(g),g===92?u:d)}function u(g){return g===s||g===92?(e.consume(g),d):d(g)}}function bt(e,t){let i;return n;function n(r){return F(r)?(e.enter("lineEnding"),e.consume(r),e.exit("lineEnding"),i=!0,n):W(r)?Y(e,n,i?"linePrefix":"lineSuffix")(r):t(r)}}function Ke(e){return e.replace(/[\t\n\r ]+/g," ").replace(/^ | $/g,"").toLowerCase().toUpperCase()}var il={name:"definition",tokenize:_f},Bf={tokenize:Ff,partial:!0};function _f(e,t,i){let n=this,r;return a;function a(p){return e.enter("definition"),s(p)}function s(p){return ss.call(n,e,o,i,"definitionLabel","definitionLabelMarker","definitionLabelString")(p)}function o(p){return r=Ke(n.sliceSerialize(n.events[n.events.length-1][1]).slice(1,-1)),p===58?(e.enter("definitionMarker"),e.consume(p),e.exit("definitionMarker"),l):i(p)}function l(p){return te(p)?bt(e,c)(p):c(p)}function c(p){return as(e,d,i,"definitionDestination","definitionDestinationLiteral","definitionDestinationLiteralMarker","definitionDestinationRaw","definitionDestinationString")(p)}function d(p){return e.attempt(Bf,u,u)(p)}function u(p){return W(p)?Y(e,g,"whitespace")(p):g(p)}function g(p){return p===null||F(p)?(e.exit("definition"),n.parser.defined.push(r),t(p)):i(p)}}function Ff(e,t,i){return n;function n(o){return te(o)?bt(e,r)(o):i(o)}function r(o){return os(e,a,i,"definitionTitle","definitionTitleMarker","definitionTitleString")(o)}function a(o){return W(o)?Y(e,s,"whitespace")(o):s(o)}function s(o){return o===null||F(o)?t(o):i(o)}}var tl={name:"hardBreakEscape",tokenize:Rf};function Rf(e,t,i){return n;function n(a){return e.enter("hardBreakEscape"),e.consume(a),r}function r(a){return F(a)?(e.exit("hardBreakEscape"),t(a)):i(a)}}var nl={name:"headingAtx",tokenize:Nf,resolve:Df};function Df(e,t){let i=e.length-2,n=3,r,a;return e[n][1].type==="whitespace"&&(n+=2),i-2>n&&e[i][1].type==="whitespace"&&(i-=2),e[i][1].type==="atxHeadingSequence"&&(n===i-1||i-4>n&&e[i-2][1].type==="whitespace")&&(i-=n+1===i?2:4),i>n&&(r={type:"atxHeadingText",start:e[n][1].start,end:e[i][1].end},a={type:"chunkText",start:e[n][1].start,end:e[i][1].end,contentType:"text"},Ie(e,n,i-n+1,[["enter",r,t],["enter",a,t],["exit",a,t],["exit",r,t]])),e}function Nf(e,t,i){let n=0;return r;function r(d){return e.enter("atxHeading"),a(d)}function a(d){return e.enter("atxHeadingSequence"),s(d)}function s(d){return d===35&&n++<6?(e.consume(d),s):d===null||te(d)?(e.exit("atxHeadingSequence"),o(d)):i(d)}function o(d){return d===35?(e.enter("atxHeadingSequence"),l(d)):d===null||F(d)?(e.exit("atxHeading"),t(d)):W(d)?Y(e,o,"whitespace")(d):(e.enter("atxHeadingText"),c(d))}function l(d){return d===35?(e.consume(d),l):(e.exit("atxHeadingSequence"),o(d))}function c(d){return d===null||d===35||te(d)?(e.exit("atxHeadingText"),o(d)):(e.consume(d),c)}}var lu=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","search","section","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"],rl=["pre","script","style","textarea"];var al={name:"htmlFlow",tokenize:Pf,resolveTo:Yf,concrete:!0},jf={tokenize:$f,partial:!0},Kf={tokenize:Hf,partial:!0};function Yf(e){let t=e.length;for(;t--&&!(e[t][0]==="enter"&&e[t][1].type==="htmlFlow"););return t>1&&e[t-2][1].type==="linePrefix"&&(e[t][1].start=e[t-2][1].start,e[t+1][1].start=e[t-2][1].start,e.splice(t-2,2)),e}function Pf(e,t,i){let n=this,r,a,s,o,l;return c;function c(z){return d(z)}function d(z){return e.enter("htmlFlow"),e.enter("htmlFlowData"),e.consume(z),u}function u(z){return z===33?(e.consume(z),g):z===47?(e.consume(z),a=!0,w):z===63?(e.consume(z),r=3,n.interrupt?t:k):ii(z)?(e.consume(z),s=String.fromCharCode(z),x):i(z)}function g(z){return z===45?(e.consume(z),r=2,p):z===91?(e.consume(z),r=5,o=0,f):ii(z)?(e.consume(z),r=4,n.interrupt?t:k):i(z)}function p(z){return z===45?(e.consume(z),n.interrupt?t:k):i(z)}function f(z){let be="CDATA[";return z===be.charCodeAt(o++)?(e.consume(z),o===be.length?n.interrupt?t:G:f):i(z)}function w(z){return ii(z)?(e.consume(z),s=String.fromCharCode(z),x):i(z)}function x(z){if(z===null||z===47||z===62||te(z)){let be=z===47,De=s.toLowerCase();return!be&&!a&&rl.includes(De)?(r=1,n.interrupt?t(z):G(z)):lu.includes(s.toLowerCase())?(r=6,be?(e.consume(z),b):n.interrupt?t(z):G(z)):(r=7,n.interrupt&&!n.parser.lazy[n.now().line]?i(z):a?S(z):L(z))}return z===45||Ue(z)?(e.consume(z),s+=String.fromCharCode(z),x):i(z)}function b(z){return z===62?(e.consume(z),n.interrupt?t:G):i(z)}function S(z){return W(z)?(e.consume(z),S):P(z)}function L(z){return z===47?(e.consume(z),P):z===58||z===95||ii(z)?(e.consume(z),C):W(z)?(e.consume(z),L):P(z)}function C(z){return z===45||z===46||z===58||z===95||Ue(z)?(e.consume(z),C):R(z)}function R(z){return z===61?(e.consume(z),T):W(z)?(e.consume(z),R):L(z)}function T(z){return z===null||z===60||z===61||z===62||z===96?i(z):z===34||z===39?(e.consume(z),l=z,B):W(z)?(e.consume(z),T):q(z)}function B(z){return z===l?(e.consume(z),l=null,_):z===null||F(z)?i(z):(e.consume(z),B)}function q(z){return z===null||z===34||z===39||z===47||z===60||z===61||z===62||z===96||te(z)?R(z):(e.consume(z),q)}function _(z){return z===47||z===62||W(z)?L(z):i(z)}function P(z){return z===62?(e.consume(z),X):i(z)}function X(z){return z===null||F(z)?G(z):W(z)?(e.consume(z),X):i(z)}function G(z){return z===45&&r===2?(e.consume(z),J):z===60&&r===1?(e.consume(z),ee):z===62&&r===4?(e.consume(z),Re):z===63&&r===3?(e.consume(z),k):z===93&&r===5?(e.consume(z),Le):F(z)&&(r===6||r===7)?(e.exit("htmlFlowData"),e.check(jf,He,D)(z)):z===null||F(z)?(e.exit("htmlFlowData"),D(z)):(e.consume(z),G)}function D(z){return e.check(Kf,U,He)(z)}function U(z){return e.enter("lineEnding"),e.consume(z),e.exit("lineEnding"),H}function H(z){return z===null||F(z)?D(z):(e.enter("htmlFlowData"),G(z))}function J(z){return z===45?(e.consume(z),k):G(z)}function ee(z){return z===47?(e.consume(z),s="",Fe):G(z)}function Fe(z){if(z===62){let be=s.toLowerCase();return rl.includes(be)?(e.consume(z),Re):G(z)}return ii(z)&&s.length<8?(e.consume(z),s+=String.fromCharCode(z),Fe):G(z)}function Le(z){return z===93?(e.consume(z),k):G(z)}function k(z){return z===62?(e.consume(z),Re):z===45&&r===2?(e.consume(z),k):G(z)}function Re(z){return z===null||F(z)?(e.exit("htmlFlowData"),He(z)):(e.consume(z),Re)}function He(z){return e.exit("htmlFlow"),t(z)}}function Hf(e,t,i){let n=this;return r;function r(s){return F(s)?(e.enter("lineEnding"),e.consume(s),e.exit("lineEnding"),a):i(s)}function a(s){return n.parser.lazy[n.now().line]?i(s):t(s)}}function $f(e,t,i){return n;function n(r){return e.enter("lineEnding"),e.consume(r),e.exit("lineEnding"),e.attempt(ki,t,i)}}var sl={name:"htmlText",tokenize:Wf};function Wf(e,t,i){let n=this,r,a,s;return o;function o(k){return e.enter("htmlText"),e.enter("htmlTextData"),e.consume(k),l}function l(k){return k===33?(e.consume(k),c):k===47?(e.consume(k),R):k===63?(e.consume(k),L):ii(k)?(e.consume(k),q):i(k)}function c(k){return k===45?(e.consume(k),d):k===91?(e.consume(k),a=0,f):ii(k)?(e.consume(k),S):i(k)}function d(k){return k===45?(e.consume(k),p):i(k)}function u(k){return k===null?i(k):k===45?(e.consume(k),g):F(k)?(s=u,ee(k)):(e.consume(k),u)}function g(k){return k===45?(e.consume(k),p):u(k)}function p(k){return k===62?J(k):k===45?g(k):u(k)}function f(k){let Re="CDATA[";return k===Re.charCodeAt(a++)?(e.consume(k),a===Re.length?w:f):i(k)}function w(k){return k===null?i(k):k===93?(e.consume(k),x):F(k)?(s=w,ee(k)):(e.consume(k),w)}function x(k){return k===93?(e.consume(k),b):w(k)}function b(k){return k===62?J(k):k===93?(e.consume(k),b):w(k)}function S(k){return k===null||k===62?J(k):F(k)?(s=S,ee(k)):(e.consume(k),S)}function L(k){return k===null?i(k):k===63?(e.consume(k),C):F(k)?(s=L,ee(k)):(e.consume(k),L)}function C(k){return k===62?J(k):L(k)}function R(k){return ii(k)?(e.consume(k),T):i(k)}function T(k){return k===45||Ue(k)?(e.consume(k),T):B(k)}function B(k){return F(k)?(s=B,ee(k)):W(k)?(e.consume(k),B):J(k)}function q(k){return k===45||Ue(k)?(e.consume(k),q):k===47||k===62||te(k)?_(k):i(k)}function _(k){return k===47?(e.consume(k),J):k===58||k===95||ii(k)?(e.consume(k),P):F(k)?(s=_,ee(k)):W(k)?(e.consume(k),_):J(k)}function P(k){return k===45||k===46||k===58||k===95||Ue(k)?(e.consume(k),P):X(k)}function X(k){return k===61?(e.consume(k),G):F(k)?(s=X,ee(k)):W(k)?(e.consume(k),X):_(k)}function G(k){return k===null||k===60||k===61||k===62||k===96?i(k):k===34||k===39?(e.consume(k),r=k,D):F(k)?(s=G,ee(k)):W(k)?(e.consume(k),G):(e.consume(k),U)}function D(k){return k===r?(e.consume(k),r=void 0,H):k===null?i(k):F(k)?(s=D,ee(k)):(e.consume(k),D)}function U(k){return k===null||k===34||k===39||k===60||k===61||k===96?i(k):k===47||k===62||te(k)?_(k):(e.consume(k),U)}function H(k){return k===47||k===62||te(k)?_(k):i(k)}function J(k){return k===62?(e.consume(k),e.exit("htmlTextData"),e.exit("htmlText"),t):i(k)}function ee(k){return e.exit("htmlTextData"),e.enter("lineEnding"),e.consume(k),e.exit("lineEnding"),Fe}function Fe(k){return W(k)?Y(e,Le,"linePrefix",n.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(k):Le(k)}function Le(k){return e.enter("htmlTextData"),s(k)}}var vt={name:"labelEnd",tokenize:Jf,resolveTo:Zf,resolveAll:Qf},Uf={tokenize:Xf},Vf={tokenize:ey},Gf={tokenize:iy};function Qf(e){let t=-1;for(;++t=3&&(c===null||F(c))?(e.exit("thematicBreak"),t(c)):i(c)}function l(c){return c===r?(e.consume(c),n++,l):(e.exit("thematicBreakSequence"),W(c)?Y(e,o,"whitespace")(c):o(c))}}var Ye={name:"list",tokenize:ly,continuation:{tokenize:cy},exit:uy},sy={tokenize:py,partial:!0},oy={tokenize:dy,partial:!0};function ly(e,t,i){let n=this,r=n.events[n.events.length-1],a=r&&r[1].type==="linePrefix"?r[2].sliceSerialize(r[1],!0).length:0,s=0;return o;function o(p){let f=n.containerState.type||(p===42||p===43||p===45?"listUnordered":"listOrdered");if(f==="listUnordered"?!n.containerState.marker||p===n.containerState.marker:Un(p)){if(n.containerState.type||(n.containerState.type=f,e.enter(f,{_container:!0})),f==="listUnordered")return e.enter("listItemPrefix"),p===42||p===45?e.check(xt,i,c)(p):c(p);if(!n.interrupt||p===49)return e.enter("listItemPrefix"),e.enter("listItemValue"),l(p)}return i(p)}function l(p){return Un(p)&&++s<10?(e.consume(p),l):(!n.interrupt||s<2)&&(n.containerState.marker?p===n.containerState.marker:p===41||p===46)?(e.exit("listItemValue"),c(p)):i(p)}function c(p){return e.enter("listItemMarker"),e.consume(p),e.exit("listItemMarker"),n.containerState.marker=n.containerState.marker||p,e.check(ki,n.interrupt?i:d,e.attempt(sy,g,u))}function d(p){return n.containerState.initialBlankLine=!0,a++,g(p)}function u(p){return W(p)?(e.enter("listItemPrefixWhitespace"),e.consume(p),e.exit("listItemPrefixWhitespace"),g):i(p)}function g(p){return n.containerState.size=a+n.sliceSerialize(e.exit("listItemPrefix"),!0).length,t(p)}}function cy(e,t,i){let n=this;return n.containerState._closeFlow=void 0,e.check(ki,r,a);function r(o){return n.containerState.furtherBlankLines=n.containerState.furtherBlankLines||n.containerState.initialBlankLine,Y(e,t,"listItemIndent",n.containerState.size+1)(o)}function a(o){return n.containerState.furtherBlankLines||!W(o)?(n.containerState.furtherBlankLines=void 0,n.containerState.initialBlankLine=void 0,s(o)):(n.containerState.furtherBlankLines=void 0,n.containerState.initialBlankLine=void 0,e.attempt(oy,t,s)(o))}function s(o){return n.containerState._closeFlow=!0,n.interrupt=void 0,Y(e,e.attempt(Ye,t,i),"linePrefix",n.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(o)}}function dy(e,t,i){let n=this;return Y(e,r,"listItemIndent",n.containerState.size+1);function r(a){let s=n.events[n.events.length-1];return s&&s[1].type==="listItemIndent"&&s[2].sliceSerialize(s[1],!0).length===n.containerState.size?t(a):i(a)}}function uy(e){e.exit(this.containerState.type)}function py(e,t,i){let n=this;return Y(e,r,"listItemPrefixWhitespace",n.parser.constructs.disable.null.includes("codeIndented")?void 0:4+1);function r(a){let s=n.events[n.events.length-1];return!W(a)&&s&&s[1].type==="listItemPrefixWhitespace"?t(a):i(a)}}var ls={name:"setextUnderline",tokenize:gy,resolveTo:my};function my(e,t){let i=e.length,n,r,a;for(;i--;)if(e[i][0]==="enter"){if(e[i][1].type==="content"){n=i;break}e[i][1].type==="paragraph"&&(r=i)}else e[i][1].type==="content"&&e.splice(i,1),!a&&e[i][1].type==="definition"&&(a=i);let s={type:"setextHeading",start:Object.assign({},e[r][1].start),end:Object.assign({},e[e.length-1][1].end)};return e[r][1].type="setextHeadingText",a?(e.splice(r,0,["enter",s,t]),e.splice(a+1,0,["exit",e[n][1],t]),e[n][1].end=Object.assign({},e[a][1].end)):e[n][1]=s,e.push(["exit",s,t]),e}function gy(e,t,i){let n=this,r;return a;function a(c){let d=n.events.length,u;for(;d--;)if(n.events[d][1].type!=="lineEnding"&&n.events[d][1].type!=="linePrefix"&&n.events[d][1].type!=="content"){u=n.events[d][1].type==="paragraph";break}return!n.parser.lazy[n.now().line]&&(n.interrupt||u)?(e.enter("setextHeadingLine"),r=c,s(c)):i(c)}function s(c){return e.enter("setextHeadingLineSequence"),o(c)}function o(c){return c===r?(e.consume(c),o):(e.exit("setextHeadingLineSequence"),W(c)?Y(e,l,"lineSuffix")(c):l(c))}function l(c){return c===null||F(c)?(e.exit("setextHeadingLine"),t(c)):i(c)}}var hy={tokenize:ky,partial:!0};function cl(){return{document:{91:{tokenize:vy,continuation:{tokenize:xy},exit:wy}},text:{91:{tokenize:by},93:{add:"after",tokenize:fy,resolveTo:yy}}}}function fy(e,t,i){let n=this,r=n.events.length,a=n.parser.gfmFootnotes||(n.parser.gfmFootnotes=[]),s;for(;r--;){let l=n.events[r][1];if(l.type==="labelImage"){s=l;break}if(l.type==="gfmFootnoteCall"||l.type==="labelLink"||l.type==="label"||l.type==="image"||l.type==="link")break}return o;function o(l){if(!s||!s._balanced)return i(l);let c=Ke(n.sliceSerialize({start:s.end,end:n.now()}));return c.codePointAt(0)!==94||!a.includes(c.slice(1))?i(l):(e.enter("gfmFootnoteCallLabelMarker"),e.consume(l),e.exit("gfmFootnoteCallLabelMarker"),t(l))}}function yy(e,t){let i=e.length,n;for(;i--;)if(e[i][1].type==="labelImage"&&e[i][0]==="enter"){n=e[i][1];break}e[i+1][1].type="data",e[i+3][1].type="gfmFootnoteCallLabelMarker";let r={type:"gfmFootnoteCall",start:Object.assign({},e[i+3][1].start),end:Object.assign({},e[e.length-1][1].end)},a={type:"gfmFootnoteCallMarker",start:Object.assign({},e[i+3][1].end),end:Object.assign({},e[i+3][1].end)};a.end.column++,a.end.offset++,a.end._bufferIndex++;let s={type:"gfmFootnoteCallString",start:Object.assign({},a.end),end:Object.assign({},e[e.length-1][1].start)},o={type:"chunkString",contentType:"string",start:Object.assign({},s.start),end:Object.assign({},s.end)},l=[e[i+1],e[i+2],["enter",r,t],e[i+3],e[i+4],["enter",a,t],["exit",a,t],["enter",s,t],["enter",o,t],["exit",o,t],["exit",s,t],e[e.length-2],e[e.length-1],["exit",r,t]];return e.splice(i,e.length-i+1,...l),e}function by(e,t,i){let n=this,r=n.parser.gfmFootnotes||(n.parser.gfmFootnotes=[]),a=0,s;return o;function o(u){return e.enter("gfmFootnoteCall"),e.enter("gfmFootnoteCallLabelMarker"),e.consume(u),e.exit("gfmFootnoteCallLabelMarker"),l}function l(u){return u!==94?i(u):(e.enter("gfmFootnoteCallMarker"),e.consume(u),e.exit("gfmFootnoteCallMarker"),e.enter("gfmFootnoteCallString"),e.enter("chunkString").contentType="string",c)}function c(u){if(a>999||u===93&&!s||u===null||u===91||te(u))return i(u);if(u===93){e.exit("chunkString");let g=e.exit("gfmFootnoteCallString");return r.includes(Ke(n.sliceSerialize(g)))?(e.enter("gfmFootnoteCallLabelMarker"),e.consume(u),e.exit("gfmFootnoteCallLabelMarker"),e.exit("gfmFootnoteCall"),t):i(u)}return te(u)||(s=!0),a++,e.consume(u),u===92?d:c}function d(u){return u===91||u===92||u===93?(e.consume(u),a++,c):c(u)}}function vy(e,t,i){let n=this,r=n.parser.gfmFootnotes||(n.parser.gfmFootnotes=[]),a,s=0,o;return l;function l(f){return e.enter("gfmFootnoteDefinition")._container=!0,e.enter("gfmFootnoteDefinitionLabel"),e.enter("gfmFootnoteDefinitionLabelMarker"),e.consume(f),e.exit("gfmFootnoteDefinitionLabelMarker"),c}function c(f){return f===94?(e.enter("gfmFootnoteDefinitionMarker"),e.consume(f),e.exit("gfmFootnoteDefinitionMarker"),e.enter("gfmFootnoteDefinitionLabelString"),e.enter("chunkString").contentType="string",d):i(f)}function d(f){if(s>999||f===93&&!o||f===null||f===91||te(f))return i(f);if(f===93){e.exit("chunkString");let w=e.exit("gfmFootnoteDefinitionLabelString");return a=Ke(n.sliceSerialize(w)),e.enter("gfmFootnoteDefinitionLabelMarker"),e.consume(f),e.exit("gfmFootnoteDefinitionLabelMarker"),e.exit("gfmFootnoteDefinitionLabel"),g}return te(f)||(o=!0),s++,e.consume(f),f===92?u:d}function u(f){return f===91||f===92||f===93?(e.consume(f),s++,d):d(f)}function g(f){return f===58?(e.enter("definitionMarker"),e.consume(f),e.exit("definitionMarker"),r.includes(a)||r.push(a),Y(e,p,"gfmFootnoteDefinitionWhitespace")):i(f)}function p(f){return t(f)}}function xy(e,t,i){return e.check(ki,t,e.attempt(hy,t,i))}function wy(e){e.exit("gfmFootnoteDefinition")}function ky(e,t,i){let n=this;return Y(e,r,"gfmFootnoteDefinitionIndent",4+1);function r(a){let s=n.events[n.events.length-1];return s&&s[1].type==="gfmFootnoteDefinitionIndent"&&s[2].sliceSerialize(s[1],!0).length===4?t(a):i(a)}}var zy={tokenize:Sy};function dl(){return{text:{91:zy}}}function Sy(e,t,i){let n=this;return r;function r(l){return n.previous!==null||!n._gfmTasklistFirstContentOfListItem?i(l):(e.enter("taskListCheck"),e.enter("taskListCheckMarker"),e.consume(l),e.exit("taskListCheckMarker"),a)}function a(l){return te(l)?(e.enter("taskListCheckValueUnchecked"),e.consume(l),e.exit("taskListCheckValueUnchecked"),s):l===88||l===120?(e.enter("taskListCheckValueChecked"),e.consume(l),e.exit("taskListCheckValueChecked"),s):i(l)}function s(l){return l===93?(e.enter("taskListCheckMarker"),e.consume(l),e.exit("taskListCheckMarker"),e.exit("taskListCheck"),o):i(l)}function o(l){return F(l)?t(l):W(l)?e.check({tokenize:Ay},t,i)(l):i(l)}}function Ay(e,t,i){return Y(e,n,"whitespace");function n(r){return r===null?i(r):t(r)}}var cu={}.hasOwnProperty;function cs(e){let t={},i=-1;for(;++i13&&i<32||i>126&&i<160||i>55295&&i<57344||i>64975&&i<65008||(i&65535)===65535||(i&65535)===65534||i>1114111?"\uFFFD":String.fromCodePoint(i)}var hu={tokenize:By};function By(e){let t=e.attempt(this.parser.constructs.contentInitial,n,r),i;return t;function n(o){if(o===null){e.consume(o);return}return e.enter("lineEnding"),e.consume(o),e.exit("lineEnding"),Y(e,t,"linePrefix")}function r(o){return e.enter("paragraph"),a(o)}function a(o){let l=e.enter("chunkText",{contentType:"text",previous:i});return i&&(i.next=l),i=l,s(o)}function s(o){if(o===null){e.exit("chunkText"),e.exit("paragraph"),e.consume(o);return}return F(o)?(e.consume(o),e.exit("chunkText"),a):(e.consume(o),s)}}var yu={tokenize:_y},fu={tokenize:Fy};function _y(e){let t=this,i=[],n=0,r,a,s;return o;function o(L){if(ns))return;let B=t.events.length,q=B,_,P;for(;q--;)if(t.events[q][0]==="exit"&&t.events[q][1].type==="chunkFlow"){if(_){P=t.events[q][1].end;break}_=!0}for(b(n),T=B;TL;){let R=i[C];t.containerState=R[1],R[0].exit.call(t,e)}i.length=L}function S(){r.write([null]),a=void 0,r=void 0,t.containerState._closeFlow=void 0}}function Fy(e,t,i){return Y(e,e.attempt(this.parser.constructs.document,t,i),"linePrefix",this.parser.constructs.disable.null.includes("codeIndented")?void 0:4)}var bu={tokenize:Ry};function Ry(e){let t=this,i=e.attempt(ki,n,e.attempt(this.parser.constructs.flowInitial,r,Y(e,e.attempt(this.parser.constructs.flow,r,e.attempt(el,r)),"linePrefix")));return i;function n(a){if(a===null){e.consume(a);return}return e.enter("lineEndingBlank"),e.consume(a),e.exit("lineEndingBlank"),t.currentConstruct=void 0,i}function r(a){if(a===null){e.consume(a);return}return e.enter("lineEnding"),e.consume(a),e.exit("lineEnding"),t.currentConstruct=void 0,i}}var vu={resolveAll:zu()},xu=ku("string"),wu=ku("text");function ku(e){return{tokenize:t,resolveAll:zu(e==="text"?Dy:void 0)};function t(i){let n=this,r=this.parser.constructs[e],a=i.attempt(r,s,o);return s;function s(d){return c(d)?a(d):o(d)}function o(d){if(d===null){i.consume(d);return}return i.enter("data"),i.consume(d),l}function l(d){return c(d)?(i.exit("data"),a(d)):(i.consume(d),l)}function c(d){if(d===null)return!0;let u=r[d],g=-1;if(u)for(;++g-1){let o=s[0];typeof o=="string"?s[0]=o.slice(n):s.shift()}a>0&&s.push(e[r].slice(0,a))}return s}function jy(e,t){let i=-1,n=[],r;for(;++iVy,contentInitial:()=>Yy,disable:()=>Gy,document:()=>Ky,flow:()=>Hy,flowInitial:()=>Py,insideSpan:()=>Uy,string:()=>$y,text:()=>Wy});var Ky={42:Ye,43:Ye,45:Ye,48:Ye,49:Ye,50:Ye,51:Ye,52:Ye,53:Ye,54:Ye,55:Ye,56:Ye,57:Ye,62:es},Yy={91:il},Py={[-2]:Gn,[-1]:Gn,32:Gn},Hy={35:nl,42:xt,45:[ls,xt],60:al,61:ls,95:xt,96:ns,126:ns},$y={38:ts,92:is},Wy={[-5]:Qn,[-4]:Qn,[-3]:Qn,33:ol,38:ts,42:Vn,60:[Jo,sl],91:ll,92:[tl,is],93:vt,95:Vn,96:Xo},Uy={null:[Vn,vu]},Vy={null:[42,95]},Gy={null:[]};function hl(e){let i=cs([gl,...(e||{}).extensions||[]]),n={defined:[],lazy:{},constructs:i,content:r(hu),document:r(yu),flow:r(bu),string:r(xu),text:r(wu)};return n;function r(a){return s;function s(o){return Su(n,a,o)}}}function fl(e){for(;!rs(e););return e}var Au=/[\0\t\n\r]/g;function yl(){let e=1,t="",i=!0,n;return r;function r(a,s,o){let l=[],c,d,u,g,p;for(a=t+(typeof a=="string"?a.toString():new TextDecoder(s||void 0).decode(a)),u=0,t="",i&&(a.charCodeAt(0)===65279&&u++,i=void 0);u0){let mi=$.tokenStack[$.tokenStack.length-1];(mi[1]||Ou).call($,void 0,mi[0])}for(I.position={start:Qi(O.length>0?O[0][1].start:{line:1,column:1,offset:0}),end:Qi(O.length>0?O[O.length-2][1].end:{line:1,column:1,offset:0})},ie=-1;++ie0))throw new TypeError("`maxSize` must be a number greater than 0");if(typeof i.maxAge=="number"&&i.maxAge===0)throw new TypeError("`maxAge` must be a number greater than 0");Ee(this,Zi,i.maxSize),Ee(this,Jn,i.maxAge||Number.POSITIVE_INFINITY),Ee(this,Ji,i.onEviction)}get __oldCache(){return j(this,me)}get(i){if(j(this,ce).has(i)){let n=j(this,ce).get(i);return pe(this,er,zl).call(this,i,n)}if(j(this,me).has(i)){let n=j(this,me).get(i);if(pe(this,ti,hi).call(this,i,n)===!1)return pe(this,ps,Bu).call(this,i,n),n.value}}set(i,n,{maxAge:r=j(this,Jn)}={}){let a=typeof r=="number"&&r!==Number.POSITIVE_INFINITY?Date.now()+r:void 0;return j(this,ce).has(i)?j(this,ce).set(i,{value:n,expiry:a}):pe(this,tr,Al).call(this,i,{value:n,expiry:a}),this}has(i){return j(this,ce).has(i)?!pe(this,ti,hi).call(this,i,j(this,ce).get(i)):j(this,me).has(i)?!pe(this,ti,hi).call(this,i,j(this,me).get(i)):!1}peek(i){if(j(this,ce).has(i))return pe(this,ir,Sl).call(this,i,j(this,ce));if(j(this,me).has(i))return pe(this,ir,Sl).call(this,i,j(this,me))}delete(i){let n=j(this,ce).delete(i);return n&&Lo(this,li)._--,j(this,me).delete(i)||n}clear(){j(this,ce).clear(),j(this,me).clear(),Ee(this,li,0)}resize(i){if(!(i&&i>0))throw new TypeError("`maxSize` must be a number greater than 0");let n=[...pe(this,nr,Tl).call(this)],r=n.length-i;r<0?(Ee(this,ce,new Map(n)),Ee(this,me,new Map),Ee(this,li,n.length)):(r>0&&pe(this,Xn,kl).call(this,n.slice(0,r)),Ee(this,me,new Map(n.slice(r))),Ee(this,ce,new Map),Ee(this,li,0)),Ee(this,Zi,i)}*keys(){for(let[i]of this)yield i}*values(){for(let[,i]of this)yield i}*[Symbol.iterator](){for(let i of j(this,ce)){let[n,r]=i;pe(this,ti,hi).call(this,n,r)===!1&&(yield[n,r.value])}for(let i of j(this,me)){let[n,r]=i;j(this,ce).has(n)||pe(this,ti,hi).call(this,n,r)===!1&&(yield[n,r.value])}}*entriesDescending(){let i=[...j(this,ce)];for(let n=i.length-1;n>=0;--n){let r=i[n],[a,s]=r;pe(this,ti,hi).call(this,a,s)===!1&&(yield[a,s.value])}i=[...j(this,me)];for(let n=i.length-1;n>=0;--n){let r=i[n],[a,s]=r;j(this,ce).has(a)||pe(this,ti,hi).call(this,a,s)===!1&&(yield[a,s.value])}}*entriesAscending(){for(let[i,n]of pe(this,nr,Tl).call(this))yield[i,n.value]}get size(){if(!j(this,li))return j(this,me).size;let i=0;for(let n of j(this,me).keys())j(this,ce).has(n)||i++;return Math.min(j(this,li)+i,j(this,Zi))}get maxSize(){return j(this,Zi)}entries(){return this.entriesAscending()}forEach(i,n=this){for(let[r,a]of this.entriesAscending())i.call(n,a,r,this)}get[Symbol.toStringTag](){return JSON.stringify([...this.entriesAscending()])}};li=new WeakMap,ce=new WeakMap,me=new WeakMap,Zi=new WeakMap,Jn=new WeakMap,Ji=new WeakMap,Xn=new WeakSet,kl=function(i){if(typeof j(this,Ji)=="function")for(let[n,r]of i)j(this,Ji).call(this,n,r.value)},ti=new WeakSet,hi=function(i,n){return typeof n.expiry=="number"&&n.expiry<=Date.now()?(typeof j(this,Ji)=="function"&&j(this,Ji).call(this,i,n.value),this.delete(i)):!1},us=new WeakSet,Iu=function(i,n){if(pe(this,ti,hi).call(this,i,n)===!1)return n.value},er=new WeakSet,zl=function(i,n){return n.expiry?pe(this,us,Iu).call(this,i,n):n.value},ir=new WeakSet,Sl=function(i,n){let r=n.get(i);return pe(this,er,zl).call(this,i,r)},tr=new WeakSet,Al=function(i,n){j(this,ce).set(i,n),Lo(this,li)._++,j(this,li)>=j(this,Zi)&&(Ee(this,li,0),pe(this,Xn,kl).call(this,j(this,me)),Ee(this,me,j(this,ce)),Ee(this,ce,new Map))},ps=new WeakSet,Bu=function(i,n){j(this,me).delete(i),pe(this,tr,Al).call(this,i,n)},nr=new WeakSet,Tl=function*(){for(let i of j(this,me)){let[n,r]=i;j(this,ce).has(n)||pe(this,ti,hi).call(this,n,r)===!1&&(yield i)}for(let i of j(this,ce)){let[n,r]=i;pe(this,ti,hi).call(this,n,r)===!1&&(yield i)}};var Ll=new Zn({maxSize:200});function Fu(e){let t=Zd(e);if(Ll.has(t))return Ll.get(t);let i=vl(e,{extensions:[cs([cl(),dl()]),ul()],mdastExtensions:[[xl(),wl],pl()]});return Ll.set(t,i),i}function fe(e,t){let i=Fu(t),n=[];return Ga(i,e,r=>{n.push(r.position)}),n.sort((r,a)=>a.start.offset-r.start.offset),n}function ub(e){let t=Fu(e),i=[];return Ga(t,"listItem",n=>{if(n.children)for(let r of n.children)r.type==="paragraph"&&i.push(r.position)}),i.sort((n,r)=>r.start.offset-n.start.offset),i}function Ru(e){let t=fe("footnoteDefinition",e),i=[],n=new Map,r=new Map,a=function(s,o,l){let c=o.match(/\[\^.*?\]/)[0];if(n.has(c)){let p=n.get(c);p.footnotesReferencingKey.push(o),n.set(c,p);return}let d,u=[];do d=s.lastIndexOf(c,l),d!==-1&&(u.push(d),l=d-1);while(d>0);let g={key:c,referencePositions:u,footnotesReferencingKey:[o]};n.set(c,g)};for(let s of t){let o=e.substring(s.start.offset,s.end.offset);i.push(o),s.end.offset=0?l:0;let c=0;for(let d of o.footnotesReferencingKey){if(c+l>=o.referencePositions.length)throw new Error(E("logs.missing-footnote-error-message").replace("{FOOTNOTE}",d));r.set(d,o.referencePositions[l+c++])}}i=i.sort((s,o)=>r.get(s)-r.get(o)),i.length>0&&(e=e.trimEnd()+`
+`);for(let s of i)e+=`
+`+s;return e}function Du(e){let t=fe("footnoteDefinition",e),i=[],n=new Map,r=new Map,a=[],s=new Set,o=[],l=function(u,g,p){let f=g.match(/\[\^.*?\]/)[0];n.set(g,f);let w=s.has(f);if(w&&i.includes(g)){o.unshift(g);return}else if(w)throw new Error(E("logs.too-many-footnotes-error-message").replace("{FOOTNOTE_KEY}",f));let x;do x=u.lastIndexOf(f,p),x!==-1&&((x+g.length>u.length||u.substring(x,x+g.length)!==g)&&a.push({key:f,position:x}),p=x-1);while(x>0);s.add(f)};for(let u of t){let g=e.substring(u.start.offset,u.end.offset);i.unshift(g),l(e,g,u.start.offset)}let c=1,d=new Set;for(let u of i){if(d.has(u))continue;d.add(u);let g=n.get(u),p=`[^${c++}]`;r.set(g,p)}a.sort((u,g)=>g.position-u.position);for(let u of a){let g=r.get(u.key);e=Xd(e,u.key,g,u.position)}for(let u of d){let g=n.get(u),p=r.get(g);e=e.replace(u,u.replace(g,p))}for(let u of o){let g=e.replace(`
+${u}
+`,`
+`);e===g&&(g=e.replace(u,"")),e=g}return e}function ms(e,t,i){let n=fe(i,e);if(n.length===0)return e;let r="";if(t==="underscore")r="_";else if(t==="asterisk")r="*";else{let a=n[n.length-1];r=e.substring(a.start.offset,a.start.offset+1)}i==="strong"&&(r+=r);for(let a of n){let s=r+e.substring(a.start.offset+r.length,a.end.offset-r.length)+r;e=le(e,a.start.offset,a.end.offset,s)}return e}function Nu(e){let t=fe("paragraph",e);if(t.length===0)return e;for(let i of t){let n=e.substring(i.start.offset,i.end.offset).split(`
+`),r=n.length-1;if(!(r<1)){for(let a=0;a")||s.endsWith(" ")||(n[a]=s+" ")}e=le(e,i.start.offset,i.end.offset,n.join(`
+`))}}return e}function ju(e){let t=e.endsWith(`
+`),i=fe("paragraph",e);if(i.length===0)return e;for(let n of i){let r=n.start.offset;for(r>0&&r--;r>=0&&e.charAt(r)!=`
+`;)r--;r++;let a=e.substring(r,n.end.offset).split(`
+`),s=a[0].trimStart();if(s.startsWith(">")||s.startsWith("- ")||s.startsWith("- ")||s.match(/^[0-9]+\.( |\t)+/)||s.match(fs))continue;let o=a.length,l=[],c=!1;for(let f=0;f")||w.endsWith(" ")||w.endsWith(" ")}for(;r>0&&e.charAt(r-1)==`
+`;)r--;let d=e.length,u=n.end.offset;for(u0&&e.charAt(r-1).trim()==="";)r--;(r===0||e.charAt(r-1).trim()!="")&&r++;let a=e.substring(r,n.end.offset);tp.test(a)&&(r+=4,a=a.substring(4)),a=t(a),e=le(e,r,n.end.offset,a)}return e}function Hu(e){let t=fe("code",e);for(let i of t)e.substring(i.start.offset,i.end.offset).startsWith("```")&&(e=yt(e,i.start.offset,i.end.offset));return e}function $u(e,t){let i=fe("math",e);for(let n of i)e=yt(e,n.start.offset,n.end.offset);i=fe("inlineMath",e);for(let n of i)e.substring(n.start.offset,n.end.offset).startsWith("$".repeat(t))&&(e=yt(e,n.start.offset,n.end.offset));return e}function Wu(e){let t=fe("blockquote",e);for(let i of t){let n=i.end.offset;for(;n0&&e.charAt(a-1)!==`
+`;)a--;let s=e.substring(a,r.end.offset),o=function(u){let g=u.lastIndexOf("> ");return g!==-1&&(u=u.substring(g+2)),u=u.replaceAll(" "," "),Math.floor((u.split(" ").length-1)/2)+1},l=new Map,c=function(u,g){let p=g;for(;p>u;)l.delete(p--)},d=-1;s=s.replace(/^(( |\t|> )*)((\d+(\.|\)))|[-*+])([^\n]*)$/gm,(u,g="",p,f,w,x,b)=>{let S=1,L=o(g);if(!/^\d/.test(f)){let C=L>d?L:d;return c(L,C),u}return l.has(L)?t==="ascending"&&(S=l.get(L)+1,l.set(L,S)):l.set(L,1),d>L&&c(L,d),d=L,`${g}${S}${i}${b}`}),e=le(e,a,r.end.offset,s)}return e}function Vu(e,t){let i=fe("listItem",e);if(!i)return e;let n=/^((\d+[.)])|(- \[[ x]\]))/m,r=t;if(t=="consistent"){let a=i.length-1;for(;a>=0;){let s=e.substring(i[a].start.offset,i[a].end.offset);if(a--,!s.match(n)){r=s.charAt(0);break}}if(a==-1)return e}for(let a of i){let s=e.substring(a.start.offset,a.end.offset);s.match(n)||(s=r+s.substring(1),e=le(e,a.start.offset,a.end.offset,s))}return e}function Ol(e,t){let i=fe("blockquote",e);for(let n of i){let r=n.end.offset;for(;r2;){let c=e.indexOf(n,l)+n.length;a.unshift({startIndex:o,endIndex:i+c}),o=i+c+1,l=c+1,s-=2}return a.unshift({startIndex:i+e.indexOf(n,l),endIndex:i+e.length}),a}function _u(e,t,i,n,r){let a=e.substring($n(e,t),t)??"",s=e.substring($n(e,i),i)??"",o=/^(>( |\t)*)+\$+$/m,l=e.substring(t,i);return l=l.replace(n,(c,d,u="")=>u===""?d+`
+`+a:d+`
+`),l=l.replace(r,(c,d="",u,g)=>{let p=d==="";return p&&o.test(s.trim())?c:p?`
+`+a+u+g:`
+`+u+g}),le(e,t,i,l)}function hs(e){let t=[...e.matchAll(Ju)],i=[];for(let n of t){let r=$n(e,n.index);if(r===0)continue;let a=$n(e,r-1),s=n[0],o=e.substring(r,n.index+s.length);if(mb(o,s))continue;let l=a,c=e.substring(a,r-1);if(!s.includes("|")&&!c.includes("|"))continue;c=c.replace(El,f=>{let w=f.trim();return w===""||w==="|"||(l+=f.length-1),""});let d=s.replace(El,"");if(c.endsWith("|")&&(c=c.slice(0,-1)),d.endsWith("|")&&(d=d.slice(0,-1)),c.split("|").length!==d.split("|").length)continue;let u=n.index+n[0].length;if(u>=e.length-1){i.push({startIndex:l,endIndex:e.length});continue}let g=e.substring(u+1).split(`
+`),p=0;for(;p]/.test(i)}function Qu(e){let t=0,i=[],n=[...e.matchAll(ep)];if(!n||n.length===0)return i;let r=[...e.matchAll(ip)];return n.forEach(a=>{t=a.index;let s=!1,o=e.length-1;for(;r&&r.length!==0&&!s;)if(r[0].index<=t)r.shift();else{s=!0;let l=r[0];o=l.index+l[0].length}i.push({startIndex:t,endIndex:o}),!r||r.length}),i.reverse()}function Zu(e,t){let i=fe("code",e);for(let n of i){let r=e.substring(n.start.offset,n.end.offset);!r.startsWith("```")||r.substring(3,r.indexOf(`
+`)).trim()!==""||(e=le(e,n.start.offset+3,n.start.offset+3,t))}return e}var Xi=/^([ \t]*)(#+)([ \t]+)([^\n\r]*?)([ \t]+#+)?$/gm,np=`^XXX\\.*?
+(?:((?:.|
+)*?)
+)?XXX(?=\\s|$)$`,Ve=/^---\n((?:(((?!---)(?:.|\n)*?)\n)?))---(?=\n|$)/,gb=np.replaceAll("X","`"),hb=np.replaceAll("X","~"),fb=`^(( |( {4})).*
+)+`,OL=new RegExp(`${gb}|${hb}|${fb}`,"gm"),ys=/(!?)\[{2}([^\][\n|]+)(\|([^\][\n|]+))?(\|([^\][\n|]+))?\]{2}/g,rr=/(!?)\[([^[]*)\](\(.*\))/g,ar=/(\s|^)(#[^\s#;.,>!=+{\]]+)/g,rp=/^%%\n[^%]*\n%%/gm,sr=/[,\s]+/,bs=/(\. ?){2}\./g,or="\\s*(>\\s*)*",Ju=/(\|? *:?-{1,}:? *\|?)(\| *:?-{1,}:? *\|?)*( |\t)*$/gm,El=/^(((>[ ]?)*)|([ ]{0,3}))\|/m,Xu=/[^\n]*?\|[^\n]*?(\n|$)/m,ap=/(([a-z\-0-9]+:)\/{2})([^\s/?#]*[^\s")'.?!/]|[/])?(([/?#][^\s")']*[^\s")'.?!])|[/])?/gi,mn=/(?:(?:(?:[a-z]+:)?\/\/)|www\.)(?:localhost|(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?:(?:[a-fA-F\d]{1,4}:){7}(?:[a-fA-F\d]{1,4}|:)|(?:[a-fA-F\d]{1,4}:){6}(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|:[a-fA-F\d]{1,4}|:)|(?:[a-fA-F\d]{1,4}:){5}(?::(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-fA-F\d]{1,4}){1,2}|:)|(?:[a-fA-F\d]{1,4}:){4}(?:(?::[a-fA-F\d]{1,4}){0,1}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-fA-F\d]{1,4}){1,3}|:)|(?:[a-fA-F\d]{1,4}:){3}(?:(?::[a-fA-F\d]{1,4}){0,2}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-fA-F\d]{1,4}){1,4}|:)|(?:[a-fA-F\d]{1,4}:){2}(?:(?::[a-fA-F\d]{1,4}){0,3}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-fA-F\d]{1,4}){1,5}|:)|(?:[a-fA-F\d]{1,4}:){1}(?:(?::[a-fA-F\d]{1,4}){0,4}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-fA-F\d]{1,4}){1,6}|:)|(?::(?:(?::[a-fA-F\d]{1,4}){0,5}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-fA-F\d]{1,4}){1,7}|:)))(?:%[0-9a-zA-Z]{1,})?|(?:(?:[a-z0-9][-_]*)*[a-z0-9]+)(?:\.(?:[a-z0-9]-*)*[a-z0-9]+)*(?:\.(?:[a-z]{2,})))(?::\d{2,5})?(?:(?:[/?#][a-z0-9-_/&=?$.+!*‘(,#]*[a-z0-9-_/$+!*‘(,])|[/])?/gi,sp=/]+)>((?:.(?!<\/a>))*.)<\/a>/g,op=/[\p{L}\p{N}\p{Pc}\p{M}\-'’`]+/gu,lp=/&[^\s]+;$/mi,ep=yp(!0),ip=yp(!1),cp=/[“”„«»]/g,dp=/[‘’‚‹›]/g,up=/<%[^]*?%>/g,wt="\\[.\\]",tp=new RegExp(`^${wt}`),pp=new RegExp(`^${or}- ${wt} `),vs=new RegExp(`^\\s*- ${wt} `),mp=new RegExp(`^\\s*(-|\\*|\\+|\\d+[.)]|- (${wt}))`,"m"),fs=/^(\[\^[^\]]*\]) ?([,.;!:?])/gm,Xa=/^(>\s*)+\[![^\s]*\]/m,Cl=RegExp(/\p{L}/,"u");function Ge(e){return e.replace(/\$/g,"$$$$")}function lr(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function gp(e){let t=e.match(ys);if(t){for(let i of t)if(i.includes("|")){let n=i.indexOf("|"),r=i.substring(0,n+1)+i.substring(n+1,i.length-2).trim()+"]]";e=e.replace(i,r)}}return e}function hp(e){let t=hs(e);if(t.length===0)return e;for(let i of t)e=yt(e,i.startIndex,i.endIndex);return e}function xs(e){let t=e.match(/^#\s+(.*)/m);if(t&&t[1]){let i=t[1];return i=i.replaceAll(ys,(n,r,a,s)=>s!=null?s.replace("|",""):a),i.replaceAll(rr,"$2")}return""}function fp(e){return[...e.matchAll(ar)].map(t=>t[2])}function yp(e){let t="",i="";return e?i+="disable":i+="enable",new RegExp(t.replace("{ENDING_TEXT}",i),"g")}var Ml="tag",cr="tags",dr=[Ml,cr],yb="alias",ql="aliases",ur=[yb,ql],ks="linter-yaml-title-alias",gn="disabled rules";function zi(e){return e.match(Ve)===null&&(e=`---
+---
+`+e),e}function hn(e){let t=e.match(Ve);return t?t[1]:null}function Oe(e,t){if(!e.match(Ve))return e;let i=e.match(Ve)[0],n=t(i);return e=e.replace(i,Ge(n)),e}function Il(e,t=!0){return t?new RegExp(`^([\\t ]*)${e}:[ \\t]*(\\S.*|(?:(?:\\n *- \\S.*)|((?:\\n *- *))*|(\\n([ \\t]+[^\\n]*))*)*)\\n`,"m"):new RegExp(`^${e}:[ \\t]*(\\S.*|(?:(?:\\n *- \\S.*)|((?:\\n *- *))*|(\\n([ \\t]+[^\\n]*))*)*)\\n`,"m")}function Ce(e,t,i){let n=`${t}:${i}
+`,r=!1,a=e.replace(Il(t),(s,o)=>(r=!0,o+n));return r||(a=`${e}${n}`),a}function Be(e,t,i=!0){let n=e.match(Il(t,i));if(n==null)return null;let r=n[2];return i||(r=n[1]),r}function kt(e,t,i=!0){return e.replace(Il(t,i),"")}function Di(e){if(e==null)return null;let t=Ko(e.replace(/\n(\t)+/g,`
+ `));return t??{}}function ni(e,t,i,n,r=!1){if(typeof e=="string"&&(e=[e]),e==null||e.length===0)return bb(t);let a=n&&(t=="multi-line"||t=="single string to multi-line"&&e.length>1);if(r||a)for(let s=0;si!="");if(e.includes(`
+`)){let t=e.split(/[ \t]*\n[ \t]*-[ \t]*/);return t.splice(0,1),t=t.filter(i=>i!=""),t==null||t.length===0?null:t}return e}function zs(e){if(e==null)return[];let t=[],i=[];Array.isArray(e)?i=e:e.includes(",")?i=ws(e,","):i=ws(e," ");for(let n of i)t.push(n.trim());return t}function Ss(e){return typeof e=="string"?ws(e,","):e}function ws(e,t=","){if(e==""||e==null)return null;if(t.length>1)throw new Error(E("logs.invalid-delimiter-error-message"));let i=[],n="",r=0;for(;r1&&(e.startsWith("'")&&e.endsWith("'")||e.startsWith('"')&&e.endsWith('"'))}function fi(e,t,i=!1,n=!1){let r=xb(e,t,i);if(n)return r;try{if(Ko(r)===e)return r}catch{}let a=Yo(e,{lineWidth:-1,quotingType:t,forceQuotes:i}).slice(0,-1),s=Yo(e,{lineWidth:-1,quotingType:t=='"'?"'":'"',forceQuotes:i}).slice(0,-1);return s===e||s.length")&&(n=n.substring(3)),n.endsWith("
")&&(n=n.substring(0,n.length-4)),t.innerHTML=n}function ci(e){e.addClass("linter-visually-hidden")}function Ti(e){e.removeClass("linter-visually-hidden")}var zt=class{constructor(t,i,n,r,a){this.configKey=t;this.nameKey=i;this.descriptionKey=n;this.defaultValue=r;a&&(this.ruleAlias=a)}getName(){return E(this.nameKey)??""}getDescription(){return E(this.descriptionKey)??""}getSearchInfo(){return{name:this.getName(),description:this.getDescription()}}setOption(t,i){i.ruleConfigs[this.ruleAlias][this.configKey]=t}parseNameAndDescriptionAndRemoveSettingBorder(t,i){Ai(this.getName(),t.nameEl,i.settingsTab.component),Ai(this.getDescription(),t.descEl,i.settingsTab.component),t.settingEl.addClass("linter-no-border")}},yn=class extends zt{display(i,n,r){let a=new bn.Setting(i).addToggle(s=>{s.setValue(n.ruleConfigs[this.ruleAlias][this.configKey]),s.onChange(o=>{this.setOption(o,n),r.settings=n,r.saveSettings()})});this.parseNameAndDescriptionAndRemoveSettingBorder(a,r)}},pr=class extends zt{display(i,n,r){let a=new bn.Setting(i).addText(s=>{s.setValue(n.ruleConfigs[this.ruleAlias][this.configKey]),s.onChange(o=>{this.setOption(o,n),r.settings=n,r.saveSettings()})});this.parseNameAndDescriptionAndRemoveSettingBorder(a,r)}},As=class extends zt{display(i,n,r){let a=new bn.Setting(i).addTextArea(s=>{s.setValue(n.ruleConfigs[this.ruleAlias][this.configKey]),s.onChange(o=>{this.setOption(o,n),r.settings=n,r.saveSettings()})});this.parseNameAndDescriptionAndRemoveSettingBorder(a,r)}},Ts=class extends zt{display(i,n,r){let a=new bn.Setting(i).addMomentFormat(s=>{s.setValue(n.ruleConfigs[this.ruleAlias][this.configKey]),s.setPlaceholder("dddd, MMMM Do YYYY, h:mm:ss a"),s.onChange(o=>{this.setOption(o,n),r.settings=n,r.saveSettings()})});this.parseNameAndDescriptionAndRemoveSettingBorder(a,r)}},Ls=class{constructor(t,i){this.value=t,this.description=i}getDisplayValue(){return E(this.value)??""}},Es=class extends zt{constructor(i,n,r,a,s,o){super(i,n,r,a,o);this.options=s}getSearchInfo(){return{name:this.getName(),description:this.getDescription(),options:this.options}}display(i,n,r){let a=new bn.Setting(i).addDropdown(s=>{for(let o of this.options)s.addOption(o.value.replace("enums.",""),o.getDisplayValue());s.setValue(n.ruleConfigs[this.ruleAlias][this.configKey]),s.onChange(o=>{this.setOption(o,n),r.settings=n,r.saveSettings()})});this.parseNameAndDescriptionAndRemoveSettingBorder(a,r)}};var vn=class e extends Error{constructor(t,i){super(t),this.cause=i??null,this.stack=i.stack??null,Object.setPrototypeOf(this,e.prototype)}};var h={code:{replaceAction:"code",placeholder:"{CODE_BLOCK_PLACEHOLDER}"},inlineCode:{replaceAction:"inlineCode",placeholder:"{INLINE_CODE_BLOCK_PLACEHOLDER}"},image:{replaceAction:"image",placeholder:"{IMAGE_PLACEHOLDER}"},thematicBreak:{replaceAction:"thematicBreak",placeholder:"{HORIZONTAL_RULE_PLACEHOLDER}"},italics:{replaceAction:"emphasis",placeholder:"{ITALICS_PLACEHOLDER}"},bold:{replaceAction:"strong",placeholder:"{STRONG_PLACEHOLDER}"},list:{replaceAction:"list",placeholder:"{LIST_PLACEHOLDER}"},blockquote:{replaceAction:"blockquote",placeholder:"{BLOCKQUOTE_PLACEHOLDER}"},math:{replaceAction:"math",placeholder:"{MATH_PLACEHOLDER}"},inlineMath:{replaceAction:"inlineMath",placeholder:"{INLINE_MATH_PLACEHOLDER}"},html:{replaceAction:"html",placeholder:"{HTML_PLACEHOLDER}"},yaml:{replaceAction:Ve,placeholder:Ge(`---
+---`)},wikiLink:{replaceAction:ys,placeholder:"{WIKI_LINK_PLACEHOLDER}"},obsidianMultiLineComments:{replaceAction:rp,placeholder:"{OBSIDIAN_COMMENT_PLACEHOLDER}"},footnoteAtStartOfLine:{replaceAction:fs,placeholder:"{FOOTNOTE_AT_START_OF_LINE_PLACEHOLDER}"},footnoteAfterATask:{replaceAction:/- \[.] (\[\^\w+\]) ?([,.;!:?])/gm,placeholder:"{FOOTNOTE_AFTER_A_TASK_PLACEHOLDER}"},url:{replaceAction:mn,placeholder:"{URL_PLACEHOLDER}"},anchorTag:{replaceAction:sp,placeholder:"{ANCHOR_PLACEHOLDER}"},templaterCommand:{replaceAction:up,placeholder:"{TEMPLATER_PLACEHOLDER}"},link:{replaceAction:zb,placeholder:"{REGULAR_LINK_PLACEHOLDER}"},tag:{replaceAction:Sb,placeholder:"#tag-placeholder"},table:{replaceAction:Ab,placeholder:"{TABLE_PLACEHOLDER}"},customIgnore:{replaceAction:Tb,placeholder:"{CUSTOM_IGNORE_PLACEHOLDER}"}};function ze(e,t,i){let n=[];for(let r of e){let a;if(typeof r.replaceAction=="string")a=wb(t,r.placeholder,r.replaceAction);else if(r.replaceAction instanceof RegExp)a=kb(t,r.placeholder,r.replaceAction);else if(typeof r.replaceAction=="function"){let s=r.replaceAction;a=s(t,r.placeholder)}t=a.newText,n.push({replacedValues:a.replacedValues,placeholder:r.placeholder})}return t=i(t),n=n.reverse(),n!=null&&n.length>0&&n.forEach(r=>{r.replacedValues.forEach(a=>{t=t.replace(new RegExp(r.placeholder,"i"),Ge(a))})}),t}function wb(e,t,i){let n=fe(i,e),r=[];for(let a of n){let s=e.substring(a.start.offset,a.end.offset);r.push(s),e=le(e,a.start.offset,a.end.offset,t)}return r.reverse(),{newText:e,replacedValues:r}}function kb(e,t,i){let n=e.match(i),r=[];if(i.flags.includes("g")){if(e=e.replaceAll(i,t),n)for(let a of n)r.push(a)}else e=e.replace(i,t),n&&r.push(n[0]);return{newText:e,replacedValues:r}}function zb(e,t){let i=fe("link",e),n=[];for(let r of i){if(r==null)continue;let a=e.substring(r.start.offset,r.end.offset);a.match(rr)&&(n.push(a),e=le(e,r.start.offset,r.end.offset,t))}return n.reverse(),{newText:e,replacedValues:n}}function Sb(e,t){let i=[];return e=e.replace(ar,(n,r,a)=>(i.push(a),r+t)),{newText:e,replacedValues:i}}function Ab(e,t){let i=hs(e),n=new Array(i.length),r=0,a=n.length;for(let s of i)n[a-1-r++]=e.substring(s.startIndex,s.endIndex),e=le(e,s.startIndex,s.endIndex,t);return{newText:e,replacedValues:n}}function Tb(e,t){let i=Qu(e),n=new Array(i.length),r=0,a=n.length;for(let s of i)n[a-1-r++]=e.substring(s.startIndex,s.endIndex),e=le(e,s.startIndex,s.endIndex,t);return{newText:e,replacedValues:n}}var N=(s=>(s.YAML="YAML",s.HEADING="Heading",s.FOOTNOTE="Footnote",s.CONTENT="Content",s.SPACING="Spacing",s.PASTE="Paste",s))(N||{}),Os=class{constructor(t,i,n,r,a,s,o,l=[],c=!1,d=[]){this.nameKey=t;this.descriptionKey=i;this.settingsKey=n;this.alias=r;this.type=a;this.applyAfterIgnore=s;this.examples=o;this.options=l;this.hasSpecialExecutionOrder=c;this.ignoreTypes=d;this.ruleHeading=this.getName().toLowerCase().replaceAll(" ","-"),l.unshift(new yn("enabled",this.descriptionKey,"",!1));for(let u of l)u.ruleAlias=r}getDefaultOptions(){let t={};for(let i of this.options)t[i.configKey]=i.defaultValue;return t}getOptions(t){return t.ruleConfigs[this.settingsKey]}getName(){return E(this.nameKey)}getDescription(){return E(this.descriptionKey)}getURL(){return"https://platers.github.io/obsidian-linter/settings/"+this.type.toLowerCase()+"-rules/#"+this.ruleHeading}enabledOptionName(){return this.options[0].configKey}apply(t,i){return ze(this.ignoreTypes,t,n=>this.applyAfterIgnore(n,i))}},Cs=class{constructor(t,i,n,r={}){this.description=t,this.options=r,this.before=i,this.after=n}},kp=Object.values(N);function Ms(e){let t=hn(e);if(t===null)return[[],!1];let i=vp(t);return i.includes("all")?[Li.map(n=>n.alias),!0]:[i,!1]}var Li=[],Lb={},St=new Map;function zp(e){Li.push(e),Li.sort((t,i)=>kp.indexOf(t.type)-kp.indexOf(i.type)||t.settingsKey.localeCompare(i.settingsKey)),Lb[e.alias]=e,St.has(e.type)?St.get(e.type).push(e):St.set(e.type,[e])}function qs(e,t){let i;throw e instanceof bd?(i=e.toString(),i=E("logs.wrapper-yaml-error").replace("{ERROR_MESSAGE}",i.substring(i.indexOf(":")+1))):i=E("logs.wrapper-unknown-error").replace("{ERROR_MESSAGE}",e.message),new vn(`"${t}" encountered an ${i}`,e)}var qn=rn(Sp());function Eb(e){for(var t=[],i=1;in.example),t.optionBuilders.map(n=>n.option),t.hasSpecialExecutionOrder,t.ignoreTypes);j(Qe,wn).set(this.name,i),j(Qe,mr).set(t.alias,t)}return j(Qe,wn).get(this.name)}static applyIfEnabledBase(t,i,n,r){let a=t.getOptions(n);if(a[t.enabledOptionName()]){ht(t.alias);let s=Object.assign({},a,r);gi(`${E("logs.run-rule-text")} ${t.getName()}`);try{let o=t.apply(i,s);return Ui(t.alias),gi(o),[o,!0]}catch(o){Ui(t.alias),qs(o,t.getName())}}else return[i,!1]}static getBuilderByName(t){return j(Qe,mr).get(t)}static setNoSettingControl(t,i){j(Qe,et).has(t)||j(Qe,et).set(t,[]),j(Qe,et).get(t).push(i)}static hasSettingControl(t,i){return!j(Qe,et).has(t)||!j(Qe,et).get(t).includes(i)}};wn=new WeakMap,mr=new WeakMap,et=new WeakMap,he(Qe,wn,new Map),he(Qe,mr,new Map),he(Qe,et,new Map);var it=Qe,v=class extends it{constructor(i){super();this.alias=i.nameKey.replace(/rules\.(.*)\.name/,"$1"),this.settingsKey=i.nameKey.replace(/rules\.(.*)\.name/,"$1"),this.nameKey=i.nameKey,this.descriptionKey=i.descriptionKey,this.type=i.type,this.hasSpecialExecutionOrder=i.hasSpecialExecutionOrder??!1,i.ruleIgnoreTypes?this.ignoreTypes=[h.customIgnore,...i.ruleIgnoreTypes]:this.ignoreTypes=[h.customIgnore]}static register(i){let n=i.getRule();zp(n)}safeApply(i,n){return this.apply(i,this.buildRuleOptions(n))}buildRuleOptions(i){i=i??{};let n=new this.OptionsClass,r=Object.assign(n,i);for(let a of this.optionBuilders)a.setRuleOption(r,i);return r}static applyIfEnabled(i,n,r,a){let s=this.getRule();return r.includes(s.alias)?(gi(s.alias+" "+E("logs.disabled-text")),[i,!1]):it.applyIfEnabledBase(s,i,n,a)}static getRuleOptions(i){let n=it.getRule.bind(this)(),r=new this,a=n.getOptions(i);return r.buildRuleOptions(a)}static noSettingControl(){return(i,n)=>{let r=i.constructor.name;it.setNoSettingControl(r,n)}}},Bl,y=class{constructor(t){he(this,Bl,void 0);this.example=new Cs(t.description,t.before,t.after,t.options)}};Bl=new WeakMap;var kn,tt=class{constructor(t){he(this,kn,void 0);this.OptionsClass=t.OptionsClass;let i=t.nameKey.split(".");i.length==1?this.configKey=i[0]:this.configKey=i[i.length-2],this.nameKey=t.nameKey,this.descriptionKey=t.descriptionKey,this.optionsKey=t.optionsKey}get defaultValue(){return new this.OptionsClass()[this.optionsKey]}get option(){return j(this,kn)||Ee(this,kn,this.buildOption()),j(this,kn)}setRuleOption(t,i){let n=i[this.configKey];n!==void 0&&(t[this.optionsKey]=n)}};kn=new WeakMap;var Z=class extends tt{buildOption(){return new yn(this.configKey,this.nameKey,this.descriptionKey,this.defaultValue)}},Is=class extends tt{buildOption(){return new pr(this.configKey,this.nameKey,this.descriptionKey,this.defaultValue)}},se=class extends tt{constructor(i){super(i);this.records=i.records.map(n=>new Ls("enums."+n.value,n.description))}buildOption(){return new Es(this.configKey,this.nameKey,this.descriptionKey,this.defaultValue,this.records)}},xe=class extends tt{constructor(i){super(i);this.separator=i.separator??`
+`,this.splitter=i.splitter??/\n/}buildOption(){return new As(this.configKey,this.nameKey,this.descriptionKey,this.defaultValue.join(this.separator))}setRuleOption(i,n){if(n[this.configKey]!==void 0){let r=n[this.configKey].split(this.splitter).filter(function(a){return a!=""});i[this.optionsKey]=r}}},Pe=class extends tt{buildOption(){return new pr(this.configKey,this.nameKey,this.descriptionKey,this.defaultValue)}},Bs=class extends tt{buildOption(){return new Ts(this.configKey,this.nameKey,this.descriptionKey,this.defaultValue)}};var _l=class{},gr=class extends v{constructor(){super({nameKey:"rules.add-blank-line-after-yaml.name",descriptionKey:"rules.add-blank-line-after-yaml.description",type:"YAML"})}get OptionsClass(){return _l}apply(t,i){let n=t.match(Ve);if(n===null)return t;let r=n[0],a=t.indexOf(r)+r.length;return a+1>=t.length||t.trimEnd()===r.trimEnd()||t.charAt(a+1)===`
+`?t:t.replace(r,r+`
+`)}get exampleBuilders(){return[new y({description:"A file with just YAML in it does not get a blank line after the YAML",before:m`
+ ---
+ key: value
+ ---
+ `,after:m`
+ ---
+ key: value
+ ---
+ `}),new y({description:"A file with YAML followed directly by content has an empty line added",before:m`
+ ---
+ key: value
+ ---
+ Here is some text
+ `,after:m`
+ ---
+ key: value
+ ---
+ ${""}
+ Here is some text
+ `}),new y({description:"A file with YAML that already has a blank line after it and before content has no empty line added",before:m`
+ ---
+ key: value
+ ---
+ ${""}
+ Here is some text
+ `,after:m`
+ ---
+ key: value
+ ---
+ ${""}
+ Here is some text
+ `})]}get optionBuilders(){return[]}};gr=A([v.register],gr);var Fl=new Map([["1nd","1st"],["2rd","2nd"],["2st","2nd"],["3nd","3rd"],["3st","3rd"],["4rd","4th"],["a-diaerers","a-diaereses"],["aaccess","access"],["aaccessibility","accessibility"],["aaccession","accession"],["aack","ack"],["aactual","actual"],["aactually","actually"],["aadd","add"],["aagain","again"],["aaggregation","aggregation"],["aanother","another"],["aapply","apply"],["aaproximate","approximate"],["aaproximated","approximated"],["aaproximately","approximately"],["aaproximates","approximates"],["aaproximating","approximating"],["aare","are"],["aassign","assign"],["aassignment","assignment"],["aassignments","assignments"],["aassociated","associated"],["aassumed","assumed"],["aautomatic","automatic"],["aautomatically","automatically"],["abailable","available"],["abanden","abandon"],["abandonded","abandoned"],["abandone","abandon"],["abandonned","abandoned"],["abandonning","abandoning"],["abbbreviated","abbreviated"],["abberation","aberration"],["abberations","aberrations"],["abberivates","abbreviates"],["abberration","aberration"],["abborted","aborted"],["abborting","aborting"],["abbrevate","abbreviate"],["abbrevation","abbreviation"],["abbrevations","abbreviations"],["abbreviaton","abbreviation"],["abbreviatons","abbreviations"],["abbriviate","abbreviate"],["abbriviation","abbreviation"],["abbriviations","abbreviations"],["aberation","aberration"],["abigious","ambiguous"],["abiguity","ambiguity"],["abilityes","abilities"],["abilties","abilities"],["abilty","ability"],["abiss","abyss"],["abitrarily","arbitrarily"],["abitrary","arbitrary"],["abitrate","arbitrate"],["abitration","arbitration"],["abizmal","abysmal"],["abnoramlly","abnormally"],["abnormalty","abnormally"],["abnormaly","abnormally"],["abnornally","abnormally"],["abnove","above"],["abnrormal","abnormal"],["aboluste","absolute"],["abolustely","absolutely"],["abolute","absolute"],["abondon","abandon"],["abondoned","abandoned"],["abondoning","abandoning"],["abondons","abandons"],["aboout","about"],["aborigene","aborigine"],["abortificant","abortifacient"],["aboslute","absolute"],["aboslutely","absolutely"],["abosulte","absolute"],["abosultely","absolutely"],["abosulute","absolute"],["abosulutely","absolutely"],["abotu","about"],["abount","about"],["aboutit","about it"],["aboutthe","about the"],["abouve","above"],["abov","above"],["aboved","above"],["abovemtioned","abovementioned"],["aboves","above"],["abovmentioned","abovementioned"],["abreviate","abbreviate"],["abreviated","abbreviated"],["abreviates","abbreviates"],["abreviating","abbreviating"],["abreviation","abbreviation"],["abreviations","abbreviations"],["abritrarily","arbitrarily"],["abritrary","arbitrary"],["abriviate","abbreviate"],["absail","abseil"],["absailing","abseiling"],["absance","absence"],["abscence","absence"],["abscound","abscond"],["abselutely","absolutely"],["abselutly","absolutely"],["absense","absence"],["absodefly","absolute"],["absodeflyly","absolutely"],["absolate","absolute"],["absolately","absolutely"],["absolaute","absolute"],["absolautely","absolutely"],["absoleted","obsoleted"],["absoletely","absolutely"],["absoliute","absolute"],["absoliutely","absolutely"],["absoloute","absolute"],["absoloutely","absolutely"],["absolte","absolute"],["absoltely","absolutely"],["absoltue","absolute"],["absoltuely","absolutely"],["absoluate","absolute"],["absoluately","absolutely"],["absolue","absolute"],["absoluely","absolutely"],["absoluet","absolute"],["absoluetly","absolutely"],["absolule","absolute"],["absolulte","absolute"],["absolultely","absolutely"],["absolune","absolute"],["absolunely","absolutely"],["absolure","absolute"],["absolurely","absolutely"],["absolut","absolute"],["absolutelly","absolutely"],["absoluth","absolute"],["absoluthe","absolute"],["absoluthely","absolutely"],["absoluthly","absolutely"],["absolutley","absolutely"],["absolutly","absolutely"],["absolutlye","absolutely"],["absoluute","absolute"],["absoluutely","absolutely"],["absoluve","absolute"],["absoluvely","absolutely"],["absoolute","absolute"],["absoolutely","absolutely"],["absorbant","absorbent"],["absorbsion","absorption"],["absorbtion","absorption"],["absorve","absorb"],["absould","absolute"],["absouldly","absolutely"],["absoule","absolute"],["absoulely","absolutely"],["absouletely","absolutely"],["absoult","absolute"],["absoulte","absolute"],["absoultely","absolutely"],["absoultly","absolutely"],["absoulute","absolute"],["absoulutely","absolutely"],["absout","absolute"],["absoute","absolute"],["absoutely","absolutely"],["absoutly","absolutely"],["abstact","abstract"],["abstacted","abstracted"],["abstacter","abstracter"],["abstacting","abstracting"],["abstaction","abstraction"],["abstactions","abstractions"],["abstactly","abstractly"],["abstactness","abstractness"],["abstactor","abstractor"],["abstacts","abstracts"],["abstanence","abstinence"],["abstrac","abstract"],["abstraced","abstracted"],["abstracer","abstracter"],["abstracing","abstracting"],["abstracion","abstraction"],["abstracions","abstractions"],["abstracly","abstractly"],["abstracness","abstractness"],["abstracor","abstractor"],["abstracs","abstracts"],["abstrat","abstract"],["abstrated","abstracted"],["abstrater","abstracter"],["abstrating","abstracting"],["abstration","abstraction"],["abstrations","abstractions"],["abstratly","abstractly"],["abstratness","abstractness"],["abstrator","abstractor"],["abstrats","abstracts"],["abstrct","abstract"],["abstrcted","abstracted"],["abstrcter","abstracter"],["abstrcting","abstracting"],["abstrction","abstraction"],["abstrctions","abstractions"],["abstrctly","abstractly"],["abstrctness","abstractness"],["abstrctor","abstractor"],["abstrcts","abstracts"],["absulute","absolute"],["absymal","abysmal"],["abtract","abstract"],["abtracted","abstracted"],["abtracter","abstracter"],["abtracting","abstracting"],["abtraction","abstraction"],["abtractions","abstractions"],["abtractly","abstractly"],["abtractness","abstractness"],["abtractor","abstractor"],["abtracts","abstracts"],["abudance","abundance"],["abudances","abundances"],["abundacies","abundances"],["abundancies","abundances"],["abundand","abundant"],["abundence","abundance"],["abundent","abundant"],["abundunt","abundant"],["abutts","abuts"],["abvailable","available"],["abvious","obvious"],["acadamy","academy"],["acadimy","academy"],["acadmic","academic"],["acale","scale"],["acatemy","academy"],["accademic","academic"],["accademy","academy"],["accapt","accept"],["accapted","accepted"],["accapts","accepts"],["acccept","accept"],["acccepted","accepted"],["acccepting","accepting"],["acccepts","accepts"],["accces","access"],["acccess","access"],["acccessd","accessed"],["acccessed","accessed"],["acccesses","accesses"],["acccessibility","accessibility"],["acccessible","accessible"],["acccessing","accessing"],["acccession","accession"],["acccessor","accessor"],["acccessors","accessors"],["acccord","accord"],["acccordance","accordance"],["acccordances","accordances"],["acccorded","accorded"],["acccording","according"],["acccordingly","accordingly"],["acccords","accords"],["acccount","account"],["acccumulate","accumulate"],["acccuracy","accuracy"],["acccurate","accurate"],["acccurately","accurately"],["acccused","accused"],["accecpt","accept"],["accecpted","accepted"],["accees","access"],["acceess","access"],["accelarate","accelerate"],["accelaration","acceleration"],["accelarete","accelerate"],["accelearion","acceleration"],["accelearte","accelerate"],["accelearted","accelerated"],["acceleartes","accelerates"],["acceleartion","acceleration"],["acceleartor","accelerator"],["acceleated","accelerated"],["acceleratoin","acceleration"],["acceleraton","acceleration"],["acceleratrion","acceleration"],["accelerte","accelerate"],["accelertion","acceleration"],["accellerate","accelerate"],["accellerated","accelerated"],["accellerating","accelerating"],["accelleration","acceleration"],["accellerator","accelerator"],["accending","ascending"],["acceot","accept"],["accepatble","acceptable"],["accepect","accept"],["accepected","accepted"],["accepeted","accepted"],["acceppt","accept"],["acceptence","acceptance"],["acceptible","acceptable"],["acceptted","accepted"],["acces","access"],["accesed","accessed"],["acceses","accesses"],["accesibility","accessibility"],["accesible","accessible"],["accesiblity","accessibility"],["accesiibility","accessibility"],["accesiiblity","accessibility"],["accesing","accessing"],["accesnt","accent"],["accesor","accessor"],["accesories","accessories"],["accesors","accessors"],["accesory","accessory"],["accessability","accessibility"],["accessable","accessible"],["accessbile","accessible"],["accessiable","accessible"],["accessibile","accessible"],["accessibiliity","accessibility"],["accessibilitiy","accessibility"],["accessibiltiy","accessibility"],["accessibilty","accessibility"],["accessiblilty","accessibility"],["accessiblity","accessibility"],["accessiibility","accessibility"],["accessiiblity","accessibility"],["accessile","accessible"],["accessintg","accessing"],["accessisble","accessible"],["accessoire","accessory"],["accessort","accessor"],["accesss","access"],["accesssibility","accessibility"],["accesssible","accessible"],["accesssiblity","accessibility"],["accesssiiblity","accessibility"],["accesssing","accessing"],["accesssor","accessor"],["accesssors","accessors"],["accet","accept"],["accetable","acceptable"],["accets","accepts"],["acchiev","achieve"],["acchievable","achievable"],["acchieve","achieve"],["acchieveable","achievable"],["acchieved","achieved"],["acchievement","achievement"],["acchievements","achievements"],["acchiever","achiever"],["acchieves","achieves"],["accidant","accident"],["acciddently","accidentally"],["accidentaly","accidentally"],["accidential","accidental"],["accidentially","accidentally"],["accidentically","accidentally"],["accidentilly","accidentally"],["accidentily","accidentally"],["accidently","accidentally"],["accidentually","accidentally"],["accidetly","accidentally"],["acciedential","accidental"],["acciednetally","accidentally"],["accient","accident"],["acciental","accidental"],["acclerated","accelerated"],["acclerates","accelerates"],["accleration","acceleration"],["acclerometers","accelerometers"],["acclimitization","acclimatization"],["accociate","associate"],["accociated","associated"],["accociates","associates"],["accociating","associating"],["accociation","association"],["accociations","associations"],["accoding","according"],["accodingly","accordingly"],["accodr","accord"],["accodrance","accordance"],["accodred","accorded"],["accodring","according"],["accodringly","accordingly"],["accodrs","accords"],["accointing","accounting"],["accoird","accord"],["accoirding","according"],["accomadate","accommodate"],["accomadated","accommodated"],["accomadates","accommodates"],["accomadating","accommodating"],["accomadation","accommodation"],["accomadations","accommodations"],["accomdate","accommodate"],["accomidate","accommodate"],["accommadate","accommodate"],["accommadates","accommodates"],["accommadating","accommodating"],["accommdated","accommodated"],["accomodata","accommodate"],["accomodate","accommodate"],["accomodated","accommodated"],["accomodates","accommodates"],["accomodating","accommodating"],["accomodation","accommodation"],["accomodations","accommodations"],["accompagned","accompanied"],["accompagnied","accompanied"],["accompagnies","accompanies"],["accompagniment","accompaniment"],["accompagning","accompanying"],["accompagny","accompany"],["accompagnying","accompanying"],["accompained","accompanied"],["accompanyed","accompanied"],["accompt","account"],["acconding","according"],["accont","account"],["accontant","accountant"],["acconted","accounted"],["acconting","accounting"],["accoording","according"],["accoordingly","accordingly"],["accoount","account"],["accopunt","account"],["accordding","according"],["accordeon","accordion"],["accordian","accordion"],["accordign","according"],["accordiingly","accordingly"],["accordinag","according"],["accordind","according"],["accordinly","accordingly"],["accordint","according"],["accordintly","accordingly"],["accordling","according"],["accordlingly","accordingly"],["accordng","according"],["accordngly","accordingly"],["accoriding","according"],["accoridng","according"],["accoridngly","accordingly"],["accoringly","accordingly"],["accorndingly","accordingly"],["accort","accord"],["accortance","accordance"],["accorted","accorded"],["accortind","according"],["accorting","according"],["accound","account"],["accouned","accounted"],["accoustic","acoustic"],["accoustically","acoustically"],["accoustics","acoustics"],["accout","account"],["accouting","accounting"],["accoutn","account"],["accpet","accept"],["accpets","accepts"],["accquainted","acquainted"],["accquire","acquire"],["accquired","acquired"],["accquires","acquires"],["accquiring","acquiring"],["accracy","accuracy"],["accrate","accurate"],["accrding","according"],["accrdingly","accordingly"],["accrediation","accreditation"],["accredidation","accreditation"],["accress","access"],["accroding","according"],["accrodingly","accordingly"],["accronym","acronym"],["accronyms","acronyms"],["accrording","according"],["accros","across"],["accrose","across"],["accross","across"],["accsess","access"],["accss","access"],["accssible","accessible"],["accssor","accessor"],["acctual","actual"],["accuarcy","accuracy"],["accuarte","accurate"],["accuartely","accurately"],["accumalate","accumulate"],["accumalates","accumulates"],["accumalator","accumulator"],["accumalte","accumulate"],["accumalted","accumulated"],["accumilated","accumulated"],["accumlate","accumulate"],["accumlated","accumulated"],["accumlates","accumulates"],["accumlating","accumulating"],["accumlator","accumulator"],["accummulating","accumulating"],["accummulators","accumulators"],["accumualte","accumulate"],["accumualtion","accumulation"],["accupied","occupied"],["accupts","accepts"],["accurable","accurate"],["accuraccies","accuracies"],["accuraccy","accuracy"],["accurancy","accuracy"],["accurarcy","accuracy"],["accuratelly","accurately"],["accuratley","accurately"],["accuratly","accurately"],["accurences","occurrences"],["accurracy","accuracy"],["accurring","occurring"],["accussed","accused"],["acditionally","additionally"],["acecess","access"],["acedemic","academic"],["acelerated","accelerated"],["acend","ascend"],["acendance","ascendance"],["acendancey","ascendancy"],["acended","ascended"],["acendence","ascendance"],["acendencey","ascendancy"],["acendency","ascendancy"],["acender","ascender"],["acending","ascending"],["acent","ascent"],["aceptable","acceptable"],["acerage","acreage"],["acess","access"],["acessable","accessible"],["acessed","accessed"],["acesses","accesses"],["acessible","accessible"],["acessing","accessing"],["acessor","accessor"],["acheive","achieve"],["acheived","achieved"],["acheivement","achievement"],["acheivements","achievements"],["acheives","achieves"],["acheiving","achieving"],["acheivment","achievement"],["acheivments","achievements"],["achievment","achievement"],["achievments","achievements"],["achitecture","architecture"],["achitectures","architectures"],["achivable","achievable"],["achivement","achievement"],["achivements","achievements"],["achor","anchor"],["achored","anchored"],["achoring","anchoring"],["achors","anchors"],["ACI","ACPI"],["acident","accident"],["acidental","accidental"],["acidentally","accidentally"],["acidents","accidents"],["acient","ancient"],["acients","ancients"],["ACII","ASCII"],["acition","action"],["acitions","actions"],["acitivate","activate"],["acitivation","activation"],["acitivity","activity"],["acitvate","activate"],["acitve","active"],["acivate","activate"],["acive","active"],["acknodledgment","acknowledgment"],["acknodledgments","acknowledgments"],["acknoledge","acknowledge"],["acknoledged","acknowledged"],["acknoledges","acknowledges"],["acknoledging","acknowledging"],["acknoledgment","acknowledgment"],["acknoledgments","acknowledgments"],["acknowldeged","acknowledged"],["acknowldegement","acknowledgement"],["acknowldegements","acknowledgements"],["acknowledgeing","acknowledging"],["acknowleding","acknowledging"],["acknowlege","acknowledge"],["acknowleged","acknowledged"],["acknowlegement","acknowledgement"],["acknowlegements","acknowledgements"],["acknowleges","acknowledges"],["acknowleging","acknowledging"],["acknowlegment","acknowledgment"],["ackowledge","acknowledge"],["ackowledged","acknowledged"],["ackowledgement","acknowledgement"],["ackowledgements","acknowledgements"],["ackowledges","acknowledges"],["ackowledging","acknowledging"],["acnowledge","acknowledge"],["acocunt","account"],["acommodate","accommodate"],["acommodated","accommodated"],["acommodates","accommodates"],["acommodating","accommodating"],["acommodation","accommodation"],["acommpany","accompany"],["acommpanying","accompanying"],["acomodate","accommodate"],["acomodated","accommodated"],["acompanies","accompanies"],["acomplish","accomplish"],["acomplished","accomplished"],["acomplishment","accomplishment"],["acomplishments","accomplishments"],["acontiguous","a contiguous"],["acoording","according"],["acoordingly","accordingly"],["acording","according"],["acordingly","accordingly"],["acordinng","according"],["acorss","across"],["acorting","according"],["acount","account"],["acounts","accounts"],["acquaintence","acquaintance"],["acquaintences","acquaintances"],["acquiantence","acquaintance"],["acquiantences","acquaintances"],["acquiesence","acquiescence"],["acquisiton","acquisition"],["acquisitons","acquisitions"],["acquited","acquitted"],["acquition","acquisition"],["acqure","acquire"],["acqured","acquired"],["acqures","acquires"],["acquring","acquiring"],["acqusition","acquisition"],["acqusitions","acquisitions"],["acrage","acreage"],["acroos","across"],["acrosss","across"],["acrue","accrue"],["acrued","accrued"],["acssume","assume"],["acssumed","assumed"],["actal","actual"],["actally","actually"],["actaly","actually"],["actaul","actual"],["actaully","actually"],["actial","actual"],["actially","actually"],["actialy","actually"],["actiavte","activate"],["actiavted","activated"],["actiavtes","activates"],["actiavting","activating"],["actiavtion","activation"],["actiavtions","activations"],["actiavtor","activator"],["actibity","activity"],["acticate","activate"],["actice","active"],["actine","active"],["actiual","actual"],["activ","active"],["activaed","activated"],["activationg","activating"],["actived","activated"],["activeta","activate"],["activete","activate"],["activeted","activated"],["activetes","activates"],["activiate","activate"],["activies","activities"],["activites","activities"],["activitis","activities"],["activitites","activities"],["activitiy","activity"],["activley","actively"],["activly","actively"],["activste","activate"],["activsted","activated"],["activstes","activates"],["activtes","activates"],["activties","activities"],["activtion","activation"],["activty","activity"],["activw","active"],["activy","activity"],["actove","active"],["actuaal","actual"],["actuaally","actually"],["actuak","actual"],["actuakly","actually"],["actuallin","actually"],["actualy","actually"],["actualyl","actually"],["actuell","actual"],["actuion","action"],["actuionable","actionable"],["actul","actual"],["actullay","actually"],["actully","actually"],["actural","actual"],["acturally","actually"],["actusally","actually"],["actve","active"],["actzal","actual"],["acual","actual"],["acually","actually"],["acuired","acquired"],["acuires","acquires"],["acumulate","accumulate"],["acumulated","accumulated"],["acumulates","accumulates"],["acumulating","accumulating"],["acumulation","accumulation"],["acumulative","accumulative"],["acumulator","accumulator"],["acuqire","acquire"],["acuracy","accuracy"],["acurate","accurate"],["acused","accused"],["acustom","accustom"],["acustommed","accustomed"],["acutal","actual"],["acutally","actually"],["acutual","actual"],["adapated","adapted"],["adapater","adapter"],["adapaters","adapters"],["adapative","adaptive"],["adapdive","adaptive"],["adapive","adaptive"],["adaptaion","adaptation"],["adaptare","adapter"],["adapte","adapter"],["adaptee","adapted"],["adaptes","adapters"],["adaptibe","adaptive"],["adaquate","adequate"],["adaquately","adequately"],["adatper","adapter"],["adatpers","adapters"],["adavance","advance"],["adavanced","advanced"],["adbandon","abandon"],["addapt","adapt"],["addaptation","adaptation"],["addaptations","adaptations"],["addapted","adapted"],["addapting","adapting"],["addapts","adapts"],["addd","add"],["addded","added"],["addding","adding"],["adddress","address"],["adddresses","addresses"],["addds","adds"],["addedd","added"],["addeed","added"],["addersses","addresses"],["addert","assert"],["adderted","asserted"],["addess","address"],["addessed","addressed"],["addesses","addresses"],["addessing","addressing"],["addied","added"],["addig","adding"],["addiional","additional"],["addiiton","addition"],["addiitonall","additional"],["addional","additional"],["addionally","additionally"],["addiotion","addition"],["addiotional","additional"],["addiotionally","additionally"],["addiotions","additions"],["additianal","additional"],["additianally","additionally"],["additinal","additional"],["additinally","additionally"],["additioanal","additional"],["additioanally","additionally"],["additioanlly","additionally"],["additiona","additional"],["additionallly","additionally"],["additionals","additional"],["additionaly","additionally"],["additionalyy","additionally"],["additionnal","additional"],["additionnally","additionally"],["additionnaly","additionally"],["additoin","addition"],["additoinal","additional"],["additoinally","additionally"],["additoinaly","additionally"],["additon","addition"],["additonal","additional"],["additonally","additionally"],["additonaly","additionally"],["addjust","adjust"],["addjusted","adjusted"],["addjusting","adjusting"],["addjusts","adjusts"],["addmission","admission"],["addmit","admit"],["addopt","adopt"],["addopted","adopted"],["addpress","address"],["addrass","address"],["addrees","address"],["addreess","address"],["addrerss","address"],["addrerssed","addressed"],["addrersser","addresser"],["addrersses","addresses"],["addrerssing","addressing"],["addrersss","address"],["addrersssed","addressed"],["addrerssser","addresser"],["addrerssses","addresses"],["addrersssing","addressing"],["addres","address"],["addresable","addressable"],["addresed","addressed"],["addreses","addresses"],["addresess","addresses"],["addresing","addressing"],["addressess","addresses"],["addressings","addressing"],["addresss","address"],["addresssed","addressed"],["addressses","addresses"],["addresssing","addressing"],["addrress","address"],["addrss","address"],["addrssed","addressed"],["addrsses","addresses"],["addrssing","addressing"],["addted","added"],["addtion","addition"],["addtional","additional"],["addtionally","additionally"],["addtitional","additional"],["adecuate","adequate"],["aded","added"],["adequit","adequate"],["adevnture","adventure"],["adevntured","adventured"],["adevnturer","adventurer"],["adevnturers","adventurers"],["adevntures","adventures"],["adevnturing","adventuring"],["adhearing","adhering"],["adherance","adherence"],["adiacent","adjacent"],["adiditon","addition"],["adin","admin"],["ading","adding"],["adition","addition"],["aditional","additional"],["aditionally","additionally"],["aditionaly","additionally"],["aditionnal","additional"],["adivsories","advisories"],["adivsoriyes","advisories"],["adivsory","advisory"],["adjacentsy","adjacency"],["adjactend","adjacent"],["adjancent","adjacent"],["adjascent","adjacent"],["adjasence","adjacence"],["adjasencies","adjacencies"],["adjasensy","adjacency"],["adjasent","adjacent"],["adjast","adjust"],["adjcence","adjacence"],["adjcencies","adjacencies"],["adjcent","adjacent"],["adjcentcy","adjacency"],["adjsence","adjacence"],["adjsencies","adjacencies"],["adjsuted","adjusted"],["adjuscent","adjacent"],["adjusment","adjustment"],["adjustement","adjustment"],["adjustements","adjustments"],["adjustificat","justification"],["adjustification","justification"],["adjustmant","adjustment"],["adjustmants","adjustments"],["adjustmenet","adjustment"],["admendment","amendment"],["admi","admin"],["admininistrative","administrative"],["admininistrator","administrator"],["admininistrators","administrators"],["admininstrator","administrator"],["administation","administration"],["administator","administrator"],["administor","administrator"],["administraively","administratively"],["adminitrator","administrator"],["adminssion","admission"],["adminstered","administered"],["adminstrate","administrate"],["adminstration","administration"],["adminstrative","administrative"],["adminstrator","administrator"],["adminstrators","administrators"],["admisible","admissible"],["admissability","admissibility"],["admissable","admissible"],["admited","admitted"],["admitedly","admittedly"],["admn","admin"],["admnistrator","administrator"],["admnistrators","administrators"],["adn","and"],["adobted","adopted"],["adolecent","adolescent"],["adpapted","adapted"],["adpat","adapt"],["adpated","adapted"],["adpater","adapter"],["adpaters","adapters"],["adpats","adapts"],["adpter","adapter"],["adquire","acquire"],["adquired","acquired"],["adquires","acquires"],["adquiring","acquiring"],["adrea","area"],["adrerss","address"],["adrerssed","addressed"],["adrersser","addresser"],["adrersses","addresses"],["adrerssing","addressing"],["adres","address"],["adresable","addressable"],["adresing","addressing"],["adress","address"],["adressable","addressable"],["adresse","address"],["adressed","addressed"],["adresses","addresses"],["adressing","addressing"],["adresss","address"],["adressses","addresses"],["adrress","address"],["adrresses","addresses"],["adtodetect","autodetect"],["adusted","adjusted"],["adustment","adjustment"],["advanatage","advantage"],["advanatages","advantages"],["advanatge","advantage"],["advandced","advanced"],["advane","advance"],["advaned","advanced"],["advantagous","advantageous"],["advanved","advanced"],["adventages","advantages"],["adventrous","adventurous"],["adverised","advertised"],["advertice","advertise"],["adverticed","advertised"],["advertisment","advertisement"],["advertisments","advertisements"],["advertistment","advertisement"],["advertistments","advertisements"],["advertize","advertise"],["advertized","advertised"],["advertizes","advertises"],["advesary","adversary"],["advetise","advertise"],["adviced","advised"],["adviseable","advisable"],["advisoriyes","advisories"],["advizable","advisable"],["adwances","advances"],["aequidistant","equidistant"],["aequivalent","equivalent"],["aeriel","aerial"],["aeriels","aerials"],["aesily","easily"],["aesy","easy"],["aexs","axes"],["afair","affair"],["afaraid","afraid"],["afe","safe"],["afecting","affecting"],["afer","after"],["aferwards","afterwards"],["afetr","after"],["affecfted","affected"],["afficianados","aficionados"],["afficionado","aficionado"],["afficionados","aficionados"],["affilate","affiliate"],["affilates","affiliates"],["affilation","affiliation"],["affilations","affiliations"],["affilliate","affiliate"],["affinitied","affinities"],["affinitiy","affinity"],["affinitze","affinitize"],["affinties","affinities"],["affintiy","affinity"],["affintize","affinitize"],["affinty","affinity"],["affitnity","affinity"],["afforementioned","aforementioned"],["affortable","affordable"],["afforts","affords"],["affraid","afraid"],["afinity","affinity"],["afor","for"],["aforememtioned","aforementioned"],["aforementiond","aforementioned"],["aforementionned","aforementioned"],["aformentioned","aforementioned"],["afterall","after all"],["afterw","after"],["aftrer","after"],["aftzer","after"],["againnst","against"],["againsg","against"],["againt","against"],["againts","against"],["agaisnt","against"],["agaist","against"],["agancies","agencies"],["agancy","agency"],["aganist","against"],["agant","agent"],["aggaravates","aggravates"],["aggegate","aggregate"],["aggessive","aggressive"],["aggessively","aggressively"],["agggregate","aggregate"],["aggragate","aggregate"],["aggragator","aggregator"],["aggrated","aggregated"],["aggreagate","aggregate"],["aggreataon","aggregation"],["aggreate","aggregate"],["aggreated","aggregated"],["aggreation","aggregation"],["aggreations","aggregations"],["aggreed","agreed"],["aggreement","agreement"],["aggregatet","aggregated"],["aggregetor","aggregator"],["aggreggate","aggregate"],["aggregious","egregious"],["aggregrate","aggregate"],["aggregrated","aggregated"],["aggresive","aggressive"],["aggresively","aggressively"],["aggrevate","aggravate"],["aggrgate","aggregate"],["agian","again"],["agianst","against"],["agin","again"],["aginst","against"],["aglorithm","algorithm"],["aglorithms","algorithms"],["agorithm","algorithm"],["agrain","again"],["agravate","aggravate"],["agre","agree"],["agred","agreed"],["agreeement","agreement"],["agreemnet","agreement"],["agreemnets","agreements"],["agreemnt","agreement"],["agregate","aggregate"],["agregated","aggregated"],["agregates","aggregates"],["agregation","aggregation"],["agregator","aggregator"],["agreing","agreeing"],["agrement","agreement"],["agression","aggression"],["agressive","aggressive"],["agressively","aggressively"],["agressiveness","aggressiveness"],["agressivity","aggressivity"],["agressor","aggressor"],["agresssive","aggressive"],["agrgument","argument"],["agrguments","arguments"],["agricultue","agriculture"],["agriculure","agriculture"],["agricuture","agriculture"],["agrieved","aggrieved"],["agrresive","aggressive"],["agrument","argument"],["agruments","arguments"],["agsinst","against"],["agument","argument"],["agumented","augmented"],["aguments","arguments"],["aheared","adhered"],["ahev","have"],["ahlpa","alpha"],["ahlpas","alphas"],["ahppen","happen"],["ahve","have"],["aicraft","aircraft"],["aiffer","differ"],["ailgn","align"],["aiport","airport"],["airator","aerator"],["airbourne","airborne"],["aircaft","aircraft"],["aircrafts'","aircraft's"],["aircrafts","aircraft"],["airfow","airflow"],["airlfow","airflow"],["airloom","heirloom"],["airporta","airports"],["airrcraft","aircraft"],["aisian","Asian"],["aixs","axis"],["aizmuth","azimuth"],["ajacence","adjacence"],["ajacencies","adjacencies"],["ajacency","adjacency"],["ajacent","adjacent"],["ajacentcy","adjacency"],["ajasence","adjacence"],["ajasencies","adjacencies"],["ajative","adjective"],["ajcencies","adjacencies"],["ajsencies","adjacencies"],["ajurnment","adjournment"],["ajust","adjust"],["ajusted","adjusted"],["ajustement","adjustment"],["ajusting","adjusting"],["ajustment","adjustment"],["ajustments","adjustments"],["ake","ache"],["akkumulate","accumulate"],["akkumulated","accumulated"],["akkumulates","accumulates"],["akkumulating","accumulating"],["akkumulation","accumulation"],["akkumulative","accumulative"],["akkumulator","accumulator"],["aknowledge","acknowledge"],["aks","ask"],["aksed","asked"],["aktivate","activate"],["aktivated","activated"],["aktivates","activates"],["aktivating","activating"],["aktivation","activation"],["akumulate","accumulate"],["akumulated","accumulated"],["akumulates","accumulates"],["akumulating","accumulating"],["akumulation","accumulation"],["akumulative","accumulative"],["akumulator","accumulator"],["alaready","already"],["albiet","albeit"],["albumns","albums"],["alcemy","alchemy"],["alchohol","alcohol"],["alchoholic","alcoholic"],["alchol","alcohol"],["alcholic","alcoholic"],["alcohal","alcohol"],["alcoholical","alcoholic"],["aleady","already"],["aleays","always"],["aledge","allege"],["aledged","alleged"],["aledges","alleges"],["alegance","allegiance"],["alege","allege"],["aleged","alleged"],["alegience","allegiance"],["alegorical","allegorical"],["alernate","alternate"],["alernated","alternated"],["alernately","alternately"],["alernates","alternates"],["alers","alerts"],["aleviate","alleviate"],["aleviates","alleviates"],["aleviating","alleviating"],["alevt","alert"],["algebraical","algebraic"],["algebric","algebraic"],["algebrra","algebra"],["algee","algae"],["alghorithm","algorithm"],["alghoritm","algorithm"],["alghoritmic","algorithmic"],["alghoritmically","algorithmically"],["alghoritms","algorithms"],["algined","aligned"],["alginment","alignment"],["alginments","alignments"],["algohm","algorithm"],["algohmic","algorithmic"],["algohmically","algorithmically"],["algohms","algorithms"],["algoirthm","algorithm"],["algoirthmic","algorithmic"],["algoirthmically","algorithmically"],["algoirthms","algorithms"],["algoithm","algorithm"],["algoithmic","algorithmic"],["algoithmically","algorithmically"],["algoithms","algorithms"],["algolithm","algorithm"],["algolithmic","algorithmic"],["algolithmically","algorithmically"],["algolithms","algorithms"],["algoorithm","algorithm"],["algoorithmic","algorithmic"],["algoorithmically","algorithmically"],["algoorithms","algorithms"],["algoprithm","algorithm"],["algoprithmic","algorithmic"],["algoprithmically","algorithmically"],["algoprithms","algorithms"],["algorgithm","algorithm"],["algorgithmic","algorithmic"],["algorgithmically","algorithmically"],["algorgithms","algorithms"],["algorhithm","algorithm"],["algorhithmic","algorithmic"],["algorhithmically","algorithmically"],["algorhithms","algorithms"],["algorhitm","algorithm"],["algorhitmic","algorithmic"],["algorhitmically","algorithmically"],["algorhitms","algorithms"],["algorhtm","algorithm"],["algorhtmic","algorithmic"],["algorhtmically","algorithmically"],["algorhtms","algorithms"],["algorhythm","algorithm"],["algorhythmic","algorithmic"],["algorhythmically","algorithmically"],["algorhythms","algorithms"],["algorhytm","algorithm"],["algorhytmic","algorithmic"],["algorhytmically","algorithmically"],["algorhytms","algorithms"],["algorightm","algorithm"],["algorightmic","algorithmic"],["algorightmically","algorithmically"],["algorightms","algorithms"],["algorihm","algorithm"],["algorihmic","algorithmic"],["algorihmically","algorithmically"],["algorihms","algorithms"],["algorihtm","algorithm"],["algorihtmic","algorithmic"],["algorihtmically","algorithmically"],["algorihtms","algorithms"],["algoristhms","algorithms"],["algorith","algorithm"],["algorithem","algorithm"],["algorithemic","algorithmic"],["algorithemically","algorithmically"],["algorithems","algorithms"],["algorithic","algorithmic"],["algorithically","algorithmically"],["algorithim","algorithm"],["algorithimes","algorithms"],["algorithimic","algorithmic"],["algorithimically","algorithmically"],["algorithims","algorithms"],["algorithmes","algorithms"],["algorithmi","algorithm"],["algorithmical","algorithmically"],["algorithmm","algorithm"],["algorithmmic","algorithmic"],["algorithmmically","algorithmically"],["algorithmms","algorithms"],["algorithmn","algorithm"],["algorithmnic","algorithmic"],["algorithmnically","algorithmically"],["algorithmns","algorithms"],["algoriths","algorithms"],["algorithsmic","algorithmic"],["algorithsmically","algorithmically"],["algorithsms","algorithms"],["algoritm","algorithm"],["algoritmic","algorithmic"],["algoritmically","algorithmically"],["algoritms","algorithms"],["algoroithm","algorithm"],["algoroithmic","algorithmic"],["algoroithmically","algorithmically"],["algoroithms","algorithms"],["algororithm","algorithm"],["algororithmic","algorithmic"],["algororithmically","algorithmically"],["algororithms","algorithms"],["algorothm","algorithm"],["algorothmic","algorithmic"],["algorothmically","algorithmically"],["algorothms","algorithms"],["algorrithm","algorithm"],["algorrithmic","algorithmic"],["algorrithmically","algorithmically"],["algorrithms","algorithms"],["algorritm","algorithm"],["algorritmic","algorithmic"],["algorritmically","algorithmically"],["algorritms","algorithms"],["algorthim","algorithm"],["algorthimic","algorithmic"],["algorthimically","algorithmically"],["algorthims","algorithms"],["algorthin","algorithm"],["algorthinic","algorithmic"],["algorthinically","algorithmically"],["algorthins","algorithms"],["algorthm","algorithm"],["algorthmic","algorithmic"],["algorthmically","algorithmically"],["algorthms","algorithms"],["algorthn","algorithm"],["algorthnic","algorithmic"],["algorthnically","algorithmically"],["algorthns","algorithms"],["algorthym","algorithm"],["algorthymic","algorithmic"],["algorthymically","algorithmically"],["algorthyms","algorithms"],["algorthyn","algorithm"],["algorthynic","algorithmic"],["algorthynically","algorithmically"],["algorthyns","algorithms"],["algortihm","algorithm"],["algortihmic","algorithmic"],["algortihmically","algorithmically"],["algortihms","algorithms"],["algortim","algorithm"],["algortimic","algorithmic"],["algortimically","algorithmically"],["algortims","algorithms"],["algortism","algorithm"],["algortismic","algorithmic"],["algortismically","algorithmically"],["algortisms","algorithms"],["algortithm","algorithm"],["algortithmic","algorithmic"],["algortithmically","algorithmically"],["algortithms","algorithms"],["algoruthm","algorithm"],["algoruthmic","algorithmic"],["algoruthmically","algorithmically"],["algoruthms","algorithms"],["algorwwithm","algorithm"],["algorwwithmic","algorithmic"],["algorwwithmically","algorithmically"],["algorwwithms","algorithms"],["algorythem","algorithm"],["algorythemic","algorithmic"],["algorythemically","algorithmically"],["algorythems","algorithms"],["algorythm","algorithm"],["algorythmic","algorithmic"],["algorythmically","algorithmically"],["algorythms","algorithms"],["algothitm","algorithm"],["algothitmic","algorithmic"],["algothitmically","algorithmically"],["algothitms","algorithms"],["algotighm","algorithm"],["algotighmic","algorithmic"],["algotighmically","algorithmically"],["algotighms","algorithms"],["algotihm","algorithm"],["algotihmic","algorithmic"],["algotihmically","algorithmically"],["algotihms","algorithms"],["algotirhm","algorithm"],["algotirhmic","algorithmic"],["algotirhmically","algorithmically"],["algotirhms","algorithms"],["algotithm","algorithm"],["algotithmic","algorithmic"],["algotithmically","algorithmically"],["algotithms","algorithms"],["algotrithm","algorithm"],["algotrithmic","algorithmic"],["algotrithmically","algorithmically"],["algotrithms","algorithms"],["alha","alpha"],["alhabet","alphabet"],["alhabetical","alphabetical"],["alhabetically","alphabetically"],["alhabeticaly","alphabetically"],["alhabets","alphabets"],["alhapet","alphabet"],["alhapetical","alphabetical"],["alhapetically","alphabetically"],["alhapeticaly","alphabetically"],["alhapets","alphabets"],["alhough","although"],["alhpa","alpha"],["alhpabet","alphabet"],["alhpabetical","alphabetical"],["alhpabetically","alphabetically"],["alhpabeticaly","alphabetically"],["alhpabets","alphabets"],["aliagn","align"],["aliasas","aliases"],["aliasses","aliases"],["alientating","alienating"],["aliged","aligned"],["alighned","aligned"],["alighnment","alignment"],["aligin","align"],["aligined","aligned"],["aligining","aligning"],["aliginment","alignment"],["aligins","aligns"],["aligment","alignment"],["aligments","alignments"],["alignation","alignment"],["alignd","aligned"],["aligne","align"],["alignement","alignment"],["alignemnt","alignment"],["alignemnts","alignments"],["alignemt","alignment"],["alignes","aligns"],["alignmant","alignment"],["alignmen","alignment"],["alignmenet","alignment"],["alignmenets","alignments"],["alignmenton","alignment on"],["alignmet","alignment"],["alignmets","alignments"],["alignmment","alignment"],["alignmments","alignments"],["alignmnet","alignment"],["alignmnt","alignment"],["alignrigh","alignright"],["alined","aligned"],["alinged","aligned"],["alinging","aligning"],["alingment","alignment"],["alinment","alignment"],["alinments","alignments"],["alising","aliasing"],["allcate","allocate"],["allcateing","allocating"],["allcater","allocator"],["allcaters","allocators"],["allcating","allocating"],["allcation","allocation"],["allcator","allocator"],["allcoate","allocate"],["allcoated","allocated"],["allcoateing","allocating"],["allcoateng","allocating"],["allcoater","allocator"],["allcoaters","allocators"],["allcoating","allocating"],["allcoation","allocation"],["allcoator","allocator"],["allcoators","allocators"],["alledge","allege"],["alledged","alleged"],["alledgedly","allegedly"],["alledges","alleges"],["allegedely","allegedly"],["allegedy","allegedly"],["allegely","allegedly"],["allegence","allegiance"],["allegience","allegiance"],["allif","all if"],["allign","align"],["alligned","aligned"],["allignement","alignment"],["allignemnt","alignment"],["alligning","aligning"],["allignment","alignment"],["allignmenterror","alignmenterror"],["allignments","alignments"],["alligns","aligns"],["alliviate","alleviate"],["allk","all"],["alllocate","allocate"],["alllocation","allocation"],["alllow","allow"],["alllowed","allowed"],["alllows","allows"],["allmost","almost"],["alloacate","allocate"],["allocae","allocate"],["allocaed","allocated"],["allocaes","allocates"],["allocagtor","allocator"],["allocaiing","allocating"],["allocaing","allocating"],["allocaion","allocation"],["allocaions","allocations"],["allocaite","allocate"],["allocaites","allocates"],["allocaiting","allocating"],["allocaition","allocation"],["allocaitions","allocations"],["allocaiton","allocation"],["allocaitons","allocations"],["allocal","allocate"],["allocarion","allocation"],["allocat","allocate"],["allocatbale","allocatable"],["allocatedi","allocated"],["allocatedp","allocated"],["allocateing","allocating"],["allocateng","allocating"],["allocaton","allocation"],["allocatoor","allocator"],["allocatote","allocate"],["allocatrd","allocated"],["allocattion","allocation"],["alloco","alloc"],["allocos","allocs"],["allocte","allocate"],["allocted","allocated"],["allocting","allocating"],["alloction","allocation"],["alloctions","allocations"],["alloctor","allocator"],["alloews","allows"],["allong","along"],["alloocates","allocates"],["allopone","allophone"],["allopones","allophones"],["allos","allows"],["alloted","allotted"],["allowence","allowance"],["allowences","allowances"],["allpication","application"],["allpications","applications"],["allso","also"],["allthough","although"],["alltough","although"],["allways","always"],["allwo","allow"],["allwos","allows"],["allws","allows"],["allwys","always"],["almoast","almost"],["almostly","almost"],["almsot","almost"],["alo","also"],["alocatable","allocatable"],["alocate","allocate"],["alocated","allocated"],["alocates","allocates"],["alocating","allocating"],["alocations","allocations"],["alochol","alcohol"],["alog","along"],["alogirhtm","algorithm"],["alogirhtmic","algorithmic"],["alogirhtmically","algorithmically"],["alogirhtms","algorithms"],["alogirthm","algorithm"],["alogirthmic","algorithmic"],["alogirthmically","algorithmically"],["alogirthms","algorithms"],["alogned","aligned"],["alogorithms","algorithms"],["alogrithm","algorithm"],["alogrithmic","algorithmic"],["alogrithmically","algorithmically"],["alogrithms","algorithms"],["alomst","almost"],["aloows","allows"],["alorithm","algorithm"],["alos","also"],["alotted","allotted"],["alow","allow"],["alowed","allowed"],["alowing","allowing"],["alows","allows"],["alpabet","alphabet"],["alpabetic","alphabetic"],["alpabetical","alphabetical"],["alpabets","alphabets"],["alpah","alpha"],["alpahabetical","alphabetical"],["alpahbetically","alphabetically"],["alph","alpha"],["alpha-numeric","alphanumeric"],["alphabeticaly","alphabetically"],["alphabeticly","alphabetical"],["alphapeicall","alphabetical"],["alphapeticaly","alphabetically"],["alrady","already"],["alraedy","already"],["alread","already"],["alreadly","already"],["alreadt","already"],["alreasy","already"],["alreay","already"],["alreayd","already"],["alreday","already"],["alredy","already"],["alrelady","already"],["alrms","alarms"],["alrogithm","algorithm"],["alrteady","already"],["als","also"],["alsmost","almost"],["alsot","also"],["alsready","already"],["altenative","alternative"],["alterated","altered"],["alterately","alternately"],["alterative","alternative"],["alteratives","alternatives"],["alterior","ulterior"],["alternaive","alternative"],["alternaives","alternatives"],["alternarive","alternative"],["alternarives","alternatives"],["alternatievly","alternatively"],["alternativey","alternatively"],["alternativley","alternatively"],["alternativly","alternatively"],["alternatve","alternative"],["alternavtely","alternatively"],["alternavtive","alternative"],["alternavtives","alternatives"],["alternetive","alternative"],["alternetives","alternatives"],["alternitive","alternative"],["alternitively","alternatively"],["alternitiveness","alternativeness"],["alternitives","alternatives"],["alternitivly","alternatively"],["altetnative","alternative"],["altho","although"],["althogh","although"],["althorithm","algorithm"],["althorithmic","algorithmic"],["althorithmically","algorithmically"],["althorithms","algorithms"],["althoug","although"],["althought","although"],["althougth","although"],["althouth","although"],["altitide","altitude"],["altitute","altitude"],["altogehter","altogether"],["altough","although"],["altought","although"],["altready","already"],["alue","value"],["alvorithm","algorithm"],["alvorithmic","algorithmic"],["alvorithmically","algorithmically"],["alvorithms","algorithms"],["alwais","always"],["alwas","always"],["alwast","always"],["alwasy","always"],["alwasys","always"],["alwauys","always"],["alway","always"],["alwyas","always"],["alwys","always"],["alyways","always"],["amacing","amazing"],["amacingly","amazingly"],["amalgomated","amalgamated"],["amatuer","amateur"],["amazaing","amazing"],["ambedded","embedded"],["ambibuity","ambiguity"],["ambien","ambient"],["ambigious","ambiguous"],["ambigous","ambiguous"],["ambiguious","ambiguous"],["ambiguitiy","ambiguity"],["ambiguos","ambiguous"],["ambitous","ambitious"],["ambuguity","ambiguity"],["ambulence","ambulance"],["ambulences","ambulances"],["amdgput","amdgpu"],["amendement","amendment"],["amendmant","amendment"],["Amercia","America"],["amerliorate","ameliorate"],["amgle","angle"],["amgles","angles"],["amiguous","ambiguous"],["amke","make"],["amking","making"],["ammend","amend"],["ammended","amended"],["ammending","amending"],["ammendment","amendment"],["ammendments","amendments"],["ammends","amends"],["ammong","among"],["ammongst","amongst"],["ammortizes","amortizes"],["ammoung","among"],["ammoungst","amongst"],["ammount","amount"],["ammused","amused"],["amny","many"],["amongs","among"],["amonst","amongst"],["amonut","amount"],["amound","amount"],["amounds","amounts"],["amoung","among"],["amoungst","amongst"],["amout","amount"],["amoutn","amount"],["amoutns","amounts"],["amouts","amounts"],["amperstands","ampersands"],["amphasis","emphasis"],["amplifer","amplifier"],["amplifyer","amplifier"],["amplitud","amplitude"],["ampty","empty"],["amuch","much"],["amung","among"],["amunition","ammunition"],["amunt","amount"],["analagous","analogous"],["analagus","analogous"],["analaog","analog"],["analgous","analogous"],["analig","analog"],["analise","analyse"],["analised","analysed"],["analiser","analyser"],["analising","analysing"],["analisis","analysis"],["analitic","analytic"],["analitical","analytical"],["analitically","analytically"],["analiticaly","analytically"],["analize","analyze"],["analized","analyzed"],["analizer","analyzer"],["analizes","analyzes"],["analizing","analyzing"],["analogeous","analogous"],["analogicaly","analogically"],["analoguous","analogous"],["analoguously","analogously"],["analogus","analogous"],["analouge","analogue"],["analouges","analogues"],["analsye","analyse"],["analsyed","analysed"],["analsyer","analyser"],["analsyers","analysers"],["analsyes","analyses"],["analsying","analysing"],["analsyis","analysis"],["analsyt","analyst"],["analsyts","analysts"],["analyis","analysis"],["analysator","analyser"],["analysus","analysis"],["analysy","analysis"],["analyticaly","analytically"],["analyticly","analytically"],["analyzator","analyzer"],["analzye","analyze"],["analzyed","analyzed"],["analzyer","analyzer"],["analzyers","analyzers"],["analzyes","analyzes"],["analzying","analyzing"],["ananlog","analog"],["anarchim","anarchism"],["anarchistm","anarchism"],["anarquism","anarchism"],["anarquist","anarchist"],["anaylse","analyse"],["anaylsed","analysed"],["anaylser","analyser"],["anaylses","analyses"],["anaylsis","analysis"],["anaylsises","analysises"],["anayltic","analytic"],["anayltical","analytical"],["anayltically","analytically"],["anayltics","analytics"],["anaylze","analyze"],["anaylzed","analyzed"],["anaylzer","analyzer"],["anaylzes","analyzes"],["anbd","and"],["ancapsulate","encapsulate"],["ancapsulated","encapsulated"],["ancapsulates","encapsulates"],["ancapsulating","encapsulating"],["ancapsulation","encapsulation"],["ancesetor","ancestor"],["ancesetors","ancestors"],["ancester","ancestor"],["ancesteres","ancestors"],["ancesters","ancestors"],["ancestore","ancestor"],["ancestores","ancestors"],["ancestory","ancestry"],["anchestor","ancestor"],["anchestors","ancestors"],["anchord","anchored"],["ancilliary","ancillary"],["andd","and"],["andoid","android"],["andoids","androids"],["andorid","android"],["andorids","androids"],["andriod","android"],["andriods","androids"],["androgenous","androgynous"],["androgeny","androgyny"],["androidextra","androidextras"],["androind","android"],["androinds","androids"],["andthe","and the"],["ane","and"],["anevironment","environment"],["anevironments","environments"],["angluar","angular"],["anhoter","another"],["anid","and"],["anihilation","annihilation"],["animaing","animating"],["animaite","animate"],["animaiter","animator"],["animaiters","animators"],["animaiton","animation"],["animaitons","animations"],["animaitor","animator"],["animaitors","animators"],["animaton","animation"],["animatonic","animatronic"],["animete","animate"],["animeted","animated"],["animetion","animation"],["animetions","animations"],["animets","animates"],["animore","anymore"],["aninate","animate"],["anination","animation"],["aniother","any other"],["anisotrophically","anisotropically"],["anitaliasing","antialiasing"],["anithing","anything"],["anitialising","antialiasing"],["anitime","anytime"],["anitrez","antirez"],["aniversary","anniversary"],["aniway","anyway"],["aniwhere","anywhere"],["anlge","angle"],["anlysis","analysis"],["anlyzing","analyzing"],["annayed","annoyed"],["annaying","annoying"],["annd","and"],["anniversery","anniversary"],["annnounce","announce"],["annoation","annotation"],["annoint","anoint"],["annointed","anointed"],["annointing","anointing"],["annoints","anoints"],["annonate","annotate"],["annonated","annotated"],["annonates","annotates"],["annonce","announce"],["annonced","announced"],["annoncement","announcement"],["annoncements","announcements"],["annonces","announces"],["annoncing","announcing"],["annonymous","anonymous"],["annotaion","annotation"],["annotaions","annotations"],["annoted","annotated"],["annother","another"],["annouce","announce"],["annouced","announced"],["annoucement","announcement"],["annoucements","announcements"],["annouces","announces"],["annoucing","announcing"],["annouing","annoying"],["announcment","announcement"],["announcments","announcements"],["announed","announced"],["announement","announcement"],["announements","announcements"],["annoymous","anonymous"],["annoyying","annoying"],["annualy","annually"],["annuled","annulled"],["annyoingly","annoyingly"],["anoher","another"],["anohter","another"],["anologon","analogon"],["anomally","anomaly"],["anomolies","anomalies"],["anomolous","anomalous"],["anomoly","anomaly"],["anonimity","anonymity"],["anononymous","anonymous"],["anonther","another"],["anonymouse","anonymous"],["anonyms","anonymous"],["anonymus","anonymous"],["anormalies","anomalies"],["anormaly","abnormally"],["anotate","annotate"],["anotated","annotated"],["anotates","annotates"],["anotating","annotating"],["anotation","annotation"],["anotations","annotations"],["anoter","another"],["anothe","another"],["anothers","another"],["anothr","another"],["anounce","announce"],["anounced","announced"],["anouncement","announcement"],["anount","amount"],["anoying","annoying"],["anoymous","anonymous"],["anroid","android"],["ansalisation","nasalisation"],["ansalization","nasalization"],["anser","answer"],["ansester","ancestor"],["ansesters","ancestors"],["ansestor","ancestor"],["ansestors","ancestors"],["answhare","answer"],["answhared","answered"],["answhareing","answering"],["answhares","answers"],["answharing","answering"],["answhars","answers"],["ansynchronous","asynchronous"],["antaliasing","antialiasing"],["antartic","antarctic"],["antecedant","antecedent"],["anteena","antenna"],["anteenas","antennas"],["anthing","anything"],["anthings","anythings"],["anthor","another"],["anthromorphization","anthropomorphization"],["anthropolgist","anthropologist"],["anthropolgy","anthropology"],["antialialised","antialiased"],["antialising","antialiasing"],["antiapartheid","anti-apartheid"],["anticpate","anticipate"],["antry","entry"],["antyhing","anything"],["anual","annual"],["anually","annually"],["anulled","annulled"],["anumber","a number"],["anuwhere","anywhere"],["anway","anyway"],["anways","anyway"],["anwhere","anywhere"],["anwser","answer"],["anwsered","answered"],["anwsering","answering"],["anwsers","answers"],["anyawy","anyway"],["anyhing","anything"],["anyhting","anything"],["anyhwere","anywhere"],["anylsing","analysing"],["anylzing","analyzing"],["anynmore","anymore"],["anyother","any other"],["anytghing","anything"],["anythig","anything"],["anythign","anything"],["anythimng","anything"],["anytiem","anytime"],["anytihng","anything"],["anyting","anything"],["anytning","anything"],["anytrhing","anything"],["anytthing","anything"],["anytying","anything"],["anywere","anywhere"],["anyy","any"],["aoache","apache"],["aond","and"],["aoto","auto"],["aotomate","automate"],["aotomated","automated"],["aotomatic","automatic"],["aotomatical","automatic"],["aotomaticall","automatically"],["aotomatically","automatically"],["aotomation","automation"],["aovid","avoid"],["apach","apache"],["apapted","adapted"],["aparant","apparent"],["aparantly","apparently"],["aparent","apparent"],["aparently","apparently"],["aparment","apartment"],["apdated","updated"],["apeal","appeal"],["apealed","appealed"],["apealing","appealing"],["apeals","appeals"],["apear","appear"],["apeared","appeared"],["apears","appears"],["apect","aspect"],["apects","aspects"],["apeends","appends"],["apend","append"],["apendage","appendage"],["apended","appended"],["apender","appender"],["apendices","appendices"],["apending","appending"],["apendix","appendix"],["apenines","Apennines"],["aperatures","apertures"],["aperure","aperture"],["aperures","apertures"],["apeture","aperture"],["apetures","apertures"],["apilogue","epilogue"],["aplha","alpha"],["aplication","application"],["aplications","applications"],["aplied","applied"],["aplies","applies"],["apllicatin","application"],["apllicatins","applications"],["apllication","application"],["apllications","applications"],["apllied","applied"],["apllies","applies"],["aplly","apply"],["apllying","applying"],["aply","apply"],["aplyed","applied"],["aplying","applying"],["apointed","appointed"],["apointing","appointing"],["apointment","appointment"],["apoints","appoints"],["apolegetic","apologetic"],["apolegetics","apologetics"],["aportionable","apportionable"],["apostrophie","apostrophe"],["apostrophies","apostrophes"],["appar","appear"],["apparant","apparent"],["apparantly","apparently"],["appared","appeared"],["apparence","appearance"],["apparenlty","apparently"],["apparenly","apparently"],["appares","appears"],["apparoches","approaches"],["appars","appears"],["appart","apart"],["appartment","apartment"],["appartments","apartments"],["appearaing","appearing"],["appearantly","apparently"],["appeareance","appearance"],["appearence","appearance"],["appearences","appearances"],["appearently","apparently"],["appeares","appears"],["appearning","appearing"],["appearrs","appears"],["appeciate","appreciate"],["appeded","appended"],["appeding","appending"],["appedn","append"],["appen","append"],["appendend","appended"],["appendent","appended"],["appendex","appendix"],["appendig","appending"],["appendign","appending"],["appendt","append"],["appeneded","appended"],["appenines","Apennines"],["appens","appends"],["appent","append"],["apperance","appearance"],["apperances","appearances"],["apperar","appear"],["apperarance","appearance"],["apperarances","appearances"],["apperared","appeared"],["apperaring","appearing"],["apperars","appears"],["appereance","appearance"],["appereances","appearances"],["appered","appeared"],["apperent","apparent"],["apperently","apparently"],["appers","appears"],["apperture","aperture"],["appicability","applicability"],["appicable","applicable"],["appicaliton","application"],["appicalitons","applications"],["appicant","applicant"],["appication","application"],["appication-specific","application-specific"],["appications","applications"],["appicative","applicative"],["appied","applied"],["appies","applies"],["applay","apply"],["applcation","application"],["applcations","applications"],["appliable","applicable"],["appliacable","applicable"],["appliaction","application"],["appliactions","applications"],["appliation","application"],["appliations","applications"],["applicabel","applicable"],["applicaion","application"],["applicaions","applications"],["applicaiton","application"],["applicaitons","applications"],["applicance","appliance"],["applicapility","applicability"],["applicaple","applicable"],["applicatable","applicable"],["applicaten","application"],["applicatin","application"],["applicatins","applications"],["applicatio","application"],["applicationb","application"],["applicatios","applications"],["applicatiosn","applications"],["applicaton","application"],["applicatons","applications"],["appliction","application"],["applictions","applications"],["applide","applied"],["applikation","application"],["applikations","applications"],["appllied","applied"],["applly","apply"],["applyable","applicable"],["applycable","applicable"],["applyed","applied"],["applyes","applies"],["applyied","applied"],["applyig","applying"],["applys","applies"],["applyting","applying"],["appned","append"],["appologies","apologies"],["appology","apology"],["appon","upon"],["appopriate","appropriate"],["apporach","approach"],["apporached","approached"],["apporaches","approaches"],["apporaching","approaching"],["apporiate","appropriate"],["apporoximate","approximate"],["apporoximated","approximated"],["apporpiate","appropriate"],["apporpriate","appropriate"],["apporpriated","appropriated"],["apporpriately","appropriately"],["apporpriates","appropriates"],["apporpriating","appropriating"],["apporpriation","appropriation"],["apporpriations","appropriations"],["apporval","approval"],["apporve","approve"],["apporved","approved"],["apporves","approves"],["apporving","approving"],["appoval","approval"],["appove","approve"],["appoved","approved"],["appoves","approves"],["appoving","approving"],["appoximate","approximate"],["appoximately","approximately"],["appoximates","approximates"],["appoximation","approximation"],["appoximations","approximations"],["apppear","appear"],["apppears","appears"],["apppend","append"],["apppends","appends"],["appplet","applet"],["appplication","application"],["appplications","applications"],["appplying","applying"],["apppriate","appropriate"],["appproach","approach"],["apppropriate","appropriate"],["appraoch","approach"],["appraochable","approachable"],["appraoched","approached"],["appraoches","approaches"],["appraoching","approaching"],["apprearance","appearance"],["apprently","apparently"],["appreteate","appreciate"],["appreteated","appreciated"],["appretiate","appreciate"],["appretiated","appreciated"],["appretiates","appreciates"],["appretiating","appreciating"],["appretiation","appreciation"],["appretiative","appreciative"],["apprieciate","appreciate"],["apprieciated","appreciated"],["apprieciates","appreciates"],["apprieciating","appreciating"],["apprieciation","appreciation"],["apprieciative","appreciative"],["appriopriate","appropriate"],["appripriate","appropriate"],["appriproate","appropriate"],["apprixamate","approximate"],["apprixamated","approximated"],["apprixamately","approximately"],["apprixamates","approximates"],["apprixamating","approximating"],["apprixamation","approximation"],["apprixamations","approximations"],["appriximate","approximate"],["appriximated","approximated"],["appriximately","approximately"],["appriximates","approximates"],["appriximating","approximating"],["appriximation","approximation"],["appriximations","approximations"],["approachs","approaches"],["approbiate","appropriate"],["approch","approach"],["approche","approach"],["approched","approached"],["approches","approaches"],["approching","approaching"],["approiate","appropriate"],["approopriate","appropriate"],["approoximate","approximate"],["approoximately","approximately"],["approoximates","approximates"],["approoximation","approximation"],["approoximations","approximations"],["approperiate","appropriate"],["appropiate","appropriate"],["appropiately","appropriately"],["approppriately","appropriately"],["appropraite","appropriate"],["appropraitely","appropriately"],["approprate","appropriate"],["approprated","appropriated"],["approprately","appropriately"],["appropration","appropriation"],["approprations","appropriations"],["appropriage","appropriate"],["appropriatedly","appropriately"],["appropriatee","appropriate"],["appropriatly","appropriately"],["appropriatness","appropriateness"],["appropriete","appropriate"],["appropritae","appropriate"],["appropritate","appropriate"],["appropritately","appropriately"],["approprite","appropriate"],["approproate","appropriate"],["appropropiate","appropriate"],["appropropiately","appropriately"],["appropropreate","appropriate"],["appropropriate","appropriate"],["approproximate","approximate"],["approproximately","approximately"],["approproximates","approximates"],["approproximation","approximation"],["approproximations","approximations"],["approprpiate","appropriate"],["approriate","appropriate"],["approriately","appropriately"],["approrpriate","appropriate"],["approrpriately","appropriately"],["approuval","approval"],["approuve","approve"],["approuved","approved"],["approuves","approves"],["approuving","approving"],["approvement","approval"],["approxamate","approximate"],["approxamately","approximately"],["approxamates","approximates"],["approxamation","approximation"],["approxamations","approximations"],["approxamatly","approximately"],["approxametely","approximately"],["approxiamte","approximate"],["approxiamtely","approximately"],["approxiamtes","approximates"],["approxiamtion","approximation"],["approxiamtions","approximations"],["approxiate","approximate"],["approxiately","approximately"],["approxiates","approximates"],["approxiation","approximation"],["approxiations","approximations"],["approximatively","approximately"],["approximatly","approximately"],["approximed","approximated"],["approximetely","approximately"],["approximitely","approximately"],["approxmate","approximate"],["approxmately","approximately"],["approxmates","approximates"],["approxmation","approximation"],["approxmations","approximations"],["approxmimation","approximation"],["apprpriate","appropriate"],["apprpriately","appropriately"],["appy","apply"],["appying","applying"],["apreciate","appreciate"],["apreciated","appreciated"],["apreciates","appreciates"],["apreciating","appreciating"],["apreciation","appreciation"],["apreciative","appreciative"],["aprehensive","apprehensive"],["apreteate","appreciate"],["apreteated","appreciated"],["apreteating","appreciating"],["apretiate","appreciate"],["apretiated","appreciated"],["apretiates","appreciates"],["apretiating","appreciating"],["apretiation","appreciation"],["apretiative","appreciative"],["aproach","approach"],["aproached","approached"],["aproaches","approaches"],["aproaching","approaching"],["aproch","approach"],["aproched","approached"],["aproches","approaches"],["aproching","approaching"],["aproove","approve"],["aprooved","approved"],["apropiate","appropriate"],["apropiately","appropriately"],["apropriate","appropriate"],["apropriately","appropriately"],["aproval","approval"],["aproximate","approximate"],["aproximately","approximately"],["aproximates","approximates"],["aproximation","approximation"],["aproximations","approximations"],["aprrovement","approval"],["aprroximate","approximate"],["aprroximately","approximately"],["aprroximates","approximates"],["aprroximation","approximation"],["aprroximations","approximations"],["aprtment","apartment"],["aqain","again"],["aqcuire","acquire"],["aqcuired","acquired"],["aqcuires","acquires"],["aqcuiring","acquiring"],["aquaduct","aqueduct"],["aquaint","acquaint"],["aquaintance","acquaintance"],["aquainted","acquainted"],["aquainting","acquainting"],["aquaints","acquaints"],["aquiantance","acquaintance"],["aquire","acquire"],["aquired","acquired"],["aquires","acquires"],["aquiring","acquiring"],["aquisition","acquisition"],["aquisitions","acquisitions"],["aquit","acquit"],["aquitted","acquitted"],["arameters","parameters"],["aranged","arranged"],["arangement","arrangement"],["araound","around"],["ararbic","arabic"],["aray","array"],["arays","arrays"],["arbiatraily","arbitrarily"],["arbiatray","arbitrary"],["arbibtarily","arbitrarily"],["arbibtary","arbitrary"],["arbibtrarily","arbitrarily"],["arbibtrary","arbitrary"],["arbiitrarily","arbitrarily"],["arbiitrary","arbitrary"],["arbirarily","arbitrarily"],["arbirary","arbitrary"],["arbiratily","arbitrarily"],["arbiraty","arbitrary"],["arbirtarily","arbitrarily"],["arbirtary","arbitrary"],["arbirtrarily","arbitrarily"],["arbirtrary","arbitrary"],["arbitarary","arbitrary"],["arbitarily","arbitrarily"],["arbitary","arbitrary"],["arbitiarily","arbitrarily"],["arbitiary","arbitrary"],["arbitiraly","arbitrarily"],["arbitiray","arbitrary"],["arbitrailly","arbitrarily"],["arbitraily","arbitrarily"],["arbitraion","arbitration"],["arbitrairly","arbitrarily"],["arbitrairy","arbitrary"],["arbitral","arbitrary"],["arbitralily","arbitrarily"],["arbitrally","arbitrarily"],["arbitralrily","arbitrarily"],["arbitralry","arbitrary"],["arbitraly","arbitrary"],["arbitrarion","arbitration"],["arbitraryily","arbitrarily"],["arbitraryly","arbitrary"],["arbitratily","arbitrarily"],["arbitratiojn","arbitration"],["arbitraton","arbitration"],["arbitratrily","arbitrarily"],["arbitratrion","arbitration"],["arbitratry","arbitrary"],["arbitraty","arbitrary"],["arbitray","arbitrary"],["arbitriarily","arbitrarily"],["arbitriary","arbitrary"],["arbitrily","arbitrarily"],["arbitrion","arbitration"],["arbitriraly","arbitrarily"],["arbitriray","arbitrary"],["arbitrition","arbitration"],["arbitrtily","arbitrarily"],["arbitrty","arbitrary"],["arbitry","arbitrary"],["arbitryarily","arbitrarily"],["arbitryary","arbitrary"],["arbitual","arbitrary"],["arbitually","arbitrarily"],["arbitualy","arbitrary"],["arbituarily","arbitrarily"],["arbituary","arbitrary"],["arbiturarily","arbitrarily"],["arbiturary","arbitrary"],["arbort","abort"],["arborted","aborted"],["arborting","aborting"],["arborts","aborts"],["arbritary","arbitrary"],["arbritrarily","arbitrarily"],["arbritrary","arbitrary"],["arbtirarily","arbitrarily"],["arbtirary","arbitrary"],["arbtrarily","arbitrarily"],["arbtrary","arbitrary"],["arbutrarily","arbitrarily"],["arbutrary","arbitrary"],["arch-dependet","arch-dependent"],["arch-independet","arch-independent"],["archaelogical","archaeological"],["archaelogists","archaeologists"],["archaelogy","archaeology"],["archetect","architect"],["archetects","architects"],["archetectural","architectural"],["archetecturally","architecturally"],["archetecture","architecture"],["archiac","archaic"],["archictect","architect"],["archictecture","architecture"],["archictectures","architectures"],["archicture","architecture"],["archiecture","architecture"],["archiectures","architectures"],["archimedian","archimedean"],["architct","architect"],["architcts","architects"],["architcture","architecture"],["architctures","architectures"],["architecht","architect"],["architechts","architects"],["architechturally","architecturally"],["architechture","architecture"],["architechtures","architectures"],["architectual","architectural"],["architectur","architecture"],["architecturs","architectures"],["architecturse","architectures"],["architecure","architecture"],["architecures","architectures"],["architecutre","architecture"],["architecutres","architectures"],["architecuture","architecture"],["architecutures","architectures"],["architetcure","architecture"],["architetcures","architectures"],["architeture","architecture"],["architetures","architectures"],["architure","architecture"],["architures","architectures"],["archiv","archive"],["archivel","archival"],["archor","anchor"],["archtecture","architecture"],["archtectures","architectures"],["archtiecture","architecture"],["archtiectures","architectures"],["archtitecture","architecture"],["archtitectures","architectures"],["archtype","archetype"],["archtypes","archetypes"],["archvie","archive"],["archvies","archives"],["archving","archiving"],["arcitecture","architecture"],["arcitectures","architectures"],["arcive","archive"],["arcived","archived"],["arciver","archiver"],["arcives","archives"],["arciving","archiving"],["arcticle","article"],["Ardiuno","Arduino"],["are'nt","aren't"],["aready","already"],["areea","area"],["aren's","aren't"],["aren;t","aren't"],["arent'","aren't"],["arent","aren't"],["arent;","aren't"],["areodynamics","aerodynamics"],["argement","argument"],["argements","arguments"],["argemnt","argument"],["argemnts","arguments"],["argment","argument"],["argments","arguments"],["argmument","argument"],["argmuments","arguments"],["argreement","agreement"],["argreements","agreements"],["argubly","arguably"],["arguement","argument"],["arguements","arguments"],["arguemnt","argument"],["arguemnts","arguments"],["arguemtn","argument"],["arguemtns","arguments"],["arguents","arguments"],["argumant","argument"],["argumants","arguments"],["argumeent","argument"],["argumeents","arguments"],["argumement","argument"],["argumements","arguments"],["argumemnt","argument"],["argumemnts","arguments"],["argumeng","argument"],["argumengs","arguments"],["argumens","arguments"],["argumenst","arguments"],["argumentents","arguments"],["argumeny","argument"],["argumet","argument"],["argumetn","argument"],["argumetns","arguments"],["argumets","arguments"],["argumnet","argument"],["argumnets","arguments"],["argumnt","argument"],["argumnts","arguments"],["arhive","archive"],["arhives","archives"],["aribitary","arbitrary"],["aribiter","arbiter"],["aribrary","arbitrary"],["aribtrarily","arbitrarily"],["aribtrary","arbitrary"],["ariflow","airflow"],["arised","arose"],["arithemetic","arithmetic"],["arithemtic","arithmetic"],["arithmatic","arithmetic"],["arithmentic","arithmetic"],["arithmetc","arithmetic"],["arithmethic","arithmetic"],["arithmitic","arithmetic"],["aritmetic","arithmetic"],["aritrary","arbitrary"],["aritst","artist"],["arival","arrival"],["arive","arrive"],["arlready","already"],["armamant","armament"],["armistace","armistice"],["armonic","harmonic"],["arn't","aren't"],["arne't","aren't"],["arogant","arrogant"],["arogent","arrogant"],["aronud","around"],["aroud","around"],["aroudn","around"],["arouind","around"],["arounf","around"],["aroung","around"],["arount","around"],["arquitecture","architecture"],["arquitectures","architectures"],["arraay","array"],["arragement","arrangement"],["arraival","arrival"],["arral","array"],["arranable","arrangeable"],["arrance","arrange"],["arrane","arrange"],["arraned","arranged"],["arranement","arrangement"],["arranements","arrangements"],["arranent","arrangement"],["arranents","arrangements"],["arranes","arranges"],["arrang","arrange"],["arrangable","arrangeable"],["arrangaeble","arrangeable"],["arrangaelbe","arrangeable"],["arrangd","arranged"],["arrangde","arranged"],["arrangemenet","arrangement"],["arrangemenets","arrangements"],["arrangent","arrangement"],["arrangents","arrangements"],["arrangmeent","arrangement"],["arrangmeents","arrangements"],["arrangmenet","arrangement"],["arrangmenets","arrangements"],["arrangment","arrangement"],["arrangments","arrangements"],["arrangnig","arranging"],["arrangs","arranges"],["arrangse","arranges"],["arrangt","arrangement"],["arrangte","arrange"],["arrangteable","arrangeable"],["arrangted","arranged"],["arrangtement","arrangement"],["arrangtements","arrangements"],["arrangtes","arranges"],["arrangting","arranging"],["arrangts","arrangements"],["arraning","arranging"],["arranment","arrangement"],["arranments","arrangements"],["arrants","arrangements"],["arraows","arrows"],["arrary","array"],["arrayes","arrays"],["arre","are"],["arreay","array"],["arrengement","arrangement"],["arrengements","arrangements"],["arriveis","arrives"],["arrivial","arrival"],["arround","around"],["arrray","array"],["arrrays","arrays"],["arrrive","arrive"],["arrrived","arrived"],["arrrives","arrives"],["arrtibute","attribute"],["arrya","array"],["arryas","arrays"],["arrys","arrays"],["artcile","article"],["articaft","artifact"],["articafts","artifacts"],["artical","article"],["articals","articles"],["articat","artifact"],["articats","artifacts"],["artice","article"],["articel","article"],["articels","articles"],["artifac","artifact"],["artifacs","artifacts"],["artifcat","artifact"],["artifcats","artifacts"],["artifical","artificial"],["artifically","artificially"],["artihmetic","arithmetic"],["artilce","article"],["artillary","artillery"],["artuments","arguments"],["arugment","argument"],["arugments","arguments"],["arument","argument"],["aruments","arguments"],["arund","around"],["arvg","argv"],["asai","Asia"],["asain","Asian"],["asbolute","absolute"],["asbolutelly","absolutely"],["asbolutely","absolutely"],["asbtract","abstract"],["asbtracted","abstracted"],["asbtracter","abstracter"],["asbtracting","abstracting"],["asbtraction","abstraction"],["asbtractions","abstractions"],["asbtractly","abstractly"],["asbtractness","abstractness"],["asbtractor","abstractor"],["asbtracts","abstracts"],["ascconciated","associated"],["asceding","ascending"],["ascpect","aspect"],["ascpects","aspects"],["asdignment","assignment"],["asdignments","assignments"],["asemble","assemble"],["asembled","assembled"],["asembler","assembler"],["asemblers","assemblers"],["asembles","assembles"],["asemblies","assemblies"],["asembling","assembling"],["asembly","assembly"],["asendance","ascendance"],["asendancey","ascendancy"],["asendancy","ascendancy"],["asendence","ascendance"],["asendencey","ascendancy"],["asendency","ascendancy"],["asending","ascending"],["asent","ascent"],["aserted","asserted"],["asertion","assertion"],["asess","assess"],["asessment","assessment"],["asessments","assessments"],["asetic","ascetic"],["asfar","as far"],["asign","assign"],["asigned","assigned"],["asignee","assignee"],["asignees","assignees"],["asigning","assigning"],["asignmend","assignment"],["asignmends","assignments"],["asignment","assignment"],["asignor","assignor"],["asigns","assigns"],["asii","ascii"],["asisstant","assistant"],["asisstants","assistants"],["asistance","assistance"],["aske","ask"],["askes","asks"],["aslo","also"],["asnwer","answer"],["asnwered","answered"],["asnwerer","answerer"],["asnwerers","answerers"],["asnwering","answering"],["asnwers","answers"],["asny","any"],["asnychronoue","asynchronous"],["asociated","associated"],["asolute","absolute"],["asorbed","absorbed"],["aspected","expected"],["asphyxation","asphyxiation"],["assasin","assassin"],["assasinate","assassinate"],["assasinated","assassinated"],["assasinates","assassinates"],["assasination","assassination"],["assasinations","assassinations"],["assasined","assassinated"],["assasins","assassins"],["assassintation","assassination"],["asscciated","associated"],["assciated","associated"],["asscii","ASCII"],["asscociated","associated"],["asscoitaed","associated"],["assebly","assembly"],["assebmly","assembly"],["assembe","assemble"],["assembed","assembled"],["assembeld","assembled"],["assember","assembler"],["assemblys","assemblies"],["assemby","assembly"],["assemly","assembly"],["assemnly","assembly"],["assemple","assemble"],["assending","ascending"],["asser","assert"],["assersion","assertion"],["assertation","assertion"],["assertio","assertion"],["assertting","asserting"],["assesmenet","assessment"],["assesment","assessment"],["assesments","assessments"],["assessmant","assessment"],["assessmants","assessments"],["assgin","assign"],["assgined","assigned"],["assgining","assigning"],["assginment","assignment"],["assginments","assignments"],["assgins","assigns"],["assicate","associate"],["assicated","associated"],["assicates","associates"],["assicating","associating"],["assication","association"],["assications","associations"],["assiciate","associate"],["assiciated","associated"],["assiciates","associates"],["assiciation","association"],["assiciations","associations"],["asside","aside"],["assiged","assigned"],["assigend","assigned"],["assigh","assign"],["assighed","assigned"],["assighee","assignee"],["assighees","assignees"],["assigher","assigner"],["assighers","assigners"],["assighing","assigning"],["assighor","assignor"],["assighors","assignors"],["assighs","assigns"],["assiging","assigning"],["assigment","assignment"],["assigments","assignments"],["assigmnent","assignment"],["assignalble","assignable"],["assignement","assignment"],["assignements","assignments"],["assignemnt","assignment"],["assignemnts","assignments"],["assignemtn","assignment"],["assignend","assigned"],["assignenment","assignment"],["assignenmentes","assignments"],["assignenments","assignments"],["assignenmet","assignment"],["assignes","assigns"],["assignmenet","assignment"],["assignmens","assignments"],["assignmet","assignment"],["assignmetns","assignments"],["assignmnet","assignment"],["assignt","assign"],["assigntment","assignment"],["assihnment","assignment"],["assihnments","assignments"],["assime","assume"],["assined","assigned"],["assing","assign"],["assinged","assigned"],["assinging","assigning"],["assingled","assigned"],["assingment","assignment"],["assingned","assigned"],["assingnment","assignment"],["assings","assigns"],["assinment","assignment"],["assiocate","associate"],["assiocated","associated"],["assiocates","associates"],["assiocating","associating"],["assiocation","association"],["assiociate","associate"],["assiociated","associated"],["assiociates","associates"],["assiociating","associating"],["assiociation","association"],["assisance","assistance"],["assisant","assistant"],["assisants","assistants"],["assising","assisting"],["assisnate","assassinate"],["assistence","assistance"],["assistent","assistant"],["assit","assist"],["assitant","assistant"],["assition","assertion"],["assmbler","assembler"],["assmeble","assemble"],["assmebler","assembler"],["assmebles","assembles"],["assmebling","assembling"],["assmebly","assembly"],["assmelber","assembler"],["assmption","assumption"],["assmptions","assumptions"],["assmume","assume"],["assmumed","assumed"],["assmumes","assumes"],["assmuming","assuming"],["assmumption","assumption"],["assmumptions","assumptions"],["assoaiate","associate"],["assoaiated","associated"],["assoaiates","associates"],["assoaiating","associating"],["assoaiation","association"],["assoaiations","associations"],["assoaiative","associative"],["assocaited","associated"],["assocate","associate"],["assocated","associated"],["assocates","associates"],["assocating","associating"],["assocation","association"],["assocations","associations"],["assocciated","associated"],["assocciation","association"],["assocciations","associations"],["assocciative","associative"],["associatated","associated"],["associatd","associated"],["associatied","associated"],["associcate","associate"],["associcated","associated"],["associcates","associates"],["associcating","associating"],["associdated","associated"],["associeate","associate"],["associeated","associated"],["associeates","associates"],["associeating","associating"],["associeation","association"],["associeations","associations"],["associeted","associated"],["associte","associate"],["associted","associated"],["assocites","associates"],["associting","associating"],["assocition","association"],["associtions","associations"],["associtive","associative"],["associuated","associated"],["assoction","association"],["assoiated","associated"],["assoicate","associate"],["assoicated","associated"],["assoicates","associates"],["assoication","association"],["assoiciative","associative"],["assomption","assumption"],["assosciate","associate"],["assosciated","associated"],["assosciates","associates"],["assosciating","associating"],["assosiacition","association"],["assosiacitions","associations"],["assosiacted","associated"],["assosiate","associate"],["assosiated","associated"],["assosiates","associates"],["assosiating","associating"],["assosiation","association"],["assosiations","associations"],["assosiative","associative"],["assosication","assassination"],["assotiated","associated"],["assoziated","associated"],["asssassans","assassins"],["asssembler","assembler"],["asssembly","assembly"],["asssert","assert"],["asssertion","assertion"],["asssociate","associated"],["asssociated","associated"],["asssociation","association"],["asssume","assume"],["asssumes","assumes"],["asssuming","assuming"],["assualt","assault"],["assualted","assaulted"],["assuembly","assembly"],["assum","assume"],["assuma","assume"],["assumad","assumed"],["assumang","assuming"],["assumas","assumes"],["assumbe","assume"],["assumbed","assumed"],["assumbes","assumes"],["assumbing","assuming"],["assumend","assumed"],["assumking","assuming"],["assumme","assume"],["assummed","assumed"],["assummes","assumes"],["assumming","assuming"],["assumne","assume"],["assumned","assumed"],["assumnes","assumes"],["assumning","assuming"],["assumong","assuming"],["assumotion","assumption"],["assumotions","assumptions"],["assumpation","assumption"],["assumpted","assumed"],["assums","assumes"],["assumse","assumes"],["assumtion","assumption"],["assumtions","assumptions"],["assumtpion","assumption"],["assumtpions","assumptions"],["assumu","assume"],["assumud","assumed"],["assumue","assume"],["assumued","assumed"],["assumues","assumes"],["assumuing","assuming"],["assumung","assuming"],["assumuption","assumption"],["assumuptions","assumptions"],["assumus","assumes"],["assupmption","assumption"],["assuption","assumption"],["assuptions","assumptions"],["assurred","assured"],["assymetric","asymmetric"],["assymetrical","asymmetrical"],["assymetries","asymmetries"],["assymetry","asymmetry"],["assymmetric","asymmetric"],["assymmetrical","asymmetrical"],["assymmetries","asymmetries"],["assymmetry","asymmetry"],["assymptote","asymptote"],["assymptotes","asymptotes"],["assymptotic","asymptotic"],["assymptotically","asymptotically"],["assymthotic","asymptotic"],["assymtote","asymptote"],["assymtotes","asymptotes"],["assymtotic","asymptotic"],["assymtotically","asymptotically"],["asterices","asterisks"],["asteriod","asteroid"],["astethic","aesthetic"],["astethically","aesthetically"],["astethicism","aestheticism"],["astethics","aesthetics"],["asthetic","aesthetic"],["asthetical","aesthetical"],["asthetically","aesthetically"],["asthetics","aesthetics"],["astiimate","estimate"],["astiimation","estimation"],["asume","assume"],["asumed","assumed"],["asumes","assumes"],["asuming","assuming"],["asumption","assumption"],["asure","assure"],["aswell","as well"],["asychronize","asynchronize"],["asychronized","asynchronized"],["asychronous","asynchronous"],["asychronously","asynchronously"],["asycn","async"],["asycnhronous","asynchronous"],["asycnhronously","asynchronously"],["asycronous","asynchronous"],["asymetic","asymmetric"],["asymetric","asymmetric"],["asymetrical","asymmetrical"],["asymetricaly","asymmetrically"],["asymmeric","asymmetric"],["asynchnous","asynchronous"],["asynchonous","asynchronous"],["asynchonously","asynchronously"],["asynchornous","asynchronous"],["asynchoronous","asynchronous"],["asynchrnous","asynchronous"],["asynchrnously","asynchronously"],["asynchromous","asynchronous"],["asynchron","asynchronous"],["asynchroneously","asynchronously"],["asynchronious","asynchronous"],["asynchronlous","asynchronous"],["asynchrons","asynchronous"],["asynchroous","asynchronous"],["asynchrounous","asynchronous"],["asynchrounsly","asynchronously"],["asyncronous","asynchronous"],["asyncronously","asynchronously"],["asynnc","async"],["asynschron","asynchronous"],["atach","attach"],["atached","attached"],["ataching","attaching"],["atachment","attachment"],["atachments","attachments"],["atack","attack"],["atain","attain"],["atatch","attach"],["atatchable","attachable"],["atatched","attached"],["atatches","attaches"],["atatching","attaching"],["atatchment","attachment"],["atatchments","attachments"],["atempt","attempt"],["atempting","attempting"],["atempts","attempts"],["atendance","attendance"],["atended","attended"],["atendee","attendee"],["atends","attends"],["atention","attention"],["atheistical","atheistic"],["athenean","Athenian"],["atheneans","Athenians"],["ather","other"],["athiesm","atheism"],["athiest","atheist"],["athough","although"],["athron","athlon"],["athros","atheros"],["atleast","at least"],["atll","all"],["atmoic","atomic"],["atmoically","atomically"],["atomatically","automatically"],["atomical","atomic"],["atomicly","atomically"],["atomiticity","atomicity"],["atomtical","automatic"],["atomtically","automatically"],["atomticaly","automatically"],["atomticlly","automatically"],["atomticly","automatically"],["atorecovery","autorecovery"],["atorney","attorney"],["atquired","acquired"],["atribs","attribs"],["atribut","attribute"],["atribute","attribute"],["atributed","attributed"],["atributes","attributes"],["atrribute","attribute"],["atrributes","attributes"],["atrtribute","attribute"],["atrtributes","attributes"],["attaced","attached"],["attachd","attached"],["attachement","attachment"],["attachements","attachments"],["attachemnt","attachment"],["attachemnts","attachments"],["attachen","attach"],["attachged","attached"],["attachmant","attachment"],["attachmants","attachments"],["attachs","attaches"],["attachted","attached"],["attacs","attacks"],["attacthed","attached"],["attampt","attempt"],["attatch","attach"],["attatched","attached"],["attatches","attaches"],["attatching","attaching"],["attatchment","attachment"],["attatchments","attachments"],["attch","attach"],["attched","attached"],["attches","attaches"],["attching","attaching"],["attchment","attachment"],["attement","attempt"],["attemented","attempted"],["attementing","attempting"],["attements","attempts"],["attemp","attempt"],["attemped","attempted"],["attemping","attempting"],["attemppt","attempt"],["attemps","attempts"],["attemptes","attempts"],["attemptting","attempting"],["attemt","attempt"],["attemted","attempted"],["attemting","attempting"],["attemtp","attempt"],["attemtped","attempted"],["attemtping","attempting"],["attemtps","attempts"],["attemtpted","attempted"],["attemtpts","attempts"],["attemts","attempts"],["attendence","attendance"],["attendent","attendant"],["attendents","attendants"],["attened","attended"],["attennuation","attenuation"],["attension","attention"],["attented","attended"],["attentuation","attenuation"],["attentuations","attenuations"],["attepmpt","attempt"],["attept","attempt"],["attetntion","attention"],["attibute","attribute"],["attibuted","attributed"],["attibutes","attributes"],["attirbute","attribute"],["attirbutes","attributes"],["attiribute","attribute"],["attitide","attitude"],["attmept","attempt"],["attmpt","attempt"],["attnetion","attention"],["attosencond","attosecond"],["attosenconds","attoseconds"],["attrbiute","attribute"],["attrbute","attribute"],["attrbuted","attributed"],["attrbutes","attributes"],["attrbution","attribution"],["attrbutions","attributions"],["attribbute","attribute"],["attribiute","attribute"],["attribiutes","attributes"],["attribte","attribute"],["attribted","attributed"],["attribting","attributing"],["attribtue","attribute"],["attribtutes","attributes"],["attribude","attribute"],["attribue","attribute"],["attribues","attributes"],["attribuets","attributes"],["attribuite","attribute"],["attribuites","attributes"],["attribuition","attribution"],["attribure","attribute"],["attribured","attributed"],["attribures","attributes"],["attriburte","attribute"],["attriburted","attributed"],["attriburtes","attributes"],["attriburtion","attribution"],["attribut","attribute"],["attributei","attribute"],["attributen","attribute"],["attributess","attributes"],["attributred","attributed"],["attributs","attributes"],["attribye","attribute"],["attribyes","attributes"],["attribyte","attribute"],["attribytes","attributes"],["attriebute","attribute"],["attriebuted","attributed"],["attriebutes","attributes"],["attriebuting","attributing"],["attrirbute","attribute"],["attrirbuted","attributed"],["attrirbutes","attributes"],["attrirbution","attribution"],["attritube","attribute"],["attritubed","attributed"],["attritubes","attributes"],["attriubtes","attributes"],["attriubute","attribute"],["attrocities","atrocities"],["attrribute","attribute"],["attrributed","attributed"],["attrributes","attributes"],["attrribution","attribution"],["attrubite","attribute"],["attrubites","attributes"],["attrubte","attribute"],["attrubtes","attributes"],["attrubure","attribute"],["attrubures","attributes"],["attrubute","attribute"],["attrubutes","attributes"],["attrubyte","attribute"],["attrubytes","attributes"],["attruibute","attribute"],["attruibutes","attributes"],["atttached","attached"],["atttribute","attribute"],["atttributes","attributes"],["atuhenticate","authenticate"],["atuhenticated","authenticated"],["atuhenticates","authenticates"],["atuhenticating","authenticating"],["atuhentication","authentication"],["atuhenticator","authenticator"],["atuhenticators","authenticators"],["auccess","success"],["auccessive","successive"],["audeince","audience"],["audiance","audience"],["augest","August"],["augmnet","augment"],["augmnetation","augmentation"],["augmneted","augmented"],["augmneter","augmenter"],["augmneters","augmenters"],["augmnetes","augments"],["augmneting","augmenting"],["augmnets","augments"],["auguest","august"],["auhtor","author"],["auhtors","authors"],["aunthenticate","authenticate"],["aunthenticated","authenticated"],["aunthenticates","authenticates"],["aunthenticating","authenticating"],["aunthentication","authentication"],["aunthenticator","authenticator"],["aunthenticators","authenticators"],["auospacing","autospacing"],["auot","auto"],["auotmatic","automatic"],["auromated","automated"],["austrailia","Australia"],["austrailian","Australian"],["Australien","Australian"],["Austrlaian","Australian"],["autasave","autosave"],["autasaves","autosaves"],["autenticate","authenticate"],["autenticated","authenticated"],["autenticates","authenticates"],["autenticating","authenticating"],["autentication","authentication"],["autenticator","authenticator"],["autenticators","authenticators"],["authecate","authenticate"],["authecated","authenticated"],["authecates","authenticates"],["authecating","authenticating"],["authecation","authentication"],["authecator","authenticator"],["authecators","authenticators"],["authenaticate","authenticate"],["authenaticated","authenticated"],["authenaticates","authenticates"],["authenaticating","authenticating"],["authenatication","authentication"],["authenaticator","authenticator"],["authenaticators","authenticators"],["authencate","authenticate"],["authencated","authenticated"],["authencates","authenticates"],["authencating","authenticating"],["authencation","authentication"],["authencator","authenticator"],["authencators","authenticators"],["authenciate","authenticate"],["authenciated","authenticated"],["authenciates","authenticates"],["authenciating","authenticating"],["authenciation","authentication"],["authenciator","authenticator"],["authenciators","authenticators"],["authencicate","authenticate"],["authencicated","authenticated"],["authencicates","authenticates"],["authencicating","authenticating"],["authencication","authentication"],["authencicator","authenticator"],["authencicators","authenticators"],["authencity","authenticity"],["authencticate","authenticate"],["authencticated","authenticated"],["authencticates","authenticates"],["authencticating","authenticating"],["authenctication","authentication"],["authencticator","authenticator"],["authencticators","authenticators"],["authendicate","authenticate"],["authendicated","authenticated"],["authendicates","authenticates"],["authendicating","authenticating"],["authendication","authentication"],["authendicator","authenticator"],["authendicators","authenticators"],["authenenticate","authenticate"],["authenenticated","authenticated"],["authenenticates","authenticates"],["authenenticating","authenticating"],["authenentication","authentication"],["authenenticator","authenticator"],["authenenticators","authenticators"],["authenfie","authenticate"],["authenfied","authenticated"],["authenfies","authenticates"],["authenfiing","authenticating"],["authenfiion","authentication"],["authenfior","authenticator"],["authenfiors","authenticators"],["authenicae","authenticate"],["authenicaed","authenticated"],["authenicaes","authenticates"],["authenicaing","authenticating"],["authenicaion","authentication"],["authenicaor","authenticator"],["authenicaors","authenticators"],["authenicate","authenticate"],["authenicated","authenticated"],["authenicates","authenticates"],["authenicating","authenticating"],["authenication","authentication"],["authenicator","authenticator"],["authenicators","authenticators"],["authenificate","authenticate"],["authenificated","authenticated"],["authenificates","authenticates"],["authenificating","authenticating"],["authenification","authentication"],["authenificator","authenticator"],["authenificators","authenticators"],["authenitcate","authenticate"],["authenitcated","authenticated"],["authenitcates","authenticates"],["authenitcating","authenticating"],["authenitcation","authentication"],["authenitcator","authenticator"],["authenitcators","authenticators"],["autheniticate","authenticate"],["autheniticated","authenticated"],["autheniticates","authenticates"],["autheniticating","authenticating"],["authenitication","authentication"],["autheniticator","authenticator"],["autheniticators","authenticators"],["authenricate","authenticate"],["authenricated","authenticated"],["authenricates","authenticates"],["authenricating","authenticating"],["authenrication","authentication"],["authenricator","authenticator"],["authenricators","authenticators"],["authentation","authentication"],["authentcated","authenticated"],["authentciate","authenticate"],["authentciated","authenticated"],["authentciates","authenticates"],["authentciating","authenticating"],["authentciation","authentication"],["authentciator","authenticator"],["authentciators","authenticators"],["authenticaiton","authentication"],["authenticateion","authentication"],["authentiction","authentication"],["authentification","authentication"],["auther","author"],["autherisation","authorisation"],["autherise","authorise"],["autherization","authorization"],["autherize","authorize"],["authers","authors"],["authethenticate","authenticate"],["authethenticated","authenticated"],["authethenticates","authenticates"],["authethenticating","authenticating"],["authethentication","authentication"],["authethenticator","authenticator"],["authethenticators","authenticators"],["authethicate","authenticate"],["authethicated","authenticated"],["authethicates","authenticates"],["authethicating","authenticating"],["authethication","authentication"],["authethicator","authenticator"],["authethicators","authenticators"],["autheticate","authenticate"],["autheticated","authenticated"],["autheticates","authenticates"],["autheticating","authenticating"],["authetication","authentication"],["autheticator","authenticator"],["autheticators","authenticators"],["authetnicate","authenticate"],["authetnicated","authenticated"],["authetnicates","authenticates"],["authetnicating","authenticating"],["authetnication","authentication"],["authetnicator","authenticator"],["authetnicators","authenticators"],["authetnticate","authenticate"],["authetnticated","authenticated"],["authetnticates","authenticates"],["authetnticating","authenticating"],["authetntication","authentication"],["authetnticator","authenticator"],["authetnticators","authenticators"],["authobiographic","autobiographic"],["authobiography","autobiography"],["authoer","author"],["authoratative","authoritative"],["authorative","authoritative"],["authorded","authored"],["authorites","authorities"],["authorithy","authority"],["authoritiers","authorities"],["authorititive","authoritative"],["authoritive","authoritative"],["authorizeed","authorized"],["authror","author"],["authrored","authored"],["authrorisation","authorisation"],["authrorities","authorities"],["authrorization","authorization"],["authrors","authors"],["autimatic","automatic"],["autimatically","automatically"],["autmatically","automatically"],["auto-dependancies","auto-dependencies"],["auto-destrcut","auto-destruct"],["auto-genrated","auto-generated"],["auto-genratet","auto-generated"],["auto-genration","auto-generation"],["auto-negatiotiation","auto-negotiation"],["auto-negatiotiations","auto-negotiations"],["auto-negoatiation","auto-negotiation"],["auto-negoatiations","auto-negotiations"],["auto-negoation","auto-negotiation"],["auto-negoations","auto-negotiations"],["auto-negociation","auto-negotiation"],["auto-negociations","auto-negotiations"],["auto-negogtiation","auto-negotiation"],["auto-negogtiations","auto-negotiations"],["auto-negoitation","auto-negotiation"],["auto-negoitations","auto-negotiations"],["auto-negoptionsotiation","auto-negotiation"],["auto-negoptionsotiations","auto-negotiations"],["auto-negosiation","auto-negotiation"],["auto-negosiations","auto-negotiations"],["auto-negotaiation","auto-negotiation"],["auto-negotaiations","auto-negotiations"],["auto-negotaition","auto-negotiation"],["auto-negotaitions","auto-negotiations"],["auto-negotatiation","auto-negotiation"],["auto-negotatiations","auto-negotiations"],["auto-negotation","auto-negotiation"],["auto-negotations","auto-negotiations"],["auto-negothiation","auto-negotiation"],["auto-negothiations","auto-negotiations"],["auto-negotication","auto-negotiation"],["auto-negotications","auto-negotiations"],["auto-negotioation","auto-negotiation"],["auto-negotioations","auto-negotiations"],["auto-negotion","auto-negotiation"],["auto-negotionation","auto-negotiation"],["auto-negotionations","auto-negotiations"],["auto-negotions","auto-negotiations"],["auto-negotiotation","auto-negotiation"],["auto-negotiotations","auto-negotiations"],["auto-negotitaion","auto-negotiation"],["auto-negotitaions","auto-negotiations"],["auto-negotitation","auto-negotiation"],["auto-negotitations","auto-negotiations"],["auto-negotition","auto-negotiation"],["auto-negotitions","auto-negotiations"],["auto-negoziation","auto-negotiation"],["auto-negoziations","auto-negotiations"],["auto-realease","auto-release"],["auto-realeased","auto-released"],["autochtonous","autochthonous"],["autocmplete","autocomplete"],["autocmpleted","autocompleted"],["autocmpletes","autocompletes"],["autocmpleting","autocompleting"],["autocommiting","autocommitting"],["autoconplete","autocomplete"],["autoconpleted","autocompleted"],["autoconpletes","autocompletes"],["autoconpleting","autocompleting"],["autoconpletion","autocompletion"],["autocoomit","autocommit"],["autoctonous","autochthonous"],["autoeselect","autoselect"],["autofilt","autofilter"],["autofomat","autoformat"],["autoformating","autoformatting"],["autogenrated","autogenerated"],["autogenratet","autogenerated"],["autogenration","autogeneration"],["autogroping","autogrouping"],["autohorized","authorized"],["autoincrememnt","autoincrement"],["autoincrementive","autoincrement"],["automaatically","automatically"],["automagicaly","automagically"],["automaitc","automatic"],["automaitcally","automatically"],["automanifactured","automanufactured"],["automatcally","automatically"],["automatially","automatically"],["automaticallly","automatically"],["automaticaly","automatically"],["automaticalyl","automatically"],["automaticalyy","automatically"],["automaticlly","automatically"],["automaticly","automatically"],["autometic","automatic"],["autometically","automatically"],["automibile","automobile"],["automical","automatic"],["automically","automatically"],["automicaly","automatically"],["automicatilly","automatically"],["automiclly","automatically"],["automicly","automatically"],["automonomous","autonomous"],["automtic","automatic"],["automtically","automatically"],["autonagotiation","autonegotiation"],["autonegatiotiation","autonegotiation"],["autonegatiotiations","autonegotiations"],["autonegoatiation","autonegotiation"],["autonegoatiations","autonegotiations"],["autonegoation","autonegotiation"],["autonegoations","autonegotiations"],["autonegociated","autonegotiated"],["autonegociation","autonegotiation"],["autonegociations","autonegotiations"],["autonegogtiation","autonegotiation"],["autonegogtiations","autonegotiations"],["autonegoitation","autonegotiation"],["autonegoitations","autonegotiations"],["autonegoptionsotiation","autonegotiation"],["autonegoptionsotiations","autonegotiations"],["autonegosiation","autonegotiation"],["autonegosiations","autonegotiations"],["autonegotaiation","autonegotiation"],["autonegotaiations","autonegotiations"],["autonegotaition","autonegotiation"],["autonegotaitions","autonegotiations"],["autonegotatiation","autonegotiation"],["autonegotatiations","autonegotiations"],["autonegotation","autonegotiation"],["autonegotations","autonegotiations"],["autonegothiation","autonegotiation"],["autonegothiations","autonegotiations"],["autonegotication","autonegotiation"],["autonegotications","autonegotiations"],["autonegotioation","autonegotiation"],["autonegotioations","autonegotiations"],["autonegotion","autonegotiation"],["autonegotionation","autonegotiation"],["autonegotionations","autonegotiations"],["autonegotions","autonegotiations"],["autonegotiotation","autonegotiation"],["autonegotiotations","autonegotiations"],["autonegotitaion","autonegotiation"],["autonegotitaions","autonegotiations"],["autonegotitation","autonegotiation"],["autonegotitations","autonegotiations"],["autonegotition","autonegotiation"],["autonegotitions","autonegotiations"],["autonegoziation","autonegotiation"],["autonegoziations","autonegotiations"],["autoneogotiation","autonegotiation"],["autoneotiation","autonegotiation"],["autonogotiation","autonegotiation"],["autonymous","autonomous"],["autoonf","autoconf"],["autopsec","autospec"],["autor","author"],["autorealease","autorelease"],["autorisation","authorisation"],["autoritative","authoritative"],["autority","authority"],["autorization","authorization"],["autoropeat","autorepeat"],["autors","authors"],["autosae","autosave"],["autosavegs","autosaves"],["autosaveperodical","autosaveperiodical"],["autosence","autosense"],["autum","autumn"],["auxialiary","auxiliary"],["auxilaries","auxiliaries"],["auxilary","auxiliary"],["auxileries","auxiliaries"],["auxilery","auxiliary"],["auxiliar","auxiliary"],["auxillaries","auxiliaries"],["auxillary","auxiliary"],["auxilleries","auxiliaries"],["auxillery","auxiliary"],["auxilliaries","auxiliaries"],["auxilliary","auxiliary"],["auxiluary","auxiliary"],["auxliliary","auxiliary"],["avaiable","available"],["avaialable","available"],["avaialbale","available"],["avaialbe","available"],["avaialbel","available"],["avaialbility","availability"],["avaialble","available"],["avaiblable","available"],["avaible","available"],["avaiiability","availability"],["avaiiable","available"],["avaiibility","availability"],["avaiible","available"],["avaiilable","available"],["availaable","available"],["availabable","available"],["availabal","available"],["availabale","available"],["availabality","availability"],["availabble","available"],["availabe","available"],["availabed","available"],["availabel","available"],["availabele","available"],["availabelity","availability"],["availabillity","availability"],["availabilty","availability"],["availabke","available"],["availabl","available"],["availabled","available"],["availablen","available"],["availablity","availability"],["availabyl","available"],["availaiable","available"],["availaibility","availability"],["availaible","available"],["availailability","availability"],["availaility","availability"],["availalable","available"],["availalbe","available"],["availalble","available"],["availale","available"],["availaliable","available"],["availality","availability"],["availanle","available"],["availavble","available"],["availavility","availability"],["availavle","available"],["availbable","available"],["availbale","available"],["availbe","available"],["availble","available"],["availeable","available"],["availebilities","availabilities"],["availebility","availability"],["availeble","available"],["availiable","available"],["availibility","availability"],["availibilty","availability"],["availible","available"],["availlable","available"],["avalable","available"],["avalaible","available"],["avalance","avalanche"],["avaliable","available"],["avalibale","available"],["avalible","available"],["avaloable","available"],["avaluate","evaluate"],["avaluated","evaluated"],["avaluates","evaluates"],["avaluating","evaluating"],["avance","advance"],["avanced","advanced"],["avances","advances"],["avancing","advancing"],["avaoid","avoid"],["avaoidable","avoidable"],["avaoided","avoided"],["avarage","average"],["avarageing","averaging"],["avarege","average"],["avation","aviation"],["avcoid","avoid"],["avcoids","avoids"],["avdisories","advisories"],["avdisoriyes","advisories"],["avdisory","advisory"],["avengence","a vengeance"],["averageed","averaged"],["averagine","averaging"],["averload","overload"],["averloaded","overloaded"],["averloads","overloads"],["avertising","advertising"],["avgerage","average"],["aviable","available"],["avialable","available"],["avilability","availability"],["avilable","available"],["aviod","avoid"],["avioded","avoided"],["avioding","avoiding"],["aviods","avoids"],["avisories","advisories"],["avisoriyes","advisories"],["avisory","advisory"],["avod","avoid"],["avoded","avoided"],["avoding","avoiding"],["avods","avoids"],["avoidence","avoidance"],["avoind","avoid"],["avoinded","avoided"],["avoinding","avoiding"],["avoinds","avoids"],["avriable","variable"],["avriables","variables"],["avriant","variant"],["avriants","variants"],["avtive","active"],["awared","awarded"],["aweful","awful"],["awefully","awfully"],["awkard","awkward"],["awming","awning"],["awmings","awnings"],["awnser","answer"],["awnsered","answered"],["awnsers","answers"],["awoid","avoid"],["awsome","awesome"],["awya","away"],["axises","axes"],["axissymmetric","axisymmetric"],["axix","axis"],["axixsymmetric","axisymmetric"],["axpressed","expressed"],["aysnc","async"],["ayways","always"],["bacause","because"],["baceause","because"],["bacground","background"],["bacic","basic"],["backards","backwards"],["backbround","background"],["backbrounds","backgrounds"],["backedn","backend"],["backedns","backends"],["backgorund","background"],["backgorunds","backgrounds"],["backgound","background"],["backgounds","backgrounds"],["backgournd","background"],["backgournds","backgrounds"],["backgrond","background"],["backgronds","backgrounds"],["backgroound","background"],["backgroounds","backgrounds"],["backgroud","background"],["backgroudn","background"],["backgroudns","backgrounds"],["backgrouds","backgrounds"],["backgroun","background"],["backgroung","background"],["backgroungs","backgrounds"],["backgrouns","backgrounds"],["backgrount","background"],["backgrounts","backgrounds"],["backgrouund","background"],["backgrund","background"],["backgrunds","backgrounds"],["backgruond","background"],["backgruonds","backgrounds"],["backlght","backlight"],["backlghting","backlighting"],["backlghts","backlights"],["backned","backend"],["backneds","backends"],["backound","background"],["backounds","backgrounds"],["backpsace","backspace"],["backrefence","backreference"],["backrgound","background"],["backrgounds","backgrounds"],["backround","background"],["backrounds","backgrounds"],["backsapce","backspace"],["backslase","backslash"],["backslases","backslashes"],["backslashs","backslashes"],["backwad","backwards"],["backwardss","backwards"],["backware","backward"],["backwark","backward"],["backwrad","backward"],["bactracking","backtracking"],["bacup","backup"],["baed","based"],["bage","bag"],["bahaving","behaving"],["bahavior","behavior"],["bahavioral","behavioral"],["bahaviors","behaviors"],["bahaviour","behaviour"],["baisc","basic"],["baised","raised"],["bakc","back"],["bakcrefs","backrefs"],["bakends","backends"],["bakground","background"],["bakgrounds","backgrounds"],["bakup","backup"],["bakups","backups"],["bakward","backward"],["bakwards","backwards"],["balacing","balancing"],["balence","balance"],["baloon","balloon"],["baloons","balloons"],["balse","false"],["banannas","bananas"],["bandwdith","bandwidth"],["bandwdiths","bandwidths"],["bandwidht","bandwidth"],["bandwidthm","bandwidth"],["bandwitdh","bandwidth"],["bandwith","bandwidth"],["bankrupcy","bankruptcy"],["banlance","balance"],["banruptcy","bankruptcy"],["barbedos","barbados"],["bariier","barrier"],["barnch","branch"],["barnched","branched"],["barncher","brancher"],["barnchers","branchers"],["barnches","branches"],["barnching","branching"],["barriors","barriers"],["barrriers","barriers"],["barycentic","barycentric"],["basci","basic"],["bascially","basically"],["bascktrack","backtrack"],["basf","base"],["basicallly","basically"],["basicaly","basically"],["basiclly","basically"],["basicly","basically"],["basline","baseline"],["baslines","baselines"],["bassic","basic"],["bassically","basically"],["bastract","abstract"],["bastracted","abstracted"],["bastracter","abstracter"],["bastracting","abstracting"],["bastraction","abstraction"],["bastractions","abstractions"],["bastractly","abstractly"],["bastractness","abstractness"],["bastractor","abstractor"],["bastracts","abstracts"],["bateries","batteries"],["batery","battery"],["battaries","batteries"],["battary","battery"],["bbefore","before"],["bboolean","boolean"],["bbooleans","booleans"],["bcak","back"],["bcause","because"],["beable","be able"],["beacaon","beacon"],["beacause","because"],["beachead","beachhead"],["beacuse","because"],["beaon","beacon"],["bearword","bareword"],["beastiality","bestiality"],["beatiful","beautiful"],["beauracracy","bureaucracy"],["beaurocracy","bureaucracy"],["beaurocratic","bureaucratic"],["beause","because"],["beauti","beauty"],["beautiy","beauty"],["beautyfied","beautified"],["beautyfull","beautiful"],["beaviour","behaviour"],["bebongs","belongs"],["becaause","because"],["becacdd","because"],["becahse","because"],["becamae","became"],["becaouse","because"],["becase","because"],["becasue","because"],["becasuse","because"],["becauae","because"],["becauce","because"],["becaue","because"],["becaues","because"],["becaus","because"],["becausee","because"],["becauseq","because"],["becauses","because"],["becausw","because"],["beccause","because"],["bechmark","benchmark"],["bechmarked","benchmarked"],["bechmarking","benchmarking"],["bechmarks","benchmarks"],["becoem","become"],["becomeing","becoming"],["becomme","become"],["becommes","becomes"],["becomming","becoming"],["becoms","becomes"],["becouse","because"],["becoz","because"],["bector","vector"],["bectors","vectors"],["becuase","because"],["becuse","because"],["becxause","because"],["bedore","before"],["beeings","beings"],["beetween","between"],["beetwen","between"],["beffer","buffer"],["befoer","before"],["befor","before"],["beforehands","beforehand"],["beforere","before"],["befores","before"],["beforing","before"],["befure","before"],["begginer","beginner"],["begginers","beginners"],["beggingin","beginning"],["begginging","beginning"],["begginig","beginning"],["beggining","beginning"],["begginings","beginnings"],["begginnig","beginning"],["begginning","beginning"],["beggins","begins"],["beghavior","behavior"],["beghaviors","behaviors"],["begiinning","beginning"],["beginer","beginner"],["begines","begins"],["begining","beginning"],["beginining","beginning"],["begininings","beginnings"],["begininng","beginning"],["begininngs","beginnings"],["beginn","begin"],["beginnig","beginning"],["beginnin","beginning"],["beginnning","beginning"],["beginnnings","beginnings"],["behabior","behavior"],["behabiors","behaviors"],["behabiour","behaviour"],["behabiours","behaviours"],["behabviour","behaviour"],["behaivior","behavior"],["behaiviour","behaviour"],["behaiviuor","behaviour"],["behaivor","behavior"],["behaivors","behaviors"],["behaivour","behaviour"],["behaivoural","behavioural"],["behaivours","behaviours"],["behavioutr","behaviour"],["behaviro","behavior"],["behaviuor","behaviour"],["behavoir","behavior"],["behavoirs","behaviors"],["behavour","behaviour"],["behavriour","behaviour"],["behavriours","behaviours"],["behinde","behind"],["behvaiour","behaviour"],["behviour","behaviour"],["beigin","begin"],["beiginning","beginning"],["beind","behind"],["beinning","beginning"],["bejond","beyond"],["beleagured","beleaguered"],["beleif","belief"],["beleifable","believable"],["beleifed","believed"],["beleifing","believing"],["beleivable","believable"],["beleive","believe"],["beleived","believed"],["beleives","believes"],["beleiving","believing"],["beliefable","believable"],["beliefed","believed"],["beliefing","believing"],["beligum","belgium"],["beling","belong"],["belivable","believable"],["belive","believe"],["beliveable","believable"],["beliveably","believably"],["beliveble","believable"],["belivebly","believably"],["beliving","believing"],["belligerant","belligerent"],["bellweather","bellwether"],["belog","belong"],["beloging","belonging"],["belogs","belongs"],["belond","belong"],["beloning","belonging"],["belown","belong"],["belwo","below"],["bemusemnt","bemusement"],["benchamarked","benchmarked"],["benchamarking","benchmarking"],["benchamrk","benchmark"],["benchamrked","benchmarked"],["benchamrking","benchmarking"],["benchamrks","benchmarks"],["benchmkar","benchmark"],["benchmkared","benchmarked"],["benchmkaring","benchmarking"],["benchmkars","benchmarks"],["benchs","benches"],["benckmark","benchmark"],["benckmarked","benchmarked"],["benckmarking","benchmarking"],["benckmarks","benchmarks"],["benechmark","benchmark"],["benechmarked","benchmarked"],["benechmarking","benchmarking"],["benechmarks","benchmarks"],["beneeth","beneath"],["benefical","beneficial"],["beneficary","beneficiary"],["benefied","benefited"],["benefitial","beneficial"],["beneits","benefits"],["benetifs","benefits"],["beng","being"],["benhind","behind"],["benificial","beneficial"],["benifit","benefit"],["benifite","benefit"],["benifited","benefited"],["benifitial","beneficial"],["benifits","benefits"],["benig","being"],["beond","beyond"],["berforming","performing"],["bergamont","bergamot"],["Berkley","Berkeley"],["Bernouilli","Bernoulli"],["berween","between"],["besed","based"],["beseige","besiege"],["beseiged","besieged"],["beseiging","besieging"],["besure","be sure"],["beteeen","between"],["beteen","between"],["beter","better"],["beteween","between"],["betrween","between"],["bettern","better"],["bettween","between"],["betwean","between"],["betwee","between"],["betweed","between"],["betweeen","between"],["betweem","between"],["betweend","between"],["betweeness","betweenness"],["betweent","between"],["betwen","between"],["betwene","between"],["betwenn","between"],["betwern","between"],["betwween","between"],["beucase","because"],["beuracracy","bureaucracy"],["beutification","beautification"],["beutiful","beautiful"],["beutifully","beautifully"],["bever","never"],["bevore","before"],["bevorehand","beforehand"],["bevorhand","beforehand"],["beweeen","between"],["beween","between"],["bewteen","between"],["bewteeness","betweenness"],["beyone","beyond"],["beyong","beyond"],["beyound","beyond"],["bffer","buffer"],["bginning","beginning"],["bi-langual","bi-lingual"],["bianries","binaries"],["bianry","binary"],["biappicative","biapplicative"],["biddings","bidding"],["bidimentionnal","bidimensional"],["bidning","binding"],["bidnings","bindings"],["bigallic","bigalloc"],["bigining","beginning"],["biginning","beginning"],["biinary","binary"],["bilangual","bilingual"],["bilateraly","bilaterally"],["billingualism","bilingualism"],["billon","billion"],["bimask","bitmask"],["bimillenia","bimillennia"],["bimillenial","bimillennial"],["bimillenium","bimillennium"],["bimontly","bimonthly"],["binairy","binary"],["binanary","binary"],["binar","binary"],["binay","binary"],["bindins","bindings"],["binidng","binding"],["binominal","binomial"],["binraries","binaries"],["binrary","binary"],["bion","bio"],["birght","bright"],["birghten","brighten"],["birghter","brighter"],["birghtest","brightest"],["birghtness","brightness"],["biridectionality","bidirectionality"],["bisct","bisect"],["bisines","business"],["bisiness","business"],["bisnes","business"],["bisness","business"],["bistream","bitstream"],["bisunes","business"],["bisuness","business"],["bitamps","bitmaps"],["bitap","bitmap"],["bitfileld","bitfield"],["bitfilelds","bitfields"],["bitis","bits"],["bitmast","bitmask"],["bitnaps","bitmaps"],["bitwise-orring","bitwise-oring"],["bizare","bizarre"],["bizarely","bizarrely"],["bizzare","bizarre"],["bject","object"],["bjects","objects"],["blackslashes","backslashes"],["blaclist","blacklist"],["blaim","blame"],["blaimed","blamed"],["blanace","balance"],["blancked","blanked"],["blatent","blatant"],["blatently","blatantly"],["blbos","blobs"],["blcok","block"],["blcoks","blocks"],["bleading","bleeding"],["blessd","blessed"],["blessure","blessing"],["bletooth","bluetooth"],["bleutooth","bluetooth"],["blindy","blindly"],["Blitzkreig","Blitzkrieg"],["bload","bloat"],["bloaded","bloated"],["blocack","blockack"],["bloccks","blocks"],["blocekd","blocked"],["blockhain","blockchain"],["blockhains","blockchains"],["blockin","blocking"],["blockse","blocks"],["bloddy","bloody"],["blodk","block"],["bloek","bloke"],["bloekes","blokes"],["bloeks","blokes"],["bloekss","blokes"],["blohted","bloated"],["blokcer","blocker"],["blokchain","blockchain"],["blokchains","blockchains"],["blokcing","blocking"],["bloked","blocked"],["bloker","blocker"],["bloking","blocking"],["blong","belong"],["blonged","belonged"],["blonging","belonging"],["blongs","belongs"],["bloock","block"],["bloocks","blocks"],["bloted","bloated"],["bluestooth","bluetooth"],["bluetooh","bluetooth"],["bluetoot","bluetooth"],["bluetootn","bluetooth"],["blured","blurred"],["blutooth","bluetooth"],["bnecause","because"],["boads","boards"],["boardcast","broadcast"],["bocome","become"],["boddy","body"],["bodiese","bodies"],["bodydbuilder","bodybuilder"],["boelean","boolean"],["boeleans","booleans"],["boffer","buffer"],["bofore","before"],["bofy","body"],["boggus","bogus"],["bogos","bogus"],["bointer","pointer"],["bolean","boolean"],["boleen","boolean"],["bolor","color"],["bombardement","bombardment"],["bombarment","bombardment"],["bondary","boundary"],["Bonnano","Bonanno"],["bood","boot"],["bookeeping","bookkeeping"],["bookkeeing","bookkeeping"],["bookkeeiping","bookkeeping"],["bookkepp","bookkeep"],["bookmakr","bookmark"],["bookmar","bookmark"],["booleam","boolean"],["booleamn","boolean"],["booleamns","booleans"],["booleams","booleans"],["booleanss","booleans"],["booleen","boolean"],["booleens","booleans"],["boolen","boolean"],["boolens","booleans"],["booltloader","bootloader"],["booltloaders","bootloaders"],["boomark","bookmark"],["boomarks","bookmarks"],["boook","book"],["booolean","boolean"],["boooleans","booleans"],["booshelf","bookshelf"],["booshelves","bookshelves"],["boostrap","bootstrap"],["boostrapped","bootstrapped"],["boostrapping","bootstrapping"],["boostraps","bootstraps"],["booteek","boutique"],["bootlaoder","bootloader"],["bootlaoders","bootloaders"],["bootoloader","bootloader"],["bootom","bottom"],["bootraping","bootstrapping"],["bootsram","bootram"],["bootsrap","bootstrap"],["bootstap","bootstrap"],["bootstapped","bootstrapped"],["bootstapping","bootstrapping"],["bootstaps","bootstraps"],["booundaries","boundaries"],["booundary","boundary"],["boquet","bouquet"],["borad","board"],["boradcast","broadcast"],["bording","boarding"],["bordreline","borderline"],["bordrelines","borderlines"],["borgwasy","bourgeoisie"],["borke","broke"],["borken","broken"],["borow","borrow"],["borwser","browsers"],["borwsers","browsers"],["bothe","both"],["boths","both"],["botifies","notifies"],["bottem","bottom"],["bottlenck","bottleneck"],["bottlencks","bottlenecks"],["bottlenect","bottleneck"],["bottlenects","bottlenecks"],["bottlneck","bottleneck"],["bottlnecks","bottlenecks"],["bottomborde","bottomborder"],["bottome","bottom"],["bottomn","bottom"],["bottonm","bottom"],["botttom","bottom"],["bouce","bounce"],["bouces","bounces"],["boudaries","boundaries"],["boudary","boundary"],["bouding","bounding"],["boudnaries","boundaries"],["boudnary","boundary"],["bouds","bounds"],["bouind","bound"],["bouinded","bounded"],["bouinding","bounding"],["bouinds","bounds"],["boun","bound"],["bounaaries","boundaries"],["bounaary","boundary"],["bounad","bound"],["bounadaries","boundaries"],["bounadary","boundary"],["bounaded","bounded"],["bounading","bounding"],["bounadries","boundaries"],["bounadry","boundary"],["bounads","bounds"],["bounardies","boundaries"],["bounardy","boundary"],["bounaries","boundaries"],["bounary","boundary"],["bounbdaries","boundaries"],["bounbdary","boundary"],["boundares","boundaries"],["boundaryi","boundary"],["boundarys","boundaries"],["bounday","boundary"],["boundays","boundaries"],["bounderies","boundaries"],["boundery","boundary"],["boundig","bounding"],["boundimg","bounding"],["boundin","bounding"],["boundrary","boundary"],["boundries","boundaries"],["boundry","boundary"],["bounduaries","boundaries"],["bouned","bounded"],["boungaries","boundaries"],["boungary","boundary"],["boungin","bounding"],["boungind","bounding"],["bounhdaries","boundaries"],["bounhdary","boundary"],["bounidng","bounding"],["bouning","bounding"],["bounnd","bound"],["bounndaries","boundaries"],["bounndary","boundary"],["bounnded","bounded"],["bounnding","bounding"],["bounnds","bounds"],["bounradies","boundaries"],["bounrady","boundary"],["bounraies","boundaries"],["bounraries","boundaries"],["bounrary","boundary"],["bounray","boundary"],["bouns","bounds"],["bounsaries","boundaries"],["bounsary","boundary"],["bounsd","bounds"],["bount","bound"],["bountries","boundaries"],["bountry","boundary"],["bounudaries","boundaries"],["bounudary","boundary"],["bounus","bonus"],["bouqet","bouquet"],["bouund","bound"],["bouunded","bounded"],["bouunding","bounding"],["bouunds","bounds"],["bouy","buoy"],["bouyancy","buoyancy"],["bouyant","buoyant"],["boyant","buoyant"],["boycot","boycott"],["bracese","braces"],["brach","branch"],["brackeds","brackets"],["bracketwith","bracket with"],["brackground","background"],["bradcast","broadcast"],["brakpoint","breakpoint"],["brakpoints","breakpoints"],["branchces","branches"],["brancheswith","branches with"],["branchs","branches"],["branchsi","branches"],["branck","branch"],["branckes","branches"],["brancket","bracket"],["branckets","brackets"],["brane","brain"],["braodcast","broadcast"],["braodcasted","broadcasted"],["braodcasts","broadcasts"],["Brasillian","Brazilian"],["brazeer","brassiere"],["brazillian","Brazilian"],["breakes","breaks"],["breakthough","breakthrough"],["breakthroughts","breakthroughs"],["breakthruogh","breakthrough"],["breakthruoghs","breakthroughs"],["breal","break"],["breefly","briefly"],["brefore","before"],["breif","brief"],["breifly","briefly"],["brekpoint","breakpoint"],["brekpoints","breakpoints"],["breshed","brushed"],["breshes","brushes"],["breshing","brushing"],["brethen","brethren"],["bretheren","brethren"],["brfore","before"],["bridg","bridge"],["brievely","briefly"],["brievety","brevity"],["brigde","bridge"],["brige","bridge"],["briges","bridges"],["brighness","brightness"],["brightnesss","brightness"],["brigth","bright"],["brigthnes","brightness"],["brigthness","brightness"],["briliant","brilliant"],["brilinear","bilinear"],["brillant","brilliant"],["brimestone","brimstone"],["bringin","bringing"],["bringtofont","bringtofront"],["brite","bright"],["briten","brighten"],["britened","brightened"],["britener","brightener"],["briteners","brighteners"],["britenes","brightenes"],["britening","brightening"],["briter","brighter"],["Britian","Britain"],["Brittish","British"],["brnach","branch"],["brnaches","branches"],["broacast","broadcast"],["broacasted","broadcast"],["broacasting","broadcasting"],["broacasts","broadcasts"],["broadacasting","broadcasting"],["broadcas","broadcast"],["broadcase","broadcast"],["broadcasti","broadcast"],["broadcat","broadcast"],["broady","broadly"],["broardcast","broadcast"],["broblematic","problematic"],["brocher","brochure"],["brocken","broken"],["brockend","broken"],["brockened","broken"],["brocolee","broccoli"],["brodcast","broadcast"],["broked","broken"],["brokem","broken"],["brokend","broken"],["brokened","broken"],["brokeness","brokenness"],["bronken","broken"],["brosable","browsable"],["broser","browser"],["brosers","browsers"],["brosing","browsing"],["broswable","browsable"],["broswe","browse"],["broswed","browsed"],["broswer","browser"],["broswers","browsers"],["broswing","browsing"],["brower","browser"],["browers","browsers"],["browing","browsing"],["browseable","browsable"],["browswable","browsable"],["browswe","browse"],["browswed","browsed"],["browswer","browser"],["browswers","browsers"],["browswing","browsing"],["brutaly","brutally"],["brwosable","browsable"],["brwose","browse"],["brwosed","browsed"],["brwoser","browser"],["brwosers","browsers"],["brwosing","browsing"],["btye","byte"],["btyes","bytes"],["buad","baud"],["bubbless","bubbles"],["Buddah","Buddha"],["Buddist","Buddhist"],["bufefr","buffer"],["bufer","buffer"],["bufers","buffers"],["buffereed","buffered"],["bufferent","buffered"],["bufferes","buffers"],["bufferred","buffered"],["buffeur","buffer"],["bufffer","buffer"],["bufffers","buffers"],["buffor","buffer"],["buffors","buffers"],["buffr","buffer"],["buffred","buffered"],["buffring","buffering"],["bufufer","buffer"],["buggest","biggest"],["bugous","bogus"],["buguous","bogus"],["bugus","bogus"],["buid","build"],["buider","builder"],["buiders","builders"],["buiding","building"],["buidl","build"],["buidling","building"],["buidlings","buildings"],["buidls","builds"],["buiild","build"],["buik","bulk"],["build-dependancies","build-dependencies"],["build-dependancy","build-dependency"],["build-in","built-in"],["builded","built"],["buildpackge","buildpackage"],["buildpackges","buildpackages"],["builing","building"],["builings","buildings"],["buillt","built"],["built-time","build-time"],["builter","builder"],["builters","builders"],["buinseses","businesses"],["buinsess","business"],["buinsesses","businesses"],["buipd","build"],["buisness","business"],["buisnessman","businessman"],["buissiness","business"],["buissinesses","businesses"],["buit","built"],["buitin","builtin"],["buitins","builtins"],["buitlin","builtin"],["buitlins","builtins"],["buitton","button"],["buittons","buttons"],["buld","build"],["bulding","building"],["bulds","builds"],["bulid","build"],["buliding","building"],["bulids","builds"],["bulit","built"],["bulitin","built-in"],["bulle","bullet"],["bulletted","bulleted"],["bulnerabilities","vulnerabilities"],["bulnerability","vulnerability"],["bulnerable","vulnerable"],["bult","built"],["bult-in","built-in"],["bultin","builtin"],["bumby","bumpy"],["bumpded","bumped"],["bumpt","bump"],["bumpted","bumped"],["bumpter","bumper"],["bumpting","bumping"],["bundel","bundle"],["bundeled","bundled"],["bundels","bundles"],["buoancy","buoyancy"],["bureauracy","bureaucracy"],["burocratic","bureaucratic"],["burried","buried"],["burtst","burst"],["busines","business"],["busness","business"],["bussiness","business"],["bussy","busy"],["buton","button"],["butons","buttons"],["butterly","butterfly"],["buttong","button"],["buttonn","button"],["buttonns","buttons"],["buttosn","buttons"],["buttton","button"],["butttons","buttons"],["buufers","buffers"],["buuild","build"],["buuilds","builds"],["bve","be"],["bwtween","between"],["bypas","bypass"],["bypased","bypassed"],["bypasing","bypassing"],["bytetream","bytestream"],["bytetreams","bytestreams"],["cabint","cabinet"],["cabints","cabinets"],["cacahe","cache"],["cacahes","caches"],["cace","cache"],["cachable","cacheable"],["cacheed","cached"],["cacheing","caching"],["cachline","cacheline"],["cacl","calc"],["caclate","calculate"],["cacluate","calculate"],["cacluated","calculated"],["cacluater","calculator"],["cacluates","calculates"],["cacluating","calculating"],["cacluation","calculation"],["cacluations","calculations"],["cacluator","calculator"],["caclucate","calculate"],["caclucation","calculation"],["caclucations","calculations"],["caclucator","calculator"],["caclulate","calculate"],["caclulated","calculated"],["caclulates","calculates"],["caclulating","calculating"],["caclulation","calculation"],["caclulations","calculations"],["caculate","calculate"],["caculated","calculated"],["caculater","calculator"],["caculates","calculates"],["caculating","calculating"],["caculation","calculation"],["caculations","calculations"],["caculator","calculator"],["cacuses","caucuses"],["cadidate","candidate"],["caefully","carefully"],["Caesarian","Caesarean"],["cahacter","character"],["cahacters","characters"],["cahange","change"],["cahanged","changed"],["cahanges","changes"],["cahanging","changing"],["cahannel","channel"],["caharacter","character"],["caharacters","characters"],["caharcter","character"],["caharcters","characters"],["cahc","cache"],["cahce","cache"],["cahced","cached"],["cahces","caches"],["cahche","cache"],["cahchedb","cachedb"],["cahches","caches"],["cahcing","caching"],["cahcs","caches"],["cahdidate","candidate"],["cahdidates","candidates"],["cahe","cache"],["cahes","caches"],["cahgne","change"],["cahgned","changed"],["cahgner","changer"],["cahgners","changers"],["cahgnes","changes"],["cahgning","changing"],["cahhel","channel"],["cahhels","channels"],["cahined","chained"],["cahing","caching"],["cahining","chaining"],["cahnge","change"],["cahnged","changed"],["cahnges","changes"],["cahnging","changing"],["cahnnel","channel"],["cahnnels","channels"],["cahr","char"],["cahracter","character"],["cahracters","characters"],["cahrging","charging"],["cahrs","chars"],["calaber","caliber"],["calalog","catalog"],["calback","callback"],["calbirate","calibrate"],["calbirated","calibrated"],["calbirates","calibrates"],["calbirating","calibrating"],["calbiration","calibration"],["calbirations","calibrations"],["calbirator","calibrator"],["calbirators","calibrators"],["calcable","calculable"],["calcalate","calculate"],["calciulate","calculate"],["calciulating","calculating"],["calclation","calculation"],["calcluate","calculate"],["calcluated","calculated"],["calcluates","calculates"],["calclulate","calculate"],["calclulated","calculated"],["calclulates","calculates"],["calclulating","calculating"],["calclulation","calculation"],["calclulations","calculations"],["calcualate","calculate"],["calcualated","calculated"],["calcualates","calculates"],["calcualating","calculating"],["calcualation","calculation"],["calcualations","calculations"],["calcualte","calculate"],["calcualted","calculated"],["calcualter","calculator"],["calcualtes","calculates"],["calcualting","calculating"],["calcualtion","calculation"],["calcualtions","calculations"],["calcualtor","calculator"],["calcuate","calculate"],["calcuated","calculated"],["calcuates","calculates"],["calcuation","calculation"],["calcuations","calculations"],["calculaion","calculation"],["calculataed","calculated"],["calculater","calculator"],["calculatted","calculated"],["calculatter","calculator"],["calculattion","calculation"],["calculattions","calculations"],["calculaution","calculation"],["calculautions","calculations"],["calculcate","calculate"],["calculcation","calculation"],["calculed","calculated"],["calculs","calculus"],["calcultate","calculate"],["calcultated","calculated"],["calcultater","calculator"],["calcultating","calculating"],["calcultator","calculator"],["calculting","calculating"],["calculuations","calculations"],["calcurate","calculate"],["calcurated","calculated"],["calcurates","calculates"],["calcurating","calculating"],["calcutate","calculate"],["calcutated","calculated"],["calcutates","calculates"],["calcutating","calculating"],["caleed","called"],["caleee","callee"],["calees","callees"],["caler","caller"],["calescing","coalescing"],["caliased","aliased"],["calibraiton","calibration"],["calibraitons","calibrations"],["calibrte","calibrate"],["calibrtion","calibration"],["caligraphy","calligraphy"],["calilng","calling"],["caliming","claiming"],["callabck","callback"],["callabcks","callbacks"],["callack","callback"],["callbacl","callback"],["callbacsk","callback"],["callbak","callback"],["callbakc","callback"],["callbakcs","callbacks"],["callbck","callback"],["callcack","callback"],["callcain","callchain"],["calld","called"],["calle","called"],["callef","called"],["callibrate","calibrate"],["callibrated","calibrated"],["callibrates","calibrates"],["callibrating","calibrating"],["callibration","calibration"],["callibrations","calibrations"],["callibri","calibri"],["callig","calling"],["callint","calling"],["callled","called"],["calllee","callee"],["calloed","called"],["callsr","calls"],["calsses","classes"],["calucalte","calculate"],["calucalted","calculated"],["calucaltes","calculates"],["calucalting","calculating"],["calucaltion","calculation"],["calucaltions","calculations"],["calucate","calculate"],["caluclate","calculate"],["caluclated","calculated"],["caluclater","calculator"],["caluclates","calculates"],["caluclating","calculating"],["caluclation","calculation"],["caluclations","calculations"],["caluclator","calculator"],["caluculate","calculate"],["caluculated","calculated"],["caluculates","calculates"],["caluculating","calculating"],["caluculation","calculation"],["caluculations","calculations"],["calue","value"],["calulate","calculate"],["calulated","calculated"],["calulater","calculator"],["calulates","calculates"],["calulating","calculating"],["calulation","calculation"],["calulations","calculations"],["Cambrige","Cambridge"],["camoflage","camouflage"],["camoflague","camouflage"],["campagin","campaign"],["campain","campaign"],["campaing","campaign"],["campains","campaigns"],["camparing","comparing"],["can;t","can't"],["canadan","canadian"],["canbe","can be"],["cancelaltion","cancellation"],["cancelation","cancellation"],["cancelations","cancellations"],["canceles","cancels"],["cancell","cancel"],["cancelles","cancels"],["cances","cancel"],["cancl","cancel"],["cancle","cancel"],["cancled","canceled"],["candadate","candidate"],["candadates","candidates"],["candiate","candidate"],["candiates","candidates"],["candidat","candidate"],["candidats","candidates"],["candidiate","candidate"],["candidiates","candidates"],["candinate","candidate"],["candinates","candidates"],["canditate","candidate"],["canditates","candidates"],["cange","change"],["canged","changed"],["canges","changes"],["canging","changing"],["canidate","candidate"],["canidates","candidates"],["cann't","can't"],["cann","can"],["cannister","canister"],["cannisters","canisters"],["cannnot","cannot"],["cannobt","cannot"],["cannonical","canonical"],["cannonicalize","canonicalize"],["cannont","cannot"],["cannotation","connotation"],["cannotations","connotations"],["cannott","cannot"],["canonalize","canonicalize"],["canonalized","canonicalized"],["canonalizes","canonicalizes"],["canonalizing","canonicalizing"],["canoncial","canonical"],["canonicalizations","canonicalization"],["canonival","canonical"],["canot","cannot"],["cant'","can't"],["cant't","can't"],["cant;","can't"],["cantact","contact"],["cantacted","contacted"],["cantacting","contacting"],["cantacts","contacts"],["canvase","canvas"],["caost","coast"],["capabable","capable"],["capabicity","capability"],["capabiities","capabilities"],["capabiity","capability"],["capabilies","capabilities"],["capabiliites","capabilities"],["capabilites","capabilities"],["capabilitieis","capabilities"],["capabilitiies","capabilities"],["capabilitires","capabilities"],["capabilitiy","capability"],["capabillity","capability"],["capabilties","capabilities"],["capabiltity","capability"],["capabilty","capability"],["capabitilies","capabilities"],["capablilities","capabilities"],["capablities","capabilities"],["capablity","capability"],["capaciy","capacity"],["capalize","capitalize"],["capalized","capitalized"],["capapbilities","capabilities"],["capatibilities","capabilities"],["capbability","capability"],["capbale","capable"],["capela","capella"],["caperbility","capability"],["Capetown","Cape Town"],["capibilities","capabilities"],["capible","capable"],["capitolize","capitalize"],["cappable","capable"],["captable","capable"],["captial","capital"],["captrure","capture"],["captued","captured"],["capturd","captured"],["caputre","capture"],["caputred","captured"],["caputres","captures"],["caputure","capture"],["carachter","character"],["caracter","character"],["caractere","character"],["caracteristic","characteristic"],["caracterized","characterized"],["caracters","characters"],["carbus","cardbus"],["carefuly","carefully"],["careing","caring"],["carfull","careful"],["cariage","carriage"],["caridge","carriage"],["cariier","carrier"],["carismatic","charismatic"],["Carmalite","Carmelite"],["Carnagie","Carnegie"],["Carnagie-Mellon","Carnegie-Mellon"],["Carnigie","Carnegie"],["Carnigie-Mellon","Carnegie-Mellon"],["carniverous","carnivorous"],["caronavirus","coronavirus"],["caronaviruses","coronaviruses"],["carreer","career"],["carreid","carried"],["carrers","careers"],["carret","caret"],["carriadge","carriage"],["Carribbean","Caribbean"],["Carribean","Caribbean"],["carrien","carrier"],["carrige","carriage"],["carrrier","carrier"],["carryintg","carrying"],["carryng","carrying"],["cartain","certain"],["cartdridge","cartridge"],["cartensian","Cartesian"],["Carthagian","Carthaginian"],["carthesian","cartesian"],["carthographer","cartographer"],["cartiesian","cartesian"],["cartilege","cartilage"],["cartilidge","cartilage"],["cartrige","cartridge"],["caryy","carry"],["cascace","cascade"],["case-insensative","case-insensitive"],["case-insensetive","case-insensitive"],["case-insensistive","case-insensitive"],["case-insensitiv","case-insensitive"],["case-insensitivy","case-insensitivity"],["case-insensitve","case-insensitive"],["case-insenstive","case-insensitive"],["case-insentive","case-insensitive"],["case-insentivite","case-insensitive"],["case-insesitive","case-insensitive"],["case-intensitive","case-insensitive"],["case-sensative","case-sensitive"],["case-sensetive","case-sensitive"],["case-sensistive","case-sensitive"],["case-sensitiv","case-sensitive"],["case-sensitve","case-sensitive"],["case-senstive","case-sensitive"],["case-sentive","case-sensitive"],["case-sentivite","case-sensitive"],["case-sesitive","case-sensitive"],["case-unsensitive","case-insensitive"],["caseinsensative","case-insensitive"],["caseinsensetive","case-insensitive"],["caseinsensistive","case-insensitive"],["caseinsensitiv","case-insensitive"],["caseinsensitve","case-insensitive"],["caseinsenstive","case-insensitive"],["caseinsentive","case-insensitive"],["caseinsentivite","case-insensitive"],["caseinsesitive","case-insensitive"],["caseintensitive","case-insensitive"],["caselessely","caselessly"],["casesensative","case-sensitive"],["casesensetive","casesensitive"],["casesensistive","case-sensitive"],["casesensitiv","case-sensitive"],["casesensitve","case-sensitive"],["casesenstive","case-sensitive"],["casesentive","case-sensitive"],["casesentivite","case-sensitive"],["casesesitive","case-sensitive"],["casette","cassette"],["cashe","cache"],["casion","caisson"],["caspule","capsule"],["caspules","capsules"],["cassawory","cassowary"],["cassowarry","cassowary"],["casue","cause"],["casued","caused"],["casues","causes"],["casuing","causing"],["casulaties","casualties"],["casulaty","casualty"],["cataalogue","catalogue"],["catagori","category"],["catagories","categories"],["catagorization","categorization"],["catagorizations","categorizations"],["catagorized","categorized"],["catagory","category"],["catapillar","caterpillar"],["catapillars","caterpillars"],["catapiller","caterpillar"],["catapillers","caterpillars"],["catastronphic","catastrophic"],["catastropic","catastrophic"],["catastropically","catastrophically"],["catastrphic","catastrophic"],["catche","catch"],["catched","caught"],["catchi","catch"],["catchs","catches"],["categogical","categorical"],["categogically","categorically"],["categogies","categories"],["categogy","category"],["cateogrical","categorical"],["cateogrically","categorically"],["cateogries","categories"],["cateogry","category"],["catepillar","caterpillar"],["catepillars","caterpillars"],["catergorize","categorize"],["catergorized","categorized"],["caterpilar","caterpillar"],["caterpilars","caterpillars"],["caterpiller","caterpillar"],["caterpillers","caterpillars"],["catgorical","categorical"],["catgorically","categorically"],["catgories","categories"],["catgory","category"],["cathlic","catholic"],["catholocism","catholicism"],["catloag","catalog"],["catloaged","cataloged"],["catloags","catalogs"],["catory","factory"],["catpture","capture"],["catpure","capture"],["catpured","captured"],["catpures","captures"],["catterpilar","caterpillar"],["catterpilars","caterpillars"],["catterpillar","caterpillar"],["catterpillars","caterpillars"],["cattleship","battleship"],["caucasion","caucasian"],["cauched","caught"],["caugt","caught"],["cauhgt","caught"],["cauing","causing"],["causees","causes"],["causion","caution"],["causioned","cautioned"],["causions","cautions"],["causious","cautious"],["cavaet","caveat"],["cavaets","caveats"],["ccahe","cache"],["ccale","scale"],["ccertificate","certificate"],["ccertificated","certificated"],["ccertificates","certificates"],["ccertification","certification"],["ccessible","accessible"],["cche","cache"],["cconfiguration","configuration"],["ccordinate","coordinate"],["ccordinates","coordinates"],["ccordinats","coordinates"],["ccoutant","accountant"],["ccpcheck","cppcheck"],["ccurred","occurred"],["ccustom","custom"],["ccustoms","customs"],["cdecompress","decompress"],["ceartype","cleartype"],["Ceasar","Caesar"],["ceate","create"],["ceated","created"],["ceates","creates"],["ceating","creating"],["ceation","creation"],["ceck","check"],["cecked","checked"],["cecker","checker"],["cecking","checking"],["cecks","checks"],["cedential","credential"],["cedentials","credentials"],["cehck","check"],["cehcked","checked"],["cehcker","checker"],["cehcking","checking"],["cehcks","checks"],["Celcius","Celsius"],["celles","cells"],["cellpading","cellpadding"],["cellst","cells"],["cellxs","cells"],["celsuis","celsius"],["cementary","cemetery"],["cemetarey","cemetery"],["cemetaries","cemeteries"],["cemetary","cemetery"],["cenario","scenario"],["cenarios","scenarios"],["cencter","center"],["cencus","census"],["cengter","center"],["censequence","consequence"],["centain","certain"],["cententenial","centennial"],["centerd","centered"],["centisencond","centisecond"],["centisenconds","centiseconds"],["centrifugeable","centrifugable"],["centrigrade","centigrade"],["centriod","centroid"],["centriods","centroids"],["centruies","centuries"],["centruy","century"],["centuties","centuries"],["centuty","century"],["cerain","certain"],["cerainly","certainly"],["cerainty","certainty"],["cerate","create"],["cereates","creates"],["cerimonial","ceremonial"],["cerimonies","ceremonies"],["cerimonious","ceremonious"],["cerimony","ceremony"],["ceromony","ceremony"],["certaily","certainly"],["certaincy","certainty"],["certainity","certainty"],["certaint","certain"],["certaion","certain"],["certan","certain"],["certficate","certificate"],["certficated","certificated"],["certficates","certificates"],["certfication","certification"],["certfications","certifications"],["certficiate","certificate"],["certficiated","certificated"],["certficiates","certificates"],["certficiation","certification"],["certficiations","certifications"],["certfied","certified"],["certfy","certify"],["certian","certain"],["certianly","certainly"],["certicate","certificate"],["certicated","certificated"],["certicates","certificates"],["certication","certification"],["certicicate","certificate"],["certifacte","certificate"],["certifacted","certificated"],["certifactes","certificates"],["certifaction","certification"],["certifcate","certificate"],["certifcated","certificated"],["certifcates","certificates"],["certifcation","certification"],["certifciate","certificate"],["certifciated","certificated"],["certifciates","certificates"],["certifciation","certification"],["certifiate","certificate"],["certifiated","certificated"],["certifiates","certificates"],["certifiating","certificating"],["certifiation","certification"],["certifiations","certifications"],["certificat","certificate"],["certificatd","certificated"],["certificaton","certification"],["certificats","certificates"],["certifice","certificate"],["certificed","certificated"],["certifices","certificates"],["certificion","certification"],["certificste","certificate"],["certificsted","certificated"],["certificstes","certificates"],["certificsting","certificating"],["certificstion","certification"],["certifificate","certificate"],["certifificated","certificated"],["certifificates","certificates"],["certifification","certification"],["certiticate","certificate"],["certiticated","certificated"],["certiticates","certificates"],["certitication","certification"],["cetain","certain"],["cetainly","certainly"],["cetainty","certainty"],["cetrainly","certainly"],["cetting","setting"],["Cgywin","Cygwin"],["chaarges","charges"],["chacacter","character"],["chacacters","characters"],["chache","cache"],["chached","cached"],["chacheline","cacheline"],["chaeck","check"],["chaecked","checked"],["chaecker","checker"],["chaecking","checking"],["chaecks","checks"],["chagne","change"],["chagned","changed"],["chagnes","changes"],["chahged","changed"],["chahging","changing"],["chaied","chained"],["chaing","chain"],["chalenging","challenging"],["challanage","challenge"],["challange","challenge"],["challanged","challenged"],["challanges","challenges"],["challege","challenge"],["chambre","chamber"],["chambres","chambers"],["Champange","Champagne"],["chanage","change"],["chanaged","changed"],["chanager","changer"],["chanages","changes"],["chanaging","changing"],["chanceled","canceled"],["chanceling","canceling"],["chanched","changed"],["chaneged","changed"],["chaneging","changing"],["chanel","channel"],["chanell","channel"],["chanels","channels"],["changable","changeable"],["changeble","changeable"],["changeing","changing"],["changge","change"],["changged","changed"],["changgeling","changeling"],["changges","changes"],["changlog","changelog"],["changuing","changing"],["chanined","chained"],["chaninging","changing"],["chanllenge","challenge"],["chanllenging","challenging"],["channael","channel"],["channe","channel"],["channeles","channels"],["channl","channel"],["channle","channel"],["channles","channels"],["channnel","channel"],["channnels","channels"],["chanses","chances"],["chaper","chapter"],["characaters","characters"],["characer","character"],["characers","characters"],["characeter","character"],["characeters","characters"],["characetrs","characters"],["characher","character"],["charachers","characters"],["charachter","character"],["charachters","characters"],["characstyle","charstyle"],["charactar","character"],["charactaristic","characteristic"],["charactaristics","characteristics"],["charactars","characters"],["characte","character"],["charactear","character"],["charactears","characters"],["characted","character"],["characteds","characters"],["characteer","character"],["characteers","characters"],["characteisation","characterisation"],["characteization","characterization"],["characteor","character"],["characteors","characters"],["characterclasses","character classes"],["characteres","characters"],["characterisic","characteristic"],["characterisically","characteristically"],["characterisicly","characteristically"],["characterisics","characteristics"],["characterisitic","characteristic"],["characterisitics","characteristics"],["characteristicly","characteristically"],["characteritic","characteristic"],["characteritics","characteristics"],["characteritisc","characteristic"],["characteritiscs","characteristics"],["charactersistic","characteristic"],["charactersistically","characteristically"],["charactersistics","characteristics"],["charactersitic","characteristic"],["charactersm","characters"],["characterss","characters"],["characterstic","characteristic"],["characterstically","characteristically"],["characterstics","characteristics"],["charactertistic","characteristic"],["charactertistically","characteristically"],["charactertistics","characteristics"],["charactes","characters"],["charactet","character"],["characteter","character"],["characteteristic","characteristic"],["characteteristics","characteristics"],["characteters","characters"],["charactetistic","characteristic"],["charactetistics","characteristics"],["charactetr","character"],["charactetrs","characters"],["charactets","characters"],["characther","character"],["charactiristic","characteristic"],["charactiristically","characteristically"],["charactiristics","characteristics"],["charactor","character"],["charactors","characters"],["charactristic","characteristic"],["charactristically","characteristically"],["charactristics","characteristics"],["charactrs","characters"],["characts","characters"],["characture","character"],["charakter","character"],["charakters","characters"],["chararacter","character"],["chararacters","characters"],["chararcter","character"],["chararcters","characters"],["charas","chars"],["charascter","character"],["charascters","characters"],["charasmatic","charismatic"],["charater","character"],["charaterize","characterize"],["charaterized","characterized"],["charaters","characters"],["charator","character"],["charators","characters"],["charcater","character"],["charcter","character"],["charcteristic","characteristic"],["charcteristics","characteristics"],["charcters","characters"],["charctor","character"],["charctors","characters"],["charecter","character"],["charecters","characters"],["charector","character"],["chargind","charging"],["charicter","character"],["charicters","characters"],["charictor","character"],["charictors","characters"],["chariman","chairman"],["charistics","characteristics"],["charizma","charisma"],["chartroose","chartreuse"],["chassy","chassis"],["chatacter","character"],["chatacters","characters"],["chatch","catch"],["chater","chapter"],["chawk","chalk"],["chcek","check"],["chceked","checked"],["chceking","checking"],["chceks","checks"],["chck","check"],["chckbox","checkbox"],["cheapeast","cheapest"],["cheatta","cheetah"],["chec","check"],["checbox","checkbox"],["checboxes","checkboxes"],["checg","check"],["checged","checked"],["checheckpoit","checkpoint"],["checheckpoits","checkpoints"],["cheched","checked"],["cheching","checking"],["chechk","check"],["chechs","checks"],["checkalaises","checkaliases"],["checkcsum","checksum"],["checkd","checked"],["checkes","checks"],["checket","checked"],["checkk","check"],["checkng","checking"],["checkoslovakia","czechoslovakia"],["checkox","checkbox"],["checkpoing","checkpoint"],["checkstum","checksum"],["checkstuming","checksumming"],["checkstumming","checksumming"],["checkstums","checksums"],["checksume","checksum"],["checksumed","checksummed"],["checksuming","checksumming"],["checkt","checked"],["checkum","checksum"],["checkums","checksums"],["checkuot","checkout"],["checl","check"],["checled","checked"],["checling","checking"],["checls","checks"],["cheduling","scheduling"],["cheeper","cheaper"],["cheeta","cheetah"],["cheif","chief"],["cheifs","chiefs"],["chek","check"],["chekc","check"],["chekcing","checking"],["chekd","checked"],["cheked","checked"],["chekers","checkers"],["cheking","checking"],["cheks","checks"],["cheksum","checksum"],["cheksums","checksums"],["chello","cello"],["chemcial","chemical"],["chemcially","chemically"],["chemestry","chemistry"],["chemicaly","chemically"],["chenged","changed"],["chennel","channel"],["cherch","church"],["cherchs","churches"],["cherck","check"],["chercking","checking"],["chercks","checks"],["chescksums","checksums"],["chgange","change"],["chganged","changed"],["chganges","changes"],["chganging","changing"],["chidren","children"],["childbird","childbirth"],["childen","children"],["childeren","children"],["childern","children"],["childlren","children"],["chiledren","children"],["chilren","children"],["chineese","Chinese"],["chinense","Chinese"],["chinesse","Chinese"],["chipersuite","ciphersuite"],["chipersuites","ciphersuites"],["chipertext","ciphertext"],["chipertexts","ciphertexts"],["chipet","chipset"],["chipslect","chipselect"],["chipstes","chipsets"],["chiuldren","children"],["chked","checked"],["chnage","change"],["chnaged","changed"],["chnages","changes"],["chnaging","changing"],["chnge","change"],["chnged","changed"],["chnges","changes"],["chnging","changing"],["chnnel","channel"],["choclate","chocolate"],["choicing","choosing"],["choise","choice"],["choises","choices"],["choising","choosing"],["chooose","choose"],["choos","choose"],["choosen","chosen"],["chopipng","chopping"],["choronological","chronological"],["chosed","chose"],["choseen","chosen"],["choser","chooser"],["chosing","choosing"],["chossen","chosen"],["chowsing","choosing"],["chracter","character"],["chracters","characters"],["chractor","character"],["chractors","characters"],["chrminance","chrominance"],["chromum","chromium"],["chuch","church"],["chuks","chunks"],["chunaks","chunks"],["chunc","chunk"],["chunck","chunk"],["chuncked","chunked"],["chuncking","chunking"],["chuncks","chunks"],["chuncksize","chunksize"],["chuncs","chunks"],["chuned","chunked"],["churchs","churches"],["cick","click"],["cicrle","circle"],["cicruit","circuit"],["cicruits","circuits"],["cicular","circular"],["ciculars","circulars"],["cihpher","cipher"],["cihphers","ciphers"],["cilinder","cylinder"],["cilinders","cylinders"],["cilindrical","cylindrical"],["cilyndre","cylinder"],["cilyndres","cylinders"],["cilyndrs","cylinders"],["Cincinatti","Cincinnati"],["Cincinnatti","Cincinnati"],["cinfiguration","configuration"],["cinfigurations","configurations"],["cintaner","container"],["ciontrol","control"],["ciper","cipher"],["cipers","ciphers"],["cipersuite","ciphersuite"],["cipersuites","ciphersuites"],["cipertext","ciphertext"],["cipertexts","ciphertexts"],["ciphe","cipher"],["cipherntext","ciphertext"],["ciphersuit","ciphersuite"],["ciphersuits","ciphersuites"],["ciphersute","ciphersuite"],["ciphersutes","ciphersuites"],["cipheruite","ciphersuite"],["cipheruites","ciphersuites"],["ciphes","ciphers"],["ciphr","cipher"],["ciphrs","ciphers"],["cips","chips"],["circluar","circular"],["circluarly","circularly"],["circluars","circulars"],["circomvent","circumvent"],["circomvented","circumvented"],["circomvents","circumvents"],["circual","circular"],["circuitery","circuitry"],["circulaton","circulation"],["circumferance","circumference"],["circumferencial","circumferential"],["circumsicion","circumcision"],["circumstancial","circumstantial"],["circumstansial","circumstantial"],["circumstnce","circumstance"],["circumstnces","circumstances"],["circumstncial","circumstantial"],["circumstntial","circumstantial"],["circumvernt","circumvent"],["circunference","circumference"],["circunferences","circumferences"],["circunstance","circumstance"],["circunstances","circumstances"],["circunstantial","circumstantial"],["circustances","circumstances"],["circut","circuit"],["circuts","circuits"],["ciricle","circle"],["ciricles","circles"],["ciricuit","circuit"],["ciricuits","circuits"],["ciricular","circular"],["ciricularise","circularise"],["ciricularize","circularize"],["ciriculum","curriculum"],["cirilic","Cyrillic"],["cirillic","Cyrillic"],["ciritc","critic"],["ciritcal","critical"],["ciritcality","criticality"],["ciritcals","criticals"],["ciritcs","critics"],["ciriteria","criteria"],["ciritic","critic"],["ciritical","critical"],["ciriticality","criticality"],["ciriticals","criticals"],["ciritics","critics"],["cirlce","circle"],["cirle","circle"],["cirles","circles"],["cirsumstances","circumstances"],["cirtcuit","circuit"],["cirucal","circular"],["cirucit","circuit"],["cirucits","circuits"],["ciruclar","circular"],["ciruclation","circulation"],["ciruclator","circulator"],["cirucmflex","circumflex"],["cirucular","circular"],["cirucumstance","circumstance"],["cirucumstances","circumstances"],["ciruit","circuit"],["ciruits","circuits"],["cirumflex","circumflex"],["cirumstance","circumstance"],["cirumstances","circumstances"],["civillian","civilian"],["civillians","civilians"],["cjange","change"],["cjanged","changed"],["cjanges","changes"],["cjoice","choice"],["cjoices","choices"],["ckecksum","checksum"],["claaes","classes"],["claculate","calculate"],["claculation","calculation"],["claer","clear"],["claerer","clearer"],["claerly","clearly"],["claibscale","calibscale"],["claime","claim"],["claimes","claims"],["clame","claim"],["claread","cleared"],["clared","cleared"],["clarety","clarity"],["claring","clearing"],["clasic","classic"],["clasical","classical"],["clasically","classically"],["clasification","classification"],["clasified","classified"],["clasifies","classifies"],["clasify","classify"],["clasifying","classifying"],["clasroom","classroom"],["clasrooms","classrooms"],["classess","classes"],["classesss","classes"],["classifcation","classification"],["classifed","classified"],["classifer","classifier"],["classifers","classifiers"],["classificaion","classification"],["classrom","classroom"],["classroms","classrooms"],["classs","class"],["classses","classes"],["clatified","clarified"],["claus","clause"],["clcoksource","clocksource"],["clcosed","closed"],["clea","clean"],["cleaered","cleared"],["cleaing","cleaning"],["cleancacne","cleancache"],["cleaness","cleanness"],["cleanning","cleaning"],["cleannup","cleanup"],["cleanpu","cleanup"],["cleanpus","cleanups"],["cleantup","cleanup"],["cleareance","clearance"],["cleares","clears"],["clearified","clarified"],["clearifies","clarifies"],["clearify","clarify"],["clearifying","clarifying"],["clearling","clearing"],["clearnance","clearance"],["clearnances","clearances"],["clearouput","clearoutput"],["clearted","cleared"],["cleary","clearly"],["cleaup","cleanup"],["cleaups","cleanups"],["cleck","check"],["cleean","clean"],["cleen","clean"],["cleened","cleaned"],["cleens","cleans"],["cleff","clef"],["cleint's","client's"],["cleint","client"],["cleints","clients"],["clened","cleaned"],["clener","cleaner"],["clening","cleaning"],["cler","clear"],["clese","close"],["cleses","closes"],["clevely","cleverly"],["cliboard","clipboard"],["cliboards","clipboards"],["clibpoard","clipboard"],["clibpoards","clipboards"],["cliens","clients"],["cliensite","client-side"],["clienta","client"],["clientelle","clientele"],["clik","click"],["cliks","clicks"],["climer","climber"],["climers","climbers"],["climing","climbing"],["clincial","clinical"],["clinets","clients"],["clinicaly","clinically"],["clipboad","clipboard"],["clipboads","clipboards"],["clipoard","clipboard"],["clipoards","clipboards"],["clipoing","clipping"],["cliuent","client"],["cliuents","clients"],["clloud","cloud"],["cllouded","clouded"],["clloudes","clouds"],["cllouding","clouding"],["cllouds","clouds"],["cloack","cloak"],["cloacks","cloaks"],["cloberring","clobbering"],["clocksourc","clocksource"],["clockw\xEDse","clockwise"],["clock_getttime","clock_gettime"],["cloding","closing"],["cloes","close"],["cloesd","closed"],["cloesed","closed"],["cloesing","closing"],["clonning","cloning"],["clory","glory"],["clos","close"],["closeing","closing"],["closesly","closely"],["closig","closing"],["clossed","closed"],["clossing","closing"],["clossion","collision"],["clossions","collisions"],["cloude","cloud"],["cloudes","clouds"],["cloumn","column"],["cloumns","columns"],["clousre","closure"],["clsoe","close"],["clssroom","classroom"],["clssrooms","classrooms"],["cluase","clause"],["clumn","column"],["clumsly","clumsily"],["cluser","cluster"],["clusetr","cluster"],["clustred","clustered"],["cmak","cmake"],["cmmand","command"],["cmmanded","commanded"],["cmmanding","commanding"],["cmmands","commands"],["cmobination","combination"],["cmoputer","computer"],["cmoputers","computers"],["cna","can"],["cnannel","channel"],["cnat'","can't"],["cnat","can't"],["cnfiguration","configuration"],["cnfigure","configure"],["cnfigured","configured"],["cnfigures","configures"],["cnfiguring","configuring"],["cnosole","console"],["cnosoles","consoles"],["cntain","contain"],["cntains","contains"],["cnter","center"],["co-incided","coincided"],["co-opearte","co-operate"],["co-opeartes","co-operates"],["co-ordinate","coordinate"],["co-ordinates","coordinates"],["coalace","coalesce"],["coalaced","coalesced"],["coalacence","coalescence"],["coalacing","coalescing"],["coalaesce","coalesce"],["coalaesced","coalesced"],["coalaescence","coalescence"],["coalaescing","coalescing"],["coalascece","coalescence"],["coalascence","coalescence"],["coalase","coalesce"],["coalasece","coalescence"],["coalased","coalesced"],["coalasence","coalescence"],["coalases","coalesces"],["coalasing","coalescing"],["coalcece","coalescence"],["coalcence","coalescence"],["coalesc","coalesce"],["coalescsing","coalescing"],["coalesed","coalesced"],["coalesence","coalescence"],["coalessing","coalescing"],["coallate","collate"],["coallates","collates"],["coallating","collating"],["coallece","coalesce"],["coalleced","coalesced"],["coallecence","coalescence"],["coalleces","coalesces"],["coallecing","coalescing"],["coallee","coalesce"],["coalleed","coalesced"],["coalleence","coalescence"],["coallees","coalesces"],["coalleing","coalescing"],["coallesce","coalesce"],["coallesced","coalesced"],["coallesceing","coalescing"],["coallescence","coalescence"],["coallesces","coalesces"],["coallescing","coalescing"],["coallese","coalesce"],["coallesed","coalesced"],["coallesence","coalescence"],["coalleses","coalesces"],["coallesing","coalescing"],["coallesse","coalesce"],["coallessed","coalesced"],["coallessence","coalescence"],["coallesses","coalesces"],["coallessing","coalescing"],["coallision","collision"],["coallisions","collisions"],["coalsce","coalesce"],["coalscece","coalescence"],["coalsced","coalesced"],["coalscence","coalescence"],["coalscing","coalescing"],["coalsece","coalescence"],["coalseced","coalesced"],["coalsecense","coalescence"],["coalsence","coalescence"],["coaslescing","coalescing"],["cobining","combining"],["cobvers","covers"],["coccinele","coccinelle"],["coctail","cocktail"],["cocument","document"],["cocumentation","documentation"],["cocuments","document"],["codeing","coding"],["codepoitn","codepoint"],["codesc","codecs"],["codespel","codespell"],["codesream","codestream"],["codition","condition"],["coditioned","conditioned"],["coditions","conditions"],["codo","code"],["codos","codes"],["coduct","conduct"],["coducted","conducted"],["coducter","conductor"],["coducting","conducting"],["coductor","conductor"],["coducts","conducts"],["coeffcient","coefficient"],["coeffcients","coefficients"],["coefficeint","coefficient"],["coefficeints","coefficients"],["coefficent","coefficient"],["coefficents","coefficients"],["coefficiens","coefficients"],["coefficientss","coefficients"],["coeffiecient","coefficient"],["coeffiecients","coefficients"],["coeffient","coefficient"],["coeffients","coefficients"],["coeficent","coefficient"],["coeficents","coefficients"],["coeficient","coefficient"],["coeficients","coefficients"],["coelesce","coalesce"],["coercable","coercible"],["coerceion","coercion"],["cofeee","coffee"],["cofficient","coefficient"],["cofficients","coefficients"],["cofidence","confidence"],["cofiguration","configuration"],["cofigure","configure"],["cofigured","configured"],["cofigures","configures"],["cofiguring","configuring"],["cofirm","confirm"],["cofirmation","confirmation"],["cofirmations","confirmations"],["cofirmed","confirmed"],["cofirming","confirming"],["cofirms","confirms"],["coform","conform"],["cofrim","confirm"],["cofrimation","confirmation"],["cofrimations","confirmations"],["cofrimed","confirmed"],["cofriming","confirming"],["cofrims","confirms"],["cognizent","cognizant"],["coherance","coherence"],["coherancy","coherency"],["coherant","coherent"],["coherantly","coherently"],["coice","choice"],["coincedentally","coincidentally"],["coinitailize","coinitialize"],["coinside","coincide"],["coinsided","coincided"],["coinsidence","coincidence"],["coinsident","coincident"],["coinsides","coincides"],["coinsiding","coinciding"],["cointain","contain"],["cointained","contained"],["cointaining","containing"],["cointains","contains"],["cokies","cookies"],["colaboration","collaboration"],["colaborations","collaborations"],["colateral","collateral"],["coldplg","coldplug"],["colected","collected"],["colection","collection"],["colections","collections"],["colelction","collection"],["colelctive","collective"],["colerscheme","colorscheme"],["colescing","coalescing"],["colision","collision"],["colission","collision"],["collaberative","collaborative"],["collaction","collection"],["collaobrative","collaborative"],["collaps","collapse"],["collapsable","collapsible"],["collasion","collision"],["collaspe","collapse"],["collasped","collapsed"],["collaspes","collapses"],["collaspible","collapsible"],["collasping","collapsing"],["collationg","collation"],["collborative","collaborative"],["collecing","collecting"],["collecion","collection"],["collecions","collections"],["colleciton","collection"],["collecitons","collections"],["collectin","collection"],["collecton","collection"],["collectons","collections"],["colleection","collection"],["collegue","colleague"],["collegues","colleagues"],["collektion","collection"],["colletion","collection"],["collidies","collides"],["collissions","collisions"],["collistion","collision"],["collistions","collisions"],["colllapses","collapses"],["collocalized","colocalized"],["collonade","colonnade"],["collonies","colonies"],["collony","colony"],["collorscheme","colorscheme"],["collosal","colossal"],["collpase","collapse"],["collpased","collapsed"],["collpases","collapses"],["collpasing","collapsing"],["collsion","collision"],["collsions","collisions"],["collumn","column"],["collumns","columns"],["colmn","column"],["colmns","columns"],["colmuned","columned"],["coloer","color"],["coloeration","coloration"],["coloered","colored"],["coloering","coloring"],["coloers","colors"],["coloful","colorful"],["colomn","column"],["colomns","columns"],["colon-seperated","colon-separated"],["colonizators","colonizers"],["coloringh","coloring"],["colorizoer","colorizer"],["colorpsace","colorspace"],["colorpsaces","colorspaces"],["colose","close"],["coloum","column"],["coloumn","column"],["coloumns","columns"],["coloums","columns"],["colourpsace","colourspace"],["colourpsaces","colourspaces"],["colsed","closed"],["colum","column"],["columm","column"],["colummn","column"],["colummns","columns"],["columms","columns"],["columnn","column"],["columnns","columns"],["columnss","columns"],["columnular","columnar"],["colums","columns"],["columsn","columns"],["colunns","columns"],["comammand","command"],["comamnd","command"],["comamnd-line","command-line"],["comamnded","commanded"],["comamnding","commanding"],["comamndline","commandline"],["comamnds","commands"],["comand","command"],["comand-line","command-line"],["comanded","commanded"],["comanding","commanding"],["comandline","commandline"],["comando","commando"],["comandos","commandos"],["comands","commands"],["comany","company"],["comapany","company"],["comapared","compared"],["comapatibility","compatibility"],["comapatible","compatible"],["comapletion","completion"],["comapnies","companies"],["comapny","company"],["comapre","compare"],["comapring","comparing"],["comaprison","comparison"],["comaptibele","compatible"],["comaptibelities","compatibilities"],["comaptibelity","compatibility"],["comaptible","compatible"],["comarators","comparators"],["comback","comeback"],["combained","combined"],["combanations","combinations"],["combatibility","compatibility"],["combatible","compatible"],["combiantion","combination"],["combiation","combination"],["combiations","combinations"],["combinate","combine"],["combinateion","combination"],["combinateions","combinations"],["combinatins","combinations"],["combinatio","combination"],["combinatios","combinations"],["combinaton","combination"],["combinatorical","combinatorial"],["combinbe","combined"],["combind","combined"],["combinded","combined"],["combiniation","combination"],["combiniations","combinations"],["combinine","combine"],["combintaion","combination"],["combintaions","combinations"],["combusion","combustion"],["comceptually","conceptually"],["comdemnation","condemnation"],["comect","connect"],["comected","connected"],["comecting","connecting"],["comectivity","connectivity"],["comedlib","comedilib"],["comemmorates","commemorates"],["comemoretion","commemoration"],["coment","comment"],["comented","commented"],["comenting","commenting"],["coments","comments"],["comfirm","confirm"],["comflicting","conflicting"],["comformance","conformance"],["comiled","compiled"],["comilers","compilers"],["comination","combination"],["comision","commission"],["comisioned","commissioned"],["comisioner","commissioner"],["comisioning","commissioning"],["comisions","commissions"],["comission","commission"],["comissioned","commissioned"],["comissioner","commissioner"],["comissioning","commissioning"],["comissions","commissions"],["comit","commit"],["comited","committed"],["comitee","committee"],["comiting","committing"],["comits","commits"],["comitted","committed"],["comittee","committee"],["comittees","committees"],["comitter","committer"],["comitting","committing"],["comittish","committish"],["comlain","complain"],["comlained","complained"],["comlainer","complainer"],["comlaining","complaining"],["comlains","complains"],["comlaint","complaint"],["comlaints","complaints"],["comlete","complete"],["comleted","completed"],["comletely","completely"],["comletion","completion"],["comletly","completely"],["comlex","complex"],["comlexity","complexity"],["comlpeter","completer"],["comma-separeted","comma-separated"],["commad","command"],["commadn","command"],["commadn-line","command-line"],["commadnline","commandline"],["commadns","commands"],["commads","commands"],["commandi","command"],["commandoes","commandos"],["commannd","command"],["commans","commands"],["commansd","commands"],["commect","connect"],["commected","connected"],["commecting","connecting"],["commectivity","connectivity"],["commedic","comedic"],["commemerative","commemorative"],["commemmorate","commemorate"],["commemmorating","commemorating"],["commenet","comment"],["commenetd","commented"],["commeneted","commented"],["commenstatus","commentstatus"],["commerical","commercial"],["commerically","commercially"],["commericial","commercial"],["commericially","commercially"],["commerorative","commemorative"],["comming","coming"],["comminication","communication"],["comminity","community"],["comminucating","communicating"],["comminucation","communication"],["commision","commission"],["commisioned","commissioned"],["commisioner","commissioner"],["commisioning","commissioning"],["commisions","commissions"],["commitable","committable"],["commited","committed"],["commitee","committee"],["commiter","committer"],["commiters","committers"],["commitin","committing"],["commiting","committing"],["commitish","committish"],["committ","commit"],["committe","committee"],["committi","committee"],["committis","committees"],["committment","commitment"],["committments","commitments"],["committy","committee"],["commma","comma"],["commma-separated","comma-separated"],["commmand","command"],["commmand-line","command-line"],["commmandline","commandline"],["commmands","commands"],["commmemorated","commemorated"],["commment","comment"],["commmented","commented"],["commmenting","commenting"],["commments","comments"],["commmet","comment"],["commmets","comments"],["commmit","commit"],["commmited","committed"],["commmiting","committing"],["commmits","commits"],["commmitted","committed"],["commmitter","committer"],["commmitters","committers"],["commmitting","committing"],["commmon","common"],["commmunicate","communicate"],["commmunicated","communicated"],["commmunicates","communicates"],["commmunicating","communicating"],["commmunication","communication"],["commmunity","community"],["commna","comma"],["commna-separated","comma-separated"],["commnad","command"],["commnad-line","command-line"],["commnadline","commandline"],["commnads","commands"],["commnand","command"],["commnand-line","command-line"],["commnandline","commandline"],["commnands","commands"],["commnd","command"],["commnd-line","command-line"],["commndline","commandline"],["commnds","commands"],["commnent","comment"],["commnents","comments"],["commnet","comment"],["commnetaries","commentaries"],["commnetary","commentary"],["commnetator","commentator"],["commnetators","commentators"],["commneted","commented"],["commneting","commenting"],["commnets","comments"],["commnication","communication"],["commnities","communities"],["commnity","community"],["commnt","comment"],["commnted","commented"],["commnuative","commutative"],["commnunicating","communicating"],["commnunication","communication"],["commnunity","community"],["commoditiy","commodity"],["commom","common"],["commond","command"],["commongly","commonly"],["commontly","commonly"],["commonweath","commonwealth"],["commpact","compact"],["commpaction","compaction"],["commpare","compare"],["commparisons","comparisons"],["commpatibility","compatibility"],["commpatible","compatible"],["commpessed","compressed"],["commpilation","compilation"],["commpile","compile"],["commpiled","compiled"],["commpiling","compiling"],["commplain","complain"],["commplete","complete"],["commpleted","completed"],["commpletely","completely"],["commpletes","completes"],["commpletion","completion"],["commplex","complex"],["commpliant","compliant"],["commplied","complied"],["commpn","common"],["commponent","component"],["commponents","components"],["commpound","compound"],["commpresd","compressed"],["commpresed","compressed"],["commpresion","compression"],["commpress","compress"],["commpressd","compressed"],["commpressed","compressed"],["commpression","compression"],["commpute","compute"],["commputed","computed"],["commputer","computer"],["commputes","computes"],["commputing","computing"],["commtited","committed"],["commtted","committed"],["commuication","communication"],["commuications","communications"],["commuinications","communications"],["communcated","communicated"],["communcation","communication"],["communcations","communications"],["communciation","communication"],["communiation","communication"],["communicaion","communication"],["communicatie","communication"],["communicaton","communication"],["communitcate","communicate"],["communitcated","communicated"],["communitcates","communicates"],["communitcation","communication"],["communitcations","communications"],["communites","communities"],["communiy","community"],["communiyt","community"],["communuication","communication"],["commutated","commuted"],["commutating","commuting"],["commutive","commutative"],["comnmand","command"],["comnnected","connected"],["comnparing","comparing"],["comnpletion","completion"],["comnpresion","compression"],["comnpress","compress"],["comobobox","combo-box"],["comon","common"],["comonent","component"],["comor","color"],["compability","compatibility"],["compabillity","compatibility"],["compabitiliby","compatibility"],["compabitility","compatibility"],["compagnion","companion"],["compagny","company"],["compaibility","compatibility"],["compain","complain"],["compair","compare"],["compaire","compare"],["compaired","compared"],["compairing","comparing"],["compairison","comparison"],["compairisons","comparisons"],["compairs","compares"],["compansate","compensate"],["compansated","compensated"],["compansates","compensates"],["compansating","compensating"],["compansation","compensation"],["compansations","compensations"],["comparaison","comparison"],["comparare","compare"],["comparasion","comparison"],["comparasions","comparisons"],["comparater","comparator"],["comparation","comparison"],["comparations","comparisons"],["compareable","comparable"],["compareing","comparing"],["compareison","comparison"],["compareisons","comparisons"],["comparements","compartments"],["compariable","comparable"],["comparied","compared"],["comparign","comparing"],["comparigon","comparison"],["comparigons","comparisons"],["compariing","comparing"],["comparion","comparison"],["comparions","comparisons"],["comparios","comparison"],["comparioss","comparisons"],["comparisaion","comparison"],["comparisaions","comparisons"],["comparisation","comparison"],["comparisations","comparisons"],["comparisement","comparison"],["comparisements","comparisons"],["comparisin","comparison"],["comparising","comparing"],["comparisins","comparisons"],["comparision","comparison"],["comparisions","comparisons"],["comparism","comparison"],["comparisment","comparison"],["comparisments","comparisons"],["comparisms","comparisons"],["comparisn","comparison"],["comparisns","comparisons"],["comparispon","comparison"],["comparispons","comparisons"],["comparission","comparison"],["comparissions","comparisons"],["comparisson","comparison"],["comparissons","comparisons"],["comparistion","comparison"],["comparistions","comparisons"],["compariston","comparison"],["comparistons","comparisons"],["comparition","comparison"],["comparitions","comparisons"],["comparititive","comparative"],["comparititively","comparatively"],["comparitive","comparative"],["comparitively","comparatively"],["comparitor","comparator"],["comparitors","comparators"],["comparizon","comparison"],["comparizons","comparisons"],["comparment","compartment"],["comparotor","comparator"],["comparotors","comparators"],["comparre","compare"],["comparsion","comparison"],["comparsions","comparisons"],["compatabable","compatible"],["compatabiity","compatibility"],["compatabile","compatible"],["compatabilities","compatibilities"],["compatability","compatibility"],["compatabillity","compatibility"],["compatabilty","compatibility"],["compatabily","compatibility"],["compatable","compatible"],["compatablility","compatibility"],["compatablities","compatibilities"],["compatablitiy","compatibility"],["compatablity","compatibility"],["compatably","compatibly"],["compataibility","compatibility"],["compataible","compatible"],["compataility","compatibility"],["compatatbility","compatibility"],["compatatble","compatible"],["compatatible","compatible"],["compatator","comparator"],["compatators","comparators"],["compatbile","compatible"],["compatbility","compatibility"],["compatiability","compatibility"],["compatiable","compatible"],["compatiablity","compatibility"],["compatibel","compatible"],["compatibile","compatible"],["compatibiliy","compatibility"],["compatibiltiy","compatibility"],["compatibilty","compatibility"],["compatibily","compatibility"],["compatibity","compatibility"],["compatiblilty","compatibility"],["compatiblities","compatibilities"],["compatiblity","compatibility"],["compation","compaction"],["compatitbility","compatibility"],["compativle","compatible"],["compaytibility","compatibility"],["compeitions","competitions"],["compeletely","completely"],["compelte","complete"],["compeltelyt","completely"],["compeltion","completion"],["compeltly","completely"],["compelx","complex"],["compelxes","complexes"],["compelxities","complexities"],["compelxity","complexity"],["compensantion","compensation"],["compenstate","compensate"],["compenstated","compensated"],["compenstates","compensates"],["competance","competence"],["competant","competent"],["competative","competitive"],["competetive","competitive"],["competions","completions"],["competitiion","competition"],["competive","competitive"],["competiveness","competitiveness"],["compex","complex"],["compfortable","comfortable"],["comphrehensive","comprehensive"],["compiant","compliant"],["compicated","complicated"],["compications","complications"],["compied","compiled"],["compilability","compatibility"],["compilant","compliant"],["compilaton","compilation"],["compilatons","compilations"],["compilcate","complicate"],["compilcated","complicated"],["compilcatedly","complicatedly"],["compilcates","complicates"],["compilcating","complicating"],["compilcation","complication"],["compilcations","complications"],["compileable","compilable"],["compiletime","compile time"],["compiliant","compliant"],["compiliation","compilation"],["compilier","compiler"],["compiliers","compilers"],["compitability","compatibility"],["compitable","compatible"],["compitent","competent"],["compitible","compatible"],["complaing","complaining"],["complanied","complained"],["complate","complete"],["complated","completed"],["complates","completes"],["complating","completing"],["complatly","completely"],["complatness","completeness"],["complats","completes"],["complcated","complicated"],["compleate","complete"],["compleated","completed"],["compleates","completes"],["compleating","completing"],["compleatly","completely"],["compleete","complete"],["compleeted","completed"],["compleetly","completely"],["compleetness","completeness"],["complelely","completely"],["complelte","complete"],["complementt","complement"],["compleness","completeness"],["complession","compression"],["complet","complete"],["completedthe","completed the"],["completeion","completion"],["completelly","completely"],["completelty","completely"],["completelyl","completely"],["completetion","completion"],["completetly","completely"],["completiom","completion"],["completition","completion"],["completley","completely"],["completly","completely"],["completness","completeness"],["complette","complete"],["complettly","completely"],["complety","completely"],["complext","complexity"],["compliace","compliance"],["complianse","compliance"],["compliation","compilation"],["compliations","compilations"],["complied-in","compiled-in"],["complience","compliance"],["complient","compliant"],["complile","compile"],["compliled","compiled"],["compliler","compiler"],["compliles","compiles"],["compliling","compiling"],["compling","compiling"],["complitely","completely"],["complmenet","complement"],["complted","completed"],["compluter","computer"],["compnent","component"],["compnents","components"],["compoennt","component"],["compoent","component"],["compoents","components"],["compoesd","composed"],["compoment","component"],["compoments","components"],["componant","component"],["componants","components"],["componbents","components"],["componding","compounding"],["componeent","component"],["componeents","components"],["componemt","component"],["componemts","components"],["componenet","component"],["componenets","components"],["componens","components"],["componentes","components"],["componet","component"],["componets","components"],["componnents","components"],["componoent","component"],["componoents","components"],["componsites","composites"],["compontent","component"],["compontents","components"],["composablity","composability"],["composibility","composability"],["composiblity","composability"],["composit","composite"],["compositong","compositing"],["composits","composites"],["compount","compound"],["comppatible","compatible"],["comppiler","compiler"],["comppilers","compilers"],["comppliance","compliance"],["comprable","comparable"],["compredded","compressed"],["compresed","compressed"],["compreser","compressor"],["compresers","compressors"],["compreses","compresses"],["compresible","compressible"],["compresing","compressing"],["compresion","compression"],["compresions","compressions"],["compresor","compressor"],["compresors","compressors"],["compressable","compressible"],["compresser","compressor"],["compressers","compressors"],["compresss","compress"],["compresssed","compressed"],["compresssion","compression"],["comprimise","compromise"],["compromize","compromise"],["compromized","compromised"],["compsable","composable"],["compsite","composite"],["comptabile","compatible"],["comptible","compatible"],["comptue","compute"],["compuatation","computation"],["compuation","computation"],["compulsary","compulsory"],["compulsery","compulsory"],["compund","compound"],["compunds","compounds"],["computaion","computation"],["computarized","computerized"],["computaton","computation"],["computtaion","computation"],["computtaions","computations"],["comress","compress"],["comressed","compressed"],["comresses","compresses"],["comressing","compressing"],["comression","compression"],["comrpess","compress"],["comrpessed","compressed"],["comrpesses","compresses"],["comrpessing","compressing"],["comrpession","compression"],["comstraint","constraint"],["comsume","consume"],["comsumed","consumed"],["comsumer","consumer"],["comsumers","consumers"],["comsumes","consumes"],["comsuming","consuming"],["comsumption","consumption"],["comtain","contain"],["comtained","contained"],["comtainer","container"],["comtains","contains"],["comunicate","communicate"],["comunication","communication"],["comunity","community"],["comventions","conventions"],["comverted","converted"],["conain","contain"],["conained","contained"],["conainer","container"],["conainers","containers"],["conaines","contains"],["conaining","containing"],["conains","contains"],["conaint","contain"],["conainted","contained"],["conainter","container"],["conatain","contain"],["conatainer","container"],["conatainers","containers"],["conatains","contains"],["conatin","contain"],["conatined","contained"],["conatiner","container"],["conatiners","containers"],["conatining","containing"],["conatins","contains"],["conbination","combination"],["conbinations","combinations"],["conbtrols","controls"],["concaneted","concatenated"],["concantenated","concatenated"],["concatenaded","concatenated"],["concatenaion","concatenation"],["concatened","concatenated"],["concatentaion","concatenation"],["concatentate","concatenate"],["concatentated","concatenated"],["concatentates","concatenates"],["concatentating","concatenating"],["concatentation","concatenation"],["concatentations","concatenations"],["concatented","concatenated"],["concatinate","concatenate"],["concatinated","concatenated"],["concatination","concatenation"],["concatinations","concatenations"],["concating","concatenating"],["concatonate","concatenate"],["concatonated","concatenated"],["concatonates","concatenates"],["concatonating","concatenating"],["conceed","concede"],["conceedd","conceded"],["concensors","consensus"],["concensus","consensus"],["concentate","concentrate"],["concentated","concentrated"],["concentates","concentrates"],["concentating","concentrating"],["concentation","concentration"],["concentic","concentric"],["concentraze","concentrate"],["concered","concerned"],["concerened","concerned"],["concering","concerning"],["concerntrating","concentrating"],["concicely","concisely"],["concider","consider"],["concidered","considered"],["concidering","considering"],["conciders","considers"],["concieted","conceited"],["concieve","conceive"],["concieved","conceived"],["concious","conscious"],["conciously","consciously"],["conciousness","consciousness"],["concurence","concurrence"],["concurency","concurrency"],["concurent","concurrent"],["concurently","concurrently"],["concurrect","concurrent"],["condamned","condemned"],["condem","condemn"],["condemmed","condemned"],["condfiguration","configuration"],["condfigurations","configurations"],["condfigure","configure"],["condfigured","configured"],["condfigures","configures"],["condfiguring","configuring"],["condict","conduct"],["condicted","conducted"],["condidate","candidate"],["condidates","candidates"],["condident","confident"],["condidential","confidential"],["condidional","conditional"],["condidtion","condition"],["condidtioning","conditioning"],["condidtions","conditions"],["condifurable","configurable"],["condifuration","configuration"],["condifure","configure"],["condifured","configured"],["condig","config"],["condigdialog","configdialog"],["condiiton","condition"],["condionally","conditionally"],["conditial","conditional"],["conditially","conditionally"],["conditialy","conditionally"],["conditianal","conditional"],["conditianally","conditionally"],["conditianaly","conditionally"],["conditionaly","conditionally"],["conditionn","condition"],["conditionnal","conditional"],["conditionnaly","conditionally"],["conditionned","conditioned"],["conditionsof","conditions of"],["conditoinal","conditional"],["conditon","condition"],["conditonal","conditional"],["conditons","conditions"],["condntional","conditional"],["condtiion","condition"],["condtiions","conditions"],["condtion","condition"],["condtional","conditional"],["condtionally","conditionally"],["condtionals","conditionals"],["condtioned","conditioned"],["condtions","conditions"],["condtition","condition"],["condtitional","conditional"],["condtitionals","conditionals"],["condtitions","conditions"],["conecct","connect"],["coneccted","connected"],["coneccting","connecting"],["conecction","connection"],["conecctions","connections"],["conecctivities","connectivities"],["conecctivity","connectivity"],["conecctor","connector"],["conecctors","connectors"],["coneccts","connects"],["conecept","concept"],["conecepts","concepts"],["conecjture","conjecture"],["conecjtures","conjectures"],["conecntrate","concentrate"],["conecntrated","concentrated"],["conecntrates","concentrates"],["conecpt","concept"],["conecpts","concepts"],["conect","connect"],["conected","connected"],["conecting","connecting"],["conection","connection"],["conections","connections"],["conectivities","connectivities"],["conectivity","connectivity"],["conectix","connectix"],["conector","connector"],["conectors","connectors"],["conects","connects"],["conecurrency","concurrency"],["conecutive","consecutive"],["coneect","connect"],["coneected","connected"],["coneecting","connecting"],["coneection","connection"],["coneections","connections"],["coneectivities","connectivities"],["coneectivity","connectivity"],["coneector","connector"],["coneectors","connectors"],["coneects","connects"],["conenct","connect"],["conencted","connected"],["conencting","connecting"],["conenction","connection"],["conenctions","connections"],["conenctivities","connectivities"],["conenctivity","connectivity"],["conenctor","connector"],["conenctors","connectors"],["conencts","connects"],["conenience","convenience"],["conenient","convenient"],["coneninece","convenience"],["coneninet","convenient"],["conent","content"],["conents","contents"],["conergence","convergence"],["conern","concern"],["conerning","concerning"],["conersion","conversion"],["conersions","conversions"],["conert","convert"],["conerted","converted"],["conerter","converter"],["conerters","converters"],["conerting","converting"],["conervative","conservative"],["conesencus","consensus"],["conet","connect"],["coneted","connected"],["coneting","connecting"],["conetion","connection"],["conetions","connections"],["conetivities","connectivities"],["conetivity","connectivity"],["conetnt","content"],["conetor","connector"],["conetors","connectors"],["conets","connects"],["conexant","connexant"],["conferene","conference"],["conferrencing","conferencing"],["confert","convert"],["confety","confetti"],["conffiguration","configuration"],["confgiuration","configuration"],["confgiure","configure"],["confgiured","configured"],["confguration","configuration"],["confgure","configure"],["confgured","configured"],["confict","conflict"],["conficted","conflicted"],["conficts","conflicts"],["confidance","confidence"],["confidantal","confidential"],["confidantally","confidentially"],["confidantals","confidentials"],["confidantial","confidential"],["confidantially","confidentially"],["confidental","confidential"],["confidentally","confidentially"],["confids","confides"],["confifurable","configurable"],["confifuration","configuration"],["confifure","configure"],["confifured","configured"],["configaration","configuration"],["configed","configured"],["configer","configure"],["configiration","configuration"],["configire","configure"],["configiuration","configuration"],["configration","configuration"],["configrations","configurations"],["configred","configured"],["configruation","configuration"],["configruations","configurations"],["configrued","configured"],["configuaration","configuration"],["configuarble","configurable"],["configuare","configure"],["configuared","configured"],["configuarion","configuration"],["configuarions","configurations"],["configuartion","configuration"],["configuartions","configurations"],["configuation","configuration"],["configuations","configurations"],["configue","configure"],["configued","configured"],["configuerd","configured"],["configuered","configured"],["configues","configures"],["configulate","configurate"],["configulation","configuration"],["configulations","configurations"],["configuraion","configuration"],["configuraiton","configuration"],["configuratiens","configurations"],["configuratiom","configuration"],["configurationn","configuration"],["configuratioon","configuration"],["configuratoin","configuration"],["configuratoins","configurations"],["configuraton","configuration"],["configuratons","configurations"],["configuratrions","configurations"],["configuratuion","configuration"],["configureable","configurable"],["configureing","configuring"],["configuretion","configuration"],["configurres","configures"],["configurring","configuring"],["configurses","configures"],["configurtation","configuration"],["configurting","configuring"],["configurtion","configuration"],["configurtoin","configuration"],["configury","configurable"],["configutation","configuration"],["configutations","configurations"],["configute","configure"],["configuted","configured"],["configutes","configures"],["configutration","configuration"],["confim","confirm"],["confimation","confirmation"],["confimations","confirmations"],["confimed","confirmed"],["confiming","confirming"],["confimred","confirmed"],["confims","confirms"],["confiramtion","confirmation"],["confirmacion","confirmation"],["confirmaed","confirmed"],["confirmas","confirms"],["confirmatino","confirmation"],["confirmatinon","confirmation"],["confirmd","confirmed"],["confirmedd","confirmed"],["confirmeed","confirmed"],["confirmming","confirming"],["confiug","config"],["confiugrable","configurable"],["confiugration","configuration"],["confiugrations","configurations"],["confiugre","configure"],["confiugred","configured"],["confiugres","configures"],["confiugring","configuring"],["confiugure","configure"],["conflictin","conflicting"],["conflift","conflict"],["conflit","conflict"],["confoguration","configuration"],["confort","comfort"],["confortable","comfortable"],["confrim","confirm"],["confrimation","confirmation"],["confrimations","confirmations"],["confrimed","confirmed"],["confriming","confirming"],["confrims","confirms"],["confucing","confusing"],["confucion","confusion"],["confuction","conjunction"],["confudion","confusion"],["confue","confuse"],["confued","confused"],["confues","confuses"],["confugiration","configuration"],["confugirble","configurable"],["confugire","configure"],["confugired","configured"],["confugires","configures"],["confugiring","configuring"],["confugrable","configurable"],["confugration","configuration"],["confugre","configure"],["confugred","configured"],["confugres","configures"],["confugring","configuring"],["confugurable","configurable"],["confuguration","configuration"],["confugure","configure"],["confugured","configured"],["confugures","configures"],["confuguring","configuring"],["confuigration","configuration"],["confuigrations","configurations"],["confuing","confusing"],["confunction","conjunction"],["confunder","confounder"],["confunse","confuse"],["confunsed","confused"],["confunses","confuses"],["confunsing","confusing"],["confurable","configurable"],["confuration","configuration"],["confure","configure"],["confured","configured"],["confures","configures"],["confuring","configuring"],["confurse","confuse"],["confursed","confused"],["confurses","confuses"],["confursing","confusing"],["confusting","confusing"],["confuze","confuse"],["confuzed","confused"],["confuzes","confuses"],["confuzing","confusing"],["confuzze","confuse"],["confuzzed","confused"],["confuzzes","confuses"],["confuzzing","confusing"],["congifurable","configurable"],["congifuration","configuration"],["congifure","configure"],["congifured","configured"],["congig","config"],["congigs","configs"],["congiguration","configuration"],["congigurations","configurations"],["congigure","configure"],["congnition","cognition"],["congnitive","cognitive"],["congradulations","congratulations"],["congresional","congressional"],["conider","consider"],["conifguration","configuration"],["conifiguration","configuration"],["conig","config"],["conigurable","configurable"],["conigured","configured"],["conincide","coincide"],["conincidence","coincidence"],["conincident","coincident"],["conincides","coincides"],["coninciding","coinciding"],["coninient","convenient"],["coninstallable","coinstallable"],["coninuation","continuation"],["coninue","continue"],["coninues","continues"],["coninuity","continuity"],["coninuous","continuous"],["conitinue","continue"],["conived","connived"],["conjecutre","conjecture"],["conjonction","conjunction"],["conjonctive","conjunctive"],["conjuction","conjunction"],["conjuctions","conjunctions"],["conjuncion","conjunction"],["conjuntion","conjunction"],["conjuntions","conjunctions"],["conlcude","conclude"],["conlcuded","concluded"],["conlcudes","concludes"],["conlcuding","concluding"],["conlcusion","conclusion"],["conlcusions","conclusions"],["conly","only"],["conmnection","connection"],["conmpress","compress"],["conmpression","compression"],["connaect","connect"],["conncection","connection"],["conncetion","connection"],["connction","connection"],["conncurrent","concurrent"],["connecetd","connected"],["connecion","connection"],["connecions","connections"],["conneciton","connection"],["connecitons","connections"],["connecor","connector"],["connecotr","connector"],["connecstatus","connectstatus"],["connectd","connected"],["connecte","connected"],["connectec","connected"],["connectes","connects"],["connectet","connected"],["connectibity","connectivity"],["connectino","connection"],["connectinos","connections"],["connectins","connections"],["connectiom","connection"],["connectioms","connections"],["connectiona","connection"],["connectionas","connections"],["connectiviy","connectivity"],["connectivty","connectivity"],["connecto","connect"],["connectted","connected"],["connecttion","connection"],["conneection","connection"],["conneiction","connection"],["connektors","connectors"],["connetced","connected"],["connetcion","connection"],["conneted","connected"],["Conneticut","Connecticut"],["connetion","connection"],["connetor","connector"],["connexion","connection"],["connnect","connect"],["connnected","connected"],["connnecting","connecting"],["connnection","connection"],["connnections","connections"],["connnects","connects"],["connot","cannot"],["connstrain","constrain"],["connstrained","constrained"],["connstraint","constraint"],["conntents","contents"],["conntroller","controller"],["conosuer","connoisseur"],["conotation","connotation"],["conotations","connotations"],["conotrol","control"],["conotroled","controlled"],["conotroling","controlling"],["conotrolled","controlled"],["conotrols","controls"],["conpares","compares"],["conplete","complete"],["conpleted","completed"],["conpletes","completes"],["conpleting","completing"],["conpletion","completion"],["conquerd","conquered"],["conquerer","conqueror"],["conquerers","conquerors"],["conqured","conquered"],["conrete","concrete"],["conrol","control"],["conroller","controller"],["conrrespond","correspond"],["conrrespondence","correspondence"],["conrrespondences","correspondences"],["conrrespondent","correspondent"],["conrrespondents","correspondents"],["conrresponding","corresponding"],["conrrespondingly","correspondingly"],["conrresponds","corresponds"],["conrrol","control"],["conrrupt","corrupt"],["conrruptable","corruptible"],["conrrupted","corrupted"],["conrruptible","corruptible"],["conrruption","corruption"],["conrruptions","corruptions"],["conrrupts","corrupts"],["conrtib","contrib"],["conrtibs","contribs"],["consants","constants"],["conscent","consent"],["consciencious","conscientious"],["consciouness","consciousness"],["consctruct","construct"],["consctructed","constructed"],["consctructing","constructing"],["consctruction","construction"],["consctructions","constructions"],["consctructive","constructive"],["consctructor","constructor"],["consctructors","constructors"],["consctructs","constructs"],["consdider","consider"],["consdidered","considered"],["consdiered","considered"],["consdired","considered"],["conseat","conceit"],["conseated","conceited"],["consective","consecutive"],["consectively","consecutively"],["consectutive","consecutive"],["consectuve","consecutive"],["consecuitively","consecutively"],["conseed","concede"],["conseedd","conceded"],["conseeded","conceded"],["conseeds","concedes"],["consenquently","consequently"],["consensis","consensus"],["consentrate","concentrate"],["consentrated","concentrated"],["consentrates","concentrates"],["consept","concept"],["consepts","concepts"],["consequentely","consequently"],["consequentually","consequently"],["consequeseces","consequences"],["consequetive","consecutive"],["consequtive","consecutive"],["consequtively","consecutively"],["consern","concern"],["conserned","concerned"],["conserning","concerning"],["conservativeky","conservatively"],["conservitive","conservative"],["consestently","consistently"],["consevible","conceivable"],["consiciousness","consciousness"],["consicousness","consciousness"],["considder","consider"],["considderation","consideration"],["considdered","considered"],["considdering","considering"],["considerd","considered"],["consideren","considered"],["considerion","consideration"],["considerions","considerations"],["considred","considered"],["consier","consider"],["consiers","considers"],["consifer","consider"],["consifered","considered"],["consious","conscious"],["consisant","consistent"],["consisent","consistent"],["consisently","consistently"],["consisntency","consistency"],["consistancy","consistency"],["consistant","consistent"],["consistantly","consistently"],["consisten","consistent"],["consistend","consistent"],["consistendly","consistently"],["consistendt","consistent"],["consistendtly","consistently"],["consistenly","consistently"],["consistuents","constituents"],["consit","consist"],["consitant","consistent"],["consited","consisted"],["consitency","consistency"],["consitent","consistent"],["consitently","consistently"],["consiting","consisting"],["consitional","conditional"],["consits","consists"],["consituencies","constituencies"],["consituency","constituency"],["consituent","constituent"],["consituents","constituents"],["consitute","constitute"],["consituted","constituted"],["consitutes","constitutes"],["consituting","constituting"],["consitution","constitution"],["consitutional","constitutional"],["consitutuent","constituent"],["consitutuents","constituents"],["consitutute","constitute"],["consitututed","constituted"],["consitututes","constitutes"],["consitututing","constituting"],["consntant","constant"],["consntantly","constantly"],["consntants","constants"],["consol","console"],["consolodate","consolidate"],["consolodated","consolidated"],["consonent","consonant"],["consonents","consonants"],["consorcium","consortium"],["conspiracys","conspiracies"],["conspiriator","conspirator"],["consquence","consequence"],["consquences","consequences"],["consquent","consequent"],["consquently","consequently"],["consrtuct","construct"],["consrtucted","constructed"],["consrtuctor","constructor"],["consrtuctors","constructors"],["consrtucts","constructs"],["consruction","construction"],["consructions","constructions"],["consructor","constructor"],["consructors","constructors"],["constaint","constraint"],["constainted","constrained"],["constaints","constraints"],["constallation","constellation"],["constallations","constellations"],["constan","constant"],["constanly","constantly"],["constantsm","constants"],["constarin","constrain"],["constarint","constraint"],["constarints","constraints"],["constarnation","consternation"],["constatn","constant"],["constatnt","constant"],["constatnts","constants"],["constcurts","constructs"],["constext","context"],["consting","consisting"],["constinually","continually"],["constistency","consistency"],["constists","consists"],["constitently","consistently"],["constituant","constituent"],["constituants","constituents"],["constitue","constitute"],["constitues","constitutes"],["constituion","constitution"],["constituional","constitutional"],["constitutent","constituent"],["constitutents","constituents"],["constly","costly"],["constract","construct"],["constracted","constructed"],["constractor","constructor"],["constractors","constructors"],["constrainsts","constraints"],["constrainted","constrained"],["constraintes","constraints"],["constrainting","constraining"],["constrait","constraint"],["constraits","constraints"],["constrans","constrains"],["constrant","constraint"],["constrants","constraints"],["constrast","contrast"],["constrasts","contrasts"],["constratints","constraints"],["constraucts","constructs"],["constrcuct","construct"],["constrcut","construct"],["constrcuted","constructed"],["constrcution","construction"],["constrcutor","constructor"],["constrcutors","constructors"],["constrcuts","constructs"],["constriants","constraints"],["constrint","constraint"],["constrints","constraints"],["constrollers","controllers"],["construc","construct"],["construces","constructs"],["construcing","constructing"],["construcion","construction"],["construciton","construction"],["construcor","constructor"],["construcs","constructs"],["constructcor","constructor"],["constructer","constructor"],["constructers","constructors"],["constructes","constructs"],["constructred","constructed"],["constructt","construct"],["constructted","constructed"],["constructting","constructing"],["constructtor","constructor"],["constructtors","constructors"],["constructts","constructs"],["constructued","constructed"],["constructur","constructor"],["constructure","constructor"],["constructurs","constructors"],["construktor","constructor"],["construnctor","constructor"],["construrtors","constructors"],["construst","construct"],["construsts","constructs"],["construt","construct"],["construtced","constructed"],["construter","constructor"],["construters","constructors"],["constrution","construction"],["construtor","constructor"],["construtors","constructors"],["consttruct","construct"],["consttructer","constructor"],["consttructers","constructors"],["consttruction","construction"],["consttructor","constructor"],["consttructors","constructors"],["constuct","construct"],["constucted","constructed"],["constucter","constructor"],["constucters","constructors"],["constucting","constructing"],["constuction","construction"],["constuctions","constructions"],["constuctor","constructor"],["constuctors","constructors"],["constucts","constructs"],["consturct","construct"],["consturctor","constructor"],["consuder","consider"],["consuemr","consumer"],["consulant","consultant"],["consultunt","consultant"],["consumate","consummate"],["consumated","consummated"],["consumating","consummating"],["consummed","consumed"],["consummer","consumer"],["consummers","consumers"],["consumtion","consumption"],["contacentaion","concatenation"],["contagen","contagion"],["contaienr","container"],["contaier","container"],["contails","contains"],["contaiminate","contaminate"],["contaiminated","contaminated"],["contaiminating","contaminating"],["containa","contain"],["containees","containers"],["containerr","container"],["containg","containing"],["containging","containing"],["containig","containing"],["containings","containing"],["containining","containing"],["containint","containing"],["containn","contain"],["containner","container"],["containners","containers"],["containns","contains"],["containr","container"],["containrs","containers"],["containted","contained"],["containter","container"],["containters","containers"],["containting","containing"],["containts","contains"],["containuations","continuations"],["contais","contains"],["contaisn","contains"],["contaiun","contain"],["contamporaries","contemporaries"],["contamporary","contemporary"],["contan","contain"],["contaned","contained"],["contanined","contained"],["contaning","containing"],["contanins","contains"],["contans","contains"],["contary","contrary"],["contatenated","concatenated"],["contatining","containing"],["contein","contain"],["conteined","contained"],["conteining","containing"],["conteins","contains"],["contempoary","contemporary"],["contemporaneus","contemporaneous"],["contempory","contemporary"],["conten","contain"],["contence","contents"],["contendor","contender"],["contener","container"],["conteners","containers"],["contenht","content"],["content-negatiotiation","content-negotiation"],["content-negoatiation","content-negotiation"],["content-negoation","content-negotiation"],["content-negociation","content-negotiation"],["content-negogtiation","content-negotiation"],["content-negoitation","content-negotiation"],["content-negoptionsotiation","content-negotiation"],["content-negosiation","content-negotiation"],["content-negotaiation","content-negotiation"],["content-negotaition","content-negotiation"],["content-negotatiation","content-negotiation"],["content-negotation","content-negotiation"],["content-negothiation","content-negotiation"],["content-negotication","content-negotiation"],["content-negotioation","content-negotiation"],["content-negotion","content-negotiation"],["content-negotionation","content-negotiation"],["content-negotiotation","content-negotiation"],["content-negotitaion","content-negotiation"],["content-negotitation","content-negotiation"],["content-negotition","content-negotiation"],["content-negoziation","content-negotiation"],["contentended","contended"],["contentn","content"],["contentss","contents"],["contermporaneous","contemporaneous"],["conterpart","counterpart"],["conterparts","counterparts"],["contersink","countersink"],["contex","context"],["contexta","context"],["contexual","contextual"],["contiains","contains"],["contian","contain"],["contianed","contained"],["contianer","container"],["contianers","containers"],["contianing","containing"],["contians","contains"],["contibute","contribute"],["contibuted","contributed"],["contibutes","contributes"],["contibutor","contributor"],["contigent","contingent"],["contigious","contiguous"],["contigiously","contiguously"],["contignuous","contiguous"],["contigous","contiguous"],["contiguious","contiguous"],["contiguities","continuities"],["contiguos","contiguous"],["contiguous-non","non-contiguous"],["continaing","containing"],["contination","continuation"],["contined","continued"],["continential","continental"],["continging","containing"],["contingous","contiguous"],["continguous","contiguous"],["continious","continuous"],["continiously","continuously"],["continoue","continue"],["continouos","continuous"],["continous","continuous"],["continously","continuously"],["continueing","continuing"],["continuely","continually"],["continuem","continuum"],["continuos","continuous"],["continuosly","continuously"],["continure","continue"],["continusly","continuously"],["continuting","continuing"],["contious","continuous"],["contiously","continuously"],["contiuation","continuation"],["contiue","continue"],["contiuguous","contiguous"],["contiuing","continuing"],["contniue","continue"],["contniued","continued"],["contniues","continues"],["contnt","content"],["contol","control"],["contoler","controller"],["contoller","controller"],["contollers","controllers"],["contolls","controls"],["contols","controls"],["contongency","contingency"],["contorl","control"],["contorled","controlled"],["contorls","controls"],["contoroller","controller"],["contraciction","contradiction"],["contracictions","contradictions"],["contracition","contradiction"],["contracitions","contradictions"],["contracter","contractor"],["contracters","contractors"],["contradically","contradictory"],["contradictary","contradictory"],["contrain","constrain"],["contrainers","containers"],["contraining","constraining"],["contraint","constraint"],["contrainted","constrained"],["contraints","constraints"],["contraitns","constraints"],["contraveining","contravening"],["contravercial","controversial"],["contraversy","controversy"],["contrbution","contribution"],["contribte","contribute"],["contribted","contributed"],["contribtes","contributes"],["contributer","contributor"],["contributers","contributors"],["contries","countries"],["contrinution","contribution"],["contrinutions","contributions"],["contritutions","contributions"],["contriubte","contribute"],["contriubted","contributed"],["contriubtes","contributes"],["contriubting","contributing"],["contriubtion","contribution"],["contriubtions","contributions"],["contrl","control"],["contrller","controller"],["contro","control"],["controlable","controllable"],["controled","controlled"],["controlelrs","controllers"],["controler","controller"],["controlers","controllers"],["controling","controlling"],["controll","control"],["controllerd","controlled"],["controllled","controlled"],["controlller","controller"],["controlllers","controllers"],["controllling","controlling"],["controllor","controller"],["controlls","controls"],["contronl","control"],["contronls","controls"],["controoler","controller"],["controvercial","controversial"],["controvercy","controversy"],["controveries","controversies"],["controversal","controversial"],["controversey","controversy"],["controversials","controversial"],["controvertial","controversial"],["controvery","controversy"],["contrrol","control"],["contrrols","controls"],["contrst","contrast"],["contrsted","contrasted"],["contrsting","contrasting"],["contrsts","contrasts"],["contrtoller","controller"],["contruct","construct"],["contructed","constructed"],["contructing","constructing"],["contruction","construction"],["contructions","constructions"],["contructor","constructor"],["contructors","constructors"],["contructs","constructs"],["contry","country"],["contryie","countryie"],["contsruction","construction"],["contsructor","constructor"],["contstant","constant"],["contstants","constants"],["contstraint","constraint"],["contstructing","constructing"],["contstruction","construction"],["contstructor","constructor"],["contstructors","constructors"],["contur","contour"],["contzains","contains"],["conuntry","country"],["conusmer","consumer"],["convaless","convalesce"],["convax","convex"],["convaxiity","convexity"],["convaxly","convexly"],["convaxness","convexness"],["conveinence","convenience"],["conveinences","conveniences"],["conveinent","convenient"],["conveinience","convenience"],["conveinient","convenient"],["convenant","covenant"],["conveneince","convenience"],["conveniance","convenience"],["conveniant","convenient"],["conveniantly","conveniently"],["convenince","convenience"],["conveninent","convenient"],["convense","convince"],["convential","conventional"],["conventient","convenient"],["convenvient","convenient"],["conver","convert"],["convereted","converted"],["convergance","convergence"],["converion","conversion"],["converions","conversions"],["converison","conversion"],["converitble","convertible"],["conversly","conversely"],["conversoin","conversion"],["converson","conversion"],["conversons","conversions"],["converssion","conversion"],["converst","convert"],["convertable","convertible"],["convertables","convertibles"],["convertet","converted"],["convertion","conversion"],["convertions","conversions"],["convery","convert"],["convesion","conversion"],["convesions","conversions"],["convet","convert"],["conveted","converted"],["conveter","converter"],["conveters","converters"],["conveting","converting"],["convetion","convention"],["convetions","conventions"],["convets","converts"],["conveyer","conveyor"],["conviced","convinced"],["conviencece","convenience"],["convienence","convenience"],["convienent","convenient"],["convienience","convenience"],["convienient","convenient"],["convieniently","conveniently"],["conviently","conveniently"],["conviguration","configuration"],["convigure","configure"],["convination","combination"],["convine","combine"],["convineance","convenience"],["convineances","conveniences"],["convineient","convenient"],["convinence","convenience"],["convinences","conveniences"],["convinent","convenient"],["convinently","conveniently"],["conviniance","convenience"],["conviniances","conveniences"],["convinience","convenience"],["conviniences","conveniences"],["conviniency","convenience"],["conviniencys","conveniences"],["convinient","convenient"],["conviniently","conveniently"],["convining","combining"],["convinve","convince"],["convinved","convinced"],["convinving","convincing"],["convirted","converted"],["convirting","converting"],["convised","convinced"],["convoultion","convolution"],["convoultions","convolutions"],["convovle","convolve"],["convovled","convolved"],["convovling","convolving"],["convrt","convert"],["convserion","conversion"],["conyak","cognac"],["coodinate","coordinate"],["coodinates","coordinates"],["coodrinate","coordinate"],["coodrinates","coordinates"],["cooefficient","coefficient"],["cooefficients","coefficients"],["cooger","cougar"],["cookoo","cuckoo"],["coolent","coolant"],["coolot","culotte"],["coolots","culottes"],["coomand","command"],["coommand","command"],["coomon","common"],["coonstantly","constantly"],["coonstructed","constructed"],["cooordinate","coordinate"],["cooordinates","coordinates"],["coopearte","cooperate"],["coopeartes","cooperates"],["cooporative","cooperative"],["coordanate","coordinate"],["coordanates","coordinates"],["coordenate","coordinate"],["coordenates","coordinates"],["coordiante","coordinate"],["coordiantes","coordinates"],["coordiantion","coordination"],["coordiate","coordinate"],["coordiates","coordinates"],["coordiinates","coordinates"],["coordinatess","coordinates"],["coordinats","coordinates"],["coordindate","coordinate"],["coordindates","coordinates"],["coordine","coordinate"],["coordines","coordinates"],["coording","according"],["coordingate","coordinate"],["coordingates","coordinates"],["coordingly","accordingly"],["coordiniate","coordinate"],["coordiniates","coordinates"],["coordinite","coordinate"],["coordinites","coordinates"],["coordinnate","coordinate"],["coordinnates","coordinates"],["coordintae","coordinate"],["coordintaes","coordinates"],["coordintate","coordinate"],["coordintates","coordinates"],["coordinte","coordinate"],["coordintes","coordinates"],["coorditate","coordinate"],["coordonate","coordinate"],["coordonated","coordinated"],["coordonates","coordinates"],["coorespond","correspond"],["cooresponded","corresponded"],["coorespondend","correspondent"],["coorespondent","correspondent"],["cooresponding","corresponding"],["cooresponds","corresponds"],["cooridate","coordinate"],["cooridated","coordinated"],["cooridates","coordinates"],["cooridnate","coordinate"],["cooridnated","coordinated"],["cooridnates","coordinates"],["coorinate","coordinate"],["coorinates","coordinates"],["coorination","coordination"],["cootdinate","coordinate"],["cootdinated","coordinated"],["cootdinates","coordinates"],["cootdinating","coordinating"],["cootdination","coordination"],["copeing","copying"],["copiese","copies"],["copiing","copying"],["copiler","compiler"],["coplete","complete"],["copleted","completed"],["copletely","completely"],["copletes","completes"],["copmetitors","competitors"],["copmilation","compilation"],["copmonent","component"],["copmutations","computations"],["copntroller","controller"],["coponent","component"],["copoying","copying"],["coppermines","coppermine"],["coppied","copied"],["copright","copyright"],["coprighted","copyrighted"],["coprights","copyrights"],["coproccessor","coprocessor"],["coproccessors","coprocessors"],["coprocesor","coprocessor"],["coprorate","corporate"],["coprorates","corporates"],["coproration","corporation"],["coprorations","corporations"],["coprright","copyright"],["coprrighted","copyrighted"],["coprrights","copyrights"],["copstruction","construction"],["copuright","copyright"],["copurighted","copyrighted"],["copurights","copyrights"],["copute","compute"],["coputed","computed"],["coputer","computer"],["coputes","computes"],["copver","cover"],["copyed","copied"],["copyeight","copyright"],["copyeighted","copyrighted"],["copyeights","copyrights"],["copyied","copied"],["copyrigth","copyright"],["copyrigthed","copyrighted"],["copyrigths","copyrights"],["copyritght","copyright"],["copyritghted","copyrighted"],["copyritghts","copyrights"],["copyrught","copyright"],["copyrughted","copyrighted"],["copyrughts","copyrights"],["copys","copies"],["copytight","copyright"],["copytighted","copyrighted"],["copytights","copyrights"],["copyting","copying"],["corale","chorale"],["cordinate","coordinate"],["cordinates","coordinates"],["cordoroy","corduroy"],["cordump","coredump"],["corecct","correct"],["corecctly","correctly"],["corect","correct"],["corected","corrected"],["corecting","correcting"],["corection","correction"],["corectly","correctly"],["corectness","correctness"],["corects","corrects"],["coreespond","correspond"],["coregated","corrugated"],["corelate","correlate"],["corelated","correlated"],["corelates","correlates"],["corellation","correlation"],["coreolis","Coriolis"],["corerct","correct"],["corerctly","correctly"],["corespond","correspond"],["coresponded","corresponded"],["corespondence","correspondence"],["coresponding","corresponding"],["coresponds","corresponds"],["corfirms","confirms"],["coridal","cordial"],["corispond","correspond"],["cornmitted","committed"],["corordinate","coordinate"],["corordinates","coordinates"],["corordination","coordination"],["corosbonding","corresponding"],["corosion","corrosion"],["corospond","correspond"],["corospondance","correspondence"],["corosponded","corresponded"],["corospondence","correspondence"],["corosponding","corresponding"],["corosponds","corresponds"],["corousel","carousel"],["corparate","corporate"],["corperations","corporations"],["corpration","corporation"],["corproration","corporation"],["corprorations","corporations"],["corrcect","correct"],["corrct","correct"],["corrdinate","coordinate"],["corrdinated","coordinated"],["corrdinates","coordinates"],["corrdinating","coordinating"],["corrdination","coordination"],["corrdinator","coordinator"],["corrdinators","coordinators"],["correclty","correctly"],["correcly","correctly"],["correcpond","correspond"],["correcponded","corresponded"],["correcponding","corresponding"],["correcponds","corresponds"],["correcs","corrects"],["correctably","correctable"],["correctely","correctly"],["correcters","correctors"],["correctlly","correctly"],["correctnes","correctness"],["correcton","correction"],["correctons","corrections"],["correcttness","correctness"],["correctures","correctors"],["correcty","correctly"],["correctyly","correctly"],["correcxt","correct"],["correcy","correct"],["correect","correct"],["correectly","correctly"],["correespond","correspond"],["correesponded","corresponded"],["correespondence","correspondence"],["correespondences","correspondences"],["correespondent","correspondent"],["correesponding","corresponding"],["correesponds","corresponds"],["correlasion","correlation"],["correlatd","correlated"],["correllate","correlate"],["correllation","correlation"],["correllations","correlations"],["correnspond","correspond"],["corrensponded","corresponded"],["correnspondence","correspondence"],["correnspondences","correspondences"],["correnspondent","correspondent"],["correnspondents","correspondents"],["corrensponding","corresponding"],["corrensponds","corresponds"],["correograph","choreograph"],["correponding","corresponding"],["correponds","corresponds"],["correponsing","corresponding"],["correposding","corresponding"],["correpsondence","correspondence"],["correpsonding","corresponding"],["corresond","correspond"],["corresonded","corresponded"],["corresonding","corresponding"],["corresonds","corresponds"],["correspdoning","corresponding"],["correspending","corresponding"],["correspinding","corresponding"],["correspnding","corresponding"],["correspodence","correspondence"],["correspoding","corresponding"],["correspoinding","corresponding"],["correspomd","correspond"],["correspomded","corresponded"],["correspomdence","correspondence"],["correspomdences","correspondences"],["correspomdent","correspondent"],["correspomdents","correspondents"],["correspomding","corresponding"],["correspomds","corresponds"],["correspon","correspond"],["correspondance","correspondence"],["correspondances","correspondences"],["correspondant","correspondent"],["correspondants","correspondents"],["correspondd","corresponded"],["correspondend","correspondent"],["correspondes","corresponds"],["correspondg","corresponding"],["correspondig","corresponding"],["corresponed","corresponded"],["corresponging","corresponding"],["corresponing","corresponding"],["correspons","corresponds"],["corresponsding","corresponding"],["corresponsing","corresponding"],["correspont","correspond"],["correspontence","correspondence"],["correspontences","correspondences"],["correspontend","correspondent"],["correspontent","correspondent"],["correspontents","correspondents"],["corresponting","corresponding"],["corresponts","corresponds"],["correspoond","correspond"],["corressponding","corresponding"],["corret","correct"],["correted","corrected"],["corretion","correction"],["corretly","correctly"],["corridoor","corridor"],["corridoors","corridors"],["corrispond","correspond"],["corrispondant","correspondent"],["corrispondants","correspondents"],["corrisponded","corresponded"],["corrispondence","correspondence"],["corrispondences","correspondences"],["corrisponding","corresponding"],["corrisponds","corresponds"],["corrleation","correlation"],["corrleations","correlations"],["corrolated","correlated"],["corrolates","correlates"],["corrolation","correlation"],["corrolations","correlations"],["corrrect","correct"],["corrrected","corrected"],["corrrecting","correcting"],["corrrection","correction"],["corrrections","corrections"],["corrrectly","correctly"],["corrrectness","correctness"],["corrrects","corrects"],["corrresponding","corresponding"],["corrresponds","corresponds"],["corrrupt","corrupt"],["corrrupted","corrupted"],["corrruption","corruption"],["corrseponding","corresponding"],["corrspond","correspond"],["corrsponded","corresponded"],["corrsponding","corresponding"],["corrsponds","corresponds"],["corrupeted","corrupted"],["corruptable","corruptible"],["corruptiuon","corruption"],["cors-site","cross-site"],["cors-sute","cross-site"],["corse","course"],["corsor","cursor"],["corss-compiling","cross-compiling"],["corss-site","cross-site"],["corss-sute","cross-site"],["corsshair","crosshair"],["corsshairs","crosshairs"],["corssite","cross-site"],["corsssite","cross-site"],["corsssute","cross-site"],["corssute","cross-site"],["corupt","corrupt"],["corupted","corrupted"],["coruption","corruption"],["coruptions","corruptions"],["corupts","corrupts"],["corus","chorus"],["corvering","covering"],["cosed","closed"],["cosnsrain","constrain"],["cosnsrained","constrained"],["cosntitutive","constitutive"],["cosntrain","constrain"],["cosntrained","constrained"],["cosntraining","constraining"],["cosntraint","constraint"],["cosntraints","constraints"],["cosntructed","constructed"],["cosntructor","constructor"],["cosnumer","consumer"],["cosolation","consolation"],["cosole","console"],["cosoled","consoled"],["cosoles","consoles"],["cosoling","consoling"],["costant","constant"],["costexpr","constexpr"],["costitution","constitution"],["costruct","construct"],["costructer","constructor"],["costructor","constructor"],["costumary","customary"],["costumize","customize"],["cotain","contain"],["cotained","contained"],["cotainer","container"],["cotains","contains"],["cotave","octave"],["cotaves","octaves"],["cotnain","contain"],["cotnained","contained"],["cotnainer","container"],["cotnainers","containers"],["cotnaining","containing"],["cotnains","contains"],["cotranser","cotransfer"],["cotrasferred","cotransferred"],["cotrasfers","cotransfers"],["cotrol","control"],["cotroll","control"],["cotrolled","controlled"],["cotroller","controller"],["cotrolles","controls"],["cotrolling","controlling"],["cotrolls","controls"],["cotrols","controls"],["cotten","cotton"],["coucil","council"],["coud","could"],["coudn't","couldn't"],["coudnt","couldn't"],["coul","could"],["could'nt","couldn't"],["could't","couldn't"],["couldent","couldn't"],["coulden`t","couldn't"],["couldn;t","couldn't"],["couldnt'","couldn't"],["couldnt","couldn't"],["couldnt;","couldn't"],["coulmns","columns"],["couln't","couldn't"],["couloumb","coulomb"],["coult","could"],["coummunities","communities"],["coummunity","community"],["coumpound","compound"],["coumpounds","compounds"],["counded","counted"],["counding","counting"],["coundition","condition"],["counds","counts"],["counld","could"],["counpound","compound"],["counpounds","compounds"],["countain","contain"],["countainer","container"],["countainers","containers"],["countains","contains"],["counterfit","counterfeit"],["counterfits","counterfeits"],["counterintuive","counter intuitive"],["countermeausure","countermeasure"],["countermeausures","countermeasures"],["counterpar","counterpart"],["counterpoart","counterpart"],["counterpoarts","counterparts"],["countinue","continue"],["courtesey","courtesy"],["cousing","cousin"],["couted","counted"],["couter","counter"],["coutermeasuere","countermeasure"],["coutermeasueres","countermeasures"],["coutermeasure","countermeasure"],["coutermeasures","countermeasures"],["couterpart","counterpart"],["couting","counting"],["coutner","counter"],["coutners","counters"],["couuld","could"],["couuldn't","couldn't"],["covarage","coverage"],["covarages","coverages"],["covarege","coverage"],["covection","convection"],["covention","convention"],["coventions","conventions"],["coverd","covered"],["covere","cover"],["coveres","covers"],["covergence","convergence"],["coverred","covered"],["coversion","conversion"],["coversions","conversions"],["coverting","converting"],["covnersion","conversion"],["covnert","convert"],["covnerted","converted"],["covnerter","converter"],["covnerters","converters"],["covnertible","convertible"],["covnerting","converting"],["covnertor","converter"],["covnertors","converters"],["covnerts","converts"],["covriance","covariance"],["covriate","covariate"],["covriates","covariates"],["coyp","copy"],["coypright","copyright"],["coyprighted","copyrighted"],["coyprights","copyrights"],["coyright","copyright"],["coyrighted","copyrighted"],["coyrights","copyrights"],["cpacities","capacities"],["cpacity","capacity"],["cpation","caption"],["cpcheck","cppcheck"],["cpontent","content"],["cppp","cpp"],["cpuld","could"],["craced","graced"],["craceful","graceful"],["cracefully","gracefully"],["cracefulness","gracefulness"],["craceless","graceless"],["cracing","gracing"],["crahed","crashed"],["crahes","crashes"],["crahses","crashes"],["crashaes","crashes"],["crasheed","crashed"],["crashees","crashes"],["crashess","crashes"],["crashign","crashing"],["crashs","crashes"],["crationist","creationist"],["crationists","creationists"],["creaate","create"],["creadential","credential"],["creadentialed","credentialed"],["creadentials","credentials"],["creaed","created"],["creaeted","created"],["creasoat","creosote"],["creastor","creator"],["creatation","creation"],["createa","create"],["createable","creatable"],["createdd","created"],["createing","creating"],["createive","creative"],["creatning","creating"],["creatre","create"],["creatred","created"],["creats","creates"],["credate","created"],["credetial","credential"],["credetials","credentials"],["credidential","credential"],["credidentials","credentials"],["credintial","credential"],["credintials","credentials"],["credis","credits"],["credists","credits"],["creditted","credited"],["creedence","credence"],["cresent","crescent"],["cresits","credits"],["cretae","create"],["cretaed","created"],["cretaes","creates"],["cretaing","creating"],["cretate","create"],["cretated","created"],["cretates","creates"],["cretating","creating"],["cretator","creator"],["cretators","creators"],["creted","created"],["creteria","criteria"],["crewsant","croissant"],["cricital","critical"],["cricitally","critically"],["cricitals","criticals"],["crirical","critical"],["crirically","critically"],["criricals","criticals"],["critcal","critical"],["critcally","critically"],["critcals","criticals"],["critcial","critical"],["critcially","critically"],["critcials","criticals"],["criteak","critique"],["critera","criteria"],["critereon","criterion"],["criterias","criteria"],["criteriom","criterion"],["criticial","critical"],["criticially","critically"],["criticials","criticals"],["criticists","critics"],["critiera","criteria"],["critiical","critical"],["critiically","critically"],["critiicals","criticals"],["critisising","criticising"],["critisism","criticism"],["critisisms","criticisms"],["critized","criticized"],["critizing","criticizing"],["croch","crotch"],["crockadile","crocodile"],["crockodiles","crocodiles"],["cronological","chronological"],["cronologically","chronologically"],["croppped","cropped"],["cros","cross"],["cros-site","cross-site"],["cros-sute","cross-site"],["croshet","crochet"],["crosreference","cross-reference"],["crosreferenced","cross-referenced"],["crosreferences","cross-references"],["cross-commpilation","cross-compilation"],["cross-orgin","cross-origin"],["crossgne","crossgen"],["crossin","crossing"],["crossite","cross-site"],["crossreference","cross-reference"],["crossreferenced","cross-referenced"],["crossreferences","cross-references"],["crosssite","cross-site"],["crosssute","cross-site"],["crossute","cross-site"],["crowdsigna","crowdsignal"],["crowkay","croquet"],["crowm","crown"],["crrespond","correspond"],["crsytal","crystal"],["crsytalline","crystalline"],["crsytallisation","crystallisation"],["crsytallise","crystallise"],["crsytallization","crystallization"],["crsytallize","crystallize"],["crsytallographic","crystallographic"],["crsytals","crystals"],["crtical","critical"],["crtically","critically"],["crticals","criticals"],["crticised","criticised"],["crucialy","crucially"],["crucifiction","crucifixion"],["cruncing","crunching"],["crurrent","current"],["crusies","cruises"],["crusor","cursor"],["crutial","crucial"],["crutially","crucially"],["crutialy","crucially"],["crypted","encrypted"],["cryptocraphic","cryptographic"],["cryptograpic","cryptographic"],["crystalisation","crystallisation"],["cryto","crypto"],["crytpo","crypto"],["csae","case"],["csaes","cases"],["cteate","create"],["cteateing","creating"],["cteater","creator"],["cteates","creates"],["cteating","creating"],["cteation","creation"],["cteations","creations"],["cteator","creator"],["ctificate","certificate"],["ctificated","certificated"],["ctificates","certificates"],["ctification","certification"],["cuasality","causality"],["cuasation","causation"],["cuase","cause"],["cuased","caused"],["cuases","causes"],["cuasing","causing"],["cuestion","question"],["cuestioned","questioned"],["cuestions","questions"],["cuileoga","cuileog"],["culiminating","culminating"],["cumlative","cumulative"],["cummand","command"],["cummulated","cumulated"],["cummulative","cumulative"],["cummunicate","communicate"],["cumulatative","cumulative"],["cumulattive","cumulative"],["cuncurency","concurrency"],["curch","church"],["curcuit","circuit"],["curcuits","circuits"],["curcumstance","circumstance"],["curcumstances","circumstances"],["cureful","careful"],["curefully","carefully"],["curefuly","carefully"],["curent","current"],["curentfilter","currentfilter"],["curently","currently"],["curernt","current"],["curerntly","currently"],["curev","curve"],["curevd","curved"],["curevs","curves"],["curiousities","curiosities"],["curiousity's","curiosity's"],["curiousity","curiosity"],["curnilinear","curvilinear"],["currecnies","currencies"],["currecny","currency"],["currected","corrected"],["currecting","correcting"],["curreent","current"],["curreents","currents"],["curremt","current"],["curremtly","currently"],["curremts","currents"],["curren","current"],["currenlty","currently"],["currenly","currently"],["currennt","current"],["currenntly","currently"],["currennts","currents"],["currentl","currently"],["currentlly","currently"],["currentry","currently"],["currenty","currently"],["curresponding","corresponding"],["curretly","currently"],["curretnly","currently"],["curriculem","curriculum"],["currious","curious"],["currnet","current"],["currnt","current"],["currntly","currently"],["curros","cursor"],["currrency","currency"],["currrent","current"],["currrently","currently"],["curruent","current"],["currupt","corrupt"],["curruptable","corruptible"],["currupted","corrupted"],["curruptible","corruptible"],["curruption","corruption"],["curruptions","corruptions"],["currupts","corrupts"],["currus","cirrus"],["curser","cursor"],["cursot","cursor"],["cursro","cursor"],["curvatrue","curvature"],["curvatrues","curvatures"],["curvelinear","curvilinear"],["cusstom","custom"],["cusstomer","customer"],["cusstomers","customers"],["cusstomizable","customizable"],["cusstomization","customization"],["cusstomize","customize"],["cusstomized","customized"],["cusstoms","customs"],["custoisable","customisable"],["custoisation","customisation"],["custoise","customise"],["custoised","customised"],["custoiser","customiser"],["custoisers","customisers"],["custoising","customising"],["custoizable","customizable"],["custoization","customization"],["custoize","customize"],["custoized","customized"],["custoizer","customizer"],["custoizers","customizers"],["custoizing","customizing"],["customable","customizable"],["customie","customize"],["customied","customized"],["customisaton","customisation"],["customisatons","customisations"],["customizaton","customization"],["customizatons","customizations"],["customizeble","customizable"],["customn","custom"],["customns","customs"],["customsied","customised"],["customzied","customized"],["custon","custom"],["custonary","customary"],["custoner","customer"],["custoners","customers"],["custonisable","customisable"],["custonisation","customisation"],["custonise","customise"],["custonised","customised"],["custoniser","customiser"],["custonisers","customisers"],["custonising","customising"],["custonizable","customizable"],["custonization","customization"],["custonize","customize"],["custonized","customized"],["custonizer","customizer"],["custonizers","customizers"],["custonizing","customizing"],["custons","customs"],["custormer","customer"],["custum","custom"],["custumer","customer"],["custumised","customised"],["custumized","customized"],["custums","customs"],["cutom","custom"],["cutted","cut"],["cuurently","currently"],["cuurrent","current"],["cuurrents","currents"],["cvignore","cvsignore"],["cxan","cyan"],["cycic","cyclic"],["cyclinder","cylinder"],["cyclinders","cylinders"],["cycular","circular"],["cygin","cygwin"],["cylcic","cyclic"],["cylcical","cyclical"],["cyle","cycle"],["cylic","cyclic"],["cylider","cylinder"],["cyliders","cylinders"],["cylindical","cylindrical"],["cylindre","cylinder"],["cyllinder","cylinder"],["cyllinders","cylinders"],["cylnder","cylinder"],["cylnders","cylinders"],["cylynders","cylinders"],["cymk","CMYK"],["cyphersuite","ciphersuite"],["cyphersuites","ciphersuites"],["cyphertext","ciphertext"],["cyphertexts","ciphertexts"],["cyprt","crypt"],["cyprtic","cryptic"],["cyprto","crypto"],["Cyrllic","Cyrillic"],["cyrpto","crypto"],["cyrrent","current"],["cyrrilic","Cyrillic"],["cyrstal","crystal"],["cyrstalline","crystalline"],["cyrstallisation","crystallisation"],["cyrstallise","crystallise"],["cyrstallization","crystallization"],["cyrstallize","crystallize"],["cyrstals","crystals"],["cyrto","crypto"],["cywgin","Cygwin"],["daa","data"],["dabase","database"],["daclaration","declaration"],["dacquiri","daiquiri"],["dadlock","deadlock"],["daed","dead"],["dafault","default"],["dafaults","defaults"],["dafaut","default"],["dafualt","default"],["dafualted","defaulted"],["dafualts","defaults"],["daita","data"],["dake","take"],["dalmation","Dalmatian"],["dalta","delta"],["damamge","damage"],["damamged","damaged"],["damamges","damages"],["damamging","damaging"],["damange","damage"],["damanged","damaged"],["damanges","damages"],["damanging","damaging"],["damenor","demeanor"],["damge","damage"],["dammage","damage"],["dammages","damages"],["danceing","dancing"],["dandidates","candidates"],["daplicating","duplicating"],["Dardenelles","Dardanelles"],["dasboard","dashboard"],["dasboards","dashboards"],["dasdot","dashdot"],["dashbaord","dashboard"],["dashbaords","dashboards"],["dashboad","dashboard"],["dashboads","dashboards"],["dashboar","dashboard"],["dashboars","dashboards"],["dashbord","dashboard"],["dashbords","dashboards"],["dashs","dashes"],["data-strcuture","data-structure"],["data-strcutures","data-structures"],["databaase","database"],["databaases","databases"],["databae","database"],["databaes","database"],["databaeses","databases"],["databas","database"],["databsae","database"],["databsaes","databases"],["databse","database"],["databses","databases"],["datadsir","datadir"],["dataet","dataset"],["dataets","datasets"],["datas","data"],["datastrcuture","datastructure"],["datastrcutures","datastructures"],["datastrem","datastream"],["datatbase","database"],["datatbases","databases"],["datatgram","datagram"],["datatgrams","datagrams"],["datatore","datastore"],["datatores","datastores"],["datatpe","datatype"],["datatpes","datatypes"],["datatpye","datatype"],["datatpyes","datatypes"],["datatset","dataset"],["datatsets","datasets"],["datatstructure","datastructure"],["datatstructures","datastructures"],["datattype","datatype"],["datattypes","datatypes"],["datatye","datatype"],["datatyep","datatype"],["datatyepe","datatype"],["datatyepes","datatypes"],["datatyeps","datatypes"],["datatyes","datatypes"],["datatyoe","datatype"],["datatyoes","datatypes"],["datatytpe","datatype"],["datatytpes","datatypes"],["dataum","datum"],["datbase","database"],["datbases","databases"],["datecreatedd","datecreated"],["datection","detection"],["datections","detections"],["datee","date"],["dateset","dataset"],["datesets","datasets"],["datset","dataset"],["datsets","datasets"],["daugher","daughter"],["daugther","daughter"],["daugthers","daughters"],["dbeian","Debian"],["DCHP","DHCP"],["dcok","dock"],["dcoked","docked"],["dcoker","docker"],["dcoking","docking"],["dcoks","docks"],["dcument","document"],["dcumented","documented"],["dcumenting","documenting"],["dcuments","documents"],["ddelete","delete"],["de-actived","deactivated"],["de-duplacate","de-duplicate"],["de-duplacated","de-duplicated"],["de-duplacates","de-duplicates"],["de-duplacation","de-duplication"],["de-duplacte","de-duplicate"],["de-duplacted","de-duplicated"],["de-duplactes","de-duplicates"],["de-duplaction","de-duplication"],["de-duplaicate","de-duplicate"],["de-duplaicated","de-duplicated"],["de-duplaicates","de-duplicates"],["de-duplaication","de-duplication"],["de-duplate","de-duplicate"],["de-duplated","de-duplicated"],["de-duplates","de-duplicates"],["de-duplation","de-duplication"],["de-fualt","default"],["de-fualts","defaults"],["de-registeres","de-registers"],["deacitivation","deactivation"],["deacitvated","deactivated"],["deactivatiion","deactivation"],["deactive","deactivate"],["deactiveate","deactivate"],["deactived","deactivated"],["deactivete","deactivate"],["deactiveted","deactivated"],["deactivetes","deactivates"],["deactiviate","deactivate"],["deactiviates","deactivates"],["deactiving","deactivating"],["deaemon","daemon"],["deafault","default"],["deafualt","default"],["deafualts","defaults"],["deafult","default"],["deafulted","defaulted"],["deafults","defaults"],["deail","deal"],["deailing","dealing"],["deaktivate","deactivate"],["deaktivated","deactivated"],["dealed","dealt"],["dealilng","dealing"],["dealloacte","deallocate"],["deallocaed","deallocated"],["dealocate","deallocate"],["dealte","delete"],["deamand","demand"],["deamanding","demanding"],["deamands","demands"],["deambigate","disambiguate"],["deambigates","disambiguates"],["deambigation","disambiguation"],["deambiguage","disambiguate"],["deambiguages","disambiguates"],["deambiguate","disambiguate"],["deambiguates","disambiguates"],["deambiguation","disambiguation"],["deamiguate","disambiguate"],["deamiguates","disambiguates"],["deamiguation","disambiguation"],["deamon","daemon"],["deamonisation","daemonisation"],["deamonise","daemonise"],["deamonised","daemonised"],["deamonises","daemonises"],["deamonising","daemonising"],["deamonization","daemonization"],["deamonize","daemonize"],["deamonized","daemonized"],["deamonizes","daemonizes"],["deamonizing","daemonizing"],["deamons","daemons"],["deassering","deasserting"],["deatch","detach"],["deatched","detached"],["deatches","detaches"],["deatching","detaching"],["deatil","detail"],["deatiled","detailed"],["deatiling","detailing"],["deatils","details"],["deativate","deactivate"],["deativated","deactivated"],["deativates","deactivates"],["deativation","deactivation"],["deattach","detach"],["deattached","detached"],["deattaches","detaches"],["deattaching","detaching"],["deattachment","detachment"],["deault","default"],["deaults","defaults"],["deauthenication","deauthentication"],["debain","Debian"],["debateable","debatable"],["debbuger","debugger"],["debehlper","debhelper"],["debgu","debug"],["debgug","debug"],["debguging","debugging"],["debhlper","debhelper"],["debia","Debian"],["debiab","Debian"],["debians","Debian's"],["debina","Debian"],["debloking","deblocking"],["debnia","Debian"],["debth","depth"],["debths","depths"],["debudg","debug"],["debudgged","debugged"],["debudgger","debugger"],["debudgging","debugging"],["debudgs","debugs"],["debufs","debugfs"],["debugee","debuggee"],["debuger","debugger"],["debugg","debug"],["debuggg","debug"],["debuggge","debuggee"],["debuggged","debugged"],["debugggee","debuggee"],["debuggger","debugger"],["debuggging","debugging"],["debugggs","debugs"],["debugginf","debugging"],["debuggs","debugs"],["debuging","debugging"],["decaffinated","decaffeinated"],["decalare","declare"],["decalared","declared"],["decalares","declares"],["decalaring","declaring"],["decalration","declaration"],["decalrations","declarations"],["decalratiosn","declarations"],["decapsulting","decapsulating"],["decathalon","decathlon"],["deccelerate","decelerate"],["deccelerated","decelerated"],["deccelerates","decelerates"],["deccelerating","decelerating"],["decceleration","deceleration"],["deccrement","decrement"],["deccremented","decremented"],["deccrements","decrements"],["Decemer","December"],["decend","descend"],["decendant","descendant"],["decendants","descendants"],["decendentant","descendant"],["decendentants","descendants"],["decending","descending"],["deciaml","decimal"],["deciamls","decimals"],["decices","decides"],["decidate","dedicate"],["decidated","dedicated"],["decidates","dedicates"],["decideable","decidable"],["decidely","decidedly"],["decie","decide"],["deciedd","decided"],["deciede","decide"],["decieded","decided"],["deciedes","decides"],["decieding","deciding"],["decieds","decides"],["deciemal","decimal"],["decies","decides"],["decieve","deceive"],["decieved","deceived"],["decieves","deceives"],["decieving","deceiving"],["decimials","decimals"],["decison","decision"],["decission","decision"],["declar","declare"],["declaraion","declaration"],["declaraions","declarations"],["declarated","declared"],["declaratinos","declarations"],["declaratiom","declaration"],["declaraton","declaration"],["declaratons","declarations"],["declarayion","declaration"],["declarayions","declarations"],["declard","declared"],["declarded","declared"],["declaritive","declarative"],["declaritively","declaratively"],["declarnig","declaring"],["declartated","declared"],["declartation","declaration"],["declartations","declarations"],["declartative","declarative"],["declartator","declarator"],["declartators","declarators"],["declarted","declared"],["declartion","declaration"],["declartions","declarations"],["declartiuon","declaration"],["declartiuons","declarations"],["declartiuve","declarative"],["declartive","declarative"],["declartor","declarator"],["declartors","declarators"],["declataions","declarations"],["declatation","declaration"],["declatations","declarations"],["declated","declared"],["declation","declaration"],["declations","declarations"],["declatory","declaratory"],["decleration","declaration"],["declerations","declarations"],["declration","declaration"],["decocde","decode"],["decocded","decoded"],["decocder","decoder"],["decocders","decoders"],["decocdes","decodes"],["decocding","decoding"],["decocdings","decodings"],["decodded","decoded"],["decodding","decoding"],["decodeing","decoding"],["decomissioned","decommissioned"],["decomissioning","decommissioning"],["decommissionn","decommission"],["decommissionned","decommissioned"],["decommpress","decompress"],["decomoposition","decomposition"],["decomposion","decomposition"],["decomposit","decompose"],["decomposited","decomposed"],["decompositing","decomposing"],["decompositon","decomposition"],["decompositons","decompositions"],["decomposits","decomposes"],["decompostion","decomposition"],["decompostition","decomposition"],["decompres","decompress"],["decompresed","decompressed"],["decompreser","decompressor"],["decompreses","decompresses"],["decompresing","decompressing"],["decompresion","decompression"],["decompresor","decompressor"],["decompressd","decompressed"],["decompresser","decompressor"],["decompresssion","decompression"],["decompse","decompose"],["decond","decode"],["deconde","decode"],["deconded","decoded"],["deconder","decoder"],["deconders","decoders"],["decondes","decodes"],["deconding","decoding"],["decondings","decodings"],["deconstract","deconstruct"],["deconstracted","deconstructed"],["deconstrcutor","deconstructor"],["decopose","decompose"],["decoposes","decomposes"],["decoraded","decorated"],["decoratrion","decoration"],["decorde","decode"],["decorded","decoded"],["decorder","decoder"],["decorders","decoders"],["decordes","decodes"],["decording","decoding"],["decordings","decodings"],["decorrellation","decorrelation"],["decortator","decorator"],["decortive","decorative"],["decose","decode"],["decosed","decoded"],["decoser","decoder"],["decosers","decoders"],["decoses","decodes"],["decosing","decoding"],["decosings","decodings"],["decration","decoration"],["decreace","decrease"],["decreas","decrease"],["decremenet","decrement"],["decremenetd","decremented"],["decremeneted","decremented"],["decrese","decrease"],["decress","decrees"],["decribe","describe"],["decribed","described"],["decribes","describes"],["decribing","describing"],["decriptive","descriptive"],["decriptor","descriptor"],["decriptors","descriptors"],["decrmenet","decrement"],["decrmenetd","decremented"],["decrmeneted","decremented"],["decrment","decrement"],["decrmented","decremented"],["decrmenting","decrementing"],["decrments","decrements"],["decroation","decoration"],["decrpt","decrypt"],["decrpted","decrypted"],["decrption","decryption"],["decrytion","decryption"],["decscription","description"],["decsion","decision"],["decsions","decisions"],["decsiptors","descriptors"],["decsribed","described"],["decsriptor","descriptor"],["decsriptors","descriptors"],["decstiption","description"],["decstiptions","descriptions"],["dectect","detect"],["dectected","detected"],["dectecting","detecting"],["dectection","detection"],["dectections","detections"],["dectector","detector"],["dectivate","deactivate"],["decutable","deductible"],["decutables","deductibles"],["decypher","decipher"],["decyphered","deciphered"],["ded","dead"],["dedault","default"],["dedections","detections"],["dedented","indented"],["dedfined","defined"],["dedidate","dedicate"],["dedidated","dedicated"],["dedidates","dedicates"],["dedly","deadly"],["deductable","deductible"],["deductables","deductibles"],["deduplacate","deduplicate"],["deduplacated","deduplicated"],["deduplacates","deduplicates"],["deduplacation","deduplication"],["deduplacte","deduplicate"],["deduplacted","deduplicated"],["deduplactes","deduplicates"],["deduplaction","deduplication"],["deduplaicate","deduplicate"],["deduplaicated","deduplicated"],["deduplaicates","deduplicates"],["deduplaication","deduplication"],["deduplate","deduplicate"],["deduplated","deduplicated"],["deduplates","deduplicates"],["deduplation","deduplication"],["dedupliate","deduplicate"],["dedupliated","deduplicated"],["deecorator","decorator"],["deeep","deep"],["deelte","delete"],["deendencies","dependencies"],["deendency","dependency"],["defail","detail"],["defailt","default"],["defalt","default"],["defalts","defaults"],["defalut","default"],["defargkey","defragkey"],["defatult","default"],["defaukt","default"],["defaul","default"],["defaulat","default"],["defaulats","defaults"],["defauld","default"],["defaulds","defaults"],["defaule","default"],["defaules","defaults"],["defaulf","default"],["defaulfs","defaults"],["defaulg","default"],["defaulgs","defaults"],["defaulh","default"],["defaulhs","defaults"],["defauling","defaulting"],["defaulit","default"],["defaulits","defaults"],["defaulkt","default"],["defaulkts","defaults"],["defaull","default"],["defaulls","defaults"],["defaullt","default"],["defaullts","defaults"],["defaulr","default"],["defaulrs","defaults"],["defaulrt","default"],["defaulrts","defaults"],["defaultet","defaulted"],["defaulty","default"],["defauly","default"],["defaulys","defaults"],["defaut","default"],["defautl","default"],["defautled","defaulted"],["defautling","defaulting"],["defautls","defaults"],["defautlt","default"],["defautly","default"],["defauts","defaults"],["defautt","default"],["defautted","defaulted"],["defautting","defaulting"],["defautts","defaults"],["defeault","default"],["defeaulted","defaulted"],["defeaulting","defaulting"],["defeaults","defaults"],["defecit","deficit"],["defeine","define"],["defeines","defines"],["defenate","definite"],["defenately","definitely"],["defendent","defendant"],["defendents","defendants"],["defenitely","definitely"],["defenition","definition"],["defenitions","definitions"],["defenitly","definitely"],["deferal","deferral"],["deferals","deferrals"],["deferance","deference"],["defered","deferred"],["deferencing","dereferencing"],["deferentiating","differentiating"],["defering","deferring"],["deferreal","deferral"],["deffensively","defensively"],["defferently","differently"],["deffering","differing"],["defferred","deferred"],["deffine","define"],["deffined","defined"],["deffinition","definition"],["deffinitively","definitively"],["deffirent","different"],["defiantely","defiantly"],["defice","device"],["defien","define"],["defiend","defined"],["defiened","defined"],["defin","define"],["definad","defined"],["definance","defiance"],["definate","definite"],["definately","definitely"],["defination","definition"],["definations","definitions"],["definatly","definitely"],["definding","defining"],["defineas","defines"],["defineed","defined"],["definend","defined"],["definete","definite"],["definetelly","definitely"],["definetely","definitely"],["definetly","definitely"],["definiation","definition"],["definied","defined"],["definietly","definitely"],["definifiton","definition"],["definining","defining"],["defininition","definition"],["defininitions","definitions"],["definintion","definition"],["definit","definite"],["definitian","definition"],["definitiion","definition"],["definitiions","definitions"],["definitio","definition"],["definitios","definitions"],["definitivly","definitively"],["definitly","definitely"],["definitoin","definition"],["definiton","definition"],["definitons","definitions"],["definned","defined"],["definnition","definition"],["defintian","definition"],["defintiion","definition"],["defintiions","definitions"],["defintion","definition"],["defintions","definitions"],["defintition","definition"],["defintivly","definitively"],["defition","definition"],["defitions","definitions"],["deflaut","default"],["defninition","definition"],["defninitions","definitions"],["defnitions","definitions"],["defore","before"],["defqault","default"],["defragmenation","defragmentation"],["defualt","default"],["defualtdict","defaultdict"],["defualts","defaults"],["defult","default"],["defulted","defaulted"],["defulting","defaulting"],["defults","defaults"],["degenarate","degenerate"],["degenarated","degenerated"],["degenarating","degenerating"],["degenaration","degeneration"],["degenracy","degeneracy"],["degenrate","degenerate"],["degenrated","degenerated"],["degenrates","degenerates"],["degenratet","degenerated"],["degenrating","degenerating"],["degenration","degeneration"],["degerate","degenerate"],["degeree","degree"],["degnerate","degenerate"],["degnerated","degenerated"],["degnerates","degenerates"],["degrads","degrades"],["degration","degradation"],["degredation","degradation"],["degreee","degree"],["degreeee","degree"],["degreeees","degrees"],["degreees","degrees"],["deifne","define"],["deifned","defined"],["deifnes","defines"],["deifning","defining"],["deimiter","delimiter"],["deine","define"],["deinitailse","deinitialise"],["deinitailze","deinitialize"],["deinitalized","deinitialized"],["deinstantating","deinstantiating"],["deintialize","deinitialize"],["deintialized","deinitialized"],["deintializing","deinitializing"],["deisgn","design"],["deisgned","designed"],["deisgner","designer"],["deisgners","designers"],["deisgning","designing"],["deisgns","designs"],["deivative","derivative"],["deivatives","derivatives"],["deivce","device"],["deivces","devices"],["deivices","devices"],["deklaration","declaration"],["dekstop","desktop"],["dekstops","desktops"],["dektop","desktop"],["dektops","desktops"],["delagate","delegate"],["delagates","delegates"],["delaloc","delalloc"],["delalyed","delayed"],["delapidated","dilapidated"],["delaraction","declaration"],["delaractions","declarations"],["delarations","declarations"],["delare","declare"],["delared","declared"],["delares","declares"],["delaring","declaring"],["delate","delete"],["delayis","delays"],["delcarations","declarations"],["delcare","declare"],["delcared","declared"],["delcares","declares"],["delclaration","declaration"],["delele","delete"],["delelete","delete"],["deleleted","deleted"],["deleletes","deletes"],["deleleting","deleting"],["delelte","delete"],["delemeter","delimiter"],["delemiter","delimiter"],["delerious","delirious"],["delet","delete"],["deletd","deleted"],["deleteable","deletable"],["deleteed","deleted"],["deleteing","deleting"],["deleteion","deletion"],["deleteting","deleting"],["deletiong","deletion"],["delets","deletes"],["delevopment","development"],["delevopp","develop"],["delgate","delegate"],["delgated","delegated"],["delgates","delegates"],["delgating","delegating"],["delgation","delegation"],["delgations","delegations"],["delgator","delegator"],["delgators","delegators"],["deliberatey","deliberately"],["deliberatly","deliberately"],["deliberite","deliberate"],["deliberitely","deliberately"],["delibery","delivery"],["delibrate","deliberate"],["delibrately","deliberately"],["delievering","delivering"],["delievery","delivery"],["delievred","delivered"],["delievries","deliveries"],["delievry","delivery"],["delimeted","delimited"],["delimeter","delimiter"],["delimeters","delimiters"],["delimiited","delimited"],["delimiiter","delimiter"],["delimiiters","delimiters"],["delimitiaion","delimitation"],["delimitiaions","delimitations"],["delimitiation","delimitation"],["delimitiations","delimitations"],["delimitied","delimited"],["delimitier","delimiter"],["delimitiers","delimiters"],["delimitiing","delimiting"],["delimitimg","delimiting"],["delimition","delimitation"],["delimitions","delimitations"],["delimitis","delimits"],["delimititation","delimitation"],["delimititations","delimitations"],["delimitited","delimited"],["delimititer","delimiter"],["delimititers","delimiters"],["delimititing","delimiting"],["delimitor","delimiter"],["delimitors","delimiters"],["delimitted","delimited"],["delimma","dilemma"],["delimted","delimited"],["delimters","delimiter"],["delink","unlink"],["delivared","delivered"],["delivative","derivative"],["delivatives","derivatives"],["deliverate","deliberate"],["delivermode","deliverymode"],["deliverying","delivering"],["delte","delete"],["delted","deleted"],["deltes","deletes"],["delting","deleting"],["deltion","deletion"],["delusionally","delusively"],["delvery","delivery"],["demaind","demand"],["demenor","demeanor"],["demension","dimension"],["demensional","dimensional"],["demensions","dimensions"],["demodualtor","demodulator"],["demog","demo"],["demographical","demographic"],["demolishon","demolition"],["demolision","demolition"],["demoninator","denominator"],["demoninators","denominators"],["demonstates","demonstrates"],["demonstrat","demonstrate"],["demonstrats","demonstrates"],["demorcracy","democracy"],["demostrate","demonstrate"],["demostrated","demonstrated"],["demostrates","demonstrates"],["demostrating","demonstrating"],["demostration","demonstration"],["demudulator","demodulator"],["denegrating","denigrating"],["denisty","density"],["denomitator","denominator"],["denomitators","denominators"],["densitity","density"],["densly","densely"],["denstiy","density"],["deocde","decode"],["deocded","decoded"],["deocder","decoder"],["deocders","decoders"],["deocdes","decodes"],["deocding","decoding"],["deocdings","decodings"],["deoes","does"],["deoesn't","doesn't"],["deompression","decompression"],["depandance","dependence"],["depandancies","dependencies"],["depandancy","dependency"],["depandent","dependent"],["deparment","department"],["deparmental","departmental"],["deparments","departments"],["depcrecated","deprecated"],["depden","depend"],["depdence","dependence"],["depdencente","dependence"],["depdencentes","dependences"],["depdences","dependences"],["depdencies","dependencies"],["depdency","dependency"],["depdend","depend"],["depdendancies","dependencies"],["depdendancy","dependency"],["depdendant","dependent"],["depdendants","dependents"],["depdended","depended"],["depdendence","dependence"],["depdendences","dependences"],["depdendencies","dependencies"],["depdendency","dependency"],["depdendent","dependent"],["depdendents","dependents"],["depdendet","dependent"],["depdendets","dependents"],["depdending","depending"],["depdends","depends"],["depdenence","dependence"],["depdenences","dependences"],["depdenencies","dependencies"],["depdenency","dependency"],["depdenent","dependent"],["depdenents","dependents"],["depdening","depending"],["depdenncies","dependencies"],["depdenncy","dependency"],["depdens","depends"],["depdent","dependent"],["depdents","dependents"],["depecated","deprecated"],["depedencies","dependencies"],["depedency","dependency"],["depedencys","dependencies"],["depedent","dependent"],["depeding","depending"],["depencencies","dependencies"],["depencency","dependency"],["depencendencies","dependencies"],["depencendency","dependency"],["depencendencys","dependencies"],["depencent","dependent"],["depencies","dependencies"],["depency","dependency"],["dependance","dependence"],["dependancies","dependencies"],["dependancy","dependency"],["dependancys","dependencies"],["dependand","dependent"],["dependcies","dependencies"],["dependcy","dependency"],["dependding","depending"],["dependecies","dependencies"],["dependecy","dependency"],["dependecys","dependencies"],["dependedn","dependent"],["dependees","dependencies"],["dependeing","depending"],["dependenceis","dependencies"],["dependencey","dependency"],["dependencie","dependency"],["dependencied","dependency"],["dependenciens","dependencies"],["dependencis","dependencies"],["dependencys","dependencies"],["dependendencies","dependencies"],["dependendency","dependency"],["dependendent","dependent"],["dependenies","dependencies"],["dependening","depending"],["dependeny","dependency"],["dependet","dependent"],["dependices","dependencies"],["dependicy","dependency"],["dependig","depending"],["dependncies","dependencies"],["dependncy","dependency"],["depened","depend"],["depenedecies","dependencies"],["depenedecy","dependency"],["depenedent","dependent"],["depenencies","dependencies"],["depenencis","dependencies"],["depenency","dependency"],["depenencys","dependencies"],["depenend","depend"],["depenendecies","dependencies"],["depenendecy","dependency"],["depenendence","dependence"],["depenendencies","dependencies"],["depenendency","dependency"],["depenendent","dependent"],["depenending","depending"],["depenent","dependent"],["depenently","dependently"],["depennding","depending"],["depent","depend"],["deperecate","deprecate"],["deperecated","deprecated"],["deperecates","deprecates"],["deperecating","deprecating"],["deploied","deployed"],["deploiment","deployment"],["deploiments","deployments"],["deployement","deployment"],["deploymenet","deployment"],["deploymenets","deployments"],["depndant","dependent"],["depnds","depends"],["deporarily","temporarily"],["deposint","deposing"],["depracated","deprecated"],["depreacte","deprecate"],["depreacted","deprecated"],["depreacts","deprecates"],["depreate","deprecate"],["depreated","deprecated"],["depreates","deprecates"],["depreating","deprecating"],["deprecatedf","deprecated"],["deprectaed","deprecated"],["deprectat","deprecate"],["deprectate","deprecate"],["deprectated","deprecated"],["deprectates","deprecates"],["deprectating","deprecating"],["deprectation","deprecation"],["deprectats","deprecates"],["deprected","deprecated"],["depricate","deprecate"],["depricated","deprecated"],["depricates","deprecates"],["depricating","deprecating"],["dequed","dequeued"],["dequeing","dequeuing"],["deques","dequeues"],["derageable","dirigible"],["derective","directive"],["derectory","directory"],["derefence","dereference"],["derefenced","dereferenced"],["derefencing","dereferencing"],["derefenrence","dereference"],["dereferance","dereference"],["dereferanced","dereferenced"],["dereferances","dereferences"],["dereferencable","dereferenceable"],["dereferencce","dereference"],["dereferencced","dereferenced"],["dereferencces","dereferences"],["dereferenccing","dereferencing"],["derefernce","dereference"],["derefernced","dereferenced"],["dereferncence","dereference"],["dereferncencer","dereferencer"],["dereferncencers","dereferencers"],["dereferncences","dereferences"],["dereferncer","dereferencer"],["dereferncers","dereferencers"],["derefernces","dereferences"],["dereferncing","dereferencing"],["derefernece","dereference"],["derefrencable","dereferenceable"],["derefrence","dereference"],["deregistartion","deregistration"],["deregisted","deregistered"],["deregisteres","deregisters"],["deregistrated","deregistered"],["deregistred","deregistered"],["deregiter","deregister"],["deregiters","deregisters"],["derevative","derivative"],["derevatives","derivatives"],["derferencing","dereferencing"],["derfien","define"],["derfiend","defined"],["derfine","define"],["derfined","defined"],["dergeistered","deregistered"],["dergistration","deregistration"],["deriair","derriere"],["dericed","derived"],["dericteries","directories"],["derictery","directory"],["dericteryes","directories"],["dericterys","directories"],["deriffed","derived"],["derivaties","derivatives"],["derivatio","derivation"],["derivativ","derivative"],["derivativs","derivatives"],["deriviated","derived"],["derivitive","derivative"],["derivitives","derivatives"],["derivitivs","derivatives"],["derivtive","derivative"],["derivtives","derivatives"],["dermine","determine"],["dermined","determined"],["dermines","determines"],["dermining","determining"],["derogitory","derogatory"],["derprecated","deprecated"],["derrivatives","derivatives"],["derrive","derive"],["derrived","derived"],["dertermine","determine"],["derterming","determining"],["derth","dearth"],["derviative","derivative"],["derviatives","derivatives"],["dervie","derive"],["dervied","derived"],["dervies","derives"],["dervived","derived"],["desactivate","deactivate"],["desactivated","deactivated"],["desallocate","deallocate"],["desallocated","deallocated"],["desallocates","deallocates"],["desaster","disaster"],["descallocate","deallocate"],["descallocated","deallocated"],["descchedules","deschedules"],["desccription","description"],["descencing","descending"],["descendands","descendants"],["descibe","describe"],["descibed","described"],["descibes","describes"],["descibing","describing"],["descide","decide"],["descided","decided"],["descides","decides"],["desciding","deciding"],["desciption","description"],["desciptions","descriptions"],["desciptor","descriptor"],["desciptors","descriptors"],["desciribe","describe"],["desciribed","described"],["desciribes","describes"],["desciribing","describing"],["desciription","description"],["desciriptions","descriptions"],["descirption","description"],["descirptor","descriptor"],["descision","decision"],["descisions","decisions"],["descize","disguise"],["descized","disguised"],["descktop","desktop"],["descktops","desktops"],["desconstructed","deconstructed"],["descover","discover"],["descovered","discovered"],["descovering","discovering"],["descovery","discovery"],["descrease","decrease"],["descreased","decreased"],["descreases","decreases"],["descreasing","decreasing"],["descrementing","decrementing"],["descrete","discrete"],["describ","describe"],["describbed","described"],["describibg","describing"],["describng","describing"],["describtion","description"],["describtions","descriptions"],["descrice","describe"],["descriced","described"],["descrices","describes"],["descricing","describing"],["descrie","describe"],["descriibes","describes"],["descriminant","discriminant"],["descriminate","discriminate"],["descriminated","discriminated"],["descriminates","discriminates"],["descriminating","discriminating"],["descriont","description"],["descriotor","descriptor"],["descripe","describe"],["descriped","described"],["descripes","describes"],["descriping","describing"],["descripition","description"],["descripor","descriptor"],["descripors","descriptors"],["descripter","descriptor"],["descripters","descriptors"],["descriptio","description"],["descriptiom","description"],["descriptionm","description"],["descriptior","descriptor"],["descriptiors","descriptors"],["descripto","descriptor"],["descriptoin","description"],["descriptoins","descriptions"],["descripton","description"],["descriptons","descriptions"],["descriptot","descriptor"],["descriptoy","descriptor"],["descriptuve","descriptive"],["descrition","description"],["descritpion","description"],["descritpions","descriptions"],["descritpiton","description"],["descritpitons","descriptions"],["descritpor","descriptor"],["descritpors","descriptors"],["descritpr","descriptor"],["descritpro","descriptor"],["descritpros","descriptors"],["descritprs","descriptors"],["descritption","description"],["descritptions","descriptions"],["descritptive","descriptive"],["descritptor","descriptor"],["descritptors","descriptors"],["descrption","description"],["descrptions","descriptions"],["descrptor","descriptor"],["descrptors","descriptors"],["descrtiption","description"],["descrtiptions","descriptions"],["descrutor","destructor"],["descrybe","describe"],["descrybing","describing"],["descryption","description"],["descryptions","descriptions"],["desctiption","description"],["desctiptor","descriptor"],["desctiptors","descriptors"],["desctop","desktop"],["desctructed","destructed"],["desctruction","destruction"],["desctructive","destructive"],["desctructor","destructor"],["desctructors","destructors"],["descuss","discuss"],["descvription","description"],["descvriptions","descriptions"],["deselct","deselect"],["deselctable","deselectable"],["deselctables","deselectable"],["deselcted","deselected"],["deselcting","deselecting"],["desepears","disappears"],["deserailise","deserialise"],["deserailize","deserialize"],["deserialisazion","deserialisation"],["deserializaed","deserialized"],["deserializazion","deserialization"],["deserialsiation","deserialisation"],["deserialsie","deserialise"],["deserialsied","deserialised"],["deserialsies","deserialises"],["deserialsing","deserialising"],["deserialze","deserialize"],["deserialzed","deserialized"],["deserialzes","deserializes"],["deserialziation","deserialization"],["deserialzie","deserialize"],["deserialzied","deserialized"],["deserialzies","deserializes"],["deserialzing","deserializing"],["desgin","design"],["desgin-mode","design-mode"],["desgined","designed"],["desginer","designer"],["desiar","desire"],["desicate","desiccate"],["desicion","decision"],["desicions","decisions"],["deside","decide"],["desided","decided"],["desides","decides"],["desig","design"],["desigern","designer"],["desigining","designing"],["designd","designed"],["desination","destination"],["desinations","destinations"],["desine","design"],["desing","design"],["desingable","designable"],["desinged","designed"],["desinger","designer"],["desinging","designing"],["desingn","design"],["desingned","designed"],["desingner","designer"],["desingning","designing"],["desingns","designs"],["desings","designs"],["desintaiton","destination"],["desintaitons","destinations"],["desintation","destination"],["desintations","destinations"],["desintegrated","disintegrated"],["desintegration","disintegration"],["desipite","despite"],["desireable","desirable"],["desision","decision"],["desisions","decisions"],["desitable","desirable"],["desitination","destination"],["desitinations","destinations"],["desition","decision"],["desitions","decisions"],["desitned","destined"],["deskop","desktop"],["deskops","desktops"],["desktiop","desktop"],["deskys","disguise"],["deslected","deselected"],["deslects","deselects"],["desltop","desktop"],["desltops","desktops"],["desn't","doesn't"],["desne","dense"],["desnse","dense"],["desogn","design"],["desogned","designed"],["desogner","designer"],["desogning","designing"],["desogns","designs"],["desolve","dissolve"],["desorder","disorder"],["desoriented","disoriented"],["desparately","desperately"],["despatch","dispatch"],["despict","depict"],["despiration","desperation"],["desplay","display"],["desplayed","displayed"],["desplays","displays"],["desposition","disposition"],["desrciption","description"],["desrciptions","descriptions"],["desribe","describe"],["desribed","described"],["desribes","describes"],["desribing","describing"],["desription","description"],["desriptions","descriptions"],["desriptor","descriptor"],["desriptors","descriptors"],["desrire","desire"],["desrired","desired"],["desroyer","destroyer"],["desscribe","describe"],["desscribing","describing"],["desscription","description"],["dessicate","desiccate"],["dessicated","desiccated"],["dessication","desiccation"],["dessigned","designed"],["desstructor","destructor"],["destablized","destabilized"],["destanation","destination"],["destanations","destinations"],["destiantion","destination"],["destiantions","destinations"],["destiation","destination"],["destiations","destinations"],["destinaion","destination"],["destinaions","destinations"],["destinaiton","destination"],["destinaitons","destinations"],["destinarion","destination"],["destinarions","destinations"],["destinataion","destination"],["destinataions","destinations"],["destinatin","destination"],["destinatino","destination"],["destinatinos","destinations"],["destinatins","destinations"],["destinaton","destination"],["destinatons","destinations"],["destinguish","distinguish"],["destintation","destination"],["destintations","destinations"],["destionation","destination"],["destionations","destinations"],["destop","desktop"],["destops","desktops"],["destoried","destroyed"],["destort","distort"],["destory","destroy"],["destoryed","destroyed"],["destorying","destroying"],["destorys","destroys"],["destoy","destroy"],["destoyed","destroyed"],["destrcut","destruct"],["destrcuted","destructed"],["destrcutor","destructor"],["destrcutors","destructors"],["destribute","distribute"],["destributed","distributed"],["destroi","destroy"],["destroied","destroyed"],["destroing","destroying"],["destrois","destroys"],["destroyes","destroys"],["destruciton","destruction"],["destructro","destructor"],["destructros","destructors"],["destruktor","destructor"],["destruktors","destructors"],["destrutor","destructor"],["destrutors","destructors"],["destry","destroy"],["destryed","destroyed"],["destryer","destroyer"],["destrying","destroying"],["destryiong","destroying"],["destryoed","destroyed"],["destryoing","destroying"],["destryong","destroying"],["destrys","destroys"],["destuction","destruction"],["destuctive","destructive"],["destuctor","destructor"],["destuctors","destructors"],["desturcted","destructed"],["desturtor","destructor"],["desturtors","destructors"],["desychronize","desynchronize"],["desychronized","desynchronized"],["detabase","database"],["detachs","detaches"],["detahced","detached"],["detaild","detailed"],["detailled","detailed"],["detais","details"],["detals","details"],["detatch","detach"],["detatched","detached"],["detatches","detaches"],["detatching","detaching"],["detault","default"],["detaulted","defaulted"],["detaulting","defaulting"],["detaults","defaults"],["detction","detection"],["detctions","detections"],["deteced","detected"],["detecing","detecting"],["detecion","detection"],["detecions","detections"],["detectected","detected"],["detectes","detects"],["detectetd","detected"],["detectsion","detection"],["detectsions","detections"],["detemine","determine"],["detemined","determined"],["detemines","determines"],["detemining","determining"],["deteoriated","deteriorated"],["deterant","deterrent"],["deteremine","determine"],["deteremined","determined"],["deteriate","deteriorate"],["deterimined","determined"],["deterine","determine"],["deterioriating","deteriorating"],["determaine","determine"],["determenant","determinant"],["determenistic","deterministic"],["determiens","determines"],["determimnes","determines"],["determin","determine"],["determinated","determined"],["determind","determined"],["determinded","determined"],["determinee","determine"],["determineing","determining"],["determinining","determining"],["deterministinc","deterministic"],["determinne","determine"],["determins","determines"],["determinse","determines"],["determinstic","deterministic"],["determinstically","deterministically"],["determintes","determines"],["determnine","determine"],["deternine","determine"],["detetmine","determine"],["detial","detail"],["detialed","detailed"],["detialing","detailing"],["detials","details"],["detination","destination"],["detinations","destinations"],["detremental","detrimental"],["detremining","determining"],["detrmine","determine"],["detrmined","determined"],["detrmines","determines"],["detrmining","determining"],["detroy","destroy"],["detroyed","destroyed"],["detroying","destroying"],["detroys","destroys"],["detructed","destructed"],["dettach","detach"],["dettaching","detaching"],["detur","detour"],["deturance","deterrence"],["deubug","debug"],["deubuging","debugging"],["deug","debug"],["deugging","debugging"],["devasted","devastated"],["devation","deviation"],["devce","device"],["devcent","decent"],["devcie","device"],["devcies","devices"],["develoers","developers"],["develoment","development"],["develoments","developments"],["develompent","development"],["develompental","developmental"],["develompents","developments"],["develope","develop"],["developement","development"],["developements","developments"],["developmemt","development"],["developmet","development"],["developmetns","developments"],["developmets","developments"],["developp","develop"],["developpe","develop"],["developped","developed"],["developpement","development"],["developper","developer"],["developpers","developers"],["developpment","development"],["develp","develop"],["develped","developed"],["develper","developer"],["develpers","developers"],["develping","developing"],["develpment","development"],["develpments","developments"],["develps","develops"],["devels","delves"],["deveolpment","development"],["deveopers","developers"],["deverloper","developer"],["deverlopers","developers"],["devestated","devastated"],["devestating","devastating"],["devfine","define"],["devfined","defined"],["devfines","defines"],["devic","device"],["devicde","device"],["devicdes","devices"],["device-dependend","device-dependent"],["devicec","device"],["devicecoordiinates","devicecoordinates"],["deviceremoveable","deviceremovable"],["devicesr","devices"],["devicess","devices"],["devicest","devices"],["devide","divide"],["devided","divided"],["devider","divider"],["deviders","dividers"],["devides","divides"],["deviding","dividing"],["deviece","device"],["devied","device"],["deviiate","deviate"],["deviiated","deviated"],["deviiates","deviates"],["deviiating","deviating"],["deviiation","deviation"],["deviiations","deviations"],["devined","defined"],["devired","derived"],["devirtualisaion","devirtualisation"],["devirtualisaiton","devirtualisation"],["devirtualizaion","devirtualization"],["devirtualizaiton","devirtualization"],["devirutalisation","devirtualisation"],["devirutalise","devirtualise"],["devirutalised","devirtualised"],["devirutalization","devirtualization"],["devirutalize","devirtualize"],["devirutalized","devirtualized"],["devisible","divisible"],["devision","division"],["devistating","devastating"],["devive","device"],["devleop","develop"],["devleoped","developed"],["devleoper","developer"],["devleopers","developers"],["devleoping","developing"],["devleopment","development"],["devleopper","developer"],["devleoppers","developers"],["devlop","develop"],["devloped","developed"],["devloper's","developer's"],["devloper","developer"],["devlopers","developers"],["devloping","developing"],["devlopment","development"],["devlopments","developments"],["devlopper","developer"],["devloppers","developers"],["devlops","develops"],["devolopement","development"],["devritualisation","devirtualisation"],["devritualization","devirtualization"],["devuce","device"],["dewrapping","unwrapping"],["dezert","dessert"],["dezibel","decibel"],["dezine","design"],["dezinens","denizens"],["dfine","define"],["dfined","defined"],["dfines","defines"],["dfinition","definition"],["dfinitions","definitions"],["dgetttext","dgettext"],["diable","disable"],["diabled","disabled"],["diabler","disabler"],["diablers","disablers"],["diables","disables"],["diablical","diabolical"],["diabling","disabling"],["diaciritc","diacritic"],["diaciritcs","diacritics"],["diagnistic","diagnostic"],["diagnoal","diagonal"],["diagnoals","diagonals"],["diagnol","diagonal"],["diagnosics","diagnostics"],["diagnositc","diagnostic"],["diagnotic","diagnostic"],["diagnotics","diagnostics"],["diagnxostic","diagnostic"],["diagonale","diagonal"],["diagonales","diagonals"],["diagramas","diagrams"],["diagramm","diagram"],["dialaog","dialog"],["dialate","dilate"],["dialgo","dialog"],["dialgos","dialogs"],["dialig","dialog"],["dialigs","dialogs"],["diamater","diameter"],["diamaters","diameters"],["diamon","diamond"],["diamons","diamonds"],["diamter","diameter"],["diamters","diameters"],["diangose","diagnose"],["dianostic","diagnostic"],["dianostics","diagnostics"],["diaplay","display"],["diaplays","displays"],["diappeares","disappears"],["diarea","diarrhea"],["diaresis","diaeresis"],["diasble","disable"],["diasbled","disabled"],["diasbles","disables"],["diasbling","disabling"],["diaspra","diaspora"],["diaster","disaster"],["diatance","distance"],["diatancing","distancing"],["dicard","discard"],["dicarded","discarded"],["dicarding","discarding"],["dicards","discards"],["dicates","dictates"],["dicationaries","dictionaries"],["dicationary","dictionary"],["dicergence","divergence"],["dichtomy","dichotomy"],["dicionaries","dictionaries"],["dicionary","dictionary"],["dicipline","discipline"],["dicitonaries","dictionaries"],["dicitonary","dictionary"],["dicline","decline"],["diconnected","disconnected"],["diconnection","disconnection"],["diconnects","disconnects"],["dicover","discover"],["dicovered","discovered"],["dicovering","discovering"],["dicovers","discovers"],["dicovery","discovery"],["dicrectory","directory"],["dicrete","discrete"],["dicretion","discretion"],["dicretionary","discretionary"],["dicriminate","discriminate"],["dicriminated","discriminated"],["dicriminates","discriminates"],["dicriminating","discriminating"],["dicriminator","discriminator"],["dicriminators","discriminators"],["dicsriminated","discriminated"],["dictaionaries","dictionaries"],["dictaionary","dictionary"],["dictinary","dictionary"],["dictioanries","dictionaries"],["dictioanry","dictionary"],["dictionarys","dictionaries"],["dictionay","dictionary"],["dictionnaries","dictionaries"],["dictionnary","dictionary"],["dictionries","dictionaries"],["dictionry","dictionary"],["dictoinaries","dictionaries"],["dictoinary","dictionary"],["dictonaries","dictionaries"],["dictonary","dictionary"],["dictrionaries","dictionaries"],["dictrionary","dictionary"],["dicussed","discussed"],["dicussions","discussions"],["did'nt","didn't"],["didi","did"],["didn;t","didn't"],["didnt'","didn't"],["didnt't","didn't"],["didnt","didn't"],["didnt;","didn't"],["diect","direct"],["diectly","directly"],["dielectirc","dielectric"],["dielectircs","dielectrics"],["diemsion","dimension"],["dieties","deities"],["diety","deity"],["diference","difference"],["diferences","differences"],["diferent","different"],["diferentiate","differentiate"],["diferentiated","differentiated"],["diferentiates","differentiates"],["diferentiating","differentiating"],["diferently","differently"],["diferrent","different"],["diffcult","difficult"],["diffculties","difficulties"],["diffculty","difficulty"],["diffeent","different"],["diffence","difference"],["diffenet","different"],["diffenrence","difference"],["diffenrences","differences"],["differance","difference"],["differances","differences"],["differant","different"],["differantiate","differentiate"],["differantiation","differentiation"],["differantiator","differentiator"],["differantion","differentiation"],["differate","differentiate"],["differece","difference"],["differect","different"],["differen","different"],["differencess","differences"],["differencial","differential"],["differenciate","differentiate"],["differenciated","differentiated"],["differenciates","differentiates"],["differenciating","differentiating"],["differenciation","differentiation"],["differencies","differences"],["differenct","different"],["differend","different"],["differene","difference"],["differenes","differences"],["differenly","differently"],["differens","difference"],["differense","difference"],["differentiatiations","differentiations"],["differentiaton","differentiation"],["differentl","differently"],["differernt","different"],["differes","differs"],["differetnt","different"],["differnce","difference"],["differnces","differences"],["differnciate","differentiate"],["differnec","difference"],["differnece","difference"],["differneces","differences"],["differnecs","differences"],["differnence","difference"],["differnences","differences"],["differnencing","differencing"],["differnent","different"],["differnet","different"],["differnetiate","differentiate"],["differnetiated","differentiated"],["differnetly","differently"],["differnt","different"],["differntiable","differentiable"],["differntial","differential"],["differntials","differentials"],["differntiate","differentiate"],["differntiated","differentiated"],["differntiates","differentiates"],["differntiating","differentiating"],["differntly","differently"],["differred","differed"],["differrence","difference"],["differrent","different"],["difffered","differed"],["diffferent","different"],["diffferently","differently"],["difffers","differs"],["difficault","difficult"],["difficaulties","difficulties"],["difficaulty","difficulty"],["difficulity","difficulty"],["difficutl","difficult"],["difficutly","difficulty"],["diffreences","differences"],["diffreent","different"],["diffrence","difference"],["diffrences","differences"],["diffrent","different"],["diffrential","differential"],["diffrentiate","differentiate"],["diffrentiated","differentiated"],["diffrently","differently"],["diffrerence","difference"],["diffrerences","differences"],["diffult","difficult"],["diffussion","diffusion"],["diffussive","diffusive"],["dificulties","difficulties"],["dificulty","difficulty"],["difinition","definition"],["difinitions","definitions"],["difract","diffract"],["difracted","diffracted"],["difraction","diffraction"],["difractive","diffractive"],["difussion","diffusion"],["difussive","diffusive"],["digesty","digest"],["diggit","digit"],["diggital","digital"],["diggits","digits"],["digial","digital"],["digist","digits"],["digitalise","digitize"],["digitalising","digitizing"],["digitalize","digitize"],["digitalizing","digitizing"],["digitial","digital"],["digitis","digits"],["dignostics","diagnostics"],["dilema","dilemma"],["dilemas","dilemmas"],["dilineate","delineate"],["dillema","dilemma"],["dillemas","dilemmas"],["dilligence","diligence"],["dilligent","diligent"],["dilligently","diligently"],["dillimport","dllimport"],["dimansion","dimension"],["dimansional","dimensional"],["dimansions","dimensions"],["dimemsions","dimensions"],["dimenional","dimensional"],["dimenionalities","dimensionalities"],["dimenionality","dimensionality"],["dimenions","dimensions"],["dimenionsal","dimensional"],["dimenionsalities","dimensionalities"],["dimenionsality","dimensionality"],["dimenison","dimension"],["dimensinal","dimensional"],["dimensinoal","dimensional"],["dimensinos","dimensions"],["dimensionaility","dimensionality"],["dimensiones","dimensions"],["dimensonal","dimensional"],["dimenstion","dimension"],["dimenstions","dimensions"],["dimention","dimension"],["dimentional","dimensional"],["dimentionnal","dimensional"],["dimentionnals","dimensional"],["dimentions","dimensions"],["dimesions","dimensions"],["dimesnion","dimension"],["dimesnional","dimensional"],["dimesnions","dimensions"],["diminsh","diminish"],["diminshed","diminished"],["diminuitive","diminutive"],["dimissed","dismissed"],["dimmension","dimension"],["dimmensioned","dimensioned"],["dimmensioning","dimensioning"],["dimmensions","dimensions"],["dimnension","dimension"],["dimnention","dimension"],["dimunitive","diminutive"],["dinamic","dynamic"],["dinamically","dynamically"],["dinamicaly","dynamically"],["dinamiclly","dynamically"],["dinamicly","dynamically"],["dinmaic","dynamic"],["dinteractively","interactively"],["diong","doing"],["diosese","diocese"],["diphtong","diphthong"],["diphtongs","diphthongs"],["diplacement","displacement"],["diplay","display"],["diplayed","displayed"],["diplaying","displaying"],["diplays","displays"],["diplomancy","diplomacy"],["dipthong","diphthong"],["dipthongs","diphthongs"],["dircet","direct"],["dircetories","directories"],["dircetory","directory"],["dirctly","directly"],["dirctories","directories"],["dirctory","directory"],["direccion","direction"],["direcctly","directly"],["direcctory","directory"],["direcctorys","directories"],["direcctries","directories"],["direcdories","directories"],["direcdory","directory"],["direcdorys","directories"],["direcion","direction"],["direcions","directions"],["direciton","direction"],["direcitonal","directional"],["direcitons","directions"],["direclty","directly"],["direcly","directly"],["direcories","directories"],["direcory","directory"],["direcotories","directories"],["direcotory","directory"],["direcotries","directories"],["direcotry","directory"],["direcoty","directory"],["directd","directed"],["directely","directly"],["directes","directs"],["directgories","directories"],["directgory","directory"],["directiories","directories"],["directiory","directory"],["directoies","directories"],["directon","direction"],["directoories","directories"],["directoory","directory"],["directores","directories"],["directoris","directories"],["directort","directory"],["directorty","directory"],["directorys","directories"],["directoty","directory"],["directove","directive"],["directoves","directives"],["directoy","directory"],["directpries","directories"],["directpry","directory"],["directries","directories"],["directrive","directive"],["directrives","directives"],["directrly","directly"],["directroies","directories"],["directrories","directories"],["directrory","directory"],["directroy","directory"],["directry","directory"],["directsion","direction"],["directsions","directions"],["directtories","directories"],["directtory","directory"],["directy","directly"],["direectly","directly"],["diregard","disregard"],["direktly","directly"],["direrctor","director"],["direrctories","directories"],["direrctors","directors"],["direrctory","directory"],["diretive","directive"],["diretly","directly"],["diretories","directories"],["diretory","directory"],["direvctory","directory"],["dirived","derived"],["dirrectly","directly"],["dirtectory","directory"],["dirtyed","dirtied"],["dirtyness","dirtiness"],["dirver","driver"],["disabe","disable"],["disabeling","disabling"],["disabels","disables"],["disabes","disables"],["disabilitiles","disabilities"],["disabilitily","disability"],["disabiltities","disabilities"],["disabiltitiy","disability"],["disabing","disabling"],["disabl","disable"],["disablle","disable"],["disadvantadge","disadvantage"],["disagreeed","disagreed"],["disagress","disagrees"],["disalb","disable"],["disalbe","disable"],["disalbed","disabled"],["disalbes","disables"],["disale","disable"],["disaled","disabled"],["disalow","disallow"],["disambigouate","disambiguate"],["disambiguaiton","disambiguation"],["disambiguiation","disambiguation"],["disapear","disappear"],["disapeard","disappeared"],["disapeared","disappeared"],["disapearing","disappearing"],["disapears","disappears"],["disapline","discipline"],["disapoint","disappoint"],["disapointed","disappointed"],["disapointing","disappointing"],["disappared","disappeared"],["disappearaing","disappearing"],["disappeard","disappeared"],["disappearred","disappeared"],["disapper","disappear"],["disapperar","disappear"],["disapperarance","disappearance"],["disapperared","disappeared"],["disapperars","disappears"],["disappered","disappeared"],["disappering","disappearing"],["disappers","disappears"],["disapporval","disapproval"],["disapporve","disapprove"],["disapporved","disapproved"],["disapporves","disapproves"],["disapporving","disapproving"],["disapprouval","disapproval"],["disapprouve","disapprove"],["disapprouved","disapproved"],["disapprouves","disapproves"],["disapprouving","disapproving"],["disaproval","disapproval"],["disard","discard"],["disariable","desirable"],["disassebled","disassembled"],["disassocate","disassociate"],["disassocation","disassociation"],["disasssembler","disassembler"],["disasterous","disastrous"],["disatisfaction","dissatisfaction"],["disatisfied","dissatisfied"],["disatrous","disastrous"],["disbale","disable"],["disbaled","disabled"],["disbales","disables"],["disbaling","disabling"],["disble","disable"],["disbled","disabled"],["discared","discarded"],["discareded","discarded"],["discarge","discharge"],["discconecct","disconnect"],["discconeccted","disconnected"],["discconeccting","disconnecting"],["discconecction","disconnection"],["discconecctions","disconnections"],["discconeccts","disconnects"],["discconect","disconnect"],["discconected","disconnected"],["discconecting","disconnecting"],["discconection","disconnection"],["discconections","disconnections"],["discconects","disconnects"],["discconeect","disconnect"],["discconeected","disconnected"],["discconeecting","disconnecting"],["discconeection","disconnection"],["discconeections","disconnections"],["discconeects","disconnects"],["discconenct","disconnect"],["discconencted","disconnected"],["discconencting","disconnecting"],["discconenction","disconnection"],["discconenctions","disconnections"],["discconencts","disconnects"],["discconet","disconnect"],["discconeted","disconnected"],["discconeting","disconnecting"],["discconetion","disconnection"],["discconetions","disconnections"],["discconets","disconnects"],["disccuss","discuss"],["discernable","discernible"],["dischare","discharge"],["discimenation","dissemination"],["disciplins","disciplines"],["disclamer","disclaimer"],["disconecct","disconnect"],["disconeccted","disconnected"],["disconeccting","disconnecting"],["disconecction","disconnection"],["disconecctions","disconnections"],["disconeccts","disconnects"],["disconect","disconnect"],["disconected","disconnected"],["disconecting","disconnecting"],["disconection","disconnection"],["disconections","disconnections"],["disconects","disconnects"],["disconeect","disconnect"],["disconeected","disconnected"],["disconeecting","disconnecting"],["disconeection","disconnection"],["disconeections","disconnections"],["disconeects","disconnects"],["disconenct","disconnect"],["disconencted","disconnected"],["disconencting","disconnecting"],["disconenction","disconnection"],["disconenctions","disconnections"],["disconencts","disconnects"],["disconet","disconnect"],["disconeted","disconnected"],["disconeting","disconnecting"],["disconetion","disconnection"],["disconetions","disconnections"],["disconets","disconnects"],["disconnec","disconnect"],["disconneced","disconnected"],["disconnet","disconnect"],["disconneted","disconnected"],["disconneting","disconnecting"],["disconnets","disconnects"],["disconnnect","disconnect"],["discontigious","discontiguous"],["discontigous","discontiguous"],["discontiguities","discontinuities"],["discontinous","discontinuous"],["discontinuos","discontinuous"],["discoraged","discouraged"],["discouranged","discouraged"],["discourarged","discouraged"],["discourrage","discourage"],["discourraged","discouraged"],["discove","discover"],["discoved","discovered"],["discovereability","discoverability"],["discoveribility","discoverability"],["discovey","discovery"],["discovr","discover"],["discovred","discovered"],["discovring","discovering"],["discovrs","discovers"],["discrace","disgrace"],["discraced","disgraced"],["discraceful","disgraceful"],["discracefully","disgracefully"],["discracefulness","disgracefulness"],["discraces","disgraces"],["discracing","disgracing"],["discrards","discards"],["discreminates","discriminates"],["discrepencies","discrepancies"],["discrepency","discrepancy"],["discrepicies","discrepancies"],["discribe","describe"],["discribed","described"],["discribes","describes"],["discribing","describing"],["discription","description"],["discriptions","descriptions"],["discriptor's","descriptor's"],["discriptor","descriptor"],["discriptors","descriptors"],["disctinction","distinction"],["disctinctive","distinctive"],["disctinguish","distinguish"],["disctionaries","dictionaries"],["disctionary","dictionary"],["discuassed","discussed"],["discused","discussed"],["discusion","discussion"],["discusions","discussions"],["discusson","discussion"],["discussons","discussions"],["discusting","disgusting"],["discuusion","discussion"],["disdvantage","disadvantage"],["disecting","dissecting"],["disection","dissection"],["diselect","deselect"],["disemination","dissemination"],["disenchanged","disenchanted"],["disencouraged","discouraged"],["disertation","dissertation"],["disfunctional","dysfunctional"],["disfunctionality","dysfunctionality"],["disgn","design"],["disgned","designed"],["disgner","designer"],["disgning","designing-"],["disgnostic","diagnostic"],["disgnostics","diagnostics"],["disgns","designs"],["disguisting","disgusting"],["disharge","discharge"],["disign","design"],["disignated","designated"],["disinguish","distinguish"],["disiplined","disciplined"],["disired","desired"],["disitributions","distributions"],["diskrete","discrete"],["diskretion","discretion"],["diskretization","discretization"],["diskretize","discretize"],["diskretized","discretized"],["diskrimination","discrimination"],["dislaimer","disclaimer"],["dislay","display"],["dislayed","displayed"],["dislaying","displaying"],["dislays","displays"],["dislpay","display"],["dislpayed","displayed"],["dislpaying","displaying"],["dislpays","displays"],["disnabled","disabled"],["disobediance","disobedience"],["disobediant","disobedient"],["disokay","display"],["disolve","dissolve"],["disolved","dissolved"],["disonnect","disconnect"],["disonnected","disconnected"],["disover","discover"],["disovered","discovered"],["disovering","discovering"],["disovery","discovery"],["dispached","dispatched"],["dispair","despair"],["dispalcement","displacement"],["dispalcements","displacements"],["dispaly","display"],["dispalyable","displayable"],["dispalyed","displayed"],["dispalyes","displays"],["dispalying","displaying"],["dispalys","displays"],["disparingly","disparagingly"],["disparite","disparate"],["dispatcgh","dispatch"],["dispatchs","dispatches"],["dispath","dispatch"],["dispathed","dispatched"],["dispathes","dispatches"],["dispathing","dispatching"],["dispay","display"],["dispayed","displayed"],["dispayes","displays"],["dispayport","displayport"],["dispays","displays"],["dispbibute","distribute"],["dispell","dispel"],["dispence","dispense"],["dispenced","dispensed"],["dispencing","dispensing"],["dispertion","dispersion"],["dispicable","despicable"],["dispite","despite"],["displa","display"],["displacemnt","displacement"],["displacemnts","displacements"],["displacment","displacement"],["displacments","displacements"],["displayd","displayed"],["displayied","displayed"],["displayig","displaying"],["disply","display"],["displyed","displayed"],["displying","displaying"],["displys","displays"],["dispode","dispose"],["disporue","disparue"],["disporve","disprove"],["disporved","disproved"],["disporves","disproves"],["disporving","disproving"],["disposel","disposal"],["dispossable","disposable"],["dispossal","disposal"],["disposse","dispose"],["dispossing","disposing"],["dispostion","disposition"],["disproportiate","disproportionate"],["disproportionatly","disproportionately"],["disputandem","disputandum"],["disregrad","disregard"],["disrete","discrete"],["disretion","discretion"],["disribution","distribution"],["disricts","districts"],["disrm","disarm"],["dissable","disable"],["dissabled","disabled"],["dissables","disables"],["dissabling","disabling"],["dissadvantage","disadvantage"],["dissadvantages","disadvantages"],["dissagreement","disagreement"],["dissagregation","dissaggregation"],["dissallow","disallow"],["dissallowed","disallowed"],["dissallowing","disallowing"],["dissallows","disallows"],["dissalow","disallow"],["dissalowed","disallowed"],["dissalowing","disallowing"],["dissalows","disallows"],["dissambiguate","disambiguate"],["dissamble","disassemble"],["dissambled","disassembled"],["dissambler","disassembler"],["dissambles","disassembles"],["dissamblies","disassemblies"],["dissambling","disassembling"],["dissambly","disassembly"],["dissapate","dissipate"],["dissapates","dissipates"],["dissapear","disappear"],["dissapearance","disappearance"],["dissapeard","disappeared"],["dissapeared","disappeared"],["dissapearing","disappearing"],["dissapears","disappears"],["dissaper","disappear"],["dissaperd","disappeared"],["dissapered","disappeared"],["dissapering","disappearing"],["dissapers","disappears"],["dissapoint","disappoint"],["dissapointed","disappointed"],["dissapointing","disappointing"],["dissapoints","disappoints"],["dissappear","disappear"],["dissappeard","disappeared"],["dissappeared","disappeared"],["dissappearing","disappearing"],["dissappears","disappears"],["dissapper","disappear"],["dissapperd","disappeared"],["dissappered","disappeared"],["dissappering","disappearing"],["dissappers","disappears"],["dissappointed","disappointed"],["dissapprove","disapprove"],["dissapproves","disapproves"],["dissarray","disarray"],["dissasemble","disassemble"],["dissasembled","disassembled"],["dissasembler","disassembler"],["dissasembles","disassembles"],["dissasemblies","disassemblies"],["dissasembling","disassembling"],["dissasembly","disassembly"],["dissasociate","disassociate"],["dissasociated","disassociated"],["dissasociates","disassociates"],["dissasociation","disassociation"],["dissassemble","disassemble"],["dissassembled","disassembled"],["dissassembler","disassembler"],["dissassembles","disassembles"],["dissassemblies","disassemblies"],["dissassembling","disassembling"],["dissassembly","disassembly"],["dissassociate","disassociate"],["dissassociated","disassociated"],["dissassociates","disassociates"],["dissassociating","disassociating"],["dissaster","disaster"],["dissasters","disasters"],["dissble","disable"],["dissbled","disabled"],["dissbles","disables"],["dissbling","disabling"],["dissconect","disconnect"],["dissconnect","disconnect"],["dissconnected","disconnected"],["dissconnects","disconnects"],["disscover","discover"],["disscovered","discovered"],["disscovering","discovering"],["disscovers","discovers"],["disscovery","discovery"],["dissct","dissect"],["disscted","dissected"],["disscting","dissecting"],["dissctor","dissector"],["dissctors","dissectors"],["disscts","dissects"],["disscuesed","discussed"],["disscus","discuss"],["disscused","discussed"],["disscuses","discusses"],["disscusing","discussing"],["disscusion","discussion"],["disscuss","discuss"],["disscussed","discussed"],["disscusses","discusses"],["disscussing","discussing"],["disscussion","discussion"],["disscussions","discussions"],["disshearteningly","dishearteningly"],["dissimialr","dissimilar"],["dissimialrity","dissimilarity"],["dissimialrly","dissimilarly"],["dissimiar","dissimilar"],["dissimilarily","dissimilarly"],["dissimilary","dissimilarly"],["dissimilat","dissimilar"],["dissimilia","dissimilar"],["dissimiliar","dissimilar"],["dissimiliarity","dissimilarity"],["dissimiliarly","dissimilarly"],["dissimiliarty","dissimilarity"],["dissimiliary","dissimilarity"],["dissimillar","dissimilar"],["dissimlar","dissimilar"],["dissimlarlity","dissimilarity"],["dissimlarly","dissimilarly"],["dissimliar","dissimilar"],["dissimliarly","dissimilarly"],["dissimmetric","dissymmetric"],["dissimmetrical","dissymmetrical"],["dissimmetry","dissymmetry"],["dissmantle","dismantle"],["dissmantled","dismantled"],["dissmantles","dismantles"],["dissmantling","dismantling"],["dissmis","dismiss"],["dissmised","dismissed"],["dissmises","dismisses"],["dissmising","dismissing"],["dissmiss","dismiss"],["dissmissed","dismissed"],["dissmisses","dismisses"],["dissmissing","dismissing"],["dissobediance","disobedience"],["dissobediant","disobedient"],["dissobedience","disobedience"],["dissobedient","disobedient"],["dissplay","display"],["dissrupt","disrupt"],["dissrupted","disrupted"],["dissrupting","disrupting"],["dissrupts","disrupts"],["disssemble","disassemble"],["disssembled","disassembled"],["disssembler","disassembler"],["disssembles","disassembles"],["disssemblies","disassemblies"],["disssembling","disassembling"],["disssembly","disassembly"],["disssociate","dissociate"],["disssociated","dissociated"],["disssociates","dissociates"],["disssociating","dissociating"],["distaced","distanced"],["distange","distance"],["distanse","distance"],["distantce","distance"],["distarct","distract"],["distater","disaster"],["distengish","distinguish"],["distibute","distribute"],["distibuted","distributed"],["distibutes","distributes"],["distibuting","distributing"],["distibution","distribution"],["distibutions","distributions"],["distiction","distinction"],["distictly","distinctly"],["distiguish","distinguish"],["distiguished","distinguished"],["distinative","distinctive"],["distingish","distinguish"],["distingished","distinguished"],["distingishes","distinguishes"],["distingishing","distinguishing"],["distingiush","distinguish"],["distingquished","distinguished"],["distinguise","distinguish"],["distinguised","distinguished"],["distinguises","distinguishes"],["distingush","distinguish"],["distingushed","distinguished"],["distingushes","distinguishes"],["distingushing","distinguishing"],["distingusih","distinguish"],["distinquish","distinguish"],["distinquishable","distinguishable"],["distinquished","distinguished"],["distinquishes","distinguishes"],["distinquishing","distinguishing"],["distintions","distinctions"],["distirbute","distribute"],["distirbuted","distributed"],["distirbutes","distributes"],["distirbuting","distributing"],["distirbution","distribution"],["distirbutions","distributions"],["distirted","distorted"],["distnace","distance"],["distnaces","distances"],["distnce","distance"],["distnces","distances"],["distnct","distinct"],["distncte","distance"],["distnctes","distances"],["distnguish","distinguish"],["distnguished","distinguished"],["distniguish","distinguish"],["distniguished","distinguished"],["distorsion","distortion"],["distorsional","distortional"],["distorsions","distortions"],["distrbute","distribute"],["distrbuted","distributed"],["distrbutes","distributes"],["distrbuting","distributing"],["distrbution","distribution"],["distrbutions","distributions"],["distrct","district"],["distrcts","districts"],["distrebuted","distributed"],["distribtion","distribution"],["distribtions","distributions"],["distribtuion","distribution"],["distribtuions","distributions"],["distribtution","distributions"],["distribue","distribute"],["distribued","distributed"],["distribues","distributes"],["distribuion","distribution"],["distribuite","distribute"],["distribuited","distributed"],["distribuiting","distributing"],["distribuition","distribution"],["distribuitng","distributing"],["distribure","distribute"],["districct","district"],["distrobute","distribute"],["distrobuted","distributed"],["distrobutes","distributes"],["distrobuting","distributing"],["distrobution","distribution"],["distrobutions","distributions"],["distrobuts","distributes"],["distroname","distro name"],["distroying","destroying"],["distrub","disturb"],["distrubiotion","distribution"],["distrubite","distribute"],["distrubtion","distribution"],["distrubute","distribute"],["distrubuted","distributed"],["distrubution","distribution"],["distrubutions","distributions"],["distrubutor","distributor"],["distrubutors","distributors"],["distruction","destruction"],["distructive","destructive"],["distructor","destructor"],["distructors","destructors"],["distuingish","distinguish"],["disuade","dissuade"],["disucssion","discussion"],["disucssions","discussions"],["disucussion","discussion"],["disussion","discussion"],["disussions","discussions"],["disutils","distutils"],["ditance","distance"],["ditial","digital"],["ditinguishes","distinguishes"],["ditorconfig","editorconfig"],["ditribute","distribute"],["ditributed","distributed"],["ditribution","distribution"],["ditributions","distributions"],["divde","divide"],["divded","divided"],["divdes","divides"],["divding","dividing"],["divertion","diversion"],["divertions","diversions"],["divet","divot"],["divice","device"],["divicer","divider"],["divion","division"],["divisable","divisible"],["divisior","divisor"],["divison","division"],["divisons","divisions"],["divrese","diverse"],["divsion","division"],["divsions","divisions"],["divsiors","divisors"],["dloating","floating"],["dnamically","dynamically"],["dne","done"],["dnymaic","dynamic"],["do'nt","don't"],["doagonal","diagonal"],["doagonals","diagonals"],["doalog","dialog"],["doamins","domains"],["doasn't","doesn't"],["doble","double"],["dobled","doubled"],["dobles","doubles"],["dobling","doubling"],["doccument","document"],["doccumented","documented"],["doccuments","documents"],["dockson","dachshund"],["docmenetation","documentation"],["docmuent","document"],["docmunet","document"],["docmunetation","documentation"],["docmuneted","documented"],["docmuneting","documenting"],["docmunets","documents"],["docoment","document"],["docomentation","documentation"],["docomented","documented"],["docomenting","documenting"],["docoments","documents"],["docrines","doctrines"],["docstatistik","docstatistic"],["docsund","dachshund"],["doctines","doctrines"],["doctorial","doctoral"],["docucument","document"],["docuement","document"],["docuements","documents"],["docuemnt","document"],["docuemnts","documents"],["docuemtn","document"],["docuemtnation","documentation"],["docuemtned","documented"],["docuemtning","documenting"],["docuemtns","documents"],["docuent","document"],["docuentation","documentation"],["documant","document"],["documantation","documentation"],["documants","documents"],["documation","documentation"],["documemt","document"],["documen","document"],["documenatation","documentation"],["documenation","documentation"],["documenatry","documentary"],["documenet","document"],["documenetation","documentation"],["documeneted","documented"],["documeneter","documenter"],["documeneters","documenters"],["documeneting","documenting"],["documenets","documents"],["documentaion","documentation"],["documentaiton","documentation"],["documentataion","documentation"],["documentataions","documentations"],["documentaton","documentation"],["documentes","documents"],["documention","documentation"],["documetation","documentation"],["documetnation","documentation"],["documment","document"],["documments","documents"],["documnet","document"],["documnetation","documentation"],["documument","document"],["docunment","document"],["doed","does"],["doen's","doesn't"],["doen't","doesn't"],["doen","done"],["doens't","doesn't"],["doens","does"],["doensn't","doesn't"],["does'nt","doesn't"],["does't","doesn't"],["doese't","doesn't"],["doese","does"],["doesen't","doesn't"],["doesent'","doesn't"],["doesent","doesn't"],["doesits","does its"],["doesn'","doesn't"],["doesn't't","doesn't"],["doesn;t","doesn't"],["doesnexist","doesn't exist"],["doesnt'","doesn't"],["doesnt't","doesn't"],["doesnt;","doesn't"],["doess","does"],["doestn't","doesn't"],["doign","doing"],["doiing","doing"],["doiuble","double"],["doiubled","doubled"],["dokc","dock"],["dokced","docked"],["dokcer","docker"],["dokcing","docking"],["dokcre","docker"],["dokcs","docks"],["doller","dollar"],["dollers","dollars"],["dollor","dollar"],["dollors","dollars"],["domait","domain"],["doman","domain"],["domans","domains"],["domension","dimension"],["domensions","dimensions"],["domian","domain"],["domians","domains"],["dominanted","dominated"],["dominanting","dominating"],["dominantion","domination"],["dominaton","domination"],["dominent","dominant"],["dominiant","dominant"],["domonstrate","demonstrate"],["domonstrates","demonstrates"],["domonstrating","demonstrating"],["domonstration","demonstration"],["domonstrations","demonstrations"],["donain","domain"],["donains","domains"],["donejun","dungeon"],["donejuns","dungeons"],["donig","doing"],["donn't","don't"],["donnot","do not"],["dont'","don't"],["dont't","don't"],["donwload","download"],["donwloaded","downloaded"],["donwloading","downloading"],["donwloads","downloads"],["doocument","document"],["doocumentaries","documentaries"],["doocumentary","documentary"],["doocumentation","documentation"],["doocumentations","documentations"],["doocumented","documented"],["doocumenting","documenting"],["doocuments","documents"],["doorjam","doorjamb"],["dorce","force"],["dorced","forced"],["dorceful","forceful"],["dordered","ordered"],["dorment","dormant"],["dorp","drop"],["dosclosed","disclosed"],["doscloses","discloses"],["dosclosing","disclosing"],["dosclosure","disclosure"],["dosclosures","disclosures"],["dosen't","doesn't"],["dosen;t","doesn't"],["dosens","dozens"],["dosent'","doesn't"],["dosent","doesn't"],["dosent;","doesn't"],["dosn't","doesn't"],["dosn;t","doesn't"],["dosnt","doesn't"],["dosposing","disposing"],["dosument","document"],["dosuments","documents"],["dota","data"],["doube","double"],["doube-click","double-click"],["doube-clicked","double-clicked"],["doube-clicks","double-clicks"],["doube-quote","double-quote"],["doube-quoted","double-quoted"],["doube-word","double-word"],["doube-wprd","double-word"],["doubeclick","double-click"],["doubeclicked","double-clicked"],["doubeclicks","double-clicks"],["doubel","double"],["doubele-click","double-click"],["doubele-clicked","double-clicked"],["doubele-clicks","double-clicks"],["doubeleclick","double-click"],["doubeleclicked","double-clicked"],["doubeleclicks","double-clicks"],["doubely","doubly"],["doubes","doubles"],["doublde","double"],["doublded","doubled"],["doubldes","doubles"],["doubleclick","double-click"],["doublely","doubly"],["doubletquote","doublequote"],["doubth","doubt"],["doubthed","doubted"],["doubthing","doubting"],["doubths","doubts"],["doucment","document"],["doucmentated","documented"],["doucmentation","documentation"],["doucmented","documented"],["doucmenter","documenter"],["doucmenters","documenters"],["doucmentes","documents"],["doucmenting","documenting"],["doucments","documents"],["douible","double"],["douibled","doubled"],["doulbe","double"],["doumentc","document"],["dout","doubt"],["dowgrade","downgrade"],["dowlink","downlink"],["dowlinks","downlinks"],["dowload","download"],["dowloaded","downloaded"],["dowloader","downloader"],["dowloaders","downloaders"],["dowloading","downloading"],["dowloads","downloads"],["downagrade","downgrade"],["downagraded","downgraded"],["downagrades","downgrades"],["downagrading","downgrading"],["downgade","downgrade"],["downgaded","downgraded"],["downgades","downgrades"],["downgading","downgrading"],["downgarade","downgrade"],["downgaraded","downgraded"],["downgarades","downgrades"],["downgarading","downgrading"],["downgarde","downgrade"],["downgarded","downgraded"],["downgardes","downgrades"],["downgarding","downgrading"],["downgarte","downgrade"],["downgarted","downgraded"],["downgartes","downgrades"],["downgarting","downgrading"],["downgradde","downgrade"],["downgradded","downgraded"],["downgraddes","downgrades"],["downgradding","downgrading"],["downgradei","downgrade"],["downgradingn","downgrading"],["downgrate","downgrade"],["downgrated","downgraded"],["downgrates","downgrades"],["downgrating","downgrading"],["downlad","download"],["downladed","downloaded"],["downlading","downloading"],["downlads","downloads"],["downlaod","download"],["downlaoded","downloaded"],["downlaodes","downloads"],["downlaoding","downloading"],["downlaods","downloads"],["downloadmanger","downloadmanager"],["downlod","download"],["downloded","downloaded"],["downloding","downloading"],["downlods","downloads"],["downlowd","download"],["downlowded","downloaded"],["downlowding","downloading"],["downlowds","downloads"],["downoad","download"],["downoaded","downloaded"],["downoading","downloading"],["downoads","downloads"],["downoload","download"],["downoloaded","downloaded"],["downoloading","downloading"],["downoloads","downloads"],["downrade","downgrade"],["downraded","downgraded"],["downrades","downgrades"],["downrading","downgrading"],["downrgade","downgrade"],["downrgaded","downgraded"],["downrgades","downgrades"],["downrgading","downgrading"],["downsteram","downstream"],["downsteramed","downstreamed"],["downsteramer","downstreamer"],["downsteramers","downstreamers"],["downsteraming","downstreaming"],["downsterams","downstreams"],["dows","does"],["dowt","doubt"],["doxgen","doxygen"],["doygen","doxygen"],["dpeends","depends"],["dpendent","dependent"],["dpkg-buildpackge","dpkg-buildpackage"],["dpkg-buildpackges","dpkg-buildpackages"],["dpuble","double"],["dpubles","doubles"],["draconain","draconian"],["dragable","draggable"],["draged","dragged"],["draging","dragging"],["draing","drawing"],["drammatic","dramatic"],["dramtic","dramatic"],["dran","drawn"],["drastical","drastically"],["drasticaly","drastically"],["drats","drafts"],["draughtman","draughtsman"],["Dravadian","Dravidian"],["draview","drawview"],["drawack","drawback"],["drawacks","drawbacks"],["drawm","drawn"],["drawng","drawing"],["dreasm","dreams"],["dreawn","drawn"],["dregee","degree"],["dregees","degrees"],["dregree","degree"],["dregrees","degrees"],["drescription","description"],["drescriptions","descriptions"],["driagram","diagram"],["driagrammed","diagrammed"],["driagramming","diagramming"],["driagrams","diagrams"],["driectly","directly"],["drity","dirty"],["driveing","driving"],["drivr","driver"],["drnik","drink"],["drob","drop"],["dropabel","droppable"],["dropable","droppable"],["droped","dropped"],["droping","dropping"],["droppend","dropped"],["droppped","dropped"],["dropse","drops"],["droput","dropout"],["druing","during"],["druming","drumming"],["drummless","drumless"],["drvier","driver"],["drwaing","drawing"],["drwawing","drawing"],["drwawings","drawings"],["dscrete","discrete"],["dscretion","discretion"],["dscribed","described"],["dsiable","disable"],["dsiabled","disabled"],["dsplays","displays"],["dstination","destination"],["dstinations","destinations"],["dthe","the"],["dtoring","storing"],["dubios","dubious"],["dublicade","duplicate"],["dublicat","duplicate"],["dublicate","duplicate"],["dublicated","duplicated"],["dublicates","duplicates"],["dublication","duplication"],["ducment","document"],["ducument","document"],["duirng","during"],["dulicate","duplicate"],["dum","dumb"],["dumplicate","duplicate"],["dumplicated","duplicated"],["dumplicates","duplicates"],["dumplicating","duplicating"],["duoblequote","doublequote"],["dupicate","duplicate"],["duplacate","duplicate"],["duplacated","duplicated"],["duplacates","duplicates"],["duplacation","duplication"],["duplacte","duplicate"],["duplacted","duplicated"],["duplactes","duplicates"],["duplaction","duplication"],["duplaicate","duplicate"],["duplaicated","duplicated"],["duplaicates","duplicates"],["duplaication","duplication"],["duplate","duplicate"],["duplated","duplicated"],["duplates","duplicates"],["duplation","duplication"],["duplcate","duplicate"],["duplciate","duplicate"],["dupliacate","duplicate"],["dupliacates","duplicates"],["dupliace","duplicate"],["dupliacte","duplicate"],["dupliacted","duplicated"],["dupliactes","duplicates"],["dupliagte","duplicate"],["dupliate","duplicate"],["dupliated","duplicated"],["dupliates","duplicates"],["dupliating","duplicating"],["dupliation","duplication"],["dupliations","duplications"],["duplicat","duplicate"],["duplicatd","duplicated"],["duplicats","duplicates"],["dupplicate","duplicate"],["dupplicated","duplicated"],["dupplicates","duplicates"],["dupplicating","duplicating"],["dupplication","duplication"],["dupplications","duplications"],["durationm","duration"],["durectories","directories"],["durectory","directory"],["dureing","during"],["durig","during"],["durining","during"],["durning","during"],["durring","during"],["duting","during"],["dyanamically","dynamically"],["dyanmic","dynamic"],["dyanmically","dynamically"],["dyas","dryas"],["dymamically","dynamically"],["dynamc","dynamic"],["dynamcly","dynamically"],["dynamcs","dynamics"],["dynamicaly","dynamically"],["dynamiclly","dynamically"],["dynamicly","dynamically"],["dynaminc","dynamic"],["dynamincal","dynamical"],["dynamincally","dynamically"],["dynamincs","dynamics"],["dynamlic","dynamic"],["dynamlically","dynamically"],["dynically","dynamically"],["dynmaic","dynamic"],["dynmaically","dynamically"],["dynmic","dynamic"],["dynmically","dynamically"],["dynmics","dynamics"],["eabled","enabled"],["eacf","each"],["eacg","each"],["eachother","each other"],["eachs","each"],["eactly","exactly"],["eagrely","eagerly"],["eahc","each"],["eailier","earlier"],["eaiser","easier"],["ealier","earlier"],["ealiest","earliest"],["eample","example"],["eamples","examples"],["eanable","enable"],["eanble","enable"],["earleir","earlier"],["earler","earlier"],["earliear","earlier"],["earlies","earliest"],["earlist","earliest"],["earlyer","earlier"],["earnt","earned"],["earpeice","earpiece"],["easely","easily"],["easili","easily"],["easiliy","easily"],["easilly","easily"],["easist","easiest"],["easiy","easily"],["easly","easily"],["easyer","easier"],["eaxct","exact"],["ebale","enable"],["ebaled","enabled"],["EBCIDC","EBCDIC"],["ebedded","embedded"],["eccessive","excessive"],["ecclectic","eclectic"],["eceonomy","economy"],["ecept","except"],["eception","exception"],["eceptions","exceptions"],["ecidious","deciduous"],["eclise","eclipse"],["eclispe","eclipse"],["ecnetricity","eccentricity"],["ecognized","recognized"],["ecomonic","economic"],["ecounter","encounter"],["ecountered","encountered"],["ecountering","encountering"],["ecounters","encounters"],["ecplicit","explicit"],["ecplicitly","explicitly"],["ecspecially","especially"],["ect","etc"],["ecxept","except"],["ecxite","excite"],["ecxited","excited"],["ecxites","excites"],["ecxiting","exciting"],["ecxtracted","extracted"],["EDCDIC","EBCDIC"],["eddge","edge"],["eddges","edges"],["edditable","editable"],["ede","edge"],["ediable","editable"],["edige","edge"],["ediges","edges"],["ediit","edit"],["ediiting","editing"],["ediitor","editor"],["ediitors","editors"],["ediits","edits"],["editedt","edited"],["editiing","editing"],["editoro","editor"],["editot","editor"],["editots","editors"],["editt","edit"],["editted","edited"],["editter","editor"],["editting","editing"],["edittor","editor"],["edn","end"],["ednif","endif"],["edxpected","expected"],["eearly","early"],["eeeprom","EEPROM"],["eescription","description"],["eevery","every"],["eeverything","everything"],["eeverywhere","everywhere"],["eextract","extract"],["eextracted","extracted"],["eextracting","extracting"],["eextraction","extraction"],["eextracts","extracts"],["efect","effect"],["efective","effective"],["efectively","effectively"],["efel","evil"],["eferences","references"],["efetivity","effectivity"],["effciency","efficiency"],["effcient","efficient"],["effciently","efficiently"],["effctive","effective"],["effctively","effectively"],["effeciency","efficiency"],["effecient","efficient"],["effeciently","efficiently"],["effecitvely","effectively"],["effeck","effect"],["effecked","effected"],["effecks","effects"],["effeckt","effect"],["effectice","effective"],["effecticely","effectively"],["effectiviness","effectiveness"],["effectivness","effectiveness"],["effectly","effectively"],["effedts","effects"],["effekt","effect"],["effexts","effects"],["efficcient","efficient"],["efficencty","efficiency"],["efficency","efficiency"],["efficent","efficient"],["efficently","efficiently"],["effiency","efficiency"],["effient","efficient"],["effiently","efficiently"],["effulence","effluence"],["eforceable","enforceable"],["egal","equal"],["egals","equals"],["egde","edge"],["egdes","edges"],["ege","edge"],["egenral","general"],["egenralise","generalise"],["egenralised","generalised"],["egenralises","generalises"],["egenralize","generalize"],["egenralized","generalized"],["egenralizes","generalizes"],["egenrally","generally"],["ehance","enhance"],["ehanced","enhanced"],["ehancement","enhancement"],["ehancements","enhancements"],["ehenever","whenever"],["ehough","enough"],["ehr","her"],["ehternet","Ethernet"],["ehthernet","ethernet"],["eighter","either"],["eihter","either"],["einstance","instance"],["eisntance","instance"],["eiter","either"],["eith","with"],["elaspe","elapse"],["elasped","elapsed"],["elaspes","elapses"],["elasping","elapsing"],["elction","election"],["elctromagnetic","electromagnetic"],["elease","release"],["eleased","released"],["eleases","releases"],["eleate","relate"],["electical","electrical"],["electirc","electric"],["electircal","electrical"],["electrial","electrical"],["electricly","electrically"],["electricty","electricity"],["electrinics","electronics"],["electriv","electric"],["electrnoics","electronics"],["eleemnt","element"],["eleent","element"],["elegible","eligible"],["elelement","element"],["elelements","elements"],["elelment","element"],["elelmental","elemental"],["elelmentary","elementary"],["elelments","elements"],["elemant","element"],["elemantary","elementary"],["elemement","element"],["elemements","elements"],["elememt","element"],["elemen","element"],["elemenent","element"],["elemenental","elemental"],["elemenents","elements"],["elemenet","element"],["elemenets","elements"],["elemens","elements"],["elemenst","elements"],["elementay","elementary"],["elementry","elementary"],["elemet","element"],["elemetal","elemental"],["elemetn","element"],["elemetns","elements"],["elemets","elements"],["eleminate","eliminate"],["eleminated","eliminated"],["eleminates","eliminates"],["eleminating","eliminating"],["elemnets","elements"],["elemnt","element"],["elemntal","elemental"],["elemnts","elements"],["elemt","element"],["elemtary","elementary"],["elemts","elements"],["elenment","element"],["eles","else"],["eletricity","electricity"],["eletromagnitic","electromagnetic"],["eletronic","electronic"],["elgible","eligible"],["elicided","elicited"],["eligable","eligible"],["elimentary","elementary"],["elimiante","eliminate"],["elimiate","eliminate"],["eliminetaion","elimination"],["elimintate","eliminate"],["eliminte","eliminate"],["elimnated","eliminated"],["eliptic","elliptic"],["eliptical","elliptical"],["elipticity","ellipticity"],["ellapsed","elapsed"],["ellected","elected"],["ellement","element"],["ellemental","elemental"],["ellementals","elementals"],["ellements","elements"],["elliminate","eliminate"],["elliminated","eliminated"],["elliminates","eliminates"],["elliminating","eliminating"],["ellipsises","ellipsis"],["ellision","elision"],["elmenet","element"],["elmenets","elements"],["elment","element"],["elments","elements"],["elminate","eliminate"],["elminated","eliminated"],["elminates","eliminates"],["elminating","eliminating"],["elphant","elephant"],["elsef","elseif"],["elsehwere","elsewhere"],["elseof","elseif"],["elseswhere","elsewhere"],["elsewehere","elsewhere"],["elsewere","elsewhere"],["elsewhwere","elsewhere"],["elsiof","elseif"],["elsof","elseif"],["emabaroged","embargoed"],["emable","enable"],["emabled","enabled"],["emables","enables"],["emabling","enabling"],["emailling","emailing"],["embarass","embarrass"],["embarassed","embarrassed"],["embarasses","embarrasses"],["embarassing","embarrassing"],["embarassment","embarrassment"],["embargos","embargoes"],["embarras","embarrass"],["embarrased","embarrassed"],["embarrasing","embarrassing"],["embarrasingly","embarrassingly"],["embarrasment","embarrassment"],["embbedded","embedded"],["embbeded","embedded"],["embdder","embedder"],["embdedded","embedded"],["embebbed","embedded"],["embedd","embed"],["embeddded","embedded"],["embeddeding","embedding"],["embedds","embeds"],["embeded","embedded"],["embededded","embedded"],["embeed","embed"],["embezelled","embezzled"],["emblamatic","emblematic"],["embold","embolden"],["embrodery","embroidery"],["emcompass","encompass"],["emcompassed","encompassed"],["emcompassing","encompassing"],["emedded","embedded"],["emegrency","emergency"],["emenet","element"],["emenets","elements"],["emiited","emitted"],["eminate","emanate"],["eminated","emanated"],["emision","emission"],["emited","emitted"],["emiting","emitting"],["emlation","emulation"],["emmediately","immediately"],["emminently","eminently"],["emmisaries","emissaries"],["emmisarries","emissaries"],["emmisarry","emissary"],["emmisary","emissary"],["emmision","emission"],["emmisions","emissions"],["emmit","emit"],["emmited","emitted"],["emmiting","emitting"],["emmits","emits"],["emmitted","emitted"],["emmitting","emitting"],["emnity","enmity"],["emoty","empty"],["emough","enough"],["emought","enough"],["emperical","empirical"],["emperically","empirically"],["emphaised","emphasised"],["emphsis","emphasis"],["emphysyma","emphysema"],["empiracally","empirically"],["empiricaly","empirically"],["emplyed","employed"],["emplyee","employee"],["emplyees","employees"],["emplyer","employer"],["emplyers","employers"],["emplying","employing"],["emplyment","employment"],["emplyments","employments"],["emporer","emperor"],["emprically","empirically"],["emprisoned","imprisoned"],["emprove","improve"],["emproved","improved"],["emprovement","improvement"],["emprovements","improvements"],["emproves","improves"],["emproving","improving"],["emptniess","emptiness"],["emptry","empty"],["emptyed","emptied"],["emptyy","empty"],["empy","empty"],["emtied","emptied"],["emties","empties"],["emtpies","empties"],["emtpy","empty"],["emty","empty"],["emtying","emptying"],["emultor","emulator"],["emultors","emulators"],["enabe","enable"],["enabel","enable"],["enabeled","enabled"],["enabeling","enabling"],["enabing","enabling"],["enabledi","enabled"],["enableing","enabling"],["enablen","enabled"],["enalbe","enable"],["enalbed","enabled"],["enalbes","enables"],["enameld","enameled"],["enaugh","enough"],["enbable","enable"],["enbabled","enabled"],["enbabling","enabling"],["enbale","enable"],["enbaled","enabled"],["enbales","enables"],["enbaling","enabling"],["enbedding","embedding"],["enble","enable"],["encapsualtes","encapsulates"],["encapsulatzion","encapsulation"],["encapsultion","encapsulation"],["encaspulate","encapsulate"],["encaspulated","encapsulated"],["encaspulates","encapsulates"],["encaspulating","encapsulating"],["encaspulation","encapsulation"],["enchanced","enhanced"],["enclosng","enclosing"],["enclosue","enclosure"],["enclosung","enclosing"],["enclude","include"],["encluding","including"],["encocde","encode"],["encocded","encoded"],["encocder","encoder"],["encocders","encoders"],["encocdes","encodes"],["encocding","encoding"],["encocdings","encodings"],["encodingt","encoding"],["encodning","encoding"],["encodnings","encodings"],["encompas","encompass"],["encompased","encompassed"],["encompases","encompasses"],["encompasing","encompassing"],["enconde","encode"],["enconded","encoded"],["enconder","encoder"],["enconders","encoders"],["encondes","encodes"],["enconding","encoding"],["encondings","encodings"],["encorded","encoded"],["encorder","encoder"],["encorders","encoders"],["encording","encoding"],["encordings","encodings"],["encorporating","incorporating"],["encoser","encoder"],["encosers","encoders"],["encosure","enclosure"],["encounterd","encountered"],["encountres","encounters"],["encouraing","encouraging"],["encouter","encounter"],["encoutered","encountered"],["encouters","encounters"],["encoutner","encounter"],["encoutners","encounters"],["encouttering","encountering"],["encrcypt","encrypt"],["encrcypted","encrypted"],["encrcyption","encryption"],["encrcyptions","encryptions"],["encrcypts","encrypts"],["encript","encrypt"],["encripted","encrypted"],["encription","encryption"],["encriptions","encryptions"],["encripts","encrypts"],["encrpt","encrypt"],["encrpted","encrypted"],["encrption","encryption"],["encrptions","encryptions"],["encrpts","encrypts"],["encrupted","encrypted"],["encrypiton","encryption"],["encryptiion","encryption"],["encryptio","encryption"],["encryptiong","encryption"],["encrytion","encryption"],["encrytped","encrypted"],["encrytption","encryption"],["encupsulates","encapsulates"],["encylopedia","encyclopedia"],["encypted","encrypted"],["encyption","encryption"],["endcoded","encoded"],["endcoder","encoder"],["endcoders","encoders"],["endcodes","encodes"],["endcoding","encoding"],["endcodings","encodings"],["endding","ending"],["ende","end"],["endevors","endeavors"],["endevour","endeavour"],["endfi","endif"],["endianes","endianness"],["endianess","endianness"],["endianity","endianness"],["endiannes","endianness"],["endig","ending"],["endiness","endianness"],["endnoden","endnode"],["endoint","endpoint"],["endolithes","endoliths"],["endpints","endpoints"],["endpiont","endpoint"],["endpionts","endpoints"],["endpont","endpoint"],["endponts","endpoints"],["endsup","ends up"],["enduce","induce"],["eneables","enables"],["enebale","enable"],["enebaled","enabled"],["eneble","enable"],["ened","need"],["enegeries","energies"],["enegery","energy"],["enehanced","enhanced"],["enery","energy"],["eneter","enter"],["enetered","entered"],["enetities","entities"],["enetity","entity"],["eneumeration","enumeration"],["eneumerations","enumerations"],["eneumretaion","enumeration"],["eneumretaions","enumerations"],["enew","new"],["enflamed","inflamed"],["enforcable","enforceable"],["enforceing","enforcing"],["enforcmement","enforcement"],["enforcment","enforcement"],["enfore","enforce"],["enfored","enforced"],["enfores","enforces"],["enforncing","enforcing"],["engagment","engagement"],["engeneer","engineer"],["engeneering","engineering"],["engery","energy"],["engieer","engineer"],["engieneer","engineer"],["engieneers","engineers"],["enginee","engine"],["enginge","engine"],["enginin","engine"],["enginineer","engineer"],["engoug","enough"],["enhabce","enhance"],["enhabced","enhanced"],["enhabces","enhances"],["enhabcing","enhancing"],["enhace","enhance"],["enhaced","enhanced"],["enhacement","enhancement"],["enhacements","enhancements"],["enhancd","enhanced"],["enhancment","enhancement"],["enhancments","enhancements"],["enhaned","enhanced"],["enhence","enhance"],["enhenced","enhanced"],["enhencement","enhancement"],["enhencements","enhancements"],["enhencment","enhancement"],["enhencments","enhancements"],["enironment","environment"],["enironments","environments"],["enities","entities"],["enitities","entities"],["enitity","entity"],["enitre","entire"],["enivornment","environment"],["enivornments","environments"],["enivronment","environment"],["enlargment","enlargement"],["enlargments","enlargements"],["enlightnment","enlightenment"],["enlose","enclose"],["enmpty","empty"],["enmum","enum"],["ennpoint","endpoint"],["enntries","entries"],["enocde","encode"],["enocded","encoded"],["enocder","encoder"],["enocders","encoders"],["enocdes","encodes"],["enocding","encoding"],["enocdings","encodings"],["enogh","enough"],["enoght","enough"],["enoguh","enough"],["enouch","enough"],["enoucnter","encounter"],["enoucntered","encountered"],["enoucntering","encountering"],["enoucnters","encounters"],["enouf","enough"],["enoufh","enough"],["enought","enough"],["enoughts","enough"],["enougth","enough"],["enouh","enough"],["enouhg","enough"],["enouncter","encounter"],["enounctered","encountered"],["enounctering","encountering"],["enouncters","encounters"],["enoung","enough"],["enoungh","enough"],["enounter","encounter"],["enountered","encountered"],["enountering","encountering"],["enounters","encounters"],["enouph","enough"],["enourage","encourage"],["enouraged","encouraged"],["enourages","encourages"],["enouraging","encouraging"],["enourmous","enormous"],["enourmously","enormously"],["enouth","enough"],["enouugh","enough"],["enpoint","endpoint"],["enpoints","endpoints"],["enque","enqueue"],["enqueing","enqueuing"],["enrties","entries"],["enrtries","entries"],["enrtry","entry"],["enrty","entry"],["ensconsed","ensconced"],["entaglements","entanglements"],["entended","intended"],["entension","extension"],["entensions","extensions"],["ententries","entries"],["enterance","entrance"],["enteratinment","entertainment"],["entereing","entering"],["enterie","entry"],["enteries","entries"],["enterily","entirely"],["enterprice","enterprise"],["enterprices","enterprises"],["entery","entry"],["enteties","entities"],["entety","entity"],["enthaplies","enthalpies"],["enthaply","enthalpy"],["enthousiasm","enthusiasm"],["enthusiam","enthusiasm"],["enthusiatic","enthusiastic"],["entierly","entirely"],["entireity","entirety"],["entires","entries"],["entirey","entirely"],["entirity","entirety"],["entirly","entirely"],["entitee","entity"],["entitees","entities"],["entites","entities"],["entiti","entity"],["entitie","entity"],["entitites","entities"],["entitities","entities"],["entitity","entity"],["entitiy","entity"],["entitiys","entities"],["entitlied","entitled"],["entitys","entities"],["entoties","entities"],["entoty","entity"],["entrace","entrance"],["entraced","entranced"],["entraces","entrances"],["entrepeneur","entrepreneur"],["entrepeneurs","entrepreneurs"],["entriess","entries"],["entrophy","entropy"],["enttries","entries"],["enttry","entry"],["enulation","emulation"],["enumarate","enumerate"],["enumarated","enumerated"],["enumarates","enumerates"],["enumarating","enumerating"],["enumation","enumeration"],["enumearate","enumerate"],["enumearation","enumeration"],["enumerble","enumerable"],["enumertaion","enumeration"],["enusre","ensure"],["envaluation","evaluation"],["enveloppe","envelope"],["envelopped","enveloped"],["enveloppes","envelopes"],["envelopping","enveloping"],["enver","never"],["envioment","environment"],["enviomental","environmental"],["envioments","environments"],["envionment","environment"],["envionmental","environmental"],["envionments","environments"],["enviorement","environment"],["envioremental","environmental"],["enviorements","environments"],["enviorenment","environment"],["enviorenmental","environmental"],["enviorenments","environments"],["enviorment","environment"],["enviormental","environmental"],["enviormentally","environmentally"],["enviorments","environments"],["enviornemnt","environment"],["enviornemntal","environmental"],["enviornemnts","environments"],["enviornment","environment"],["enviornmental","environmental"],["enviornmentalist","environmentalist"],["enviornmentally","environmentally"],["enviornments","environments"],["envioronment","environment"],["envioronmental","environmental"],["envioronments","environments"],["envireonment","environment"],["envirionment","environment"],["envirnment","environment"],["envirnmental","environmental"],["envirnments","environments"],["envirnoment","environment"],["envirnoments","environments"],["enviroiment","environment"],["enviroment","environment"],["enviromental","environmental"],["enviromentalist","environmentalist"],["enviromentally","environmentally"],["enviroments","environments"],["enviromnent","environment"],["enviromnental","environmental"],["enviromnentally","environmentally"],["enviromnents","environments"],["environement","environment"],["environemnt","environment"],["environemntal","environmental"],["environemnts","environments"],["environent","environment"],["environmane","environment"],["environmenet","environment"],["environmenets","environments"],["environmet","environment"],["environmets","environments"],["environmnet","environment"],["environmont","environment"],["environnement","environment"],["environtment","environment"],["envolutionary","evolutionary"],["envolved","involved"],["envorce","enforce"],["envrion","environ"],["envrionment","environment"],["envrionmental","environmental"],["envrionments","environments"],["envrions","environs"],["envriron","environ"],["envrironment","environment"],["envrironmental","environmental"],["envrironments","environments"],["envrirons","environs"],["envvironment","environment"],["enxt","next"],["enything","anything"],["enyway","anyway"],["epecifica","especifica"],["epect","expect"],["epected","expected"],["epectedly","expectedly"],["epecting","expecting"],["epects","expects"],["ephememeral","ephemeral"],["ephememeris","ephemeris"],["epidsodes","episodes"],["epigramic","epigrammatic"],["epilgoue","epilogue"],["episdoe","episode"],["episdoes","episodes"],["eploit","exploit"],["eploits","exploits"],["epmty","empty"],["epressions","expressions"],["epsiode","episode"],["eptied","emptied"],["eptier","emptier"],["epties","empties"],["eptrapolate","extrapolate"],["eptrapolated","extrapolated"],["eptrapolates","extrapolates"],["epty","empty"],["epxanded","expanded"],["epxected","expected"],["epxiressions","expressions"],["epxlicit","explicit"],["eqaul","equal"],["eqaulity","equality"],["eqaulizer","equalizer"],["eqivalent","equivalent"],["eqivalents","equivalents"],["equailateral","equilateral"],["equalibrium","equilibrium"],["equallity","equality"],["equalls","equals"],["equaly","equally"],["equeation","equation"],["equeations","equations"],["equel","equal"],["equelibrium","equilibrium"],["equialent","equivalent"],["equil","equal"],["equilavalent","equivalent"],["equilibium","equilibrium"],["equilibrum","equilibrium"],["equilvalent","equivalent"],["equilvalently","equivalently"],["equilvalents","equivalents"],["equiped","equipped"],["equipmentd","equipment"],["equipments","equipment"],["equippment","equipment"],["equiptment","equipment"],["equitorial","equatorial"],["equivalance","equivalence"],["equivalant","equivalent"],["equivelant","equivalent"],["equivelent","equivalent"],["equivelents","equivalents"],["equivilant","equivalent"],["equivilent","equivalent"],["equivivalent","equivalent"],["equivlalent","equivalent"],["equivlantly","equivalently"],["equivlent","equivalent"],["equivlently","equivalently"],["equivlents","equivalents"],["equivqlent","equivalent"],["eqution","equation"],["equtions","equations"],["equvalent","equivalent"],["equvivalent","equivalent"],["erasablocks","eraseblocks"],["eratic","erratic"],["eratically","erratically"],["eraticly","erratically"],["erformance","performance"],["erliear","earlier"],["erlier","earlier"],["erly","early"],["ermergency","emergency"],["eroneous","erroneous"],["eror","error"],["erorneus","erroneous"],["erorneusly","erroneously"],["erorr","error"],["erorrs","errors"],["erors","errors"],["erraneously","erroneously"],["erro","error"],["erroneus","erroneous"],["erroneusly","erroneously"],["erronous","erroneous"],["erronously","erroneously"],["errorneous","erroneous"],["errorneously","erroneously"],["errorneus","erroneous"],["errornous","erroneous"],["errornously","erroneously"],["errorprone","error-prone"],["errorr","error"],["erros","errors"],["errot","error"],["errots","errors"],["errro","error"],["errror","error"],["errrors","errors"],["errros","errors"],["errupted","erupted"],["ertoneous","erroneous"],["ertoneously","erroneously"],["ervery","every"],["erverything","everything"],["esacpe","escape"],["esacped","escaped"],["esacpes","escapes"],["escalte","escalate"],["escalted","escalated"],["escaltes","escalates"],["escalting","escalating"],["escaltion","escalation"],["escapeable","escapable"],["escapemant","escapement"],["escased","escaped"],["escation","escalation"],["esccape","escape"],["esccaped","escaped"],["escpae","escape"],["escpaed","escaped"],["esecute","execute"],["esential","essential"],["esentially","essentially"],["esge","edge"],["esger","edger"],["esgers","edgers"],["esges","edges"],["esging","edging"],["esiest","easiest"],["esimate","estimate"],["esimated","estimated"],["esimates","estimates"],["esimating","estimating"],["esimation","estimation"],["esimations","estimations"],["esimator","estimator"],["esimators","estimators"],["esists","exists"],["esitmate","estimate"],["esitmated","estimated"],["esitmates","estimates"],["esitmating","estimating"],["esitmation","estimation"],["esitmations","estimations"],["esitmator","estimator"],["esitmators","estimators"],["esle","else"],["esnure","ensure"],["esnured","ensured"],["esnures","ensures"],["espacally","especially"],["espace","escape"],["espaced","escaped"],["espaces","escapes"],["espacially","especially"],["espacing","escaping"],["espcially","especially"],["especailly","especially"],["especally","especially"],["especialy","especially"],["especialyl","especially"],["especiially","especially"],["espect","expect"],["espeically","especially"],["esseintially","essentially"],["essencial","essential"],["essense","essence"],["essentail","essential"],["essentailly","essentially"],["essentaily","essentially"],["essental","essential"],["essentally","essentially"],["essentals","essentials"],["essentialy","essentially"],["essentual","essential"],["essentually","essentially"],["essentualy","essentially"],["essesital","essential"],["essesitally","essentially"],["essesitaly","essentially"],["essiential","essential"],["esssential","essential"],["estabilish","establish"],["estabish","establish"],["estabishd","established"],["estabished","established"],["estabishes","establishes"],["estabishing","establishing"],["establised","established"],["establishs","establishes"],["establising","establishing"],["establsihed","established"],["estbalishment","establishment"],["estimage","estimate"],["estimages","estimates"],["estiomator","estimator"],["estiomators","estimators"],["esy","easy"],["etablish","establish"],["etablishd","established"],["etablished","established"],["etablishing","establishing"],["etcc","etc"],["etcp","etc"],["etensible","extensible"],["etension","extension"],["etensions","extensions"],["ethe","the"],["etherenet","Ethernet"],["ethernal","eternal"],["ethnocentricm","ethnocentrism"],["etiher","either"],["etroneous","erroneous"],["etroneously","erroneously"],["etsablishment","establishment"],["etsbalishment","establishment"],["etst","test"],["etsts","tests"],["etxt","text"],["euclidian","euclidean"],["euivalent","equivalent"],["euivalents","equivalents"],["euqivalent","equivalent"],["euqivalents","equivalents"],["euristic","heuristic"],["euristics","heuristics"],["Europian","European"],["Europians","Europeans"],["Eurpean","European"],["Eurpoean","European"],["evalation","evaluation"],["evalite","evaluate"],["evalited","evaluated"],["evalites","evaluates"],["evaluataion","evaluation"],["evaluataions","evaluations"],["evalueate","evaluate"],["evalueated","evaluated"],["evaluete","evaluate"],["evalueted","evaluated"],["evalulates","evaluates"],["evalutae","evaluate"],["evalutaed","evaluated"],["evalutaeing","evaluating"],["evalutaes","evaluates"],["evalutaing","evaluating"],["evalutaion","evaluation"],["evalutaions","evaluations"],["evalutaor","evaluator"],["evalutate","evaluate"],["evalutated","evaluated"],["evalutates","evaluates"],["evalutating","evaluating"],["evalutation","evaluation"],["evalutations","evaluations"],["evalute","evaluate"],["evaluted","evaluated"],["evalutes","evaluates"],["evaluting","evaluating"],["evalutions","evaluations"],["evalutive","evaluative"],["evalutor","evaluator"],["evalutors","evaluators"],["evaulate","evaluate"],["evaulated","evaluated"],["evaulates","evaluates"],["evaulating","evaluating"],["evaulation","evaluation"],["evaulator","evaluator"],["evaulted","evaluated"],["evauluate","evaluate"],["evauluated","evaluated"],["evauluates","evaluates"],["evauluation","evaluation"],["eveluate","evaluate"],["eveluated","evaluated"],["eveluates","evaluates"],["eveluating","evaluating"],["eveluation","evaluation"],["eveluations","evaluations"],["eveluator","evaluator"],["eveluators","evaluators"],["evenhtually","eventually"],["eventally","eventually"],["eventaully","eventually"],["eventhanders","event handlers"],["eventhough","even though"],["eventially","eventually"],["eventuall","eventually"],["eventualy","eventually"],["evenually","eventually"],["eveolution","evolution"],["eveolutionary","evolutionary"],["eveolve","evolve"],["eveolved","evolved"],["eveolves","evolves"],["eveolving","evolving"],["everage","average"],["everaged","averaged"],["everbody","everybody"],["everithing","everything"],["everone","everyone"],["everthing","everything"],["evertyhign","everything"],["evertyhing","everything"],["evertything","everything"],["everwhere","everywhere"],["everyhing","everything"],["everyhting","everything"],["everythig","everything"],["everythign","everything"],["everythin","everything"],["everythings","everything"],["everytime","every time"],["everyting","everything"],["everytone","everyone"],["evey","every"],["eveyone","everyone"],["eveyr","every"],["evidentally","evidently"],["evironment","environment"],["evironments","environments"],["evition","eviction"],["evluate","evaluate"],["evluated","evaluated"],["evluates","evaluates"],["evluating","evaluating"],["evluation","evaluation"],["evluations","evaluations"],["evluative","evaluative"],["evluator","evaluator"],["evluators","evaluators"],["evnet","event"],["evnts","events"],["evoluate","evaluate"],["evoluated","evaluated"],["evoluates","evaluates"],["evoluation","evaluations"],["evovler","evolver"],["evovling","evolving"],["evrithing","everything"],["evry","every"],["evrythign","everything"],["evrything","everything"],["evrywhere","everywhere"],["evyrthing","everything"],["ewhwer","where"],["exaclty","exactly"],["exacly","exactly"],["exactely","exactly"],["exacty","exactly"],["exacutable","executable"],["exagerate","exaggerate"],["exagerated","exaggerated"],["exagerates","exaggerates"],["exagerating","exaggerating"],["exagerrate","exaggerate"],["exagerrated","exaggerated"],["exagerrates","exaggerates"],["exagerrating","exaggerating"],["exameple","example"],["exameples","examples"],["examied","examined"],["examinated","examined"],["examing","examining"],["examinining","examining"],["examle","example"],["examles","examples"],["examlpe","example"],["examlpes","examples"],["examnple","example"],["examnples","examples"],["exampel","example"],["exampeles","examples"],["exampels","examples"],["examplees","examples"],["examplifies","exemplifies"],["exampple","example"],["exampples","examples"],["exampt","exempt"],["exand","expand"],["exansive","expansive"],["exapansion","expansion"],["exapend","expand"],["exaplain","explain"],["exaplaination","explanation"],["exaplained","explained"],["exaplaining","explaining"],["exaplains","explains"],["exaplanation","explanation"],["exaplanations","explanations"],["exaple","example"],["exaples","examples"],["exapmle","example"],["exapmles","examples"],["exapnsion","expansion"],["exat","exact"],["exatcly","exactly"],["exatctly","exactly"],["exatly","exactly"],["exausted","exhausted"],["excact","exact"],["excactly","exactly"],["excahcnge","exchange"],["excahnge","exchange"],["excahnges","exchanges"],["excange","exchange"],["excape","escape"],["excaped","escaped"],["excapes","escapes"],["excat","exact"],["excating","exacting"],["excatly","exactly"],["exccute","execute"],["excecise","exercise"],["excecises","exercises"],["excecpt","except"],["excecption","exception"],["excecptional","exceptional"],["excecptions","exceptions"],["excectable","executable"],["excectables","executables"],["excecte","execute"],["excectedly","expectedly"],["excectes","executes"],["excecting","executing"],["excectional","exceptional"],["excective","executive"],["excectives","executives"],["excector","executor"],["excectors","executors"],["excects","expects"],["excecutable","executable"],["excecutables","executables"],["excecute","execute"],["excecuted","executed"],["excecutes","executes"],["excecuting","executing"],["excecution","execution"],["excecutions","executions"],["excecutive","executive"],["excecutives","executives"],["excecutor","executor"],["excecutors","executors"],["excecuts","executes"],["exced","exceed"],["excedded","exceeded"],["excedding","exceeding"],["excede","exceed"],["exceded","exceeded"],["excedeed","exceeded"],["excedes","exceeds"],["exceding","exceeding"],["exceeed","exceed"],["exceirpt","excerpt"],["exceirpts","excerpts"],["excelent","excellent"],["excell","excel"],["excellance","excellence"],["excellant","excellent"],["excells","excels"],["excempt","exempt"],["excempted","exempted"],["excemption","exemption"],["excemptions","exemptions"],["excempts","exempts"],["excentric","eccentric"],["excentricity","eccentricity"],["excentuating","accentuating"],["exceopt","exempt"],["exceopted","exempted"],["exceopts","exempts"],["exceotion","exemption"],["exceotions","exemptions"],["excepetion","exception"],["excepion","exception"],["excepional","exceptional"],["excepionally","exceptionally"],["excepions","exceptions"],["exceprt","excerpt"],["exceprts","excerpts"],["exceptation","expectation"],["exceptionnal","exceptional"],["exceptionss","exceptions"],["exceptionts","exceptions"],["excercise","exercise"],["excercised","exercised"],["excerciser","exerciser"],["excercises","exercises"],["excercising","exercising"],["excerise","exercise"],["exces","excess"],["excesed","exceeded"],["excesive","excessive"],["excesively","excessively"],["excesss","excess"],["excesv","excessive"],["excesvly","excessively"],["excetion","exception"],["excetional","exceptional"],["excetions","exceptions"],["excetpion","exception"],["excetpional","exceptional"],["excetpions","exceptions"],["excetption","exception"],["excetptional","exceptional"],["excetptions","exceptions"],["excetra","etcetera"],["excetutable","executable"],["excetutables","executables"],["excetute","execute"],["excetuted","executed"],["excetutes","executes"],["excetuting","executing"],["excetution","execution"],["excetutions","executions"],["excetutive","executive"],["excetutives","executives"],["excetutor","executor"],["excetutors","executors"],["exceuctable","executable"],["exceuctables","executables"],["exceucte","execute"],["exceucted","executed"],["exceuctes","executes"],["exceucting","executing"],["exceuction","execution"],["exceuctions","executions"],["exceuctive","executive"],["exceuctives","executives"],["exceuctor","executor"],["exceuctors","executors"],["exceutable","executable"],["exceutables","executables"],["exceute","execute"],["exceuted","executed"],["exceutes","executes"],["exceuting","executing"],["exceution","execution"],["exceutions","executions"],["exceutive","executive"],["exceutives","executives"],["exceutor","executor"],["exceutors","executors"],["excewption","exception"],["excewptional","exceptional"],["excewptions","exceptions"],["exchage","exchange"],["exchaged","exchanged"],["exchages","exchanges"],["exchaging","exchanging"],["exchagne","exchange"],["exchagned","exchanged"],["exchagnes","exchanges"],["exchagnge","exchange"],["exchagnged","exchanged"],["exchagnges","exchanges"],["exchagnging","exchanging"],["exchagning","exchanging"],["exchanage","exchange"],["exchanaged","exchanged"],["exchanages","exchanges"],["exchanaging","exchanging"],["exchance","exchange"],["exchanced","exchanged"],["exchances","exchanges"],["exchanche","exchange"],["exchanched","exchanged"],["exchanches","exchanges"],["exchanching","exchanging"],["exchancing","exchanging"],["exchane","exchange"],["exchaned","exchanged"],["exchanes","exchanges"],["exchangable","exchangeable"],["exchaning","exchanging"],["exchaust","exhaust"],["exchausted","exhausted"],["exchausting","exhausting"],["exchaustive","exhaustive"],["exchausts","exhausts"],["exchenge","exchange"],["exchenged","exchanged"],["exchenges","exchanges"],["exchenging","exchanging"],["exchnage","exchange"],["exchnaged","exchanged"],["exchnages","exchanges"],["exchnaging","exchanging"],["exchng","exchange"],["exchngd","exchanged"],["exchnge","exchange"],["exchnged","exchanged"],["exchnges","exchanges"],["exchnging","exchanging"],["exchngng","exchanging"],["exchngs","exchanges"],["exciation","excitation"],["excipt","except"],["exciption","exception"],["exciptions","exceptions"],["excist","exist"],["excisted","existed"],["excisting","existing"],["excitment","excitement"],["exclamantion","exclamation"],["excludde","exclude"],["excludind","excluding"],["exclusiv","exclusive"],["exclusivelly","exclusively"],["exclusivly","exclusively"],["exclusivs","exclusives"],["excluslvely","exclusively"],["exclusuive","exclusive"],["exclusuively","exclusively"],["exclusuives","exclusives"],["excpect","expect"],["excpected","expected"],["excpecting","expecting"],["excpects","expects"],["excpeption","exception"],["excpet","except"],["excpetion","exception"],["excpetional","exceptional"],["excpetions","exceptions"],["excplicit","explicit"],["excplicitly","explicitly"],["excplict","explicit"],["excplictly","explicitly"],["excract","extract"],["exctacted","extracted"],["exctract","extract"],["exctracted","extracted"],["exctracting","extracting"],["exctraction","extraction"],["exctractions","extractions"],["exctractor","extractor"],["exctractors","extractors"],["exctracts","extracts"],["exculde","exclude"],["exculding","excluding"],["exculsive","exclusive"],["exculsively","exclusively"],["exculsivly","exclusively"],["excutable","executable"],["excutables","executables"],["excute","execute"],["excuted","executed"],["excutes","executes"],["excuting","executing"],["excution","execution"],["execeed","exceed"],["execeeded","exceeded"],["execeeds","exceeds"],["exeception","exception"],["execeptions","exceptions"],["execising","exercising"],["execption","exception"],["execptions","exceptions"],["exectable","executable"],["exection","execution"],["exections","executions"],["exectuable","executable"],["exectuableness","executableness"],["exectuables","executables"],["exectued","executed"],["exectuion","execution"],["exectuions","executions"],["execture","execute"],["exectured","executed"],["exectures","executes"],["execturing","executing"],["exectute","execute"],["exectuted","executed"],["exectutes","executes"],["exectution","execution"],["exectutions","executions"],["execuable","executable"],["execuables","executables"],["execuatable","executable"],["execuatables","executables"],["execuatble","executable"],["execuatbles","executables"],["execuate","execute"],["execuated","executed"],["execuates","executes"],["execuation","execution"],["execuations","executions"],["execubale","executable"],["execubales","executables"],["execucte","execute"],["execucted","executed"],["execuctes","executes"],["execuction","execution"],["execuctions","executions"],["execuctor","executor"],["execuctors","executors"],["execude","execute"],["execuded","executed"],["execudes","executes"],["execue","execute"],["execued","executed"],["execues","executes"],["execuet","execute"],["execuetable","executable"],["execuetd","executed"],["execuete","execute"],["execueted","executed"],["execuetes","executes"],["execuets","executes"],["execuing","executing"],["execuion","execution"],["execuions","executions"],["execuitable","executable"],["execuitables","executables"],["execuite","execute"],["execuited","executed"],["execuites","executes"],["execuiting","executing"],["execuition","execution"],["execuitions","executions"],["execulatble","executable"],["execulatbles","executables"],["execultable","executable"],["execultables","executables"],["execulusive","exclusive"],["execune","execute"],["execuned","executed"],["execunes","executes"],["execunting","executing"],["execurable","executable"],["execurables","executables"],["execure","execute"],["execured","executed"],["execures","executes"],["execusion","execution"],["execusions","executions"],["execusive","exclusive"],["execustion","execution"],["execustions","executions"],["execut","execute"],["executabable","executable"],["executabables","executables"],["executabe","executable"],["executabel","executable"],["executabels","executables"],["executabes","executables"],["executablble","executable"],["executabnle","executable"],["executabnles","executables"],["executation","execution"],["executations","executions"],["executbale","executable"],["executbales","executables"],["executble","executable"],["executbles","executables"],["executd","executed"],["executding","executing"],["executeable","executable"],["executeables","executables"],["executible","executable"],["executign","executing"],["executng","executing"],["executre","execute"],["executred","executed"],["executres","executes"],["executs","executes"],["executting","executing"],["executtion","execution"],["executtions","executions"],["executuable","executable"],["executuables","executables"],["executuble","executable"],["executubles","executables"],["executue","execute"],["executued","executed"],["executues","executes"],["executuing","executing"],["executuion","execution"],["executuions","executions"],["executung","executing"],["executuon","execution"],["executuons","executions"],["executute","execute"],["execututed","executed"],["execututes","executes"],["executution","execution"],["execututions","executions"],["exeed","exceed"],["exeeding","exceeding"],["exeedingly","exceedingly"],["exeeds","exceeds"],["exelent","excellent"],["exellent","excellent"],["exempel","example"],["exempels","examples"],["exemple","example"],["exemples","examples"],["exended","extended"],["exension","extension"],["exensions","extensions"],["exent","extent"],["exentended","extended"],["exepct","expect"],["exepcted","expected"],["exepcts","expects"],["exepect","expect"],["exepectation","expectation"],["exepectations","expectations"],["exepected","expected"],["exepectedly","expectedly"],["exepecting","expecting"],["exepects","expects"],["exepriment","experiment"],["exeprimental","experimental"],["exeptional","exceptional"],["exeptions","exceptions"],["exeqution","execution"],["exerbate","exacerbate"],["exerbated","exacerbated"],["exerciese","exercise"],["exerciesed","exercised"],["exercieses","exercises"],["exerciesing","exercising"],["exercize","exercise"],["exerimental","experimental"],["exerpt","excerpt"],["exerpts","excerpts"],["exersize","exercise"],["exersizes","exercises"],["exerternal","external"],["exeucte","execute"],["exeucted","executed"],["exeuctes","executes"],["exeution","execution"],["exexutable","executable"],["exhalted","exalted"],["exhange","exchange"],["exhanged","exchanged"],["exhanges","exchanges"],["exhanging","exchanging"],["exhaused","exhausted"],["exhautivity","exhaustivity"],["exhcuast","exhaust"],["exhcuasted","exhausted"],["exhibtion","exhibition"],["exhist","exist"],["exhistance","existence"],["exhisted","existed"],["exhistence","existence"],["exhisting","existing"],["exhists","exists"],["exhostive","exhaustive"],["exhustiveness","exhaustiveness"],["exibition","exhibition"],["exibitions","exhibitions"],["exicting","exciting"],["exinct","extinct"],["exipration","expiration"],["exipre","expire"],["exipred","expired"],["exipres","expires"],["exising","existing"],["exisit","exist"],["exisited","existed"],["exisitent","existent"],["exisiting","existing"],["exisitng","existing"],["exisits","exists"],["existance","existence"],["existant","existent"],["existatus","exitstatus"],["existencd","existence"],["existend","existed"],["existense","existence"],["existin","existing"],["existince","existence"],["existng","existing"],["existsing","existing"],["existting","existing"],["existung","existing"],["existy","exist"],["existying","existing"],["exitance","existence"],["exitation","excitation"],["exitations","excitations"],["exitt","exit"],["exitted","exited"],["exitting","exiting"],["exitts","exits"],["exixst","exist"],["exixt","exist"],["exlamation","exclamation"],["exlcude","exclude"],["exlcuding","excluding"],["exlcusion","exclusion"],["exlcusions","exclusions"],["exlcusive","exclusive"],["exlicit","explicit"],["exlicite","explicit"],["exlicitely","explicitly"],["exlicitly","explicitly"],["exliled","exiled"],["exlpoit","exploit"],["exlpoited","exploited"],["exlpoits","exploits"],["exlusion","exclusion"],["exlusionary","exclusionary"],["exlusions","exclusions"],["exlusive","exclusive"],["exlusively","exclusively"],["exmaine","examine"],["exmained","examined"],["exmaines","examines"],["exmaple","example"],["exmaples","examples"],["exmple","example"],["exmport","export"],["exnternal","external"],["exnternalities","externalities"],["exnternality","externality"],["exnternally","externally"],["exntry","entry"],["exolicit","explicit"],["exolicitly","explicitly"],["exonorate","exonerate"],["exort","export"],["exoskelaton","exoskeleton"],["expalin","explain"],["expaning","expanding"],["expanion","expansion"],["expanions","expansions"],["expanshion","expansion"],["expanshions","expansions"],["expanssion","expansion"],["exparation","expiration"],["expasion","expansion"],["expatriot","expatriate"],["expception","exception"],["expcetation","expectation"],["expcetations","expectations"],["expceted","expected"],["expceting","expecting"],["expcets","expects"],["expct","expect"],["expcted","expected"],["expctedly","expectedly"],["expcting","expecting"],["expeced","expected"],["expeceted","expected"],["expecially","especially"],["expectaion","expectation"],["expectaions","expectations"],["expectatoins","expectations"],["expectatons","expectations"],["expectd","expected"],["expecte","expected"],["expectes","expects"],["expection","exception"],["expections","exceptions"],["expeditonary","expeditionary"],["expeect","expect"],["expeected","expected"],["expeectedly","expectedly"],["expeecting","expecting"],["expeects","expects"],["expeense","expense"],["expeenses","expenses"],["expeensive","expensive"],["expeience","experience"],["expeienced","experienced"],["expeiences","experiences"],["expeiencing","experiencing"],["expeiment","experiment"],["expeimental","experimental"],["expeimentally","experimentally"],["expeimentation","experimentation"],["expeimentations","experimentations"],["expeimented","experimented"],["expeimentel","experimental"],["expeimentelly","experimentally"],["expeimenter","experimenter"],["expeimenters","experimenters"],["expeimenting","experimenting"],["expeiments","experiments"],["expeiriment","experiment"],["expeirimental","experimental"],["expeirimentally","experimentally"],["expeirimentation","experimentation"],["expeirimentations","experimentations"],["expeirimented","experimented"],["expeirimentel","experimental"],["expeirimentelly","experimentally"],["expeirimenter","experimenter"],["expeirimenters","experimenters"],["expeirimenting","experimenting"],["expeiriments","experiments"],["expell","expel"],["expells","expels"],["expement","experiment"],["expemental","experimental"],["expementally","experimentally"],["expementation","experimentation"],["expementations","experimentations"],["expemented","experimented"],["expementel","experimental"],["expementelly","experimentally"],["expementer","experimenter"],["expementers","experimenters"],["expementing","experimenting"],["expements","experiments"],["expemplar","exemplar"],["expemplars","exemplars"],["expemplary","exemplary"],["expempt","exempt"],["expempted","exempted"],["expemt","exempt"],["expemted","exempted"],["expemtion","exemption"],["expemtions","exemptions"],["expemts","exempts"],["expence","expense"],["expences","expenses"],["expencive","expensive"],["expendeble","expendable"],["expepect","expect"],["expepected","expected"],["expepectedly","expectedly"],["expepecting","expecting"],["expepects","expects"],["expepted","expected"],["expeptedly","expectedly"],["expepting","expecting"],["expeption","exception"],["expeptions","exceptions"],["expepts","expects"],["experament","experiment"],["experamental","experimental"],["experamentally","experimentally"],["experamentation","experimentation"],["experamentations","experimentations"],["experamented","experimented"],["experamentel","experimental"],["experamentelly","experimentally"],["experamenter","experimenter"],["experamenters","experimenters"],["experamenting","experimenting"],["experaments","experiments"],["experation","expiration"],["expercting","expecting"],["expercts","expects"],["expereince","experience"],["expereinced","experienced"],["expereinces","experiences"],["expereincing","experiencing"],["experement","experiment"],["experemental","experimental"],["experementally","experimentally"],["experementation","experimentation"],["experementations","experimentations"],["experemented","experimented"],["experementel","experimental"],["experementelly","experimentally"],["experementer","experimenter"],["experementers","experimenters"],["experementing","experimenting"],["experements","experiments"],["experence","experience"],["experenced","experienced"],["experences","experiences"],["experencing","experiencing"],["experes","express"],["experesed","expressed"],["experesion","expression"],["experesions","expressions"],["experess","express"],["experessed","expressed"],["experesses","expresses"],["experessing","expressing"],["experession's","expression's"],["experession","expression"],["experessions","expressions"],["experiance","experience"],["experianced","experienced"],["experiances","experiences"],["experiancial","experiential"],["experiancing","experiencing"],["experiansial","experiential"],["experiantial","experiential"],["experiation","expiration"],["experiations","expirations"],["experice","experience"],["expericed","experienced"],["experices","experiences"],["expericing","experiencing"],["experiement","experiment"],["experienshial","experiential"],["experiensial","experiential"],["experies","expires"],["experim","experiment"],["experimal","experimental"],["experimally","experimentally"],["experimanent","experiment"],["experimanental","experimental"],["experimanentally","experimentally"],["experimanentation","experimentation"],["experimanentations","experimentations"],["experimanented","experimented"],["experimanentel","experimental"],["experimanentelly","experimentally"],["experimanenter","experimenter"],["experimanenters","experimenters"],["experimanenting","experimenting"],["experimanents","experiments"],["experimanet","experiment"],["experimanetal","experimental"],["experimanetally","experimentally"],["experimanetation","experimentation"],["experimanetations","experimentations"],["experimaneted","experimented"],["experimanetel","experimental"],["experimanetelly","experimentally"],["experimaneter","experimenter"],["experimaneters","experimenters"],["experimaneting","experimenting"],["experimanets","experiments"],["experimant","experiment"],["experimantal","experimental"],["experimantally","experimentally"],["experimantation","experimentation"],["experimantations","experimentations"],["experimanted","experimented"],["experimantel","experimental"],["experimantelly","experimentally"],["experimanter","experimenter"],["experimanters","experimenters"],["experimanting","experimenting"],["experimants","experiments"],["experimation","experimentation"],["experimations","experimentations"],["experimdnt","experiment"],["experimdntal","experimental"],["experimdntally","experimentally"],["experimdntation","experimentation"],["experimdntations","experimentations"],["experimdnted","experimented"],["experimdntel","experimental"],["experimdntelly","experimentally"],["experimdnter","experimenter"],["experimdnters","experimenters"],["experimdnting","experimenting"],["experimdnts","experiments"],["experimed","experimented"],["experimel","experimental"],["experimelly","experimentally"],["experimen","experiment"],["experimenal","experimental"],["experimenally","experimentally"],["experimenat","experiment"],["experimenatal","experimental"],["experimenatally","experimentally"],["experimenatation","experimentation"],["experimenatations","experimentations"],["experimenated","experimented"],["experimenatel","experimental"],["experimenatelly","experimentally"],["experimenater","experimenter"],["experimenaters","experimenters"],["experimenating","experimenting"],["experimenation","experimentation"],["experimenations","experimentations"],["experimenats","experiments"],["experimened","experimented"],["experimenel","experimental"],["experimenelly","experimentally"],["experimener","experimenter"],["experimeners","experimenters"],["experimening","experimenting"],["experimens","experiments"],["experimentaal","experimental"],["experimentaally","experimentally"],["experimentaat","experiment"],["experimentaatl","experimental"],["experimentaatlly","experimentally"],["experimentaats","experiments"],["experimentaed","experimented"],["experimentaer","experimenter"],["experimentaing","experimenting"],["experimentaion","experimentation"],["experimentaions","experimentations"],["experimentait","experiment"],["experimentaital","experimental"],["experimentaitally","experimentally"],["experimentaited","experimented"],["experimentaiter","experimenter"],["experimentaiters","experimenters"],["experimentaitng","experimenting"],["experimentaiton","experimentation"],["experimentaitons","experimentations"],["experimentat","experimental"],["experimentatal","experimental"],["experimentatally","experimentally"],["experimentatation","experimentation"],["experimentatations","experimentations"],["experimentated","experimented"],["experimentater","experimenter"],["experimentatl","experimental"],["experimentatlly","experimentally"],["experimentatly","experimentally"],["experimentel","experimental"],["experimentelly","experimentally"],["experimentt","experiment"],["experimentted","experimented"],["experimentter","experimenter"],["experimentters","experimenters"],["experimentts","experiments"],["experimer","experimenter"],["experimers","experimenters"],["experimet","experiment"],["experimetal","experimental"],["experimetally","experimentally"],["experimetation","experimentation"],["experimetations","experimentations"],["experimeted","experimented"],["experimetel","experimental"],["experimetelly","experimentally"],["experimetent","experiment"],["experimetental","experimental"],["experimetentally","experimentally"],["experimetentation","experimentation"],["experimetentations","experimentations"],["experimetented","experimented"],["experimetentel","experimental"],["experimetentelly","experimentally"],["experimetenter","experimenter"],["experimetenters","experimenters"],["experimetenting","experimenting"],["experimetents","experiments"],["experimeter","experimenter"],["experimeters","experimenters"],["experimeting","experimenting"],["experimetn","experiment"],["experimetnal","experimental"],["experimetnally","experimentally"],["experimetnation","experimentation"],["experimetnations","experimentations"],["experimetned","experimented"],["experimetnel","experimental"],["experimetnelly","experimentally"],["experimetner","experimenter"],["experimetners","experimenters"],["experimetning","experimenting"],["experimetns","experiments"],["experimets","experiments"],["experiming","experimenting"],["experimint","experiment"],["experimintal","experimental"],["experimintally","experimentally"],["experimintation","experimentation"],["experimintations","experimentations"],["experiminted","experimented"],["experimintel","experimental"],["experimintelly","experimentally"],["experiminter","experimenter"],["experiminters","experimenters"],["experiminting","experimenting"],["experimints","experiments"],["experimment","experiment"],["experimmental","experimental"],["experimmentally","experimentally"],["experimmentation","experimentation"],["experimmentations","experimentations"],["experimmented","experimented"],["experimmentel","experimental"],["experimmentelly","experimentally"],["experimmenter","experimenter"],["experimmenters","experimenters"],["experimmenting","experimenting"],["experimments","experiments"],["experimnet","experiment"],["experimnetal","experimental"],["experimnetally","experimentally"],["experimnetation","experimentation"],["experimnetations","experimentations"],["experimneted","experimented"],["experimnetel","experimental"],["experimnetelly","experimentally"],["experimneter","experimenter"],["experimneters","experimenters"],["experimneting","experimenting"],["experimnets","experiments"],["experimnt","experiment"],["experimntal","experimental"],["experimntally","experimentally"],["experimntation","experimentation"],["experimntations","experimentations"],["experimnted","experimented"],["experimntel","experimental"],["experimntelly","experimentally"],["experimnter","experimenter"],["experimnters","experimenters"],["experimnting","experimenting"],["experimnts","experiments"],["experims","experiments"],["experimten","experiment"],["experimtenal","experimental"],["experimtenally","experimentally"],["experimtenation","experimentation"],["experimtenations","experimentations"],["experimtened","experimented"],["experimtenel","experimental"],["experimtenelly","experimentally"],["experimtener","experimenter"],["experimteners","experimenters"],["experimtening","experimenting"],["experimtens","experiments"],["experinece","experience"],["experineced","experienced"],["experinement","experiment"],["experinemental","experimental"],["experinementally","experimentally"],["experinementation","experimentation"],["experinementations","experimentations"],["experinemented","experimented"],["experinementel","experimental"],["experinementelly","experimentally"],["experinementer","experimenter"],["experinementers","experimenters"],["experinementing","experimenting"],["experinements","experiments"],["experiration","expiration"],["experirations","expirations"],["expermenet","experiment"],["expermenetal","experimental"],["expermenetally","experimentally"],["expermenetation","experimentation"],["expermenetations","experimentations"],["expermeneted","experimented"],["expermenetel","experimental"],["expermenetelly","experimentally"],["expermeneter","experimenter"],["expermeneters","experimenters"],["expermeneting","experimenting"],["expermenets","experiments"],["experment","experiment"],["expermental","experimental"],["expermentally","experimentally"],["expermentation","experimentation"],["expermentations","experimentations"],["expermented","experimented"],["expermentel","experimental"],["expermentelly","experimentally"],["expermenter","experimenter"],["expermenters","experimenters"],["expermenting","experimenting"],["experments","experiments"],["expermient","experiment"],["expermiental","experimental"],["expermientally","experimentally"],["expermientation","experimentation"],["expermientations","experimentations"],["expermiented","experimented"],["expermientel","experimental"],["expermientelly","experimentally"],["expermienter","experimenter"],["expermienters","experimenters"],["expermienting","experimenting"],["expermients","experiments"],["expermiment","experiment"],["expermimental","experimental"],["expermimentally","experimentally"],["expermimentation","experimentation"],["expermimentations","experimentations"],["expermimented","experimented"],["expermimentel","experimental"],["expermimentelly","experimentally"],["expermimenter","experimenter"],["expermimenters","experimenters"],["expermimenting","experimenting"],["expermiments","experiments"],["experminent","experiment"],["experminental","experimental"],["experminentally","experimentally"],["experminentation","experimentation"],["experminentations","experimentations"],["experminents","experiments"],["expernal","external"],["expers","express"],["expersed","expressed"],["expersing","expressing"],["expersion","expression"],["expersions","expressions"],["expersive","expensive"],["experss","express"],["experssed","expressed"],["expersses","expresses"],["experssing","expressing"],["experssion","expression"],["experssions","expressions"],["expese","expense"],["expeses","expenses"],["expesive","expensive"],["expesnce","expense"],["expesnces","expenses"],["expesncive","expensive"],["expess","express"],["expessed","expressed"],["expesses","expresses"],["expessing","expressing"],["expession","expression"],["expessions","expressions"],["expest","expect"],["expested","expected"],["expestedly","expectedly"],["expesting","expecting"],["expetancy","expectancy"],["expetation","expectation"],["expetc","expect"],["expetced","expected"],["expetcedly","expectedly"],["expetcing","expecting"],["expetcs","expects"],["expetct","expect"],["expetcted","expected"],["expetctedly","expectedly"],["expetcting","expecting"],["expetcts","expects"],["expetect","expect"],["expetected","expected"],["expetectedly","expectedly"],["expetecting","expecting"],["expetectly","expectedly"],["expetects","expects"],["expeted","expected"],["expetedly","expectedly"],["expetiment","experiment"],["expetimental","experimental"],["expetimentally","experimentally"],["expetimentation","experimentation"],["expetimentations","experimentations"],["expetimented","experimented"],["expetimentel","experimental"],["expetimentelly","experimentally"],["expetimenter","experimenter"],["expetimenters","experimenters"],["expetimenting","experimenting"],["expetiments","experiments"],["expeting","expecting"],["expetion","exception"],["expetional","exceptional"],["expetions","exceptions"],["expets","expects"],["expewriment","experiment"],["expewrimental","experimental"],["expewrimentally","experimentally"],["expewrimentation","experimentation"],["expewrimentations","experimentations"],["expewrimented","experimented"],["expewrimentel","experimental"],["expewrimentelly","experimentally"],["expewrimenter","experimenter"],["expewrimenters","experimenters"],["expewrimenting","experimenting"],["expewriments","experiments"],["expexct","expect"],["expexcted","expected"],["expexctedly","expectedly"],["expexcting","expecting"],["expexcts","expects"],["expexnasion","expansion"],["expexnasions","expansions"],["expext","expect"],["expexted","expected"],["expextedly","expectedly"],["expexting","expecting"],["expexts","expects"],["expicit","explicit"],["expicitly","explicitly"],["expidition","expedition"],["expiditions","expeditions"],["expierence","experience"],["expierenced","experienced"],["expierences","experiences"],["expierience","experience"],["expieriences","experiences"],["expilicitely","explicitly"],["expireitme","expiretime"],["expiriation","expiration"],["expirie","expire"],["expiried","expired"],["expirience","experience"],["expiriences","experiences"],["expirimental","experimental"],["expiriy","expiry"],["explaination","explanation"],["explainations","explanations"],["explainatory","explanatory"],["explaind","explained"],["explanaiton","explanation"],["explanaitons","explanations"],["explane","explain"],["explaned","explained"],["explanes","explains"],["explaning","explaining"],["explantion","explanation"],["explantions","explanations"],["explcit","explicit"],["explecit","explicit"],["explecitely","explicitly"],["explecitily","explicitly"],["explecitly","explicitly"],["explenation","explanation"],["explicat","explicate"],["explicilt","explicit"],["explicilty","explicitly"],["explicitelly","explicitly"],["explicitely","explicitly"],["explicitily","explicitly"],["explicity","explicitly"],["explicityly","explicitly"],["explict","explicit"],["explictely","explicitly"],["explictily","explicitly"],["explictly","explicitly"],["explin","explain"],["explination","explanation"],["explinations","explanations"],["explined","explained"],["explins","explains"],["explit","explicit"],["explitictly","explicitly"],["explitit","explicit"],["explitly","explicitly"],["explizit","explicit"],["explizitly","explicitly"],["exploititive","exploitative"],["expoed","exposed"],["expoent","exponent"],["expoential","exponential"],["expoentially","exponentially"],["expoentntial","exponential"],["expoerted","exported"],["expoit","exploit"],["expoitation","exploitation"],["expoited","exploited"],["expoits","exploits"],["expolde","explode"],["exponant","exponent"],["exponantation","exponentiation"],["exponantially","exponentially"],["exponantialy","exponentially"],["exponants","exponents"],["exponentation","exponentiation"],["exponentialy","exponentially"],["exponentiel","exponential"],["exponentiell","exponential"],["exponetial","exponential"],["exporession","expression"],["expors","exports"],["expport","export"],["exppressed","expressed"],["expres","express"],["expresed","expressed"],["expresing","expressing"],["expresion","expression"],["expresions","expressions"],["expressable","expressible"],["expressino","expression"],["expresso","espresso"],["expresss","express"],["expresssion","expression"],["expresssions","expressions"],["exprience","experience"],["exprienced","experienced"],["expriences","experiences"],["exprimental","experimental"],["expropiated","expropriated"],["expropiation","expropriation"],["exprot","export"],["exproted","exported"],["exproting","exporting"],["exprots","exports"],["exprted","exported"],["exptected","expected"],["exra","extra"],["exract","extract"],["exressed","expressed"],["exression","expression"],["exsistence","existence"],["exsistent","existent"],["exsisting","existing"],["exsists","exists"],["exsiting","existing"],["exspect","expect"],["exspected","expected"],["exspectedly","expectedly"],["exspecting","expecting"],["exspects","expects"],["exspense","expense"],["exspensed","expensed"],["exspenses","expenses"],["exstacy","ecstasy"],["exsted","existed"],["exsting","existing"],["exstream","extreme"],["exsts","exists"],["extaction","extraction"],["extactly","exactly"],["extacy","ecstasy"],["extarnal","external"],["extarnally","externally"],["extatic","ecstatic"],["extedn","extend"],["extedned","extended"],["extedner","extender"],["extedners","extenders"],["extedns","extends"],["extemely","extremely"],["exten","extent"],["extenal","external"],["extendded","extended"],["extendet","extended"],["extendsions","extensions"],["extened","extended"],["exteneded","extended"],["extenisble","extensible"],["extennsions","extensions"],["extensability","extensibility"],["extensiable","extensible"],["extensibity","extensibility"],["extensilbe","extensible"],["extensiones","extensions"],["extensivly","extensively"],["extenson","extension"],["extenstion","extension"],["extenstions","extensions"],["extented","extended"],["extention","extension"],["extentions","extensions"],["extepect","expect"],["extepecting","expecting"],["extepects","expects"],["exteral","external"],["extered","exerted"],["extereme","extreme"],["exterme","extreme"],["extermest","extremest"],["extermist","extremist"],["extermists","extremists"],["extermly","extremely"],["extermporaneous","extemporaneous"],["externaly","externally"],["externel","external"],["externelly","externally"],["externels","externals"],["extesion","extension"],["extesions","extensions"],["extesnion","extension"],["extesnions","extensions"],["extimate","estimate"],["extimated","estimated"],["extimates","estimates"],["extimating","estimating"],["extimation","estimation"],["extimations","estimations"],["extimator","estimator"],["extimators","estimators"],["extist","exist"],["extit","exit"],["extnesion","extension"],["extrac","extract"],["extraced","extracted"],["extracing","extracting"],["extracter","extractor"],["extractet","extracted"],["extractino","extracting"],["extractins","extractions"],["extradiction","extradition"],["extraenous","extraneous"],["extranous","extraneous"],["extrapoliate","extrapolate"],["extrat","extract"],["extrated","extracted"],["extraterrestial","extraterrestrial"],["extraterrestials","extraterrestrials"],["extrates","extracts"],["extrating","extracting"],["extration","extraction"],["extrator","extractor"],["extrators","extractors"],["extrats","extracts"],["extravagent","extravagant"],["extraversion","extroversion"],["extravert","extrovert"],["extraverts","extroverts"],["extraxt","extract"],["extraxted","extracted"],["extraxting","extracting"],["extraxtors","extractors"],["extraxts","extracts"],["extream","extreme"],["extreamely","extremely"],["extreamily","extremely"],["extreamly","extremely"],["extreams","extremes"],["extreem","extreme"],["extreemly","extremely"],["extremaly","extremely"],["extremeley","extremely"],["extremelly","extremely"],["extrememe","extreme"],["extrememely","extremely"],["extrememly","extremely"],["extremeophile","extremophile"],["extremitys","extremities"],["extremly","extremely"],["extrenal","external"],["extrenally","externally"],["extrenaly","externally"],["extrime","extreme"],["extrimely","extremely"],["extrimly","extremely"],["extrmities","extremities"],["extrodinary","extraordinary"],["extrordinarily","extraordinarily"],["extrordinary","extraordinary"],["extry","entry"],["exturd","extrude"],["exturde","extrude"],["exturded","extruded"],["exturdes","extrudes"],["exturding","extruding"],["exuberent","exuberant"],["exucuted","executed"],["eyt","yet"],["ezdrop","eavesdrop"],["fability","facility"],["fabircate","fabricate"],["fabircated","fabricated"],["fabircates","fabricates"],["fabircatings","fabricating"],["fabircation","fabrication"],["facce","face"],["faciliate","facilitate"],["faciliated","facilitated"],["faciliates","facilitates"],["faciliating","facilitating"],["facilites","facilities"],["facilitiate","facilitate"],["facilitiates","facilitates"],["facilititate","facilitate"],["facillitate","facilitate"],["facillities","facilities"],["faciltate","facilitate"],["facilties","facilities"],["facinated","fascinated"],["facirity","facility"],["facist","fascist"],["facorite","favorite"],["facorites","favorites"],["facourite","favourite"],["facourites","favourites"],["facours","favours"],["factization","factorization"],["factorizaiton","factorization"],["factorys","factories"],["fadind","fading"],["faeture","feature"],["faetures","features"],["Fahrenheight","Fahrenheit"],["faield","failed"],["faild","failed"],["failded","failed"],["faile","failed"],["failer","failure"],["failes","fails"],["failicies","facilities"],["failicy","facility"],["failied","failed"],["failiure","failure"],["failiures","failures"],["failiver","failover"],["faill","fail"],["failled","failed"],["faillure","failure"],["failng","failing"],["failre","failure"],["failrue","failure"],["failture","failure"],["failue","failure"],["failuer","failure"],["failues","failures"],["failured","failed"],["faireness","fairness"],["fairoh","pharaoh"],["faiway","fairway"],["faiways","fairways"],["faktor","factor"],["faktored","factored"],["faktoring","factoring"],["faktors","factors"],["falg","flag"],["falgs","flags"],["falied","failed"],["faliure","failure"],["faliures","failures"],["fallabck","fallback"],["fallbck","fallback"],["fallhrough","fallthrough"],["fallthruogh","fallthrough"],["falltrough","fallthrough"],["falshed","flashed"],["falshes","flashes"],["falshing","flashing"],["falsly","falsely"],["falt","fault"],["falure","failure"],["familar","familiar"],["familes","families"],["familiies","families"],["familiy","family"],["familliar","familiar"],["familly","family"],["famlilies","families"],["famlily","family"],["famoust","famous"],["fanatism","fanaticism"],["fancyness","fanciness"],["Farenheight","Fahrenheit"],["Farenheit","Fahrenheit"],["faries","fairies"],["farmework","framework"],["fasade","facade"],["fasion","fashion"],["fasle","false"],["fassade","facade"],["fassinate","fascinate"],["fasterner","fastener"],["fasterners","fasteners"],["fastner","fastener"],["fastners","fasteners"],["fastr","faster"],["fatc","fact"],["fater","faster"],["fatig","fatigue"],["fatser","faster"],["fature","feature"],["faught","fought"],["fauilure","failure"],["fauilures","failures"],["fauture","feature"],["fautured","featured"],["fautures","features"],["fauturing","featuring"],["favoutrable","favourable"],["favuourites","favourites"],["faymus","famous"],["fcound","found"],["feasabile","feasible"],["feasability","feasibility"],["feasable","feasible"],["featchd","fetched"],["featched","fetched"],["featching","fetching"],["featchs","fetches"],["featchss","fetches"],["featchure","feature"],["featchured","featured"],["featchures","features"],["featchuring","featuring"],["featre","feature"],["featue","feature"],["featued","featured"],["featues","features"],["featur","feature"],["featurs","features"],["feautre","feature"],["feauture","feature"],["feautures","features"],["febbruary","February"],["febewary","February"],["februar","February"],["Febuary","February"],["Feburary","February"],["fecthing","fetching"],["fedality","fidelity"],["fedreally","federally"],["feeback","feedback"],["feeded","fed"],["feek","feel"],["feeks","feels"],["feetur","feature"],["feeture","feature"],["feild","field"],["feld","field"],["felisatus","felicitous"],["femminist","feminist"],["fempto","femto"],["feonsay","fianc\xE9e"],["fequency","frequency"],["feromone","pheromone"],["fertil","fertile"],["fertily","fertility"],["fetaure","feature"],["fetaures","features"],["fetchs","fetches"],["feture","feature"],["fetures","features"],["fewsha","fuchsia"],["fezent","pheasant"],["fhurter","further"],["fials","fails"],["fianite","finite"],["fianlly","finally"],["fibonaacci","Fibonacci"],["ficticious","fictitious"],["fictious","fictitious"],["fidality","fidelity"],["fiddley","fiddly"],["fidn","find"],["fied","field"],["fiedl","field"],["fiedled","fielded"],["fiedls","fields"],["fieid","field"],["fieldlst","fieldlist"],["fieled","field"],["fielesystem","filesystem"],["fielesystems","filesystems"],["fielname","filename"],["fielneame","filename"],["fiercly","fiercely"],["fightings","fighting"],["figurestyle","figurestyles"],["filal","final"],["fileand","file and"],["fileds","fields"],["fileld","field"],["filelds","fields"],["filenae","filename"],["filese","files"],["fileshystem","filesystem"],["fileshystems","filesystems"],["filesnames","filenames"],["filess","files"],["filesstem","filesystem"],["filessytem","filesystem"],["filessytems","filesystems"],["fileststem","filesystem"],["filesysems","filesystems"],["filesysthem","filesystem"],["filesysthems","filesystems"],["filesystmes","filesystems"],["filesystyem","filesystem"],["filesystyems","filesystems"],["filesytem","filesystem"],["filesytems","filesystems"],["filesytsem","filesystem"],["fileter","filter"],["filetest","file test"],["filetests","file tests"],["fileystem","filesystem"],["fileystems","filesystems"],["filiament","filament"],["fillay","fillet"],["fillement","filament"],["fillowing","following"],["fillung","filling"],["filnal","final"],["filname","filename"],["filp","flip"],["filpped","flipped"],["filpping","flipping"],["filps","flips"],["filse","files"],["filsystem","filesystem"],["filsystems","filesystems"],["filterd","filtered"],["filterig","filtering"],["filterin","filtering"],["filterring","filtering"],["filtersing","filtering"],["filterss","filters"],["filtype","filetype"],["filtypes","filetypes"],["fimilies","families"],["fimrware","firmware"],["fimware","firmware"],["finacial","financial"],["finailse","finalise"],["finailze","finalize"],["finallly","finally"],["finanace","finance"],["finanaced","financed"],["finanaces","finances"],["finanacially","financially"],["finanacier","financier"],["financialy","financially"],["finanize","finalize"],["finanlize","finalize"],["fincally","finally"],["finctionalities","functionalities"],["finctionality","functionality"],["finde","find"],["findn","find"],["findout","find out"],["finelly","finally"],["finess","finesse"],["fingeprint","fingerprint"],["finialization","finalization"],["finializing","finalizing"],["finilizes","finalizes"],["finisched","finished"],["finised","finished"],["finishied","finished"],["finishs","finishes"],["finitel","finite"],["finness","finesse"],["finnished","finished"],["finshed","finished"],["finshing","finishing"],["finsih","finish"],["finsihed","finished"],["finsihes","finishes"],["finsihing","finishing"],["finsished","finished"],["finxed","fixed"],["finxing","fixing"],["fiorget","forget"],["firday","Friday"],["firends","friends"],["firey","fiery"],["firmare","firmware"],["firmaware","firmware"],["firmawre","firmware"],["firmeare","firmware"],["firmeware","firmware"],["firmnware","firmware"],["firmwart","firmware"],["firmwear","firmware"],["firmwqre","firmware"],["firmwre","firmware"],["firmwware","firmware"],["firsr","first"],["firsth","first"],["firware","firmware"],["firwmare","firmware"],["fisionable","fissionable"],["fisisist","physicist"],["fisist","physicist"],["fisrt","first"],["fitering","filtering"],["fitler","filter"],["fitlers","filters"],["fivety","fifty"],["fixel","pixel"],["fixels","pixels"],["fixeme","fixme"],["fixwd","fixed"],["fizeek","physique"],["flacor","flavor"],["flacored","flavored"],["flacoring","flavoring"],["flacorings","flavorings"],["flacors","flavors"],["flacour","flavour"],["flacoured","flavoured"],["flacouring","flavouring"],["flacourings","flavourings"],["flacours","flavours"],["flaged","flagged"],["flages","flags"],["flagg","flag"],["flahsed","flashed"],["flahses","flashes"],["flahsing","flashing"],["flakyness","flakiness"],["flamable","flammable"],["flaot","float"],["flaoting","floating"],["flashflame","flashframe"],["flashig","flashing"],["flasing","flashing"],["flate","flat"],["flatened","flattened"],["flattend","flattened"],["flattenning","flattening"],["flawess","flawless"],["fle","file"],["flem","phlegm"],["Flemmish","Flemish"],["flewant","fluent"],["flexability","flexibility"],["flexable","flexible"],["flexibel","flexible"],["flexibele","flexible"],["flexibilty","flexibility"],["flext","flex"],["flie","file"],["fliter","filter"],["flitered","filtered"],["flitering","filtering"],["fliters","filters"],["floading-add","floating-add"],["floatation","flotation"],["floride","fluoride"],["floting","floating"],["flouride","fluoride"],["flourine","fluorine"],["flourishment","flourishing"],["flter","filter"],["fluctuand","fluctuant"],["flud","flood"],["fluorish","flourish"],["fluoroscent","fluorescent"],["fluroescent","fluorescent"],["flushs","flushes"],["flusing","flushing"],["focu","focus"],["focued","focused"],["focument","document"],["focuse","focus"],["focusf","focus"],["focuss","focus"],["focussed","focused"],["focusses","focuses"],["fof","for"],["foget","forget"],["fogot","forgot"],["fogotten","forgotten"],["fointers","pointers"],["foler","folder"],["folers","folders"],["folfer","folder"],["folfers","folders"],["folled","followed"],["foller","follower"],["follers","followers"],["follew","follow"],["follewed","followed"],["follewer","follower"],["follewers","followers"],["follewin","following"],["follewind","following"],["follewing","following"],["follewinwg","following"],["follewiong","following"],["follewiwng","following"],["follewong","following"],["follews","follows"],["follfow","follow"],["follfowed","followed"],["follfower","follower"],["follfowers","followers"],["follfowin","following"],["follfowind","following"],["follfowing","following"],["follfowinwg","following"],["follfowiong","following"],["follfowiwng","following"],["follfowong","following"],["follfows","follows"],["follin","following"],["follind","following"],["follinwg","following"],["folliong","following"],["folliw","follow"],["folliwed","followed"],["folliwer","follower"],["folliwers","followers"],["folliwin","following"],["folliwind","following"],["folliwing","following"],["folliwinwg","following"],["folliwiong","following"],["folliwiwng","following"],["folliwng","following"],["folliwong","following"],["folliws","follows"],["folllow","follow"],["folllowed","followed"],["folllower","follower"],["folllowers","followers"],["folllowin","following"],["folllowind","following"],["folllowing","following"],["folllowinwg","following"],["folllowiong","following"],["folllowiwng","following"],["folllowong","following"],["follod","followed"],["folloeing","following"],["folloing","following"],["folloiwng","following"],["follolwing","following"],["follong","following"],["follos","follows"],["followes","follows"],["followig","following"],["followign","following"],["followin","following"],["followind","following"],["followint","following"],["followng","following"],["followwing","following"],["followwings","followings"],["folls","follows"],["follw","follow"],["follwed","followed"],["follwer","follower"],["follwers","followers"],["follwin","following"],["follwind","following"],["follwing","following"],["follwinwg","following"],["follwiong","following"],["follwiwng","following"],["follwo","follow"],["follwoe","follow"],["follwoed","followed"],["follwoeed","followed"],["follwoeer","follower"],["follwoeers","followers"],["follwoein","following"],["follwoeind","following"],["follwoeing","following"],["follwoeinwg","following"],["follwoeiong","following"],["follwoeiwng","following"],["follwoeong","following"],["follwoer","follower"],["follwoers","followers"],["follwoes","follows"],["follwoin","following"],["follwoind","following"],["follwoing","following"],["follwoinwg","following"],["follwoiong","following"],["follwoiwng","following"],["follwong","following"],["follwoong","following"],["follwos","follows"],["follwow","follow"],["follwowed","followed"],["follwower","follower"],["follwowers","followers"],["follwowin","following"],["follwowind","following"],["follwowing","following"],["follwowinwg","following"],["follwowiong","following"],["follwowiwng","following"],["follwowong","following"],["follwows","follows"],["follws","follows"],["follww","follow"],["follwwed","followed"],["follwwer","follower"],["follwwers","followers"],["follwwin","following"],["follwwind","following"],["follwwing","following"],["follwwinwg","following"],["follwwiong","following"],["follwwiwng","following"],["follwwong","following"],["follwws","follows"],["foloow","follow"],["foloowed","followed"],["foloower","follower"],["foloowers","followers"],["foloowin","following"],["foloowind","following"],["foloowing","following"],["foloowinwg","following"],["foloowiong","following"],["foloowiwng","following"],["foloowong","following"],["foloows","follows"],["folow","follow"],["folowed","followed"],["folower","follower"],["folowers","followers"],["folowin","following"],["folowind","following"],["folowing","following"],["folowinwg","following"],["folowiong","following"],["folowiwng","following"],["folowong","following"],["folows","follows"],["foloww","follow"],["folowwed","followed"],["folowwer","follower"],["folowwers","followers"],["folowwin","following"],["folowwind","following"],["folowwing","following"],["folowwinwg","following"],["folowwiong","following"],["folowwiwng","following"],["folowwong","following"],["folowws","follows"],["folse","false"],["folwo","follow"],["folwoed","followed"],["folwoer","follower"],["folwoers","followers"],["folwoin","following"],["folwoind","following"],["folwoing","following"],["folwoinwg","following"],["folwoiong","following"],["folwoiwng","following"],["folwoong","following"],["folwos","follows"],["folx","folks"],["fom","from"],["fomat","format"],["fomated","formatted"],["fomater","formatter"],["fomates","formats"],["fomating","formatting"],["fomats","formats"],["fomatted","formatted"],["fomatter","formatter"],["fomatting","formatting"],["fomed","formed"],["fomrat","format"],["fomrated","formatted"],["fomrater","formatter"],["fomrating","formatting"],["fomrats","formats"],["fomratted","formatted"],["fomratter","formatter"],["fomratting","formatting"],["fomula","formula"],["fomulas","formula"],["fonction","function"],["fonctional","functional"],["fonctionalities","functionalities"],["fonctionality","functionality"],["fonctioning","functioning"],["fonctionnalies","functionalities"],["fonctionnalities","functionalities"],["fonctionnality","functionality"],["fonctions","functions"],["fonetic","phonetic"],["fontier","frontier"],["fontonfig","fontconfig"],["fontrier","frontier"],["fonud","found"],["foontnotes","footnotes"],["foootball","football"],["foorter","footer"],["footnoes","footnotes"],["footprinst","footprints"],["foound","found"],["foppy","floppy"],["foppys","floppies"],["foramatting","formatting"],["foramt","format"],["forat","format"],["forbad","forbade"],["forbbiden","forbidden"],["forbiden","forbidden"],["forbit","forbid"],["forbiten","forbidden"],["forbitten","forbidden"],["forcably","forcibly"],["forcast","forecast"],["forcasted","forecasted"],["forcaster","forecaster"],["forcasters","forecasters"],["forcasting","forecasting"],["forcasts","forecasts"],["forcot","forgot"],["forece","force"],["foreced","forced"],["foreces","forces"],["foregrond","foreground"],["foregronds","foregrounds"],["foreing","foreign"],["forementionned","aforementioned"],["forermly","formerly"],["forfiet","forfeit"],["forgeround","foreground"],["forgoten","forgotten"],["forground","foreground"],["forhead","forehead"],["foriegn","foreign"],["forld","fold"],["forlder","folder"],["forlders","folders"],["Formalhaut","Fomalhaut"],["formallize","formalize"],["formallized","formalized"],["formate","format"],["formated","formatted"],["formater","formatter"],["formaters","formatters"],["formates","formats"],["formath","format"],["formaths","formats"],["formating","formatting"],["formatteded","formatted"],["formattgin","formatting"],["formattind","formatting"],["formattings","formatting"],["formattring","formatting"],["formattted","formatted"],["formattting","formatting"],["formelly","formerly"],["formely","formerly"],["formend","formed"],["formidible","formidable"],["formmatted","formatted"],["formost","foremost"],["formt","format"],["formua","formula"],["formual","formula"],["formuale","formulae"],["formuals","formulas"],["fornat","format"],["fornated","formatted"],["fornater","formatter"],["fornats","formats"],["fornatted","formatted"],["fornatter","formatter"],["forot","forgot"],["forotten","forgotten"],["forr","for"],["forsaw","foresaw"],["forse","force"],["forseeable","foreseeable"],["fortan","fortran"],["fortat","format"],["forteen","fourteen"],["fortelling","foretelling"],["forthcominng","forthcoming"],["forthcomming","forthcoming"],["fortunaly","fortunately"],["fortunat","fortunate"],["fortunatelly","fortunately"],["fortunatly","fortunately"],["fortunetly","fortunately"],["forula","formula"],["forulas","formulas"],["forumla","formula"],["forumlas","formulas"],["forumula","formula"],["forumulas","formulas"],["forunate","fortunate"],["forunately","fortunately"],["forunner","forerunner"],["forutunate","fortunate"],["forutunately","fortunately"],["forver","forever"],["forwad","forward"],["forwaded","forwarded"],["forwading","forwarding"],["forwads","forwards"],["forwardig","forwarding"],["forwaring","forwarding"],["forwwarded","forwarded"],["foto","photo"],["fotograf","photograph"],["fotografic","photographic"],["fotografical","photographical"],["fotografy","photography"],["fotograph","photograph"],["fotography","photography"],["foucs","focus"],["foudn","found"],["foudning","founding"],["fougth","fought"],["foult","fault"],["foults","faults"],["foundaries","foundries"],["foundary","foundry"],["Foundland","Newfoundland"],["fourties","forties"],["fourty","forty"],["fouth","fourth"],["fouund","found"],["foward","forward"],["fowarded","forwarded"],["fowarding","forwarding"],["fowards","forwards"],["fprmat","format"],["fracional","fractional"],["fragement","fragment"],["fragementation","fragmentation"],["fragements","fragments"],["fragmant","fragment"],["fragmantation","fragmentation"],["fragmants","fragments"],["fragmenet","fragment"],["fragmenetd","fragmented"],["fragmeneted","fragmented"],["fragmeneting","fragmenting"],["fragmenets","fragments"],["fragmnet","fragment"],["frambuffer","framebuffer"],["framebufer","framebuffer"],["framei","frame"],["frament","fragment"],["framented","fragmented"],["framents","fragments"],["frametyp","frametype"],["framewoek","framework"],["framewoeks","frameworks"],["frameworkk","framework"],["framlayout","framelayout"],["framming","framing"],["framwework","framework"],["framwork","framework"],["framworks","frameworks"],["frane","frame"],["frankin","franklin"],["Fransiscan","Franciscan"],["Fransiscans","Franciscans"],["franzise","franchise"],["frecuencies","frequencies"],["frecuency","frequency"],["frecuent","frequent"],["frecuented","frequented"],["frecuently","frequently"],["frecuents","frequents"],["freecallrelpy","freecallreply"],["freedon","freedom"],["freedons","freedoms"],["freedum","freedom"],["freedums","freedoms"],["freee","free"],["freeed","freed"],["freezs","freezes"],["freind","friend"],["freindly","friendly"],["freqencies","frequencies"],["freqency","frequency"],["freqeuncies","frequencies"],["freqeuncy","frequency"],["freqiencies","frequencies"],["freqiency","frequency"],["freqquencies","frequencies"],["freqquency","frequency"],["frequancies","frequencies"],["frequancy","frequency"],["frequant","frequent"],["frequantly","frequently"],["frequences","frequencies"],["frequencey","frequency"],["frequenies","frequencies"],["frequentily","frequently"],["frequncies","frequencies"],["frequncy","frequency"],["freze","freeze"],["frezes","freezes"],["frgament","fragment"],["fricton","friction"],["fridey","Friday"],["frimware","firmware"],["frisday","Friday"],["frist","first"],["frition","friction"],["fritional","frictional"],["fritions","frictions"],["frmat","format"],["frmo","from"],["froce","force"],["frok","from"],["fromal","formal"],["fromat","format"],["fromated","formatted"],["fromates","formats"],["fromating","formatting"],["fromation","formation"],["fromats","formats"],["frome","from"],["fromed","formed"],["fromm","from"],["froms","forms"],["fromt","from"],["fromthe","from the"],["fronend","frontend"],["fronends","frontends"],["froniter","frontier"],["frontent","frontend"],["frontents","frontends"],["frop","drop"],["fropm","from"],["frops","drops"],["frowarded","forwarded"],["frowrad","forward"],["frowrading","forwarding"],["frowrads","forwards"],["frozee","frozen"],["fschk","fsck"],["FTBS","FTBFS"],["ftrunacate","ftruncate"],["fualt","fault"],["fualts","faults"],["fucntion","function"],["fucntional","functional"],["fucntionality","functionality"],["fucntioned","functioned"],["fucntioning","functioning"],["fucntions","functions"],["fuction","function"],["fuctionality","functionality"],["fuctiones","functioned"],["fuctioning","functioning"],["fuctionoid","functionoid"],["fuctions","functions"],["fuetherst","furthest"],["fuethest","furthest"],["fufill","fulfill"],["fufilled","fulfilled"],["fugure","figure"],["fugured","figured"],["fugures","figures"],["fule","file"],["fulfiled","fulfilled"],["fullfiled","fulfilled"],["fullfiling","fulfilling"],["fullfilled","fulfilled"],["fullfilling","fulfilling"],["fullfills","fulfills"],["fullly","fully"],["fulsh","flush"],["fuly","fully"],["fumction","function"],["fumctional","functional"],["fumctionally","functionally"],["fumctioned","functioned"],["fumctions","functions"],["funcation","function"],["funchtion","function"],["funchtional","functional"],["funchtioned","functioned"],["funchtioning","functioning"],["funchtionn","function"],["funchtionnal","functional"],["funchtionned","functioned"],["funchtionning","functioning"],["funchtionns","functions"],["funchtions","functions"],["funcion","function"],["funcions","functions"],["funciotn","function"],["funciotns","functions"],["funciton","function"],["funcitonal","functional"],["funcitonality","functionality"],["funcitonally","functionally"],["funcitoned","functioned"],["funcitoning","functioning"],["funcitons","functions"],["funcstions","functions"],["functiion","function"],["functiional","functional"],["functiionality","functionality"],["functiionally","functionally"],["functiioning","functioning"],["functiions","functions"],["functin","function"],["functinality","functionality"],["functino","function"],["functins","functions"],["functio","function"],["functionability","functionality"],["functionaility","functionality"],["functionailty","functionality"],["functionaily","functionality"],["functionallities","functionalities"],["functionallity","functionality"],["functionaltiy","functionality"],["functionalty","functionality"],["functionionalities","functionalities"],["functionionality","functionality"],["functionnal","functional"],["functionnalities","functionalities"],["functionnality","functionality"],["functionnaly","functionally"],["functionning","functioning"],["functionon","function"],["functionss","functions"],["functios","functions"],["functiosn","functions"],["functiton","function"],["functitonal","functional"],["functitonally","functionally"],["functitoned","functioned"],["functitons","functions"],["functon","function"],["functonal","functional"],["functonality","functionality"],["functoning","functioning"],["functons","functions"],["functtion","function"],["functtional","functional"],["functtionalities","functionalities"],["functtioned","functioned"],["functtioning","functioning"],["functtions","functions"],["funczion","function"],["fundametal","fundamental"],["fundametals","fundamentals"],["fundation","foundation"],["fundemantal","fundamental"],["fundemental","fundamental"],["fundementally","fundamentally"],["fundementals","fundamentals"],["funguses","fungi"],["funktion","function"],["funnnily","funnily"],["funtion","function"],["funtional","functional"],["funtionalities","functionalities"],["funtionality","functionality"],["funtionallity","functionality"],["funtionally","functionally"],["funtionalty","functionality"],["funtioning","functioning"],["funtions","functions"],["funvtion","function"],["funvtional","functional"],["funvtionalities","functionalities"],["funvtionality","functionality"],["funvtioned","functioned"],["funvtioning","functioning"],["funvtions","functions"],["funxtion","function"],["funxtional","functional"],["funxtionalities","functionalities"],["funxtionality","functionality"],["funxtioned","functioned"],["funxtioning","functioning"],["funxtions","functions"],["furether","further"],["furethermore","furthermore"],["furethest","furthest"],["furfill","fulfill"],["furher","further"],["furhermore","furthermore"],["furhest","furthest"],["furhter","further"],["furhtermore","furthermore"],["furhtest","furthest"],["furmalae","formulae"],["furmula","formula"],["furmulae","formulae"],["furnction","function"],["furnctional","functional"],["furnctions","functions"],["furneture","furniture"],["furser","further"],["fursermore","furthermore"],["furst","first"],["fursther","further"],["fursthermore","furthermore"],["fursthest","furthest"],["furter","further"],["furthemore","furthermore"],["furthermor","furthermore"],["furtherst","furthest"],["furthremore","furthermore"],["furthrest","furthest"],["furthur","further"],["furture","future"],["furure","future"],["furuther","further"],["furutre","future"],["furzzer","fuzzer"],["fuschia","fuchsia"],["fushed","flushed"],["fushing","flushing"],["futher","further"],["futherize","further"],["futhermore","furthermore"],["futrue","future"],["futrure","future"],["futture","future"],["fwe","few"],["fwirte","fwrite"],["fxed","fixed"],["fysical","physical"],["fysisist","physicist"],["fysisit","physicist"],["gabage","garbage"],["galatic","galactic"],["Galations","Galatians"],["gallaries","galleries"],["gallary","gallery"],["gallaxies","galaxies"],["gallleries","galleries"],["galllery","gallery"],["galllerys","galleries"],["galvinized","galvanized"],["Gameboy","Game Boy"],["ganbia","gambia"],["ganerate","generate"],["ganes","games"],["ganster","gangster"],["garabge","garbage"],["garantee","guarantee"],["garanteed","guaranteed"],["garanteeed","guaranteed"],["garantees","guarantees"],["garantied","guaranteed"],["garanty","guarantee"],["garbadge","garbage"],["garbage-dollected","garbage-collected"],["garbagge","garbage"],["garbarge","garbage"],["gard","guard"],["gardai","garda\xED"],["garentee","guarantee"],["garnison","garrison"],["garuantee","guarantee"],["garuanteed","guaranteed"],["garuantees","guarantees"],["garuantied","guaranteed"],["gatable","gateable"],["gateing","gating"],["gatherig","gathering"],["gatway","gateway"],["gauage","gauge"],["gauarana","guaran\xE1"],["gauarantee","guarantee"],["gauaranteed","guaranteed"],["gauarentee","guarantee"],["gauarenteed","guaranteed"],["gaurantee","guarantee"],["gauranteed","guaranteed"],["gauranteeing","guaranteeing"],["gaurantees","guarantees"],["gaurentee","guarantee"],["gaurenteed","guaranteed"],["gaurentees","guarantees"],["gaus'","Gauss'"],["gaus's","Gauss'"],["gausian","gaussian"],["geeneric","generic"],["geenrate","generate"],["geenrated","generated"],["geenrates","generates"],["geenration","generation"],["geenrational","generational"],["geeoteen","guillotine"],["geeral","general"],["gemetrical","geometrical"],["gemetry","geometry"],["gemoetry","geometry"],["gemometric","geometric"],["genarate","generate"],["genarated","generated"],["genarating","generating"],["genaration","generation"],["genearal","general"],["genearally","generally"],["genearted","generated"],["geneate","generate"],["geneated","generated"],["geneates","generates"],["geneating","generating"],["geneation","generation"],["geneological","genealogical"],["geneologies","genealogies"],["geneology","genealogy"],["generaates","generates"],["generaly","generally"],["generalyl","generally"],["generalyse","generalise"],["generater","generator"],["generaters","generators"],["generatig","generating"],["generatng","generating"],["generatting","generating"],["genereate","generate"],["genereated","generated"],["genereates","generates"],["genereating","generating"],["genered","generated"],["genereic","generic"],["generell","general"],["generelly","generally"],["genererate","generate"],["genererated","generated"],["genererater","generator"],["genererating","generating"],["genereration","generation"],["genereted","generated"],["generilise","generalise"],["generilised","generalised"],["generilises","generalises"],["generilize","generalize"],["generilized","generalized"],["generilizes","generalizes"],["generiously","generously"],["generla","general"],["generlaizes","generalizes"],["generlas","generals"],["generted","generated"],["generting","generating"],["genertion","generation"],["genertor","generator"],["genertors","generators"],["genialia","genitalia"],["genral","general"],["genralisation","generalisation"],["genralisations","generalisations"],["genralise","generalise"],["genralised","generalised"],["genralises","generalises"],["genralization","generalization"],["genralizations","generalizations"],["genralize","generalize"],["genralized","generalized"],["genralizes","generalizes"],["genrally","generally"],["genrals","generals"],["genrate","generate"],["genrated","generated"],["genrates","generates"],["genratet","generated"],["genrating","generating"],["genration","generation"],["genrations","generations"],["genrator","generator"],["genrators","generators"],["genreate","generate"],["genreated","generated"],["genreates","generates"],["genreating","generating"],["genreic","generic"],["genric","generic"],["genrics","generics"],["gental","gentle"],["genuin","genuine"],["geocentic","geocentric"],["geoemtries","geometries"],["geoemtry","geometry"],["geogcountry","geocountry"],["geographich","geographic"],["geographicial","geographical"],["geoio","geoip"],["geomertic","geometric"],["geomerties","geometries"],["geomerty","geometry"],["geomery","geometry"],["geometites","geometries"],["geometrician","geometer"],["geometricians","geometers"],["geometrie","geometry"],["geometrys","geometries"],["geomety","geometry"],["geometyr","geometry"],["geomitrically","geometrically"],["geomoetric","geometric"],["geomoetrically","geometrically"],["geomoetry","geometry"],["geomtery","geometry"],["geomtries","geometries"],["geomtry","geometry"],["geomtrys","geometries"],["georeferncing","georeferencing"],["geraff","giraffe"],["geraphics","graphics"],["gerat","great"],["gereating","generating"],["gerenate","generate"],["gerenated","generated"],["gerenates","generates"],["gerenating","generating"],["gerenation","generation"],["gerenations","generations"],["gerenic","generic"],["gerenics","generics"],["gererate","generate"],["gererated","generated"],["gerilla","guerrilla"],["gerneral","general"],["gernerally","generally"],["gerneraly","generally"],["gernerate","generate"],["gernerated","generated"],["gernerates","generates"],["gernerating","generating"],["gerneration","generation"],["gernerator","generator"],["gernerators","generators"],["gerneric","generic"],["gernerics","generics"],["gess","guess"],["get's","gets"],["get;s","gets"],["getfastproperyvalue","getfastpropertyvalue"],["getimezone","gettimezone"],["geting","getting"],["getlael","getlabel"],["getoe","ghetto"],["getoject","getobject"],["gettetx","gettext"],["gettter","getter"],["gettters","getters"],["getttext","gettext"],["getttime","gettime"],["getttimeofday","gettimeofday"],["gettting","getting"],["ggogled","Googled"],["Ghandi","Gandhi"],["ghostcript","ghostscript"],["ghostscritp","ghostscript"],["ghraphic","graphic"],["gien","given"],["gigibit","gigabit"],["gilotine","guillotine"],["gilty","guilty"],["ginee","guinea"],["gingam","gingham"],["gioen","given"],["gir","git"],["giser","geyser"],["gisers","geysers"],["git-buildpackge","git-buildpackage"],["git-buildpackges","git-buildpackages"],["gitar","guitar"],["gitars","guitars"],["gitatributes","gitattributes"],["giveing","giving"],["givveing","giving"],["givven","given"],["givving","giving"],["glamourous","glamorous"],["glight","flight"],["gloab","globe"],["gloabal","global"],["gloabl","global"],["gloassaries","glossaries"],["gloassary","glossary"],["globablly","globally"],["globaly","globally"],["globbal","global"],["globel","global"],["glorfied","glorified"],["glpyh","glyph"],["glpyhs","glyphs"],["glyh","glyph"],["glyhs","glyphs"],["glyped","glyphed"],["glyphes","glyphs"],["glyping","glyphing"],["glyserin","glycerin"],["gnawwed","gnawed"],["gneral","general"],["gnerally","generally"],["gnerals","generals"],["gnerate","generate"],["gnerated","generated"],["gnerates","generates"],["gnerating","generating"],["gneration","generation"],["gnerations","generations"],["gneric","generic"],["gnorung","ignoring"],["gobal","global"],["gocde","gcode"],["godess","goddess"],["godesses","goddesses"],["Godounov","Godunov"],["goemetries","geometries"],["goess","goes"],["gogether","together"],["goign","going"],["goin","going"],["goind","going"],["golbal","global"],["golbally","globally"],["golbaly","globally"],["gonig","going"],["gool","ghoul"],["gord","gourd"],["gormay","gourmet"],["gorry","gory"],["gorup","group"],["goruped","grouped"],["goruping","grouping"],["gorups","groups"],["gost","ghost"],["Gothenberg","Gothenburg"],["Gottleib","Gottlieb"],["goup","group"],["gouped","grouped"],["goups","groups"],["gouvener","governor"],["govement","government"],["govenment","government"],["govenor","governor"],["govenrment","government"],["goverance","governance"],["goverment","government"],["govermental","governmental"],["govermnment","government"],["governer","governor"],["governmnet","government"],["govorment","government"],["govormental","governmental"],["govornment","government"],["grabage","garbage"],["grabed","grabbed"],["grabing","grabbing"],["gracefull","graceful"],["gracefuly","gracefully"],["gradiants","gradients"],["gradualy","gradually"],["graet","great"],["grafics","graphics"],["grafitti","graffiti"],["grahic","graphic"],["grahical","graphical"],["grahics","graphics"],["grahpic","graphic"],["grahpical","graphical"],["grahpics","graphics"],["gramar","grammar"],["gramatically","grammatically"],["grammartical","grammatical"],["grammaticaly","grammatically"],["grammer","grammar"],["grammers","grammars"],["granchildren","grandchildren"],["granilarity","granularity"],["granuality","granularity"],["granualtiry","granularity"],["granulatiry","granularity"],["grapgics","graphics"],["graphcis","graphics"],["graphis","graphics"],["grapic","graphic"],["grapical","graphical"],["grapics","graphics"],["grat","great"],["gratefull","grateful"],["gratuitious","gratuitous"],["grbber","grabber"],["greatful","grateful"],["greatfully","gratefully"],["greather","greater"],["greif","grief"],["grephic","graphic"],["grestest","greatest"],["greysacles","greyscales"],["gridles","griddles"],["grigorian","Gregorian"],["grobal","global"],["grobally","globally"],["grometry","geometry"],["grooup","group"],["groouped","grouped"],["groouping","grouping"],["grooups","groups"],["gropu","group"],["groubpy","groupby"],["groupd","grouped"],["groupping","grouping"],["groupt","grouped"],["grranted","granted"],["gruop","group"],["gruopd","grouped"],["gruops","groups"],["grup","group"],["gruped","grouped"],["gruping","grouping"],["grups","groups"],["grwo","grow"],["guage","gauge"],["guarante","guarantee"],["guaranted","guaranteed"],["guaranteey","guaranty"],["guaranteing","guaranteeing"],["guarantes","guarantees"],["guarantie","guarantee"],["guarbage","garbage"],["guareded","guarded"],["guareente","guarantee"],["guareented","guaranteed"],["guareentee","guarantee"],["guareenteed","guaranteed"],["guareenteeing","guaranteeing"],["guareentees","guarantees"],["guareenteing","guaranteeing"],["guareentes","guarantees"],["guareenty","guaranty"],["guarente","guarantee"],["guarented","guaranteed"],["guarentee","guarantee"],["guarenteed","guaranteed"],["guarenteede","guarantee"],["guarenteeded","guaranteed"],["guarenteedeing","guaranteeing"],["guarenteedes","guarantees"],["guarenteedy","guaranty"],["guarenteeing","guaranteeing"],["guarenteer","guarantee"],["guarenteerd","guaranteed"],["guarenteering","guaranteeing"],["guarenteers","guarantees"],["guarentees","guarantees"],["guarenteing","guaranteeing"],["guarentes","guarantees"],["guarentie","guarantee"],["guarentied","guaranteed"],["guarentieing","guaranteeing"],["guarenties","guarantees"],["guarenty","guaranty"],["guarentyd","guaranteed"],["guarentying","guarantee"],["guarentyinging","guaranteeing"],["guarentys","guarantees"],["guarging","guarding"],["guarnante","guarantee"],["guarnanted","guaranteed"],["guarnantee","guarantee"],["guarnanteed","guaranteed"],["guarnanteeing","guaranteeing"],["guarnantees","guarantees"],["guarnanteing","guaranteeing"],["guarnantes","guarantees"],["guarnanty","guaranty"],["guarnate","guarantee"],["guarnated","guaranteed"],["guarnatee","guarantee"],["guarnateed","guaranteed"],["guarnateee","guarantee"],["guarnateeed","guaranteed"],["guarnateeeing","guaranteeing"],["guarnateees","guarantees"],["guarnateeing","guaranteeing"],["guarnatees","guarantees"],["guarnateing","guaranteeing"],["guarnates","guarantees"],["guarnatey","guaranty"],["guarnaty","guaranty"],["guarnete","guarantee"],["guarneted","guaranteed"],["guarnetee","guarantee"],["guarneteed","guaranteed"],["guarneteeing","guaranteeing"],["guarnetees","guarantees"],["guarneteing","guaranteeing"],["guarnetes","guarantees"],["guarnety","guaranty"],["guarnte","guarantee"],["guarnted","guaranteed"],["guarntee","guarantee"],["guarnteed","guaranteed"],["guarnteeing","guaranteeing"],["guarntees","guarantees"],["guarnteing","guaranteeing"],["guarntes","guarantees"],["guarnty","guaranty"],["guarrante","guarantee"],["guarranted","guaranteed"],["guarrantee","guarantee"],["guarranteed","guaranteed"],["guarranteeing","guaranteeing"],["guarrantees","guarantees"],["guarranteing","guaranteeing"],["guarrantes","guarantees"],["guarrantie","guarantee"],["guarrantied","guaranteed"],["guarrantieing","guaranteeing"],["guarranties","guarantees"],["guarranty","guaranty"],["guarrantyd","guaranteed"],["guarrantying","guaranteeing"],["guarrantys","guarantees"],["guarrente","guarantee"],["guarrented","guaranteed"],["guarrentee","guarantee"],["guarrenteed","guaranteed"],["guarrenteeing","guaranteeing"],["guarrentees","guarantees"],["guarrenteing","guaranteeing"],["guarrentes","guarantees"],["guarrenty","guaranty"],["guaruante","guarantee"],["guaruanted","guaranteed"],["guaruantee","guarantee"],["guaruanteed","guaranteed"],["guaruanteeing","guaranteeing"],["guaruantees","guarantees"],["guaruanteing","guaranteeing"],["guaruantes","guarantees"],["guaruanty","guaranty"],["guarunte","guarantee"],["guarunted","guaranteed"],["guaruntee","guarantee"],["guarunteed","guaranteed"],["guarunteeing","guaranteeing"],["guaruntees","guarantees"],["guarunteing","guaranteeing"],["guaruntes","guarantees"],["guarunty","guaranty"],["guas'","Gauss'"],["guas's","Gauss'"],["guas","Gauss"],["guass'","Gauss'"],["guass","Gauss"],["guassian","Gaussian"],["Guatamala","Guatemala"],["Guatamalan","Guatemalan"],["gud","good"],["guerrila","guerrilla"],["guerrilas","guerrillas"],["gueswork","guesswork"],["guideded","guided"],["guidence","guidance"],["guidline","guideline"],["guidlines","guidelines"],["Guilia","Giulia"],["Guilio","Giulio"],["Guiness","Guinness"],["Guiseppe","Giuseppe"],["gunanine","guanine"],["gurantee","guarantee"],["guranteed","guaranteed"],["guranteeing","guaranteeing"],["gurantees","guarantees"],["gurrantee","guarantee"],["guttaral","guttural"],["gutteral","guttural"],["gylph","glyph"],["gziniflate","gzinflate"],["gziped","gzipped"],["haa","has"],["haave","have"],["habaeus","habeas"],["habbit","habit"],["habeus","habeas"],["hability","ability"],["Habsbourg","Habsburg"],["hace","have"],["hachish","hackish"],["hadling","handling"],["hadnler","handler"],["haeder","header"],["haemorrage","haemorrhage"],["halarious","hilarious"],["hald","held"],["halfs","halves"],["halp","help"],["halpoints","halfpoints"],["hammmer","hammer"],["hampster","hamster"],["handel","handle"],["handeler","handler"],["handeles","handles"],["handeling","handling"],["handels","handles"],["hander","handler"],["handfull","handful"],["handhake","handshake"],["handker","handler"],["handleer","handler"],["handleing","handling"],["handlig","handling"],["handlling","handling"],["handsake","handshake"],["handshacke","handshake"],["handshackes","handshakes"],["handshacking","handshaking"],["handshage","handshake"],["handshages","handshakes"],["handshaging","handshaking"],["handshak","handshake"],["handshakng","handshaking"],["handshakre","handshake"],["handshakres","handshakes"],["handshakring","handshaking"],["handshaks","handshakes"],["handshale","handshake"],["handshales","handshakes"],["handshaling","handshaking"],["handshare","handshake"],["handshares","handshakes"],["handsharing","handshaking"],["handshk","handshake"],["handshke","handshake"],["handshkes","handshakes"],["handshking","handshaking"],["handshkng","handshaking"],["handshks","handshakes"],["handskake","handshake"],["handwirting","handwriting"],["hanel","handle"],["hangig","hanging"],["hanlde","handle"],["hanlded","handled"],["hanlder","handler"],["hanlders","handlers"],["hanldes","handles"],["hanlding","handling"],["hanldle","handle"],["hanle","handle"],["hanled","handled"],["hanles","handles"],["hanling","handling"],["hanshake","handshake"],["hanshakes","handshakes"],["hansome","handsome"],["hapen","happen"],["hapend","happened"],["hapends","happens"],["hapened","happened"],["hapening","happening"],["hapenn","happen"],["hapenned","happened"],["hapenning","happening"],["hapenns","happens"],["hapens","happens"],["happaned","happened"],["happended","happened"],["happenned","happened"],["happenning","happening"],["happennings","happenings"],["happenns","happens"],["happilly","happily"],["happne","happen"],["happpen","happen"],["happpened","happened"],["happpening","happening"],["happpenings","happenings"],["happpens","happens"],["harased","harassed"],["harases","harasses"],["harasment","harassment"],["harasments","harassments"],["harassement","harassment"],["harcoded","hardcoded"],["harcoding","hardcoding"],["hard-wirted","hard-wired"],["hardare","hardware"],["hardocde","hardcode"],["hardward","hardware"],["hardwdare","hardware"],["hardwirted","hardwired"],["harge","charge"],["harras","harass"],["harrased","harassed"],["harrases","harasses"],["harrasing","harassing"],["harrasment","harassment"],["harrasments","harassments"],["harrass","harass"],["harrassed","harassed"],["harrasses","harassed"],["harrassing","harassing"],["harrassment","harassment"],["harrassments","harassments"],["harth","hearth"],["harware","hardware"],["harwdare","hardware"],["has'nt","hasn't"],["hases","hashes"],["hashi","hash"],["hashreference","hash reference"],["hashs","hashes"],["hashses","hashes"],["hask","hash"],["hasn;t","hasn't"],["hasnt'","hasn't"],["hasnt","hasn't"],["hass","hash"],["hastable","hashtable"],["hastables","hashtables"],["Hatian","Haitian"],["hauty","haughty"],["have'nt","haven't"],["haveing","having"],["haven;t","haven't"],["havent'","haven't"],["havent't","haven't"],["havent","haven't"],["havew","have"],["haviest","heaviest"],["havn't","haven't"],["havnt","haven't"],["hax","hex"],["haynus","heinous"],["hazzle","hassle"],["hda","had"],["headder","header"],["headders","headers"],["headerr","header"],["headerrs","headers"],["headle","handle"],["headong","heading"],["headquarer","headquarter"],["headquater","headquarter"],["headquatered","headquartered"],["headquaters","headquarters"],["heaer","header"],["healthercare","healthcare"],["heathy","healthy"],["hefer","heifer"],["Heidelburg","Heidelberg"],["heigest","highest"],["heigher","higher"],["heighest","highest"],["heighit","height"],["heighteen","eighteen"],["heigt","height"],["heigth","height"],["heirachies","hierarchies"],["heirachy","hierarchy"],["heirarchic","hierarchic"],["heirarchical","hierarchical"],["heirarchically","hierarchically"],["heirarchies","hierarchies"],["heirarchy","hierarchy"],["heiroglyphics","hieroglyphics"],["helerps","helpers"],["hellow","hello"],["helment","helmet"],["heloer","helper"],["heloers","helpers"],["helpe","helper"],["helpfull","helpful"],["helpfuly","helpfully"],["helpped","helped"],["hemipshere","hemisphere"],["hemipsheres","hemispheres"],["hemishpere","hemisphere"],["hemishperes","hemispheres"],["hemmorhage","hemorrhage"],["hemorage","haemorrhage"],["henc","hence"],["henderence","hindrance"],["hendler","handler"],["hense","hence"],["hepler","helper"],["herarchy","hierarchy"],["herat","heart"],["heree","here"],["heridity","heredity"],["heroe","hero"],["heros","heroes"],["herselv","herself"],["hertiage","heritage"],["hertically","hectically"],["hertzs","hertz"],["hese","these"],["hesiate","hesitate"],["hesistant","hesitant"],["hesistate","hesitate"],["hesistated","hesitated"],["hesistates","hesitates"],["hesistating","hesitating"],["hesistation","hesitation"],["hesistations","hesitations"],["hestiate","hesitate"],["hetrogeneous","heterogeneous"],["heuristc","heuristic"],["heuristcs","heuristics"],["heursitics","heuristics"],["hevy","heavy"],["hexademical","hexadecimal"],["hexdecimal","hexadecimal"],["hexgaon","hexagon"],["hexgaonal","hexagonal"],["hexgaons","hexagons"],["hexidecimal","hexadecimal"],["hge","he"],["hiarchical","hierarchical"],["hiarchy","hierarchy"],["hiddden","hidden"],["hidded","hidden"],["hideen","hidden"],["hiden","hidden"],["hiearchies","hierarchies"],["hiearchy","hierarchy"],["hieght","height"],["hiena","hyena"],["hierachical","hierarchical"],["hierachies","hierarchies"],["hierachries","hierarchies"],["hierachry","hierarchy"],["hierachy","hierarchy"],["hierarachical","hierarchical"],["hierarachy","hierarchy"],["hierarchichal","hierarchical"],["hierarchichally","hierarchically"],["hierarchie","hierarchy"],["hierarcical","hierarchical"],["hierarcy","hierarchy"],["hierarhcical","hierarchical"],["hierarhcically","hierarchically"],["hierarhcies","hierarchies"],["hierarhcy","hierarchy"],["hierchy","hierarchy"],["hieroglph","hieroglyph"],["hieroglphs","hieroglyphs"],["hietus","hiatus"],["higeine","hygiene"],["higer","higher"],["higest","highest"],["high-affort","high-effort"],["highight","highlight"],["highighted","highlighted"],["highighter","highlighter"],["highighters","highlighters"],["highights","highlights"],["highjack","hijack"],["highligh","highlight"],["highlighed","highlighted"],["highligher","highlighter"],["highlighers","highlighters"],["highlighing","highlighting"],["highlighs","highlights"],["highlightin","highlighting"],["highlightning","highlighting"],["highligjt","highlight"],["highligjted","highlighted"],["highligjtes","highlights"],["highligjting","highlighting"],["highligjts","highlights"],["highligt","highlight"],["highligted","highlighted"],["highligth","highlight"],["highligting","highlighting"],["highligts","highlights"],["highter","higher"],["hightest","highest"],["hightlight","highlight"],["hightlighted","highlighted"],["hightlighting","highlighting"],["hightlights","highlights"],["hights","heights"],["higlight","highlight"],["higlighted","highlighted"],["higlighting","highlighting"],["higlights","highlights"],["higly","highly"],["higth","height"],["higway","highway"],["hijkack","hijack"],["hijkacked","hijacked"],["hijkacking","hijacking"],["hijkacks","hijacks"],["hilight","highlight"],["hilighted","highlighted"],["hilighting","highlighting"],["hilights","highlights"],["hillarious","hilarious"],["himselv","himself"],["hinderance","hindrance"],["hinderence","hindrance"],["hindrence","hindrance"],["hipopotamus","hippopotamus"],["hipotetical","hypothetical"],["hirachy","hierarchy"],["hirarchies","hierarchies"],["hirarchy","hierarchy"],["hirarcies","hierarchies"],["hirearchy","hierarchy"],["hirearcy","hierarchy"],["hismelf","himself"],["hisory","history"],["histgram","histogram"],["histocompatability","histocompatibility"],["historgram","histogram"],["historgrams","histograms"],["historicians","historians"],["historyan","historian"],["historyans","historians"],["historycal","historical"],["historycally","historically"],["historycaly","historically"],["histroian","historian"],["histroians","historians"],["histroic","historic"],["histroical","historical"],["histroically","historically"],["histroicaly","historically"],["histroies","histories"],["histroy","history"],["histry","history"],["hitogram","histogram"],["hitories","histories"],["hitory","history"],["hitsingles","hit singles"],["hiygeine","hygiene"],["hmdi","hdmi"],["hnalder","handler"],["hoeks","hoax"],["hoever","however"],["hokay","okay"],["holf","hold"],["holliday","holiday"],["hollowcost","holocaust"],["homapage","homepage"],["homegeneous","homogeneous"],["homestate","home state"],["homogeneize","homogenize"],["homogeneized","homogenized"],["homogenious","homogeneous"],["homogeniously","homogeneously"],["homogenity","homogeneity"],["homogenius","homogeneous"],["homogeniusly","homogeneously"],["homogenoues","homogeneous"],["homogenous","homogeneous"],["homogenously","homogeneously"],["homogenuous","homogeneous"],["honory","honorary"],["hoook","hook"],["hoooks","hooks"],["hootsba","chutzpah"],["hopefulle","hopefully"],["hopefullly","hopefully"],["hopefullt","hopefully"],["hopefullu","hopefully"],["hopefuly","hopefully"],["hopeing","hoping"],["hopful","hopeful"],["hopfully","hopefully"],["hopmepage","homepage"],["hopmepages","homepages"],["hoppefully","hopefully"],["hopyfully","hopefully"],["horicontal","horizontal"],["horicontally","horizontally"],["horinzontal","horizontal"],["horizntal","horizontal"],["horizonal","horizontal"],["horizonally","horizontally"],["horizontale","horizontal"],["horiztonal","horizontal"],["horiztonally","horizontally"],["horphan","orphan"],["horrable","horrible"],["horrifing","horrifying"],["horyzontally","horizontally"],["horziontal","horizontal"],["horziontally","horizontally"],["horzontal","horizontal"],["horzontally","horizontally"],["hosited","hoisted"],["hospitible","hospitable"],["hostanme","hostname"],["hostorical","historical"],["hostories","histories"],["hostory","history"],["hostspot","hotspot"],["hostspots","hotspots"],["hotizontal","horizontal"],["hotname","hostname"],["hounour","honour"],["houres","hours"],["housand","thousand"],["houskeeping","housekeeping"],["hovever","however"],["hovewer","however"],["howeever","however"],["howerver","however"],["howeverm","however"],["howewer","however"],["howver","however"],["hradware","hardware"],["hradwares","hardwares"],["hrlp","help"],["hrlped","helped"],["hrlper","helper"],["hrlpers","helpers"],["hrlping","helping"],["hrlps","helps"],["hrough","through"],["hsa","has"],["hsell","shell"],["hsi","his"],["hsitorians","historians"],["hsotname","hostname"],["hsould'nt","shouldn't"],["hsould","should"],["hsouldn't","shouldn't"],["hstory","history"],["htacccess","htaccess"],["hte","the"],["htey","they"],["htikn","think"],["hting","thing"],["htink","think"],["htis","this"],["htmp","html"],["htting","hitting"],["hueristic","heuristic"],["humber","number"],["huminoid","humanoid"],["humoural","humoral"],["humurous","humorous"],["hunderd","hundred"],["hundreths","hundredths"],["hundrets","hundreds"],["hunrgy","hungry"],["huricane","hurricane"],["huristic","heuristic"],["husban","husband"],["hvae","have"],["hvaing","having"],["hve","have"],["hwihc","which"],["hwile","while"],["hwole","whole"],["hybernate","hibernate"],["hydogen","hydrogen"],["hydrolic","hydraulic"],["hydrolics","hydraulics"],["hydropile","hydrophile"],["hydropilic","hydrophilic"],["hydropobe","hydrophobe"],["hydropobic","hydrophobic"],["hyerarchy","hierarchy"],["hyerlink","hyperlink"],["hygeine","hygiene"],["hygene","hygiene"],["hygenic","hygienic"],["hygine","hygiene"],["hyjack","hijack"],["hyjacking","hijacking"],["hypen","hyphen"],["hypenate","hyphenate"],["hypenated","hyphenated"],["hypenates","hyphenates"],["hypenating","hyphenating"],["hypenation","hyphenation"],["hypens","hyphens"],["hyperboly","hyperbole"],["Hyperldger","Hyperledger"],["hypervior","hypervisor"],["hypocracy","hypocrisy"],["hypocrasy","hypocrisy"],["hypocricy","hypocrisy"],["hypocrit","hypocrite"],["hypocrits","hypocrites"],["hyposeses","hypotheses"],["hyposesis","hypothesis"],["hypoteses","hypotheses"],["hypotesis","hypothesis"],["hypotethically","hypothetically"],["hypothenuse","hypotenuse"],["hypothenuses","hypotenuses"],["hypter","hyper"],["hyptothetical","hypothetical"],["hyptothetically","hypothetically"],["hypvervisor","hypervisor"],["hypvervisors","hypervisors"],["hypvisor","hypervisor"],["hypvisors","hypervisors"],["I'sd","I'd"],["i;ll","I'll"],["iamge","image"],["ibject","object"],["ibjects","objects"],["ibrary","library"],["icesickle","icicle"],["iclude","include"],["icluded","included"],["icludes","includes"],["icluding","including"],["iconclastic","iconoclastic"],["iconifie","iconify"],["icrease","increase"],["icreased","increased"],["icreases","increases"],["icreasing","increasing"],["icrement","increment"],["icrementally","incrementally"],["icremented","incremented"],["icrementing","incrementing"],["icrements","increments"],["idae","idea"],["idaeidae","idea"],["idaes","ideas"],["idealogies","ideologies"],["idealogy","ideology"],["idefinite","indefinite"],["idel","idle"],["idelogy","ideology"],["idemopotent","idempotent"],["idendified","identified"],["idendifier","identifier"],["idendifiers","identifiers"],["idenfied","identified"],["idenfifier","identifier"],["idenfifiers","identifiers"],["idenfitifer","identifier"],["idenfitifers","identifiers"],["idenfitify","identify"],["idenitfy","identify"],["idenitify","identify"],["identation","indentation"],["identcial","identical"],["identfied","identified"],["identfier","identifier"],["identfiers","identifiers"],["identiable","identifiable"],["idential","identical"],["identic","identical"],["identicial","identical"],["identidier","identifier"],["identies","identities"],["identifaction","identification"],["identifcation","identification"],["identifeir","identifier"],["identifeirs","identifiers"],["identifer","identifier"],["identifers","identifiers"],["identificable","identifiable"],["identifictaion","identification"],["identifieer","identifier"],["identifiler","identifier"],["identifilers","identifiers"],["identifing","identifying"],["identifiy","identify"],["identifyable","identifiable"],["identifyed","identified"],["identiviert","identifiers"],["identtation","indentation"],["identties","identities"],["identtifier","identifier"],["identty","identity"],["ideosyncracies","ideosyncrasies"],["ideosyncratic","idiosyncratic"],["idetifier","identifier"],["idetifiers","identifiers"],["idetifies","identifies"],["idicate","indicate"],["idicated","indicated"],["idicates","indicates"],["idicating","indicating"],["idices","indices"],["idiosyncracies","idiosyncrasies"],["idiosyncracy","idiosyncrasy"],["idividual","individual"],["idividually","individually"],["idividuals","individuals"],["idons","icons"],["iechart","piechart"],["ifself","itself"],["ifset","if set"],["ignest","ingest"],["ignested","ingested"],["ignesting","ingesting"],["ignests","ingests"],["ignnore","ignore"],["ignoded","ignored"],["ignonre","ignore"],["ignora","ignore"],["ignord","ignored"],["ignoreing","ignoring"],["ignorence","ignorance"],["ignorgable","ignorable"],["ignorgd","ignored"],["ignorge","ignore"],["ignorged","ignored"],["ignorgg","ignoring"],["ignorgig","ignoring"],["ignorging","ignoring"],["ignorgs","ignores"],["ignormable","ignorable"],["ignormd","ignored"],["ignorme","ignore"],["ignormed","ignored"],["ignormg","ignoring"],["ignormig","ignoring"],["ignorming","ignoring"],["ignorms","ignores"],["ignornable","ignorable"],["ignornd","ignored"],["ignorne","ignore"],["ignorned","ignored"],["ignorng","ignoring"],["ignornig","ignoring"],["ignorning","ignoring"],["ignorns","ignores"],["ignorrable","ignorable"],["ignorrd","ignored"],["ignorre","ignore"],["ignorred","ignored"],["ignorrg","ignoring"],["ignorrig","ignoring"],["ignorring","ignoring"],["ignorrs","ignores"],["ignors","ignores"],["ignortable","ignorable"],["ignortd","ignored"],["ignorte","ignore"],["ignorted","ignored"],["ignortg","ignoring"],["ignortig","ignoring"],["ignorting","ignoring"],["ignorts","ignores"],["ignory","ignore"],["ignroed","ignored"],["ignroing","ignoring"],["igoned","ignored"],["igonorando","ignorando"],["igonore","ignore"],["igore","ignore"],["igored","ignored"],["igores","ignores"],["igoring","ignoring"],["igrnore","ignore"],["Ihaca","Ithaca"],["ihs","his"],["iif","if"],["iimmune","immune"],["iinclude","include"],["iinterval","interval"],["iiterator","iterator"],["iland","island"],["ileagle","illegal"],["ilegal","illegal"],["ilegle","illegal"],["iligal","illegal"],["illegimacy","illegitimacy"],["illegitmate","illegitimate"],["illess","illness"],["illgal","illegal"],["illiegal","illegal"],["illigal","illegal"],["illigitament","illegitimate"],["illistrate","illustrate"],["illustrasion","illustration"],["illution","illusion"],["ilness","illness"],["ilogical","illogical"],["iluminate","illuminate"],["iluminated","illuminated"],["iluminates","illuminates"],["ilumination","illumination"],["iluminations","illuminations"],["ilustrate","illustrate"],["ilustrated","illustrated"],["ilustration","illustration"],["imagenary","imaginary"],["imaghe","image"],["imagin","imagine"],["imapct","impact"],["imapcted","impacted"],["imapcting","impacting"],["imapcts","impacts"],["imapge","image"],["imbaress","embarrass"],["imbed","embed"],["imbedded","embedded"],["imbedding","embedding"],["imblance","imbalance"],["imbrase","embrace"],["imcoming","incoming"],["imcomming","incoming"],["imcompatibility","incompatibility"],["imcompatible","incompatible"],["imcomplete","incomplete"],["imedatly","immediately"],["imedialy","immediately"],["imediate","immediate"],["imediately","immediately"],["imediatly","immediately"],["imense","immense"],["imfamus","infamous"],["imgage","image"],["imidiately","immediately"],["imilar","similar"],["imlement","implement"],["imlementation","implementation"],["imlemented","implemented"],["imlementing","implementing"],["imlements","implements"],["imlicit","implicit"],["imlicitly","implicitly"],["imliment","implement"],["imlimentation","implementation"],["imlimented","implemented"],["imlimenting","implementing"],["imliments","implements"],["immadiate","immediate"],["immadiately","immediately"],["immadiatly","immediately"],["immeadiate","immediate"],["immeadiately","immediately"],["immedaite","immediate"],["immedate","immediate"],["immedately","immediately"],["immedeate","immediate"],["immedeately","immediately"],["immedially","immediately"],["immedialty","immediately"],["immediantely","immediately"],["immediatelly","immediately"],["immediatelty","immediately"],["immediatley","immediately"],["immediatlly","immediately"],["immediatly","immediately"],["immediatlye","immediately"],["immeditaly","immediately"],["immeditately","immediately"],["immeidate","immediate"],["immeidately","immediately"],["immenantly","eminently"],["immidately","immediately"],["immidatly","immediately"],["immidiate","immediate"],["immidiatelly","immediately"],["immidiately","immediately"],["immidiatly","immediately"],["immitate","imitate"],["immitated","imitated"],["immitating","imitating"],["immitator","imitator"],["immmediate","immediate"],["immmediately","immediately"],["immsersive","immersive"],["immsersively","immersively"],["immuniy","immunity"],["immunosupressant","immunosuppressant"],["immutible","immutable"],["imolicit","implicit"],["imolicitly","implicitly"],["imort","import"],["imortable","importable"],["imorted","imported"],["imortes","imports"],["imorting","importing"],["imorts","imports"],["imovable","immovable"],["impcat","impact"],["impcated","impacted"],["impcating","impacting"],["impcats","impacts"],["impecabbly","impeccably"],["impedence","impedance"],["impeed","impede"],["impelement","implement"],["impelementation","implementation"],["impelemented","implemented"],["impelementing","implementing"],["impelements","implements"],["impelentation","implementation"],["impelment","implement"],["impelmentation","implementation"],["impelmentations","implementations"],["impement","implement"],["impementaion","implementation"],["impementaions","implementations"],["impementated","implemented"],["impementation","implementation"],["impementations","implementations"],["impemented","implemented"],["impementing","implementing"],["impementling","implementing"],["impementor","implementer"],["impements","implements"],["imperiaal","imperial"],["imperically","empirically"],["imperitive","imperative"],["impermable","impermeable"],["impiled","implied"],["implace","inplace"],["implament","implement"],["implamentation","implementation"],["implamented","implemented"],["implamenting","implementing"],["implaments","implements"],["implcit","implicit"],["implcitly","implicitly"],["implct","implicit"],["implemantation","implementation"],["implemataion","implementation"],["implemataions","implementations"],["implemememnt","implement"],["implemememntation","implementation"],["implemement","implement"],["implemementation","implementation"],["implemementations","implementations"],["implememented","implemented"],["implemementing","implementing"],["implemements","implements"],["implememetation","implementation"],["implememntation","implementation"],["implememt","implement"],["implememtation","implementation"],["implememtations","implementations"],["implememted","implemented"],["implememting","implementing"],["implememts","implements"],["implemen","implement"],["implemenatation","implementation"],["implemenation","implementation"],["implemenationa","implementation"],["implemenationd","implementation"],["implemenations","implementations"],["implemencted","implemented"],["implemend","implement"],["implemends","implements"],["implemened","implemented"],["implemenet","implement"],["implemenetaion","implementation"],["implemenetaions","implementations"],["implemenetation","implementation"],["implemenetations","implementations"],["implemenetd","implemented"],["implemeneted","implemented"],["implemeneter","implementer"],["implemeneting","implementing"],["implemenetions","implementations"],["implemenets","implements"],["implemenrt","implement"],["implementaed","implemented"],["implementaion","implementation"],["implementaions","implementations"],["implementaiton","implementation"],["implementaitons","implementations"],["implementantions","implementations"],["implementastion","implementation"],["implementataion","implementation"],["implementatation","implementation"],["implementated","implemented"],["implementates","implements"],["implementating","implementing"],["implementatins","implementations"],["implementation-spacific","implementation-specific"],["implementatition","implementation"],["implementatoin","implementation"],["implementatoins","implementations"],["implementatoion","implementation"],["implementaton","implementation"],["implementator","implementer"],["implementators","implementers"],["implementattion","implementation"],["implementd","implemented"],["implementes","implements"],["implementet","implemented"],["implemention","implementation"],["implementtaion","implementation"],["implemet","implement"],["implemetation","implementation"],["implemetations","implementations"],["implemeted","implemented"],["implemeting","implementing"],["implemetnation","implementation"],["implemets","implements"],["implemnt","implement"],["implemntation","implementation"],["implemntations","implementations"],["implemt","implement"],["implemtation","implementation"],["implemtations","implementations"],["implemted","implemented"],["implemtentation","implementation"],["implemtentations","implementations"],["implemting","implementing"],["implemts","implements"],["impleneted","implemented"],["implenment","implement"],["implenmentation","implementation"],["implent","implement"],["implentation","implementation"],["implentations","implementations"],["implented","implemented"],["implenting","implementing"],["implentors","implementers"],["implents","implements"],["implet","implement"],["impletation","implementation"],["impletations","implementations"],["impleted","implemented"],["impleter","implementer"],["impleting","implementing"],["impletment","implement"],["implets","implements"],["implicitely","implicitly"],["implicitley","implicitly"],["implict","implicit"],["implictly","implicitly"],["implimcit","implicit"],["implimcitly","implicitly"],["impliment","implement"],["implimentaion","implementation"],["implimentaions","implementations"],["implimentation","implementation"],["implimentation-spacific","implementation-specific"],["implimentations","implementations"],["implimented","implemented"],["implimenting","implementing"],["implimention","implementation"],["implimentions","implementations"],["implimentor","implementor"],["impliments","implements"],["implmenet","implement"],["implmenetaion","implementation"],["implmenetaions","implementations"],["implmenetation","implementation"],["implmenetations","implementations"],["implmenetd","implemented"],["implmeneted","implemented"],["implmeneter","implementer"],["implmeneting","implementing"],["implmenets","implements"],["implment","implement"],["implmentation","implementation"],["implmentations","implementations"],["implmented","implemented"],["implmenting","implementing"],["implments","implements"],["imploys","employs"],["imporing","importing"],["imporot","import"],["imporoted","imported"],["imporoting","importing"],["imporots","imports"],["imporove","improve"],["imporoved","improved"],["imporovement","improvement"],["imporovements","improvements"],["imporoves","improves"],["imporoving","improving"],["imporsts","imports"],["importamt","important"],["importat","important"],["importd","imported"],["importent","important"],["importnt","important"],["imporve","improve"],["imporved","improved"],["imporvement","improvement"],["imporvements","improvements"],["imporves","improves"],["imporving","improving"],["imporvment","improvement"],["imposible","impossible"],["impossiblble","impossible"],["impot","import"],["impove","improve"],["impoved","improved"],["impovement","improvement"],["impovements","improvements"],["impoves","improves"],["impoving","improving"],["impplement","implement"],["impplementating","implementing"],["impplementation","implementation"],["impplemented","implemented"],["impremented","implemented"],["impres","impress"],["impresive","impressive"],["impressario","impresario"],["imprioned","imprisoned"],["imprisonned","imprisoned"],["improbe","improve"],["improbement","improvement"],["improbements","improvements"],["improbes","improves"],["improbing","improving"],["improbment","improvement"],["improbments","improvements"],["improof","improve"],["improofement","improvement"],["improofing","improving"],["improofment","improvement"],["improofs","improves"],["improove","improve"],["improoved","improved"],["improovement","improvement"],["improovements","improvements"],["improoves","improves"],["improoving","improving"],["improovment","improvement"],["improovments","improvements"],["impropely","improperly"],["improssible","impossible"],["improt","import"],["improtance","importance"],["improtant","important"],["improtantly","importantly"],["improtation","importation"],["improtations","importations"],["improted","imported"],["improter","importer"],["improters","importers"],["improting","importing"],["improts","imports"],["improvemen","improvement"],["improvemenet","improvement"],["improvemenets","improvements"],["improvemens","improvements"],["improvision","improvisation"],["improvmenet","improvement"],["improvmenets","improvements"],["improvment","improvement"],["improvments","improvements"],["imput","input"],["imrovement","improvement"],["in-memeory","in-memory"],["inablility","inability"],["inacccessible","inaccessible"],["inaccesible","inaccessible"],["inaccessable","inaccessible"],["inaccuraccies","inaccuracies"],["inaccuraccy","inaccuracy"],["inacessible","inaccessible"],["inacurate","inaccurate"],["inacurracies","inaccuracies"],["inacurrate","inaccurate"],["inadiquate","inadequate"],["inadquate","inadequate"],["inadvertant","inadvertent"],["inadvertantly","inadvertently"],["inadvertedly","inadvertently"],["inagurated","inaugurated"],["inaguration","inauguration"],["inaktively","inactively"],["inalid","invalid"],["inappropiate","inappropriate"],["inappropreate","inappropriate"],["inapropriate","inappropriate"],["inapropriately","inappropriately"],["inate","innate"],["inaugures","inaugurates"],["inavlid","invalid"],["inbalance","imbalance"],["inbalanced","imbalanced"],["inbed","embed"],["inbedded","embedded"],["inbility","inability"],["incalid","invalid"],["incarcirated","incarcerated"],["incase","in case"],["incatation","incantation"],["incatations","incantations"],["incative","inactive"],["incement","increment"],["incemental","incremental"],["incementally","incrementally"],["incemented","incremented"],["incements","increments"],["incerase","increase"],["incerased","increased"],["incerasing","increasing"],["incidential","incidental"],["incidentially","incidentally"],["incidently","incidentally"],["inclding","including"],["incldue","include"],["incldued","included"],["incldues","includes"],["inclinaison","inclination"],["inclode","include"],["inclreased","increased"],["includ","include"],["includea","include"],["includee","include"],["includeing","including"],["includied","included"],["includig","including"],["includign","including"],["includng","including"],["inclue","include"],["inclued","included"],["inclues","includes"],["incluging","including"],["incluide","include"],["incluing","including"],["inclused","included"],["inclusing","including"],["inclusinve","inclusive"],["inclution","inclusion"],["inclutions","inclusions"],["incmrement","increment"],["incoherance","incoherence"],["incoherancy","incoherency"],["incoherant","incoherent"],["incoherantly","incoherently"],["incomapatibility","incompatibility"],["incomapatible","incompatible"],["incomaptibele","incompatible"],["incomaptibelities","incompatibilities"],["incomaptibelity","incompatibility"],["incomaptible","incompatible"],["incombatibilities","incompatibilities"],["incombatibility","incompatibility"],["incomfortable","uncomfortable"],["incomming","incoming"],["incommplete","incomplete"],["incompatabable","incompatible"],["incompatabiity","incompatibility"],["incompatabile","incompatible"],["incompatabilities","incompatibilities"],["incompatability","incompatibility"],["incompatabillity","incompatibility"],["incompatabilty","incompatibility"],["incompatabily","incompatibility"],["incompatable","incompatible"],["incompatablility","incompatibility"],["incompatablities","incompatibilities"],["incompatablitiy","incompatibility"],["incompatablity","incompatibility"],["incompatably","incompatibly"],["incompataibility","incompatibility"],["incompataible","incompatible"],["incompataility","incompatibility"],["incompatatbility","incompatibility"],["incompatatble","incompatible"],["incompatatible","incompatible"],["incompatbility","incompatibility"],["incompatble","incompatible"],["incompatiability","incompatibility"],["incompatiable","incompatible"],["incompatibile","incompatible"],["incompatibilies","incompatibilities"],["incompatiblities","incompatibilities"],["incompatiblity","incompatibility"],["incompetance","incompetence"],["incompetant","incompetent"],["incompete","incomplete"],["incomping","incoming"],["incompleate","incomplete"],["incompleete","incomplete"],["incompletd","incomplete"],["incomptable","incompatible"],["incomptetent","incompetent"],["incomptible","incompatible"],["inconcistencies","inconsistencies"],["inconcistency","inconsistency"],["inconcistent","inconsistent"],["inconditional","unconditional"],["inconditionally","unconditionally"],["inconfortable","uncomfortable"],["inconisistent","inconsistent"],["inconistencies","inconsistencies"],["inconlusive","inconclusive"],["inconsisent","inconsistent"],["inconsisently","inconsistently"],["inconsisntency","inconsistency"],["inconsistance","inconsistency"],["inconsistancies","inconsistencies"],["inconsistancy","inconsistency"],["inconsistant","inconsistent"],["inconsisten","inconsistent"],["inconsistend","inconsistent"],["inconsistendly","inconsistently"],["inconsistendt","inconsistent"],["inconsistendtly","inconsistently"],["inconsistenly","inconsistently"],["inconsistented","inconsistent"],["inconsitant","inconsistent"],["inconsitency","inconsistency"],["inconsitent","inconsistent"],["inconveniant","inconvenient"],["inconveniantly","inconveniently"],["inconvertable","inconvertible"],["inconvienience","inconvenience"],["inconvienient","inconvenient"],["inconvineance","inconvenience"],["inconvineances","inconveniences"],["inconvinence","inconvenience"],["inconvinences","inconveniences"],["inconviniance","inconvenience"],["inconviniances","inconveniences"],["inconvinience","inconvenience"],["inconviniences","inconveniences"],["inconviniency","inconvenience"],["inconviniencys","inconveniences"],["incooperates","incorporates"],["incoperate","incorporate"],["incoperated","incorporated"],["incoperates","incorporates"],["incoperating","incorporating"],["incoporate","incorporate"],["incoporated","incorporated"],["incoporates","incorporates"],["incoporating","incorporating"],["incoprorate","incorporate"],["incoprorated","incorporated"],["incoprorates","incorporates"],["incoprorating","incorporating"],["incorect","incorrect"],["incorectly","incorrectly"],["incoropate","incorporate"],["incoropates","incorporates"],["incoroporated","incorporated"],["incorparates","incorporates"],["incorperate","incorporate"],["incorperated","incorporated"],["incorperates","incorporates"],["incorperating","incorporating"],["incorperation","incorporation"],["incorportaed","incorporated"],["incorported","incorporated"],["incorprates","incorporates"],["incorreclty","incorrectly"],["incorrecly","incorrectly"],["incorrecty","incorrectly"],["incorreect","incorrect"],["incorreectly","incorrectly"],["incorrent","incorrect"],["incorret","incorrect"],["incorrrect","incorrect"],["incorrrectly","incorrectly"],["incorruptable","incorruptible"],["incosistencies","inconsistencies"],["incosistency","inconsistency"],["incosistent","inconsistent"],["incosistente","inconsistent"],["incramentally","incrementally"],["increadible","incredible"],["increading","increasing"],["increaing","increasing"],["increament","increment"],["increas","increase"],["incredable","incredible"],["incremantal","incremental"],["incremeantal","incremental"],["incremenet","increment"],["incremenetd","incremented"],["incremeneted","incremented"],["incrementaly","incrementally"],["incremet","increment"],["incremetal","incremental"],["incremeted","incremented"],["incremnet","increment"],["increse","increase"],["incresed","increased"],["increses","increases"],["incresing","increasing"],["incrfemental","incremental"],["incrmenet","increment"],["incrmenetd","incremented"],["incrmeneted","incremented"],["incrment","increment"],["incrmental","incremental"],["incrmentally","incrementally"],["incrmented","incremented"],["incrmenting","incrementing"],["incrments","increments"],["inctance","instance"],["inctroduce","introduce"],["inctroduced","introduced"],["incude","include"],["incuded","included"],["incudes","includes"],["incuding","including"],["inculde","include"],["inculded","included"],["inculdes","includes"],["inculding","including"],["incunabla","incunabula"],["incure","incur"],["incurruptable","incorruptible"],["incurruptible","incorruptible"],["incvalid","invalid"],["indcates","indicates"],["indciate","indicate"],["inddex","index"],["inddividual","individual"],["inddividually","individually"],["inddividuals","individuals"],["indecate","indicate"],["indeces","indices"],["indecies","indices"],["indefinate","indefinite"],["indefinately","indefinitely"],["indefineable","undefinable"],["indefinetly","indefinitely"],["indefinitiley","indefinitely"],["indefinitively","indefinitely"],["indefinitly","indefinitely"],["indefintly","indefinitely"],["indempotent","idempotent"],["indendation","indentation"],["indentaction","indentation"],["indentaion","indentation"],["indentended","indented"],["indentical","identical"],["indentically","identically"],["indentifer","identifier"],["indentification","identification"],["indentified","identified"],["indentifier","identifier"],["indentifies","identifies"],["indentifing","identifying"],["indentify","identify"],["indentifying","identifying"],["indentit","identity"],["indentity","identity"],["indentleveal","indentlevel"],["indenx","index"],["indepandance","independence"],["indepdence","independence"],["indepdencente","independence"],["indepdendance","independence"],["indepdendant","independent"],["indepdendantly","independently"],["indepdendence","independence"],["indepdendency","independency"],["indepdendent","independent"],["indepdendently","independently"],["indepdendet","independent"],["indepdendetly","independently"],["indepdenence","independence"],["indepdenent","independent"],["indepdenently","independently"],["indepdent","independent"],["indepdented","independent"],["indepdentedly","independently"],["indepdently","independently"],["indepedantly","independently"],["indepedence","independence"],["indepedent","independent"],["indepedently","independently"],["independ","independent"],["independance","independence"],["independant","independent"],["independantly","independently"],["independece","independence"],["independed","independent"],["independedly","independently"],["independend","independent"],["independendet","independent"],["independet","independent"],["independly","independently"],["independnent","independent"],["independnet","independent"],["independnt","independent"],["independntly","independently"],["independt","independent"],["independtly","independently"],["indepenedent","independent"],["indepenendence","independence"],["indepenent","independent"],["indepenently","independently"],["indepent","independent"],["indepentent","independent"],["indepently","independently"],["inderect","indirect"],["inderts","inserts"],["indes","index"],["indespensable","indispensable"],["indespensible","indispensable"],["indexig","indexing"],["indiactor","indicator"],["indiate","indicate"],["indiated","indicated"],["indiates","indicates"],["indiating","indicating"],["indicaite","indicate"],["indicat","indicate"],["indicees","indices"],["indiciate","indicate"],["indiciated","indicated"],["indiciates","indicates"],["indiciating","indicating"],["indicies","indices"],["indicte","indicate"],["indictement","indictment"],["indictes","indicates"],["indictor","indicator"],["indigineous","indigenous"],["indipendence","independence"],["indipendent","independent"],["indipendently","independently"],["indiquate","indicate"],["indiquates","indicates"],["indirecty","indirectly"],["indispensible","indispensable"],["indisputible","indisputable"],["indisputibly","indisputably"],["indistiguishable","indistinguishable"],["indivdual","individual"],["indivdually","individually"],["indivdualy","individually"],["individal","individual"],["individally","individually"],["individals","individuals"],["individaul","individual"],["individaully","individually"],["individauls","individuals"],["individauly","individually"],["individial","individual"],["individualy","individually"],["individuel","individual"],["individuelly","individually"],["individuely","individually"],["indivisual","individual"],["indivisuality","individuality"],["indivisually","individually"],["indivisuals","individuals"],["indiviual","individual"],["indiviually","individually"],["indiviuals","individuals"],["indivual","individual"],["indivudual","individual"],["indivudually","individually"],["indizies","indices"],["indpendent","independent"],["indpendently","independently"],["indrect","indirect"],["indulgue","indulge"],["indure","endure"],["indutrial","industrial"],["indvidual","individual"],["indviduals","individuals"],["indxes","indexes"],["inearisation","linearisation"],["ineffciency","inefficiency"],["ineffcient","inefficient"],["ineffciently","inefficiently"],["inefficency","inefficiency"],["inefficent","inefficient"],["inefficently","inefficiently"],["inefficenty","inefficiently"],["inefficienty","inefficiently"],["ineffiecent","inefficient"],["ineffient","inefficient"],["ineffiently","inefficiently"],["ineficient","inefficient"],["inegrate","integrate"],["inegrated","integrated"],["ineqality","inequality"],["inequalitiy","inequality"],["inerface","interface"],["inerit","inherit"],["ineritance","inheritance"],["inerited","inherited"],["ineriting","inheriting"],["ineritor","inheritor"],["ineritors","inheritors"],["inerits","inherits"],["inernal","internal"],["inerrupt","interrupt"],["inershia","inertia"],["inershial","inertial"],["inersia","inertia"],["inersial","inertial"],["inertion","insertion"],["ines","lines"],["inestart","linestart"],["inetrrupts","interrupts"],["inevatible","inevitable"],["inevitible","inevitable"],["inevititably","inevitably"],["inexistant","inexistent"],["inexperiance","inexperience"],["inexperianced","inexperienced"],["inexpierence","inexperience"],["inexpierenced","inexperienced"],["inexpirience","inexperience"],["inexpirienced","inexperienced"],["infact","in fact"],["infalability","infallibility"],["infallable","infallible"],["infalte","inflate"],["infalted","inflated"],["infaltes","inflates"],["infalting","inflating"],["infectuous","infectious"],["infered","inferred"],["inferface","interface"],["infering","inferring"],["inferrable","inferable"],["inferrence","inference"],["infex","index"],["infilitrate","infiltrate"],["infilitrated","infiltrated"],["infilitration","infiltration"],["infinate","infinite"],["infinately","infinitely"],["infininte","infinite"],["infinit","infinite"],["infinitie","infinity"],["infinitly","infinitely"],["infinte","infinite"],["infintesimal","infinitesimal"],["infinty","infinity"],["infite","infinite"],["inflamation","inflammation"],["inflatoin","inflation"],["inflexable","inflexible"],["inflight","in-flight"],["influece","influence"],["influeced","influenced"],["influeces","influences"],["influecing","influencing"],["influencial","influential"],["influencin","influencing"],["influented","influenced"],["infoemation","information"],["infomation","information"],["infomational","informational"],["infomed","informed"],["infomer","informer"],["infomration","information"],["infoms","informs"],["infor","info"],["inforamtion","information"],["inforation","information"],["inforational","informational"],["inforce","enforce"],["inforced","enforced"],["informacion","information"],["informaion","information"],["informaiton","information"],["informatation","information"],["informatations","information"],["informatikon","information"],["informatins","information"],["informatio","information"],["informatiom","information"],["informations","information"],["informatoin","information"],["informatoins","information"],["informaton","information"],["informfation","information"],["informtion","information"],["inforrmation","information"],["infrantryman","infantryman"],["infrasctructure","infrastructure"],["infrastrcuture","infrastructure"],["infrastruture","infrastructure"],["infrastucture","infrastructure"],["infrastuctures","infrastructures"],["infreqency","infrequency"],["infreqentcy","infrequency"],["infreqeuncy","infrequency"],["infreqeuntcy","infrequency"],["infrequancies","infrequencies"],["infrequancy","infrequency"],["infrequantcies","infrequencies"],["infrequantcy","infrequency"],["infrequentcies","infrequencies"],["infrigement","infringement"],["infromation","information"],["infromatoin","information"],["infrormation","information"],["infrustructure","infrastructure"],["ingegral","integral"],["ingenius","ingenious"],["ingnore","ignore"],["ingnored","ignored"],["ingnores","ignores"],["ingnoring","ignoring"],["ingore","ignore"],["ingored","ignored"],["ingores","ignores"],["ingoring","ignoring"],["ingration","integration"],["ingreediants","ingredients"],["inh","in"],["inhabitans","inhabitants"],["inherantly","inherently"],["inheratance","inheritance"],["inheret","inherit"],["inherets","inherits"],["inheritablility","inheritability"],["inheritence","inheritance"],["inherith","inherit"],["inherithed","inherited"],["inherithing","inheriting"],["inheriths","inherits"],["inheritted","inherited"],["inherrit","inherit"],["inherritance","inheritance"],["inherrited","inherited"],["inherriting","inheriting"],["inherrits","inherits"],["inhert","inherit"],["inhertance","inheritance"],["inhertances","inheritances"],["inherted","inherited"],["inhertiance","inheritance"],["inherting","inheriting"],["inherts","inherits"],["inhomogenous","inhomogeneous"],["inialized","initialized"],["iniate","initiate"],["inidicate","indicate"],["inidicated","indicated"],["inidicates","indicates"],["inidicating","indicating"],["inidication","indication"],["inidications","indications"],["inidividual","individual"],["inidvidual","individual"],["inifinite","infinite"],["inifinity","infinity"],["inifinte","infinite"],["inifite","infinite"],["iniitial","initial"],["iniitialization","initialization"],["iniitializations","initializations"],["iniitialize","initialize"],["iniitialized","initialized"],["iniitializes","initializes"],["iniitializing","initializing"],["inintialisation","initialisation"],["inintialization","initialization"],["inisialise","initialise"],["inisialised","initialised"],["inisialises","initialises"],["iniside","inside"],["inisides","insides"],["initail","initial"],["initailisation","initialisation"],["initailise","initialise"],["initailised","initialised"],["initailiser","initialiser"],["initailisers","initialisers"],["initailises","initialises"],["initailising","initialising"],["initailization","initialization"],["initailize","initialize"],["initailized","initialized"],["initailizer","initializer"],["initailizers","initializers"],["initailizes","initializes"],["initailizing","initializing"],["initailly","initially"],["initails","initials"],["initailsation","initialisation"],["initailse","initialise"],["initailsed","initialised"],["initailsiation","initialisation"],["initaily","initially"],["initailzation","initialization"],["initailze","initialize"],["initailzed","initialized"],["initailziation","initialization"],["inital","initial"],["initalialisation","initialisation"],["initalialization","initialization"],["initalisation","initialisation"],["initalise","initialise"],["initalised","initialised"],["initaliser","initialiser"],["initalises","initialises"],["initalising","initialising"],["initalization","initialization"],["initalize","initialize"],["initalized","initialized"],["initalizer","initializer"],["initalizes","initializes"],["initalizing","initializing"],["initally","initially"],["initals","initials"],["initiailize","initialize"],["initiailized","initialized"],["initiailizes","initializes"],["initiailizing","initializing"],["initiaitive","initiative"],["initiaitives","initiatives"],["initialialise","initialise"],["initialialize","initialize"],["initialiasation","initialisation"],["initialiase","initialise"],["initialiased","initialised"],["initialiation","initialization"],["initialiazation","initialization"],["initialiaze","initialize"],["initialiazed","initialized"],["initialied","initialized"],["initialilsing","initialising"],["initialilzing","initializing"],["initialisaing","initialising"],["initialisaiton","initialisation"],["initialisated","initialised"],["initialisatin","initialisation"],["initialisationg","initialisation"],["initialisaton","initialisation"],["initialisatons","initialisations"],["initialiseing","initialising"],["initialisiation","initialisation"],["initialisong","initialising"],["initialiting","initializing"],["initialitse","initialise"],["initialitsing","initialising"],["initialitze","initialize"],["initialitzing","initializing"],["initializa","initialize"],["initializad","initialized"],["initializaed","initialized"],["initializaing","initializing"],["initializaiton","initialization"],["initializate","initialize"],["initializated","initialized"],["initializates","initializes"],["initializatin","initialization"],["initializating","initializing"],["initializationg","initialization"],["initializaton","initialization"],["initializatons","initializations"],["initializedd","initialized"],["initializeing","initializing"],["initializiation","initialization"],["initializong","initializing"],["initialsation","initialisation"],["initialse","initialise"],["initialsed","initialised"],["initialses","initialises"],["initialsing","initialising"],["initialy","initially"],["initialyl","initially"],["initialyse","initialise"],["initialysed","initialised"],["initialyses","initialises"],["initialysing","initialising"],["initialyze","initialize"],["initialyzed","initialized"],["initialyzes","initializes"],["initialyzing","initializing"],["initialzation","initialization"],["initialze","initialize"],["initialzed","initialized"],["initialzes","initializes"],["initialzing","initializing"],["initiatiate","initiate"],["initiatiated","initiated"],["initiatiater","initiator"],["initiatiating","initiating"],["initiatiator","initiator"],["initiatiats","initiates"],["initiatie","initiate"],["initiatied","initiated"],["initiaties","initiates"],["initiialise","initialise"],["initiialize","initialize"],["initilialised","initialised"],["initilialization","initialization"],["initilializations","initializations"],["initilialize","initialize"],["initilialized","initialized"],["initilializes","initializes"],["initilializing","initializing"],["initiliase","initialise"],["initiliased","initialised"],["initiliases","initialises"],["initiliasing","initialising"],["initiliaze","initialize"],["initiliazed","initialized"],["initiliazes","initializes"],["initiliazing","initializing"],["initilisation","initialisation"],["initilisations","initialisations"],["initilise","initialise"],["initilised","initialised"],["initilises","initialises"],["initilising","initialising"],["initilization","initialization"],["initilizations","initializations"],["initilize","initialize"],["initilized","initialized"],["initilizes","initializes"],["initilizing","initializing"],["inititalisation","initialisation"],["inititalisations","initialisations"],["inititalise","initialise"],["inititalised","initialised"],["inititaliser","initialiser"],["inititalising","initialising"],["inititalization","initialization"],["inititalizations","initializations"],["inititalize","initialize"],["inititate","initiate"],["inititator","initiator"],["inititialization","initialization"],["inititializations","initializations"],["initliasation","initialisation"],["initliase","initialise"],["initliased","initialised"],["initliaser","initialiser"],["initliazation","initialization"],["initliaze","initialize"],["initliazed","initialized"],["initliazer","initializer"],["inituialisation","initialisation"],["inituialization","initialization"],["inivisible","invisible"],["inizialize","initialize"],["inizialized","initialized"],["inizializes","initializes"],["inlalid","invalid"],["inlclude","include"],["inlcluded","included"],["inlcludes","includes"],["inlcluding","including"],["inlcludion","inclusion"],["inlclusive","inclusive"],["inlcude","include"],["inlcuded","included"],["inlcudes","includes"],["inlcuding","including"],["inlcusion","inclusion"],["inlcusive","inclusive"],["inlin","inline"],["inlude","include"],["inluded","included"],["inludes","includes"],["inluding","including"],["inludung","including"],["inluence","influence"],["inlusive","inclusive"],["inmediate","immediate"],["inmediatelly","immediately"],["inmediately","immediately"],["inmediatily","immediately"],["inmediatly","immediately"],["inmense","immense"],["inmigrant","immigrant"],["inmigrants","immigrants"],["inmmediately","immediately"],["inmplementation","implementation"],["innactive","inactive"],["innacurate","inaccurate"],["innacurately","inaccurately"],["innappropriate","inappropriate"],["innecesarily","unnecessarily"],["innecesary","unnecessary"],["innecessarily","unnecessarily"],["innecessary","unnecessary"],["inneffectual","ineffectual"],["innocous","innocuous"],["innoculate","inoculate"],["innoculated","inoculated"],["innosense","innocence"],["inocence","innocence"],["inofficial","unofficial"],["inofrmation","information"],["inoperant","inoperative"],["inoquous","innocuous"],["inot","into"],["inouts","inputs"],["inpact","impact"],["inpacted","impacted"],["inpacting","impacting"],["inpacts","impacts"],["inpeach","impeach"],["inpecting","inspecting"],["inpection","inspection"],["inpections","inspections"],["inpending","impending"],["inpenetrable","impenetrable"],["inplementation","implementation"],["inplementations","implementations"],["inplemented","implemented"],["inplicit","implicit"],["inplicitly","implicitly"],["inpolite","impolite"],["inport","import"],["inportant","important"],["inposible","impossible"],["inpossible","impossible"],["inpout","input"],["inpouts","inputs"],["inpractical","impractical"],["inpracticality","impracticality"],["inpractically","impractically"],["inprisonment","imprisonment"],["inproove","improve"],["inprooved","improved"],["inprooves","improves"],["inprooving","improving"],["inproovment","improvement"],["inproovments","improvements"],["inproper","improper"],["inproperly","improperly"],["inproving","improving"],["inpsection","inspection"],["inpterpreter","interpreter"],["inpu","input"],["inputed","inputted"],["inputsream","inputstream"],["inpuut","input"],["inrement","increment"],["inrements","increments"],["inreractive","interactive"],["inrerface","interface"],["inresponsive","unresponsive"],["inro","into"],["ins't","isn't"],["insallation","installation"],["insalled","installed"],["inscpeting","inspecting"],["insctuction","instruction"],["insctuctional","instructional"],["insctuctions","instructions"],["insde","inside"],["insead","instead"],["insectiverous","insectivorous"],["insensative","insensitive"],["insensetive","insensitive"],["insensistive","insensitive"],["insensistively","insensitively"],["insensitiv","insensitive"],["insensitivy","insensitivity"],["insensitve","insensitive"],["insenstive","insensitive"],["insenstively","insensitively"],["insentives","incentives"],["insentivite","insensitive"],["insepect","inspect"],["insepected","inspected"],["insepection","inspection"],["insepects","inspects"],["insependent","independent"],["inseperable","inseparable"],["insepsion","inception"],["inser","insert"],["insering","inserting"],["insersect","intersect"],["insersected","intersected"],["insersecting","intersecting"],["insersects","intersects"],["inserst","insert"],["insersted","inserted"],["inserster","inserter"],["insersting","inserting"],["inserstor","inserter"],["insersts","inserts"],["insertin","inserting"],["insertino","inserting"],["insesitive","insensitive"],["insesitively","insensitively"],["insesitiveness","insensitiveness"],["insesitivity","insensitivity"],["insetad","instead"],["insetead","instead"],["inseted","inserted"],["insid","inside"],["insidde","inside"],["insiddes","insides"],["insided","inside"],["insignificat","insignificant"],["insignificatly","insignificantly"],["insigt","insight"],["insigth","insight"],["insigths","insights"],["insigts","insights"],["insistance","insistence"],["insititute","institute"],["insitution","institution"],["insitutions","institutions"],["insonsistency","inconsistency"],["instaance","instance"],["instabce","instance"],["instace","instance"],["instaces","instances"],["instaciate","instantiate"],["instad","instead"],["instade","instead"],["instaead","instead"],["instaed","instead"],["instal","install"],["instalation","installation"],["instalations","installations"],["instaled","installed"],["instaler","installer"],["instaling","installing"],["installaion","installation"],["installaiton","installation"],["installaitons","installations"],["installataion","installation"],["installataions","installations"],["installatation","installation"],["installationa","installation"],["installes","installs"],["installtion","installation"],["instals","installs"],["instancd","instance"],["instanciate","instantiate"],["instanciated","instantiated"],["instanciates","instantiates"],["instanciating","instantiating"],["instanciation","instantiation"],["instanciations","instantiations"],["instane","instance"],["instanes","instances"],["instanseation","instantiation"],["instansiate","instantiate"],["instansiated","instantiated"],["instansiates","instantiates"],["instansiation","instantiation"],["instantate","instantiate"],["instantating","instantiating"],["instantation","instantiation"],["instantations","instantiations"],["instantiaties","instantiates"],["instanze","instance"],["instatance","instance"],["instatiate","instantiate"],["instatiation","instantiation"],["instatiations","instantiations"],["insteance","instance"],["insted","instead"],["insteead","instead"],["inster","insert"],["insterad","instead"],["insterrupts","interrupts"],["instersction","intersection"],["instersctions","intersections"],["instersectioned","intersection"],["instert","insert"],["insterted","inserted"],["instertion","insertion"],["institue","institute"],["instlal","install"],["instlalation","installation"],["instlalations","installations"],["instlaled","installed"],["instlaler","installer"],["instlaling","installing"],["instlals","installs"],["instller","installer"],["instnace","instance"],["instnaces","instances"],["instnance","instance"],["instnances","instances"],["instnat","instant"],["instnatiated","instantiated"],["instnatiation","instantiation"],["instnatiations","instantiations"],["instnce","instance"],["instnces","instances"],["instnsiated","instantiated"],["instnsiation","instantiation"],["instnsiations","instantiations"],["instnt","instant"],["instntly","instantly"],["instrace","instance"],["instralled","installed"],["instrction","instruction"],["instrctional","instructional"],["instrctions","instructions"],["instrcut","instruct"],["instrcutino","instruction"],["instrcutinoal","instructional"],["instrcutinos","instructions"],["instrcution","instruction"],["instrcutional","instructional"],["instrcutions","instructions"],["instrcuts","instructs"],["instread","instead"],["instrinsic","intrinsic"],["instruccion","instruction"],["instruccional","instructional"],["instruccions","instructions"],["instrucion","instruction"],["instrucional","instructional"],["instrucions","instructions"],["instruciton","instruction"],["instrucitonal","instructional"],["instrucitons","instructions"],["instrumenet","instrument"],["instrumenetation","instrumentation"],["instrumenetd","instrumented"],["instrumeneted","instrumented"],["instrumentaion","instrumentation"],["instrumnet","instrument"],["instrumnets","instruments"],["instsall","install"],["instsallation","installation"],["instsallations","installations"],["instsalled","installed"],["instsalls","installs"],["instuction","instruction"],["instuctional","instructional"],["instuctions","instructions"],["instuments","instruments"],["insturment","instrument"],["insturments","instruments"],["instutionalized","institutionalized"],["instutions","intuitions"],["insuffciency","insufficiency"],["insuffcient","insufficient"],["insuffciently","insufficiently"],["insufficency","insufficiency"],["insufficent","insufficient"],["insufficently","insufficiently"],["insuffiency","insufficiency"],["insuffient","insufficient"],["insuffiently","insufficiently"],["insurasnce","insurance"],["insurence","insurance"],["intaces","instance"],["intack","intact"],["intall","install"],["intallation","installation"],["intallationpath","installationpath"],["intallations","installations"],["intalled","installed"],["intalleing","installing"],["intaller","installer"],["intalles","installs"],["intalling","installing"],["intalls","installs"],["intances","instances"],["intantiate","instantiate"],["intantiating","instantiating"],["inteaction","interaction"],["intead","instead"],["inteded","intended"],["intedned","intended"],["inteface","interface"],["intefere","interfere"],["intefered","interfered"],["inteference","interference"],["integarte","integrate"],["integarted","integrated"],["integartes","integrates"],["integated","integrated"],["integates","integrates"],["integating","integrating"],["integation","integration"],["integations","integrations"],["integeral","integral"],["integere","integer"],["integreated","integrated"],["integrety","integrity"],["integrey","integrity"],["intelectual","intellectual"],["intelegence","intelligence"],["intelegent","intelligent"],["intelegently","intelligently"],["inteligability","intelligibility"],["inteligable","intelligible"],["inteligance","intelligence"],["inteligantly","intelligently"],["inteligence","intelligence"],["inteligent","intelligent"],["intelisense","intellisense"],["intelligable","intelligible"],["intemediary","intermediary"],["intenal","internal"],["intenational","international"],["intendet","intended"],["inteneded","intended"],["intenisty","intensity"],["intension","intention"],["intensional","intentional"],["intensionally","intentionally"],["intensionaly","intentionally"],["intentation","indentation"],["intentended","intended"],["intentially","intentionally"],["intentialy","intentionally"],["intentionaly","intentionally"],["intentionly","intentionally"],["intepolate","interpolate"],["intepolated","interpolated"],["intepolates","interpolates"],["intepret","interpret"],["intepretable","interpretable"],["intepretation","interpretation"],["intepretations","interpretations"],["intepretator","interpreter"],["intepretators","interpreters"],["intepreted","interpreted"],["intepreter","interpreter"],["intepreter-based","interpreter-based"],["intepreters","interpreters"],["intepretes","interprets"],["intepreting","interpreting"],["intepretor","interpreter"],["intepretors","interpreters"],["inteprets","interprets"],["inter-operability","interoperability"],["interace","interface"],["interaces","interfaces"],["interacive","interactive"],["interacively","interactively"],["interacsion","interaction"],["interacsions","interactions"],["interactionn","interaction"],["interactionns","interactions"],["interactiv","interactive"],["interactivly","interactively"],["interactuable","interactive"],["interafce","interface"],["interakt","interact"],["interaktion","interaction"],["interaktions","interactions"],["interaktive","interactively"],["interaktively","interactively"],["interaktivly","interactively"],["interaly","internally"],["interanl","internal"],["interanlly","internally"],["interate","iterate"],["interational","international"],["interative","interactive"],["interatively","interactively"],["interator","iterator"],["interators","iterators"],["interaxction","interaction"],["interaxctions","interactions"],["interaxtion","interaction"],["interaxtions","interactions"],["intercahnge","interchange"],["intercahnged","interchanged"],["intercation","interaction"],["interchage","interchange"],["interchangable","interchangeable"],["interchangably","interchangeably"],["interchangeble","interchangeable"],["intercollegate","intercollegiate"],["intercontinential","intercontinental"],["intercontinetal","intercontinental"],["interdependant","interdependent"],["interecptor","interceptor"],["intereested","interested"],["intereference","interference"],["intereferences","interferences"],["interelated","interrelated"],["interelaved","interleaved"],["interepolate","interpolate"],["interepolated","interpolated"],["interepolates","interpolates"],["interepolating","interpolating"],["interepolation","interpolation"],["interepret","interpret"],["interepretation","interpretation"],["interepretations","interpretations"],["interepreted","interpreted"],["interepreting","interpreting"],["intereprets","interprets"],["interept","intercept"],["interesct","intersect"],["interescted","intersected"],["interescting","intersecting"],["interesction","intersection"],["interesctions","intersections"],["interescts","intersects"],["interesect","intersect"],["interesected","intersected"],["interesecting","intersecting"],["interesection","intersection"],["interesections","intersections"],["interesects","intersects"],["intereset","interest"],["intereseted","interested"],["intereseting","interesting"],["interesing","interesting"],["interespersed","interspersed"],["interesseted","interested"],["interesst","interest"],["interessted","interested"],["interessting","interesting"],["intereview","interview"],["interfal","interval"],["interfals","intervals"],["interfave","interface"],["interfaves","interfaces"],["interfcae","interface"],["interfcaes","interfaces"],["interfear","interfere"],["interfearence","interference"],["interfearnce","interference"],["interfer","interfere"],["interferance","interference"],["interferd","interfered"],["interfereing","interfering"],["interfernce","interference"],["interferred","interfered"],["interferring","interfering"],["interfers","interferes"],["intergated","integrated"],["interger's","integer's"],["interger","integer"],["intergerated","integrated"],["intergers","integers"],["intergrate","integrate"],["intergrated","integrated"],["intergrates","integrates"],["intergrating","integrating"],["intergration","integration"],["intergrations","integrations"],["interit","inherit"],["interitance","inheritance"],["interited","inherited"],["interiting","inheriting"],["interits","inherits"],["interliveing","interleaving"],["interlly","internally"],["intermediat","intermediate"],["intermeidate","intermediate"],["intermidiate","intermediate"],["intermitent","intermittent"],["intermittant","intermittent"],["intermperance","intemperance"],["internaly","internally"],["internatinal","international"],["internatioanl","international"],["internation","international"],["internel","internal"],["internels","internals"],["internface","interface"],["interogators","interrogators"],["interopeable","interoperable"],["interoprability","interoperability"],["interperated","interpreted"],["interpert","interpret"],["interpertation","interpretation"],["interpertations","interpretations"],["interperted","interpreted"],["interperter","interpreter"],["interperters","interpreters"],["interperting","interpreting"],["interpertive","interpretive"],["interperts","interprets"],["interpet","interpret"],["interpetation","interpretation"],["interpeted","interpreted"],["interpeter","interpreter"],["interpeters","interpreters"],["interpeting","interpreting"],["interpets","interprets"],["interploate","interpolate"],["interploated","interpolated"],["interploates","interpolates"],["interploatin","interpolating"],["interploation","interpolation"],["interpolaed","interpolated"],["interpolaion","interpolation"],["interpolaiton","interpolation"],["interpolar","interpolator"],["interpolayed","interpolated"],["interporation","interpolation"],["interporations","interpolations"],["interprate","interpret"],["interprated","interpreted"],["interpreation","interpretation"],["interprerter","interpreter"],["interpretated","interpreted"],["interprete","interpret"],["interpretes","interprets"],["interpretet","interpreted"],["interpretion","interpretation"],["interpretions","interpretations"],["interpretor","interpreter"],["interprett","interpret"],["interpretted","interpreted"],["interpretter","interpreter"],["interpretting","interpreting"],["interract","interact"],["interracting","interacting"],["interractive","interactive"],["interracts","interacts"],["interrest","interest"],["interrested","interested"],["interresting","interesting"],["interrface","interface"],["interrim","interim"],["interript","interrupt"],["interrput","interrupt"],["interrputed","interrupted"],["interrrupt","interrupt"],["interrrupted","interrupted"],["interrrupting","interrupting"],["interrrupts","interrupts"],["interrtups","interrupts"],["interrugum","interregnum"],["interrum","interim"],["interrup","interrupt"],["interruped","interrupted"],["interruping","interrupting"],["interrups","interrupts"],["interruptable","interruptible"],["interruptors","interrupters"],["interruptted","interrupted"],["interrut","interrupt"],["interrutps","interrupts"],["interscetion","intersection"],["intersecct","intersect"],["interseccted","intersected"],["interseccting","intersecting"],["intersecction","intersection"],["interseccts","intersects"],["intersecrion","intersection"],["intersecton","intersection"],["intersectons","intersections"],["intersparsed","interspersed"],["interst","interest"],["intersted","interested"],["intersting","interesting"],["intersts","interests"],["intertaining","entertaining"],["intertia","inertia"],["intertial","inertial"],["interupt","interrupt"],["interupted","interrupted"],["interupting","interrupting"],["interupts","interrupts"],["interuupt","interrupt"],["intervall","interval"],["intervalls","intervals"],["interveening","intervening"],["intervines","intervenes"],["intesity","intensity"],["inteval","interval"],["intevals","intervals"],["intevene","intervene"],["intger","integer"],["intgers","integers"],["intgral","integral"],["inthe","in the"],["intiailise","initialise"],["intiailised","initialised"],["intiailiseing","initialising"],["intiailiser","initialiser"],["intiailises","initialises"],["intiailising","initialising"],["intiailize","initialize"],["intiailized","initialized"],["intiailizeing","initializing"],["intiailizer","initializer"],["intiailizes","initializes"],["intiailizing","initializing"],["intial","initial"],["intiale","initial"],["intialisation","initialisation"],["intialise","initialise"],["intialised","initialised"],["intialiser","initialiser"],["intialisers","initialisers"],["intialises","initialises"],["intialising","initialising"],["intialistion","initialisation"],["intializating","initializing"],["intialization","initialization"],["intializaze","initialize"],["intialize","initialize"],["intialized","initialized"],["intializer","initializer"],["intializers","initializers"],["intializes","initializes"],["intializing","initializing"],["intializtion","initialization"],["intialled","initialled"],["intiallisation","initialisation"],["intiallisations","initialisations"],["intiallised","initialised"],["intiallization","initialization"],["intiallizations","initializations"],["intiallized","initialized"],["intiallly","initially"],["intially","initially"],["intials","initials"],["intialse","initialise"],["intialsed","initialised"],["intialsing","initialising"],["intialte","initialise"],["intialy","initially"],["intialze","initialize"],["intialzed","initialized"],["intialzing","initializing"],["inticement","enticement"],["intiger","integer"],["intiial","initial"],["intiialise","initialise"],["intiialize","initialize"],["intilising","initialising"],["intilizing","initializing"],["intimite","intimate"],["intinite","infinite"],["intitial","initial"],["intitialization","initialization"],["intitialize","initialize"],["intitialized","initialized"],["intitials","initials"],["intity","entity"],["intot","into"],["intoto","into"],["intpreter","interpreter"],["intput","input"],["intputs","inputs"],["intraversion","introversion"],["intravert","introvert"],["intraverts","introverts"],["intrduced","introduced"],["intreeg","intrigue"],["intreeged","intrigued"],["intreeging","intriguing"],["intreegued","intrigued"],["intreeguing","intriguing"],["intreface","interface"],["intregral","integral"],["intrerrupt","interrupt"],["intresst","interest"],["intressted","interested"],["intressting","interesting"],["intrested","interested"],["intresting","interesting"],["intriduce","introduce"],["intriduced","introduced"],["intriduction","introduction"],["intrisinc","intrinsic"],["intrisincs","intrinsics"],["introducted","introduced"],["introductionary","introductory"],["introdued","introduced"],["introduse","introduce"],["introdused","introduced"],["introduses","introduces"],["introdusing","introducing"],["introsepectable","introspectable"],["introsepection","introspection"],["intrrupt","interrupt"],["intrrupted","interrupted"],["intrrupting","interrupting"],["intrrupts","interrupts"],["intruction","instruction"],["intructional","instructional"],["intructions","instructions"],["intruduced","introduced"],["intruducing","introducing"],["intrument","instrument"],["intrumental","instrumental"],["intrumented","instrumented"],["intrumenting","instrumenting"],["intruments","instruments"],["intrusted","entrusted"],["intstead","instead"],["intstructed","instructed"],["intstructer","instructor"],["intstructing","instructing"],["intstruction","instruction"],["intstructional","instructional"],["intstructions","instructions"],["intstructor","instructor"],["intstructs","instructs"],["intterrupt","interrupt"],["intterupt","interrupt"],["intterupted","interrupted"],["intterupting","interrupting"],["intterupts","interrupts"],["intuative","intuitive"],["inturpratasion","interpretation"],["inturpratation","interpretation"],["inturprett","interpret"],["intutive","intuitive"],["intutively","intuitively"],["inudstry","industry"],["inut","input"],["invaid","invalid"],["invaild","invalid"],["invaildate","invalidate"],["invailid","invalid"],["invalaid","invalid"],["invald","invalid"],["invaldates","invalidates"],["invalde","invalid"],["invalidatiopn","invalidation"],["invalide","invalid"],["invalidiate","invalidate"],["invalidte","invalidate"],["invalidted","invalidated"],["invalidtes","invalidates"],["invalidting","invalidating"],["invalidtion","invalidation"],["invalied","invalid"],["invalud","invalid"],["invarient","invariant"],["invarients","invariants"],["invarinat","invariant"],["invarinats","invariants"],["inventer","inventor"],["inverded","inverted"],["inverion","inversion"],["inverions","inversions"],["invertedd","inverted"],["invertibrates","invertebrates"],["invertion","inversion"],["invertions","inversions"],["inverval","interval"],["inveryed","inverted"],["invesitgated","investigated"],["invesitgating","investigating"],["invesitgation","investigation"],["invesitgations","investigations"],["investingate","investigate"],["inveting","inverting"],["invetory","inventory"],["inviation","invitation"],["invididual","individual"],["invidivual","individual"],["invidual","individual"],["invidually","individually"],["invisble","invisible"],["invisblity","invisibility"],["invisiable","invisible"],["invisibile","invisible"],["invisivble","invisible"],["invlaid","invalid"],["invlid","invalid"],["invlisible","invisible"],["invlove","involve"],["invloved","involved"],["invloves","involves"],["invocaition","invocation"],["invokable","invocable"],["invokation","invocation"],["invokations","invocations"],["invokve","invoke"],["invokved","invoked"],["invokves","invokes"],["invokving","invoking"],["involvment","involvement"],["invovle","involve"],["invovled","involved"],["invovles","involves"],["invovling","involving"],["ioclt","ioctl"],["iomaped","iomapped"],["ionde","inode"],["iplementation","implementation"],["ipmrovement","improvement"],["ipmrovements","improvements"],["iput","input"],["ireelevant","irrelevant"],["irelevent","irrelevant"],["iresistable","irresistible"],["iresistably","irresistibly"],["iresistible","irresistible"],["iresistibly","irresistibly"],["iritable","irritable"],["iritate","irritate"],["iritated","irritated"],["iritating","irritating"],["ironicly","ironically"],["irradate","irradiate"],["irradated","irradiated"],["irradates","irradiates"],["irradating","irradiating"],["irradation","irradiation"],["irraditate","irradiate"],["irraditated","irradiated"],["irraditates","irradiates"],["irraditating","irradiating"],["irregularties","irregularities"],["irregulier","irregular"],["irregulierties","irregularities"],["irrelavent","irrelevant"],["irrelevent","irrelevant"],["irrelvant","irrelevant"],["irreplacable","irreplaceable"],["irreplacalbe","irreplaceable"],["irreproducable","irreproducible"],["irresepective","irrespective"],["irresistable","irresistible"],["irresistably","irresistibly"],["irreversable","irreversible"],["is'nt","isn't"],["isalha","isalpha"],["isconnection","isconnected"],["iscrated","iscreated"],["iself","itself"],["iselfe","itself"],["iserting","inserting"],["isimilar","similar"],["isloation","isolation"],["ismas","isthmus"],["isn;t","isn't"],["isnpiron","inspiron"],["isnt'","isn't"],["isnt","isn't"],["isnt;","isn't"],["isntalation","installation"],["isntalations","installations"],["isntallation","installation"],["isntallations","installations"],["isntance","instance"],["isntances","instances"],["isotrophically","isotropically"],["ispatches","dispatches"],["isplay","display"],["Israelies","Israelis"],["isse","issue"],["isses","issues"],["isssue","issue"],["isssued","issued"],["isssues","issues"],["issueing","issuing"],["istalling","installing"],["istance","instance"],["istead","instead"],["istened","listened"],["istener","listener"],["isteners","listeners"],["istening","listening"],["isue","issue"],["iteartor","iterator"],["iteator","iterator"],["iteger","integer"],["itegral","integral"],["itegrals","integrals"],["iten","item"],["itens","items"],["itention","intention"],["itentional","intentional"],["itentionally","intentionally"],["itentionaly","intentionally"],["iteraion","iteration"],["iteraions","iterations"],["iteratable","iterable"],["iterater","iterator"],["iteraterate","iterate"],["iteratered","iterated"],["iteratior","iterator"],["iteratiors","iterators"],["iteratons","iterations"],["itereating","iterating"],["iterface","interface"],["iterfaces","interfaces"],["iternations","iterations"],["iterpreter","interpreter"],["iterration","iteration"],["iterrations","iterations"],["iterrupt","interrupt"],["iterstion","iteration"],["iterstions","iterations"],["itertation","iteration"],["iteself","itself"],["itesm","items"],["itheir","their"],["itheirs","theirs"],["itialise","initialise"],["itialised","initialised"],["itialises","initialises"],["itialising","initialising"],["itialize","initialize"],["itialized","initialized"],["itializes","initializes"],["itializing","initializing"],["itnerest","interest"],["itnerface","interface"],["itnerfaces","interfaces"],["itnernal","internal"],["itnerprelation","interpretation"],["itnerpret","interpret"],["itnerpretation","interpretation"],["itnerpretaton","interpretation"],["itnerpreted","interpreted"],["itnerpreter","interpreter"],["itnerpreting","interpreting"],["itnerprets","interprets"],["itnervals","intervals"],["itnroduced","introduced"],["itsef","itself"],["itsel","itself"],["itselfs","itself"],["itselt","itself"],["itselv","itself"],["itsems","items"],["itslef","itself"],["itslev","itself"],["itsself","itself"],["itterate","iterate"],["itterated","iterated"],["itterates","iterates"],["itterating","iterating"],["itteration","iteration"],["itterations","iterations"],["itterative","iterative"],["itterator","iterator"],["itterators","iterators"],["iunior","junior"],["ivalid","invalid"],["ivocation","invocation"],["ivoked","invoked"],["iwithout","without"],["iwll","will"],["iwth","with"],["jagid","jagged"],["jagwar","jaguar"],["januar","January"],["janurary","January"],["Januray","January"],["japanease","japanese"],["japaneese","Japanese"],["Japanes","Japanese"],["japanses","Japanese"],["jaques","jacques"],["javacript","javascript"],["javascipt","javascript"],["javasciript","javascript"],["javascritp","javascript"],["javascropt","javascript"],["javasript","javascript"],["javasrript","javascript"],["javescript","javascript"],["javsscript","javascript"],["jeapardy","jeopardy"],["jeffies","jiffies"],["jekins","Jenkins"],["jelous","jealous"],["jelousy","jealousy"],["jelusey","jealousy"],["jenkin","Jenkins"],["jenkkins","Jenkins"],["jenkns","Jenkins"],["jepordize","jeopardize"],["jewllery","jewellery"],["jhondoe","johndoe"],["jist","gist"],["jitterr","jitter"],["jitterring","jittering"],["jodpers","jodhpurs"],["Johanine","Johannine"],["joineable","joinable"],["joinning","joining"],["jont","joint"],["jonts","joints"],["jornal","journal"],["jorunal","journal"],["Jospeh","Joseph"],["jossle","jostle"],["jouney","journey"],["journied","journeyed"],["journies","journeys"],["joystik","joystick"],["jscipt","jscript"],["jstu","just"],["jsut","just"],["juadaism","Judaism"],["juadism","Judaism"],["judical","judicial"],["judisuary","judiciary"],["juducial","judicial"],["juge","judge"],["juipter","Jupiter"],["jumo","jump"],["jumoed","jumped"],["jumpimng","jumping"],["jupyther","Jupyter"],["juristiction","jurisdiction"],["juristictions","jurisdictions"],["jus","just"],["justfied","justified"],["justication","justification"],["justifed","justified"],["justs","just"],["juxt","just"],["juxtification","justification"],["juxtifications","justifications"],["juxtified","justified"],["juxtifies","justifies"],["juxtifying","justifying"],["kakfa","Kafka"],["kazakstan","Kazakhstan"],["keep-alives","keep-alive"],["keept","kept"],["kenerl","kernel"],["kenerls","kernels"],["kenrel","kernel"],["kenrels","kernels"],["kepping","keeping"],["kepps","keeps"],["kerenl","kernel"],["kerenls","kernels"],["kernal","kernel"],["kernals","kernels"],["kernerl","kernel"],["kernerls","kernels"],["keword","keyword"],["kewords","keywords"],["kewword","keyword"],["kewwords","keywords"],["keybaord","keyboard"],["keybaords","keyboards"],["keyboaard","keyboard"],["keyboaards","keyboards"],["keyboad","keyboard"],["keyboads","keyboards"],["keybooard","keyboard"],["keybooards","keyboards"],["keyborad","keyboard"],["keyborads","keyboards"],["keybord","keyboard"],["keybords","keyboards"],["keybroad","keyboard"],["keybroads","keyboards"],["keyevente","keyevent"],["keyords","keywords"],["keyoutch","keytouch"],["keyowrd","keyword"],["keypair","key pair"],["keypairs","key pairs"],["keyservers","key servers"],["keystokes","keystrokes"],["keyward","keyword"],["keywoards","keywords"],["keywork","keyword"],["keyworkd","keyword"],["keyworkds","keywords"],["keywors","keywords"],["keywprd","keyword"],["kindergarden","kindergarten"],["kindgergarden","kindergarten"],["kindgergarten","kindergarten"],["kinf","kind"],["kinfs","kinds"],["kinnect","Kinect"],["klenex","kleenex"],["klick","click"],["klicked","clicked"],["klicks","clicks"],["klunky","clunky"],["knive","knife"],["kno","know"],["knowladge","knowledge"],["knowlage","knowledge"],["knowlageable","knowledgeable"],["knowlegde","knowledge"],["knowlege","knowledge"],["knowlegeabel","knowledgeable"],["knowlegeable","knowledgeable"],["knwo","know"],["knwoing","knowing"],["knwoingly","knowingly"],["knwon","known"],["knwos","knows"],["kocalized","localized"],["konstant","constant"],["konstants","constants"],["konw","know"],["konwn","known"],["konws","knows"],["koordinate","coordinate"],["koordinates","coordinates"],["kown","known"],["kubenates","Kubernetes"],["kubenernetes","Kubernetes"],["kubenertes","Kubernetes"],["kubenetes","Kubernetes"],["kubenretes","Kubernetes"],["kuberenetes","Kubernetes"],["kuberentes","Kubernetes"],["kuberetes","Kubernetes"],["kubermetes","Kubernetes"],["kubernates","Kubernetes"],["kubernests","Kubernetes"],["kubernete","Kubernetes"],["kuberntes","Kubernetes"],["kwno","know"],["kwoledgebase","knowledge base"],["kyrillic","cyrillic"],["labbel","label"],["labbeled","labeled"],["labbels","labels"],["labed","labeled"],["labeld","labelled"],["labirinth","labyrinth"],["lable","label"],["lablel","label"],["lablels","labels"],["lables","labels"],["labouriously","laboriously"],["labratory","laboratory"],["lagacies","legacies"],["lagacy","legacy"],["laguage","language"],["laguages","languages"],["laguague","language"],["laguagues","languages"],["laiter","later"],["lamda","lambda"],["lamdas","lambdas"],["lanaguage","language"],["lanaguge","language"],["lanaguges","languages"],["lanagugs","languages"],["lanauge","language"],["langage","language"],["langauage","language"],["langauge","language"],["langauges","languages"],["langeuage","language"],["langeuagesection","languagesection"],["langht","length"],["langhts","lengths"],["langth","length"],["langths","lengths"],["languace","language"],["languaces","languages"],["languae","language"],["languaes","languages"],["language-spacific","language-specific"],["languahe","language"],["languahes","languages"],["languaje","language"],["languajes","languages"],["langual","lingual"],["languale","language"],["languales","languages"],["langualge","language"],["langualges","languages"],["languange","language"],["languanges","languages"],["languaqe","language"],["languaqes","languages"],["languate","language"],["languates","languages"],["languauge","language"],["languauges","languages"],["languege","language"],["langueges","languages"],["langugae","language"],["langugaes","languages"],["langugage","language"],["langugages","languages"],["languge","language"],["languges","languages"],["langugue","language"],["langugues","languages"],["lanich","launch"],["lanuage","language"],["lanuch","launch"],["lanuched","launched"],["lanuches","launches"],["lanuching","launching"],["lanugage","language"],["lanugages","languages"],["laod","load"],["laoded","loaded"],["laoding","loading"],["laods","loads"],["laout","layout"],["larg","large"],["largst","largest"],["larrry","larry"],["lastes","latest"],["lastr","last"],["latets","latest"],["lating","latin"],["latitide","latitude"],["latitue","latitude"],["latitute","latitude"],["latops","laptops"],["latset","latest"],["lattitude","latitude"],["lauch","launch"],["lauched","launched"],["laucher","launcher"],["lauches","launches"],["lauching","launching"],["lauguage","language"],["launck","launch"],["launhed","launched"],["lavae","larvae"],["layed","laid"],["layou","layout"],["lazer","laser"],["laziliy","lazily"],["lazyness","laziness"],["lcoally","locally"],["lcoation","location"],["lcuase","clause"],["leaast","least"],["leace","leave"],["leack","leak"],["leagacy","legacy"],["leagal","legal"],["leagalise","legalise"],["leagality","legality"],["leagalize","legalize"],["leagcy","legacy"],["leage","league"],["leagel","legal"],["leagelise","legalise"],["leagelity","legality"],["leagelize","legalize"],["leageue","league"],["leagl","legal"],["leaglise","legalise"],["leaglity","legality"],["leaglize","legalize"],["leapyear","leap year"],["leapyears","leap years"],["leary","leery"],["leaset","least"],["leasy","least"],["leathal","lethal"],["leats","least"],["leaveing","leaving"],["leavong","leaving"],["lefted","left"],["legac","legacy"],["legact","legacy"],["legalimate","legitimate"],["legasy","legacy"],["legel","legal"],["leggacies","legacies"],["leggacy","legacy"],["leght","length"],["leghts","lengths"],["legitamate","legitimate"],["legitimiately","legitimately"],["legitmate","legitimate"],["legnth","length"],["legth","length"],["legths","lengths"],["leibnitz","leibniz"],["leightweight","lightweight"],["lene","lens"],["lenggth","length"],["lengh","length"],["lenghs","lengths"],["lenght","length"],["lenghten","lengthen"],["lenghtend","lengthened"],["lenghtened","lengthened"],["lenghtening","lengthening"],["lenghth","length"],["lenghthen","lengthen"],["lenghths","lengths"],["lenghthy","lengthy"],["lenghtly","lengthy"],["lenghts","lengths"],["lenghty","lengthy"],["lengt","length"],["lengten","lengthen"],["lengtext","longtext"],["lengthes","lengths"],["lengthh","length"],["lengts","lengths"],["leniant","lenient"],["leninent","lenient"],["lentgh","length"],["lentghs","lengths"],["lenth","length"],["lenths","lengths"],["leran","learn"],["leraned","learned"],["lerans","learns"],["lessson","lesson"],["lesssons","lessons"],["lesstiff","LessTif"],["letgitimate","legitimate"],["letmost","leftmost"],["leutenant","lieutenant"],["levaridge","leverage"],["levetate","levitate"],["levetated","levitated"],["levetates","levitates"],["levetating","levitating"],["levl","level"],["levle","level"],["lexial","lexical"],["lexigraphic","lexicographic"],["lexigraphical","lexicographical"],["lexigraphically","lexicographically"],["leyer","layer"],["leyered","layered"],["leyering","layering"],["leyers","layers"],["liares","liars"],["liasion","liaison"],["liason","liaison"],["liasons","liaisons"],["libarary","library"],["libaries","libraries"],["libary","library"],["libell","libel"],["liberaries","libraries"],["liberary","library"],["liberoffice","libreoffice"],["liberry","library"],["libgng","libpng"],["libguistic","linguistic"],["libguistics","linguistics"],["libitarianisn","libertarianism"],["libraarie","library"],["libraaries","libraries"],["libraary","library"],["librabarie","library"],["librabaries","libraries"],["librabary","library"],["librabie","library"],["librabies","libraries"],["librabrie","library"],["librabries","libraries"],["librabry","library"],["libraby","library"],["libraie","library"],["libraier","library"],["libraies","libraries"],["libraiesr","libraries"],["libraire","library"],["libraires","libraries"],["librairies","libraries"],["librairy","library"],["libralie","library"],["libralies","libraries"],["libraly","library"],["libraray","library"],["libraris","libraries"],["librarries","libraries"],["librarry","library"],["libraryes","libraries"],["libratie","library"],["libraties","libraries"],["libraty","library"],["libray","library"],["librayr","library"],["libreoffie","libreoffice"],["libreoficekit","libreofficekit"],["libreries","libraries"],["librery","library"],["libries","libraries"],["librraies","libraries"],["librraries","libraries"],["librrary","library"],["librray","library"],["libstc++","libstdc++"],["licate","locate"],["licated","located"],["lication","location"],["lications","locations"],["licenceing","licencing"],["licese","license"],["licesne","license"],["licesnes","licenses"],["licesning","licensing"],["licesnse","license"],["licesnses","licenses"],["licesnsing","licensing"],["licsense","license"],["licsenses","licenses"],["licsensing","licensing"],["lieing","lying"],["liek","like"],["liekd","liked"],["lient","client"],["lients","clients"],["liesure","leisure"],["lieuenant","lieutenant"],["liev","live"],["lieved","lived"],["lifceycle","lifecycle"],["lifecyle","lifecycle"],["lifes","lives"],["lifeycle","lifecycle"],["liftime","lifetime"],["lighing","lighting"],["lightbulp","lightbulb"],["lightweigh","lightweight"],["lightwieght","lightweight"],["lightwight","lightweight"],["lightyear","light year"],["lightyears","light years"],["ligth","light"],["ligthing","lighting"],["ligths","lights"],["ligthweight","lightweight"],["ligthweights","lightweights"],["liitle","little"],["likeley","likely"],["likelly","likely"],["likelyhood","likelihood"],["likewis","likewise"],["likey","likely"],["liklelihood","likelihood"],["likley","likely"],["likly","likely"],["lileral","literal"],["limiation","limitation"],["limiations","limitations"],["liminted","limited"],["limitaion","limitation"],["limite","limit"],["limitiaion","limitation"],["limitiaions","limitations"],["limitiation","limitation"],["limitiations","limitations"],["limitied","limited"],["limitier","limiter"],["limitiers","limiters"],["limitiing","limiting"],["limitimg","limiting"],["limition","limitation"],["limitions","limitations"],["limitis","limits"],["limititation","limitation"],["limititations","limitations"],["limitited","limited"],["limititer","limiter"],["limititers","limiters"],["limititing","limiting"],["limitted","limited"],["limitter","limiter"],["limitting","limiting"],["limitts","limits"],["limk","link"],["limted","limited"],["limti","limit"],["limts","limits"],["linaer","linear"],["linar","linear"],["linarly","linearly"],["lincese","license"],["lincesed","licensed"],["linceses","licenses"],["lineary","linearly"],["linerisation","linearisation"],["linerisations","linearisations"],["lineseach","linesearch"],["lineseaches","linesearches"],["liness","lines"],["linewdith","linewidth"],["linez","lines"],["lingth","length"],["linheight","lineheight"],["linkfy","linkify"],["linnaena","linnaean"],["lintain","lintian"],["linz","lines"],["lippizaner","lipizzaner"],["liquify","liquefy"],["lisetning","listening"],["lising","listing"],["listapck","listpack"],["listbbox","listbox"],["listeing","listening"],["listeneing","listening"],["listeneres","listeners"],["listenes","listens"],["listensers","listeners"],["listenter","listener"],["listenters","listeners"],["listernes","listeners"],["listner","listener"],["listners","listeners"],["litaral","literal"],["litarally","literally"],["litarals","literals"],["litature","literature"],["liteautrue","literature"],["literaly","literally"],["literture","literature"],["litle","little"],["litquid","liquid"],["litquids","liquids"],["lits","list"],["litte","little"],["littel","little"],["littel-endian","little-endian"],["littele","little"],["littelry","literally"],["litteral","literal"],["litterally","literally"],["litterals","literals"],["litterate","literate"],["litterature","literature"],["liuke","like"],["liveing","living"],["livel","level"],["livetime","lifetime"],["livley","lively"],["lizens","license"],["lizense","license"],["lizensing","licensing"],["lke","like"],["llinear","linear"],["lmits","limits"],["loaader","loader"],["loacal","local"],["loacality","locality"],["loacally","locally"],["loacation","location"],["loaction","location"],["loactions","locations"],["loadig","loading"],["loadin","loading"],["loadning","loading"],["locae","locate"],["locaes","locates"],["locahost","localhost"],["locaiing","locating"],["locailty","locality"],["locaing","locating"],["locaion","location"],["locaions","locations"],["locaise","localise"],["locaised","localised"],["locaiser","localiser"],["locaises","localises"],["locaite","locate"],["locaites","locates"],["locaiting","locating"],["locaition","location"],["locaitions","locations"],["locaiton","location"],["locaitons","locations"],["locaize","localize"],["locaized","localized"],["locaizer","localizer"],["locaizes","localizes"],["localation","location"],["localed","located"],["localtion","location"],["localtions","locations"],["localy","locally"],["localzation","localization"],["locatins","locations"],["loccked","locked"],["locgical","logical"],["lockingf","locking"],["lodable","loadable"],["loded","loaded"],["loder","loader"],["loders","loaders"],["loding","loading"],["loev","love"],["logarithimic","logarithmic"],["logarithmical","logarithmically"],["logaritmic","logarithmic"],["logcal","logical"],["loggging","logging"],["logial","logical"],["logially","logically"],["logicaly","logically"],["logictech","logitech"],["logile","logfile"],["logitude","longitude"],["logitudes","longitudes"],["logoic","logic"],["logorithm","logarithm"],["logorithmic","logarithmic"],["logorithms","logarithms"],["logrithm","logarithm"],["logrithms","logarithms"],["logwritter","logwriter"],["loign","login"],["loigns","logins"],["lokal","local"],["lokale","locale"],["lokales","locales"],["lokaly","locally"],["lolal","total"],["lolerant","tolerant"],["lond","long"],["lonelyness","loneliness"],["long-runnign","long-running"],["longers","longer"],["longitudonal","longitudinal"],["longitue","longitude"],["longitutde","longitude"],["longitute","longitude"],["longst","longest"],["longuer","longer"],["longuest","longest"],["lonley","lonely"],["looback","loopback"],["loobacks","loopbacks"],["loobpack","loopback"],["loockdown","lockdown"],["lookes","looks"],["looknig","looking"],["looop","loop"],["loopup","lookup"],["loosley","loosely"],["loosly","loosely"],["losely","loosely"],["losen","loosen"],["losened","loosened"],["lotharingen","Lothringen"],["lpatform","platform"],["luckly","luckily"],["luminose","luminous"],["luminousity","luminosity"],["lveo","love"],["lvoe","love"],["Lybia","Libya"],["maake","make"],["mabe","maybe"],["mabye","maybe"],["macack","macaque"],["macason","moccasin"],["macasons","moccasins"],["maccro","macro"],["maccros","macros"],["machanism","mechanism"],["machanisms","mechanisms"],["mached","matched"],["maches","matches"],["machettie","machete"],["machinary","machinery"],["machine-dependend","machine-dependent"],["machiness","machines"],["mackeral","mackerel"],["maco","macro"],["macor","macro"],["macors","macros"],["macpakge","package"],["macroses","macros"],["macrow","macro"],["macthing","matching"],["madantory","mandatory"],["madatory","mandatory"],["maddness","madness"],["maesure","measure"],["maesured","measured"],["maesurement","measurement"],["maesurements","measurements"],["maesures","measures"],["maesuring","measuring"],["magasine","magazine"],["magincian","magician"],["magisine","magazine"],["magizine","magazine"],["magnatiude","magnitude"],["magnatude","magnitude"],["magnificient","magnificent"],["magolia","magnolia"],["mahcine","machine"],["maibe","maybe"],["maibox","mailbox"],["mailformed","malformed"],["mailling","mailing"],["maillinglist","mailing list"],["maillinglists","mailing lists"],["mailny","mainly"],["mailstrum","maelstrom"],["mainenance","maintenance"],["maininly","mainly"],["mainling","mailing"],["maintainance","maintenance"],["maintaince","maintenance"],["maintainces","maintenances"],["maintainence","maintenance"],["maintaing","maintaining"],["maintan","maintain"],["maintanance","maintenance"],["maintance","maintenance"],["maintane","maintain"],["maintanence","maintenance"],["maintaner","maintainer"],["maintaners","maintainers"],["maintans","maintains"],["maintenace","maintenance"],["maintenence","maintenance"],["maintiain","maintain"],["maintians","maintains"],["maintinaing","maintaining"],["maintioned","mentioned"],["mairabd","MariaDB"],["mairadb","MariaDB"],["maitain","maintain"],["maitainance","maintenance"],["maitained","maintained"],["maitainers","maintainers"],["majoroty","majority"],["maka","make"],["makefle","makefile"],["makeing","making"],["makign","making"],["makretplace","marketplace"],["makro","macro"],["makros","macros"],["Malcom","Malcolm"],["maliciousally","maliciously"],["malicius","malicious"],["maliciusally","maliciously"],["maliciusly","maliciously"],["malicous","malicious"],["malicousally","maliciously"],["malicously","maliciously"],["maline","malign"],["malined","maligned"],["malining","maligning"],["malins","maligns"],["malless","malice"],["malplace","misplace"],["malplaced","misplaced"],["maltesian","Maltese"],["mamagement","management"],["mamal","mammal"],["mamalian","mammalian"],["mamento","memento"],["mamentos","mementos"],["mamory","memory"],["mamuth","mammoth"],["manafacturer","manufacturer"],["manafacturers","manufacturers"],["managament","management"],["manageed","managed"],["managemenet","management"],["managenment","management"],["managet","manager"],["managets","managers"],["managmenet","management"],["managment","management"],["manaise","mayonnaise"],["manal","manual"],["manange","manage"],["manangement","management"],["mananger","manager"],["manangers","managers"],["manaul","manual"],["manaully","manually"],["manauls","manuals"],["manaze","mayonnaise"],["mandatatory","mandatory"],["mandetory","mandatory"],["manement","management"],["maneouvre","manoeuvre"],["maneouvred","manoeuvred"],["maneouvres","manoeuvres"],["maneouvring","manoeuvring"],["manetain","maintain"],["manetained","maintained"],["manetainer","maintainer"],["manetainers","maintainers"],["manetaining","maintaining"],["manetains","maintains"],["mangaed","managed"],["mangaement","management"],["mangager","manager"],["mangagers","managers"],["mangement","management"],["mangementt","management"],["manifacture","manufacture"],["manifactured","manufactured"],["manifacturer","manufacturer"],["manifacturers","manufacturers"],["manifactures","manufactures"],["manifect","manifest"],["manipluate","manipulate"],["manipluated","manipulated"],["manipulatin","manipulating"],["manipulaton","manipulation"],["manipute","manipulate"],["maniputed","manipulated"],["maniputing","manipulating"],["manipution","manipulation"],["maniputions","manipulations"],["maniputor","manipulator"],["manisfestations","manifestations"],["maniuplate","manipulate"],["maniuplated","manipulated"],["maniuplates","manipulates"],["maniuplating","manipulating"],["maniuplation","manipulation"],["maniuplations","manipulations"],["maniuplator","manipulator"],["maniuplators","manipulators"],["mannor","manner"],["mannual","manual"],["mannually","manually"],["mannualy","manually"],["manoeuverability","maneuverability"],["manoeuvering","maneuvering"],["manouevring","manoeuvring"],["mantain","maintain"],["mantainable","maintainable"],["mantained","maintained"],["mantainer","maintainer"],["mantainers","maintainers"],["mantaining","maintaining"],["mantains","maintains"],["mantanine","maintain"],["mantanined","maintained"],["mantatory","mandatory"],["mantenance","maintenance"],["manualy","manually"],["manualyl","manually"],["manualyy","manually"],["manuell","manual"],["manuelly","manually"],["manufactuerd","manufactured"],["manufacturedd","manufactured"],["manufature","manufacture"],["manufatured","manufactured"],["manufaturing","manufacturing"],["manufaucturing","manufacturing"],["manulally","manually"],["manule","manual"],["manuley","manually"],["manully","manually"],["manuly","manually"],["manupilations","manipulations"],["manupulate","manipulate"],["manupulated","manipulated"],["manupulates","manipulates"],["manupulating","manipulating"],["manupulation","manipulation"],["manupulations","manipulations"],["manuver","maneuver"],["manyal","manual"],["manyally","manually"],["manyals","manuals"],["mapable","mappable"],["mape","map"],["maped","mapped"],["maping","mapping"],["mapings","mappings"],["mapp","map"],["mappeds","mapped"],["mappeed","mapped"],["mappping","mapping"],["mapppings","mappings"],["margings","margins"],["mariabd","MariaDB"],["mariage","marriage"],["marjority","majority"],["marketting","marketing"],["markey","marquee"],["markeys","marquees"],["marmelade","marmalade"],["marrage","marriage"],["marraige","marriage"],["marrtyred","martyred"],["marryied","married"],["marshmellow","marshmallow"],["marshmellows","marshmallows"],["marter","martyr"],["masakist","masochist"],["mashetty","machete"],["mashine","machine"],["mashined","machined"],["mashines","machines"],["masia","messiah"],["masicer","massacre"],["masiff","massif"],["maskerading","masquerading"],["maskeraid","masquerade"],["masos","macos"],["masquarade","masquerade"],["masqurade","masquerade"],["Massachusettes","Massachusetts"],["Massachussets","Massachusetts"],["Massachussetts","Massachusetts"],["massagebox","messagebox"],["massectomy","mastectomy"],["massewer","masseur"],["massmedia","mass media"],["massoose","masseuse"],["masster","master"],["masteer","master"],["masterbation","masturbation"],["mastquerade","masquerade"],["mata-data","meta-data"],["matadata","metadata"],["matainer","maintainer"],["matainers","maintainers"],["mataphysical","metaphysical"],["matatable","metatable"],["matc","match"],["matchies","matches"],["matchign","matching"],["matchin","matching"],["matchs","matches"],["matchter","matcher"],["matcing","matching"],["mateiral","material"],["mateirals","materials"],["matemathical","mathematical"],["materaial","material"],["materaials","materials"],["materail","material"],["materails","materials"],["materalists","materialist"],["materil","material"],["materilism","materialism"],["materilize","materialize"],["materils","materials"],["materla","material"],["materlas","materials"],["mathamatics","mathematics"],["mathces","matches"],["mathch","match"],["mathched","matched"],["mathches","matches"],["mathching","matching"],["mathcing","matching"],["mathed","matched"],["mathematicaly","mathematically"],["mathematican","mathematician"],["mathematicas","mathematics"],["mathes","matches"],["mathetician","mathematician"],["matheticians","mathematicians"],["mathimatic","mathematic"],["mathimatical","mathematical"],["mathimatically","mathematically"],["mathimatician","mathematician"],["mathimaticians","mathematicians"],["mathimatics","mathematics"],["mathing","matching"],["mathmatical","mathematical"],["mathmatically","mathematically"],["mathmatician","mathematician"],["mathmaticians","mathematicians"],["mathod","method"],["matinay","matinee"],["matix","matrix"],["matreial","material"],["matreials","materials"],["matresses","mattresses"],["matrial","material"],["matrials","materials"],["matser","master"],["matzch","match"],["mavrick","maverick"],["mawsoleum","mausoleum"],["maximice","maximize"],["maximim","maximum"],["maximimum","maximum"],["maximium","maximum"],["maximnum","maximum"],["maximnums","maximums"],["maximun","maximum"],["maxinum","maximum"],["maxium","maximum"],["maxiumum","maximum"],["maxmimum","maximum"],["maxmium","maximum"],["maxmiums","maximums"],["maxosx","macosx"],["maxumum","maximum"],["maybee","maybe"],["mayonase","mayonnaise"],["mayority","majority"],["mayu","may"],["mayybe","maybe"],["mazilla","Mozilla"],["mccarthyst","mccarthyist"],["mchanic","mechanic"],["mchanical","mechanical"],["mchanically","mechanically"],["mchanicals","mechanicals"],["mchanics","mechanics"],["mchanism","mechanism"],["mchanisms","mechanisms"],["mcroscope","microscope"],["mcroscopes","microscopes"],["mcroscopic","microscopic"],["mcroscopies","microscopies"],["mcroscopy","microscopy"],["mdification","modification"],["mdifications","modifications"],["mdified","modified"],["mdifier","modifier"],["mdifiers","modifiers"],["mdifies","modifies"],["mdify","modify"],["mdifying","modifying"],["mdoel","model"],["mdoeled","modeled"],["mdoeling","modeling"],["mdoelled","modelled"],["mdoelling","modelling"],["mdoels","models"],["meaasure","measure"],["meaasured","measured"],["meaasures","measures"],["meachanism","mechanism"],["meachanisms","mechanisms"],["meachinism","mechanism"],["meachinisms","mechanisms"],["meachnism","mechanism"],["meachnisms","mechanisms"],["meading","meaning"],["meaing","meaning"],["mealflur","millefleur"],["meanigfull","meaningful"],["meanign","meaning"],["meanin","meaning"],["meaninful","meaningful"],["meaningfull","meaningful"],["meanining","meaning"],["meaninless","meaningless"],["meaninng","meaning"],["meassurable","measurable"],["meassurably","measurably"],["meassure","measure"],["meassured","measured"],["meassurement","measurement"],["meassurements","measurements"],["meassures","measures"],["meassuring","measuring"],["measue","measure"],["measued","measured"],["measuement","measurement"],["measuements","measurements"],["measuer","measurer"],["measues","measures"],["measuing","measuring"],["measuremenet","measurement"],["measuremenets","measurements"],["measurmenet","measurement"],["measurmenets","measurements"],["measurment","measurement"],["measurments","measurements"],["meatadata","metadata"],["meatfile","metafile"],["meathod","method"],["meaure","measure"],["meaured","measured"],["meaurement","measurement"],["meaurements","measurements"],["meaurer","measurer"],["meaurers","measurers"],["meaures","measures"],["meauring","measuring"],["meausure","measure"],["meausures","measures"],["meber","member"],["mebmer","member"],["mebrain","membrane"],["mebrains","membranes"],["mebran","membrane"],["mebrans","membranes"],["mecahinsm","mechanism"],["mecahinsms","mechanisms"],["mecahnic","mechanic"],["mecahnics","mechanics"],["mecahnism","mechanism"],["mecanical","mechanical"],["mecanism","mechanism"],["mecanisms","mechanisms"],["meccob","macabre"],["mechamism","mechanism"],["mechamisms","mechanisms"],["mechananism","mechanism"],["mechancial","mechanical"],["mechandise","merchandise"],["mechanim","mechanism"],["mechanims","mechanisms"],["mechanis","mechanism"],["mechansim","mechanism"],["mechansims","mechanisms"],["mechine","machine"],["mechines","machines"],["mechinism","mechanism"],["mechnanism","mechanism"],["mechnism","mechanism"],["mechnisms","mechanisms"],["medacine","medicine"],["medai","media"],["meddo","meadow"],["meddos","meadows"],["medeival","medieval"],["medevial","medieval"],["medhod","method"],["medhods","methods"],["medievel","medieval"],["medifor","metaphor"],["medifors","metaphors"],["medioker","mediocre"],["mediphor","metaphor"],["mediphors","metaphors"],["medisinal","medicinal"],["mediterainnean","mediterranean"],["Mediteranean","Mediterranean"],["medow","meadow"],["medows","meadows"],["meeds","needs"],["meens","means"],["meerkrat","meerkat"],["meerly","merely"],["meetign","meeting"],["meganism","mechanism"],["mege","merge"],["mehcanic","mechanic"],["mehcanical","mechanical"],["mehcanically","mechanically"],["mehcanics","mechanics"],["mehod","method"],["mehodical","methodical"],["mehodically","methodically"],["mehods","methods"],["mehtod","method"],["mehtodical","methodical"],["mehtodically","methodically"],["mehtods","methods"],["meida","media"],["melancoly","melancholy"],["melieux","milieux"],["melineum","millennium"],["melineumms","millennia"],["melineums","millennia"],["melinneum","millennium"],["melinneums","millennia"],["mellineum","millennium"],["mellineums","millennia"],["mellinneum","millennium"],["mellinneums","millennia"],["membran","membrane"],["membranaphone","membranophone"],["membrans","membranes"],["memcahe","memcache"],["memcahed","memcached"],["memeasurement","measurement"],["memeber","member"],["memebered","remembered"],["memebers","members"],["memebership","membership"],["memeberships","memberships"],["memebr","member"],["memebrof","memberof"],["memebrs","members"],["mememory","memory"],["mememto","memento"],["memeory","memory"],["memer","member"],["memership","membership"],["memerships","memberships"],["memery","memory"],["memick","mimic"],["memicked","mimicked"],["memicking","mimicking"],["memics","mimics"],["memmber","member"],["memmick","mimic"],["memmicked","mimicked"],["memmicking","mimicking"],["memmics","mimics"],["memmory","memory"],["memoery","memory"],["memomry","memory"],["memor","memory"],["memoty","memory"],["memove","memmove"],["mempry","memory"],["memroy","memory"],["memwar","memoir"],["memwars","memoirs"],["memwoir","memoir"],["memwoirs","memoirs"],["menally","mentally"],["menas","means"],["menetion","mention"],["menetioned","mentioned"],["menetioning","mentioning"],["menetions","mentions"],["meni","menu"],["menioned","mentioned"],["mensioned","mentioned"],["mensioning","mentioning"],["ment","meant"],["menthods","methods"],["mentiond","mentioned"],["mentione","mentioned"],["mentionned","mentioned"],["mentionning","mentioning"],["mentionnned","mentioned"],["menual","manual"],["menue","menu"],["menues","menus"],["menutitems","menuitems"],["meraj","mirage"],["merajes","mirages"],["merang","meringue"],["mercahnt","merchant"],["mercentile","mercantile"],["merchantibility","merchantability"],["merecat","meerkat"],["merecats","meerkats"],["mergable","mergeable"],["merget","merge"],["mergge","merge"],["mergged","merged"],["mergging","merging"],["mermory","memory"],["merory","memory"],["merrors","mirrors"],["mesage","message"],["mesages","messages"],["mesaureed","measured"],["meskeeto","mosquito"],["meskeetos","mosquitoes"],["mesoneen","mezzanine"],["mesoneens","mezzanines"],["messaes","messages"],["messag","message"],["messagetqueue","messagequeue"],["messagin","messaging"],["messagoe","message"],["messags","messages"],["messagses","messages"],["messanger","messenger"],["messangers","messengers"],["messave","message"],["messeges","messages"],["messenging","messaging"],["messgae","message"],["messgaed","messaged"],["messgaes","messages"],["messge","message"],["messges","messages"],["messsage","message"],["messsages","messages"],["messure","measure"],["messured","measured"],["messurement","measurement"],["messures","measures"],["messuring","measuring"],["messurment","measurement"],["mesure","measure"],["mesured","measured"],["mesurement","measurement"],["mesurements","measurements"],["mesures","measures"],["mesuring","measuring"],["mesurment","measurement"],["meta-attrubute","meta-attribute"],["meta-attrubutes","meta-attributes"],["meta-progamming","meta-programming"],["metacharater","metacharacter"],["metacharaters","metacharacters"],["metalic","metallic"],["metalurgic","metallurgic"],["metalurgical","metallurgical"],["metalurgy","metallurgy"],["metamorphysis","metamorphosis"],["metapackge","metapackage"],["metapackges","metapackages"],["metaphore","metaphor"],["metaphoricial","metaphorical"],["metaprogamming","metaprogramming"],["metatdata","metadata"],["metdata","metadata"],["meterial","material"],["meterials","materials"],["meterologist","meteorologist"],["meterology","meteorology"],["methaphor","metaphor"],["methaphors","metaphors"],["methd","method"],["methdos","methods"],["methds","methods"],["methid","method"],["methids","methods"],["methjod","method"],["methodd","method"],["methode","method"],["methoden","methods"],["methodss","methods"],["methon","method"],["methons","methods"],["methot","method"],["methots","methods"],["metifor","metaphor"],["metifors","metaphors"],["metion","mention"],["metioned","mentioned"],["metiphor","metaphor"],["metiphors","metaphors"],["metod","method"],["metodologies","methodologies"],["metodology","methodology"],["metods","methods"],["metrig","metric"],["metrigal","metrical"],["metrigs","metrics"],["mey","may"],["meybe","maybe"],["mezmorise","mesmerise"],["mezmorised","mesmerised"],["mezmoriser","mesmeriser"],["mezmorises","mesmerises"],["mezmorising","mesmerising"],["mezmorize","mesmerize"],["mezmorized","mesmerized"],["mezmorizer","mesmerizer"],["mezmorizes","mesmerizes"],["mezmorizing","mesmerizing"],["miagic","magic"],["miagical","magical"],["mial","mail"],["mices","mice"],["Michagan","Michigan"],["micorcode","microcode"],["micorcodes","microcodes"],["Micorsoft","Microsoft"],["micoscope","microscope"],["micoscopes","microscopes"],["micoscopic","microscopic"],["micoscopies","microscopies"],["micoscopy","microscopy"],["Micosoft","Microsoft"],["micrcontroller","microcontroller"],["micrcontrollers","microcontrollers"],["microcontroler","microcontroller"],["microcontrolers","microcontrollers"],["Microfost","Microsoft"],["microntroller","microcontroller"],["microntrollers","microcontrollers"],["microoseconds","microseconds"],["micropone","microphone"],["micropones","microphones"],["microprocesspr","microprocessor"],["microprocessprs","microprocessors"],["microseond","microsecond"],["microseonds","microseconds"],["Microsft","Microsoft"],["microship","microchip"],["microships","microchips"],["Microsof","Microsoft"],["Microsofot","Microsoft"],["Micrsft","Microsoft"],["Micrsoft","Microsoft"],["middlware","middleware"],["midevil","medieval"],["midified","modified"],["midpints","midpoints"],["midpiont","midpoint"],["midpionts","midpoints"],["midpont","midpoint"],["midponts","midpoints"],["mige","midge"],["miges","midges"],["migh","might"],["migrateable","migratable"],["migth","might"],["miht","might"],["miinimisation","minimisation"],["miinimise","minimise"],["miinimised","minimised"],["miinimises","minimises"],["miinimising","minimising"],["miinimization","minimization"],["miinimize","minimize"],["miinimized","minimized"],["miinimizes","minimizes"],["miinimizing","minimizing"],["miinimum","minimum"],["mikrosecond","microsecond"],["mikroseconds","microseconds"],["milage","mileage"],["milages","mileages"],["mileau","milieu"],["milennia","millennia"],["milennium","millennium"],["mileu","milieu"],["miliary","military"],["milicious","malicious"],["miliciousally","maliciously"],["miliciously","maliciously"],["milicous","malicious"],["milicousally","maliciously"],["milicously","maliciously"],["miligram","milligram"],["milimeter","millimeter"],["milimeters","millimeters"],["milimetre","millimetre"],["milimetres","millimetres"],["milimiters","millimeters"],["milion","million"],["miliraty","military"],["milisecond","millisecond"],["miliseconds","milliseconds"],["milisecons","milliseconds"],["milivolts","millivolts"],["milktoast","milquetoast"],["milktoasts","milquetoasts"],["milleneum","millennium"],["millenia","millennia"],["millenial","millennial"],["millenialism","millennialism"],["millenials","millennials"],["millenium","millennium"],["millepede","millipede"],["milliescond","millisecond"],["milliesconds","milliseconds"],["millimiter","millimeter"],["millimiters","millimeters"],["millimitre","millimetre"],["millimitres","millimetres"],["millioniare","millionaire"],["millioniares","millionaires"],["millisencond","millisecond"],["millisenconds","milliseconds"],["milliseond","millisecond"],["milliseonds","milliseconds"],["millitant","militant"],["millitary","military"],["millon","million"],["millsecond","millisecond"],["millseconds","milliseconds"],["millsencond","millisecond"],["millsenconds","milliseconds"],["miltary","military"],["miltisite","multisite"],["milyew","milieu"],["mimach","mismatch"],["mimachd","mismatched"],["mimached","mismatched"],["mimaches","mismatches"],["mimaching","mismatching"],["mimatch","mismatch"],["mimatchd","mismatched"],["mimatched","mismatched"],["mimatches","mismatches"],["mimatching","mismatching"],["mimicing","mimicking"],["mimick","mimic"],["mimicks","mimics"],["mimimal","minimal"],["mimimum","minimum"],["mimimun","minimum"],["miminal","minimal"],["miminally","minimally"],["miminaly","minimally"],["miminise","minimise"],["miminised","minimised"],["miminises","minimises"],["miminising","minimising"],["miminize","minimize"],["miminized","minimized"],["miminizes","minimizes"],["miminizing","minimizing"],["mimmick","mimic"],["mimmicked","mimicked"],["mimmicking","mimicking"],["mimmics","mimics"],["minature","miniature"],["minerial","mineral"],["MingGW","MinGW"],["minimam","minimum"],["minimial","minimal"],["minimium","minimum"],["minimsation","minimisation"],["minimse","minimise"],["minimsed","minimised"],["minimses","minimises"],["minimsing","minimising"],["minimumm","minimum"],["minimumn","minimum"],["minimun","minimum"],["minimzation","minimization"],["minimze","minimize"],["minimzed","minimized"],["minimzes","minimizes"],["minimzing","minimizing"],["mininal","minimal"],["mininise","minimise"],["mininised","minimised"],["mininises","minimises"],["mininising","minimising"],["mininize","minimize"],["mininized","minimized"],["mininizes","minimizes"],["mininizing","minimizing"],["mininum","minimum"],["miniscule","minuscule"],["miniscully","minusculely"],["miniture","miniature"],["minium","minimum"],["miniums","minimums"],["miniumum","minimum"],["minmal","minimal"],["minmum","minimum"],["minnimum","minimum"],["minnimums","minimums"],["minsitry","ministry"],["minstries","ministries"],["minstry","ministry"],["minum","minimum"],["minumum","minimum"],["minuscle","minuscule"],["minuts","minutes"],["miplementation","implementation"],["mirconesia","micronesia"],["mircophone","microphone"],["mircophones","microphones"],["mircoscope","microscope"],["mircoscopes","microscopes"],["mircoservice","microservice"],["mircoservices","microservices"],["mircosoft","Microsoft"],["mirgate","migrate"],["mirgated","migrated"],["mirgates","migrates"],["mirometer","micrometer"],["mirometers","micrometers"],["mirored","mirrored"],["miroring","mirroring"],["mirorr","mirror"],["mirorred","mirrored"],["mirorring","mirroring"],["mirorrs","mirrors"],["mirro","mirror"],["mirroed","mirrored"],["mirrorn","mirror"],["mirrorred","mirrored"],["mis-alignement","misalignment"],["mis-alignment","misalignment"],["mis-intepret","mis-interpret"],["mis-intepreted","mis-interpreted"],["mis-match","mismatch"],["misalignement","misalignment"],["misalinged","misaligned"],["misbehaive","misbehave"],["miscallenous","miscellaneous"],["misceancellous","miscellaneous"],["miscelaneous","miscellaneous"],["miscellanious","miscellaneous"],["miscellanous","miscellaneous"],["miscelleneous","miscellaneous"],["mischeivous","mischievous"],["mischevious","mischievous"],["mischevus","mischievous"],["mischevusly","mischievously"],["mischieveous","mischievous"],["mischieveously","mischievously"],["mischievious","mischievous"],["misconfiged","misconfigured"],["Miscrosoft","Microsoft"],["misdameanor","misdemeanor"],["misdameanors","misdemeanors"],["misdemenor","misdemeanor"],["misdemenors","misdemeanors"],["miselaneous","miscellaneous"],["miselaneously","miscellaneously"],["misellaneous","miscellaneous"],["misellaneously","miscellaneously"],["misformed","malformed"],["misfourtunes","misfortunes"],["misile","missile"],["mising","missing"],["misintepret","misinterpret"],["misintepreted","misinterpreted"],["misinterpert","misinterpret"],["misinterperted","misinterpreted"],["misinterperting","misinterpreting"],["misinterperts","misinterprets"],["misinterprett","misinterpret"],["misinterpretted","misinterpreted"],["misisng","missing"],["mismach","mismatch"],["mismached","mismatched"],["mismaches","mismatches"],["mismaching","mismatching"],["mismactch","mismatch"],["mismatchd","mismatched"],["mismatich","mismatch"],["Misouri","Missouri"],["mispell","misspell"],["mispelled","misspelled"],["mispelling","misspelling"],["mispellings","misspellings"],["mispelt","misspelt"],["mispronounciation","mispronunciation"],["misquito","mosquito"],["misquitos","mosquitos"],["missable","miscible"],["missconfiguration","misconfiguration"],["missconfigure","misconfigure"],["missconfigured","misconfigured"],["missconfigures","misconfigures"],["missconfiguring","misconfiguring"],["misscounted","miscounted"],["missen","mizzen"],["missign","missing"],["missingassignement","missingassignment"],["missings","missing"],["Missisipi","Mississippi"],["Missisippi","Mississippi"],["missle","missile"],["missleading","misleading"],["missletow","mistletoe"],["missmanaged","mismanaged"],["missmatch","mismatch"],["missmatchd","mismatched"],["missmatched","mismatched"],["missmatches","mismatches"],["missmatching","mismatching"],["missonary","missionary"],["misspel","misspell"],["misssing","missing"],["misstake","mistake"],["misstaken","mistaken"],["misstakes","mistakes"],["misstype","mistype"],["misstypes","mistypes"],["missunderstood","misunderstood"],["missuse","misuse"],["missused","misused"],["missusing","misusing"],["mistatch","mismatch"],["mistatchd","mismatched"],["mistatched","mismatched"],["mistatches","mismatches"],["mistatching","mismatching"],["misteek","mystique"],["misteeks","mystiques"],["misterious","mysterious"],["mistery","mystery"],["misteryous","mysterious"],["mistic","mystic"],["mistical","mystical"],["mistics","mystics"],["mistmatch","mismatch"],["mistmatched","mismatched"],["mistmatches","mismatches"],["mistmatching","mismatching"],["mistro","maestro"],["mistros","maestros"],["mistrow","maestro"],["mistrows","maestros"],["misue","misuse"],["misued","misused"],["misuing","misusing"],["miticate","mitigate"],["miticated","mitigated"],["miticateing","mitigating"],["miticates","mitigates"],["miticating","mitigating"],["miticator","mitigator"],["mittigate","mitigate"],["miximum","maximum"],["mixted","mixed"],["mixure","mixture"],["mjor","major"],["mkae","make"],["mkaes","makes"],["mkaing","making"],["mke","make"],["mkea","make"],["mmaped","mapped"],["mmatching","matching"],["mmbers","members"],["mmnemonic","mnemonic"],["mnay","many"],["mobify","modify"],["mocrochip","microchip"],["mocrochips","microchips"],["mocrocode","microcode"],["mocrocodes","microcodes"],["mocrocontroller","microcontroller"],["mocrocontrollers","microcontrollers"],["mocrophone","microphone"],["mocrophones","microphones"],["mocroprocessor","microprocessor"],["mocroprocessors","microprocessors"],["mocrosecond","microsecond"],["mocroseconds","microseconds"],["Mocrosoft","Microsoft"],["mocule","module"],["mocules","modules"],["moddel","model"],["moddeled","modeled"],["moddelled","modelled"],["moddels","models"],["modee","mode"],["modelinng","modeling"],["modell","model"],["modellinng","modelling"],["modernination","modernization"],["moderninations","modernizations"],["moderninationz","modernizations"],["modernizationz","modernizations"],["modesettting","modesetting"],["modeul","module"],["modeuls","modules"],["modfel","model"],["modfiable","modifiable"],["modfication","modification"],["modfications","modifications"],["modfide","modified"],["modfided","modified"],["modfider","modifier"],["modfiders","modifiers"],["modfides","modifies"],["modfied","modified"],["modfieid","modified"],["modfieir","modifier"],["modfieirs","modifiers"],["modfieis","modifies"],["modfier","modifier"],["modfiers","modifiers"],["modfies","modifies"],["modfifiable","modifiable"],["modfification","modification"],["modfifications","modifications"],["modfified","modified"],["modfifier","modifier"],["modfifiers","modifiers"],["modfifies","modifies"],["modfify","modify"],["modfifying","modifying"],["modfiiable","modifiable"],["modfiication","modification"],["modfiications","modifications"],["modfitied","modified"],["modfitier","modifier"],["modfitiers","modifiers"],["modfities","modifies"],["modfity","modify"],["modfitying","modifying"],["modfiy","modify"],["modfiying","modifying"],["modfy","modify"],["modfying","modifying"],["modications","modifications"],["modidfication","modification"],["modidfications","modifications"],["modidfied","modified"],["modidfier","modifier"],["modidfiers","modifiers"],["modidfies","modifies"],["modidfy","modify"],["modidfying","modifying"],["modifable","modifiable"],["modifaction","modification"],["modifactions","modifications"],["modifation","modification"],["modifations","modifications"],["modifcation","modification"],["modifcations","modifications"],["modifciation","modification"],["modifciations","modifications"],["modifcication","modification"],["modifcications","modifications"],["modifdied","modified"],["modifdy","modify"],["modifed","modified"],["modifer","modifier"],["modifers","modifiers"],["modifes","modifies"],["modiffer","modifier"],["modiffers","modifiers"],["modifiation","modification"],["modifiations","modifications"],["modificatioon","modification"],["modificatioons","modifications"],["modificaton","modification"],["modificatons","modifications"],["modifid","modified"],["modifified","modified"],["modifify","modify"],["modifing","modifying"],["modifires","modifiers"],["modifiy","modify"],["modifiying","modifying"],["modifiyng","modifying"],["modifled","modified"],["modifler","modifier"],["modiflers","modifiers"],["modift","modify"],["modifty","modify"],["modifu","modify"],["modifuable","modifiable"],["modifued","modified"],["modifx","modify"],["modifyable","modifiable"],["modiration","moderation"],["modle","model"],["modlue","module"],["modprobbing","modprobing"],["modprobeing","modprobing"],["modtified","modified"],["modue","module"],["moduel","module"],["moduels","modules"],["moduile","module"],["modukles","modules"],["modul","module"],["modules's","modules'"],["moduless","modules"],["modulie","module"],["modulu","modulo"],["modulues","modules"],["modyfy","modify"],["moent","moment"],["moeny","money"],["mofdified","modified"],["mofification","modification"],["mofified","modified"],["mofifies","modifies"],["mofify","modify"],["mohammedan","muslim"],["mohammedans","muslims"],["moint","mount"],["mointor","monitor"],["mointored","monitored"],["mointoring","monitoring"],["mointors","monitors"],["moleclues","molecules"],["momement","moment"],["momementarily","momentarily"],["momements","moments"],["momemtarily","momentarily"],["momemtary","momentary"],["momemtn","moment"],["momentarely","momentarily"],["momento","memento"],["momery","memory"],["momoent","moment"],["momoment","moment"],["momomentarily","momentarily"],["momoments","moments"],["momory","memory"],["monarkey","monarchy"],["monarkeys","monarchies"],["monarkies","monarchies"],["monestaries","monasteries"],["monestic","monastic"],["monickers","monikers"],["monitary","monetary"],["moniter","monitor"],["monitoing","monitoring"],["monkies","monkeys"],["monochorome","monochrome"],["monochromo","monochrome"],["monocrome","monochrome"],["monolite","monolithic"],["monontonicity","monotonicity"],["monopace","monospace"],["monotir","monitor"],["monotired","monitored"],["monotiring","monitoring"],["monotirs","monitors"],["monsday","Monday"],["Monserrat","Montserrat"],["monstrum","monster"],["montains","mountains"],["montaj","montage"],["montajes","montages"],["montanous","mountainous"],["monthe","month"],["monthes","months"],["montly","monthly"],["Montnana","Montana"],["monts","months"],["montypic","monotypic"],["moodify","modify"],["moounting","mounting"],["mopdule","module"],["mopre","more"],["mor","more"],["mordern","modern"],["morever","moreover"],["morg","morgue"],["morgage","mortgage"],["morges","morgues"],["morgs","morgues"],["morisette","morissette"],["mormalise","normalise"],["mormalised","normalised"],["mormalises","normalises"],["mormalize","normalize"],["mormalized","normalized"],["mormalizes","normalizes"],["morrisette","morissette"],["morroccan","moroccan"],["morrocco","morocco"],["morroco","morocco"],["mortage","mortgage"],["morter","mortar"],["moslty","mostly"],["mostlky","mostly"],["mosture","moisture"],["mosty","mostly"],["moteef","motif"],["moteefs","motifs"],["moteur","motor"],["moteured","motored"],["moteuring","motoring"],["moteurs","motors"],["mothing","nothing"],["motiviated","motivated"],["motiviation","motivation"],["motononic","monotonic"],["motoroloa","motorola"],["moudle","module"],["moudule","module"],["mountian","mountain"],["mountpiont","mountpoint"],["mountpionts","mountpoints"],["mouspointer","mousepointer"],["moutn","mount"],["moutned","mounted"],["moutning","mounting"],["moutnpoint","mountpoint"],["moutnpoints","mountpoints"],["moutns","mounts"],["mouvement","movement"],["mouvements","movements"],["movebackwrd","movebackward"],["moveble","movable"],["movemement","movement"],["movemements","movements"],["movememnt","movement"],["movememnts","movements"],["movememt","movement"],["movememts","movements"],["movemet","movement"],["movemets","movements"],["movemment","movement"],["movemments","movements"],["movemnet","movement"],["movemnets","movements"],["movemnt","movement"],["movemnts","movements"],["movment","movement"],["moziila","Mozilla"],["mozila","Mozilla"],["mozzilla","mozilla"],["mroe","more"],["msbild","MSBuild"],["msbilds","MSBuild's"],["msbuid","MSBuild"],["msbuids","MSBuild's"],["msbuld","MSBuild"],["msbulds","MSBuild's"],["msbulid","MSBuild"],["msbulids","MSBuild's"],["mssing","missing"],["msssge","message"],["mthod","method"],["mtuually","mutually"],["mucuous","mucous"],["muder","murder"],["mudering","murdering"],["mudule","module"],["mudules","modules"],["muext","mutex"],["muiltiple","multiple"],["muiltiples","multiples"],["muliple","multiple"],["muliples","multiples"],["mulithread","multithread"],["mulitiplier","multiplier"],["mulitipliers","multipliers"],["mulitpart","multipart"],["mulitpath","multipath"],["mulitple","multiple"],["mulitplication","multiplication"],["mulitplicative","multiplicative"],["mulitplied","multiplied"],["mulitplier","multiplier"],["mulitpliers","multipliers"],["mulitply","multiply"],["multi-dimenional","multi-dimensional"],["multi-dimenionsal","multi-dimensional"],["multi-langual","multi-lingual"],["multi-presistion","multi-precision"],["multi-threded","multi-threaded"],["multible","multiple"],["multibye","multibyte"],["multicat","multicast"],["multicultralism","multiculturalism"],["multidimenional","multi-dimensional"],["multidimenionsal","multi-dimensional"],["multidimensinal","multidimensional"],["multidimension","multidimensional"],["multidimensionnal","multidimensional"],["multidimentionnal","multidimensional"],["multiecast","multicast"],["multifuction","multifunction"],["multilangual","multilingual"],["multile","multiple"],["multilpe","multiple"],["multipe","multiple"],["multipes","multiples"],["multipiler","multiplier"],["multipilers","multipliers"],["multipled","multiplied"],["multiplers","multipliers"],["multipliciaton","multiplication"],["multiplicites","multiplicities"],["multiplicty","multiplicity"],["multiplikation","multiplication"],["multipling","multiplying"],["multipllication","multiplication"],["multiplyed","multiplied"],["multipresistion","multiprecision"],["multipul","multiple"],["multipy","multiply"],["multipyling","multiplying"],["multithreded","multithreaded"],["multitute","multitude"],["multivriate","multivariate"],["multixsite","multisite"],["multline","multiline"],["multliple","multiple"],["multliples","multiples"],["multliplied","multiplied"],["multliplier","multiplier"],["multlipliers","multipliers"],["multliplies","multiplies"],["multliply","multiply"],["multliplying","multiplying"],["multple","multiple"],["multples","multiples"],["multplied","multiplied"],["multplier","multiplier"],["multpliers","multipliers"],["multplies","multiplies"],["multply","multiply"],["multplying","multiplying"],["multy","multi"],["multy-thread","multithread"],["mumber","number"],["mumbers","numbers"],["munbers","numbers"],["muncipalities","municipalities"],["muncipality","municipality"],["municiple","municipal"],["munnicipality","municipality"],["munute","minute"],["murr","myrrh"],["muscial","musical"],["muscician","musician"],["muscicians","musicians"],["musn't","mustn't"],["must't","mustn't"],["mustator","mutator"],["muste","must"],["mutablity","mutability"],["mutbale","mutable"],["mutch","much"],["mutches","matches"],["mutecies","mutexes"],["mutexs","mutexes"],["muti","multi"],["muticast","multicast"],["mutices","mutexes"],["mutilcast","multicast"],["mutiliated","mutilated"],["mutimarked","multimarked"],["mutipath","multipath"],["mutiple","multiple"],["mutiply","multiply"],["mutli","multi"],["mutli-threaded","multi-threaded"],["mutlipart","multipart"],["mutliple","multiple"],["mutliples","multiples"],["mutliplication","multiplication"],["mutliplicites","multiplicities"],["mutliplier","multiplier"],["mutlipliers","multipliers"],["mutliply","multiply"],["mutully","mutually"],["mutux","mutex"],["mutuxes","mutexes"],["mutuxs","mutexes"],["muyst","must"],["myabe","maybe"],["mybe","maybe"],["myitereator","myiterator"],["myraid","myriad"],["mysef","myself"],["mysefl","myself"],["mysekf","myself"],["myselfe","myself"],["myselfes","myself"],["myselv","myself"],["myselve","myself"],["myselves","myself"],["myslef","myself"],["mysogynist","misogynist"],["mysogyny","misogyny"],["mysterous","mysterious"],["mystql","mysql"],["mystrow","maestro"],["mystrows","maestros"],["Mythraic","Mithraic"],["myu","my"],["nadly","badly"],["nagative","negative"],["nagatively","negatively"],["nagatives","negatives"],["nagivation","navigation"],["naieve","naive"],["nam","name"],["namaed","named"],["namaes","names"],["nameing","naming"],["namemespace","namespace"],["namepace","namespace"],["namepsace","namespace"],["namepsaces","namespaces"],["namesapce","namespace"],["namesapced","namespaced"],["namesapces","namespaces"],["namess","names"],["namesspaces","namespaces"],["namme","name"],["namne","name"],["namned","named"],["namnes","names"],["namnespace","namespace"],["namnespaces","namespaces"],["nams","names"],["nane","name"],["nanosencond","nanosecond"],["nanosenconds","nanoseconds"],["nanoseond","nanosecond"],["nanoseonds","nanoseconds"],["Naploeon","Napoleon"],["Napolean","Napoleon"],["Napoleonian","Napoleonic"],["nasted","nested"],["nasting","nesting"],["nastly","nasty"],["nastyness","nastiness"],["natched","matched"],["natches","matches"],["nativelyx","natively"],["natrual","natural"],["naturaly","naturally"],["naturely","naturally"],["naturual","natural"],["naturually","naturally"],["natvigation","navigation"],["navagate","navigate"],["navagating","navigating"],["navagation","navigation"],["navagitation","navigation"],["naviagte","navigate"],["naviagted","navigated"],["naviagtes","navigates"],["naviagting","navigating"],["naviagtion","navigation"],["navitvely","natively"],["navtive","native"],["navtives","natives"],["naxima","maxima"],["naximal","maximal"],["naximum","maximum"],["Nazereth","Nazareth"],["nclude","include"],["ndoe","node"],["ndoes","nodes"],["neady","needy"],["neagtive","negative"],["neares","nearest"],["nearset","nearest"],["necassery","necessary"],["necassry","necessary"],["necause","because"],["neccecarily","necessarily"],["neccecary","necessary"],["neccesarily","necessarily"],["neccesary","necessary"],["neccessarily","necessarily"],["neccessarry","necessary"],["neccessary","necessary"],["neccessities","necessities"],["neccessity","necessity"],["neccisary","necessary"],["neccsessary","necessary"],["necesarily","necessarily"],["necesarrily","necessarily"],["necesarry","necessary"],["necesary","necessary"],["necessaery","necessary"],["necessairly","necessarily"],["necessar","necessary"],["necessarilly","necessarily"],["necessarly","necessarily"],["necessarry","necessary"],["necessaryly","necessarily"],["necessay","necessary"],["necesserily","necessarily"],["necessery","necessary"],["necessesary","necessary"],["necessiate","necessitate"],["nechanism","mechanism"],["necssary","necessary"],["nedd","need"],["nedded","needed"],["neded","needed"],["nedia","media"],["nedium","medium"],["nediums","mediums"],["nedle","needle"],["neds","needs"],["needeed","needed"],["neeed","need"],["neeeded","needed"],["neeeding","needing"],["neeedle","needle"],["neeedn't","needn't"],["neeeds","needs"],["nees","needs"],["neesd","needs"],["neesds","needs"],["neested","nested"],["neesting","nesting"],["negaive","negative"],["negarive","negative"],["negatiotiable","negotiable"],["negatiotiate","negotiate"],["negatiotiated","negotiated"],["negatiotiates","negotiates"],["negatiotiating","negotiating"],["negatiotiation","negotiation"],["negatiotiations","negotiations"],["negatiotiator","negotiator"],["negatiotiators","negotiators"],["negativ","negative"],["negatve","negative"],["negible","negligible"],["negitiable","negotiable"],["negitiate","negotiate"],["negitiated","negotiated"],["negitiates","negotiates"],["negitiating","negotiating"],["negitiation","negotiation"],["negitiations","negotiations"],["negitiator","negotiator"],["negitiators","negotiators"],["negitive","negative"],["neglible","negligible"],["negligable","negligible"],["negligble","negligible"],["negoable","negotiable"],["negoate","negotiate"],["negoated","negotiated"],["negoates","negotiates"],["negoatiable","negotiable"],["negoatiate","negotiate"],["negoatiated","negotiated"],["negoatiates","negotiates"],["negoatiating","negotiating"],["negoatiation","negotiation"],["negoatiations","negotiations"],["negoatiator","negotiator"],["negoatiators","negotiators"],["negoating","negotiating"],["negoation","negotiation"],["negoations","negotiations"],["negoator","negotiator"],["negoators","negotiators"],["negociable","negotiable"],["negociate","negotiate"],["negociated","negotiated"],["negociates","negotiates"],["negociating","negotiating"],["negociation","negotiation"],["negociations","negotiations"],["negociator","negotiator"],["negociators","negotiators"],["negogtiable","negotiable"],["negogtiate","negotiate"],["negogtiated","negotiated"],["negogtiates","negotiates"],["negogtiating","negotiating"],["negogtiation","negotiation"],["negogtiations","negotiations"],["negogtiator","negotiator"],["negogtiators","negotiators"],["negoitable","negotiable"],["negoitate","negotiate"],["negoitated","negotiated"],["negoitates","negotiates"],["negoitating","negotiating"],["negoitation","negotiation"],["negoitations","negotiations"],["negoitator","negotiator"],["negoitators","negotiators"],["negoptionsotiable","negotiable"],["negoptionsotiate","negotiate"],["negoptionsotiated","negotiated"],["negoptionsotiates","negotiates"],["negoptionsotiating","negotiating"],["negoptionsotiation","negotiation"],["negoptionsotiations","negotiations"],["negoptionsotiator","negotiator"],["negoptionsotiators","negotiators"],["negosiable","negotiable"],["negosiate","negotiate"],["negosiated","negotiated"],["negosiates","negotiates"],["negosiating","negotiating"],["negosiation","negotiation"],["negosiations","negotiations"],["negosiator","negotiator"],["negosiators","negotiators"],["negotable","negotiable"],["negotaiable","negotiable"],["negotaiate","negotiate"],["negotaiated","negotiated"],["negotaiates","negotiates"],["negotaiating","negotiating"],["negotaiation","negotiation"],["negotaiations","negotiations"],["negotaiator","negotiator"],["negotaiators","negotiators"],["negotaible","negotiable"],["negotaite","negotiate"],["negotaited","negotiated"],["negotaites","negotiates"],["negotaiting","negotiating"],["negotaition","negotiation"],["negotaitions","negotiations"],["negotaitor","negotiator"],["negotaitors","negotiators"],["negotate","negotiate"],["negotated","negotiated"],["negotates","negotiates"],["negotatiable","negotiable"],["negotatiate","negotiate"],["negotatiated","negotiated"],["negotatiates","negotiates"],["negotatiating","negotiating"],["negotatiation","negotiation"],["negotatiations","negotiations"],["negotatiator","negotiator"],["negotatiators","negotiators"],["negotatible","negotiable"],["negotatie","negotiate"],["negotatied","negotiated"],["negotaties","negotiates"],["negotating","negotiating"],["negotation","negotiation"],["negotations","negotiations"],["negotatior","negotiator"],["negotatiors","negotiators"],["negotator","negotiator"],["negotators","negotiators"],["negothiable","negotiable"],["negothiate","negotiate"],["negothiated","negotiated"],["negothiates","negotiates"],["negothiating","negotiating"],["negothiation","negotiation"],["negothiations","negotiations"],["negothiator","negotiator"],["negothiators","negotiators"],["negotible","negotiable"],["negoticable","negotiable"],["negoticate","negotiate"],["negoticated","negotiated"],["negoticates","negotiates"],["negoticating","negotiating"],["negotication","negotiation"],["negotications","negotiations"],["negoticator","negotiator"],["negoticators","negotiators"],["negotinate","negotiate"],["negotioable","negotiable"],["negotioate","negotiate"],["negotioated","negotiated"],["negotioates","negotiates"],["negotioating","negotiating"],["negotioation","negotiation"],["negotioations","negotiations"],["negotioator","negotiator"],["negotioators","negotiators"],["negotioble","negotiable"],["negotion","negotiation"],["negotionable","negotiable"],["negotionate","negotiate"],["negotionated","negotiated"],["negotionates","negotiates"],["negotionating","negotiating"],["negotionation","negotiation"],["negotionations","negotiations"],["negotionator","negotiator"],["negotionators","negotiators"],["negotions","negotiations"],["negotiotable","negotiable"],["negotiotate","negotiate"],["negotiotated","negotiated"],["negotiotates","negotiates"],["negotiotating","negotiating"],["negotiotation","negotiation"],["negotiotations","negotiations"],["negotiotator","negotiator"],["negotiotators","negotiators"],["negotiote","negotiate"],["negotioted","negotiated"],["negotiotes","negotiates"],["negotioting","negotiating"],["negotiotion","negotiation"],["negotiotions","negotiations"],["negotiotor","negotiator"],["negotiotors","negotiators"],["negotitable","negotiable"],["negotitae","negotiate"],["negotitaed","negotiated"],["negotitaes","negotiates"],["negotitaing","negotiating"],["negotitaion","negotiation"],["negotitaions","negotiations"],["negotitaor","negotiator"],["negotitaors","negotiators"],["negotitate","negotiate"],["negotitated","negotiated"],["negotitates","negotiates"],["negotitating","negotiating"],["negotitation","negotiation"],["negotitations","negotiations"],["negotitator","negotiator"],["negotitators","negotiators"],["negotite","negotiate"],["negotited","negotiated"],["negotites","negotiates"],["negotiting","negotiating"],["negotition","negotiation"],["negotitions","negotiations"],["negotitor","negotiator"],["negotitors","negotiators"],["negoziable","negotiable"],["negoziate","negotiate"],["negoziated","negotiated"],["negoziates","negotiates"],["negoziating","negotiating"],["negoziation","negotiation"],["negoziations","negotiations"],["negoziator","negotiator"],["negoziators","negotiators"],["negtive","negative"],["neibhbors","neighbors"],["neibhbours","neighbours"],["neibor","neighbor"],["neiborhood","neighborhood"],["neiborhoods","neighborhoods"],["neibors","neighbors"],["neigbhor","neighbor"],["neigbhorhood","neighborhood"],["neigbhorhoods","neighborhoods"],["neigbhors","neighbors"],["neigbhour","neighbour"],["neigbhours","neighbours"],["neigbor","neighbor"],["neigborhood","neighborhood"],["neigboring","neighboring"],["neigbors","neighbors"],["neigbourhood","neighbourhood"],["neighbar","neighbor"],["neighbarhood","neighborhood"],["neighbarhoods","neighborhoods"],["neighbaring","neighboring"],["neighbars","neighbors"],["neighbbor","neighbor"],["neighbborhood","neighborhood"],["neighbborhoods","neighborhoods"],["neighbboring","neighboring"],["neighbbors","neighbors"],["neighbeard","neighborhood"],["neighbeards","neighborhoods"],["neighbehood","neighborhood"],["neighbehoods","neighborhoods"],["neighbeing","neighboring"],["neighbeod","neighborhood"],["neighbeods","neighborhoods"],["neighbeor","neighbor"],["neighbeordhood","neighborhood"],["neighbeordhoods","neighborhoods"],["neighbeorhod","neighborhood"],["neighbeorhods","neighborhoods"],["neighbeorhood","neighborhood"],["neighbeorhoods","neighborhoods"],["neighbeors","neighbors"],["neighber","neighbor"],["neighbergh","neighbor"],["neighberghs","neighbors"],["neighberhhod","neighborhood"],["neighberhhods","neighborhoods"],["neighberhhood","neighborhood"],["neighberhhoods","neighborhoods"],["neighberhing","neighboring"],["neighberhod","neighborhood"],["neighberhodd","neighborhood"],["neighberhodds","neighborhoods"],["neighberhods","neighborhoods"],["neighberhood","neighborhood"],["neighberhooding","neighboring"],["neighberhoods","neighborhoods"],["neighberhoof","neighborhood"],["neighberhoofs","neighborhoods"],["neighberhoood","neighborhood"],["neighberhooods","neighborhoods"],["neighberhoor","neighbor"],["neighberhoors","neighbors"],["neighberhoud","neighborhood"],["neighberhouds","neighborhoods"],["neighbering","neighboring"],["neighbers","neighbors"],["neighbes","neighbors"],["neighbet","neighbor"],["neighbethood","neighborhood"],["neighbethoods","neighborhoods"],["neighbets","neighbors"],["neighbeuing","neighbouring"],["neighbeurgh","neighbour"],["neighbeurghs","neighbours"],["neighbeurhing","neighbouring"],["neighbeurhooding","neighbouring"],["neighbeurhoor","neighbour"],["neighbeurhoors","neighbours"],["neighbeus","neighbours"],["neighbeut","neighbour"],["neighbeuthood","neighbourhood"],["neighbeuthoods","neighbourhoods"],["neighbeuts","neighbours"],["neighbhor","neighbor"],["neighbhorhood","neighborhood"],["neighbhorhoods","neighborhoods"],["neighbhoring","neighboring"],["neighbhors","neighbors"],["neighboard","neighborhood"],["neighboards","neighborhoods"],["neighbohood","neighborhood"],["neighbohoods","neighborhoods"],["neighboing","neighboring"],["neighbood","neighborhood"],["neighboods","neighborhoods"],["neighboordhood","neighborhood"],["neighboordhoods","neighborhoods"],["neighboorhod","neighborhood"],["neighboorhods","neighborhoods"],["neighboorhood","neighborhood"],["neighboorhoods","neighborhoods"],["neighbooring","neighboring"],["neighborgh","neighbor"],["neighborghs","neighbors"],["neighborhhod","neighborhood"],["neighborhhods","neighborhoods"],["neighborhhood","neighborhood"],["neighborhhoods","neighborhoods"],["neighborhing","neighboring"],["neighborhod","neighborhood"],["neighborhodd","neighborhood"],["neighborhodds","neighborhoods"],["neighborhods","neighborhoods"],["neighborhooding","neighboring"],["neighborhoof","neighborhood"],["neighborhoofs","neighborhoods"],["neighborhoood","neighborhood"],["neighborhooods","neighborhoods"],["neighborhoor","neighbor"],["neighborhoors","neighbors"],["neighborhoud","neighborhood"],["neighborhouds","neighborhoods"],["neighbos","neighbors"],["neighbot","neighbor"],["neighbothood","neighborhood"],["neighbothoods","neighborhoods"],["neighbots","neighbors"],["neighbouing","neighbouring"],["neighbourgh","neighbour"],["neighbourghs","neighbours"],["neighbourhhod","neighbourhood"],["neighbourhhods","neighbourhoods"],["neighbourhhood","neighbourhood"],["neighbourhhoods","neighbourhoods"],["neighbourhing","neighbouring"],["neighbourhod","neighbourhood"],["neighbourhodd","neighbourhood"],["neighbourhodds","neighbourhoods"],["neighbourhods","neighbourhoods"],["neighbourhooding","neighbouring"],["neighbourhoof","neighbourhood"],["neighbourhoofs","neighbourhoods"],["neighbourhoood","neighbourhood"],["neighbourhooods","neighbourhoods"],["neighbourhoor","neighbour"],["neighbourhoors","neighbours"],["neighbourhoud","neighbourhood"],["neighbourhouds","neighbourhoods"],["neighbous","neighbours"],["neighbout","neighbour"],["neighbouthood","neighbourhood"],["neighbouthoods","neighbourhoods"],["neighbouts","neighbours"],["neighbr","neighbor"],["neighbrs","neighbors"],["neighbur","neighbor"],["neighburhood","neighborhood"],["neighburhoods","neighborhoods"],["neighburing","neighboring"],["neighburs","neighbors"],["neigher","neither"],["neighobr","neighbor"],["neighobrhood","neighborhood"],["neighobrhoods","neighborhoods"],["neighobring","neighboring"],["neighobrs","neighbors"],["neighor","neighbor"],["neighorhood","neighborhood"],["neighorhoods","neighborhoods"],["neighoring","neighboring"],["neighors","neighbors"],["neighour","neighbour"],["neighourhood","neighbourhood"],["neighourhoods","neighbourhoods"],["neighouring","neighbouring"],["neighours","neighbours"],["neighror","neighbour"],["neighrorhood","neighbourhood"],["neighrorhoods","neighbourhoods"],["neighroring","neighbouring"],["neighrors","neighbours"],["neighrour","neighbour"],["neighrourhood","neighbourhood"],["neighrourhoods","neighbourhoods"],["neighrouring","neighbouring"],["neighrours","neighbours"],["neight","neither"],["neightbor","neighbor"],["neightborhood","neighborhood"],["neightborhoods","neighborhoods"],["neightboring","neighboring"],["neightbors","neighbors"],["neightbour","neighbour"],["neightbourhood","neighbourhood"],["neightbourhoods","neighbourhoods"],["neightbouring","neighbouring"],["neightbours","neighbours"],["neighter","neither"],["neightobr","neighbor"],["neightobrhood","neighborhood"],["neightobrhoods","neighborhoods"],["neightobring","neighboring"],["neightobrs","neighbors"],["neiter","neither"],["nelink","netlink"],["nenviroment","environment"],["neolitic","neolithic"],["nerver","never"],["nescesaries","necessaries"],["nescesarily","necessarily"],["nescesarrily","necessarily"],["nescesarry","necessary"],["nescessarily","necessarily"],["nescessary","necessary"],["nesesarily","necessarily"],["nessary","necessary"],["nessasarily","necessarily"],["nessasary","necessary"],["nessecarilt","necessarily"],["nessecarily","necessarily"],["nessecarry","necessary"],["nessecary","necessary"],["nesseccarily","necessarily"],["nesseccary","necessary"],["nessesarily","necessarily"],["nessesary","necessary"],["nessessarily","necessarily"],["nessessary","necessary"],["nestin","nesting"],["nestwork","network"],["netacpe","netscape"],["netcape","netscape"],["nethods","methods"],["netiher","neither"],["netowrk","network"],["netowrks","networks"],["netscpe","netscape"],["netwplit","netsplit"],["netwrok","network"],["netwroked","networked"],["netwroks","networks"],["netwrork","network"],["neumeric","numeric"],["nevelope","envelope"],["nevelopes","envelopes"],["nevere","never"],["neveretheless","nevertheless"],["nevers","never"],["neverthless","nevertheless"],["newine","newline"],["newines","newlines"],["newletters","newsletters"],["nework","network"],["neworks","networks"],["newslines","newlines"],["newthon","newton"],["newtork","network"],["Newyorker","New Yorker"],["niear","near"],["niearest","nearest"],["niether","neither"],["nighbor","neighbor"],["nighborhood","neighborhood"],["nighboring","neighboring"],["nighlties","nightlies"],["nighlty","nightly"],["nightfa;;","nightfall"],["nightime","nighttime"],["nimutes","minutes"],["nineth","ninth"],["ninima","minima"],["ninimal","minimal"],["ninimum","minimum"],["ninjs","ninja"],["ninteenth","nineteenth"],["nither","neither"],["nknown","unknown"],["nkow","know"],["nkwo","know"],["nmae","name"],["nned","need"],["nneeded","needed"],["nnumber","number"],["no-overide","no-override"],["nodels","models"],["nodess","nodes"],["nodulated","modulated"],["nofified","notified"],["nofity","notify"],["nohypen","nohyphen"],["nomber","number"],["nombered","numbered"],["nombering","numbering"],["nombers","numbers"],["nomimal","nominal"],["non-alphanumunder","non-alphanumeric"],["non-asii","non-ascii"],["non-assiged","non-assigned"],["non-bloking","non-blocking"],["non-compleeted","non-completed"],["non-complient","non-compliant"],["non-corelated","non-correlated"],["non-existant","non-existent"],["non-exluded","non-excluded"],["non-indentended","non-indented"],["non-inmediate","non-immediate"],["non-inreractive","non-interactive"],["non-instnat","non-instant"],["non-meausure","non-measure"],["non-negatiotiable","non-negotiable"],["non-negatiotiated","non-negotiated"],["non-negativ","non-negative"],["non-negoable","non-negotiable"],["non-negoated","non-negotiated"],["non-negoatiable","non-negotiable"],["non-negoatiated","non-negotiated"],["non-negociable","non-negotiable"],["non-negociated","non-negotiated"],["non-negogtiable","non-negotiable"],["non-negogtiated","non-negotiated"],["non-negoitable","non-negotiable"],["non-negoitated","non-negotiated"],["non-negoptionsotiable","non-negotiable"],["non-negoptionsotiated","non-negotiated"],["non-negosiable","non-negotiable"],["non-negosiated","non-negotiated"],["non-negotable","non-negotiable"],["non-negotaiable","non-negotiable"],["non-negotaiated","non-negotiated"],["non-negotaible","non-negotiable"],["non-negotaited","non-negotiated"],["non-negotated","non-negotiated"],["non-negotatiable","non-negotiable"],["non-negotatiated","non-negotiated"],["non-negotatible","non-negotiable"],["non-negotatied","non-negotiated"],["non-negothiable","non-negotiable"],["non-negothiated","non-negotiated"],["non-negotible","non-negotiable"],["non-negoticable","non-negotiable"],["non-negoticated","non-negotiated"],["non-negotioable","non-negotiable"],["non-negotioated","non-negotiated"],["non-negotioble","non-negotiable"],["non-negotionable","non-negotiable"],["non-negotionated","non-negotiated"],["non-negotiotable","non-negotiable"],["non-negotiotated","non-negotiated"],["non-negotiote","non-negotiated"],["non-negotitable","non-negotiable"],["non-negotitaed","non-negotiated"],["non-negotitated","non-negotiated"],["non-negotited","non-negotiated"],["non-negoziable","non-negotiable"],["non-negoziated","non-negotiated"],["non-priviliged","non-privileged"],["non-referenced-counted","non-reference-counted"],["non-replacable","non-replaceable"],["non-replacalbe","non-replaceable"],["non-reproducable","non-reproducible"],["non-seperable","non-separable"],["non-trasparent","non-transparent"],["non-useful","useless"],["non-usefull","useless"],["non-virutal","non-virtual"],["nonbloking","non-blocking"],["noncombatents","noncombatants"],["noncontigous","non-contiguous"],["nonesense","nonsense"],["nonesensical","nonsensical"],["nonexistance","nonexistence"],["nonexistant","nonexistent"],["nonnegarive","nonnegative"],["nonneighboring","non-neighboring"],["nonsence","nonsense"],["nonsens","nonsense"],["nonseperable","non-separable"],["nonte","note"],["nontheless","nonetheless"],["noo","no"],["noone","no one"],["noralize","normalize"],["noralized","normalized"],["noramal","normal"],["noramalise","normalise"],["noramalised","normalised"],["noramalises","normalises"],["noramalising","normalising"],["noramalize","normalize"],["noramalized","normalized"],["noramalizes","normalizes"],["noramalizing","normalizing"],["noramals","normals"],["noraml","normal"],["norhern","northern"],["norifications","notifications"],["normailzation","normalization"],["normaized","normalized"],["normale","normal"],["normales","normals"],["normaly","normally"],["normalyl","normally"],["normalyly","normally"],["normalysed","normalised"],["normalyy","normally"],["normalyzation","normalization"],["normalyze","normalize"],["normalyzed","normalized"],["normlly","normally"],["normnal","normal"],["normol","normal"],["normolise","normalise"],["normolize","normalize"],["northen","northern"],["northereastern","northeastern"],["nortmally","normally"],["notabley","notably"],["notaion","notation"],["notaly","notably"],["notasion","notation"],["notatin","notation"],["noteable","notable"],["noteably","notably"],["noteboook","notebook"],["noteboooks","notebooks"],["noteriety","notoriety"],["notfication","notification"],["notfications","notifications"],["notfy","notify"],["noth","north"],["nothern","northern"],["nothign","nothing"],["nothigng","nothing"],["nothihg","nothing"],["nothin","nothing"],["nothind","nothing"],["nothink","nothing"],["noticable","noticeable"],["noticably","noticeably"],["notication","notification"],["notications","notifications"],["noticeing","noticing"],["noticiable","noticeable"],["noticible","noticeable"],["notifaction","notification"],["notifactions","notifications"],["notifcation","notification"],["notifcations","notifications"],["notifed","notified"],["notifer","notifier"],["notifes","notifies"],["notifiation","notification"],["notificaction","notification"],["notificaiton","notification"],["notificaitons","notifications"],["notificaton","notification"],["notificatons","notifications"],["notificiation","notification"],["notificiations","notifications"],["notifiy","notify"],["notifiying","notifying"],["notifycation","notification"],["notity","notify"],["notmalize","normalize"],["notmalized","normalized"],["notmutch","notmuch"],["notning","nothing"],["nott","not"],["nottaion","notation"],["nottaions","notations"],["notwhithstanding","notwithstanding"],["noveau","nouveau"],["novemeber","November"],["Novemer","November"],["Novermber","November"],["nowadys","nowadays"],["nowdays","nowadays"],["nowe","now"],["ntification","notification"],["nuber","number"],["nubering","numbering"],["nubmer","number"],["nubmers","numbers"],["nucular","nuclear"],["nuculear","nuclear"],["nuisanse","nuisance"],["nuissance","nuisance"],["nulk","null"],["Nullabour","Nullarbor"],["nulll","null"],["numbber","number"],["numbbered","numbered"],["numbbering","numbering"],["numbbers","numbers"],["numberal","numeral"],["numberals","numerals"],["numberic","numeric"],["numberous","numerous"],["numberr","number"],["numberred","numbered"],["numberring","numbering"],["numberrs","numbers"],["numberss","numbers"],["numbert","number"],["numbet","number"],["numbets","numbers"],["numbres","numbers"],["numearate","numerate"],["numearation","numeration"],["numeber","number"],["numebering","numbering"],["numebers","numbers"],["numebr","number"],["numebrs","numbers"],["numer","number"],["numeraotr","numerator"],["numerbering","numbering"],["numercial","numerical"],["numercially","numerically"],["numering","numbering"],["numers","numbers"],["nummber","number"],["nummbers","numbers"],["nummeric","numeric"],["numnber","number"],["numnbered","numbered"],["numnbering","numbering"],["numnbers","numbers"],["numner","number"],["numners","numbers"],["numver","number"],["numvers","numbers"],["nunber","number"],["nunbers","numbers"],["Nuremburg","Nuremberg"],["nusance","nuisance"],["nutritent","nutrient"],["nutritents","nutrients"],["nuturing","nurturing"],["nwe","new"],["nwo","now"],["o'caml","OCaml"],["oaram","param"],["obay","obey"],["obect","object"],["obediance","obedience"],["obediant","obedient"],["obejct","object"],["obejcted","objected"],["obejction","objection"],["obejctions","objections"],["obejctive","objective"],["obejctively","objectively"],["obejctives","objectives"],["obejcts","objects"],["obeject","object"],["obejection","objection"],["obejects","objects"],["oberflow","overflow"],["oberflowed","overflowed"],["oberflowing","overflowing"],["oberflows","overflows"],["oberv","observe"],["obervant","observant"],["obervation","observation"],["obervations","observations"],["oberve","observe"],["oberved","observed"],["oberver","observer"],["obervers","observers"],["oberves","observes"],["oberving","observing"],["obervs","observes"],["obeservation","observation"],["obeservations","observations"],["obeserve","observe"],["obeserved","observed"],["obeserver","observer"],["obeservers","observers"],["obeserves","observes"],["obeserving","observing"],["obession","obsession"],["obessions","obsessions"],["obgect","object"],["obgects","objects"],["obhect","object"],["obhectification","objectification"],["obhectifies","objectifies"],["obhectify","objectify"],["obhectifying","objectifying"],["obhecting","objecting"],["obhection","objection"],["obhects","objects"],["obious","obvious"],["obiously","obviously"],["obivous","obvious"],["obivously","obviously"],["objec","object"],["objecs","objects"],["objectss","objects"],["objejct","object"],["objekt","object"],["objet","object"],["objetc","object"],["objetcs","objects"],["objets","objects"],["objtain","obtain"],["objtained","obtained"],["objtains","obtains"],["objump","objdump"],["oblitque","oblique"],["obnject","object"],["obscur","obscure"],["obselete","obsolete"],["obseravtion","observation"],["obseravtions","observations"],["observ","observe"],["observered","observed"],["obsevrer","observer"],["obsevrers","observers"],["obsolate","obsolete"],["obsolesence","obsolescence"],["obsolite","obsolete"],["obsolited","obsoleted"],["obsolte","obsolete"],["obsolted","obsoleted"],["obssessed","obsessed"],["obstacal","obstacle"],["obstancles","obstacles"],["obstruced","obstructed"],["obsure","obscure"],["obtaiend","obtained"],["obtaiens","obtains"],["obtainig","obtaining"],["obtaion","obtain"],["obtaioned","obtained"],["obtaions","obtains"],["obtrain","obtain"],["obtrained","obtained"],["obtrains","obtains"],["obusing","abusing"],["obvioulsy","obviously"],["obvisious","obvious"],["obvisous","obvious"],["obvisously","obviously"],["obyect","object"],["obyekt","object"],["ocasion","occasion"],["ocasional","occasional"],["ocasionally","occasionally"],["ocasionaly","occasionally"],["ocasioned","occasioned"],["ocasions","occasions"],["ocassion","occasion"],["ocassional","occasional"],["ocassionally","occasionally"],["ocassionaly","occasionally"],["ocassioned","occasioned"],["ocassions","occasions"],["occaisionally","occasionally"],["occaison","occasion"],["occasinal","occasional"],["occasinally","occasionally"],["occasioanlly","occasionally"],["occasionaly","occasionally"],["occassion","occasion"],["occassional","occasional"],["occassionally","occasionally"],["occassionaly","occasionally"],["occassioned","occasioned"],["occassions","occasions"],["occational","occasional"],["occationally","occasionally"],["occcur","occur"],["occcured","occurred"],["occcurs","occurs"],["occour","occur"],["occoured","occurred"],["occouring","occurring"],["occourring","occurring"],["occours","occurs"],["occrrance","occurrence"],["occrrances","occurrences"],["occrred","occurred"],["occrring","occurring"],["occsionally","occasionally"],["occucence","occurrence"],["occucences","occurrences"],["occulusion","occlusion"],["occuped","occupied"],["occupided","occupied"],["occuracy","accuracy"],["occurance","occurrence"],["occurances","occurrences"],["occurately","accurately"],["occurded","occurred"],["occured","occurred"],["occurence","occurrence"],["occurences","occurrences"],["occures","occurs"],["occuring","occurring"],["occurr","occur"],["occurrance","occurrence"],["occurrances","occurrences"],["occurrencs","occurrences"],["occurrs","occurs"],["oclock","o'clock"],["ocntext","context"],["ocorrence","occurrence"],["ocorrences","occurrences"],["octect","octet"],["octects","octets"],["octohedra","octahedra"],["octohedral","octahedral"],["octohedron","octahedron"],["ocuntries","countries"],["ocuntry","country"],["ocupied","occupied"],["ocupies","occupies"],["ocupy","occupy"],["ocupying","occupying"],["ocur","occur"],["ocurr","occur"],["ocurrance","occurrence"],["ocurred","occurred"],["ocurrence","occurrence"],["ocurrences","occurrences"],["ocurring","occurring"],["ocurrred","occurred"],["ocurrs","occurs"],["odly","oddly"],["ody","body"],["oen","one"],["ofcource","of course"],["offcers","officers"],["offcial","official"],["offcially","officially"],["offcials","officials"],["offerd","offered"],["offereings","offerings"],["offest","offset"],["offests","offsets"],["offfence","offence"],["offfences","offences"],["offfense","offense"],["offfenses","offenses"],["offfset","offset"],["offfsets","offsets"],["offic","office"],["offical","official"],["offically","officially"],["officals","officials"],["officaly","officially"],["officeal","official"],["officeally","officially"],["officeals","officials"],["officealy","officially"],["officialy","officially"],["offloded","offloaded"],["offred","offered"],["offsence","offence"],["offsense","offense"],["offsenses","offenses"],["offser","offset"],["offseted","offsetted"],["offseting","offsetting"],["offsetp","offset"],["offsett","offset"],["offstets","offsets"],["offten","often"],["oficial","official"],["oficially","officially"],["ofmodule","of module"],["ofo","of"],["ofrom","from"],["ofsetted","offsetted"],["ofsset","offset"],["oftenly","often"],["ofthe","of the"],["oherwise","otherwise"],["ohter","other"],["ohters","others"],["ohterwise","otherwise"],["oigin","origin"],["oiginal","original"],["oiginally","originally"],["oiginals","originals"],["oiginating","originating"],["oigins","origins"],["ois","is"],["ojbect","object"],["oje","one"],["oject","object"],["ojection","objection"],["ojective","objective"],["ojects","objects"],["ojekts","objects"],["okat","okay"],["oldes","oldest"],["olny","only"],["olt","old"],["olther","other"],["oly","only"],["omision","omission"],["omited","omitted"],["omiting","omitting"],["omitt","omit"],["omlette","omelette"],["ommision","omission"],["ommission","omission"],["ommit","omit"],["ommited","omitted"],["ommiting","omitting"],["ommits","omits"],["ommitted","omitted"],["ommitting","omitting"],["omniverous","omnivorous"],["omniverously","omnivorously"],["omplementaion","implementation"],["omplementation","implementation"],["omre","more"],["onchage","onchange"],["ond","one"],["one-dimenional","one-dimensional"],["one-dimenionsal","one-dimensional"],["onece","once"],["onedimenional","one-dimensional"],["onedimenionsal","one-dimensional"],["oneliners","one-liners"],["oneyway","oneway"],["ongly","only"],["onl","only"],["onliene","online"],["onlly","only"],["onlye","only"],["onlyonce","only once"],["onoly","only"],["onother","another"],["ons","owns"],["onself","oneself"],["ontain","contain"],["ontained","contained"],["ontainer","container"],["ontainers","containers"],["ontainging","containing"],["ontaining","containing"],["ontainor","container"],["ontainors","containers"],["ontains","contains"],["ontext","context"],["onthe","on the"],["ontop","on top"],["ontrolled","controlled"],["onw","own"],["onwed","owned"],["onwer","owner"],["onwership","ownership"],["onwing","owning"],["onws","owns"],["onyl","only"],["oommits","commits"],["ooutput","output"],["ooutputs","outputs"],["opactity","opacity"],["opactiy","opacity"],["opacy","opacity"],["opague","opaque"],["opatque","opaque"],["opbject","object"],["opbjective","objective"],["opbjects","objects"],["opeaaration","operation"],["opeaarations","operations"],["opeabcration","operation"],["opeabcrations","operations"],["opearand","operand"],["opearands","operands"],["opearate","operate"],["opearates","operates"],["opearating","operating"],["opearation","operation"],["opearations","operations"],["opearatios","operations"],["opearator","operator"],["opearators","operators"],["opearion","operation"],["opearions","operations"],["opearios","operations"],["opeariton","operation"],["opearitons","operations"],["opearitos","operations"],["opearnd","operand"],["opearnds","operands"],["opearor","operator"],["opearors","operators"],["opearte","operate"],["opearted","operated"],["opeartes","operates"],["opearting","operating"],["opeartion","operation"],["opeartions","operations"],["opeartios","operations"],["opeartor","operator"],["opeartors","operators"],["opeate","operate"],["opeates","operates"],["opeation","operation"],["opeational","operational"],["opeations","operations"],["opeatios","operations"],["opeator","operator"],["opeators","operators"],["opeatror","operator"],["opeatrors","operators"],["opeg","open"],["opeging","opening"],["opeing","opening"],["opeinging","opening"],["opeings","openings"],["opem","open"],["opemed","opened"],["opemess","openness"],["opeming","opening"],["opems","opens"],["openbrower","openbrowser"],["opended","opened"],["openeing","opening"],["openend","opened"],["openened","opened"],["openening","opening"],["openess","openness"],["openin","opening"],["openned","opened"],["openning","opening"],["operaand","operand"],["operaands","operands"],["operaion","operation"],["operaions","operations"],["operaiton","operation"],["operandes","operands"],["operaror","operator"],["operatation","operation"],["operatations","operations"],["operater","operator"],["operatings","operating"],["operatio","operation"],["operatione","operation"],["operatior","operator"],["operatng","operating"],["operato","operator"],["operaton","operation"],["operatons","operations"],["operattion","operation"],["operattions","operations"],["opereation","operation"],["opertaion","operation"],["opertaions","operations"],["opertion","operation"],["opertional","operational"],["opertions","operations"],["opertor","operator"],["opertors","operators"],["opetional","optional"],["ophan","orphan"],["ophtalmology","ophthalmology"],["opion","option"],["opionally","optionally"],["opions","options"],["opitionally","optionally"],["opiton","option"],["opitons","options"],["opject","object"],["opjected","objected"],["opjecteing","objecting"],["opjectification","objectification"],["opjectifications","objectifications"],["opjectified","objectified"],["opjecting","objecting"],["opjection","objection"],["opjections","objections"],["opjective","objective"],["opjectively","objectively"],["opjects","objects"],["opne","open"],["opned","opened"],["opnegroup","opengroup"],["opnssl","openssl"],["oponent","opponent"],["oportunity","opportunity"],["opose","oppose"],["oposed","opposed"],["oposite","opposite"],["oposition","opposition"],["oppenly","openly"],["opperate","operate"],["opperated","operated"],["opperates","operates"],["opperation","operation"],["opperational","operational"],["opperations","operations"],["oppertunist","opportunist"],["oppertunities","opportunities"],["oppertunity","opportunity"],["oppinion","opinion"],["oppinions","opinions"],["opponant","opponent"],["oppononent","opponent"],["opportunisticly","opportunistically"],["opportunistly","opportunistically"],["opportunties","opportunities"],["oppositition","opposition"],["oppossed","opposed"],["opprotunity","opportunity"],["opproximate","approximate"],["opps","oops"],["oppsofite","opposite"],["oppurtunity","opportunity"],["opration","operation"],["oprations","operations"],["opreating","operating"],["opreation","operation"],["opreations","operations"],["opression","oppression"],["opressive","oppressive"],["oprimization","optimization"],["oprimizations","optimizations"],["oprimize","optimize"],["oprimized","optimized"],["oprimizes","optimizes"],["optain","obtain"],["optained","obtained"],["optains","obtains"],["optaionl","optional"],["optening","opening"],["optet","opted"],["opthalmic","ophthalmic"],["opthalmologist","ophthalmologist"],["opthalmology","ophthalmology"],["opthamologist","ophthalmologist"],["optiional","optional"],["optimasation","optimization"],["optimazation","optimization"],["optimial","optimal"],["optimiality","optimality"],["optimisim","optimism"],["optimisitc","optimistic"],["optimisitic","optimistic"],["optimissm","optimism"],["optimitation","optimization"],["optimizaing","optimizing"],["optimizaton","optimization"],["optimizier","optimizer"],["optimiztion","optimization"],["optimiztions","optimizations"],["optimsitic","optimistic"],["optimyze","optimize"],["optimze","optimize"],["optimzie","optimize"],["optin","option"],["optinal","optional"],["optinally","optionally"],["optins","options"],["optio","option"],["optioanl","optional"],["optioin","option"],["optioinal","optional"],["optioins","options"],["optionalliy","optionally"],["optionallly","optionally"],["optionaly","optionally"],["optionel","optional"],["optiones","options"],["optionial","optional"],["optionn","option"],["optionnal","optional"],["optionnally","optionally"],["optionnaly","optionally"],["optionss","options"],["optios","options"],["optismied","optimised"],["optizmied","optimized"],["optmisation","optimisation"],["optmisations","optimisations"],["optmization","optimization"],["optmizations","optimizations"],["optmize","optimize"],["optmized","optimized"],["optoin","option"],["optoins","options"],["optomism","optimism"],["opton","option"],["optonal","optional"],["optonally","optionally"],["optons","options"],["opyion","option"],["opyions","options"],["orcale","oracle"],["orded","ordered"],["orderd","ordered"],["ordert","ordered"],["ording","ordering"],["ordner","order"],["orede","order"],["oredes","orders"],["oreding","ordering"],["oredred","ordered"],["orgamise","organise"],["organim","organism"],["organisaion","organisation"],["organisaions","organisations"],["organistion","organisation"],["organistions","organisations"],["organizaion","organization"],["organizaions","organizations"],["organiztion","organization"],["organiztions","organizations"],["organsiation","organisation"],["organsiations","organisations"],["organsied","organised"],["organsier","organiser"],["organsiers","organisers"],["organsies","organises"],["organsiing","organising"],["organziation","organization"],["organziations","organizations"],["organzied","organized"],["organzier","organizer"],["organziers","organizers"],["organzies","organizes"],["organziing","organizing"],["orgiginal","original"],["orgiginally","originally"],["orgiginals","originals"],["orginal","original"],["orginally","originally"],["orginals","originals"],["orginate","originate"],["orginated","originated"],["orginates","originates"],["orginating","originating"],["orginial","original"],["orginially","originally"],["orginials","originals"],["orginiate","originate"],["orginiated","originated"],["orginiates","originates"],["orgininal","original"],["orgininals","originals"],["orginisation","organisation"],["orginisations","organisations"],["orginised","organised"],["orginization","organization"],["orginizations","organizations"],["orginized","organized"],["orginx","originx"],["orginy","originy"],["orhpan","orphan"],["oriant","orient"],["oriantate","orientate"],["oriantated","orientated"],["oriantation","orientation"],["oridinarily","ordinarily"],["orieation","orientation"],["orieations","orientations"],["orienatate","orientate"],["orienatated","orientated"],["orienatation","orientation"],["orienation","orientation"],["orientaion","orientation"],["orientatied","orientated"],["oriente","oriented"],["orientiation","orientation"],["orientied","oriented"],["orientned","oriented"],["orietation","orientation"],["orietations","orientations"],["origanaly","originally"],["origial","original"],["origially","originally"],["origianal","original"],["origianally","originally"],["origianaly","originally"],["origianl","original"],["origianls","originals"],["origigin","origin"],["origiginal","original"],["origiginally","originally"],["origiginals","originals"],["originaly","originally"],["originial","original"],["originially","originally"],["originiated","originated"],["originiating","originating"],["origininal","original"],["origininate","originate"],["origininated","originated"],["origininates","originates"],["origininating","originating"],["origining","originating"],["originnally","originally"],["origion","origin"],["origional","original"],["origionally","originally"],["orign","origin"],["orignal","original"],["orignally","originally"],["orignate","originate"],["orignated","originated"],["orignates","originates"],["orignial","original"],["orignially","originally"],["origninal","original"],["oringal","original"],["oringally","originally"],["orpan","orphan"],["orpanage","orphanage"],["orpaned","orphaned"],["orpans","orphans"],["orriginal","original"],["orthagnal","orthogonal"],["orthagonal","orthogonal"],["orthagonalize","orthogonalize"],["orthoganal","orthogonal"],["orthoganalize","orthogonalize"],["orthognal","orthogonal"],["orthonormalizatin","orthonormalization"],["ortogonal","orthogonal"],["ortogonality","orthogonality"],["osbscure","obscure"],["osciallator","oscillator"],["oscilate","oscillate"],["oscilated","oscillated"],["oscilating","oscillating"],["oscilator","oscillator"],["oscilliscope","oscilloscope"],["oscilliscopes","oscilloscopes"],["osffset","offset"],["osffsets","offsets"],["osffsetting","offsetting"],["osicllations","oscillations"],["otain","obtain"],["otained","obtained"],["otains","obtains"],["otehr","other"],["otehrwice","otherwise"],["otehrwise","otherwise"],["otehrwize","otherwise"],["oterwice","otherwise"],["oterwise","otherwise"],["oterwize","otherwise"],["othe","other"],["othere","other"],["otherewise","otherwise"],["otherise","otherwise"],["otheriwse","otherwise"],["otherwaise","otherwise"],["otherways","otherwise"],["otherweis","otherwise"],["otherweise","otherwise"],["otherwhere","elsewhere"],["otherwhile","otherwise"],["otherwhise","otherwise"],["otherwice","otherwise"],["otherwide","otherwise"],["otherwis","otherwise"],["otherwize","otherwise"],["otherwordly","otherworldly"],["otherwose","otherwise"],["otherwrite","overwrite"],["otherws","otherwise"],["otherwse","otherwise"],["otherwsie","otherwise"],["otherwsise","otherwise"],["otherwuise","otherwise"],["otherwwise","otherwise"],["otherwyse","otherwise"],["othewice","otherwise"],["othewise","otherwise"],["othewize","otherwise"],["otho","otoh"],["othographic","orthographic"],["othwerise","otherwise"],["othwerwise","otherwise"],["othwhise","otherwise"],["otification","notification"],["otiginal","original"],["otion","option"],["otionally","optionally"],["otions","options"],["otpion","option"],["otpions","options"],["otput","output"],["otu","out"],["oublisher","publisher"],["ouer","outer"],["ouevre","oeuvre"],["oultinenodes","outlinenodes"],["oultiner","outliner"],["oultline","outline"],["oultlines","outlines"],["ountline","outline"],["ouptut","output"],["ouptuted","outputted"],["ouptuting","outputting"],["ouptuts","outputs"],["ouput","output"],["ouputarea","outputarea"],["ouputs","outputs"],["ouputted","outputted"],["ouputting","outputting"],["ourselfes","ourselves"],["ourselfs","ourselves"],["ourselvs","ourselves"],["ouside","outside"],["oustanding","outstanding"],["oustide","outside"],["outbut","output"],["outbuts","outputs"],["outgoign","outgoing"],["outisde","outside"],["outllook","outlook"],["outoign","outgoing"],["outout","output"],["outperfoem","outperform"],["outperfoeming","outperforming"],["outperfom","outperform"],["outperfome","outperform"],["outperfomeing","outperforming"],["outperfoming","outperforming"],["outperfomr","outperform"],["outperfomring","outperforming"],["outpout","output"],["outpouts","outputs"],["outpupt","output"],["outpusts","outputs"],["outputed","outputted"],["outputing","outputting"],["outselves","ourselves"],["outsid","outside"],["outter","outer"],["outtermost","outermost"],["outupt","output"],["outupts","outputs"],["outuput","output"],["outut","output"],["oututs","outputs"],["outweight","outweigh"],["outweights","outweighs"],["ouur","our"],["ouurs","ours"],["oveerun","overrun"],["oveflow","overflow"],["oveflowed","overflowed"],["oveflowing","overflowing"],["oveflows","overflows"],["ovelap","overlap"],["ovelapping","overlapping"],["over-engeneer","over-engineer"],["over-engeneering","over-engineering"],["overaall","overall"],["overal","overall"],["overcompansate","overcompensate"],["overcompansated","overcompensated"],["overcompansates","overcompensates"],["overcompansating","overcompensating"],["overcompansation","overcompensation"],["overcompansations","overcompensations"],["overengeneer","overengineer"],["overengeneering","overengineering"],["overfl","overflow"],["overfow","overflow"],["overfowed","overflowed"],["overfowing","overflowing"],["overfows","overflows"],["overhread","overhead"],["overiddden","overridden"],["overidden","overridden"],["overide","override"],["overiden","overridden"],["overides","overrides"],["overiding","overriding"],["overlaped","overlapped"],["overlaping","overlapping"],["overlapp","overlap"],["overlayed","overlaid"],["overlflow","overflow"],["overlflowed","overflowed"],["overlflowing","overflowing"],["overlflows","overflows"],["overlfow","overflow"],["overlfowed","overflowed"],["overlfowing","overflowing"],["overlfows","overflows"],["overlodaded","overloaded"],["overloded","overloaded"],["overlodes","overloads"],["overlow","overflow"],["overlowing","overflowing"],["overlows","overflows"],["overreidden","overridden"],["overreide","override"],["overreides","overrides"],["overriabled","overridable"],["overriddable","overridable"],["overriddden","overridden"],["overriddes","overrides"],["overridding","overriding"],["overrideable","overridable"],["overriden","overridden"],["overrident","overridden"],["overridiing","overriding"],["overrids","overrides"],["overrriddden","overridden"],["overrridden","overridden"],["overrride","override"],["overrriden","overridden"],["overrrides","overrides"],["overrriding","overriding"],["overrrun","overrun"],["overshaddowed","overshadowed"],["oversubcribe","oversubscribe"],["oversubcribed","oversubscribed"],["oversubcribes","oversubscribes"],["oversubcribing","oversubscribing"],["oversubscibe","oversubscribe"],["oversubscibed","oversubscribed"],["oversubscirbe","oversubscribe"],["oversubscirbed","oversubscribed"],["overthere","over there"],["overun","overrun"],["overvise","otherwise"],["overvize","otherwise"],["overvride","override"],["overvrides","overrides"],["overvrite","overwrite"],["overvrites","overwrites"],["overwelm","overwhelm"],["overwelming","overwhelming"],["overwheliming","overwhelming"],["overwiew","overview"],["overwirte","overwrite"],["overwirting","overwriting"],["overwirtten","overwritten"],["overwise","otherwise"],["overwite","overwrite"],["overwites","overwrites"],["overwitten","overwritten"],["overwize","otherwise"],["overwride","overwrite"],["overwriteable","overwritable"],["overwriten","overwritten"],["overwritren","overwritten"],["overwrittes","overwrites"],["overwrittin","overwriting"],["overwritting","overwriting"],["ovewrite","overwrite"],["ovewrites","overwrites"],["ovewriting","overwriting"],["ovewritten","overwritten"],["ovewrote","overwrote"],["ovride","override"],["ovrides","overrides"],["ovrlapped","overlapped"],["ovrridable","overridable"],["ovrridables","overridables"],["ovrwrt","overwrite"],["ovservable","observable"],["ovservation","observation"],["ovserve","observe"],["ovveride","override"],["ovverridden","overridden"],["ovverride","override"],["ovverrides","overrides"],["ovverriding","overriding"],["owener","owner"],["owerflow","overflow"],["owerflowed","overflowed"],["owerflowing","overflowing"],["owerflows","overflows"],["owership","ownership"],["owervrite","overwrite"],["owervrites","overwrites"],["owerwrite","overwrite"],["owerwrites","overwrites"],["owful","awful"],["ownder","owner"],["ownerhsip","ownership"],["ownner","owner"],["ownward","onward"],["ownwer","owner"],["ownwership","ownership"],["owrk","work"],["owudl","would"],["oxigen","oxygen"],["oximoron","oxymoron"],["oxzillary","auxiliary"],["oyu","you"],["p0enis","penis"],["paackage","package"],["pacakge","package"],["pacakges","packages"],["pacakging","packaging"],["paceholder","placeholder"],["pachage","package"],["paches","patches"],["pacht","patch"],["pachtches","patches"],["pachtes","patches"],["pacjage","package"],["pacjages","packages"],["packacge","package"],["packaeg","package"],["packaege","package"],["packaeges","packages"],["packaegs","packages"],["packag","package"],["packags","packages"],["packaing","packaging"],["packats","packets"],["packege","package"],["packge","package"],["packged","packaged"],["packgement","packaging"],["packges'","packages'"],["packges","packages"],["packgs","packages"],["packhage","package"],["packhages","packages"],["packtes","packets"],["pactch","patch"],["pactched","patched"],["pactches","patches"],["padam","param"],["padds","pads"],["pading","padding"],["paermission","permission"],["paermissions","permissions"],["paeth","path"],["pagagraph","paragraph"],["pahses","phases"],["paide","paid"],["painiting","painting"],["paintile","painttile"],["paintin","painting"],["paitience","patience"],["paiting","painting"],["pakage","package"],["pakageimpl","packageimpl"],["pakages","packages"],["pakcage","package"],["paket","packet"],["pakge","package"],["pakvage","package"],["palatte","palette"],["paleolitic","paleolithic"],["palete","palette"],["paliamentarian","parliamentarian"],["Palistian","Palestinian"],["Palistinian","Palestinian"],["Palistinians","Palestinians"],["pallete","palette"],["pallette","palette"],["palletted","paletted"],["paltette","palette"],["paltform","platform"],["pamflet","pamphlet"],["pamplet","pamphlet"],["paniced","panicked"],["panicing","panicking"],["pannel","panel"],["pannels","panels"],["pantomine","pantomime"],["paoition","position"],["paor","pair"],["Papanicalou","Papanicolaou"],["paradime","paradigm"],["paradym","paradigm"],["paraemeter","parameter"],["paraemeters","parameters"],["paraeters","parameters"],["parafanalia","paraphernalia"],["paragaph","paragraph"],["paragaraph","paragraph"],["paragarapha","paragraph"],["paragarph","paragraph"],["paragarphs","paragraphs"],["paragph","paragraph"],["paragpraph","paragraph"],["paragraphy","paragraph"],["paragrphs","paragraphs"],["parahaps","perhaps"],["paralel","parallel"],["paralelising","parallelising"],["paralelism","parallelism"],["paralelizing","parallelizing"],["paralell","parallel"],["paralelle","parallel"],["paralellism","parallelism"],["paralellization","parallelization"],["paralelly","parallelly"],["paralely","parallelly"],["paralle","parallel"],["parallell","parallel"],["parallely","parallelly"],["paralles","parallels"],["parallization","parallelization"],["parallize","parallelize"],["parallized","parallelized"],["parallizes","parallelizes"],["parallizing","parallelizing"],["paralllel","parallel"],["paralllels","parallels"],["paramameter","parameter"],["paramameters","parameters"],["paramater","parameter"],["paramaters","parameters"],["paramemeter","parameter"],["paramemeters","parameters"],["paramemter","parameter"],["paramemters","parameters"],["paramenet","parameter"],["paramenets","parameters"],["paramenter","parameter"],["paramenters","parameters"],["paramer","parameter"],["paramert","parameter"],["paramerters","parameters"],["paramerts","parameters"],["paramete","parameter"],["parameteras","parameters"],["parameteres","parameters"],["parameterical","parametrical"],["parameterts","parameters"],["parametes","parameters"],["parametised","parametrised"],["parametr","parameter"],["parametre","parameter"],["parametreless","parameterless"],["parametres","parameters"],["parametrs","parameters"],["parametter","parameter"],["parametters","parameters"],["paramss","params"],["paramter","parameter"],["paramterer","parameter"],["paramterers","parameters"],["paramteres","parameters"],["paramterize","parameterize"],["paramterless","parameterless"],["paramters","parameters"],["paramtrical","parametrical"],["parana","piranha"],["paraniac","paranoiac"],["paranoya","paranoia"],["parant","parent"],["parantheses","parentheses"],["paranthesis","parenthesis"],["parants","parents"],["paraphanalia","paraphernalia"],["paraphenalia","paraphernalia"],["pararagraph","paragraph"],["pararaph","paragraph"],["parareter","parameter"],["parargaph","paragraph"],["parargaphs","paragraphs"],["pararmeter","parameter"],["pararmeters","parameters"],["parastic","parasitic"],["parastics","parasitics"],["paratheses","parentheses"],["paratmers","parameters"],["paravirutalisation","paravirtualisation"],["paravirutalise","paravirtualise"],["paravirutalised","paravirtualised"],["paravirutalization","paravirtualization"],["paravirutalize","paravirtualize"],["paravirutalized","paravirtualized"],["parctical","practical"],["parctically","practically"],["pard","part"],["parellelogram","parallelogram"],["parellels","parallels"],["parem","param"],["paremeter","parameter"],["paremeters","parameters"],["paremter","parameter"],["paremters","parameters"],["parenthese","parentheses"],["parenthesed","parenthesized"],["parenthesies","parentheses"],["parenthises","parentheses"],["parenthsis","parenthesis"],["parge","large"],["parial","partial"],["parially","partially"],["paricular","particular"],["paricularly","particularly"],["parisitic","parasitic"],["paritally","partially"],["paritals","partials"],["paritial","partial"],["parition","partition"],["paritioning","partitioning"],["paritions","partitions"],["paritition","partition"],["parititioned","partitioned"],["parititioner","partitioner"],["parititiones","partitions"],["parititioning","partitioning"],["parititions","partitions"],["paritiy","parity"],["parituclar","particular"],["parliment","parliament"],["parmaeter","parameter"],["parmaeters","parameters"],["parmameter","parameter"],["parmameters","parameters"],["parmaters","parameters"],["parmeter","parameter"],["parmeters","parameters"],["parmter","parameter"],["parmters","parameters"],["parnoia","paranoia"],["parnter","partner"],["parntered","partnered"],["parntering","partnering"],["parnters","partners"],["parntership","partnership"],["parnterships","partnerships"],["parrakeets","parakeets"],["parralel","parallel"],["parrallel","parallel"],["parrallell","parallel"],["parrallelly","parallelly"],["parrallely","parallelly"],["parrent","parent"],["parseing","parsing"],["parsering","parsing"],["parsin","parsing"],["parstree","parse tree"],["partaining","pertaining"],["partcular","particular"],["partcularity","particularity"],["partcularly","particularly"],["parth","path"],["partialy","partially"],["particalar","particular"],["particalarly","particularly"],["particale","particle"],["particales","particles"],["partically","partially"],["particals","particles"],["particaluar","particular"],["particaluarly","particularly"],["particalur","particular"],["particalurly","particularly"],["particant","participant"],["particaular","particular"],["particaularly","particularly"],["particaulr","particular"],["particaulrly","particularly"],["particlar","particular"],["particlars","particulars"],["particually","particularly"],["particualr","particular"],["particuar","particular"],["particuarly","particularly"],["particulaly","particularly"],["particularily","particularly"],["particulary","particularly"],["particuliar","particular"],["partifular","particular"],["partiiton","partition"],["partiitoned","partitioned"],["partiitoning","partitioning"],["partiitons","partitions"],["partioned","partitioned"],["partirion","partition"],["partirioned","partitioned"],["partirioning","partitioning"],["partirions","partitions"],["partision","partition"],["partisioned","partitioned"],["partisioning","partitioning"],["partisions","partitions"],["partitial","partial"],["partiticipant","participant"],["partiticipants","participants"],["partiticular","particular"],["partitinioning","partitioning"],["partitioing","partitioning"],["partitiones","partitions"],["partitionned","partitioned"],["partitionning","partitioning"],["partitionns","partitions"],["partitionss","partitions"],["partiton","partition"],["partitoned","partitioned"],["partitoning","partitioning"],["partitons","partitions"],["partiula","particular"],["partiular","particular"],["partiularly","particularly"],["partiulars","particulars"],["pasengers","passengers"],["paser","parser"],["pasesd","passed"],["pash","hash"],["pasitioning","positioning"],["pasive","passive"],["pasre","parse"],["pasred","parsed"],["pasres","parses"],["passerbys","passersby"],["passin","passing"],["passiv","passive"],["passowrd","password"],["passs","pass"],["passsed","passed"],["passsing","passing"],["passthrought","passthrough"],["passthruogh","passthrough"],["passtime","pastime"],["passtrough","passthrough"],["passwird","password"],["passwirds","passwords"],["passwrod","password"],["passwrods","passwords"],["pasteing","pasting"],["pasttime","pastime"],["pastural","pastoral"],["pasword","password"],["paswords","passwords"],["patameter","parameter"],["patameters","parameters"],["patcket","packet"],["patckets","packets"],["patern","pattern"],["paterns","patterns"],["pathalogical","pathological"],["pathame","pathname"],["pathames","pathnames"],["pathane","pathname"],["pathced","patched"],["pathes","paths"],["pathign","pathing"],["pathnme","pathname"],["patholgoical","pathological"],["patial","spatial"],["paticular","particular"],["paticularly","particularly"],["patition","partition"],["pattented","patented"],["pattersn","patterns"],["pavillion","pavilion"],["pavillions","pavilions"],["pa\xEDnt","paint"],["pblisher","publisher"],["pbulisher","publisher"],["peacd","peace"],["peacefuland","peaceful and"],["peacify","pacify"],["peageant","pageant"],["peaple","people"],["peaples","peoples"],["pecentage","percentage"],["pecularities","peculiarities"],["pecularity","peculiarity"],["peculure","peculiar"],["pedestrain","pedestrian"],["peding","pending"],["pedning","pending"],["pefer","prefer"],["peferable","preferable"],["peferably","preferably"],["pefered","preferred"],["peference","preference"],["peferences","preferences"],["peferential","preferential"],["peferentially","preferentially"],["peferred","preferred"],["peferring","preferring"],["pefers","prefers"],["peform","perform"],["peformance","performance"],["peformed","performed"],["peforming","performing"],["pege","page"],["pehaps","perhaps"],["peice","piece"],["peicemeal","piecemeal"],["peices","pieces"],["peirod","period"],["peirodical","periodical"],["peirodicals","periodicals"],["peirods","periods"],["penalities","penalties"],["penality","penalty"],["penatly","penalty"],["pendantic","pedantic"],["pendig","pending"],["pendning","pending"],["penerator","penetrator"],["penisula","peninsula"],["penisular","peninsular"],["pennal","panel"],["pennals","panels"],["penninsula","peninsula"],["penninsular","peninsular"],["pennisula","peninsula"],["Pennyslvania","Pennsylvania"],["pensinula","peninsula"],["pensle","pencil"],["penultimante","penultimate"],["peom","poem"],["peoms","poems"],["peopel","people"],["peopels","peoples"],["peopl","people"],["peotry","poetry"],["pepare","prepare"],["peprocessor","preprocessor"],["per-interpeter","per-interpreter"],["perade","parade"],["peraphs","perhaps"],["percentange","percentage"],["percentanges","percentages"],["percentil","percentile"],["percepted","perceived"],["percetage","percentage"],["percetages","percentages"],["percievable","perceivable"],["percievabley","perceivably"],["percievably","perceivably"],["percieve","perceive"],["percieved","perceived"],["percise","precise"],["percisely","precisely"],["percision","precision"],["perenially","perennially"],["peretrator","perpetrator"],["perfec","perfect"],["perfecct","perfect"],["perfecctly","perfectly"],["perfeclty","perfectly"],["perfecly","perfectly"],["perfectably","perfectly"],["perfer","prefer"],["perferable","preferable"],["perferably","preferably"],["perferance","preference"],["perferances","preferences"],["perferct","perfect"],["perferctly","perfectly"],["perferect","perfect"],["perferectly","perfectly"],["perfered","preferred"],["perference","preference"],["perferences","preferences"],["perferm","perform"],["perfermance","performance"],["perfermances","performances"],["perfermence","performance"],["perfermences","performances"],["perferr","prefer"],["perferrable","preferable"],["perferrably","preferably"],["perferrance","preference"],["perferrances","preferences"],["perferred","preferred"],["perferrence","preference"],["perferrences","preferences"],["perferrm","perform"],["perferrmance","performance"],["perferrmances","performances"],["perferrmence","performance"],["perferrmences","performances"],["perferrs","prefers"],["perfers","prefers"],["perfix","prefix"],["perfmormance","performance"],["perfoem","perform"],["perfoemamce","performance"],["perfoemamces","performances"],["perfoemance","performance"],["perfoemanse","performance"],["perfoemanses","performances"],["perfoemant","performant"],["perfoemative","performative"],["perfoemed","performed"],["perfoemer","performer"],["perfoemers","performers"],["perfoeming","performing"],["perfoemnace","performance"],["perfoemnaces","performances"],["perfoems","performs"],["perfom","perform"],["perfomamce","performance"],["perfomamces","performances"],["perfomance","performance"],["perfomanse","performance"],["perfomanses","performances"],["perfomant","performant"],["perfomative","performative"],["perfome","perform"],["perfomeamce","performance"],["perfomeamces","performances"],["perfomeance","performance"],["perfomeanse","performance"],["perfomeanses","performances"],["perfomeant","performant"],["perfomeative","performative"],["perfomed","performed"],["perfomeed","performed"],["perfomeer","performer"],["perfomeers","performers"],["perfomeing","performing"],["perfomenace","performance"],["perfomenaces","performances"],["perfomer","performer"],["perfomers","performers"],["perfomes","performs"],["perfoming","performing"],["perfomnace","performance"],["perfomnaces","performances"],["perfomr","perform"],["perfomramce","performance"],["perfomramces","performances"],["perfomrance","performance"],["perfomranse","performance"],["perfomranses","performances"],["perfomrant","performant"],["perfomrative","performative"],["perfomred","performed"],["perfomrer","performer"],["perfomrers","performers"],["perfomring","performing"],["perfomrnace","performance"],["perfomrnaces","performances"],["perfomrs","performs"],["perfoms","performs"],["perfor","perform"],["perforam","perform"],["perforamed","performed"],["perforaming","performing"],["perforamnce","performance"],["perforamnces","performances"],["perforams","performs"],["perford","performed"],["perforemd","performed"],["performace","performance"],["performaed","performed"],["performamce","performance"],["performane","performance"],["performence","performance"],["performnace","performance"],["perfors","performs"],["perfro","perform"],["perfrom","perform"],["perfromance","performance"],["perfromed","performed"],["perfroming","performing"],["perfroms","performs"],["perhabs","perhaps"],["perhas","perhaps"],["perhasp","perhaps"],["perheaps","perhaps"],["perhpas","perhaps"],["peridic","periodic"],["perihperal","peripheral"],["perihperals","peripherals"],["perimetre","perimeter"],["perimetres","perimeters"],["periode","period"],["periodicaly","periodically"],["periodioc","periodic"],["peripathetic","peripatetic"],["peripherial","peripheral"],["peripherials","peripherals"],["perisist","persist"],["perisisted","persisted"],["perisistent","persistent"],["peristent","persistent"],["perjery","perjury"],["perjorative","pejorative"],["perlciritc","perlcritic"],["permable","permeable"],["permament","permanent"],["permamently","permanently"],["permanant","permanent"],["permanantly","permanently"],["permanentely","permanently"],["permanenty","permanently"],["permantly","permanently"],["permenant","permanent"],["permenantly","permanently"],["permessioned","permissioned"],["permision","permission"],["permisions","permissions"],["permisison","permission"],["permisisons","permissions"],["permissable","permissible"],["permissiosn","permissions"],["permisson","permission"],["permissons","permissions"],["permisssion","permission"],["permisssions","permissions"],["permited","permitted"],["permition","permission"],["permitions","permissions"],["permmission","permission"],["permmissions","permissions"],["permormance","performance"],["permssion","permission"],["permssions","permissions"],["permuatate","permutate"],["permuatated","permutated"],["permuatates","permutates"],["permuatating","permutating"],["permuatation","permutation"],["permuatations","permutations"],["permuation","permutation"],["permuations","permutations"],["permutaion","permutation"],["permutaions","permutations"],["permution","permutation"],["permutions","permutations"],["peroendicular","perpendicular"],["perogative","prerogative"],["peroid","period"],["peroidic","periodic"],["peroidical","periodical"],["peroidically","periodically"],["peroidicals","periodicals"],["peroidicity","periodicity"],["peroids","periods"],["peronal","personal"],["peroperly","properly"],["perosnality","personality"],["perpandicular","perpendicular"],["perpandicularly","perpendicularly"],["perperties","properties"],["perpertrated","perpetrated"],["perperty","property"],["perphas","perhaps"],["perpindicular","perpendicular"],["perpsective","perspective"],["perpsectives","perspectives"],["perrror","perror"],["persan","person"],["persepctive","perspective"],["persepective","perspective"],["persepectives","perspectives"],["perserve","preserve"],["perserved","preserved"],["perserverance","perseverance"],["perservere","persevere"],["perservered","persevered"],["perserveres","perseveres"],["perservering","persevering"],["perserves","preserves"],["perserving","preserving"],["perseverence","perseverance"],["persisit","persist"],["persisited","persisted"],["persistance","persistence"],["persistant","persistent"],["persistantly","persistently"],["persisten","persistent"],["persistented","persisted"],["persited","persisted"],["persitent","persistent"],["personalitie","personality"],["personalitites","personalities"],["personalitity","personality"],["personalitys","personalities"],["personaly","personally"],["personell","personnel"],["personnal","personal"],["personnaly","personally"],["personnell","personnel"],["perspecitve","perspective"],["persuded","persuaded"],["persue","pursue"],["persued","pursued"],["persuing","pursuing"],["persuit","pursuit"],["persuits","pursuits"],["persumably","presumably"],["perticular","particular"],["perticularly","particularly"],["perticulars","particulars"],["pertrub","perturb"],["pertrubation","perturbation"],["pertrubations","perturbations"],["pertrubing","perturbing"],["pertub","perturb"],["pertubate","perturb"],["pertubated","perturbed"],["pertubates","perturbs"],["pertubation","perturbation"],["pertubations","perturbations"],["pertubing","perturbing"],["perturbate","perturb"],["perturbates","perturbs"],["pervious","previous"],["perviously","previously"],["pessiary","pessary"],["petetion","petition"],["pevent","prevent"],["pevents","prevents"],["pezier","bezier"],["phanthom","phantom"],["Pharoah","Pharaoh"],["phasepsace","phasespace"],["phasis","phases"],["phenomenom","phenomenon"],["phenomenonal","phenomenal"],["phenomenonly","phenomenally"],["phenomonenon","phenomenon"],["phenomonon","phenomenon"],["phenonmena","phenomena"],["pheriparials","peripherals"],["Philipines","Philippines"],["philisopher","philosopher"],["philisophical","philosophical"],["philisophy","philosophy"],["Phillipine","Philippine"],["phillipines","philippines"],["Phillippines","Philippines"],["phillosophically","philosophically"],["philospher","philosopher"],["philosphies","philosophies"],["philosphy","philosophy"],["phisical","physical"],["phisically","physically"],["phisicaly","physically"],["phisics","physics"],["phisosophy","philosophy"],["Phonecian","Phoenecian"],["phoneticly","phonetically"],["phongraph","phonograph"],["phote","photo"],["photografic","photographic"],["photografical","photographical"],["photografy","photography"],["photograpic","photographic"],["photograpical","photographical"],["phsical","physical"],["phsyically","physically"],["phtread","pthread"],["phtreads","pthreads"],["phyiscal","physical"],["phyiscally","physically"],["phyiscs","physics"],["phylosophical","philosophical"],["physcial","physical"],["physial","physical"],["physicaly","physically"],["physisist","physicist"],["phython","python"],["phyton","python"],["phy_interace","phy_interface"],["piblisher","publisher"],["pice","piece"],["picoseond","picosecond"],["picoseonds","picoseconds"],["piggypack","piggyback"],["piggypacked","piggybacked"],["pilgrimmage","pilgrimage"],["pilgrimmages","pilgrimages"],["pimxap","pixmap"],["pimxaps","pixmaps"],["pinapple","pineapple"],["pinnaple","pineapple"],["pinoneered","pioneered"],["piont","point"],["pionter","pointer"],["pionts","points"],["piority","priority"],["pipeine","pipeline"],["pipeines","pipelines"],["pipelien","pipeline"],["pipeliens","pipelines"],["pipelin","pipeline"],["pipelinining","pipelining"],["pipelins","pipelines"],["pipepline","pipeline"],["pipeplines","pipelines"],["pipiline","pipeline"],["pipilines","pipelines"],["pipleine","pipeline"],["pipleines","pipelines"],["pipleline","pipeline"],["piplelines","pipelines"],["pitty","pity"],["pivott","pivot"],["pivotting","pivoting"],["pixes","pixels"],["placeemnt","placement"],["placeemnts","placements"],["placehoder","placeholder"],["placeholde","placeholder"],["placeholdes","placeholders"],["placeholer","placeholder"],["placeholers","placeholders"],["placemenet","placement"],["placemenets","placements"],["placholder","placeholder"],["placholders","placeholders"],["placmenet","placement"],["placmenets","placements"],["plaform","platform"],["plaforms","platforms"],["plaftorm","platform"],["plaftorms","platforms"],["plagarism","plagiarism"],["plalform","platform"],["plalforms","platforms"],["planation","plantation"],["plantext","plaintext"],["plantiff","plaintiff"],["plasement","placement"],["plasements","placements"],["plateu","plateau"],["platfarm","platform"],["platfarms","platforms"],["platfform","platform"],["platfforms","platforms"],["platflorm","platform"],["platflorms","platforms"],["platfoem","platform"],["platfom","platform"],["platfomr","platform"],["platfomrs","platforms"],["platfoms","platforms"],["platform-spacific","platform-specific"],["platforma","platforms"],["platformt","platforms"],["platfrom","platform"],["platfroms","platforms"],["plathome","platform"],["platofmr","platform"],["platofmrs","platforms"],["platofms","platforms"],["platofmss","platforms"],["platoform","platform"],["platoforms","platforms"],["platofrm","platform"],["platofrms","platforms"],["plattform","platform"],["plattforms","platforms"],["plausability","plausibility"],["plausable","plausible"],["playble","playable"],["playge","plague"],["playgerise","plagiarise"],["playgerize","plagiarize"],["playgropund","playground"],["playist","playlist"],["playists","playlists"],["playright","playwright"],["playwrite","playwright"],["playwrites","playwrights"],["plcae","place"],["plcaebo","placebo"],["plcaed","placed"],["plcaeholder","placeholder"],["plcaeholders","placeholders"],["plcaement","placement"],["plcaements","placements"],["plcaes","places"],["pleaase","please"],["pleacing","placing"],["pleae","please"],["pleaee","please"],["pleaes","please"],["pleasd","pleased"],["pleasent","pleasant"],["pleasently","pleasantly"],["plebicite","plebiscite"],["plecing","placing"],["plent","plenty"],["plesae","please"],["plesant","pleasant"],["plese","please"],["plesently","pleasantly"],["pliars","pliers"],["pllatforms","platforms"],["ploted","plotted"],["ploting","plotting"],["ploynomial","polynomial"],["ploynomials","polynomials"],["pltform","platform"],["pltforms","platforms"],["plugable","pluggable"],["pluged","plugged"],["pluign","plugin"],["pluigns","plugins"],["pluse","pulse"],["plyotropy","pleiotropy"],["pobular","popular"],["pobularity","popularity"],["podule","module"],["poenis","penis"],["poential","potential"],["poentially","potentially"],["poentials","potentials"],["poeoples","peoples"],["poeple","people"],["poety","poetry"],["pogress","progress"],["poicies","policies"],["poicy","policy"],["poiint","point"],["poiints","points"],["poind","point"],["poindcloud","pointcloud"],["poiner","pointer"],["poing","point"],["poinits","points"],["poinnter","pointer"],["poins","points"],["pointeres","pointers"],["pointes","points"],["pointetr","pointer"],["pointetrs","pointers"],["pointeur","pointer"],["pointseta","poinsettia"],["pointss","points"],["pointzer","pointer"],["poinyent","poignant"],["poisin","poison"],["poisition","position"],["poisitioned","positioned"],["poisitioning","positioning"],["poisitionning","positioning"],["poisitions","positions"],["poistion","position"],["poistioned","positioned"],["poistioning","positioning"],["poistions","positions"],["poistive","positive"],["poistively","positively"],["poistives","positives"],["poistivly","positively"],["poit","point"],["poitd","pointed"],["poited","pointed"],["poiter","pointer"],["poiters","pointers"],["poiting","pointing"],["poitless","pointless"],["poitlessly","pointlessly"],["poitn","point"],["poitnd","pointed"],["poitned","pointed"],["poitner","pointer"],["poitnes","points"],["poitning","pointing"],["poitns","points"],["poits","points"],["poiunter","pointer"],["poject","project"],["pojecting","projecting"],["pojnt","point"],["pojrect","project"],["pojrected","projected"],["pojrecting","projecting"],["pojrection","projection"],["pojrections","projections"],["pojrector","projector"],["pojrectors","projectors"],["pojrects","projects"],["poket","pocket"],["polariy","polarity"],["polgon","polygon"],["polgons","polygons"],["polical","political"],["policiy","policy"],["poligon","polygon"],["poligons","polygons"],["polinator","pollinator"],["polinators","pollinators"],["politican","politician"],["politicans","politicians"],["politicing","politicking"],["pollenate","pollinate"],["polltry","poultry"],["polocies","policies"],["polocy","policy"],["polocys","policies"],["pologon","polygon"],["pologons","polygons"],["polotic","politic"],["polotical","political"],["polotics","politics"],["poltical","political"],["poltry","poultry"],["polute","pollute"],["poluted","polluted"],["polutes","pollutes"],["poluting","polluting"],["polution","pollution"],["polyar","polar"],["polyedral","polyhedral"],["polygond","polygons"],["polygone","polygon"],["polymorpic","polymorphic"],["polynomal","polynomial"],["polynomals","polynomials"],["polyphonyic","polyphonic"],["polypoygon","polypolygon"],["polypoylgons","polypolygons"],["polysaccaride","polysaccharide"],["polysaccharid","polysaccharide"],["pomegranite","pomegranate"],["pomotion","promotion"],["pompay","Pompeii"],["ponint","point"],["poninted","pointed"],["poninter","pointer"],["poninting","pointing"],["ponints","points"],["ponit","point"],["ponitd","pointed"],["ponited","pointed"],["poniter","pointer"],["poniters","pointers"],["ponits","points"],["pont","point"],["pontential","potential"],["ponter","pointer"],["ponting","pointing"],["ponts","points"],["pontuation","punctuation"],["pooint","point"],["poointed","pointed"],["poointer","pointer"],["pooints","points"],["poost","post"],["poperee","potpourri"],["poperties","properties"],["popoen","popen"],["popolate","populate"],["popolated","populated"],["popolates","populates"],["popolating","populating"],["poportional","proportional"],["popoulation","population"],["popoup","popup"],["poppup","popup"],["popularaty","popularity"],["populare","popular"],["populer","popular"],["popullate","populate"],["popullated","populated"],["popuplar","popular"],["popuplarity","popularity"],["popuplate","populate"],["popuplated","populated"],["popuplates","populates"],["popuplating","populating"],["popuplation","population"],["porbably","probably"],["porblem","problem"],["porblems","problems"],["porcess","process"],["porcessed","processed"],["porcesses","processes"],["porcessing","processing"],["porcessor","processor"],["porcessors","processors"],["porgram","program"],["porgrammeer","programmer"],["porgrammeers","programmers"],["porgramming","programming"],["porgrams","programs"],["poriferal","peripheral"],["porject","project"],["porjection","projection"],["porjects","projects"],["porotocol","protocol"],["porotocols","protocols"],["porperties","properties"],["porperty","property"],["porportion","proportion"],["porportional","proportional"],["porportionally","proportionally"],["porportioning","proportioning"],["porportions","proportions"],["porsalin","porcelain"],["porshan","portion"],["porshon","portion"],["portait","portrait"],["portaits","portraits"],["portayed","portrayed"],["portected","protected"],["portguese","Portuguese"],["portioon","portion"],["portraing","portraying"],["portugese","Portuguese"],["portuguease","Portuguese"],["portugues","Portuguese"],["porve","prove"],["porved","proved"],["porven","proven"],["porves","proves"],["porvide","provide"],["porvided","provided"],["porvider","provider"],["porvides","provides"],["porviding","providing"],["porvids","provides"],["porving","proving"],["posative","positive"],["posatives","positives"],["posativity","positivity"],["poseesions","possessions"],["posess","possess"],["posessed","possessed"],["posesses","possesses"],["posessing","possessing"],["posession","possession"],["posessions","possessions"],["posibilities","possibilities"],["posibility","possibility"],["posibilties","possibilities"],["posible","possible"],["posiblity","possibility"],["posibly","possibly"],["posiitive","positive"],["posiitives","positives"],["posiitivity","positivity"],["posisition","position"],["posisitioned","positioned"],["posistion","position"],["positionn","position"],["positionned","positioned"],["positionnes","positions"],["positionning","positioning"],["positionns","positions"],["positiv","positive"],["positivie","positive"],["positivies","positives"],["positivly","positively"],["positoin","position"],["positoined","positioned"],["positoins","positions"],["positonal","positional"],["positoned","positioned"],["positoning","positioning"],["positve","positive"],["positves","positives"],["POSIX-complient","POSIX-compliant"],["pospone","postpone"],["posponed","postponed"],["posption","position"],["possabilites","possibilities"],["possabilities","possibilities"],["possability","possibility"],["possabilties","possibilities"],["possabily","possibly"],["possable","possible"],["possably","possibly"],["possbily","possibly"],["possble","possible"],["possbly","possibly"],["posseses","possesses"],["possesing","possessing"],["possesion","possession"],["possesive","possessive"],["possessess","possesses"],["possiable","possible"],["possibbe","possible"],["possibe","possible"],["possibile","possible"],["possibilies","possibilities"],["possibilites","possibilities"],["possibilitities","possibilities"],["possibiliy","possibility"],["possibillity","possibility"],["possibilties","possibilities"],["possibilty","possibility"],["possibily","possibly"],["possibities","possibilities"],["possibity","possibility"],["possiblble","possible"],["possiblec","possible"],["possiblely","possibly"],["possiblility","possibility"],["possiblilty","possibility"],["possiblities","possibilities"],["possiblity","possibility"],["possiblly","possibly"],["possilbe","possible"],["possily","possibly"],["possition","position"],["possitive","positive"],["possitives","positives"],["possobily","possibly"],["possoble","possible"],["possobly","possibly"],["posssible","possible"],["post-morten","post-mortem"],["post-proces","post-process"],["post-procesing","post-processing"],["postcondtion","postcondition"],["postcondtions","postconditions"],["Postdam","Potsdam"],["postgress","PostgreSQL"],["postgressql","PostgreSQL"],["postgrsql","PostgreSQL"],["posthomous","posthumous"],["postiional","positional"],["postiive","positive"],["postincremend","postincrement"],["postion","position"],["postioned","positioned"],["postions","positions"],["postition","position"],["postitive","positive"],["postitives","positives"],["postive","positive"],["postives","positives"],["postmage","postimage"],["postphoned","postponed"],["postpocessing","postprocessing"],["postponinig","postponing"],["postprocesing","postprocessing"],["postscritp","postscript"],["postulat","postulate"],["postuminus","posthumous"],["postumus","posthumous"],["potatoe","potato"],["potatos","potatoes"],["potencial","potential"],["potencially","potentially"],["potencials","potentials"],["potenial","potential"],["potenially","potentially"],["potentail","potential"],["potentailly","potentially"],["potentails","potentials"],["potental","potential"],["potentally","potentially"],["potentatially","potentially"],["potententially","potentially"],["potentiallly","potentially"],["potentialy","potentially"],["potentiel","potential"],["potentiomenter","potentiometer"],["potition","position"],["potocol","protocol"],["potrait","portrait"],["potrayed","portrayed"],["poulations","populations"],["pount","point"],["pounts","points"],["poupular","popular"],["poverful","powerful"],["poweful","powerful"],["powerfull","powerful"],["powerppc","powerpc"],["pozitive","positive"],["pozitively","positively"],["pozitives","positives"],["ppcheck","cppcheck"],["ppeline","pipeline"],["ppelines","pipelines"],["ppolygons","polygons"],["ppublisher","publisher"],["ppyint","pyint"],["praameter","parameter"],["praameters","parameters"],["prabability","probability"],["prabable","probable"],["prabably","probably"],["pracitcal","practical"],["pracitcally","practically"],["practial","practical"],["practially","practically"],["practicaly","practically"],["practicioner","practitioner"],["practicioners","practitioners"],["practicly","practically"],["practictitioner","practitioner"],["practictitioners","practitioners"],["practicval","practical"],["practioner","practitioner"],["practioners","practitioners"],["praefix","prefix"],["pragam","pragma"],["pragmato","pragma to"],["prairy","prairie"],["pramater","parameter"],["prameter","parameter"],["prameters","parameters"],["prarameter","parameter"],["prarameters","parameters"],["prarie","prairie"],["praries","prairies"],["pratical","practical"],["pratically","practically"],["pratice","practice"],["prcess","process"],["prcesses","processes"],["prcessing","processing"],["prcoess","process"],["prcoessed","processed"],["prcoesses","processes"],["prcoessing","processing"],["prctiles","percentiles"],["prdpagate","propagate"],["prdpagated","propagated"],["prdpagates","propagates"],["prdpagating","propagating"],["prdpagation","propagation"],["prdpagations","propagations"],["prdpagator","propagator"],["prdpagators","propagators"],["pre-condifure","pre-configure"],["pre-condifured","pre-configured"],["pre-confifure","pre-configure"],["pre-confifured","pre-configured"],["pre-confure","pre-configure"],["pre-confured","pre-configured"],["pre-congifure","pre-configure"],["pre-congifured","pre-configured"],["pre-defiend","pre-defined"],["pre-defiened","pre-defined"],["pre-empt","preempt"],["pre-pended","prepended"],["pre-pre-realease","pre-pre-release"],["pre-proces","pre-process"],["pre-procesing","pre-processing"],["pre-realease","pre-release"],["pre-registeres","pre-registers"],["prealocate","preallocate"],["prealocated","preallocated"],["prealocates","preallocates"],["prealocating","preallocating"],["preambule","preamble"],["preamle","preamble"],["preample","preamble"],["preaorocessing","preprocessing"],["preapared","prepared"],["preapre","prepare"],["preaprooved","preapproved"],["prebious","previous"],["precacheed","precached"],["precceding","preceding"],["precding","preceding"],["preced","precede"],["precedencs","precedence"],["precedessor","predecessor"],["preceds","precedes"],["preceision","precision"],["precence","presence"],["precendance","precedence"],["precendances","precedences"],["precende","precedence"],["precendece","precedence"],["precendeces","precedences"],["precendence","precedence"],["precendences","precedences"],["precendencies","precedences"],["precendent","precedent"],["precendes","precedences"],["precending","preceding"],["precends","precedence"],["precenences","preferences"],["precense","presence"],["precentage","percentage"],["precentile","percentile"],["precentiles","percentiles"],["precessing","processing"],["precice","precise"],["precicion","precision"],["precidence","precedence"],["precisily","precisely"],["precisionn","precision"],["precisision","precision"],["precisly","precisely"],["precison","precision"],["precize","precise"],["precomuted","precomputed"],["preconditoner","preconditioner"],["preconditoners","preconditioners"],["precondtion","precondition"],["precondtioner","preconditioner"],["precondtioners","preconditioners"],["precondtionner","preconditioner"],["precondtionners","preconditioners"],["precondtions","preconditions"],["preconfiged","preconfigured"],["precsions","precisions"],["precuation","precaution"],["preculde","preclude"],["preculded","precluded"],["preculdes","precludes"],["precumputed","precomputed"],["precurser","precursor"],["precussion","percussion"],["precussions","percussions"],["predecesor","predecessor"],["predecesors","predecessors"],["predeclarnig","predeclaring"],["predefiend","predefined"],["predefiened","predefined"],["predefiined","predefined"],["predefineds","predefined"],["predessor","predecessor"],["predfined","predefined"],["predicat","predicate"],["predicatble","predictable"],["predicitons","predictions"],["predictible","predictable"],["predifined","predefined"],["predomiantly","predominately"],["preeceding","preceding"],["preemptable","preemptible"],["preesnt","present"],["prefectches","prefetches"],["prefecth","prefetch"],["prefectly","perfectly"],["prefence","preference"],["prefences","preferences"],["preferance","preference"],["preferances","preferences"],["preferecne","preference"],["preferecnes","preferences"],["prefered","preferred"],["preferencfe","preference"],["preferencfes","preferences"],["preferes","prefers"],["prefering","preferring"],["prefernce","preference"],["prefernces","preferences"],["prefernec","preference"],["preferr","prefer"],["preferrable","preferable"],["preferrably","preferably"],["preferrence","preference"],["preferrences","preferences"],["preferrred","preferred"],["prefetchs","prefetches"],["prefex","prefix"],["preffer","prefer"],["prefferable","preferable"],["prefferably","preferably"],["preffered","preferred"],["preffix","prefix"],["preffixed","prefixed"],["preffixes","prefixes"],["preffixing","prefixing"],["prefices","prefixes"],["preformance","performance"],["preformances","performances"],["pregancies","pregnancies"],["prehaps","perhaps"],["preiod","period"],["preivew","preview"],["preivous","previous"],["prejected","projected"],["prejection","projection"],["prejections","projections"],["preliferation","proliferation"],["prelimitary","preliminary"],["premeire","premiere"],["premeired","premiered"],["premillenial","premillennial"],["preminence","preeminence"],["premission","permission"],["premit","permit"],["premits","permits"],["Premonasterians","Premonstratensians"],["premption","preemption"],["premptive","preemptive"],["premptively","preemptively"],["preocess","process"],["preocupation","preoccupation"],["preoperty","property"],["prepair","prepare"],["prepaired","prepared"],["prepand","prepend"],["preparetion","preparation"],["preparetions","preparations"],["prepartion","preparation"],["prepartions","preparations"],["prepate","prepare"],["prepated","prepared"],["prepates","prepares"],["prepatory","preparatory"],["prependet","prepended"],["prepented","prepended"],["preperation","preparation"],["preperations","preparations"],["preponderence","preponderance"],["preppend","prepend"],["preppended","prepended"],["preppendet","prepended"],["preppented","prepended"],["preprend","prepend"],["preprended","prepended"],["prepresent","represent"],["prepresented","represented"],["prepresents","represents"],["preproces","preprocess"],["preprocesing","preprocessing"],["preprocesor","preprocessor"],["preprocesser","preprocessor"],["preprocessers","preprocessors"],["preprocesssing","preprocessing"],["prequisite","prerequisite"],["prequisites","prerequisites"],["prerequesite","prerequisite"],["prerequesites","prerequisites"],["prerequisit","prerequisite"],["prerequisities","prerequisites"],["prerequisits","prerequisites"],["prerequiste","prerequisite"],["prerequsite","prerequisite"],["prerequsites","prerequisites"],["preriod","period"],["preriodic","periodic"],["prersistent","persistent"],["presance","presence"],["prescripe","prescribe"],["prescriped","prescribed"],["prescrition","prescription"],["prescritions","prescriptions"],["presearvation","preservation"],["presearvations","preservations"],["presearve","preserve"],["presearved","preserved"],["presearver","preserver"],["presearves","preserves"],["presearving","preserving"],["presedential","presidential"],["presenece","presence"],["presener","presenter"],["presense","presence"],["presentaion","presentation"],["presentaional","presentational"],["presentaions","presentations"],["presernt","present"],["preserrved","preserved"],["preserv","preserve"],["presetation","presentation"],["preseve","preserve"],["preseved","preserved"],["preseverance","perseverance"],["preseverence","perseverance"],["preseves","preserves"],["preseving","preserving"],["presicion","precision"],["presidenital","presidential"],["presidental","presidential"],["presist","persist"],["presistable","persistable"],["presistance","persistence"],["presistant","persistent"],["presistantly","persistently"],["presisted","persisted"],["presistence","persistence"],["presistency","persistency"],["presistent","persistent"],["presistently","persistently"],["presisting","persisting"],["presistion","precision"],["presists","persists"],["presitgious","prestigious"],["presmissions","permissions"],["presntation","presentation"],["presntations","presentations"],["prespective","perspective"],["presreved","preserved"],["pressent","present"],["pressentation","presentation"],["pressented","presented"],["pressre","pressure"],["pressue","pressure"],["pressues","pressures"],["prestigeous","prestigious"],["prestigous","prestigious"],["presuambly","presumably"],["presumabely","presumably"],["presumaby","presumably"],["presumebly","presumably"],["presumely","presumably"],["presumibly","presumably"],["pretaining","pertaining"],["pretect","protect"],["pretected","protected"],["pretecting","protecting"],["pretection","protection"],["pretects","protects"],["pretendend","pretended"],["pretty-printter","pretty-printer"],["preveiw","preview"],["preveiwed","previewed"],["preveiwer","previewer"],["preveiwers","previewers"],["preveiws","previews"],["prevelance","prevalence"],["prevelant","prevalent"],["preven","prevent"],["prevend","prevent"],["preverse","perverse"],["preverses","preserves"],["preverve","preserve"],["prevew","preview"],["prevews","previews"],["previewd","previewed"],["previious","previous"],["previlege","privilege"],["previoous","previous"],["previos","previous"],["previosly","previously"],["previosu","previous"],["previosuly","previously"],["previou","previous"],["previouls","previous"],["previoulsy","previously"],["previouly","previously"],["previouse","previous"],["previousl","previously"],["previousy","previously"],["previsou","previous"],["previsouly","previously"],["previuous","previous"],["previus","previous"],["previvous","previous"],["prevoius","previous"],["prevous","previous"],["prevously","previously"],["prewview","preview"],["prexisting","preexisting"],["prexixed","prefixed"],["prfer","prefer"],["prferable","preferable"],["prferables","preferable"],["prference","preference"],["prferred","preferred"],["prgram","program"],["priave","private"],["pricipal","principal"],["priciple","principle"],["priciples","principles"],["pricision","precision"],["priestood","priesthood"],["primaray","primary"],["primarely","primarily"],["primarly","primarily"],["primative","primitive"],["primatively","primitively"],["primatives","primitives"],["primay","primary"],["primeter","perimeter"],["primitave","primitive"],["primitiv","primitive"],["primitve","primitive"],["primitves","primitives"],["primive","primitive"],["primordal","primordial"],["princeple","principle"],["princeples","principles"],["princible","principle"],["principaly","principality"],["principial","principal"],["principlaity","principality"],["principly","principally"],["princliple","principle"],["prind","print"],["prinicipal","principal"],["prining","printing"],["printting","printing"],["prioirties","priorities"],["prioirty","priority"],["prioritiy","priority"],["priorization","prioritization"],["priorizations","prioritizations"],["priorty","priority"],["priot","prior"],["priotise","prioritise"],["priotised","prioritised"],["priotising","prioritising"],["priotities","priorities"],["priotitize","prioritize"],["priotity","priority"],["priotized","prioritized"],["priotizing","prioritizing"],["priots","priors"],["prirority","priority"],["pris","prise"],["priting","printing"],["privalege","privilege"],["privaleges","privileges"],["privaye","private"],["privcy","privacy"],["privde","provide"],["priveledge","privilege"],["priveledged","privileged"],["priveledges","privileges"],["privelege","privilege"],["priveleged","privileged"],["priveleges","privileges"],["privelige","privilege"],["priveliged","privileged"],["priveliges","privileges"],["privelleges","privileges"],["priviate","private"],["privide","provide"],["privided","provided"],["privides","provides"],["prividing","providing"],["priview","preview"],["privilage","privilege"],["privilaged","privileged"],["privilages","privileges"],["priviledge","privilege"],["priviledged","privileged"],["priviledges","privileges"],["privilidge","privilege"],["privilidged","privileged"],["privilidges","privileges"],["privilige","privilege"],["priviliged","privileged"],["priviliges","privileges"],["privious","previous"],["priviously","previously"],["privision","provision"],["privisional","provisional"],["privisions","provisions"],["privledge","privilege"],["privleges","privileges"],["privte","private"],["prject","project"],["prjecting","projecting"],["prjection","projection"],["prjections","projections"],["prjects","projects"],["prmitive","primitive"],["prmitives","primitives"],["prmopting","prompting"],["proable","probable"],["proably","probably"],["probabalistic","probabilistic"],["probabaly","probably"],["probabilaty","probability"],["probabilisitic","probabilistic"],["probabilites","probabilities"],["probabilty","probability"],["probablay","probably"],["probablistic","probabilistic"],["probablities","probabilities"],["probablity","probability"],["probablly","probably"],["probaby","probably"],["probalby","probably"],["probalibity","probability"],["probaly","probably"],["probbably","probably"],["probbailities","probabilities"],["probbaility","probability"],["probbaly","probably"],["probbed","probed"],["probblem","problem"],["probblems","problems"],["probblez","problem"],["probblezs","problems"],["probbly","probably"],["probelm","problem"],["probelmatic","problematic"],["probelms","problems"],["probem","problem"],["proberly","properly"],["problably","probably"],["problaem","problem"],["problaems","problems"],["problamatic","problematic"],["probleme","problem"],["problemes","problems"],["problimatic","problematic"],["problme","problem"],["problmes","problems"],["probly","probably"],["procceed","proceed"],["proccesor","processor"],["proccesors","processors"],["proccess","process"],["proccessed","processed"],["proccesses","processes"],["proccessing","processing"],["proccessor","processor"],["proccessors","processors"],["procecure","procedure"],["procecures","procedures"],["procedger","procedure"],["procedings","proceedings"],["procedre","procedure"],["procedres","procedures"],["proceedes","proceeds"],["proceedure","procedure"],["proceedures","procedures"],["proceeed","proceed"],["proceeeded","proceeded"],["proceeeding","proceeding"],["proceeeds","proceeds"],["proceeedures","procedures"],["procees","process"],["proceesed","processed"],["proceesor","processor"],["procelain","porcelain"],["procelains","porcelains"],["procentual","percentual"],["proces","process"],["procesed","processed"],["proceses","processes"],["proceshandler","processhandler"],["procesing","processing"],["procesor","processor"],["processeed","processed"],["processees","processes"],["processer","processor"],["processess","processes"],["processessing","processing"],["processig","processing"],["processinf","processing"],["processore","processor"],["processpr","processor"],["processsed","processed"],["processses","processes"],["processsing","processing"],["processsors","processors"],["procesure","procedure"],["procesures","procedures"],["procide","provide"],["procided","provided"],["procides","provides"],["proclaimation","proclamation"],["proclamed","proclaimed"],["proclaming","proclaiming"],["proclomation","proclamation"],["procoess","process"],["procoessed","processed"],["procoessing","processing"],["proctect","protect"],["proctected","protected"],["proctecting","protecting"],["proctects","protects"],["procteted","protected"],["procude","produce"],["procuded","produced"],["prodceding","proceeding"],["prodecure","procedure"],["producable","producible"],["producables","producible"],["produciton","production"],["producitons","productions"],["producted","produced"],["productiviy","productivity"],["produkt","product"],["produse","produce"],["prodused","produced"],["produses","produces"],["proedural","procedural"],["proedure","procedure"],["proedures","procedures"],["proejct","project"],["proejcted","projected"],["proejcting","projecting"],["proejction","projection"],["proepr","proper"],["proeprly","properly"],["proeprties","properties"],["proeprty","property"],["proerties","properties"],["proessing","processing"],["profesional","professional"],["profesionally","professionally"],["profesionals","professionals"],["profesor","professor"],["professer","professor"],["proffesed","professed"],["proffesion","profession"],["proffesional","professional"],["proffesor","professor"],["proffessor","professor"],["profie","profile"],["profied","profiled"],["profier","profiler"],["profies","profiles"],["profilic","prolific"],["profirle","profile"],["profirled","profiled"],["profirler","profiler"],["profirles","profiles"],["profissional","professional"],["proflie","profile"],["proflier","profiler"],["proflies","profiles"],["profling","profiling"],["profund","profound"],["profundly","profoundly"],["progagate","propagate"],["progagated","propagated"],["progagates","propagates"],["progagating","propagating"],["progagation","propagation"],["progagations","propagations"],["progagator","propagator"],["progagators","propagators"],["progam","program"],["progamability","programmability"],["progamable","programmable"],["progamatic","programmatic"],["progamatically","programmatically"],["progamed","programmed"],["progamer","programmer"],["progamers","programmers"],["progaming","programming"],["progamm","program"],["progammability","programmability"],["progammable","programmable"],["progammatic","programmatic"],["progammatically","programmatically"],["progammed","programmed"],["progammer","programmer"],["progammers","programmers"],["progamming","programming"],["progamms","programs"],["progams","programs"],["progapate","propagate"],["progapated","propagated"],["progapates","propagates"],["progapating","propagating"],["progapation","propagation"],["progapations","propagations"],["progapator","propagator"],["progapators","propagators"],["progaramm","program"],["progarammability","programmability"],["progarammable","programmable"],["progarammatic","programmatic"],["progarammatically","programmatically"],["progarammed","programmed"],["progarammer","programmer"],["progarammers","programmers"],["progaramming","programming"],["progaramms","programs"],["progarm","program"],["progarmability","programmability"],["progarmable","programmable"],["progarmatic","programmatic"],["progarmatically","programmatically"],["progarmed","programmed"],["progarmer","programmer"],["progarmers","programmers"],["progarming","programming"],["progarms","programs"],["progate","propagate"],["progated","propagated"],["progates","propagates"],["progating","propagating"],["progation","propagation"],["progations","propagations"],["progess","progress"],["progessbar","progressbar"],["progessed","progressed"],["progesses","progresses"],["progessive","progressive"],["progessor","progressor"],["progesss","progress"],["progesssive","progressive"],["progidy","prodigy"],["programable","programmable"],["programatic","programmatic"],["programatically","programmatically"],["programattically","programmatically"],["programd","programmed"],["programemer","programmer"],["programemers","programmers"],["programers","programmers"],["programmaticaly","programmatically"],["programmend","programmed"],["programmetically","programmatically"],["programmical","programmatical"],["programmign","programming"],["programmming","programming"],["programms","programs"],["progreess","progress"],["progres","progress"],["progresively","progressively"],["progresss","progress"],["progrewss","progress"],["progrmae","program"],["progrss","progress"],["prohabition","prohibition"],["prohibitted","prohibited"],["prohibitting","prohibiting"],["prohibt","prohibit"],["prohibted","prohibited"],["prohibting","prohibiting"],["prohibts","prohibits"],["proirity","priority"],["projct's","project's"],["projct","project"],["projction","projection"],["projctions","projections"],["projctor","projector"],["projctors","projectors"],["projcts","projects"],["projectd","projected"],["projectio","projection"],["projecttion","projection"],["projet","project"],["projetction","projection"],["projeted","projected"],["projeting","projecting"],["projets","projects"],["prolbems","problems"],["prolem","problem"],["prolematic","problematic"],["prolems","problems"],["prologomena","prolegomena"],["prominance","prominence"],["prominant","prominent"],["prominantly","prominently"],["promis","promise"],["promiscous","promiscuous"],["promiss","promise"],["promissed","promised"],["promisses","promises"],["promissing","promising"],["promixity","proximity"],["prommpt","prompt"],["prommpts","prompts"],["promotted","promoted"],["promprted","prompted"],["promps","prompts"],["promt","prompt"],["promts","prompts"],["pronnounced","pronounced"],["pronomial","pronominal"],["prononciation","pronunciation"],["pronouce","pronounce"],["pronouced","pronounced"],["pronounched","pronounced"],["pronounciation","pronunciation"],["pronunce","pronounce"],["proocecure","procedure"],["proocecures","procedures"],["proocedure","procedure"],["proocedures","procedures"],["proocess","process"],["proocessed","processed"],["proocesses","processes"],["proocessing","processing"],["proocol","protocol"],["proocols","protocols"],["prooduce","produce"],["prooduced","produced"],["prooduces","produces"],["prooduct","product"],["prooerties","properties"],["prooerty","property"],["prool","pool"],["prooof","proof"],["prooper","proper"],["prooperly","properly"],["prooperties","properties"],["prooperty","property"],["proose","propose"],["proosed","proposed"],["prooses","proposes"],["proove","prove"],["prooved","proved"],["prooven","proven"],["prooves","proves"],["prooving","proving"],["proovread","proofread"],["prooxies","proxies"],["prooxy","proxy"],["propably","probably"],["propage","propagate"],["propatagion","propagation"],["propator","propagator"],["propators","propagators"],["propbably","probably"],["propely","properly"],["propeoperties","properties"],["propereties","properties"],["properety","property"],["properies","properties"],["properites","properties"],["properities","properties"],["properries","properties"],["properrt","property"],["properrys","properties"],["propert","property"],["properteis","properties"],["propertery","property"],["propertion","proportion"],["propertional","proportional"],["propertions","proportions"],["propertise","properties"],["propertu","property"],["propertus","properties"],["propertys","properties"],["propertyst","properties"],["propeties","properties"],["propetry","property"],["propetrys","properties"],["propety","property"],["propetys","properties"],["propgated","propagated"],["prophacy","prophecy"],["propietary","proprietary"],["propietries","proprietaries"],["propietry","proprietary"],["propigate","propagate"],["propigation","propagation"],["proplem","problem"],["propmt","prompt"],["propmted","prompted"],["propmter","prompter"],["propmts","prompts"],["propoagate","propagate"],["propoerties","properties"],["propoerty","property"],["propoganda","propaganda"],["propogate","propagate"],["propogated","propagated"],["propogates","propagates"],["propogating","propagating"],["propogation","propagation"],["proporpotion","proportion"],["proporpotional","proportional"],["proportianal","proportional"],["proporties","properties"],["proportinal","proportional"],["proporty","property"],["propostion","proposition"],["proppely","properly"],["propper","proper"],["propperly","properly"],["propperties","properties"],["propperty","property"],["proprely","properly"],["propreties","properties"],["proprety","property"],["proprietory","proprietary"],["proproable","probable"],["proproably","probably"],["proprocessed","preprocessed"],["proprogate","propagate"],["proprogated","propagated"],["proprogates","propagates"],["proprogating","propagating"],["proprogation","propagation"],["proprogations","propagations"],["proprogator","propagator"],["proprogators","propagators"],["proproties","properties"],["proprotion","proportion"],["proprotional","proportional"],["proprotionally","proportionally"],["proprotions","proportions"],["proprty","property"],["propt","prompt"],["propteries","properties"],["propterties","properties"],["propterty","property"],["propvider","provider"],["prority","priority"],["prorotype","prototype"],["proseletyzing","proselytizing"],["prosess","process"],["prosessor","processor"],["protable","portable"],["protaganist","protagonist"],["protaganists","protagonists"],["protcol","protocol"],["protcols","protocols"],["protcool","protocol"],["protcools","protocols"],["protcted","protected"],["protecion","protection"],["protectiv","protective"],["protedcted","protected"],["protential","potential"],["protext","protect"],["protocal","protocol"],["protocals","protocols"],["protocl","protocol"],["protocls","protocols"],["protoco","protocol"],["protocoll","protocol"],["protocolls","protocols"],["protocos","protocols"],["protoganist","protagonist"],["protoge","protege"],["protol","protocol"],["protols","protocols"],["prototyes","prototypes"],["protoype","prototype"],["protoyped","prototyped"],["protoypes","prototypes"],["protoyping","prototyping"],["protoytpe","prototype"],["protoytpes","prototypes"],["protrait","portrait"],["protraits","portraits"],["protrayed","portrayed"],["protruberance","protuberance"],["protruberances","protuberances"],["prouncements","pronouncements"],["provacative","provocative"],["provded","provided"],["provder","provider"],["provdided","provided"],["provdie","provide"],["provdied","provided"],["provdies","provides"],["provding","providing"],["provences","provinces"],["provicde","provide"],["provicded","provided"],["provicdes","provides"],["provicial","provincial"],["provideres","providers"],["providewd","provided"],["providfers","providers"],["provieded","provided"],["proviedes","provides"],["provinicial","provincial"],["provisioing","provisioning"],["provisiong","provisioning"],["provisionging","provisioning"],["provisiosn","provision"],["provisonal","provisional"],["provive","provide"],["provived","provided"],["provives","provides"],["proviving","providing"],["provode","provide"],["provoded","provided"],["provoder","provider"],["provodes","provides"],["provoding","providing"],["provods","provides"],["provsioning","provisioning"],["proximty","proximity"],["prozess","process"],["prpeparations","preparations"],["prpose","propose"],["prposed","proposed"],["prposer","proposer"],["prposers","proposers"],["prposes","proposes"],["prposiing","proposing"],["prrcision","precision"],["prrottypes","prototypes"],["prset","preset"],["prsets","presets"],["prtinf","printf"],["prufe","proof"],["prviate","private"],["psaswd","passwd"],["pseude","pseudo"],["pseudononymous","pseudonymous"],["pseudonyn","pseudonym"],["pseudopoential","pseudopotential"],["pseudopoentials","pseudopotentials"],["pseudorinverse","pseudoinverse"],["pseuo-palette","pseudo-palette"],["psitoin","position"],["psitoined","positioned"],["psitoins","positions"],["psot","post"],["psots","posts"],["psrameter","parameter"],["pssed","passed"],["pssibility","possibility"],["psudo","pseudo"],["psudoinverse","pseudoinverse"],["psuedo","pseudo"],["psuedo-fork","pseudo-fork"],["psuedoinverse","pseudoinverse"],["psuedolayer","pseudolayer"],["psuh","push"],["psychadelic","psychedelic"],["psycology","psychology"],["psyhic","psychic"],["ptd","pdf"],["ptherad","pthread"],["ptherads","pthreads"],["pthon","python"],["pthred","pthread"],["pthreds","pthreads"],["ptorions","portions"],["ptrss","press"],["pubilsh","publish"],["pubilshed","published"],["pubilsher","publisher"],["pubilshers","publishers"],["pubilshing","publishing"],["pubish","publish"],["pubished","published"],["pubisher","publisher"],["pubishers","publishers"],["pubishing","publishing"],["publcation","publication"],["publcise","publicise"],["publcize","publicize"],["publiaher","publisher"],["publically","publicly"],["publicaly","publicly"],["publiched","published"],["publicher","publisher"],["publichers","publishers"],["publiches","publishes"],["publiching","publishing"],["publihsed","published"],["publihser","publisher"],["publised","published"],["publisehd","published"],["publisehr","publisher"],["publisehrs","publishers"],["publiser","publisher"],["publisers","publishers"],["publisged","published"],["publisger","publisher"],["publisgers","publishers"],["publishd","published"],["publisheed","published"],["publisherr","publisher"],["publishher","publisher"],["publishor","publisher"],["publishr","publisher"],["publishre","publisher"],["publishrs","publishers"],["publissher","publisher"],["publlisher","publisher"],["publsh","publish"],["publshed","published"],["publsher","publisher"],["publshers","publishers"],["publshing","publishing"],["publsih","publish"],["publsihed","published"],["publsiher","publisher"],["publsihers","publishers"],["publsihes","publishes"],["publsihing","publishing"],["publuc","public"],["publucation","publication"],["publush","publish"],["publusher","publisher"],["publushers","publishers"],["publushes","publishes"],["publushing","publishing"],["puchasing","purchasing"],["Pucini","Puccini"],["Puertorrican","Puerto Rican"],["Puertorricans","Puerto Ricans"],["pulisher","publisher"],["pullrequest","pull request"],["pullrequests","pull requests"],["pumkin","pumpkin"],["punctation","punctuation"],["puplar","popular"],["puplarity","popularity"],["puplate","populate"],["puplated","populated"],["puplates","populates"],["puplating","populating"],["puplation","population"],["puplisher","publisher"],["pupose","purpose"],["puposes","purposes"],["pupulated","populated"],["purcahed","purchased"],["purcahse","purchase"],["purgest","purges"],["puritannical","puritanical"],["purposedly","purposely"],["purpotedly","purportedly"],["purpse","purpose"],["pursuade","persuade"],["pursuaded","persuaded"],["pursuades","persuades"],["pusehd","pushed"],["pususading","persuading"],["puting","putting"],["putpose","purpose"],["putposed","purposed"],["putposes","purposes"],["pwoer","power"],["pxoxied","proxied"],["pxoxies","proxies"],["pxoxy","proxy"],["pyhon","python"],["pyhsical","physical"],["pyhsically","physically"],["pyhsicals","physicals"],["pyhsicaly","physically"],["pyhthon","python"],["pyhton","python"],["pyramide","pyramid"],["pyramides","pyramids"],["pyrhon","python"],["pyscic","psychic"],["pythin","python"],["pythjon","python"],["pytnon","python"],["pytohn","python"],["pyton","python"],["pytyon","python"],["qest","quest"],["qests","quests"],["qeuest","quest"],["qeuests","quests"],["qeueue","queue"],["qeust","quest"],["qeusts","quests"],["qiest","quest"],["qiests","quests"],["qith","with"],["qoute","quote"],["qouted","quoted"],["qoutes","quotes"],["qouting","quoting"],["quadddec","quaddec"],["quadranle","quadrangle"],["quailified","qualified"],["qualfied","qualified"],["qualfy","qualify"],["qualifer","qualifier"],["qualitification","qualification"],["qualitifications","qualifications"],["quanitified","quantified"],["quantaties","quantities"],["quantaty","quantity"],["quantitites","quantities"],["quantititive","quantitative"],["quantitity","quantity"],["quantitiy","quantity"],["quarantaine","quarantine"],["quarentine","quarantine"],["quartenion","quaternion"],["quartenions","quaternions"],["quartically","quadratically"],["quatation","quotation"],["quater","quarter"],["quation","equation"],["quations","equations"],["quckstarter","quickstarter"],["qudrangles","quadrangles"],["quee","queue"],["Queenland","Queensland"],["queing","queueing"],["queiried","queried"],["queisce","quiesce"],["queriable","queryable"],["quering","querying"],["querries","queries"],["queryies","queries"],["queryinterace","queryinterface"],["querys","queries"],["queset","quest"],["quesets","quests"],["quesiton","question"],["quesitonable","questionable"],["quesitons","questions"],["quesr","quest"],["quesrs","quests"],["questionaire","questionnaire"],["questionnair","questionnaire"],["questoin","question"],["questoins","questions"],["questonable","questionable"],["queu","queue"],["queueud","queued"],["queus","queues"],["quew","queue"],["quickier","quicker"],["quicklyu","quickly"],["quickyl","quickly"],["quicly","quickly"],["quiessent","quiescent"],["quiests","quests"],["quikc","quick"],["quinessential","quintessential"],["quiting","quitting"],["quitt","quit"],["quitted","quit"],["quizes","quizzes"],["quotaion","quotation"],["quoteed","quoted"],["quottes","quotes"],["quried","queried"],["quroum","quorum"],["qust","quest"],["qusts","quests"],["rabinnical","rabbinical"],["racaus","raucous"],["ractise","practise"],["radation","radiation"],["radiactive","radioactive"],["radiaton","radiation"],["radify","ratify"],["radiobuttion","radiobutton"],["radis","radix"],["rady","ready"],["raed","read"],["raeding","reading"],["raeds","reads"],["raedy","ready"],["raelly","really"],["raisedd","raised"],["ralation","relation"],["randmom","random"],["randomally","randomly"],["raoming","roaming"],["raotat","rotate"],["raotate","rotate"],["raotated","rotated"],["raotates","rotates"],["raotating","rotating"],["raotation","rotation"],["raotations","rotations"],["raotats","rotates"],["raplace","replace"],["raplacing","replacing"],["rapresent","represent"],["rapresentation","representation"],["rapresented","represented"],["rapresenting","representing"],["rapresents","represents"],["rapsberry","raspberry"],["rarelly","rarely"],["rarified","rarefied"],["rasberry","raspberry"],["rasie","raise"],["rasied","raised"],["rasies","raises"],["rasiing","raising"],["rasing","raising"],["rasons","reasons"],["raspbery","raspberry"],["raspoberry","raspberry"],["rathar","rather"],["rathern","rather"],["rcall","recall"],["rceate","create"],["rceating","creating"],["rduce","reduce"],["re-attachement","re-attachment"],["re-defiend","re-defined"],["re-engeneer","re-engineer"],["re-engeneering","re-engineering"],["re-evaulated","re-evaluated"],["re-impliment","re-implement"],["re-implimenting","re-implementing"],["re-negatiotiable","re-negotiable"],["re-negatiotiate","re-negotiate"],["re-negatiotiated","re-negotiated"],["re-negatiotiates","re-negotiates"],["re-negatiotiating","re-negotiating"],["re-negatiotiation","re-negotiation"],["re-negatiotiations","re-negotiations"],["re-negatiotiator","re-negotiator"],["re-negatiotiators","re-negotiators"],["re-negoable","re-negotiable"],["re-negoate","re-negotiate"],["re-negoated","re-negotiated"],["re-negoates","re-negotiates"],["re-negoatiable","re-negotiable"],["re-negoatiate","re-negotiate"],["re-negoatiated","re-negotiated"],["re-negoatiates","re-negotiates"],["re-negoatiating","re-negotiating"],["re-negoatiation","re-negotiation"],["re-negoatiations","re-negotiations"],["re-negoatiator","re-negotiator"],["re-negoatiators","re-negotiators"],["re-negoating","re-negotiating"],["re-negoation","re-negotiation"],["re-negoations","re-negotiations"],["re-negoator","re-negotiator"],["re-negoators","re-negotiators"],["re-negociable","re-negotiable"],["re-negociate","re-negotiate"],["re-negociated","re-negotiated"],["re-negociates","re-negotiates"],["re-negociating","re-negotiating"],["re-negociation","re-negotiation"],["re-negociations","re-negotiations"],["re-negociator","re-negotiator"],["re-negociators","re-negotiators"],["re-negogtiable","re-negotiable"],["re-negogtiate","re-negotiate"],["re-negogtiated","re-negotiated"],["re-negogtiates","re-negotiates"],["re-negogtiating","re-negotiating"],["re-negogtiation","re-negotiation"],["re-negogtiations","re-negotiations"],["re-negogtiator","re-negotiator"],["re-negogtiators","re-negotiators"],["re-negoitable","re-negotiable"],["re-negoitate","re-negotiate"],["re-negoitated","re-negotiated"],["re-negoitates","re-negotiates"],["re-negoitating","re-negotiating"],["re-negoitation","re-negotiation"],["re-negoitations","re-negotiations"],["re-negoitator","re-negotiator"],["re-negoitators","re-negotiators"],["re-negoptionsotiable","re-negotiable"],["re-negoptionsotiate","re-negotiate"],["re-negoptionsotiated","re-negotiated"],["re-negoptionsotiates","re-negotiates"],["re-negoptionsotiating","re-negotiating"],["re-negoptionsotiation","re-negotiation"],["re-negoptionsotiations","re-negotiations"],["re-negoptionsotiator","re-negotiator"],["re-negoptionsotiators","re-negotiators"],["re-negosiable","re-negotiable"],["re-negosiate","re-negotiate"],["re-negosiated","re-negotiated"],["re-negosiates","re-negotiates"],["re-negosiating","re-negotiating"],["re-negosiation","re-negotiation"],["re-negosiations","re-negotiations"],["re-negosiator","re-negotiator"],["re-negosiators","re-negotiators"],["re-negotable","re-negotiable"],["re-negotaiable","re-negotiable"],["re-negotaiate","re-negotiate"],["re-negotaiated","re-negotiated"],["re-negotaiates","re-negotiates"],["re-negotaiating","re-negotiating"],["re-negotaiation","re-negotiation"],["re-negotaiations","re-negotiations"],["re-negotaiator","re-negotiator"],["re-negotaiators","re-negotiators"],["re-negotaible","re-negotiable"],["re-negotaite","re-negotiate"],["re-negotaited","re-negotiated"],["re-negotaites","re-negotiates"],["re-negotaiting","re-negotiating"],["re-negotaition","re-negotiation"],["re-negotaitions","re-negotiations"],["re-negotaitor","re-negotiator"],["re-negotaitors","re-negotiators"],["re-negotate","re-negotiate"],["re-negotated","re-negotiated"],["re-negotates","re-negotiates"],["re-negotatiable","re-negotiable"],["re-negotatiate","re-negotiate"],["re-negotatiated","re-negotiated"],["re-negotatiates","re-negotiates"],["re-negotatiating","re-negotiating"],["re-negotatiation","re-negotiation"],["re-negotatiations","re-negotiations"],["re-negotatiator","re-negotiator"],["re-negotatiators","re-negotiators"],["re-negotatible","re-negotiable"],["re-negotatie","re-negotiate"],["re-negotatied","re-negotiated"],["re-negotaties","re-negotiates"],["re-negotating","re-negotiating"],["re-negotation","re-negotiation"],["re-negotations","re-negotiations"],["re-negotatior","re-negotiator"],["re-negotatiors","re-negotiators"],["re-negotator","re-negotiator"],["re-negotators","re-negotiators"],["re-negothiable","re-negotiable"],["re-negothiate","re-negotiate"],["re-negothiated","re-negotiated"],["re-negothiates","re-negotiates"],["re-negothiating","re-negotiating"],["re-negothiation","re-negotiation"],["re-negothiations","re-negotiations"],["re-negothiator","re-negotiator"],["re-negothiators","re-negotiators"],["re-negotible","re-negotiable"],["re-negoticable","re-negotiable"],["re-negoticate","re-negotiate"],["re-negoticated","re-negotiated"],["re-negoticates","re-negotiates"],["re-negoticating","re-negotiating"],["re-negotication","re-negotiation"],["re-negotications","re-negotiations"],["re-negoticator","re-negotiator"],["re-negoticators","re-negotiators"],["re-negotioable","re-negotiable"],["re-negotioate","re-negotiate"],["re-negotioated","re-negotiated"],["re-negotioates","re-negotiates"],["re-negotioating","re-negotiating"],["re-negotioation","re-negotiation"],["re-negotioations","re-negotiations"],["re-negotioator","re-negotiator"],["re-negotioators","re-negotiators"],["re-negotioble","re-negotiable"],["re-negotion","re-negotiation"],["re-negotionable","re-negotiable"],["re-negotionate","re-negotiate"],["re-negotionated","re-negotiated"],["re-negotionates","re-negotiates"],["re-negotionating","re-negotiating"],["re-negotionation","re-negotiation"],["re-negotionations","re-negotiations"],["re-negotionator","re-negotiator"],["re-negotionators","re-negotiators"],["re-negotions","re-negotiations"],["re-negotiotable","re-negotiable"],["re-negotiotate","re-negotiate"],["re-negotiotated","re-negotiated"],["re-negotiotates","re-negotiates"],["re-negotiotating","re-negotiating"],["re-negotiotation","re-negotiation"],["re-negotiotations","re-negotiations"],["re-negotiotator","re-negotiator"],["re-negotiotators","re-negotiators"],["re-negotiote","re-negotiate"],["re-negotioted","re-negotiated"],["re-negotiotes","re-negotiates"],["re-negotioting","re-negotiating"],["re-negotiotion","re-negotiation"],["re-negotiotions","re-negotiations"],["re-negotiotor","re-negotiator"],["re-negotiotors","re-negotiators"],["re-negotitable","re-negotiable"],["re-negotitae","re-negotiate"],["re-negotitaed","re-negotiated"],["re-negotitaes","re-negotiates"],["re-negotitaing","re-negotiating"],["re-negotitaion","re-negotiation"],["re-negotitaions","re-negotiations"],["re-negotitaor","re-negotiator"],["re-negotitaors","re-negotiators"],["re-negotitate","re-negotiate"],["re-negotitated","re-negotiated"],["re-negotitates","re-negotiates"],["re-negotitating","re-negotiating"],["re-negotitation","re-negotiation"],["re-negotitations","re-negotiations"],["re-negotitator","re-negotiator"],["re-negotitators","re-negotiators"],["re-negotite","re-negotiate"],["re-negotited","re-negotiated"],["re-negotites","re-negotiates"],["re-negotiting","re-negotiating"],["re-negotition","re-negotiation"],["re-negotitions","re-negotiations"],["re-negotitor","re-negotiator"],["re-negotitors","re-negotiators"],["re-negoziable","re-negotiable"],["re-negoziate","re-negotiate"],["re-negoziated","re-negotiated"],["re-negoziates","re-negotiates"],["re-negoziating","re-negotiating"],["re-negoziation","re-negotiation"],["re-negoziations","re-negotiations"],["re-negoziator","re-negotiator"],["re-negoziators","re-negotiators"],["re-realease","re-release"],["re-uplad","re-upload"],["re-upladed","re-uploaded"],["re-uplader","re-uploader"],["re-upladers","re-uploaders"],["re-uplading","re-uploading"],["re-uplads","re-uploads"],["re-uplaod","re-upload"],["re-uplaoded","re-uploaded"],["re-uplaoder","re-uploader"],["re-uplaoders","re-uploaders"],["re-uplaoding","re-uploading"],["re-uplaods","re-uploads"],["re-uplod","re-upload"],["re-uploded","re-uploaded"],["re-uploder","re-uploader"],["re-uploders","re-uploaders"],["re-uploding","re-uploading"],["re-uplods","re-uploads"],["reaaly","really"],["reaarange","rearrange"],["reaaranges","rearranges"],["reaasigned","reassigned"],["reacahable","reachable"],["reacahble","reachable"],["reaccurring","recurring"],["reaceive","receive"],["reacheable","reachable"],["reachers","readers"],["reachs","reaches"],["reacing","reaching"],["reacll","recall"],["reactquire","reacquire"],["readabilty","readability"],["readanle","readable"],["readapted","re-adapted"],["readble","readable"],["readdrss","readdress"],["readdrssed","readdressed"],["readdrsses","readdresses"],["readdrssing","readdressing"],["readeable","readable"],["reademe","README"],["readiable","readable"],["readibility","readability"],["readible","readable"],["readig","reading"],["readigs","readings"],["readius","radius"],["readl-only","read-only"],["readmition","readmission"],["readnig","reading"],["readning","reading"],["readyness","readiness"],["reaeched","reached"],["reagrding","regarding"],["reaktivate","reactivate"],["reaktivated","reactivated"],["realease","release"],["realeased","released"],["realeases","releases"],["realiable","reliable"],["realitime","realtime"],["realitvely","relatively"],["realiy","really"],["realiztion","realization"],["realiztions","realizations"],["realling","really"],["reallize","realize"],["reallllly","really"],["reallocae","reallocate"],["reallocaes","reallocates"],["reallocaiing","reallocating"],["reallocaing","reallocating"],["reallocaion","reallocation"],["reallocaions","reallocations"],["reallocaite","reallocate"],["reallocaites","reallocates"],["reallocaiting","reallocating"],["reallocaition","reallocation"],["reallocaitions","reallocations"],["reallocaiton","reallocation"],["reallocaitons","reallocations"],["realsitic","realistic"],["realted","related"],["realyl","really"],["reamde","README"],["reamins","remains"],["reander","render"],["reanme","rename"],["reanmed","renamed"],["reanmes","renames"],["reanming","renaming"],["reaon","reason"],["reaons","reasons"],["reapeat","repeat"],["reapeated","repeated"],["reapeater","repeater"],["reapeating","repeating"],["reapeats","repeats"],["reappeares","reappears"],["reapper","reappear"],["reappered","reappeared"],["reappering","reappearing"],["rearely","rarely"],["rearranable","rearrangeable"],["rearrane","rearrange"],["rearraned","rearranged"],["rearranement","rearrangement"],["rearranements","rearrangements"],["rearranent","rearrangement"],["rearranents","rearrangements"],["rearranes","rearranges"],["rearrang","rearrange"],["rearrangable","rearrangeable"],["rearrangaeble","rearrangeable"],["rearrangaelbe","rearrangeable"],["rearrangd","rearranged"],["rearrangde","rearranged"],["rearrangent","rearrangement"],["rearrangents","rearrangements"],["rearrangmeent","rearrangement"],["rearrangmeents","rearrangements"],["rearrangmenet","rearrangement"],["rearrangmenets","rearrangements"],["rearrangment","rearrangement"],["rearrangments","rearrangements"],["rearrangnig","rearranging"],["rearrangning","rearranging"],["rearrangs","rearranges"],["rearrangse","rearranges"],["rearrangt","rearrangement"],["rearrangte","rearrange"],["rearrangteable","rearrangeable"],["rearrangteables","rearrangeables"],["rearrangted","rearranged"],["rearrangtement","rearrangement"],["rearrangtements","rearrangements"],["rearrangtes","rearranges"],["rearrangting","rearranging"],["rearrangts","rearrangements"],["rearraning","rearranging"],["rearranment","rearrangement"],["rearranments","rearrangements"],["rearrant","rearrangement"],["rearrants","rearrangements"],["reasearch","research"],["reasearcher","researcher"],["reasearchers","researchers"],["reasnable","reasonable"],["reasoable","reasonable"],["reasonabily","reasonably"],["reasonble","reasonable"],["reasonbly","reasonably"],["reasonnable","reasonable"],["reasonnably","reasonably"],["reassinging","reassigning"],["reassocition","reassociation"],["reasssign","reassign"],["reatime","realtime"],["reattachement","reattachment"],["rebiulding","rebuilding"],["rebllions","rebellions"],["reboto","reboot"],["rebounce","rebound"],["rebuilded","rebuilt"],["rebuillt","rebuilt"],["rebuils","rebuilds"],["rebuit","rebuilt"],["rebuld","rebuild"],["rebulding","rebuilding"],["rebulds","rebuilds"],["rebulid","rebuild"],["rebuliding","rebuilding"],["rebulids","rebuilds"],["rebulit","rebuilt"],["recahed","reached"],["recal","recall"],["recalcualte","recalculate"],["recalcualted","recalculated"],["recalcualter","re-calculator"],["recalcualtes","recalculates"],["recalcualting","recalculating"],["recalcualtion","recalculation"],["recalcualtions","recalculations"],["recalcuate","recalculate"],["recalcuated","recalculated"],["recalcuates","recalculates"],["recalcuations","recalculations"],["recalculaion","recalculation"],["recalculatble","re-calculable"],["recalcution","recalculation"],["recalulate","recalculate"],["recalulation","recalculation"],["recangle","rectangle"],["recangles","rectangles"],["reccomend","recommend"],["reccomendations","recommendations"],["reccomended","recommended"],["reccomending","recommending"],["reccommend","recommend"],["reccommendation","recommendation"],["reccommendations","recommendations"],["reccommended","recommended"],["reccommending","recommending"],["reccommends","recommends"],["recconecct","reconnect"],["recconeccted","reconnected"],["recconeccting","reconnecting"],["recconecction","reconnection"],["recconecctions","reconnections"],["recconeccts","reconnects"],["recconect","reconnect"],["recconected","reconnected"],["recconecting","reconnecting"],["recconection","reconnection"],["recconections","reconnections"],["recconects","reconnects"],["recconeect","reconnect"],["recconeected","reconnected"],["recconeecting","reconnecting"],["recconeection","reconnection"],["recconeections","reconnections"],["recconeects","reconnects"],["recconenct","reconnect"],["recconencted","reconnected"],["recconencting","reconnecting"],["recconenction","reconnection"],["recconenctions","reconnections"],["recconencts","reconnects"],["recconet","reconnect"],["recconeted","reconnected"],["recconeting","reconnecting"],["recconetion","reconnection"],["recconetions","reconnections"],["recconets","reconnects"],["reccord","record"],["reccorded","recorded"],["reccording","recording"],["reccords","records"],["reccuring","recurring"],["reccursive","recursive"],["reccursively","recursively"],["receeded","receded"],["receeding","receding"],["receied","received"],["receieve","receive"],["receieved","received"],["receieves","receives"],["receieving","receiving"],["receipient","recipient"],["receipients","recipients"],["receiption","reception"],["receiv","receive"],["receivd","received"],["receivedfrom","received from"],["receiveing","receiving"],["receiviing","receiving"],["receivs","receives"],["recenet","recent"],["recenlty","recently"],["recenly","recently"],["recenty","recently"],["recepient","recipient"],["recepients","recipients"],["recepion","reception"],["receve","receive"],["receved","received"],["receves","receives"],["recevie","receive"],["recevied","received"],["recevier","receiver"],["recevies","receives"],["receving","receiving"],["rechable","reachable"],["rechargable","rechargeable"],["recheability","reachability"],["reched","reached"],["rechek","recheck"],["recide","reside"],["recided","resided"],["recident","resident"],["recidents","residents"],["reciding","residing"],["reciepents","recipients"],["reciept","receipt"],["recieve","receive"],["recieved","received"],["reciever","receiver"],["recievers","receivers"],["recieves","receives"],["recieving","receiving"],["recievs","receives"],["recipiant","recipient"],["recipiants","recipients"],["recipie","recipe"],["recipies","recipes"],["reciprocoal","reciprocal"],["reciprocoals","reciprocals"],["recive","receive"],["recived","received"],["reciver","receiver"],["recivers","receivers"],["recivership","receivership"],["recives","receives"],["reciving","receiving"],["reclaimation","reclamation"],["recntly","recently"],["recod","record"],["recofig","reconfig"],["recoginizing-","recognizing"],["recogise","recognise"],["recogize","recognize"],["recogized","recognized"],["recogizes","recognizes"],["recogizing","recognizing"],["recogniced","recognised"],["recogninse","recognise"],["recognizeable","recognizable"],["recognzied","recognized"],["recomend","recommend"],["recomendation","recommendation"],["recomendations","recommendations"],["recomendatoin","recommendation"],["recomendatoins","recommendations"],["recomended","recommended"],["recomending","recommending"],["recomends","recommends"],["recommad","recommend"],["recommaded","recommended"],["recommand","recommend"],["recommandation","recommendation"],["recommanded","recommended"],["recommanding","recommending"],["recommands","recommends"],["recommd","recommend"],["recommdation","recommendation"],["recommded","recommended"],["recommdend","recommend"],["recommdended","recommended"],["recommdends","recommends"],["recommds","recommends"],["recommed","recommend"],["recommedation","recommendation"],["recommedations","recommendations"],["recommeded","recommended"],["recommeding","recommending"],["recommeds","recommends"],["recommened","recommended"],["recommeneded","recommended"],["recommented","recommended"],["recommmend","recommend"],["recommmended","recommended"],["recommmends","recommends"],["recommnd","recommend"],["recommnded","recommended"],["recommnds","recommends"],["recommned","recommend"],["recommneded","recommended"],["recommneds","recommends"],["recommpile","recompile"],["recommpiled","recompiled"],["recompence","recompense"],["recomput","recompute"],["recomputaion","recomputation"],["recompuute","recompute"],["recompuuted","recomputed"],["recompuutes","recomputes"],["recompuuting","recomputing"],["reconaissance","reconnaissance"],["reconcilation","reconciliation"],["recondifure","reconfigure"],["reconecct","reconnect"],["reconeccted","reconnected"],["reconeccting","reconnecting"],["reconecction","reconnection"],["reconecctions","reconnections"],["reconeccts","reconnects"],["reconect","reconnect"],["reconected","reconnected"],["reconecting","reconnecting"],["reconection","reconnection"],["reconections","reconnections"],["reconects","reconnects"],["reconeect","reconnect"],["reconeected","reconnected"],["reconeecting","reconnecting"],["reconeection","reconnection"],["reconeections","reconnections"],["reconeects","reconnects"],["reconenct","reconnect"],["reconencted","reconnected"],["reconencting","reconnecting"],["reconenction","reconnection"],["reconenctions","reconnections"],["reconencts","reconnects"],["reconet","reconnect"],["reconeted","reconnected"],["reconeting","reconnecting"],["reconetion","reconnection"],["reconetions","reconnections"],["reconets","reconnects"],["reconfifure","reconfigure"],["reconfiged","reconfigured"],["reconfugire","reconfigure"],["reconfugre","reconfigure"],["reconfugure","reconfigure"],["reconfure","reconfigure"],["recongifure","reconfigure"],["recongize","recognize"],["recongized","recognized"],["recongnises","recognises"],["recongnizes","recognizes"],["reconize","recognize"],["reconized","recognized"],["reconnaisance","reconnaissance"],["reconnaissence","reconnaissance"],["reconnct","reconnect"],["reconncted","reconnected"],["reconncting","reconnecting"],["reconncts","reconnects"],["reconsidder","reconsider"],["reconstrcut","reconstruct"],["reconstrcuted","reconstructed"],["reconstrcution","reconstruction"],["reconstuct","reconstruct"],["reconstucted","reconstructed"],["reconstucting","reconstructing"],["reconstucts","reconstructs"],["reconsturction","reconstruction"],["recontruct","reconstruct"],["recontructed","reconstructed"],["recontructing","reconstructing"],["recontruction","reconstruction"],["recontructions","reconstructions"],["recontructor","reconstructor"],["recontructors","reconstructors"],["recontructs","reconstructs"],["recordproducer","record producer"],["recordss","records"],["recored","recorded"],["recoriding","recording"],["recourced","resourced"],["recources","resources"],["recourcing","resourcing"],["recpie","recipe"],["recpies","recipes"],["recquired","required"],["recrational","recreational"],["recreateation","recreation"],["recrod","record"],["recrods","records"],["recrusevly","recursively"],["recrusion","recursion"],["recrusive","recursive"],["recrusivelly","recursively"],["recrusively","recursively"],["rectange","rectangle"],["rectanges","rectangles"],["rectanglar","rectangular"],["rectangluar","rectangular"],["rectiinear","rectilinear"],["recude","reduce"],["recuiting","recruiting"],["reculrively","recursively"],["recuring","recurring"],["recurisvely","recursively"],["recurively","recursively"],["recurrance","recurrence"],["recursily","recursively"],["recursivelly","recursively"],["recursivion","recursion"],["recursivley","recursively"],["recursivly","recursively"],["recurssed","recursed"],["recursses","recurses"],["recurssing","recursing"],["recurssion","recursion"],["recurssive","recursive"],["recusrive","recursive"],["recusrively","recursively"],["recusrsive","recursive"],["recustion","recursion"],["recyclying","recycling"],["recylcing","recycling"],["recyle","recycle"],["recyled","recycled"],["recyles","recycles"],["recyling","recycling"],["redability","readability"],["redandant","redundant"],["redeable","readable"],["redeclaation","redeclaration"],["redefiend","redefined"],["redefiende","redefined"],["redefintion","redefinition"],["redefintions","redefinitions"],["redenderer","renderer"],["redered","rendered"],["redict","redirect"],["rediculous","ridiculous"],["redidual","residual"],["redifine","redefine"],["redifinition","redefinition"],["redifinitions","redefinitions"],["redifintion","redefinition"],["redifintions","redefinitions"],["reding","reading"],["redings","readings"],["redircet","redirect"],["redirectd","redirected"],["redirectrion","redirection"],["redisign","redesign"],["redistirbute","redistribute"],["redistirbuted","redistributed"],["redistirbutes","redistributes"],["redistirbuting","redistributing"],["redistirbution","redistribution"],["redistributeable","redistributable"],["redistrubute","redistribute"],["redistrubuted","redistributed"],["redistrubution","redistribution"],["redistrubutions","redistributions"],["redliens","redlines"],["rednerer","renderer"],["redonly","readonly"],["redudancy","redundancy"],["redudant","redundant"],["redunancy","redundancy"],["redunant","redundant"],["redundacy","redundancy"],["redundand","redundant"],["redundat","redundant"],["redundency","redundancy"],["redundent","redundant"],["reduntancy","redundancy"],["reduntant","redundant"],["reease","release"],["reeased","released"],["reeaser","releaser"],["reeasers","releasers"],["reeases","releases"],["reeasing","releasing"],["reedeming","redeeming"],["reegion","region"],["reegions","regions"],["reelation","relation"],["reelease","release"],["reenable","re-enable"],["reenabled","re-enabled"],["reename","rename"],["reencode","re-encode"],["reenfoce","reinforce"],["reenfoced","reinforced"],["reenforced","reinforced"],["reesrved","reserved"],["reesult","result"],["reeturn","return"],["reeturned","returned"],["reeturning","returning"],["reeturns","returns"],["reevalute","reevaluate"],["reevaulating","reevaluating"],["refcound","refcount"],["refcounf","refcount"],["refect","reflect"],["refected","reflected"],["refecting","reflecting"],["refectiv","reflective"],["refector","refactor"],["refectoring","refactoring"],["refects","reflects"],["refedendum","referendum"],["refeinement","refinement"],["refeinements","refinements"],["refelects","reflects"],["refence","reference"],["refences","references"],["refenence","reference"],["refenrenced","referenced"],["referal","referral"],["referance","reference"],["referanced","referenced"],["referances","references"],["referant","referent"],["referebces","references"],["referece","reference"],["referecence","reference"],["referecences","references"],["refereces","references"],["referecne","reference"],["refered","referred"],["referefences","references"],["referemce","reference"],["referemces","references"],["referenace","reference"],["referenc","reference"],["referencable","referenceable"],["referencial","referential"],["referencially","referentially"],["referencs","references"],["referenct","referenced"],["referene","reference"],["referenece","reference"],["refereneced","referenced"],["refereneces","references"],["referened","referenced"],["referenence","reference"],["referenenced","referenced"],["referenences","references"],["referenes","references"],["referennces","references"],["referense","reference"],["referensed","referenced"],["referenses","references"],["referenz","reference"],["referenzes","references"],["refererd","referred"],["refererence","reference"],["referiang","referring"],["refering","referring"],["refernce","reference"],["refernced","referenced"],["referncence","reference"],["referncences","references"],["refernces","references"],["referncial","referential"],["referncing","referencing"],["refernece","reference"],["referneced","referenced"],["referneces","references"],["refernnce","reference"],["referr","refer"],["referrence","reference"],["referrenced","referenced"],["referrences","references"],["referrencing","referencing"],["referreres","referrers"],["referres","refers"],["referrs","refers"],["refertence","reference"],["refertenced","referenced"],["refertences","references"],["refesh","refresh"],["refeshed","refreshed"],["refeshes","refreshes"],["refeshing","refreshing"],["reffered","referred"],["refference","reference"],["reffering","referring"],["refferr","refer"],["reffers","refers"],["refinemenet","refinement"],["refinmenet","refinement"],["refinment","refinement"],["reflet","reflect"],["refleted","reflected"],["refleting","reflecting"],["refletion","reflection"],["refletions","reflections"],["reflets","reflects"],["refocuss","refocus"],["refocussed","refocused"],["reformating","reformatting"],["reformattd","reformatted"],["refreh","refresh"],["refrence","reference"],["refrenced","referenced"],["refrences","references"],["refrencing","referencing"],["refrerence","reference"],["refrerenced","referenced"],["refrerenceing","referencing"],["refrerences","references"],["refrerencial","referential"],["refrers","refers"],["refreshs","refreshes"],["refreshses","refreshes"],["refridgeration","refrigeration"],["refridgerator","refrigerator"],["refromatting","refomatting"],["refromist","reformist"],["refrormatting","reformatting"],["refure","refuse"],["refures","refuses"],["refusla","refusal"],["regalar","regular"],["regalars","regulars"],["regardes","regards"],["regardles","regardless"],["regardlesss","regardless"],["regaring","regarding"],["regarldess","regardless"],["regarless","regardless"],["regart","regard"],["regarted","regarded"],["regarting","regarding"],["regartless","regardless"],["regconized","recognized"],["regeister","register"],["regeistered","registered"],["regeistration","registration"],["regenarated","regenerated"],["regenrated","regenerated"],["regenratet","regenerated"],["regenrating","regenerating"],["regenration","regeneration"],["regenrative","regenerative"],["regession","regression"],["regestered","registered"],["regidstered","registered"],["regio","region"],["regiser","register"],["regisration","registration"],["regist","register"],["registartion","registration"],["registe","register"],["registed","registered"],["registeing","registering"],["registeration","registration"],["registerered","registered"],["registeres","registers"],["registeresd","registered"],["registerred","registered"],["registert","registered"],["registery","registry"],["registes","registers"],["registing","registering"],["registors","registers"],["registrain","registration"],["registraion","registration"],["registraions","registrations"],["registraration","registration"],["registrated","registered"],["registred","registered"],["registrer","register"],["registring","registering"],["registrs","registers"],["registy","registry"],["regiter","register"],["regitered","registered"],["regitering","registering"],["regiters","registers"],["regluar","regular"],["regon","region"],["regons","regions"],["regorded","recorded"],["regresion","regression"],["regresison","regression"],["regresssion","regression"],["regrigerator","refrigerator"],["regsion","region"],["regsions","regions"],["regsiter","register"],["regsitered","registered"],["regsitering","registering"],["regsiters","registers"],["regsitry","registry"],["regster","register"],["regstered","registered"],["regstering","registering"],["regsters","registers"],["regstry","registry"],["regualar","regular"],["regualarly","regularly"],["regualator","regulator"],["regualr","regular"],["regualtor","regulator"],["reguardless","regardless"],["reguarldess","regardless"],["reguarlise","regularise"],["reguarliser","regulariser"],["reguarlize","regularize"],["reguarlizer","regularizer"],["reguarly","regularly"],["reguator","regulator"],["reguire","require"],["reguired","required"],["reguirement","requirement"],["reguirements","requirements"],["reguires","requires"],["reguiring","requiring"],["regulaer","regular"],["regulaion","regulation"],["regulamentation","regulation"],["regulamentations","regulations"],["regulaotrs","regulators"],["regulaotry","regulatory"],["regularily","regularly"],["regulariry","regularly"],["regularlisation","regularisation"],["regularlise","regularise"],["regularlised","regularised"],["regularliser","regulariser"],["regularlises","regularises"],["regularlising","regularising"],["regularlization","regularization"],["regularlize","regularize"],["regularlized","regularized"],["regularlizer","regularizer"],["regularlizes","regularizes"],["regularlizing","regularizing"],["regularlly","regularly"],["regulax","regular"],["reguler","regular"],["regulr","regular"],["regultor","regulator"],["regultors","regulators"],["regultory","regulatory"],["regurlarly","regularly"],["reguster","register"],["rehersal","rehearsal"],["rehersing","rehearsing"],["reicarnation","reincarnation"],["reigining","reigning"],["reigonal","regional"],["reigster","register"],["reigstered","registered"],["reigstering","registering"],["reigsters","registers"],["reigstration","registration"],["reimplemenet","reimplement"],["reimplementaion","reimplementation"],["reimplementaions","reimplementations"],["reimplemention","reimplementation"],["reimplementions","reimplementations"],["reimplented","reimplemented"],["reimplents","reimplements"],["reimpliment","reimplement"],["reimplimenting","reimplementing"],["reimplmenet","reimplement"],["reimplment","reimplement"],["reimplmentation","reimplementation"],["reimplmented","reimplemented"],["reimplmenting","reimplementing"],["reimplments","reimplements"],["reimpplement","reimplement"],["reimpplementating","reimplementing"],["reimpplementation","reimplementation"],["reimpplemented","reimplemented"],["reimpremented","reimplemented"],["reinfoce","reinforce"],["reinfoced","reinforced"],["reinfocement","reinforcement"],["reinfocements","reinforcements"],["reinfoces","reinforces"],["reinfocing","reinforcing"],["reinitailise","reinitialise"],["reinitailised","reinitialised"],["reinitailize","reinitialize"],["reinitalize","reinitialize"],["reinitilize","reinitialize"],["reinitilized","reinitialized"],["reinstatiate","reinstantiate"],["reinstatiated","reinstantiated"],["reinstatiates","reinstantiates"],["reinstatiation","reinstantiation"],["reintantiate","reinstantiate"],["reintantiating","reinstantiating"],["reintepret","reinterpret"],["reintepreted","reinterpreted"],["reister","register"],["reitterate","reiterate"],["reitterated","reiterated"],["reitterates","reiterates"],["reivison","revision"],["rejplace","replace"],["reknown","renown"],["reknowned","renowned"],["rekursed","recursed"],["rekursion","recursion"],["rekursive","recursive"],["relaative","relative"],["relady","ready"],["relaease","release"],["relaese","release"],["relaesed","released"],["relaeses","releases"],["relaesing","releasing"],["relaged","related"],["relaimed","reclaimed"],["relaion","relation"],["relaive","relative"],["relaly","really"],["relase","release"],["relased","released"],["relaser","releaser"],["relases","releases"],["relashionship","relationship"],["relashionships","relationships"],["relasing","releasing"],["relataive","relative"],["relatated","related"],["relatd","related"],["relatdness","relatedness"],["relatibe","relative"],["relatibely","relatively"],["relatievly","relatively"],["relatiopnship","relationship"],["relativ","relative"],["relativly","relatively"],["relavant","relevant"],["relavent","relevant"],["releaase","release"],["releaased","released"],["relead","reload"],["releae","release"],["releaed","released"],["releaeing","releasing"],["releaing","releasing"],["releas","release"],["releasead","released"],["releasse","release"],["releated","related"],["releating","relating"],["releation","relation"],["releations","relations"],["releationship","relationship"],["releationships","relationships"],["releative","relative"],["releavant","relevant"],["relecant","relevant"],["releive","relieve"],["releived","relieved"],["releiver","reliever"],["releoad","reload"],["relese","release"],["relesed","released"],["releses","releases"],["reletive","relative"],["reletively","relatively"],["relevabt","relevant"],["relevane","relevant"],["releveant","relevant"],["relevence","relevance"],["relevent","relevant"],["relfected","reflected"],["relfecting","reflecting"],["relfection","reflection"],["relfections","reflections"],["reliablity","reliability"],["relient","reliant"],["religeous","religious"],["religous","religious"],["religously","religiously"],["relinguish","relinquish"],["relinguishing","relinquishing"],["relinqushment","relinquishment"],["relintquish","relinquish"],["relitavely","relatively"],["relly","really"],["reloade","reload"],["relocae","relocate"],["relocaes","relocates"],["relocaiing","relocating"],["relocaing","relocating"],["relocaion","relocation"],["relocaions","relocations"],["relocaite","relocate"],["relocaites","relocates"],["relocaiting","relocating"],["relocaition","relocation"],["relocaitions","relocations"],["relocaiton","relocation"],["relocaitons","relocations"],["relocateable","relocatable"],["reloccate","relocate"],["reloccated","relocated"],["reloccates","relocates"],["relpacement","replacement"],["relpy","reply"],["reltive","relative"],["relyable","reliable"],["relyably","reliably"],["relyed","relied"],["relys","relies"],["remaing","remaining"],["remainging","remaining"],["remainig","remaining"],["remainst","remains"],["remaning","remaining"],["remaped","remapped"],["remaping","remapping"],["rembember","remember"],["rembembered","remembered"],["rembembering","remembering"],["rembembers","remembers"],["rember","remember"],["remeber","remember"],["remebered","remembered"],["remebering","remembering"],["remebers","remembers"],["rememberable","memorable"],["rememberance","remembrance"],["rememberd","remembered"],["remembrence","remembrance"],["rememeber","remember"],["rememebered","remembered"],["rememebering","remembering"],["rememebers","remembers"],["rememebr","remember"],["rememebred","remembered"],["rememebrs","remembers"],["rememember","remember"],["rememembered","remembered"],["rememembers","remembers"],["rememer","remember"],["rememered","remembered"],["rememers","remembers"],["rememor","remember"],["rememored","remembered"],["rememoring","remembering"],["rememors","remembers"],["rememver","remember"],["remenant","remnant"],["remenber","remember"],["remenicent","reminiscent"],["remian","remain"],["remianed","remained"],["remianing","remaining"],["remians","remains"],["reminent","remnant"],["reminescent","reminiscent"],["remining","remaining"],["reminiscense","reminiscence"],["reminscent","reminiscent"],["reminsicent","reminiscent"],["remmeber","remember"],["remmebered","remembered"],["remmebering","remembering"],["remmebers","remembers"],["remmove","remove"],["remoce","remove"],["remoive","remove"],["remoived","removed"],["remoives","removes"],["remoiving","removing"],["remontly","remotely"],["remoote","remote"],["remore","remote"],["remorted","reported"],["remot","remote"],["removce","remove"],["removeable","removable"],["removefromat","removeformat"],["removeing","removing"],["removerd","removed"],["remve","remove"],["remved","removed"],["remves","removes"],["remvoe","remove"],["remvoed","removed"],["remvoes","removes"],["remvove","remove"],["remvoved","removed"],["remvoves","removes"],["remvs","removes"],["renabled","re-enabled"],["renderadble","renderable"],["renderd","rendered"],["rendereing","rendering"],["rendererd","rendered"],["renderered","rendered"],["renderering","rendering"],["renderning","rendering"],["renderr","render"],["renderring","rendering"],["rendevous","rendezvous"],["rendezous","rendezvous"],["rendired","rendered"],["rendirer","renderer"],["rendirers","renderers"],["rendiring","rendering"],["rendring","rendering"],["renedered","rendered"],["renegatiotiable","renegotiable"],["renegatiotiate","renegotiate"],["renegatiotiated","renegotiated"],["renegatiotiates","renegotiates"],["renegatiotiating","renegotiating"],["renegatiotiation","renegotiation"],["renegatiotiations","renegotiations"],["renegatiotiator","renegotiator"],["renegatiotiators","renegotiators"],["renegoable","renegotiable"],["renegoate","renegotiate"],["renegoated","renegotiated"],["renegoates","renegotiates"],["renegoatiable","renegotiable"],["renegoatiate","renegotiate"],["renegoatiated","renegotiated"],["renegoatiates","renegotiates"],["renegoatiating","renegotiating"],["renegoatiation","renegotiation"],["renegoatiations","renegotiations"],["renegoatiator","renegotiator"],["renegoatiators","renegotiators"],["renegoating","renegotiating"],["renegoation","renegotiation"],["renegoations","renegotiations"],["renegoator","renegotiator"],["renegoators","renegotiators"],["renegociable","renegotiable"],["renegociate","renegotiate"],["renegociated","renegotiated"],["renegociates","renegotiates"],["renegociating","renegotiating"],["renegociation","renegotiation"],["renegociations","renegotiations"],["renegociator","renegotiator"],["renegociators","renegotiators"],["renegogtiable","renegotiable"],["renegogtiate","renegotiate"],["renegogtiated","renegotiated"],["renegogtiates","renegotiates"],["renegogtiating","renegotiating"],["renegogtiation","renegotiation"],["renegogtiations","renegotiations"],["renegogtiator","renegotiator"],["renegogtiators","renegotiators"],["renegoitable","renegotiable"],["renegoitate","renegotiate"],["renegoitated","renegotiated"],["renegoitates","renegotiates"],["renegoitating","renegotiating"],["renegoitation","renegotiation"],["renegoitations","renegotiations"],["renegoitator","renegotiator"],["renegoitators","renegotiators"],["renegoptionsotiable","renegotiable"],["renegoptionsotiate","renegotiate"],["renegoptionsotiated","renegotiated"],["renegoptionsotiates","renegotiates"],["renegoptionsotiating","renegotiating"],["renegoptionsotiation","renegotiation"],["renegoptionsotiations","renegotiations"],["renegoptionsotiator","renegotiator"],["renegoptionsotiators","renegotiators"],["renegosiable","renegotiable"],["renegosiate","renegotiate"],["renegosiated","renegotiated"],["renegosiates","renegotiates"],["renegosiating","renegotiating"],["renegosiation","renegotiation"],["renegosiations","renegotiations"],["renegosiator","renegotiator"],["renegosiators","renegotiators"],["renegotable","renegotiable"],["renegotaiable","renegotiable"],["renegotaiate","renegotiate"],["renegotaiated","renegotiated"],["renegotaiates","renegotiates"],["renegotaiating","renegotiating"],["renegotaiation","renegotiation"],["renegotaiations","renegotiations"],["renegotaiator","renegotiator"],["renegotaiators","renegotiators"],["renegotaible","renegotiable"],["renegotaite","renegotiate"],["renegotaited","renegotiated"],["renegotaites","renegotiates"],["renegotaiting","renegotiating"],["renegotaition","renegotiation"],["renegotaitions","renegotiations"],["renegotaitor","renegotiator"],["renegotaitors","renegotiators"],["renegotate","renegotiate"],["renegotated","renegotiated"],["renegotates","renegotiates"],["renegotatiable","renegotiable"],["renegotatiate","renegotiate"],["renegotatiated","renegotiated"],["renegotatiates","renegotiates"],["renegotatiating","renegotiating"],["renegotatiation","renegotiation"],["renegotatiations","renegotiations"],["renegotatiator","renegotiator"],["renegotatiators","renegotiators"],["renegotatible","renegotiable"],["renegotatie","renegotiate"],["renegotatied","renegotiated"],["renegotaties","renegotiates"],["renegotating","renegotiating"],["renegotation","renegotiation"],["renegotations","renegotiations"],["renegotatior","renegotiator"],["renegotatiors","renegotiators"],["renegotator","renegotiator"],["renegotators","renegotiators"],["renegothiable","renegotiable"],["renegothiate","renegotiate"],["renegothiated","renegotiated"],["renegothiates","renegotiates"],["renegothiating","renegotiating"],["renegothiation","renegotiation"],["renegothiations","renegotiations"],["renegothiator","renegotiator"],["renegothiators","renegotiators"],["renegotible","renegotiable"],["renegoticable","renegotiable"],["renegoticate","renegotiate"],["renegoticated","renegotiated"],["renegoticates","renegotiates"],["renegoticating","renegotiating"],["renegotication","renegotiation"],["renegotications","renegotiations"],["renegoticator","renegotiator"],["renegoticators","renegotiators"],["renegotioable","renegotiable"],["renegotioate","renegotiate"],["renegotioated","renegotiated"],["renegotioates","renegotiates"],["renegotioating","renegotiating"],["renegotioation","renegotiation"],["renegotioations","renegotiations"],["renegotioator","renegotiator"],["renegotioators","renegotiators"],["renegotioble","renegotiable"],["renegotion","renegotiation"],["renegotionable","renegotiable"],["renegotionate","renegotiate"],["renegotionated","renegotiated"],["renegotionates","renegotiates"],["renegotionating","renegotiating"],["renegotionation","renegotiation"],["renegotionations","renegotiations"],["renegotionator","renegotiator"],["renegotionators","renegotiators"],["renegotions","renegotiations"],["renegotiotable","renegotiable"],["renegotiotate","renegotiate"],["renegotiotated","renegotiated"],["renegotiotates","renegotiates"],["renegotiotating","renegotiating"],["renegotiotation","renegotiation"],["renegotiotations","renegotiations"],["renegotiotator","renegotiator"],["renegotiotators","renegotiators"],["renegotiote","renegotiate"],["renegotioted","renegotiated"],["renegotiotes","renegotiates"],["renegotioting","renegotiating"],["renegotiotion","renegotiation"],["renegotiotions","renegotiations"],["renegotiotor","renegotiator"],["renegotiotors","renegotiators"],["renegotitable","renegotiable"],["renegotitae","renegotiate"],["renegotitaed","renegotiated"],["renegotitaes","renegotiates"],["renegotitaing","renegotiating"],["renegotitaion","renegotiation"],["renegotitaions","renegotiations"],["renegotitaor","renegotiator"],["renegotitaors","renegotiators"],["renegotitate","renegotiate"],["renegotitated","renegotiated"],["renegotitates","renegotiates"],["renegotitating","renegotiating"],["renegotitation","renegotiation"],["renegotitations","renegotiations"],["renegotitator","renegotiator"],["renegotitators","renegotiators"],["renegotite","renegotiate"],["renegotited","renegotiated"],["renegotites","renegotiates"],["renegotiting","renegotiating"],["renegotition","renegotiation"],["renegotitions","renegotiations"],["renegotitor","renegotiator"],["renegotitors","renegotiators"],["renegoziable","renegotiable"],["renegoziate","renegotiate"],["renegoziated","renegotiated"],["renegoziates","renegotiates"],["renegoziating","renegotiating"],["renegoziation","renegotiation"],["renegoziations","renegotiations"],["renegoziator","renegotiator"],["renegoziators","renegotiators"],["reneweal","renewal"],["renewl","renewal"],["renforce","reinforce"],["renforced","reinforced"],["renforcement","reinforcement"],["renforcements","reinforcements"],["renforces","reinforces"],["rennovate","renovate"],["rennovated","renovated"],["rennovating","renovating"],["rennovation","renovation"],["rentime","runtime"],["rentors","renters"],["reoadmap","roadmap"],["reoccurrence","recurrence"],["reoder","reorder"],["reomvable","removable"],["reomve","remove"],["reomved","removed"],["reomves","removes"],["reomving","removing"],["reonly","read-only"],["reopended","reopened"],["reoport","report"],["reopsitory","repository"],["reord","record"],["reorded","reorder"],["reorer","reorder"],["reorganision","reorganisation"],["reorginised","reorganised"],["reorginized","reorganized"],["reosnable","reasonable"],["reosne","reason"],["reosurce","resource"],["reosurced","resourced"],["reosurces","resources"],["reosurcing","resourcing"],["reounded","rounded"],["repace","replace"],["repaced","replaced"],["repacement","replacement"],["repacements","replacements"],["repaces","replaces"],["repacing","replacing"],["repackge","repackage"],["repackged","repackaged"],["repaitnt","repaint"],["reparamterization","reparameterization"],["repblic","republic"],["repblican","republican"],["repblicans","republicans"],["repblics","republics"],["repeates","repeats"],["repeatly","repeatedly"],["repect","respect"],["repectable","respectable"],["repected","respected"],["repecting","respecting"],["repective","respective"],["repectively","respectively"],["repects","respects"],["repedability","repeatability"],["repedable","repeatable"],["repeition","repetition"],["repentence","repentance"],["repentent","repentant"],["reperesent","represent"],["reperesentation","representation"],["reperesentational","representational"],["reperesentations","representations"],["reperesented","represented"],["reperesenting","representing"],["reperesents","represents"],["repersentation","representation"],["repertoir","repertoire"],["repesent","represent"],["repesentation","representation"],["repesentational","representational"],["repesented","represented"],["repesenting","representing"],["repesents","represents"],["repet","repeat"],["repetative","repetitive"],["repete","repeat"],["repeteadly","repeatedly"],["repetetion","repetition"],["repetetions","repetitions"],["repetetive","repetitive"],["repeting","repeating"],["repetion","repetition"],["repetions","repetitions"],["repetive","repetitive"],["repid","rapid"],["repition","repetition"],["repitions","repetitions"],["repitition","repetition"],["repititions","repetitions"],["replacability","replaceability"],["replacables","replaceables"],["replacacing","replacing"],["replacalbe","replaceable"],["replacalbes","replaceables"],["replacament","replacement"],["replacaments","replacements"],["replacate","replicate"],["replacated","replicated"],["replacates","replicates"],["replacating","replicating"],["replacation","replication"],["replacd","replaced"],["replaceemnt","replacement"],["replaceemnts","replacements"],["replacemenet","replacement"],["replacmenet","replacement"],["replacment","replacement"],["replacments","replacements"],["replacong","replacing"],["replaint","repaint"],["replasement","replacement"],["replasements","replacements"],["replcace","replace"],["replcaced","replaced"],["replcaof","replicaof"],["replicae","replicate"],["replicaes","replicates"],["replicaiing","replicating"],["replicaion","replication"],["replicaions","replications"],["replicaite","replicate"],["replicaites","replicates"],["replicaiting","replicating"],["replicaition","replication"],["replicaitions","replications"],["replicaiton","replication"],["replicaitons","replications"],["repling","replying"],["replys","replies"],["reponding","responding"],["reponse","response"],["reponses","responses"],["reponsibilities","responsibilities"],["reponsibility","responsibility"],["reponsible","responsible"],["reporing","reporting"],["reporitory","repository"],["reportadly","reportedly"],["reportign","reporting"],["reportresouces","reportresources"],["reposiotory","repository"],["reposiry","repository"],["repositiories","repositories"],["repositiory","repository"],["repositiroes","repositories"],["reposititioning","repositioning"],["repositorry","repository"],["repositotries","repositories"],["repositotry","repository"],["repositry","repository"],["reposoitory","repository"],["reposond","respond"],["reposonder","responder"],["reposonders","responders"],["reposonding","responding"],["reposonse","response"],["reposonses","responses"],["repostiories","repositories"],["repostiory","repository"],["repostories","repositories"],["repostory","repository"],["repport","report"],["reppository","repository"],["repraesentation","representation"],["repraesentational","representational"],["repraesentations","representations"],["reprecussion","repercussion"],["reprecussions","repercussions"],["repreesnt","represent"],["repreesnted","represented"],["repreesnts","represents"],["reprensent","represent"],["reprensentation","representation"],["reprensentational","representational"],["reprensentations","representations"],["reprepresents","represents"],["represantation","representation"],["represantational","representational"],["represantations","representations"],["represantative","representative"],["represenatation","representation"],["represenatational","representational"],["represenatations","representations"],["represenation","representation"],["represenational","representational"],["represenations","representations"],["represend","represent"],["representaion","representation"],["representaional","representational"],["representaions","representations"],["representaiton","representation"],["representated","represented"],["representating","representing"],["representd","represented"],["representiative","representative"],["represention","representation"],["representions","representations"],["representive","representative"],["representives","representatives"],["represet","represent"],["represetation","representation"],["represeted","represented"],["represeting","representing"],["represets","represents"],["represnet","represent"],["represnetated","represented"],["represnetation","representation"],["represnetations","representations"],["represneted","represented"],["represneting","representing"],["represnets","represents"],["represnt","represent"],["represntation","representation"],["represntative","representative"],["represnted","represented"],["represnts","represents"],["repressent","represent"],["repressentation","representation"],["repressenting","representing"],["repressents","represents"],["reprociblbe","reproducible"],["reprocible","reproducible"],["reprodice","reproduce"],["reprodiced","reproduced"],["reprodicibility","reproducibility"],["reprodicible","reproducible"],["reprodicibly","reproducibly"],["reprodicing","reproducing"],["reprodiction","reproduction"],["reproducabely","reproducibly"],["reproducability","reproducibility"],["reproducable","reproducible"],["reproducablitity","reproducibility"],["reproducably","reproducibly"],["reproduciability","reproduceability"],["reproduciable","reproduceable"],["reproduciblity","reproducibility"],["reprot","report"],["reprots","reports"],["reprsent","represent"],["reprsentation","representation"],["reprsentations","representations"],["reprsented","represented"],["reprsenting","representing"],["reprsents","represents"],["reprtoire","repertoire"],["reprucible","reproducible"],["repsectively","respectively"],["repsonse","response"],["repsonses","responses"],["repsonsible","responsible"],["repspectively","respectively"],["repsresents","represents"],["reptition","repetition"],["repubic","republic"],["repubican","republican"],["repubicans","republicans"],["repubics","republics"],["republi","republic"],["republian","republican"],["republians","republicans"],["republis","republics"],["repulic","republic"],["repulican","republican"],["repulicans","republicans"],["repulics","republics"],["reputpose","repurpose"],["reputposed","repurposed"],["reputposes","repurposes"],["reputposing","repurposing"],["reqest","request"],["reqested","requested"],["reqests","requests"],["reqeuest","request"],["reqeust","request"],["reqeusted","requested"],["reqeusting","requesting"],["reqeusts","requests"],["reqiest","request"],["reqire","require"],["reqired","required"],["reqirement","requirement"],["reqirements","requirements"],["reqires","requires"],["reqiring","requiring"],["reqiure","require"],["reqrite","rewrite"],["reqrites","rewrites"],["requencies","frequencies"],["requency","frequency"],["requeried","required"],["requeriment","requirement"],["requeriments","requirements"],["reques","request"],["requesr","request"],["requestd","requested"],["requestesd","requested"],["requestested","requested"],["requestied","requested"],["requestying","requesting"],["requet","request"],["requeted","requested"],["requeting","requesting"],["requets","requests"],["requeum","requiem"],["requied","required"],["requierd","required"],["requiere","require"],["requiered","required"],["requierement","requirement"],["requierements","requirements"],["requieres","requires"],["requiering","requiring"],["requies","requires"],["requiest","request"],["requiested","requested"],["requiesting","requesting"],["requiests","requests"],["requird","required"],["requireing","requiring"],["requiremenet","requirement"],["requiremenets","requirements"],["requiremnt","requirement"],["requirment","requirement"],["requirments","requirements"],["requisit","requisite"],["requisits","requisites"],["requre","require"],["requred","required"],["requrement","requirement"],["requrements","requirements"],["requres","requires"],["requrest","request"],["requrested","requested"],["requresting","requesting"],["requrests","requests"],["requried","required"],["requriement","requirement"],["requriements","requirements"],["requries","requires"],["requriment","requirement"],["requring","requiring"],["requrired","required"],["requrirement","requirement"],["requrirements","requirements"],["requris","require"],["requsite","requisite"],["requsites","requisites"],["requst","request"],["requsted","requested"],["requsting","requesting"],["requsts","requests"],["reregisteration","reregistration"],["rererences","references"],["rerference","reference"],["rerferences","references"],["rerpesentation","representation"],["rertieve","retrieve"],["rertieved","retrieved"],["rertiever","retriever"],["rertievers","retrievers"],["rertieves","retrieves"],["reruirement","requirement"],["reruirements","requirements"],["reruning","rerunning"],["rerwite","rewrite"],["resarch","research"],["resart","restart"],["resarts","restarts"],["resaurant","restaurant"],["resaurants","restaurants"],["rescaned","rescanned"],["rescource","resource"],["rescourced","resourced"],["rescources","resources"],["rescourcing","resourcing"],["rescrition","restriction"],["rescritions","restrictions"],["rescueing","rescuing"],["reseach","research"],["reseached","researched"],["researvation","reservation"],["researvations","reservations"],["researve","reserve"],["researved","reserved"],["researves","reserves"],["researving","reserving"],["reselction","reselection"],["resembelance","resemblance"],["resembes","resembles"],["resemblence","resemblance"],["resently","recently"],["resepect","respect"],["resepected","respected"],["resepecting","respecting"],["resepective","respective"],["resepectively","respectively"],["resepects","respects"],["reseration","reservation"],["reserv","reserve"],["reserverd","reserved"],["reservered","reserved"],["resestatus","resetstatus"],["resetable","resettable"],["reseted","reset"],["reseting","resetting"],["resetted","reset"],["reseved","reserved"],["reseverd","reserved"],["resevered","reserved"],["resevering","reserving"],["resevoir","reservoir"],["resgister","register"],["resgisters","registers"],["residental","residential"],["resierfs","reiserfs"],["resignement","resignment"],["resilence","resilience"],["resistable","resistible"],["resistence","resistance"],["resistent","resistant"],["resitance","resistance"],["resitances","resistances"],["resitor","resistor"],["resitors","resistors"],["resivwar","reservoir"],["resizeable","resizable"],["resizeble","resizable"],["reslection","reselection"],["reslove","resolve"],["resloved","resolved"],["resloves","resolves"],["resloving","resolving"],["reslut","result"],["resluts","results"],["resoect","respect"],["resoective","respective"],["resoiurce","resource"],["resoiurced","resourced"],["resoiurces","resources"],["resoiurcing","resourcing"],["resoltion","resolution"],["resoltuion","resolution"],["resoltuions","resolutions"],["resoluitons","resolutions"],["resolutin","resolution"],["resolutino","resolution"],["resolutinos","resolutions"],["resolutins","resolutions"],["resoluton","resolution"],["resolvinf","resolving"],["reson","reason"],["resonable","reasonable"],["resons","reasons"],["resonse","response"],["resonses","responses"],["resoource","resource"],["resoourced","resourced"],["resoources","resources"],["resoourcing","resourcing"],["resopnse","response"],["resopnses","responses"],["resorce","resource"],["resorced","resourced"],["resorces","resources"],["resorcing","resourcing"],["resore","restore"],["resorece","resource"],["resoreces","resources"],["resoruce","resource"],["resoruced","resourced"],["resoruces","resources"],["resorucing","resourcing"],["resotration","restoration"],["resotrations","restorations"],["resotrative","restorative"],["resotre","restore"],["resotrer","restorer"],["resotrers","restorers"],["resotres","restores"],["resotring","restoring"],["resouce","resource"],["resouced","resourced"],["resouces","resources"],["resoucing","resourcing"],["resoultion","resolution"],["resoultions","resolutions"],["resourcees","resources"],["resourceype","resourcetype"],["resoure","resource"],["resourecs","resources"],["resoured","resourced"],["resoures","resources"],["resourses","resources"],["resoution","resolution"],["resoves","resolves"],["resovle","resolve"],["resovled","resolved"],["resovles","resolves"],["resovling","resolving"],["respawining","respawning"],["respecitve","respective"],["respecitvely","respectively"],["respecive","respective"],["respecively","respectively"],["respectivelly","respectively"],["respectivley","respectively"],["respectivly","respectively"],["respnse","response"],["respnses","responses"],["respoduce","reproduce"],["responce","response"],["responces","responses"],["responibilities","responsibilities"],["responisble","responsible"],["responnsibilty","responsibility"],["responsabilities","responsibilities"],["responsability","responsibility"],["responsable","responsible"],["responsbile","responsible"],["responser's","responder's"],["responser","responder"],["responsers","responders"],["responsess","responses"],["responsibile","responsible"],["responsibilites","responsibilities"],["responsibilty","responsibility"],["responsiblities","responsibilities"],["responsiblity","responsibility"],["responsing","responding"],["respose","response"],["resposes","responses"],["resposibility","responsibility"],["resposible","responsible"],["resposiblity","responsibility"],["respositories","repositories"],["respository","repository"],["resposive","responsive"],["resposiveness","responsiveness"],["resposne","response"],["resposnes","responses"],["respresent","represent"],["respresentation","representation"],["respresentational","representational"],["respresentations","representations"],["respresented","represented"],["respresenting","representing"],["respresents","represents"],["resquest","request"],["resrouce","resource"],["resrouced","resourced"],["resrouces","resources"],["resroucing","resourcing"],["reSructuredText","reStructuredText"],["resrved","reserved"],["ressapee","recipe"],["ressemblance","resemblance"],["ressemble","resemble"],["ressembled","resembled"],["ressemblence","resemblance"],["ressembling","resembling"],["ressemle","resemble"],["resset","reset"],["resseted","reset"],["ressets","resets"],["ressetting","resetting"],["ressize","resize"],["ressizes","resizes"],["ressource","resource"],["ressourced","resourced"],["ressources","resources"],["ressourcing","resourcing"],["resssurecting","resurrecting"],["ressult","result"],["ressurect","resurrect"],["ressurected","resurrected"],["ressurecting","resurrecting"],["ressurection","resurrection"],["ressurects","resurrects"],["ressurrection","resurrection"],["restarant","restaurant"],["restarants","restaurants"],["restaraunt","restaurant"],["restaraunteur","restaurateur"],["restaraunteurs","restaurateurs"],["restaraunts","restaurants"],["restauranteurs","restaurateurs"],["restauration","restoration"],["restauraunt","restaurant"],["restaurnad","restaurant"],["restaurnat","restaurant"],["resteraunt","restaurant"],["resteraunts","restaurants"],["restes","reset"],["restesting","retesting"],["resticted","restricted"],["restoding","restoring"],["restoiring","restoring"],["restor","restore"],["restorated","restored"],["restoreable","restorable"],["restoreble","restorable"],["restoreing","restoring"],["restors","restores"],["restouration","restoration"],["restrcted","restricted"],["restrcuture","restructure"],["restriced","restricted"],["restroing","restoring"],["reStructuredTetx","reStructuredText"],["reStructuredTxet","reStructuredText"],["reStrucuredText","reStructuredText"],["restuarant","restaurant"],["restuarants","restaurants"],["reStucturedText","reStructuredText"],["restucturing","restructuring"],["reStucuredText","reStructuredText"],["resturant","restaurant"],["resturants","restaurants"],["resturaunt","restaurant"],["resturaunts","restaurants"],["resturcturation","restructuration"],["resturcture","restructure"],["resturctured","restructured"],["resturctures","restructures"],["resturcturing","restructuring"],["resturns","returns"],["resuable","reusable"],["resuables","reusables"],["resubstituion","resubstitution"],["resuction","reduction"],["resuilt","result"],["resuilted","resulted"],["resuilting","resulting"],["resuilts","results"],["resul","result"],["resuling","resulting"],["resullt","result"],["resulotion","resolution"],["resulsets","resultsets"],["resulst","results"],["resultion","resolution"],["resultions","resolutions"],["resultung","resulting"],["resulution","resolution"],["resumbmitting","resubmitting"],["resumitted","resubmitted"],["resumt","resume"],["resuorce","resource"],["resuorced","resourced"],["resuorces","resources"],["resuorcing","resourcing"],["resurce","resource"],["resurced","resourced"],["resurces","resources"],["resurcing","resourcing"],["resurecting","resurrecting"],["resursively","recursively"],["resuse","reuse"],["resuts","results"],["resycn","resync"],["retalitated","retaliated"],["retalitation","retaliation"],["retangles","rectangles"],["retanslate","retranslate"],["rether","rather"],["retieve","retrieve"],["retieved","retrieved"],["retieves","retrieves"],["retieving","retrieving"],["retinew","retinue"],["retireve","retrieve"],["retireved","retrieved"],["retirever","retriever"],["retirevers","retrievers"],["retireves","retrieves"],["retireving","retrieving"],["retirned","returned"],["retore","restore"],["retored","restored"],["retores","restores"],["retoric","rhetoric"],["retorical","rhetorical"],["retoring","restoring"],["retourned","returned"],["retpresenting","representing"],["retquirement","requirement"],["retquirements","requirements"],["retquireseek","requireseek"],["retquiresgpos","requiresgpos"],["retquiresgsub","requiresgsub"],["retquiressl","requiressl"],["retranser","retransfer"],["retransferd","retransferred"],["retransfered","retransferred"],["retransfering","retransferring"],["retransferrd","retransferred"],["retransmited","retransmitted"],["retransmition","retransmission"],["retreevable","retrievable"],["retreeval","retrieval"],["retreeve","retrieve"],["retreeved","retrieved"],["retreeves","retrieves"],["retreeving","retrieving"],["retreivable","retrievable"],["retreival","retrieval"],["retreive","retrieve"],["retreived","retrieved"],["retreives","retrieves"],["retreiving","retrieving"],["retrevable","retrievable"],["retreval","retrieval"],["retreve","retrieve"],["retreved","retrieved"],["retreves","retrieves"],["retreving","retrieving"],["retrict","restrict"],["retricted","restricted"],["retriebe","retrieve"],["retriece","retrieve"],["retrieces","retrieves"],["retriev","retrieve"],["retrieveds","retrieved"],["retrive","retrieve"],["retrived","retrieved"],["retrives","retrieves"],["retriving","retrieving"],["retrn","return"],["retrned","returned"],["retrns","returns"],["retrun","return"],["retruned","returned"],["retruns","returns"],["retrvieve","retrieve"],["retrvieved","retrieved"],["retrviever","retriever"],["retrvievers","retrievers"],["retrvieves","retrieves"],["retsart","restart"],["retsarts","restarts"],["retun","return"],["retunrned","returned"],["retunrs","returns"],["retuns","returns"],["retur","return"],["reture","return"],["retured","returned"],["returend","returned"],["retures","returns"],["returing","returning"],["returm","return"],["returmed","returned"],["returming","returning"],["returms","returns"],["returnd","returned"],["returnes","returns"],["returnig","returning"],["returnn","return"],["returnned","returned"],["returnning","returning"],["returs","returns"],["retursn","returns"],["retutning","returning"],["retyring","retrying"],["reudce","reduce"],["reudced","reduced"],["reudces","reduces"],["reudction","reduction"],["reudctions","reductions"],["reuest","request"],["reuests","requests"],["reulator","regulator"],["reundant","redundant"],["reundantly","redundantly"],["reuplad","reupload"],["reupladed","reuploaded"],["reuplader","reuploader"],["reupladers","reuploaders"],["reuplading","reuploading"],["reuplads","reuploads"],["reuplaod","reupload"],["reuplaoded","reuploaded"],["reuplaoder","reuploader"],["reuplaoders","reuploaders"],["reuplaoding","reuploading"],["reuplaods","reuploads"],["reuplod","reupload"],["reuploded","reuploaded"],["reuploder","reuploader"],["reuploders","reuploaders"],["reuploding","reuploading"],["reuplods","reuploads"],["reuqest","request"],["reuqested","requested"],["reuqesting","requesting"],["reuqests","requests"],["reurn","return"],["reursively","recursively"],["reuslt","result"],["reussing","reusing"],["reutnred","returned"],["reutrn","return"],["reutrns","returns"],["revaildating","revalidating"],["revaluated","reevaluated"],["reveiw","review"],["reveiwed","reviewed"],["reveiwer","reviewer"],["reveiwers","reviewers"],["reveiwing","reviewing"],["reveiws","reviews"],["revelent","relevant"],["revelution","revolution"],["revelutions","revolutions"],["reveokes","revokes"],["reverce","reverse"],["reverced","reversed"],["revereces","references"],["reverese","reverse"],["reveresed","reversed"],["reveret","revert"],["revereted","reverted"],["reversable","reversible"],["reverse-engeneer","reverse-engineer"],["reverse-engeneering","reverse-engineering"],["reverse-engieer","reverse-engineer"],["reverseed","reversed"],["reversees","reverses"],["reverve","reserve"],["reverved","reserved"],["revewrse","reverse"],["reviewl","review"],["reviewsectio","reviewsection"],["revisisions","revisions"],["revison","revision"],["revisons","revisions"],["revist","revisit"],["revisted","revisited"],["revisting","revisiting"],["revists","revisits"],["reviwed","reviewed"],["reviwer","reviewer"],["reviwers","reviewers"],["reviwing","reviewing"],["revoluion","revolution"],["revolutionar","revolutionary"],["revrese","reverse"],["revrieve","retrieve"],["revrieved","retrieved"],["revriever","retriever"],["revrievers","retrievers"],["revrieves","retrieves"],["revsion","revision"],["rewiev","review"],["rewieved","reviewed"],["rewiever","reviewer"],["rewieving","reviewing"],["rewievs","reviews"],["rewirtable","rewritable"],["rewirte","rewrite"],["rewirtten","rewritten"],["rewitable","rewritable"],["rewite","rewrite"],["rewitten","rewritten"],["reworkd","reworked"],["rewriet","rewrite"],["rewriite","rewrite"],["rewriten","rewritten"],["rewritting","rewriting"],["rewuired","required"],["rference","reference"],["rferences","references"],["rfeturned","returned"],["rgister","register"],["rhymme","rhyme"],["rhythem","rhythm"],["rhythim","rhythm"],["rhythimcally","rhythmically"],["rhytmic","rhythmic"],["ridiculus","ridiculous"],["righ","right"],["righht","right"],["righmost","rightmost"],["rightt","right"],["rigourous","rigorous"],["rigt","right"],["rigth","right"],["rigths","rights"],["rigurous","rigorous"],["riminder","reminder"],["riminders","reminders"],["riminding","reminding"],["rimitives","primitives"],["rininging","ringing"],["rispective","respective"],["ristrict","restrict"],["ristricted","restricted"],["ristriction","restriction"],["ritable","writable"],["rivised","revised"],["rizes","rises"],["rlation","relation"],["rlse","else"],["rmeote","remote"],["rmeove","remove"],["rmeoved","removed"],["rmeoves","removes"],["rmove","remove"],["rmoved","removed"],["rmoving","removing"],["roataion","rotation"],["roatation","rotation"],["roated","rotated"],["roation","rotation"],["roboustness","robustness"],["robustnes","robustness"],["Rockerfeller","Rockefeller"],["rococco","rococo"],["rocord","record"],["rocorded","recorded"],["rocorder","recorder"],["rocording","recording"],["rocordings","recordings"],["rocords","records"],["roduceer","producer"],["roigin","origin"],["roiginal","original"],["roiginally","originally"],["roiginals","originals"],["roiginating","originating"],["roigins","origins"],["romote","remote"],["romoted","remoted"],["romoteing","remoting"],["romotely","remotely"],["romotes","remotes"],["romoting","remoting"],["romotly","remotely"],["roomate","roommate"],["ropeat","repeat"],["rorated","rotated"],["rosponse","response"],["rosponsive","responsive"],["rotaion","rotation"],["rotaions","rotations"],["rotaiton","rotation"],["rotaitons","rotations"],["rotat","rotate"],["rotataion","rotation"],["rotataions","rotations"],["rotateable","rotatable"],["rouding","rounding"],["roughtly","roughly"],["rougly","roughly"],["rouine","routine"],["rouines","routines"],["round-robbin","round-robin"],["roundign","rounding"],["roung","round"],["rountine","routine"],["rountines","routines"],["routiens","routines"],["routins","routines"],["rovide","provide"],["rovided","provided"],["rovider","provider"],["rovides","provides"],["roviding","providing"],["rqeuested","requested"],["rqeuesting","requesting"],["rquested","requested"],["rquesting","requesting"],["rquire","require"],["rquired","required"],["rquirement","requirement"],["rquires","requires"],["rquiring","requiring"],["rranslation","translation"],["rranslations","translations"],["rrase","erase"],["rrror","error"],["rrrored","errored"],["rrroring","erroring"],["rrrors","errors"],["rubarb","rhubarb"],["rucuperate","recuperate"],["rudimentally","rudimentary"],["rudimentatry","rudimentary"],["rudimentory","rudimentary"],["rudimentry","rudimentary"],["rulle","rule"],["rumatic","rheumatic"],["runn","run"],["runnig","running"],["runnign","running"],["runnigng","running"],["runnin","running"],["runnint","running"],["runnners","runners"],["runnning","running"],["runns","runs"],["runnung","running"],["runting","runtime"],["rurrent","current"],["russina","Russian"],["Russion","Russian"],["rwite","write"],["rysnc","rsync"],["rythem","rhythm"],["rythim","rhythm"],["rythm","rhythm"],["rythmic","rhythmic"],["rythyms","rhythms"],["saame","same"],["sabatage","sabotage"],["sabatour","saboteur"],["sacalar","scalar"],["sacalars","scalars"],["sacarin","saccharin"],["sacle","scale"],["sacrafice","sacrifice"],["sacreligious","sacrilegious"],["Sacremento","Sacramento"],["sacrifical","sacrificial"],["sacrifying","sacrificing"],["sacrilegeous","sacrilegious"],["sacrin","saccharin"],["sade","sad"],["saem","same"],["safe-pooint","safe-point"],["safe-pooints","safe-points"],["safeing","saving"],["safepooint","safepoint"],["safepooints","safepoints"],["safequard","safeguard"],["saferi","Safari"],["safetly","safely"],["safly","safely"],["saftey","safety"],["safty","safety"],["saggital","sagittal"],["sagital","sagittal"],["Sagitarius","Sagittarius"],["sais","says"],["saleries","salaries"],["salery","salary"],["salveof","slaveof"],["samle","sample"],["samled","sampled"],["samll","small"],["samller","smaller"],["sammon","salmon"],["samori","samurai"],["sampel","sample"],["sampeld","sampled"],["sampels","samples"],["samwich","sandwich"],["samwiches","sandwiches"],["sanaty","sanity"],["sanctionning","sanctioning"],["sandobx","sandbox"],["sandwhich","sandwich"],["Sanhedrim","Sanhedrin"],["sanitizisation","sanitization"],["sanizer","sanitizer"],["sanpshot","snapshot"],["sanpsnots","snapshots"],["sansitizer","sanitizer"],["sansitizers","sanitizers"],["santioned","sanctioned"],["santize","sanitize"],["santized","sanitized"],["santizes","sanitizes"],["santizing","sanitizing"],["sanwich","sandwich"],["sanwiches","sandwiches"],["sanytise","sanitise"],["sanytize","sanitize"],["saphire","sapphire"],["saphires","sapphires"],["sargant","sergeant"],["sargeant","sergeant"],["sarted","started"],["sarter","starter"],["sarters","starters"],["sastisfies","satisfies"],["satandard","standard"],["satandards","standards"],["satelite","satellite"],["satelites","satellites"],["satelitte","satellite"],["satellittes","satellites"],["satement","statement"],["satements","statements"],["saterday","Saturday"],["saterdays","Saturdays"],["satified","satisfied"],["satifies","satisfies"],["satifsy","satisfy"],["satify","satisfy"],["satifying","satisfying"],["satisfactority","satisfactorily"],["satisfiabilty","satisfiability"],["satisfing","satisfying"],["satisfyied","satisfied"],["satisifed","satisfied"],["satisified","satisfied"],["satisifies","satisfies"],["satisify","satisfy"],["satisifying","satisfying"],["satistying","satisfying"],["satric","satiric"],["satrical","satirical"],["satrically","satirically"],["sattelite","satellite"],["sattelites","satellites"],["sattellite","satellite"],["sattellites","satellites"],["satuaday","Saturday"],["satuadays","Saturdays"],["saturdey","Saturday"],["satursday","Saturday"],["satus","status"],["saught","sought"],["sav","save"],["savees","saves"],["saveing","saving"],["savely","safely"],["savere","severe"],["savety","safety"],["savgroup","savegroup"],["savy","savvy"],["saxaphone","saxophone"],["sbsampling","subsampling"],["scahr","schar"],["scalarr","scalar"],["scaleability","scalability"],["scaleable","scalable"],["scaleing","scaling"],["scalled","scaled"],["scandanavia","Scandinavia"],["scaned","scanned"],["scaning","scanning"],["scannning","scanning"],["scaricity","scarcity"],["scavange","scavenge"],["scavanged","scavenged"],["scavanger","scavenger"],["scavangers","scavengers"],["scavanges","scavenges"],["sccope","scope"],["sceanrio","scenario"],["sceanrios","scenarios"],["scecified","specified"],["scenarion","scenario"],["scenarions","scenarios"],["scenegraaph","scenegraph"],["scenegraaphs","scenegraphs"],["sceond","second"],["sceonds","seconds"],["scetch","sketch"],["scetched","sketched"],["scetches","sketches"],["scetching","sketching"],["schdule","schedule"],["schduled","scheduled"],["schduleing","scheduling"],["schduler","scheduler"],["schdules","schedules"],["schduling","scheduling"],["schedual","schedule"],["scheduald","scheduled"],["schedualed","scheduled"],["schedualing","scheduling"],["schedulier","scheduler"],["schedulling","scheduling"],["scheduluing","scheduling"],["schem","scheme"],["schemd","schemed"],["schems","schemes"],["schme","scheme"],["schmea","schema"],["schmeas","schemas"],["schmes","schemes"],["scholarhip","scholarship"],["scholarhips","scholarships"],["scholdn't","shouldn't"],["schould","should"],["scientfic","scientific"],["scientfically","scientifically"],["scientficaly","scientifically"],["scientficly","scientifically"],["scientifc","scientific"],["scientifcally","scientifically"],["scientifcaly","scientifically"],["scientifcly","scientifically"],["scientis","scientist"],["scientiss","scientist"],["scince","science"],["scinece","science"],["scintiallation","scintillation"],["scintillatqt","scintillaqt"],["scipted","scripted"],["scipting","scripting"],["sciript","script"],["sciripts","scripts"],["scirpt","script"],["scirpts","scripts"],["scketch","sketch"],["scketched","sketched"],["scketches","sketches"],["scketching","sketching"],["sclar","scalar"],["scneario","scenario"],["scnearios","scenarios"],["scoket","socket"],["scoll","scroll"],["scolling","scrolling"],["scondary","secondary"],["scopeing","scoping"],["scorebord","scoreboard"],["scources","sources"],["scrach","scratch"],["scrached","scratched"],["scraches","scratches"],["scraching","scratching"],["scrachs","scratches"],["scrao","scrap"],["screeb","screen"],["screebs","screens"],["screenchot","screenshot"],["screenchots","screenshots"],["screenwrighter","screenwriter"],["screnn","screen"],["scriopted","scripted"],["scriopting","scripting"],["scriopts","scripts"],["scriopttype","scripttype"],["scriping","scripting"],["scripst","scripts"],["scriptype","scripttype"],["scritp","script"],["scritped","scripted"],["scritping","scripting"],["scritps","scripts"],["scritpt","script"],["scritpts","scripts"],["scroipt","script"],["scroipted","scripted"],["scroipting","scripting"],["scroipts","scripts"],["scroipttype","scripttype"],["scrollablbe","scrollable"],["scrollin","scrolling"],["scroolbar","scrollbar"],["scrpt","script"],["scrpted","scripted"],["scrpting","scripting"],["scrpts","scripts"],["scrren","screen"],["scrutinity","scrutiny"],["scubscribe","subscribe"],["scubscribed","subscribed"],["scubscriber","subscriber"],["scubscribes","subscribes"],["scuccessully","successfully"],["scupt","sculpt"],["scupted","sculpted"],["scupting","sculpting"],["scupture","sculpture"],["scuptures","sculptures"],["seach","search"],["seached","searched"],["seaches","searches"],["seaching","searching"],["seachkey","searchkey"],["seacrchable","searchable"],["seamlessley","seamlessly"],["seamlessy","seamlessly"],["searcahble","searchable"],["searcheable","searchable"],["searchin","searching"],["searchs","searches"],["seatch","search"],["seccond","second"],["secconds","seconds"],["secction","section"],["secene","scene"],["secific","specific"],["secion","section"],["secions","sections"],["secirity","security"],["seciton","section"],["secitons","sections"],["secne","scene"],["secod","second"],["secods","seconds"],["seconadry","secondary"],["seconcary","secondary"],["secondaray","secondary"],["seconday","secondary"],["seconf","second"],["seconfs","seconds"],["seconly","secondly"],["secont","second"],["secontary","secondary"],["secontly","secondly"],["seconts","seconds"],["secord","second"],["secords","seconds"],["secotr","sector"],["secound","second"],["secoundary","secondary"],["secoundly","secondly"],["secounds","seconds"],["secquence","sequence"],["secratary","secretary"],["secretery","secretary"],["secrion","section"],["secruity","security"],["sectin","section"],["sectins","sections"],["sectionning","sectioning"],["secton","section"],["sectoned","sectioned"],["sectoning","sectioning"],["sectons","sections"],["sectopm","section"],["sectopmed","sectioned"],["sectopming","sectioning"],["sectopms","sections"],["sectopn","section"],["sectopned","sectioned"],["sectopning","sectioning"],["sectopns","sections"],["secue","secure"],["secuely","securely"],["secuence","sequence"],["secuenced","sequenced"],["secuences","sequences"],["secuencial","sequential"],["secuencing","sequencing"],["secuirty","security"],["secuity","security"],["secund","second"],["secunds","seconds"],["securiy","security"],["securiyt","security"],["securly","securely"],["securre","secure"],["securrely","securely"],["securrly","securely"],["securtity","security"],["securtiy","security"],["securty","security"],["securuity","security"],["sedereal","sidereal"],["seeem","seem"],["seeen","seen"],["seelect","select"],["seelected","selected"],["seemes","seems"],["seemless","seamless"],["seemlessly","seamlessly"],["seesion","session"],["seesions","sessions"],["seetings","settings"],["seeverities","severities"],["seeverity","severity"],["segault","segfault"],["segaults","segfaults"],["segement","segment"],["segementation","segmentation"],["segemented","segmented"],["segements","segments"],["segemnts","segments"],["segfualt","segfault"],["segfualts","segfaults"],["segmantation","segmentation"],["segmend","segment"],["segmendation","segmentation"],["segmended","segmented"],["segmends","segments"],["segmenet","segment"],["segmenetd","segmented"],["segmeneted","segmented"],["segmenets","segments"],["segmenst","segments"],["segmentaion","segmentation"],["segmente","segment"],["segmentes","segments"],["segmetn","segment"],["segmetned","segmented"],["segmetns","segments"],["segument","segment"],["seguoys","segues"],["seh","she"],["seige","siege"],["seing","seeing"],["seinor","senior"],["seires","series"],["sekect","select"],["sekected","selected"],["sekects","selects"],["selcetion","selection"],["selct","select"],["selctable","selectable"],["selctables","selectable"],["selcted","selected"],["selcting","selecting"],["selction","selection"],["selctions","selections"],["seldomly","seldom"],["selecction","selection"],["selecctions","selections"],["seleced","selected"],["selecetd","selected"],["seleceted","selected"],["selecgt","select"],["selecgted","selected"],["selecgting","selecting"],["selecing","selecting"],["selecrtion","selection"],["selectd","selected"],["selectes","selects"],["selectoin","selection"],["selecton","selection"],["selectons","selections"],["seledted","selected"],["selektions","selections"],["selektor","selector"],["selet","select"],["selets","selects"],["self-comparisson","self-comparison"],["self-contianed","self-contained"],["self-referencial","self-referential"],["self-refering","self-referring"],["selfs","self"],["sellect","select"],["sellected","selected"],["selv","self"],["semaintics","semantics"],["semaphone","semaphore"],["semaphones","semaphores"],["semaphor","semaphore"],["semaphors","semaphores"],["semapthore","semaphore"],["semapthores","semaphores"],["sematic","semantic"],["sematical","semantical"],["sematically","semantically"],["sematics","semantics"],["sematnics","semantics"],["semding","sending"],["sementation","segmentation"],["sementic","semantic"],["sementically","semantically"],["sementics","semantics"],["semgent","segment"],["semgentation","segmentation"],["semicolor","semicolon"],["semicolumn","semicolon"],["semicondutor","semiconductor"],["sempahore","semaphore"],["sempahores","semaphores"],["sempaphore","semaphore"],["sempaphores","semaphores"],["semphore","semaphore"],["semphores","semaphores"],["sempphore","semaphore"],["senaphore","semaphore"],["senaphores","semaphores"],["senario","scenario"],["senarios","scenarios"],["sencond","second"],["sencondary","secondary"],["senconds","seconds"],["sendign","sending"],["sendinging","sending"],["sendinng","sending"],["senfile","sendfile"],["senintels","sentinels"],["senitnel","sentinel"],["senitnels","sentinels"],["senquence","sequence"],["sensative","sensitive"],["sensetive","sensitive"],["sensisble","sensible"],["sensistive","sensitive"],["sensititive","sensitive"],["sensititivies","sensitivities"],["sensititivity","sensitivity"],["sensititivy","sensitivity"],["sensitiv","sensitive"],["sensitiveties","sensitivities"],["sensitivety","sensitivity"],["sensitivites","sensitivities"],["sensitivties","sensitivities"],["sensitivty","sensitivity"],["sensitve","sensitive"],["senstive","sensitive"],["sensure","censure"],["sentance","sentence"],["sentances","sentences"],["senteces","sentences"],["sentense","sentence"],["sentienl","sentinel"],["sentinal","sentinel"],["sentinals","sentinels"],["sention","section"],["sentions","sections"],["sentive","sensitive"],["sentivite","sensitive"],["sepaate","separate"],["separartor","separator"],["separat","separate"],["separatelly","separately"],["separater","separator"],["separatley","separately"],["separatly","separately"],["separato","separator"],["separatos","separators"],["separatring","separating"],["separed","separated"],["separete","separate"],["separeted","separated"],["separetedly","separately"],["separetely","separately"],["separeter","separator"],["separetes","separates"],["separeting","separating"],["separetly","separately"],["separetor","separator"],["separtates","separates"],["separte","separate"],["separted","separated"],["separtes","separates"],["separting","separating"],["sepatae","separate"],["sepatate","separate"],["sepcial","special"],["sepcific","specific"],["sepcifically","specifically"],["sepcification","specification"],["sepcifications","specifications"],["sepcified","specified"],["sepcifier","specifier"],["sepcifies","specifies"],["sepcify","specify"],["sepcifying","specifying"],["sepearable","separable"],["sepearate","separate"],["sepearated","separated"],["sepearately","separately"],["sepearates","separates"],["sepearation","separation"],["sepearator","separator"],["sepearators","separators"],["sepearet","separate"],["sepearetly","separately"],["sepearte","separate"],["sepearted","separated"],["sepeartely","separately"],["sepeartes","separates"],["sepeartor","separator"],["sepeartors","separators"],["sepeate","separate"],["sepeated","separated"],["sepeates","separates"],["sepeator","separator"],["sepeators","separators"],["sepecial","special"],["sepecifed","specified"],["sepecific","specific"],["sepecification","specification"],["sepecified","specified"],["sepecifier","specifier"],["sepecifiers","specifiers"],["sepecifies","specifies"],["sepecify","specify"],["sepectral","spectral"],["sepeicfy","specify"],["sependent","dependent"],["sepending","depending"],["seperable","separable"],["seperad","separate"],["seperadly","separately"],["seperaly","separately"],["seperaor","separator"],["seperaors","separators"],["seperare","separate"],["seperared","separated"],["seperares","separates"],["seperat","separate"],["seperataed","separated"],["seperatally","separately"],["seperataly","separately"],["seperatated","separated"],["seperatd","separated"],["seperate","separate"],["seperated","separated"],["seperatedly","separately"],["seperatedy","separated"],["seperateely","separately"],["seperateing","separating"],["seperatelly","separately"],["seperately","separately"],["seperater","separator"],["seperaters","separators"],["seperates","separates"],["seperating","separating"],["seperation","separation"],["seperations","separations"],["seperatism","separatism"],["seperatist","separatist"],["seperatley","separately"],["seperatly","separately"],["seperato","separator"],["seperator","separator"],["seperators","separators"],["seperatos","separators"],["sepereate","separate"],["sepereated","separated"],["sepereates","separates"],["sepererate","separate"],["sepererated","separated"],["sepererates","separates"],["seperete","separate"],["sepereted","separated"],["seperetes","separates"],["seperratly","separately"],["sepertator","separator"],["sepertators","separators"],["sepertor","separator"],["sepertors","separators"],["sepetaror","separator"],["sepetarors","separators"],["sepetate","separate"],["sepetated","separated"],["sepetately","separately"],["sepetates","separates"],["sepina","subpoena"],["seporate","separate"],["sepparation","separation"],["sepparations","separations"],["sepperate","separate"],["seprarate","separate"],["seprate","separate"],["seprated","separated"],["seprator","separator"],["seprators","separators"],["Septemer","September"],["seqence","sequence"],["seqenced","sequenced"],["seqences","sequences"],["seqencing","sequencing"],["seqense","sequence"],["seqensed","sequenced"],["seqenses","sequences"],["seqensing","sequencing"],["seqenstial","sequential"],["seqential","sequential"],["seqeuence","sequence"],["seqeuencer","sequencer"],["seqeuental","sequential"],["seqeunce","sequence"],["seqeuncer","sequencer"],["seqeuntials","sequentials"],["sequcne","sequence"],["sequece","sequence"],["sequecence","sequence"],["sequecences","sequences"],["sequeces","sequences"],["sequeence","sequence"],["sequelce","sequence"],["sequemce","sequence"],["sequemces","sequences"],["sequencial","sequential"],["sequencially","sequentially"],["sequencies","sequences"],["sequense","sequence"],["sequensed","sequenced"],["sequenses","sequences"],["sequensing","sequencing"],["sequenstial","sequential"],["sequentialy","sequentially"],["sequenzes","sequences"],["sequetial","sequential"],["sequnce","sequence"],["sequnced","sequenced"],["sequncer","sequencer"],["sequncers","sequencers"],["sequnces","sequences"],["sequnece","sequence"],["sequneces","sequences"],["ser","set"],["serach","search"],["serached","searched"],["seracher","searcher"],["seraches","searches"],["seraching","searching"],["serachs","searches"],["serailisation","serialisation"],["serailise","serialise"],["serailised","serialised"],["serailization","serialization"],["serailize","serialize"],["serailized","serialized"],["serailse","serialise"],["serailsed","serialised"],["serailze","serialize"],["serailzed","serialized"],["serch","search"],["serched","searched"],["serches","searches"],["serching","searching"],["sercive","service"],["sercived","serviced"],["sercives","services"],["serciving","servicing"],["sereverless","serverless"],["serevrless","serverless"],["sergent","sergeant"],["serialialisation","serialisation"],["serialialise","serialise"],["serialialised","serialised"],["serialialises","serialises"],["serialialising","serialising"],["serialialization","serialization"],["serialialize","serialize"],["serialialized","serialized"],["serialializes","serializes"],["serialializing","serializing"],["serialiasation","serialisation"],["serialiazation","serialization"],["serialsiation","serialisation"],["serialsie","serialise"],["serialsied","serialised"],["serialsies","serialises"],["serialsing","serialising"],["serialziation","serialization"],["serialzie","serialize"],["serialzied","serialized"],["serialzies","serializes"],["serialzing","serializing"],["serice","service"],["serie","series"],["seriel","serial"],["serieses","series"],["serios","serious"],["seriouly","seriously"],["seriuos","serious"],["serivce","service"],["serivces","services"],["sersies","series"],["sertificate","certificate"],["sertificated","certificated"],["sertificates","certificates"],["sertification","certification"],["servece","service"],["serveced","serviced"],["serveces","services"],["servecing","servicing"],["serveice","service"],["serveiced","serviced"],["serveices","services"],["serveicing","servicing"],["serveless","serverless"],["serveral","several"],["serverite","severity"],["serverites","severities"],["serverities","severities"],["serverity","severity"],["serverles","serverless"],["serverlesss","serverless"],["serverlsss","serverless"],["servicies","services"],["servie","service"],["servies","services"],["servive","service"],["servoce","service"],["servoced","serviced"],["servoces","services"],["servocing","servicing"],["sesion","session"],["sesions","sessions"],["sesitive","sensitive"],["sesitively","sensitively"],["sesitiveness","sensitiveness"],["sesitivity","sensitivity"],["sessio","session"],["sesssion","session"],["sesssions","sessions"],["sestatusbar","setstatusbar"],["sestatusmsg","setstatusmsg"],["setevn","setenv"],["setgit","setgid"],["seting","setting"],["setings","settings"],["setion","section"],["setions","sections"],["setitng","setting"],["setitngs","settings"],["setquential","sequential"],["setted","set"],["settelement","settlement"],["settign","setting"],["settigns","settings"],["settigs","settings"],["settiing","setting"],["settiings","settings"],["settinga","settings"],["settingss","settings"],["settins","settings"],["settlment","settlement"],["settng","setting"],["settter","setter"],["settters","setters"],["settting","setting"],["setttings","settings"],["settup","setup"],["setyp","setup"],["setyps","setups"],["seuence","sequence"],["seuences","sequences"],["sevaral","several"],["severat","several"],["severeal","several"],["severirirty","severity"],["severirities","severities"],["severite","severity"],["severites","severities"],["severiy","severity"],["severl","several"],["severley","severely"],["severly","severely"],["sevice","service"],["sevirity","severity"],["sevral","several"],["sevrally","severally"],["sevrity","severity"],["sewdonim","pseudonym"],["sewdonims","pseudonyms"],["sewrvice","service"],["sfety","safety"],["sgadow","shadow"],["sh1sum","sha1sum"],["shadasloo","shadaloo"],["shaddow","shadow"],["shadhow","shadow"],["shadoloo","shadaloo"],["shal","shall"],["shandeleer","chandelier"],["shandeleers","chandeliers"],["shandow","shadow"],["shaneal","chenille"],["shanghi","Shanghai"],["shapshot","snapshot"],["shapshots","snapshots"],["shapsnot","snapshot"],["shapsnots","snapshots"],["sharable","shareable"],["shareed","shared"],["shareing","sharing"],["sharloton","charlatan"],["sharraid","charade"],["sharraids","charades"],["shashes","slashes"],["shatow","ch\xE2teau"],["shbang","shebang"],["shedule","schedule"],["sheduled","scheduled"],["shedules","schedules"],["sheduling","scheduling"],["sheepherd","shepherd"],["sheepherds","shepherds"],["sheeps","sheep"],["sheild","shield"],["sheilded","shielded"],["sheilding","shielding"],["sheilds","shields"],["shepe","shape"],["shepered","shepherd"],["sheperedly","shepherdly"],["shepereds","shepherds"],["shepes","shapes"],["sheping","shaping"],["shepre","sphere"],["shepres","spheres"],["sherif","sheriff"],["shfit","shift"],["shfited","shifted"],["shfiting","shifting"],["shfits","shifts"],["shfted","shifted"],["shicane","chicane"],["shif","shift"],["shif-tab","shift-tab"],["shineing","shining"],["shiped","shipped"],["shiping","shipping"],["shoftware","software"],["shoild","should"],["shoing","showing"],["sholder","shoulder"],["sholdn't","shouldn't"],["sholuld","should"],["sholuldn't","shouldn't"],["shoould","should"],["shopkeeepers","shopkeepers"],["shorcut","shortcut"],["shorcuts","shortcuts"],["shorly","shortly"],["short-cicruit","short-circuit"],["short-cicruits","short-circuits"],["shortcat","shortcut"],["shortcats","shortcuts"],["shortcomming","shortcoming"],["shortcommings","shortcomings"],["shortcutt","shortcut"],["shortern","shorten"],["shorthly","shortly"],["shortkut","shortcut"],["shortkuts","shortcuts"],["shortwhile","short while"],["shotcut","shortcut"],["shotcuts","shortcuts"],["shotdown","shutdown"],["shoucl","should"],["shoud","should"],["shoudl","should"],["shoudld","should"],["shoudle","should"],["shoudln't","shouldn't"],["shoudlnt","shouldn't"],["shoudn't","shouldn't"],["shoudn","shouldn"],["should'nt","shouldn't"],["should't","shouldn't"],["shouldn;t","shouldn't"],["shouldnt'","shouldn't"],["shouldnt","shouldn't"],["shouldnt;","shouldn't"],["shoule","should"],["shoulld","should"],["shouln't","shouldn't"],["shouls","should"],["shoult","should"],["shouod","should"],["shouw","show"],["shouws","shows"],["showvinism","chauvinism"],["shpae","shape"],["shpaes","shapes"],["shpapes","shapes"],["shpere","sphere"],["shperes","spheres"],["shpped","shipped"],["shreak","shriek"],["shreshold","threshold"],["shriks","shrinks"],["shttp","https"],["shudown","shutdown"],["shufle","shuffle"],["shuld","should"],["shure","sure"],["shurely","surely"],["shutdownm","shutdown"],["shuting","shutting"],["shutodwn","shutdown"],["shwo","show"],["shwon","shown"],["shystem","system"],["shystems","systems"],["sibiling","sibling"],["sibilings","siblings"],["sibtitle","subtitle"],["sibtitles","subtitles"],["sicinct","succinct"],["sicinctly","succinctly"],["sicne","since"],["sidde","side"],["sideral","sidereal"],["siduction","seduction"],["siezure","seizure"],["siezures","seizures"],["siffix","suffix"],["siffixed","suffixed"],["siffixes","suffixes"],["siffixing","suffixing"],["sigaled","signaled"],["siganture","signature"],["sigantures","signatures"],["sigen","sign"],["sigificance","significance"],["siginificant","significant"],["siginificantly","significantly"],["siginify","signify"],["sigit","digit"],["sigits","digits"],["sigleton","singleton"],["signales","signals"],["signall","signal"],["signatue","signature"],["signatur","signature"],["signes","signs"],["signficant","significant"],["signficantly","significantly"],["signficiant","significant"],["signfies","signifies"],["signguature","signature"],["signifanct","significant"],["signifant","significant"],["signifantly","significantly"],["signifcant","significant"],["signifcantly","significantly"],["signifficant","significant"],["significanly","significantly"],["significat","significant"],["significatly","significantly"],["significently","significantly"],["signifigant","significant"],["signifigantly","significantly"],["signitories","signatories"],["signitory","signatory"],["signol","signal"],["signto","sign to"],["signul","signal"],["signular","singular"],["signularity","singularity"],["silentely","silently"],["silenty","silently"],["silouhette","silhouette"],["silouhetted","silhouetted"],["silouhettes","silhouettes"],["silouhetting","silhouetting"],["simeple","simple"],["simetrie","symmetry"],["simetries","symmetries"],["simgle","single"],["simialr","similar"],["simialrity","similarity"],["simialrly","similarly"],["simiar","similar"],["similarily","similarly"],["similary","similarly"],["similat","similar"],["similia","similar"],["similiar","similar"],["similiarity","similarity"],["similiarly","similarly"],["similiarty","similarity"],["similiary","similarity"],["simillar","similar"],["similtaneous","simultaneous"],["simlar","similar"],["simlarlity","similarity"],["simlarly","similarly"],["simliar","similar"],["simliarly","similarly"],["simlicity","simplicity"],["simlified","simplified"],["simmetric","symmetric"],["simmetrical","symmetrical"],["simmetry","symmetry"],["simmilar","similar"],["simpification","simplification"],["simpifications","simplifications"],["simpified","simplified"],["simplei","simply"],["simpley","simply"],["simplfy","simplify"],["simplicitly","simplicity"],["simplicty","simplicity"],["simplier","simpler"],["simpliest","simplest"],["simplifed","simplified"],["simplificaiton","simplification"],["simplificaitons","simplifications"],["simplifiy","simplify"],["simplifys","simplifies"],["simpliifcation","simplification"],["simpliifcations","simplifications"],["simplist","simplest"],["simpy","simply"],["simualte","simulate"],["simualted","simulated"],["simualtes","simulates"],["simualting","simulating"],["simualtion","simulation"],["simualtions","simulations"],["simualtor","simulator"],["simualtors","simulators"],["simulaiton","simulation"],["simulaitons","simulations"],["simulantaneous","simultaneous"],["simulantaneously","simultaneously"],["simulataeous","simultaneous"],["simulataeously","simultaneously"],["simulataneity","simultaneity"],["simulataneous","simultaneous"],["simulataneously","simultaneously"],["simulatanious","simultaneous"],["simulataniously","simultaneously"],["simulatanous","simultaneous"],["simulatanously","simultaneously"],["simulatation","simulation"],["simulatenous","simultaneous"],["simulatenously","simultaneously"],["simultanaeous","simultaneous"],["simultaneos","simultaneous"],["simultaneosly","simultaneously"],["simultanious","simultaneous"],["simultaniously","simultaneously"],["simultanous","simultaneous"],["simultanously","simultaneously"],["simutaneously","simultaneously"],["sinature","signature"],["sincerley","sincerely"],["sincerly","sincerely"],["singaled","signaled"],["singals","signals"],["singature","signature"],["singatures","signatures"],["singelar","singular"],["singelarity","singularity"],["singelarly","singularly"],["singelton","singleton"],["singl","single"],["singlar","singular"],["single-threded","single-threaded"],["singlton","singleton"],["singltons","singletons"],["singluar","singular"],["singlular","singular"],["singlularly","singularly"],["singnal","signal"],["singnalled","signalled"],["singnals","signals"],["singolar","singular"],["singoolar","singular"],["singoolarity","singularity"],["singoolarly","singularly"],["singsog","singsong"],["singuarity","singularity"],["singuarl","singular"],["singulat","singular"],["singulaties","singularities"],["sinlge","single"],["sinlges","singles"],["sinply","simply"],["sintac","syntax"],["sintacks","syntax"],["sintacs","syntax"],["sintact","syntax"],["sintacts","syntax"],["sintak","syntax"],["sintaks","syntax"],["sintakt","syntax"],["sintakts","syntax"],["sintax","syntax"],["Sionist","Zionist"],["Sionists","Zionists"],["siply","simply"],["sircle","circle"],["sircles","circles"],["sircular","circular"],["sirect","direct"],["sirected","directed"],["sirecting","directing"],["sirection","direction"],["sirectional","directional"],["sirectionalities","directionalities"],["sirectionality","directionality"],["sirectionals","directionals"],["sirectionless","directionless"],["sirections","directions"],["sirective","directive"],["sirectives","directives"],["sirectly","directly"],["sirectness","directness"],["sirector","director"],["sirectories","directories"],["sirectors","directors"],["sirectory","directory"],["sirects","directs"],["sisnce","since"],["sistem","system"],["sistematically","systematically"],["sistematics","systematics"],["sistematies","systematies"],["sistematising","systematising"],["sistematizing","systematizing"],["sistematy","systematy"],["sistemed","systemed"],["sistemic","systemic"],["sistemically","systemically"],["sistemics","systemics"],["sistemist","systemist"],["sistemists","systemists"],["sistemize","systemize"],["sistemized","systemized"],["sistemizes","systemizes"],["sistemizing","systemizing"],["sistems","systems"],["sitation","situation"],["sitations","situations"],["sitaution","situation"],["sitautions","situations"],["sitck","stick"],["siteu","site"],["sitill","still"],["sitirring","stirring"],["sitirs","stirs"],["sitl","still"],["sitll","still"],["sitmuli","stimuli"],["situationnal","situational"],["situatuion","situation"],["situatuions","situations"],["situatution","situation"],["situatutions","situations"],["situbbornness","stubbornness"],["situdio","studio"],["situdios","studios"],["situration","situation"],["siturations","situations"],["situtaion","situation"],["situtaions","situations"],["situtation","situation"],["situtations","situations"],["siutable","suitable"],["siute","suite"],["sivible","visible"],["siwtch","switch"],["siwtched","switched"],["siwtching","switching"],["sizre","size"],["Skagerak","Skagerrak"],["skalar","scalar"],["skateing","skating"],["skecth","sketch"],["skecthes","sketches"],["skeep","skip"],["skelton","skeleton"],["skept","skipped"],["sketchs","sketches"],["skipd","skipped"],["skipe","skip"],["skiping","skipping"],["skippd","skipped"],["skippped","skipped"],["skippps","skips"],["slach","slash"],["slaches","slashes"],["slase","slash"],["slases","slashes"],["slashs","slashes"],["slaugterhouses","slaughterhouses"],["slect","select"],["slected","selected"],["slecting","selecting"],["slection","selection"],["sleect","select"],["sleeped","slept"],["sleepp","sleep"],["slicable","sliceable"],["slient","silent"],["sliently","silently"],["slighlty","slightly"],["slighly","slightly"],["slightl","slightly"],["slighty","slightly"],["slignt","slight"],["sligntly","slightly"],["sligth","slight"],["sligthly","slightly"],["sligtly","slightly"],["sliped","slipped"],["sliseshow","slideshow"],["slowy","slowly"],["sluggify","slugify"],["smae","same"],["smal","small"],["smaler","smaller"],["smallar","smaller"],["smalles","smallest"],["smaple","sample"],["smaples","samples"],["smealting","smelting"],["smething","something"],["smller","smaller"],["smoe","some"],["smoot","smooth"],["smooter","smoother"],["smoothign","smoothing"],["smooting","smoothing"],["smouth","smooth"],["smouthness","smoothness"],["smove","move"],["snaped","snapped"],["snaphot","snapshot"],["snaphsot","snapshot"],["snaping","snapping"],["snappng","snapping"],["snapsnot","snapshot"],["snapsnots","snapshots"],["sneeks","sneaks"],["snese","sneeze"],["snipet","snippet"],["snipets","snippets"],["snpashot","snapshot"],["snpashots","snapshots"],["snyc","sync"],["snytax","syntax"],["Soalris","Solaris"],["socail","social"],["socalism","socialism"],["socekts","sockets"],["socities","societies"],["soecialize","specialized"],["soem","some"],["soemthing","something"],["soemwhere","somewhere"],["sofisticated","sophisticated"],["softend","softened"],["softwares","software"],["softwre","software"],["sofware","software"],["sofwtare","software"],["sohw","show"],["soilders","soldiers"],["soiurce","source"],["soket","socket"],["sokets","sockets"],["solarmutx","solarmutex"],["solatary","solitary"],["solate","isolate"],["solated","isolated"],["solates","isolates"],["solating","isolating"],["soley","solely"],["solfed","solved"],["solfes","solves"],["solfing","solving"],["solfs","solves"],["soliders","soldiers"],["solification","solidification"],["soliliquy","soliloquy"],["soltion","solution"],["soltuion","solution"],["soltuions","solutions"],["soluable","soluble"],["solum","solemn"],["soluton","solution"],["solutons","solutions"],["solveable","solvable"],["solveing","solving"],["solwed","solved"],["som","some"],["someboby","somebody"],["somehing","something"],["somehting","something"],["somehwat","somewhat"],["somehwere","somewhere"],["somehwo","somehow"],["somelse","someone else"],["somemore","some more"],["somene","someone"],["somenone","someone"],["someon","someone"],["somethig","something"],["somethign","something"],["somethimes","sometimes"],["somethimg","something"],["somethiong","something"],["sometiems","sometimes"],["sometihing","something"],["sometihng","something"],["sometims","sometimes"],["sometines","sometimes"],["someting","something"],["sometinhg","something"],["sometring","something"],["sometrings","somethings"],["somewere","somewhere"],["somewher","somewhere"],["somewho","somehow"],["somme","some"],["somthign","something"],["somthing","something"],["somthingelse","somethingelse"],["somtimes","sometimes"],["somwhat","somewhat"],["somwhere","somewhere"],["somwho","somehow"],["somwhow","somehow"],["sonething","something"],["songlar","singular"],["sooaside","suicide"],["soodonim","pseudonym"],["soource","source"],["sophicated","sophisticated"],["sophisicated","sophisticated"],["sophisitcated","sophisticated"],["sophisticted","sophisticated"],["sophmore","sophomore"],["sorceror","sorcerer"],["sorkflow","workflow"],["sorrounding","surrounding"],["sortig","sorting"],["sortings","sorting"],["sortlst","sortlist"],["sortner","sorter"],["sortnr","sorter"],["soscket","socket"],["sotfware","software"],["souce","source"],["souces","sources"],["soucre","source"],["soucres","sources"],["soudn","sound"],["soudns","sounds"],["sould'nt","shouldn't"],["souldn't","shouldn't"],["soundard","soundcard"],["sountrack","soundtrack"],["sourc","source"],["sourcedrectory","sourcedirectory"],["sourcee","source"],["sourcees","sources"],["sourct","source"],["sourrounding","surrounding"],["sourth","south"],["sourthern","southern"],["southbrige","southbridge"],["souvenier","souvenir"],["souveniers","souvenirs"],["soveits","soviets"],["sover","solver"],["sovereignity","sovereignty"],["soverign","sovereign"],["soverignity","sovereignty"],["soverignty","sovereignty"],["sovle","solve"],["sovled","solved"],["sovren","sovereign"],["spacific","specific"],["spacification","specification"],["spacifications","specifications"],["spacifics","specifics"],["spacified","specified"],["spacifies","specifies"],["spaece","space"],["spaeced","spaced"],["spaeces","spaces"],["spaecing","spacing"],["spageti","spaghetti"],["spagetti","spaghetti"],["spagheti","spaghetti"],["spagnum","sphagnum"],["spainish","Spanish"],["spaning","spanning"],["sparate","separate"],["sparately","separately"],["spash","splash"],["spashed","splashed"],["spashes","splashes"],["spaw","spawn"],["spawed","spawned"],["spawing","spawning"],["spawining","spawning"],["spaws","spawns"],["spcae","space"],["spcaed","spaced"],["spcaes","spaces"],["spcaing","spacing"],["spcecified","specified"],["spcial","special"],["spcific","specific"],["spcification","specification"],["spcifications","specifications"],["spcified","specified"],["spcifies","specifies"],["spcify","specify"],["speaced","spaced"],["speach","speech"],["speacing","spacing"],["spearator","separator"],["spearators","separators"],["spec-complient","spec-compliant"],["specail","special"],["specefic","specific"],["specefically","specifically"],["speceficly","specifically"],["specefied","specified"],["specfic","specific"],["specfically","specifically"],["specfication","specification"],["specfications","specifications"],["specficication","specification"],["specficications","specifications"],["specficied","specified"],["specficies","specifies"],["specficy","specify"],["specficying","specifying"],["specfied","specified"],["specfield","specified"],["specfies","specifies"],["specfifies","specifies"],["specfify","specify"],["specfifying","specifying"],["specfiied","specified"],["specfy","specify"],["specfying","specifying"],["speciafied","specified"],["specialisaiton","specialisation"],["specialisaitons","specialisations"],["specializaiton","specialization"],["specializaitons","specializations"],["specialy","specially"],["specic","specific"],["specical","special"],["specication","specification"],["specidic","specific"],["specied","specified"],["speciefied","specified"],["specifactions","specifications"],["specifc","specific"],["specifcally","specifically"],["specifcation","specification"],["specifcations","specifications"],["specifcied","specified"],["specifclly","specifically"],["specifed","specified"],["specifes","specifies"],["speciffic","specific"],["speciffically","specifically"],["specifially","specifically"],["specificaiton","specification"],["specificaitons","specifications"],["specificallly","specifically"],["specificaly","specifically"],["specificated","specified"],["specificateion","specification"],["specificatin","specification"],["specificaton","specification"],["specificed","specified"],["specifices","specifies"],["specificially","specifically"],["specificiation","specification"],["specificiations","specifications"],["specificically","specifically"],["specificied","specified"],["specificl","specific"],["specificly","specifically"],["specifiction","specification"],["specifictions","specifications"],["specifid","specified"],["specifiec","specific"],["specifiecally","specifically"],["specifiecation","specification"],["specifiecations","specifications"],["specifiecd","specified"],["specifieced","specified"],["specifiecs","specifics"],["specifieed","specified"],["specifiees","specifies"],["specifig","specific"],["specifigation","specification"],["specifigations","specifications"],["specifing","specifying"],["specifities","specifics"],["specifiy","specify"],["specifiying","specifying"],["specifric","specific"],["specift","specify"],["specifyed","specified"],["specifyied","specified"],["specifyig","specifying"],["specifyinhg","specifying"],["speciic","specific"],["speciied","specified"],["speciifc","specific"],["speciifed","specified"],["specilisation","specialisation"],["specilisations","specialisations"],["specilization","specialization"],["specilizations","specializations"],["specilized","specialized"],["speciman","specimen"],["speciries","specifies"],["speciry","specify"],["specivied","specified"],["speciy","specify"],["speciyfing","specifying"],["speciyfying","specifying"],["speciying","specifying"],["spectauclar","spectacular"],["spectaulars","spectaculars"],["spectification","specification"],["spectifications","specifications"],["spectified","specified"],["spectifies","specifies"],["spectify","specify"],["spectifying","specifying"],["spectular","spectacular"],["spectularly","spectacularly"],["spectum","spectrum"],["specturm","spectrum"],["specualtive","speculative"],["specufies","specifies"],["specufy","specify"],["spedific","specific"],["spedified","specified"],["spedify","specify"],["speeak","speak"],["speeaking","speaking"],["speeling","spelling"],["speelling","spelling"],["speep","sleep"],["speep-up","speed-up"],["speeped","sped"],["speeping","sleeping"],["spefcifiable","specifiable"],["spefcific","specific"],["spefcifically","specifically"],["spefcification","specification"],["spefcifications","specifications"],["spefcifics","specifics"],["spefcifieid","specified"],["spefcifieir","specifier"],["spefcifieirs","specifiers"],["spefcifieis","specifies"],["spefcifiy","specify"],["spefcifiying","specifying"],["spefeid","specified"],["spefeir","specifier"],["spefeirs","specifiers"],["spefeis","specifies"],["spefiable","specifiable"],["spefial","special"],["spefic","specific"],["speficable","specifiable"],["spefically","specifically"],["spefication","specification"],["spefications","specifications"],["speficed","specified"],["speficeid","specified"],["speficeir","specifier"],["speficeirs","specifiers"],["speficeis","specifies"],["speficer","specifier"],["speficers","specifiers"],["spefices","specifies"],["speficiable","specifiable"],["speficiallally","specifically"],["speficiallation","specification"],["speficiallations","specifications"],["speficialleid","specified"],["speficialleir","specifier"],["speficialleirs","specifiers"],["speficialleis","specifies"],["speficialliable","specifiable"],["speficiallic","specific"],["speficiallically","specifically"],["speficiallication","specification"],["speficiallications","specifications"],["speficiallics","specifics"],["speficiallied","specified"],["speficiallier","specifier"],["speficialliers","specifiers"],["speficiallies","specifies"],["speficiallifed","specified"],["speficiallifer","specifier"],["speficiallifers","specifiers"],["speficiallifes","specifies"],["speficially","specifically"],["speficiation","specification"],["speficiations","specifications"],["speficic","specific"],["speficically","specifically"],["speficication","specification"],["speficications","specifications"],["speficics","specifics"],["speficied","specified"],["speficieid","specified"],["speficieir","specifier"],["speficieirs","specifiers"],["speficieis","specifies"],["speficier","specifier"],["speficiers","specifiers"],["speficies","specifies"],["speficifally","specifically"],["speficifation","specification"],["speficifations","specifications"],["speficifc","specific"],["speficifcally","specifically"],["speficifcation","specification"],["speficifcations","specifications"],["speficifcs","specifics"],["speficifed","specified"],["speficifeid","specified"],["speficifeir","specifier"],["speficifeirs","specifiers"],["speficifeis","specifies"],["speficifer","specifier"],["speficifers","specifiers"],["speficifes","specifies"],["speficifiable","specifiable"],["speficific","specific"],["speficifically","specifically"],["speficification","specification"],["speficifications","specifications"],["speficifics","specifics"],["speficified","specified"],["speficifier","specifier"],["speficifiers","specifiers"],["speficifies","specifies"],["speficififed","specified"],["speficififer","specifier"],["speficififers","specifiers"],["speficififes","specifies"],["speficify","specify"],["speficifying","specifying"],["speficiiable","specifiable"],["speficiic","specific"],["speficiically","specifically"],["speficiication","specification"],["speficiications","specifications"],["speficiics","specifics"],["speficiied","specified"],["speficiier","specifier"],["speficiiers","specifiers"],["speficiies","specifies"],["speficiifed","specified"],["speficiifer","specifier"],["speficiifers","specifiers"],["speficiifes","specifies"],["speficillally","specifically"],["speficillation","specification"],["speficillations","specifications"],["speficilleid","specified"],["speficilleir","specifier"],["speficilleirs","specifiers"],["speficilleis","specifies"],["speficilliable","specifiable"],["speficillic","specific"],["speficillically","specifically"],["speficillication","specification"],["speficillications","specifications"],["speficillics","specifics"],["speficillied","specified"],["speficillier","specifier"],["speficilliers","specifiers"],["speficillies","specifies"],["speficillifed","specified"],["speficillifer","specifier"],["speficillifers","specifiers"],["speficillifes","specifies"],["speficilly","specifically"],["speficitally","specifically"],["speficitation","specification"],["speficitations","specifications"],["speficiteid","specified"],["speficiteir","specifier"],["speficiteirs","specifiers"],["speficiteis","specifies"],["speficitiable","specifiable"],["speficitic","specific"],["speficitically","specifically"],["speficitication","specification"],["speficitications","specifications"],["speficitics","specifics"],["speficitied","specified"],["speficitier","specifier"],["speficitiers","specifiers"],["speficities","specificities"],["speficitifed","specified"],["speficitifer","specifier"],["speficitifers","specifiers"],["speficitifes","specifies"],["speficity","specificity"],["speficiy","specify"],["speficiying","specifying"],["spefics","specifics"],["speficy","specify"],["speficying","specifying"],["spefied","specified"],["spefier","specifier"],["spefiers","specifiers"],["spefies","specifies"],["spefifally","specifically"],["spefifation","specification"],["spefifations","specifications"],["spefifed","specified"],["spefifeid","specified"],["spefifeir","specifier"],["spefifeirs","specifiers"],["spefifeis","specifies"],["spefifer","specifier"],["spefifers","specifiers"],["spefifes","specifies"],["spefifiable","specifiable"],["spefific","specific"],["spefifically","specifically"],["spefification","specification"],["spefifications","specifications"],["spefifics","specifics"],["spefified","specified"],["spefifier","specifier"],["spefifiers","specifiers"],["spefifies","specifies"],["spefififed","specified"],["spefififer","specifier"],["spefififers","specifiers"],["spefififes","specifies"],["spefify","specify"],["spefifying","specifying"],["spefiiable","specifiable"],["spefiic","specific"],["spefiically","specifically"],["spefiication","specification"],["spefiications","specifications"],["spefiics","specifics"],["spefiied","specified"],["spefiier","specifier"],["spefiiers","specifiers"],["spefiies","specifies"],["spefiifally","specifically"],["spefiifation","specification"],["spefiifations","specifications"],["spefiifeid","specified"],["spefiifeir","specifier"],["spefiifeirs","specifiers"],["spefiifeis","specifies"],["spefiifiable","specifiable"],["spefiific","specific"],["spefiifically","specifically"],["spefiification","specification"],["spefiifications","specifications"],["spefiifics","specifics"],["spefiified","specified"],["spefiifier","specifier"],["spefiifiers","specifiers"],["spefiifies","specifies"],["spefiififed","specified"],["spefiififer","specifier"],["spefiififers","specifiers"],["spefiififes","specifies"],["spefiify","specify"],["spefiifying","specifying"],["spefixally","specifically"],["spefixation","specification"],["spefixations","specifications"],["spefixeid","specified"],["spefixeir","specifier"],["spefixeirs","specifiers"],["spefixeis","specifies"],["spefixiable","specifiable"],["spefixic","specific"],["spefixically","specifically"],["spefixication","specification"],["spefixications","specifications"],["spefixics","specifics"],["spefixied","specified"],["spefixier","specifier"],["spefixiers","specifiers"],["spefixies","specifies"],["spefixifed","specified"],["spefixifer","specifier"],["spefixifers","specifiers"],["spefixifes","specifies"],["spefixy","specify"],["spefixying","specifying"],["spefiy","specify"],["spefiying","specifying"],["spefy","specify"],["spefying","specifying"],["speherical","spherical"],["speical","special"],["speices","species"],["speicfied","specified"],["speicific","specific"],["speicified","specified"],["speicify","specify"],["speling","spelling"],["spellshecking","spellchecking"],["spendour","splendour"],["speparate","separate"],["speparated","separated"],["speparating","separating"],["speparation","separation"],["speparator","separator"],["spepc","spec"],["speperatd","separated"],["speperate","separate"],["speperateing","separating"],["speperater","separator"],["speperates","separates"],["speperating","separating"],["speperator","separator"],["speperats","separates"],["sperate","separate"],["sperately","separately"],["sperhical","spherical"],["spermatozoan","spermatozoon"],["speshal","special"],["speshel","special"],["spesialisation","specialization"],["spesific","specific"],["spesifical","specific"],["spesifically","specifically"],["spesificaly","specifically"],["spesifics","specifics"],["spesified","specified"],["spesifities","specifics"],["spesify","specify"],["spezialisation","specialization"],["spezific","specific"],["spezified","specified"],["spezify","specify"],["spicific","specific"],["spicified","specified"],["spicify","specify"],["spiltting","splitting"],["spindel","spindle"],["spindels","spindles"],["spinlcok","spinlock"],["spinock","spinlock"],["spligs","splits"],["spliiter","splitter"],["spliitting","splitting"],["spliting","splitting"],["splitted","split"],["splittng","splitting"],["spllitting","splitting"],["spoace","space"],["spoaced","spaced"],["spoaces","spaces"],["spoacing","spacing"],["sponser","sponsor"],["sponsered","sponsored"],["sponsers","sponsors"],["sponsership","sponsorship"],["spontanous","spontaneous"],["sponzored","sponsored"],["spoonfulls","spoonfuls"],["sporatic","sporadic"],["sporious","spurious"],["sppeches","speeches"],["spport","support"],["spported","supported"],["spporting","supporting"],["spports","supports"],["spreaded","spread"],["spreadhseet","spreadsheet"],["spreadhseets","spreadsheets"],["spreadsheat","spreadsheet"],["spreadsheats","spreadsheets"],["spreasheet","spreadsheet"],["spreasheets","spreadsheets"],["sprech","speech"],["sprecial","special"],["sprecialized","specialized"],["sprecially","specially"],["spred","spread"],["spredsheet","spreadsheet"],["spreedsheet","spreadsheet"],["sprinf","sprintf"],["spririous","spurious"],["spriritual","spiritual"],["spritual","spiritual"],["sproon","spoon"],["spsace","space"],["spsaced","spaced"],["spsaces","spaces"],["spsacing","spacing"],["sptintf","sprintf"],["spurios","spurious"],["spurrious","spurious"],["sqare","square"],["sqared","squared"],["sqares","squares"],["sqash","squash"],["sqashed","squashed"],["sqashing","squashing"],["sqaure","square"],["sqaured","squared"],["sqaures","squares"],["sqeuence","sequence"],["squashgin","squashing"],["squence","sequence"],["squirel","squirrel"],["squirl","squirrel"],["squrared","squared"],["srcipt","script"],["srcipts","scripts"],["sreampropinfo","streampropinfo"],["sreenshot","screenshot"],["sreenshots","screenshots"],["sreturns","returns"],["srikeout","strikeout"],["sring","string"],["srings","strings"],["srink","shrink"],["srinkd","shrunk"],["srinked","shrunk"],["srinking","shrinking"],["sript","script"],["sripts","scripts"],["srollbar","scrollbar"],["srouce","source"],["srtifact","artifact"],["srtifacts","artifacts"],["srtings","strings"],["srtructure","structure"],["srttings","settings"],["sructure","structure"],["sructures","structures"],["srunk","shrunk"],["srunken","shrunken"],["srunkn","shrunken"],["ssame","same"],["ssee","see"],["ssoaiating","associating"],["ssome","some"],["stabalization","stabilization"],["stabilitation","stabilization"],["stabilite","stabilize"],["stabilited","stabilized"],["stabilites","stabilizes"],["stabiliting","stabilizing"],["stabillity","stability"],["stabilty","stability"],["stablility","stability"],["stablilization","stabilization"],["stablize","stabilize"],["stach","stack"],["stacionary","stationary"],["stackk","stack"],["stadnard","standard"],["stadnardisation","standardisation"],["stadnardised","standardised"],["stadnardising","standardising"],["stadnardization","standardization"],["stadnardized","standardized"],["stadnardizing","standardizing"],["stadnards","standards"],["stae","state"],["staement","statement"],["staically","statically"],["stainlees","stainless"],["staion","station"],["staions","stations"],["staition","station"],["staitions","stations"],["stalagtite","stalactite"],["standar","standard"],["standarad","standard"],["standard-complient","standard-compliant"],["standardss","standards"],["standarisation","standardisation"],["standarise","standardise"],["standarised","standardised"],["standarises","standardises"],["standarising","standardising"],["standarization","standardization"],["standarize","standardize"],["standarized","standardized"],["standarizes","standardizes"],["standarizing","standardizing"],["standart","standard"],["standartd","standard"],["standartds","standards"],["standartisation","standardisation"],["standartisator","standardiser"],["standartised","standardised"],["standartization","standardization"],["standartizator","standardizer"],["standartized","standardized"],["standarts","standards"],["standatd","standard"],["standrat","standard"],["standrats","standards"],["standtard","standard"],["stange","strange"],["stanp","stamp"],["staration","starvation"],["stard","start"],["stardard","standard"],["stardardize","standardize"],["stardardized","standardized"],["stardardizes","standardizes"],["stardardizing","standardizing"],["stardards","standards"],["staright","straight"],["startd","started"],["startegic","strategic"],["startegies","strategies"],["startegy","strategy"],["startet","started"],["startign","starting"],["startin","starting"],["startlisteneing","startlistening"],["startnig","starting"],["startparanthesis","startparentheses"],["startted","started"],["startting","starting"],["starup","startup"],["starups","startups"],["statamenet","statement"],["statamenets","statements"],["stategies","strategies"],["stategise","strategise"],["stategised","strategised"],["stategize","strategize"],["stategized","strategized"],["stategy","strategy"],["stateman","statesman"],["statemanet","statement"],["statememts","statements"],["statemen","statement"],["statemenet","statement"],["statemenets","statements"],["statemet","statement"],["statemnts","statements"],["stati","statuses"],["staticly","statically"],["statictic","statistic"],["statictics","statistics"],["statisfied","satisfied"],["statisfies","satisfies"],["statisfy","satisfy"],["statisfying","satisfying"],["statisitics","statistics"],["statistices","statistics"],["statitic","statistic"],["statitics","statistics"],["statmenet","statement"],["statmenmt","statement"],["statment","statement"],["statments","statements"],["statrt","start"],["stattistic","statistic"],["statubar","statusbar"],["statuline","statusline"],["statulines","statuslines"],["statup","startup"],["staturday","Saturday"],["statuss","status"],["statusses","statuses"],["statustics","statistics"],["staulk","stalk"],["stauration","saturation"],["staus","status"],["stawberries","strawberries"],["stawberry","strawberry"],["stawk","stalk"],["stcokbrush","stockbrush"],["stdanard","standard"],["stdanards","standards"],["stength","strength"],["steram","stream"],["steramed","streamed"],["steramer","streamer"],["steraming","streaming"],["sterams","streams"],["sterio","stereo"],["steriods","steroids"],["sterotype","stereotype"],["sterotypes","stereotypes"],["stickness","stickiness"],["stickyness","stickiness"],["stiffneing","stiffening"],["stiky","sticky"],["stil","still"],["stilus","stylus"],["stingent","stringent"],["stipped","stripped"],["stiring","stirring"],["stirng","string"],["stirngs","strings"],["stirr","stir"],["stirrs","stirs"],["stivk","stick"],["stivks","sticks"],["stle","style"],["stlye","style"],["stlyes","styles"],["stnad","stand"],["stndard","standard"],["stoage","storage"],["stoages","storages"],["stocahstic","stochastic"],["stocastic","stochastic"],["stoer","store"],["stoers","stores"],["stomache","stomach"],["stompted","stomped"],["stong","strong"],["stoped","stopped"],["stoping","stopping"],["stopp","stop"],["stoppped","stopped"],["stoppping","stopping"],["stopps","stops"],["stopry","story"],["storag","storage"],["storeable","storable"],["storeage","storage"],["stoream","stream"],["storeble","storable"],["storeing","storing"],["storge","storage"],["storise","stories"],["stornegst","strongest"],["stoyr","story"],["stpo","stop"],["stradegies","strategies"],["stradegy","strategy"],["stragegy","strategy"],["strageties","strategies"],["stragety","strategy"],["straigh-forward","straightforward"],["straighforward","straightforward"],["straightfoward","straightforward"],["straigt","straight"],["straigth","straight"],["straines","strains"],["strangness","strangeness"],["strart","start"],["strarted","started"],["strarting","starting"],["strarts","starts"],["stratagically","strategically"],["strcture","structure"],["strctures","structures"],["strcutre","structure"],["strcutural","structural"],["strcuture","structure"],["strcutures","structures"],["streamm","stream"],["streammed","streamed"],["streamming","streaming"],["streatched","stretched"],["strech","stretch"],["streched","stretched"],["streches","stretches"],["streching","stretching"],["strectch","stretch"],["strecth","stretch"],["strecthed","stretched"],["strecthes","stretches"],["strecthing","stretching"],["streem","stream"],["streemlining","streamlining"],["stregth","strength"],["streightish","straightish"],["streightly","straightly"],["streightness","straightness"],["streigtish","straightish"],["streigtly","straightly"],["streigtness","straightness"],["strem","stream"],["strema","stream"],["strengh","strength"],["strenghen","strengthen"],["strenghened","strengthened"],["strenghening","strengthening"],["strenght","strength"],["strenghten","strengthen"],["strenghtened","strengthened"],["strenghtening","strengthening"],["strenghts","strengths"],["strengtened","strengthened"],["strenous","strenuous"],["strentgh","strength"],["strenth","strength"],["strerrror","strerror"],["striaght","straight"],["striaghten","straighten"],["striaghtens","straightens"],["striaghtforward","straightforward"],["striaghts","straights"],["striclty","strictly"],["stricly","strictly"],["stricteir","stricter"],["strictier","stricter"],["strictiest","strictest"],["strictist","strictest"],["strig","string"],["strigification","stringification"],["strigifying","stringifying"],["striing","string"],["striings","strings"],["strikely","strikingly"],["stringifed","stringified"],["strinsg","strings"],["strippen","stripped"],["stript","stripped"],["strirngification","stringification"],["strnad","strand"],["strng","string"],["stroage","storage"],["stroe","store"],["stroing","storing"],["stronlgy","strongly"],["stronly","strongly"],["strore","store"],["strored","stored"],["strores","stores"],["stroring","storing"],["strotage","storage"],["stroyboard","storyboard"],["struc","struct"],["strucrure","structure"],["strucrured","structured"],["strucrures","structures"],["structed","structured"],["structer","structure"],["structere","structure"],["structered","structured"],["structeres","structures"],["structetr","structure"],["structire","structure"],["structre","structure"],["structred","structured"],["structres","structures"],["structrual","structural"],["structrue","structure"],["structrued","structured"],["structrues","structures"],["structual","structural"],["structue","structure"],["structued","structured"],["structues","structures"],["structur","structure"],["structurs","structures"],["strucur","structure"],["strucure","structure"],["strucured","structured"],["strucures","structures"],["strucuring","structuring"],["strucurs","structures"],["strucutre","structure"],["strucutred","structured"],["strucutres","structures"],["strucuture","structure"],["struggel","struggle"],["struggeled","struggled"],["struggeling","struggling"],["struggels","struggles"],["struttural","structural"],["strutture","structure"],["struture","structure"],["ststion","station"],["ststionary","stationary"],["ststioned","stationed"],["ststionery","stationery"],["ststions","stations"],["ststr","strstr"],["stteting","setting"],["sttetings","settings"],["stubborness","stubbornness"],["stucked","stuck"],["stuckt","stuck"],["stuct","struct"],["stucts","structs"],["stucture","structure"],["stuctured","structured"],["stuctures","structures"],["studdy","study"],["studetn","student"],["studetns","students"],["studing","studying"],["studoi","studio"],["studois","studios"],["stuggling","struggling"],["stuido","studio"],["stuidos","studios"],["stuill","still"],["stummac","stomach"],["sturctural","structural"],["sturcture","structure"],["sturctures","structures"],["sturture","structure"],["sturtured","structured"],["sturtures","structures"],["sturucture","structure"],["stutdown","shutdown"],["stutus","status"],["styhe","style"],["styilistic","stylistic"],["stylessheets","stylesheets"],["sub-lcuase","sub-clause"],["subbtle","subtle"],["subcatagories","subcategories"],["subcatagory","subcategory"],["subcirucit","subcircuit"],["subcommannd","subcommand"],["subcommnad","subcommand"],["subconchus","subconscious"],["subconsiously","subconsciously"],["subcribe","subscribe"],["subcribed","subscribed"],["subcribes","subscribes"],["subcribing","subscribing"],["subdirectoires","subdirectories"],["subdirectorys","subdirectories"],["subdirecty","subdirectory"],["subdivisio","subdivision"],["subdivisiond","subdivisioned"],["subdoamin","subdomain"],["subdoamins","subdomains"],["subelemet","subelement"],["subelemets","subelements"],["subexperesion","subexpression"],["subexperesions","subexpressions"],["subexperession","subexpression"],["subexperessions","subexpressions"],["subexpersion","subexpression"],["subexpersions","subexpressions"],["subexperssion","subexpression"],["subexperssions","subexpressions"],["subexpession","subexpression"],["subexpessions","subexpressions"],["subexpresssion","subexpression"],["subexpresssions","subexpressions"],["subfolfer","subfolder"],["subfolfers","subfolders"],["subfromat","subformat"],["subfromats","subformats"],["subfroms","subforms"],["subgregion","subregion"],["subirectory","subdirectory"],["subjec","subject"],["subjet","subject"],["subjudgation","subjugation"],["sublass","subclass"],["sublasse","subclasse"],["sublasses","subclasses"],["sublcasses","subclasses"],["sublcuase","subclause"],["suble","subtle"],["submachne","submachine"],["submision","submission"],["submisson","submission"],["submited","submitted"],["submition","submission"],["submitions","submissions"],["submittted","submitted"],["submoule","submodule"],["submti","submit"],["subnegatiotiation","subnegotiation"],["subnegatiotiations","subnegotiations"],["subnegoatiation","subnegotiation"],["subnegoatiations","subnegotiations"],["subnegoation","subnegotiation"],["subnegoations","subnegotiations"],["subnegociation","subnegotiation"],["subnegociations","subnegotiations"],["subnegogtiation","subnegotiation"],["subnegogtiations","subnegotiations"],["subnegoitation","subnegotiation"],["subnegoitations","subnegotiations"],["subnegoptionsotiation","subnegotiation"],["subnegoptionsotiations","subnegotiations"],["subnegosiation","subnegotiation"],["subnegosiations","subnegotiations"],["subnegotaiation","subnegotiation"],["subnegotaiations","subnegotiations"],["subnegotaition","subnegotiation"],["subnegotaitions","subnegotiations"],["subnegotatiation","subnegotiation"],["subnegotatiations","subnegotiations"],["subnegotation","subnegotiation"],["subnegotations","subnegotiations"],["subnegothiation","subnegotiation"],["subnegothiations","subnegotiations"],["subnegotication","subnegotiation"],["subnegotications","subnegotiations"],["subnegotioation","subnegotiation"],["subnegotioations","subnegotiations"],["subnegotion","subnegotiation"],["subnegotionation","subnegotiation"],["subnegotionations","subnegotiations"],["subnegotions","subnegotiations"],["subnegotiotation","subnegotiation"],["subnegotiotations","subnegotiations"],["subnegotiotion","subnegotiation"],["subnegotiotions","subnegotiations"],["subnegotitaion","subnegotiation"],["subnegotitaions","subnegotiations"],["subnegotitation","subnegotiation"],["subnegotitations","subnegotiations"],["subnegotition","subnegotiation"],["subnegotitions","subnegotiations"],["subnegoziation","subnegotiation"],["subnegoziations","subnegotiations"],["subobjecs","subobjects"],["suborutine","subroutine"],["suborutines","subroutines"],["suboutine","subroutine"],["subpackge","subpackage"],["subpackges","subpackages"],["subpecies","subspecies"],["subporgram","subprogram"],["subproccese","subprocess"],["subpsace","subspace"],["subquue","subqueue"],["subract","subtract"],["subracted","subtracted"],["subraction","subtraction"],["subree","subtree"],["subresoure","subresource"],["subresoures","subresources"],["subroutie","subroutine"],["subrouties","subroutines"],["subsceptible","susceptible"],["subscibe","subscribe"],["subscibed","subscribed"],["subsciber","subscriber"],["subscibers","subscribers"],["subscirbe","subscribe"],["subscirbed","subscribed"],["subscirber","subscriber"],["subscirbers","subscribers"],["subscirbes","subscribes"],["subscirbing","subscribing"],["subscirpt","subscript"],["subscirption","subscription"],["subscirptions","subscriptions"],["subscritpion","subscription"],["subscritpions","subscriptions"],["subscritpiton","subscription"],["subscritpitons","subscriptions"],["subscritpt","subscript"],["subscritption","subscription"],["subscritptions","subscriptions"],["subsctitution","substitution"],["subsecrion","subsection"],["subsedent","subsequent"],["subseqence","subsequence"],["subseqent","subsequent"],["subsequest","subsequent"],["subsequnce","subsequence"],["subsequnt","subsequent"],["subsequntly","subsequently"],["subseuqent","subsequent"],["subshystem","subsystem"],["subshystems","subsystems"],["subsidary","subsidiary"],["subsiduary","subsidiary"],["subsiquent","subsequent"],["subsiquently","subsequently"],["subsituent","substituent"],["subsituents","substituents"],["subsitutable","substitutable"],["subsitutatble","substitutable"],["subsitute","substitute"],["subsituted","substituted"],["subsitutes","substitutes"],["subsituting","substituting"],["subsitution","substitution"],["subsitutions","substitutions"],["subsitutuent","substituent"],["subsitutuents","substituents"],["subsitutute","substitute"],["subsitututed","substituted"],["subsitututes","substitutes"],["subsitututing","substituting"],["subsitutution","substitution"],["subsquent","subsequent"],["subsquently","subsequently"],["subsriber","subscriber"],["substace","substance"],["substact","subtract"],["substaintially","substantially"],["substancial","substantial"],["substantialy","substantially"],["substantivly","substantively"],["substask","subtask"],["substasks","subtasks"],["substatial","substantial"],["substential","substantial"],["substentially","substantially"],["substition","substitution"],["substitions","substitutions"],["substitition","substitution"],["substititions","substitutions"],["substituation","substitution"],["substituations","substitutions"],["substitude","substitute"],["substituded","substituted"],["substitudes","substitutes"],["substituding","substituting"],["substitue","substitute"],["substitues","substitutes"],["substituing","substituting"],["substituion","substitution"],["substituions","substitutions"],["substiution","substitution"],["substract","subtract"],["substracted","subtracted"],["substracting","subtracting"],["substraction","subtraction"],["substracts","subtracts"],["substucture","substructure"],["substuctures","substructures"],["substutite","substitute"],["subsysthem","subsystem"],["subsysthems","subsystems"],["subsystyem","subsystem"],["subsystyems","subsystems"],["subsysytem","subsystem"],["subsysytems","subsystems"],["subsytem","subsystem"],["subsytems","subsystems"],["subtabels","subtables"],["subtak","subtask"],["subtances","substances"],["subterranian","subterranean"],["subtitute","substitute"],["subtituted","substituted"],["subtitutes","substitutes"],["subtituting","substituting"],["subtitution","substitution"],["subtitutions","substitutions"],["subtrafuge","subterfuge"],["subtrate","substrate"],["subtrates","substrates"],["subtring","substring"],["subtrings","substrings"],["subtsitutable","substitutable"],["subtsitutatble","substitutable"],["suburburban","suburban"],["subystem","subsystem"],["subystems","subsystems"],["succceeded","succeeded"],["succcess","success"],["succcesses","successes"],["succcessful","successful"],["succcessfully","successfully"],["succcessor","successor"],["succcessors","successors"],["succcessul","successful"],["succcessully","successfully"],["succecful","successful"],["succed","succeed"],["succedd","succeed"],["succedded","succeeded"],["succedding","succeeding"],["succedds","succeeds"],["succede","succeed"],["succeded","succeeded"],["succedes","succeeds"],["succedfully","successfully"],["succeding","succeeding"],["succeds","succeeds"],["succee","succeed"],["succeedde","succeeded"],["succeedes","succeeds"],["succeess","success"],["succeesses","successes"],["succes","success"],["succesful","successful"],["succesfull","successful"],["succesfully","successfully"],["succesfuly","successfully"],["succesion","succession"],["succesive","successive"],["succesor","successor"],["succesors","successors"],["successfui","successful"],["successfule","successful"],["successfull","successful"],["successfullies","successfully"],["successfullly","successfully"],["successfulln","successful"],["successfullness","successfulness"],["successfullt","successfully"],["successfuly","successfully"],["successing","successive"],["successs","success"],["successsfully","successfully"],["successsion","succession"],["successul","successful"],["successully","successfully"],["succesully","successfully"],["succicently","sufficiently"],["succint","succinct"],["succseeded","succeeded"],["succsess","success"],["succsessfull","successful"],["succsessive","successive"],["succssful","successful"],["succussfully","successfully"],["suceed","succeed"],["suceeded","succeeded"],["suceeding","succeeding"],["suceeds","succeeds"],["suceessfully","successfully"],["suces","success"],["suceses","successes"],["sucesful","successful"],["sucesfull","successful"],["sucesfully","successfully"],["sucesfuly","successfully"],["sucesion","succession"],["sucesive","successive"],["sucess","success"],["sucesscient","sufficient"],["sucessed","succeeded"],["sucessefully","successfully"],["sucesses","successes"],["sucessess","success"],["sucessflly","successfully"],["sucessfually","successfully"],["sucessfukk","successful"],["sucessful","successful"],["sucessfull","successful"],["sucessfully","successfully"],["sucessfuly","successfully"],["sucession","succession"],["sucessiv","successive"],["sucessive","successive"],["sucessively","successively"],["sucessor","successor"],["sucessors","successors"],["sucessot","successor"],["sucesss","success"],["sucessses","successes"],["sucesssful","successful"],["sucesssfull","successful"],["sucesssfully","successfully"],["sucesssfuly","successfully"],["sucessufll","successful"],["sucessuflly","successfully"],["sucessully","successfully"],["sucide","suicide"],["sucidial","suicidal"],["sucome","succumb"],["sucsede","succeed"],["sucsess","success"],["sudent","student"],["sudents","students"],["sudmobule","submodule"],["sudmobules","submodules"],["sueful","useful"],["sueprset","superset"],["suface","surface"],["sufaces","surfaces"],["sufface","surface"],["suffaces","surfaces"],["suffciency","sufficiency"],["suffcient","sufficient"],["suffciently","sufficiently"],["sufferage","suffrage"],["sufferred","suffered"],["sufferring","suffering"],["sufficate","suffocate"],["sufficated","suffocated"],["sufficates","suffocates"],["sufficating","suffocating"],["suffication","suffocation"],["sufficency","sufficiency"],["sufficent","sufficient"],["sufficently","sufficiently"],["sufficiancy","sufficiency"],["sufficiant","sufficient"],["sufficiantly","sufficiently"],["sufficiennt","sufficient"],["sufficienntly","sufficiently"],["suffiency","sufficiency"],["suffient","sufficient"],["suffiently","sufficiently"],["suffisticated","sophisticated"],["suficate","suffocate"],["suficated","suffocated"],["suficates","suffocates"],["suficating","suffocating"],["sufication","suffocation"],["suficcient","sufficient"],["suficient","sufficient"],["suficiently","sufficiently"],["sufocate","suffocate"],["sufocated","suffocated"],["sufocates","suffocates"],["sufocating","suffocating"],["sufocation","suffocation"],["sugested","suggested"],["sugestion","suggestion"],["sugestions","suggestions"],["sugests","suggests"],["suggesst","suggest"],["suggessted","suggested"],["suggessting","suggesting"],["suggesstion","suggestion"],["suggesstions","suggestions"],["suggessts","suggests"],["suggestes","suggests"],["suggestin","suggestion"],["suggestins","suggestions"],["suggestsed","suggested"],["suggestted","suggested"],["suggesttion","suggestion"],["suggesttions","suggestions"],["sugget","suggest"],["suggeted","suggested"],["suggetsed","suggested"],["suggetsing","suggesting"],["suggetsion","suggestion"],["sugggest","suggest"],["sugggested","suggested"],["sugggesting","suggesting"],["sugggestion","suggestion"],["sugggestions","suggestions"],["sugguest","suggest"],["sugguested","suggested"],["sugguesting","suggesting"],["sugguestion","suggestion"],["sugguestions","suggestions"],["suh","such"],["suiete","suite"],["suiteable","suitable"],["sumamry","summary"],["sumarize","summarize"],["sumary","summary"],["sumbitted","submitted"],["sumed-up","summed-up"],["summarizen","summarize"],["summay","summary"],["summerised","summarised"],["summerized","summarized"],["summersalt","somersault"],["summmaries","summaries"],["summmarisation","summarisation"],["summmarised","summarised"],["summmarization","summarization"],["summmarized","summarized"],["summmary","summary"],["sumodules","submodules"],["sumulate","simulate"],["sumulated","simulated"],["sumulates","simulates"],["sumulation","simulation"],["sumulations","simulations"],["sundey","Sunday"],["sunglases","sunglasses"],["sunsday","Sunday"],["suntask","subtask"],["suop","soup"],["supeblock","superblock"],["supeena","subpoena"],["superbock","superblock"],["superbocks","superblocks"],["supercalifragilisticexpialidoceous","supercalifragilisticexpialidocious"],["supercede","supersede"],["superceded","superseded"],["supercedes","supersedes"],["superceding","superseding"],["superceed","supersede"],["superceeded","superseded"],["superflouous","superfluous"],["superflous","superfluous"],["superflouse","superfluous"],["superfluious","superfluous"],["superfluos","superfluous"],["superfulous","superfluous"],["superintendant","superintendent"],["superopeator","superoperator"],["supersed","superseded"],["superseedd","superseded"],["superseede","supersede"],["superseeded","superseded"],["suphisticated","sophisticated"],["suplant","supplant"],["suplanted","supplanted"],["suplanting","supplanting"],["suplants","supplants"],["suplementary","supplementary"],["suplied","supplied"],["suplimented","supplemented"],["supllies","supplies"],["suport","support"],["suported","supported"],["suporting","supporting"],["suports","supports"],["suportted","supported"],["suposable","supposable"],["supose","suppose"],["suposeable","supposable"],["suposed","supposed"],["suposedly","supposedly"],["suposes","supposes"],["suposing","supposing"],["suposse","suppose"],["suppied","supplied"],["suppier","supplier"],["suppies","supplies"],["supplamented","supplemented"],["suppliad","supplied"],["suppliementing","supplementing"],["suppliment","supplement"],["supplyed","supplied"],["suppoed","supposed"],["suppoert","support"],["suppoort","support"],["suppoorts","supports"],["suppopose","suppose"],["suppoprt","support"],["suppoprted","supported"],["suppor","support"],["suppored","supported"],["supporession","suppression"],["supporing","supporting"],["supportd","supported"],["supportes","supports"],["supportin","supporting"],["supportt","support"],["supportted","supported"],["supportting","supporting"],["supportts","supports"],["supposeable","supposable"],["supposeded","supposed"],["supposedely","supposedly"],["supposeds","supposed"],["supposedy","supposedly"],["supposingly","supposedly"],["suppossed","supposed"],["suppoted","supported"],["suppplied","supplied"],["suppport","support"],["suppported","supported"],["suppporting","supporting"],["suppports","supports"],["suppres","suppress"],["suppresed","suppressed"],["suppresion","suppression"],["suppresions","suppressions"],["suppressingd","suppressing"],["supprot","support"],["supproted","supported"],["supproter","supporter"],["supproters","supporters"],["supproting","supporting"],["supprots","supports"],["supprt","support"],["supprted","supported"],["suppurt","support"],["suppurted","supported"],["suppurter","supporter"],["suppurters","supporters"],["suppurting","supporting"],["suppurtive","supportive"],["suppurts","supports"],["suppy","supply"],["suppying","supplying"],["suprassing","surpassing"],["supres","suppress"],["supresed","suppressed"],["supreses","suppresses"],["supresing","suppressing"],["supresion","suppression"],["supress","suppress"],["supressed","suppressed"],["supresses","suppresses"],["supressible","suppressible"],["supressing","suppressing"],["supression","suppression"],["supressions","suppressions"],["supressor","suppressor"],["supressors","suppressors"],["supresssion","suppression"],["suprious","spurious"],["suprise","surprise"],["suprised","surprised"],["suprises","surprises"],["suprising","surprising"],["suprisingly","surprisingly"],["suprize","surprise"],["suprized","surprised"],["suprizing","surprising"],["suprizingly","surprisingly"],["supsend","suspend"],["supspect","suspect"],["supspected","suspected"],["supspecting","suspecting"],["supspects","suspects"],["surbert","sherbet"],["surfce","surface"],["surgest","suggest"],["surgested","suggested"],["surgestion","suggestion"],["surgestions","suggestions"],["surgests","suggests"],["suround","surround"],["surounded","surrounded"],["surounding","surrounding"],["suroundings","surroundings"],["surounds","surrounds"],["surpise","surprise"],["surpises","surprises"],["surplanted","supplanted"],["surport","support"],["surported","supported"],["surpress","suppress"],["surpressed","suppressed"],["surpresses","suppresses"],["surpressing","suppressing"],["surprisinlgy","surprisingly"],["surprize","surprise"],["surprized","surprised"],["surprizing","surprising"],["surprizingly","surprisingly"],["surregat","surrogate"],["surrepetitious","surreptitious"],["surrepetitiously","surreptitiously"],["surreptious","surreptitious"],["surreptiously","surreptitiously"],["surrogage","surrogate"],["surronded","surrounded"],["surrouded","surrounded"],["surrouding","surrounding"],["surrrounded","surrounded"],["surrundering","surrendering"],["survay","survey"],["survays","surveys"],["surveilence","surveillance"],["surveill","surveil"],["surveyer","surveyor"],["surviver","survivor"],["survivers","survivors"],["survivied","survived"],["susbcribed","subscribed"],["susbsystem","subsystem"],["susbsystems","subsystems"],["susbsytem","subsystem"],["susbsytems","subsystems"],["suscribe","subscribe"],["suscribed","subscribed"],["suscribes","subscribes"],["suscript","subscript"],["susepect","suspect"],["suseptable","susceptible"],["suseptible","susceptible"],["susinctly","succinctly"],["susinkt","succinct"],["suspedn","suspend"],["suspeneded","suspended"],["suspention","suspension"],["suspicios","suspicious"],["suspicioulsy","suspiciously"],["suspicous","suspicious"],["suspicously","suspiciously"],["suspision","suspicion"],["suspsend","suspend"],["sussinct","succinct"],["sustainaiblity","sustainability"],["sustem","system"],["sustems","systems"],["sustitution","substitution"],["sustitutions","substitutions"],["susupend","suspend"],["sutdown","shutdown"],["sutisfaction","satisfaction"],["sutisfied","satisfied"],["sutisfies","satisfies"],["sutisfy","satisfy"],["sutisfying","satisfying"],["suttled","shuttled"],["suttles","shuttles"],["suttlety","subtlety"],["suttling","shuttling"],["suuport","support"],["suuported","supported"],["suuporting","supporting"],["suuports","supports"],["suvenear","souvenir"],["suystem","system"],["suystemic","systemic"],["suystems","systems"],["svelt","svelte"],["swaer","swear"],["swaers","swears"],["swalloed","swallowed"],["swaped","swapped"],["swapiness","swappiness"],["swaping","swapping"],["swarmin","swarming"],["swcloumns","swcolumns"],["swepth","swept"],["swich","switch"],["swiched","switched"],["swiching","switching"],["swicth","switch"],["swicthed","switched"],["swicthing","switching"],["swiming","swimming"],["switchs","switches"],["switcht","switched"],["switchting","switching"],["swith","switch"],["swithable","switchable"],["swithc","switch"],["swithcboard","switchboard"],["swithced","switched"],["swithces","switches"],["swithch","switch"],["swithches","switches"],["swithching","switching"],["swithcing","switching"],["swithcover","switchover"],["swithed","switched"],["swither","switcher"],["swithes","switches"],["swithing","switching"],["switiches","switches"],["swown","shown"],["swtich","switch"],["swtichable","switchable"],["swtichback","switchback"],["swtichbacks","switchbacks"],["swtichboard","switchboard"],["swtichboards","switchboards"],["swtiched","switched"],["swticher","switcher"],["swtichers","switchers"],["swtiches","switches"],["swtiching","switching"],["swtichover","switchover"],["swtichs","switches"],["sxl","xsl"],["syantax","syntax"],["syas","says"],["syatem","system"],["syatems","systems"],["sybsystem","subsystem"],["sybsystems","subsystems"],["sychronisation","synchronisation"],["sychronise","synchronise"],["sychronised","synchronised"],["sychroniser","synchroniser"],["sychronises","synchronises"],["sychronisly","synchronously"],["sychronization","synchronization"],["sychronize","synchronize"],["sychronized","synchronized"],["sychronizer","synchronizer"],["sychronizes","synchronizes"],["sychronmode","synchronmode"],["sychronous","synchronous"],["sychronously","synchronously"],["sycle","cycle"],["sycled","cycled"],["sycles","cycles"],["sycling","cycling"],["sycn","sync"],["sycology","psychology"],["sycronise","synchronise"],["sycronised","synchronised"],["sycronises","synchronises"],["sycronising","synchronising"],["sycronization","synchronization"],["sycronizations","synchronizations"],["sycronize","synchronize"],["sycronized","synchronized"],["sycronizes","synchronizes"],["sycronizing","synchronizing"],["sycronous","synchronous"],["sycronously","synchronously"],["sycronus","synchronous"],["sylabus","syllabus"],["syle","style"],["syles","styles"],["sylibol","syllable"],["sylinder","cylinder"],["sylinders","cylinders"],["sylistic","stylistic"],["sylog","syslog"],["symantics","semantics"],["symblic","symbolic"],["symbo","symbol"],["symboles","symbols"],["symboll","symbol"],["symbonname","symbolname"],["symbsol","symbol"],["symbsols","symbols"],["symemetric","symmetric"],["symetri","symmetry"],["symetric","symmetric"],["symetrical","symmetrical"],["symetrically","symmetrically"],["symetry","symmetry"],["symettric","symmetric"],["symmetic","symmetric"],["symmetral","symmetric"],["symmetri","symmetry"],["symmetricaly","symmetrically"],["symnol","symbol"],["symnols","symbols"],["symobilic","symbolic"],["symobl","symbol"],["symoblic","symbolic"],["symoblically","symbolically"],["symobls","symbols"],["symobolic","symbolic"],["symobolical","symbolical"],["symol","symbol"],["symols","symbols"],["synagouge","synagogue"],["synamic","dynamic"],["synax","syntax"],["synching","syncing"],["synchonisation","synchronisation"],["synchonise","synchronise"],["synchonised","synchronised"],["synchonises","synchronises"],["synchonising","synchronising"],["synchonization","synchronization"],["synchonize","synchronize"],["synchonized","synchronized"],["synchonizes","synchronizes"],["synchonizing","synchronizing"],["synchonous","synchronous"],["synchonrous","synchronous"],["synchrnization","synchronization"],["synchrnonization","synchronization"],["synchroizing","synchronizing"],["synchromized","synchronized"],["synchroneous","synchronous"],["synchroneously","synchronously"],["synchronious","synchronous"],["synchroniously","synchronously"],["synchronizaton","synchronization"],["synchronsouly","synchronously"],["synchronuous","synchronous"],["synchronuously","synchronously"],["synchronus","synchronous"],["syncrhonise","synchronise"],["syncrhonised","synchronised"],["syncrhonize","synchronize"],["syncrhonized","synchronized"],["syncronise","synchronise"],["syncronised","synchronised"],["syncronises","synchronises"],["syncronising","synchronising"],["syncronization","synchronization"],["syncronizations","synchronizations"],["syncronize","synchronize"],["syncronized","synchronized"],["syncronizes","synchronizes"],["syncronizing","synchronizing"],["syncronous","synchronous"],["syncronously","synchronously"],["syncronus","synchronous"],["syncting","syncing"],["syndonic","syntonic"],["syndrom","syndrome"],["syndroms","syndromes"],["synomym","synonym"],["synonim","synonym"],["synonomous","synonymous"],["synonymns","synonyms"],["synopis","synopsis"],["synopsys","synopsis"],["synoym","synonym"],["synphony","symphony"],["synposis","synopsis"],["synronous","synchronous"],["syntac","syntax"],["syntacks","syntax"],["syntacs","syntax"],["syntact","syntax"],["syntactally","syntactically"],["syntacts","syntax"],["syntak","syntax"],["syntaks","syntax"],["syntakt","syntax"],["syntakts","syntax"],["syntatic","syntactic"],["syntatically","syntactically"],["syntaxe","syntax"],["syntaxg","syntax"],["syntaxt","syntax"],["syntehsise","synthesise"],["syntehsised","synthesised"],["syntehsize","synthesize"],["syntehsized","synthesized"],["syntesis","synthesis"],["syntethic","synthetic"],["syntethically","synthetically"],["syntethics","synthetics"],["syntetic","synthetic"],["syntetize","synthesize"],["syntetized","synthesized"],["synthethic","synthetic"],["synthetize","synthesize"],["synthetized","synthesized"],["synthetizes","synthesizes"],["synthtic","synthetic"],["syphyllis","syphilis"],["sypmtoms","symptoms"],["sypport","support"],["syrap","syrup"],["sysbols","symbols"],["syschronize","synchronize"],["sysem","system"],["sysematic","systematic"],["sysems","systems"],["sysmatically","systematically"],["sysmbol","symbol"],["sysmograph","seismograph"],["sysmte","system"],["sysmtes","systems"],["systax","syntax"],["syste","system"],["systen","system"],["systens","systems"],["systesm","systems"],["systhem","system"],["systhems","systems"],["systm","system"],["systme","system"],["systmes","systems"],["systms","systems"],["systyem","system"],["systyems","systems"],["sysyem","system"],["sysyems","systems"],["sytax","syntax"],["sytem","system"],["sytematic","systematic"],["sytemd","systemd"],["syteme","system"],["sytems","systems"],["sythesis","synthesis"],["sytle","style"],["sytled","styled"],["sytles","styles"],["sytlesheet","stylesheet"],["sytling","styling"],["sytnax","syntax"],["sytntax","syntax"],["sytsem","system"],["sytsemic","systemic"],["sytsems","systems"],["szenario","scenario"],["szenarios","scenarios"],["szes","sizes"],["szie","size"],["szied","sized"],["szies","sizes"],["tabacco","tobacco"],["tabbaray","taboret"],["tabblow","tableau"],["tabe","table"],["tabel","table"],["tabeles","tables"],["tabels","tables"],["tabeview","tabview"],["tabke","table"],["tabl","table"],["tablepsace","tablespace"],["tablepsaces","tablespaces"],["tablle","table"],["tabluar","tabular"],["tabluate","tabulate"],["tabluated","tabulated"],["tabluates","tabulates"],["tabluating","tabulating"],["tabualte","tabulate"],["tabualted","tabulated"],["tabualtes","tabulates"],["tabualting","tabulating"],["tabualtor","tabulator"],["tabualtors","tabulators"],["taged","tagged"],["taget","target"],["tageted","targeted"],["tageting","targeting"],["tagets","targets"],["tagggen","taggen"],["tagnet","tangent"],["tagnetial","tangential"],["tagnets","tangents"],["tagued","tagged"],["tahn","than"],["taht","that"],["takslet","tasklet"],["talbe","table"],["talekd","talked"],["tallerable","tolerable"],["tamplate","template"],["tamplated","templated"],["tamplates","templates"],["tamplating","templating"],["tangeant","tangent"],["tangeantial","tangential"],["tangeants","tangents"],["tangenet","tangent"],["tangensial","tangential"],["tangentailly","tangentially"],["tanget","tangent"],["tangetial","tangential"],["tangetially","tangentially"],["tangets","tangents"],["tansact","transact"],["tansaction","transaction"],["tansactional","transactional"],["tansactions","transactions"],["tanseint","transient"],["tansfomed","transformed"],["tansient","transient"],["tanslate","translate"],["tanslated","translated"],["tanslates","translates"],["tanslation","translation"],["tanslations","translations"],["tanslator","translator"],["tansmit","transmit"],["tansverse","transverse"],["tarbal","tarball"],["tarbals","tarballs"],["tarce","trace"],["tarced","traced"],["tarces","traces"],["tarcing","tracing"],["targed","target"],["targer","target"],["targest","targets"],["targetted","targeted"],["targetting","targeting"],["targettting","targeting"],["targt","target"],["targte","target"],["tarmigan","ptarmigan"],["tarnsparent","transparent"],["tarpolin","tarpaulin"],["tarvis","Travis"],["tarvisci","TravisCI"],["tasbar","taskbar"],["taskelt","tasklet"],["tast","taste"],["tatgert","target"],["tatgerted","targeted"],["tatgerting","targeting"],["tatgerts","targets"],["tath","that"],["tatoo","tattoo"],["tatoos","tattoos"],["tattooes","tattoos"],["tawk","talk"],["taxanomic","taxonomic"],["taxanomy","taxonomy"],["taxnomy","taxonomy"],["taxomonmy","taxonomy"],["taxonmy","taxonomy"],["taxonoy","taxonomy"],["taylored","tailored"],["tbe","the"],["tbey","they"],["tcahce","cache"],["tcahces","caches"],["tcheckout","checkout"],["tcpdumpp","tcpdump"],["tcppcheck","cppcheck"],["teacer","teacher"],["teacers","teachers"],["teached","taught"],["teachnig","teaching"],["teaher","teacher"],["teahers","teachers"],["teamplate","template"],["teamplates","templates"],["teated","treated"],["teched","taught"],["techer","teacher"],["techers","teachers"],["teches","teaches"],["techical","technical"],["techician","technician"],["techicians","technicians"],["techincal","technical"],["techincally","technically"],["teching","teaching"],["techinically","technically"],["techinique","technique"],["techiniques","techniques"],["techinque","technique"],["techinques","techniques"],["techique","technique"],["techiques","techniques"],["techneek","technique"],["technic","technique"],["technics","techniques"],["technik","technique"],["techniks","techniques"],["techniquest","techniques"],["techniquet","technique"],["technitian","technician"],["technition","technician"],["technlogy","technology"],["technnology","technology"],["technolgy","technology"],["technoloiges","technologies"],["tecnic","technique"],["tecnical","technical"],["tecnically","technically"],["tecnician","technician"],["tecnicians","technicians"],["tecnique","technique"],["tecniques","techniques"],["tedeous","tedious"],["tefine","define"],["teh","the"],["tehy","they"],["tekst","text"],["teksts","texts"],["telegramm","telegram"],["telelevision","television"],["televsion","television"],["telocom","telecom"],["telphony","telephony"],["temaplate","template"],["temaplates","templates"],["temeprature","temperature"],["temepratures","temperatures"],["temerature","temperature"],["teminal","terminal"],["teminals","terminals"],["teminate","terminate"],["teminated","terminated"],["teminating","terminating"],["temination","termination"],["temlate","template"],["temorarily","temporarily"],["temorary","temporary"],["tempalte","template"],["tempaltes","templates"],["temparal","temporal"],["tempararily","temporarily"],["temparary","temporary"],["temparate","temperate"],["temparature","temperature"],["temparily","temporarily"],["tempate","template"],["tempated","templated"],["tempates","templates"],["tempatied","templatized"],["tempation","temptation"],["tempatised","templatised"],["tempatized","templatized"],["tempature","temperature"],["tempdate","template"],["tempearture","temperature"],["tempeartures","temperatures"],["tempearure","temperature"],["tempelate","template"],["temperarily","temporarily"],["temperarure","temperature"],["temperary","temporary"],["temperatur","temperature"],["tempereature","temperature"],["temperment","temperament"],["tempertaure","temperature"],["temperture","temperature"],["templaced","templated"],["templaces","templates"],["templacing","templating"],["templaet","template"],["templat","template"],["templateas","templates"],["templete","template"],["templeted","templated"],["templetes","templates"],["templeting","templating"],["tempoaray","temporary"],["tempopary","temporary"],["temporaere","temporary"],["temporafy","temporary"],["temporalily","temporarily"],["temporarely","temporarily"],["temporarilly","temporarily"],["temporarilty","temporarily"],["temporarilu","temporary"],["temporarirly","temporarily"],["temporay","temporary"],["tempories","temporaries"],["temporily","temporarily"],["tempororaries","temporaries"],["tempororarily","temporarily"],["tempororary","temporary"],["temporories","temporaries"],["tempororily","temporarily"],["temporory","temporary"],["temporraies","temporaries"],["temporraily","temporarily"],["temporraries","temporaries"],["temporrarily","temporarily"],["temporrary","temporary"],["temporray","temporary"],["temporries","temporaries"],["temporrily","temporarily"],["temporry","temporary"],["temportal","temporal"],["temportaries","temporaries"],["temportarily","temporarily"],["temportary","temporary"],["tempory","temporary"],["temporyries","temporaries"],["temporyrily","temporarily"],["temporyry","temporary"],["tempraaily","temporarily"],["tempraal","temporal"],["tempraarily","temporarily"],["tempraarly","temporarily"],["tempraary","temporary"],["tempraay","temporary"],["tempraily","temporarily"],["tempral","temporal"],["temprament","temperament"],["tempramental","temperamental"],["tempraraily","temporarily"],["tempraral","temporal"],["temprararily","temporarily"],["temprararly","temporarily"],["temprarary","temporary"],["tempraray","temporary"],["temprarily","temporarily"],["temprature","temperature"],["tempratures","temperatures"],["tempray","temporary"],["tempreature","temperature"],["tempreatures","temperatures"],["temprement","temperament"],["tempremental","temperamental"],["temproaily","temporarily"],["temproal","temporal"],["temproarily","temporarily"],["temproarly","temporarily"],["temproary","temporary"],["temproay","temporary"],["temprol","temporal"],["temproment","temperament"],["tempromental","temperamental"],["temproraily","temporarily"],["temproral","temporal"],["temproraly","temporarily"],["temprorarily","temporarily"],["temprorarly","temporarily"],["temprorary","temporary"],["temproray","temporary"],["temprorily","temporarily"],["temprory","temporary"],["temproy","temporary"],["temptatation","temptation"],["tempurature","temperature"],["tempurture","temperature"],["temr","term"],["temrinal","terminal"],["temselves","themselves"],["temtation","temptation"],["tenacle","tentacle"],["tenacles","tentacles"],["tenanet","tenant"],["tenanets","tenants"],["tenatious","tenacious"],["tenatiously","tenaciously"],["tenative","tentative"],["tenatively","tentatively"],["tendacy","tendency"],["tendancies","tendencies"],["tendancy","tendency"],["tennisplayer","tennis player"],["tentaive","tentative"],["tentaively","tentatively"],["tention","tension"],["teplmate","template"],["teplmated","templated"],["teplmates","templates"],["tepmorarily","temporarily"],["teraform","terraform"],["teraformed","terraformed"],["teraforming","terraforming"],["teraforms","terraforms"],["terfform","terraform"],["terfformed","terraformed"],["terfforming","terraforming"],["terfforms","terraforms"],["teridactyl","pterodactyl"],["terific","terrific"],["terimnate","terminate"],["termial","terminal"],["termials","terminals"],["termianted","terminated"],["termimal","terminal"],["termimals","terminals"],["terminater","terminator"],["terminaters","terminators"],["terminats","terminates"],["termindate","terminate"],["termine","determine"],["termined","terminated"],["terminte","terminate"],["termintor","terminator"],["termniate","terminate"],["termniated","terminated"],["termniates","terminates"],["termniating","terminating"],["termniation","termination"],["termniations","terminations"],["termniator","terminator"],["termniators","terminators"],["termo","thermo"],["termostat","thermostat"],["termperatue","temperature"],["termperatues","temperatures"],["termperature","temperature"],["termperatures","temperatures"],["termplate","template"],["termplated","templated"],["termplates","templates"],["termporal","temporal"],["termporaries","temporaries"],["termporarily","temporarily"],["termporary","temporary"],["ternament","tournament"],["ternimate","terminate"],["terninal","terminal"],["terninals","terminals"],["terrable","terrible"],["terrestial","terrestrial"],["terrform","terraform"],["terrformed","terraformed"],["terrforming","terraforming"],["terrforms","terraforms"],["terriffic","terrific"],["terriories","territories"],["terriory","territory"],["territorist","terrorist"],["territoy","territory"],["terroist","terrorist"],["terurn","return"],["terurns","returns"],["tescase","testcase"],["tescases","testcases"],["tesellate","tessellate"],["tesellated","tessellated"],["tesellation","tessellation"],["tesellator","tessellator"],["tesited","tested"],["tessealte","tessellate"],["tessealted","tessellated"],["tesselatad","tessellated"],["tesselate","tessellate"],["tesselated","tessellated"],["tesselation","tessellation"],["tesselator","tessellator"],["tessleate","tessellate"],["tessleated","tessellated"],["tessleating","tessellating"],["tessleator","tessellator"],["testeing","testing"],["testiclular","testicular"],["testin","testing"],["testng","testing"],["testof","test of"],["testomony","testimony"],["testsing","testing"],["tetrahedran","tetrahedron"],["tetrahedrans","tetrahedrons"],["tetry","retry"],["tetss","tests"],["tetxture","texture"],["teusday","Tuesday"],["texchnically","technically"],["texline","textline"],["textfrme","textframe"],["texual","textual"],["texually","textually"],["texure","texture"],["texured","textured"],["texures","textures"],["texxt","text"],["tey","they"],["tghe","the"],["thansk","thanks"],["thansparent","transparent"],["thant","than"],["thare","there"],["that;s","that's"],["thats'","that's"],["thats","that's"],["thats;","that's"],["thck","thick"],["theard","thread"],["thearding","threading"],["theards","threads"],["theared","threaded"],["theather","theater"],["theef","thief"],["theer","there"],["theery","theory"],["theese","these"],["thefore","therefore"],["theif","thief"],["theifs","thieves"],["theive","thief"],["theives","thieves"],["themplate","template"],["themselces","themselves"],["themselfes","themselves"],["themselfs","themselves"],["themselvs","themselves"],["themslves","themselves"],["thenes","themes"],["thenn","then"],["theorectical","theoretical"],["theoreticall","theoretically"],["theoreticaly","theoretically"],["theorical","theoretical"],["theorically","theoretically"],["theoritical","theoretical"],["theoritically","theoretically"],["therafter","thereafter"],["therapudic","therapeutic"],["therby","thereby"],["thereads","threads"],["thereom","theorem"],["thererin","therein"],["theres","there's"],["thereshold","threshold"],["theresholds","thresholds"],["therfore","therefore"],["thermisor","thermistor"],["thermisors","thermistors"],["thermostast","thermostat"],["thermostasts","thermostats"],["therstat","thermostat"],["therwise","otherwise"],["theshold","threshold"],["thesholds","thresholds"],["thest","test"],["thetraedral","tetrahedral"],["thetrahedron","tetrahedron"],["thev","the"],["theves","thieves"],["thgat","that"],["thge","the"],["thhese","these"],["thhis","this"],["thid","this"],["thier","their"],["thign","thing"],["thigns","things"],["thigny","thingy"],["thigsn","things"],["thikn","think"],["thikness","thickness"],["thiknesses","thicknesses"],["thikns","thinks"],["thiks","thinks"],["thimngs","things"],["thinigs","things"],["thinkabel","thinkable"],["thinn","thin"],["thirtyth","thirtieth"],["this'd","this would"],["thisle","thistle"],["thist","this"],["thisy","this"],["thiunk","think"],["thjese","these"],["thme","them"],["thn","then"],["thna","than"],["thnak","thank"],["thnaks","thanks"],["thne","then"],["thnig","thing"],["thnigs","things"],["thonic","chthonic"],["thoroidal","toroidal"],["thoroughty","thoroughly"],["thoruoghly","thoroughly"],["thoses","those"],["thouch","touch"],["thoughout","throughout"],["thougth","thought"],["thounsands","thousands"],["thourghly","thoroughly"],["thourough","thorough"],["thouroughly","thoroughly"],["thq","the"],["thrad","thread"],["threadsave","threadsafe"],["threashold","threshold"],["threasholds","thresholds"],["threatend","threatened"],["threatment","treatment"],["threatments","treatments"],["threatning","threatening"],["thred","thread"],["threded","threaded"],["thredhold","threshold"],["threding","threading"],["threds","threads"],["three-dimenional","three-dimensional"],["three-dimenionsal","three-dimensional"],["threedimenional","three-dimensional"],["threedimenionsal","three-dimensional"],["threee","three"],["threhold","threshold"],["threrefore","therefore"],["threshhold","threshold"],["threshholds","thresholds"],["threshod","threshold"],["threshods","thresholds"],["threshol","threshold"],["thresold","threshold"],["thresshold","threshold"],["thrid","third"],["throen","thrown"],["throgh","through"],["throrough","thorough"],["throttoling","throttling"],["throug","through"],["througg","through"],["throughly","thoroughly"],["throughtout","throughout"],["througout","throughout"],["througt","through"],["througth","through"],["throuh","through"],["throuhg","through"],["throuhgout","throughout"],["throuhgput","throughput"],["throuth","through"],["throwgh","through"],["thrreshold","threshold"],["thrresholds","thresholds"],["thrue","through"],["thrugh","through"],["thruogh","through"],["thruoghout","throughout"],["thruoghput","throughput"],["thruout","throughout"],["thses","these"],["thsi","this"],["thsnk","thank"],["thsnked","thanked"],["thsnkful","thankful"],["thsnkfully","thankfully"],["thsnkfulness","thankfulness"],["thsnking","thanking"],["thsnks","thanks"],["thsnkyou","thank you"],["thsoe","those"],["thsose","those"],["thsould","should"],["thst","that"],["thta","that"],["thtat","that"],["thumbbnail","thumbnail"],["thumbnal","thumbnail"],["thumbnals","thumbnails"],["thundebird","thunderbird"],["thurday","Thursday"],["thurough","thorough"],["thurrow","thorough"],["thursdey","Thursday"],["thurver","further"],["thyat","that"],["tichened","thickened"],["tichness","thickness"],["tickness","thickness"],["tidibt","tidbit"],["tidibts","tidbits"],["tieing","tying"],["tiemout","timeout"],["tiemstamp","timestamp"],["tiemstamped","timestamped"],["tiemstamps","timestamps"],["tieth","tithe"],["tigger","trigger"],["tiggered","triggered"],["tiggering","triggering"],["tiggers","triggers"],["tighly","tightly"],["tightely","tightly"],["tigth","tight"],["tigthen","tighten"],["tigthened","tightened"],["tigthening","tightening"],["tigthens","tightens"],["tigthly","tightly"],["tihkn","think"],["tihs","this"],["tiitle","title"],["tillt","tilt"],["tillted","tilted"],["tillts","tilts"],["timdelta","timedelta"],["timedlta","timedelta"],["timeing","timing"],["timemout","timeout"],["timeot","timeout"],["timeoutted","timed out"],["timere","timer"],["timesamp","timestamp"],["timesamped","timestamped"],["timesamps","timestamps"],["timeschedule","time schedule"],["timespanp","timespan"],["timespanps","timespans"],["timestan","timespan"],["timestans","timespans"],["timestap","timestamp"],["timestaped","timestamped"],["timestaping","timestamping"],["timestaps","timestamps"],["timestemp","timestamp"],["timestemps","timestamps"],["timestmap","timestamp"],["timestmaps","timestamps"],["timetamp","timestamp"],["timetamps","timestamps"],["timmestamp","timestamp"],["timmestamps","timestamps"],["timne","time"],["timoeut","timeout"],["timout","timeout"],["timtout","timeout"],["timzeone","timezone"],["timzeones","timezones"],["timzezone","timezone"],["timzezones","timezones"],["tinterrupts","interrupts"],["tipically","typically"],["tirangle","triangle"],["tirangles","triangles"],["titel","title"],["titels","titles"],["titile","title"],["tittled","titled"],["tittling","titling"],["tje","the"],["tjhe","the"],["tjpanishad","upanishad"],["tkae","take"],["tkaes","takes"],["tkaing","taking"],["tlaking","talking"],["tmis","this"],["tne","the"],["toally","totally"],["tobbaco","tobacco"],["tobot","robot"],["toches","touches"],["tocksen","toxin"],["todya","today"],["toekn","token"],["togehter","together"],["togeter","together"],["togeterness","togetherness"],["toggel","toggle"],["toggeles","toggles"],["toggeling","toggling"],["toggels","toggles"],["toggleing","toggling"],["togheter","together"],["toghether","together"],["togle","toggle"],["togled","toggled"],["togling","toggling"],["toglle","toggle"],["toglled","toggled"],["togther","together"],["tolarable","tolerable"],["tolelerance","tolerance"],["tolen","token"],["tolens","tokens"],["toleranz","tolerance"],["tolerence","tolerance"],["tolerences","tolerances"],["tolerent","tolerant"],["tolernce","tolerance"],["Tolkein","Tolkien"],["tollerable","tolerable"],["tollerance","tolerance"],["tollerances","tolerances"],["tolorance","tolerance"],["tolorances","tolerances"],["tolorant","tolerant"],["tomatoe","tomato"],["tomatos","tomatoes"],["tommorow","tomorrow"],["tommorrow","tomorrow"],["tomorrrow","tomorrow"],["tongiht","tonight"],["tonihgt","tonight"],["tood","todo"],["toogle","toggle"],["toogling","toggling"],["tookits","toolkits"],["toolar","toolbar"],["toolsbox","toolbox"],["toom","tomb"],["toos","tools"],["tootonic","teutonic"],["topicaizer","topicalizer"],["topologie","topology"],["torerable","tolerable"],["toriodal","toroidal"],["tork","torque"],["tormenters","tormentors"],["tornadoe","tornado"],["torpeados","torpedoes"],["torpedos","torpedoes"],["tortilini","tortellini"],["tortise","tortoise"],["torward","toward"],["torwards","towards"],["totaly","totally"],["totat","total"],["totation","rotation"],["totats","totals"],["tothe","to the"],["tothiba","toshiba"],["totol","total"],["totorial","tutorial"],["totorials","tutorials"],["touble","trouble"],["toubles","troubles"],["toubling","troubling"],["toughtful","thoughtful"],["toughtly","tightly"],["toughts","thoughts"],["tounge","tongue"],["touple","tuple"],["towords","towards"],["towrad","toward"],["toxen","toxin"],["tpye","type"],["tpyed","typed"],["tpyes","types"],["tpyo","typo"],["trabsform","transform"],["traceablity","traceability"],["trackign","tracking"],["trackling","tracking"],["tracsode","transcode"],["tracsoded","transcoded"],["tracsoder","transcoder"],["tracsoders","transcoders"],["tracsodes","transcodes"],["tracsoding","transcoding"],["traddition","tradition"],["tradditional","traditional"],["tradditions","traditions"],["tradgic","tragic"],["tradionally","traditionally"],["traditilnal","traditional"],["traditiona","traditional"],["traditionaly","traditionally"],["traditionnal","traditional"],["traditionnally","traditionally"],["traditition","tradition"],["tradtional","traditional"],["tradtionally","traditionally"],["trafficed","trafficked"],["trafficing","trafficking"],["trafic","traffic"],["tragectory","trajectory"],["traget","target"],["trageted","targeted"],["trageting","targeting"],["tragets","targets"],["traige","triage"],["traiger","triager"],["traigers","triagers"],["traiges","triages"],["traiging","triaging"],["trailins","trailing"],["traingle","triangle"],["traingles","triangles"],["traingular","triangular"],["traingulate","triangulate"],["traingulated","triangulated"],["traingulates","triangulates"],["traingulating","triangulating"],["traingulation","triangulation"],["traingulations","triangulations"],["trainig","training"],["trainigs","training"],["trainng","training"],["trainngs","training"],["traked","tracked"],["traker","tracker"],["trakers","trackers"],["traking","tracking"],["tramsmit","transmit"],["tramsmits","transmits"],["tramsmitted","transmitted"],["tramsmitting","transmitting"],["tranaction","transaction"],["tranactional","transactional"],["tranactions","transactions"],["tranalating","translating"],["tranalation","translation"],["tranalations","translations"],["tranasction","transaction"],["tranasctions","transactions"],["tranceiver","transceiver"],["tranceivers","transceivers"],["trancendent","transcendent"],["trancending","transcending"],["tranclate","translate"],["trandional","traditional"],["tranfer","transfer"],["tranfered","transferred"],["tranfering","transferring"],["tranferred","transferred"],["tranfers","transfers"],["tranform","transform"],["tranformable","transformable"],["tranformation","transformation"],["tranformations","transformations"],["tranformative","transformative"],["tranformed","transformed"],["tranforming","transforming"],["tranforms","transforms"],["tranient","transient"],["tranients","transients"],["tranistion","transition"],["tranistioned","transitioned"],["tranistioning","transitioning"],["tranistions","transitions"],["tranition","transition"],["tranitioned","transitioned"],["tranitioning","transitioning"],["tranitions","transitions"],["tranlatable","translatable"],["tranlate","translate"],["tranlated","translated"],["tranlates","translates"],["tranlating","translating"],["tranlation","translation"],["tranlations","translations"],["tranlsation","translation"],["tranlsations","translations"],["tranmission","transmission"],["tranmist","transmit"],["tranmitted","transmitted"],["tranmitting","transmitting"],["tranparent","transparent"],["tranparently","transparently"],["tranport","transport"],["tranported","transported"],["tranporting","transporting"],["tranports","transports"],["transacion","transaction"],["transacions","transactions"],["transaciton","transaction"],["transacitons","transactions"],["transacrtion","transaction"],["transacrtions","transactions"],["transaction-spacific","transaction-specific"],["transactoin","transaction"],["transactoins","transactions"],["transalation","translation"],["transalations","translations"],["transalt","translate"],["transalte","translate"],["transalted","translated"],["transaltes","translates"],["transaltion","translation"],["transaltions","translations"],["transaltor","translator"],["transaltors","translators"],["transcendance","transcendence"],["transcendant","transcendent"],["transcendentational","transcendental"],["transcevier","transceiver"],["transciever","transceiver"],["transcievers","transceivers"],["transcocde","transcode"],["transcocded","transcoded"],["transcocder","transcoder"],["transcocders","transcoders"],["transcocdes","transcodes"],["transcocding","transcoding"],["transcocdings","transcodings"],["transconde","transcode"],["transconded","transcoded"],["transconder","transcoder"],["transconders","transcoders"],["transcondes","transcodes"],["transconding","transcoding"],["transcondings","transcodings"],["transcorde","transcode"],["transcorded","transcoded"],["transcorder","transcoder"],["transcorders","transcoders"],["transcordes","transcodes"],["transcording","transcoding"],["transcordings","transcodings"],["transcoser","transcoder"],["transcosers","transcoders"],["transction","transaction"],["transctions","transactions"],["transeint","transient"],["transending","transcending"],["transer","transfer"],["transesxuals","transsexuals"],["transferd","transferred"],["transfered","transferred"],["transfering","transferring"],["transferrd","transferred"],["transfom","transform"],["transfomation","transformation"],["transfomational","transformational"],["transfomations","transformations"],["transfomed","transformed"],["transfomer","transformer"],["transfomm","transform"],["transfoprmation","transformation"],["transforation","transformation"],["transforations","transformations"],["transformated","transformed"],["transformates","transforms"],["transformaton","transformation"],["transformatted","transformed"],["transfrom","transform"],["transfromation","transformation"],["transfromations","transformations"],["transfromed","transformed"],["transfromer","transformer"],["transfroming","transforming"],["transfroms","transforms"],["transiet","transient"],["transiets","transients"],["transision","transition"],["transisioning","transitioning"],["transisions","transitions"],["transisition","transition"],["transisitioned","transitioned"],["transisitioning","transitioning"],["transisitions","transitions"],["transistion","transition"],["transistioning","transitioning"],["transistions","transitions"],["transitionnal","transitional"],["transitionned","transitioned"],["transitionning","transitioning"],["transitionns","transitions"],["transiton","transition"],["transitoning","transitioning"],["transitons","transitions"],["transitor","transistor"],["transitors","transistors"],["translater","translator"],["translaters","translators"],["translatied","translated"],["translatoin","translation"],["translatoins","translations"],["translteration","transliteration"],["transmision","transmission"],["transmisive","transmissive"],["transmissable","transmissible"],["transmissione","transmission"],["transmist","transmit"],["transmited","transmitted"],["transmiter","transmitter"],["transmiters","transmitters"],["transmiting","transmitting"],["transmition","transmission"],["transmitsion","transmission"],["transmittd","transmitted"],["transmittion","transmission"],["transmitts","transmits"],["transmmit","transmit"],["transocde","transcode"],["transocded","transcoded"],["transocder","transcoder"],["transocders","transcoders"],["transocdes","transcodes"],["transocding","transcoding"],["transocdings","transcodings"],["transofrm","transform"],["transofrmation","transformation"],["transofrmations","transformations"],["transofrmed","transformed"],["transofrmer","transformer"],["transofrmers","transformers"],["transofrming","transforming"],["transofrms","transforms"],["transolate","translate"],["transolated","translated"],["transolates","translates"],["transolating","translating"],["transolation","translation"],["transolations","translations"],["transorm","transform"],["transormed","transformed"],["transorming","transforming"],["transorms","transforms"],["transpable","transposable"],["transpacencies","transparencies"],["transpacency","transparency"],["transpaernt","transparent"],["transpaerntly","transparently"],["transpancies","transparencies"],["transpancy","transparency"],["transpant","transplant"],["transparaent","transparent"],["transparaently","transparently"],["transparanceies","transparencies"],["transparancey","transparency"],["transparancies","transparencies"],["transparancy","transparency"],["transparanet","transparent"],["transparanetly","transparently"],["transparanies","transparencies"],["transparant","transparent"],["transparantly","transparently"],["transparany","transparency"],["transpararent","transparent"],["transpararently","transparently"],["transparcencies","transparencies"],["transparcency","transparency"],["transparcenies","transparencies"],["transparceny","transparency"],["transparecy","transparency"],["transpareny","transparency"],["transparities","transparencies"],["transparity","transparency"],["transparnecies","transparencies"],["transparnecy","transparency"],["transparnt","transparent"],["transparntly","transparently"],["transparren","transparent"],["transparrenly","transparently"],["transparrent","transparent"],["transparrently","transparently"],["transpart","transport"],["transparts","transports"],["transpatrent","transparent"],["transpatrently","transparently"],["transpencies","transparencies"],["transpency","transparency"],["transpeorted","transported"],["transperancies","transparencies"],["transperancy","transparency"],["transperant","transparent"],["transperantly","transparently"],["transperencies","transparencies"],["transperency","transparency"],["transperent","transparent"],["transperently","transparently"],["transporation","transportation"],["transportatin","transportation"],["transprencies","transparencies"],["transprency","transparency"],["transprent","transparent"],["transprently","transparently"],["transprot","transport"],["transproted","transported"],["transproting","transporting"],["transprots","transports"],["transprt","transport"],["transprted","transported"],["transprting","transporting"],["transprts","transports"],["transpsition","transposition"],["transsend","transcend"],["transtion","transition"],["transtioned","transitioned"],["transtioning","transitioning"],["transtions","transitions"],["transtition","transition"],["transtitioned","transitioned"],["transtitioning","transitioning"],["transtitions","transitions"],["transtorm","transform"],["transtormed","transformed"],["transvorm","transform"],["transvormation","transformation"],["transvormed","transformed"],["transvorming","transforming"],["transvorms","transforms"],["tranversing","traversing"],["trapeziod","trapezoid"],["trapeziodal","trapezoidal"],["trasaction","transaction"],["trascation","transaction"],["trasfer","transfer"],["trasferred","transferred"],["trasfers","transfers"],["trasform","transform"],["trasformable","transformable"],["trasformation","transformation"],["trasformations","transformations"],["trasformative","transformative"],["trasformed","transformed"],["trasformer","transformer"],["trasformers","transformers"],["trasforming","transforming"],["trasforms","transforms"],["traslalate","translate"],["traslalated","translated"],["traslalating","translating"],["traslalation","translation"],["traslalations","translations"],["traslate","translate"],["traslated","translated"],["traslates","translates"],["traslating","translating"],["traslation","translation"],["traslations","translations"],["traslucency","translucency"],["trasmission","transmission"],["trasmit","transmit"],["trasnaction","transaction"],["trasnfer","transfer"],["trasnfered","transferred"],["trasnferred","transferred"],["trasnfers","transfers"],["trasnform","transform"],["trasnformation","transformation"],["trasnformed","transformed"],["trasnformer","transformer"],["trasnformers","transformers"],["trasnforms","transforms"],["trasnlate","translate"],["trasnlated","translated"],["trasnlation","translation"],["trasnlations","translations"],["trasnparencies","transparencies"],["trasnparency","transparency"],["trasnparent","transparent"],["trasnport","transport"],["trasnports","transports"],["trasnsmit","transmit"],["trasparency","transparency"],["trasparent","transparent"],["trasparently","transparently"],["trasport","transport"],["trasportable","transportable"],["trasported","transported"],["trasporter","transporter"],["trasports","transports"],["traspose","transpose"],["trasposed","transposed"],["trasposing","transposing"],["trasposition","transposition"],["traspositions","transpositions"],["traved","traversed"],["traveersal","traversal"],["traveerse","traverse"],["traveersed","traversed"],["traveerses","traverses"],["traveersing","traversing"],["traveral","traversal"],["travercal","traversal"],["traverce","traverse"],["traverced","traversed"],["traverces","traverses"],["travercing","traversing"],["travere","traverse"],["travered","traversed"],["traveres","traverse"],["traveresal","traversal"],["traveresed","traversed"],["travereses","traverses"],["traveresing","traversing"],["travering","traversing"],["traverssal","traversal"],["travesal","traversal"],["travese","traverse"],["travesed","traversed"],["traveses","traverses"],["travesing","traversing"],["tre","tree"],["treate","treat"],["treatement","treatment"],["treatements","treatments"],["treates","treats"],["tremelo","tremolo"],["tremelos","tremolos"],["trempoline","trampoline"],["treshhold","threshold"],["treshold","threshold"],["tressle","trestle"],["treting","treating"],["trgistration","registration"],["trhe","the"],["triancle","triangle"],["triancles","triangles"],["trianed","trained"],["triange","triangle"],["triangel","triangle"],["triangels","triangles"],["trianglular","triangular"],["trianglutaion","triangulation"],["triangulataion","triangulation"],["triangultaion","triangulation"],["trianing","training"],["trianlge","triangle"],["trianlges","triangles"],["trians","trains"],["trigered","triggered"],["trigerred","triggered"],["trigerring","triggering"],["trigers","triggers"],["trigged","triggered"],["triggerd","triggered"],["triggeres","triggers"],["triggerred","triggered"],["triggerring","triggering"],["triggerrs","triggers"],["triggger","trigger"],["trignometric","trigonometric"],["trignometry","trigonometry"],["triguered","triggered"],["triked","tricked"],["trikery","trickery"],["triky","tricky"],["trilineal","trilinear"],["trimed","trimmed"],["trimmng","trimming"],["trinagle","triangle"],["trinagles","triangles"],["triniy","trinity"],["triology","trilogy"],["tripel","triple"],["tripeld","tripled"],["tripels","triples"],["tripple","triple"],["triuangulate","triangulate"],["trival","trivial"],["trivally","trivially"],["trivias","trivia"],["trivival","trivial"],["trnasfers","transfers"],["trnasmit","transmit"],["trnasmited","transmitted"],["trnasmits","transmits"],["trnsfer","transfer"],["trnsfered","transferred"],["trnsfers","transfers"],["troling","trolling"],["trottle","throttle"],["troubeshoot","troubleshoot"],["troubeshooted","troubleshooted"],["troubeshooter","troubleshooter"],["troubeshooting","troubleshooting"],["troubeshoots","troubleshoots"],["troublehshoot","troubleshoot"],["troublehshooting","troubleshooting"],["troublshoot","troubleshoot"],["troublshooting","troubleshooting"],["trought","through"],["troup","troupe"],["trriger","trigger"],["trrigered","triggered"],["trrigering","triggering"],["trrigers","triggers"],["trrigger","trigger"],["trriggered","triggered"],["trriggering","triggering"],["trriggers","triggers"],["trubble","trouble"],["trubbled","troubled"],["trubbles","troubles"],["truble","trouble"],["trubled","troubled"],["trubles","troubles"],["trubling","troubling"],["trucate","truncate"],["trucated","truncated"],["trucates","truncates"],["trucating","truncating"],["trucnate","truncate"],["trucnated","truncated"],["trucnating","truncating"],["truct","struct"],["truelly","truly"],["truely","truly"],["truied","tried"],["trully","truly"],["trun","turn"],["trunacted","truncated"],["truncat","truncate"],["trunctate","truncate"],["trunctated","truncated"],["trunctating","truncating"],["trunctation","truncation"],["truncted","truncated"],["truned","turned"],["truns","turns"],["trustworthly","trustworthy"],["trustworthyness","trustworthiness"],["trustworty","trustworthy"],["trustwortyness","trustworthiness"],["trustwothy","trustworthy"],["truw","true"],["tryed","tried"],["tryes","tries"],["tryig","trying"],["tryinng","trying"],["trys","tries"],["tryying","trying"],["ttests","tests"],["tthe","the"],["tuesdey","Tuesday"],["tuesdsy","Tuesday"],["tufure","future"],["tuhmbnail","thumbnail"],["tunelled","tunnelled"],["tunelling","tunneling"],["tunned","tuned"],["tunnell","tunnel"],["tuotiral","tutorial"],["tuotirals","tutorials"],["tupel","tuple"],["tupple","tuple"],["tupples","tuples"],["ture","true"],["turle","turtle"],["turly","truly"],["turorial","tutorial"],["turorials","tutorials"],["turtleh","turtle"],["turtlehs","turtles"],["turtorial","tutorial"],["turtorials","tutorials"],["Tuscon","Tucson"],["tusday","Tuesday"],["tuseday","Tuesday"],["tust","trust"],["tution","tuition"],["tutoriel","tutorial"],["tutoriels","tutorials"],["tweleve","twelve"],["twelth","twelfth"],["two-dimenional","two-dimensional"],["two-dimenionsal","two-dimensional"],["twodimenional","two-dimensional"],["twodimenionsal","two-dimensional"],["twon","town"],["twpo","two"],["tyep","type"],["tyhat","that"],["tyies","tries"],["tymecode","timecode"],["tyope","type"],["typcast","typecast"],["typcasting","typecasting"],["typcasts","typecasts"],["typcial","typical"],["typcially","typically"],["typechek","typecheck"],["typecheking","typechecking"],["typesrript","typescript"],["typicallly","typically"],["typicaly","typically"],["typicially","typically"],["typle","tuple"],["typles","tuples"],["typographc","typographic"],["typpe","type"],["typped","typed"],["typpes","types"],["typpical","typical"],["typpically","typically"],["tyranies","tyrannies"],["tyrany","tyranny"],["tyring","trying"],["tyrranies","tyrannies"],["tyrrany","tyranny"],["ubelieveble","unbelievable"],["ubelievebly","unbelievably"],["ubernetes","Kubernetes"],["ubiquitious","ubiquitous"],["ubiquituously","ubiquitously"],["ubitquitous","ubiquitous"],["ublisher","publisher"],["ubunut","Ubuntu"],["ubutu","Ubuntu"],["ubutunu","Ubuntu"],["udpatable","updatable"],["udpate","update"],["udpated","updated"],["udpater","updater"],["udpates","updates"],["udpating","updating"],["ueful","useful"],["uegister","unregister"],["uesd","used"],["ueses","uses"],["uesful","useful"],["uesfull","useful"],["uesfulness","usefulness"],["uesless","useless"],["ueslessness","uselessness"],["uest","quest"],["uests","quests"],["uffer","buffer"],["uffered","buffered"],["uffering","buffering"],["uffers","buffers"],["uggly","ugly"],["ugglyness","ugliness"],["uglyness","ugliness"],["uique","unique"],["uise","use"],["uisng","using"],["uites","suites"],["uknown","unknown"],["uknowns","unknowns"],["Ukranian","Ukrainian"],["uless","unless"],["ulimited","unlimited"],["ulter","alter"],["ulteration","alteration"],["ulterations","alterations"],["ultered","altered"],["ultering","altering"],["ulters","alters"],["ultimatly","ultimately"],["ultimely","ultimately"],["umambiguous","unambiguous"],["umark","unmark"],["umarked","unmarked"],["umbrealla","umbrella"],["uminportant","unimportant"],["umit","unit"],["umless","unless"],["ummark","unmark"],["umoutn","umount"],["un-complete","incomplete"],["unabailable","unavailable"],["unabale","unable"],["unabel","unable"],["unablet","unable"],["unacceptible","unacceptable"],["unaccesible","inaccessible"],["unaccessable","inaccessible"],["unacknowleged","unacknowledged"],["unacompanied","unaccompanied"],["unadvertantly","inadvertently"],["unadvertedly","inadvertently"],["unadvertent","inadvertent"],["unadvertently","inadvertently"],["unahppy","unhappy"],["unalllowed","unallowed"],["unambigious","unambiguous"],["unambigous","unambiguous"],["unambigously","unambiguously"],["unamed","unnamed"],["unanimuous","unanimous"],["unanymous","unanimous"],["unappretiated","unappreciated"],["unappretiative","unappreciative"],["unapprieciated","unappreciated"],["unapprieciative","unappreciative"],["unapretiated","unappreciated"],["unapretiative","unappreciative"],["unaquired","unacquired"],["unarchving","unarchiving"],["unassing","unassign"],["unassinged","unassigned"],["unassinging","unassigning"],["unassings","unassigns"],["unathenticated","unauthenticated"],["unathorised","unauthorised"],["unathorized","unauthorized"],["unatteded","unattended"],["unauthenicated","unauthenticated"],["unauthenticed","unauthenticated"],["unavaiable","unavailable"],["unavaialable","unavailable"],["unavaialbale","unavailable"],["unavaialbe","unavailable"],["unavaialbel","unavailable"],["unavaialbility","unavailability"],["unavaialble","unavailable"],["unavaible","unavailable"],["unavailabel","unavailable"],["unavailiability","unavailability"],["unavailible","unavailable"],["unavaliable","unavailable"],["unavaoidable","unavoidable"],["unavilable","unavailable"],["unballance","unbalance"],["unbeknowst","unbeknownst"],["unbeleifable","unbelievable"],["unbeleivable","unbelievable"],["unbeliefable","unbelievable"],["unbelivable","unbelievable"],["unbeliveable","unbelievable"],["unbeliveably","unbelievably"],["unbelivebly","unbelievably"],["unborned","unborn"],["unbouind","unbound"],["unbouinded","unbounded"],["unboun","unbound"],["unbounad","unbound"],["unbounaded","unbounded"],["unbouned","unbounded"],["unbounnd","unbound"],["unbounnded","unbounded"],["unbouund","unbound"],["unbouunded","unbounded"],["uncahnged","unchanged"],["uncalcualted","uncalculated"],["unce","once"],["uncehck","uncheck"],["uncehcked","unchecked"],["uncerain","uncertain"],["uncerainties","uncertainties"],["uncerainty","uncertainty"],["uncertaincy","uncertainty"],["uncertainities","uncertainties"],["uncertainity","uncertainty"],["uncessarily","unnecessarily"],["uncetain","uncertain"],["uncetainties","uncertainties"],["uncetainty","uncertainty"],["unchache","uncache"],["unchached","uncached"],["unchaged","unchanged"],["unchainged","unchanged"],["unchallengable","unchallengeable"],["unchaned","unchanged"],["unchaneged","unchanged"],["unchangable","unchangeable"],["uncheked","unchecked"],["unchenged","unchanged"],["uncognized","unrecognized"],["uncoment","uncomment"],["uncomented","uncommented"],["uncomenting","uncommenting"],["uncoments","uncomments"],["uncomitted","uncommitted"],["uncommited","uncommitted"],["uncommment","uncomment"],["uncommmented","uncommented"],["uncommmenting","uncommenting"],["uncommments","uncomments"],["uncommmitted","uncommitted"],["uncommmon","uncommon"],["uncommpresed","uncompressed"],["uncommpresion","uncompression"],["uncommpressd","uncompressed"],["uncommpressed","uncompressed"],["uncommpression","uncompression"],["uncommtited","uncommitted"],["uncomon","uncommon"],["uncompetetive","uncompetitive"],["uncompetive","uncompetitive"],["uncomplete","incomplete"],["uncompleteness","incompleteness"],["uncompletness","incompleteness"],["uncompres","uncompress"],["uncompresed","uncompressed"],["uncompreses","uncompresses"],["uncompresing","uncompressing"],["uncompresor","uncompressor"],["uncompresors","uncompressors"],["uncompressible","incompressible"],["uncomprss","uncompress"],["unconcious","unconscious"],["unconciousness","unconsciousness"],["unconcistencies","inconsistencies"],["unconcistency","inconsistency"],["unconcistent","inconsistent"],["uncondisional","unconditional"],["uncondisionaly","unconditionally"],["uncondisionnal","unconditional"],["uncondisionnaly","unconditionally"],["unconditial","unconditional"],["unconditially","unconditionally"],["unconditialy","unconditionally"],["unconditianal","unconditional"],["unconditianally","unconditionally"],["unconditianaly","unconditionally"],["unconditinally","unconditionally"],["unconditinaly","unconditionally"],["unconditionaly","unconditionally"],["unconditionnal","unconditional"],["unconditionnally","unconditionally"],["unconditionnaly","unconditionally"],["uncondtional","unconditional"],["uncondtionally","unconditionally"],["unconfiged","unconfigured"],["unconfortability","discomfort"],["unconsisntency","inconsistency"],["unconsistent","inconsistent"],["uncontitutional","unconstitutional"],["uncontrained","unconstrained"],["uncontrolable","uncontrollable"],["unconvential","unconventional"],["unconventionnal","unconventional"],["uncorectly","incorrectly"],["uncorelated","uncorrelated"],["uncorrect","incorrect"],["uncorrectly","incorrectly"],["uncorrolated","uncorrelated"],["uncoverted","unconverted"],["uncrypted","unencrypted"],["undecideable","undecidable"],["undefied","undefined"],["undefien","undefine"],["undefiend","undefined"],["undefinied","undefined"],["undeflow","underflow"],["undeflows","underflows"],["undefuned","undefined"],["undelying","underlying"],["underfiend","undefined"],["underfined","undefined"],["underfow","underflow"],["underfowed","underflowed"],["underfowing","underflowing"],["underfows","underflows"],["underlayed","underlaid"],["underlaying","underlying"],["underlflow","underflow"],["underlflowed","underflowed"],["underlflowing","underflowing"],["underlflows","underflows"],["underlfow","underflow"],["underlfowed","underflowed"],["underlfowing","underflowing"],["underlfows","underflows"],["underlow","underflow"],["underlowed","underflowed"],["underlowing","underflowing"],["underlows","underflows"],["underlyng","underlying"],["underneeth","underneath"],["underrrun","underrun"],["undersacn","underscan"],["understadn","understand"],["understadnable","understandable"],["understadning","understanding"],["understadns","understands"],["understoon","understood"],["understoud","understood"],["undertand","understand"],["undertandable","understandable"],["undertanded","understood"],["undertanding","understanding"],["undertands","understands"],["undertsand","understand"],["undertsanding","understanding"],["undertsands","understands"],["undertsood","understood"],["undertstand","understand"],["undertstands","understands"],["underun","underrun"],["underuns","underruns"],["underware","underwear"],["underying","underlying"],["underyling","underlying"],["undescore","underscore"],["undescored","underscored"],["undescores","underscores"],["undesireable","undesirable"],["undesitable","undesirable"],["undestand","understand"],["undestood","understood"],["undet","under"],["undetecable","undetectable"],["undetstand","understand"],["undetware","underwear"],["undetwater","underwater"],["undfine","undefine"],["undfined","undefined"],["undfines","undefines"],["undistinghable","indistinguishable"],["undocummented","undocumented"],["undorder","unorder"],["undordered","unordered"],["undoubtely","undoubtedly"],["undreground","underground"],["undupplicated","unduplicated"],["uneccesary","unnecessary"],["uneccessarily","unnecessarily"],["uneccessary","unnecessary"],["unecessarily","unnecessarily"],["unecessary","unnecessary"],["uneforceable","unenforceable"],["uneform","uniform"],["unencrpt","unencrypt"],["unencrpted","unencrypted"],["unenforcable","unenforceable"],["unepected","unexpected"],["unepectedly","unexpectedly"],["unequalities","inequalities"],["unequality","inequality"],["uner","under"],["unesacpe","unescape"],["unesacped","unescaped"],["unessecarry","unnecessary"],["unessecary","unnecessary"],["unevaluted","unevaluated"],["unexcected","unexpected"],["unexcectedly","unexpectedly"],["unexcpected","unexpected"],["unexcpectedly","unexpectedly"],["unexecpted","unexpected"],["unexecptedly","unexpectedly"],["unexected","unexpected"],["unexectedly","unexpectedly"],["unexepcted","unexpected"],["unexepctedly","unexpectedly"],["unexepected","unexpected"],["unexepectedly","unexpectedly"],["unexpacted","unexpected"],["unexpactedly","unexpectedly"],["unexpcted","unexpected"],["unexpctedly","unexpectedly"],["unexpecetd","unexpected"],["unexpecetdly","unexpectedly"],["unexpect","unexpected"],["unexpectd","unexpected"],["unexpectdly","unexpectedly"],["unexpecte","unexpected"],["unexpectely","unexpectedly"],["unexpectend","unexpected"],["unexpectendly","unexpectedly"],["unexpectly","unexpectedly"],["unexpeected","unexpected"],["unexpeectedly","unexpectedly"],["unexpepected","unexpected"],["unexpepectedly","unexpectedly"],["unexpepted","unexpected"],["unexpeptedly","unexpectedly"],["unexpercted","unexpected"],["unexperctedly","unexpectedly"],["unexpested","unexpected"],["unexpestedly","unexpectedly"],["unexpetced","unexpected"],["unexpetcedly","unexpectedly"],["unexpetct","unexpected"],["unexpetcted","unexpected"],["unexpetctedly","unexpectedly"],["unexpetctly","unexpectedly"],["unexpetect","unexpected"],["unexpetected","unexpected"],["unexpetectedly","unexpectedly"],["unexpetectly","unexpectedly"],["unexpeted","unexpected"],["unexpetedly","unexpectedly"],["unexpexcted","unexpected"],["unexpexctedly","unexpectedly"],["unexpexted","unexpected"],["unexpextedly","unexpectedly"],["unexspected","unexpected"],["unexspectedly","unexpectedly"],["unfilp","unflip"],["unfilpped","unflipped"],["unfilpping","unflipping"],["unfilps","unflips"],["unflaged","unflagged"],["unflexible","inflexible"],["unforetunately","unfortunately"],["unforgetable","unforgettable"],["unforgiveable","unforgivable"],["unformated","unformatted"],["unforseen","unforeseen"],["unforttunately","unfortunately"],["unfortuante","unfortunate"],["unfortuantely","unfortunately"],["unfortunaltely","unfortunately"],["unfortunaly","unfortunately"],["unfortunat","unfortunate"],["unfortunatelly","unfortunately"],["unfortunatetly","unfortunately"],["unfortunatley","unfortunately"],["unfortunatly","unfortunately"],["unfortunetly","unfortunately"],["unfortuntaly","unfortunately"],["unforunate","unfortunate"],["unforunately","unfortunately"],["unforutunate","unfortunate"],["unforutunately","unfortunately"],["unfotunately","unfortunately"],["unfourtunately","unfortunately"],["unfourtunetly","unfortunately"],["unfurtunately","unfortunately"],["ungeneralizeable","ungeneralizable"],["ungly","ugly"],["unhandeled","unhandled"],["unhilight","unhighlight"],["unhilighted","unhighlighted"],["unhilights","unhighlights"],["Unicde","Unicode"],["unich","unix"],["unidentifiedly","unidentified"],["unidimensionnal","unidimensional"],["unifform","uniform"],["unifforms","uniforms"],["unifiy","unify"],["uniformely","uniformly"],["unifrom","uniform"],["unifromed","uniformed"],["unifromity","uniformity"],["unifroms","uniforms"],["unigned","unsigned"],["unihabited","uninhabited"],["unilateraly","unilaterally"],["unilatreal","unilateral"],["unilatreally","unilaterally"],["unimpemented","unimplemented"],["unimplemeneted","unimplemented"],["unimplimented","unimplemented"],["uninitailised","uninitialised"],["uninitailized","uninitialized"],["uninitalise","uninitialise"],["uninitalised","uninitialised"],["uninitalises","uninitialises"],["uninitalize","uninitialize"],["uninitalized","uninitialized"],["uninitalizes","uninitializes"],["uniniteresting","uninteresting"],["uninitializaed","uninitialized"],["uninitialse","uninitialise"],["uninitialsed","uninitialised"],["uninitialses","uninitialises"],["uninitialze","uninitialize"],["uninitialzed","uninitialized"],["uninitialzes","uninitializes"],["uninstalable","uninstallable"],["uninstatiated","uninstantiated"],["uninstlal","uninstall"],["uninstlalation","uninstallation"],["uninstlalations","uninstallations"],["uninstlaled","uninstalled"],["uninstlaler","uninstaller"],["uninstlaling","uninstalling"],["uninstlals","uninstalls"],["unint8_t","uint8_t"],["unintelligable","unintelligible"],["unintentially","unintentionally"],["uninteressting","uninteresting"],["uninterpretted","uninterpreted"],["uninterruped","uninterrupted"],["uninterruptable","uninterruptible"],["unintersting","uninteresting"],["uninteruppted","uninterrupted"],["uninterupted","uninterrupted"],["unintesting","uninteresting"],["unintialised","uninitialised"],["unintialized","uninitialized"],["unintiallised","uninitialised"],["unintiallized","uninitialized"],["unintialsied","uninitialised"],["unintialzied","uninitialized"],["unio","union"],["unios","unions"],["uniqe","unique"],["uniqu","unique"],["uniquness","uniqueness"],["unistalled","uninstalled"],["uniterrupted","uninterrupted"],["UnitesStates","UnitedStates"],["unitialize","uninitialize"],["unitialized","uninitialized"],["unitilised","uninitialised"],["unitilising","uninitialising"],["unitilities","utilities"],["unitility","utility"],["unitilized","uninitialized"],["unitilizing","uninitializing"],["unitilties","utilities"],["unitilty","utility"],["unititialized","uninitialized"],["unitl","until"],["unitled","untitled"],["unitss","units"],["univeral","universal"],["univerally","universally"],["univeriality","universality"],["univeristies","universities"],["univeristy","university"],["univerities","universities"],["univerity","university"],["universial","universal"],["universiality","universality"],["universirty","university"],["universtal","universal"],["universtiy","university"],["univesities","universities"],["univesity","university"],["univiersal","universal"],["univrsal","universal"],["unkmown","unknown"],["unknon","unknown"],["unknonw","unknown"],["unknonwn","unknown"],["unknonws","unknowns"],["unknwn","unknown"],["unknwns","unknowns"],["unknwoing","unknowing"],["unknwoingly","unknowingly"],["unknwon","unknown"],["unknwons","unknowns"],["unknwown","unknown"],["unknwowns","unknowns"],["unkonwn","unknown"],["unkonwns","unknowns"],["unkown","unknown"],["unkowns","unknowns"],["unkwown","unknown"],["unlcear","unclear"],["unles","unless"],["unlikey","unlikely"],["unlikley","unlikely"],["unlimeted","unlimited"],["unlimitied","unlimited"],["unlimted","unlimited"],["unline","unlike"],["unloadins","unloading"],["unmached","unmatched"],["unmainted","unmaintained"],["unmaping","unmapping"],["unmappend","unmapped"],["unmarsalling","unmarshalling"],["unmaximice","unmaximize"],["unmistakeably","unmistakably"],["unmodfide","unmodified"],["unmodfided","unmodified"],["unmodfied","unmodified"],["unmodfieid","unmodified"],["unmodfified","unmodified"],["unmodfitied","unmodified"],["unmodifable","unmodifiable"],["unmodifed","unmodified"],["unmoutned","unmounted"],["unnacquired","unacquired"],["unncessary","unnecessary"],["unneccecarily","unnecessarily"],["unneccecary","unnecessary"],["unneccesarily","unnecessarily"],["unneccesary","unnecessary"],["unneccessarily","unnecessarily"],["unneccessary","unnecessary"],["unneceesarily","unnecessarily"],["unnecesarily","unnecessarily"],["unnecesarrily","unnecessarily"],["unnecesarry","unnecessary"],["unnecesary","unnecessary"],["unnecesasry","unnecessary"],["unnecessar","unnecessary"],["unnecessarilly","unnecessarily"],["unnecesserily","unnecessarily"],["unnecessery","unnecessary"],["unnecessiarlly","unnecessarily"],["unnecssary","unnecessary"],["unnedded","unneeded"],["unneded","unneeded"],["unneedingly","unnecessarily"],["unnescessarily","unnecessarily"],["unnescessary","unnecessary"],["unnesesarily","unnecessarily"],["unnessarily","unnecessarily"],["unnessasary","unnecessary"],["unnessecarily","unnecessarily"],["unnessecarry","unnecessary"],["unnessecary","unnecessary"],["unnessesarily","unnecessarily"],["unnessesary","unnecessary"],["unnessessarily","unnecessarily"],["unnessessary","unnecessary"],["unning","running"],["unnnecessary","unnecessary"],["unnown","unknown"],["unnowns","unknowns"],["unnsupported","unsupported"],["unnused","unused"],["unobstrusive","unobtrusive"],["unocde","Unicode"],["unoffical","unofficial"],["unoin","union"],["unompress","uncompress"],["unoperational","nonoperational"],["unorderd","unordered"],["unoredered","unordered"],["unorotated","unrotated"],["unoticeable","unnoticeable"],["unpacke","unpacked"],["unpacket","unpacked"],["unparseable","unparsable"],["unpertubated","unperturbed"],["unperturb","unperturbed"],["unperturbated","unperturbed"],["unperturbe","unperturbed"],["unplease","displease"],["unpleasent","unpleasant"],["unplesant","unpleasant"],["unplesent","unpleasant"],["unprecendented","unprecedented"],["unprecidented","unprecedented"],["unprecise","imprecise"],["unpredicatable","unpredictable"],["unpredicatble","unpredictable"],["unpredictablity","unpredictability"],["unpredictible","unpredictable"],["unpriviledged","unprivileged"],["unpriviliged","unprivileged"],["unprmopted","unprompted"],["unqiue","unique"],["unqoute","unquote"],["unqouted","unquoted"],["unqoutes","unquotes"],["unqouting","unquoting"],["unque","unique"],["unreacahable","unreachable"],["unreacahble","unreachable"],["unreacheable","unreachable"],["unrealeased","unreleased"],["unreasonabily","unreasonably"],["unrechable","unreachable"],["unrecocnized","unrecognized"],["unrecoginized","unrecognized"],["unrecogized","unrecognized"],["unrecognixed","unrecognized"],["unrecongized","unrecognized"],["unreconized","unrecognized"],["unrecovable","unrecoverable"],["unrecovarable","unrecoverable"],["unrecoverd","unrecovered"],["unregester","unregister"],["unregiste","unregister"],["unregisted","unregistered"],["unregisteing","registering"],["unregisterd","unregistered"],["unregistert","unregistered"],["unregistes","unregisters"],["unregisting","unregistering"],["unregistred","unregistered"],["unregistrs","unregisters"],["unregiter","unregister"],["unregiters","unregisters"],["unregnized","unrecognized"],["unregognised","unrecognised"],["unregsiter","unregister"],["unregsitered","unregistered"],["unregsitering","unregistering"],["unregsiters","unregisters"],["unregster","unregister"],["unregstered","unregistered"],["unregstering","unregistering"],["unregsters","unregisters"],["unreigister","unregister"],["unreigster","unregister"],["unreigstered","unregistered"],["unreigstering","unregistering"],["unreigsters","unregisters"],["unrelatd","unrelated"],["unreleated","unrelated"],["unrelted","unrelated"],["unrelyable","unreliable"],["unrelying","underlying"],["unrepentent","unrepentant"],["unrepetant","unrepentant"],["unrepetent","unrepentant"],["unreplacable","unreplaceable"],["unreplacalbe","unreplaceable"],["unreproducable","unreproducible"],["unresgister","unregister"],["unresgisterd","unregistered"],["unresgistered","unregistered"],["unresgisters","unregisters"],["unresolvabvle","unresolvable"],["unresonable","unreasonable"],["unresposive","unresponsive"],["unrestrcited","unrestricted"],["unrgesiter","unregister"],["unroated","unrotated"],["unrosponsive","unresponsive"],["unsanfe","unsafe"],["unsccessful","unsuccessful"],["unscubscribe","subscribe"],["unscubscribed","subscribed"],["unsearcahble","unsearchable"],["unselct","unselect"],["unselcted","unselected"],["unselctes","unselects"],["unselcting","unselecting"],["unselcts","unselects"],["unselecgt","unselect"],["unselecgted","unselected"],["unselecgtes","unselects"],["unselecgting","unselecting"],["unselecgts","unselects"],["unselectabe","unselectable"],["unsepcified","unspecified"],["unseting","unsetting"],["unsetset","unset"],["unsettin","unsetting"],["unsharable","unshareable"],["unshfit","unshift"],["unshfited","unshifted"],["unshfiting","unshifting"],["unshfits","unshifts"],["unsiged","unsigned"],["unsigend","unsigned"],["unsignd","unsigned"],["unsignificant","insignificant"],["unsinged","unsigned"],["unsoclicited","unsolicited"],["unsolicitied","unsolicited"],["unsolicted","unsolicited"],["unsollicited","unsolicited"],["unspecificed","unspecified"],["unspecifiec","unspecific"],["unspecifiecd","unspecified"],["unspecifieced","unspecified"],["unspefcifieid","unspecified"],["unspefeid","unspecified"],["unspeficed","unspecified"],["unspeficeid","unspecified"],["unspeficialleid","unspecified"],["unspeficiallied","unspecified"],["unspeficiallifed","unspecified"],["unspeficied","unspecified"],["unspeficieid","unspecified"],["unspeficifed","unspecified"],["unspeficifeid","unspecified"],["unspeficified","unspecified"],["unspeficififed","unspecified"],["unspeficiied","unspecified"],["unspeficiifed","unspecified"],["unspeficilleid","unspecified"],["unspeficillied","unspecified"],["unspeficillifed","unspecified"],["unspeficiteid","unspecified"],["unspeficitied","unspecified"],["unspeficitifed","unspecified"],["unspefied","unspecified"],["unspefifed","unspecified"],["unspefifeid","unspecified"],["unspefified","unspecified"],["unspefififed","unspecified"],["unspefiied","unspecified"],["unspefiifeid","unspecified"],["unspefiified","unspecified"],["unspefiififed","unspecified"],["unspefixeid","unspecified"],["unspefixied","unspecified"],["unspefixifed","unspecified"],["unspported","unsupported"],["unstabel","unstable"],["unstalbe","unstable"],["unsuable","unusable"],["unsual","unusual"],["unsubscibe","unsubscribe"],["unsubscibed","unsubscribed"],["unsubscibing","unsubscribing"],["unsubscirbe","unsubscribe"],["unsubscirbed","unsubscribed"],["unsubscirbing","unsubscribing"],["unsubscirption","unsubscription"],["unsubscirptions","unsubscriptions"],["unsubscritpion","unsubscription"],["unsubscritpions","unsubscriptions"],["unsubscritpiton","unsubscription"],["unsubscritpitons","unsubscriptions"],["unsubscritption","unsubscription"],["unsubscritptions","unsubscriptions"],["unsubstanciated","unsubstantiated"],["unsucccessful","unsuccessful"],["unsucccessfully","unsuccessfully"],["unsucccessul","unsuccessful"],["unsucccessully","unsuccessfully"],["unsuccee","unsuccessful"],["unsucceed","unsuccessful"],["unsucceedde","unsuccessful"],["unsucceeded","unsuccessful"],["unsucceeds","unsuccessful"],["unsucceeed","unsuccessful"],["unsuccees","unsuccessful"],["unsuccesful","unsuccessful"],["unsuccesfull","unsuccessful"],["unsuccesfully","unsuccessfully"],["unsuccess","unsuccessful"],["unsuccessfull","unsuccessful"],["unsuccessfullly","unsuccessfully"],["unsucesful","unsuccessful"],["unsucesfull","unsuccessful"],["unsucesfully","unsuccessfully"],["unsucesfuly","unsuccessfully"],["unsucessefully","unsuccessfully"],["unsucessflly","unsuccessfully"],["unsucessfually","unsuccessfully"],["unsucessful","unsuccessful"],["unsucessfull","unsuccessful"],["unsucessfully","unsuccessfully"],["unsucessfuly","unsuccessfully"],["unsucesssful","unsuccessful"],["unsucesssfull","unsuccessful"],["unsucesssfully","unsuccessfully"],["unsucesssfuly","unsuccessfully"],["unsucessufll","unsuccessful"],["unsucessuflly","unsuccessfully"],["unsucessully","unsuccessfully"],["unsued","unused"],["unsufficient","insufficient"],["unsuportable","unsupportable"],["unsuported","unsupported"],["unsupport","unsupported"],["unsupproted","unsupported"],["unsupress","unsuppress"],["unsupressed","unsuppressed"],["unsupresses","unsuppresses"],["unsuprised","unsurprised"],["unsuprising","unsurprising"],["unsuprisingly","unsurprisingly"],["unsuprized","unsurprised"],["unsuprizing","unsurprising"],["unsuprizingly","unsurprisingly"],["unsurprized","unsurprised"],["unsurprizing","unsurprising"],["unsurprizingly","unsurprisingly"],["unsused","unused"],["unswithced","unswitched"],["unsychronise","unsynchronise"],["unsychronised","unsynchronised"],["unsychronize","unsynchronize"],["unsychronized","unsynchronized"],["untargetted","untargeted"],["unter","under"],["untill","until"],["untintuitive","unintuitive"],["untoched","untouched"],["untqueue","unqueue"],["untrached","untracked"],["untranslateable","untranslatable"],["untrasformed","untransformed"],["untrasposed","untransposed"],["untrustworty","untrustworthy"],["unued","unused"],["ununsed","unused"],["ununsual","unusual"],["unusal","unusual"],["unusally","unusually"],["unuseable","unusable"],["unuseful","useless"],["unusre","unsure"],["unusuable","unusable"],["unusued","unused"],["unvailable","unavailable"],["unvalid","invalid"],["unvalidate","invalidate"],["unverfified","unverified"],["unversionned","unversioned"],["unversoned","unversioned"],["unviersity","university"],["unwarrented","unwarranted"],["unweildly","unwieldy"],["unwieldly","unwieldy"],["unwraped","unwrapped"],["unwrritten","unwritten"],["unx","unix"],["unxepected","unexpected"],["unxepectedly","unexpectedly"],["unxpected","unexpected"],["unziped","unzipped"],["upadate","update"],["upadated","updated"],["upadater","updater"],["upadates","updates"],["upadating","updating"],["upadte","update"],["upadted","updated"],["upadter","updater"],["upadters","updaters"],["upadtes","updates"],["upagrade","upgrade"],["upagraded","upgraded"],["upagrades","upgrades"],["upagrading","upgrading"],["upate","update"],["upated","updated"],["upater","updater"],["upates","updates"],["upating","updating"],["upcomming","upcoming"],["updaing","updating"],["updat","update"],["updateded","updated"],["updateed","updated"],["updatees","updates"],["updateing","updating"],["updatess","updates"],["updatig","updating"],["updats","updates"],["updgrade","upgrade"],["updgraded","upgraded"],["updgrades","upgrades"],["updgrading","upgrading"],["updrage","upgrade"],["updraged","upgraded"],["updrages","upgrades"],["updraging","upgrading"],["updte","update"],["upercase","uppercase"],["uperclass","upperclass"],["upgade","upgrade"],["upgaded","upgraded"],["upgades","upgrades"],["upgading","upgrading"],["upgarade","upgrade"],["upgaraded","upgraded"],["upgarades","upgrades"],["upgarading","upgrading"],["upgarde","upgrade"],["upgarded","upgraded"],["upgardes","upgrades"],["upgarding","upgrading"],["upgarte","upgrade"],["upgarted","upgraded"],["upgartes","upgrades"],["upgarting","upgrading"],["upgerade","upgrade"],["upgeraded","upgraded"],["upgerades","upgrades"],["upgerading","upgrading"],["upgradablilty","upgradability"],["upgradde","upgrade"],["upgradded","upgraded"],["upgraddes","upgrades"],["upgradding","upgrading"],["upgradei","upgrade"],["upgradingn","upgrading"],["upgrate","upgrade"],["upgrated","upgraded"],["upgrates","upgrades"],["upgrating","upgrading"],["upholstry","upholstery"],["uplad","upload"],["upladaded","uploaded"],["upladed","uploaded"],["uplader","uploader"],["upladers","uploaders"],["uplading","uploading"],["uplads","uploads"],["uplaod","upload"],["uplaodaded","uploaded"],["uplaoded","uploaded"],["uplaoder","uploader"],["uplaoders","uploaders"],["uplaodes","uploads"],["uplaoding","uploading"],["uplaods","uploads"],["upliad","upload"],["uplod","upload"],["uplodaded","uploaded"],["uploded","uploaded"],["uploder","uploader"],["uploders","uploaders"],["uploding","uploading"],["uplods","uploads"],["uppler","upper"],["uppon","upon"],["upported","supported"],["upporterd","supported"],["uppper","upper"],["uppstream","upstream"],["uppstreamed","upstreamed"],["uppstreamer","upstreamer"],["uppstreaming","upstreaming"],["uppstreams","upstreams"],["uppwards","upwards"],["uprade","upgrade"],["upraded","upgraded"],["uprades","upgrades"],["uprading","upgrading"],["uprgade","upgrade"],["uprgaded","upgraded"],["uprgades","upgrades"],["uprgading","upgrading"],["upsream","upstream"],["upsreamed","upstreamed"],["upsreamer","upstreamer"],["upsreaming","upstreaming"],["upsreams","upstreams"],["upsrteam","upstream"],["upsrteamed","upstreamed"],["upsrteamer","upstreamer"],["upsrteaming","upstreaming"],["upsrteams","upstreams"],["upsteam","upstream"],["upsteamed","upstreamed"],["upsteamer","upstreamer"],["upsteaming","upstreaming"],["upsteams","upstreams"],["upsteram","upstream"],["upsteramed","upstreamed"],["upsteramer","upstreamer"],["upsteraming","upstreaming"],["upsterams","upstreams"],["upstread","upstream"],["upstreamedd","upstreamed"],["upstreammed","upstreamed"],["upstreammer","upstreamer"],["upstreamming","upstreaming"],["upstreem","upstream"],["upstreemed","upstreamed"],["upstreemer","upstreamer"],["upstreeming","upstreaming"],["upstreems","upstreams"],["upstrema","upstream"],["upsupported","unsupported"],["uptadeable","updatable"],["uptdate","update"],["uptim","uptime"],["uptions","options"],["uptodate","up-to-date"],["uptodateness","up-to-dateness"],["uptream","upstream"],["uptreamed","upstreamed"],["uptreamer","upstreamer"],["uptreaming","upstreaming"],["uptreams","upstreams"],["uqest","quest"],["uqests","quests"],["urrlib","urllib"],["usag","usage"],["usal","usual"],["usally","usually"],["uscaled","unscaled"],["useability","usability"],["useable","usable"],["useage","usage"],["usebility","usability"],["useble","usable"],["useed","used"],["usees","uses"],["usefl","useful"],["usefule","useful"],["usefulfor","useful for"],["usefull","useful"],["usefullness","usefulness"],["usefult","useful"],["usefuly","usefully"],["usefutl","useful"],["usege","usage"],["useing","using"],["user-defiend","user-defined"],["user-defiened","user-defined"],["usera","users"],["userame","username"],["userames","usernames"],["userapace","userspace"],["userful","useful"],["userpace","userspace"],["userpsace","userspace"],["usersapce","userspace"],["userspase","userspace"],["usesfull","useful"],["usespace","userspace"],["usetnet","Usenet"],["usibility","usability"],["usible","usable"],["usig","using"],["usigned","unsigned"],["usiing","using"],["usin","using"],["usind","using"],["usinging","using"],["usinng","using"],["usng","using"],["usnig","using"],["usptart","upstart"],["usptarts","upstarts"],["usseful","useful"],["ussual","usual"],["ussuall","usual"],["ussually","usually"],["usuable","usable"],["usuage","usage"],["usuallly","usually"],["usualy","usually"],["usualyl","usually"],["usue","use"],["usued","used"],["usueful","useful"],["usuer","user"],["usuing","using"],["usupported","unsupported"],["ususal","usual"],["ususally","usually"],["UTF8ness","UTF-8-ness"],["utiilties","utilities"],["utilies","utilities"],["utililties","utilities"],["utilis","utilise"],["utilisa","utilise"],["utilisaton","utilisation"],["utilites","utilities"],["utilitisation","utilisation"],["utilitise","utilise"],["utilitises","utilises"],["utilitising","utilising"],["utilitiy","utility"],["utilitization","utilization"],["utilitize","utilize"],["utilitizes","utilizes"],["utilitizing","utilizing"],["utiliz","utilize"],["utiliza","utilize"],["utilizaton","utilization"],["utillities","utilities"],["utilties","utilities"],["utiltities","utilities"],["utiltity","utility"],["utilty","utility"],["utitity","utility"],["utitlities","utilities"],["utitlity","utility"],["utitlty","utility"],["utlities","utilities"],["utlity","utility"],["utput","output"],["utputs","outputs"],["uupload","upload"],["uupper","upper"],["vaalues","values"],["vaccum","vacuum"],["vaccume","vacuum"],["vaccuum","vacuum"],["vacinity","vicinity"],["vactor","vector"],["vactors","vectors"],["vacumme","vacuum"],["vacuosly","vacuously"],["vaelues","values"],["vaguaries","vagaries"],["vaiable","variable"],["vaiables","variables"],["vaiant","variant"],["vaiants","variants"],["vaidate","validate"],["vaieties","varieties"],["vailable","available"],["vaild","valid"],["vailidity","validity"],["vailidty","validity"],["vairable","variable"],["vairables","variables"],["vairous","various"],["vakue","value"],["vakued","valued"],["vakues","values"],["valailable","available"],["valdate","validate"],["valetta","valletta"],["valeu","value"],["valiator","validator"],["validade","validate"],["validata","validate"],["validataion","validation"],["validaterelase","validaterelease"],["valide","valid"],["valididty","validity"],["validing","validating"],["validte","validate"],["validted","validated"],["validtes","validates"],["validting","validating"],["validtion","validation"],["valied","valid"],["valies","values"],["valif","valid"],["valitdity","validity"],["valkues","values"],["vallgrind","valgrind"],["vallid","valid"],["vallidation","validation"],["vallidity","validity"],["vallue","value"],["vallues","values"],["valsues","values"],["valtage","voltage"],["valtages","voltages"],["valu","value"],["valuble","valuable"],["valudes","values"],["value-to-pack","value to pack"],["valueable","valuable"],["valuess","values"],["valuie","value"],["valulation","valuation"],["valulations","valuations"],["valule","value"],["valuled","valued"],["valules","values"],["valuling","valuing"],["vanishs","vanishes"],["varable","variable"],["varables","variables"],["varaiable","variable"],["varaiables","variables"],["varaiance","variance"],["varaiation","variation"],["varaible","variable"],["varaibles","variables"],["varaint","variant"],["varaints","variants"],["varation","variation"],["varations","variations"],["variabble","variable"],["variabbles","variables"],["variabe","variable"],["variabel","variable"],["variabele","variable"],["variabes","variables"],["variabla","variable"],["variablen","variable"],["varialbe","variable"],["varialbes","variables"],["varialbles","variables"],["varian","variant"],["variantions","variations"],["variatinos","variations"],["variationnal","variational"],["variatoin","variation"],["variatoins","variations"],["variavle","variable"],["variavles","variables"],["varibable","variable"],["varibables","variables"],["varibale","variable"],["varibales","variables"],["varibaless","variables"],["varibel","variable"],["varibels","variables"],["varibility","variability"],["variblae","variable"],["variblaes","variables"],["varible","variable"],["varibles","variables"],["varience","variance"],["varient","variant"],["varients","variants"],["varierty","variety"],["variey","variety"],["varify","verify"],["variing","varying"],["varing","varying"],["varities","varieties"],["varity","variety"],["variuos","various"],["variuous","various"],["varius","various"],["varn","warn"],["varned","warned"],["varning","warning"],["varnings","warnings"],["varns","warns"],["varoius","various"],["varous","various"],["varously","variously"],["varriance","variance"],["varriances","variances"],["vartical","vertical"],["vartically","vertically"],["vas","was"],["vasall","vassal"],["vasalls","vassals"],["vaue","value"],["vaule","value"],["vauled","valued"],["vaules","values"],["vauling","valuing"],["vavle","valve"],["vavlue","value"],["vavriable","variable"],["vavriables","variables"],["vbsrcript","vbscript"],["vebrose","verbose"],["vecotr","vector"],["vecotrs","vectors"],["vectices","vertices"],["vectore","vector"],["vectores","vectors"],["vectorss","vectors"],["vectror","vector"],["vectrors","vectors"],["vecvtor","vector"],["vecvtors","vectors"],["vedio","video"],["vefiry","verify"],["vegatarian","vegetarian"],["vegeterian","vegetarian"],["vegitable","vegetable"],["vegitables","vegetables"],["vegtable","vegetable"],["vehicule","vehicle"],["veify","verify"],["veiw","view"],["veiwed","viewed"],["veiwer","viewer"],["veiwers","viewers"],["veiwing","viewing"],["veiwings","viewings"],["veiws","views"],["vektor","vector"],["vektors","vectors"],["velidate","validate"],["vell","well"],["velociries","velocities"],["velociry","velocity"],["vender","vendor"],["venders","vendors"],["venemous","venomous"],["vengance","vengeance"],["vengence","vengeance"],["verbaitm","verbatim"],["verbatum","verbatim"],["verbous","verbose"],["verbouse","verbose"],["verbously","verbosely"],["verbse","verbose"],["verctor","vector"],["verctors","vectors"],["veresion","version"],["veresions","versions"],["verfication","verification"],["verficiation","verification"],["verfier","verifier"],["verfies","verifies"],["verfifiable","verifiable"],["verfification","verification"],["verfifications","verifications"],["verfified","verified"],["verfifier","verifier"],["verfifiers","verifiers"],["verfifies","verifies"],["verfify","verify"],["verfifying","verifying"],["verfires","verifies"],["verfiy","verify"],["verfiying","verifying"],["verfy","verify"],["verfying","verifying"],["verical","vertical"],["verifcation","verification"],["verifiaction","verification"],["verificaion","verification"],["verificaions","verifications"],["verificiation","verification"],["verificiations","verifications"],["verifieing","verifying"],["verifing","verifying"],["verifiy","verify"],["verifiying","verifying"],["verifty","verify"],["veriftying","verifying"],["verifyied","verified"],["verion","version"],["verions","versions"],["veriosn","version"],["veriosns","versions"],["verious","various"],["verison","version"],["verisoned","versioned"],["verisoner","versioner"],["verisoners","versioners"],["verisoning","versioning"],["verisons","versions"],["veritcal","vertical"],["veritcally","vertically"],["veritical","vertical"],["verly","very"],["vermillion","vermilion"],["verndor","vendor"],["verrical","vertical"],["verry","very"],["vershin","version"],["versin","version"],["versino","version"],["versinos","versions"],["versins","versions"],["versio","version"],["versiob","version"],["versioed","versioned"],["versioing","versioning"],["versiom","version"],["versionaddded","versionadded"],["versionm","version"],["versionms","versions"],["versionned","versioned"],["versionning","versioning"],["versios","versions"],["versitilaty","versatility"],["versitile","versatile"],["versitlity","versatility"],["versoin","version"],["versoion","version"],["versoions","versions"],["verson","version"],["versoned","versioned"],["versons","versions"],["vertextes","vertices"],["vertexts","vertices"],["vertial","vertical"],["verticall","vertical"],["verticaly","vertically"],["verticies","vertices"],["verticla","vertical"],["verticlealign","verticalalign"],["vertiece","vertex"],["vertieces","vertices"],["vertifiable","verifiable"],["vertification","verification"],["vertifications","verifications"],["vertify","verify"],["vertikal","vertical"],["vertix","vertex"],["vertixes","vertices"],["vertixs","vertices"],["vertx","vertex"],["veryfieng","verifying"],["veryfy","verify"],["veryified","verified"],["veryifies","verifies"],["veryify","verify"],["veryifying","verifying"],["vesion","version"],["vesions","versions"],["vetex","vertex"],["vetexes","vertices"],["vetod","vetoed"],["vetween","between"],["vew","view"],["veyr","very"],["vhild","child"],["viatnamese","Vietnamese"],["vice-fersa","vice-versa"],["vice-wersa","vice-versa"],["vicefersa","vice-versa"],["viceversa","vice-versa"],["vicewersa","vice-versa"],["videostreamming","videostreaming"],["viee","view"],["viees","views"],["vieport","viewport"],["vieports","viewports"],["vietnamesea","Vietnamese"],["viewtransfromation","viewtransformation"],["vigilence","vigilance"],["vigourous","vigorous"],["vill","will"],["villian","villain"],["villification","vilification"],["villify","vilify"],["vincinity","vicinity"],["vinrator","vibrator"],["vioalte","violate"],["vioaltion","violation"],["violentce","violence"],["violoated","violated"],["violoating","violating"],["violoation","violation"],["violoations","violations"],["virtal","virtual"],["virtaul","virtual"],["virtical","vertical"],["virtiual","virtual"],["virttual","virtual"],["virttually","virtually"],["virtualisaion","virtualisation"],["virtualisaiton","virtualisation"],["virtualizaion","virtualization"],["virtualizaiton","virtualization"],["virtualiziation","virtualization"],["virtualy","virtually"],["virtualzation","virtualization"],["virtuell","virtual"],["virtural","virtual"],["virture","virtue"],["virutal","virtual"],["virutalenv","virtualenv"],["virutalisation","virtualisation"],["virutalise","virtualise"],["virutalised","virtualised"],["virutalization","virtualization"],["virutalize","virtualize"],["virutalized","virtualized"],["virutally","virtually"],["virutals","virtuals"],["virutual","virtual"],["visability","visibility"],["visable","visible"],["visably","visibly"],["visbility","visibility"],["visble","visible"],["visblie","visible"],["visbly","visibly"],["visiable","visible"],["visiably","visibly"],["visibale","visible"],["visibibilty","visibility"],["visibile","visible"],["visibililty","visibility"],["visibilit","visibility"],["visibilty","visibility"],["visibl","visible"],["visibleable","visible"],["visibles","visible"],["visiblities","visibilities"],["visiblity","visibility"],["visiblle","visible"],["visinble","visible"],["visious","vicious"],["visisble","visible"],["visiter","visitor"],["visiters","visitors"],["visitng","visiting"],["visivble","visible"],["vissible","visible"],["visted","visited"],["visting","visiting"],["vistors","visitors"],["visuab","visual"],["visuabisation","visualisation"],["visuabise","visualise"],["visuabised","visualised"],["visuabises","visualises"],["visuabization","visualization"],["visuabize","visualize"],["visuabized","visualized"],["visuabizes","visualizes"],["visuables","visuals"],["visuably","visually"],["visuabs","visuals"],["visuaisation","visualisation"],["visuaise","visualise"],["visuaised","visualised"],["visuaises","visualises"],["visuaization","visualization"],["visuaize","visualize"],["visuaized","visualized"],["visuaizes","visualizes"],["visuale","visual"],["visuales","visuals"],["visualizaion","visualization"],["visualizaiton","visualization"],["visualizaitons","visualizations"],["visualizaton","visualization"],["visualizatons","visualizations"],["visuallisation","visualisation"],["visuallization","visualization"],["visualy","visually"],["visualzation","visualization"],["vitories","victories"],["vitrual","virtual"],["vitrually","virtually"],["vitual","virtual"],["viusally","visually"],["viusualisation","visualisation"],["viwe","view"],["viwed","viewed"],["viweed","viewed"],["viwer","viewer"],["viwers","viewers"],["viwes","views"],["vizualisation","visualisation"],["vizualise","visualise"],["vizualised","visualised"],["vizualize","visualize"],["vizualized","visualized"],["vlarge","large"],["vlaue","value"],["vlaues","values"],["vlone","clone"],["vloned","cloned"],["vlones","clones"],["vlues","values"],["voif","void"],["volatage","voltage"],["volatages","voltages"],["volatge","voltage"],["volatges","voltages"],["volcanoe","volcano"],["volenteer","volunteer"],["volenteered","volunteered"],["volenteers","volunteers"],["voleyball","volleyball"],["volontary","voluntary"],["volonteer","volunteer"],["volonteered","volunteered"],["volonteering","volunteering"],["volonteers","volunteers"],["volounteer","volunteer"],["volounteered","volunteered"],["volounteering","volunteering"],["volounteers","volunteers"],["volumn","volume"],["volumne","volume"],["volums","volume"],["volxel","voxel"],["volxels","voxels"],["vonfig","config"],["vould","would"],["vreity","variety"],["vresion","version"],["vrey","very"],["vriable","variable"],["vriables","variables"],["vriety","variety"],["vrifier","verifier"],["vrifies","verifies"],["vrify","verify"],["vrilog","Verilog"],["vritual","virtual"],["vritualenv","virtualenv"],["vritualisation","virtualisation"],["vritualise","virtualise"],["vritualization","virtualization"],["vritualize","virtualize"],["vrituoso","virtuoso"],["vrsion","version"],["vrsions","versions"],["Vulacn","Vulcan"],["Vulakn","Vulkan"],["vulbearable","vulnerable"],["vulbearabule","vulnerable"],["vulbearbilities","vulnerabilities"],["vulbearbility","vulnerability"],["vulbearbuilities","vulnerabilities"],["vulbearbuility","vulnerability"],["vulberabilility","vulnerability"],["vulberabilites","vulnerabilities"],["vulberabiliti","vulnerability"],["vulberabilitie","vulnerability"],["vulberabilitis","vulnerabilities"],["vulberabilitiy","vulnerability"],["vulberabillities","vulnerabilities"],["vulberabillity","vulnerability"],["vulberabilties","vulnerabilities"],["vulberabilty","vulnerability"],["vulberablility","vulnerability"],["vulberabuilility","vulnerability"],["vulberabuilites","vulnerabilities"],["vulberabuiliti","vulnerability"],["vulberabuilitie","vulnerability"],["vulberabuilities","vulnerabilities"],["vulberabuilitis","vulnerabilities"],["vulberabuilitiy","vulnerability"],["vulberabuility","vulnerability"],["vulberabuillities","vulnerabilities"],["vulberabuillity","vulnerability"],["vulberabuilties","vulnerabilities"],["vulberabuilty","vulnerability"],["vulberabule","vulnerable"],["vulberabulility","vulnerability"],["vulberbilities","vulnerabilities"],["vulberbility","vulnerability"],["vulberbuilities","vulnerabilities"],["vulberbuility","vulnerability"],["vulerabilities","vulnerabilities"],["vulerability","vulnerability"],["vulerable","vulnerable"],["vulerabuilities","vulnerabilities"],["vulerabuility","vulnerability"],["vulerabule","vulnerable"],["vulernabilities","vulnerabilities"],["vulernability","vulnerability"],["vulernable","vulnerable"],["vulnarabilities","vulnerabilities"],["vulnarability","vulnerability"],["vulneabilities","vulnerabilities"],["vulneability","vulnerability"],["vulneable","vulnerable"],["vulnearabilities","vulnerabilities"],["vulnearability","vulnerability"],["vulnearable","vulnerable"],["vulnearabule","vulnerable"],["vulnearbilities","vulnerabilities"],["vulnearbility","vulnerability"],["vulnearbuilities","vulnerabilities"],["vulnearbuility","vulnerability"],["vulnerabilies","vulnerabilities"],["vulnerabiliies","vulnerabilities"],["vulnerabilility","vulnerability"],["vulnerabilites","vulnerabilities"],["vulnerabiliti","vulnerability"],["vulnerabilitie","vulnerability"],["vulnerabilitis","vulnerabilities"],["vulnerabilitiy","vulnerability"],["vulnerabilitu","vulnerability"],["vulnerabiliy","vulnerability"],["vulnerabillities","vulnerabilities"],["vulnerabillity","vulnerability"],["vulnerabilties","vulnerabilities"],["vulnerabilty","vulnerability"],["vulnerablility","vulnerability"],["vulnerablities","vulnerabilities"],["vulnerablity","vulnerability"],["vulnerabuilility","vulnerability"],["vulnerabuilites","vulnerabilities"],["vulnerabuiliti","vulnerability"],["vulnerabuilitie","vulnerability"],["vulnerabuilities","vulnerabilities"],["vulnerabuilitis","vulnerabilities"],["vulnerabuilitiy","vulnerability"],["vulnerabuility","vulnerability"],["vulnerabuillities","vulnerabilities"],["vulnerabuillity","vulnerability"],["vulnerabuilties","vulnerabilities"],["vulnerabuilty","vulnerability"],["vulnerabule","vulnerable"],["vulnerabulility","vulnerability"],["vulnerarbilities","vulnerabilities"],["vulnerarbility","vulnerability"],["vulnerarble","vulnerable"],["vulnerbilities","vulnerabilities"],["vulnerbility","vulnerability"],["vulnerbuilities","vulnerabilities"],["vulnerbuility","vulnerability"],["vulnreabilities","vulnerabilities"],["vulnreability","vulnerability"],["vunerabilities","vulnerabilities"],["vunerability","vulnerability"],["vunerable","vulnerable"],["vyer","very"],["vyre","very"],["waht","what"],["wainting","waiting"],["waisline","waistline"],["waislines","waistlines"],["waitting","waiting"],["wakup","wakeup"],["wallthickness","wall thickness"],["want;s","wants"],["wantto","want to"],["wappers","wrappers"],["warantee","warranty"],["waranties","warranties"],["waranty","warranty"],["wardobe","wardrobe"],["waring","warning"],["warings","warnings"],["warinigs","warnings"],["warining","warning"],["warinings","warnings"],["warks","works"],["warlking","walking"],["warnibg","warning"],["warnibgs","warnings"],["warnig","warning"],["warnign","warning"],["warnigns","warnings"],["warnigs","warnings"],["warniing","warning"],["warniings","warnings"],["warnin","warning"],["warnind","warning"],["warninds","warnings"],["warninf","warning"],["warninfs","warnings"],["warningss","warnings"],["warninig","warning"],["warninigs","warnings"],["warnining","warning"],["warninings","warnings"],["warninng","warning"],["warninngs","warnings"],["warnins","warnings"],["warninsg","warnings"],["warninsgs","warnings"],["warniong","warning"],["warniongs","warnings"],["warnkng","warning"],["warnkngs","warnings"],["warrent","warrant"],["warrents","warrants"],["warrn","warn"],["warrned","warned"],["warrning","warning"],["warrnings","warnings"],["warrriors","warriors"],["was'nt","wasn't"],["was't","wasn't"],["was;t","wasn't"],["wasn;t","wasn't"],["wasnt'","wasn't"],["wasnt","wasn't"],["wasnt;","wasn't"],["wass","was"],["wastefullness","wastefulness"],["watchdong","watchdog"],["watchog","watchdog"],["watermask","watermark"],["wathc","watch"],["wathdog","watchdog"],["wathever","whatever"],["wating","waiting"],["watn","want"],["wavelengh","wavelength"],["wavelenghs","wavelengths"],["wavelenght","wavelength"],["wavelenghts","wavelengths"],["wavelnes","wavelines"],["wayoint","waypoint"],["wayoints","waypoints"],["wayword","wayward"],["weahter","weather"],["weahters","weathers"],["weaponary","weaponry"],["weas","was"],["webage","webpage"],["webbased","web-based"],["webiste","website"],["wedensday","Wednesday"],["wednesay","Wednesday"],["wednesdaay","Wednesday"],["wednesdey","Wednesday"],["wednessday","Wednesday"],["wednsday","Wednesday"],["wege","wedge"],["wehere","where"],["wehn","when"],["wehther","whether"],["weigth","weight"],["weigthed","weighted"],["weigths","weights"],["weilded","wielded"],["weill","will"],["weired","weird"],["weitght","weight"],["wel","well"],["wendesday","Wednesday"],["wendsay","Wednesday"],["wendsday","Wednesday"],["wensday","Wednesday"],["were'nt","weren't"],["wereabouts","whereabouts"],["wereas","whereas"],["weree","were"],["werent","weren't"],["werever","wherever"],["wew","we"],["whant","want"],["whants","wants"],["whataver","whatever"],["whatepsace","whitespace"],["whatepsaces","whitespaces"],["whathever","whatever"],["whch","which"],["whcich","which"],["whcih","which"],["wheh","when"],["whehter","whether"],["wheigh","weigh"],["whem","when"],["whenevery","whenever"],["whenn","when"],["whenver","whenever"],["wheras","whereas"],["wherease","whereas"],["whereever","wherever"],["wherether","whether"],["whery","where"],["wheteher","whether"],["whetehr","whether"],["wheter","whether"],["whethe","whether"],["whethter","whether"],["whever","wherever"],["whheel","wheel"],["whhen","when"],["whic","which"],["whicg","which"],["which;s","which's"],["whichs","which's"],["whicht","which"],["whih","which"],["whihc","which"],["whihch","which"],["whike","while"],["whilest","whilst"],["whiltelist","whitelist"],["whiltelisted","whitelisted"],["whiltelisting","whitelisting"],["whiltelists","whitelists"],["whilw","while"],["whioch","which"],["whishlist","wishlist"],["whitch","which"],["whitchever","whichever"],["whitepsace","whitespace"],["whitepsaces","whitespaces"],["whith","with"],["whithin","within"],["whithout","without"],["whitre","white"],["whitspace","whitespace"],["whitspaces","whitespace"],["whlch","which"],["whle","while"],["whlie","while"],["whn","when"],["whne","when"],["whoes","whose"],["whoknows","who knows"],["wholey","wholly"],["whoose","whose"],["whould","would"],["whre","where"],["whta","what"],["whther","whether"],["whtihin","within"],["whyth","with"],["whythout","without"],["wiat","wait"],["wice","vice"],["wice-versa","vice-versa"],["wice-wersa","vice-versa"],["wiceversa","vice-versa"],["wicewersa","vice-versa"],["wich","which"],["widder","wider"],["widesread","widespread"],["widgect","widget"],["widged","widget"],["widghet","widget"],["widghets","widgets"],["widgit","widget"],["widgtes","widgets"],["widht","width"],["widhtpoint","widthpoint"],["widhtpoints","widthpoints"],["widthn","width"],["widthout","without"],["wief","wife"],["wieghed","weighed"],["wieght","weight"],["wieghts","weights"],["wieh","view"],["wierd","weird"],["wierdly","weirdly"],["wierdness","weirdness"],["wieth","width"],["wiew","view"],["wigdet","widget"],["wigdets","widgets"],["wih","with"],["wihch","which"],["wihich","which"],["wihite","white"],["wihle","while"],["wihout","without"],["wiht","with"],["wihtin","within"],["wihtout","without"],["wiil","will"],["wikpedia","wikipedia"],["wilcard","wildcard"],["wilcards","wildcards"],["wilh","will"],["wille","will"],["willingless","willingness"],["willk","will"],["willl","will"],["windo","window"],["windoes","windows"],["windoow","window"],["windoows","windows"],["windos","windows"],["windowz","windows"],["windwo","window"],["windwos","windows"],["winn","win"],["winndow","window"],["winndows","windows"],["winodw","window"],["wipoing","wiping"],["wirh","with"],["wirte","write"],["wirter","writer"],["wirters","writers"],["wirtes","writes"],["wirting","writing"],["wirtten","written"],["wirtual","virtual"],["witable","writeable"],["witdh","width"],["witdhs","widths"],["witdth","width"],["witdths","widths"],["witheld","withheld"],["withh","with"],["withih","within"],["withinn","within"],["withion","within"],["witho","with"],["withoit","without"],["withold","withhold"],["witholding","withholding"],["withon","within"],["withoout","without"],["withot","without"],["withotu","without"],["withou","without"],["withoud","without"],["withoug","without"],["withough","without"],["withought","without"],["withouht","without"],["withount","without"],["withourt","without"],["withous","without"],["withouth","without"],["withouyt","without"],["withput","without"],["withrawal","withdrawal"],["witht","with"],["withthe","with the"],["withtin","within"],["withun","within"],["withuout","without"],["witin","within"],["witk","with"],["witn","with"],["witout","without"],["witrh","with"],["witth","with"],["wiull","will"],["wiyh","with"],["wiyhout","without"],["wiyth","with"],["wizzard","wizard"],["wjat","what"],["wll","will"],["wlll","will"],["wnated","wanted"],["wnating","wanting"],["wnats","wants"],["woh","who"],["wohle","whole"],["woill","will"],["woithout","without"],["wokr","work"],["wokring","working"],["wolrd","world"],["wolrdly","worldly"],["wolrdwide","worldwide"],["wolwide","worldwide"],["won;t","won't"],["wonderfull","wonderful"],["wonderig","wondering"],["wont't","won't"],["woraround","workaround"],["worarounds","workarounds"],["worbench","workbench"],["worbenches","workbenches"],["worchester","Worcester"],["wordlwide","worldwide"],["wordpres","wordpress"],["worfklow","workflow"],["worfklows","workflows"],["worflow","workflow"],["worflows","workflows"],["workaorund","workaround"],["workaorunds","workarounds"],["workaound","workaround"],["workaounds","workarounds"],["workaraound","workaround"],["workaraounds","workarounds"],["workarbound","workaround"],["workaroud","workaround"],["workaroudn","workaround"],["workaroudns","workarounds"],["workarouds","workarounds"],["workarould","workaround"],["workaroung","workaround"],["workaroungs","workarounds"],["workarround","workaround"],["workarrounds","workarounds"],["workarund","workaround"],["workarunds","workarounds"],["workbanch","workbench"],["workbanches","workbenches"],["workbanchs","workbenches"],["workbenchs","workbenches"],["workbennch","workbench"],["workbennches","workbenches"],["workbnech","workbench"],["workbneches","workbenches"],["workboos","workbooks"],["workes","works"],["workfow","workflow"],["workfows","workflows"],["workign","working"],["worklfow","workflow"],["worklfows","workflows"],["workpsace","workspace"],["workpsaces","workspaces"],["workround","workaround"],["workrounds","workarounds"],["workspce","workspace"],["workspsace","workspace"],["workspsaces","workspaces"],["workstaion","workstation"],["workstaions","workstations"],["workstaition","workstation"],["workstaitions","workstations"],["workstaiton","workstation"],["workstaitons","workstations"],["workststion","workstation"],["workststions","workstations"],["worl","world"],["world-reknown","world renown"],["world-reknowned","world renowned"],["worload","workload"],["worloads","workloads"],["worls","world"],["wornged","wronged"],["worngs","wrongs"],["worrry","worry"],["worser","worse"],["worstened","worsened"],["worthwile","worthwhile"],["woth","worth"],["wothout","without"],["wotk","work"],["wotked","worked"],["wotking","working"],["wotks","works"],["woud","would"],["woudl","would"],["woudn't","wouldn't"],["would'nt","wouldn't"],["would't","wouldn't"],["wouldent","wouldn't"],["woulden`t","wouldn't"],["wouldn;t","wouldn't"],["wouldnt'","wouldn't"],["wouldnt","wouldn't"],["wouldnt;","wouldn't"],["wounderful","wonderful"],["wouold","would"],["wouuld","would"],["wqs","was"],["wraapp","wrap"],["wraapped","wrapped"],["wraapper","wrapper"],["wraappers","wrappers"],["wraapping","wrapping"],["wraapps","wraps"],["wraning","warning"],["wranings","warnings"],["wrapepd","wrapped"],["wraper","wrapper"],["wrapp","wrap"],["wrappered","wrapped"],["wrappng","wrapping"],["wrapps","wraps"],["wresters","wrestlers"],["wriet","write"],["writebufer","writebuffer"],["writechetque","writecheque"],["writeing","writing"],["writen","written"],["writet","writes"],["writewr","writer"],["writingm","writing"],["writters","writers"],["writting","writing"],["writtten","written"],["wrkload","workload"],["wrkloads","workloads"],["wrod","word"],["wroet","wrote"],["wrog","wrong"],["wrok","work"],["wroked","worked"],["wrokflow","workflow"],["wrokflows","workflows"],["wroking","working"],["wrokload","workload"],["wrokloads","workloads"],["wroks","works"],["wron","wrong"],["wronf","wrong"],["wront","wrong"],["wrtie","write"],["wrting","writing"],["wsee","see"],["wser","user"],["wth","with"],["wtih","with"],["wtyle","style"],["wuold","would"],["wupport","support"],["wuth","with"],["wuthin","within"],["wya","way"],["wyth","with"],["wythout","without"],["xdescribe","describe"],["xdpf","xpdf"],["xenophoby","xenophobia"],["xepect","expect"],["xepected","expected"],["xepectedly","expectedly"],["xepecting","expecting"],["xepects","expects"],["xgetttext","xgettext"],["xinitiazlize","xinitialize"],["xmdoel","xmodel"],["xour","your"],["xwindows","X"],["xyou","you"],["yaching","yachting"],["yaer","year"],["yaerly","yearly"],["yaers","years"],["yatch","yacht"],["yearm","year"],["yeasr","years"],["yeild","yield"],["yeilded","yielded"],["yeilding","yielding"],["yeilds","yields"],["yeld","yield"],["yelded","yielded"],["yelding","yielding"],["yelds","yields"],["yello","yellow"],["yera","year"],["yeras","years"],["yersa","years"],["yhe","the"],["yieldin","yielding"],["ymbols","symbols"],["yoman","yeoman"],["yomen","yeomen"],["yot","yacht"],["yotube","youtube"],["youforic","euphoric"],["youforically","euphorically"],["youlogy","eulogy"],["yourselfes","yourselves"],["youself","yourself"],["youthinasia","euthanasia"],["ypes","types"],["yrea","year"],["ytou","you"],["yuforic","euphoric"],["yuforically","euphorically"],["yugoslac","yugoslav"],["yuo","you"],["yuor","your"],["yur","your"],["zar","czar"],["zars","czars"],["zeebra","zebra"],["zefer","zephyr"],["zefers","zephyrs"],["zellot","zealot"],["zellots","zealots"],["zemporary","temporary"],["zick-zack","zig-zag"],["zimmap","zipmap"],["zimpaps","zipmaps"],["zink","zinc"],["ziped","zipped"],["ziper","zipper"],["ziping","zipping"],["zlot","slot"],["zombe","zombie"],["zomebie","zombie"],["zoocheenei","zucchinis"],["zoocheeni","zucchini"],["zoocheinei","zucchinis"],["zoocheini","zucchini"],["zookeenee","zucchini"],["zookeenees","zucchinis"],["zookeenei","zucchinis"],["zookeeni","zucchini"],["zookeinee","zucchini"],["zookeinees","zucchinis"],["zookeinei","zucchinis"],["zookeini","zucchini"],["zucheenei","zucchinis"],["zucheeni","zucchini"],["zukeenee","zucchini"],["zukeenees","zucchinis"],["zukeenei","zucchinis"],["zukeeni","zucchini"],["zuser","user"],["zylophone","xylophone"],["zylophones","xylophone"],["__attribyte__","__attribute__"],["__cpluspus","__cplusplus"],["__cpusplus","__cplusplus"],["\xE9valuate","evaluate"],["\u0441ontain","contain"],["\u0441ontained","contained"],["\u0441ontainer","container"],["\u0441ontainers","containers"],["\u0441ontaining","containing"],["\u0441ontainor","container"],["\u0441ontainors","containers"],["\u0441ontains","contains"]]);var _s=class{constructor(){this.ignoreWords=[]}},hr=class extends v{constructor(){super({nameKey:"rules.auto-correct-common-misspellings.name",descriptionKey:"rules.auto-correct-common-misspellings.description",type:"Content",ruleIgnoreTypes:[h.yaml,h.code,h.inlineCode,h.math,h.inlineMath,h.link,h.wikiLink,h.tag,h.image,h.url]})}get OptionsClass(){return _s}apply(t,i){return t.replaceAll(op,n=>this.replaceWordWithCorrectCasing(n,i))}replaceWordWithCorrectCasing(t,i){let n=t.toLowerCase();if(!Fl.has(n)||i.ignoreWords.includes(n))return t;let r=Fl.get(n);return t.charAt(0)==t.charAt(0).toUpperCase()&&(r=r.charAt(0).toUpperCase()+r.substring(1)),r}get exampleBuilders(){return[new y({description:"Auto-correct misspellings in regular text, but not code blocks, math blocks, YAML, or tags",before:m`
+ ---
+ key: absoltely
+ ---
+ ${""}
+ I absoltely hate when my codeblocks get formatted when they should not be.
+ ${""}
+ \`\`\`
+ # comments absoltely can be helpful, but they can also be misleading
+ \`\`\`
+ ${""}
+ Note that inline code also has the applicable spelling errors ignored: \`absoltely\`
+ ${""}
+ $$
+ Math block absoltely does not get auto-corrected.
+ $$
+ ${""}
+ The same $ defenately $ applies to inline math.
+ ${""}
+ #defenately stays the same
+ `,after:m`
+ ---
+ key: absoltely
+ ---
+ ${""}
+ I absolutely hate when my codeblocks get formatted when they should not be.
+ ${""}
+ \`\`\`
+ # comments absoltely can be helpful, but they can also be misleading
+ \`\`\`
+ ${""}
+ Note that inline code also has the applicable spelling errors ignored: \`absoltely\`
+ ${""}
+ $$
+ Math block absoltely does not get auto-corrected.
+ $$
+ ${""}
+ The same $ defenately $ applies to inline math.
+ ${""}
+ #defenately stays the same
+ `}),new y({description:"Auto-correct misspellings keeps first letter's case",before:m`
+ Accodringly we made sure to update logic to make sure it would handle case sensitivity.
+ `,after:m`
+ Accordingly we made sure to update logic to make sure it would handle case sensitivity.
+ `}),new y({description:"Links should not be auto-corrected",before:m`
+ http://www.Absoltely.com should not be corrected
+ `,after:m`
+ http://www.Absoltely.com should not be corrected
+ `})]}get optionBuilders(){return[new xe({OptionsClass:_s,nameKey:"rules.auto-correct-common-misspellings.ignore-words.name",descriptionKey:"rules.auto-correct-common-misspellings.ignore-words.description",optionsKey:"ignoreWords",splitter:sr,separator:", "})]}};hr=A([v.register],hr);var Fs=class{constructor(){this.style="space"}},At=class extends v{constructor(){super({nameKey:"rules.blockquote-style.name",descriptionKey:"rules.blockquote-style.description",type:"Content",hasSpecialExecutionOrder:!0,ruleIgnoreTypes:[h.html]})}get OptionsClass(){return Fs}apply(t,i){return i.style==="space"?Ol(t,n=>this.updateBlockquoteLines(n,this.addSpaceToIndicator)):Ol(t,n=>this.updateBlockquoteLines(n,this.removeSpaceFromIndicator))}removeSpaceFromIndicator(t,i){return i?t.replace(/>[ \t]+>/g,">>"):t.replace(/>[ \t]+/g,">")}addSpaceToIndicator(t,i){let n=t.replace(/>([^ ]|$)/g,"> $1").replace(/>>/g,"> >");return i?n:n.replace(/>(?:[ \t]{2,}|\t+)/g,"> ")}updateBlockquoteLines(t,i){let n=0,r=0,a="",s="",o=0,l=t,c=!1;do{r=l.indexOf(`
+`,n),r===-1&&(r=l.length-1,c=!0),[a,o]=Qa(l,r-1);let d=o+a.length+1,u=r;c&&u++;let g=l.substring(d,u),p=mp.test(g);s=i(a,p),o++,l=le(l,o,o+a.length,s),n=r+1+s.length-a.length}while(!c);return l}get exampleBuilders(){return[new y({description:"When style = `space`, a space is added to blockquotes missing a space after the indicator",before:m`
+ >Blockquotes will have a space added if one is not present
+ > Will be left as is.
+ ${""}
+ > Nested blockquotes are also updated
+ >>Nesting levels are handled correctly
+ >> Even when only partially needing updates
+ > >Updated as well
+ >>>>>>> Is handled too
+ > > >>> As well
+ ${""}
+ > Note that html is not affected in blockquotes
+ `,after:m`
+ > Blockquotes will have a space added if one is not present
+ > Will be left as is.
+ ${""}
+ > Nested blockquotes are also updated
+ > > Nesting levels are handled correctly
+ > > Even when only partially needing updates
+ > > Updated as well
+ > > > > > > > Is handled too
+ > > > > > As well
+ ${""}
+ > Note that html is not affected in blockquotes
+ `}),new y({description:"When style = `no space`, spaces are removed after a blockquote indicator",before:m`
+ > Multiple spaces are removed
+ > > Nesting is handled
+ > > > > > Especially when multiple levels are involved
+ > >>> > Even when partially correct already, it is handled
+ `,after:m`
+ >Multiple spaces are removed
+ >>Nesting is handled
+ >>>>>Especially when multiple levels are involved
+ >>>>>Even when partially correct already, it is handled
+ `,options:{style:"no space"}})]}get optionBuilders(){return[new se({OptionsClass:Fs,nameKey:"rules.blockquote-style.style.name",descriptionKey:"rules.blockquote-style.style.description",optionsKey:"style",records:[{value:"space",description:"> indicator is followed by a space"},{value:"no space",description:">indicator is not followed by a space"}]})]}};At=A([v.register],At);var Rs=class{};A([v.noSettingControl()],Rs.prototype,"lineContent",2);var Tt=class extends v{constructor(){super({nameKey:"rules.add-blockquote-indentation-on-paste.name",descriptionKey:"rules.add-blockquote-indentation-on-paste.description",type:"Paste"})}get OptionsClass(){return Rs}apply(t,i){let n=/^(\s*)((> ?)+) .*/,r=i.lineContent.match(n);if(!r)return t;let a=r[1]??"",s=r[2]??"";return t.trim().replace(/\n/gm,`
+${a}${s} `)}get exampleBuilders(){return[new y({description:"Line being pasted into regular text does not get blockquotified with current line being `Part 1 of the sentence`",before:m`
+ was much less likely to succeed, but they tried it anyway.
+ Part 2 was much more interesting.
+ `,after:m`
+ was much less likely to succeed, but they tried it anyway.
+ Part 2 was much more interesting.
+ `,options:{lineContent:"Part 1 of the sentence"}}),new y({description:"Line being pasted into a blockquote gets blockquotified with current line being `> > `",before:m`
+ ${""}
+ This content is being added to a blockquote
+ Note that the second line is indented and the surrounding blank lines were trimmed
+ ${""}
+ `,after:m`
+ This content is being added to a blockquote
+ > > Note that the second line is indented and the surrounding blank lines were trimmed
+ `,options:{lineContent:"> > "}})]}get optionBuilders(){return[]}};Tt=A([v.register],Tt);var Lt=class{constructor(){this.style="Title Case";this.ignoreWords=["macOS","iOS","iPhone","iPad","JavaScript","TypeScript","AppleScript","I"];this.lowercaseWords=["a","an","the","aboard","about","abt.","above","abreast","absent","across","after","against","along","aloft","alongside","amid","amidst","mid","midst","among","amongst","anti","apropos","around","round","as","aslant","astride","at","atop","ontop","bar","barring","before","B4","behind","below","beneath","neath","beside","besides","between","'tween","beyond","but","by","chez","circa","c.","ca.","come","concerning","contra","counting","cum","despite","spite","down","during","effective","ere","except","excepting","excluding","failing","following","for","from","in","including","inside","into","less","like","minus","modulo","mod","near","nearer","nearest","next","notwithstanding","of","o'","off","offshore","on","onto","opposite","out","outside","over","o'er","pace","past","pending","per","plus","post","pre","pro","qua","re","regarding","respecting","sans","save","saving","short","since","sub","than","through","thru","throughout","thruout","till","times","to","t'","touching","toward","towards","under","underneath","unlike","until","unto","up","upon","versus","vs.","v.","via","vice","vis-\xE0-vis","wanting","with","w/","w.","c\u0304","within","w/i","without","'thout","w/o","abroad","adrift","aft","afterward","afterwards","ahead","apart","ashore","aside","away","back","backward","backwards","beforehand","downhill","downstage","downstairs","downstream","downward","downwards","downwind","east","eastward","eastwards","forth","forward","forwards","heavenward","heavenwards","hence","henceforth","here","hereby","herein","hereof","hereto","herewith","home","homeward","homewards","indoors","inward","inwards","leftward","leftwards","north","northeast","northward","northwards","northwest","now","onward","onwards","outdoors","outward","outwards","overboard","overhead","overland","overseas","rightward","rightwards","seaward","seawards","skywards","skyward","south","southeast","southwards","southward","southwest","then","thence","thenceforth","there","thereby","therein","thereof","thereto","therewith","together","underfoot","underground","uphill","upstage","upstairs","upstream","upward","upwards","upwind","west","westward","westwards","when","whence","where","whereby","wherein","whereto","wherewith","although","because","considering","given","granted","if","lest","once","provided","providing","seeing","so","supposing","though","unless","whenever","whereas","wherever","while","whilst","ago","according to","as regards","counter to","instead of","owing to","pertaining to","at the behest of","at the expense of","at the hands of","at risk of","at the risk of","at variance with","by dint of","by means of","by virtue of","by way of","for the sake of","for sake of","for lack of","for want of","from want of","in accordance with","in addition to","in case of","in charge of","in compliance with","in conformity with","in contact with","in exchange for","in favor of","in front of","in lieu of","in light of","in the light of","in line with","in place of","in point of","in quest of","in relation to","in regard to","with regard to","in respect to","with respect to","in return for","in search of","in step with","in touch with","in terms of","in the name of","in view of","on account of","on behalf of","on grounds of","on the grounds of","on the part of","on top of","with a view to","with the exception of","\xE0 la","a la","as soon as","as well as","close to","due to","far from","in case","other than","prior to","pursuant to","regardless of","subsequent to","as long as","as much as","as far as","by the time","in as much as","inasmuch","in order to","in order that","even","provide that","if only","whether","whose","whoever","why","how","or not","whatever","what","both","and","or","not only","but also","either","neither","nor","just","rather","no sooner","such","that","yet","is","it"];this.ignoreCasedWords=!0}},Et=class extends v{constructor(){super({nameKey:"rules.capitalize-headings.name",descriptionKey:"rules.capitalize-headings.description",type:"Heading",hasSpecialExecutionOrder:!0,ruleIgnoreTypes:[h.code,h.inlineCode,h.yaml,h.link,h.wikiLink,h.tag]})}get OptionsClass(){return Lt}apply(t,i){return t.replace(Xi,n=>{if(i.style==="ALL CAPS")return n.toUpperCase();let r=i.style==="First letter",a=n.match(/\S+/g),s=i.ignoreWords,o=i.lowercaseWords,l=!0;for(let c=1;c(n=n.replace(/^---\n+/,`---
+`),n=n.replace(/\n+---/,`
+---`),i.innerNewLines&&(n=n.replaceAll(/\n{2,}/g,`
+`)),n))}get exampleBuilders(){return[new y({description:"Remove blank lines at the start and end of the YAML",before:m`
+ ---
+ ${""}
+ date: today
+ ${""}
+ title: unchanged without inner new lines turned on
+ ${""}
+ ---
+ `,after:m`
+ ---
+ date: today
+ ${""}
+ title: unchanged without inner new lines turned on
+ ---
+ `}),new y({description:"Remove blank lines anywhere in YAML with inner new lines set to true",before:m`
+ ---
+ ${""}
+ date: today
+ ${""}
+ ${""}
+ title: remove inner new lines
+ ${""}
+ ---
+ ${""}
+ # Header 1
+ ${""}
+ ${""}
+ Body content here.
+ `,after:m`
+ ---
+ date: today
+ title: remove inner new lines
+ ---
+ ${""}
+ # Header 1
+ ${""}
+ ${""}
+ Body content here.
+ `,options:{innerNewLines:!0}})]}get optionBuilders(){return[new Z({OptionsClass:Ds,nameKey:"rules.compact-yaml.inner-new-lines.name",descriptionKey:"rules.compact-yaml.inner-new-lines.description",optionsKey:"innerNewLines"})]}};fr=A([v.register],fr);var Rl=class{},yr=class extends v{constructor(){super({nameKey:"rules.consecutive-blank-lines.name",descriptionKey:"rules.consecutive-blank-lines.description",type:"Spacing",ruleIgnoreTypes:[h.code,h.math,h.yaml,h.link,h.wikiLink,h.tag]})}get OptionsClass(){return Rl}apply(t,i){return t.replace(/(\n([\t\v\f\r \u00a0\u2000-\u200b\u2028-\u2029\u3000]+)?){2,}\n/g,`
+
+`)}get exampleBuilders(){return[new y({description:"Consecutive blank lines are removed",before:m`
+ Some text
+ ${""}
+ ${""}
+ Some more text
+ `,after:m`
+ Some text
+ ${""}
+ Some more text
+ `})]}get optionBuilders(){return[]}};yr=A([v.register],yr);var Dl=class{},br=class extends v{constructor(){super({nameKey:"rules.convert-bullet-list-markers.name",descriptionKey:"rules.convert-bullet-list-markers.description",type:"Content",ruleIgnoreTypes:[h.code,h.math,h.yaml,h.link,h.wikiLink,h.tag]})}get OptionsClass(){return Dl}apply(t,i){return t.replace(/^([^\S\n]*)([•§])([^\S\n]*)/gm,"$1-$3")}get exampleBuilders(){return[new y({description:"Converts \u2022",before:m`
+ • item 1
+ • item 2
+ `,after:m`
+ - item 1
+ - item 2
+ `}),new y({description:"Converts \xA7",before:m`
+ • item 1
+ § item 2
+ § item 3
+ `,after:m`
+ - item 1
+ - item 2
+ - item 3
+ `})]}get optionBuilders(){return[]}};br=A([v.register],br);var Ns=class{constructor(){this.tabsize=4}},vr=class extends v{constructor(){super({nameKey:"rules.convert-spaces-to-tabs.name",descriptionKey:"rules.convert-spaces-to-tabs.description",type:"Spacing",ruleIgnoreTypes:[h.code,h.math,h.yaml,h.link,h.wikiLink,h.tag]})}get OptionsClass(){return Ns}apply(t,i){let n=String(i.tabsize),r=new RegExp("^( *) {"+n+"}","gm");t=this.replaceAllRegexMatches(t,r);let a=new RegExp("^((>( | *))*(>( | )) *) {"+n+"}","gm");return t=this.replaceAllRegexMatches(t,a),t}replaceAllRegexMatches(t,i){for(;t.match(i)!=null;)t=t.replace(i,"$1 ");return t}get exampleBuilders(){return[new y({description:"Converting spaces to tabs with `tabsize = 3`",before:m`
+ - text with no indention
+ - text indented with 3 spaces
+ - text with no indention
+ - text indented with 6 spaces
+ `,after:m`
+ - text with no indention
+ \t- text indented with 3 spaces
+ - text with no indention
+ \t\t- text indented with 6 spaces
+ `,options:{tabsize:3}}),new y({description:"Converting spaces to tabs with `tabsize = 3` works in blockquotes",before:m`
+ > - text with no indention
+ > - text indented with 3 spaces
+ > - text with no indention
+ > - text indented with 6 spaces
+ `,after:m`
+ > - text with no indention
+ > \t- text indented with 3 spaces
+ > - text with no indention
+ > \t\t- text indented with 6 spaces
+ `,options:{tabsize:3}})]}get optionBuilders(){return[new Is({OptionsClass:Ns,nameKey:"rules.convert-spaces-to-tabs.tabsize.name",descriptionKey:"rules.convert-spaces-to-tabs.tabsize.description",optionsKey:"tabsize"})]}};vr=A([v.register],vr);var js=class{constructor(){this.defaultLanguage=""}},xr=class extends v{constructor(){super({nameKey:"rules.default-language-for-code-fences.name",descriptionKey:"rules.default-language-for-code-fences.description",type:"Content",ruleIgnoreTypes:[h.yaml,h.math,h.yaml,h.link,h.wikiLink,h.tag]})}get OptionsClass(){return js}apply(t,i){return Zu(t,i.defaultLanguage)}get exampleBuilders(){return[new y({description:"Add a default language `javascript` to code blocks that do not have a language specified",before:m`
+ \`\`\`
+ var temp = 'text';
+ // this is a code block
+ \`\`\`
+ `,after:m`
+ \`\`\`javascript
+ var temp = 'text';
+ // this is a code block
+ \`\`\`
+ `,options:{defaultLanguage:"javascript"}}),new y({description:"If a code block already has a language specified, do not change it",before:m`
+ \`\`\`javascript
+ var temp = 'text';
+ // this is a code block
+ \`\`\`
+ `,after:m`
+ \`\`\`javascript
+ var temp = 'text';
+ // this is a code block
+ \`\`\`
+ `,options:{defaultLanguage:"shell"}}),new y({description:"Empty string as the default language will not add a language to code blocks",before:m`
+ \`\`\`
+ var temp = 'text';
+ // this is a code block
+ \`\`\`
+ `,after:m`
+ \`\`\`
+ var temp = 'text';
+ // this is a code block
+ \`\`\`
+ `,options:{defaultLanguage:""}})]}get optionBuilders(){return[new Pe({OptionsClass:js,nameKey:"rules.default-language-for-code-fences.default-language.name",descriptionKey:"rules.default-language-for-code-fences.default-language.description",optionsKey:"defaultLanguage"})]}};xr=A([v.register],xr);var Ks=class{constructor(){this.style="consistent"}},wr=class extends v{constructor(){super({nameKey:"rules.emphasis-style.name",descriptionKey:"rules.emphasis-style.description",type:"Content",ruleIgnoreTypes:[h.code,h.math,h.yaml,h.link,h.wikiLink,h.tag,h.math,h.inlineMath]})}get OptionsClass(){return Ks}apply(t,i){return ms(t,i.style,"emphasis")}get exampleBuilders(){return[new y({description:"Emphasis indicators should use underscores when style is set to 'underscore'",before:m`
+ # Emphasis Cases
+ ${""}
+ *Test emphasis*
+ * Test not emphasized *
+ This is *emphasized* mid sentence
+ This is *emphasized* mid sentence with a second *emphasis* on the same line
+ This is ***bold and emphasized***
+ This is ***nested bold** and ending emphasized*
+ This is ***nested emphasis* and ending bold**
+ ${""}
+ **Test bold**
+ ${""}
+ * List Item1 with *emphasized text*
+ * List Item2
+ `,after:m`
+ # Emphasis Cases
+ ${""}
+ _Test emphasis_
+ * Test not emphasized *
+ This is _emphasized_ mid sentence
+ This is _emphasized_ mid sentence with a second _emphasis_ on the same line
+ This is _**bold and emphasized**_
+ This is _**nested bold** and ending emphasized_
+ This is **_nested emphasis_ and ending bold**
+ ${""}
+ **Test bold**
+ ${""}
+ * List Item1 with _emphasized text_
+ * List Item2
+ `,options:{style:"underscore"}}),new y({description:"Emphasis indicators should use asterisks when style is set to 'asterisk'",before:m`
+ # Emphasis Cases
+ ${""}
+ _Test emphasis_
+ _ Test not emphasized _
+ This is _emphasized_ mid sentence
+ This is _emphasized_ mid sentence with a second _emphasis_ on the same line
+ This is ___bold and emphasized___
+ This is ___nested bold__ and ending emphasized_
+ This is ___nested emphasis_ and ending bold__
+ ${""}
+ __Test bold__
+ `,after:m`
+ # Emphasis Cases
+ ${""}
+ *Test emphasis*
+ _ Test not emphasized _
+ This is *emphasized* mid sentence
+ This is *emphasized* mid sentence with a second *emphasis* on the same line
+ This is *__bold and emphasized__*
+ This is *__nested bold__ and ending emphasized*
+ This is __*nested emphasis* and ending bold__
+ ${""}
+ __Test bold__
+ `,options:{style:"asterisk"}}),new y({description:"Emphasis indicators should use consistent style based on first emphasis indicator in a file when style is set to 'consistent'",before:m`
+ # Emphasis First Emphasis Is an Asterisk
+ ${""}
+ *First emphasis*
+ This is _emphasized_ mid sentence
+ This is *emphasized* mid sentence with a second _emphasis_ on the same line
+ This is *__bold and emphasized__*
+ This is *__nested bold__ and ending emphasized*
+ This is **_nested emphasis_ and ending bold**
+ ${""}
+ __Test bold__
+ `,after:m`
+ # Emphasis First Emphasis Is an Asterisk
+ ${""}
+ *First emphasis*
+ This is *emphasized* mid sentence
+ This is *emphasized* mid sentence with a second *emphasis* on the same line
+ This is *__bold and emphasized__*
+ This is *__nested bold__ and ending emphasized*
+ This is ***nested emphasis* and ending bold**
+ ${""}
+ __Test bold__
+ `,options:{style:"consistent"}}),new y({description:"Emphasis indicators should use consistent style based on first emphasis indicator in a file when style is set to 'consistent'",before:m`
+ # Emphasis First Emphasis Is an Underscore
+ ${""}
+ **_First emphasis_**
+ This is _emphasized_ mid sentence
+ This is *emphasized* mid sentence with a second _emphasis_ on the same line
+ This is *__bold and emphasized__*
+ This is _**nested bold** and ending emphasized_
+ This is __*nested emphasis* and ending bold__
+ ${""}
+ __Test bold__
+ `,after:m`
+ # Emphasis First Emphasis Is an Underscore
+ ${""}
+ **_First emphasis_**
+ This is _emphasized_ mid sentence
+ This is _emphasized_ mid sentence with a second _emphasis_ on the same line
+ This is ___bold and emphasized___
+ This is _**nested bold** and ending emphasized_
+ This is ___nested emphasis_ and ending bold__
+ ${""}
+ __Test bold__
+ `,options:{style:"consistent"}})]}get optionBuilders(){return[new se({OptionsClass:Ks,nameKey:"rules.emphasis-style.style.name",descriptionKey:"rules.emphasis-style.style.description",optionsKey:"style",records:[{value:"consistent",description:"Makes sure the first instance of emphasis is the style that will be used throughout the document"},{value:"asterisk",description:"Makes sure * is the emphasis indicator"},{value:"underscore",description:"Makes sure _ is the emphasis indicator"}]})]}};wr=A([v.register],wr);var Nl=class{},kr=class extends v{constructor(){super({nameKey:"rules.empty-line-around-blockquotes.name",descriptionKey:"rules.empty-line-around-blockquotes.description",type:"Spacing"})}get OptionsClass(){return Nl}apply(t,i){return Wu(t)}get exampleBuilders(){return[new y({description:"Blockquotes that start a document do not get an empty line before them.",before:m`
+ > Quote content here
+ > quote content continued
+ # Title here
+ `,after:m`
+ > Quote content here
+ > quote content continued
+ ${""}
+ # Title here
+ `}),new y({description:"Blockquotes that end a document do not get an empty line after them.",before:m`
+ # Heading 1
+ > Quote content here
+ > quote content continued
+ `,after:m`
+ # Heading 1
+ ${""}
+ > Quote content here
+ > quote content continued
+ `}),new y({description:"Blockquotes that are nested have the proper empty line added",before:m`
+ # Make sure that nested blockquotes are accounted for correctly
+ > Quote content here
+ > quote content continued
+ > > Nested Blockquote
+ > > content continued
+ ${""}
+ **Note that the empty line is either one less blockquote indicator if followed/proceeded by more blockquote content or it is an empty line**
+ ${""}
+ # Doubly nested code block
+ ${""}
+ > > Quote content here
+ > > quote content continued
+ `,after:m`
+ # Make sure that nested blockquotes are accounted for correctly
+ ${""}
+ > Quote content here
+ > quote content continued
+ >
+ > > Nested Blockquote
+ > > content continued
+ ${""}
+ **Note that the empty line is either one less blockquote indicator if followed/proceeded by more blockquote content or it is an empty line**
+ ${""}
+ # Doubly nested code block
+ ${""}
+ > > Quote content here
+ > > quote content continued
+ `})]}get optionBuilders(){return[]}};kr=A([v.register],kr);var jl=class{},zr=class extends v{constructor(){super({nameKey:"rules.empty-line-around-code-fences.name",descriptionKey:"rules.empty-line-around-code-fences.description",type:"Spacing"})}get OptionsClass(){return jl}apply(t,i){return Hu(t)}get exampleBuilders(){return[new y({description:"Fenced code blocks that start a document do not get an empty line before them.",before:m`
+ \`\`\` js
+ var temp = 'text';
+ // this is a code block
+ \`\`\`
+ Text after code block.
+ `,after:m`
+ \`\`\` js
+ var temp = 'text';
+ // this is a code block
+ \`\`\`
+ ${""}
+ Text after code block.
+ `}),new y({description:"Fenced code blocks that end a document do not get an empty line after them.",before:m`
+ # Heading 1
+ \`\`\`
+ Here is a code block
+ \`\`\`
+ `,after:m`
+ # Heading 1
+ ${""}
+ \`\`\`
+ Here is a code block
+ \`\`\`
+ `}),new y({description:"Fenced code blocks that are in a blockquote have the proper empty line added",before:m`
+ # Make sure that code blocks in blockquotes are accounted for correctly
+ > \`\`\`js
+ > var text = 'this is some text';
+ > \`\`\`
+ >
+ > \`\`\`js
+ > var other text = 'this is more text';
+ > \`\`\`
+ ${""}
+ **Note that the blanks blockquote lines added do not have whitespace after them**
+ ${""}
+ # Doubly nested code block
+ ${""}
+ > > \`\`\`js
+ > > var other text = 'this is more text';
+ > > \`\`\`
+ `,after:m`
+ # Make sure that code blocks in blockquotes are accounted for correctly
+
+ > \`\`\`js
+ > var text = 'this is some text';
+ > \`\`\`
+ >
+ > \`\`\`js
+ > var other text = 'this is more text';
+ > \`\`\`
+ ${""}
+ **Note that the blanks blockquote lines added do not have whitespace after them**
+ ${""}
+ # Doubly nested code block
+ ${""}
+ > > \`\`\`js
+ > > var other text = 'this is more text';
+ > > \`\`\`
+ `}),new y({description:"Nested fenced code blocks get empty lines added around them",before:m`
+ \`\`\`markdown
+ # Header
+ ${""}
+ \`\`\`\`JavaScript
+ var text = 'some string';
+ \`\`\`\`
+ \`\`\`
+ `,after:m`
+ \`\`\`markdown
+ # Header
+ ${""}
+ \`\`\`\`JavaScript
+ var text = 'some string';
+ \`\`\`\`
+ ${""}
+ \`\`\`
+ `})]}get optionBuilders(){return[]}};zr=A([v.register],zr);var Ys=class{constructor(){this.minimumNumberOfDollarSignsToBeAMathBlock=2}};A([v.noSettingControl()],Ys.prototype,"minimumNumberOfDollarSignsToBeAMathBlock",2);var Sr=class extends v{constructor(){super({nameKey:"rules.empty-line-around-math-blocks.name",descriptionKey:"rules.empty-line-around-math-blocks.description",type:"Spacing",ruleIgnoreTypes:[h.yaml,h.code]})}get OptionsClass(){return Ys}apply(t,i){return $u(t,i.minimumNumberOfDollarSignsToBeAMathBlock)}get exampleBuilders(){return[new y({description:"Math blocks that start a document do not get an empty line before them.",before:m`
+ $$
+ \\boldsymbol{a}=\\begin{bmatrix}a_x \\\\ a_y\\end{bmatrix}
+ $$
+ some more text
+ `,after:m`
+ $$
+ \\boldsymbol{a}=\\begin{bmatrix}a_x \\\\ a_y\\end{bmatrix}
+ $$
+ ${""}
+ some more text
+ `}),new y({description:"Math blocks that are singe-line are updated based on the value of `Number of Dollar Signs to Indicate a Math Block` (in this case its value is 2)",before:m`
+ $$\\boldsymbol{a}=\\begin{bmatrix}a_x \\\\ a_y\\end{bmatrix}$$
+ some more text
+ `,after:m`
+ $$\\boldsymbol{a}=\\begin{bmatrix}a_x \\\\ a_y\\end{bmatrix}$$
+ ${""}
+ some more text
+ `}),new y({description:"Math blocks that end a document do not get an empty line after them.",before:m`
+ Some text
+ $$
+ \\boldsymbol{a}=\\begin{bmatrix}a_x \\\\ a_y\\end{bmatrix}
+ $$
+ `,after:m`
+ Some text
+ ${""}
+ $$
+ \\boldsymbol{a}=\\begin{bmatrix}a_x \\\\ a_y\\end{bmatrix}
+ $$
+ `}),new y({description:"Math blocks that are not at the start or the end of the document will have an empty line added before and after them",before:m`
+ Some text
+ $$
+ \\boldsymbol{a}=\\begin{bmatrix}a_x \\\\ a_y\\end{bmatrix}
+ $$
+ some more text
+ `,after:m`
+ Some text
+ ${""}
+ $$
+ \\boldsymbol{a}=\\begin{bmatrix}a_x \\\\ a_y\\end{bmatrix}
+ $$
+ ${""}
+ some more text
+ `}),new y({description:"Math blocks in callouts or blockquotes have the appropriately formatted blank lines added",before:m`
+ > Math block in blockquote
+ > $$
+ > \\boldsymbol{a}=\\begin{bmatrix}a_x \\\\ a_y\\end{bmatrix}
+ > $$
+ ${""}
+ More content here
+ ${""}
+ > Math block doubly nested in blockquote
+ > > $$
+ > > \\boldsymbol{a}=\\begin{bmatrix}a_x \\\\ a_y\\end{bmatrix}
+ > > $$
+ `,after:m`
+ > Math block in blockquote
+ >
+ > $$
+ > \\boldsymbol{a}=\\begin{bmatrix}a_x \\\\ a_y\\end{bmatrix}
+ > $$
+ ${""}
+ More content here
+ ${""}
+ > Math block doubly nested in blockquote
+ >
+ > > $$
+ > > \\boldsymbol{a}=\\begin{bmatrix}a_x \\\\ a_y\\end{bmatrix}
+ > > $$
+ `})]}get optionBuilders(){return[]}};Sr=A([v.register],Sr);var Kl=class{},Ar=class extends v{constructor(){super({nameKey:"rules.empty-line-around-tables.name",descriptionKey:"rules.empty-line-around-tables.description",type:"Spacing",ruleIgnoreTypes:[h.yaml,h.code,h.math,h.inlineMath,h.wikiLink,h.link]})}get OptionsClass(){return Kl}apply(t,i){return hp(t)}get exampleBuilders(){return[new y({description:"Tables that start a document do not get an empty line before them.",before:m`
+ | Column 1 | Column 2 |
+ |----------|----------|
+ | foo | bar |
+ | baz | qux |
+ | quux | quuz |
+ More text.
+ # Heading
+ ${""}
+ **Note that text directly following a table is considered part of a table according to github markdown**
+ `,after:m`
+ | Column 1 | Column 2 |
+ |----------|----------|
+ | foo | bar |
+ | baz | qux |
+ | quux | quuz |
+ ${""}
+ More text.
+ # Heading
+ ${""}
+ **Note that text directly following a table is considered part of a table according to github markdown**
+ `}),new y({description:"Tables that end a document do not get an empty line after them.",before:m`
+ # Heading 1
+ | Column 1 | Column 2 |
+ |----------|----------|
+ | foo | bar |
+ | baz | qux |
+ | quux | quuz |
+ `,after:m`
+ # Heading 1
+ ${""}
+ | Column 1 | Column 2 |
+ |----------|----------|
+ | foo | bar |
+ | baz | qux |
+ | quux | quuz |
+ `}),new y({description:"Tables that are not at the start or the end of the document will have an empty line added before and after them",before:m`
+ # Table 1
+ | Column 1 | Column 2 | Column 3 |
+ |----------|----------|----------|
+ | foo | bar | blob |
+ | baz | qux | trust |
+ | quux | quuz | glob |
+ # Table 2 without Pipe at Start and End
+ | Column 1 | Column 2 |
+ :-: | -----------:
+ bar | baz
+ foo | bar
+ # Header for more content
+ New paragraph.
+ `,after:m`
+ # Table 1
+ ${""}
+ | Column 1 | Column 2 | Column 3 |
+ |----------|----------|----------|
+ | foo | bar | blob |
+ | baz | qux | trust |
+ | quux | quuz | glob |
+ ${""}
+ # Table 2 without Pipe at Start and End
+ ${""}
+ | Column 1 | Column 2 |
+ :-: | -----------:
+ bar | baz
+ foo | bar
+ ${""}
+ # Header for more content
+ New paragraph.
+ `}),new y({description:"Tables in callouts or blockquotes have the appropriately formatted blank lines added",before:m`
+ > Table in blockquote
+ > | Column 1 | Column 2 | Column 3 |
+ > |----------|----------|----------|
+ > | foo | bar | blob |
+ > | baz | qux | trust |
+ > | quux | quuz | glob |
+ ${""}
+ More content here
+ ${""}
+ > Table doubly nested in blockquote
+ > > | Column 1 | Column 2 | Column 3 |
+ > > |----------|----------|----------|
+ > > | foo | bar | blob |
+ > > | baz | qux | trust |
+ > > | quux | quuz | glob |
+ `,after:m`
+ > Table in blockquote
+ >
+ > | Column 1 | Column 2 | Column 3 |
+ > |----------|----------|----------|
+ > | foo | bar | blob |
+ > | baz | qux | trust |
+ > | quux | quuz | glob |
+ ${""}
+ More content here
+ ${""}
+ > Table doubly nested in blockquote
+ >
+ > > | Column 1 | Column 2 | Column 3 |
+ > > |----------|----------|----------|
+ > > | foo | bar | blob |
+ > > | baz | qux | trust |
+ > > | quux | quuz | glob |
+ `})]}get optionBuilders(){return[]}};Ar=A([v.register],Ar);var Tr=class{constructor(){this.defaultEscapeCharacter='"';this.tryToEscapeSingleLineArrays=!1}};A([v.noSettingControl()],Tr.prototype,"defaultEscapeCharacter",2);var Ot=class extends v{constructor(){super({nameKey:"rules.escape-yaml-special-characters.name",descriptionKey:"rules.escape-yaml-special-characters.description",type:"YAML",hasSpecialExecutionOrder:!0})}get OptionsClass(){return Tr}apply(t,i){return Oe(t,n=>{let r=n.split(`
+`),a=r.length;if(a<1)return n;for(let s=0;s=o.length,d=o.startsWith("-"),u=d&&o.length<2;if(c&&u)continue;let g=1;if(!d)g+=l;else if(l!==-1&&s+1{for(let r of i.forceYamlEscape){let a=Be(n,r);if(a!=null){if(a.includes(`
+`)||a.startsWith(" [")||fn(a))continue;a=fi(a,i.defaultEscapeCharacter,!0),n=Ce(n,r," "+a)}}return n})}get exampleBuilders(){return[new y({description:"YAML without anything to escape",before:m`
+ ---
+ key: value
+ otherKey: []
+ ---
+ `,after:m`
+ ---
+ key: value
+ otherKey: []
+ ---
+ `}),new y({description:"Force YAML keys to be escaped with double quotes where not already escaped with `Force YAML Escape on Keys = 'key'\\n'title'\\n'bool'`",before:m`
+ ---
+ key: 'Already escaped value'
+ title: This is a title
+ bool: false
+ unaffected: value
+ ---
+ ${""}
+ _Note that the force YAML key option should not be used with arrays._
+ `,after:m`
+ ---
+ key: 'Already escaped value'
+ title: "This is a title"
+ bool: "false"
+ unaffected: value
+ ---
+ ${""}
+ _Note that the force YAML key option should not be used with arrays._
+ `,options:{forceYamlEscape:["key","title","bool"],defaultEscapeCharacter:'"'}})]}get optionBuilders(){return[new xe({OptionsClass:Or,nameKey:"rules.force-yaml-escape.force-yaml-escape-keys.name",descriptionKey:"rules.force-yaml-escape.force-yaml-escape-keys.description",optionsKey:"forceYamlEscape"})]}};Ct=A([v.register],Ct);var Pl=class{},Mt=class extends v{constructor(){super({nameKey:"rules.format-tags-in-yaml.name",descriptionKey:"rules.format-tags-in-yaml.description",type:"YAML",hasSpecialExecutionOrder:!0})}get OptionsClass(){return Pl}apply(t,i){return Oe(t,n=>n.replace(new RegExp(`\\n(${cr}|${Ml}):(.*?)(?=\\n(?:[A-Za-z-]+?:|---))`,"s"),function(r){return r.replaceAll("#","")}))}get exampleBuilders(){return[new y({description:"Format Tags in YAML frontmatter",before:m`
+ ---
+ tags: #one #two #three #nested/four/five
+ ---
+ `,after:m`
+ ---
+ tags: one two three nested/four/five
+ ---
+ `}),new y({description:"Format tags in array",before:m`
+ ---
+ tags: [#one #two #three]
+ ---
+ `,after:m`
+ ---
+ tags: [one two three]
+ ---
+ `}),new y({description:"Format tags in array with `tag` as the tags key",before:m`
+ ---
+ tag: [#one #two #three]
+ ---
+ `,after:m`
+ ---
+ tag: [one two three]
+ ---
+ `}),new y({description:"Format tags in list",before:m`
+ ---
+ tags:
+ - #tag1
+ - #tag2
+ ---
+ `,after:m`
+ ---
+ tags:
+ - tag1
+ - tag2
+ ---
+ `})]}get optionBuilders(){return[]}};Mt=A([v.register],Mt);var ri=class{constructor(){this.aliasArrayStyle="single-line";this.formatAliasKey=!0;this.tagArrayStyle="single-line";this.formatTagKey=!0;this.defaultArrayStyle="single-line";this.formatArrayKeys=!0;this.forceSingleLineArrayStyle=[];this.forceMultiLineArrayStyle=[];this.defaultEscapeCharacter='"';this.removeUnnecessaryEscapeCharsForMultiLineArrays=!1}};A([v.noSettingControl()],ri.prototype,"aliasArrayStyle",2),A([v.noSettingControl()],ri.prototype,"tagArrayStyle",2),A([v.noSettingControl()],ri.prototype,"defaultEscapeCharacter",2),A([v.noSettingControl()],ri.prototype,"removeUnnecessaryEscapeCharsForMultiLineArrays",2);var Cr=class extends v{constructor(){super({nameKey:"rules.format-yaml-array.name",descriptionKey:"rules.format-yaml-array.description",type:"YAML"})}get OptionsClass(){return ri}apply(t,i){return Oe(t,n=>{let r=Di(n.replace(`---
+`,"").replace(`
+---`,""));if(!r)return n;for(let a of ur)if(i.formatAliasKey&&Object.keys(r).includes(a)){n=Ce(n,a,ni(Ss(Si(Be(n,a))),i.aliasArrayStyle,i.defaultEscapeCharacter,i.removeUnnecessaryEscapeCharsForMultiLineArrays,!0));break}for(let a of dr)if(i.formatTagKey&&Object.keys(r).includes(a)){n=Ce(n,a,ni(zs(Si(Be(n,a))),i.tagArrayStyle,i.defaultEscapeCharacter,i.removeUnnecessaryEscapeCharsForMultiLineArrays));break}if(i.formatArrayKeys){let a=[...ur,...dr,...i.forceMultiLineArrayStyle,...i.forceSingleLineArrayStyle];for(let s of Object.keys(r))a.includes(s)||!Array.isArray(r[s])||r[s].length!==0&&typeof r[s][0]=="object"&&r[s][0]!==null||(n=Ce(n,s,ni(Si(Be(n,s)),i.defaultArrayStyle,i.defaultEscapeCharacter,i.removeUnnecessaryEscapeCharsForMultiLineArrays)))}for(let a of i.forceSingleLineArrayStyle)Object.keys(r).includes(a)&&(n=Ce(n,a,ni(Si(Be(n,a)),"single-line",i.defaultEscapeCharacter,i.removeUnnecessaryEscapeCharsForMultiLineArrays)));for(let a of i.forceMultiLineArrayStyle)Object.keys(r).includes(a)&&(n=Ce(n,a,ni(Si(Be(n,a)),"multi-line",i.defaultEscapeCharacter,i.removeUnnecessaryEscapeCharsForMultiLineArrays)));return n})}get exampleBuilders(){return[new y({description:"Format tags as a single-line array delimited by spaces and aliases as a multi-line array and format the key `test` to be a single-line array",before:m`
+ ---
+ tags:
+ - computer
+ - research
+ aliases: Title 1, Title2
+ test: this is a value
+ ---
+ ${""}
+ # Notes:
+ ${""}
+ Nesting YAML arrays may result in unexpected results.
+ ${""}
+ Multi-line arrays will have empty values removed only leaving one if it is completely empty. The same is not true for single-line arrays as that is invalid YAML unless it comes as the last entry in the array.
+ `,after:m`
+ ---
+ tags: [computer, research]
+ aliases:
+ - Title 1
+ - Title2
+ test: [this is a value]
+ ---
+ ${""}
+ # Notes:
+ ${""}
+ Nesting YAML arrays may result in unexpected results.
+ ${""}
+ Multi-line arrays will have empty values removed only leaving one if it is completely empty. The same is not true for single-line arrays as that is invalid YAML unless it comes as the last entry in the array.
+ `,options:{aliasArrayStyle:"multi-line",forceSingleLineArrayStyle:["test"]}}),new y({description:"Format tags as a single string with space delimiters, ignore aliases, and format regular YAML arrays as single-line arrays",before:m`
+ ---
+ aliases: Typescript
+ types:
+ - thought provoking
+ - peer reviewed
+ tags: [computer, science, trajectory]
+ ---
+ `,after:m`
+ ---
+ aliases: Typescript
+ types: [thought provoking, peer reviewed]
+ tags: computer science trajectory
+ ---
+ `,options:{formatAliasKey:!1,tagArrayStyle:"single string space delimited"}}),new y({description:"Arrays with dictionaries in them are ignored",before:m`
+ ---
+ gists:
+ - id: test123
+ url: 'some_url'
+ filename: file.md
+ isPublic: true
+ ---
+ `,after:m`
+ ---
+ gists:
+ - id: test123
+ url: 'some_url'
+ filename: file.md
+ isPublic: true
+ ---
+ `,options:{formatArrayKeys:!0,defaultArrayStyle:"single-line"}})]}get optionBuilders(){return[new Z({OptionsClass:ri,nameKey:"rules.format-yaml-array.alias-key.name",descriptionKey:"rules.format-yaml-array.alias-key.description",optionsKey:"formatAliasKey"}),new Z({OptionsClass:ri,nameKey:"rules.format-yaml-array.tag-key.name",descriptionKey:"rules.format-yaml-array.tag-key.description",optionsKey:"formatTagKey"}),new se({OptionsClass:ri,nameKey:"rules.format-yaml-array.default-array-style.name",descriptionKey:"rules.format-yaml-array.default-array-style.description",optionsKey:"defaultArrayStyle",records:[{value:"multi-line",description:"```key:\\n - value```"},{value:"single-line",description:"```key: [value]```"}]}),new Z({OptionsClass:ri,nameKey:"rules.format-yaml-array.default-array-keys.name",descriptionKey:"rules.format-yaml-array.default-array-keys.description",optionsKey:"formatArrayKeys"}),new xe({OptionsClass:ri,nameKey:"rules.format-yaml-array.force-single-line-array-style.name",descriptionKey:"rules.format-yaml-array.force-single-line-array-style.description",optionsKey:"forceSingleLineArrayStyle"}),new xe({OptionsClass:ri,nameKey:"rules.format-yaml-array.force-multi-line-array-style.name",descriptionKey:"rules.format-yaml-array.force-multi-line-array-style.description",optionsKey:"forceMultiLineArrayStyle"})]}};Cr=A([v.register],Cr);var $s=class{constructor(){this.startAtH2=!1}},Mr=class extends v{constructor(){super({nameKey:"rules.header-increment.name",descriptionKey:"rules.header-increment.description",type:"Heading",ruleIgnoreTypes:[h.code,h.math,h.yaml,h.link,h.wikiLink,h.tag]})}get OptionsClass(){return $s}apply(t,i){let n=0,r=i.startAtH2?2:1,a=[],s=[0,0,0,0,0,0],o=s.length;return t.replace(Xi,(l,c="",d="",u="",g="",p="")=>{let f=d.length;if(f=f<=o?f:o,s[f-1]>=0&&f=w;x--)s[x]=0}if(s[f-1]<=0){let w=n,x=a.length+r;x=x<=o?x:o;for(let b=w;bn.trimStart())}get exampleBuilders(){return[new y({description:"Removes spaces prior to a heading",before:m`
+ ${""} ## Other heading preceded by 2 spaces ##
+ _Note that if the spacing is enough for the header to be considered to be part of a codeblock it will not be affected by this rule._
+ `,after:m`
+ ## Other heading preceded by 2 spaces ##
+ _Note that if the spacing is enough for the header to be considered to be part of a codeblock it will not be affected by this rule._
+ `}),new y({description:"Tags are not affected by this",before:m`
+ ${""} #test
+ ${""} # Heading &
+ `,after:m`
+ ${""} #test
+ # Heading &
+ `})]}get optionBuilders(){return[]}};Br=A([v.register],Br);var Ws=class{constructor(){this.textToInsert=["aliases: ","tags: "]}},_r=class extends v{constructor(){super({nameKey:"rules.insert-yaml-attributes.name",descriptionKey:"rules.insert-yaml-attributes.description",type:"YAML"})}get OptionsClass(){return Ws}apply(t,i){return t=zi(t),Oe(t,n=>{let r=i.textToInsert.reverse(),a=Di(n.match(Ve)[1]);for(let s of r){let o=s.split(":")[0];Object.prototype.hasOwnProperty.call(a,o)||(n=n.replace(/^---\n/,Ge(`---
+${s}
+`)))}return n})}get exampleBuilders(){return[new y({description:"Insert static lines into YAML frontmatter. Text to insert: `aliases:\ntags: doc\nanimal: dog`",before:m`
+ ---
+ animal: cat
+ ---
+ `,after:m`
+ ---
+ aliases:
+ tags: doc
+ animal: cat
+ ---
+ `,options:{textToInsert:["aliases:","tags: doc","animal: dog"]}})]}get optionBuilders(){return[new xe({OptionsClass:Ws,nameKey:"rules.insert-yaml-attributes.text-to-insert.name",descriptionKey:"rules.insert-yaml-attributes.text-to-insert.description",optionsKey:"textToInsert"})]}};_r=A([v.register],_r);var $l=class{},Fr=class extends v{constructor(){super({nameKey:"rules.line-break-at-document-end.name",descriptionKey:"rules.line-break-at-document-end.description",type:"Spacing"})}get OptionsClass(){return $l}apply(t,i){return t=t.replace(/\n+$/g,""),t+=`
+`,t}get exampleBuilders(){return[new y({description:"Appending a line break to the end of the document.",before:m`
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+ `,after:m`
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+ ${""}
+ `}),new y({description:"Removing trailing line breaks to the end of the document, except one.",before:m`
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+ ${""}
+ ${""}
+ ${""}
+ `,after:m`
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+ ${""}
+ `})]}get optionBuilders(){return[]}};Fr=A([v.register],Fr);var Wl=class{},Rr=class extends v{constructor(){super({nameKey:"rules.move-footnotes-to-the-bottom.name",descriptionKey:"rules.move-footnotes-to-the-bottom.description",type:"Footnote",ruleIgnoreTypes:[h.code,h.inlineCode,h.math,h.yaml]})}get OptionsClass(){return Wl}apply(t,i){return Ru(t)}get exampleBuilders(){return[new y({description:"Moving footnotes to the bottom",before:m`
+ Lorem ipsum, consectetur adipiscing elit. [^1] Donec dictum turpis quis ipsum pellentesque.
+ ${""}
+ [^1]: first footnote
+ ${""}
+ Quisque lorem est, fringilla sed enim at, sollicitudin lacinia nisi.[^2]
+ [^2]: second footnote
+ ${""}
+ Maecenas malesuada dignissim purus ac volutpat.
+ `,after:m`
+ Lorem ipsum, consectetur adipiscing elit. [^1] Donec dictum turpis quis ipsum pellentesque.
+ ${""}
+ Quisque lorem est, fringilla sed enim at, sollicitudin lacinia nisi.[^2]
+ Maecenas malesuada dignissim purus ac volutpat.
+ ${""}
+ [^1]: first footnote
+ [^2]: second footnote
+ `})]}get optionBuilders(){return[]}};Rr=A([v.register],Rr);var Us=class{constructor(){this.minimumNumberOfDollarSignsToBeAMathBlock=2}};A([v.noSettingControl()],Us.prototype,"minimumNumberOfDollarSignsToBeAMathBlock",2);var qt=class extends v{constructor(){super({nameKey:"rules.move-math-block-indicators-to-their-own-line.name",descriptionKey:"rules.move-math-block-indicators-to-their-own-line.description",type:"Spacing",ruleIgnoreTypes:[h.code,h.inlineCode],hasSpecialExecutionOrder:!0})}get OptionsClass(){return Us}apply(t,i){return Gu(t,i.minimumNumberOfDollarSignsToBeAMathBlock)}get exampleBuilders(){return[new y({description:"Moving math block indicator to its own line when `Number of Dollar Signs to Indicate a Math Block` = 2",before:m`
+ This is left alone:
+ $$
+ \\boldsymbol{a}=\\begin{bmatrix}a_x \\\\ a_y\\end{bmatrix}
+ $$
+ The following is updated:
+ $$L = \\frac{1}{2} \\rho v^2 S C_L$$
+ `,after:m`
+ This is left alone:
+ $$
+ \\boldsymbol{a}=\\begin{bmatrix}a_x \\\\ a_y\\end{bmatrix}
+ $$
+ The following is updated:
+ $$
+ L = \\frac{1}{2} \\rho v^2 S C_L
+ $$
+ `}),new y({description:"Moving math block indicator to its own line when `Number of Dollar Signs to Indicate a Math Block` = 3 and opening indicator is on the same line as the start of the content",before:m`
+ $$$\\boldsymbol{a}=\\begin{bmatrix}a_x \\\\ a_y\\end{bmatrix}
+ $$$
+ `,after:m`
+ $$$
+ \\boldsymbol{a}=\\begin{bmatrix}a_x \\\\ a_y\\end{bmatrix}
+ $$$
+ `}),new y({description:"Moving math block indicator to its own line when `Number of Dollar Signs to Indicate a Math Block` = 2 and ending indicator is on the same line as the ending line of the content",before:m`
+ $$
+ \\boldsymbol{a}=\\begin{bmatrix}a_x \\\\ a_y\\end{bmatrix}$$
+ `,after:m`
+ $$
+ \\boldsymbol{a}=\\begin{bmatrix}a_x \\\\ a_y\\end{bmatrix}
+ $$
+ `})]}get optionBuilders(){return[]}};qt=A([v.register],qt);var nt=class{constructor(){this.tagArrayStyle="single-line";this.howToHandleExistingTags="Nothing";this.tagsToIgnore=[];this.defaultEscapeCharacter='"';this.removeUnnecessaryEscapeCharsForMultiLineArrays=!1}};A([v.noSettingControl()],nt.prototype,"tagArrayStyle",2),A([v.noSettingControl()],nt.prototype,"defaultEscapeCharacter",2),A([v.noSettingControl()],nt.prototype,"removeUnnecessaryEscapeCharsForMultiLineArrays",2);var Dr=class extends v{constructor(){super({nameKey:"rules.move-tags-to-yaml.name",descriptionKey:"rules.move-tags-to-yaml.description",type:"YAML",ruleIgnoreTypes:[h.code,h.inlineCode,h.math,h.html,h.wikiLink,h.link]})}get OptionsClass(){return nt}apply(t,i){let n;return ze([h.yaml],t,r=>(n=fp(r),r)),n.length===0||(t=zi(t),t=Oe(t,r=>{r=r.replace(`---
+`,"").replace("---","");let a=[],s=cr;for(let c of dr){let d=Be(r,c);if(d!=null){a=zs(Si(d)),s=c;break}}let o=new Set;if(typeof a=="string")o.add(a),a=[a];else if(a!=null)for(let c of a)o.add(c);else a=[];for(let c of n){let d=c.trim().substring(1);!o.has(d)&&!i.tagsToIgnore.includes(d)&&(o.add(d),a.push(d))}return`---
+${Ce(r,s,ni(a,i.tagArrayStyle,i.defaultEscapeCharacter,i.removeUnnecessaryEscapeCharsForMultiLineArrays))}---`}),t=ze([h.yaml],t,r=>(i.howToHandleExistingTags!=="Nothing"&&(r=r.replace(ar,a=>{let s=a.indexOf("#"),o=a.substring(s+1);return i.tagsToIgnore.includes(o)?a:i.howToHandleExistingTags==="Remove hashtag"?a.substring(0,s)+o:""})),r)),t=t.replace(/(\n---)( |\t)+/,"$1")),t}get exampleBuilders(){return[new y({description:"Move tags from body to YAML with `Tags to ignore = 'ignored-tag'`",before:m`
+ Text has to do with #test and #markdown
+ ${""}
+ #test content here
+ \`\`\`
+ #ignored
+ Code block content is ignored
+ \`\`\`
+ ${""}
+ This inline code \`#ignored content\`
+ ${""}
+ #ignored-tag is ignored since it is in the ignored list
+ `,after:m`
+ ---
+ tags: [test, markdown]
+ ---
+ Text has to do with #test and #markdown
+ ${""}
+ #test content here
+ \`\`\`
+ #ignored
+ Code block content is ignored
+ \`\`\`
+ ${""}
+ This inline code \`#ignored content\`
+ ${""}
+ #ignored-tag is ignored since it is in the ignored list
+ `,options:{tagsToIgnore:["ignored-tag"]}}),new y({description:"Move tags from body to YAML with existing tags retains the already existing ones and only adds new ones",before:m`
+ ---
+ tags: [test, tag2]
+ ---
+ Text has to do with #test and #markdown
+ `,after:m`
+ ---
+ tags: [test, tag2, markdown]
+ ---
+ Text has to do with #test and #markdown
+ `}),new y({description:"Move tags to YAML frontmatter and then remove hashtags in body content tags when `Body tag operation = 'Remove hashtag'` and `Tags to ignore = 'yet-another-ignored-tag'`.",before:m`
+ ---
+ tags: [test, tag2]
+ ---
+ Text has to do with #test and #markdown
+ ${""}
+ The tag at the end of this line stays as a tag since it is ignored #yet-another-ignored-tag
+ `,after:m`
+ ---
+ tags: [test, tag2, markdown]
+ ---
+ Text has to do with test and markdown
+ ${""}
+ The tag at the end of this line stays as a tag since it is ignored #yet-another-ignored-tag
+ `,options:{howToHandleExistingTags:"Remove hashtag",tagsToIgnore:["yet-another-ignored-tag"]}}),new y({description:"Move tags to YAML frontmatter and then remove body content tags when `Body tag operation = 'Remove whole tag'`.",before:m`
+ ---
+ tags: [test, tag2]
+ ---
+ This document will have #tags removed and spacing around tags is left alone except for the space prior to the hashtag #warning
+ `,after:m`
+ ---
+ tags: [test, tag2, tags, warning]
+ ---
+ This document will have removed and spacing around tags is left alone except for the space prior to the hashtag
+ `,options:{howToHandleExistingTags:"Remove whole tag"}})]}get optionBuilders(){return[new se({OptionsClass:nt,nameKey:"rules.move-tags-to-yaml.how-to-handle-existing-tags.name",descriptionKey:"rules.move-tags-to-yaml.how-to-handle-existing-tags.description",optionsKey:"howToHandleExistingTags",records:[{value:"Nothing",description:"Leaves tags in the body of the file alone"},{value:"Remove hashtag",description:"Removes `#` from tags in content body after moving them to the YAML frontmatter"},{value:"Remove whole tag",description:"Removes the whole tag in content body after moving them to the YAML frontmatter. _Note that this removes the first space prior to the tag as well_"}]}),new xe({OptionsClass:nt,nameKey:"rules.move-tags-to-yaml.tags-to-ignore.name",descriptionKey:"rules.move-tags-to-yaml.tags-to-ignore.description",optionsKey:"tagsToIgnore"})]}};Dr=A([v.register],Dr);var Gs=class{constructor(){this.noBareURIs=!1}},Vs="'\"\u2018\u2019\u201C\u201D`[]",sv=["http","ftp","https","smtp"],Nr=class extends v{constructor(){super({nameKey:"rules.no-bare-urls.name",descriptionKey:"rules.no-bare-urls.description",type:"Content",ruleIgnoreTypes:[h.code,h.math,h.yaml,h.link,h.wikiLink,h.tag,h.image,h.inlineCode,h.anchorTag,h.html]})}get OptionsClass(){return Gs}apply(t,i){let n=t.match(mn);if(n&&(t=this.handleMatches(t,n,!1)),i.noBareURIs){let r=t.match(ap);r&&(t=this.handleMatches(t,r,!0))}return t}handleMatches(t,i,n){let r=0,a=i.length;for(let s=0;s"&&(o=o.substring(0,o.length-1),c--);let d=l===0?void 0:t.charAt(l-1),u=c>=t.length?void 0:t.charAt(c),g=Vi(o,"(");if(g!=0&&g!=Vi(o,")")&&u==")"?(o+=u,c++,u=c>=t.length?void 0:t.charAt(c)):g==0&&o.endsWith(")")&&(u=")",c--,o=o.substring(0,o.length-1)),this.skipMatch(d,u,o,n)){r=l+o.length;continue}if(d!=null&&d==="<"&&u!=null&&u===">"){let p=l-1;for(;p>0&&t.charAt(p-1)==="<";)p--;let f=c;for(;f";)f++;t=le(t,p,f+1,"<"+o+">"),r=l+o.length;continue}t=le(t,l,l+o.length,"<"+o+">"),r=l+o.length+2}return t}skipMatch(t,i,n,r){let a=t!=null&&Vs.includes(t)||Vs.includes(n.charAt(0)),s=i!=null&&Vs.includes(i)||Vs.includes(n.charAt(n.length-1));return a&&s?!0:r?sv.includes(n.substring(0,n.indexOf(":"))):!1}get exampleBuilders(){return[new y({description:"Make sure that links are inside of angle brackets when not in single quotes('), double quotes(\"), or backticks(`)",before:m`
+ https://github.com
+ braces around url should stay the same: [https://github.com]
+ backticks around url should stay the same: \`https://github.com\`
+ Links mid-sentence should be updated like https://google.com will be.
+ 'https://github.com'
+ "https://github.com"
+
+ links should stay the same: [](https://github.com)
+ https://gitlab.com
+ `,after:m`
+
+ braces around url should stay the same: [https://github.com]
+ backticks around url should stay the same: \`https://github.com\`
+ Links mid-sentence should be updated like will be.
+ 'https://github.com'
+ "https://github.com"
+
+ links should stay the same: [](https://github.com)
+
+ `}),new y({description:`Angle brackets are added if the url is not the only text in the single quotes(') or double quotes(")`,before:m`
+ [https://github.com some text here]
+ backticks around a url should stay the same: \`https://github.com some text here\`
+ single quotes around a url should stay the same, but only if the contents of the single quotes is the url: 'https://github.com some text here'
+ double quotes around a url should stay the same, but only if the contents of the double quotes is the url: "https://github.com some text here"
+ `,after:m`
+ [ some text here]
+ backticks around a url should stay the same: \`https://github.com some text here\`
+ single quotes around a url should stay the same, but only if the contents of the single quotes is the url: ' some text here'
+ double quotes around a url should stay the same, but only if the contents of the double quotes is the url: " some text here"
+ `}),new y({description:"Multiple angle brackets at the start and or end of a url will be reduced down to 1",before:m`
+ <
+ >
+ <>
+ `,after:m`
+
+
+
+ `}),new y({description:"Puts angle brackets around URIs when `No Bare URIs` is enabled",before:m`
+ obsidian://show-plugin?id=cycle-in-sidebar
+ `,after:m`
+
+ `,options:{noBareURIs:!0}})]}get optionBuilders(){return[new Z({OptionsClass:Gs,nameKey:"rules.no-bare-urls.no-bare-uris.name",descriptionKey:"rules.no-bare-urls.no-bare-uris.description",optionsKey:"noBareURIs"})]}};Nr=A([v.register],Nr);var Kr=class{constructor(){this.numberStyle="ascending";this.listEndStyle="."}},jr=class extends v{constructor(){super({nameKey:"rules.ordered-list-style.name",descriptionKey:"rules.ordered-list-style.description",type:"Content",ruleIgnoreTypes:[h.code,h.math,h.yaml,h.tag]})}get OptionsClass(){return Kr}apply(t,i){return Uu(t,i.numberStyle,i.listEndStyle)}get exampleBuilders(){return[new y({description:"Ordered lists have list items set to ascending numerical order when Number Style is `ascending`.",before:m`
+ 1. Item 1
+ 2. Item 2
+ 4. Item 3
+ ${""}
+ Some text here
+ ${""}
+ 1. Item 1
+ 1. Item 2
+ 1. Item 3
+ `,after:m`
+ 1. Item 1
+ 2. Item 2
+ 3. Item 3
+ ${""}
+ Some text here
+ ${""}
+ 1. Item 1
+ 2. Item 2
+ 3. Item 3
+ `}),new y({description:"Nested ordered lists have list items set to ascending numerical order when Number Style is `ascending`.",before:m`
+ 1. Item 1
+ 2. Item 2
+ 1. Subitem 1
+ 5. Subitem 2
+ 2. Subitem 3
+ 4. Item 3
+ `,after:m`
+ 1. Item 1
+ 2. Item 2
+ 1. Subitem 1
+ 2. Subitem 2
+ 3. Subitem 3
+ 3. Item 3
+ `}),new y({description:"Ordered list in blockquote has list items set to '1.' when Number Style is `lazy`.",before:m`
+ > 1. Item 1
+ > 4. Item 2
+ > > 1. Subitem 1
+ > > 5. Subitem 2
+ > > 2. Subitem 3
+ `,after:m`
+ > 1. Item 1
+ > 1. Item 2
+ > > 1. Subitem 1
+ > > 1. Subitem 2
+ > > 1. Subitem 3
+ `,options:{numberStyle:"lazy"}}),new y({description:"Ordered list in blockquote has list items set to ascending numerical order when Number Style is `ascending`.",before:m`
+ > 1. Item 1
+ > 4. Item 2
+ > > 1. Subitem 1
+ > > 5. Subitem 2
+ > > 2. Subitem 3
+ `,after:m`
+ > 1. Item 1
+ > 2. Item 2
+ > > 1. Subitem 1
+ > > 2. Subitem 2
+ > > 3. Subitem 3
+ `}),new y({description:"Nested ordered list has list items set to '1)' when Number Style is `lazy` and Ordered List Indicator End Style is `)`.",before:m`
+ 1. Item 1
+ 2. Item 2
+ 1. Subitem 1
+ 5. Subitem 2
+ 2. Subitem 3
+ 4. Item 3
+ `,after:m`
+ 1) Item 1
+ 1) Item 2
+ 1) Subitem 1
+ 1) Subitem 2
+ 1) Subitem 3
+ 1) Item 3
+ `,options:{listEndStyle:")",numberStyle:"lazy"}})]}get optionBuilders(){return[new se({OptionsClass:Kr,nameKey:"rules.ordered-list-style.number-style.name",descriptionKey:"rules.ordered-list-style.number-style.description",optionsKey:"numberStyle",records:[{value:"ascending",description:"Makes sure ordered list items are ascending (i.e. 1, 2, 3, etc.)"},{value:"lazy",description:"Makes sure ordered list item indicators all are the number 1"}]}),new se({OptionsClass:Kr,nameKey:"rules.ordered-list-style.list-end-style.name",descriptionKey:"rules.ordered-list-style.list-end-style.description",optionsKey:"listEndStyle",records:[{value:".",description:"Makes sure ordered list items indicators end in '.' (i.e `1.`)"},{value:")",description:"Makes sure ordered list item indicators end in ')' (i.e. `1)`)"}]})]}};jr=A([v.register],jr);var Ul=class{},Yr=class extends v{constructor(){super({nameKey:"rules.paragraph-blank-lines.name",descriptionKey:"rules.paragraph-blank-lines.description",type:"Spacing",ruleIgnoreTypes:[h.obsidianMultiLineComments,h.yaml,h.table]})}get OptionsClass(){return Ul}apply(t,i){return ju(t)}get exampleBuilders(){return[new y({description:"Paragraphs should be surrounded by blank lines",before:m`
+ # H1
+ Newlines are inserted.
+ A paragraph is a line that starts with a letter.
+ `,after:m`
+ # H1
+ ${""}
+ Newlines are inserted.
+ ${""}
+ A paragraph is a line that starts with a letter.
+ `}),new y({description:"Paragraphs can be extended via the use of 2 or more spaces at the end of a line or line break html",before:m`
+ # H1
+ Content${" "}
+ Paragraph content continued
+ Paragraph content continued once more
+ Last line of paragraph
+ A new paragraph
+ # H2
+ `,after:m`
+ # H1
+ ${""}
+ Content${" "}
+ Paragraph content continued
+ Paragraph content continued once more
+ Last line of paragraph
+ ${""}
+ A new paragraph
+ ${""}
+ # H2
+ `})]}get optionBuilders(){return[]}};Yr=A([v.register],Yr);var Pr=class{};A([v.noSettingControl()],Pr.prototype,"lineContent",2),A([v.noSettingControl()],Pr.prototype,"selectedText",2);var It=class extends v{constructor(){super({nameKey:"rules.prevent-double-checklist-indicator-on-paste.name",descriptionKey:"rules.prevent-double-checklist-indicator-on-paste.description",type:"Paste"})}get OptionsClass(){return Pr}apply(t,i){let n=pp.test(i.lineContent),r=vs.test(t),a=vs.test(i.selectedText);return!n||!r||a?t:t.replace(vs,"")}get exampleBuilders(){return[new y({description:"Line being pasted is left alone when current line has no checklist indicator in it: `Regular text here`",before:m`
+ - [ ] Checklist item being pasted
+ `,after:m`
+ - [ ] Checklist item being pasted
+ `,options:{lineContent:"Regular text here",selectedText:""}}),new y({description:"Line being pasted into a blockquote without a checklist indicator is left alone when it lacks a checklist indicator: `> > `",before:m`
+ - [ ] Checklist item contents here
+ More content here
+ `,after:m`
+ - [ ] Checklist item contents here
+ More content here
+ `,options:{lineContent:"> > ",selectedText:""}}),new y({description:"Line being pasted into a blockquote with a checklist indicator has its checklist indicator removed when current line is: `> - [x] `",before:m`
+ - [ ] Checklist item contents here
+ More content here
+ `,after:m`
+ Checklist item contents here
+ More content here
+ `,options:{lineContent:"> - [x] ",selectedText:""}}),new y({description:"Line being pasted with a checklist indicator has its checklist indicator removed when current line is: `- [ ] `",before:m`
+ - [x] Checklist item 1
+ - [ ] Checklist item 2
+ `,after:m`
+ Checklist item 1
+ - [ ] Checklist item 2
+ `,options:{lineContent:"- [ ] ",selectedText:""}}),new y({description:"Line being pasted as a checklist indicator has its checklist indicator removed when current line is: `- [!] `",before:m`
+ - [x] Checklist item 1
+ - [ ] Checklist item 2
+ `,after:m`
+ Checklist item 1
+ - [ ] Checklist item 2
+ `,options:{lineContent:"- [!] ",selectedText:""}}),new y({description:"When pasting a checklist and the selected text starts with a checklist, the text to paste should still start with a checklist",before:m`
+ - [x] Checklist item 1
+ - [ ] Checklist item 2
+ `,after:m`
+ - [x] Checklist item 1
+ - [ ] Checklist item 2
+ `,options:{lineContent:"- [!] Some text here",selectedText:"- [!] Some text here"}})]}get optionBuilders(){return[]}};It=A([v.register],It);var Hr=class{};A([v.noSettingControl()],Hr.prototype,"lineContent",2),A([v.noSettingControl()],Hr.prototype,"selectedText",2);var Bt=class extends v{constructor(){super({nameKey:"rules.prevent-double-list-item-indicator-on-paste.name",descriptionKey:"rules.prevent-double-list-item-indicator-on-paste.description",type:"Paste"})}get OptionsClass(){return Hr}apply(t,i){let n=new RegExp(`^${or}[*+-] `),r=/^\s*[*+-] /,a=n.test(i.lineContent),s=n.test(i.selectedText),o=r.test(t);return s||!a||!o?t:t.replace(r,"")}get exampleBuilders(){return[new y({description:"Line being pasted is left alone when current line has no list indicator in it: `Regular text here`",before:m`
+ - List item being pasted
+ `,after:m`
+ - List item being pasted
+ `,options:{lineContent:"Regular text here",selectedText:""}}),new y({description:"Line being pasted into a blockquote without a list indicator is left alone when it lacks a list indicator: `> > `",before:m`
+ * List item contents here
+ More content here
+ `,after:m`
+ * List item contents here
+ More content here
+ `,options:{lineContent:"> > ",selectedText:""}}),new y({description:"Line being pasted into a blockquote with a list indicator is has its list indicator removed when current line is: `> * `",before:m`
+ + List item contents here
+ More content here
+ `,after:m`
+ List item contents here
+ More content here
+ `,options:{lineContent:"> * ",selectedText:""}}),new y({description:"Line being pasted with a list indicator is has its list indicator removed when current line is: `+ `",before:m`
+ - List item 1
+ - List item 2
+ `,after:m`
+ List item 1
+ - List item 2
+ `,options:{lineContent:"+ ",selectedText:""}}),new y({description:"When pasting a list item and the selected text starts with a list item indicator, the text to paste should still start with a list item indicator",before:m`
+ - List item 1
+ - List item 2
+ `,after:m`
+ - List item 1
+ - List item 2
+ `,options:{lineContent:"+ ",selectedText:"+ "}})]}get optionBuilders(){return[]}};Bt=A([v.register],Bt);var Vl=class{},_t=class extends v{constructor(){super({nameKey:"rules.proper-ellipsis-on-paste.name",descriptionKey:"rules.proper-ellipsis-on-paste.description",type:"Paste"})}get OptionsClass(){return Vl}apply(t,i){return t.replaceAll(bs,"\u2026")}get exampleBuilders(){return[new y({description:"Replacing three consecutive dots with an ellipsis even if spaces are present",before:m`
+ Lorem (...) Impsum.
+ Lorem (. ..) Impsum.
+ Lorem (. . .) Impsum.
+ `,after:m`
+ Lorem (…) Impsum.
+ Lorem (…) Impsum.
+ Lorem (…) Impsum.
+ `})]}get optionBuilders(){return[]}};_t=A([v.register],_t);var Gl=class{},$r=class extends v{constructor(){super({nameKey:"rules.proper-ellipsis.name",descriptionKey:"rules.proper-ellipsis.description",type:"Content"})}get OptionsClass(){return Gl}apply(t,i){return ze([h.code,h.math,h.yaml,h.link,h.wikiLink,h.tag,h.image],t,n=>n.replaceAll(bs,"\u2026"))}get exampleBuilders(){return[new y({description:"Replacing three consecutive dots with an ellipsis.",before:m`
+ Lorem (...) Impsum.
+ `,after:m`
+ Lorem (…) Impsum.
+ `})]}get optionBuilders(){return[]}};$r=A([v.register],$r);var Ft=class{constructor(){this.singleQuoteStyleEnabled=!0;this.singleQuoteStyle="''";this.doubleQuoteStyleEnabled=!0;this.doubleQuoteStyle='""'}},Wr=class extends v{constructor(){super({nameKey:"rules.quote-style.name",descriptionKey:"rules.quote-style.description",type:"Content",ruleIgnoreTypes:[h.code,h.inlineCode,h.math,h.yaml,h.math,h.inlineMath,h.html,h.link,h.wikiLink,h.templaterCommand]})}get OptionsClass(){return Ft}apply(t,i){let n=t;return i.doubleQuoteStyleEnabled&&(i.doubleQuoteStyle==='""'?n=this.convertSmartDoubleQuotesToStraightQuotes(n):n=this.convertStraightQuoteToSmartQuote(n,'"',"\u201C\u201D"[0],"\u201C\u201D"[1],!1)),i.singleQuoteStyleEnabled&&(i.singleQuoteStyle==="''"?n=this.convertSmartSingleQuotesToStraightQuotes(n):n=this.convertStraightQuoteToSmartQuote(n,"'","\u2018\u2019"[0],"\u2018\u2019"[1],!0)),n}convertSmartSingleQuotesToStraightQuotes(t){return t.replace(dp,"'")}convertSmartDoubleQuotesToStraightQuotes(t){return t.replace(cp,'"')}convertStraightQuoteToSmartQuote(t,i,n,r,a){let s=eu(i,t);if(s.length===0)return t;let o=t.length-1,l,c="",d="",u=!1,g=!1,p=!1,f=!1,w=!1,x="";for(let b of s)c=b==0?"":t.charAt(b-1),d=b===o?"":t.charAt(b+1),u=Cl.test(c),g=Cl.test(d),w=u&&g,p=c!=""&&c.trim()==="",f=d!=""&&d.trim()==="",w&&a?l=r:f&&!p?(l=r,x=l):p&&!f?(l=n,x=l):(x===""||x===r?l=n:l=r,x=l),t=le(t,b,b+1,l);return t}get exampleBuilders(){return[new y({description:"Smart quotes used in file are converted to straight quotes when styles are set to `Straight`",before:m`
+ # Double Quote Cases
+ “There are a bunch of different kinds of smart quote indicators”
+ „More than you would think”
+ «Including this one for Spanish»
+ # Single Quote Cases
+ ‘Simple smart quotes get replaced’
+ ‚Another single style smart quote also gets replaced’
+ ‹Even this style of single smart quotes is replaced›
+ `,after:m`
+ # Double Quote Cases
+ "There are a bunch of different kinds of smart quote indicators"
+ "More than you would think"
+ "Including this one for Spanish"
+ # Single Quote Cases
+ 'Simple smart quotes get replaced'
+ 'Another single style smart quote also gets replaced'
+ 'Even this style of single smart quotes is replaced'
+ `}),new y({description:"Straight quotes used in file are converted to smart quotes when styles are set to `Smart`",before:m`
+ "As you can see, these double quotes will be converted to smart quotes"
+ "Common contractions are handled as well. For example can't is updated to smart quotes."
+ "Nesting a quote in a quote like so: 'here I am' is handled correctly"
+ 'Single quotes by themselves are handled correctly'
+ Possessives are handled correctly: Pam's dog is really cool!
+ Templater commands are ignored: <% tp.date.now("YYYY-MM-DD", 7) %>
+ ${""}
+ Be careful as converting straight quotes to smart quotes requires you to have an even amount of quotes
+ once possessives and common contractions have been dealt with. If not, it will throw an error.
+ `,after:m`
+ “As you can see, these double quotes will be converted to smart quotes”
+ “Common contractions are handled as well. For example can’t is updated to smart quotes.”
+ “Nesting a quote in a quote like so: ‘here I am’ is handled correctly”
+ ‘Single quotes by themselves are handled correctly’
+ Possessives are handled correctly: Pam’s dog is really cool!
+ Templater commands are ignored: <% tp.date.now("YYYY-MM-DD", 7) %>
+ ${""}
+ Be careful as converting straight quotes to smart quotes requires you to have an even amount of quotes
+ once possessives and common contractions have been dealt with. If not, it will throw an error.
+ `,options:{singleQuoteStyle:"\u2018\u2019",doubleQuoteStyle:"\u201C\u201D"}})]}get optionBuilders(){return[new Z({OptionsClass:Ft,nameKey:"rules.quote-style.single-quote-enabled.name",descriptionKey:"rules.quote-style.single-quote-enabled.description",optionsKey:"singleQuoteStyleEnabled"}),new se({OptionsClass:Ft,nameKey:"rules.quote-style.single-quote-style.name",descriptionKey:"rules.quote-style.single-quote-style.description",optionsKey:"singleQuoteStyle",records:[{value:"''",description:`Uses "'" instead of smart single quotes`},{value:"\u2018\u2019",description:'Uses "\u2018" and "\u2019" instead of straight single quotes'}]}),new Z({OptionsClass:Ft,nameKey:"rules.quote-style.double-quote-enabled.name",descriptionKey:"rules.quote-style.double-quote-enabled.description",optionsKey:"doubleQuoteStyleEnabled"}),new se({OptionsClass:Ft,nameKey:"rules.quote-style.double-quote-style.name",descriptionKey:"rules.quote-style.double-quote-style.description",optionsKey:"doubleQuoteStyle",records:[{value:'""',description:`Uses '"' instead of smart double quotes`},{value:"\u201C\u201D",description:"Uses '\u201C' and '\u201D' instead of straight double quotes"}]})]}};Wr=A([v.register],Wr);var Ql=class{},Ur=class extends v{constructor(){super({nameKey:"rules.re-index-footnotes.name",descriptionKey:"rules.re-index-footnotes.description",type:"Footnote",ruleIgnoreTypes:[h.code,h.inlineCode,h.math,h.yaml,h.link,h.wikiLink,h.tag]})}get OptionsClass(){return Ql}apply(t,i){return Du(t)}get exampleBuilders(){return[new y({description:"Re-indexing footnotes after having deleted previous footnotes",before:m`
+ Lorem ipsum at aliquet felis.[^3] Donec dictum turpis quis pellentesque,[^5] et iaculis tortor condimentum.
+ ${""}
+ [^3]: first footnote
+ [^5]: second footnote
+ `,after:m`
+ Lorem ipsum at aliquet felis.[^1] Donec dictum turpis quis pellentesque,[^2] et iaculis tortor condimentum.
+ ${""}
+ [^1]: first footnote
+ [^2]: second footnote
+ `}),new y({description:"Re-indexing footnotes after inserting a footnote between",before:m`
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit.[^1] Aenean at aliquet felis. Donec dictum turpis quis ipsum pellentesque, et iaculis tortor condimentum.[^1a] Vestibulum nec blandit felis, vulputate finibus purus.[^2] Praesent quis iaculis diam.
+ ${""}
+ [^1]: first footnote
+ [^1a]: third footnote, inserted later
+ [^2]: second footnotes
+ `,after:m`
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit.[^1] Aenean at aliquet felis. Donec dictum turpis quis ipsum pellentesque, et iaculis tortor condimentum.[^2] Vestibulum nec blandit felis, vulputate finibus purus.[^3] Praesent quis iaculis diam.
+ ${""}
+ [^1]: first footnote
+ [^2]: third footnote, inserted later
+ [^3]: second footnotes
+ `}),new y({description:"Re-indexing footnotes preserves multiple references to the same footnote index",before:m`
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit.[^1] Aenean at aliquet felis. Donec dictum turpis quis ipsum pellentesque, et iaculis tortor condimentum.[^1a] Vestibulum nec blandit felis, vulputate finibus purus.[^2] Praesent quis iaculis diam.[^1]
+ ${""}
+ [^1]: first footnote
+ [^1a]: third footnote, inserted later
+ [^2]: second footnotes
+ `,after:m`
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit.[^1] Aenean at aliquet felis. Donec dictum turpis quis ipsum pellentesque, et iaculis tortor condimentum.[^2] Vestibulum nec blandit felis, vulputate finibus purus.[^3] Praesent quis iaculis diam.[^1]
+ ${""}
+ [^1]: first footnote
+ [^2]: third footnote, inserted later
+ [^3]: second footnotes
+ `}),new y({description:"Re-indexing footnotes condense duplicate footnotes into 1 when key and footnote are the same",before:m`
+ bla[^1], bla[^1], bla[^2]
+ [^1]: bla
+ [^1]: bla
+ [^2]: bla
+ `,after:m`
+ bla[^1], bla[^1], bla[^2]
+ [^1]: bla
+ [^2]: bla
+ `})]}get optionBuilders(){return[]}};Ur=A([v.register],Ur);var Zl=class{},Vr=class extends v{constructor(){super({nameKey:"rules.remove-consecutive-list-markers.name",descriptionKey:"rules.remove-consecutive-list-markers.description",type:"Content",ruleIgnoreTypes:[h.code,h.math,h.yaml,h.link,h.wikiLink,h.tag]})}get OptionsClass(){return Zl}apply(t,i){return t.replace(/^([ |\t]*)- - \b/gm,"$1- ")}get exampleBuilders(){return[new y({description:"Removing consecutive list markers.",before:m`
+ - item 1
+ - - copypasted item A
+ - item 2
+ - indented item
+ - - copypasted item B
+ `,after:m`
+ - item 1
+ - copypasted item A
+ - item 2
+ - indented item
+ - copypasted item B
+ `})]}get optionBuilders(){return[]}};Vr=A([v.register],Vr);var Jl=class{},Gr=class extends v{constructor(){super({nameKey:"rules.remove-empty-lines-between-list-markers-and-checklists.name",descriptionKey:"rules.remove-empty-lines-between-list-markers-and-checklists.description",type:"Spacing",ruleIgnoreTypes:[h.code,h.math,h.yaml,h.link,h.wikiLink,h.tag,h.thematicBreak]});this.replaceEmptyLinesBetweenList=function(i,n){let r=new RegExp(`^${n}
+{2,}${n}$`,"gm"),a,s=i;do a=s.match(r),s=s.replaceAll(r,`$1
+$4`);while(a);return s}}get OptionsClass(){return Jl}apply(i,n){let r=`(( |\\t)*- ${wt}( |\\t)+.+)`;i=this.replaceEmptyLinesBetweenList(i,r);let a="(( |\\t)*\\d+\\.( |\\t)+.+)";i=this.replaceEmptyLinesBetweenList(i,a);let s="(( |\\t)*\\+( |\\t)+.+)";i=this.replaceEmptyLinesBetweenList(i,s);let o=`(( |\\t)*-(?! ${wt})( |\\t)+.+)`;i=this.replaceEmptyLinesBetweenList(i,o);let l="(( |\\t)*\\*( |\\t)+.+)";return this.replaceEmptyLinesBetweenList(i,l)}get exampleBuilders(){return[new y({description:"Blank lines are removed between ordered list items",before:m`
+ 1. Item 1
+ ${""}
+ 2. Item 2
+ `,after:m`
+ 1. Item 1
+ 2. Item 2
+ `}),new y({description:"Blank lines are removed between list items when the list indicator is '-'",before:m`
+ - Item 1
+ ${""}
+ \t- Subitem 1
+ ${""}
+ - Item 2
+ `,after:m`
+ - Item 1
+ \t- Subitem 1
+ - Item 2
+ `}),new y({description:"Blank lines are removed between checklist items",before:m`
+ - [x] Item 1
+ ${""}
+ \t- [!] Subitem 1
+ ${""}
+ - [ ] Item 2
+ `,after:m`
+ - [x] Item 1
+ \t- [!] Subitem 1
+ - [ ] Item 2
+ `}),new y({description:"Blank lines are removed between list items when the list indicator is '+'",before:m`
+ + Item 1
+ ${""}
+ \t+ Subitem 1
+ ${""}
+ + Item 2
+ `,after:m`
+ + Item 1
+ \t+ Subitem 1
+ + Item 2
+ `}),new y({description:"Blank lines are removed between list items when the list indicator is '*'",before:m`
+ * Item 1
+ ${""}
+ \t* Subitem 1
+ ${""}
+ * Item 2
+ `,after:m`
+ * Item 1
+ \t* Subitem 1
+ * Item 2
+ `}),new y({description:"Blanks lines are removed between like list types (ordered, specific list item indicators, and checklists) while blanks are left between different kinds of list item indicators",before:m`
+ 1. Item 1
+ ${""}
+ 2. Item 2
+ ${""}
+ - Item 1
+ ${""}
+ \t- Subitem 1
+ ${""}
+ - Item 2
+ ${""}
+ - [x] Item 1
+ ${""}
+ \t- [f] Subitem 1
+ ${""}
+ - [ ] Item 2
+ ${""}
+ + Item 1
+ ${""}
+ \t+ Subitem 1
+ ${""}
+ + Item 2
+ ${""}
+ * Item 1
+ ${""}
+ \t* Subitem 1
+ ${""}
+ * Item 2
+ `,after:m`
+ 1. Item 1
+ 2. Item 2
+ ${""}
+ - Item 1
+ \t- Subitem 1
+ - Item 2
+ ${""}
+ - [x] Item 1
+ \t- [f] Subitem 1
+ - [ ] Item 2
+ ${""}
+ + Item 1
+ \t+ Subitem 1
+ + Item 2
+ ${""}
+ * Item 1
+ \t* Subitem 1
+ * Item 2
+ `})]}get optionBuilders(){return[]}};Gr=A([v.register],Gr);var Xl=class{},Qr=class extends v{constructor(){super({nameKey:"rules.remove-empty-list-markers.name",descriptionKey:"rules.remove-empty-list-markers.description",type:"Content",ruleIgnoreTypes:[h.code,h.math,h.yaml,h.link,h.wikiLink,h.tag]})}get OptionsClass(){return Xl}apply(t,i){let n=new RegExp(`^${or}(-|\\*|\\+|\\d+[.)]|- (\\[(.)\\]))\\s*?$`,"gm");return t=t.replace(new RegExp(n.source+"\\n","gm"),""),t=t.replace(new RegExp("\\n"+n.source,"gm"),""),t.replace(n,"")}get exampleBuilders(){return[new y({description:"Removes empty list markers.",before:m`
+ - item 1
+ -
+ - item 2
+ ${""}
+ * list 2 item 1
+ *
+ * list 2 item 2
+ ${""}
+ + list 3 item 1
+ +
+ + list 3 item 2
+ `,after:m`
+ - item 1
+ - item 2
+ ${""}
+ * list 2 item 1
+ * list 2 item 2
+ ${""}
+ + list 3 item 1
+ + list 3 item 2
+ `}),new y({description:"Removes empty ordered list markers.",before:m`
+ 1. item 1
+ 2.
+ 3. item 2
+ ${""}
+ 1. list 2 item 1
+ 2. list 2 item 2
+ 3. ${""}
+ ${""}
+ _Note that this rule does not make sure that the ordered list is sequential after removal_
+ `,after:m`
+ 1. item 1
+ 3. item 2
+ ${""}
+ 1. list 2 item 1
+ 2. list 2 item 2
+ ${""}
+ _Note that this rule does not make sure that the ordered list is sequential after removal_
+ `}),new y({description:"Removes empty checklist markers.",before:m`
+ - [ ] item 1
+ - [x]
+ - [ ] item 2
+ - [ ] ${""}
+ ${""}
+ _Note that this will affect checked and uncheck checked list items_
+ `,after:m`
+ - [ ] item 1
+ - [ ] item 2
+ ${""}
+ _Note that this will affect checked and uncheck checked list items_
+ `}),new y({description:"Removes empty list, checklist, and ordered list markers in callouts/blockquotes",before:m`
+ > Checklist in blockquote
+ > - [ ] item 1
+ > - [x]
+ > - [ ] item 2
+ > - [ ] ${""}
+ ${""}
+ > Ordered List in blockquote
+ > > 1. item 1
+ > > 2.
+ > > 3. item 2
+ > > 4. ${""}
+ ${""}
+ > Regular lists in blockquote
+ >
+ > - item 1
+ > -
+ > - item 2
+ >
+ > List 2
+ >
+ > * item 1
+ > *
+ > * list 2 item 2
+ >
+ > List 3
+ >
+ > + item 1
+ > +
+ > + item 2
+ `,after:m`
+ > Checklist in blockquote
+ > - [ ] item 1
+ > - [ ] item 2
+ ${""}
+ > Ordered List in blockquote
+ > > 1. item 1
+ > > 3. item 2
+ ${""}
+ > Regular lists in blockquote
+ >
+ > - item 1
+ > - item 2
+ >
+ > List 2
+ >
+ > * item 1
+ > * list 2 item 2
+ >
+ > List 3
+ >
+ > + item 1
+ > + item 2
+ `})]}get optionBuilders(){return[]}};Qr=A([v.register],Qr);var ec=class{},Zr=class extends v{constructor(){super({nameKey:"rules.remove-hyphenated-line-breaks.name",descriptionKey:"rules.remove-hyphenated-line-breaks.description",type:"Content",ruleIgnoreTypes:[h.code,h.math,h.yaml,h.link,h.wikiLink,h.tag]})}get OptionsClass(){return ec}apply(t,i){return t.replace(/\b[-‐] \b/g,"")}get exampleBuilders(){return[new y({description:"Removing hyphenated line breaks.",before:m`
+ This text has a linebr‐ eak.
+ `,after:m`
+ This text has a linebreak.
+ `})]}get optionBuilders(){return[]}};Zr=A([v.register],Zr);var ic=class{},Rt=class extends v{constructor(){super({nameKey:"rules.remove-hyphens-on-paste.name",descriptionKey:"rules.remove-hyphens-on-paste.description",type:"Paste"})}get OptionsClass(){return ic}apply(t,i){return t.replace(/([^\s-])[-‐]\s+\n?(?=\w)/g,"$1")}get exampleBuilders(){return[new y({description:"Remove hyphen in content to paste",before:m`
+ Text that was cool but hyper-
+ tension made it uncool.
+ `,after:m`
+ Text that was cool but hypertension made it uncool.
+ `})]}get optionBuilders(){return[]}};Rt=A([v.register],Rt);var tc=class{},Dt=class extends v{constructor(){super({nameKey:"rules.remove-leading-or-trailing-whitespace-on-paste.name",descriptionKey:"rules.remove-leading-or-trailing-whitespace-on-paste.description",type:"Paste"})}get OptionsClass(){return tc}apply(t,i){return t.replace(/^[\n ]+|\s+$/g,"")}get exampleBuilders(){return[new y({description:"Removes leading spaces and newline characters",before:m`
+ ${""}
+ ${""}
+ This text was really indented
+ ${""}
+ `,after:m`
+ This text was really indented
+ `}),new y({description:"Leaves leading tabs alone",before:m`
+ ${""}
+ ${""}
+ \t\tThis text is really indented
+ ${""}
+ `,after:" This text is really indented"})]}get optionBuilders(){return[]}};Dt=A([v.register],Dt);var nc=class{},Nt=class extends v{constructor(){super({nameKey:"rules.remove-leftover-footnotes-from-quote-on-paste.name",descriptionKey:"rules.remove-leftover-footnotes-from-quote-on-paste.description",ruleIgnoreTypes:[h.wikiLink,h.link,h.image],type:"Paste"})}get OptionsClass(){return nc}apply(t,i){return t.replace(/(\D)[.,]\d+/g,"$1")}get exampleBuilders(){return[new y({description:"Footnote reference removed",before:m`
+ He was sure that he would get off without doing any time, but the cops had other plans.50
+ ${""}
+ _Note that the format for footnote references to remove is a dot or comma followed by any number of digits_
+ `,after:m`
+ He was sure that he would get off without doing any time, but the cops had other plans
+ ${""}
+ _Note that the format for footnote references to remove is a dot or comma followed by any number of digits_
+ `}),new y({description:"Footnote reference removal does not affect links",before:m`
+ [[Half is .5]]
+ [Half is .5](HalfIs.5.md)
+ 
+ ![[Half is .5.jpg]]
+ `,after:m`
+ [[Half is .5]]
+ [Half is .5](HalfIs.5.md)
+ 
+ ![[Half is .5.jpg]]
+ `})]}get optionBuilders(){return[]}};Nt=A([v.register],Nt);var rc=class{},Jr=class extends v{constructor(){super({nameKey:"rules.remove-link-spacing.name",descriptionKey:"rules.remove-link-spacing.description",type:"Spacing"})}get OptionsClass(){return rc}apply(t,i){return t=Ku(t),gp(t)}get exampleBuilders(){return[new y({description:"Space in regular markdown link text",before:m`
+ [ here is link text1 ](link_here)
+ [ here is link text2](link_here)
+ [here is link text3 ](link_here)
+ [here is link text4](link_here)
+ [\there is link text5\t](link_here)
+ [](link_here)
+ **Note that image markdown syntax does not get affected even if it is transclusion:**
+ 
+ `,after:m`
+ [here is link text1](link_here)
+ [here is link text2](link_here)
+ [here is link text3](link_here)
+ [here is link text4](link_here)
+ [here is link text5](link_here)
+ [](link_here)
+ **Note that image markdown syntax does not get affected even if it is transclusion:**
+ 
+ `}),new y({description:"Space in wiki link text",before:m`
+ [[link_here| here is link text1 ]]
+ [[link_here|here is link text2 ]]
+ [[link_here| here is link text3]]
+ [[link_here|here is link text4]]
+ [[link_here|\there is link text5\t]]
+ ![[link_here|\there is link text6\t]]
+ [[link_here]]
+ `,after:m`
+ [[link_here|here is link text1]]
+ [[link_here|here is link text2]]
+ [[link_here|here is link text3]]
+ [[link_here|here is link text4]]
+ [[link_here|here is link text5]]
+ ![[link_here|here is link text6]]
+ [[link_here]]
+ `})]}get optionBuilders(){return[]}};Jr=A([v.register],Jr);var ac=class{},jt=class extends v{constructor(){super({nameKey:"rules.remove-multiple-blank-lines-on-paste.name",descriptionKey:"rules.remove-multiple-blank-lines-on-paste.description",type:"Paste"})}get OptionsClass(){return ac}apply(t,i){return t.replace(/\n{3,}/g,`
+
+`)}get exampleBuilders(){return[new y({description:"Multiple blanks lines condensed down to one",before:m`
+ Here is the first line.
+ ${""}
+ ${""}
+ ${""}
+ ${""}
+ Here is some more text.
+ `,after:m`
+ Here is the first line.
+ ${""}
+ Here is some more text.
+ `}),new y({description:"Text with only one blank line in a row is left alone",before:m`
+ First line.
+ ${""}
+ Last line.
+ `,after:m`
+ First line.
+ ${""}
+ Last line.
+ `})]}get optionBuilders(){return[]}};jt=A([v.register],jt);var sc=class{},Xr=class extends v{constructor(){super({nameKey:"rules.remove-multiple-spaces.name",descriptionKey:"rules.remove-multiple-spaces.description",type:"Content",ruleIgnoreTypes:[h.code,h.inlineCode,h.math,h.inlineMath,h.yaml,h.link,h.wikiLink,h.tag,h.table]})}get OptionsClass(){return sc}apply(t,i){return t=t.replace(/(?!^>)([^\s])( ){2,}([^\s])/gm,"$1 $3"),t}get exampleBuilders(){return[new y({description:"Removing double and triple space.",before:m`
+ Lorem ipsum dolor sit amet.
+ `,after:m`
+ Lorem ipsum dolor sit amet.
+ `})]}get optionBuilders(){return[]}};Xr=A([v.register],Xr);var Kt=class{constructor(){this.includeFullwidthForms=!0;this.includeCJKSymbolsAndPunctuation=!0;this.includeDashes=!0;this.otherSymbols=""}},ea=class extends v{constructor(){super({nameKey:"rules.remove-space-around-characters.name",descriptionKey:"rules.remove-space-around-characters.description",type:"Spacing",ruleIgnoreTypes:[h.code,h.inlineCode,h.math,h.yaml,h.link,h.wikiLink,h.tag]})}get OptionsClass(){return Kt}apply(t,i){let n="";if(i.includeFullwidthForms&&(n+="\uFF01-\uFF5E"),i.includeCJKSymbolsAndPunctuation&&(n+="\u3000-\u30FF"),i.includeDashes&&(n+="\u2013\u2014"),n+=lr(i.otherSymbols),!n)return t;let r=new RegExp(`([ ])+([${n}])`,"g"),a=new RegExp(`([${n}])([ ])+`,"g"),s=function(l){return l.replace(r,"$2").replace(a,"$1")},o=ze([h.list],t,s);return o=gs(o,s),o}get exampleBuilders(){return[new y({description:"Remove Spaces and Tabs around Fullwidth Characters",before:m`
+ Full list of affected characters: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz,.:;!?"'`^~ ̄_&@#%+-*=<>()[]{}⦅⦆|¦/\¬$£¢₩¥。、「」『』〔〕【】—…–《》〈〉
+ This is a fullwidth period\t 。 with text after it.
+ This is a fullwidth comma\t, with text after it.
+ This is a fullwidth left parenthesis ( \twith text after it.
+ This is a fullwidth right parenthesis ) with text after it.
+ This is a fullwidth colon : with text after it.
+ This is a fullwidth semicolon ; with text after it.
+ Removes space at start of line
+ `,after:m`
+ Full list of affected characters:0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz,.:;!?"'`^~ ̄_&@#%+-*=<>()[]{}⦅⦆|¦/\¬$£¢₩¥。、「」『』〔〕【】—…–《》〈〉
+ This is a fullwidth period。with text after it.
+ This is a fullwidth comma,with text after it.
+ This is a fullwidth left parenthesis(with text after it.
+ This is a fullwidth right parenthesis)with text after it.
+ This is a fullwidth colon:with text after it.
+ This is a fullwidth semicolon;with text after it.
+ Removes space at start of line
+ `}),new y({description:"Fullwidth Characters in List Do not Affect List Markdown Syntax",before:m`
+ # List indicators should not have the space after them removed if they are followed by a fullwidth character
+ ${""}
+ - [ contents here]
+ - [ more contents here] more text here
+ + [ another item here]
+ * [ one last item here]
+ ${""}
+ # Nested in a blockquote
+ ${""}
+ > - [ contents here]
+ > - [ more contents here] more text here
+ > + [ another item here]
+ > * [ one last item here]
+ ${""}
+ # Doubly nested in a blockquote
+ ${""}
+ > The following is doubly nested
+ > > - [ contents here]
+ > > - [ more contents here] more text here
+ > > + [ another item here]
+ > > * [ one last item here]
+ `,after:m`
+ # List indicators should not have the space after them removed if they are followed by a fullwidth character
+ ${""}
+ - [contents here]
+ - [more contents here]more text here
+ + [another item here]
+ * [one last item here]
+ ${""}
+ # Nested in a blockquote
+ ${""}
+ > - [contents here]
+ > - [more contents here]more text here
+ > + [another item here]
+ > * [one last item here]
+ ${""}
+ # Doubly nested in a blockquote
+ ${""}
+ > The following is doubly nested
+ > > - [contents here]
+ > > - [more contents here]more text here
+ > > + [another item here]
+ > > * [one last item here]
+ `})]}get optionBuilders(){return[new Z({nameKey:"rules.remove-space-around-characters.include-fullwidth-forms.name",descriptionKey:"rules.remove-space-around-characters.include-fullwidth-forms.description",OptionsClass:Kt,optionsKey:"includeFullwidthForms"}),new Z({nameKey:"rules.remove-space-around-characters.include-cjk-symbols-and-punctuation.name",descriptionKey:"rules.remove-space-around-characters.include-cjk-symbols-and-punctuation.description",OptionsClass:Kt,optionsKey:"includeCJKSymbolsAndPunctuation"}),new Z({nameKey:"rules.remove-space-around-characters.include-dashes.name",descriptionKey:"rules.remove-space-around-characters.include-dashes.description",OptionsClass:Kt,optionsKey:"includeDashes"}),new Pe({nameKey:"rules.remove-space-around-characters.other-symbols.name",descriptionKey:"rules.remove-space-around-characters.other-symbols.description",OptionsClass:Kt,optionsKey:"otherSymbols"})]}};ea=A([v.register],ea);var ta=class{constructor(){this.charactersToRemoveSpacesBefore=",!?;:).\u2019\u201D]";this.charactersToRemoveSpacesAfter="\xBF\xA1\u2018\u201C(["}},ia=class extends v{constructor(){super({nameKey:"rules.remove-space-before-or-after-characters.name",descriptionKey:"rules.remove-space-before-or-after-characters.description",type:"Spacing",ruleIgnoreTypes:[h.code,h.math,h.yaml,h.link,h.wikiLink,h.tag]})}get OptionsClass(){return ta}apply(t,i){let n=lr(i.charactersToRemoveSpacesBefore),r=lr(i.charactersToRemoveSpacesAfter);if(!n&&!r)return t;let a=new RegExp(`([ ])+([${n}])`,"g"),s=new RegExp(`([${r}])([ ])+`,"g"),o=function(c){return c.replace(a,"$2").replace(s,"$1")},l=ze([h.list,h.html],t,o);return l=gs(l,o),l}get exampleBuilders(){return[new y({description:"Remove Spaces and Tabs Before and After Default Symbol Set",before:m`
+ In the end , the space gets removed\t .
+ The space before the question mark was removed right ?
+ The space before the exclamation point gets removed !
+ A semicolon ; and colon : have spaces removed before them
+ ‘ Text in single quotes ’
+ “ Text in double quotes ”
+ [ Text in square braces ]
+ ( Text in parenthesis )
+ `,after:m`
+ In the end, the space gets removed.
+ The space before the question mark was removed right?
+ The space before the exclamation point gets removed!
+ A semicolon; and colon: have spaces removed before them
+ ‘Text in single quotes’
+ “Text in double quotes”
+ [Text in square braces]
+ (Text in parenthesis)
+ `})]}get optionBuilders(){return[new Pe({nameKey:"rules.remove-space-before-or-after-characters.characters-to-remove-space-before.name",descriptionKey:"rules.remove-space-before-or-after-characters.characters-to-remove-space-before.description",OptionsClass:ta,optionsKey:"charactersToRemoveSpacesBefore"}),new Pe({nameKey:"rules.remove-space-before-or-after-characters.characters-to-remove-space-after.name",descriptionKey:"rules.remove-space-before-or-after-characters.characters-to-remove-space-after.description",OptionsClass:ta,optionsKey:"charactersToRemoveSpacesAfter"})]}};ia=A([v.register],ia);var Qs=class{constructor(){this.punctuationToRemove=".,;:!\u3002\uFF0C\uFF1B\uFF1A\uFF01"}},na=class extends v{constructor(){super({nameKey:"rules.remove-trailing-punctuation-in-heading.name",descriptionKey:"rules.remove-trailing-punctuation-in-heading.description",type:"Heading",ruleIgnoreTypes:[h.code,h.math,h.yaml]})}get OptionsClass(){return Qs}apply(t,i){return t.replaceAll(Xi,(n,r="",a="",s="",o="",l="")=>{if(o==""||o.match(lp))return n;let c=o.trimEnd(),d=c.charAt(c.length-1);return i.punctuationToRemove.includes(d)?r+a+s+o.substring(0,c.length-1)+o.substring(c.length)+l:n})}get exampleBuilders(){return[new y({description:"Removes punctuation from the end of a heading",before:m`
+ # Heading ends in a period.
+ ## Other heading ends in an exclamation mark! ##
+ `,after:m`
+ # Heading ends in a period
+ ## Other heading ends in an exclamation mark ##
+ `}),new y({description:"HTML Entities at the end of a heading is ignored",before:m`
+ # Heading 1
+ ## Heading &
+ `,after:m`
+ # Heading 1
+ ## Heading &
+ `}),new y({description:"Removes punctuation from the end of a heading when followed by whitespace",before:m`
+ # Heading 1!${" "}
+ ## Heading 2.\t
+ `,after:m`
+ # Heading 1${" "}
+ ## Heading 2\t
+ `})]}get optionBuilders(){return[new Pe({OptionsClass:Qs,nameKey:"rules.remove-trailing-punctuation-in-heading.punctuation-to-remove.name",descriptionKey:"rules.remove-trailing-punctuation-in-heading.punctuation-to-remove.description",optionsKey:"punctuationToRemove"})]}};na=A([v.register],na);var Zs=class{constructor(){this.yamlKeysToRemove=[]}},ra=class extends v{constructor(){super({nameKey:"rules.remove-yaml-keys.name",descriptionKey:"rules.remove-yaml-keys.description",type:"YAML"})}get OptionsClass(){return Zs}apply(t,i){let n=i.yamlKeysToRemove;if(n.length===0)return t;let r=hn(t);if(r===null)return t;let a=r;for(let s of n){let o=s.trim();o.endsWith(":")&&(o=o.substring(0,o.length-1)),a=kt(a,o)}return t.replace(r,a)}get exampleBuilders(){return[new y({description:'Removes the values specified in `YAML Keys to Remove` = "status:\nkeywords\ndate"',before:m`
+ ---
+ language: Typescript
+ type: programming
+ tags: computer
+ keywords:
+ - keyword1
+ - keyword2
+ status: WIP
+ date: 02/15/2022
+ ---
+ ${""}
+ # Header Context
+ ${""}
+ Text
+ `,after:m`
+ ---
+ language: Typescript
+ type: programming
+ tags: computer
+ ---
+ ${""}
+ # Header Context
+ ${""}
+ Text
+ `,options:{yamlKeysToRemove:["status:","keywords","date"]}})]}get optionBuilders(){return[new xe({OptionsClass:Zs,nameKey:"rules.remove-yaml-keys.yaml-keys-to-remove.name",descriptionKey:"rules.remove-yaml-keys.yaml-keys-to-remove.description",optionsKey:"yamlKeysToRemove"})]}};ra=A([v.register],ra);var oc=class{},aa=class extends v{constructor(){super({nameKey:"rules.space-after-list-markers.name",descriptionKey:"rules.space-after-list-markers.description",type:"Spacing",ruleIgnoreTypes:[h.code,h.math,h.yaml,h.link,h.wikiLink,h.tag]})}get OptionsClass(){return oc}apply(t,i){return t=t.replace(/^(\s*\d+\.|\s*[-+*])[^\S\r\n]+/gm,"$1 "),t.replace(/^(\s*\d+\.|\s*[-+*]\s+\[[ xX]\])[^\S\r\n]+/gm,"$1 ")}get exampleBuilders(){return[new y({description:"A single space is left between the list marker and the text of the list item",before:m`
+ 1. Item 1
+ 2. Item 2
+ ${""}
+ - [ ] Item 1
+ - [x] Item 2
+ \t- [ ] Item 3
+ `,after:m`
+ 1. Item 1
+ 2. Item 2
+ ${""}
+ - [ ] Item 1
+ - [x] Item 2
+ \t- [ ] Item 3
+ `})]}get optionBuilders(){return[]}};aa=A([v.register],aa);var lc=class{},sa=class extends v{constructor(){super({nameKey:"rules.space-between-chinese-japanese-or-korean-and-english-or-numbers.name",descriptionKey:"rules.space-between-chinese-japanese-or-korean-and-english-or-numbers.description",type:"Spacing",ruleIgnoreTypes:[h.code,h.inlineCode,h.yaml,h.image,h.link,h.wikiLink,h.tag,h.math,h.inlineMath,h.html]})}get OptionsClass(){return lc}apply(t,i){let n=/(\p{sc=Han}|\p{sc=Katakana}|\p{sc=Hiragana}|\p{sc=Hangul})( *)(\[[^[]*\]\(.*\)|`[^`]*`|\w+|[-+'"([¥$]|\*[^*])/gmu,r=/(\[[^[]*\]\(.*\)|`[^`]*`|\w+|[-+;:'"°%$)\]]|[^*]\*)( *)(\p{sc=Han}|\p{sc=Katakana}|\p{sc=Hiragana}|\p{sc=Hangul})/gmu,a=`${h.link.placeholder}|${h.inlineMath.placeholder}|${h.inlineCode.placeholder}|${h.wikiLink.placeholder}`.replaceAll("{","\\{").replaceAll("}","\\}"),s=new RegExp(`(\\p{sc=Han}|\\p{sc=Katakana}|\\p{sc=Hiragana}|\\p{sc=Hangul})( *)(${a})`,"gmu"),o=new RegExp(`(${a})( *)(\\p{sc=Han}|\\p{sc=Katakana}|\\p{sc=Hiragana}|\\p{sc=Hangul})`,"gmu"),l=function(d){return d.replace(n,"$1 $3").replace(r,"$1 $3")},c=ze([h.italics,h.bold],t,l);return c=c.replace(s,"$1 $3").replace(o,"$1 $3"),c=Yu(c,l),c=Pu(c,l),c}get exampleBuilders(){return[new y({description:"Space between Chinese and English",before:m`
+ 中文字符串english中文字符串。
+ `,after:m`
+ 中文字符串 english 中文字符串。
+ `}),new y({description:"Space between Chinese and link",before:m`
+ 中文字符串[english](http://example.com)中文字符串。
+ `,after:m`
+ 中文字符串 [english](http://example.com) 中文字符串。
+ `}),new y({description:"Space between Chinese and inline code block",before:m`
+ 中文字符串\`code\`中文字符串。
+ `,after:m`
+ 中文字符串 \`code\` 中文字符串。
+ `}),new y({description:"No space between Chinese and English in tag",before:m`
+ #标签A #标签2标签
+ `,after:m`
+ #标签A #标签2标签
+ `}),new y({description:"Make sure that spaces are not added between italics and chinese characters to preserve markdown syntax",before:m`
+ _这是一个数学公式_
+ *这是一个数学公式english*
+ ${""}
+ # Handling bold and italics nested in each other is not supported at this time
+ ${""}
+ **_这是一_个数学公式**
+ *这是一hello__个数学world公式__*
+ `,after:m`
+ _这是一个数学公式_
+ *这是一个数学公式 english*
+ ${""}
+ # Handling bold and italics nested in each other is not supported at this time
+ ${""}
+ **_ 这是一 _ 个数学公式**
+ *这是一 hello__ 个数学 world 公式 __*
+ `}),new y({description:"Images and links are ignored",before:m`
+ [[这是一个数学公式english]]
+ ![[这是一个数学公式english.jpg]]
+ [这是一个数学公式english](这是一个数学公式english.md)
+ 
+ `,after:m`
+ [[这是一个数学公式english]]
+ ![[这是一个数学公式english.jpg]]
+ [这是一个数学公式english](这是一个数学公式english.md)
+ 
+ `}),new y({description:"Space between CJK and English",before:m`
+ 日本語englishひらがな
+ カタカナenglishカタカナ
+ ハンカクカタカナenglish123全角数字
+ 한글english한글
+ `,after:m`
+ 日本語 english ひらがな
+ カタカナ english カタカナ
+ ハンカクカタカナ english123全角数字
+ 한글 english 한글
+ `})]}get optionBuilders(){return[]}};sa=A([v.register],sa);var Js=class{constructor(){this.style="consistent"}},oa=class extends v{constructor(){super({nameKey:"rules.strong-style.name",descriptionKey:"rules.strong-style.description",type:"Content",ruleIgnoreTypes:[h.code,h.yaml,h.link,h.wikiLink,h.tag,h.math,h.inlineMath]})}get OptionsClass(){return Js}apply(t,i){return ms(t,i.style,"strong")}get exampleBuilders(){return[new y({description:"Strong indicators should use underscores when style is set to 'underscore'",before:m`
+ # Strong/Bold Cases
+ ${""}
+ **Test bold**
+ ** Test not bold **
+ This is **bold** mid sentence
+ This is **bold** mid sentence with a second **bold** on the same line
+ This is ***bold and emphasized***
+ This is ***nested bold** and ending emphasized*
+ This is ***nested emphasis* and ending bold**
+ ${""}
+ *Test emphasis*
+ ${""}
+ * List Item1 with **bold text**
+ * List Item2
+ `,after:m`
+ # Strong/Bold Cases
+ ${""}
+ __Test bold__
+ ** Test not bold **
+ This is __bold__ mid sentence
+ This is __bold__ mid sentence with a second __bold__ on the same line
+ This is *__bold and emphasized__*
+ This is *__nested bold__ and ending emphasized*
+ This is __*nested emphasis* and ending bold__
+ ${""}
+ *Test emphasis*
+ ${""}
+ * List Item1 with __bold text__
+ * List Item2
+ `,options:{style:"underscore"}}),new y({description:"Strong indicators should use asterisks when style is set to 'asterisk'",before:m`
+ # Strong/Bold Cases
+ ${""}
+ __Test bold__
+ __ Test not bold __
+ This is __bold__ mid sentence
+ This is __bold__ mid sentence with a second __bold__ on the same line
+ This is ___bold and emphasized___
+ This is ___nested bold__ and ending emphasized_
+ This is ___nested emphasis_ and ending bold__
+ ${""}
+ _Test emphasis_
+ `,after:m`
+ # Strong/Bold Cases
+ ${""}
+ **Test bold**
+ __ Test not bold __
+ This is **bold** mid sentence
+ This is **bold** mid sentence with a second **bold** on the same line
+ This is _**bold and emphasized**_
+ This is _**nested bold** and ending emphasized_
+ This is **_nested emphasis_ and ending bold**
+ ${""}
+ _Test emphasis_
+ `,options:{style:"asterisk"}}),new y({description:"Strong indicators should use consistent style based on first strong indicator in a file when style is set to 'consistent'",before:m`
+ # Strong First Strong Is an Asterisk
+ ${""}
+ **First bold**
+ This is __bold__ mid sentence
+ This is __bold__ mid sentence with a second **bold** on the same line
+ This is ___bold and emphasized___
+ This is *__nested bold__ and ending emphasized*
+ This is **_nested emphasis_ and ending bold**
+ ${""}
+ __Test bold__
+ `,after:m`
+ # Strong First Strong Is an Asterisk
+ ${""}
+ **First bold**
+ This is **bold** mid sentence
+ This is **bold** mid sentence with a second **bold** on the same line
+ This is _**bold and emphasized**_
+ This is ***nested bold** and ending emphasized*
+ This is **_nested emphasis_ and ending bold**
+ ${""}
+ **Test bold**
+ `,options:{style:"consistent"}}),new y({description:"Strong indicators should use consistent style based on first strong indicator in a file when style is set to 'consistent'",before:m`
+ # Strong First Strong Is an Underscore
+ ${""}
+ __First bold__
+ This is **bold** mid sentence
+ This is **bold** mid sentence with a second __bold__ on the same line
+ This is **_bold and emphasized_**
+ This is ***nested bold** and ending emphasized*
+ This is ___nested emphasis_ and ending bold__
+ ${""}
+ **Test bold**
+ `,after:m`
+ # Strong First Strong Is an Underscore
+ ${""}
+ __First bold__
+ This is __bold__ mid sentence
+ This is __bold__ mid sentence with a second __bold__ on the same line
+ This is ___bold and emphasized___
+ This is *__nested bold__ and ending emphasized*
+ This is ___nested emphasis_ and ending bold__
+ ${""}
+ __Test bold__
+ `,options:{style:"consistent"}})]}get optionBuilders(){return[new se({OptionsClass:Js,nameKey:"rules.strong-style.style.name",descriptionKey:"rules.strong-style.style.description",optionsKey:"style",records:[{value:"consistent",description:"Makes sure the first instance of strong is the style that will be used throughout the document"},{value:"asterisk",description:"Makes sure ** is the strong indicator"},{value:"underscore",description:"Makes sure __ is the strong indicator"}]})]}};oa=A([v.register],oa);var Xs=class{constructor(){this.twoSpaceLineBreak=!1}},Yt=class extends v{constructor(){super({nameKey:"rules.trailing-spaces.name",descriptionKey:"rules.trailing-spaces.description",type:"Spacing",hasSpecialExecutionOrder:!0,ruleIgnoreTypes:[h.code,h.math,h.yaml,h.link,h.wikiLink,h.tag]})}get OptionsClass(){return Xs}apply(t,i){return i.twoSpaceLineBreak?(t=t.replace(/(\S)[ \t]$/gm,"$1"),t=t.replace(/(\S)[ \t]{3,}$/gm,"$1"),t=t.replace(/(\S)( ?\t\t? ?)$/gm,"$1"),t):t.replace(/[ \t]+$/gm,"")}get exampleBuilders(){return[new y({description:"Removes trailing spaces and tabs.",before:m`
+ # H1
+ Line with trailing spaces and tabs. ${""}
+ `,after:m`
+ # H1
+ Line with trailing spaces and tabs.
+ `}),new y({description:"With `Two Space Linebreak = true`",before:m`
+ # H1
+ Line with trailing spaces and tabs. ${""}
+ `,after:m`
+ # H1
+ Line with trailing spaces and tabs. ${""}
+ `,options:{twoSpaceLineBreak:!0}})]}get optionBuilders(){return[new Z({OptionsClass:Xs,nameKey:"rules.trailing-spaces.twp-space-line-break.name",descriptionKey:"rules.trailing-spaces.twp-space-line-break.description",optionsKey:"twoSpaceLineBreak"})]}};Yt=A([v.register],Yt);var cc=class{},la=class extends v{constructor(){super({nameKey:"rules.two-spaces-between-lines-with-content.name",descriptionKey:"rules.two-spaces-between-lines-with-content.description",type:"Content",ruleIgnoreTypes:[h.obsidianMultiLineComments,h.yaml,h.table]})}get OptionsClass(){return cc}apply(t,i){return Nu(t)}get exampleBuilders(){return[new y({description:"Make sure two spaces are added to the ends of lines that have content on it and the next line for lists, blockquotes, and paragraphs",before:m`
+ # Heading 1
+ First paragraph stays as the first paragraph
+ ${""}
+ - list item 1
+ - list item 2
+ Continuation of list item 2
+ - list item 3
+ ${""}
+ 1. Item 1
+ 2. Item 2
+ Continuation of item 3
+ 3. Item 3
+ ${""}
+ Paragraph for with link [[other file name]].
+ Continuation *of* the paragraph has \`inline code block\` __in it__.
+ Even more continuation
+ ${""}
+ Paragraph lines that end in
+ Or lines that end in
+ Are left alone
+ Since they mean the same thing
+ ${""}
+ \`\`\` text
+ Code blocks are ignored
+ Even with multiple lines
+ \`\`\`
+ Another paragraph here
+ ${""}
+ > Blockquotes are affected
+ > More content here
+ Content here
+ ${""}
+
+
+等等这样子的,左括号是一个被尖尖号包起来的单词,表示开始,然后是一些要做的事(可以有很多行),右括号比左括号多一个“/”,表示结束。
+
+你不需要知道这些标签的意思,但你要知道他们是一个整体,因此当你要复制一些东西的时候,要从“左括号”开始到“右括号”结束整体复制。你还需要知道它们像括号一样,也是可以一层套一层嵌套的。
+
+你要做少量修改的时候,先用文件管理器全文搜索的方法,定位到你要改的文件,然后打开该文件定位到要改的内容。只改内容的文本文字(或某些URL地址),不要改动这些标签,那你就是安全的,不会把你的网站给弄崩溃。
+
+有了这点“关于代码的知识”,就够用了。这样你也可以少量修改菜单所对应的那几个HTML文件了。
+
+比如,你可能注意到在我的博客主页大标题下面,有三个快速链接按钮。这是我出于自己的需要,用不太规范的代码简单写出来的。如果你不想要这几个按钮,或者要改它们的文字和链接,请打开index.html文件,删除或修改第7到23行整段的内容即可(我已经贴心地在这一段前面写了 的注释字样)。
+
+OK,恭喜你!到此为止,你已经基本玩转Github或Gitee的Page个人博客网站了。
+
+接下去,你有兴趣继续玩下去的话,可能还有两件事情要关心一下:
+
+评论系统
+独立域名
+我们将在《在Github/Gitee上搭建免费个人网站和博客(延伸篇)》中说说这两件事。
diff --git "a/_posts/2023-10-30-\345\260\217\345\206\260\346\262\263\346\234\237\345\257\271\345\216\206\345\217\262\347\232\204\345\275\261\345\223\215.md" "b/_posts/2023-10-30-\345\260\217\345\206\260\346\262\263\346\234\237\345\257\271\345\216\206\345\217\262\347\232\204\345\275\261\345\223\215.md"
new file mode 100644
index 00000000000..dd44bb9f819
--- /dev/null
+++ "b/_posts/2023-10-30-\345\260\217\345\206\260\346\262\263\346\234\237\345\257\271\345\216\206\345\217\262\347\232\204\345\275\261\345\223\215.md"
@@ -0,0 +1,24 @@
+---
+layout: post
+title: 小冰河期对历史的影响
+subtitle: 气候变化导致了明朝的灭亡
+date: 2023-10-30
+author: ajiao
+header-img: img/post-bg-alibaba.jpg
+catalog: true
+tags:
+ - 学习
+---
+气候变化导致了明朝的灭亡。之所以这么说是因为气候变化影响农业经济水平,农业经济水平影响人类温饱程度,人类温饱程度是社会稳定的保障,社会稳定与否制约着历史发展进程。曾有四次小冰河期气候对中国历史进程产生了重要影响:
+
+第一次:商朝末年到西周末年(公元前1046年-公元前771年)。寒冷气候导致农作物减产;社会动荡,民不聊生,战乱频繁;人口减少。最终致使政权出现交替,周灭商,西夷犬戎部落攻陷镐京。
+
+第二次:东汉末年、三国、西晋末年(公元184年-317年)。寒冷气候导致农作物减产;战乱再次扫荡中外;人口减少。东汉末年发生黄巾大起义;后来,三国群雄争霸;五胡乱华,汉族南迁建立东晋政权。
+
+第三次:唐末、五代、北宋初(公元907年-960年)。气温剧降,粮食大量减产;形成几十年的社会剧烈动荡和战乱;人口减少。黄巢起义;五代十国大乱世;政权交替:北宋建立。
+
+第四次:明末(公元1600年--1644年)。气温剧降,粮食大量减产;长期的饥荒,战乱频发;人口减少。明末农民起义,游牧民族满清入侵,政权交替:满清政权建立。
+
+这四次小冰河期有一个共同的特点:气温剧降,造成北方干旱,粮食大量减产,形成几十年的社会剧烈动荡和战乱,导致政权交替。气温剧降对南方影响不是很大,但对蒙古草原、东北、西北、华北影响巨大,游牧民族开始向条件比较好的南方掠夺。本地人谋生本来就不容易,又跑来那么多人抢饭碗,而且都抱着必死的决心来抢,其武力值可想而知,被抢的人也只能向南迁徙掠夺。
+
+起义、叛乱和战争加剧了本来已经很严重的社会经济危机,形成恶性循环,环境影响就像是“蝴蝶效应”一样,使明朝灭亡成为一种必然的结果。
diff --git "a/_posts/2023-10-30-\345\274\240\345\261\205\346\255\243\344\270\216\344\270\207\345\216\206\347\232\207\345\270\235.md" "b/_posts/2023-10-30-\345\274\240\345\261\205\346\255\243\344\270\216\344\270\207\345\216\206\347\232\207\345\270\235.md"
new file mode 100644
index 00000000000..b649405df9c
--- /dev/null
+++ "b/_posts/2023-10-30-\345\274\240\345\261\205\346\255\243\344\270\216\344\270\207\345\216\206\347\232\207\345\270\235.md"
@@ -0,0 +1,95 @@
+---
+layout: post
+title: 读书笔记:张居正与万历皇帝
+subtitle: 《万历十五年》读书分享会发言稿
+date: 2023-10-30
+author: 任婧
+header-img: img/post-bg-3.jpg
+catalog: true
+tags:
+ - 学习
+---
+
+各位领导,各位书友: 大家下午好,我来自渭南市档案馆,我叫任婧,很高兴今天能在这里和大家交流分享。
+
+
+# 我想首先展开第一个问题,什么是《万历十五年》?
+1976年的夏天,58岁的华裔美籍历史学家黄仁宇先生用英文完成了一部作品《1587,无关紧要的一年》,其中文名为《万历十五年》。这一年,是美国建国二百周年,也是中国的“文革”结束的一年。
+
+> 时间往前推400年,公元1587年,按中国传统纪年,是明神宗万历十五年,表面上似乎是四海升平,无事可记,正如这部作品的英文名,是无关紧要的一年。但在这一年发生的许多琐细小事,却如大风起于青萍之末一般成为帝国走向崩溃的前兆。
+> 元辅张居正已去世五年,海瑞在这一年也故去了,一代名将戚继光在年底殁了,时年29岁的后来的清太祖努尔哈赤在白山黑水间崛起,却并未引起明朝当局的重视与警惕;西班牙无敌舰队即出征英吉利,揭开世界历史新的一页。这一年,距离李自成攻破北京剩57年,距离鸦片战争剩253年。这一年后的1588年,万历皇帝此生再也没有踏出过紫禁城一步,心灰意冷地成了紫禁城最尊贵的囚徒。
+
+黄仁宇敏锐的捕捉到万历年间表面虽似末端小节,实则为后世历史的发展埋下重要于伏笔的事件。在作者的眼中,这些事件相互关联,互为因果,均是历史的重点。他以这一年为转折,认为1587年以后,大明朝已经走向死路。
+
+ 1587年3月2日,有消息称“皇帝陛下要举行午朝大典”,文武百官不敢怠慢,立即奔赴皇城……全体在京官员数以千计均受骗上当,实在令人大惑不解。最后发现竟然是以讹传讹,万历皇帝考虑到此事有损朝廷体统,最终采取对在京全部官员罚俸两个月的奉禄而告终。这一戏剧性事件的发生,却恰恰反映了当时朝廷内部上下政令不顺、各部门不能尽职尽责的混乱局面。
+
+黄仁宇以1587,即万历十五年发生的讹传皇帝陛下召集午朝一事作为开篇。分七个章节,围绕万历皇帝、申时行、张居正、海瑞、戚继光、李贽六个重要历史人物的故事而展开。其中前面四章基本上是在讲万历皇帝和他前后两任首辅——张居正和申时行的故事,内容涉及万历皇帝的日常生活,包括他的苦恼,以及跟臣僚之间的关系,讨论了明代宫廷政治和皇权运行的特点。第五章讲海瑞,后代人们称他为海青天,是一个模范官僚,但在黄仁宇看来,海瑞并不是像我们想象的那样,其实在当时算不上是一个值得效仿的官员。在这章,还涉及明代的地方行政与财政。第六章谈戚继光,涉及到明代的军事与国防。第七章谈李贽,论及明代的思想文化。
+
+值得注意的是,他写出的六个人代表了六种身份,六种层级。万历皇帝表面是至高无上的统治者,其实是帝国制度的象征;申时行代表满腹经纶却中庸保守的文官集团,张居正是胸怀抱负、铁腕激进的改革者,海瑞则是不合群的道德标杆,戚继光是战功赫赫的武将,李贽是在当时标新立异的思想家。这六个人物都深受当时伦理道德和官僚体制的束缚,最后的遭遇都是不幸的,或身败,或名裂,没有一个人功德圆满。
+
+黄仁宇认为,他们代表了在腐朽的国家机器面前必然会产生的六种失败,这构成了明末的大失败。 一叶知秋、见微知著,以1587一年,以六个人物,点破一个朝代的命运。虽说名为万历十五年,然而全书内容却俯瞰了整个明朝的兴衰。在《万历十五年》之前,从没有人这样写历史。读罢此书,最大的感受就是,历史的车轮纵然巨大,但是细细拆解开来,究其源头,是由人构成的,是人的细节、感情、欲望所驱动的。 书中黄仁宇纵贯他的几乎所有历史著作的“大历史观”初现端倪,即“叙事不妨细致,但是结论却要看远不顾近”。
+
+# 第二个问题,《万历十五年》中,万历皇帝和张居正的相爱相杀。
+因为时间原因,我对书中的其他人物的描写暂且不多费口舌,仅就万历皇帝、张居正及二人的关系,在此和大家进行一个简单的探讨。
+
+ 在我们的印象中,皇帝应该是至高无上的,所谓溥天之下莫非王土,率土之滨莫非王臣。但在这本书里,黄仁宇向我们展示的恰恰相反。皇帝作为个人,作为最高权力的化身,他或许可以宰制天下,甚至为所欲为。但在帝制时代,皇帝首先是一种制度、一种职位,尤其是发展到万历朝的高度发达的文官机制让皇帝甚至成为了一种摆设,一种最高权威和道德标准的象征。
+
+ 万历皇帝1563年出生,大名朱翊钧,9岁就坐上皇位,是明朝的第十三位皇帝,在位48年,万历是他的年号,神宗是他的庙号。按道理说,小小年纪就执掌天下,应该是人生赢家啊,其实不然,他有很多烦恼。
+
+那他的烦恼或者说痛苦都有哪些呢?
+
+**第一个方面就是仪式很多很繁琐。**皇帝在一年中需要做各种各样的礼仪,包括祭祀天地日月、祭祀社稷山川、祭祀祖庙等,此外还有庆元旦、赏端阳、接见朝贡使臣、检阅军队、颁布日历、钦定典籍、册封皇族成员、举行“亲耕”仪式等,这些都耗费皇帝大量的时间和精力。我想如果让我给这位皇帝写一本书,我觉得应该叫《皇帝很忙》吧。 而最让皇帝心烦的,莫过于日复一日、年复一年的“早朝”礼。大家想象一下,一个九岁的孩子,正是爱玩的年纪,却要每天天不亮起床进行早朝,寒冬酷暑,从不间断,我们的孩子、孙子上学还有寒暑假,我们自己上班还有节假日呢。当万历十五年1587年的时候,他已经在位近十六年,可是他才24岁,如果单调、乏味、疲惫、无趣的生活对一个正值冲动的年纪来说,确实是一种酷刑。所以后来即使张居正做了变通,每月逢三、六、九早朝,其他日子不朝。但随着年龄渐长,万历皇帝越发感觉上早朝是件麻烦事,后来干脆就罢工不上朝了,他在位48年,有近30年没有上朝。
+
+**第二个方面就是皇帝的兴趣爱好受到了压制。**万历皇帝在小时候其实是有成为一个好皇帝的志向和资质的,他也愿意被教育成一个仁君。但是即便每天都刻苦学习经史子集,从不中断,他还是得不到他的老师张居正的充分认可和肯定。万历皇帝很喜欢书法,而且造诣了得,很有天赋。但是有一天,张居正不容置疑的对他说:皇上,你这书法练得差不多就行了,别天天练了,练得再好也不能治国呀,万一像宋徽宗啊、李后主这些皇帝玩物丧志,耽误国事甚至成为亡国之君,那就不好了。万历皇帝乖乖听从,此后就只学习治国的内容。当老师,张居正绝对是称职的,他对万历皇帝从出生开始就量身定作了适合他的终身学习计划,学习的每一种教材都是由张居正亲自编写甚至画出插图,有的课程也是由张居正亲自讲授。作为大臣,他也是尽职尽责的,辅政十年,张居正绝对算是励精图治、鞠躬尽瘁吧,但是他没有搞清楚的一点是,君臣有别,尊卑有分,有的时候,没有把握好边界,就会给皇帝和其他文官留下擅权专政、欺凌幼主的印象。
+
+**第三个方面就是在立储的问题上万历皇帝没有自主权。**立储的矛盾主要是在张居正死后,万历皇帝和整个文官集团的。万历这个皇帝很可怜,自己作为皇帝的权力和尊严一直都受到来自张居正、李太后和冯保的制约和碾压。甚至他连自己的爱情,给自己所爱的女人一个荣耀的权力都没有。关于万历皇帝和恭妃王氏、郑贵妃的故事我想大家在网上都能了解到很多,在这里就不多说了,总之就是一个他不爱的恭妃生了一个长子朱常洛,又有一个他最爱的女人郑贵妃生了一个三子朱常洵,大臣们觉得在没有嫡子的情况下,应该立长子为太子,而万历皇帝想立三子朱常洵为太子,因为皇帝的优柔寡断以及文官集团的集体抱团对抗,这件事情就在万历皇帝和文官集团中拉扯了十五年,史称“国本之争”。直到1601年,万历皇帝才立了朱常洛为太子,但是这位皇帝命更苦,当太子当得憋屈,当了皇帝直接送了命,在位29天就去世了。万历皇帝以近30年不上朝来报复文官集团,但是他最终也没有立成他想立的太子,在这场旷日持久的战争中,两败俱伤,没有赢家。
+
+所以我们在黄仁宇的这部《万历十五年》当中是可以感受到一个皇帝作为一个人的灵魂和悲欢,他好学机敏、但又同时懒政懈怠,他敏感脆弱、优柔羸弱,拥有长久的忍耐力却其实是个内心善良、极度缺乏安全感的人。
+
+ 我们继续来说万历皇帝和张居正的关系,万历皇帝和张居正的关系应该说有很多个阶段。
+
+ **第一个阶段是顺从期。**在万历皇帝幼年的时候,张居正对他而言是亦师亦友亦父亦臣的关系。老师就不必说了,万历皇帝的所有学业都是张居正亲自教习的。亦友则是万历皇帝对张居正是天然的信赖的,再加上母亲李太后和冯保太监和张居正组成的政治铁三角,他在他们三个人的庇护下还是过得很安稳的。万历皇帝很小他的父亲就去世了,张居正在他眼里又是一个近乎完美的人,被当做榜样也不稀奇,作为首辅,张居正还是万历皇帝最可倚重的人才,可以说万历皇帝对张居正一开始是言听计从的。
+
+**第二个阶段是蜜月期。**到了皇帝少青年时期,这种关系慢慢就发生了变化,一个是万历皇帝他不傻,反而是一个很有想法和聪明的皇帝,长期的权力受到制约他当然会有意见。但总体还是很好的,他崇拜他,认可他,像一个好学生一样努力表现以期获得对方的认可。张居正肚子疼,万历皇帝亲自为他调制椒面汤;张居正提倡节俭,万历就放弃建造华美的宫殿;张居正在外巡察,万历便不远万里送去重要奏章请元首裁夺;有人参奏张居正,万历皇帝就将弹劾他的官员贬黜。张居正父亲去世后,按规定张居正要回乡守孝三年,称为“丁忧”。万历皇帝力排众议,要张居正“夺情”,也就是以皇帝和国家的名义要求他留下,在职守孝。可是大臣们不同意,为父守孝,天经地义,你张居正凭什么不服从,作为文官集团的带头大哥,你也应该率先垂范啊,更为关键的是,你张居正不走,这些文官们怎么有机会上位呢?于是一些资格很老的官员还结盟去张居正家里劝他,让他赶紧回老家守孝。但在万历皇帝的坚持和挽留下,张居正最终没有回乡守孝,而是回乡葬父三个月后就返回了朝廷,这也成为他死后被清算的一个重要把柄。在张居正回乡葬父的三个月时间,万历皇帝把所有的重要国家大事都让人以最快的速度送到张居正老家(今湖北荆州)让他拟定,这三个月甚至可以说是张居正和万历皇帝除了死亡以外此生唯一一次长时间分离。
+
+**第三个阶段是决裂期。**在书里,黄仁宇用了“阴阳”一词来概括官僚集团。“阳”是指这些官员都是通过科举教育培养上来的,是道德的表率。道德的表率最高是皇帝,接着是百官,然后是士绅。他们都要以“修身、齐家、治国、平天下”的儒家理念为行事准则。“阴”则是指这些官员作为个人的私心贪欲。万历皇帝对文官集团“阴阳双重性”的认识,正是从对他影响最大的人张居正开始的。以张居正为首,其“阳”的一面是,他作为首辅,拥有极强烈的政治抱负和“国富民强”的远大理想,推行了一系列改革,主要是推行一条鞭法,包括丈量田地、整顿赋税等措施。试图以一己之力提高官僚集团的技术,用一套世俗的行政效率来解决大明朝的问题,从这方面看,张居正是一个有作为、很务实的政治家。但他有“阴”的一面,除了个人生活豪奢,还有庇护子弟仕进的嫌疑。张居正三个儿子都在他担任首辅期间考中进士,其中三子张懋修和次子张敬修还分别取得进士第一名和第二名,也就是状元和榜眼。再就是张居正死后,万历皇帝在文官的怂恿下要抄张的家,他看到这个清单后特别震撼,处处要求他节俭克己的张居正张首辅,家里却有数不尽的珍宝财富,有用不完的奇珍异物,有享用不尽的美女…… 1582年,张居正突然去世后,文官集团揭开了他不为人知的一面,当然这其中有政治斗争的蒙蔽,倒张派的推波助澜。总之,19岁的万历皇帝在被引导下,看到了张居正的另一面,倒张运动轰轰烈烈开展起来,至当年年底,距离张居正去世仅仅半年,他被盖棺定论,罪状有欺君毒民、接受贿赂、卖官鬻爵、任用私人、放纵奴仆、凌辱缙绅等,所作功绩暂且不论,此时在万历的心目中,张居正的形象逐步变得虚伪和毒辣。 这带给他的震撼实在是太大了。甚至使他感觉到他对张居正的信任是“一种不幸的历史错误”。他既愤怒又伤心,黄仁宇描述万历此时心境写到:“这十年来,他身居九五之尊,但是被限制到没有钱赏赐宫女,以致不得不记录在册子上等待有钱以后再行兑现;他的外祖父因为收入不足,被迫以揽纳公家物品牟利而被当众申斥。但是,这位节俭的倡导者、以贤者自居的张居正,竟然口是心非地占尽了实利!” 此后半年,万历皇帝因为张居正带来的冲击,情绪陷于紊乱。但还是对张居正怀有复杂的感情,所以在随后一位御史大夫上本参奏张居正十四大罪,要求没收其财产时,他用朱批回答:张居正蔽主殃民,殊负恩眷,但是“待朕冲龄,有十年辅理之功,今已殁,姑贷不究,以全始终”。 然而在两年后,1584年,万历皇帝又在各方推助下,籍没了张居正的家,并宣布了总结性罪状,还说本当剖棺戮尸,但因多年效劳,姑且恩免。自此,张居正一案暂且告一段落,但比较微妙的一处是,1587年,也就是张居正去世5周年,万历皇帝曾问工部,张居正在京内的住宅没收归官以后是卖掉了还是租给别人了?如果租给了别人,又是租给谁了?工部的答复没有见于记录。也许张居正走了,万历皇帝的精神力量或者信念也随之消逝了。此时距离万历皇帝最后一次上朝的1592年还有五年。
+
+ 总结起来,张居正后来的结局大致有五个方面可见端倪:
+
+> 一是严苛教育剥夺了万历的童年,没有把小皇帝当成一个有血有肉的人来看待,张居正教导万历道理都对,让小皇帝无可反驳,却失了人情味;
+> 二是专政十年架空了皇帝的大权,万历对张居正的态度是“干济可观,偏倚亦可厌”,又爱又恨;
+> 三是拟下罪己诏拂了皇帝的颜面,喝了个酒就上纲上线,被太监告密,被母亲和大臣联合教训,当皇帝当的也是很窝囊;
+> 四是管理金库减了皇帝的银钱,万历想修庙,不行,万历想盖楼,不给,万历想买新玩意,不可以……万历皇帝给户部要钱,居正也不让给,可怜皇帝赏个宫女还有记在账上,下月再赏;
+> 五是死后事发毁了皇帝的信念。信仰的崩塌摧毁了万历皇帝的一切,他的成长史自此演变成一个三好学生的堕落史。
+
+如此种种,造成了张居正的悲剧,也造成的万历的悲剧,更造成晚明的悲剧。 本来,在张居正去世之后,万历皇帝开始掌握实权,欲有所作为,打算亲自操练兵马,甚至御驾亲征,但遭到了文官们的竭力阻止和反对。再加上立储的问题,直接导致他与文官集团的冲突,他此时才全然明白,他的对立面,并不是张居正,而是整个文官集团,他虽然贵为天子,但却受制于文官集团。
+
+万历皇帝于是以长期的消极怠工来对抗臣僚,不再出席各种法定的礼仪;虽照常批阅其他奏章,却对臣僚抗议的奏章不加答辩,置之不理;对于许多朝官辞职离职退休之后的职位空缺问题,也不加补缺处理。心灰意冷的万历皇帝,大概从1592年以后,不郊不庙不朝长达28年,在文官集团的掣肘下成为活着的祖宗,再未迈出紫禁城半步。
+
+# 第三个问题,黄仁宇与《万历十五年》
+我始终有一个观点就是,要真正了解一部作品的精神内核,必须要从作者个个人经历去出发、去理解。一部作品必然带有作者本人生活的痕迹和他对生活的感悟和体会。
+
+ 黄仁宇1918年出生于湖南长沙一个开明家庭,18岁考入南开大学,第二年投笔从戎,考入黄埔军校第16期,后成为参与缅北战役的国军军官。因为对军队腐朽的失望,1950年他毅然结束军旅生涯,奔赴美国求学,这一年他32岁,在美国他辛苦求学,获得博士学位时已经46岁。在做学问的十几年中,黄仁宇几乎没有任何经济来源,只靠平时打点零工维持生计,先后做过洗碗工、调酒员、清洁工、收货员、绘图员、电梯服务员等等工作。他在治学方面的严谨刻苦,最终使他取得了终身教授资格。但最终因为个人学术著作数量未达到学校考核要求,被该校(哪个学校)辞退,彼时他已61岁高龄。
+
+但人生的戏剧性就在这里,就在黄仁宇被解聘的第二年,1982年,影响他的一生,甚至影响中国整个历史学界的一本书出版了,那就是《万历十五年》。虽然没有做任何营销,但是《万历十五年》却迅速成为最畅销的历史著作。而且自此黄仁宇的作品几乎每本都受到追捧。在二十世纪最后十余年间,黄仁宇成了中国海峡两岸普通读者心目中影响最大、名声最著的历史学家,甚至都不用加“之一”二字。
+
+世事就是这么无常。当年,黄仁宇只想做一个工程师,却被推上了战场;当他想做一名将军的时候,现实却又让他看到了另一个更重要的东西;后来他被大学解聘,好像整个世界都抛弃了他时,上帝却又给了他一个更广阔的空间……他的一生有很多巧合和趣事,这种巧合甚至贯穿生死。
+
+黄仁宇于2000年1月8日离世,坊间传闻:那一天他去看电影,突发心脏病。在通往电影院的路上,黄仁宇笑着对夫人格尔说:“老年人身上有这么多的病痛,最好是抛弃躯壳,离开尘世。”不想一语成谶。享年82岁。 黄仁宇的人生坎坷波折、历尽艰辛。48岁才结婚生子,60多岁才算有了一点成就。但他对历史研究热忱的种子是一早就埋下的。对他来说,研究历史是为了解决心中的疑问:我所置身的这个中国,为什么100多年来如此动荡多难?”
+
+说到底,黄仁宇的历史观,就是一种家国情怀与个人羁旅交织下的人生领悟。这从根本上就决定了:黄的文论,是历史,也是生活本身。是学理,也是情怀抒发。是反思,也是人生独白。 正如黄仁宇的那段话:如果你看到了历史的长期合理性,那么当你经历了种种失败,年老时回望自己人生,才能平静地接受命运,体会其中的必然,然后静静地等待隧道的尽头开始展现一丝曙光,证明那些企图逆转命运的举动,并非无谓和徒劳。 或许,我们每个人都可以从黄仁宇坎坷而传奇的人生经历中得到一些安慰、一点激励。
+
+分享完这本书,有人可能会问,我们都已经到现代社会了,为什么还要去探究明朝的事儿呢? 那么最后,借用历史学家辛德勇先生的一句话作为回答: 读史书,论史事,醉翁之意本不在酒,是要借古喻今,整肃世道人心。
+
+谢谢大家!
+
+
+----------
+
+
+延伸阅读:
+
+黄仁宇《黄河青山》
+孟 森《明史讲义》
+朱东润《张居正大传》
+电视剧《大明王朝1566》
diff --git "a/_posts/2023-11-01-\344\270\215\346\273\241\344\270\200\345\221\250\345\262\201\347\232\204\345\256\235\345\256\235.md" "b/_posts/2023-11-01-\344\270\215\346\273\241\344\270\200\345\221\250\345\262\201\347\232\204\345\256\235\345\256\235.md"
new file mode 100644
index 00000000000..f2a2a2f00bf
--- /dev/null
+++ "b/_posts/2023-11-01-\344\270\215\346\273\241\344\270\200\345\221\250\345\262\201\347\232\204\345\256\235\345\256\235.md"
@@ -0,0 +1,15 @@
+---
+layout: post
+title: 宝宝不满一岁时的照片
+subtitle: 宝宝很可爱,对吗?
+date: 2023-11-01
+author: ajiao
+header-img: img/post-bg-alitrip.jpg
+catalog: true
+tags:
+ - 生活
+---
+
+宝宝名叫柠檬,这是她不满一岁时的样子,很可爱吧!
+
+
diff --git "a/_posts/2023-11-02-Google Fonts \345\267\262\346\224\257\346\214\201\346\200\235\346\272\220\345\256\213\344\275\223.md" "b/_posts/2023-11-02-Google Fonts \345\267\262\346\224\257\346\214\201\346\200\235\346\272\220\345\256\213\344\275\223.md"
new file mode 100644
index 00000000000..6b79e054393
--- /dev/null
+++ "b/_posts/2023-11-02-Google Fonts \345\267\262\346\224\257\346\214\201\346\200\235\346\272\220\345\256\213\344\275\223.md"
@@ -0,0 +1,109 @@
+---
+layout: post
+title: Google Fonts 支持思源宋体
+subtitle: 字体之美,大爱宋体
+date: 2023-11-02
+author: ajiao
+header-img: img/post-bg-4.jpg
+catalog: true
+tags:
+ - 网络
+---
+## 20231106更新
+
+将以下代码插入head中,即可引用google font 思源宋体字体。
+```
+
+
+
+```
+---
+
+Google Fonts 分别在 11 月 18 日和 12 月 07 日提供了思源黑体和思源宋体的简繁支持,而且高达 6 种字重支持,其中思源宋体更是高达 7 种字重。这可了不得啊!更重要的是:它支持了目前电子显示屏上稀缺的宋体,这将会是一个伟大的进步!要知道,对于中文书籍,宋体一直是正文印刷的标准字体,而不是目前电子显示屏上普遍的黑体,因为宋体的衬线更适合长时间阅读。
+
+## 优势
+
+为什么宋体的衬线更适合长时间的阅读?可以有个「主观解释」,即自己可直接体会的解释。实践起来也简单,阅读一会儿宋体后回到黑体,阅读一会儿黑体后再回到宋体。
+
+我自己的主观感受:看完宋体后再回到黑体,四字就浮上心头——索然无味。因此,作为长文章为主、文字内容为主的博客,强烈建议马上使用 Google Fonts 提供的思源宋体!你可能注意到,我的博客已经开始使用了,所以应该如何使用呢?
+
+## 使用
+
+官网搜索 Noto Serif SC,点 + 号选择,选择好后底部会弹出一个提示框,里面有使用说明。还可以点击提示框中的 CUSTOMIZE 定制要加载的字重与语言。
+
+![\[1\]google-fonts-customize.png](https://io-oi.me/images/google-fonts-customize.png)
+◎ 定制选项
+
+之后,点击 EMBED,复制生成的代码,添加到博客的 标签内,并修改博客的相关 CSS 样式,指定 font-family 和 font-weight。
+
+最后,考虑到宋体的笔画要比黑体细,因此建议将字体的颜色加深,比如修改为 #333,以达到较好的阅读效果。
+
+此外,虽然之前 Adobe Typekit 就已经提供了类似的服务,但比起 Google Fonts,应用起来略显麻烦。
+
+## 英文
+
+对于中文,思源宋体已经非常美观了,但对于英文,我还是最喜欢 Garamond!
+
+在已选择 Noto Serif SC 的基础上,继续搜索 EB Garamond,点 + 号选择,然后 CUSTOMIZE 勾选四个:
+
+> regular 400 regular 400 Italic bold 700 bold 700 Italic
+
+同样,复制生成的代码,添加到博客的 标签内,然后需修改 font-family:
+
+```
+font-family: 'EB Garamond', 'Noto Serif SC', serif;
+```
+
+## 福利
+
+对于和我一样的 Hexo 的 NexT 主题使用者,按下列步骤操作。
+
+1)_config.yml
+
+```
+# 文件位置:~/blog/themes/next/_config.yml
+
+font:
+- enable: false
++ enable: true
+
+ # Global font settings used for all elements in .
+ global:
+ external: true
++ family: EB Garamond
+```
+
+2)base.styl
+
+```
+# 文件位置:~/blog/themes/next/source/css/_variables/base.styl
+
+// Font families.
+-$font-family-chinese = "PingFang SC", "Microsoft YaHei"
++$font-family-chinese = "Noto Serif SC"
+```
+
+3)external-fonts.swig
+
+```
+文件位置:~/blog/themes/next/layout/_partials/head/external-fonts.swig
+```
+
+将这个文件的全部内容直接替换为 Google Fonts 网站生成的 代码,然后可以将 googleapis.com 修改为 loli.net。
+
+4)custom.styl
+
+```
+/* 文件位置:~/blog/themes/next/source/css/_custom/custom.styl */
+
+.post-body {
+ color: #333;
+}
+```
+
+最后,部署,完成!😆
+
+## 链接
+
+[衬线体的进化:从纸面到屏幕](https://zhuanlan.zhihu.com/p/49470735)
+
diff --git "a/_posts/2023-11-02-\347\275\227\347\264\240\357\274\232\346\210\221\345\246\202\344\275\225\345\206\231\344\275\234.md" "b/_posts/2023-11-02-\347\275\227\347\264\240\357\274\232\346\210\221\345\246\202\344\275\225\345\206\231\344\275\234.md"
new file mode 100644
index 00000000000..baf87232938
--- /dev/null
+++ "b/_posts/2023-11-02-\347\275\227\347\264\240\357\274\232\346\210\221\345\246\202\344\275\225\345\206\231\344\275\234.md"
@@ -0,0 +1,61 @@
+---
+layout: post
+title: 罗素:我如何写作
+subtitle: 如果可以使用一个简单的词,就永远不要使用一个复杂的词。
+date: 2023-11-02
+author: ajiao
+header-img: img/post-bg-3.jpg
+catalog: true
+tags:
+ - 学习
+---
+
+# 罗素:我如何写作
+
+我不能假装自己知道如何写作,或佯称认识一个精明的批评家指点我需要以某种方式去改进我的文体。我顶多能够做到的就是把握各种尝试与一些事情之间的必然联系做个见证而已。
+
+直到21岁之前,我希望在写作上多少按照约翰米尔的风格行事,我喜欢他的句型结构以及发展一个主题的方式。不过当时我已有别的想法,我想大概是引申自数学吧:我希望用最少量的词便能够把每一件事情说得一清二楚。也许当时我觉得与其模仿任何书卷气较重的模式,还不如效法出版商贝德克尔发行的旅游指南。我肯花时间设法找出最简洁的方法把某些事情毫不含糊地表达出来,而为了达到这个目的,我愿意牺牲追求美学上优点的一切企图。
+
+但是21岁那年,我受到我的未来太太的兄弟史密斯一种全新的影响。那时候,它对于文章的内容不感兴趣,却对写作风格情有独钟。法国作家福楼拜与英国作家佩特是他的上帝,而我也真的快要相信学习写作之道就是模仿他们的技巧了。
+
+史密斯给我提供了各种简易的规则,如今我只记得其中的两条:“每四个字就要置一个逗号”,“不要使用‘和’这个词,除非是在句首”。他最有力的忠告就是永远要重新改写。我自觉地努力去尝试,但是发觉我的初稿几乎总是比第二次写得好。这个发现从此便使我省下大量的时间。当然这并非适用于文章的实质内容,而只不过是它的架构而已。当我发现一个重要的错误时,我就全部重写。当一个句子所表示的内容令我感到满意时,再花时间去修饰而使它变得更好的情况在我身上是从来没有发生过的。
+
+渐渐地,我找到以一种最低程度的焦虑与不安的心情从事写作的方式。在我年轻时,每每对于一个新的严肃作品我总是用掉一段时间——也许是一段长时间——感到好像非我的能力所能及。我会把自己从恐惧——害怕自己写的永远不对头——折磨至一个神经质状态。于是我作出一次又一次无法令自己满意的重写尝试,而最后不得不把他们一一丢弃。
+
+我终于发现这种胡乱摸索的努力只是在浪费时间。看来对我较为适合的方式是,在第一次思考一本书的主题之后,随之对这个主题给与认真的考虑,然后要有一段潜意识的酝酿时间,那是不能仓促行事的,而要说有什么区别的话,那就是我会过分地深思熟虑。有时在过了一段时间后,我会发现自己出了错,以致无法写出我想要的书。不过我的运气一向较好。通过一个极其专心的阶段把问题深植于我的潜意识之后,他便开始秘密地成长,直到解决方案带着使人不能理解的清晰度突然浮现出来,因此剩下的只不过是把看来仿佛是某种神示的内容书写出来罢了。
+
+一个有关我的写作过程最为奇特的实例发生在1914年初,从而导致我此后对它的依赖。当时我已答应给波士顿的罗威尔讲座讲课,我所选择的题目是“我们对物质世界的认识”。整个1913年我都在思考这个论题。包括在剑桥上课期间我的办公室,在泰晤士河上度假时的幽静小旅社,我极度的精神集中乃至有时忘了呼吸,而且由于我的出神冥想而引发阵阵不寻常的心跳。但是一切都是徒劳。每一个我所能想到的理论,我都可以察觉到它的致命缺陷。最后在绝望之余我前往罗马过圣诞节,希望节日的气氛可以使萎靡的精力恢复过来。我在1913年的最后一天回到剑桥,尽管困难依然没有获得解决,但是由于时间紧迫,我只好准备尽自己所能对速记员做口述。第二天早上,当她进门时,我灵光乍现,突然知道了自己要说什么,于是开始把整本书口述出来,完全没有片刻的犹豫。
+
+我不想传达一个言过其实的印象。事实上,这本书颇不完整,而且现在我还认为有不少严重的错误。但它是当时我所能做到的最称心的论述,而以一种较为从容不迫的方法(在我可支配的时间内)所创造的东西很可能会更遭。不管对其他人可能适用的是什么,对我来说这是正确的写作方法。这时我才发现,就我而言,最好是把福楼拜与佩特抛到九霄云外。
+
+虽然目前我对于如何写作与18岁时想的并没有太大的不同,但是我的发展过程无论如何不能说是直线式的。在20世纪初的最初几年,曾经有那么一段时间我已较为华丽的词藻和张扬的写作风格为追求的目标。《自由人的崇拜对象》就是在那时候写的,现在我不认为它是一部好作品。当时我沉湎于诗人弥尔的散文体,他翻腾起伏的藻饰文辞在我的心灵深处到处回荡。我不能说现在我不再欣赏这些文体,只是对我而言,模仿他们便会诱发一定程度的虚伪性。
+
+事实上,所有的模仿都是危险的。在风格上没有什么能够胜过英国国教祈祷书与基督教圣经的钦定英译本。但是他们在思想与感情上的表达方式不同于我们这个时代。除非写作风格是来自作家在个性上的内心深处和几乎是不由自主地表露,否则便不是好的写作风格。不过虽然直接的模仿往往遭人白眼,但是对优秀的散文体的通晓却得益匪浅,特别是在培养散文的节奏感方面。
+
+这里有一些简单的写作准则——也许完全不像史密斯所提供给的那样简单,我想可以推荐给从事说明式散文体写作的人。
+
+> 一,如果可以使用一个简单的词,就永远不要使用一个复杂的词。
+>
+> 二,如果你想要做一个包含大量必要条件在内的说明,那么尽量把这些必要条件放在不同的句子里分别说清楚。
+>
+> 三,不要让句子的开头导致读者走向一个与结尾有抵触的结论。
+
+我们以下面一篇可能出现在社会学文章中的句子为例:
+
+> “人类之得以完全免除不合乎社会道德标准的行为模式是为由当某些为大部分实际实例无法达到要求的先决条件,经由一些不管是天生还是自然环境的有利机运的偶然组合,于早就某一人的过程中碰巧结合起来,由于在社交方面占有优势的做事方法,使他身上许多因素都背离了基准。”
+
+试看,如果我们能够以浅显的文字给这段话重新措辞的话,那么我的建议如下:
+
+> “人类全部都是坏蛋,或至少差不多都是。那些不识坏蛋的人必然具有他们在先天和后天上非比寻常的运气。”
+
+这段话较简短,也较为明白易懂,而且说的是同一回事。但是恐怕任何使用后者代替前者的教授都会遭到开除的命运。
+
+这是我想到我要向听众中一些可能碰巧是教授的人提出劝告。我之所以被允许使用简朴的英文,是因为每个人都知道我可以选择去使用数学逻辑语言。以下面的陈述为例:
+
+“有些人与他们已故妻子的姐妹结婚。”
+
+我可以用一种经过多年的学习才能理解的语言来表达这个句子,如此变为我提供了使用的自由。因此我向年轻的教授们建议,他们的第一篇著作应该用只有少数博学之士才看得懂的术语去撰写。以此作为他们的后盾,从此以后他们便可以用一种“大家能明白的语言”道出一切他们所要说的。
+
+目前,我们的生命仍然受到教授们的摆布,如果他们采纳我的意见,我虽然不像但也不得不感到对它们理应心怀感激之情了。
+
+本文来源:《罗素回忆录:来自记忆力的肖像》,希望出版社 2006年版。本文版权归原作者所有。
diff --git "a/_posts/2023-11-03-\346\226\260\345\215\216\345\244\234\350\257\273\357\274\232\347\233\270\344\277\241\347\276\216\345\245\275\357\274\214\347\273\210\344\274\232\351\201\207\350\247\201\347\276\216\345\245\275.md" "b/_posts/2023-11-03-\346\226\260\345\215\216\345\244\234\350\257\273\357\274\232\347\233\270\344\277\241\347\276\216\345\245\275\357\274\214\347\273\210\344\274\232\351\201\207\350\247\201\347\276\216\345\245\275.md"
new file mode 100644
index 00000000000..8689e5ae158
--- /dev/null
+++ "b/_posts/2023-11-03-\346\226\260\345\215\216\345\244\234\350\257\273\357\274\232\347\233\270\344\277\241\347\276\216\345\245\275\357\274\214\347\273\210\344\274\232\351\201\207\350\247\201\347\276\216\345\245\275.md"
@@ -0,0 +1,64 @@
+---
+layout: post
+title: 相信美好,终会遇见美好
+subtitle: 否定的话不要轻易说出口,这样你的生活才会不断迎来更多的精彩和美丽。
+date: 2023-11-03
+author: ajiao
+header-img: img/post-bg-2.jpg
+catalog: true
+tags:
+ - 生活
+---
+每个人身上都有自己独特的气场,这种气场虽然看不见,却拥有强大的影响力,在无形中塑造我们的一生。
+
+## 学会正面情绪输出
+
+正面的情绪会吸引到更多美妙的事情,那些坚持释放幸福和快乐等正面情绪的人,会收获同样的幸福和快乐。
+
+情绪有好有坏,不管你释放的情绪是好是坏,最后都会像回声般精准地反射回到你的身上。
+
+想要获得积极的效果,就要找对正确的频率,而这个频率就是学会正面情绪输出。
+
+> 我们无论遇到任何事情,都不必惊慌,以免乱了手脚,只有控制住自己的情绪,方能让事情往好的方向发展。
+>
+> 否定的话不要轻易说出口,要把它转变为积极的态度再输出,这样你的生活才会不断迎来更多的精彩和美丽。
+
+## 发挥想象力,才能创造奇迹
+
+生命拥有无限可能,人的创造力就来源于想象力。
+
+想象力可以帮助激活潜力。只要你能正确运用想象力,它就有可能真的帮你创造奇迹。
+
+不是每个梦想都能实现,但只要你敢想敢干,就会离梦想越来越近。
+
+想象力是梦想的起点,它会帮助你把决心转换成一种意志力,并且不断地指引你,带动你,帮助你吸引到更多的美好的事物来到你的生命里。
+
+> 相信奇迹的人,才会看到奇迹发生。渴望理想的未来,未来才会理想。
+
+## 目标可视化,让梦想触手可及
+
+有人曾说过:“如果一个人把自己的全部注意力和整个意志对准一个确定的事物,那么他就能找到这个事物。”
+
+想要驾驭任何渴望的东西,都要先明确自己的目标,尽可能让目标可视化。
+
+可视化的目标可以通过视觉冲击的形式,加深我们对目标的记忆,让目标更加牢牢印刻在脑海中。
+
+> 可视化的目标就像闹钟,不断提醒我们,让我们把注意力集中到目标上,让我们对目标保持热情,让行动始终围绕着目标,直到目标顺利达成。
+
+正确的方向从明确的目标开始。一个人知道自己要什么,比任何事情都重要。
+
+目标定才能心定,心定才能精进。心之所向,无畏无惧,终将一往直前,抵达你心之所向之地。
+
+## 心存感恩
+
+一颗充满爱、懂得感恩的心能产生巨大能量。
+
+消极的思维只会让我们更加靠近消极的人生,一颗感恩的心才能帮助我们收获更多的人生的幸福美满。
+
+> 感恩是爱的一种表达方式,能够表达出爱,才能更好地链接到爱。给予的爱越多,自己收获的爱就会更多。
+
+懂得感恩的人,更能明白多彩的世界因爱而生,更能领悟生命的真谛,更能收获能量加持实现美满人生。
+
+愿你能所念皆所想,所想皆所成。
+
+一心向阳,收获更好的自己,不断遇见心心念念的美好未来。
diff --git "a/_posts/2023-11-04-\347\276\216\345\233\275\347\234\274\347\247\221\345\255\246\344\274\232\345\221\212\350\257\211\344\275\240\344\277\235\346\212\244\347\234\274\347\235\233\347\232\204\346\255\243\347\241\256\346\226\271\346\263\225.md" "b/_posts/2023-11-04-\347\276\216\345\233\275\347\234\274\347\247\221\345\255\246\344\274\232\345\221\212\350\257\211\344\275\240\344\277\235\346\212\244\347\234\274\347\235\233\347\232\204\346\255\243\347\241\256\346\226\271\346\263\225.md"
new file mode 100644
index 00000000000..a7f935b7a6f
--- /dev/null
+++ "b/_posts/2023-11-04-\347\276\216\345\233\275\347\234\274\347\247\221\345\255\246\344\274\232\345\221\212\350\257\211\344\275\240\344\277\235\346\212\244\347\234\274\347\235\233\347\232\204\346\255\243\347\241\256\346\226\271\346\263\225.md"
@@ -0,0 +1,79 @@
+---
+layout: post
+title: 颠覆认知:美国眼科学会告诉你保护眼睛的正确方法
+subtitle: 户外活动是保护眼睛/控制视力最好的方法!
+date: 2023-11-04
+author: ajiao
+header-img: img/post-bg-2.jpg
+catalog: true
+tags:
+ - 生活
+---
+
+故事案例:
+
+> 上周带儿子体检,检查两眼视力时发现比他的年龄正常值稍弱一点儿,不过也还没到要采取行动的程度。我和孩子父亲都是近视。医生说那就得特别注意了,平时得增加孩子的户外活动时间。我觉得很奇怪,儿子又不是身体不好,跟户外活动啥关系,为何不说少打电子游戏、少看电视iPad之类的呢,我忍不住提醒了一下。医生笑笑说,其实看电子屏幕并不会让孩子的眼睛变坏,只是会让他的眼睛疲劳,注意间歇休息就好了。医生还给了我美国眼科学会(American
+> Academy of Ophthalmology, AAO)的网站地址,说上面有很多关于保护眼睛的Tips.
+
+如果你认真看完这些tips,一定会受益匪浅,其中列举了不少平常我们认为“这样做伤害眼睛”的说法,但都不是事实,AAO针对每条都给出了真相和建议,比如我们普遍容易中招的有:
+
+## 长时间看电脑、电视、iPad,玩电子游戏会弄坏眼睛吗?
+
+**我们想当然地认为:会!**
+
+随着电子设备普及,绝大多数孩子都很小就成了电子游戏迷,无论是iPad上的小游戏,电脑上的网络游戏,还是电视机连Xbox, Wii等游戏都玩得不亦乐乎,遇上感兴趣的动画片也一集一集地追。我们也和大多数家长一样,担心孩子玩久了会弄坏眼睛,于是有了和孩子立法三章的这种限制那种规定。
+
+**AAO给出的答案是:不会!**
+
+长时间看电子屏幕、看书或者做别的需要一直盯着的事并不会给眼睛带来永久性的生理损伤,它只会让你的眼睛感觉到疲劳、干涸、发红或者看东西模糊、头晕等等。其原因是在这种注意力高度集中地看东西的情况下,眨眼次数会降低。正常情况下我们一分钟眨眼大概是15次左右,而在看电视、玩电脑时,眨眼频率会降到原来的1/3,就是一分钟5次左右,这是让我们眼睛感觉到疲劳的真正原因,只要适当休息,是可以缓解的。
+
+AAO的建议是:长时间观看电子屏幕并没什么问题,关键是要间隔地休息一下,缓解眼睛疲劳,它建议使用“20-20-20“规则,就是每隔20分钟,远眺至少20英尺(相当于6米)的地方,这样休息至少20秒。
+
+## 看电脑、电视离得太近会弄坏眼睛吗?
+
+我们想都不想地认为:会!
+
+“坐远点,还要不要眼睛啊!“这是我们小时候耳边经常响着的一条指令,有时正盯着电视看西游记看得上瘾,爸妈就要开始喊。
+
+现在,这条准则又被我们原封不动地搬到自己小孩身上,”怎么越凑越近!对眼睛不好!“
+
+AAO给出的答案是:不会!
+
+无论是看电视,还是读书,凑得近并不会伤害眼睛。而且,和大人相比的话,孩子看近处的东西会让他的眼睛处于更舒服的状态,所以,我们会发现孩子看东西看着看着就会慢慢凑近,因为离得远了反而会让他的眼睛感觉不舒服,这种现象会随着孩子年龄的增长慢慢削减。
+
+AAO的建议是:找到一个让眼睛比较舒服的位置,AAO对成人使用电脑时的屏幕距离给出的建议是,眼睛距离屏幕25英寸(63.5厘米)或者一个手臂的长度,观看角度最好是轻微的俯视。如果是看电视,观看的合适距离大约等于屏幕对角线长度*1.6,也就是说,如果家里的电视是60寸,那么对焦线长度为1.5米,最佳观看距离就是2.4米。这两个数据都是适用于成人的,对于孩子的话,距离可能会稍微近一点儿,家长可以通过陪同、观察和询问,和孩子一起找到让他眼睛最舒服,观看效果也最好的距离。
+
+## 戴近视眼镜会加深眼睛度数吗?
+
+我们很多人都被误导:戴眼镜会让度数加深,甚至我们自己的体验也似乎在印证这种说法,所以我一直认为戴眼镜是“饮鸩止渴“。
+
+AAO的答案依然是:不会!
+
+即使配戴了度数不合适的眼镜也不会!!! “佩戴不合适的眼镜不会伤害眼睛,只是会让眼睛感到疲劳、痛、视觉模糊,你只要摘下眼镜这些症状就能马上消除。 ”
+
+当然,AAO也说了,以上这些情况,虽然只会造成眼睛疲劳,但如果眼睛长期处于疲劳状态得不到缓解的话,也是对眼睛不好的。所以,让孩子养成健康用眼的习惯非常重要。
+
+看到这各位是不是都快憋不住了?既然这些都不会伤害眼睛,那究竟什么才是造成孩子近视的根本原因呢?
+
+敲黑板,划重点,大家注意力集中了哈,颠覆你认知的知识来了。
+
+**目前能证实的造成孩子近视的原因只有两个:遗传和环境!**
+
+遗传没得说也改变不了,如果爸爸妈妈都是近视眼,孩子近视几率会大大提高。
+
+而环境方面,主要指的是户外活动时间,有这么一个统计数据,孩子们每周的户外活动增加一小时,患近视眼的风险就会降低两个百分点。
+
+## 户外活动是保护眼睛/控制视力最好的方法!
+
+原因是什么呢?我们先看看近视的原理,近视就是眼球变形,前后轴加长,外界物体成像在视网膜前面,所以看东西就会觉得模糊。而增加户外活动的关键不在于活动,而在于户外。眼科学者们的解释是,户外明亮的光线有助于孩子视觉系统的发育,户外强光可以刺激视网膜释放多巴胺,多巴胺能抑制眼球的生长,让眼球水晶体和视网膜始终保持在正确的距离上,这就预防了近视的发生。
+
+这点对于家庭有近视遗传的孩子同样适用,美国俄亥俄州立大学的一项研究发现:父母都是近视眼的两组美国儿童,每天至少在户外运动2小时的孩子,患近视眼的几率是每天户外运动时间不到1小时孩子的1/4。
+
+为何总体美国孩子比中国孩子近视少很多呢?其实他们的屏幕使用时间并不少,孩子们凑在一起打游戏是肯定少不了的。平时看书时间也非常多,也并不见得都很讲究阅读的灯光环境。和国内孩子的区别,可能还真就是户外体育运动的时间多很多。
+
+我们都说体育锻炼了身体、培养了意志力、团队精神啥的,现在发现对保护视力也是好处多多。此外,还想提醒给孩子选择体育项目时应该重视户外的因素,现在锻炼的条件是越来越“好”了,很多活动都有室内场地,虽然上课不受天气影响,家长陪同得也舒服些,但却没起到“户外”保护视力的作用。
+
+> PS:
+> 国内不少大城市的孩子由于雾霾减少了户外锻炼时间,周末又是各种补习兴趣班,真的有点担心孩子们的身体和视力呢。所以,爸爸妈妈们,记得抓住一切机会出门陪孩子做运动哦!
+
+再次提醒各位家长,视力保护从幼儿就得开始,最有效的方法就是增加户外活动时间。
diff --git "a/_posts/2023-11-07-\344\270\212\346\265\267\343\200\201\350\213\217\345\267\236\343\200\201\345\220\210\350\202\245\347\247\221\346\212\200\345\210\233\346\226\260\345\267\245\344\275\234\350\200\203\345\257\237\346\212\245\345\221\212.md" "b/_posts/2023-11-07-\344\270\212\346\265\267\343\200\201\350\213\217\345\267\236\343\200\201\345\220\210\350\202\245\347\247\221\346\212\200\345\210\233\346\226\260\345\267\245\344\275\234\350\200\203\345\257\237\346\212\245\345\221\212.md"
new file mode 100644
index 00000000000..637e5a9875a
--- /dev/null
+++ "b/_posts/2023-11-07-\344\270\212\346\265\267\343\200\201\350\213\217\345\267\236\343\200\201\345\220\210\350\202\245\347\247\221\346\212\200\345\210\233\346\226\260\345\267\245\344\275\234\350\200\203\345\257\237\346\212\245\345\221\212.md"
@@ -0,0 +1,36 @@
+---
+layout: post
+title: 上海、苏州、合肥科技创新工作考察报告
+subtitle: 短短不到一个星期的考察学习,感受很深,收获很大。
+date: 2023-11-07
+author: Ajiao
+header-img: img/post-bg-1.jpg
+catalog: true
+tags:
+ - 工作
+---
+
+# 上海、苏州、合肥科技创新工作考察报告
+
+7月31日至8月5日,市政协副主席王志斌带队赴上海、苏州、合肥三地考察科技成果转化、科技型企业培育等科技创新经验和做法,感受很深、收获很大。现将本次考察情况报告如下:
+## 一、总体情况
+本次考察活动为期6天,先后考察了上海市张江科学城的张江机器人谷、张江创新药产业基地,苏州工业园区的苏州市智能制造融合发展中心、莱克电气股份有限公司,合肥市的科希曼电器有限公司、兆尹科技合肥研发中心、安徽创新馆等地。
+## 二、主要感受
+### 1.科技实力极强。
+长三角处处洋溢着科技创新和人才集聚的深厚氛围。在2022年科技部火炬中心国家高新区排名中,张江高新区排名第二、苏州工业园区排名第四、合肥高新区排名第七,高新区的高速发展为上海、苏州和合肥经济高质量发展贡献了澎湃动力。张江科学城打造了多个专业化园区为经济发展注入了新动能,苏州市打造了工业互联网平台让产业“高端化、智能化、绿色化”成为现实,合肥成功打造了四个大科学装置,吸引了哈佛大学等海外高端人才回国,在量子科学、人工智能、半导体芯片、平板显示等产业,拥有核心关键技术,产业化也达到了非常高的水准。这些城市的发展启示我们:谁牵住了科技创新这个牛鼻子,谁形成了集聚人才的新高地,谁就能抢占先机、领跑未来。
+### 2.成果转化超快。
+上海、苏州和合肥拥有大批依靠科技创新快速发展的科技型企业。张江科学城集聚着1500余家生物医药创新企业,在研药物品种超过600个。全球医药20强有超过10家在张江设立了开放式创新中心,中国医药百强企业超过30家在张江设立了研发中心,研发实力雄厚,科技成果极多。为推动科技成果就地转化,张江高新区打造了创新药产业基地等多个产业化园区,打响“张江研发+上海制造”品牌。苏州莱克电气不断深耕高速电机核心技术,推动家居清洁、空气净化、水净化、厨房电器等传统小家电高端化发展。合肥兆尹信息科技公司创业团队全部来自中国科技大学金融工程重点实验室,凭借过硬技术水准,成长为国内金融行业IT解决方案重要提供商。科希曼电器依托空气热源泵技术,从空气中获取更多热量,供应建筑内热量需求,节能环保价值显著。大批科技型企业茁壮成长为经济发展蓄势赋能。
+### 3.创新意识敏锐。
+长三角政府层面重视科技创新,上海定位作出改革开放排头兵、创新发展先行者,苏州建设世界一流创新城市,合肥号称“科创之城”,尤其是合肥让人印象深刻。2014年以来,合肥市联合大院大所,大规模建设新型研发机构。政府给钱、给地、给政策,高校出人才、出成果。对于院士领衔的新型研发机构,合肥市每年给予2000万元的运营经费支持,连续给五年,真金白银支持科技创新。2006年,为了引进京东方,合肥市政府拿出了当年财政收入的60%,足足50亿元。在科技创新工作上,合肥市政府表现出了极强的魄力,敢于投入、敢于豪赌,被外界冠以“一座赌出来的英雄城市”。在小微企业发展中,合肥科技主管部门敢于拥抱新技术、新理念,敢于支持企业、关爱企业,为企业站台,帮助企业争取支持,一路扶持企业做大做强。
+### 4.产业集聚度高。
+长三角地区结合自身产业发展实际情况,产业发展方向定位清晰,不再追求“大而全”,而是持续深耕优势领域,力争做到“专而精”,产生了极强的产业集聚效应。聚焦生物医药、机器人优势产业,张江科学城打造了多个面积不大、水平很高的专业化产业园区,以创新药基地为例,规划面积3.1平方公里,集聚了生物医药领域上市企业15家,科创企业10家,发明专利拥有量超过120件。目前,张江科学城正在建设世界级的生物医药产业集群,打造“中国药谷”。合肥市以京东方、蔚来汽车和科大讯飞为引导,发挥中国科技大学和中科院科教资源优势,着重发展屏幕显示、新能源汽车和人工智能,打造“中国声谷”。
+### 5.营商环境极好。
+苏州民营经济的高速发展,离不开苏州良好的营商环境。在全国工商联2021年发布的“万家民营企业评营商环境”调查中,苏州营商环境蝉联全国第三,获评“营商环境最佳口碑城市”。苏州市智能制造融合发展中心展示了“苏商通”平台,苏州企业可以直接点击“政策计算器”, 实现企业享受优惠政策“一键直达”,被誉为“惠企神器”。在国务院第七次大督查中被通报表扬。合肥市的快速崛起离不开高效的市政效率,2006年重金引进京东方,在蔚来汽车2016年低谷期果断引进,长期扶持培育科大讯飞,成功率先了合肥市经济跨越式发展,从建国时的小县城到2004年全国76位,从2010年三线城市到如今新一线城市。
+## 三、启示思考
+目前,我市属西部欠发达地区,工业仍以中省布局的能源化工、钢铁冶金、金矿钼矿开采为主,辅以较小体量的装备制造、生物医药、新能源、新能源汽车和新材料等,民营经济不够活跃,尤其木王科技这种优秀的民营科技型企业屈指可数,科技成果转化承接能力较弱,高层次科技人才承接土壤匮乏,企业普遍创新意识不强,导致我市科技企业少、科技人才少、创新氛围差,科技支撑经济发展的作用不明显,与长三角地区差距明显,但这次学习仍然给了我们很多启示。
+### 1.打造两种平台,提升服务能力。
+在政府组成序列中,科技部门属于善于拥抱新鲜事物、服务理念较强的部门。在合肥科技型企业成长的过程中,科技主管部门扎实宣传政策、关爱企业成长、支持企业发展,被兆尹科技负责人亲切地称为“科技型企业的娘家人”。受限于县市区科技主管部门全部撤并,市局人员有限的窘境,建议大力培育发展科技服务平台,提升科技服务能力。近年来,我们成功打造了培育孵化平台——渭南(西安)创新创业孵化器,成果转化平台——西安交通大学国家技术转移中心渭南分中心,基金投资平台——渭南市科技创新发展基金。在今年的科技型企业培育过程中,我们也成功发挥了科技服务机构作用,推动科技型中小企业和高新技术企业培育工作再创佳绩。后续,一要继续打造成果转化平台。持续加大与西安知名高校院所对接,搭建更多的技术转移平台,对接高校专家教授,解决企业技术难题,提升服务企业能力。二要探索打造科技服务平台。积极拥抱科技服务机构,出台科技服务机构管理办法,依托专业化服务机构,辅以县市科技力量,为企业提供专业化、市场化服务。
+### 2.壮大科技企业,培育明星企业。
+科技型企业是经济高质量发展的微观基础,是最具市场活力和发展动力的创新主体,是吸纳高质量就业和培育发展新动能的主力军。科技型企业,尤其是民营科技型企业,为长三角地区经济高质量发展注入了动力、活力,而且让经济发展后劲十足。目前,我市科技型企业数量不多、质量不高,建议大力培育科技型企业。近年来,在科技部门的持续支持下,我们见证了科赛机电、合阳风动、富平勇拓、蒲城美邦等一批科技型企业的成长壮大。后续,一要壮大科技企业群体。实施科技型企业创新发展倍增计划,大力培育科技型中小企业、高新技术企业,加大政策兑现落实,让更多企业享受到科技惠企政策红利,走上创新发展道路。二要培育明星科技企业。明星企业示范引领和带动作用极强,能充分彰显地区科技创新实力。对核心管理团队强、技术水平高、发展潜力大的科技型企业,我们要持续支持,帮助企业做大做强,培育更多明星科技企业。
+### 3.抓住重点工作,优化部门职能。
+随着秦创原建设启动以来,科技部门承担的省对市考核任务越来越重,2022年承担高质量省对市考核指标9项,承担秦创原专项考核1项(20个指标、31个得分点),辅以发改、工信、招商、文旅、卫生、农业等部门交叉下达“工业倍增”“创新高地”“华彩渭南”,以及营商环境、项目建设、招商引资、乡村振兴等任务,与当前市科技局编制少、人员少,县市区科技主管部门全部撤并的情况严重不匹配,一定程度影响了科技部门主责主业推进。为把有限的人力、精力、物力,投入到主责主业,建议以科技管理部门机构改革为契机,优化内设机构职能,发挥资源中心作用,集中力量办大事、好钢用到刀刃上。在内设机构设置方面,建议参考科技强市《意见》,结合科技考核指标任务,分别设置战略规划、成果转化、创新主体、创新生态等内设机构,战略规划牵头做好秦创原建设工作。在发挥资源中心作用方面,建议“压担子”提升资源中心工作人员的工作能力,“立规矩”提升资源中心人员的管理水平,以便充分发挥科技系统现有人员作用,为科技部门主责主业作出更大贡献。
diff --git "a/_posts/2023-11-07-\345\205\263\344\272\216\350\265\264\346\265\231\346\261\237\345\244\247\345\255\246\345\217\202\345\212\240\345\216\277\345\237\237\347\273\217\346\265\216\351\253\230\350\264\250\351\207\217\345\217\221\345\261\225\345\237\271\350\256\255\347\217\255\347\232\204\344\270\200\344\272\233\344\275\223\344\274\232\345\222\214\346\200\235\350\200\203.md" "b/_posts/2023-11-07-\345\205\263\344\272\216\350\265\264\346\265\231\346\261\237\345\244\247\345\255\246\345\217\202\345\212\240\345\216\277\345\237\237\347\273\217\346\265\216\351\253\230\350\264\250\351\207\217\345\217\221\345\261\225\345\237\271\350\256\255\347\217\255\347\232\204\344\270\200\344\272\233\344\275\223\344\274\232\345\222\214\346\200\235\350\200\203.md"
new file mode 100644
index 00000000000..fb13589633e
--- /dev/null
+++ "b/_posts/2023-11-07-\345\205\263\344\272\216\350\265\264\346\265\231\346\261\237\345\244\247\345\255\246\345\217\202\345\212\240\345\216\277\345\237\237\347\273\217\346\265\216\351\253\230\350\264\250\351\207\217\345\217\221\345\261\225\345\237\271\350\256\255\347\217\255\347\232\204\344\270\200\344\272\233\344\275\223\344\274\232\345\222\214\346\200\235\350\200\203.md"
@@ -0,0 +1,32 @@
+---
+layout: post
+title: 关于赴浙江大学参加县域经济高质量发展培训班的体会和思考
+subtitle: 走遍千山万水,想尽千方百计,说尽千言万语,吃尽千辛万苦
+date: 2023-11-07
+author: Ajiao
+header-img: img/post-bg-1.jpg
+catalog: true
+tags:
+ - 工作
+---
+
+# 关于赴浙江大学参加县域经济高质量发展培训班的一些体会和思考
+
+4月16日至4月22日,市发改委在浙江大学华家池校区组织了渭南市县域经济高质量发展培训班,在局领导的关心和支持下,我有幸参加培训,开拓了视野、更新了理念、增长了见识。
+## 一、基本情况
+本次培训由市发改委副主任王斌带队,市县两级发改系统和市直相关部门共计五十余人参加,为期5天的课程中设置有县域经济、科技创新、招商引资、新型城镇化等内容,还组织学员赴余杭禹上稻香参观乡村集体经济运行案例和小笨鸟科技企业孵化园区和杭州数字经济典型案例——城市大脑,授课老师包括浙江大学在职教授、前杭州市科技局局长、浙江省商务厅副巡视员等,课程设置紧贴实际、授课教师经历丰富,整个培训显得很贴地气。
+## 二、培训体会
+浙江境内山地、水面较多,可耕地面积小,煤炭等地下矿产资源不够丰富,但经过改革开放以来三十年的发展,浙江的民营经济和数字经济高度发达,居民收入水平快速增长,特别是城乡居民收入差距较小,获批建设“共同富裕示范区”,涌现出了阿里巴巴、海康威视等一大批顶尖企业,这一切都离不开李强总理今年在总理见面会上提到的“四千精神”——走遍千山万水,想尽千方百计,说尽千言万语,吃尽千辛万苦,离不开浙江人敢于改革、善于拼搏、不畏艰险的品质。对浙江的发展,还有几点感受。
+### 1.善于借力。
+浙江省会杭州距离上海很近,一度被称为“上海的后花园”,经济发展曾经也面临着上海虹吸效应的影响。正因为有虹吸效应的顾虑,杭州迟迟未能与上海形成融合发展,两座城市之间的距离只有162.4公里,但连接两座超大城市之间的高速公路G60直到2011年才正式开通。然而,自从G60高速公路开通之后,沿着G60高速公路形成了科技创新要素高度集聚、高端人才资源汇集、新兴产业群集的“长三角G60科创走廊”。最终,选择了“大树底下好乘凉”的杭州,积极融入长三角城市群建设,充分享受了上海经济发展产生的外溢红利,得到快速发展。
+### 2.注重生态。
+浙江是两山理念的发源地。2005年,习近平总书记在浙江湖州安吉考察时提出“绿水青山就是金山银山”。2021年,习近平总书记再次表示,“我们要加快形成绿色发展方式,促进经济发展和环境保护双赢,构建经济与环境协同共进的地球家园。”绿水青山就是金山银山不是只保护不发展,而是既要金山银山,又要绿水青山,让绿水青山变成金山银山。要把青山绿水的生态优势发展转化成金山银山生态价值,实现人与自然和谐共生。
+### 3.敢为人先。
+浙江地处浙北山区,曾经的主导产业是建筑石矿开采和珍珠养殖。随着国内环保形势越来越严峻,德清敢为人先,在零产业的基础上,抓住国家布局地理信息产业的机遇,花10年时间,从无到有打造了一个“地理信息小镇”,与移动互联网、大数据、云计算等新一代信息技术深度融合,形成了一流的地理信息产业集群。2022年5月20日,联合国秘书处在中国设立的首个直属机构——联合国全球地理信息知识与创新中心,落户德清。合肥,近些年发展速度极快,被称为“一座赌出来的英雄城市”,2006年以来因为连续引进了电子屏幕(京东方)、芯片、新能源汽车(蔚来),经济快速增长,2020年已经跻身新一线城市。
+## 三、几点启示
+### 1.积极融入城市群都市圈建设。
+渭南区位优势非常优越,主城区距离西安不足60公里,开车高速用时1小时内,坐高铁用时不足半个小时。从经济学角度讲,渭南主城区在西安都市圈范围内,拥有承接西安外溢资源的天然优势。从人口集聚、产业迁移的角度看,未来的发展一定是以城市群、都市圈为依托构建大中小城市的发展。建议,我们加大与西安市科技局合作力度,持续深化西渭融合科技创新发展合作协议结果,在距离西安交通一小时的经济圈内招引项目、转化成果、搭建平台,积极融入西安都市圈建设,尤其是融入西安双中心建设,借势借力推动渭南发展。
+### 2.充分发挥科技资源聚集效应。
+渭南科技资源相对比较短缺,但渭南高新区经过近些年的发展,已经成为渭南科技资源富集区域。在2022年9月,渭南高新区和经开区合并组建新的渭南高新区后,渭南高新区在33平方公里的建成区面积上有85家高新技术企业,占据全市总数的42%;156家科技型中小企业,占据全市总数的41%,印刷包装机械和3D打印产业在全国拥有一定影响力。建议,我们充分发挥渭南高新区科技资源富集优势,打造华山科技城,聚焦印刷包装机械、3D打印和未来产业(氢能、人工智能)。在印刷包装机械产业,注重延链。在3D打印产业,侧重强链。在未来产业,着重补链。全力提升交通基础设施、不断优化配套服务、持续优化生态环境,以产聚人、以人兴城,力争把华山科技城打造成承接西安外溢人才、资金、项目的金字招牌。
+### 3.生态优先打造生态产业园区。
+松山湖原本是位于东莞市大朗镇境内的一个大型天然水库,后政府以湖泊为中心,重新组合形成了新的国家级高新区,成功实现了生态优势到生态价值的转变,塑造了“科技共山水一色”的城市形象。建议,我们以渭南经开区为基础打造卤阳湖科技产业园区,践行“绿水青山就是金山银山”,坚持经济发展和生态保护和谐共生,打造“宜居、宜业、宜游”的新型生态科技产业园区。以临渭区双创基地为基础,充分发挥塬上生态优势,提升交通基础设施、增强配套服务水平、塑造人才政策洼地,打造以“创新创业”为主题的南山科创小镇。
diff --git "a/_posts/2023-11-07-\345\211\215\347\253\257 CDNJS \345\272\223\345\217\212 Google Fonts\343\200\201Ajax \345\222\214 Gravatar \345\233\275\345\206\205\345\212\240\351\200\237\346\234\215\345\212\241.md" "b/_posts/2023-11-07-\345\211\215\347\253\257 CDNJS \345\272\223\345\217\212 Google Fonts\343\200\201Ajax \345\222\214 Gravatar \345\233\275\345\206\205\345\212\240\351\200\237\346\234\215\345\212\241.md"
new file mode 100644
index 00000000000..492919bc5d2
--- /dev/null
+++ "b/_posts/2023-11-07-\345\211\215\347\253\257 CDNJS \345\272\223\345\217\212 Google Fonts\343\200\201Ajax \345\222\214 Gravatar \345\233\275\345\206\205\345\212\240\351\200\237\346\234\215\345\212\241.md"
@@ -0,0 +1,138 @@
+---
+layout: post
+title: Google Fonts加速访问
+subtitle: 前端 CDNJS 库及 Google Fonts、Ajax 和 Gravatar 国内加速服务
+date: 2023-11-07
+author: BY
+header-img: img/post-bg-4.jpg
+catalog: true
+tags:
+ - 网络
+---
+
+Via:[烧饼博客](https://u.sb/css-cdn/)
+
+由于某些众所周知的原因,好多开源的 JS 库采用的国外 CDN 托管方式在国内访问速度不如人意。所以我们特意制作了这个公益项目,托管了 CDNJS 的所有开源 JS 库以及反代了 Google Fonts、Ajax 和 Gravatar。
+
+## 1.CDNJS 开源 JS 库
+我们采用的方法是每天定时同步 CDNJS 的 Github
+
+所有的 JS/CSS 库可以在这儿找到您需要的链接
+
+https://cdnjs.loli.net/ajax/libs/
+
+如果您使用 cdnjs.com 只需要替换 cdnjs.cloudflare.com 为 cdnjs.loli.net 即可,如
+
+
+```
+
+```
+
+替换成
+
+
+```
+
+```
+
+CDNJS 的 API 开发文档请摸这里
+
+## 2.Google Fonts
+我们采用的方法是万能的 Nginx 反代 + 关键词替换
+
+使用的时候,您只需要替换 fonts.googleapis.com 为 fonts.loli.net 即可,如
+
+
+```
+
+```
+
+替换成
+
+
+```
+
+```
+
+如果需要 Material icons,把
+
+
+```
+
+```
+
+替换成
+
+
+```
+
+```
+
+如果需要 Early Access,把
+
+```
+@import url(https://fonts.googleapis.com/earlyaccess/notosanskannada.css);
+```
+替换成
+```
+@import url(https://fonts.loli.net/earlyaccess/notosanskannada.css);
+```
+如果需要下载单个字体,您只需要把 fonts.gstatic.com 替换成 gstatic.loli.net 或 themes.googleusercontent.com 替换成 themes.loli.net 即可
+
+比如
+```
+
+https://fonts.gstatic.com/s/opensans/v14/K88pR3goAWT7BTt32Z01mxJtnKITppOI_IvcXXDNrsc.woff2
+```
+替换成
+
+```
+https://gstatic.loli.net/s/opensans/v14/K88pR3goAWT7BTt32Z01mxJtnKITppOI_IvcXXDNrsc.woff2
+```
+或者
+
+```
+https://themes.googleusercontent.com/static/fonts/anonymouspro/v3/Zhfjj_gat3waL4JSju74E-V_5zh5b-_HiooIRUBwn1A.ttf
+```
+替换成
+
+```
+https://themes.loli.net/static/fonts/anonymouspro/v3/Zhfjj_gat3waL4JSju74E-V_5zh5b-_HiooIRUBwn1A.ttf
+```
+Google Fonts 的 API 文档请摸这里
+
+## 3.Google 前端公共库
+方法同上,直接替换 ajax.googleapis.com 为 ajax.loli.net 即可,如
+```
+
+```
+替换成
+```
+
+```
+Google 前端库 API 开发文档摸这儿
+
+## 4.Gravatar 头像
+方法还是同上,直接替换 *.gravatar.com 为 gravatar.loli.net 即可,如
+```
+https://secure.gravatar.com/avatar/8406d089bc81b664a2610b8d214c1428
+```
+替换成
+```
+https://gravatar.loli.net/avatar/8406d089bc81b664a2610b8d214c1428
+```
+## 5.赞助商
+国内外 CDN,GeoDNS、域名、SSL 证书等基础服务均由 Riven Cloud 赞助
+
+## 6.加速域名列表
+所有国内加速服务的域名列表如下,您只需要修改程序里的原域名即可
+
+ **原域名 | 加速域名 | 制作方法**
+> cdnjs.cloudflare.com cdnjs.loli.net 每日同步 Github
+> ajax.googleapis.com ajax.loli.net Nginx 反代
+> fonts.googleapis.com fonts.loli.net Nginx 反代
+> fonts.gstatic.com gstatic.loli.net Nginx 反代
+> themes.googleusercontent.com themes.loli.net Nginx 反代
+> secure.gravatar.com gravatar.loli.net Nginx 反代 如果遇到任何问题,请联系我们
+
+***注意:***个别国内的网络环境可能无法使用本服务,我们也暂时没有办法解决这个问题,请自行检查或更换运营商。
diff --git "a/_posts/2023-11-11-\344\270\200\350\223\221\347\203\237\351\233\250\344\273\273\345\271\263\347\224\237.md" "b/_posts/2023-11-11-\344\270\200\350\223\221\347\203\237\351\233\250\344\273\273\345\271\263\347\224\237.md"
new file mode 100644
index 00000000000..6c7b60c4331
--- /dev/null
+++ "b/_posts/2023-11-11-\344\270\200\350\223\221\347\203\237\351\233\250\344\273\273\345\271\263\347\224\237.md"
@@ -0,0 +1,82 @@
+---
+layout: post
+title: 读书笔记:一蓑烟雨任平生
+subtitle: 读李一冰先生《苏东坡新传》有感
+date: 2023-11-11
+author: 婧之
+header-img: img/post-bg-3.jpg
+catalog: true
+tags:
+ - 学习
+---
+关于苏东坡的传记,如果只看一本,那毫无疑问,必须推荐李一冰先生所著《苏东坡新传》,这也是个人认为迄今为止关于苏东坡较好的一部作品。
+
+
+
+1101年,苏东坡病逝于江苏常州;1912年,李一冰出生于浙江杭州。这二人无论从哪方面看都不会有任何关系,直到李一冰60岁那年,他着手开始写这部《苏东坡新传》,这一刻,苏、李二人产生了穿越时空般的奇妙连接。
+
+**所以,李一冰是谁?一位叫做张辉诚的博士和我们有着相同的疑问。**
+
+2015年12月,张辉诚在报纸上刊登了一则寻人启事:《寻找李一冰》。因为他读过这本书之后,觉得写的太好,就通过各种线索打听作者,想当面表达敬仰之情。但是,他问遍了熟悉的文学圈教授,竟然没有一个人知道李一冰是谁!于是,他迫不得已,在报纸上登了寻人启事。
+
+一段尘封的往事就此拉开帷幕,原来,《苏东坡新传》是李一冰在监狱中写的,所以书稿中有“252李一冰”的蓝印,252是他的囚犯号码。找到李一冰的时候,他已经去世了,从他儿子口中得知,李一冰,原名李振华,祖籍安徽,出生于杭州,日军侵华战争爆发后,李一冰举家迁到台湾。后遭人诬陷,56岁时含冤入狱。自此李一冰开启了研究苏东坡的艰辛历程。
+
+## 01 作者李一冰和苏东坡有着高度共情
+
+不同于林语堂笔下的苏东坡,是横空出世、才华横溢的天才。李一冰看到的苏东坡,是狱中狼狈至极的苏东坡,是虎口余生出狱后的苏东坡,是从苦闷中走向旷达的苏东坡……苏东坡的豁达,不是与生俱来的能力,而是与命运搏斗过程中,勇敢的选择。
+
+狱中4年,就是他和苏东坡共同生活的4年,在狱中,他遍学苏东坡生平事迹及文集,将苏东坡近3000首诗词背的滚瓜烂熟。出狱后的李一冰,决定撰写苏传,从1971年到1979年,没有师友、没有同事、没有学生、没有助手,甚至没有收入,整整8年,终于完成了著作。
+
+李先生为东坡作传,东坡千古出一人,七十余万字,是李对苏最赤诚的表白。他们有共同的境遇,灵魂的交流。写苏轼一生的沉浮,实际上也是写自己的坎坷不平。他写《苏东坡新传》,是找了一个比自己大千万倍的历史人物,告诉自己,这点冤屈不算什么。所以,新传整体都隐约有种悲凉的氛围笼罩,李的生平便是这种氛围的注解。
+
+## 02 有扎实的学术积淀和深厚的文字功底
+
+李一冰祖上历代经商,家境优渥,他自小接受了很好的古文启蒙教育,奠定了扎实的国学基础。之后毕业于浙江私立之江大学,更留学日本明治大学,又有良好的现代教育作为滋养。
+
+他写苏东坡,选材用典,极尽细致严苛,史料丰富详实自不再说。在后记中,李一冰道:“东坡一生,历尽坎坷,常被命运摆布,在极不自由的境地里,独行于荆天棘地之中,胸臆间积郁着一股难平之气,如生芒角,非吐不快,他就在这痛苦而又孤独的人生路上,习于写诗……不论是当哭的长歌,还是欢愉的短唱,全是从他性情深处倾泻出来的真情实感,生命中自然流露的天真。”
+
+所以李一冰笔下的苏东坡,人生几多坎坷,起承转合,全在诗中体现,读懂了苏东坡的诗词,也就读懂了苏东坡。作者扎实的考证功力,深厚的文史修养,超强的文字驾驭能力,饱满的情感,也蕴含其中。余秋雨曾评价此传是“文字典雅的学术著作”。
+
+## 03 新传中的苏东坡是鲜活的、生动的、立体的苏东坡
+
+苏东坡7岁开始读书,10岁已能开笔做文章,20岁遇人生第一个贵人张方平,赞之“麒麟之才”;21岁由欧阳修主持考试,进士及第高中榜眼(本来是第一);25岁参加制科考试(天子特召举行的特试,对待非常有才之人)得三等(一二等虚设),为“百年来第一人”,连欧阳修都自愧弗如,道“老夫当避路,放他出一头地”;历经五位君王,获仁宗、神宗、哲宗赏识青睐,做过帝师,最高位时官居礼部尚书,仁宗欣喜于苏轼苏辙二人之才华,甚至说道:我为子孙后代寻得两个太平宰相;他为人洒脱豁达,为官百姓爱戴,文章闻达天下,倾慕其才华者遍布朝野,听起来就是少年天才平步青云的快意人生。
+
+但同样是苏东坡,22岁丧母,30岁丧妻,31岁丧父,49岁丧子,66岁时病逝于异地他乡;仕途大起大落,居无定所,44岁遭遇人生重大转折“乌台诗狱”在狱一百三十余日,45岁被贬黄州,59岁被贬惠州,直到62岁更是一路南下,被贬“天涯海角”海南儋州。他的人生,就如他给李公麟所绘苏轼画像自题诗那样:“心似已灰之木,身如不系之舟。问汝平生功业,黄州惠州儋州。”
+
+> 李一冰先生在书中总结:“苏轼一生有三大目标:一是艺术的创造冲动,二是善善恶恶的道德勇气,三是关心人类的苦难。这三者,构成他的生命热情。”
+
+
+### (一)苏轼的才学艺术
+
+苏轼是个全才,这种全就像他自己所言:“博观而约取,厚积而薄发”,不仅包罗万象,更是精炼通达,经史子集,无一不通,诗书礼乐,无一不好。他的文章,使他位列“唐宋八大家”之一;他的书法《寒食帖》比肩王羲之《兰亭集序》(小故事:宋徽宗时尽毁苏轼文集,他在徐州写的《黄楼赋》碑文被太守苗仲先损毁,光是卖拓本就发了财);他跟从他的好友文同画竹,被文同夸赞“更胜一筹”。
+
+苏轼一生所作,2700多首诗,300多首词,4800多篇文章,才学名动天下。在杭州时,作“欲把西湖比西子,淡妆浓抹总相宜”千年名湖始有姓名,是千年来描述西湖最好的句子,更为银钱交汇的繁荣大都会注入了文化内涵;在密州时思念发妻作“十年生死两茫茫,不思量,自难忘”是最动人的悼亡诗;中秋佳节因不能与弟弟苏辙相聚而有感“明月几时有,把酒问青天,不知天上宫阙,今夕是何年”是家喻户晓的诵咏;贬谪黄州期间,《念奴娇.赤壁怀古》更是贡献了“大江东去,浪淘尽,千古风流人物”这样的千古名句。
+
+苏轼与王安石卸下政治的帷幕后,二人惺惺相惜,令人动容。苏轼来南京看望王安石,王安石即早早在岸边等候,两人冰释前嫌,谈诗论道。当王安石读到苏轼的“峰多巧障目,江远欲浮天”时,不禁拍案叫绝道:“老夫平生作诗,无此一句。”苏轼别去,王安石长叹:“不知更几百年,方有如此人物!”
+
+### (二)苏轼的善恶勇气
+
+北宋以文治天下,是中国历史上文明精熟的文化大帝国,苏轼生在这个知识广被推广、文化达到巅峰的时代,故能以生长于西南偏鄙之地的一个草野青年,一入京朝,立即崭露头角;但是宋代的文化虽然灿烂,而士大夫所操持的现实政治却并不理想,使一个原想出山“求为世用”的“凤凰”,成了被人人厌恶的“乌鸦”。
+
+当时北宋长期受到辽和西夏的侵扰,北宋与辽八十一战仅一战胜,可见当时兵弱国贫的境况,人民生活困苦可想而知。苏轼读书求知,本就是期望能以自己的才智,照亮社会的黑暗,疏解人民的苦难,救助时代的孤危。苏轼常感三朝皇帝知遇和器重之恩,常常奋不顾身直言,这种“难安缄默,性不忍事”的脾气,决定了他一生的命运:颠簸流离。连弟弟苏辙都整日为他担心,怕他因为不够沉稳,口出祸灾。
+
+苏轼从政以来,与实际政治的当权人物,几乎没有一个不曾发生过冲突。王安石在位时,他因反对新法开罪于当权派,被排除在政治中心之外;司马光当政尽废新法,他又建议革废新法不应操之过急,又遭到排斥,只因他一切皆处于朝廷立场,立足于百姓祸福。王安石、司马光相继罢相后,朝政鱼龙混杂,有心之人利用职权更是发动了对苏轼的“围剿”,牵强附会制造“乌台诗狱”(狱中条件艰苦,抬起胳膊就可以碰到墙壁,只有头顶一个天窗可以见光,像一口深井)。
+
+苏轼的伟大,在于他有与权力社会对立的勇气和决心,一则出于知识力量的支持,二则出于“虽千万人,吾往矣!”那份天赋的豪气。这两种气质结合起来,造成他“薄富贵,藐生死”的大丈夫气概和“拣尽寒枝不肯栖,寂寞沙洲冷”的清高孤傲。这气概,虽然使他拥有至高无上的精神财产,然而自古以来,幸福和伟大,常不两得,自由与安全,亦无法两全,苏轼之必须成为悲剧人物,几乎是必然的命运,但他也欣然接受。
+
+### (三)苏轼的精神世界
+
+苏轼一生,大起大落,起起伏伏,发达时金马玉堂,富贵无匹,落魄时被流放到杳无人烟的极地海南,他见识过贵族门第里的骄奢淫乐,也体验过闾巷小民们的贫困和无助。很少有人的生活经验,像他一样复杂,以一身而贯彻天堂和地狱两个绝对的境界。多舛的命运造就了他骨子里的悲悯,也磨砺了他的意志,通达了他的境界。所以他既有儒家的修身、齐家、治国的积极入世,又有物我两忘的道家精神,还有释家的释然和辽阔。
+
+**他的顽强和坚韧不仅仅体现在诗词文章上,更在于他对生活的热情,对挫折和逆境的接受和乐观**,正所谓“逢山开路、遇水架桥”。在山东密州,资源匮乏、生活困顿,他就经常外出捡拾野生枸杞和菊花,美其名曰养生,吃了一年多,竟然面色红润,耳目清明;在湖北黄州,他辟土种菜,自称东坡居士,自创东坡肉,自酿东坡酒,吃不起饭了就三顿减一顿,吃素喝粥;在广东惠州(即岭南),苦中作乐,作诗云:“日啖荔枝三百颗,不辞长作岭南人”。在他62岁,得知要被贬谪到当时“食无肉,病无药,居无室,出无友,冬无炭,夏无寒泉”海南儋州时,他认为此行再无生还的可能,所以变卖资产、遣散仆人、安顿后事,凄然赴海(与弟弟永诀)。可到了儋州后,他又是绝处逢生,化逆境为顺途,挖野菜,做山芋羹,喝海水辟谷,继续饮酒作诗。
+
+**苏轼所到之处,草木有灵,品尝着人间的情绪,江河有智,疏解着人间的得失,百姓有福,感怀着他的人道主义精神**。任密州太守时,一路巡行,看到密州除了蝗虫、盗贼之外,更多弃婴,都丢在城外郊野,心实不忍。他就筹出一笔经费,凡是养不起婴儿的父母,由政府每月给米六斗,劝令不要抛弃,一年以后,骨肉之爱已生,就不会再被弃了。在徐州时,觉得狱中患病的囚犯常因病不得治而死,非常不忍心。给朝廷上奏,要求配专职医生,拨专项经费,按罪责支出给予治疗,却未被朝廷重视。徐州发大水,苏轼主持治水,日夜在城上巡视,夜晚就住在城上不回家,长达70余日。
+苏轼弥留之际,对三个儿子说:“吾生无恶,死必不坠,慎无哭泣以怛化”(我此生从未做恶,死后必定不会下地狱,你们不要害怕)。苏轼临终之语反映了他淡然的心态,认为自己一生从善爱民,应当顺其自然地到达彼岸,无须刻意攀入西方极乐世界。
+
+传说蜀有老彭山,东坡生,草木不生,东坡死草木复青。20岁那年他与弟弟去京城考试,有个看相的人说“**一双学士眼,半个配军头,他日文章虽当名世,但有迁徙不测之祸**”,一语成谶,成为苏轼一生的注解。
+
+我常常想,如果可以穿越回北宋,遇到苏公,最想和他聊什么。会问他“21岁乘风破浪离开眉州,65岁飘洋过海回到内陆,后悔过入仕吗,忧思过故乡吗,你的一生算是幸运还是不幸?”他会告诉我“常恨此身非我有”早点“忘却营营”,亦或者“高处不胜寒”不如“江海寄余生”,还是会说“莫听穿林打叶声”且看“一蓑烟雨任平生”。
+
+“人生缘何不快乐,只因未读苏东坡”,并不是说和苏公比较,我们还不够惨,所以才能快乐。而是要像他一样,无论顺境逆途,都要对生活对生命保有热切的期望和持久的热情。
+
+2023年4月。
diff --git "a/_posts/2023-11-11-\350\250\200\345\256\234\346\205\242\357\274\214\345\277\203\345\256\234\345\226\204.md" "b/_posts/2023-11-11-\350\250\200\345\256\234\346\205\242\357\274\214\345\277\203\345\256\234\345\226\204.md"
new file mode 100644
index 00000000000..0513f74cc0d
--- /dev/null
+++ "b/_posts/2023-11-11-\350\250\200\345\256\234\346\205\242\357\274\214\345\277\203\345\256\234\345\226\204.md"
@@ -0,0 +1,49 @@
+---
+layout: post
+title: 言宜慢,心宜善
+subtitle: 王氏家规仅有6个字,为“言宜慢,心宜善”。
+date: 2023-11-11
+author: Ajiao
+header-img: img/post-bg-2.jpg
+catalog: true
+tags:
+ - 生活
+---
+
+从东汉至明清1700多年间,培养出了36个皇后、36个驸马、35个宰相(《二十四史》中有明确记载的),成为中国历史上最为显赫的家族,被称为“中华第一望族”。让人感到惊奇的是,王氏家规仅有6个字,为**“言宜慢,心宜善”**。
+
+然而,“言宜慢”3个字就让王氏始祖王吉在险恶的官场上顺利地渡过各种难关,十年间从一名知县成为朝廷重臣、西汉名臣。此后,王吉就把这6个字定为王氏家规,造福王氏子孙后代。六字家规创造出让人难以置信的奇迹!
+
+## 言宜慢
+
+“言宜慢”,是公元前77年王吉从七品知县调任昌邑王府中担任五品中尉时从一个老人那里得到的秘笈。
+
+昌邑王刘贺虽然是汉武帝的嫡孙,却荒淫无度,喜怒无常,身边聚集的全是一些溜须拍马的小人。在这样险恶的官场中,王吉当然会感到非常忧愁。幸运的是,他遇到了一个指点他走出迷津的老人,送给了他“言宜慢”3个字。
+
+凭借着这3个字,王吉居然渡过了一次次惊险,在官场上获得了很好的声誉,被汉宣帝刘询任命为谏议大夫,成了朝廷重臣。说话,体现着一个人的智慧。特别是年轻人,由于人生经验不足,经常在说话上吃亏。
+
+《论语》中,孔子讲了这样一句话:“侍于君子有三愆:言未及之而言谓之躁,言及之而不言谓之隐,未见颜色而言谓之瞽。”
+
+**“言未及之而言,谓之躁”没轮到你讲话时,你抢着说,这就犯了“躁”的毛病。**这就告诉我们,说话是一门艺术,一定要谨慎。历史上因为说错话而得罪人、甚至付出惨痛代价的人不胜枚举。
+
+言宜慢,**就是提醒我们说话要经过认真思虑再出口**,这样可以让我们变得更加谨慎、稳重和冷静,练就我们成熟大气的人格;**其次就是说话语调要舒缓**,这样听的人才会感到受尊重、亲切,更舒服顺耳。
+
+## 心宜善
+
+“心宜善”,是王吉在公元前67年再度经过昌邑时老人送给他的3个字。原来,随着官位的升高,王吉出现了利用职权打击报复政敌的心理,将政敌整得很惨,害得很苦。比如说,长史赵珞,就因为与王吉政见不和,被王吉恶意弹劾,最后被罢官归乡,不久就郁郁而终。
+
+在老人的劝谏下,王吉痛改前非,不再整人害人,而是客观公正地对待每个人,受到了越来越多人的欢迎,在险恶的官场上一生顺利平安。而这个送给王吉六字秘诀的老人据称就是汉武帝时的著名宰相公孙弘。
+
+**心宜善,与人为善,必有福报。**《孟子》上说,“君子以仁存心,以礼存心。仁者爱人,有礼者敬人。爱人者,人恒爱之;敬人者,人恒敬之。”心善的人,乐于助人,救人危难。周围的人都愿意与他交往,更愿意帮助他。
+
+**《道德经》上说:天道无亲,常与善人。**
+
+心宜善,能生发人的阳气,中国有句老话:“行善最乐”。四个字,大家都知道。平常看了这四个字,大家不大在意,因为把它看成是一个传统式的教条,把它当做鼓励人家的话,其实不是的。
+
+人的心理非常怪,我们做了任何一件不好的事,心理会不安、不快乐,内心不对劲。这个不安、不对劲不是对别人,而是对自己,慢慢脸色神气都会变坏,精神弄走样了。
+
+假使你真正无条件绝对地行善,帮助人家,有利于人家,做了一件好事,心境自然非常快乐。那个快乐,也不是道理上讲得出来的。
+
+言宜慢,心宜善。为何这条家规仅仅6个字却有这么大的神奇力量呢?年轻时就该“言宜慢”,这样才能深思熟虑少犯错误,从而保护自己谋求发展。而人到壮年,心智成熟、实力雄厚,这时就应该“心宜善”。这样才能少树敌手,泱泱有长者风范,受人尊崇。
+
+Via:[历史上最短的家规——言宜慢,心宜善](https://m.thepaper.cn/baijiahao_20362648)
diff --git "a/_posts/2023-11-17-\351\273\221\345\272\225\347\231\275\345\255\227\345\257\271\347\234\274\351\225\234\346\233\264\345\217\213\345\245\275.md" "b/_posts/2023-11-17-\351\273\221\345\272\225\347\231\275\345\255\227\345\257\271\347\234\274\351\225\234\346\233\264\345\217\213\345\245\275.md"
new file mode 100644
index 00000000000..f4ca9f72367
--- /dev/null
+++ "b/_posts/2023-11-17-\351\273\221\345\272\225\347\231\275\345\255\227\345\257\271\347\234\274\351\225\234\346\233\264\345\217\213\345\245\275.md"
@@ -0,0 +1,42 @@
+---
+layout: post
+title: 黑底白字对眼镜更加友好
+subtitle: 保护视力,从黑底白字开始。
+date: 2023-11-17
+author: 钱金维
+header-img: img/post-bg-2.jpg
+catalog: true
+tags:
+ - 生活
+---
+作者:钱金维Weber
+链接:https://www.zhihu.com/question/20612341/answer/2015699421
+来源:知乎
+著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
+
+有确凿的证据表明,阅读跟近视的发生和发展有关[1]。而阅读过程中,人眼不是看白底黑字,就是看黑底白字。究竟是白底黑字对眼睛好,还是黑底白字?别划走,求点赞,一起来看看德国图宾根大学对这两种屏幕显示方式的研究[2]。
+
+
+这项白底黑字和黑底白字的研究,受试者是来自图宾根大学眼科研究所的7名实验室人员。大家有时间可以去PubMed网站上搜这篇论文“Reading and Myopia: Contrast Polarity Matters”详细看。
+
+
+下面我给大家粗略讲一下这篇论文。先说研究结论:黑底白字比白底黑字对眼睛更好,黑底白字有抑制近视加深的作用。黑底白字和白底黑字,最主要的区别就在于对比度,不同的对比度刺激会引发不同的眼睛反应[3-4],具体表现在视觉系统ON和OFF的通道。
+
+研究发现白底黑字对OFF通道形成严重过度刺激,而黑底白字则过度刺激了ON通道。
+
+
+ON和OFF通路之间有明显的功能差异,Smith等人的研究发现,APB阻断ON通路可减少眼睛生长并诱发远视[5]。在相反的刺激模式下,他们变得不那么远视[6]。
+
+有相当多的证据表明,在眼睛生长和屈光不正的发展上,有选择性的激活通道和非激活通道作用。而图宾根大学的研究,7名受试者分别阅读白底黑字或黑底白字30分钟和60分钟的时候,用生物测量仪器检测脉络膜的厚度变化。
+
+
+脉络膜厚度是近视发展监测的重要指标,脉络膜变薄,近视度数易加深;脉络膜变厚,近视就能得到抑制。实验结果如下图所示:
+
+
+图上的每个subject代表一个人,参加实验的总共7人,所以你会看到有7个subject。红色的线表示阅读的是白底黑字的屏幕,而绿色的线则表示阅读黑底白字的屏幕。
+
+这七个人,不管是哪一个人,左眼右眼均出现方向一致的变化,红色线的脉络膜厚度不断减少,绿色线的脉络膜厚度不断增加。七人的脉络膜厚度变化平均结果,在上图右下角的那个以黄底色的图显示。左眼阅读白底黑字时,脉络膜厚度变薄,时间越长,脉络膜越薄;阅读黑底白字时,脉络膜厚度随时间不断增厚。而右眼阅读白底黑字时,与左眼变化一样,阅读黑底白字时,在同样的时间中,脉络膜增厚越多。
+
+研究结果:当受试者在白色背景下阅读黑色文本时,脉络膜在一小时内变薄了约16μm;当他们从黑色背景中阅读白色文本时,脉络膜增厚了约10μm。
+
+所以,我们在看屏幕的时候,设置成黑底白字对眼睛是最好的,它可以让脉络膜增厚,从而抑制近视度数上涨。长时间阅读、写作、写程序时,更应该设置成黑底白字。
diff --git "a/_posts/2023-11-21-\347\224\230\350\202\203\346\227\245\346\212\245-\345\235\232\345\256\232\344\270\215\347\247\273\346\216\250\350\277\233\342\200\234\345\233\233\345\274\272\342\200\235\350\241\214\345\212\250\350\220\275\345\234\260\350\247\201\346\225\210.md" "b/_posts/2023-11-21-\347\224\230\350\202\203\346\227\245\346\212\245-\345\235\232\345\256\232\344\270\215\347\247\273\346\216\250\350\277\233\342\200\234\345\233\233\345\274\272\342\200\235\350\241\214\345\212\250\350\220\275\345\234\260\350\247\201\346\225\210.md"
new file mode 100644
index 00000000000..0582570148e
--- /dev/null
+++ "b/_posts/2023-11-21-\347\224\230\350\202\203\346\227\245\346\212\245-\345\235\232\345\256\232\344\270\215\347\247\273\346\216\250\350\277\233\342\200\234\345\233\233\345\274\272\342\200\235\350\241\214\345\212\250\350\220\275\345\234\260\350\247\201\346\225\210.md"
@@ -0,0 +1,29 @@
+---
+layout: post
+title: 坚定不移推进“四强”行动落地见效
+subtitle: 甘肃日报-省第十四次党代会 | 什么是“四强”行动?一起来看
+date: 2023-11-21
+author: ajiao
+header-img: img/post-bg-1.jpg
+catalog: true
+tags:
+ - 工作
+---
+推动高质量发展,工作抓手至关重要。省第十四次党代会强调,要把实施强科技、强工业、强省会、强县域“四强”行动作为主要抓手,以重点地区和关键领域为突破口,推动全省综合实力和发展质量整体跃升。
+
+通过高质量发展提升综合实力、缩小发展差距,仍然是甘肃的最大任务。立足我省发展的历史方位和阶段性特征,“四强”行动完整、准确、全面贯彻新发展理念,把国家所需、甘肃所能、群众所盼、未来所向更好统筹起来,突出问题导向、目标导向、结果导向,具有很强的针对性、现实性、前瞻性。全省上下要牢牢把握这一主要抓手,以强科技催生不竭动能,以强工业促进转型升级,以强省会带动整体发展,以强县域突出县城和中心镇的节点纽带作用,有力推动甘肃高质量发展迈上新台阶。
+
+## 强科技
+就是要汇聚科技创新资源要素,增强基础研究能力、科学发现能力、技术创新能力,让科技创新成为产业升级、经济发展的主要驱动力。创新是引领发展的第一动力,是建设现代化经济体系的战略支撑。加快推动甘肃高质量发展,对科技创新的需求尤为迫切。要把科技创新摆在现代化建设全局的核心位置,以强化科技攻关、促进成果转化为导向,以深化科技体制机制改革为切入点,充分挖掘我省科技实力潜力,以打造创新联合体和新型研发机构为支撑点,加大研发投入、优化科技生态,依靠科技创新催生发展动能。
+
+## 强工业
+就是要立足省情实际和现有基础,把做大做强工业作为产业发展的主攻方向,通过技术进步和模式创新,振兴老工业基础,促进工业经济迭代升级、提质增效,带动全省经济实现结构优化、良性循环。工业是实体经济最为重要的组成部分,是富民兴陇最为关键的产业支撑。要坚定不移走新型工业化道路,顺应信息化、数字化、智能化发展趋势,改造提升传统优势产业,培育壮大战略性新兴产业,做足延链补链强链文章,在改旧育新中推动工业经济扩量提质。
+
+## 强省会
+就是要发展壮大兰州和兰州新区,着力建设要素聚集中心、科技创新中心、产业发展中心、物流输转中心、区域消费中心,打造产业园区发展、营商环境改善、现代城市建设、乡村全面振兴、公共服务供给、基层社会治理、制度体制革新的样板。兰州是全省的经济、政治、文化、科技、开放中心,要依托区位、交通、产业、科教和人才优势,聚焦功能定位、优化空间布局、突出重点板块、强化域内联动,在甘肃现代化建设中当好高质量发展的排头兵、带动省域整体发展的火车头。
+
+## 强县域
+
+就是要把县域作为经济发展的基本单元,充分发挥各县市区的主动性和能动性,有效提升县域自我发展能力,使县域逐步走上良性可持续的发展道路。县域强则省域强,县域活则全盘活,县域富则百姓富。要依托县域资源禀赋,紧扣县域发展类型,突出县域和中心镇的节点纽带作用,着力培育特色优势产业和多元富民产业,增强公共服务供给能力,打造一批工业强县、农业大县、文旅名县、生态优县,构建功能鲜明、经济繁荣、设施配套、治理有效、普惠共享的县域发展格局。
+
+“四强”行动所指,既是甘肃的短板和弱项,也是发展的潜力与希望。各地各部门要深入研究中央有关政策,进一步吃透省情,深入贯彻党代会精神,尽快使“四强”行动有清晰的思路、配套的政策、扎实的措施,并锲而不舍狠抓落实,加快提升发展质量,不断增强综合实力,甘肃必将开创全面建设社会主义现代化新局面。
diff --git "a/_posts/2023-11-22-\346\270\255\345\215\227\347\254\254\344\270\203\345\261\212\344\270\235\345\215\232\344\274\232\346\216\250\344\273\213\350\257\215.md" "b/_posts/2023-11-22-\346\270\255\345\215\227\347\254\254\344\270\203\345\261\212\344\270\235\345\215\232\344\274\232\346\216\250\344\273\213\350\257\215.md"
new file mode 100644
index 00000000000..224fd47af91
--- /dev/null
+++ "b/_posts/2023-11-22-\346\270\255\345\215\227\347\254\254\344\270\203\345\261\212\344\270\235\345\215\232\344\274\232\346\216\250\344\273\213\350\257\215.md"
@@ -0,0 +1,54 @@
+---
+layout: post
+title: 渭南第七届丝博会推介词
+subtitle: 秦创原战略性新兴产业培育先行区及渭南(西安)创新创业孵化器政策推介
+date: 2023-11-22
+author: Ajiao
+header-img: img/post-bg-1.jpg
+catalog: true
+tags:
+ - 工作
+---
+各位领导,各位嘉宾,女士们,先生们,大家下午好!
+
+非常荣幸与朋友们相聚古城西安,共同参加第七届丝绸之路国际博览会暨中国东西部合作与投资贸易洽谈会。
+
+我们衷心期待与各位一道共享机遇,共商合作,共谋发展。
+
+今年以来,渭南深入学习贯彻党的二十大精神,贯通落实习近平总书记历次来陕考察重要讲话重要指示,把科技创新作为渭南高质量发展的最大潜能、最强动力和最紧迫任务,出台了《关于深入实施创新驱动发展战略加快推进科技强市建设的实施意见》,聚焦高端装备制造、新能源、新材料和3D打印等战略性新兴产业,推动创新链产业链资金链人才链深度融合,着力构建现代化产业体系,全力打造秦创原战略性新兴产业培育先行区。
+
+下面,我围绕秦创原战略性新兴产业培育先行区建设和渭南(西安)创新创业孵化器发展运营情况向各位作以简要介绍。
+
+## 一、聚力渭南秦创原平台建设,打造新兴产业培育先行区
+
+打造秦创原战略性新兴产业培育先行区是贯彻省委全会精神,落实全省秦创原建设推进大会要求,以渭南国家和省级高新区为主阵地,协同带动市域园区,通过提升配套、精准招商、项目推进、人才引育、技术攻关、成果转化、金融赋能等举措,优存量、扩增量,重点突破高端装备制造、新能源、新材料和3D打印等战略性新兴产业,培育带动新一代信息技术、生物技术、新能源汽车、节能环保、数字创意、现代服务业,壮大战略性新兴产业集群,推动全市经济高质量发展。
+
+利用这个机会,我向大家着重推介鼓励企业做大做强、成果转化、招才引智、金融赋能等四个方面的具体举措和支持政策。
+
+1.支持企业做大做强。强化企业创新主体地位,多措并举支持科技型中小企业、高新技术企业发展壮大,为经济高质量发展增添动能,制定《渭南市科技型企业创新发展倍增计划》,实施“登高”“升规” “晋位” “上市”四大工程。对国家级“单项冠军”示范企业、培育企业,分别给予200万元、100万元奖励。对国家两化融合贯标企业给予30万元奖励。对国家级、省级绿色园区、绿色工厂、互联网与工业融合示范企业、服务型制造示范企业,分别给予50万元、30万元奖励。对高新技术企业给予10万元支持。对国家级、省级企业技术中心、工程实验室、工业设计中心等创新平台,以及技术创新示范企业、专精特新、质量标杆企业,分别给予100万元、50万元奖励。对制定国际标准、国家标准、行业标准的主要起草单位,分别给予1000万元、200万元、100万元奖励。对投资额在1000万元以上的技改项目,按实际完成投资额的2%给予奖励,最高500万元。对上年度在上海、深圳、香港证劵交易所上市的企业,给予1000万元奖励。
+
+2.推动企业成果转化。出台《渭南市促进科技成果转化实施办法》,在省内率先引进了西安交通大学国家技术转移中心,在蒲城、富平和华阴等县市区搭建了县级工作站,组建了秦创原渭南科技服务团,成功构建了“市有分中心、县有工作站、企有服务团”的科技成果转化体系,正在对接陕西科技大学技术转移平台和国家技术转移东部中心落地渭南。届时,全市科技服务能力将会得到进一步提升,为承接陕西“三项改革”成果落地渭南,夯实基础。对在渭转化的科技成果,按企业投资额的10%给予奖励,最高500万元。对中、省科技进步奖在渭转化落地的项目,最高给予100万元支持。对省、市技术转移示范机构,给予20万元、10万元补助。对市级科技服务示范机构,给予10万元补助。
+
+3.鼓励企业招才引智。加快推动“智趋华山、才聚渭南”英才计划,出台《渭南市推动人才“校招共用”“市引县用”十条措施》,对入选省、市“科学家+工程师”队伍的企业,给予10万元补助。对市属企业全职引进且签订5年以上合同的博士,给予15万元补助,同时享受体检、慰问、子女入学等高层次人才政策。对柔性引进的博士,在食宿、交通等方面提供“管家式”服务。对招才引智工作成效突出的企业,给予10万元到30万元补助。对国家级、省级企事业单位引智示范平台,给予10万元、5万元补助。
+
+4.支持企业金融赋能。紧盯企业发展短板,解决企业融资难题,先后成立了产业发展基金、工业倍增基金、天使基金、科创基金、3D打印基金和奶山羊基金等一系列基金,完善科创企业成长全生命周期金融服务体系,坚持“投行思维”“链式招商”,成功引进了华诚领航等一批科技型企业落地渭南。其中,渭南市科技创新发展基金“以投带招”引进多个项目,成为陕西地市创投基金“渭南模式”强链补链的具体实践,是“央企+上市公司+地方政府+创投基金”联动合作的典型案例,《陕西日报》对此做过专题报道。
+
+## 二、实施“西安研发渭南制造”行动,打造飞地孵化新样板
+
+渭南(西安)创新创业孵化器是渭南市政府在西安高新区建设的全省地市首家综合型飞地创新创业孵化器。2019年启动运营,累计引进孵化企业89家,在渭注册企业77家,培育高新技术企业21家,投资落地企业4家,先后创建省级众创空间、省级科技企业孵化器,成功探索了“西安研发、渭南转化、园区落地”的飞地孵化新模式。
+
+1.孵化器地理位置优越,创新氛围浓厚。孵化器位于西安高新区瞪羚一路A区8号雷信科技产业园,距离省科技厅200米,处于西安国家高新区创新创业核心功能区——瞪羚谷,是西安乃至陕西创新创业核心区域。周边分布有西安高新现代企业中心园区、陕西众创空间、西安理工大学科技园、北斗产业园等,科技企业众多,创新资源集聚,创新氛围浓厚。
+
+2.孵化器配套设施齐全,服务功能完备。孵化器总建筑面积10500平方米,内设科技企业孵化区、创新创业众创空间、创业导师培训室等多个创新创业服务场地,并配有专家公寓、餐厅、创业咖啡屋、健身房等配套设施,具有科技成果转化孵化、招商引资、研发服务、引领示范和窗口展示五大功能,能为入驻企业和团队提供工商注册、人力资源、项目申报、创业辅导、资本对接、成果转化、投资生产等企业全生命周期服务。
+
+3.孵化器运营团队专业,思路模式创新。孵化器按照“去行政化”模式运行,采用“科技牵头、企业运作、高校运营”的市场化思路,先后委托上海同济大学国家大学科技园、西安交通大学国家技术转移中心运营。这种市场化组织架构,既能有效发挥科技部门统筹协调各类科技资源,助力孵化器创新发展的职能作用,又能按照市场化运作模式,主动服务企业,提升孵化效能。
+
+4.孵化器市县全面联动,落地机制顺畅。渭南市建立了由分管副市长任组长,市科技局和渭南高新区等10多个部门为成员单位的孵化器运营工作领导小组,统筹推进孵化器在孵企业入孵政策落实、在渭注册落户、园区投资落地等重点工作,确保各项运营管理工作有效推进和落实到位。同时,孵化器与市域内各高新区和重点产业园区都建立了深度合作关系。对意向落地企业,孵化器联合相关产业园区,开展“保姆式”服务,协助企业落地投产。
+
+5.孵化器政策持续加持,体系逐步完善。为确保入驻企业招得来、留得住、长得大,孵化器出台了《关于鼓励支持渭南(西安)创新创业孵化器入驻企业创新发展的若干政策》,共20条,包括房租减免、研发补助、人才引进、成果转化等优惠政策,并设置政策落实专员,协助入驻企业享受各类政策,确保“入驻即享,享受到位”,不断提升孵化器的竞争力,激发企业创新创业活力,为入驻企业发展保驾护航。
+
+6.孵化器孵化服务精准,赋能企业发展。孵化器始终坚持服务企业导向,持续推行“管家式”超前服务,统筹利用资金、技术、人才、信息、管理、市场等各种资源,借助运营团队丰富、专业的孵化运营经验,为引进的科技型企业提供全生命周期综合服务,助力企业发展壮大。运营四年来,累计组织各类培训活动134场次,其中创新创业培训98场次,融资培训21场次,财务税收培训15场次。在中国创新创业大赛陕西赛区,多家孵化器入驻企业脱颖而出,先后获得各类基金和投资机构股权投入支持,并快速发展壮大。渭南双盈未来科技公司当年入驻、当年毕业、当年建设、当年运营,产品全部实现出口,成为渭南外贸出口重点企业。
+
+女士们、先生们、朋友们!新时代的渭南,聚集了巨大的发展潜能,拥有广阔的发展前景。热忱欢迎各位企业家、各界朋友到渭南考察指导、交流合作,渭南将全面践行“亲商、敬商、爱商、重商”的服务理念,不断优化发展环境,持续提升服务水平,做好项目洽谈、签约、落地和建设的全流程跟踪服务,努力使各位企业家在渭南投资安心、生活舒心、发展更有信心!
+
+最后,预祝本次大会取得丰硕成果!祝各位领导、各位嘉宾工作顺利、阖家幸福!谢谢大家!
diff --git "a/_posts/2023-12-14-\345\244\247\345\224\220\344\272\241\344\272\216\345\244\251\350\260\264\357\274\237.md" "b/_posts/2023-12-14-\345\244\247\345\224\220\344\272\241\344\272\216\345\244\251\350\260\264\357\274\237.md"
new file mode 100644
index 00000000000..c38c7dac070
--- /dev/null
+++ "b/_posts/2023-12-14-\345\244\247\345\224\220\344\272\241\344\272\216\345\244\251\350\260\264\357\274\237.md"
@@ -0,0 +1,183 @@
+---
+layout: post
+title: 大唐亡于天谴?
+subtitle: 转载自微信公众号《锦绣人文地理》
+date: 2023-12-14
+author: Ajiao
+header-img: img/post-bg-1.jpg
+catalog: true
+tags:
+ - 学习
+---
+当第一场雪降临长安城的时候,唐玄宗和所有人都觉得,这个冬天,似乎来得比较早。
+
+
+这是大唐开元二十九年九月丁卯日(741年10月21日),这场初雪,相比长安城的往年,提前了约38天。
+
+唐玄宗没有意识到的是,大唐帝国在从618年建国后,持续100多年的暖湿气候,将以这场初雪作为标志,此后逐渐走入冷干气候,并掀起一场帝国的剧变。
+
+随着开元盛世进入最后一年的尾声,寒冷的气候,也给北方游牧的契丹和奚族带来了剧烈的冲击,他们开始频繁南下冲击大唐帝国的边疆。
+
+就在这场比往年明显提早的初雪之后的第二年,大唐天宝元年(742年),40岁的安禄山被正式任命为东北边疆的平卢节度使。13年后(755年),在东北掌权多年的安禄山,将带领手下的兵士和契丹、奚族的叛胡,掀起一场几乎摧毁大唐帝国的动荡。
+
+没有人意识到气候转型的隐性效应和巨大威力。但大唐帝国,即将因为气候转冷和诸多综合因素,走上毁灭的冬天。
+
+在中国的历史性气候循环中,曾经出现过四个寒冷期,分别是东周(春秋战国)、三国魏晋南北朝、五代十国两宋、明末至清朝共四个气候冷干时期,而与之相对应,则是中国的王朝动荡以及北方游牧民族在天灾人祸之下、不断南下冲击农业民族领地。
+
+
+在中国科学院地理科学与资源研究所所长葛全胜看来,第三个寒冷期的分界点,如果仔细追溯,开元盛世最后一年(741年)的这一场明显提前一个多月的初雪,显然是值得关注的标志性事件,在此后,大唐帝国逐渐进入冷干寒冷期,尽管中间有短暂的暖湿回温,但并未改变此后整体的寒冷趋势。
+
+此前在隋末时期,中国气候在南北朝末年暖湿多年后,再次转入干冷时期,先是582年,突厥由于北方干冷天灾入侵,隋军组织反击,“士卒多寒冻,堕指者千余人”;到了589年,当年杨广被立为皇太子,“其夜烈风大雪,地震山崩”;到了600年,“京师大风雪”;609年,隋炀帝至青海攻吐谷浑,“士卒冻死者太半”;612年,“(隋炀)帝亲征高丽,六军冻馁,死者十八九”。
+
+尽管隋炀帝滥用民力激发民变,但仔细考察隋朝末年的气候记载,可以发现,隋朝末年的气候明显属于干冷时期,以致来自东北和西北的少数民族南侵压力增大,而内部的自然灾害和政治失措,种种压力叠加,最终促成了隋朝的灭亡。
+
+公元618年唐朝建立后,得益于此后持续一百多年的气候暖湿时期,加上李渊父子的经营,大唐得以逐渐平定四方势力,建立起了一个统一帝国,这时期,荔枝在四川的多点广泛种植和进贡长安,是唐朝前期气候暖湿、帝国平稳安乐的重要表现。
+
+对于大唐帝国这座暖湿的气候,多次吃过荔枝的诗人杜甫深有体会。就在戎州(今四川宜宾)的一次宴会中,杜甫写道:
+
+座从歌妓密,乐任主人为。
+重碧拈春酒,轻红擘荔枝。
+
+对此,中唐诗人卢纶(739-799年)也对盛产荔枝的四川印象很深刻,在《送从舅成都县丞广归蜀》 诗中,卢纶写道:
+
+晚程椒瘴热,野饭荔枝阴。
+
+由于毗邻关中地区长安城的唐代四川盛产荔枝,这就使得杨贵妃拥有了吃荔枝的可能,因为以当时的交通和保鲜条件,遥远的两广岭南地区的荔枝,根本难以保质保鲜的送到长安,所以当大唐帝国逐渐衰落以后,中晚唐诗人杜牧还感慨地回忆唐玄宗当年兴师动众,为杨贵妃进献荔枝时说:
+
+一骑红尘妃子笑,无人知是荔枝来。
+
+实际上,由于唐朝前期气候温暖,因此有19个冬天,大唐帝国长安城,是不下雪的。
+
+那时候由于气候温暖,长安城中还种植柑橘,而在今天,关中地区寒冷的气候,使得最低只能经受零下8度寒温的柑橘,早已无法适应生存。《酉阳杂俎》就曾经记载,天宝十载(751年),长安皇宫中的橘子树结了150多颗大橘子,唐玄宗为此还吩咐将他们都分送给大臣们。
+
+但大唐帝国的气候正在逐渐逆转,以梅花为例,唐代的长安和华北、西北一带广泛种植梅花,诗人元稹就曾经在和好友白居易游览曲江池后,赋诗《和乐天秋题曲江》:
+
+长安最多处,多是曲江池。
+梅杏春尚小,芰荷秋已衰。
+
+梅花最低只能经受零下15度的寒温,在安史之乱前暖湿的气候中,梅花开遍了长安城,但随着气候的逐渐转冷,进入五代十国两宋的寒冷期后,到了北宋时期,北方很多人已经不认识梅花了,以致大才子、江西人王安石曾经写诗笑话说,北方人到了南方,第一次看见梅花不认识,还以为是杏花:
+
+北人初不识,浑作杏花看。
+
+拥有荔枝、柑橘和梅花的大唐长安城是幸福的,而这种幸福,即将因为气候的逐渐逆转而消失。
+
+根据气候学家推算,大概在公元650年的唐朝初期,至中唐时期的公元800年,这一时期唐朝的平均气温,约比今天高1.2摄氏度;公元800年以后,唐朝总体平均气温低于现今平均温度,其中在唐朝末年的公元880年,更是比今天低了0.6摄氏度。
+
+安史之乱前夕的唐人,没有现今记录气候的先进技术,但他们从长安城不断提前来到的大雪中感受到,气候,确实明显变冷了。
+
+而在冷湿气候的不断加重下,自从东汉初期王景治理黄河后,已经相对平静了700多年的黄河,洪水泛滥的次数也在不断增加。
+
+以公元741年的这场早到一个多月的初雪为标志,唐朝的气候开始逐渐进入了冷湿时期,由于降水不断增多,加上人口剧增、砍伐森林、水土流失等因素的多重作用,到了唐朝中期以后,黄河泛滥的次数日益增加。
+
+根据史料统计,在唐朝初期的7世纪,黄河的决溢是6次,到了中唐时期的8世纪是19次,到了晚唐时期的9世纪是13次,在冷湿气候降水增多的多重因素综合作用下,黄河在唐代明显进入了泛滥期,其中从公元746年到905年,黄河大概每10年就会决溢一次,对此主要生活在安史之乱以后的诗人孟郊(751-814年)就在《泛黄河》中写道:
+
+谁开昆仑源,流出混沌河。
+积雨飞作风,惊龙喷为波。
+湘瑟飕飗弦,越宾呜咽歌。
+有恨不可洗,虚此来经过。
+
+诗人刘禹锡(772-842年)对于频繁的河患也印象深刻,为此他在《浪淘沙》中写道:
+
+九曲黄河万里沙,浪淘风簸自天涯。
+
+频繁的河患使得大唐帝国疲于奔命,但唐人不知道的是,气候之手的运转,正在逐渐摧毁大唐帝国的国运,与冷湿气候导致降水增多、黄河频繁泛滥相对应,在东北的边疆,冷湿气候导致的频繁大雪和自然灾害,也使得游牧的契丹和奚族不断南下入侵掠夺物资。
+
+帝国的东北边疆压力不断剧增,与此同时,受到唐玄宗信任的安禄山则倚靠着东北的局势不断增加势力。到了安史之乱前夕,在东北边疆拥兵20万的安禄山,已经身兼平卢、范阳和河东三镇节度使。尽管不断有人提醒唐玄宗说安禄山可能叛乱,但唐玄宗都置之不理。
+
+于是,就在大唐天宝十四载(755年)农历十一月,借助大唐不断转冷的冬天,安禄山带领着15万不同民族的骑兵、步兵从范阳起兵造反,从而掀开了此后改变大唐国运的安史之乱(755-763年)的序幕。
+
+到了天宝十五载(756年),唐玄宗在安史叛军的凌厉攻势下仓惶逃亡四川,史书记载说,这一年九月十九日,四川已经“霜风振厉,(朝臣们)朝见之时,皆有寒色”,看到大臣们农历九月就已被冻得瑟瑟发抖,唐玄宗于是下令改变旧制,允许朝臣们穿着衣袍上朝。
+
+根据史料记载,从公元741年提前到来的初雪开始,大唐帝国的平均气温,大概比此前的一百年下降了1摄氏度,在农业时代,不要小看这小小的1摄氏度,它的结果就是造成北方严寒,对草原等植被造成损害,从而导致牲畜承载能力降低、人地关系不断趋于紧张,在这种情况下,畜牧业难以维持的北方游牧民族,开始不断南侵。
+
+葛全胜等气候学家则认为:“安禄山所辖三镇(平卢、范阳、河东)由于地处中国农牧交错带,其农牧业生产对气候变化极端敏感,当季风强盛,雨带北移,所辖区内雨水丰盈,农作有依。反之则旱灾连片,农业歉收。天宝年间,平卢、范阳、河东三镇干湿变率明显偏高,旱灾频发,导致民众生存环境持续恶化,这可能使得安禄山得以借口中央政府赈灾不力而公开反叛朝廷。于是羁縻于幽州、营州界内无所役属的东北降胡甘心受其驱使,南下为祸中原。”
+
+到了763年,尽管安史之乱平息,但大唐帝国的气温也在不断缓慢下降,史书记载,765年正月,长安城“雪盈尺”;766年正月,“大雪平地二尺”;767年十一月,长安城“纷雾如雪,草木冰”;769年夏天,长安城“六月伏日,寒。”
+
+就在这种气候不断逆转的寒冬中,诗人杜甫,也走到了生命的尽头。
+
+就在临死前一年的769年,诗人杜甫流落到了潭州(今湖南长沙),起初,他以为潭州并不下雪,还高兴地写诗说:
+
+湖南冬不雪,吾病得淹留。
+
+但实际上,当时就连长沙也不断大雪了,于是到了769年冬天,杜甫又写诗说:
+
+朔风吹桂水,大雪夜纷纷。
+……
+烛斜初近见,舟重竟无闻。
+
+北雪犯长沙,胡云冷万家。
+随风且开叶,带雨不成花。
+
+在南方,大唐帝国不断转冷的气候加上病困,最终彻底击倒了诗人杜甫,就在到达长沙后的第二年,公元770年,杜甫最终死在了由潭州前往岳阳的一艘小船上。
+
+盛唐最后的荣光,最终也死于严寒之中。
+
+贞元年间(785-805年),唐德宗就下令将唐朝此前定下的月令“九月衣衫,十月始裘”提前一个月。
+
+随着气候的转冷,部分原来分布北方的野生动物,也在不断退却。在唐代以前,犀牛是曾经广布中国北方的大型哺乳动物,然而随着人类的猎杀和森林的砍伐减少,加上气候的转变,犀牛从中唐时期开始,已经难以在北方见到了。
+
+于是,位处今天东南亚地区的环王国,特地向唐朝进献了一只犀牛,对此诗人白居易(772-846年)就曾经在《驯犀-感为政之难终也》诗中写道:
+
+驯犀驯犀通天犀,躯貌骇人角骇鸡。
+海蛮闻有明天子,驱犀乘传来万里。
+一朝得谒大明宫,欢呼拜舞自论功。
+
+曾经北方地区平常之物的犀牛,如今转眼成为了蛮夷进献的珍稀野兽,但就是这只犀牛,也难以抵挡长安不断变冷的冬天。到了唐德宗贞元十二年(796年)十二月,唐德宗“甚珍爱之”的这只犀牛最终被冻死,那个月,长安城内“大雪甚寒,竹、柏、柿树多死。”
+
+值得关注的是,796年的记载中,关于竹子被冻死的记录也不可忽略。在唐朝的中前期,由于气候相对暖湿,因此中原地区仍然存有大规模的竹林,唐朝甚至设有专门的司竹监管理竹林事务。但随着气候不断转冷和人类滥砍滥伐,到了北宋初期,由于当时竹子在北方已经难以存活,大规模竹林在北方更是趋于消失,最终,司竹简这个政府机构,也在北宋时被撤销。
+
+喜欢暖湿气候的动植物在北方不断退却,反映的正是唐朝时气候不断趋于变冷的事实,在这种背景下,诗人白居易写下了《放旅雁》:
+
+九江十年冬大雪,江水生冰树枝折。
+百鸟无食东西飞,中有旅雁声最饥。
+雪中啄草冰上宿,翅冷腾空飞动迟。
+
+酷雪寒冬,大雁觅食艰难饥声动人,与此同时,因为气候转入冷湿、天灾频发、国力虚弱的大唐帝国,内乱也持续不断。
+
+唐代宗宝应元年(762年),由于洪水泛滥过后,“江东大疫,死者过半”,在饥荒、瘟疫和军需物资极度紧张的情况下,唐军内部爆发了王元振之乱;到了唐代宗广德二年(764年),由于大旱过后蝗灾爆发,以致“米斗千钱”,此时唐朝中央又征发河中地区兵士讨伐吐蕃,由于军需没有到位,于是士兵们又发动河中之乱。
+
+在这种气候转变,导致灾害频发,加上唐朝中央国力衰弱、赈灾不力等多重因素作用下,唐朝的内部动乱不断演化,到了唐德宗建中四年(783年),泾原镇士兵被征发前往平定藩镇叛乱,但结果唐朝中央由于财力困窘,却没有好好招待,以致泾原镇士兵一怒之下攻入长安,唐德宗不得不狼狈逃出长安,史称泾原兵变。
+
+而在受到气候变化影响最为明显的黄河中下游、淮河下游和长江下游,兵乱也不断发生,据统计,从850年到889年,伴随自然灾害的不断增加,唐朝的兵变也不断发生,这一时期,唐朝共有多达26次兵变发生,这里面,都有着气候变化的推波助澜作用。
+
+在气候变化,冷湿气候与冷干气候的交织影响下,大唐帝国在河患严重之外,旱灾和蝗灾也相继而起。
+
+安史之乱(755-763年)以后,唐朝的蝗灾开始明显加剧,其中公元783-785年连续三年大蝗,836-841年连续六年大蝗,862-869年连续八年大蝗,875-878年连续四年大蝗。
+
+在安史之乱以后藩镇割据、政治治理失控、蝗灾四起的背景下,唐朝咸通九年(868年),由于唐朝政府财政拮据、克扣兵士,长期在桂林戍守的徐州、泗州兵八百人因为超期服役却不能返乡,随后发动兵变,并拥护粮料判官庞勋为首北归,这支叛变的军队在抵达淮北地区时,刚好碰上江淮流域连续多年蝗灾,加上当时再次水灾,“人人思乱,及庞勋反,附者六七万”。
+
+由于水旱蝗灾并起,无数失去生存依托的灾民纷纷投靠庞勋的部队,使得庞勋的军队迅速扩张到了二十万人,尽管遭遇唐朝和各路藩镇的强力镇压最终失败,但庞勋领导的桂林戍卒起义,也在蝗灾的助力下迅速扩散。
+
+庞勋失败后,唐朝境内的蝗灾继续蔓延,到了乾符二年(875年),唐朝境内的蝗灾更是“自东而西,蔽日,所过赤地”,面对这种遍布整个帝国北部的大蝗灾,唐朝的官僚群体却忽悠唐僖宗说,蝗虫全部自己绝食,“皆抱荆棘而死”了,为此,当时几位宰相还向唐僖宗祝贺说这是上苍有灵。
+
+面对当时大规模旱灾和蝗灾蔓延的局势,当时有百姓向唐朝的陕州观察使崔荛哭诉旱灾、蝗灾之巨,没想到崔荛却指着官署里的树叶说:“此尚有叶,何旱之有?”然后将请求赈灾的百姓暴打一顿了事。
+
+在这种大规模旱灾、蝗灾相继侵袭,唐朝整个官僚集团却从上到下不闻不问的情况下,“州县不以实闻,上下相蒙,百姓流殍,无所控诉”,于是,整个唐帝国内部,人民开始“相聚为盗,所在蜂起”。
+
+当时,唐末气候寒冷导致旱灾频发,而位处今天山东地区的郓州、曹州、濮州,由于靠近黄河“河泛、滨湖、内涝三类蝗区兼有,是理想的蝗虫发生基地”,这就使得这一地区在气候变化的干扰下受灾尤其严重,于是,就在蝗灾肆虐的乾符二年(875年),王仙芝在蝗灾最为严重的濮州(今山东鄄城)领导发起了一场为时三年之久的大规模农民起义,王仙芝在878年被杀后,他的余部又继续投靠黄巢。
+
+而黄巢大规模起事的这一年(乾符五年,公元878年),正是唐僖宗时期蝗灾最为严重的一年,对此,唐京西都统郑畋在其讨伐黄巢的檄文中就写道:“近岁螟蝗作害,旱暵延灾,因令无赖之徒,遽起乱常。虽加讨逐,犹肆猖狂。”明确指出蝗灾正是直接激发王仙芝、黄巢起事的重大背景。
+
+旱灾、蝗灾频发,其根本原因,正是气候变化的推手所致。
+
+到了884年,黄巢之乱最终被平定,但几乎纵贯中国南北,从山东一直打到广东、又转入陕西、占领长安的黄巢军队,也使得在唐末一度出现宣宗之治(847-859年)、原本略有回光返照的大唐王朝,转入了彻底的动荡和衰败,此后,藩镇割据更加肆无忌惮,人民四散流离,帝国哀嚎之声不断。
+
+在这种气候变化和人为动乱的交织作用下,咸通八年(867年),也就是庞勋起义的前一年,终于考中进士的诗人皮日休,也在帝国的哀嚎声中,无意中碰到了一位以捡拾橡果谋生的老妇人,在《橡媪叹》中他写道:
+
+秋深橡子熟,散落榛芜冈。
+伛伛黄发媪,拾之践晨霜。
+移时始盈掬,尽日方满筐。
+几嚗复几蒸,用作三冬粮。
+……
+自冬及于春,橡实诳饥肠。
+吾闻田成子,诈仁犹自王。
+吁嗟逢橡媪,不觉泪沾裳。
+
+在人民生路日益窘迫的艰难中,诗人皮日休一度参加了黄巢的乱军,公元884年黄巢兵败后,皮日休最终不知去向。
+
+在皮日休的晚唐哀歌中,大唐帝国关于气候寒冷、“米斗钱三千”、“人相食”的记录也不断见诸于书。到了唐朝的倒数第二年(906年),这一年闰十二月乙亥日,史书记载洛阳城中在“震电”之后“雨雪”。
+
+第二年,公元907年,原本为黄巢部将、后来投降唐朝的野心家朱温,最终以武力逼迫唐哀帝李柷禅位,并改国号为大梁。
+
+在气候之手的推动下,大唐彻底陨落了。
\ No newline at end of file
diff --git "a/_posts/2023-12-14-\345\255\246\344\271\240\347\232\204\344\271\220\350\266\243.md" "b/_posts/2023-12-14-\345\255\246\344\271\240\347\232\204\344\271\220\350\266\243.md"
new file mode 100644
index 00000000000..65488d884d0
--- /dev/null
+++ "b/_posts/2023-12-14-\345\255\246\344\271\240\347\232\204\344\271\220\350\266\243.md"
@@ -0,0 +1,18 @@
+---
+layout: post
+title: 学习的乐趣
+subtitle: 学习obsidian有感
+date: 2023-12-14
+author: Ajiao
+header-img: img/post-bg-3.jpg
+catalog: true
+tags:
+ - 学习
+---
+年底工作超忙,各种杂事揉在一起,忙的不可开交。即便如此,还是忙里抽闲,入坑了笔记软件obsidian。
+
+obsidian的插件多,功能也多,本地化,速度很快,解决了notion网络不畅的难点,但有一定的学习成本。
+
+通过不断的摸索,不断的失败,最近学会了用github同步obsidian。当然,最重要的还是,学会用obsidian作静态博客jekyll的后台管理程序。
+
+太棒了!从现在开始,不管是电脑,还是安卓,都解决了静态博客没有后台的大难题。可以随时随地的发文章了,而且还是美观的obsidian后台。
\ No newline at end of file
diff --git "a/_posts/2023-12-14-\347\247\213\346\227\245\345\233\236\344\271\241\345\201\266\350\256\260.md" "b/_posts/2023-12-14-\347\247\213\346\227\245\345\233\236\344\271\241\345\201\266\350\256\260.md"
new file mode 100644
index 00000000000..f27715e48a9
--- /dev/null
+++ "b/_posts/2023-12-14-\347\247\213\346\227\245\345\233\236\344\271\241\345\201\266\350\256\260.md"
@@ -0,0 +1,21 @@
+---
+layout: post
+title: 秋日回乡偶记
+subtitle: 秋色之美,美在山色
+date: 2023-12-14
+author: Ajiao
+header-img: img/post-bg-2.jpg
+catalog: true
+tags:
+ - 生活
+---
+立冬过后,天气渐冷。刚过小雪,气温骤降。思父母居乡间,冬日难熬。遂周末驾车回乡,接父母来渭过冬。
+
+上南塬,过蓝田。从太乙宫进秦岭。虽已入冬月余,山中秋色仍浓。层峦叠嶂,红橙黄绿,揉在一起,整个世界色彩斑斓。从近至远,美不胜收。
+
+至鱼洞河,细雨几滴,天色阴沉,风景更佳。灰色的浓厚云层,五彩斑斓的山色,一层层沿着河岸铺将开去。
+
+终于,秋色和暮色混在一起,消失在山巅云际之间。远山黛影,霎时间呈现在眼前。平生首感,秋色之美。
+
+
+
diff --git "a/_posts/2023-12-15-\345\205\245\345\206\254\345\220\216\347\232\204\351\246\226\345\234\272\351\233\252.md" "b/_posts/2023-12-15-\345\205\245\345\206\254\345\220\216\347\232\204\351\246\226\345\234\272\351\233\252.md"
new file mode 100644
index 00000000000..236a9e4472c
--- /dev/null
+++ "b/_posts/2023-12-15-\345\205\245\345\206\254\345\220\216\347\232\204\351\246\226\345\234\272\351\233\252.md"
@@ -0,0 +1,22 @@
+---
+layout: post
+title: 入冬后的第一场雪
+subtitle: 真正的冬天来了
+date: 2023-12-15
+author: Ajiao
+header-img: img/post-bg-2.jpg
+catalog: true
+tags:
+ - 生活
+---
+早上刚起床,就听见妈妈在客厅说,昨晚下了一夜雪,好大的雪。透过窗户看出去,不够真切,全无踪影。
+
+
+
+刚下电梯,一股冷风扑面而来,风里还夹杂着碎碎的雪花。走到车边,挡风玻璃上已铺上了一层厚厚的残雪。
+
+这是今年入冬后第一场雪,以前虽然也下过,但没这么冷,也没这么大。只可惜今天下的不多,下的不痛快。
+
+之前可以说是深秋。秋色正美,气温微凉。每逢日暮,灯影下,暖风拂面。恍惚中,竟有种春风沉醉之感。
+
+这场雪后,天寒地冻,真正入冬了。
diff --git "a/_posts/2023-12-15-\351\207\221\345\272\270\347\276\244\344\276\240\346\236\201\347\256\200\345\217\262.md" "b/_posts/2023-12-15-\351\207\221\345\272\270\347\276\244\344\276\240\346\236\201\347\256\200\345\217\262.md"
new file mode 100644
index 00000000000..5433935f177
--- /dev/null
+++ "b/_posts/2023-12-15-\351\207\221\345\272\270\347\276\244\344\276\240\346\236\201\347\256\200\345\217\262.md"
@@ -0,0 +1,354 @@
+---
+layout: post
+title: 金庸群侠极简史
+subtitle: 转载自微信公众号《菊斋》
+date: 2023-12-15
+author: Ajiao
+header-img: img/post-bg-3.jpg
+catalog: true
+tags:
+ - 学习
+---
+
+>你瞧这些白云,
+>聚了又散,散了又聚,
+>人生离合,亦复如斯。
+
+程英说这话的时候,大概是1243年。
+
+---
+所有的故事,大概开始于公元前476年。
+
+**公元前476年**,是周元王元年,中国史上战国的开始,也是金庸武侠世界的开始,是年越国大夫范蠡寻到牧羊女阿青,为八十名骁勇的越国剑士传授剑法。
+
+> 八十名越国剑士没学到阿青的一招剑法,但他们已亲眼见到了神剑的影子。每个人都知道了,世间确有这样神奇的剑法。八十个人将一丝一忽勉强捉摸到的剑法影子传授给了旁人,单是这一丝一忽的神剑影子,越国吴士的剑法便已无敌于天下。
+
+当年读到《越女剑》里这段话,就象三毛读到“白茫茫一片大地真干净”一样,我心生怔忡,永远难忘。
+
+时光飞纵。转眼就跨越百年千年。
+
+**526年**,印度高僧培提达摩来到中国,在嵩山少林寺面壁九年。**640年**,180年的高昌古国终于撑不住了,亡在唐朝大将侯君集手里。大唐开启了它光耀万方的时代。**694年**,波斯人拂多诞持《二宗经》来朝拜武则天,这是摩尼教(明教)在中国公开传教的起始。**877年**,庄义方成立丐帮。**937年**,段思平建大理国。**950年**,丐帮第三代帮主改良打狗棒法。**1000年**,无崖子出生。**1030年**,慕容博出生。**1051年**,扫地僧到少林寺。**1060年**,萧峰出生。
+
+这些看似不相干、乱纷纷,却都在为将来埋下草蛇灰线。
+
+**1061年** ,雁门关外的乱石谷,“燕云十八飞骑,奔腾如虎风烟举”,少林寺玄慈方丈和丐帮帮主汪剑通带队中原武林,误与契丹人萧远山结下血海深仇,引出日后数十年的人事巨变。这一切误会,都是缘于慕容氏那痴心的“王霸雄图”。
+
+一阙【水龙吟】,说尽前尘后事:
+
+> 燕云十八飞骑,奔腾如虎风烟举。老魔小丑,岂堪一击,胜之不武。王霸雄图,血海深恨,尽归尘土。念枉求美眷,良缘安在。枯井底,污泥处。酒罢问君三语。为谁开,茶花满路。王孙落魄,怎生消得,杨枝玉露。敝履荣华,浮云生死,此身何惧。教单于折箭,六军辟易,奋英雄怒。
+
+而这数十年的人事巨变里,免不了恩怨纠缠,孽爱纷纭。
+
+**1062年**,被迫跳崖未死的萧远山跑到少林偷学武功,而他尚在襁褓的儿子萧峰,则被玄慈和汪剑通救下,寄养在少室山下农民乔三槐家里,并改名乔峰。
+
+**1063年**,丁春秋暗算师门,将师父无崖子打落悬崖,生死不知。无崖子的师妹李秋水远嫁西夏。无崖子的女儿李青萝以后认识了大理镇南王段正淳,在曼陀山庄念念不忘。
+
+> 春沟水动茶花白,夏谷云生荔枝红。青裙玉面如相识,九月茶花满路开。
+
+她忘不了段正淳写给她的这首诗。也忘不了段郎的心头好。
+
+因为大理有世间最美的茶花,李青萝在曼陀山庄也种了很多茶花,把一腔情思,全寄于此。
+
+**1064年**,李青萝的外甥、慕容博的儿子慕容复出生。
+
+**1065年**,波斯“山中老人”霍山,将平生武功精要,镌刻于圣火令之上。圣火令共有十二枚,其中六枚上刻有山中老人的武功秘籍,是波斯文,另外六枚在中国。日后黛绮丝和小昭偷入明教秘道,为的就是找寻“乾坤大挪移”的武功心法,这心法在总教失落已久,中土明教却尚有留存。
+
+**1069年**,玄慈和叶二娘的私生子虚竹出生,却被萧远山劫走,被当作弃婴养在少林寺中。
+
+**1071年**,乔峰在山上与老虎搏斗的时候被少林高僧玄苦大师救下,后来玄苦大师时常离寺下山对乔峰授以武功及佛法、诗书。也就在这一年,大理王子段誉出生。
+
+**1074年**,段正淳和阮星竹的女儿阿朱出生。
+
+**1083年**,萧远峰的儿子乔峰接任丐帮帮主。
+
+转眼间,不寻常的一年就要到来。
+
+**1091年**,三四月之间,在无锡城外的杏子林中,乔峰被少林智通大师和本帮徐长老踢爆是契丹人萧远峰的遗孤,乔峰黯然离开丐帮,前往雁门关查找自己身世之谜。
+
+这就是这阙【苏幕遮 本意】的来历:
+
+> 向来痴,从此醉。水榭听香,指点群豪戏。剧饮千杯男儿事。杏子林中,商略平生义。昔时因,今日意。胡汉恩仇,须倾英雄泪。虽千万人吾往矣。悄立雁门,绝壁无余字。
+
+也是在同一天,阿朱和乔峰相识。
+
+之后,中原武士群集聚贤庄,为的是商议对付“武林中新出的祸胎”——“杀父杀母杀师”的契丹人乔峰。
+
+以一敌百、践诺如山、虽万千人吾往矣,聚贤庄这一战,将乔峰光明磊落的性情飙扬到极处。这一战,不但阿朱抱定了终身相随之意,便是看客也是血脉贲张、心神俱醉。
+
+从此,金庸书中再没有其它英雄。但这英雄心里的痛,何其之痛!
+
+当年的十月初四,晚上近三更时分,在小镜湖阮星竹隐居的方竹林不远处,河南信阳城西北十七里之青石板大桥上,乔峰在大雷雨中掌击扮成段正淳的阿朱,永失一生所爱。
+
+塞上牛羊之约、烛畔鬓云之盟,尽归尘土。
+
+> **【破阵子】**
+>
+> 千里茫茫若梦,双眸粲粲如星。塞上牛羊空许约,烛畔鬓云有旧盟。莽苍踏雪行。赤手屠熊搏虎,金戈扫荡鏖兵。草木残生颅铸铁,虫豸凝寒掌作冰。挥洒缚豪英。
+
+这年阿朱17岁,阿紫15岁。
+
+乔峰失手打死阿朱,极是心灰意懒,却在阮星竹居处无意中发现引致整个中原武林纷扰的线索——
+
+这阙【少年游】是段正淳写给阮星竹的词,悬在阮星竹居所壁间:
+
+> 含羞倚醉不成歌,纤手掩香罗。偎花映烛,偷传深意,酒思入横波。看朱成碧心迷乱,翻脉脉,敛双蛾。相见時稀隔別多。又春尽,奈悉何?
+
+段正淳的字和乔峰看过的“带头大哥”的字完全不一样!
+
+“带头大哥”之谜,此后被一层一层地解开……
+
+段正淳被康敏诬为“带头大哥”,是因为旧年的风流宿债。
+
+段正淳的儿子段誉,和他一样的情债不断。
+
+【少年游 本意】这一阙,从甘宝宝到秦红棉,又到神仙姐姐和王语嫣,正是让人“无计悔多情”。
+
+> 青衫磊落险峰行,玉壁月华明。马疾香幽,崖高人远,微步觳纹生。谁家子弟谁家院,无计悔多情。虎啸龙吟,换巢莺凤,剑气碧烟横。
+
+**1092年**,往日的丐帮邦主乔峰已死,活在世上的是辽南院大王萧峰。
+
+**1093年**,无崖子去世,将毕生功力传给小和尚虚竹,虚竹接任逍遥派掌门,又做了西夏的驸马——而这,正是慕容复费尽心机,求而不得的。
+
+这真是“输赢成败,又争由人算”哪!
+
+> **【洞仙歌】**
+>
+> 输赢成败,又争由人算。且自逍遥没人管。奈天昏地暗,斗转星移。风骤紧,缥缈风头云乱。红颜弹指老,刹那芳华。梦里真真语真幻。同一笑,到头万事俱空。胡涂醉,情长计短。解不了,名疆系嗔贪。却试问:几时把痴心断?
+
+**1094年**,大理国王段正明禅位侄子段誉。萧峰在两军阵前,挟持辽王达成和战之议后,了结了自己性命……而慕容复,几年后疯了。
+
+冥冥中,是否听到枯荣为保定帝剃度时的微吟?
+
+> 一微尘中入三昧,成就一切微尘定。而彼微尘亦不增,於一普现难思刹。
+
+人世一切,如露如电,如幻如梦。永恒的,只有那虚空微尘。
+
+当萧峰、段誉、虚竹等人在雁门关退万敌成为武林英雄之时,黄裳还在福州做官儿,离他写成《九阴真经》还要很久,很久。
+
+**1110年**,67岁的黄裳因为要雕版印行《万寿道藏》,害怕这部大道藏刻错了字会丢命,所以逐字逐句细心地校读,竟然无师自通,修成武功高手。而江湖之上,风云暗生许多年。
+
+**1140年**,独孤求败独创独孤九剑第九式破气式。
+
+**1146年**,王重阳生(历史上王重阳生于1112年)
+
+**1148年**,丘处机出生。
+
+**1162年**,黄药师出生。
+
+**1163年**,周伯通出生。
+
+**1165年**,洪七公出生。
+
+**1169年**,欧阳锋出生。
+
+**1170年**,独孤求败郁郁而卒。
+
+**1173年**,曲灵风出生。
+
+**1178年**,裘千仞出生。
+
+**1186年**,陈玄风、欧阳克出生。
+
+这几十年间,黄裳终于完成了《九阴真经》,并藏于一处极秘密的所在。
+
+但世上没有藏得住的秘密,某一年,《九阴真经》忽然就出现了,接下来的场面之混乱大家可以想象……
+
+**1203年**,全真教掌教王重阳(中神通)为避免江湖仇杀不断,提出“华山论剑”,胜者为“天下第一高手”,并可拥有《九阴真经》。于是桃花岛岛主黄药师(东邪)、西域白驼山山主欧阳锋(西毒)、大理皇帝段智兴(南帝)、丐帮帮主洪七公(北丐)应邀,打了七天七夜,均败于王重阳手下,于是王重阳被推为“天下第一高手”并带走了《九阴真经》,藏在蒲团下面的石板底下。
+
+**1204年**,王重阳拜访南帝段智兴,随行的有他的师弟周伯通,就此与段皇爷的刘贵妃瑛姑结下一段孽缘。瑛姑送给周伯通自己手绣的鸳鸯锦帕,上面还绣了一首词:
+
+> **《四张机》**
+>
+> 鸳鸯织就欲双飞,可怜未老头先白。春波碧草,晓寒深处,相对浴红衣。
+
+后来黄蓉和郭靖遇到瑛姑,黄蓉将这几张机学了去,唱给郭靖听:
+
+> **【七张机】**
+>
+> 春蚕吐尽一生丝,莫教容易裁罗绮。无端剪破,仙鸾彩凤,分作两边衣。
+>
+> **【九张机】**
+>
+> 双飞双叶又双枝,薄情自古多别离。从头到底,将心萦系,穿过一条丝。
+
+这一张一张机,是至情,也是祸根。
+
+**1205年**,裘千仞打伤瑛姑幼儿,瑛姑去求段皇爷救命,段皇爷瞧见裹着婴儿的锦帕上这一首【四张机】,心生怨恨。瑛姑绝望而去。段皇爷不饮不食,苦思了三日三夜,终于大彻大悟,将皇位传给儿子,就此出家为僧。他的四个弟子,渔樵耕读,也跟在他身边。
+
+朱子柳就是四人中的“读”,他和黄蓉玩了一招射覆:
+
+> 六经蕴藉胸中久,一剑十年磨在手。杏花头上一枝横,恐泄天机莫漏口。一点累累大如斗,掩却半床无所有。完名挂冠直归去,本来面目君知否。
+
+谜底是“辛未状元”四字。
+
+周伯通在王重阳去世后(小说中王重阳卒于1204年,历史上卒于1170年),按照师兄的叮嘱,藏好了《九阴真经》的下册,又带着上册去藏,半路遇到黄药师和新婚妻子冯蘅,被骗去上册。
+
+这册子,要了无数人的命,也要了冯蘅的命。
+
+**1209年**,冯蘅生黄蓉时难产而死。周伯通被困在桃花岛15年。这时候,郭靖在大漠已经长到3岁了。杨康呢,身为小王爷也3岁了。
+
+**1220年**,林朝英的弟子小龙女出生。日后丘处机的这首无俗念,就是为小龙女写的:
+
+> 春游浩荡,是年年寒食,梨花时节。白锦无纹香烂漫,玉树琼苞堆雪。静夜沉沉,浮光霭霭,冷浸溶溶月。人间天上,烂银霞照通彻。浑似姑射真人,天姿灵秀,意气殊高洁。万蕊参差谁信道,不与群芳同列。浩气清英,仙才卓荦,下土难分别。瑶台归去,洞天方看清绝。
+
+**1225年**,穆念慈比武招亲,遇上杨康,终堕情之深渊。郭靖18岁,从关外回到中原,遇上扮成小叫花子的黄蓉,遂花重金请她吃了一顿豪餐。黄蓉恢复女儿身的时候,唱给郭靖听的词是这样的:
+
+> **【瑞鹤仙】**
+>
+> 雁霜寒透幙。正护月云轻,嫩冰犹薄。溪奁照梳掠,想含香弄粉,靓妆难学。玉肌瘦弱,更重重龙绡衬著,倚东风,一笑嫣然,转盼万花羞落。寂寞家山何在,雪後园林,水边楼阁。瑶池旧约,麟鸿更仗谁托。粉蝶儿只解寻花觅柳,开遍南枝未觉。但伤心,冷淡黄昏,数声画角。
+
+两人沿途游山玩水,沿着运河南下宜兴,更向东行,到了太湖边上。黄蓉乘兴唱出的是朱敦儒的【水龙吟】:
+
+> 放船千里凌波去,略为吴山留顾。云屯水府,涛随神女,九江东注。北客翩然,壮心偏感,年华将暮。念伊蒿旧隐,巢由故友,南柯梦,遽如许。
+
+她唱了半段,下半段是陆家庄庄主陆乘风接唱的:
+
+> 回首妖氛未扫,问人英雄何处。奇谋复国,可怜无用,尘昏白扇。铁锁横江,锦帆冲浪,孙郎良苦。但愁敲桂棹,悲吟梁父,泪流如雨。
+
+这一年,金兵挥戈南下,18岁的少年,终将担起“侠之大者”的重任。
+
+**1227年**,华山上,第二度群侠论剑。这时王重阳已逝,郭靖刚过20岁,接黄药师、洪七公三百招不败。黄药师、洪七公便默认郭靖天下第一。欧阳锋虽然武功卓绝,黄药师、洪七公都难以胜他。可他因为练了假的《九阴真经》,全身筋脉逆转。黄蓉伶牙俐齿,最后将欧阳锋给说疯了。南帝段智兴则早已出家,法号“一灯”,世间名利于他等是虚无。
+
+**1237年**,郭靖黄蓉收留13岁的杨过。
+
+**1238年**,杨过大约14岁的时候,郭靖带他上终南山,在山上看见一块石碑,长草遮掩,露出“长春”二字。拂草看时,碑上刻的却是长春子丘处机的一首诗,诗云:
+
+> 天苍苍兮临下土,胡为不救万灵苦?万灵日夜相凌迟,饮气吞声死无语。仰天大叫天不应,一物细琐枉劳形。安得大千复混沌,免教造物生精灵。
+
+然而这样的悲天悯人,却没有应在杨过的身上。在受尽欺负后杨过离开终南山投到小龙女门下。
+
+**1242年**,杨过18岁了,欧阳锋与洪七公在华山顶峰再次一决高下,双双因年老体衰而仙去。
+
+**1244年。**
+
+郭襄出生。
+
+杨过断臂。
+
+李莫愁死。死前犹不忘那一阙【摸鱼儿 雁丘词】:
+
+> 问世间,情为何物,直教生死相许?天南地北双飞客,老翅几回寒暑。欢乐趣,离别苦,就中更有痴儿女。君应有语:渺万里层云,千山暮雪,只影向谁去?
+>
+> 横汾路,寂寞当年箫鼓,荒烟依旧平楚。招魂楚些何嗟及,山鬼暗啼风雨。天也妒,未信与,莺儿燕子俱黄土。千秋万古,为留待骚人,狂歌痛饮,来访雁丘处。
+
+而小龙女,在悬崖边和杨过订下十六年之约。
+
+这铭心刻骨的十六年之约啊,让多少人也念念不忘!
+
+十六年,终于过去。
+
+**1259年**,郭襄16岁,在风陵渡遇上她的杨过大哥。杨过许她三枚金针,说道无论甚么难事都给她办到。郭襄的第一枚金针,是让杨过摘下面具,第二枚金针,是邀杨过来参加她的生辰聚会,她想用第三枚金针拦住杨过跃下悬崖,可杨过已经一跃而下……幸运的是,十六年来小龙女“雪肤依旧,花貌如昨”,竟然就在悬崖下。
+
+**1262年**,郭襄思念杨过,独闯少林,最后却与张君宝守着只有一口气的觉远大师。觉远大师口念《九阳真经》(据传说达摩祖师所传)圆寂,郭襄和张君宝各自记下一部分,各自凭这一部分创立了峨眉和武当。
+
+**1273年**,蒙古军再攻襄阳。郭靖、黄蓉自知襄阳城马上被攻下,于是请知名铁匠将杨过送来的玄铁重剑溶解掉。重新铸成倚天剑、屠龙刀,并将九阴真经和武穆遗书装入其中,待后人用之破敌。不久,郭靖和黄蓉、郭破虏都战死襄阳,郭襄携倚天剑远走。
+
+**1283年**,走遍天涯寻找杨过的郭襄,在40岁这年忽然大彻大悟,出家为尼,开创峨眉一派。而少年张君宝,也已经成了道人张三丰。
+
+少年子弟江湖老。不老的只有江湖恩怨,年年翻新。二百多年前是慕容复、萧远山挑起,这一番,是成昆、谢逊挑起。
+
+**1305年**,10岁的谢逊拜成昆为师。**1318年**,谢逊满师,远游西域,加入明教。**1319年**,黛绮丝为取圣火令,来到光明顶,光明顶从此遂有四大法王。**1321年**,成昆和阳夫人在秘道相会,被阳顶天撞见,阳顶天走火而死,阳夫人自杀,成昆立誓灭绝光明顶。**1323年**,成昆设计杀谢逊一家。**1333年**,谢逊七伤拳大成,开始到处杀人。自辽东以至岭南,接连杀了二三十起,并留下“混元霹雳手成昆”字样,逼成昆现身。
+
+然而混入少林寺的成昆却任凭谢逊如何作恶,总不现身。他知道这一笔帐,整个武林最后总要全算到光明顶头上。
+
+只是他算来算去,却没算到张无忌这一着。
+
+**1336年**,张翠山下山调查俞岱岩被废一事,误打误撞中,与谢逊、殷素素漂流到冰火岛。
+
+**1337年**,武当山张翠山和明教殷素素之子张无忌出生。
+
+**1339年**,汉水船夫的女儿周芷若出生。
+
+**1340年**,蒙古汝阳王的郡主女儿赵敏出生。
+
+**1341年**,波斯明教总坛圣女黛绮丝和韩千叶的女儿小昭出生。彼时,他们还不知晓,他们各自的命运会有怎样的纠缠。
+
+**1345年**,在海外漂流近十年的张翠山、殷素素决心带着张无忌回去中原,就在海上,他们遇见了十年来一直在寻找他们的明教和武当诸子。
+
+> 那边船上听得“紫微堂堂主”五个字,登时乱了起来。稍过片刻,十余人齐声叫道:“殷姑娘回来啦,殷姑娘回来啦。”
+
+张无忌回到了他生来从没有到过的中原,张翠山见到了他阔别的师父和师兄弟,殷素素被光明顶教众欢呼簇拥。但这样的欢喜,竟是镜花水月,转眼即要消失。
+
+**1346年**,张三丰欢欢喜喜的百岁寿宴上,各大门派来问谢逊的下落,张翠山、殷素素夫妇双双自尽,张无忌身中奇毒。
+
+**1348年**,张三丰亲自带着少年张无忌到少林求医被拒。在汉水舟中,张三丰忧形于色,善解人意的周芷若喂张无忌吃饭。多年后在光明顶被围殴时,张无忌忍不住说起:
+
+> 汉水舟中,喂饭之德,永不敢忘。
+
+说这句话的时候,已是二十年后,张无忌叫作曾阿牛,是个谁也瞧不出身负九阳神功、有着绝顶奇遇的乡巴佬。
+
+那是**1357年**。如成昆所料,谢逊作的恶事终于一古脑儿算到了光明顶头上,六大门派围攻光明顶,誓要将光明顶铲平。就在明教诸人都绝望等死的时候,张无忌以一身挡住了六大派的进攻:
+
+> 张无忌摇头道:“但教我有一口气在,不容你们杀明教一人。”
+>
+> ……
+>
+> 张无忌喷出一口鲜血,神智昏迷,心情激荡,轻轻的道:“殷六叔,你杀了我罢!”
+>
+> ……
+>
+> 殷梨亭双目流泪,当的一声抛下长剑,俯身将他抱了起来,叫道:“你是无忌,你是无忌孩儿,你是我五哥的儿子张无忌。”
+
+这一年,张无忌以不世之功,被推上明教教主的座位。
+
+(几年以后,张无忌在朱元璋欺骗之下,心灰意冷,将教主之位当给杨逍,自己带同赵敏扬帆出海)。
+
+**1358年**,小昭远走波斯,以答应当波斯明教总教主的代价,换得张无忌一行的脱险。从此她深夜梦回时,大概总会记得这首曲子。那时她和张无忌在光明顶的秘道里,曾有过一段真正快乐的时光。
+
+> 世情推物理,人生贵适意,想人间造物搬兴废。吉藏凶,凶藏吉。富贵那能长富贵?日盈昃,月满亏蚀。地下东南,天高西北,天地尚无完体。展放愁眉,休争闲气。今日容颜,老于昨日。古往今来,尽须如此,管他贤的愚的,贫的和富的。到头这一身,难逃那一日。受用了一朝,一朝便宜。百岁光阴,七十者稀。急急流年,滔滔逝水。
+
+**1365年**,明教光明右使范遥参考北宋年间的两大神功“北冥神功”及“化功大法”,创出威力极大更为歹毒的“吸星大法”。
+
+**1372年**,杨逍去世,明教内部争权夺力,陷入内乱,加上外部朱元璋打压,明教日渐式微。教中高手改组明教,遂为“日月神教”。
+
+**1396年**,张三丰仙逝,寿149。
+
+**1400年**,莆田少林寺得到《葵花宝典》,由方丈红叶禅师保管。
+
+**1401年**,华山派的岳肃、蔡子峰在莆田少林寺各自偷录了半本《葵花宝典》,弟子渡元禅师去找岳肃、蔡子峰讨要,却再也没有回寺,还俗自称为林远图,并根据岳肃和蔡子峰的口述自创出辟邪剑法。
+
+**1402年**,岳肃、蔡子峰因为各自偷录的《葵花宝典》残本起了争执,华山派由此分为气宗剑宗。
+
+**1406年**,日月神教十长老为了夺取《葵花宝典》残本,打上华山,破五岳剑派剑法。
+
+**1479年**,华山派气宗剑宗之争,风清扬被骗下山。
+
+**1493年**,任我行痴迷于习练残本武功,被东方不败篡位,任我行被囚地牢。
+
+**1503年**,余沧海为了夺取林家的《辟邪剑谱》,灭福威镖局。
+
+**1504年**,令狐冲学得独孤九剑。
+
+**1505年**,任我行重夺日月神教教主之位。
+
+**1506年**,任我行去世。
+
+你瞧,苍天笑,纷纷世上潮,谁负谁胜出,天知晓。
+
+**1644年**,李自成攻入北京,明亡。吴三桂降清。袁承志、夏青青率亲友、部属避居海外浡泥国(即今南洋新加坡)。
+
+> 浡泥沧海外,立国自向年。夏冷冬生热,山盘地自偏。积修崇佛教,扶醉待宾贤。取信通商舶,遗风事可传。
+
+**1711年**,雍正帝与海宁陈家掉包刚出生的儿女,爱新觉罗弘历原来是海宁陈家之子,陈家洛之兄。
+
+**1733年**,陈家洛出生。
+
+**1753年**,胡斐出生。
+
+**1758年**,陈家洛在杭州和乾隆相遇,随手题赠扇子:
+
+> 携书弹剑走黄沙,瀚海天山处处家。大漠西风飞翠羽,江南八月看桂花。
+
+**1759年**,香香公主喀丝丽自杀于北京。陈家洛赶回北京,只来得及为新坟题词:
+
+> 浩浩愁,茫茫劫。短歌终,明月缺。郁郁佳城,中有碧血。碧亦有时尽,血亦有时灭。一缕香魂无断绝。是耶非耶,化为蝴蝶。
+
+**1780年**,玉笔峰山庄庄主杜希孟邀请武林高手在此会见雪山飞狐胡斐。胡斐到来时,独有苗人凤之女苗若兰与他弹唱对答:
+
+> 来日大难,口燥唇乾。今日相乐,皆当喜欢。经历名山,芝草飜飜。仙人王乔,奉药一丸。自惜袖短,内手知寒。惭无灵辄,以报随宣。月没参横,北斗阑干。亲交在门,饥不及餐。欢日尚少,戚日苦多。以何忘忧,弹争酒歌。淮南八公,要道不烦。参驾六龙,游戏云端。
+
+当悬崖边苗人凤和胡斐贴身近搏时,那一刀是否砍了下去?
+
+……从此,不会有人知道。
+
+再也不会有人知道了。
diff --git "a/_posts/2023-12-16-\344\273\212\345\271\264\350\277\207\344\272\206\344\270\200\344\270\252\351\232\206\351\207\215\347\232\204\347\224\237\346\227\245.md" "b/_posts/2023-12-16-\344\273\212\345\271\264\350\277\207\344\272\206\344\270\200\344\270\252\351\232\206\351\207\215\347\232\204\347\224\237\346\227\245.md"
new file mode 100644
index 00000000000..56b63fe14fa
--- /dev/null
+++ "b/_posts/2023-12-16-\344\273\212\345\271\264\350\277\207\344\272\206\344\270\200\344\270\252\351\232\206\351\207\215\347\232\204\347\224\237\346\227\245.md"
@@ -0,0 +1,20 @@
+---
+layout: post
+title: 今年过了一个隆重的生日
+subtitle: 谢谢爱我的家人
+date: 2023-12-19
+author: Ajiao
+header-img: img/post-bg-2.jpg
+catalog: true
+tags:
+ - 生活
+---
+年龄大了,生活太忙,琐事太多。忙忙碌碌,常常忘记自己的生日。经常都是过了好几天,突然发现:咦!那天不是我的生日吗?回头想想,生日那天到底干了什么,完全没印象了!
+
+不过,这次生日完全不同。几天前吃午饭时,妈妈就特别提醒我,生日到了,还计算了时间。靖之也在提前谋划,要带我去逛街买衣服和鞋子。便宜的衣服还不行,必须要买贵的。
+
+生日当天,我妈做了一大桌菜,青椒腊肉、红烧茄子、炒土豆丝,都是我喜欢的。平时,受累于小孩吵闹,妈妈做饭,不拘一格。生日这天,明显花了心思,很精致,味道也很可口。
+
+我和靖之一起逛了商场,剪了头发,还吃了烤肉。可以看出来,她很照顾我的情绪,能感受到她对我的迁就和包容。要是在平时,她早就发火了。
+
+可能是因为天气冷,也可能因为洗脸没让人清醒,一整天都有些浑浑噩噩,心不在焉。没有很开心,也没有不开心。不过,必须要谢谢爱我的家人,你们让我过了一个难忘的生日。
\ No newline at end of file
diff --git "a/_posts/2023-12-17-\345\205\250\345\261\200\346\200\235\346\272\220\345\256\213\344\275\223.md" "b/_posts/2023-12-17-\345\205\250\345\261\200\346\200\235\346\272\220\345\256\213\344\275\223.md"
new file mode 100644
index 00000000000..caa80e4b514
--- /dev/null
+++ "b/_posts/2023-12-17-\345\205\250\345\261\200\346\200\235\346\272\220\345\256\213\344\275\223.md"
@@ -0,0 +1,34 @@
+---
+layout: post
+title: 全局思源宋体代码
+subtitle: 在线思源宋体
+date: 2023-12-17
+author: Ajiao
+header-img: img/post-bg-4.jpg
+catalog: true
+tags:
+ - 网络
+---
+更新时间:20231207
+
+```
+// ==UserScript==
+// @name 全局雅黑宋体
+// @namespace http://tampermonkey.net/
+// @version 0.2
+// @description 全局雅黑宋体
+// @author Ryan
+// @match *://*/*
+// @grant GM_addStyle
+// ==/UserScript==
+//GM_addStyle("@import url('https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@500;700&display=swap');")
+GM_addStyle("@import url('https://fonts.loli.net/css2?family=Noto+Serif+SC:wght@500;700&display=swap');")
+GM_addStyle("*{font-family: 'Noto Serif SC', sans-serif;}");
+GM_addStyle(".info_content p, .info_content span, .info_content font{font-family: 'Noto Serif SC', sans-serif !important;}");
+
+(function() {
+ 'use strict';
+
+ // Your code here...
+})();
+```
diff --git "a/_posts/2023-12-17-\346\234\211\345\223\252\344\272\233\347\224\237\346\204\217\344\273\216\344\270\200\345\274\200\345\247\213\345\260\261\346\263\250\345\256\232\345\244\261\350\264\245\357\274\237.md" "b/_posts/2023-12-17-\346\234\211\345\223\252\344\272\233\347\224\237\346\204\217\344\273\216\344\270\200\345\274\200\345\247\213\345\260\261\346\263\250\345\256\232\345\244\261\350\264\245\357\274\237.md"
new file mode 100644
index 00000000000..2f0f19fec4c
--- /dev/null
+++ "b/_posts/2023-12-17-\346\234\211\345\223\252\344\272\233\347\224\237\346\204\217\344\273\216\344\270\200\345\274\200\345\247\213\345\260\261\346\263\250\345\256\232\345\244\261\350\264\245\357\274\237.md"
@@ -0,0 +1,136 @@
+---
+layout: post
+title: 有哪些生意从一开始就注定失败?
+subtitle: 转载自微信公众号《人神共愤》
+date: 2023-12-17
+author: Ajiao
+header-img: img/post-bg-3.jpg
+catalog: true
+tags:
+ - 学习
+---
+## 一、90%的创业在一开始就注定失败
+
+上周的文章发出后,有朋友在后台给我留言,开了几家店,一直勉强支撑,本来从去年开始有起色了,希望再坚持一年,把其中最好的店做大了,就不怕了,但终于还是倒在了这次的疫情中,只能挥泪转让门店。我不知道拿什么话安慰他,因为从商业模式的角度看,大部分创业者的命运在一开始就已经注定。
+
+决定创业成败最重要的因素,不在于你是否足够坚持,足够有能力,甚至资本的多少、人脉的数量也不是最重要的,你选择的生意模式才是决定性因素。
+
+有一些生意模式注定会让所有人都失败,哪怕是让马云来搞;有一些生意模式成功的关键因素你没有,你的坚持只是让失败来得更晚些更惨烈些;而大部分的生意模式,注定是苦逼的生意,让置身其中的创业者,食之无味,弃之可惜。
+
+比如开饭店有一个很头疼的问题,每隔两三年就要重新装修一次,也就是说,你赚的钱相当一部分还要重新拿出来再投,成为固定资产,再变成折旧消耗掉。一旦你停止投入,生意就会坏。
+
+饭店的投资还是小意思,如果你的创业方向是制造业,那赚的钱大部分都要不停地重新投入更新机器设备厂房。
+
+那么,不需要投资固定资产的轻资产行业呢?
+
+有一些轻资产生意的问题是没有壁垒,容易遭遇恶性竞争,比如做网店,早期做的人少,到批发市场拿货,卖掉再给批发商钱,但做的人多了,价格一路往下跌,老板也不肯赊货给你了。
+
+还有一些轻资产生意有一定的进入壁垒,特别是那些对资质、人脉、行业经验有很高的要求的业务。但这些生意的问题是利润不稳定。因为它们往往受制于国家产业政策、消费趋势、市场供需关系、上下游大客户等你无法控制的外部因素,风口来了,钱拿桶装都来不及,风口一走,你就剩下一屁股存货或债务,赚的钱,能留下一小半就不错了。
+
+还有一些看似蓝海的新业务,如果抓住了,那当然是下一个“拼多多”,但问题是,这类生意往往有一个非常短的时间窗口,时间窗口未开,就是注定失败的生意,时间窗口过了,又变成了红海生意。就算你刚好碰上时间窗口,只要慢一点,就可能被大公司后发先至给干掉。
+
+所以说90%的生意从一开始注定失败或者苦逼,后面只是慢慢等待命运的审判。
+
+那么剩下的10%的好的生意模式有哪些特点呢?
+
+## 二、现金流、现金流,还是现金流
+
+在思考生意模式时,我们必须排除阿里腾讯这些传奇式的企业,它们是特例,对普通人有害无益,我们需要找到的是适合普通人的生意模式:
+
+我总结了三点:
+
+第一,一次性投资之后不需要不停地追加投资,赚的钱可以拿回到自己口袋,也不需要把命运寄托在风险投资人身上;
+
+简单说,就是不需要自建厂房、不断升级机器设备、反复装修、不停投入的工程,也不需要大量人力资源,还有各种完全靠融资的网络新经济。
+
+并不是说不能再投资,而是说,投资尽量不要变成变现能力差的固定资产,而是要以材料、存货等流动资产形式,最好是无形资产,这个后面再说。
+
+2、营业收入不一定飞速增长,利润也不一定要高,但一定要稳定;
+
+这就排除了很多周期性太强的生意,比如钢材贸易、农副产品收购等等,这些还是更适合作为大企业的副业;还有房地产中介等等不稳定的生意。
+
+3、有一定的竞争壁垒,不需要被迫降价竞争;你还得有“毛利决定权”,可以把上游涨价的压力转移给下游
+
+这项排除了几乎所有的大家都会做没有什么特色的奶茶店、水果店、服装店、咖啡店,还有高度依赖下游大客户又没有核心竞争力的2B的服务类企业……
+
+这些条件看似复杂,但核心就是一个衡量指标,要有稳定的、源源不断的现金流——你辛辛苦苦创业中,拿到手的,不是应收账款,不是各种票据,不是要变成材料的过手钱,而是实实在在的,随时变现的账面现款。
+
+没错,关键就是现金流。就算是资本市场,现金流好的生意,哪怕年年账面亏损,也会获得好的估值,而现金流不好的生意,盈利高估值低的,比比皆是。
+
+一个人只有创业过一次,才会意识到现金流的重要性,远远高过利润。
+
+大家都知道创业最难的是开头一年,难在哪儿呢?难就难在一开始的现金流都是负的。
+
+比如开奶茶店,很多人算账的方式都是按成熟店的盈利公式:每天的客流*客单价—食材成本—人工成本—其他费用=利润。
+
+这么一算,只要一开始投下一笔钱,接下来就是源源不断的回本了
+
+实际上,从新店到熟店,短则半年,长则永远不可能,这段时间,现金流经常是负的,也就是你很可能要不停地往里砸钱。
+
+就像人的呼吸一样,现金一刻都不能断,哪怕你下个月会中一百万大奖,但本周没有钱了,就是撑不下去。
+
+创业的头一年就在站在悬崖边的老母鸡不停地问自己,不跳下去,你怎么能知道自己是不是一只老鹰呢?
+
+现金流之所以很容易忽视,因为利润是按阶段算的,比较符合人脑的简化思维,现金流是线性的,每一天都是关键的一天,如果不是你特别熟悉的行业,想要现金流不断,只能把所有用钱的地方和时间都估算出来,才能判断。当然这是不可能的,所以一般企业经营都要有现金冗余,为的就是现金流不断。
+
+小微企业在现金流方面有先天的弱势,但偏偏现金流分配对于小微企业特别不利。行业上下游之间,普遍存在现金流之间的竞争,大企业用拉长付款期和要求预付定金的方法,大量占用上下游的中小企业的现金流,提高自己的无风险杠杆率,相应的,小微企业就是“被杠杆”,赚得都是应收款,预付款,放大了经营风险。
+
+所以创业不能光算利润,没有哪家小微企业是“亏死的”,都是现金流撑不下去而断了气。
+
+我知道有人要问了,生意不都是这样吗?要是有你说的那样的好生意,你还会在这儿写文章吗?
+
+其实真是有这样的商业模式的,而且还很常见,那就是——上班!
+
+## 三、上班是最好的商业模式
+
+对照上面的三个标准:
+
+第一、上班是世界上最轻资产的商业模式,成本就是最天上下班的路程,加上同事的交际支出,工资除了社保外,其他都直接进你的口袋。
+
+它的投资就是大部分人都要经历的16年学习生涯,一次性的投入。至于什么终生学习,其实只是锦上添花。
+
+第二、工资性收入比任何一家大公司的收入都稳定,虽然增速有人快有人慢,还有人长期停滞,可你就算干得一般,公司一般也不会扣你薪水,相比而言,没有一家企业会在失去下游的客户后,还能再获得几个月生意的补偿。
+
+第三、关于竞争壁垒,人跟人不同。确实有人整天担心被取代,因而不敢跟公司提加薪,但总体而言,现在是人力资源不足,大部分有一定技能的人,可挑选的公司还是很多的,只要不是太挑剔,不用担心找不到工作的问题。相比,那些一个月找不到客户就会倒闭的中小企业,那是好太多了。
+
+上班不是天经地义的事,古代只有官员才有资格上班。现在社会,虽然机会很多,但大部分人的选择也都是上班,正是因为上班才是最好的商业模式。
+
+既然上班的商业模式这么好,那为什么有些人就是不知足,要去创什么业呢?
+
+因为确实很少有人能够只通过上班实现人生的价值。一是你想做的事,公司不一定让你做,二是除了少数能获得未上市期权的大公司之外,上班族很难通过工作本身实现财务自由。
+
+相对而言,企业赚钱的方法并不只是利润率高,而是通过加大杠杆和加快周转这两个方法,尽可能把一分钱当一块钱运作。
+
+所以,不是上班的商业模式不好,而是我们没有把它的能力发挥到极致。
+
+## 四、在工作中寻找创业的机会
+
+上班跟开公司,这两种商业模式,最核心的区别在于,公司的利润,大部分都被重新投入到运营中,但上班获得的收益,大部分都脱离了上班。
+
+所以,上班与经营企业的区别是单利和复利的关系。
+
+那么,如何让上班也产生复利呢?
+
+最简单的方法就是投资理财,这是题外话,我作为一个职业投资者,这方面说多了,有人又要说我做小广告了。
+
+最好的方法是像华为那样的员工股,每年高额分红再投入,工作与资本双收益。
+
+除此之外,很多人会想到投资自己,提升能力,这当然是必须的,但作用有限,因为工作这种商业模式中,个人能力必须附着于“时间”这个核心生产要素上,但时间有一个先天的缺点,无法增加,无论你是职场新人,还是CEO,拥有的时间都是相同的。如果通过加班来提高产出,就会影响健康而得不偿失。
+
+所以,你不能只投资于个人能力,还要更多的投资于人脉关系、行业资源、个人品牌、行业声望等等,而这些成功的要素,无法只通过工作来获得回报,你需要拓展工作的边界。
+
+我在《反脆弱:为什么有些人更能适应工作的剧烈变化?》一文中,介绍过一个主业和副业的成本共享的“杠铃策略”,这就是把稳定的工作现金流跟发展空间更广阔的创业新机会结合起来:
+
+比如从事大客户销售而经常出差的本职工作,与某些具有同样特征的个人事业,可以组合成“杠铃策略”;专业技术人员与行业自媒体大V,可以组合成“杠铃策略”;专职太太和编剧作家,可以组合成“杠铃策略”。
+
+对于我而言,写作收入来源的多样化,让这块收入成为稳定的现金流之后,而“职业投资者”就成为我新的“风险端”。
+
+工作这个商业模式的最大优点是“稳定的现金流”,创业最大的风险是“现金流不稳定”,所以创业真的不需要卖工作卖房子卖车子卖老婆孩子那么悲壮,最好的方法是把两者结合起来,在工作中创造创业的机会。
+
+这个思路,我在《怎样比别人更快地闻到“钱的味道”?》一文中,还有更深入的分析。具体怎么搞,每一个行业都有自己的特色,平时多观察,多发现机会。
+
+但总的原则,别投入太多的固定资产、别反复装修、别让上下游占用自己的资金、别贪图无法变现的高利润、别雇太多的人力……
+
+大部分的好生意,绝大部分情况下都是平稳的,高利润和低利润都维系不了太长的时间,只有保持这种平稳状态,不出现大的亏损,假以时日,复利的作用会让你最终实现经营的相对安全,实现个人的财务自由。
+
+所以,别老想着一票干成马云马化腾,创业者最好的命运就是成为一个成功脱离了“低级创业劳动力”和“高级创业大忽悠”的小老板,为自已留下一笔二十年后可以周游世界的财富。
\ No newline at end of file
diff --git "a/_posts/2023-12-20-\342\200\234\347\247\221\346\212\200\345\233\275\345\272\246\342\200\235 \344\270\200\344\270\252\345\234\250\347\247\221\346\212\200\351\242\206\345\237\237\345\210\233\351\200\240\345\245\207\350\277\271\347\232\204\350\264\253\347\251\267\345\206\234\344\270\232\345\233\275\345\256\266.md" "b/_posts/2023-12-20-\342\200\234\347\247\221\346\212\200\345\233\275\345\272\246\342\200\235 \344\270\200\344\270\252\345\234\250\347\247\221\346\212\200\351\242\206\345\237\237\345\210\233\351\200\240\345\245\207\350\277\271\347\232\204\350\264\253\347\251\267\345\206\234\344\270\232\345\233\275\345\256\266.md"
new file mode 100644
index 00000000000..61b1a189f13
--- /dev/null
+++ "b/_posts/2023-12-20-\342\200\234\347\247\221\346\212\200\345\233\275\345\272\246\342\200\235 \344\270\200\344\270\252\345\234\250\347\247\221\346\212\200\351\242\206\345\237\237\345\210\233\351\200\240\345\245\207\350\277\271\347\232\204\350\264\253\347\251\267\345\206\234\344\270\232\345\233\275\345\256\266.md"
@@ -0,0 +1,107 @@
+---
+layout: post
+title: “科技国度” 一个在科技领域创造奇迹的贫穷农业国家
+subtitle: 转载自:半岛电视台中文网
+date: 2023-12-20
+author: Ajiao
+header-img: img/post-bg-1.jpg
+catalog: true
+tags:
+ - 工作
+---
+韩国被认为是地球上联系最紧密的国家之一,几乎每个家庭都有互联网服务,你可能找不到一个不适用智能手机的成年人,整个国家都在走向将非接触技术应用到生活的各个领域,让数字化和算法成为全国生活方式的驱动力。
+
+接下来让我们关注半岛电视台纪录片频道播出的“科技国度”内容,这是“韩国的痴迷”系列节目的一部分,韩裔美国记者“乔·李”将带我们踏上关于韩国天才的数字想象力、人工智能和信息技术世界的旅程。
+
+### 韩国革命.. 数字乌托邦奇迹
+
+我们可以在慕尼黑工业大学(TUM)博物馆找到智能未来的例子,这是为了想象 2051 年的生活而建立的博物馆,它带我们踏上了一段令人难以置信的旅程,了解当时的人工智能和通信技术的情况,我们将进入“乌托邦”或乌托邦的世界。
+
+
+
+无需医生人工干预即可诊断和治疗疾病的高度发达的医疗设备
+
+例如,在博物馆的医疗展厅内,医院将配备高度智能化的设备,这些设备可以诊断伤情、开出治疗方案、3D 打印损坏或破损部位的替换组织,然后当场将它们替换到体内。
+
+但我们必须深入研究历史才能了解韩国对技术如此痴迷的原因,1948年建立共和国后,韩国被认为是一个以农业为主的贫穷国家,而大部分工业和电力都集中在朝鲜,1950 年代的朝韩两国战争使经济复苏进程长期滞后。
+
+扭转局面的是政府在 20 世纪 80 年代决定优先发展电子和技术行业,这帮助该国彻底改变了经济形态,并在短短三十年内将韩国变成了世界十大经济体之一,从那时起,对电子和技术的热情一直在增加。
+
+
+
+韩国人平均每月在智能屏幕前花费 460 亿分钟
+
+如今,韩国人使用智能设备的时间约为 4 小时,是世界上使用智能设备频率最高的国家之一,韩国对技术的使用已经超越了经济收益,该国与新冠大流行的斗争表明了其在第四次工业革命中处于领先地位的原因,先进的通信、技术进步和数字智能,使韩国在不到一个月的时间内控制住新冠病毒的感染率,受到全世界的赞誉。
+
+追踪感染者并确定他们去过的地方和接触过的人的技术,是控制疫情传播的决定性因素,韩国使用摄像头跟踪技术(800 万台摄像头)并使用 GPS 信号定位感染者,要求感染者完成居家隔离程序,在不影响正常生活结构情况下限制病毒的传播。
+
+在这里,有人会问:侵犯隐私和未经所有者同意共享个人数据的影响是什么?
+### 侵犯隐私.. 技术丑陋面孔犯罪正在上升
+
+数字技术的阴暗面与侵犯隐私的问题有关,在公共浴室和酒店房间里放置的小型摄像头泛滥成灾,经常用于偷窥女性和拍摄敏感部位,这遭到了韩国街头民众的强烈反对和谴责。
+
+
+
+韩国每年有 7000 起关于隐藏摄像头和色情摄像头的报告
+
+2012 年至 2016 年期间,在2.6万份案件中,有 16201 人因被指控非法拍摄而被捕,其中 98% 是男性,而 84% 的受害者是女性。
+
+由于先进的技术,以及固定在任何固定或移动物体上的微型摄像头摩尔卡(Molka),网络犯罪率不断上升,自 2015 年以来,每年有 7000 起关于隐藏摄像头和色情摄像头的报告,在公共场所甚至家庭中都无法保证隐私,这对被描述为保守的社会结构造成威胁,尤其是对女性而言。
+
+技术商人、两个女儿的父亲崔杜,他的两个女儿向他抱怨侵犯隐私问题,因此,他决定自己开发一种检测“摩尔卡”摄像机的技术,并成功开发出可以贴在手机背面的“Molgard”芯片,在开启闪光灯和摄像头后,通过感应红外线,该芯片可以检测某处是否有隐藏摄像头。
+
+
+
+可以贴在手机背面的“Molgard”芯片能够检测隐藏摄像头的存在
+
+政府还组建了一支 8000 人的打击部队,巡逻以检测公共场所隐藏的摄像头,如果我们知道,仅在首尔就有 20000 个公共厕所,那么就会知道,这将是一个多么艰巨的挑战,肇事者要么通过指纹追踪,要么通过追踪那些隐藏的摄像头发送的信号来追踪。
+
+将非法图片上传到网络后,网络安全将发挥作用,应受害人的要求删除这些图片,网络安全协会理事金贤表示,男性受害者因不公开露骨照片而遭受经济勒索,而对于女性受害人而言,肇事者往往将她们的照片和视频留作个人用途,这里敲诈勒索的案例有限。
+
+### 炫耀文化.. 消费社会中对卓越的疯狂追求
+
+大学教授“安德鲁·金”表示,韩国2020年的国内生产总值约为1.6万亿美元,居世界第10位,自1953年以来增长了1200倍,此前,政府深度干预经济细节(定向资本主义),“关注”理念是推动我国进步的重要动力之一,回顾外国占领和朝韩战争始终是取得更多成就的动力。
+
+
+
+“内容制作者”是韩国人第四大最需要的职业,因为它为所有者创造了收入
+
+韩国在 2014 年至 2019 年间连续六年被评为最具创新性的经济体,三星——韩国的骄傲——被认为是仅次于苹果的全球第二大科技公司,这源于韩国人的炫耀消费主义,即购买昂贵的东西来炫耀自己的财富,也有类似消费主义,即像你的邻居或朋友一样去购买。
+
+### YouTube 内容.. 金钱铺成的成名之路
+
+最近的一项研究表明,韩国人每月在 YouTube 上花费的时间为 460 亿分钟,相当于8.8万年,低于英国和泰国等其他国家,韩国人不仅限于观看视频,而且创建频道并同时创建内容,例如制作韩国流行音乐K-pop、饮食和宠物等相关内容。
+
+
+
+韩国 YouTube 网红月收入数万美元
+
+热衷于表现、窃听他人生活的愿望以及对赚钱的热爱,导致了专门学校的出现,这些学校教授摄影、表演动作和准备剪辑,以在网络上获得最佳形象,甚至“内容制作者”成为小学生选择的前五职业仅次于体育明星、医生、教师。
+
+内容制作者的高收入——估计超过 8000 美元,也就是说,是韩国平均工资的三倍——激发了国民进入这种有利可图的冒险的欲望,而且这并不仅限于年轻人,内容制作者蔓延到了老人和孩子,甚至是有特殊需要的人群。
+
+### 退休老人.. 一场智慧青年引领的农业革命
+
+韩国存在着深刻的阶级分化,也许每个人都可以使用 YouTube 揭示了这种分化,但同时它也为一些人提供了弥合这种差距的收入。事实上,数字革命使重组传统工作成为可能,韩国在技术革命之前就开始了农业革命,并且由于同样的技术革命,这次,韩国决心以更高的生产力和更好的质量回归其智能农业根源。
+
+
+
+年轻农民创建的全自动智能草莓农场
+
+2019年,7万多名农民因年老选择退休,由于不希望这一重要部门受到影响,政府为年轻农民提供了财政补贴,其中包括分配30公顷的土地和向他们提供有吸引力的贷款。
+
+其中一位年轻人辞去了他在现代汽车巨头公司的工作,创建了全自动智能草莓农场,从滴灌开始,通过计算机在特定和编程的时间段为植物提供所需的水分,然后通过肥料的类型、数量和供应日期,最后在没有阳光的情况下进行必要的照明,所有这一切都是通过可以通过电话远程操作的智能应用程序实现的。
+
+得益于这些智能农业技术,无论气候或地形条件如何,随时随地种植农作物成为可能,例如草莓可以在迪拜沙漠中生长,而椰枣则生长在北极。
+
+### 数字化领域.. 韩国经济支柱计划
+
+韩国力争成为人工智能领域的全球推动者,该国公布了人工智能国家战略,其中包括计划到 2025 年将人工智能引入所有年龄段的学校,包括幼儿园。
+
+
+
+韩国宣布了一项将人工智能引入所有年龄段学校的国家战略
+
+专家们特别关注人工智能的伦理方面,这些道德规范尤其适用于儿童,使他们并行学习人工智能和社会可接受的道德规范。
+
+加强交流意味着承担更高程度的责任,而韩国是一个自然资源匮乏的国家,它渴望将技术和数字化作为国家的主要资源。
\ No newline at end of file
diff --git "a/_posts/2023-12-20-\345\272\224\345\257\271\347\276\216\345\233\275\345\210\233\346\226\260 \344\270\255\345\233\275\347\247\221\346\212\200\345\244\215\345\205\264\347\232\204\345\256\214\346\225\264\345\217\231\344\272\213.md" "b/_posts/2023-12-20-\345\272\224\345\257\271\347\276\216\345\233\275\345\210\233\346\226\260 \344\270\255\345\233\275\347\247\221\346\212\200\345\244\215\345\205\264\347\232\204\345\256\214\346\225\264\345\217\231\344\272\213.md"
new file mode 100644
index 00000000000..d0242c4d277
--- /dev/null
+++ "b/_posts/2023-12-20-\345\272\224\345\257\271\347\276\216\345\233\275\345\210\233\346\226\260 \344\270\255\345\233\275\347\247\221\346\212\200\345\244\215\345\205\264\347\232\204\345\256\214\346\225\264\345\217\231\344\272\213.md"
@@ -0,0 +1,132 @@
+---
+layout: post
+title: 应对美国创新 中国科技复兴的完整叙事
+subtitle: 转载自:半岛电视台中文网
+date: 2023-12-20
+author: Ajiao
+header-img: img/post-bg-1.jpg
+catalog: true
+tags:
+ - 工作
+---
+数十年来,美国一直吹嘘自己在新技术创新领域的主导地位,但最近这种主导地位明显受到中国的威胁,这并不是说中国在创新方面超越了美国,而是其庞大的工业基础使其在以具有竞争力的价格向全球市场推出新创新方面处于领先地位,《外交事务》的这篇长文揭示了中国庞大的工业基础,及其推动国家科技复兴的方式。
+
+2007年,苹果开始在中国生产iPhone,当时,这个亚洲国家以其廉价劳动力而非先进技术而闻名,当时的中国企业无法生产iPhone的任何内部零部件,这些零部件都是从德国、日本和美国进口的,当时中国在五金行业的作用仅限于劳动力,iPhone 零部件在富士康深圳工厂组装,其作用不超过手机生产附加值的4%。
+
+11年后,当iPhone X推出时,情况发生了根本性的变化,中国工人不仅像往常一样组装大部分iPhone,而且,中国公司也开始生产这些手机内部的复杂部件,包括音频部件、充电部件和电池组,在能够生产这种复杂技术后,中国公司能够提供比欧洲和亚洲竞争对手更好的产品。今天,当我们见证最新一代iPhone时,中国科技公司生产了该设备25%以上的附加值。
+
+
+
+我们正在见证最新一代的iPhone,中国科技公司生产了超过25%的设备附加值(盖帝图像)
+
+iPhone 是世界上最精确的设备之一,它依赖于一套独特的精确技术,但 iPhone 在中国发生的事情并不是一个特殊事件,随着中国制造的扩张向我们表明了一个更广泛的趋势,其中包括大多数制成品,从组装海外零部件到生产自己的最先进技术,中国企业已经取得了明显的进步,加上其在可再生能源发电设备领域的领先地位,这个亚洲国家目前在人工智能和量子计算等许多新兴技术领域处于领先地位,所有这些成功都挑战了科学领导力是通向工业领导力之路的观念,尽管中国对开拓性研究和科学创新的贡献相对较小,但它成功地利用其工业流程知识在越来越多的战略技术上超越了美国。
+
+在与北京日益激烈的竞争中,美国试图限制中国获得敏感的西方技术,并加强其科学研究和创新的传统,因此,2022年,拜登政府对向中国企业出售西方先进电子芯片技术实施了新的广泛限制,与此同时,拜登政府通过《芯片与科学法》(CHIPS)立法和新科学法案支持美国科技产业,并为其拨款2800亿美元,这些立法将帮助华盛顿重新获得在半导体生产和可再生能源领域的霸主地位。
+
+
+
+如果华盛顿认真对待与中国的技术竞争,它需要关注的不仅仅是突破性的科学创新,而且必须学会像中国一样利用美国的劳动力(Shutterstock)
+
+然而,中国企业实力的不断增强表明,华盛顿的做法可能缺少一个基本要素,即考虑到中国的崛起不仅仅是从西方企业转让或获取技术的结果,也不依赖于重要的科学飞跃,相反,中国的崛起很大程度上是由中国工业能力本身的提升推动的,而这得益于中国庞大而复杂的工业劳动力队伍。中国的这些优势在后者对美国过去几年施加的限制的反应中显而易见,过去,中国企业宁愿避免依赖中国技术来购买最好的技术,而最好的技术总是美国的,但现在,虽然美国阻止中国获得西方技术,但其似乎比以往任何时候都更加努力地支持中国国内芯片产业的蓬勃发展。
+
+中国进入科技强国的行列给美国及其盟国提供了一些教训,与西方相比,中国已经建立了根深蒂固的技术部门,并非处在有吸引力的研究和先进的科学领域,而是植根于与提高工业能力本身相关的不太有吸引力的任务中,如果华盛顿认真对待与中国的技术竞争,它需要关注的不仅仅是突破性的科学创新,而且它必须学会像中国那样利用美国劳动力,从而扩大制造业科技创新的范围,以更高效的方式打造更好的产品,简而言之,美国要重新获得领先技术的领先地位,必须将制造过程本身视为技术发展过程的重要组成部分,而不仅仅是一个后台,以换取始终引人注目的前沿研究、开发和创新。
+
+### 创新并非一切……中国繁荣的现实
+
+许多美中竞争观察家质疑中国的技术领先地位,这是正确的,因为中国几乎没有产生大型跨国公司或国际知名品牌,它还无法在电子市场推出全新的商品类别,类似于日本和韩国以前在数码相机和电子游戏方面的做法,而且,迄今为止在汽车和飞机制造领域无法与欧洲和美国竞争,相反,中国公司专注于生产可以在发展中国家以更便宜的价格出售的产品,成熟的中国品牌的缺乏证实了西方人的看法,即中国是一个巨大的工厂,而不是创新的沃土。
+
+
+
+所有中国企业仍落后全球先进半导体龙头的台湾企业“台积电”至少5年(路透)
+
+中国在一些尖端技术上也仍然落后于西方,中国芯片产业已经取得了一些值得注意的突破,包括手机芯片和某些类型的高端存储芯片的制造,在全球所有数字产品中都存在的逻辑芯片制造领域,所有中国企业仍落后全球先进半导体龙头的台湾企业“台积电”至少5年,即使是中国公司在开发制造这些芯片的工具方面也面临着更大的弱点,例如用于在硅片上印刷特定形状的光刻机,以及用于控制包括数百个步骤的芯片生产过程质量的测量设备,为此,中国严重依赖日本、美国和欧洲的进口,此外,中国仍在开发设计先进芯片组所需的软件方面迈出第一步。
+
+中国航空业也有类似的模式,例如中国商用飞机有限责任公司(COMAC),该公司相当于中国的空客和波音,是一家得到 710 亿美元政府资金支持的国有企业,成立 15 年后才刚刚开始生产第一架商用飞机。中国芯片和航空航天公司意识到一个痛苦的事实,即这些行业的许多关键零部件仍然从西方进口,例如生产设备、先进软件、飞机发动机和航空电子系统,而这种对西方技术的依赖意味着美国新的芯片限制可能会让中国陷入黑暗的隧道。
+
+
+
+中国商用飞机有限责任公司成立 15 年后,第一架商用飞机才刚刚开始生产(盖帝图像)
+
+然而,面对这些严重的脆弱性,中国正在广泛的其他技术方面取得快速进展,中国企业在生产先进机床(如机械臂、液压泵和其他设备)方面成功地与欧洲和日本竞争对手抗衡,正如 iPhone 的故事向我们揭示的那样,如今中国凭借其复杂的电子供应链可以与日本、韩国和台湾相媲美,此外,尽管中国国家主席习近平最近努力加强政府对阿里巴巴、腾讯和滴滴等互联网公司的控制,但中国在数字经济领域也表现强劲,中国企业仍然能够通过“Tik Tok”等应用程序与硅谷巨头展开激烈竞争,与“Facebook”展开激烈竞争。
+
+中国在高负荷输电线路、高速铁路、第五代互联网等现代基础设施建设方面也处于世界领先地位,2019年,中国成为第一个向月球另一侧发射月球车的国家,一年后,中国科学家通过卫星开发量子加密通信取得了另一项突破,这使得他们的国家差点就开启了一个坚不可摧的通信领域,所有这些成就都体现了中国日复一日为攻克最艰巨的工业和科学任务所做的不懈努力。
+
+### 伟大的太阳能
+
+可再生能源装备是中国近年来取得的重大科技成果之一,太阳能技术的商业市场出现于二十世纪初,当时的大部分创新来自美国,美国公司在该工业领域处于领先地位也是顺理成章的,但2010年,中国国务院宣布太阳能发电为“战略性新兴产业”,随后对该行业推出了一系列政府补贴和初创企业,其中大部分都是为了扩大制造能力。
+
+与此同时,中国企业已经获得了将光能转化为电能的大量基础,并开始开发生产光能的方法。如今,中国企业几乎主导了太阳能行业供应链的每个阶段,从加工生产电池所需的硅到安装太阳能电池板,中国也开发出同样的技术,中国面板不仅是全球市场上最便宜的,而且也是最高效的,此外,过去十年太阳能电池板生产成本的大幅下降主要是由中国的工业创新推动的。
+
+过去几年,中国企业在电动汽车用大容量电池生产领域已确立了强势地位,随着世界逐渐摆脱内燃机,先进的电池技术已成为汽车行业的核心部分,中国在这一领域也处于领先地位,例如成立于2011年的中国宁德时代公司是全球最大的电池制造商,与“宝马”、“特斯拉”、“大众”等各大车企合作,除了率先开发更新、更高效的化学混合物类型,例如用于钠离子电池的电池,其生产无需借助锂或钴金属等自然界稀缺的成分。
+
+拜登政府承认依赖中国提供美国“绿色”转型(从石油和天然气到可再生能源)所需的关键技术的危险,但美国的一系列海关行为以及美国对中国使用石油和天然气的调查硅供应链中的强迫劳动,并没有使北京失去在太阳能领域的领先地位,美国商务部发起了一项此类调查,威胁要对进口太阳能设备追溯征收超过 250% 的关税,这很快让使用中国设备的美国消费者陷入了严重危机,因此,拜登总统被迫于 2022 年 6 月发布一项总统令,自生效之日起两年内停止任何额外的关税。
+
+与此同时,尽管美国于 2022 年 8 月通过了旨在加快向电动汽车转型步伐的《通货膨胀削减法案》,但该法律遇到了障碍,导致全球市场上的大多数电动汽车没有资格获得分配给美国该行业的联邦财政支持。目前看来,美国及其许多西方盟友在追求绿色转型和脱碳方面仍将依赖中国。
+
+中国在太阳能组件、电动汽车电池或电子产品领域的主导地位并非凭空而来,中国的快速进步与其产业实力和质量控制密切相关。从20世纪90年代初到现在,中国劳动力已经从儿童玩具和简单纺织品的生产转向实施复杂而特殊的工业流程,而这些流程对于生产iPhone等先进电子产品来说是不可或缺的,在这段漫长的历程中,中国企业通常都通过自己的努力取得了令人瞩目的飞跃,而中国的技术创新并非来自大学和研究实验室,而是来自大规模生产过程本身产生的学习,因此,中国强大的制造能力是该国攀登高科技阶梯的核心。
+
+### 中国飞跃的秘密 丰富的经验
+
+
+
+对于每个已经从政府保护主义中受益的中国行业来说,还有其他行业尚未受益,例如汽车行业(Shutterstock)
+
+中国的技术进步付出了高昂的代价,北京凭借数量惊人的政府资源成功占据了目前的地位,而这些巨额的政府支持措施造成了误导效应。总部位于马萨诸塞州的美国国家经济研究局去年12月发表的一项研究发现,北京在选择政府补贴方面的记录不佳,而且它们的产出增长率往往较慢,许多中国模式的批评者认为,中国经济的飞跃是由政府提供的过度保护推动的,这已成为常态,中国的知识产权被大规模盗窃。
+
+尽管这些说法有一定道理,但不足以解释中国的崛起,对于每个已经受益于政府保护主义政策的中国行业(例如流行的互联网平台百度)来说,还有其他行业迄今为止尚未受益于这些政策,例如汽车行业,中国距离拥有与其汽车竞争的最大的国际公司还很遥远,未经所有者同意的技术转让和盗窃知识产权可能有助于一些中国工业,美国及其盟国打击这些现象的做法是正确的,然而,仅这些现象并不能向我们解释中国在电池、氢能和人工智能领域处于领先地位的原因。
+
+相反,中国科技产业崛起最重要的因素在于与之相伴的气候,过去二十年来,中国在技术密集型产业中创造了无与伦比的产能,其特点是庞大的劳动力、丰富的供应商网络和广泛的政府支持,这些优势是基于中国的工业历史,建国后的头几十年,政府特别重视工业,在毛泽东主席领导时期,实现了工业进步,在邓小平的领导下,中国再次更加有效地完成了这一任务,提出了实现四个现代化的思想,从 20 世纪 90 年代开始,中国的工业潜力开始腾飞,这主要是受到全球市场性质的刺激,而不是中国政府本身的举措(2001 年中国加入世界贸易组织)。
+
+过去十年,习近平主席将国家对工业的兴趣发挥到了极致,推出了中国制造2025,这是一个旨在将中国的工业基础从劳动密集型产业转向高科技产业的政策框架。而在2021年,北京在最新五年计划一开始就宣布了一项将中国转变为“工业超级大国”的计划,这不仅仅是一个流行词,政府立即向高科技公司投入了巨大的努力和巨额贷款,尽管它知道自己还需要很多年才能盈利。
+
+太阳能行业的情况就证明了这一点,北京向所有初创企业提供大量政府支持,并鼓励更多企业进入这一领域,但它激发了这些公司的风险意识,并创造了一个竞争非常激烈的行业,在这个行业中,强者取胜,弱者被淘汰,结果,中国企业在全世界依赖的战略性产业中占据主导地位,这种鼓励工业潜力的做法与西方的古典经济正统观念背道而驰,西方传统经济观念强调对研究、创新和产品营销等增值活动的兴趣,并贬低生产本身的材料过程,认为它是可以在本国以外(通常是亚洲国家)以低廉成本购买的一部分。
+
+### 深圳模式..中国硅谷
+
+在自身制造潜力的推动下,中国的做法已成为其在高科技领域与西方竞争的核心,要理解其中的原因,重要的是要了解推动成功创新的力量的本质,生产一项新技术就像做炒鸡蛋,有原料、步骤,然后是配备必要工具的厨房,然而,光有工具并不能保证好的结果,即使是拥有最豪华的工具和最好的菜谱的人,如果一生没有做过饭,也无法做出美味的炒鸡蛋,这里增加的要素是实践经验,是通过不断重复经验才能学到的技能,我们称之为“操作知识”,这也是中国成为科技创新一极的经验的一部分。
+
+
+
+苹果的大部分产品是由富士康和和硕等其他公司生产的,这些公司在中国拥有自己的员工队伍(Shutterstock)
+
+尽管我们很难衡量这种运营知识,但我们可以通过查看特定劳动力所拥有的专业知识水平以及工业活动交织网络的起源来估计它,中国在这两个层面上都有明显的优势,最突出的技术成就是培养了一支庞大、经验丰富的劳动力队伍,能够适应技术密集型产业的需求,例如,苹果公司仍然将中国视为唯一有能力在短时间内动员数十万训练有素工人的国家,能够提供对密集硬件供应商网络的访问,并能够利用政府的支持来解决每年数百万产品(例如 iPhone)生产中出现的许多重叠问题。
+
+但同样令人震惊的是,中国如何利用外国公司来帮助建立其复杂的工业网络,或者经济学家布拉德·德隆所说的“工程实践社区”,卡特彼勒、通用电气、特斯拉等美国公司已成为中国的主要雇主,苹果的大部分产品都是由富士康和和硕等其他公司生产的,这些公司在中国都有自己的员工,与二战后几十年经济增长期间保持相对封闭市场的日本相比,中中国通过直接向外国企业学习来促进产业飞跃,尽管美国前总统唐纳德·特朗普发动了贸易战,但北京方面并未对在华美国公司做出同样的回应,这在一定程度上源于它对这些公司带来的管理专业知识以及它们传授给中国工人的工业技能的认识。
+
+通过与世界领先公司的工业运营的不断互动,中国工人获得了可以带到当地公司的技能,以电动汽车电池的生产为例,电池的生产需要 10 多个明确的步骤,每一步都需要以无差错的方式接管上一步的电池,中国的工程管理人员通过他们在商业电子领域的经验,获得了完成这项任务所需的操作知识,同样,工工业知识的转让是中国在太阳能领域占据主导地位的关键之一,这个行业在过去十年中取得了飞跃,其动力并不是科学创新本身,这是美国的专长,而是通过提高生产过程的效率来成功降低成本,这是中国的优势。
+
+深圳作为全球科技中心的崛起告诉我们“运营知识”的重要性,在2007年iPhone产业国产化之后的几年里,该市发展了充满活力的当地科技产业,非常适合生产复杂的设备,很快,工人们开始利用他们的生产和工程专业知识来创造其他产品,凭借与制造设施并肩而建的研发实验室,深圳工程师拥有无与伦比的接触供应商、经验丰富的工人和熟练设计师的机会,如今,这座城市处于商用无人机、虚拟现实头盔和其他创新电子产品的前沿,这种领导地位背后是一支熟练的劳动力队伍,他们多年来与拥有大胆想法的企业家合作,而且在一个电子元件价格便宜的时代,比如相机、电池和屏幕,所以,今天的深圳就像美国的硅谷,大学教授与企业家、工人、投资者混在一起。
+
+### 微笑曲线.. 美国制造业是如何衰落的?
+
+
+
+尽管英特尔和波音相对衰落,美国仍然是半导体生产设备和飞机发动机的领先制造商(路透)
+
+第二次世界大战后的几十年里,美国利用其科学领导地位主导了从计算机到航空的许多技术行业,华盛顿认为,在工厂创新和设计重大转变成为与苏联冷战竞赛的主要支柱之际,这种做法是合乎逻辑的,这种科学驱动的方法似乎也受到市场的青睐,20世纪90年代,台湾企业家施振荣看到,科技行业的大部分利润来自价值链的第一部分——设计、研发——以及最后一部分,即产品的营销,而较小份额的利润来自制造过程本身,它位于价值链的中间(所谓的微笑曲线)。苹果公司清楚地体现了这种模式,因为当今世界上最有价值的公司开发和销售自己的产品,而将几乎没有价值的制造负担留给其在中国和其他亚洲国家的合作伙伴,同样的道理,美国公司在过去二十年里一直专注于研究、开发和营销,并依赖中国来满足其制造需求。
+
+这种关注的结果之一是美国在一些需要多个科学领域之间复杂整合的行业中继续保持领先地位,尽管英特尔和波音相对衰落,美国仍然是半导体生产设备和飞机发动机的领先制造商,与华盛顿不同,中国并没有拓展科学视野的悠久传统,即使在今天,中国在这些行业中产生的创新研究也远远少于美国,而且在促进有用科学研究方面的记录也相对较差。
+
+然而,这并不意味着美国科技行业表现良好,因为近几十年来许多美国企业过多地屈服于微笑曲线逻辑,将更多资源投入到曲线两端(研究和营销),而将制造能力抛在了一边。自2000年以来,美国已经因为这一趋势失去了大约500万个制造业工作岗位——相当于其制造业劳动力的四分之一——导致了大量技能的流失,不仅仅是生产线劳动力的流失,还包括机器工人、工厂经理和产品设计师,从长远来看,这种下降使华盛顿在主导新兴技术方面处于弱势地位。
+
+
+
+2022年美国太阳能产品进口额达到80亿美元,其中大部分来自在东南亚国家生产产品的中国企业(Shutterstock)
+
+例如,美国本应凭借其在太阳能领域的科学领先地位来引领太阳能领域,并且已经表现出实现这一目标的意愿。2012年,前总统巴拉克·奥巴马对进口中国太阳能产品征收关税,试图保护当地生产商,但即使有这些保护措施,美国制造商也无法竞争,中国已经拥有大量熟练工人和供应商,因此,可以无限制地扩大生产,而美国在经历了一系列数百万工人的裁员之后,失去了大部分运营知识储备,不再拥有建设高效制造基地的能力,因此,2022年美国太阳能产品进口额将达到80亿美元,其中大部分将来自在东南亚国家生产产品的中国企业。
+
+美国太阳能行业的失败是美国制造业衰落这一更大故事的一部分,自动化程度的提高在一定程度上刺激了这一趋势,但它的其他弱点也值得考虑,在新冠大流行初期,与其他国家一样,美国需要大量的个人防护装备和医疗设备,但美国企业难以适应这些需求,难以专门生产口罩和棉签用棉棒,而这些绝不是复杂的产品,发生这种情况是因为这些公司失去了许多必要的运营知识,而中国的同行能够快速适应紧急情况并生产美国和其他国家所需的许多医疗用品。
+
+到目前为止,美国试图将制造业就业岗位从亚洲转回本土的努力似乎令人失望,例如,美国促使苹果公司在德克萨斯州生产更多的电脑,但由于缺乏工业环境的支持,2012年之后,美国的努力有所下降,其中的一个例外是美国成功生产出RNA疫苗,事实证明,这种疫苗比中国生产的传统疫苗更有效,然而,在未来几年与中国及其先进产业的竞争中,华盛顿需要做的不仅仅是在生物技术领域的一场小型竞赛中获胜。
+
+### 发现漏洞的竞赛
+
+在挑战西方技术发展方式的过程中,中国毫不犹豫地承认自己在科学知识生产领域的弱点,去年10月,习近平主席在中国共产党第二十次全国代表大会报告中宣布,科学技术将成为党的首要任务之一,尽管科研环境的显着改善还需要一段时间,但中国在太空探索、量子通信等领域正在稳步取得进展,北京似乎特别热衷于发展国内半导体产业,特别是中国电信巨头“华为”和中国电子芯片制造商“中芯国际”被拒绝获得美国和欧洲的先进技术。华盛顿的芯片准入限制带来意想不到的后果之一是增加了中国对科学和研发的投资。
+
+相比之下,美国尚未找出其在作战知识方面的弱点,毫无疑问,考虑到为先进产业的利益分配了数十亿联邦资金,去年“CHIPS”法和《通货膨胀削减法案》的通过代表了美国产业政策的重大进步,然而,美国的许多政策仍然侧重于拓宽科学视野,而不是建立在将产品推向市场所需的操作知识和工业环境的基础上,因此,华盛顿与中国进行技术竞争的做法使其面临重蹈其在太阳能领域所犯错误的风险,美国科学家在那里奠定了新技术的基础,然后亲眼目睹中国公司在新技术生产竞赛中处于领先地位,例如,在电解槽领域,将氢从水中分离出来,是绿色氢生产的关键工具,中国似乎正以其高生产效率在该领域占据主导地位。
+
+英特尔公司著名首席执行官安迪·格鲁夫(Andy Grove)在10 年前就得出了这一结论,当时他敦促国家不要再沉迷于他所谓的“神话般的创新时刻”,而应该更多地关注将创新推向市场的过程,他并补充道:最后阶段“是公司真正成长的阶段,制定设计细节,决定如何以最低成本生产,建造工厂,并雇用数千人。” 资金分配只是建立坚实的技术部门的第一步,美国必须努力消除成本过高的问题,这种成本常常困扰着该国工业基础设施的建设,美国著名的学院和大学必须更好地培养学生先进的制造工艺,而华盛顿则必须学习北京在这一领域的领导地位,并自行寻求外国投资,与特朗普政府一样,拜登政府已经邀请多家日本、韩国和台湾企业在美国建设芯片工厂,这些企业因其在电子供应链方面的专业知识而受到欢迎。
+
+最终的经济现实表明,美国将始终是一个难以生产商品的地方,由于人口相对较少,而工资需求较高,此外,美元作为国际储备的过程增加了当地生产大宗商品的相对成本,那么,美国在大多数需要大量生产的大宗商品领域仍将无法与中国竞争,当然,美国不应该追求生产一切,而应该瞄准其具有逻辑优势的战略产业。
+
+中国市场因新冠大流行而多次关闭,在俄乌战争爆发之后,许多投资者现在正在寻求规避与在中国投资相关的风险,因此,美国似乎有一个独特的机会来重新获得一些失去的制造业就业机会,然而,华盛顿需要一项新的产业政策,重点关注工人和运营知识而不是利润率,否则,引领下一次技术革命的将是中国,而不是美国。
\ No newline at end of file
diff --git "a/_posts/2023-12-20-\345\273\272\347\255\221\345\221\250\345\256\243\344\274\240\345\233\276.md" "b/_posts/2023-12-20-\345\273\272\347\255\221\345\221\250\345\256\243\344\274\240\345\233\276.md"
new file mode 100644
index 00000000000..326ee8fdc71
--- /dev/null
+++ "b/_posts/2023-12-20-\345\273\272\347\255\221\345\221\250\345\256\243\344\274\240\345\233\276.md"
@@ -0,0 +1,18 @@
+---
+layout: post
+title: 建筑周宣传图
+subtitle: 转载自微信公众号《建筑周》
+date: 2023-12-20
+author: Ajiao
+header-img: img/post-bg-2.jpg
+catalog: true
+tags:
+ - 生活
+---
+
+
+人,究其一生,需要一间什么房子?
+
+这是我的梦中情房,理想中的房子。
+
+Via:[# 房企如何突破困局?12月24日走进金沙集团,探访三线城市该如何操盘](https://mp.weixin.qq.com/s/8P7suhNMPHGZUngeW4bqpg)
diff --git "a/_posts/2023-12-22-Obsidian+Git\347\273\264\346\212\244Hexo\345\215\232\345\256\242.md" "b/_posts/2023-12-22-Obsidian+Git\347\273\264\346\212\244Hexo\345\215\232\345\256\242.md"
new file mode 100644
index 00000000000..c6caa4166c8
--- /dev/null
+++ "b/_posts/2023-12-22-Obsidian+Git\347\273\264\346\212\244Hexo\345\215\232\345\256\242.md"
@@ -0,0 +1,340 @@
+---
+layout: post
+title: Obsidian+Git维护Hexo博客
+subtitle: 转载自知乎专栏:晚阳Crown
+date: 2023-12-22
+author: Ajiao
+header-img: img/post-bg-4.jpg
+catalog: true
+tags:
+ - 工作
+---
+## 0.简介
+
+Obsidian是一款非常强大的Markdown编辑器与知识管理工具,得益于其优秀的笔记双向链接与检索功能、以及丰富的插件生态,能让我们高效地写文章与维护我们的博客。
+
+## 1.Obsidian知识库创建
+
+首先将我们的博客作为一个Obsidian知识库打开:
+
+
+
+
+
+打开成功后,你根目录会生成一个`.obsidian`文件夹,它的作用是记录了你的设置以及在这个知识库里装的一些插件,在别的设备打开这个知识库就不用重新配置了
+
+
+
+如果你已经有一个库了,也可以像我一样,直接把博客丢进来
+
+
+
+## 2.忽略多余的文件
+
+我们主要是编辑和管理Markdown文件,所以一些多余的文件要忽略掉,这样在知识库里搜索文件、关键字时才不会搜索到多余的,也能有效提高检索效率。
+
+打开 设置>文件与链接>Exclude Files
+
+
+
+文章都在source下,所以只保留source,其它的忽略掉
+
+
+
+## 3.博客文章管理
+
+### 3.1 新建文章
+
+新建Markdown文件就很方便了:
+
+
+
+可以设置下新建Markdown文件生成的位置:
+
+
+
+### 3.2 快速插入Front-matter模板
+
+Obsidian有一个模板功能,允许我们预先写好一些内容模板,写文章时可以随时快捷插入。
+
+在核心插件中开启模板功能:
+
+
+
+打开模板插件的设置界面,设置模板文件夹位置以及日期格式:
+
+
+
+编写Front-matter模板:
+
+
+
+在左侧菜单栏中点插入模板:
+
+
+
+### 3.3 发布文章
+
+发布文章到博客,也就是把写好的文章移动到`source/_posts`目录下即可:
+
+
+
+## 4.Obsidian Git插件的使用
+
+Obsidian知识库多端同步,我之前一直用的方案是OnDrive,除了.obsidian文件夹下个别文件会出现冲突以外,各方面都挺不错的。但是现在加入了Hexo博客后,冲突恐怕会更多,OnDrive没法处理,显然用Git来管理会更好,还有Hexo博客要部署到服务器一般也是用Git。
+
+得益于Obsidian强大的插件生态,我们可以在Obsidian中直接操作Git,用到的是一款社区插件,叫做Obsidian Git
+
+### 4.1 安装
+
+先设置里启用社区插件功能,然后再搜索安装即可:
+
+
+
+要确保知识库是一个Git仓库,打开才不会报如下错误:
+
+
+
+### 4.2 忽略配置
+
+根目录创建一个`.gitignore`,忽略掉`.obsidian/workspace`
+
+
+
+Hexo博客目录下创建`.gitignore`
+
+
+
+```text
+.DS_Store
+Thumbs.db
+db.json
+*.log
+node_modules/
+public/
+.deploy*/
+_multiconfig.yml
+```
+
+### 4.3 使用
+
+打开插件设置界面,可以修改一下自动提交和手动提交的日志,我设置的是主机名+日期:
+
+
+
+在提交信息设置里,可以修改主机名和日期格式,修改完成后点Preview可以预览提交信息:
+
+
+
+快捷键`Ctrl + P`打开命令面板,输入open source control view启用可视化操作面板:
+
+
+
+然后在右侧菜单栏就可以看到操作面板了:
+
+
+
+一般操作就是:保存所有>提交>推送,就可以更新到Git服务器了,如下图顺序
+
+
+
+启用自动拉取功能,每次打开知识库就会自动拉取:
+
+
+
+如果在使用过程中有报错的话,`Ctrl+Shift+I`在控制台里可以查看详细日志,所有插件的日志都可以在这里看到:
+
+
+
+## 5.自动更新Front-matter分类信息
+
+前文我们实现了Front-matter模板的快速插入,但是有些变量如categories还是需要手动维护。结合Obsidian,最好的方案就是我们通过文件夹来对文章进行分类,然后自动生成和更新Front-matter的分类信息。
+
+### 5.1 hexo-auto-category安装与配置
+
+这里我们使用的是[hexo-auto-category](https://link.zhihu.com/?target=https%3A//github.com/xu-song/hexo-auto-category)这个基于文件夹自动分类的插件,安装:
+
+```bash
+npm install hexo-auto-category --save
+```
+
+在站点配置文件中添加配置:
+
+```text
+# Generate categories from directory-tree
+# Dependencies: https://github.com/xu-song/hexo-auto-category
+# depth: the max_depth of directory-tree you want to generate, should > 0
+
+auto_category:
+ enable: true
+ depth:
+```
+
+### 5.2 利用Git钩子函数触发更新
+
+这个插件只有执行`hexo generate`时才会去读取文件夹并更新所有文章的Front-matter分类信息,所以我们可以利用[Git的钩子函数](https://link.zhihu.com/?target=https%3A//git-scm.com/book/zh/v2/%25E8%2587%25AA%25E5%25AE%259A%25E4%25B9%2589-Git-Git-%25E9%2592%25A9%25E5%25AD%2590%23_git_hooks),在commit的时候先执行下`hexo generate`,这样就能实现自动更新了。
+
+在`.git/hooks`目录下新建一个`pre-commit`文件,也可以执行`touch pre-commit`命令新建该文件:
+
+
+
+可以先在该文件中写入`echo hello world!`,然后执行`sh pre-commit`或者`./pre-commit`测试钩子能不能正常执行:
+
+
+
+没问题后,将如下命令写到文件里:
+
+```bash
+#!/bin/sh
+cd Blog && hexo generate && git add .
+```
+
+1. 由于我的博客不是在根目录,所以需要`cd Blog`进入到博客目录再执行`hexo generate`
+2. 之所以后面追加`git add .`,是因为generate后,所有文章的Front-matter信息会更新,所以要将所有修改重新添加进来
+3. 注意第一行一定要加上`#!/bin/sh`,这个不是注释!
+
+## 6.快捷操作
+
+Obsidian中通过URL可以访问链接或打开文件,所以我们可以在根目录创建一个Markdown文件,相当于我们知识库的主页,把一些常用的链接放这里,方便快速访问:
+
+
+
+> **在写URL的时候要注意:如果路径有空格的话,要替换为%20**
+
+### 6.1 快捷打开站点或主题配置文件
+
+站点配置文件和主题配置文件是我们DIY博客经常要编辑的两个文件,在Obsidian中没法编辑yml文件,可以通过URL来打开yml文件,会自动调用默认的编辑器打开。
+
+在主页Markdown中,按Ctrl+K插入链接,写入我们两个配置文件所在的相对路径:
+
+```bash
+[打开站点配置文件](Blog/_config.yml)
+[打开主题配置文件](Blog/themes/butterfly4.3.1/_config.yml)
+
+# 或者写成Obsidian URI的形式
+[打开站点配置文件](obsidian://open?file=Blog/_config.yml)
+[打开主题配置文件](obsidian://open?file=Blog/themes/butterfly4.3.1/_config.yml)
+```
+
+效果演示:
+
+
+
+### 6.2 快捷运行博客
+
+我们还可以运行bat文件来执行一些命令,比如运行我们的博客了。
+
+在我们的Hexo博客目录下,创建一个`RunBlog.bat`文件,写入以下命令:
+
+```bash
+start http://localhost:4000/
+hexo s
+```
+
+然后在我们的主页添加链接:
+
+```bash
+[运行博客](Blog/RunBlog.bat)
+
+# 或者
+[运行博客](obsidian://open?file=Blog/RunBlog.bat)
+```
+
+效果演示:(测试完成后,按两次Ctrl+C关闭)
+
+
+
+### 6.3 优化方案
+
+### 6.3.1 嵌入文件
+
+觉得链接太小了不好点击?Obsidian嵌入文件完美解决,只需在链接前加上感叹号!(注意嵌入文件的链接就不能用Obsidian URI的形式了)
+
+```text
+
+
+
+```
+
+是不是瞬间舒服多了?
+
+
+
+### 6.3.2 Button插件
+
+除了嵌入文件外,别忘了Obsidian还有强大的社区插件库,Button插件也可以满足需求:
+
+
+
+Ctrl+P打开命令面板,搜索并打开Button Maker:
+
+
+
+设置按钮信息:
+
+- 按钮类型(也就是功能)选择Link - open a url or uri
+- 链接可以使用`file://`或者[Obsidian URI](https://link.zhihu.com/?target=https%3A//help.obsidian.md/Advanced%2Btopics/Using%2Bobsidian%2BURI),这个时候后者的好处就体现出来了,因为`file://`只能用绝对路径,例如`file://C:\Users\GavinCrown\Desktop\SecondBrain\Blog\_config.yml`,意味着每换一台设备你的链接就得改一次。
+
+
+
+设置完成后,点Insert Button就可以将按钮插入到当前Markdown文件中:
+
+
+
+
+
+### 6.3.3 Shell commands插件
+
+再介绍个终极优化方案,之前我们执行命令是通过运行bat文件,而Shell commands可以在Obsidian中设置好命令,并通过Obsidian的命令面板或快捷键快速运行。
+
+
+
+在插件设置面板中添加命令:
+
+
+
+运行博客:
+
+- Shell commands没有显示终端窗口的功能,所以需要我们启动powershell再传入命令
+- 有了终端窗口我们才可以在窗口中按Ctrl + C关闭Hexo服务,否则它会一直占用端口
+
+```bash
+start powershell '-NoExit -Command start http://localhost:4000 ; cd Blog ; hexo s'
+```
+
+打开站点和主题配置文件:
+
+```text
+start Blog/_config.yml
+start Blog/themes/butterfly4.3.1/_config.yml
+```
+
+然后修改默认执行环境为PowerShell 5:
+
+
+
+点这个按钮可以执行测试我们的命令:
+
+
+
+如果你遇到了这个错误:`hexo:无法加载文件 C:\Users\xxx\AppData\Roaming\npm\hexo.ps1,因为在此系统上禁止运行脚本。`只需在Windows设置>更新和安全>开发者选项,找到PowerShell,点下应用即可:
+
+
+
+Ctrl+P打开命令面板,输入Shell commands即可找到我们定义好的命令:
+
+
+
+可以为每个命令设置下别名,就是在命令面板显示的名字:
+
+
+
+
+
+在Hotkeys面板中为我们的命令设置好快捷键,就可以通过快捷键快速执行命令了:
+
+
+
+## 7.参考
+
+[Hexo + Obsidian + Git 完美的博客部署与编辑方案>EsunR-Blog](https://link.zhihu.com/?target=https%3A//blog.esunr.xyz/2022/07/e9b42b453d9f.html)
\ No newline at end of file
diff --git "a/_posts/2023-12-24-\351\242\204\350\250\200\346\235\216\346\270\212\343\200\201\345\210\230\347\247\200\350\203\275\345\275\223\347\232\207\345\270\235\347\232\204\350\260\266\347\272\254\344\271\213\350\257\255.md" "b/_posts/2023-12-24-\351\242\204\350\250\200\346\235\216\346\270\212\343\200\201\345\210\230\347\247\200\350\203\275\345\275\223\347\232\207\345\270\235\347\232\204\350\260\266\347\272\254\344\271\213\350\257\255.md"
new file mode 100644
index 00000000000..24b6104297f
--- /dev/null
+++ "b/_posts/2023-12-24-\351\242\204\350\250\200\346\235\216\346\270\212\343\200\201\345\210\230\347\247\200\350\203\275\345\275\223\347\232\207\345\270\235\347\232\204\350\260\266\347\272\254\344\271\213\350\257\255.md"
@@ -0,0 +1,129 @@
+---
+layout: post
+title: 预言李渊、刘秀能当皇帝的谶纬之语
+subtitle: 转载自微信公众号《国家人文历史》
+date: 2023-12-24
+author: Ajiao
+header-img: img/post-bg-2.jpg
+catalog: true
+tags:
+ - 生活
+---
+谶纬,对于当下的中国人而言,已经是一个非常陌生的名词。甚至大多数人念不出前一个字“谶chèn”的正确读音。但你若是穿越到西汉与东汉,尤其是两个汉的末年,你一定会对这两个字耳濡目染。
+
+谶纬是汉代流行的迷信。“谶”是巫师或方士制作的一种隐语或预言,作为吉凶的符验或征兆。亦称“符谶”,有的有图有字,名“图谶”。“纬”对“经”而言,是方士化的儒生编集起来附会儒家经典的各种著作。(《辞海》第七版)
+
+在这个时代,了解、掌握“谶纬”,被视为一个高智商人类的必备技能。
+## 鲤鱼+桃李子=皇帝
+
+事实上,不单是两汉,中国历史每隔数百年,都会有类似内容的“谶纬”出现,以至于很多皇帝权臣,一听见“谶纬”二字,就会害怕得发抖或是兴奋得发狂。所以到了隋朝末年,隋炀帝一朝即位,就派人到四方巡视,但凡发现所谓“谶纬之书”,全部要烧掉。藏匿不报的,一旦被举报,往往就是死路一条。然而,正是隋炀帝自己,在开凿大运河之后,坐着漂亮的凤舫下扬州时,忽然文思泉涌,写下一首诗:
+
+>“三月三日到江头,正见鲤鱼波上游。意欲持钓往撩取,恐是蛟龙还复休。”
+
+差不多同一个时代,又有一首歌谣传遍大街小巷,其中有这么一句:
+
+>“桃李子,鸿鹄绕阳山,宛转花林里。莫浪语,谁道许。”
+
+就是一首诗加一首歌谣,到了那些“谶纬之书”爱好者手里,就琢磨出不一样的滋味来了。表面上看,这两首都很平常,也没什么联系。
+
+前一首,说的是皇帝到了长江下游,望见水里的鲤鱼,拿起钓竿想钓,可是一想这鲤鱼会不会是龙变化而成的呢?于是放下钓竿。
+
+后一首,说的是桃李花园宛转,黄鹄绕山飞,鸟鸣花香好一派美好景象。
+
+可是“谶纬之书”爱好者,即“神秘预言家”,却看出蹊跷来了。他们说鲤鱼和桃李子,谐音都是一个“李”字,而“蛟龙”暗指的是皇帝,“阳山”之“阳”则暗指一个“杨”字,所以根据“谶纬之书”,他们预言:未来会有一个“李”姓的家族取代“杨”姓,建立新的朝代。所以,当时就有一位名为安伽陀的神秘预言家,直接告诉隋炀帝杨广六个大字:“李氏当为天子!”
+
+没错,大家读隋唐史,知道兴兵反隋的几个人,首先是瓦岗寨的李密强盛一时,最终是李渊获得成功。不过当时杨广想到的人,并不是以上两位,而是左武卫将军李浑,因为他的姓和名带水,而他那首诗中的鲤鱼,正是带水之李。另一个倒霉蛋,则是光禄大夫李敏,他的大名无水,可是有个小名叫李洪儿。于是隋炀帝一声令下,李浑和李敏都被咔嚓了。那么李渊呢?他不也姓李,他的名字里不也有个水?为什么隋炀帝不怀疑他呢?
+
+因为当时的李渊,正被派去山西剿匪。而且为了避免皇帝怀疑,之前他故意无节制地饮酒、收受贿赂,装出一副很没格调的样子。隋末李姓的这个神秘流言,就是“谶纬”的后世版本。
+
+## 刘秀发兵捕不道
+
+当然,“谶纬”最兴盛的时代,还是西汉到东汉末年这么一个阶段。最著名的一句,就是:“刘秀当为天子。”这六个字的神秘预言。
+
+首先,是一本叫做《赤伏符》的“谶纬书”中提到一句话:“刘秀发兵捕不道。”神秘预言家们解释说,这句预言的意思是会有一个叫做刘秀的人,带着军队捕杀这个“不道者”。而所谓“不道者”就是指对危害汉朝统治的人,即当时篡夺汉朝帝位的王莽。但这个预言,其实完整版本是:
+
+>“刘秀发兵捕不道,四夷云集龙斗野,四七之际火为主。”
+
+而和这个预言紧密相关的第一个历史人物,叫做刘歆。刘歆是汉室宗亲,他的五世祖,就是汉高祖刘邦的同父异母弟楚王刘交,刘邦是个大老粗,刘交却很喜欢读书,他的老师就是荀子的学生浮丘伯。
+
+刘交的爱学习,传到刘歆的父亲刘向这一代,有两个成就,其一是音乐,他爱弹古琴,还写了一本书叫做《琴说》;另一个是整理校对古典,被认为是中国图书目录学第一人。
+
+所以到刘歆这一代,依旧爱读书,而且读到了这本奇书《赤伏符》,读完之后,大概是公元前6年,刘歆就把自己的名字改为“刘秀”(当时他给《山海经》作注后上书汉哀帝的表奏中,即自称臣“秀”),所以我们姑且把这个“刘秀”称作“刘秀Ⅰ”。
+
+请注意当时王莽还未篡权夺位,所以王莽所理解的“刘秀发兵捕不道”,其实是叫刘秀的这个人会帮自己消灭一切政敌。
+
+于是,刘歆改名刘秀6年后,即公元1年,王莽成为“安汉公”。公元6年,王莽成为“假皇帝”,公元9年,王莽正式篡夺西汉政权,自称皇帝。也就是王莽称帝这一年,“刘秀Ⅰ”被册封为国师。
+
+另一个刘秀,即东汉开国皇帝,他出生于公元前5年,比“刘秀Ⅰ”的出现要晚一年,所以我们可以称他为“刘秀Ⅱ”。那么为什么他的名字也会叫刘秀呢?这是因为他的父亲当时只是一个县令,孩子出生时,让一个叫做“王长孙”的卜人为孩子算上一卦,结果说很吉利,而当时县令的屋前长出三株野谷子——谷类作物抽穗开花,叫做“秀”,因此这个孩子就得名刘秀。所以,“刘秀Ⅱ”的这个名字,并不是因为神秘预言的结果。
+
+但是命运,似乎注定要让刘秀和这个预言扯上关系。那是他成年之后,当王莽已经建立新朝,一个叫做蔡少公的“谶纬人士”在大庭广众之下说了这样一句话:“刘秀当为天子。”
+
+随后,刘秀的哥哥刘演,便正式打出了“复高祖之业,定万世之秋”的口号,起义“反新复汉”。
+
+“刘秀Ⅰ”于公元23年,终于在权力斗争中死去。他的死,似乎证明了一点,那就是“刘秀发兵捕不道”这句话里所讲的“刘秀”,对应的并不是他。他死后,王莽也迅速走向末日。登上皇位之人,是汉景帝的后裔刘玄,即所谓更始帝。
+
+这一切,似乎证明“刘秀当为天子”这句话也破产了。然而就在大家认为大局已定之际,“刘秀Ⅱ”却在河北与更始政权公开决裂,当他的军队推进到鄗城,也就是今天的河北邢台,刘秀当年在太学读书时的好友、关中人强华来到了河北。
+
+当年,刘秀、邓禹(后助力建立东汉,成为东汉一代名将)在长安太学读书时,认识了两个朋友,一个叫做严光,即范仲淹誉之为“云山苍苍,江水泱泱。先生之风,山高水长”的那个隐士;另一个就是强华。
+
+这四个人,当时据说在学术上各有所长。刘秀是《尚书》,邓禹是《诗经》,严光是《左传》,而强华,就是一心扑在了“谶纬书”的研究上。而偏偏这个时候,强华就递给刘秀一本书,即《赤伏符》。
+
+刘秀说老同学你给我书做什么,现在可不是读书做学问的时候,我还在打仗扫平天下呢!
+
+强华同学于是便念了书中这样一句话,即之前刘歆的研究成果:“刘秀发兵捕不道,四夷云集龙斗野,四七之际火为主。”
+
+强华说,之前那个刘秀失败了,因为他是冒充的。你会成功,因为你是正牌刘秀。就因为这句话,没多久,刘秀就在大家的竭力劝说下,终于勉为其难地当上了皇帝,即光武帝。
+
+你瞧瞧,西汉灭亡之后先后走上帝位的三个人,从王莽开始,到刘玄(绿林军所立皇帝)、刘盆子(赤眉军所立),最后为什么都不成功呢?按照强华的解释,很简单,就是因为他们不是“刘秀”。只有“刘秀”,才能带领义军消灭这些“不道(不符合天道)”的非法武装,重建汉室。
+
+这,就是“谶纬”的力量。“谶”这个字,左边是个“言”,右边这个字形,则是用“戈”割山里的野生韭菜。所以“谶”字最初的意思,就是“说要大量割韭菜”,然后割韭菜引申为割人头,所以又有了“说要大量杀戮”的意思,随即引申为“即将发生大屠杀的预言”,最后保留的是“预言”这个涵义。
+
+那么“纬”呢?本义是织物的横线,竖线则叫做“经”。之后,古人就拿这两个字来比喻一种秩序,用在地理上,即南北纬、东西经;用在法律上,即秩序,以法律做准绳治理百姓,告诉他们什么该做什么不该做。
+
+“谶”和“纬”合起来,就是“对世界秩序的预言”。那么古人眼中决定世界秩序的最重要课题是什么呢?那就是《易·序卦传》所说的:“有父子,然后有君臣;有君臣,然后有上下。”
+
+确定了谁为君,一切秩序也就安定下来了。所以“对世界秩序的预言”,即“谶纬”,说到底就是:“预测谁会当皇帝。”
+
+放在两汉之交,“谶纬”就提前告诉大家:王莽是非主流,刘秀才是真皇帝——当然,实际上没这么离奇,刘秀能当皇帝,并不是完全依靠“谶纬”的力量,如果他争夺天下失败,那些“谶纬大师”完全可以说,这个“刘秀”也是假的,然后再去寻找个第三个“刘秀”。
+
+但是事实上,就是因为这样一个历程,光武帝刘秀认识到,“谶纬”这个东西太好了。它可以证明自己能夺取天下完全是天意,具有充足的合法性,自己是如假包换的真龙天子,那么他的子孙后代,就可以延续这份天意,将汉室江山传承下去。所以从这个时候起,“谶纬”几乎成为东汉的官方哲学。
+
+但是我们知道,汉朝的正统学术毕竟还是儒家学说,当时有两种经,一种是汉初由老儒背诵,口耳相传的经文与解释,由弟子用当时的隶书记录下来的经典。因为隶书是由篆书发展而来的秦汉文字,最早的孔子经文,显然不可能是隶书字体,所以这种儒经就称为“今文经”。
+
+另一种儒家经典书籍,则称为“古文经”。是汉朝建立以后,陆续发现民间藏匿的儒家经典——早先秦始皇焚书之际,一批儒生冒着生命危险,将经典埋藏起来(竹简具备一定耐久性),等到汉朝景帝、武帝时,才陆续挖出来,献给朝廷。
+
+包括“第一个刘秀”(刘歆)在内,两汉的很多儒家学者都推崇“古文经”,否定“今文经”。但是到了东汉,“古文经”如何能在官方视角之下获得权威地位呢?
+
+## 六七四十二代汉者,当涂高也
+
+东汉儒生想到的办法,就是把官方推崇的“谶纬”和“古文经”联系起来。张衡说:“自中兴之后,儒者争学图纬,兼復附以訞言。”可见“谶纬”在当时的流行度和权威性。甚至到东汉末年,比较著名的儒学大师郑玄(公孙瓒和刘备的老师)、贾逵也都致力于这方面的拓展。
+
+儒生这么干,自然也就带动了当朝的权臣。董卓,几乎是所有人眼中认定的粗人,可是他要推动汉室迁都长安,打的也是“谶纬”这面旗帜:
+
+>“高祖都关中,十有一世,光武宫雒阳,于今亦十一世矣。案《石包谶》,宜徙都长安,以应天人之意。”
+
+他提到的《石包谶》,虽然我们现在无法知晓作者是谁,写于何时,但可以肯定,这是汉朝诸多“谶纬书”的一本。董卓拿它当依据,可见这本书也自有它的分量。
+
+如果说董卓是来自凉州的乱臣,那么系出名门的袁术,居然也迷信“谶纬书”,足以证明这一门学说在那个时代的兴盛。
+
+袁术相信的“谶纬书”,就是《春秋谶》,也就是和《春秋》配套的一本谶纬书。这本书固然已经失传,但是《汉武故事》有这样一句话:
+
+>“汉有六七之厄,法应再受命,宗室子孙谁当应此者?六七四十二代汉者,当涂高也。”
+
+《汉武故事》托名班固所写,实际作者很可能是魏晋时人,但“代汉者,当途高”一语在《后汉书》中也出现过,足以证明袁术相信的“谶纬书”在当时广为流传。
+
+两汉之际,公孙述割据四川,他也很相信“谶纬书”,当时他在一本叫做《录运法》的“谶纬书”里找到这么一句:“废昌帝,立公孙。”于是就以汉朝的继承者自居,认为姓刘的不行了,该姓公孙的上了。
+
+于是刘秀写信给他,说《录运法》不靠谱,《春秋谶》才权威:“看过《春秋谶》么?书上说代汉者当涂高,你难道是当涂高吗?”结果公孙述真的输了。
+
+那么东汉末年的袁术,就动了这方面的脑子,他认为“代汉者,当涂高也”这句话里的“涂”通“途”,也就是公路的意思,而袁术的字就是公路,所以得出结论:“代汉者,袁术也。”
+
+但事实证明袁术也是错的。最后,当曹丕要夺汉献帝的皇位时,曹家这边的人终于找出了理由,一是魏这个字,有巍峨宫阙的意思,而巍峨不就是高的意思吗?所以当涂高就是“汉朝应该把帝位交给魏”。另一种说法,“当涂高”就是当官掌权的意思,而曹家的“曹”,古代用来指分科治事的官署和部门,如刑曹、兵曹、功曹,所以“当涂高”就是“把帝位交给当官掌权的曹家”。
+
+## 女主武王代有天下
+
+时代虽然不同,情节的内核却总会有几分相似。到后来,唐朝李世民时期,太史令李淳风有关于“女主昌”,以及“唐三世之后,女主武王代有天下”的“谶纬”。于是李世民疑神疑鬼,最后锁定李君羡(小名五娘),将其处死。
+
+赵匡胤陈桥兵变前夕,有“谶纬书”鼓吹:“点检做天子。”直到元朝末年,还有“莫道石人一只眼,挑动黄河天下反”这样的民谣,其实说到底,也是一种“谶纬书”。
+
+随着时代的进步,传媒发展,民智渐开,慢慢地没人信这个了,当然谶纬之说也就失去了自我实现的力量,被时代抛弃了。
diff --git "a/_posts/2023-12-29-\347\261\263\347\262\256\345\267\235\350\256\260.md" "b/_posts/2023-12-29-\347\261\263\347\262\256\345\267\235\350\256\260.md"
new file mode 100644
index 00000000000..d6b37e12674
--- /dev/null
+++ "b/_posts/2023-12-29-\347\261\263\347\262\256\345\267\235\350\256\260.md"
@@ -0,0 +1,22 @@
+---
+layout: post
+title: 米粮川记
+subtitle: 我的家乡在秦岭深处
+date: 2023-12-29
+author: Ajiao
+header-img: img/post-bg-2.jpg
+catalog: true
+tags:
+ - 生活
+---
+从西安向南,穿秦岭过柞水,到镇安两河后向东,经张家川翻东岭,沿山溪逶迤南行,山河交汇之处,川道浑然天成,这就是米粮川,我的家乡。
+
+我的家乡,是秦岭南麓一个普通的小山村。从水峡熨斗来的河水,在双龙堰夹峡间喷涌而出,一头撞上了牛头山,河水骤然右转,顺杨拉峡东流。河流激荡,沧海桑田,千百年来,河水在这冲出一块四面环山的小盆地。
+
+南有阴坡山东山,高大雄壮。西有张宝山,雄浑耸立。东有牛头山,状似耕牛,栩栩如生,终年青翠。北面,山势稍缓,绵延不绝,青山如黛。
+
+川中,唐家河支流穿堂而过。两侧,各有平川数里。其间,阡陌交通,屋舍纵横,充满人间烟火,生机勃勃。
+
+米粮川,顾名思义,盛产大米。据传,双龙堰右侧山边,有块稻田,水质甘甜,产米喷香,曾为贡米。如今,贡米早已成为传说。倒是,受惯了逼仄,这里一方天地,豁然开朗。
+
+这,就是生我养我的乡土。15岁入县城求学前,下河抓鱼、上山拾柴,田野间奔走嬉戏,春去秋来,这里留下了我童年和少年的快乐。后因求学和工作,回乡日短。记忆里,常有草蛇灰线、那山那水,让人魂牵梦绕……
diff --git "a/_posts/2023-12-6-\346\237\240\346\252\254\346\230\257\344\270\252\347\210\261\350\257\273\344\271\246\347\232\204\345\245\275\345\256\235\345\256\235.md" "b/_posts/2023-12-6-\346\237\240\346\252\254\346\230\257\344\270\252\347\210\261\350\257\273\344\271\246\347\232\204\345\245\275\345\256\235\345\256\235.md"
new file mode 100644
index 00000000000..8ee02f29791
--- /dev/null
+++ "b/_posts/2023-12-6-\346\237\240\346\252\254\346\230\257\344\270\252\347\210\261\350\257\273\344\271\246\347\232\204\345\245\275\345\256\235\345\256\235.md"
@@ -0,0 +1,20 @@
+---
+layout: post
+title: 柠檬是个爱读书的好宝宝
+subtitle: 家有萌女初长成
+date: 2023-12-06
+author: Ajiao
+header-img: img/post-bg-2.jpg
+catalog: true
+tags:
+ - 生活
+---
+柠檬是个爱读书的好宝宝。
+
+很小的时候,大概五六个月大的时候,柠檬就可以读书了,准确的说是看书。只要看到书本,她就可以安静的看很长时间,很喜欢书。
+
+看书的习惯可能来自妈妈,因为妈妈很早的时候,给她买了书架,还给她买了很多启蒙书籍。之后,姥姥在带她的时候,会给她讲故事,每天读很长时间。慢慢地,柠檬就养成了看书的习惯。
+
+柠檬,尽管年龄很小,还不会说话,但看书的时候,书本从来不会拿反。再后来,牙牙学语的时候,她就会逐页翻动,用手指着字,咿咿呀呀说个不停,没人知道她在念什么。
+
+现在,奶奶也会带着柠檬念书看书,尽管奶奶用的是方言,但柠檬听的仍然很认真。希望以后,柠檬一直都能保持爱看书的好习惯。
\ No newline at end of file
diff --git "a/_posts/2024-1-13-\350\256\260\346\211\277\345\244\251\345\257\272\345\244\234\346\270\270.md" "b/_posts/2024-1-13-\350\256\260\346\211\277\345\244\251\345\257\272\345\244\234\346\270\270.md"
new file mode 100644
index 00000000000..dbcbd0bdfc6
--- /dev/null
+++ "b/_posts/2024-1-13-\350\256\260\346\211\277\345\244\251\345\257\272\345\244\234\346\270\270.md"
@@ -0,0 +1,18 @@
+---
+layout: post
+title: 记承天寺夜游
+subtitle: 宋.苏轼
+date: 2024-01-13
+author: Ajiao
+header-img: img/post-bg-3.jpg
+catalog: true
+tags:
+ - 学习
+---
+元丰六年十月十二日夜,解衣欲睡,月色入户,欣然起行。
+
+念无与为乐者,遂至承天寺寻张怀民。怀民亦未寝,相与步于中庭。
+
+庭下如积水空明,水中藻荇交横,盖竹柏影也。
+
+何夜无月?何处无竹柏?但少闲人如吾两人者耳。
diff --git "a/_posts/2024-1-14-\345\271\264\346\234\253\345\262\201\345\260\276\357\274\214\344\270\200\346\256\265\345\267\250\345\277\231\346\227\266\345\205\211\357\274\201.md" "b/_posts/2024-1-14-\345\271\264\346\234\253\345\262\201\345\260\276\357\274\214\344\270\200\346\256\265\345\267\250\345\277\231\346\227\266\345\205\211\357\274\201.md"
new file mode 100644
index 00000000000..b3411ddea7c
--- /dev/null
+++ "b/_posts/2024-1-14-\345\271\264\346\234\253\345\262\201\345\260\276\357\274\214\344\270\200\346\256\265\345\267\250\345\277\231\346\227\266\345\205\211\357\274\201.md"
@@ -0,0 +1,28 @@
+---
+layout: post
+title: 年末岁尾,一段巨忙时光
+subtitle: 火力全开36天
+date: 2024-01-14
+author: Ajiao
+header-img: img/post-bg-1.jpg
+catalog: true
+tags:
+ - 工作
+---
+年末岁尾,经历了一段巨忙的时期。
+
+准确的说,从12月7日晚到1月11日午。其间,紧张、焦灼、火力全开。
+
+12月7日,周四。忙碌了一天,准备下班之际。接到市委值班室电话,第二天上午常委会,要审议先行区实施方案。尽管当天中午得到小道消息,已有所准备,但仍猝不及防。遂带魏博士至市委连夜加班印制上会材料。
+
+程序不多,但等待时间不少。灯影婆娑,四下寂静、夜间清冷,我们走了一圈又一圈,直到改稿。改稿过程非常顺利,一次成行。无奈轻印室手工印制,校对、修改、打印、分类、刷胶、晾干,之后才能带走。四个部门,我们速度最快,结束已是11点。
+
+之后,市级项目立项、资金拨付、合同书签订;秦创原日常监测、重点监测、专项考核、四个重大、政策包、三年自评、未来产业聚集区;创新载体摸底、高企核查,各种工作任务纷至沓来,全部压在这一个月时间里。
+
+从早到晚,每天都是火力全开。即便如此,依然压力山大。偶尔,还会碰到一些不理解和小插曲。工作以来,从未因工作失眠。但,其间两晚,夜不能寐。巨大的工作压力,带来身体不适。元旦后,连续处于感冒状态,稍吹冷风,或吃冷食,即头痛不止。
+
+所有工作之中,轻重缓急,专项考核最为关键,20个指标,共计31个得分点,牵扯部门多、数据多、资料多。恰巧,部分指标极难统计。本不主张加班,周末组织大家,紧锣密鼓、全力推进,完成初稿。之后,亲自整理了每个指标,每个数据,每份资料。
+
+1月11日,周四。看到打印部送来的专项考核资料初稿,顿时有种轻松愉悦之感。之前,困扰了一个多月的紧张、焦灼、焦虑,霎时间消失不见。
+
+手头工作并非全部完成,重要工作已排队等候。但,心态已然不同。前路漫漫,勇往无前,轻舟已过万重山。
diff --git "a/_posts/2024-1-21-\346\235\216\347\231\275\302\267\345\260\206\350\277\233\351\205\222.md" "b/_posts/2024-1-21-\346\235\216\347\231\275\302\267\345\260\206\350\277\233\351\205\222.md"
new file mode 100644
index 00000000000..9e8aacdd4d0
--- /dev/null
+++ "b/_posts/2024-1-21-\346\235\216\347\231\275\302\267\345\260\206\350\277\233\351\205\222.md"
@@ -0,0 +1,34 @@
+---
+layout: post
+title: 将进酒
+subtitle: 唐.李白
+date: 2024-01-21
+author: Ajiao
+header-img: img/post-bg-3.jpg
+catalog: true
+tags:
+ - 学习
+---
+君不见,黄河之水天上来,奔流到海不复回。
+
+君不见,高堂明镜悲白发,朝如青丝暮成雪!
+
+人生得意须尽欢,莫使金樽空对月。
+
+天生我材必有用,千金散尽还复来。
+
+烹羊宰牛且为乐,会须一饮三百杯。
+
+岑夫子,丹丘生,将进酒,杯莫停。
+
+与君歌一曲,请君为我倾耳听。
+
+钟鼓馔玉不足贵,但愿长醉不复醒。
+
+古来圣贤皆寂寞,惟有饮者留其名。
+
+陈王昔时宴平乐,斗酒十千恣欢谑。
+
+主人何为言少钱,径须沽取对君酌。
+
+五花马、千金裘,呼儿将出换美酒,与尔同销万古愁!
diff --git "a/_posts/2024-1-21-\350\207\264\346\225\254\347\275\227\351\251\254\344\270\273\345\270\205\347\251\206\351\207\214\345\260\274\345\245\245.md" "b/_posts/2024-1-21-\350\207\264\346\225\254\347\275\227\351\251\254\344\270\273\345\270\205\347\251\206\351\207\214\345\260\274\345\245\245.md"
new file mode 100644
index 00000000000..5704483f824
--- /dev/null
+++ "b/_posts/2024-1-21-\350\207\264\346\225\254\347\275\227\351\251\254\344\270\273\345\270\205\347\251\206\351\207\214\345\260\274\345\245\245.md"
@@ -0,0 +1,33 @@
+---
+layout: post
+title: 追忆罗马欧协杯夺冠
+subtitle: 致敬穆里尼奥
+date: 2024-01-21
+author: Ajiao
+header-img: img/post-bg-2.jpg
+catalog: true
+tags:
+ - 生活
+---
+作为罗马球迷,我永远忘不了2022年5月21日,那个韩城的清冷的早晨。
+
+彼时,秦创原建设工作开始一年,省督导组来渭调研。前一天晚间,一行人抵达黄河岸边小城,韩城,下榻韩城宾馆。作为陪同人员,一并入住。
+
+当晚有场重要的罗马比赛,欧协杯决赛,罗马对阵费耶诺德。作为罗马铁粉,当然不能错过。然,宾馆房间没电脑,和同事合住,不能动静太大。
+
+遂,夜半穿衣外出。凌晨两点的韩城街道上,四下寂静无人,路边灯影昏黄。虽已五月,刚下过雨,气温微凉。找了一家网吧,包夜坐定督战。
+
+看过无数场比赛,那场极为特别,也极为清晰。小曼奇尼的后场大脚长传,扎尼奥洛小禁区左侧胸部停球,起脚爆射,打进全场比赛唯一进球。
+
+终场哨响,罗马成功夺冠,穆里尼奥和球员们疯狂庆祝。我坐在电脑前,久久不愿起身离开,静静的享受夺冠后的喜悦,一股巨大的幸福感袭来。
+
+对于多年无冠的罗马,这一刻,太陌生,太难得。万里之外,黄河岸边小城,我和罗马,此时此刻悲喜同享。
+
+返回宾馆途中,天已泛白,晨光乍现,路上行人寥寥。路过街边黄河号子雕塑,遒劲、有力,充满生机和力量,宛如刚刚捧杯夺冠的穆氏罗马。
+
+此刻,听闻穆里尼奥下课,不禁感慨万千。掌舵两年半,穆里尼奥成绩难称优秀,但他传递给球迷的激情和热爱无与伦比。此刻解雇,缺乏尊重。
+
+
+
+
+
diff --git "a/_posts/2024-1-3-win10\345\222\214win11\346\225\260\345\255\227\350\256\270\345\217\257\350\257\201\346\277\200\346\264\273.md" "b/_posts/2024-1-3-win10\345\222\214win11\346\225\260\345\255\227\350\256\270\345\217\257\350\257\201\346\277\200\346\264\273.md"
new file mode 100644
index 00000000000..5d7c4d26b08
--- /dev/null
+++ "b/_posts/2024-1-3-win10\345\222\214win11\346\225\260\345\255\227\350\256\270\345\217\257\350\257\201\346\277\200\346\264\273.md"
@@ -0,0 +1,48 @@
+---
+layout: post
+title: win10和win11数字许可证激活
+subtitle: 转载自www.xb21cn.com
+date: 2024-01-03
+author: Ajiao
+header-img: img/post-bg-4.jpg
+catalog: true
+tags:
+ - 网络
+---
+Windows10/11最好的激活方式是采用数字许可证激活,具体的原理我已经介绍过了,需要联网向微软服务器请求后才能予以永久激活。
+
+下面介绍一个方法,不用先去网上下载激活软件,**只需一条命令**即可自动完成,适用于Windows10以及Windows11系统。
+### 1.键入命令
+
+以管理员身份运行Powershell,键入以下命令:
+
+`irm https://massgrave.dev/get | iex`
+
+[](https://www.xb21cn.com/wp-content/uploads/2022/12/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20221205091033.png)
+
+### 2.选择激活选项
+
+稍等片刻,弹出一个批处理窗口,这时根据选项操作即可。
+- 选择[1]代表数字许可证激活;
+- 选择[2]代表KMS38激活(至2038年);
+- 选择[3]代表使用KMS激活(180天)。
+这里根据需要,键入**1**,接下来程序自动执行数字权利激活。
+
+[](https://www.xb21cn.com/wp-content/uploads/2022/12/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20221205091116.png)
+
+[](https://www.xb21cn.com/wp-content/uploads/2022/12/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20221205091139.png)
+
+至此绿色背景处显示Windows10专业版已经永久激活,整个过程速度很快,完成后关闭所有窗口即可。
+### 3.一些说明
+
+数字许可证激活的好处是,硬件信息自动上传的微软服务器,一旦实施激活后,下次即便重装系统(必须是同一版本),无需再次激活,它就会自动永久激活。
+
+但是有一点需要说明的是,假如你的Win10/11专业版数字激活后,你重装系统安装的是专业版(批量授权),则不能自动数字激活,必须安装专业版(零售版)才可以自动数字激活。假设遇到了这种情况,也不用太担心,输入一个**通用密钥**即可。其原因也很简单,因为全新安装的系统,默认安装是GVLK密钥,与数字许可证激活使用的密钥不是同一个类型。同理,Win10/11企业版也存在类似问题,究其原因也是系统默认安装的密钥是GVLK密钥,处理方法相同。
+
+可能有人会问,通用的密钥去哪里找呢?其实这个密钥微软并未公开,但是系统一般都自带,可以通过调用pkeyhelper.dll文件里的SkuGetProductKeyForEdition函数来获取,涉及到编程我就不展开介绍了,感兴趣的可以在微软技术文档里查询。如果你只是想获取这些通用密钥,直接百度/谷歌/必应更方便~
+
+### 4.最后
+
+实际上本文提供的这条命令相当于自动下载了一个激活用的批处理脚本,放到了%temp%目录下,执行完激活后自动删除,在系统中没有残留。这种方法好处是不需要经常去下载软件的最新版了,直接使用一条命令搞定,方便高效。如果还是希望去下载软件后使用,这个脚本是开源项目,可以去Github下载,安全可靠,非常好用~
+
+[https://github.com/massgravel/Microsoft-Activation-Scripts](https://github.com/massgravel/Microsoft-Activation-Scripts)
\ No newline at end of file
diff --git "a/_posts/2024-10-16-\347\271\201\345\277\231\347\232\204\346\227\245\345\255\220.md" "b/_posts/2024-10-16-\347\271\201\345\277\231\347\232\204\346\227\245\345\255\220.md"
new file mode 100644
index 00000000000..0aa80fddd41
--- /dev/null
+++ "b/_posts/2024-10-16-\347\271\201\345\277\231\347\232\204\346\227\245\345\255\220.md"
@@ -0,0 +1,20 @@
+---
+layout: post
+title: 繁忙的日子
+subtitle: 天道酬勤
+date: 2024-10-16
+author: Ajiao
+header-img: img/post-bg-2.jpg
+catalog: true
+tags:
+ - 生活
+---
+两个博士返回学校后,雅玲回疆也提上日程,原本兵强马壮的秦创原专班慢慢的开始凋零,想当年满员十人,现在经常三四个人办公,让人唏嘘不已。
+
+工作人员凋零同时,工作任务越来越重。
+
+开年R&D统计,接下来是新一轮秦创原三年计划政策起草,紧接着是三个月的科小入库和一个月的高企培育。大家都说,商场如战场,我也在打仗,全力以赴、攻坚克难、奋勇争先。期间,还很焦虑。然后,还有年底的秦创原考核。此外,还有产业链招商,聚集区建设和高新区创建等等,不一而足。
+
+一件件、一桩桩,压的让人有点透不过气,甚至偶尔会焦虑到睡不着觉。前天晚上下班回家,感觉人被掏空了一般,异常疲惫,八点多就上床休息了。
+
+唯一值得高兴的是,工作结果都还不错。各项工作都没落下,今天早上还得到了R&D结果不错的好消息。最后,希望天道酬勤,辛苦都会收获满满吧!
\ No newline at end of file
diff --git "a/_posts/2024-10-27-\346\215\237\344\274\244\346\200\247\351\252\250\345\205\263\350\212\202\347\202\216.md" "b/_posts/2024-10-27-\346\215\237\344\274\244\346\200\247\351\252\250\345\205\263\350\212\202\347\202\216.md"
new file mode 100644
index 00000000000..2322e0f8506
--- /dev/null
+++ "b/_posts/2024-10-27-\346\215\237\344\274\244\346\200\247\351\252\250\345\205\263\350\212\202\347\202\216.md"
@@ -0,0 +1,26 @@
+---
+layout: post
+title: 损伤性骨关节炎
+subtitle: 或许,这也是生活的馈赠。
+date: 2024-10-27
+author: ajiao
+header-img: img/post-bg-alitrip.jpg
+catalog: true
+tags:
+ - 生活
+---
+18年前,还是2006年,那时大学刚毕业,很年轻、很美好,但也很迷茫。
+
+在中科院新疆理化所教授的忽悠下,远赴山东青岛找了份工作。海滨城市青岛很美,蓝天、碧海、红墙。可惜,这和我工作的胶州洋河河西郭没什么关系。不到两年,穷的开心、清澈、无奈,还留下了困扰我这么多年的伤病。
+
+我们刚到青岛,公司还未投产,正在安装设备。大家都在工地干些杂活。二十多岁,都很年轻,也很毛躁。电缆脚架侧倒,一不小心,右脚背被砸了。当时感觉挺疼,拍了片子,没有骨折,吃了点药,休息了几天,以为好了。
+
+没有想到,这就是一段噩梦的开始。离职后,我去了遥远的新疆。每年总有几次,右脚巨疼。开始是脚背,然后延伸到脚踝。伴随着疼痛,脚踝软组织也会肿大,脚难下地。买过很多药效果寥寥,差不多每次要疼足一个星期。
+
+去年夏天,去上海调研。傍晚沿着外滩走了一圈。本来是件极开心的事情。不料,当晚右脚开始疼痛。一路痛到苏州,喝了点绍兴花雕,脚更疼了。
+
+半夜忍痛找了美团医生,远在聊城医生线上诊断,听了描述后给我开了两个药,其中就有扶他林。我要感谢这个医生。对付我的脚踝疼痛,这个扶他林非常有效。涂抹后,两小时左右就会消肿去痛,非常神奇,可惜无法根治。
+
+今年给小孩打疫苗,顺便问了社区医生。听了我的描述后,社区医生说,应该是损伤性骨关节炎。回来查了些资料,发现这毛病无法根治,瞬间石化。
+
+或许,这就是成长的代价,生活的馈赠吧。
\ No newline at end of file
diff --git "a/_posts/2024-11-21-\346\270\255\345\215\227\345\270\202\346\213\233\345\225\206\345\274\225\350\265\204\350\203\275\345\212\233\346\217\220\345\215\207\344\270\223\351\242\230\345\237\271\350\256\255\345\277\203\345\276\227\344\275\223\344\274\232.md" "b/_posts/2024-11-21-\346\270\255\345\215\227\345\270\202\346\213\233\345\225\206\345\274\225\350\265\204\350\203\275\345\212\233\346\217\220\345\215\207\344\270\223\351\242\230\345\237\271\350\256\255\345\277\203\345\276\227\344\275\223\344\274\232.md"
new file mode 100644
index 00000000000..85c93ad5b43
--- /dev/null
+++ "b/_posts/2024-11-21-\346\270\255\345\215\227\345\270\202\346\213\233\345\225\206\345\274\225\350\265\204\350\203\275\345\212\233\346\217\220\345\215\207\344\270\223\351\242\230\345\237\271\350\256\255\345\277\203\345\276\227\344\275\223\344\274\232.md"
@@ -0,0 +1,26 @@
+---
+layout: post
+title: 金鸡湖畔苏州工业园七日学习
+subtitle: 渭南市招商引资能力提升专题培训心得体会
+date: 2024-11-21
+author: Ajiao
+header-img: img/post-bg-3.jpg
+catalog: true
+tags:
+ - 学习
+---
+11月11日至15日,参加了市委组织部和市外经局在苏州工业园区新加坡国立大学苏州研究院举办的“渭南市招商引资能力提升专题培训班”。本次培训有以下几个特点:一是地点好。培训在苏州工业园进行,苏州工业园区排名国家高新区第四,国家经开区“八连冠”,国内顶级工业园区,发展历程、工作思路、服务模式,有很多值得学习的经验。二是师资强。培训专家来自上海社科院、国家实验室——姑苏实验室、苏州工业园企服中心等机构,还邀请湖州长兴驻上海办主任、原无锡科技局局长、原杭州钱塘区招商局局长等工作经验丰富专家。三是问题准。在《公平竞争审查条例》出台,税收返还等传统招商举措无以为继的背景下,专家们对新时期招商进行了分析和解读,还特别提到科技招商、成果转化、产业培育等内容,感受很深,收获很多。
+
+## 一、招商新时代科技招商大有可为。
+《公平竞争审查条例》限制税收优惠和奖补招商,但第十二条“豁免条款”,地方政府可以出台“促进科学进步、增强国家自主创新能力”相关政策。这为科创企业留有“后门”,随后各地政府出台政策肯定会有所倾斜。目前,上海某区正起草《关于产业高质量发展的政策措施》包括“支持研发技术创新”,政策力度不亚于返税。《上海市招商整改任务清单“二十条”》明确提出了“严格按照高新技术企业认定的标准和流程,对符合条件的高新技术企业给予相关扶持政策”,以支持企业开展科技创新代替“税收返还、财政奖补”等优惠政策。
+
+## 二、四链融合是营商环境升级版本。
+苏州营商环境持续在全国,连续5年入选全国“营商环境最佳口碑城市”。苏州的营商环境主要体现了“以企业为本”。苏州工业园设立“帮代办服务专区”,聘用“蓝马甲”志愿者,在服务对象自愿基础上,提供无偿帮办代办服务,有效整合政务服务资源,精简帮办代办工作流程,全程协调、全程跟踪、全程无偿服务,切实打通政务服务“最后一公里”。依托数据平台为企业精准画像、精准服务,为企业快速发展提供产业、创新、资金和人才服务。对初创企业,提供政策扫盲和创业培训,并能提供300万到500万元的超前期无抵押“科创指数贷”;对中等企业,提供产业链供应链市场赋能和融资服务;对拟上市企业,提供上市辅导,指导企业规范经营。根据企业不同发展阶段提供不同服务,构建了贯穿企业全生命周期服务体系。
+
+## 三、成果转化要以企业市场为核心。
+就破解科技和经济两张皮问题,姑苏实验室综合管理部部长介绍了美国未来产业研究所和姑苏实验室成果转化模式。美国未来产业研究所独特之处在于与产业创新相关的所有公共和私营部门都作为核心合作伙伴(政府、科研机构、非营利机构、产业界)参与其中,跨越了从基础研究到产品开发和推广的创新全流程。姑苏实验室以“谁被卡谁出题、谁出题谁出资、谁能干谁来干、谁牵头谁准入”方式推进关键核心技术攻关及迭代应用,入围国家发展改革委和科技部“2021年度全面创新改革任务揭榜清单”,主要是发挥企业贴近市场的先天优势,共同合作科研立项,强化需求导向;成果交易前置,企业在立项阶段支付成果转让费;企业参与立项、研发,锁定研发成果实施方,确保交付成果满足市场需求;研究产生的核心知识产权全部归企业所有。姑苏实验室在推动产业创新和技术创新深度融合做出尝试,先后与企业共同立项了29个企业合作项目。
+
+## 四、找准产业发展定位应对虹吸效应。
+苏州距离上海不到一百公里,一定程度受到“虹吸效应”影响。2019年,时任苏州市市长李亚平表示,“大树底下的碧螺春”,依托上海,错位发展。在产业错位发展上,苏州积极融入上海产业体系,比如:上海有特斯拉,苏州不造整车,转而大力发展企业零部件,引进博世、芬诺等汽车零部件生产企业,从而实现共赢。在产业选择上,坚持“三高三低”原则,即:高技术、高利润、高成长,低污染、低消耗、低土地依赖,然后集中政府有限资源对产业全力支持形成“饱和打击”,打造“成本洼地”,做优营商环境。在产业培育上,苏州工业园区形成了“十个一”特色(新兴)产业培育机制,即:选择一个特色产业,制定一个产业规划,组建一家国资公司,建设一个功能园区,引进一批大院大所,设立一支产业基金,成立一个服务机构,聚集一批龙头企业,搭建一批合作平台,打造一个品牌盛会。生物医药、人工智能和纳米技术应用等三大新兴产业连续多年保持20%增幅,2023年工业园总产值超过4000亿元。
+
+此外,专家们还讲了,招商是“一把手”工程,产业链招商要招引龙头“以商招商”,具体到招商谈判要“人性招商”等内容。
\ No newline at end of file
diff --git "a/_posts/2024-11-28-\345\210\233\346\226\260\351\251\261\345\212\250\345\217\221\345\261\225\346\210\220\346\225\210\346\230\276\350\221\227 \347\247\221\346\212\200\345\274\272\345\233\275\345\273\272\350\256\276\346\234\211\345\212\233\346\216\250\350\277\233.md" "b/_posts/2024-11-28-\345\210\233\346\226\260\351\251\261\345\212\250\345\217\221\345\261\225\346\210\220\346\225\210\346\230\276\350\221\227 \347\247\221\346\212\200\345\274\272\345\233\275\345\273\272\350\256\276\346\234\211\345\212\233\346\216\250\350\277\233.md"
new file mode 100644
index 00000000000..59183d4a279
--- /dev/null
+++ "b/_posts/2024-11-28-\345\210\233\346\226\260\351\251\261\345\212\250\345\217\221\345\261\225\346\210\220\346\225\210\346\230\276\350\221\227 \347\247\221\346\212\200\345\274\272\345\233\275\345\273\272\350\256\276\346\234\211\345\212\233\346\216\250\350\277\233.md"
@@ -0,0 +1,120 @@
+---
+layout: post
+title: 创新驱动发展成效显著 科技强国建设有力推进
+subtitle: 新中国75年经济社会发展成就系列报告之十二
+date: 2024-11-28
+author: Ajiao
+header-img: img/post-bg-3.jpg
+catalog: true
+tags:
+ - 学习
+---
+科技是国家强盛之基,创新是民族进步之魂。新中国成立75年来,我国科技事业经历了从“向科学进军”到提出“科学技术是第一生产力”,从实施科教兴国战略到建设创新型国家,从全面实施创新驱动发展战略到开启科技强国建设新征程的壮阔旅程。党的十八大以来,以习近平同志为核心的党中央坚持把科技创新摆在国家发展全局的核心位置,提出科技创新是发展新质生产力的核心要素,对建设科技强国进行全局谋划和系统部署,推动我国科技事业不断取得新进步,中国已成为具有重要国际影响力的科技创新大国,并正向着世界科技强国的宏伟目标阔步前进。
+
+# 一、国家科技创新体系逐渐发展成熟
+
+## (一)科技创新战略地位日益巩固
+
+新中国成立以来,科技事业发展一直是国家重大发展战略体系的重要内容。党中央牢牢把握世界科技和经济发展大势,结合我国实际对科技事业发展作出重大战略部署。新中国成立初期编制《1956—1967年科学技术发展远景规划纲要》,首次从国家层面对科技发展作出重要安排。改革开放初期编制《1978—1985年全国科学技术发展规划纲要》,首次强调科技发展要与经济建设相结合。2005年发布《国家中长期科学和技术发展规划纲要(2006—2020年)》,强调充分发挥科技对经济社会发展的支撑引领作用。进入新时代,编制《国家中长期科学和技术发展规划(2021—2035)》,强调要加强基础科学研究,加快实现高水平科技自立自强。
+
+## (二)多元主体协同创新格局逐步形成
+
+1949年中国科学院成立,各地区各部门也相继开始布局建立一批科学研究机构。至1966年前后,全国科研机构已经从新中国成立伊始的30多个增加到1700多个,初步形成由中科院、高校、产业部门、地方科研单位和国防部门组成的科学技术体系。改革开放后,我国深化科技体制改革,通过科技拨款制度改革、培育技术交易市场、推动军民融合发展、鼓励民营科技企业发展等方式,积极推动科技与经济相结合。党的十八大以来,国家创新体系建设不断提质加速,逐渐形成以科技型企业、科研院所和高等学校为主体的协同创新体系,还涌现出一批具有多元化投资、多样化模式和市场化运作特征的新型研发机构。其中,以国家实验室、研究型大学、一流科研院所和科技领军企业为代表的国家战略科技力量,是我国科学技术攻关的骨干力量。
+
+## (三)国家重点科技计划体系有序推进
+
+科技计划是政府支持科技创新活动的重要方式,是引导各类资源向重大科技领域有效配置的重要抓手。1956年,我国重点梳理出57项重要科学技术任务和600多个中心问题,提出12项具有关键意义的重大任务,成为国家科技计划体系的雏形。改革开放后,国家科技计划体系不断调整,到“十二五”时期,基本形成了以重大专项和基本计划为核心的体系。重大专项为我国关键领域核心技术突破和资源集成提供重要支撑,基本计划则包括国家重点基础研究发展(973)计划、国家高技术研究发展(863)计划等。2014年,我国科技计划体系进一步整合为五类科技计划,包括国家自然科学基金、国家科技重大专项、国家重点研发计划、技术创新引导专项(基金)以及基地和人才专项,成为新时代推动国家重大科技创新需求落地的重要渠道。
+
+## (四)基础研究战略布局不断优化
+
+新中国成立后,我国相继取得了第一颗原子弹装置爆炸成功、第一枚自行设计制造的运载火箭发射成功、世界上首次人工合成牛胰岛素等一批追赶世界水平的重大科技成果。改革开放后,我国基础研究逐渐形成了较为完整的学科布局,一批新兴交叉学科快速发展,若干领域进入世界先进行列。党的十八大以来,我国进一步强化基础研究战略布局,在干细胞及转化、纳米科技、量子调控和量子信息、蛋白质与生命过程调控、合成生物学等多个领域布局开展重大科学问题研究。同时,积极推进系列重大科研基础设施建设,如500米口径球面射电望远镜(FAST)、磁约束核聚变实验装置(EAST)、中国散裂中子源、中微子实验室等。依托重大科学装置和基础设施平台,我国在空间探测、核聚变研究和微观世界研究等基础前沿领域科研能力显著提升。
+
+# 二、科技创新投入要素加速聚集
+
+## (一)研发经费投入不断取得历史性突破
+
+2023年我国全社会研究与试验发展(R&D)经费投入规模达33278亿元[1],比1991年增长233倍,年均增长18.6%。党的十八大以来,我国加快实施创新驱动发展战略,全社会研发经费加速聚集,全社会R&D经费分别于2019年和2022年迈上2万亿和3万亿台阶,成为仅次于美国的世界第二大研发投入国家。R&D经费投入强度[2]从1991年的0.6%提升至2023年的2.64%,在世界上位列第12位,与OECD国家(2.7%)差距进一步缩小[3]。
+
+## (二)人才资源科技创新红利持续释放
+
+人才是科技创新的第一资源,我国劳动年龄人口素质稳步提升,为创新发展提供了丰富人才储备。根据第七次全国人口普查数据,2020年我国大专及以上受教育程度人口占比达23.6%,提高11.3个百分点。随着科教兴国、人才强国战略实施,我国科技创新人才队伍不断壮大。1991年以来,我国按折合全时工作量计算的研发人员总量增长了10倍,2012年突破300万人年,2013年超过美国,2023年达724万人年,连续11年稳居世界第一。
+
+## (三)财税政策引导支持力度不断增强
+
+我国不断优化调整财税政策,加强对科技创新的支持力度,激励企业不断加大研发投入。1985年科技拨款制度重大改革以来,全国财政科技支出稳步增长,在国家公共财政支出中所占比重保持稳定。2012年和2019年财政科学技术支出分别迈上5000亿和1万亿台阶,2022年达1.1万亿元。综合运用税收优惠措施激励企业加大研发投入。1996年开始实施企业研发费用加计扣除政策,近年来,企业研发费用加计扣除政策持续扩大适用范围、提升扣除比例、简化申报程序,从2023年企业所得税预缴申报情况看,企业累计享受加计扣除的研发费用金额达1.85万亿元[4]。此外,包括高新技术企业所得税优惠政策在内的一系列税收政策,均有效降低了企业研发活动成本。
+
+## (四)多层次科技金融支持体系逐渐成形
+
+党的十八大以来,我国持续深化科技金融的供给侧结构性改革,多层次的科技金融体系逐步发育。一方面直接融资渠道更为多元,面向初创期科技型企业或团队的创投风投市场逐步成长,面向起步期或成长期科技型企业的股票市场不断进行制度创新。2013年设立“新三板”,2019年设立“科创板”,重点满足科创型企业直接融资需求。截至2023年底,科创板共有566家挂牌企业,总市值达6.2万亿元。2018年港交所允许未有收入利润的生物科技企业提交上市申请,截至2023年底共有64家生物科技企业通过该规则在港股上市。另一方面间接融资惠及面扩大,银行信贷对科创企业的重点倾斜和支持力度提升。2023年末,获得贷款支持的科技型中小企业和高新技术企业分别达21.2万家和21.8万家,本外币贷款余额达2.5万亿元和13.6万亿元[5]。
+
+## (五)科技创新服务体系作用发挥更加充分
+
+1981年我国首次提出对科技成果进行有偿转让,技术交易市场开始孕育发展。1996年制定《中华人民共和国促进科技成果转化法》,2015年对法律进行修订并制定配套政策和行动方案,技术要素市场加速发展壮大。2023年,我国技术市场成交合同数95万项,成交总金额6.1万亿元,分别是2012年的3.4倍和9.6倍。2016年推进孵化器、众创空间等科技服务机构建设,截至2022年底,各级各类科技企业孵化器6659家,孵化器内企业32.7万家。
+
+# 三、重大科技创新成果不断涌现
+
+## (一)前沿科学发现与原创科技成果不断涌现
+
+我国不断加大在基础研究领域的投入力度。1986年国家自然科学基金设立,2023年国家自然科学基金共资助5.25万个项目,项目资金规模逾300亿元。全社会基础研究投入迅速增长。2023年,基础研究经费2212亿元,1996—2023年年均增长18.7%。基础研究经费占R&D经费比重为6.65%。党的十八大以来,基础和前沿领域系列原创性成果不断涌现,我国在量子科技、生命科学、物质科学和空间科学等领域取得一批重大原创成果,微分几何学两大核心猜想被成功证明,化学小分子诱导人体细胞实现重编程,二氧化碳人工合成淀粉实现“技术造物”。同时在载人航天、月球探测、深海探测和深地探测等领域也取得系列重大突破,目前我国在载人航天和月球探测技术方面处于世界领先地位。
+
+## (二)论文专利直接科研产出成果丰硕
+
+我国科学论文取得丰硕成果,已经成为全球知识创新的重要贡献者。2021年,国际三大检索工具《科学引文索引(SCI)》《工程索引(EI)》和《科技会议录索引(CPCI)》分别收录我国科研论文61.2万篇、36.8万篇和3万篇,数量分别位居世界第1、第1和第2位。科技论文质量大幅提升,2022年我国科技论文被引用次数排名世界第2位[6]。我国专利等知识产权产出量质齐升。2023年,我国发明专利授权数92.1万件,占全部专利授权数的25.2%,比2012年提高7.9个百分点。截至2023年年底,我国境内发明专利有效量达到401.5万件,成为世界上首个有效发明专利数量突破400万件的国家。2023年末我国每万人口高价值发明专利拥有量达到11.8件,较2020年末提高5.5件。
+
+## (三)重点领域技术成果市场应用成绩斐然
+
+在信息通信领域,我国移动通信实现了从2G跟随、5G率先商用到6G技术引领的跨越。2023年全国共完成计算机软件著作权登记249.5万件,登记数量和增速均创5年来新高。近年来我国AIGC产业发展迅猛,互联网头部企业如百度(文心)、阿里(通义)、腾讯(混元)和华为(盘古)等在AI大模型方面均取得关键技术进展。在农业育种领域,1997年建立植物新品种保护制度以来,截至2023年底农业植物新品种权累计申请量达7.7万件,累计授权量超过3万件,其中自主选育品种占比近94%,为从源头上保障国家粮食安全作出重大贡献[7]。在医药健康领域,自2020年药品注册管理制度改革以来,我国创新药研发上市进程提速,截至2023年底累计批准上市1类创新药近150个品种[8]。
+
+# 四、科技创新服务经济高质量发展
+
+## (一)企业科技创新主体作用不断巩固提升
+
+改革开放以来特别是党的十八大以来,企业日益成为科技创新和产业创新的主体。2023年,我国R&D经费中企业资金达到2.6万亿元,2013—2023年年均增长11.5%,企业资金占全社会R&D经费投入75%以上,对全社会R&D经费增长的贡献率常年保持在八成左右。企业研发投入强度的稳步提升,为我国产业创新与发展奠定坚实基础,培育出一大批技术领先且具有国际竞争力的行业领军企业。全球研发投入2500强中总部位于中国的企业数量从2013年的199家增长到2022年的679家,先后超过日本和欧盟稳居全球第2位[9]。同时我国涌现出一大批拥有高速增长业务模式和巨大市场潜力的独角兽企业。截至2023年底,全球1453家独角兽企业中我国有340家,位居世界第2位[10]。
+
+## (二)产业结构持续优化升级
+
+科技创新赋能新质生产力发展,新动能成为引领高质量发展的重要引擎。2023年,我国“三新”经济增加值为22.4万亿元,占GDP比重为17.73%,比2016年[11]提高2.4个百分点。2022年,专利密集型产业增加值为15.3万亿元,占GDP比重为12.71%,比2018年提高1.11个百分点。科技创新助力供给侧结构性改革不断深化,产品供给质量不断提升。2023年,我国规上工业企业共实现新产品销售收入34.1万亿元,2013—2023年年均增长10.7%;新产品销售收入占营业收入比重为25.3%,比2012年提高11.7个百分点。数字技术创新赋能千行百业,重点行业转型步伐不断加快。截至2023年底,已培育421家国家级智能制造示范工厂、万余家省级数字化车间和智能工厂。
+
+## (三)国际产业竞争新优势不断形成
+
+科技创新大大提升了我国产业的国际竞争力,技术和知识密集型产品的对外贸易规模不断扩大。2022年,我国高新技术产品进出口贸易总额为1.7万亿美元,2012年以来年均增长4.5%;占商品进出口贸易总额比重为34.1%,比2012年提高5.4个百分点。2022年我国知识密集型服务进出口2.5万亿元,2012年以来年均增长9.1%;占服务贸易进出口总额比重为41.9%,比2012年提高8.3个百分点。近年来我国在新能源技术创新和产品装备制造方面建立起国际竞争优势。我国太阳能电池光电转换效率、锂离子动力电池能量密度等性能指标处于国际领先水平,光伏组件和动力电池等新能源装备关键零部件在全球市场份额已居优势地位。
+
+# 五、科技创新服务国家重大发展战略
+
+## (一)科技创新助推区域协调联动共同发展
+
+建设国家高新技术产业开发区是我国推动区域协同发展战略的重要举措。1988年首家国家级高新技术产业开发区批准建设,2023年我国国家级高新区数量发展到178个,区内聚集企业数超20万家。区域创新高地正在加速建设和成长,北京、上海、粤港澳大湾区国际科技创新中心建设深入推进,北京怀柔、上海张江、安徽合肥等综合性国家科学中心各具特色。作为我国重要科技创新策源地和区域发展增长极,国际科创中心和综合性国家科学中心辐射带动区域乃至全国创新发展,并深度参与全球科技和产业竞争合作。
+
+## (二)科技创新始终坚持面向人民生命健康
+
+近年来,我国在新药创制、传染病防治等重点领域攻克关键核心技术,积极发挥科技改善民生的辐射带动作用。在新药创制领域,自2020年药品注册管理制度改革以来,我国设置了突破性治疗药物、附条件批准、优先审评审批等药品加快上市程序,侧重临床价值突出药物、罕见病药物和儿童用药物。2020年以来多个品种通过上述加快上市程序批准上市,更多创新药物能够更快惠及患者。在传染病防治特别是在新冠疫情防控过程中,我国第一时间分离出病毒毒株,快速实现了检测试剂的突破,疫苗研发同时布局多条技术路线并行推进。其中广受关注的mRNA技术路线成功应用于新冠疫苗之后,我国企业积极布局呼吸道合胞病毒、带状疱疹等疫苗研发,2024年已有1类新药呼吸道合胞病毒mRNA疫苗获得临床默示许可,将为国内传染病防治提供新的选择。
+
+## (三)科技创新支撑碳达峰碳中和有序推进
+
+在能源供给领域,逐步形成以智能电网为支撑,水能、风能、太阳能、核能、氢能等新能源多元化供给局面。2023年,我国可再生能源发电装机规模超过火电,占全国发电总装机的比重达到52.0%;其中,风力发电和光伏发电在可再生能源装机规模中占比逾六成。智能电网建设在分布式可再生能源外送消纳能力、分布式新能源并网、大容量储能系统建设和微电网技术等方面均处于国际先进水平,有力支撑我国节能减排战略实施和产业转型升级。在新能源消费领域,自2012年出台实施《节能与新能源汽车产业发展规划》以来,以新能源汽车为代表的新能源产业取得令人瞩目的成绩。2023年,我国新能源汽车产销量已经连续9年位居世界第一,我国成为全球汽车产业电动化转型的重要引导力量。
+
+75年来,在党中央的坚强领导下,创新已经深入人心,创新发展成为我们应对内外部严峻复杂挑战的关键抉择。当前,具有中国特色的国家创新体系日益健全,科技体制改革不断深入,创新要素加速聚集,经济社会发展动能充沛,科技自立自强有力推进,科技强国建设步伐稳健,为全面建成社会主义现代化强国、实现中华民族伟大复兴奠定了坚实基础。
+
+注:
+
+[1]本文2023年R&D经费、基础研究经费为年度初步数。
+
+[2]R&D经费支出与GDP之比。
+
+[3]数据源自OECD数据库。
+
+[4]数据源自国家税务总局。
+
+[5]数据源自中国人民银行。
+
+[6]数据源自基本科学指标数据库。
+
+[7]数据源自农业农村部。
+
+[8]数据源自国家药品审评中心。
+
+[9]数据源自欧盟全球产业研发投入记分牌。
+
+[10]数据源自胡润研究院全球独角兽排行榜。
+
+[11]2016年国家统计局首次测算“三新”经济增加值数据,2018年首次测算专利密集型产业增加值数据。
\ No newline at end of file
diff --git "a/_posts/2024-12-12-\346\261\237\345\215\227\347\203\237\351\233\250\357\274\214\345\260\217\346\241\245\346\265\201\346\260\264.md" "b/_posts/2024-12-12-\346\261\237\345\215\227\347\203\237\351\233\250\357\274\214\345\260\217\346\241\245\346\265\201\346\260\264.md"
new file mode 100644
index 00000000000..be48893ae90
--- /dev/null
+++ "b/_posts/2024-12-12-\346\261\237\345\215\227\347\203\237\351\233\250\357\274\214\345\260\217\346\241\245\346\265\201\346\260\264.md"
@@ -0,0 +1,31 @@
+---
+layout: post
+title: 江南烟雨,小桥流水
+subtitle: 苏州学习之旅
+date: 2024-12-22
+author: Ajiao
+header-img: img/post-bg-2.jpg
+catalog: true
+tags:
+ - 生活
+---
+入冬前,市外经局在苏州组织了招商培训班。经争取,有幸去学习了一周。
+
+
+培训地点在苏州工业园,凑巧渭南有直达高铁,全程七个小时,比坐飞机折腾少。到苏州时,天色已黑,乘坐接车大巴回到酒店用餐。餐毕,咨询酒店前台后,蹬着小蓝车,去了独墅湖。苏州地处东南,河流交错纵横。工业园内就有独墅湖、金鸡湖和阳澄湖三个大湖,城市绕湖而建。独墅湖周边极大,有教堂,还有白鹭园。一个人湖边独走两小时,感受了大江大湖气息。
+
+第二天是周一,在新加坡国立大学研究院开课,来自渭南各县市区和市直部门大概五十多人,大家逐个做了自我介绍,还拍了合照。不过,最让人印象深刻的,还是教室。教室为阶梯教室,环形布局,大有联合国开会的架势,感觉很妙。周一下午,乘坐大巴车参观了苏州工业园,还有企服中心,用餐在金鸡湖商务区,隔湖对面就是著名的苏州地标建筑大秋裤——东方之门。
+
+周二晚间在独墅湖边用餐。其实,独墅湖本已来过一趟。但是,既然就在旁边,那不如再走走,感受江南水乡风趣,沿着独墅湖走了很久,连过了第一天刚到时的教堂,还有码头,很多年轻人在独墅湖边散步、游玩、谈恋爱。
+
+周三晚间用餐改到了平江路,苏州著名的风景街。其实,平江路在去年夏天已经来过一趟了。不过,那次是白天,这次是夜晚。夜晚的平江路更加热闹一些,一条街道,一条小溪,并排铺开。很多穿着汉服的小姐姐在这里游玩拍照。当然,也少不了很多漂亮的汉服小姐姐在店铺门口招揽顾客。苏州没有夜生活。但是,平江路是例外,毕竟景区。不过,基本都是外地游客。
+
+培训时间一周,转眼到了周四。晚上的风景大同小异,白天上课没有时间。周四上午,特意起了个早,拜访了著名的吴中首胜——虎丘山。虎丘位于姑苏区,也就是苏州的老城区。打车到了山下,远远就能望见巍峨耸立的虎丘塔。周围绿色萦绕,葱葱郁郁,绿色环绕。买票进山,拾阶而上,不一会就来到了塔前。古塔巍峨耸立,近看愈发威武。下山后,绕虎丘山一圈,因为要赶回去上课,游览的比较匆忙。既然是吴中胜景,值得一看,但山不大。
+
+周四晚间原本没有外出的打算,回到酒店没事随决定去观前街。苏州地铁非常方便,只是距离酒店稍远。观前街是条商业步行街。因为这条街坐落在玄妙观前,所以叫做观前街。夜间的玄妙观金碧辉煌,偶有路过信客磕头上香祈求保佑。街两边都是苏州地方糕点和小吃,以青团为代表的苏州糕点在货架上缤琅满目,有店铺还特意请来苏州婆婆推磨招揽顾客,形象逼真,毛发毕现,不敢细看。虽然这是条景区的商业街,但观前街的食品价格很亲民。
+
+因为周三晚间在逛平江路时没有去七里山塘。所以,周五晚间乘坐地铁去了七里山塘。到了七里山塘,真正感受到了江南水乡。人在桥上,舟在水中,两遍全是小桥流水人家,完全就是印象中的江南模样。游客很多,胜过平江路,满眼都是穿汉服的小姐姐。周五晚间下雨,体验烟雨江南,可惜时间不巧。沿着山塘街走了很久,从很多的地方,走到人少的地方,一直走到虎丘附近的样子,几乎完全没有了行人,然后折返,回到桥头,依然人头攒动。
+
+周六是预定中返程的日子,车票定在12点。不过,酒店和苏州北站还有一些距离,工作人员安排的车辆9点就出发。既然来了一趟苏州,就要去一趟寒山寺。毕竟,姑苏城外寒山寺,夜半钟声到客船,这两句诗太有名了。一大早,乘坐地铁外加单车,赶到寒山寺才刚刚七点多点。寒山寺位于苏杭大运河边,黄墙黑底“寒山寺”三个大字很出片,网红打卡地。进入寺院,庄严肃穆,大殿后面回廊曲折,庭院深深。寒山寺香火很旺,礼佛的信客不少。
+
+匆匆游览完毕,赶回酒店凑巧九点,真是时间管理大师,我都佩服自己。返程时间稍长,回到渭南正落小雨。从离开到回来,满打满算七天。学习收获很多,课外也很丰富。江南深秋,烟雨朦胧,小桥流水,吴语软糯,幸甚~
\ No newline at end of file
diff --git "a/_posts/2024-2-13-\351\224\205\345\267\264\345\276\200\344\272\213.md" "b/_posts/2024-2-13-\351\224\205\345\267\264\345\276\200\344\272\213.md"
new file mode 100644
index 00000000000..a3b599f480a
--- /dev/null
+++ "b/_posts/2024-2-13-\351\224\205\345\267\264\345\276\200\344\272\213.md"
@@ -0,0 +1,20 @@
+---
+layout: post
+title: 锅巴往事
+subtitle: 保持热爱,奔赴山海
+date: 2024-02-13
+author: Ajiao
+header-img: img/post-bg-2.jpg
+catalog: true
+tags:
+ - 生活
+---
+晚上肚饥,找到麻辣锅巴一袋,解口馋。吃着锅巴,一些往事浮上心头。
+
+大学毕业后,因为工作和生活缘故,回家次数不多。直到14年回陕后,每逢大节小节,都会回家陪父母过节,顺便稍住几日,以慰思乡之情。每次回家,总会发现一些暖心的小细节,让人感受到家的温暖,母爱的深沉。
+
+老宅是秦岭山里不多见的四合院,家里有正房、厢房两间,外加两间托檐子。厢房,乡里称房屋。房屋靠窗条桌的抽屉里,总会有提前买好的麻辣锅巴,从小到大我都爱吃。乡里没啥零食,母亲每次都会备好让我啖嘴。
+
+厕所里,也会提前备好几卷手纸。乡里旱厕,往往会有家里孩子不用的书本,上厕所时随手撕开几页纸,擦屁股。母亲备好手纸,让我在上厕所时更方便。可能觉得,孩子常年在城里工作,上厕所撕书本不卫生不方便。
+
+母爱,就是这样,如杨柳春风不经意间润入心间。话说,这袋睡前解馋的麻辣锅巴,还是前几天,随母亲一起去超市买的。谁言寸草心,报得三春晖。愿母亲能健康长寿,快乐幸福。
\ No newline at end of file
diff --git "a/_posts/2024-2-14-\345\205\215\350\264\271\345\233\276\345\272\212.md" "b/_posts/2024-2-14-\345\205\215\350\264\271\345\233\276\345\272\212.md"
new file mode 100644
index 00000000000..87cca47d722
--- /dev/null
+++ "b/_posts/2024-2-14-\345\205\215\350\264\271\345\233\276\345\272\212.md"
@@ -0,0 +1,147 @@
+---
+layout: post
+title: 免费图床
+subtitle: 转载自博客:Duang's Blog
+date: 2024-02-14
+author: Ajiao
+header-img: img/post-bg-3.jpg
+catalog: true
+tags:
+ - 网络
+---
+## 前言
+分享一下我自用的图床,都是不要钱或者需要很少钱的(排序不代表推荐顺序)大家有更好用的来分享一下吧。
+==本文中测试图片统一采用同一张1.5MB的图,基本上所有图床都没有压缩,能够更好的对比速度。==
+
+## 1 免费他人图床
+这里指的是别人搭建好的图床,好多热心人搭建好了图床共享出来供我们使用,但是需要注意的是,99%的都会跑路,这里分享一些比较稳定速度又快的图床。
+
+特点:这类大佬搭建好的图床一般都是用的Chevereto,还有些用的imgurl,Chevereto的特点是大部分都需要注册,图片会返回给你丰富的链接格式(大部分都是默认反回图床内缩略地址,博客使用请选择直接源文件地址或者Markdown格式),基本上都会在首页放自己收录了多少图片,并且注册用户能看到自己上传过的图片,支持API。imgurl特点是会返回给你丰富的链接格式。请注意,这类图床都是严格鉴黄的!
+
+这里插一个别的大佬做的图床导航页,里面都是收录的别人搭建好的图床:http://imgdh.com/ (类似smms这种稳定并且图量大但是速度慢的图床我就不推荐了)
+
+下面是这类图床的推荐
+比较推荐路过,img.tg,hello,聚合图床,鸡霸
+
+1.1 路过图床
+该图床没有cdn,但是稳定,图量很大,收录了大概一千六百万张图,速度不太行,直连国外图片存储机器。测试图片打开速度国内基本在3-4S左右。最大单张支持10 MB
+地址:https://imgtu.com/
+测试图片地址:https://z3.ax1x.com/2021/08/15/fcAd3R.png
+
+1.2 IMG.TG
+我自己十分喜欢的一个图床,有国内百度云cdn节点加速,4年的老图床了,测试图片打开速度国内基本在1s以内。图片最大单张5MB
+地址:https://img.tg/
+测试图片地址:https://i.w3tt.com/2021/08/15/qlZtY.png
+
+1.3 imgloc
+hostloc论坛常用的图床,美国it7机房,应该是美国的CN2线路机器,目前托管将近六百万张图,游客最大上传8MB图,注册用户最大上传10MB图,测试图片打开速度国内基本在3-4S左右
+地址:https://imgloc.com/
+测试图片地址:https://s1.328888.xyz/2021/08/15/png.png
+
+1.4 鸡霸图床
+也是hostloc一个大佬做的图床,运营了两年多。速度不错,江苏移动的机器加速,目前托管4万张图,测试图片打开速度国内基本在1-2s,最大上传10MB的图
+地址:https://img.gejiba.com/
+测试图片地址:https://img.gejiba.com/images/fef4b426d6a87a6f96e0604b1c18f2f8.png
+
+1.5 聚合图床
+这是我比较推荐的一个图床,因为这个图床有丰富的客户端和接口,还可以挂载自己的oss,cos,七牛云等存储,自己有足够的盈利措施去长时间运营,并且免费用户的速度也很快,有国内cdn,必须登陆后上传
+测试图片打开速度国内基本在1s,免费用户最大上传5MB图
+地址:https://www.superbed.cn/
+测试图片地址:https://pic.imgdb.cn/item/6117f8e55132923bf8c3c3f0.png
+
+1.6 笑果图床
+一个运营两年多的图床,目前托管超过20万张图,全球cdn加速,但是没有国内机器加速,测试图片打开速度国内基本在2-4s,游客最大上传5MB的图,注册用户最大上传10MB图
+地址:https://imagelol.com/
+测试图片地址:https://s3.jpg.cm/2021/08/15/Ict9Hp.png
+
+1.7 z4a
+也是一个比较稳定的图床,最大上传64MB图,cloudflare加速,速度一般,但是图可以比较大,测试图片打开速度国内基本在1-3S,必须注册后才能上传!
+地址:https://www.z4a.net/
+测试图片地址:https://www.z4a.net/image/gf1oZf
+
+1.8 hello图床
+国内百度云cdn加速,运行一年半左右,必须注册后上传,最大上传20MB的图,测试图片打开速度国内基本在1S以内。
+地址:https://www.helloimg.com/
+测试图片地址:https://www.helloimg.com/images/2021/08/15/C4OKNh.png
+
+## 2 云盘做图床
+这里呢推荐几个方案,基本都不是直接使用的,但是比较取巧,大家可以试试。
+
+2.1 onedrive图床
+对于个人用户来说,onedrive空间有5G到15G,大家也可以去搞那种5T的账号去做图床,国内访问速度一般,有条件的可以上世纪互联,那个国内速度起飞。onedrive做图床最简单的就是电脑打开图片然后点嵌入,提取链接。麻烦一点的就是用oneindex等程序,提取直链做图床。(oneindex是一个onedrive的目录程序,相当于让你自己的onedrive变成一个所有人都可以访问下载的网站)
+
+当然,也有很多云盘都是管理员薅的世纪互联的账号,比如以前的6pan,白熊云盘,我自己现在还在用小麦魔方,这个提取的链接是国内世纪互联的链接,图片打开速度起飞。不过第三方套onedrive这种,需要先访问第三方网站,再转到onedrive,所以世纪互联的速度实际用起来也没想象中那么快,
+小麦魔方测试图片地址:https://x.panbaidu.io/s/1mgKySq/测速图8月/图床测试png.png
+
+2.2谷歌云盘
+也是利用oneindex这类软件,提取直链,这里就不放链接了。
+
+其余还有学习通,淘宝等云盘做直链,但是需要一定的程序去做静态链接,比较麻烦,有兴趣的可以去百度搜搜。
+
+## 3 云存储做云盘
+这里指的是oss/cos/七牛云/又拍云这类云存储,这类存储再除购买空间费用后,下行流量也需要钱。阿里的oss自己买的话是9元40G的空间,流量是5毛1G,速度很快,阿里云oss有自己的域名,cos需要自己绑定备案域名,文件上传后回返回文件地址,直接打开就是下载,很方便。并且oss和cos有丰富的第三方插件和软件使用,比如wordpress博客就有这类插件,picgo也有挂载oss和cos的插件,非常好用!
+这里放一个别人的oss做图床的文章,里面的图都是放在oss的,大家可以打开看看速度:https://www.cnblogs.com/progor/p/9850514.html
+
+3.1 oss配合cf流量免费使用
+因为国外地区的oss存储,在套上ccloudflare的cdn以后,流量不要钱,所以说我们的开销只是购买oss存储的费用。这里放一个教程博客:https://www.tangshuwu.com/tutorials/110.html 这种方法搞的图床特别稳定!就是速度嘛。。
+
+## 4 大型网站做图床
+这里说的是用简书/博客园/小红书/知乎等网站获取图片,这种网站有的有防盗链,有的没有,需要自己去尝试,这里放一个简书里面别人的图片:https://upload-images.jianshu.io/upload_images/16572117-087f3e1ee6a786d4.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/690/format/webp
+
+## 5 github/coding/gitee图床
+这个就简单了,在这种代码托管平台,新建存储库,上传图片,然后点开图片,复制链接就行,github在国内速度不行,我们可以使用和github合作的免费cdn JSDelivr加速(小访问量可以使用,大访问量的网站使用图片会404)。同时这类也有很多第三方软件和插件可以配合使用,不过要注意,coding和gitee都是国内的平台,黄色图片就不要上传了。
+这里是github+JSDelivr的使用教程:https://www.duangvps.com/archives/860
+这里是picgo配合github+JSDelivr的使用教程:https://www.duangvps.com/archives/1263
+
+## 6 IPFS无审计无来源图床
+ipfs别的特性我们不需要了解,我们需要的是他的分布式存储功能,原理就是ipfs把全世界的ipfs机器都当作一个无数块硬盘,你的资料会加密分块存储在很多个节点上,然后取回的时候通过一个网关加上该文件的加密信息,就能取回,速度很不错,但是好多网关被墙了,这里我们使用cf的网关。所以说基本不用担心速度/容量/和ghs带来的审核问题。
+下面介绍一个ipfs做图床的项目:https://github.com/jialezi/img2ipfs
+
+这个项目作者是反代的被墙了的infura端口,作者在github放的演示页可以直接用,需要注意的是,infura的公共api会帮你固定6个月,固定的意思是在该api的节点机器上固定这个文件,ipfs的规则是,一个文件没被固定的情况下,长时间没人访问就会被删除,所以说利用这种简单易行的ipfs图床,你的图片最少在6个月的时间内访问没问题。
+
+下面是作者的ipfs图床https://ipfs.xkx.me/
+下面是另一个人找到的api端口,可以在github项目里面替换:https://ipfs.staging.infura.org:5001/api/v0/add?pin=true
+这是另一个人搭建好的图床:https://filecdn.pages.dev/
+
+因为cf的网关升级了,所以大家需要复制网址然后浏览一下,复制浏览器变更后的地址,不然速度会慢一丢丢。
+这是测试图片地址:https://bafybeidrkq4ri7umphfoaw57qhcl52gvo24ky3gtg4smlft3yrifvexlzu.ipfs.cf-ipfs.com/
+国内访问速度一般在2-3s,十分好用!
+
+## 7 白嫖大厂图床!
+这里原理是利用qq和微博等空做图床,因为防盗链等原因,咱们用别人直接做好的就行。其实我更推荐聚合大厂图床,是下面的8.2.
+下面推荐几个聚合的大厂图床
+7.1 映画图床(因为主页不能访问,分页还能访问,这里就放分页地址了):https://pic.onji.cn/toutiao.html
+7.2 真正的聚合图床(集合了超级多的大厂图床!)https://img.nn.ci/
+7.3 https://api.xkx.me/tc/
+7.4 https://img.blueskyxn.com/jd.html
+
+下面是图床的github源码。大家可以自己搭建,或者以后api不能用了自己修改api使用。
+
+https://github.com/BlueSkyXN/KIENG-FigureBed
+https://github.com/jialezi/imgs
+## 8 其余图床
+8.1 小麦家的其余业务
+u-file是以前的一个免费项目,现在搞不到账号了,可以看作是又拍云的免费版本,可以去买一个账号,现在是2T存储,2T流量,需要绑定备案域名,很香。
+u-file图片速度测试:https://tc.yaqian.hk/duangimg/%E5%9B%BE%E5%BA%8A%E6%B5%8B%E8%AF%95png.png
+他家还有一个类似于文叔叔的东西,叫做小麦云链,免费存储东西,可以选择7天或者一个月,然后返回给你下载链接,也可以当作一个暂时的云盘使用,速度可以参考u-file。
+https://ftpod.cn/#/
+包括上面说的小麦魔方也是他家的业务。
+
+8.2 聚合大厂图床!
+图仓项目介绍:https://gitee.com/qqqingchen/tucang.cc
+这个项目是在作者的服务器上上传照片,然后把照片上传到几十个大厂里面,当作图床,然后在读取文件的时候,先访问作者的服务器,然后再从后端几十个大厂里面选择速度快的,这样就不用担心像上面的单个大厂图床一样,被大厂删图或防盗链了,唯一需要担心的就是图仓作者的服务器崩了。。。
+图仓地址:https://tucang.cc/
+测试图片地址:https://tucang.cc/api/image/show/9d170a0179985ace4d0b05d432e9489e
+测试图片打开速度在1-2s
+
+8.3 unicloud
+这个就是类似oss的项目,和oss一样的速度,不过稳定性比oss差点,也是需要实名,项目地址我放这里了
+https://github.com/sddwt/uis
+这里是搭建教程:https://hostloc.com/forum.php?mod=viewthread&tid=811060&highlight=unicloud
+
+这是另一个unicloud搭建的教程,很详细:https://www.jingtaiboke.com/unicloud-upload-demo.html
+
+图片测试地址:https://vkceyugu.cdn.bspapp.com/VKCEYUGU-ab498c51-8871-421b-8e23-a43eaa306dff/694caa19-adfc-41c2-ae0a-dfd845275cc4.png
+
+## 压缩工具
+这里贴上一个无限次数调用tinypng(堪称最好用的压缩工具)的win客户端,导入点确定就会自动压缩替换文件,非常好用,给图床大佬们节约点空间和流量吧,也能加快自己网站图片的打开速度,https://github.com/focusbe/tinyImage
\ No newline at end of file
diff --git "a/_posts/2024-2-9-\350\220\214\345\250\203\347\253\213\345\277\227.md" "b/_posts/2024-2-9-\350\220\214\345\250\203\347\253\213\345\277\227.md"
new file mode 100644
index 00000000000..23130c8be80
--- /dev/null
+++ "b/_posts/2024-2-9-\350\220\214\345\250\203\347\253\213\345\277\227.md"
@@ -0,0 +1,20 @@
+---
+layout: post
+title: 萌娃立志
+subtitle: 我的家乡在秦岭深处
+date: 2024-02-09
+author: Ajiao
+header-img: img/post-bg-2.jpg
+catalog: true
+tags:
+ - 生活
+---
+都说少年要树立远大志向,就我本人而言,可能要更小一些,算是萌娃立志,虽然那时并不知道立志是什么。
+
+不到两岁的小男孩站在寨子底堂屋门口,望着眼前绵延起伏的山坡,暗暗立志。我要比对面小山更高!不,后面西寨的山体更加高大,我要像他一样高大、雄壮、厚重。嗯,就这个。
+
+寨子底位于秦岭南麓,坐落在茫茫群山之中,大山小山绵延不断。过河之后,先是前湾背靠的小小山脊,从东而来,直奔入水。山虽小,但俊秀。跨过后湾,隔河对面,便是西寨北侧,雄浑高大,横亘数里。再然后,便是远在天际的红岩山,更高更远,山势映在蓝天白云间,青山如黛。
+
+什么会比山更高更大?是事业吗?或许吧!但,不足两岁的小孩,又知事业为何物?只想着,我要更大更强。
+
+
diff --git "a/_posts/2024-3-18-\346\226\260\345\215\216\347\244\276\357\274\232\345\221\212\345\210\253\350\277\207\345\216\273\357\274\214\347\217\215\346\203\234\345\275\223\344\270\213.md" "b/_posts/2024-3-18-\346\226\260\345\215\216\347\244\276\357\274\232\345\221\212\345\210\253\350\277\207\345\216\273\357\274\214\347\217\215\346\203\234\345\275\223\344\270\213.md"
new file mode 100644
index 00000000000..b1afcd341e8
--- /dev/null
+++ "b/_posts/2024-3-18-\346\226\260\345\215\216\347\244\276\357\274\232\345\221\212\345\210\253\350\277\207\345\216\273\357\274\214\347\217\215\346\203\234\345\275\223\344\270\213.md"
@@ -0,0 +1,46 @@
+---
+layout: post
+title: 新华社:告别过去,珍惜当下
+subtitle: 接受过去的遗憾,珍惜当下的生活
+date: 2024-03-18
+author: Ajiao
+header-img: img/post-bg-2.jpg
+catalog: true
+tags:
+ - 生活
+---
+一本书中有这样一句让人感动的话:失去的会以另外的方式存在,拥有的需要加倍珍惜。
+
+接受过去的遗憾,珍惜当下的生活,是成熟的必经之路,它让我们学会了坚强,理解了人生。
+
+### 告别过去
+
+没有人的生活是一帆风顺的,任何人都会经历悲伤与挫折。
+
+一位作家曾说:“人生的重点不是过去,而是向前看,重新出发,获得真正游刃有余的从容。”
+
+无论遭遇怎样的过去,经历过多么残酷的往事,生活依然有很多种选择。
+
+你想成为的人,你想做的事,永远没有时间限制,只要你有告别的决心和开始的勇气。
+
+如果时光不能倒流,那就让一切往事,都随风而去吧。
+
+留下该留下的,忘记该忘记的。只有挣脱痛苦的束缚,将往事清零,才能重获新生,更好地去爱自己、爱他人。
+
+当你鼓起勇气和过去说再见,就会被奖励一个新的开始和一个更美好的未来。
+
+### 珍惜当下
+
+这世间很多人,很多事,都是在被忽视,被辜负后才明白他的可贵。
+
+人的一生很丰富,除了失去,我们还能拥有。
+
+我们有健康的身体、挚爱的亲人、相知的朋友、温暖的陌生人,有琐碎日常中的小幸福……
+
+此刻我们所拥有的一切,就是生命给予的最好的礼物。活着的分分秒秒、拥有的多多少少都值得我们去珍惜。
+
+爱,是时光中最温暖的守护;珍惜,是岁月中最真挚的承诺。
+
+如果我们在生活的路上,且行且爱且珍惜,生活会给予我们更多惊喜。
+
+愿你怀揣着爱与珍惜,努力生活,微笑向前。
\ No newline at end of file
diff --git "a/_posts/2024-3-19-\346\271\226\345\215\227\345\206\234\346\260\221\350\277\220\345\212\250\350\200\203\345\257\237\346\212\245\345\221\212.md" "b/_posts/2024-3-19-\346\271\226\345\215\227\345\206\234\346\260\221\350\277\220\345\212\250\350\200\203\345\257\237\346\212\245\345\221\212.md"
new file mode 100644
index 00000000000..8feb5b20ebd
--- /dev/null
+++ "b/_posts/2024-3-19-\346\271\226\345\215\227\345\206\234\346\260\221\350\277\220\345\212\250\350\200\203\345\257\237\346\212\245\345\221\212.md"
@@ -0,0 +1,198 @@
+---
+layout: post
+title: 湖南农民运动考察报告
+subtitle: 1927年3月,《毛泽东选集》卷一
+date: 2024-03-19
+author: 毛泽东
+header-img: img/post-bg-3.jpg
+catalog: true
+tags:
+ - 学习
+---
+> 毛泽东此文是为了答复当时党内党外对于农民革命斗争的责难而写的。为了这个目的,毛泽东到湖南做了三十二天的考察工作,并写了这一篇报告。当时党内以陈独秀为首的右倾机会主义者,不愿意接受毛泽东的意见,而坚持自己的错误见解。他们的错误,主要是被国民党的反动潮流所吓倒,不敢支持已经起来和正在起来的伟大的农民革命斗争。为了迁就国民党,他们宁愿抛弃农民这个最主要的同盟军,使工人阶级和共产党处于孤立无援的地位。一九二七年春夏国民党之所以敢于叛变,发动“清党运动”和反人民的战争,主要就是乘了共产党的这个弱点。
+
+### 农民问题的严重性
+我这回到湖南⑴,实地考察了湘潭、湘乡、衡山、醴陵、长沙五县的情况。从一月四日起至二月五日止,共三十二天,在乡下,在县城,召集有经验的农民和农运工作同志开调查会,仔细听他们的报告,所得材料不少。许多农民运动的道理,和在汉口、长沙从绅士阶级那里听得的道理,完全相反。许多奇事,则见所未见,闻所未闻。我想这些情形,很多地方都有。所有各种反对农民运动的议论,都必须迅速矫正。革命当局对农民运动的各种错误处置,必须迅速变更。这样,才于革命前途有所补益。因为目前农民运动的兴起是一个极大的问题。很短的时间内,将有几万万农民从中国中部、南部和北部各省起来,其势如暴风骤雨,迅猛异常,无论什么大的力量都将压抑不住。他们将冲决一切束缚他们的罗网,朝着解放的路上迅跑。一切帝国主义、军阀、贪官污吏、土豪劣绅,都将被他们葬入坟墓。一切革命的党派、革命的同志,都将在他们面前受他们的检验而决定弃取。站在他们的前头领导他们呢?还是站在他们的后头指手画脚地批评他们呢?还是站在他们的对面反对他们呢?每个中国人对于这三项都有选择的自由,不过时局将强迫你迅速地选择罢了。
+### 组织起来
+湖南的农民运动,就湘中、湘南已发达的各县来说,大约分为两个时期。去年一月至九月为第一时期,即组织时期。此时期内,一月至六月为秘密活动时期,七月至九月革命军驱逐赵恒惕⑵,为公开活动时期。此时期内,农会会员的人数总计不过三四十万,能直接领导的群众也不过百余万,在农村中还没有什么斗争,因此各界对它也没有什么批评。因为农会会员能作向导,作侦探,作挑夫,北伐军的军官们还有说几句好话的。十月至今年一月为第二时期,即革命时期。农会会员激增到二百万,能直接领导的群众增加到一千万。因为农民入农会大多数每家只写一个人的名字,故会员二百万,群众便有约一千万。在湖南农民全数中,差不多组织了一半。如湘潭、湘乡、浏阳、长沙、醴陵、宁乡、平江、湘阴、衡山、衡阳、耒阳、郴县、安化等县,差不多全体农民都集合在农会的组织中,都立在农会领导之下。农民既已有了广大的组织,便开始行动起来,于是在四个月中造成一个空前的农村大革命。
+
+### 打倒土豪劣绅,一切权力归农会
+农民的主要攻击目标是土豪劣绅,不法地主,旁及各种宗法的思想和制度,城里的贪官污吏,乡村的恶劣习惯。这个攻击的形势,简直是急风暴雨,顺之者存,违之者灭。其结果,把几千年封建地主的特权,打得个落花流水。地主的体面威风,扫地以尽。地主权力既倒,农会便成了唯一的权力机关,真正办到了人们所谓“一切权力归农会”。连两公婆吵架的小事,也要到农民协会去解决。一切事情,农会的人不到场,便不能解决。农会在乡村简直独裁一切,真是“说得出,做得到”。外界的人只能说农会好,不能说农会坏。土豪劣绅,不法地主,则完全被剥夺了发言权,没有人敢说半个不字。在农会威力之下,土豪劣绅们头等的跑到上海,二等的跑到汉口,三等的跑到长沙,四等的跑到县城,五等以下土豪劣绅崽子则在乡里向农会投降。
+
+“我出十块钱,请你们准我进农民协会。”小劣绅说。“嘻!谁要你的臭钱!”农民这样回答。好些中小地主、富农乃至中农,从前反对农会的,此刻求入农会不可得。我到各处,常常遇到这种人,这样向我求情:“请省里来的委员作保!”
+
+前清地方造丁口册,有正册、另册二种,好人入正册,匪盗等坏人入另册。现在有些地方的农民便拿了这事吓那些从前反对农会的人:“把他们入另册!”
+
+那些人怕入另册,便多方设法求入农会,一心要想把他们的名字写上那农会的册子才放心。但他们往往遭农会严厉拒绝,所以他们总是悬心吊胆地过日子;摈在农会的门外,好像无家可归的样子,乡里话叫做“打零”。总之,四个月前被一般人看不起的所谓“农民会”,现在却变成顶荣耀的东西。从前拜倒在绅士权力下面的人,现在却拜倒在农民权力之下。无论什么人,都承认去年十月以前和十月以后是两个世界。
+
+### “糟得很”和“好得很”
+农民在乡里造反,搅动了绅士们的酣梦。乡里消息传到城里来,城里的绅士立刻大哗。我初到长沙时,会到各方面的人,听到许多的街谈巷议。从中层以上社会至国民党右派,无不一言以蔽之曰:“糟得很。”即使是很革命的人吧,受了那班“糟得很”派的满城风雨的议论的压迫,他闭眼一想乡村的情况,也就气馁起来,没有法子否认这“糟”字。很进步的人也只是说:“这是革命过程中应有的事,虽则是糟。”
+
+总而言之,无论什么人都无法完全否认这“糟”字。实在呢,如前所说,乃是广大的农民群众起来完成他们的历史使命,乃是乡村的民主势力起来打翻乡村的封建势力。宗法封建性的土豪劣绅,不法地主阶级,是几千年专制政治的基础,帝国主义、军阀、贪官污吏的墙脚。打翻这个封建势力,乃是国民革命的真正目标。孙中山先生致力国民革命凡四十年,所要做而没有做到的事,农民在几个月内做到了。这是四十年乃至几千年未曾成就过的奇勋。这是好得很。完全没有什么“糟”,完全不是什么“糟得很”。
+
+“糟得很”,明明是站在地主利益方面打击农民起来的理论,明明是地主阶级企图保存封建旧秩序,阻碍建设民主新秩序的理论,明明是反革命的理论。每个革命的同志,都不应该跟着瞎说。你若是一个确定了革命观点的人,而且是跑到乡村里去看过一遍的,你必定觉到一种从来未有的痛快。无数万成群的奴隶——农民,在那里打翻他们的吃人的仇敌。农民的举动,完全是对的,他们的举动好得很!“好得很”是农民及其他革命派的理论。一切革命同志须知:国民革命需要一个大的农村变动。辛亥革命⑶没有这个变动,所以失败了。现在有了这个变动,乃是革命完成的重要因素。一切革命同志都要拥护这个变动,否则他就站到反革命立场上去了。
+
+### 所谓“过分”的问题
+又有一般人说:“农会虽要办,但是现在农会的举动未免太过分了。”这是中派的议论。实际怎样呢?的确的,农民在乡里颇有一点子“乱来”。农会权力无上,不许地主说话,把地主的威风扫光。这等于将地主打翻在地,再踏上一只脚。“把你入另册!”向土豪劣绅罚款捐款,打轿子。反对农会的土豪劣绅的家里,一群人涌进去,杀猪出谷。土豪劣绅的小姐少奶奶的牙床上,也可以踏上去滚一滚。动不动捉人戴高帽子游乡,“劣绅!今天认得我们!”为所欲为,一切反常,竟在乡村造成一种恐怖现象。这就是一些人的所谓“过分”,所谓“矫枉过正”,所谓“未免太不成话”。这派议论貌似有理,其实也是错的。
+
+第一,上述那些事,都是土豪劣绅、不法地主自己逼出来的。土豪劣绅、不法地主,历来凭借势力称霸,践踏农民,农民才有这种很大的反抗。凡是反抗最力、乱子闹得最大的地方,都是土豪劣绅、不法地主为恶最甚的地方。农民的眼睛,全然没有错的。谁个劣,谁个不劣,谁个最甚,谁个稍次,谁个惩办要严,谁个处罚从轻,农民都有极明白的计算,罚不当罪的极少。
+
+第二,革命不是请客吃饭,不是做文章,不是绘画绣花,不能那样雅致,那样从容不迫,文质彬彬,那样温良恭俭让。革命是暴动,是一个阶级推翻一个阶级的暴烈的行动。农村革命是农民阶级推翻封建地主阶级的权力的革命。农民若不用极大的力量,决不能推翻几千年根深蒂固的地主权力。农村中须有一个大的革命热潮,才能鼓动成千成万的群众,形成一个大的力量。
+
+上面所述那些所谓“过分”的举动,都是农民在乡村中由大的革命热潮鼓动出来的力量所造成的。这些举动,在农民运动第二时期(革命时期)是非常之需要的。在第二时期内,必须建立农民的绝对权力。必须不准人恶意地批评农会。必须把一切绅权都打倒,把绅士打在地下,甚至用脚踏上。所有一切所谓“过分”的举动,在第二时期都有革命的意义。
+
+质言之,每个农村都必须造成一个短时期的恐怖现象,非如此决不能镇压农村反革命派的活动,决不能打倒绅权。矫枉必须过正,不过正不能矫枉⑷。这一派的议论,表面上和前一派不同,但其实质则和前一派同站在一个观点上,依然是拥护特权阶级利益的地主理论。这种理论,阻碍农民运动的兴起,其结果破坏了革命,我们不能不坚决地反对。
+
+### 所谓“痞子运动”
+国民党右派说:“农民运动是痞子运动,是惰农运动。”这种议论,在长沙颇盛行。我跑到乡下,听见绅士们说:“农民协会可以办,但是现在办事人不行,要换人啦!”这种议论,和右派的话是一个意思,都是说农运可做(因农民运动已起来,无人敢说不可做),但是现在做农运的人不行,尤其痛恨下级农民协会办事人,说他们都是些“痞子”。
+
+总而言之,一切从前为绅士们看不起的人,一切被绅士们打在泥沟里,在社会上没有了立足地位,没有了发言权的人,现在居然伸起头来了。不但伸起头,而且掌权了。他们在乡农民协会(农民协会的最下级)称王,乡农民协会在他们手里弄成很凶的东西了。他们举起他们那粗黑的手,加在绅士们头上了。他们用绳子捆绑了劣绅,给他戴上高帽子,牵着游乡(湘潭、湘乡叫游团,醴陵叫游垅)。他们那粗重无情的斥责声,每天都有些送进绅士们的耳朵里去。他们发号施令,指挥一切。他们站在一切人之上——从前站在一切人之下,所以叫做反常。
+
+### 革命先锋
+对于一件事或一种人,有相反的两种看法,便出来相反的两种议论。“糟得很”和“好得很”,“痞子”和“革命先锋”,都是适例。
+
+前面说了农民成就了多年未曾成就的革命事业,农民做了国民革命的重要工作。但是这种革命大业,革命重要工作,是不是农民全体做的呢?不是的。农民中有富农、中农、贫农三种。三种状况不同,对于革命的观感也各别。当第一时期,富农耳里听得的是所谓江西一败如水,蒋介石打伤了脚⑸,坐飞机回广东⑹了。吴佩孚⑺重新占了岳州。农民协会必定立不久,三民主义⑻也兴不起,因为这是所谓从来没有的东西。乡农民协会的办事人(多属所谓“痞子”之类),拿了农会的册子,跨进富农的大门,对富农说:“请你进农民协会。”富农怎样回答呢?“农民协会吗?我在这里住了几十年,种了几十年田,没有见过什么农民协会,也吃饭。我劝你们不办的好!”富农中态度好点的这样说。“什么农民协会,砍脑壳会,莫害人!”富农中态度恶劣的这样说。新奇得很,农民协会居然成立了好几个月,而且敢于反对绅士。邻近的绅士因为不肯缴鸦片枪,被农民协会捉了去游乡。县城里并且杀了大绅士,例如湘潭的晏容秋,宁乡的杨致泽。十月革命纪念大会,反英大会,北伐胜利总庆祝,每乡都有上万的农民举起大小旗帜,杂以扁担锄头,浩浩荡荡,出队示威。这时,富农才开始惶惑起来。在北伐胜利总庆祝中,他们听见说,九江也打开了,蒋介石没有伤脚,吴佩孚究竟打败了。而且“三民主义万岁”,“农民协会万岁”,“农民万岁”等等,明明都写在“红绿告示”(标语)上面。“农民万岁,这些人也算作万岁吗?”富农表示很大的惶惑。农会于是神气十足了。农会的人对富农说:“把你们入另册!”或者说:“再过一个月,入会的每人会费十块钱!”在这样的形势之下,富农才慢慢地进了农会⑼,有些是缴过五角钱或一块钱(本来只要一百钱)入会费的,有些是托人说情才邀了农会允许的。亦有好些顽固党,至今还没有入农会。富农入会,多把他那家里一个六七十岁的老头子到农会去上一个名字,因为他们始终怕“抽丁”。入会后,也并不热心替农会做事。他们的态度始终是消极的。
+
+中农呢?他们的态度是游移的。他们想到革命对他们没有什么大的好处。他们锅里有米煮,没有人半夜里敲门来讨账。他们也根据从来有没有的道理,独自皱着眉头在那里想:“农民协会果然立得起来吗?”“三民主义果然兴得起来吗?”他们的结论是:“怕未必!”他们以为这全决于天意:“办农民会,晓得天意顺不顺咧?”在第一时期内,农会的人拿了册子,进了中农的门,对着中农说道:“请你加入农民协会!”中农回答道:“莫性急啦!”一直到第二时期,农会势力大盛,中农方加入农会。他们在农会的表现比富农好,但暂时还不甚积极,他们还要看一看。农会争取中农入会,向他们多作解释工作,是完全必要的。
+
+乡村中一向苦战奋斗的主要力量是贫农。从秘密时期到公开时期,贫农都在那里积极奋斗。他们最听共产党的领导。他们和土豪劣绅是死对头,他们毫不迟疑地向土豪劣绅营垒进攻。他们对着富农说:“我们早进了农会,你们为什么还迟疑?”富农带着讥笑的声调说道:“你们上无片瓦,下无插针之地,有什么不进农会!”的确,贫农们不怕失掉什么。他们中间有很多人,确实是“上无片瓦,下无插针之地”,他们有什么不进农会?据长沙的调查:乡村人口中,贫农占百分之七十,中农占百分之二十,地主和富农占百分之十。百分之七十的贫农中,又分赤贫、次贫二类。全然无业,即既无土地,又无资期金,完全失去生活依据,不得不出外当兵,或出去做工,或打流当乞丐的,都是“赤贫”,占百分之二十。半无业,即略有土地,或略有资金,但吃的多,收的少,终年在劳碌愁苦中过生活的,如手工工人、佃农(富佃除外)、半自耕农⑽等,都是“次贫”,占百分之五十。这个贫农大群众,合共占乡村人口百分之七十,乃是农民协会的中坚,打倒封建势力的先锋,成就那多年未曾成就的革命大业的元勋。没有贫农阶级(照绅士的话说,没有“痞子”),决不能造成现时乡村的革命状态,决不能打倒土豪劣绅,完成民主革命。贫农,因为最革命,所以他们取得了农会的领导权。所有最下一级农民协会的委员长、委员,在第一第二两个时期中,几乎全数是他们(衡山县乡农民协会职员,赤贫阶层占百分之五十,次贫阶层占百分之四十,穷苦知识分子占百分之十)。这个贫农领导,是非常之需要的。没有贫农,便没有革命。若否认他们,便是否认革命。若打击他们,便是打击革命。他们的革命大方向始终没有错。他们损伤了土豪劣绅的体面。他们打翻了大小土豪劣绅在地上,并且踏上一只脚。他们在革命期内的许多所谓“过分”举动,实在正是革命的需要。湖南有些县的县政府、县党部⑾和县农会,已经做了若干错处,竟有循地主之请,派兵拘捕下级农会职员的。衡山、湘乡二县的监狱里,关了好多个乡农民协会委员长、委员。这个错误非常之大,助长了反动派的气焰。只要看拘捕了农民协会委员长、委员,当地的不法地主们便大高兴,反动空气便大增高,就知道这事是否错误。我们要反对那些所谓“痞子运动”、“惰农运动”的反革命议论,尤其要注意不可做出帮助土豪劣绅打击贫农阶级的错误行动。事实上,贫农领袖中,从前虽有些确是有缺点的,但是现在多数都变好了。他们自己在那里努力禁牌赌,清盗匪。农会势盛地方,牌赌禁绝,盗匪潜踪。有些地方真个道不拾遗,夜不闭户。据衡山的调查,贫农领袖百人中八十五人都变得很好,很能干,很努力。只有百分之十五,尚有些不良习惯。这只能叫做“少数不良分子”,决不能跟着土豪劣绅的口白,笼统地骂“痞子”。要解决这“少数不良分子”的问题,也只能在农会整顿纪律的口号之下,对群众做宣传,对他们本人进行训练,把农会的纪律整好,决不能随便派兵捉人,损害贫农阶级的威信,助长土豪劣绅的气势。这一点是非常要注意的。
+
+### 十四件大事
+一般指摘农会的人说农会做了许多坏事。我在前面已经指出,农民打土豪劣绅这件事完全是革命行为,并没有什么可指摘。但是农民所做的事很多,为了答复人们的指摘,我们须得把农民所有的行动过细检查一遍,逐一来看他们的所作所为究竟是怎么样。我把几个月来农民的行动分类总计起来,农民在农民协会领导之下总共作了十四件大事,如下所记。
+
+#### 第一件 将农民组织在农会里
+这是农民所做的第一件大事。像湘潭、湘乡、衡山这样的县,差不多所有的农民都组织起来了,几乎没有哪一只“角暗里”的农民没有起来,这是第一等。有些县,农民组织起来了一大部分,尚有一小部分没有组织,如益阳、华容等县,这是第二等。有些县,农民组织起来了一小部分,大部分尚未组织起来,如城步、零陵等县,这是第三等。湘西一带,在袁祖铭⑿势力之下,农会宣传未到,许多县的农民还全未组织起来,这是第四等。大概以长沙为中心的湘中各县最发展,湘南各县次之,湘西还在开始组织中。据去年十一月省农民协会统计,全省七十五县中,三十七县有了组织,会员人数一百三十六万七千七百二十七人。此数中,约有一百万是去年十月、十一月两个月内农会势力大盛时期组织的,九月以前还不过三四十万人。现又经过十二月、一月两个月,农民运动正大发展。截至一月底止,会员人数至少满了二百万。因入会一家多只登记一人,平均每家以五口计,群众便约有一千万。这种惊人的加速度的发展,是所以使一切土豪劣绅贪官污吏孤立,使社会惊为前后两个世界,使农村造成大革命的原因。这是农民在农民协会领导之下所做的第一件大事。
+
+#### 第二件 政治上打击地主
+农民有了组织之后,第一个行动,便是从政治上把地主阶级特别是土豪劣绅的威风打下去,即是从农村的社会地位上把地主权力打下去,把农民权力长上来。这是一个极严重极紧要的斗争。这个斗争是第二时期即革命时期的中心斗争。这个斗争不胜利,一切减租减息,要求土地及其他生产手段等等的经济斗争,决无胜利之可能。湖南许多地方,像湘乡、衡山、湘潭等县,地主权力完全推翻,形成了农民的独一权力,自无问题。但是醴陵等县,尚有一部分地方(如醴陵之西南两区),表面上地主权力低于农民权力,实际上因为政治斗争不激烈,地主权力还隐隐和农民权力对抗。这些地方,还不能说农民已得了政治的胜利,还须加劲作政治斗争,至地主权力被农民完全打下去为止。综计农民从政治上打击地主的方法有如下各项:
+
+清算。土豪劣绅经手地方公款,多半从中侵蚀,账目不清。这回农民拿了清算的题目,打翻了很多的土豪劣绅。好多地方组织了清算委员会,专门向土豪劣绅算账,土豪劣绅看了这样的机关就打颤。这样的清算运动,在农民运动起来的各县做得很普遍,意义不重在追回款子,重在宣布土豪劣绅的罪状,把土豪劣绅的政治地位和社会地位打下去。
+
+罚款。清算结果,发现舞弊,或从前有鱼肉农民的劣迹,或现在有破坏农会的行为,或违禁牌赌,或不缴烟枪。在这些罪名之下,农民议决,某土豪罚款若干,某劣绅罚款若干,自数十元至数千元不等。被农民罚过的人,自然体面扫地。
+
+捐款。向为富不仁的地主捐款救济贫民,办合作社,办农民贷款所,或作他用。捐款也是一种惩罚,不过较罚款为轻。地主为免祸计,自动地捐款给农会的,亦颇不少。
+
+小质问。遇有破坏农会的言论行动而罪状较轻的,则邀集多人涌入其家,提出比较不甚严重的质问。结果,多要写个“休息字”,写明从此终止破坏农会名誉的言论行动了事。
+
+大示威。统率大众,向着和农会结仇的土豪劣绅示威,在他家里吃饭,少不得要杀猪出谷,此类事颇不少。最近湘潭马家河,有率领一万五千群众向六个劣绅问罪,延时四日,杀猪百三十余个的事。示威的结果,多半要罚款。
+
+戴高帽子游乡。这种事各地做得很多。把土豪劣绅戴上一顶纸扎的高帽子,在那帽子上面写上土豪某某或劣绅某某字样。用绳子牵着,前后簇拥着一大群人。也有敲打铜锣,高举旗帜,引人注目的。这种处罚,最使土豪劣绅颤栗。戴过一次高帽子的,从此颜面扫地,做不起人。故有钱的多愿罚款,不愿戴高帽子。但农民不依时,还是要戴。有一个乡农会很巧妙,捉了一个劣绅来,声言今天要给他戴高帽子。劣绅于是吓黑了脸。但是,农会议决,今天不给他戴高帽子。因为今天给他戴过了,这劣绅横了心,不畏罪了,不如放他回去,等日再戴。那劣绅不知何日要戴高帽子,每日在家放心不下,坐卧不宁。
+
+关进县监狱。这是比戴高帽子更重的罪。把土豪劣绅捉了,送进知事公署的监狱,关起来,要知事办他的罪。现在监狱里关人和从前两样,从前是绅士送农民来关,现在是农民送绅士来关。
+
+驱逐。土豪劣绅中罪恶昭著的,农民不是要驱逐,而是要捉他们,或杀他们。他们怕捉怕杀,逃跑出外。重要的土豪劣绅,在农民运动发达县份,几乎都跑光了,结果等于被驱逐。他们中间,头等的跑到上海,次等的跑到汉口,三等的跑到长沙,四等的跑到县城。这些逃跑的土豪劣绅,以逃到上海的为最安全。逃到汉口的,如华容的三个劣绅,终被捉回。逃到长沙的,更随时有被各县旅省学生捕获之虞,我在长沙就亲眼看见捕获两个。逃到县城的,资格已是第四等了,农民耳目甚多,发觉甚易。湖南政府财政困难,财政当局曾归咎于农民驱逐阔人,以致筹款不易,亦可见土豪劣绅不容于乡里之一斑。
+
+枪毙。这必是很大的土豪劣绅,农民和各界民众共同做的。例如宁乡的杨致泽,岳阳的周嘉淦,华容的傅道南、孙伯助,是农民和各界人民督促政府枪毙的。湘潭的晏容秋,则是农民和各界人民强迫县长同意从监狱取出,由农民自己动手枪毙的。宁乡的刘昭,是农民直接打死的。醴陵的彭志蕃,益阳的周天爵、曹云,则正待“审判土豪劣绅特别法庭”判罪处决。这样的大劣绅、大土豪,枪毙一个,全县震动,于肃清封建余孽,极有效力。这样的大土豪劣绅,各县多的有几十个,少的也有几个,每县至少要把几个罪大恶极的处决了,才是镇压反动派的有效方法。土豪劣绅势盛时,杀农民真是杀人不眨眼。长沙新康镇团防局长何迈泉,办团十年,在他手里杀死的贫苦农民将近一千人,美其名曰“杀匪”。我的家乡湘潭县银田镇团防局长汤峻岩、罗叔林二人,民国二年以来十四年间,杀人五十多,活埋四人。被杀的五十多人中,最先被杀的两人是完全无罪的乞丐。汤峻岩说:“杀两个叫化子开张!”这两个叫化子就是这样一命呜呼了。以前土豪劣绅的残忍,土豪劣绅造成的农村白色恐怖是这样,现在农民起来枪毙几个土豪劣绅,造成一点小小的镇压反革命派的恐怖现象,有什么理由说不应该?
+
+#### 第三件 经济上打击地主
+不准谷米出境,不准高抬谷价,不准囤积居奇。这是近月湖南农民经济斗争上一件大事。从去年十月至现在,贫农把地主富农的谷米阻止出境,并禁止高抬谷价和囤积居奇。结果,贫农的目的完全达到,谷米阻得水泄不通,谷价大减,囤积居奇的绝迹。
+
+不准加租加押,宣传减租减押。去年七八月间,农会还在势力弱小时期,地主依然按照剥削从重老例,纷纷通知佃农定要加租加押。但是到了十月,农会势力大增,一致反对加租加押,地主便不敢再提加租加押四字。及至十一月后,农民势力压倒地主势力,农民乃进一步宣传减租减押。农民说:可惜去秋交租时农会尚无力量,不然去秋就减了租了。对于今秋减租,农民正大做宣传,地主们亦在问减租办法。至于减押,衡山等县目下已在进行。
+
+不准退佃。去年七八月间,地主还有好多退佃另佃的事。十月以后,无人敢退佃了。现在退佃另佃已完全不消说起,只有退佃自耕略有点问题。有些地方,地主退佃自耕,农民也不准。有些地方,地主如自耕,可以允许退佃,但同时发生了佃农失业问题。此问题尚无一致的解决办法。
+
+减息。安化已普遍地减了息,他县亦有减息的事。惟农会势盛地方,地主惧怕“共产”,完全“卡借”,农村几无放债的事。此时所谓减息,限于旧债。旧债不仅减息,连老本也不许债主有逼取之事。贫农说:“怪不得,年岁大了,明年再还吧!”
+
+#### 第四件 推翻土豪劣绅的封建统治
+——打倒都团
+旧式的都团(即区乡)政权机关,尤其是都之一级,即接近县之一级,几乎完全是土豪劣绅占领。“都”管辖的人口有一万至五六万之多,有独立的武装如团防局,有独立的财政征收权如亩捐⒀等,有独立的司法权如随意对农民施行逮捕、监禁、审问、处罚。这样的机关里的劣绅,简直是乡里王。农民对政府如总统、督军⒁、县长等还比较不留心,这班乡里王才真正是他们的“长上”,他们鼻子里哼一声,农民晓得这是要十分注意的。这回农村造反的结果,地主阶级的威风普遍地打下来,土豪劣绅把持的乡政机关,自然跟了倒塌。都总团总⒂躲起不敢出面,一切地方上的事都推到农民协会去办。他们应付的话是:“不探(管)闲事!”农民们相与议论,谈到都团总,则愤然说:“那班东西么,不作用了!”“不作用”三个字,的确描画了经过革命风潮地方的旧式乡政机关。
+
+#### 第五件 推翻地主武装,建立农民武装
+湖南地主阶级的武装,中路较少,西南两路较多。平均每县以六百枝步枪计,七十五县共有步枪四万五千枝,事实上或者还要多。农民运动发展区域之中南两路,因农民起来形势甚猛,地主阶级招架不住,其武装势力大部分投降农会,站在农民利益这边,例如宁乡、平江、浏阳、长沙、醴陵、湘潭、湘乡、安化、衡山、衡阳等县。小部分站在中立地位,但倾向于投降,例如宝庆等县。再一小部分则站在和农会敌对地位,例如宜章、临武、嘉禾等县,但现时农民正在加以打击,可能于不久时间消灭其势力。这样由反动的地主手里拿过来的武装,将一律改为“挨户团常备队”⒃,放在新的乡村自治机关——农民政权的乡村自治机关管理之下。这种旧武装拿过来,是建设农民武装的一方面。建设农民武装另有一个新的方面,即农会的梭镖队。梭镖——一种接以长柄的单尖两刃刀,单湘乡一县有十万枝。其他各县,如湘潭、衡山、醴陵、长沙等,七八万枝、五六万枝、三四万枝不等。凡有农民运动各县,梭镖队便迅速地发展。这种有梭镖的农民,将成为“挨户团非常备队”。这个广大的梭镖势力,大于前述旧武装势力,是使一切土豪劣绅看了打颤的一种新起的武装力量。湖南的革命当局,应使这种武装力量确实普及于七十五县二千余万农民之中,应使每个青年壮年农民都有一柄梭镖,而不应限制它,以为这是可以使人害怕的东西。若被这种梭镖队吓翻了,那真是胆小鬼!只有土豪劣绅看了害怕,革命党决不应该看了害怕。
+
+#### 第六件 推翻县官老爷衙门差役的政权
+县政治必须农民起来才能澄清,广东的海丰已经有了证明。这回在湖南,尤其得到了充分的证明。在土豪劣绅霸占权力的县,无论什么人去做知事,几乎都是贪官污吏。在农民已经起来的县,无论什么人去,都是廉洁政府。我走过的几县,知事遇事要先问农民协会。在农民势力极盛的县,农民协会说话是“飞灵的”。农民协会要早晨捉土豪劣绅,知事不敢挨到中午,要中午捉,不敢挨到下午。农民的权力在乡间初涨起来的时候,县知事和土豪劣绅是勾结一起共同对付农民的。在农民的权力涨至和地主权力平行的时候,县知事取了向地主农民两边敷衍的态度,农民协会的话,有一些被他接受,有一些被他拒绝。上头所说农会说话飞灵,是在地主权力被农民权力完全打下去了的时候。现在像湘乡、湘潭、醴陵、衡山等县的县政治状况是:
+
+(一)凡事取决于县长和革命民众团体的联合会议。这种会议,由县长召集,在县署开。有些县名之曰“公法团联席会议”,有些县名之曰“县务会议”。出席的人,县长以外,为县农民协会、县总工会、县商民协会、县女界联合会、县教职员联合会、县学生联合会以及国民党县党部⒄的代表们。在这样的会议里,各民众团体的意见影响县长,县长总是唯命是听。所以,在湖南采用民主的委员制县政治组织,应当是没有问题的了。现在的县政府,形式和实质,都已经是颇民主的了。达到这种形势,是最近两三个月的事,即农民从四乡起来打倒了土豪劣绅权力以后的事。知事看见旧靠山已倒,要做官除非另找靠山,这才开始巴结民众团体,变成了上述的局面。
+
+(二)承审员没有案子。湖南的司法制度,还是知事兼理司法,承审员助知事审案。知事及其僚佐要发财,全靠经手钱粮捐派,办兵差和在民刑诉讼上颠倒敲诈这几件事,尤以后一件为经常可靠的财源。几个月来,土豪劣绅倒了,没有了讼棍。农民的大小事,又一概在各级农会里处理。所以,县公署的承审员,简直没有事做。湘乡的承审员告诉我:“没有农民协会以前,县公署平均每日可收六十件民刑诉讼禀帖;有农会后,平均每日只有四五件了。”于是知事及其僚佐们的荷包,只好空着。
+
+(三)警备队、警察、差役,一概敛迹,不敢下乡敲诈。从前乡里人怕城里人,现在城里人怕乡里人。尤其是县政府豢养的警察、警备队、差役这班恶狗,他们怕下乡,下乡也不敢再敲诈。他们看见农民的梭镖就发抖。
+
+#### 第七件 推翻祠堂族长的族权和城隍土地菩萨的神权以至丈夫的男权
+中国的男子,普通要受三种有系统的权力的支配,即:
+
+(一)由一国、一省、一县以至一乡的国家系统(政权);
+
+(二)由宗祠、支祠以至家长的家族系统(族权);
+
+(三)由阎罗天子、城隍庙王以至土地菩萨的阴间系统以及由玉皇上帝以至各种神怪的神仙系统——总称之为鬼神系统(神权)。至于女子,除受上述三种权力的支配以外,还受男子的支配(夫权)。
+
+这四种权力——政权、族权、神权、夫权,代表了全部封建宗法的思想和制度,是束缚中国人民特别是农民的四条极大的绳索。农民在乡下怎样推翻地主的政权,已如前头所述。地主政权,是一切权力的基干。地主政权既被打翻,族权、神权、夫权便一概跟着动摇起来。农会势盛地方,族长及祠款经管人不敢再压迫族下子孙,不敢再侵蚀祠款。坏的族长、经管,已被当作土豪劣绅打掉了。从前祠堂里“打屁股”、“沉潭”、“活埋”等残酷的肉刑和死刑,再也不敢拿出来了。女子和穷人不能进祠堂吃酒的老例,也被打破。衡山白果地方的女子们,结队拥入祠堂,一屁股坐下便吃酒,族尊老爷们只好听她们的便。又有一处地方,因禁止贫农进祠堂吃酒,一批贫农拥进去,大喝大嚼,土豪劣绅长褂先生吓得都跑了。神权的动摇,也是跟着农民运动的发展而普遍。许多地方,农民协会占了神的庙宇做会所。一切地方的农民协会,都主张提取庙产办农民学校,做农会经费,名之曰“迷信公款”。醴陵禁迷信、打菩萨之风颇盛行。北乡各区农民禁止家神老爷(傩神)游香。渌口伏波岭庙内有许多菩萨,因为办国民党区党部房屋不够,把大小菩萨堆于一角,农民无异言。自此以后,人家死了人,敬神、做道场、送大王灯的,就很少了。这事,因为是农会委员长孙小山倡首,当地的道士们颇恨孙小山。北三区龙凤庵农民和小学教员,砍了木菩萨煮肉吃。南区东富寺三十几个菩萨都给学生和农民共同烧掉了,只有两个小菩萨名“包公老爷”者,被一个老年农民抢去了,他说:“莫造孽!”在农民势力占了统治地位的地方,信神的只有老年农民和妇女,青年和壮年农民都不信了。农民协会是青年和壮年农民当权,所以对于推翻神权,破除迷信,是各处都在进行中的。夫权这种东西,自来在贫农中就比较地弱一点,因为经济上贫农妇女不能不较富有阶级的女子多参加劳动,所以她们取得对于家事的发言权以至决定权的是比较多些。至近年,农村经济益发破产,男子控制女子的基本条件,业已破坏了。最近农民运动一起,许多地方,妇女跟着组织了乡村女界联合会,妇女抬头的机会已到,夫权便一天一天地动摇起来。总而言之,所有一切封建的宗法的思想和制度,都随着农民权力的升涨而动摇。但是现在时期,农民的精力集中于破坏地主的政治权力这一点。要是地主的政治权力破坏完了的地方,农民对家族神道男女关系这三点便开始进攻了。但是这种进攻,现在到底还在“开始”,要完全推翻这三项,还要待农民的经济斗争全部胜利之后。因此,目前我们对农民应该领导他们极力做政治斗争,期于彻底推翻地主权力。并随即开始经济斗争,期于根本解决贫农的土地及其他经济问题。至于家族主义、迷信观念和不正确的男女关系之破坏,乃是政治斗争和经济斗争胜利以后自然而然的结果。若用过大的力量生硬地勉强地从事这些东西的破坏,那就必被土豪劣绅借为口实,提出“农民协会不孝祖宗”、“农民协会欺神灭道”、“农民协会主张共妻”等反革命宣传口号,来破坏农民运动。湖南的湘乡、湖北的阳新,最近都发生地主利用了农民反对打菩萨的事,就是明证。菩萨是农民立起来的,到了一定时期农民会用他们自己的双手丢开这些菩萨,无须旁人过早地代庖丢菩萨。共产党对于这些东西的宣传政策应当是:“引而不发,跃如也。”⒅菩萨要农民自己去丢,烈女祠、节孝坊要农民自己去摧毁,别人代庖是不对的。
+
+我在乡里也曾向农民宣传破除迷信。我的话是:
+“信八字望走好运,信风水望坟山贯气。今年几个月光景,土豪劣绅贪官污吏一齐倒台了。难道这几个月以前土豪劣绅贪官污吏还大家走好运,大家坟山都贯气,这几个月忽然大家走坏运,坟山也一齐不贯气了吗?土豪劣绅形容你们农会的话是:‘巧得很啰,如今是委员世界呀,你看,屙尿都碰了委员。’的确不错,城里、乡里、工会、农会、国民党、共产党无一不有执行委员,确实是委员世界。但这也是八字坟山出的吗?巧得很!乡下穷光蛋八字忽然都好了!坟山也忽然都贯气了!神明吗?那是很可敬的。但是不要农民会,只要关圣帝君、观音大士,能够打倒土豪劣绅吗?那些帝君、大士们也可怜,敬了几百年,一个土豪劣绅不曾替你们打倒!现在你们想减租,我请问你们有什么法子,信神呀,还是信农民会?”
+我这些话,说得农民都笑起来。
+
+#### 第八件 普及政治宣传
+开一万个法政学校,能不能在这样短时间内普及政治教育于穷乡僻壤的男女老少,像现在农会所做的政治教育一样呢?我想不能吧。打倒帝国主义,打倒军阀,打倒贪官污吏,打倒土豪劣绅,这几个政治口号,真是不翼而飞,飞到无数乡村的青年壮年老头子小孩子妇女们的面前,一直钻进他们的脑子里去,又从他们的脑子里流到了他们的嘴上。比如有一群小孩子在那里玩吧,如果你看见一个小孩子对着另一个小孩子鼓眼蹬脚扬手动气时,你就立刻可以听到一种尖锐的声音,那便是:“打倒帝国主义!”
+
+湘潭一带的小孩子看牛时打起架来,一个做唐生智,一个做叶开鑫⒆,一会儿一个打败了,一个跟着追,那追的就是唐生智,被追的就是叶开鑫。“打倒列强……”这个歌,街上的小孩子固然几乎人人晓得唱了,就是乡下的小孩子也有很多晓得唱了的。
+
+孙中山先生的那篇遗嘱,乡下农民也有些晓得念了。他们从那篇遗嘱里取出了“自由”、“平等”、“三民主义”、“不平等条约”这些名词,颇生硬地应用在他们的生活上。一个绅士模样的人在路上碰了一个农民,那绅士摆格不肯让路,那农民便愤然说:“土豪劣绅!晓得三民主义吗?”长沙近郊菜园农民进城卖菜,老被警察欺负。现在,农民可找到武器了,这武器就是三民主义。当警察打骂卖菜农民时,农民便立即抬出三民主义以相抵制,警察没有话说。湘潭一个区的农民协会,为了一件事和一个乡农民协会不和,那乡农民协会的委员长便宣言:“反对区农民协会的不平等条约!”
+
+政治宣传的普及乡村,全是共产党和农民协会的功绩。很简单的一些标语、图画和讲演,使得农民如同每个都进过一下子政治学校一样,收效非常之广而速。据农村工作同志的报告,政治宣传在反英示威、十月革命纪念和北伐胜利总庆祝这三次大的群众集会时做得很普遍。在这些集会里,有农会的地方普遍地举行了政治宣传,引动了整个农村,效力很大。今后值得注意的,就是要利用各种机会,把上述那些简单的口号,内容渐渐充实,意义渐渐明了起来。
+
+#### 第九件 农民诸禁
+共产党领导农会在乡下树立了威权,农民便把他们所不喜欢的事禁止或限制起来。最禁得严的便是牌、赌、鸦片这三件。牌:农会势盛地方,麻雀、骨牌、纸叶子,一概禁绝。湘乡十四都地方一个区农会,曾烧了一担麻雀牌。跑到乡间去,什么牌都没有打,犯禁的即刻处罚,一点客气也没有。赌:从前的“赌痞”,现在自己在那里禁赌了,农会势盛地方,和牌一样弊绝风清。鸦片:禁得非常之严。农会下命令缴烟枪,不敢稍违抗不缴。醴陵一个劣绅不缴烟枪,被捉去游乡。
+
+农民这个“缴枪运动”,其声势不弱于北伐军对吴佩孚、孙传芳⒇军队的缴枪。好些革命军军官家里的年尊老太爷,烟瘾极重,靠一杆“枪”救命的,都被“万岁”(劣绅讥诮农民之称)们缴了去。“万岁”们不仅禁种禁吃,还要禁运。由贵州经宝庆、湘乡、攸县、醴陵到江西去的鸦片,被拦截焚烧不少。这一来,和政府的财政发生了冲突。结果,还是省农会为了顾全北伐军饷,命令下级农会“暂缓禁运”。但农民在那里愤愤不乐。
+
+三者以外,农民禁止或限制的东西还有很多,略举之则有:
+花鼓。一种小戏,许多地方禁止演唱。轿子。许多县有打轿子的事,湘乡特甚。农民最恨那些坐轿子的,总想打,但农会禁止他们。办农会的人对农民说:“你们打轿子,反倒替阔人省了钱,轿工要失业,岂非害了自己?”农民们想清了,出了新法子,就是大涨轿工价,以此惩富人。煮酒熬糖。普遍禁止用谷米煮酒熬糖,糟行糖行叫苦不迭。衡山福田铺地方,不禁止煮酒,但限定酒价于一极小数目,酒店无钱赚,只好不煮了。猪。限制每家喂猪的数目,因为猪吃去谷米。鸡鸭。湘乡禁喂鸡鸭,但妇女们反对。衡山洋塘地方限制每家只准喂三个,福田铺地方只准喂五个。好些地方完全禁止喂鸭,因为鸭比鸡更无用,它不仅吃掉谷,而且搓死禾。
+酒席。丰盛酒席普遍地被禁止。湘潭韶山地方议决客来吃三牲,即只吃鸡鱼猪。笋子、海带、南粉都禁止吃。衡山则议决吃八碗,不准多一碗。醴陵东三区只准吃五碗,北二区只准吃三荤三素,西三区禁止请春客。湘乡禁止“蛋糕席”——一种并不丰盛的席面。湘乡二都有一家讨媳妇,用了蛋糕席,农民以他不服从禁令,一群人涌进去,搅得稀烂。湘乡的嘉谟镇实行不吃好饮食,用果品祭祖。牛。这是农民的宝贝。“杀牛的来生变牛”,简直成了宗教,故牛是杀不得的。农民没有权力时,只能用宗教观念反对杀牛,没有实力去禁止。农会起来后,权力管到牛身上去了,禁止城里杀牛。湘潭城内从前有六家牛肉店,现在倒了五家,剩下一家是杀病牛和废牛的。衡山全县禁绝了杀牛。一个农民他有一头牛跌脱了脚,问过农会,才敢杀。株洲商会冒失地杀了一头牛,农民上街问罪,罚钱而外,放爆竹赔礼。
+
+游民生活。如打春、赞土地、打莲花落,醴陵议决禁止。各县有禁止的,有自然消灭没人干这些事的。有一种“强告化”又叫“流民”者,平素非常之凶,现在亦只得屈服于农会之下。湘潭韶山地方有个雨神庙,素聚流民,谁也不怕,农会起来,悄悄地走了。同地湖堤乡农会,捉了三个流民挑土烧窑。拜年陋俗,议决禁止。
+
+此外各地的小禁令还很多,如醴陵禁傩神游香,禁买南货斋果送情,禁中元烧衣包,禁新春贴瑞签。湘乡的谷水地方水烟也禁了。二都禁放鞭炮和三眼铳,放鞭炮的罚洋一元二角,放铳的罚洋二元四角。七都和二十都禁做道场。十八都禁送奠仪。诸如此类,不胜枚举,统名之曰农民诸禁。
+
+这些禁令中,包含两个重要意义:第一是对于社会恶习之反抗,如禁牌赌鸦片等。这些东西是跟了地主阶级恶劣政治环境来的,地主权力既倒,这些东西也跟着扫光。第二是对于城市商人剥削之自卫,如禁吃酒席,禁买南货斋果送情等等。因为工业品特贵,农产品特贱,农民极为贫困,受商人剥削厉害,不得不提倡节俭,借以自卫。至于前述之农民阻谷出境,是因为贫农自己粮食不够吃,还要向市上买,所以不许粮价高涨。这都是农民贫困和城乡矛盾的缘故,并非农民拒绝工业品和城乡贸易,实行所谓东方文化主义(21)。农民为了经济自卫,必须组织合作社,实行共同买货和消费。还须政府予以援助,使农民协会能组织信用(放款)合作社。如此,农民自然不必以阻谷为限制食粮价格的方法,也不会以拒绝某些工业品入乡为经济自卫的方法了。
+
+#### 第十件 清 匪
+从禹汤文武起吧,一直到清朝皇帝,民国总统,我想没有哪一个朝代的统治者有现在农民协会这样肃清盗匪的威力。什么盗匪,在农会势盛地方,连影子都不见了。
+
+巧得很,许多地方,连偷小菜的小偷都没有了。有些地方,还有小偷。至于土匪,则我所走过的各县全然绝了迹,哪怕从前是出土匪很多的地方。原因:一是农会会员漫山遍野,梭镖短棍一呼百应,土匪无处藏踪。二是农民运动起后,谷子价廉,去春每担六元的,去冬只二元,民食问题不如从前那样严重。三是会党(22)加入了农会,在农会里公开地合法地逞英雄,吐怨气,“山、堂、香、水”(23)的秘密组织,没有存在的必要了。杀猪宰羊,重捐重罚,对压迫他们的土豪劣绅阶级出气也出够了。四是各军大招兵,“不逞之徒”去了许多。因此,农运一起,匪患告绝。对于这一点,绅富方面也同情于农会。他们的议论是:“农民协会吗?讲良心话,也有一点点好处。”对于禁牌、赌、鸦片和清匪,农民协会是博得一般人的同情的。
+
+#### 第十一件 废苛捐
+全国未统一,帝国主义军阀势力未推翻,农民对政府税捐的繁重负担,质言之,即革命军的军费负担,还是没有法子解除的。但是土豪劣绅把持乡政时加于农民的苛捐如亩捐等,却因农民运动的兴起、土豪劣绅的倒塌而取消,至少也减轻了。这也要算是农民协会的功绩之一。
+
+#### 第十二件 文化运动
+中国历来只是地主有文化,农民没有文化。可是地主的文化是由农民造成的,因为造成地主文化的东西,不是别的,正是从农民身上掠取的血汗。中国有百分之九十未受文化教育的人民,这个里面,最大多数是农民。农村里地主势力一倒,农民的文化运动便开始了。试看农民一向痛恶学校,如今却在努力办夜学。“洋学堂”,农民是一向看不惯的。我从前做学生时,回乡看见农民反对“洋学堂”,也和一般“洋学生”、“洋教习”一鼻孔出气,站在洋学堂的利益上面,总觉得农民未免有些不对。民国十四年在乡下住了半年,这时我是一个共产党员,有了马克思主义的观点,方才明白我是错了,农民的道理是对的。乡村小学校的教材,完全说些城里的东西,不合农村的需要。小学教师对待农民的态度又非常之不好,不但不是农民的帮助者,反而变成了农民所讨厌的人。故农民宁欢迎私塾(他们叫“汉学”),不欢迎学校(他们叫“洋学”),宁欢迎私塾老师,不欢迎小学教员。如今他们却大办其夜学,名之曰农民学校。有些已经举办,有些正在筹备,平均每乡有一所。他们非常热心开办这种学校,认为这样的学校才是他们自己的。夜学经费,提取迷信公款、祠堂公款及其他闲公闲产。这些公款,县教育局要提了办国民学校即是那不合农民需要的“洋学堂”,农民要提了办农民学校,争议结果,各得若干,有些地方是农民全得了。农民运动发展的结果,农民的文化程度迅速地提高了。不久的时间内,全省当有几万所学校在乡村中涌出来,不若知识阶级和所谓“教育家”者流,空唤“普及教育”,唤来唤去还是一句废话。
+
+#### 第十三件 合作社运动
+合作社,特别是消费、贩卖、信用三种合作社,确是农民所需要的。他们买进货物要受商人的剥削,卖出农产要受商人的勒抑,钱米借贷要受重利盘剥者的剥削,他们很迫切地要解决这三个问题。去冬长江打仗,商旅路断,湖南盐贵,农民为盐的需要组织合作社的很多。地主“卡借”,农民因借钱而企图组织“借贷所”的,亦所在多有。大问题,就是详细的正规的组织法没有。各地农民自动组织的,往往不合合作社的原则,因此做农民工作的同志,总是殷勤地问“章程”。假如有适当的指导,合作社运动可以随农会的发展而发展到各地。
+
+#### 第十四件 修道路,修塘坝
+这也是农会的一件功绩。没有农会以前,乡村的道路非常之坏。无钱不能修路,有钱的人不肯拿出来,只好让它坏。略有修理,也当作慈善事业,从那些“肯积阴功”的人家化募几个,修出些又狭又薄的路。农会起来了,把命令发出去,三尺、五尺、七尺、一丈,按照路径所宜,分等定出宽狭,勒令沿路地主,各修一段。号令一出,谁敢不依?不久时间,许多好走的路都出来了。这却并非慈善事业,乃是出于强迫,但是这一点子强迫实在强迫得还可以。塘坝也是一样。无情的地主总是要从佃农身上取得东西,却不肯花几个大钱修理塘坝,让塘干旱,饿死佃农,他们却只知收租。有了农会,可以不客气地发命令强迫地主修塘坝了。地主不修时,农会却很和气地对地主说道:“好!你们不修,你们出谷吧,斗谷一工!”地主为斗谷一工划不来,赶快自己修。因此,许多不好的塘坝变成了好塘坝。
+
+总上十四件事,都是农民在农会领导之下做出来的。就其基本的精神说来,就其革命意义说来,请读者们想一想,哪一件不好?说这些事不好的,我想,只有土豪劣绅们吧!很奇怪,南昌方面(24)传来消息,说蒋介石、张静江(25)诸位先生的意见,颇不以湖南农民的举动为然。湖南的右派领袖刘岳峙(26)辈,与蒋、张诸公一个意见,都说:“这简直是赤化了!”我想,这一点子赤化若没有时,还成个什么国民革命!嘴里天天说“唤起民众”,民众起来了又害怕得要死,这和叶公好龙(27)有什么两样!
+
+### 注 释
+〔1〕 湖南是当时全国农民运动的中心。
+〔2〕赵恒惕(一八八○——一九七一),湖南衡山人。一九二○年以后,他是统治湖南的军阀。一九二六年三月,在湖南人民掀起反赵高潮的形势下,被迫辞去湖南省长的职务。同年七月至九月,他的旧部被北伐军击溃。
+〔3〕辛亥革命是以孙中山为首的资产阶级革命团体同盟会所领导的推翻清朝专制王朝的革命。一九一一年(辛亥年)十月十日,革命党人发动新军在湖北武昌举行起义,接着各省响应,外国帝国主义所支持的清朝反动统治迅速瓦解。一九一二年一月在南京成立了中华民国临时政府,孙中山就任临时大总统。统治中国两千多年的君主专制制度从此结束,民主共和国的观念从此深入人心。但是资产阶级革命派力量很弱,并具有妥协性,没有能力发动广大人民的力量比较彻底地进行反帝反封建的革命。辛亥革命的成果迅即被北洋军阀袁世凯篡夺,中国仍然没有摆脱半殖民地、半封建的状态。
+〔4〕 “矫枉过正”是一句成语,原意是纠正错误而超过了应有的限度。但旧时有人常用这句话去拘束人们的活动,要人们只在修正旧成规的范围内活动,而不许完全破坏旧成规。在修正旧成规的范围内活动,叫做合乎“正”,如果完全破坏旧成规,就叫做“过正”。这也正是改良派和革命队伍内机会主义者的理论。毛泽东在这里驳斥了这类改良派的理论。这里说“矫枉必须过正,不过正不能矫枉”,就是说,要终结旧的封建秩序,必须用群众的革命方法,而不是用修正的——改良的方法。
+〔5〕一九二六年九月北伐军进军江西的时候,排斥共产党人的蒋介石嫡系部队打了败仗。许多报刊刊登消息说蒋介石受了伤。当时蒋介石的反革命面目还没有充分暴露出来,农民群众还认为他是革命的;地主富农则反对他,听到北伐军打败仗和蒋介石受伤的消息后很高兴。一九二七年四月十二日,蒋介石在上海发动反革命政变,他的反革命面目才完全暴露出来。从这时起,地主富农就对他改取拥护态度了。
+〔6〕 广东是第一次国内革命战争时期的最早的革命根据地。
+〔7〕吴佩孚(一八七四——一九三九),山东蓬莱人,北洋直系军阀首领之一。一九二○年七月,他打败皖系军阀段祺瑞,开始左右北洋军阀的中央政权,为英美帝国主义的代理人。一九二四年十月,他在军阀混战中失败。一年后再起,到一九二六年北伐战争前,他据有直隶(今河北)南部和湖北、湖南、河南等省。北伐军从广东出发,首先打倒的敌人就是吴佩孚。
+〔8〕三民主义是孙中山在中国资产阶级民主革命中提出的民族、民权、民生三个问题的原则和纲领。随着时代的不同,三民主义的内容有新旧的区别。旧三民主义是中国旧民主主义革命的纲领。一九二四年一月,孙中山接受共产党人的建议,在中国国民党第一次全国代表大会上,对三民主义重新作了解释,旧三民主义从此发展为新三民主义。新三民主义包含联俄、联共、扶助农工的三大政策和反对帝国主义、反对封建主义的纲领,是第一次国内革命战争时期中国共产党同国民党合作的政治基础。参见本书第二卷《新民主主义论》第十节。
+〔9〕 不应当容许富农加入农会。一九二七年时期,农民群众还不知道这一点。
+〔10〕 见本卷《中国社会各阶级的分析》注〔10〕。
+〔11〕 指当时的国民党县党部。
+〔12〕 袁祖铭,贵州军阀,在一九二六年六月至一九二七年一月期间曾经盘据湘西一带。
+〔13〕 亩捐是当时县、区、乡豪绅政权除抽收原有田赋之外,另行按田亩摊派的一种苛捐。这种捐税连租种地主土地的贫苦农民都要直接负担。
+〔14〕督军是北洋军阀统治时期管辖一省的军事首脑。督军大都总揽全省的军事政治大权,对外勾结帝国主义,对内实行地方性的封建军事割据,是一省范围内的独裁者。
+〔15〕 都总、团总是都、团政权机关的头领。
+〔16〕 “挨户团”是当时湖南农村武装的一种,它分常备队和非常备队两部分。“挨户”是形容几乎每一户人家都要参加的意思。在一九二七年革命失败以后,许多地方的“挨户团”被地主所夺取,变成了反革命的武装组织。
+〔17〕当时在武汉国民党中央领导下的各地国民党县党部,很多是属于执行孙中山联俄、联共、扶助农工三大政策的组织,是共产党人、左派国民党员和其他革命分子的革命联盟。
+〔18〕这句话引自《孟子·尽心上》,大意是说善于教人射箭的人,引满了弓,却不射出去,只摆着跃跃欲动的姿势。毛泽东在这里是借来比喻共产党人应当善于教育和启发农民,使农民自觉地去破除迷信和其他不良的风俗习惯,而不是不顾农民的觉悟程度,靠发号施令代替农民去破除。
+〔19〕 唐生智是当时站在革命方面参加北伐的一个将军。叶开鑫是当时站在北洋军阀方面反对革命的一个将军。
+〔20〕孙传芳(一八八五——一九三五),山东泰安人,北洋直系军阀。一九二五年十一月以后,曾经统治浙江、福建、江苏、安徽、江西五省。他镇压过上海工人的起义。一九二六年九月至十一月间,他的军队主力在江西的南昌、九江一带,被北伐军击溃。
+〔21〕 东方文化主义,是排斥近代科学文明,标榜和宣扬东方落后的农业生产和封建文化的一种反动思想。
+〔22〕会党指哥老会等旧中国民间秘密团体。参见本卷《中国社会各阶级的分析》注〔17〕。
+〔23〕 山、堂、香、水,是旧中国民间秘密团体的一些宗派的称号。
+〔24〕一九二六年十一月至一九二七年三月,蒋介石把国民革命军总司令部设在南昌。蒋介石在南昌集合了国民党右派和一部分北洋军阀的政客,勾结帝国主义,策划反革命的阴谋,形成了与当时的革命中心武汉对抗的局面。
+〔25〕 张静江(一八七七——一九五○),浙江湖州人。当时任国民党中央执行委员会常务委员会代理主席,是国民党右派头子之一,为蒋介石设谋画策的人。
+〔26〕 刘岳峙,湖南国民党右派组织“左社”的头子。一九二七年二月,他被当时还执行革命政策的国民党湖南省党部清洗出党,成为人所共知的反动分子。
+〔27〕叶公好龙,见汉朝刘向所作《新序·杂事》:“叶公子高好龙,钩以写龙,凿以写龙,屋室雕文以写龙。于是天龙闻而下之,窥头于牖,施尾于堂。叶公见之,弃而还走,失其魂魄,五色无主。是叶公非好龙也,好夫似龙而非龙者也。”毛泽东在这里用以比喻蒋介石辈口谈革命,实际上畏惧革命,反对革命。
+
diff --git "a/_posts/2024-3-21-\345\234\250\345\273\266\345\256\211\346\226\207\350\211\272\345\272\247\350\260\210\344\274\232\344\270\212\347\232\204\350\256\262\350\257\235.md" "b/_posts/2024-3-21-\345\234\250\345\273\266\345\256\211\346\226\207\350\211\272\345\272\247\350\260\210\344\274\232\344\270\212\347\232\204\350\256\262\350\257\235.md"
new file mode 100644
index 00000000000..0d39ab214c5
--- /dev/null
+++ "b/_posts/2024-3-21-\345\234\250\345\273\266\345\256\211\346\226\207\350\211\272\345\272\247\350\260\210\344\274\232\344\270\212\347\232\204\350\256\262\350\257\235.md"
@@ -0,0 +1,156 @@
+---
+layout: post
+title: 在延安文艺座谈会上的讲话
+subtitle: 1942年5月,《毛泽东选集》
+date: 2024-03-21
+author: 毛泽东
+header-img: img/post-bg-3.jpg
+catalog: true
+tags:
+ - 学习
+---
+## 引 言
+
+(一九四二年五月二日)
+
+同志们!今天邀集大家来开座谈会,目的是要和大家交换意见,研究文艺工作和一般革命工作的关系,求得革命文艺的正确发展,求得革命文艺对其它革命工作的更好的协助,借以打倒我们民族的敌人,完成民族解放的任务。
+
+在我们为中国人民解放的斗争中,有各种的战线,就中也可以说有文武两个战线,这就是文化战线和军事战线。我们要战胜敌人,首先要依靠手里拿枪的军队。但是仅仅有这种军队是不够的,我们还要有文化的军队,这是团结自己、战胜敌人必不可少的一支军队。“五四”[1]以来,这支文化军队就在中国形成,帮助了中国革命,使中国的封建文化和适应帝国主义侵略的买办文化的地盘逐渐缩小,其力量逐渐削弱。到了现在,中国反动派只能提出所谓“以数量对质量”的办法来和新文化对抗,就是说,反动派有的是钱,虽然拿不出好东西,但是可以拚命出得多。在“五四”以来的文化战线上,文学和艺术是一个重要的有成绩的部门。革命的文学艺术运动,在十年内战时期有了大的发展。这个运动和当时的革命战争,在总的方向上是一致的,但在实际工作上却没有互相结合起来,这是因为当时的反动派把这两支兄弟军队从中隔断了的缘故。抗日战争爆发以后,革命的文艺工作者来到延安和各个抗日根据地的多起来了,这是很好的事。但是到了根据地,并不是说就已经和根据地的人民群众完全结合了。我们要把革命工作向前推进,就要使这两者完全结合起来。我们今天开会,就是要使文艺很好地成为整个革命机器的一个组成部分,作为团结人民、教育人民、打击敌人、消灭敌人的有力的武器,帮助人民同心同德地和敌人作斗争。为了这个目的,有些什么问题应该解决的呢?我以为有这样一些问题,即文艺工作者的立场问题,态度问题,工作对象问题,工作问题和学习问题。
+
+立场问题。我们是站在无产阶级的和人民大众的立场。对于共产党员来说,也就是要站在党的立场,站在党性和党的政策的立场。在这个问题上,我们的文艺工作者中是否还有认识不正确或者认识不明确的呢?我看是有的。许多同志常常失掉了自己的正确的立场。
+
+态度问题。随着立场,就发生我们对于各种具体事物所采取的具体态度。比如说,歌颂呢,还是暴露呢?这就是态度问题。究竟哪种态度是我们需要的?我说两种都需要,问题是在对什么人。有三种人,一种是敌人,一种是统一战线中的同盟者,一种是自己人,这第三种人就是人民群众及其先锋队。对于这三种人需要有三种态度。对于敌人,对于日本帝国主义和一切人民的敌人,革命文艺工作者的任务是在暴露他们的残暴和欺骗,并指出他们必然要失败的趋势,鼓励抗日军民同心同德,坚决地打倒他们。对于统一战线中各种不同的同盟者,我们的态度应该是有联合,有批评,有各种不同的联合,有各种不同的批评。他们的抗战,我们是赞成的;如果有成绩,我们也是赞扬的。但是如果抗战不积极,我们就应该批评。如果有人要反共反人民,要一天一天走上反动的道路,那我们就要坚决反对。至于对人民群众,对人民的劳动和斗争,对人民的军队,人民的政党,我们当然应该赞扬。人民也有缺点的。无产阶级中还有许多人保留着小资产阶级的思想,农民和城市小资产阶级都有落后的思想,这些就是他们在斗争中的负担。我们应该长期地耐心地教育他们,帮助他们摆脱背上的包袱,同自己的缺点错误作斗争,使他们能够大踏步地前进。他们在斗争中已经改造或正在改造自己,我们的文艺应该描写他们的这个改造过程。只要不是坚持错误的人,我们就不应该只看到片面就去错误地讥笑他们,甚至敌视他们。我们所写的东西,应该是使他们团结,使他们进步,使他们同心同德,向前奋斗,去掉落后的东西,发扬革命的东西,而决不是相反。
+
+工作对象问题,就是文艺作品给谁看的问题。在陕甘宁边区,在华北华中各抗日根据地,这个问题和在国民党统治区不同,和在抗战以前的上海更不同。在上海时期,革命文艺作品的接受者是以一部分学生、职员、店员为主。在抗战以后的国民党统治区,范围曾有过一些扩大,但基本上也还是以这些人为主,因为那里的政府把工农兵和革命文艺互相隔绝了。在我们的根据地就完全不同。文艺作品在根据地的接受者,是工农兵以及革命的干部。根据地也有学生,但这些学生和旧式学生也不相同,他们不是过去的干部,就是未来的干部。各种干部,部队的战士,工厂的工人,农村的农民,他们识了字,就要看书、看报,不识字的,也要看戏、看画、唱歌、听音乐,他们就是我们文艺作品的接受者。即拿干部说,你们不要以为这部分人数目少,这比在国民党统治区出一本书的读者多得多。在那里,一本书一版平常只有两千册,三版也才六千册;但是根据地的干部,单是在延安能看书的就有一万多。而且这些干部许多都是久经锻炼的革命家,他们是从全国各地来的,他们也要到各地去工作,所以对于这些人做教育工作,是有重大意义的。我们的文艺工作者,应该向他们好好做工作。
+
+既然文艺工作的对象是工农兵及其干部,就发生一个了解他们熟悉他们的问题。而为要了解他们,熟悉他们,为要在党政机关,在农村,在工厂,在八路军新四军里面,了解各种人,熟悉各种人,了解各种事情,熟悉各种事情,就需要做很多的工作。我们的文艺工作者需要做自己的文艺工作,但是这个了解人熟悉人的工作却是第一位的工作。我们的文艺工作者对于这些,以前是一种什么情形呢?我说以前是不熟,不懂,英雄无用武之地。什么是不熟?人不熟。文艺工作者同自己的描写对象和作品接受者不熟,或者简直生疏得很。我们的文艺工作者不熟悉工人,不熟悉农民,不熟悉士兵,也不熟悉他们的干部。什么是不懂?语言不懂,就是说,对于人民群众的丰富的生动的语言,缺乏充分的知识。许多文艺工作者由于自己脱离群众、生活空虚,当然也就不熟悉人民的语言,因此他们的作品不但显得语言无味,而且里面常常夹着一些生造出来的和人民的语言相对立的不三不四的词句。许多同志爱说“大众化”,但是什么叫做大众化呢?就是我们的文艺工作者的思想感情和工农兵大众的思想感情打成一片。而要打成一片,就应当认真学习群众的语言。如果连群众的语言都有许多不懂,还讲什么文艺创造呢?英雄无用武之地,就是说,你的一套大道理,群众不赏识。在群众面前把你的资格摆得越老,越像个“英雄”,越要出卖这一套,群众就越不买你的账。你要群众了解你,你要和群众打成一片,就得下决心,经过长期的甚至是痛苦的磨练。在这里,我可以说一说我自己感情变化的经验。我是个学生出身的人,在学校养成了一种学生习惯,在一大群肩不能挑手不能提的学生面前做一点劳动的事,比如自己挑行李吧,也觉得不像样子。那时,我觉得世界上干净的人只有知识分子,工人农民总是比较脏的。知识分子的衣服,别人的我可以穿,以为是干净的;工人农民的衣服,我就不愿意穿,以为是脏的。革命了,同工人农民和革命军的战士在一起了,我逐渐熟悉他们,他们也逐渐熟悉了我。这时,只是在这时,我才根本地改变了资产阶级学校所教给我的那种资产阶级的和小资产阶级的感情。这时,拿未曾改造的知识分子和工人农民比较,就觉得知识分子不干净了,最干净的还是工人农民,尽管他们手是黑的,脚上有牛屎,还是比资产阶级和小资产阶级知识分子都干净。这就叫做感情起了变化,由一个阶级变到另一个阶级。我们知识分子出身的文艺工作者,要使自己的作品为群众所欢迎,就得把自己的思想感情来一个变化,来一番改造。没有这个变化,没有这个改造,什么事情都是做不好的,都是格格不入的。
+
+最后一个问题是学习,我的意思是说学习马克思列宁主义和学习社会。一个自命为马克思主义的革命作家,尤其是党员作家,必须有马克思列宁主义的知识。但是现在有些同志,却缺少马克思主义的基本观点。比如说,马克思主义的一个基本观点,就是存在决定意识,就是阶级斗争和民族斗争的客观现实决定我们的思想感情。但是我们有些同志却把这个问题弄颠倒了,说什么一切应该从“爱”出发。就说爱吧,在阶级社会里,也只有阶级的爱,但是这些同志却要追求什么超阶级的爱,抽象的爱,以及抽象的自由、抽象的真理、抽象的人性等等。这是表明这些同志是受了资产阶级的很深的影响。应该很彻底地清算这种影响,很虚心地学习马克思列宁主义。文艺工作者应该学习文艺创作,这是对的,但是马克思列宁主义是一切革命者都应该学习的科学,文艺工作者不能是例外。文艺工作者要学习社会,这就是说,要研究社会上的各个阶级,研究它们的相互关系和各自状况,研究它们的面貌和它们的心理。只有把这些弄清楚了,我们的文艺才能有丰富的内容和正确的方向。
+
+今天我就只提出这几个问题,当作引子,希望大家在这些问题及其它有关的问题上发表意见。
+
+## 结 论
+(一九四二年五月二十三日)
+
+同志们!我们这个会在一个月里开了三次。大家为了追求真理,进行了热烈的争论,有党的和非党的同志几十个人讲了话,把问题展开了,并且具体化了。我认为这是对整个文学艺术运动很有益处的。
+
+我们讨论问题,应当从实际出发,不是从定义出发。如果我们按照教科书,找到什么是文学、什么是艺术的定义,然后按照它们来规定今天文艺运动的方针,来评判今天所发生的各种见解和争论,这种方法是不正确的。我们是马克思主义者,马克思主义叫我们看问题不要从抽象的定义出发,而要从客观存在的事实出发,从分析这些事实中找出方针、政策、办法来。我们现在讨论文艺工作,也应该这样做。
+
+现在的事实是什么呢?事实就是:中国的已经进行了五年的抗日战争;全世界的反法西斯战争;中国大地主大资产阶级在抗日战争中的动摇和对于人民的高压政策;“五四”以来的革命文艺运动——这个运动在二十三年中对于革命的伟大贡献以及它的许多缺点;八路军新四军的抗日民主根据地,在这些根据地里面大批文艺工作者和八路军新四军以及工人农民的结合;根据地的文艺工作者和国民党统治区的文艺工作者的环境和任务的区别;目前在延安和各抗日根据地的文艺工作中已经发生的争论问题。——这些就是实际存在的不可否认的事实,我们就要在这些事实的基础上考虑我们的问题。
+
+那末,什么是我们的问题的中心呢?我以为,我们的问题基本上是一个为群众的问题和一个如何为群众的问题。不解决这两个问题,或这两个问题解决得不适当,就会使得我们的文艺工作者和自己的环境、任务不协调,就使得我们的文艺工作者从外部从内部碰到一连串的问题。我的结论,就以这两个问题为中心,同时也讲到一些与此有关的其它问题。
+
+### 一
+
+第一个问题:我们的文艺是为什么人的?
+
+这个问题,本来是马克思主义者特别是列宁所早已解决了的。列宁还在一九○五年就已着重指出过,我们的文艺应当“为千千万万劳动人民服务”[2]。在我们各个抗日根据地从事文学艺术工作的同志中,这个问题似乎是已经解决了,不需要再讲的了。其实不然。很多同志对这个问题并没有得到明确的解决。因此,在他们的情绪中,在他们的作品中,在他们的行动中,在他们对于文艺方针问题的意见中,就不免或多或少地发生和群众的需要不相符合,和实际斗争的需要不相符合的情形。当然,现在和共产党、八路军、新四军在一起从事于伟大解放斗争的大批的文化人、文学家、艺术家以及一般文艺工作者,虽然其中也可能有些人是暂时的投机分子,但是绝大多数却都是在为着共同事业努力工作着。依靠这些同志,我们的整个文学工作,戏剧工作,音乐工作,美术工作,都有了很大的成绩。这些文艺工作者,有许多是抗战以后开始工作的;有许多在抗战以前就做了多时的革命工作,经历过许多辛苦,并用他们的工作和作品影响了广大群众的。但是为什么还说即使这些同志中也有对于文艺是为什么人的问题没有明确解决的呢?难道他们还有主张革命文艺不是为着人民大众而是为着剥削者压迫者的吗?
+
+诚然,为着剥削者压迫者的文艺是有的。文艺是为地主阶级的,这是封建主义的文艺。中国封建时代统治阶级的文学艺术,就是这种东西。直到今天,这种文艺在中国还有颇大的势力。文艺是为资产阶级的,这是资产阶级的文艺。像鲁迅所批评的梁实秋[3]一类人,他们虽然在口头上提出什么文艺是超阶级的,但是他们在实际上是主张资产阶级的文艺,反对无产阶级的文艺的。文艺是为帝国主义者的,周作人、张资平[4]这批人就是这样,这叫做汉奸文艺。在我们,文艺不是为上述种种人,而是为人民的。我们曾说,现阶段的中国新文化,是无产阶级领导的人民大众的反帝反封建的文化。真正人民大众的东西,现在一定是无产阶级领导的。资产阶级领导的东西,不可能属于人民大众。新文化中的新文学新艺术,自然也是这样。对于中国和外国过去时代所遗留下来的丰富的文学艺术遗产和优良的文学艺术传统,我们是要继承的,但是目的仍然是为了人民大众。对于过去时代的文艺形式,我们也并不拒绝利用,但这些旧形式到了我们手里,给了改造,加进了新内容,也就变成革命的为人民服务的东西了。
+
+那末,什么是人民大众呢?最广大的人民,占全人口百分之九十以上的人民,是工人、农民、兵士和城市小资产阶级。所以我们的文艺,第一是为工人的,这是领导革命的阶级。第二是为农民的,他们是革命中最广大最坚决的同盟军。第三是为武装起来了的工人农民即八路军、新四军和其它人民武装队伍的,这是革命战争的主力。第四是为城市小资产阶级劳动群众和知识分子的,他们也是革命的同盟者,他们是能够长期地和我们合作的。这四种人,就是中华民族的最大部分,就是最广大的人民大众。
+
+我们的文艺,应该为着上面说的四种人。我们要为这四种人服务,就必须站在无产阶级的立场上,而不能站在小资产阶级的立场上。在今天,坚持个人主义的小资产阶级立场的作家是不可能真正地为革命的工农兵群众服务的,他们的兴趣,主要是放在少数小资产阶级知识分子上面。而我们现在有一部分同志对于文艺为什么人的问题不能正确解决的关键,正在这里。我这样说,不是说在理论上。在理论上,或者说在口头上,我们队伍中没有一个人把工农兵群众看得比小资产阶级知识分子还不重要的。我是说在实际上,在行动上。在实际上,在行动上,他们是否对小资产阶级知识分子比对工农兵还更看得重要些呢?我以为是这样。有许多同志比较地注重研究小资产阶级知识分子,分析他们的心理,着重地去表现他们,原谅并辩护他们的缺点,而不是引导他们和自己一道去接近工农兵群众,去参加工农兵群众的实际斗争,去表现工农兵群众,去教育工农兵群众。有许多同志,因为他们自己是从小资产阶级出身,自己是知识分子,于是就只在知识分子的队伍中找朋友,把自己的注意力放在研究和描写知识分子上面。这种研究和描写如果是站在无产阶级立场上的,那是应该的。但他们并不是,或者不完全是。他们是站在小资产阶级立场,他们是把自己的作品当作小资产阶级的自我表现来创作的,我们在相当多的文学艺术作品中看见这种东西。他们在许多时候,对于小资产阶级出身的知识分子寄予满腔的同情,连他们的缺点也给以同情甚至鼓吹。对于工农兵群众,则缺乏接近,缺乏了解,缺乏研究,缺乏知心朋友,不善于描写他们;倘若描写,也是衣服是劳动人民,面孔却是小资产阶级知识分子。他们在某些方面也爱工农兵,也爱工农兵出身的干部,但有些时候不爱,有些地方不爱,不爱他们的感情,不爱他们的姿态,不爱他们的萌芽状态的文艺(墙报、壁画、民歌、民间故事等)。他们有时也爱这些东西,那是为着猎奇,为着装饰自己的作品,甚至是为着追求其中落后的东西而爱的。有时就公开地鄙弃它们,而偏爱小资产阶级知识分子的乃至资产阶级的东西。这些同志的立足点还是在小资产阶级知识分子方面,或者换句文雅的话说,他们的灵魂深处还是一个小资产阶级知识分子的王国。这样,为什么人的问题他们就还是没有解决,或者没有明确地解决。这不光是讲初来延安不久的人,就是到过前方,在根据地、八路军、新四军做过几年工作的人,也有许多是没有彻底解决的。要彻底地解决这个问题,非有十年八年的长时间不可。但是时间无论怎样长,我们却必须解决它,必须明确地彻底地解决它。我们的文艺工作者一定要完成这个任务,一定要把立足点移过来,一定要在深入工农兵群众、深入实际斗争的过程中,在学习马克思主义和学习社会的过程中,逐渐地移过来,移到工农兵这方面来,移到无产阶级这方面来。只有这样,我们才能有真正为工农兵的文艺,真正无产阶级的文艺。
+
+为什么人的问题,是一个根本的问题,原则的问题。过去有些同志间的争论、分歧、对立和不团结,并不是在这个根本的原则的问题上,而是在一些比较次要的甚至是无原则的问题上。而对于这个原则问题,争论的双方倒是没有什么分歧,倒是几乎一致的,都有某种程度的轻视工农兵、脱离群众的倾向。我说某种程度,因为一般地说,这些同志的轻视工农兵、脱离群众,和国民党的轻视工农兵、脱离群众,是不同的;但是无论如何,这个倾向是有的。这个根本问题不解决,其它许多问题也就不易解决。比如说文艺界的宗派主义吧,这也是原则问题,但是要去掉宗派主义,也只有把为工农,为八路军、新四军,到群众中去的口号提出来,并加以切实的实行,才能达到目的,否则宗派主义问题是断然不能解决的。鲁迅曾说:“联合战线是以有共同目的为必要条件的。……我们战线不能统一,就证明我们的目的不能一致,或者只为了小团体,或者还其实只为了个人。如果目的都在工农大众,那当然战线也就统一了。”[5]这个问题那时上海有,现在重庆也有。在那些地方,这个问题很难彻底解决,因为那些地方的统治者压迫革命文艺家,不让他们有到工农兵群众中去的自由。在我们这里,情形就完全两样。我们鼓励革命文艺家积极地亲近工农兵,给他们以到群众中去的完全自由,给他们以创作真正革命文艺的完全自由。所以这个问题在我们这里,是接近于解决的了。接近于解决不等于完全的彻底的解决;我们说要学习马克思主义和学习社会,就是为着完全地彻底地解决这个问题。我们说的马克思主义,是要在群众生活群众斗争里实际发生作用的活的马克思主义,不是口头上的马克思主义。把口头上的马克思主义变成为实际生活里的马克思主义,就不会有宗派主义了。不但宗派主义的问题可以解决,其它的许多问题也都可以解决了。
+
+### 二
+
+为什么人服务的问题解决了,接着的问题就是如何去服务。用同志们的话来说,就是:努力于提高呢,还是努力于普及呢?
+
+有些同志,在过去,是相当地或是严重地轻视了和忽视了普及,他们不适当地太强调了提高。提高是应该强调的,但是片面地孤立地强调提高,强调到不适当的程度,那就错了。我在前面说的没有明确地解决为什么人的问题的事实,在这一点上也表现出来了。并且,因为没有弄清楚为什么人,他们所说的普及和提高就都没有正确的标准,当然更找不到两者的正确关系。我们的文艺,既然基本上是为工农兵,那末所谓普及,也就是向工农兵普及,所谓提高,也就是从工农兵提高。用什么东西向他们普及呢?用封建地主阶级所需要、所便于接受的东西吗?用资产阶级所需要、所便于接受的东西吗?用小资产阶级知识分子所需要、所便于接受的东西吗?都不行,只有用工农兵自己所需要、所便于接受的东西。因此在教育工农兵的任务之前,就先有一个学习工农兵的任务。提高的问题更是如此。提高要有一个基础。比如一桶水,不是从地上去提高,难道是从空中去提高吗?那末所谓文艺的提高,是从什么基础上去提高呢?从封建阶级的基础吗?从资产阶级的基础吗?从小资产阶级知识分子的基础吗?都不是,只能是从工农兵群众的基础上去提高。也不是把工农兵提到封建阶级、资产阶级、小资产阶级知识分子的“高度”去,而是沿着工农兵自己前进的方向去提高,沿着无产阶级前进的方向去提高。而这里也就提出了学习工农兵的任务。只有从工农兵出发,我们对于普及和提高才能有正确的了解,也才能找到普及和提高的正确关系。
+
+一切种类的文学艺术的源泉究竟是从何而来的呢?作为观念形态的文艺作品,都是一定的社会生活在人类头脑中的反映的产物。革命的文艺,则是人民生活在革命作家头脑中的反映的产物。人民生活中本来存在着文学艺术原料的矿藏,这是自然形态的东西,是粗糙的东西,但也是最生动、最丰富、最基本的东西;在这点上说,它们使一切文学艺术相形见绌,它们是一切文学艺术的取之不尽、用之不竭的唯一的源泉。这是唯一的源泉,因为只能有这样的源泉,此外不能有第二个源泉。有人说,书本上的文艺作品,古代的和外国的文艺作品,不也是源泉吗?实际上,过去的文艺作品不是源而是流,是古人和外国人根据他们彼时彼地所得到的人民生活中的文学艺术原料创造出来的东西。我们必须继承一切优秀的文学艺术遗产,批判地吸收其中一切有益的东西,作为我们从此时此地的人民生活中的文学艺术原料创造作品时候的借鉴。有这个借鉴和没有这个借鉴是不同的,这里有文野之分,粗细之分,高低之分,快慢之分。所以我们决不可拒绝继承和借鉴古人和外国人,哪怕是封建阶级和资产阶级的东西。但是继承和借鉴决不可以变成替代自己的创造,这是决不能替代的。文学艺术中对于古人和外国人的毫无批判的硬搬和模仿,乃是最没有出息的最害人的文学教条主义和艺术教条主义。中国的革命的文学家艺术家,有出息的文学家艺术家,必须到群众中去,必须长期地无条件地全心全意地到工农兵群众中去,到火热的斗争中去,到唯一的最广大最丰富的源泉中去,观察、体验、研究、分析一切人,一切阶级,一切群众,一切生动的生活形式和斗争形式,一切文学和艺术的原始材料,然后才有可能进入创作过程。否则你的劳动就没有对象,你就只能做鲁迅在他的遗嘱里所谆谆嘱咐他的儿子万不可做的那种空头文学家,或空头艺术家[6]。
+
+人类的社会生活虽是文学艺术的唯一源泉,虽是较之后者有不可比拟的生动丰富的内容,但是人民还是不满足于前者而要求后者。这是为什么呢?因为虽然两者都是美,但是文艺作品中反映出来的生活却可以而且应该比普通的实际生活更高,更强烈,更有集中性,更典型,更理想,因此就更带普遍性。革命的文艺,应当根据实际生活创造出各种各样的人物来,帮助群众推动历史的前进。例如一方面是人们受饿、受冻、受压迫,一方面是人剥削人、人压迫人,这个事实到处存在着,人们也看得很平淡;文艺就把这种日常的现象集中起来,把其中的矛盾和斗争典型化,造成文学作品或艺术作品,就能使人民群众惊醒起来,感奋起来,推动人民群众走向团结和斗争,实行改造自己的环境。如果没有这样的文艺,那末这个任务就不能完成,或者不能有力地迅速地完成。
+
+什么是文艺工作中的普及和提高呢?这两种任务的关系是怎样的呢?普及的东西比较简单浅显,因此也比较容易为目前广大人民群众所迅速接受。高级的作品比较细致,因此也比较难于生产,并且往往比较难于在目前广大人民群众中迅速流传。现在工农兵面前的问题,是他们正在和敌人作残酷的流血斗争,而他们由于长时期的封建阶级和资产阶级的统治,不识字,无文化,所以他们迫切要求一个普遍的启蒙运动,迫切要求得到他们所急需的和容易接受的文化知识和文艺作品,去提高他们的斗争热情和胜利信心,加强他们的团结,便于他们同心同德地去和敌人作斗争。对于他们,第一步需要还不是“锦上添花”,而是“雪中送炭”。所以在目前条件下,普及工作的任务更为迫切。轻视和忽视普及工作的态度是错误的。
+
+但是,普及工作和提高工作是不能截然分开的。不但一部分优秀的作品现在也有普及的可能,而且广大群众的文化水平也是在不断地提高着。普及工作若是永远停止在一个水平上,一月两月三月,一年两年三年,总是一样的货色,一样的“小放牛”[7],一样的“人、手、口、刀、牛、羊”[8],那末,教育者和被教育者岂不都是半斤八两?这种普及工作还有什么意义呢?人民要求普及,跟着也就要求提高,要求逐年逐月地提高。在这里,普及是人民的普及,提高也是人民的提高。而这种提高,不是从空中提高,不是关门提高,而是在普及基础上的提高。这种提高,为普及所决定,同时又给普及以指导。就中国范围来说,革命和革命文化的发展不是平衡的,而是逐渐推广的。一处普及了,并且在普及的基础上提高了,别处还没有开始普及。因此一处由普及而提高的好经验可以应用于别处,使别处的普及工作和提高工作得到指导,少走许多弯路。就国际范围来说,外国的好经验,尤其是苏联的经验,也有指导我们的作用。所以,我们的提高,是在普及基础上的提高;我们的普及,是在提高指导下的普及。正因为这样,我们所说的普及工作不但不是妨碍提高,而且是给目前的范围有限的提高工作以基础,也是给将来的范围大为广阔的提高工作准备必要的条件。
+
+除了直接为群众所需要的提高以外,还有一种间接为群众所需要的提高,这就是干部所需要的提高。干部是群众中的先进分子,他们所受的教育一般都比群众所受的多些;比较高级的文学艺术,对于他们是完全必要的,忽视这一点是错误的。为干部,也完全是为群众,因为只有经过干部才能去教育群众、指导群众。如果违背了这个目的,如果我们给予干部的并不能帮助干部去教育群众、指导群众,那末,我们的提高工作就是无的放矢,就是离开了为人民大众的根本原则。
+
+总起来说,人民生活中的文学艺术的原料,经过革命作家的创造性的劳动而形成观念形态上的为人民大众的文学艺术。在这中间,既有从初级的文艺基础上发展起来的、为被提高了的群众所需要、或首先为群众中的干部所需要的高级的文艺,又有反转来在这种高级的文艺指导之下的、往往为今日最广大群众所最先需要的初级的文艺。无论高级的或初级的,我们的文学艺术都是为人民大众的,首先是为工农兵的,为工农兵而创作,为工农兵所利用的。
+
+我们既然解决了提高和普及的关系问题,则专门家和普及工作者的关系问题也就可以随着解决了。我们的专门家不但是为了干部,主要地还是为了群众。我们的文学专门家应该注意群众的墙报,注意军队和农村中的通讯文学。我们的戏剧专门家应该注意军队和农村中的小剧团。我们的音乐专门家应该注意群众的歌唱。我们的美术专门家应该注意群众的美术。一切这些同志都应该和在群众中做文艺普及工作的同志们发生密切的联系,一方面帮助他们,指导他们,一方面又向他们学习,从他们吸收由群众中来的养料,把自己充实起来,丰富起来,使自己的专门不致成为脱离群众、脱离实际、毫无内容、毫无生气的空中楼阁。我们应该尊重专门家,专门家对于我们的事业是很可宝贵的。但是我们应该告诉他们说,一切革命的文学家艺术家只有联系群众,表现群众,把自己当作群众的忠实的代言人,他们的工作才有意义。只有代表群众才能教育群众,只有做群众的学生才能做群众的先生。如果把自己看作群众的主人,看作高踞于“下等人”头上的贵族,那末,不管他们有多大的才能,也是群众所不需要的,他们的工作是没有前途的。
+
+我们的这种态度是不是功利主义的?唯物主义者并不一般地反对功利主义,但是反对封建阶级的、资产阶级的、小资产阶级的功利主义,反对那种口头上反对功利主义、实际上抱着最自私最短视的功利主义的伪善者。世界上没有什么超功利主义,在阶级社会里,不是这一阶级的功利主义,就是那一阶级的功利主义。我们是无产阶级的革命的功利主义者,我们是以占全人口百分之九十以上的最广大群众的目前利益和将来利益的统一为出发点的,所以我们是以最广和最远为目标的革命的功利主义者,而不是只看到局部和目前的狭隘的功利主义者。例如,某种作品,只为少数人所偏爱,而为多数人所不需要,甚至对多数人有害,硬要拿来上市,拿来向群众宣传,以求其个人的或狭隘集团的功利,还要责备群众的功利主义,这就不但侮辱群众,也太无自知之明了。任何一种东西,必须能使人民群众得到真实的利益,才是好的东西。就算你的是“阳春白雪”吧,这暂时既然是少数人享用的东西,群众还是在那里唱“下里巴人”,那末,你不去提高它,只顾骂人,那就怎样骂也是空的。现在是“阳春白雪”和“下里巴人”[9]统一的问题,是提高和普及统一的问题。不统一,任何专门家的最高级的艺术也不免成为最狭隘的功利主义;要说这也是清高,那只是自封为清高,群众是不会批准的。
+
+在为工农兵和怎样为工农兵的基本方针问题解决之后,其它的问题,例如,写光明和写黑暗的问题,团结问题等,便都一齐解决了。如果大家同意这个基本方针,则我们的文学艺术工作者,我们的文学艺术学校,文学艺术刊物,文学艺术团体和一切文学艺术活动,就应该依照这个方针去做。离开这个方针就是错误的;和这个方针有些不相符合的,就须加以适当的修正。
+
+### 三
+
+我们的文艺既然是为人民大众的,那末,我们就可以进而讨论一个党内关系问题,党的文艺工作和党的整个工作的关系问题,和另一个党外关系的问题,党的文艺工作和非党的文艺工作的关系问题——文艺界统一战线问题。
+
+先说第一个问题。在现在世界上,一切文化或文学艺术都是属于一定的阶级,属于一定的政治路线的。为艺术的艺术,超阶级的艺术,和政治并行或互相独立的艺术,实际上是不存在的。无产阶级的文学艺术是无产阶级整个革命事业的一部分,如同列宁所说,是整个革命机器中的“齿轮和螺丝钉”[10]。因此,党的文艺工作,在党的整个革命工作中的位置,是确定了的,摆好了的;是服从党在一定革命时期内所规定的革命任务的。反对这种摆法,一定要走到二元论或多元论,而其实质就像托洛茨基那样:“政治——马克思主义的;艺术——资产阶级的。”我们不赞成把文艺的重要性过分强调到错误的程度,但也不赞成把文艺的重要性估计不足。文艺是从属于政治的,但又反转来给予伟大的影响于政治。革命文艺是整个革命事业的一部分,是齿轮和螺丝钉,和别的更重要的部分比较起来,自然有轻重缓急第一第二之分,但它是对于整个机器不可缺少的齿轮和螺丝钉,对于整个革命事业不可缺少的一部分。如果连最广义最普通的文学艺术也没有,那革命运动就不能进行,就不能胜利。不认识这一点,是不对的。还有,我们所说的文艺服从于政治,这政治是指阶级的政治、群众的政治,不是所谓少数政治家的政治。政治,不论革命的和反革命的,都是阶级对阶级的斗争,不是少数个人的行为。革命的思想斗争和艺术斗争,必须服从于政治的斗争,因为只有经过政治,阶级和群众的需要才能集中地表现出来。革命的政治家们,懂得革命的政治科学或政治艺术的政治专门家们,他们只是千千万万的群众政治家的领袖,他们的任务在于把群众政治家的意见集中起来,加以提炼,再使之回到群众中去,为群众所接受,所实践,而不是闭门造车,自作聪明,只此一家,别无分店的那种贵族式的所谓“政治家”,——这是无产阶级政治家同腐朽了的资产阶级政治家的原则区别。正因为这样,我们的文艺的政治性和真实性才能够完全一致。不认识这一点,把无产阶级的政治和政治家庸俗化,是不对的。
+
+再说文艺界的统一战线问题。文艺服从于政治,今天中国政治的第一个根本问题是抗日,因此党的文艺工作者首先应该在抗日这一点上和党外的一切文学家艺术家(从党的同情分子、小资产阶级的文艺家到一切赞成抗日的资产阶级地主阶级的文艺家)团结起来。其次,应该在民主一点上团结起来;在这一点上,有一部分抗日的文艺家就不赞成,因此团结的范围就不免要小一些。再其次,应该在文艺界的特殊问题——艺术方法艺术作风一点上团结起来;我们是主张社会主义的现实主义的,又有一部分人不赞成,这个团结的范围会更小些。在一个问题上有团结,在另一个问题上就有斗争,有批评。各个问题是彼此分开而又联系着的,因而就在产生团结的问题比如抗日的问题上也同时有斗争,有批评。在一个统一战线里面,只有团结而无斗争,或者只有斗争而无团结,实行如过去某些同志所实行过的右倾的投降主义、尾巴主义,或者“左”倾的排外主义、宗派主义,都是错误的政策。政治上如此,艺术上也是如此。
+
+在文艺界统一战线的各种力量里面,小资产阶级文艺家在中国是一个重要的力量。他们的思想和作品都有很多缺点,但是他们比较地倾向于革命,比较地接近于劳动人民。因此,帮助他们克服缺点,争取他们到为劳动人民服务的战线上来,是一个特别重要的任务。
+
+### 四
+
+文艺界的主要的斗争方法之一,是文艺批评。文艺批评应该发展,过去在这方面工作做得很不够,同志们指出这一点是对的。文艺批评是一个复杂的问题,需要许多专门的研究。我这里只着重谈一个基本的批评标准问题。此外,对于有些同志所提出的一些个别的问题和一些不正确的观点,也来略为说一说我的意见。
+
+文艺批评有两个标准,一个是政治标准,一个是艺术标准。按照政治标准来说,一切利于抗日和团结的,鼓励群众同心同德的,反对倒退、促成进步的东西,便都是好的;而一切不利于抗日和团结的,鼓动群众离心离德的,反对进步、拉着人们倒退的东西,便都是坏的。这里所说的好坏,究竟是看动机(主观愿望),还是看效果(社会实践)呢?唯心论者是强调动机否认效果的,机械唯物论者是强调效果否认动机的,我们和这两者相反,我们是辩证唯物主义的动机和效果的统一论者。为大众的动机和被大众欢迎的效果,是分不开的,必须使二者统一起来。为个人的和狭隘集团的动机是不好的,有为大众的动机但无被大众欢迎、对大众有益的效果,也是不好的。检验一个作家的主观愿望即其动机是否正确,是否善良,不是看他的宣言,而是看他的行为(主要是作品)在社会大众中产生的效果。社会实践及其效果是检验主观愿望或动机的标准。我们的文艺批评是不要宗派主义的,在团结抗日的大原则下,我们应该容许包含各种各色政治态度的文艺作品的存在。但是我们的批评又是坚持原则立场的,对于一切包含反民族、反科学、反大众和反共的观点的文艺作品必须给以严格的批判和驳斥;因为这些所谓文艺,其动机,其效果,都是破坏团结抗日的。按着艺术标准来说,一切艺术性较高的,是好的,或较好的;艺术性较低的,则是坏的,或较坏的。这种分别,当然也要看社会效果。文艺家几乎没有不以为自己的作品是美的,我们的批评,也应该容许各种各色艺术品的自由竞争;但是按照艺术科学的标准给以正确的批判,使较低级的艺术逐渐提高成为较高级的艺术,使不适合广大群众斗争要求的艺术改变到适合广大群众斗争要求的艺术,也是完全必要的。
+
+又是政治标准,又是艺术标准,这两者的关系怎么样呢?政治并不等于艺术,一般的宇宙观也并不等于艺术创作和艺术批评的方法。我们不但否认抽象的绝对不变的政治标准,也否认抽象的绝对不变的艺术标准,各个阶级社会中的各个阶级都有不同的政治标准和不同的艺术标准。但是任何阶级社会中的任何阶级,总是以政治标准放在第一位,以艺术标准放在第二位的。资产阶级对于无产阶级的文学艺术作品,不管其艺术成就怎样高,总是排斥的。无产阶级对于过去时代的文学艺术作品,也必须首先检查它们对待人民的态度如何,在历史上有无进步意义,而分别采取不同态度。有些政治上根本反动的东西,也可能有某种艺术性。内容愈反动的作品而又愈带艺术性,就愈能毒害人民,就愈应该排斥。处于没落时期的一切剥削阶级的文艺的共同特点,就是其反动的政治内容和其艺术的形式之间所存在的矛盾。我们的要求则是政治和艺术的统一,内容和形式的统一,革命的政治内容和尽可能完美的艺术形式的统一。缺乏艺术性的艺术品,无论政治上怎样进步,也是没有力量的。因此,我们既反对政治观点错误的艺术品,也反对只有正确的政治观点而没有艺术力量的所谓“标语口号式”的倾向。我们应该进行文艺问题上的两条战线斗争。
+
+这两种倾向,在我们的许多同志的思想中是存在着的。许多同志有忽视艺术的倾向,因此应该注意艺术的提高。但是现在更成为问题的,我以为还是在政治方面。有些同志缺乏基本的政治常识,所以发生了各种糊涂观念。让我举一些延安的例子。
+
+“人性论”。有没有人性这种东西?当然有的。但是只有具体的人性,没有抽象的人性。在阶级社会里就是只有带着阶级性的人性,而没有什么超阶级的人性。我们主张无产阶级的人性,人民大众的人性,而地主阶级资产阶级则主张地主阶级资产阶级的人性,不过他们口头上不这样说,却说成为唯一的人性。有些小资产阶级知识分子所鼓吹的人性,也是脱离人民大众或者反对人民大众的,他们的所谓人性实质上不过是资产阶级的个人主义,因此在他们眼中,无产阶级的人性就不合于人性。现在延安有些人们所主张的作为所谓文艺理论基础的“人性论”,就是这样讲,这是完全错误的。
+
+“文艺的基本出发点是爱,是人类之爱。”爱可以是出发点,但是还有一个基本出发点。爱是观念的东西,是客观实践的产物。我们根本上不是从观念出发,而是从客观实践出发。我们的知识分子出身的文艺工作者爱无产阶级,是社会使他们感觉到和无产阶级有共同的命运的结果。我们恨日本帝国主义,是日本帝国主义压迫我们的结果。世上决没有无缘无故的爱,也没有无缘无故的恨。至于所谓“人类之爱”,自从人类分化成为阶级以后,就没有过这种统一的爱。过去的一切统治阶级喜欢提倡这个东西,许多所谓圣人贤人也喜欢提倡这个东西,但是无论谁都没有真正实行过,因为它在阶级社会里是不可能实行的。真正的人类之爱是会有的,那是在全世界消灭了阶级之后。阶级使社会分化为许多对立体,阶级消灭后,那时就有了整个的人类之爱,但是现在还没有。我们不能爱敌人,不能爱社会的丑恶现象,我们的目的是消灭这些东西。这是人们的常识,难道我们的文艺工作者还有不懂得的吗?
+
+“从来的文艺作品都是写光明和黑暗并重,一半对一半。”这里包含着许多糊涂观念。文艺作品并不是从来都这样。许多小资产阶级作家并没有找到过光明,他们的作品就只是暴露黑暗,被称为“暴露文学”,还有简直是专门宣传悲观厌世的。相反地,苏联在社会主义建设时期的文学就是以写光明为主。他们也写工作中的缺点,也写反面的人物,但是这种描写只能成为整个光明的陪衬,并不是所谓“一半对一半”。反动时期的资产阶级文艺家把革命群众写成暴徒,把他们自己写成神圣,所谓光明和黑暗是颠倒的。只有真正革命的文艺家才能正确地解决歌颂和暴露的问题。一切危害人民群众的黑暗势力必须暴露之,一切人民群众的革命斗争必须歌颂之,这就是革命文艺家的基本任务。
+
+“从来文艺的任务就在于暴露。”这种讲法和前一种一样,都是缺乏历史科学知识的见解。从来的文艺并不单在于暴露,前面已经讲过。对于革命的文艺家,暴露的对象,只能是侵略者、剥削者、压迫者及其在人民中所遗留的恶劣影响,而不能是人民大众。人民大众也是有缺点的,这些缺点应当用人民内部的批评和自我批评来克服,而进行这种批评和自我批评也是文艺的最重要任务之一。但这不应该说是什么“暴露人民”。对于人民,基本上是一个教育和提高他们的问题。除非是反革命文艺家,才有所谓人民是“天生愚蠢的”,革命群众是“专制暴徒”之类的描写。
+
+“还是杂文时代,还要鲁迅笔法。”鲁迅处在黑暗势力统治下面,没有言论自由,所以用冷嘲热讽的杂文形式作战,鲁迅是完全正确的。我们也需要尖锐地嘲笑法西斯主义、中国的反动派和一切危害人民的事物,但在给革命文艺家以充分民主自由、仅仅不给反革命分子以民主自由的陕甘宁边区和敌后的各抗日根据地,杂文形式就不应该简单地和鲁迅的一样。我们可以大声疾呼,而不要隐晦曲折,使人民大众不易看懂。如果不是对于人民的敌人,而是对于人民自己,那末,“杂文时代”的鲁迅,也不曾嘲笑和攻击革命人民和革命政党,杂文的写法也和对于敌人的完全两样。对于人民的缺点是需要批评的,我们在前面已经说过了,但必须是真正站在人民的立场上,用保护人民、教育人民的满腔热情来说话。如果把同志当作敌人来对待,就是使自己站在敌人的立场上去了。我们是否废除讽刺?不是的,讽刺是永远需要的。但是有几种讽刺:有对付敌人的,有对付同盟者的,有对付自己队伍的,态度各有不同。我们并不一般地反对讽刺,但是必须废除讽刺的乱用。
+
+“我是不歌功颂德的;歌颂光明者其作品未必伟大,刻画黑暗者其作品未必渺小。”你是资产阶级文艺家,你就不歌颂无产阶级而歌颂资产阶级;你是无产阶级文艺家,你就不歌颂资产阶级而歌颂无产阶级和劳动人民:二者必居其一。歌颂资产阶级光明者其作品未必伟大,刻画资产阶级黑暗者其作品未必渺小,歌颂无产阶级光明者其作品未必不伟大,刻画无产阶级所谓“黑暗”者其作品必定渺小,这难道不是文艺史上的事实吗?对于人民,这个人类世界历史的创造者,为什么不应该歌颂呢?无产阶级,共产党,新民主主义,社会主义,为什么不应该歌颂呢?也有这样的一种人,他们对于人民的事业并无热情,对于无产阶级及其先锋队的战斗和胜利,抱着冷眼旁观的态度,他们所感到兴趣而要不疲倦地歌颂的只有他自己,或者加上他所经营的小集团里的几个角色。这种小资产阶级的个人主义者,当然不愿意歌颂革命人民的功德,鼓舞革命人民的斗争勇气和胜利信心。这样的人不过是革命队伍中的蠹虫,革命人民实在不需要这样的“歌者”。
+
+“不是立场问题;立场是对的,心是好的,意思是懂得的,只是表现不好,结果反而起了坏作用。”关于动机和效果的辩证唯物主义观点,我在前面已经讲过了。现在要问:效果问题是不是立场问题?一个人做事只凭动机,不问效果,等于一个医生只顾开药方,病人吃死了多少他是不管的。又如一个党,只顾发宣言,实行不实行是不管的。试问这种立场也是正确的吗?这样的心,也是好的吗?事前顾及事后的效果,当然可能发生错误,但是已经有了事实证明效果坏,还是照老样子做,这样的心也是好的吗?我们判断一个党、一个医生,要看实践,要看效果;判断一个作家,也是这样。真正的好心,必须顾及效果,总结经验,研究方法,在创作上就叫做表现的手法。真正的好心,必须对于自己工作的缺点错误有完全诚意的自我批评,决心改正这些缺点错误。共产党人的自我批评方法,就是这样采取的。只有这种立场,才是正确的立场。同时也只有在这种严肃的负责的实践过程中,才能一步一步地懂得正确的立场是什么东西,才能一步一步地掌握正确的立场。如果不在实践中向这个方向前进,只是自以为是,说是“懂得”,其实并没有懂得。
+
+“提倡学习马克思主义就是重复辩证唯物论的创作方法的错误,就要妨害创作情绪。”学习马克思主义,是要我们用辩证唯物论和历史唯物论的观点去观察世界,观察社会,观察文学艺术,并不是要我们在文学艺术作品中写哲学讲义。马克思主义只能包括而不能代替文艺创作中的现实主义,正如它只能包括而不能代替物理科学中的原子论、电子论一样。空洞干燥的教条公式是要破坏创作情绪的,但是它不但破坏创作情绪,而且首先破坏了马克思主义。教条主义的“马克思主义”并不是马克思主义,而是反马克思主义的。那末,马克思主义就不破坏创作情绪了吗?要破坏的,它决定地要破坏那些封建的、资产阶级的、小资产阶级的、自由主义的、个人主义的、虚无主义的、为艺术而艺术的、贵族式的、颓废的、悲观的以及其它种种非人民大众非无产阶级的创作情绪。对于无产阶级文艺家,这些情绪应不应该破坏呢?我以为是应该的,应该彻底地破坏它们,而在破坏的同时,就可以建设起新东西来。
+
+### 五
+
+我们延安文艺界中存在着上述种种问题,这是说明一个什么事实呢?说明这样一个事实,就是文艺界中还严重地存在着作风不正的东西,同志们中间还有很多的唯心论、教条主义、空想、空谈、轻视实践、脱离群众等等的缺点,需要有一个切实的严肃的整风运动。
+
+我们有许多同志还不大清楚无产阶级和小资产阶级的区别。有许多党员,在组织上入了党,思想上并没有完全入党,甚至完全没有入党。这种思想上没有入党的人,头脑里还装着许多剥削阶级的脏东西,根本不知道什么是无产阶级思想,什么是共产主义,什么是党。他们想:什么无产阶级思想,还不是那一套?他们哪里知道要得到这一套并不容易,有些人就是一辈子也没有共产党员的气味,只有离开党完事。因此我们的党,我们的队伍,虽然其中的大部分是纯洁的,但是为要领导革命运动更好地发展,更快地完成,就必须从思想上组织上认真地整顿一番。而为要从组织上整顿,首先需要在思想上整顿,需要展开一个无产阶级对非无产阶级的思想斗争。延安文艺界现在已经展开了思想斗争,这是很必要的。小资产阶级出身的人们总是经过种种方法,也经过文学艺术的方法,顽强地表现他们自己,宣传他们自己的主张,要求人们按照小资产阶级知识分子的面貌来改造党,改造世界。在这种情形下,我们的工作,就是要向他们大喝一声,说:“同志”们,你们那一套是不行的,无产阶级是不能迁就你们的,依了你们,实际上就是依了大地主大资产阶级,就有亡党亡国的危险。只能依谁呢?只能依照无产阶级先锋队的面貌改造党,改造世界。我们希望文艺界的同志们认识这一场大论战的严重性,积极起来参加这个斗争,使每个同志都健全起来,使我们的整个队伍在思想上和组织上都真正统一起来,巩固起来。
+
+因为思想上有许多问题,我们有许多同志也就不大能真正区别革命根据地和国民党统治区,并由此弄出许多错误。同志们很多是从上海亭子间[11]来的;从亭子间到革命根据地,不但是经历了两种地区,而且是经历了两个历史时代。一个是大地主大资产阶级统治的半封建半殖民地的社会,一个是无产阶级领导的革命的新民主主义的社会。到了革命根据地,就是到了中国历史几千年来空前未有的人民大众当权的时代。我们周围的人物,我们宣传的对象,完全不同了。过去的时代,已经一去不复返了。因此,我们必须和新的群众相结合,不能有任何迟疑。如果同志们在新的群众中间,还是像我上次说的“不熟,不懂,英雄无用武之地”,那末,不但下乡要发生困难,不下乡,就在延安,也要发生困难的。有的同志想:我还是为“大后方”[12]的读者写作吧,又熟悉,又有“全国意义”。这个想法,是完全不正确的。“大后方”也是要变的,“大后方”的读者,不需要从革命根据地的作家听那些早已听厌了的老故事,他们希望革命根据地的作家告诉他们新的人物,新的世界。所以愈是为革命根据地的群众而写的作品,才愈有全国意义。法捷耶夫的《毁灭》[13],只写了一支很小的游击队,它并没有想去投合旧世界读者的口味,但是却产生了全世界的影响,至少在中国,像大家所知道的,产生了很大的影响。中国是向前的,不是向后的,领导中国前进的是革命的根据地,不是任何落后倒退的地方。同志们在整风中间,首先要认识这一个根本问题。
+
+既然必须和新的群众的时代相结合,就必须彻底解决个人和群众的关系问题。鲁迅的两句诗,“横眉冷对千夫指,俯首甘为孺子牛”[14],应该成为我们的座右铭。“千夫”在这里就是说敌人,对于无论什么凶恶的敌人我们决不屈服。“孺子”在这里就是说无产阶级和人民大众。一切共产党员,一切革命家,一切革命的文艺工作者,都应该学鲁迅的榜样,做无产阶级和人民大众的“牛”,鞠躬尽瘁,死而后已。知识分子要和群众结合,要为群众服务,需要一个互相认识的过程。这个过程可能而且一定会发生许多痛苦,许多磨擦,但是只要大家有决心,这些要求是能够达到的。
+
+今天我所讲的,只是我们文艺运动中的一些根本方向问题,还有许多具体问题需要今后继续研究。我相信,同志们是有决心走这个方向的。我相信,同志们在整风过程中间,在今后长期的学习和工作中间,一定能够改造自己和自己作品的面貌,一定能够创造出许多为人民大众所热烈欢迎的优秀的作品,一定能够把革命根据地的文艺运动和全中国的文艺运动推进到一个光辉的新阶段。
+## 注释
+
+[1] 见本书第一卷《实践论》注〔6〕。
+
+[2] 见列宁《党的组织和党的出版物》。列宁在这篇论文中说:“这将是自由的写作,因为把一批又一批新生力量吸引到写作队伍中来的,不是私利贪欲,也不是名誉地位,而是社会主义思想和对劳动人民的同情。这将是自由的写作,因为它不是为饱食终日的贵妇人服务,不是为百无聊赖、胖得发愁的‘一万个上层分子’服务,而是为千千万万劳动人民,为这些国家的精华、国家的力量、国家的未来服务。这将是自由的写作,它要用社会主义无产阶级的经验和生气勃勃的工作去丰富人类革命思想的最新成就,它要使过去的经验(从原始空想的社会主义发展而成的科学社会主义)和现在的经验(工人同志们当前的斗争)之间经常发生相互作用。”(《列宁全集》第12卷,人民出版社1987年版,第96—97页)
+
+[3] 梁实秋(一九○三——一九八七),北京人。新月社主要成员。先后在复旦大学、北京大学等校任教。曾写过一些文艺评论,长时期致力于文学翻译工作和散文的写作。鲁迅对梁实秋的批评,见《三闲集•新月社批评家的任务》、《二心集•“硬译”与“文学的阶级性”》等文。(《鲁迅全集》第4卷,人民文学出版社1981年版,第159、195—212页)
+
+[4] 周作人(一八八五——一九六七),浙江绍兴人。曾在北京大学、燕京大学等校任教。五四运动时从事新文学写作。他的著述很多,有大量的散文集、文学专着和翻译作品。张资平(一八九三——一九五九),广东梅县人。他写过很多小说,曾在暨南大学、大夏大学兼任教职。周作人、张资平于一九三八年和一九三九年先后在北平、上海依附侵略中国的日本占领者。
+
+[5] 见鲁迅《二心集•对于左翼作家联盟的意见》(《鲁迅全集》第4卷,人民文学出版社1981年版,第237—238页)。
+
+[6] 参见鲁迅《且介亭杂文末编•附集•死》(《鲁迅全集》第6卷,人民文学出版社1981年版,第612页)。
+
+[7] “小放牛”是中国一出传统的小歌舞剧。全剧只有两个角色,男角是牧童,女角是乡村小姑娘,以互相对唱的方式表现剧的内容。抗日战争初期,革命的文艺工作者利用这个歌舞剧的形式,变动其原来的词句,宣传抗日,一时颇为流行。
+
+[8] “人、手、口、刀、牛、羊”是笔画比较简单的汉字,旧时一些小学国语读本把这几个字编在第一册的最初几课里。
+
+[9] “阳春白雪”和“下里巴人”,都是公元前三世纪楚国的歌曲。“阳春白雪”是供少数人欣赏的较高级的歌曲;“下里巴人”是流传很广的民间歌曲。《文选•宋玉对楚王问》记载一个故事,说有人在楚都唱歌,唱“阳春白雪”时,“国中属而和者(跟着唱的),不过数十人”;但唱“下里巴人”时,“国中属而和者数千人”。
+
+[10] 见列宁《党的组织和党的出版物》。列宁在这篇论文中说:“写作事业应当成为整个无产阶级事业的一部分,成为由整个工人阶级的整个觉悟的先锋队所开动的一部巨大的社会民主主义机器的‘齿轮和螺丝钉’。”(《列宁全集》第12卷,人民出版社1987年版,第93页)
+
+[11] 亭子间是上海里弄房子中的一种小房间,位置在房子后部的楼梯中侧,狭小黑暗,因此租金比较低廉。解放以前,贫苦的作家、艺术家、知识分子和机关小职员,多半租这种房间居住。
+
+[12] 见本书第二卷《和中央社、扫荡报、新民报三记者的谈话》注〔3〕。
+
+[13] 法捷耶夫(一九○一——一九五六),苏联名作家。他所作的小说《毁灭》于一九二七年出版,内容是描写苏联国内战争时期由苏联远东滨海边区工人、农民和革命知识分子所组成的一支游击队同国内反革命白卫军以及日本武装干涉军进行斗争的故事。这部小说曾由鲁迅译为汉文。
+
+[14] 见鲁迅《集外集•自嘲》(《鲁迅全集》第7卷,人民文学出版社1981年版,第147页)。
diff --git "a/_posts/2024-3-21-\351\202\246\345\233\275\345\220\214\345\277\227\346\230\257\345\246\202\344\275\225\346\212\223\344\275\217\347\211\233\351\274\273\345\255\220\357\274\237.md" "b/_posts/2024-3-21-\351\202\246\345\233\275\345\220\214\345\277\227\346\230\257\345\246\202\344\275\225\346\212\223\344\275\217\347\211\233\351\274\273\345\255\220\357\274\237.md"
new file mode 100644
index 00000000000..f172a3b814a
--- /dev/null
+++ "b/_posts/2024-3-21-\351\202\246\345\233\275\345\220\214\345\277\227\346\230\257\345\246\202\344\275\225\346\212\223\344\275\217\347\211\233\351\274\273\345\255\220\357\274\237.md"
@@ -0,0 +1,195 @@
+---
+layout: post
+title: 邦国同志是如何抓住牛鼻子?
+subtitle: 转自微信公众号《传达室》
+date: 2024-03-21
+author: Ajiao
+header-img: img/post-bg-3.jpg
+catalog: true
+tags:
+ - 学习
+---
+要写邦国同志,其实不太容易。因为他的名字虽然很熟悉,但他的个人色彩似乎却并不鲜明。
+
+但在春节期间,我连续看了一些关于他的故事,有了一个突出印象:这是一位破解难题的高手,也是一个抓牛鼻子的能手。
+
+牛鼻子,这是来自民间的说法,意为事物的关键和要害。我们说一个人水平高,往往都是因为他具备一种功夫,就是一出手,就能抓住个牛鼻子。
+
+那么,邦国同志是怎么抓的呢?
+
+
+## 01
+
+首先就要搞明白一个问题,牛鼻子一般在哪里找?
+
+邦国同志起初是在上海工作,抓上海的牛鼻子。那是1990年代初的上海,好像一张新画布摊开,似乎遍地都有机遇,四处都是牛鼻子,但是先抓哪个后抓哪个,这是学问。
+
+邦国同志抓得很紧的一个牛鼻子,叫期货。
+
+那时,国家刚刚宣布开发浦东,上海粮食局的两位同志递上来一份报告,建议在浦东建立大型粮食市场,开展期货交易。(怪不得小平同志说,上海人才优势明显,此处可见,连粮食局的同志都这么有金融思维。)
+
+这份报告,成功引起了邦国同志的注意。
+
+众所周知,上海在上世纪二三十年代就是一个金融中心,是“货币自由兑换的地方”,期货交易也曾搞得如火如荼。尽管几十年过去了,但这个传统还有,曾经的“老法师”也还健在,这都是上海的优势。
+
+如今,上海要恢复它金融中心的地位,证券是关键,期货也是一个关键。
+
+然而,期货交易市场的筹建过程,却显得像是“小脚女人走路”。一些同志觉得“期货”这两个字太敏感,怕惹非议,只敢在文件里写“国家级粮食批发市场”。
+
+一个期货市场,怎么就变成了批发市场了呢?
+
+更要命的是,还有更多的同志,不主张交易市场从期货起步,纷纷建议,我们是不是可以先搞现货交易,以后再逐步向期货交易过渡呢?
+
+大家这么谨慎,说来说去,还是怕担风险。
+
+邦国同志主张步子迈大一点。他说,搞期货虽然风险大,但肯定是有前途的。因此,他不光希望期货交易所要开,而且还要快开。原计划1994年太晚了,最好先借个地方马上就开起来。
+
+他还明确指出,交易要用电脑,再像旧时代那样打手势,这个是不行的。
+
+邦国同志的专业并非金融,过去也没有搞过期货,为什么就那么关注呢?
+
+他的逻辑是,我们搞商品经济,市场是本质的东西,这比搞“自主”“放开”“简政放权”还重要。他说:
+
+上海要长时间保持较高的增长速度,关键是发挥自身优势,打造更为有利的市场环境。
+
+这是什么逻辑?这就是底层逻辑啊。
+
+而顺着底层逻辑去摸,就是摸牛鼻子的不二法门。只要底层逻辑找对,一般都能找到一个牛鼻子。
+
+## 02
+
+其实,很多时候牛鼻子藏的也不是很深,就在看得见的地方。很多人视而不见,是因为牛鼻子往往烫手。
+
+抓不好,反而容易把自己烫伤。
+
+还是举上海的例子说。当年说要振兴上海,是从哪里开始的?是从人开始的。最开始的一个牛鼻子,是小平同志抓的。
+
+在“文革”结束之后,上海的许多老同志官复原职,但是,他们年龄都比较大了,虽然占着位置,但多数又有病。在1979年,上海市足足有19个常委,不仅年龄超标,数量也超过。
+
+位置问题历来就是麻烦的问题,要让人挪位置,就更是麻烦的问题。
+
+但小平同志认为,经济能不能快一点发展起来,关键在人。他对上海的班子提出了具体的要求:
+
+选四五十岁的、身体好的、能坚持八小时工作的。
+
+于是,干部年轻化这个牛鼻子一牵,包括邦国同志、黄菊同志在内等十八位同志,就从上海各个基层口子被牵了出来。他们差不多都四五十岁,都能工作八小时及以上。
+
+他们还有两个好,一个是具备专业背景。
+
+邦国同志是在基层搞工业出身,他针对上海工业“小而全”的问题,便提出了一个“支柱工业”概念,意思是也是要抓工业中的“牛鼻子”。
+
+在这个概念下,上海先后确定了六个支柱工业,他们的专业背景也被用上了。清华大学念无线电的邦国同志联系通信设备产业,而同样在清华学电机的黄菊同志,就联系汽车工业。
+
+他们的另一个优势,就是对上海市情有切身体会。
+
+体会有多深呢?
+
+比如,当年上海市民每天要自己倒80万只马桶,而邦国同志家的马桶,也是这80万的其中之一。自1967年毕业分来上海后,他们家一家五口就多年挤在天潼路,一间11平方米的小阁楼里。
+
+邦国同志上来之后,眼前就看得见解决上海住房问题的关键一招。不过,它依然有些烫手。
+
+这个招,就是土地批租。
+
+土地批租面临两个麻烦。一是,党内外争议很多,议来议去,就是怕一个“租”字。有人说,这到底是租赁的租,还是租界的租啊?二是,涉及到动迁,事情就更多了。
+
+但是如果怕麻烦,上海就永远只能“抱着金饭碗讨饭吃”。土地批租势在必行,但邦国同志显然还不具备小平同志一言九鼎的能量,那他是怎么做的呢?
+
+他的做法是亲自上阵,准备了大量的细致翔实的材料,就土地批租问题做耐心的宣讲,最终打消了大家的顾虑,赢得了各方的支持。
+
+通过土地批租,上海这口金饭碗里迅速就有了饭。
+
+仅在1992和1993年这两年,上海批出449幅土地,收到了44.6亿美元和57.5亿人民币。有了这些钱,到1995年,上海便拆除了危旧房1163万平方米。
+
+这个数字,是此前五年总量的306倍。
+
+## 03
+
+为什么有的人做事情、看问题,会站得比较高,其中一个重要原因,是因为踩得比较实。
+
+这就要求背后功夫要做足。邦国同志就很有这个特点,他的决策,不是轻松地拍脑袋,而是仔细地过脑袋。
+
+这一点,可以在1994年的分税制改革中得到印证。
+
+那一年,国家决定实行分税制改革,目的之一是为了扭转中央财政羸弱的局面,这就涉及到中央和地方财政利益的重新分配。地方上显然都有顾虑,对他们来说也无疑是一件大事情,各地几乎都“严阵以待”。
+
+朱同志带着一队人马,一个省一个省地做工作,他称之为“南征北战”。
+
+这一路上,就体现出各省不同的风格了。
+
+广东是财源大省,是一场“硬仗”。他们现场提出了许多问题,北京来的同志不得不连夜通宵算账,算到最后“脸色蜡黄,走路都打晃了”。
+
+而山东就很不一样。山东省的主要负责同志连财政厅给的稿子都不念,十分干脆地说:中央怎么决定,我们就怎么干。哪怕朱同志再三询问,他们也没有提出一点要求。
+
+那么,上海的邦国书记是怎么表现的呢?
+
+据财政口的同志回忆,在朱同志带队来之前,邦国书记已经在上海西郊宾馆“闭关”了半个月,提前把账算得清清楚楚。
+
+因此,上海的对账就变得非常容易。即便偶有出入,邦国同志也没有让北京的同志重新算,而是拿着自己的账本,谦虚地问:
+
+我这个错哪了,你给我说说。
+
+在很多情况下,算账不仅能算出利益得失,还能从数据里面找出依据,帮助我们排除干扰,做出正确的决策。
+
+这就要说到一个重庆的案例。
+
+重庆特钢曾经是一个知名企业,然而,从1997年起这个企业陷入了巨额亏损,政府多次出手相救,亏损的包袱却越来越大。从财务数据来看,特钢的资产负债率已经超过130%,就该破产了。
+
+可是,破产需要很大的勇气,负很大的政治责任,重庆依然想保。他们最后想出的办法是让重钢兼并特钢。这个办法可行不可行呢?
+
+其实,重钢当时自身也亏损2.4个亿,只不过比特钢的亏损小一些,这个办法说白了,就是一个“病人背死人”的办法。可以想见,最终的结果一定是死人救不活,病人可能还会被拖死。
+
+这个事情到了当时主管工业的邦国同志面前,他看完数据、听完汇报,沉思了很久。然后就说了一句话:
+
+支持特钢走破产之路。
+
+重庆的同志感到松了一口气,他们的思想包袱就被卸下来了。
+
+## 04
+
+那些年,邦国同志分管的领域,多属于难啃的硬骨头。国有企业的改革是一个,还有就是移民工作。
+
+在2000年前后,为修建三峡工程有百万大移民。这其中,移民需要一定比例的外迁。所谓外迁就是要离乡背井,远程安置到其他省份。中国人讲究故土难离,外迁相比就地安置,工作任务更为艰巨。
+
+重庆原本外迁移民规划是7.1万人,不过,在1999年底,邦国同志却又给他们加了一个包袱。
+
+这个包袱一加,就是3万人。
+
+也就是说,重庆当地需要外迁的移民数量,陡然来到10万人。重庆的同志当然有想法。
+
+邦国同志为了做工作,讲起了其中的缘由。他的关键是两个字:土地。
+
+为什么在任务很重的情况下,还要增加外迁移民的数量?因为土地是农民的饭碗,三峡库区土地少,养不了这么多人。如果强行安置在本地,不仅牺牲环境,移民以后也过不好日子。
+
+重庆的同志一听,好像是这么个道理,移民外迁,眼前看着是包袱重了,但这是为了避免小包袱将来演变成大包袱。
+
+他们的思想一通,又感到松了一口气。
+
+百万大移民,是史无前例的艰巨复杂工程。我感到邦国同志在处理这个难题时,就是牵着两个牛鼻子,一个叫减轻包袱,一个叫增加饭碗。
+
+牵着牛鼻子,邦国同志就在现场看到问题了。
+
+书中记载,有一天走在重庆万州的滨江路上,他看到许多机关单位在沿街的门面房里办公。机关又不做生意,占着门面房干什么呢?
+
+邦国同志觉得,这样好的地段,应该留给老百姓做点小买卖嘛。他说:
+
+历史告诫我们,与民争利往往会得不偿失的。
+
+当年在重庆陪同考察的一位同志,暗中观察着邦国同志的举动, 感到很佩服。他后来用两句话,总结了邦国同志的特点:
+
+遇大事常常是举重若轻,确定大方针,绝不拖泥带水;面对具体问题,他又举轻若重,不厌其烦,关键处总是讲得清楚明白。
+
+对了,总结这段话的同志,同样是从上海来。后来据说也蛮会抓牛鼻子。
+
+他叫黄奇帆。
+
+## 05
+
+抓牛鼻子,需要娴熟的技巧,也需要冷静的头脑。而能否保持冷静的头脑,又取决于怎么对待问题。
+
+很多时候,问题一来,我们要么脑子乱了,要么心态崩了。细想一下,人这一辈子不就是在遇到问题、解决问题中度过的么。
+
+再借用邦国同志的一句话:
+
+我们是在不断解决问题中发展的,发展的过程,就是解决问题的过程。随着问题的解决,我们又迈上了新的征程。
+
+国家的事是这个道理,个人的事,其实也是这个道理。
\ No newline at end of file
diff --git "a/_posts/2024-3-7-\345\216\206\351\231\251\347\275\227\347\272\271\346\262\263.md" "b/_posts/2024-3-7-\345\216\206\351\231\251\347\275\227\347\272\271\346\262\263.md"
new file mode 100644
index 00000000000..a1a5c424a0a
--- /dev/null
+++ "b/_posts/2024-3-7-\345\216\206\351\231\251\347\275\227\347\272\271\346\262\263.md"
@@ -0,0 +1,44 @@
+---
+layout: post
+title: 历险罗纹河
+subtitle: 作者:郭北平,原载《渭南日报》2003年9月20日
+date: 2024-03-07
+author: Ajiao
+header-img: img/post-bg-2.jpg
+catalog: true
+tags:
+ - 生活
+---
+2003年对渭南来说是个非同寻常的年份,先是前半年的持续干旱,渭河渭南段出现长时间断流,常言说:久旱必有久雨,久雨必有大汛。随着汛期的到来,8月27日,渭河l号洪峰如期进入渭南,渭南历史上一场空前的抗洪抢险战斗打响了。
+
+为了作好抗洪抢险的报道工作,渭南电视台和渭南日报的新闻记者全部投入了战斗,全面报道全市军民抗洪抢险、勇斗洪魔的英雄壮举。9月8日,按照台里的安排,我跟随市委书记刘新文、市长曹莉莉进行采访报道工作。上午,参加了由副省长潘连生在华阴主持召开的全市抗洪抢险再动员大会,顺利完成会议的报道拍摄工作。当天下午接宣传部通知,作好一切准备工作,9月9日随领导进行采访报道。第二天早晨6点30分,我提着摄像机在酒店门口碰见刚从金穗宾馆赶过来的王文,他关心地问我:“你吃了没有?咱们一块去吃早点。”自助早餐很丰富,我们边吃,我边问王文:“今天我们去哪儿?”他说:“不清楚,可能是要上大堤查灾。”7点30分,我和王文乘坐采访车跟随市委书记刘新文、市长曹莉莉、常务副市长姚炬、市委秘书长王安稳、市政府副秘书长张忠义、王红旗等人向华县罗纹河入渭口渭河大堤出发。在车上,我和王文谈到了关于采访报道工作方面的事情,也聊起了家庭和孩子,听得出来他非常疼爱他两岁多的儿子。
+
+1号洪峰和2号洪峰已使华县大面积淹没,近二十万人受灾,洪水已进入华县城北边缘。很快我们在华县西关街东面准备乘船北上渭河大堤,在岸边有三四艘冲锋舟,有一艘正在靠岸,另一艘正在装运馒头、榨菜和方便面。在接应人员的安排下,大家陆续上了一艘冲锋舟。为了利于拍摄,我坐在了冲锋舟的前面,和周庆文在一起,王文坐在船尾的位置同样方便拍摄。冲锋舟在浩淼无边的淹没区向前驶去。一路上我们看到了一个又一个被洪水淹没的村庄、一座座正在倒塌的房屋,水面上到处是各种漂浮物,偶尔看到一些家畜的尸体,水深已至屋檐,电线杆也只露个头。看到这些画面,我和王文不停地在拍摄一些资料画面,刘新文书记也不时地提示.要求多拍一些有代表性的淹没区画面资料。随着冲锋舟的快速行驶,船头荡起的浪花水珠打湿了我的衣服,也溅到了摄像机上,我不得不终止拍摄,用衬衣袖子擦干机器上的水珠。对面的周庆文看了看笑着对我说:“你还这么心细!”我给解释说:“如果设备受潮,就不工作了,会影响拍摄。”
+
+经过近一个小时的行驶,前面出现了一片开阔的水面,周围的村庄也少了,我打开摄像机想再拍一些资料,当镜头从左面90度摇到正面,我发现前面好像有浪花翻滚,心想“这一定是个好镜头,得赶快抓拍下来”。当我把镜头推上去拍摄时,顿时惊呆了,发现前面是激流翻滚,正在汹涌澎湃的大缺口。我立即停止了拍摄.似乎其他人也发现了异常,王文也停止了拍摄,收拾好相机。原来,前面就是罗纹河和渭河大堤,今天凌晨2时罗纹河西堤刚刚决堤,淹没区的洪水正在和渭河倒灌的洪水一起通过罗纹河东堤决口向东奔流。当时我们还没有接到前面的险情通知,大家立即反应过来前面有危险,这时距缺口已不到—公里远,船已开始顺水向缺口方向漂流.驾驶冲锋舟的两位海军战士立即向右调转船头想离开危险区,就在这个关键的时刻,冲锋舟的螺旋桨断了,船失去了动力,顺着洪水快速向大决口危险区漂去。两位海军战士试图用船槁撑船,但由于水太深,槁根本够不着底,无法改变航向,这时距大缺口已不到500米了。一瞬间,大家感觉到了事态的严重性,眼前就是汹涌的大浪,缺口更是浪大水急。船上的空气似乎都凝固了,所有的人可能都意识到了前面也许就是死亡。我一手紧紧抓住船弦,一手下意识地紧紧抓住摄像机,心中充满了恐惧。一瞬间脑中闪过各种各样的念头,耳边传来刘书记和曹市长低沉的声音:“大家不要慌,沉住气”。
+
+冲锋舟转眼已进入缺口附近,开始颠簸。恐惧又瞬间消失了,我脑海里只有一个念头,和大家一起冲过前面的大浪,已顾不上考虑后果了。市委秘书长王安稳看见我紧紧抓着摄像机,就大声说:“把摄像机放到船里,用手抓紧船”。这时我已不知所措,一只手紧抓摄像机,一只手紧抓船弦,每个人都绷紧心弦,准备迎接这最后关头的到来。话音未落船已进入罗纹河堤大缺口,激流将船快速向中间推去,大家紧抓船弦冲向第一个巨浪,巨浪将船猛地掀起,发出巨大的声响,水也涌了进来,紧接着又是第二个巨浪和第三个巨浪,一个比一个厉害,坐满了人的冲锋舟被巨浪轻而易举的掀起又落下,人随着船在剧烈的颠簸。当冲锋舟被第三个巨浪掀起还没有落下时,一丈多高的第四个巨浪又迎面而来,它比前面来的都要强烈,一声巨响,冲锋舟被正面掀了起来,抛向空中向后翻去,转眼间所有的人都被摔了出去,和冲锋舟一起掉进了罗纹河堤岸决口汹涌翻滚的洪流中,也就是在这个时刻,手足无措,又不会游泳的我和摄像机分开了,王文和同船的人也不知道了去向。
+
+当我落入水中,黄亮亮的河水从眼前闪过,整个世界沉寂了,什么也听不到,沉下去的时候,口中的河水充满了泥土味,脑子里闪过一个念头:这下完了。完了,咕咚、咕咚被迫喝下几口洪水之后,发现自己又抓住了翻落下来的船弦,被浮起的翻船带出了水面,突然又沉了下去,被激流快速冲走。茫然中心想:千万不能松手,一旦松手,就完了。
+
+不知道漂了多长时间,我把头伸出水面,喘息之后,看见王安稳秘书长也抓住了船弦爬上了船背喘着气,张忠义秘书长头刚刚露出水面,靠在船边,脸色苍白。也在不停的喘息。我看见他处境危险。就朝他喊:“秘书长。我把你拉上来吧”。他说:“我不要紧,喝了几口水”。说话间,忽然,刘新文书记从对面游过来爬上船背大声说:“河水把我的眼镜冲掉了,我什么也看不见,其他人都怎么样?大家把雨鞋都脱掉”。这时,我才醒悟过来.赶快在水中把雨鞋登掉,减小阻力,方便逃生。
+
+随后,很快我也爬上了船背,把船边的王宝红也拉了上来。周庆文正在水中抓住了船弦,在离船l0米远处,我看见了姚市长浮在水中,我急忙朝他喊:“姚市长,我拉你上来”。他远远地看着我,说不出话来,后来才知道,前面离他不远的一位会游泳的军队参谋正在水中用一把竹竿拖着他被动的向前漂,因为他一点也不会游泳。湍急的洪水继续向前奔流,大家都被冲得向下游漂去,这时我发现,由于船背上的人太多,倒扣着的冲锋舟随时有可能翻沉,当我们船背上的几个人漂过几棵树的时候,我抓住了树枝,离开了船背,爬上了一棵桐树。在树上,我看着刘书记和王秘书长他们随船继续向前漂去,心中有一种说不出的滋味,担心、着急和忧虑。紧接着,姚市长和那位参谋也顺流漂到了我附近那两棵树跟前,他们分别抱住了一棵树,三棵树相距有二、三米远。回过头,我看见刘书记他们的船也停在了不远处的树丛中,心想:这一下他们也安全了。于是,除了我们看见的人,又开始担心曹市长、王红旗秘书长和王文了,也不知道他们现在都怎么样?在哪里?
+
+冲锋舟被掀翻之后,王红旗副秘书长一只手紧紧地拽住了曹市长。因为他当过兵,会游泳,在洪水中曹市长的安全得到了保证。为了赶快找到安全的地方,他们抓住了一截树杆,用手拼命地划向有树的地方。经过近1个小时的努力,终于在一棵杆上缠绕着蛇的树旁停了下来,为了求生,曹市长硬是用手打掉了蛇,才爬到了树上。还没来得及喘口气,曹市长就着急地问树旁的王秘书长: “其他的同志都怎么样了,他们都被冲到哪儿了?得赶快想办法和岸上取得联系,来营救大家……。”听到岸上有喇叭的喊话声,王秘书长大声地呼喊:快来人!快来救人!……”
+
+周庆文被洪水打翻时,喝了一大口全是虫子的河水,又是恶心.又无法呕吐.脸色蜡黄。本来已漂到船边抓住弦的周庆文为了减轻船上的负担.试图去抓一根漂过来的木头.结果木头没有抓住,抓船的手也松开了,我大声地喊他:“周庆文,快抓住木头!抓住木头!”已来不及了,周庆文大喊一声被水冲走。后来,他抓住了不远处一个斜倒的树木,树下腐烂的家畜尸体让他无法呼吸,他拼命地爬上树骑在了上面。然而,由于长期浸泡,身后的房屋在不停的倒塌,莫名的恐惧使他又大声喊……。
+
+由于小时候经常爬树,所以凭经验我很快爬到了那棵树上,由于是光脚,而且又光又滑无法站住,我就抱住树干坐在树权上,稍微缓过神来,赶快看看姚市长和那位参谋,我喘着气喊:“姚市长,你没事吧。”姚市长也喘着气说:“我没事,我可是一点都不会游泳。”落水之后,所有人的手机都失去了联络,求救只有想别的办法了。他们两个都是半身在水中,只有靠双手紧紧抱住树坚持着,只有我能腾出手,晃动树枝拼命向岸上的人歇斯底里地呼喊:快来救人!快来救人!……!解放军快来救人!杨司令快来救人!……嗓子都喊哑了。相距l公里左右远处大堤上的人,来回跑动,似乎正在想办法,过了约半个小时,岸上还是没有动静。后来才知道,大堤上根本就没有船,没有冲锋舟,时间一分一秒的过去了,姚市长似乎有点撑不住了,就问我:“还没过来?”我说:“没有”,我又说:“姚市长,你想办法爬上去,爬到树上。”他叹了口气说:“我不行,你赶快喊!”我缓了口气又喊了起来……。约一个小时左右,大堤上有几个战士穿着救生衣,试图撑着一个木筏过来,但多次都被洪水冲向别的地方,无法营救。就在这个时候.大堤上喇叭传来岳万民市长的声音:“树上的人,不要乱动,请节省体力,冲锋舟马上就到。”我们悬着的心终于放下了。
+
+很快,远处传来了冲锋舟熟悉的声音,…—共来了三艘,第一艘首先发现我们,并将姚市长、那位参谋和我救上了岸,后来其他冲锋舟陆续将刘书记、曹市长和其他人都救上了大堤。刘书记一上岸就问:“两个记者都怎么样?他们都上岸了吗?”当大家清点人数换衣服时,发现渭南日报的王文怎么没上来?于是刘书记、曹市长和其他领导都来不及换衣服,急忙吩咐:“赶快搜救,一定要把王文找着!”三艘冲锋舟又开始了一轮又一轮的搜寻,当刘书记和曹市长得知几次搜寻都不见王文下落的时候,他们都流下了热泪,刘书记含着泪吩咐:“要继续加大搜寻范围,活要见人,死要见尸,一定要把王文找回来!”
+
+我跟随王安稳秘书长用部队上的望远镜在大堤上向远处水中不停地眺望、搜寻……始终不见王文的影子!站在岸边。我心里非常着急,望着远处心想:王文,你到底在什么地方:可千万不能出事!你的家人和你疼爱的儿子可不能没有你呀!
+
+当我们乘冲锋舟返回华县县城时,发现周庆文怎么没上来。姚市长说:“他和张忠义继续留在大堤上了。”想起王文还没有找着,想着我们亲密无间的工作情谊……,我无法控制自己的泪水……。
+
+市委书记刘新文、市长曹莉莉和其他领导换了衣服.稍作休整后立即投入了新的工作中。作为新闻记者,脑海里闪过一幕幕抗洪抢险的镜头,实在无法安静下来,只想能尽快接受任务奔赴一线.投入到火热的工作中去。
+
+当我写完这最后一页的时候,已经传来消息,王文不幸遇难了,遗体已经找着,这时距出事那天已经是第五天了,大家的心情陷入无比的沉痛之中……。
+
+困难和挫折吓不倒550万渭南人民。我坚信:在市委、市政府的正确领导下.在全市军民的共同努力下,我们的抗洪救灾—定会取得最后的胜利。
\ No newline at end of file
diff --git "a/_posts/2024-4-22-\344\270\255\345\233\275\345\274\217\351\245\255\345\261\200\347\232\204\347\234\237\347\233\270.md" "b/_posts/2024-4-22-\344\270\255\345\233\275\345\274\217\351\245\255\345\261\200\347\232\204\347\234\237\347\233\270.md"
new file mode 100644
index 00000000000..79b3066a178
--- /dev/null
+++ "b/_posts/2024-4-22-\344\270\255\345\233\275\345\274\217\351\245\255\345\261\200\347\232\204\347\234\237\347\233\270.md"
@@ -0,0 +1,300 @@
+---
+layout: post
+title: 中国式饭局的真相
+subtitle: 转自微信公众号《最爱历史》
+date: 2024-04-22
+author: Ajiao
+header-img: img/post-bg-2.jpg
+catalog: true
+tags:
+ - 生活
+---
+绍兴二十一年(1151年)十月,**宋高宗**在宰相**秦桧**等高官陪同下,亲临大臣张俊的府第。
+
+皇帝到家里做客,可是荣耀至极的恩宠,张俊特意为老板宋高宗准备了一场史无前例的豪门盛宴。
+
+菜单上囊括各种飞禽走兽,仅果食就多达一百多款,下酒菜中更不乏羊舌签、鲨鱼脍、洗手蟹等名菜。酒过三巡后,张俊还将其珍藏的大量宝物进奉给宋高宗。
+
+这场与唐代烧尾宴、清代满汉全席等齐名的奢华筵席,成为南宋权贵耽于享乐的缩影。
+
+张俊本是弓手出身,与岳飞一样从底层打拼,后来却成为权奸秦桧的忠实追随者。号称中兴名将的张俊,为人贪婪好财,到处霸占田产、搜刮金银,通过巧取豪夺,家积巨万,这才有钱请皇帝吃饭。
+
+在古老的礼仪之邦,请客吃饭这事儿,来不得半点含糊。
+
+推杯换盏之间,酒水折射出的,往往是人心。
+
+### 01
+
+中国最早的宴饮活动,是坐在地上进行,哪怕请客吃饭也是如此,因为那时没有桌椅。
+
+先秦时期,主人请客,在地上铺筵加席,分餐而食,人们“席地而坐,凭俎案而食”,彼此间隔相当的距离,案上各有一套饭菜与餐具,与当今西餐分盘而食相似。
+
+有学者认为,分餐制在中国至少存在了三千多年,从远古一直延伸到隋唐。历经魏晋数百年的胡汉文化融合,在高桌大椅等新家具出现后,唐代发展出合餐制,并在北宋时期正式取代分餐制,后逐渐转变为现在常见的围桌而食。
+
+在先秦,代表尊卑礼仪的分餐制闹出不少事故,也成就了许多耳熟能详的故事。
+
+春秋霸主楚庄王有一次请群臣吃饭,摆上盛大的筵席,命姬妾斟酒,与众人嗨到夜晚。
+
+楚国将领唐狡喝多了,看着眼前美女的曼妙身姿,动了歪念头。
+
+此时,一阵疾风吹灭了烛火,全场一片漆黑。唐狡有酒壮胆,暗中扯下美女的衣袖,不由自主地拉住她的手,幸好人家姑娘反应迅速,反手就把唐狡帽子上的簪缨扯下来,吓得他赶紧松手。
+
+这位美女是楚王的宠姬。她急忙躲到楚庄王身边,告诉他,自己刚刚被性骚扰,现在手里还攥着那人的帽缨,只要点上灯烛,就知道是谁这般无礼。
+
+出人意料的是,楚庄王听完宠姬诉苦,却淡定地对大家说:“先别急着点灯!今晚我们要喝个痛快,大家不必拘束,都把帽缨摘去,取下冠饰。”
+
+灯火重燃后,在场的人皆已取下帽缨,摘下冠帽,谁也不知道刚才发生了什么事,只有唐狡明白,自己捡回一条命,是楚庄王饶恕了他,从此誓死效忠楚王。
+
+后来,楚国与郑国交战,唐狡自请为先锋,在战场上拼死作战,为楚国立下大功。
+
+宽以待人的楚庄王没有因宠姬被调戏而动怒,反而得到一名忠臣。那场君臣宴饮,被后世称为“绝缨之宴”。
+
+### 02
+
+同样在请客时遭遇事故的,还有战国四公子之一的孟尝君田文。
+
+孟尝君在齐国权倾一时,养食客数千人,善于笼络人心。孟尝君声称公司福利好,自己作为老板,都与门客穿一样的衣、吃一样的饭,不论高低贵贱。
+
+有一天晚上,孟尝君请众门客吃饭,其中有一个门客不久前刚慕名来投,对孟尝君的人品半信半疑。
+
+席间,有人无意中挡住了灯光。这名新门客见此情景十分恼怒,以为孟尝君一定是给他安排了次等酒菜,不敢以正面示人,才命人遮挡。他推开食案,起身就要离去。
+
+此时,孟尝君也站起身来,端起自己的饭菜,同门客的那份相比较。这名新门客见他们的食物并无二致,才知自己错怪了孟尝君,顿时感到无地自容。
+
+先秦的侠士大多刚烈,这名门客二话不说,当场拔剑自刎,向孟尝君谢罪。孟尝君为此遗憾不已,但也正因为这名门客的自尽,更多士人得知孟尝君诚实守信,投靠到其门下。
+
+孟尝君对他们尽心款待,后来失势时,正是得力于门下的食客相助,甚至连鸡鸣狗盗之辈也各显神通,才能逃出生天。
+
+有人请客吃饭,得到门客忠心辅佐,有人却因请客失了国。
+
+中山国有个国君,是个吃货,有天炖了一大锅羊肉汤,分给手下,唯独忘了请一名叫子期的将军。
+
+子期得知后十分愤恨,想不通国君为何不分羊肉汤给自己,一生气,跑去投奔敌国,把中山国的底细全交代出去。结果,中山国被打得大败,国君也被迫逃亡。
+
+中山国君那叫一个郁闷啊,我太冤了,不就一碗羊肉汤么?幸好,国君逃亡的时候,有两个年轻人扛着武器,拼了命保护他。中山国君一看这两个生面孔,问:“你们谁啊?”
+
+他们二人说,我们兄弟是听从家父之命前来保护您的,以前闹饥荒,我们老爹快饿死了,是您请他吃了一壶熟食,才救了他的命,如今我们来报恩了。
+
+中山君恍然大悟,说了一句:“吾以一杯羊羹亡国,以一壶飨得士二人!”
+
+如此看来,请人吃饭,有时确实至关重要。
+
+### 03
+
+古人请客有很多门道,比如宴席的座位,可表示尊卑主次的顺序。
+
+著名的鸿门宴上,与会人物的座次在《史记》中有详细记载:“项王、项伯东向坐,亚父南向坐,沛公北向坐,张良西向侍。”
+
+在当时,东向坐是最尊之位,项羽是这场酒席的主人,就坐在这一主位,项伯是项羽的叔父,依礼不能坐在低于侄子的座位,于是稍加权变,同向而坐;范增是谋士,被项羽尊称为“亚父”,地位次于项羽,所以朝南而坐。刘邦是前来请罪的客人,就面朝北方而坐,地位低于范增;张良在刘邦帐下,只能坐在西向的位上作陪。
+
+鸿门宴是刘邦与项羽命运中的转折点。
+
+此前,刘邦率领一支义军,率先攻入秦都咸阳。公元前206年,当项羽率领在巨鹿之战取胜的大军到达函谷关时,他发现关中已为刘邦所占,难免有些不爽。
+
+刘邦手下的左司马曹无伤火上浇油,偷偷派人告诉项羽,刘邦想在关中称王,将咸阳的珍宝据为己有。
+
+项羽听说这个消息后大怒,驻军于咸阳城外,对刘邦虎视眈眈。项羽的大军数倍于刘邦的军队,一旦开战,刘邦必败无疑。
+
+通过刘邦手下谋士张良与项羽之叔项伯的游说,刘邦决定亲自到项羽营中解释,这才有了鸿门宴。
+
+虽然项羽听信刘邦可怜巴巴的辩解,摆上酒席表示和好,但他手下的谋士范增一再给项羽丢眼色,让他下决心杀了刘邦。
+
+席间,范增见项羽拿不定主意,就私自找项羽的堂兄弟项庄上前舞剑,让他伺机杀了刘邦。项庄舞剑,吓得刘邦直冒冷汗,幸得项伯也拔剑起舞,多次用身体掩护刘邦。
+
+张良则乘机溜出帐外,找到刘邦手下的猛将樊哙,跟他说宴会形势不妙,赶紧进来保护老大。
+
+樊哙一听,那还得了!
+
+他提着宝剑和盾牌,气冲冲地闯进项羽的军帐中。
+
+樊哙指责项羽说,谁先打败秦军进入咸阳,谁就做关中王,这是楚怀王与诸将事先的约定,何况沛公(刘邦)打进了咸阳,什么东西也没拿,您要是听信小人谗言杀害他,就跟秦王一样无道。
+
+自尊自大的项羽面对樊哙的责备,一时也不知如何回答。
+
+项羽欣赏樊哙的豪气,赐给他一斗酒、一只猪肘子。樊哙因地位较低,在宴席中没有坐席,只能“立而饮之”,之后,把肘子放在盾牌上,蹲下身子,用剑割肉吃,既有豪气,又合时礼。
+
+樊哙闯入鸿门宴后,刘邦总算冷静下来,觥筹交错之间,假装要上厕所,赶紧溜之大吉,从饭局中死里逃生。
+
+项羽本可在请客吃饭时杀掉刘邦,却优柔寡断,错过了这次易如反掌的机会。
+
+事后,范增看着天真的项羽,不得不感慨:“夺项王天下者,必沛公也!”
+
+历史证明,这次失误造成了项羽的终生遗憾。
+
+### 04
+
+然而,刘邦打败项羽,统一天下之后,也在请客吃饭时遇到难题。
+
+刘邦当上皇帝后,一起打天下的弟兄一如既往地把他当老大哥看待。
+
+在这位新皇帝的宴会上,由狗屠樊哙、吹鼓手周勃、布贩灌婴等组成的大汉创业集团成员,借着发酒疯大喊大闹,争论功劳,有人甚至动不动就将刀剑砍在柱子上,给大伙助兴。
+
+皇帝难得请吃饭,可一场宫廷盛宴,办得跟黑帮聚会似的,刘邦很没面子。
+
+于是,刘邦让擅长研究礼法的儒生叔孙通帮他制定一套礼仪,便于约束这帮开国功臣,让他们知道,我刘邦已经不是当年的大哥,而是高高在上的皇帝。
+
+叔孙通接到任务,立马回到儒家的发源地鲁国,找了三十几个儒生,整日排练,采用古礼制成了汉朝皇家宴会的礼仪。
+
+在当年长安城中长乐宫建成的典礼上,群臣按照叔孙通制订的新仪式入宫觐见,面对种种等级森严的规章制度,第一次感受到皇帝的威严,“自诸侯王以下,莫不振恐肃敬”。
+
+此后,朝廷再举办宴会,殿堂上庄严肃穆,文武百官再也无人闹事,刘邦得意洋洋地对左右说:“我今日才知道做皇帝的尊贵啊!”
+
+在中国古代,封建帝王的宫廷宴饮是各类宴饮活动中等级最高的大宴。
+
+除了帝王平时的饮膳外,按照礼制,每逢除夕、元旦、上元、中秋、冬至等重要节日,以及在庆祝帝后寿辰、处理外交、国事等方面都要举办隆重的宴饮。
+
+皇帝请吃饭,往往仪式繁缛,有明显的政治目的,是历朝历代统治者维护国家、巩固统一的手段之一,并随着统治者等级制度的日益森严而成为定制,相沿遵行。
+
+### 05
+
+帝王宴饮在于宣扬皇帝的恩荣与威仪,而文人请客,更多强调一个“雅”字。
+
+在漫长的历史中,古人发明了酒戏,将各种游戏引入宴席,比现在的划拳、摇骰丰富得多。
+
+这其中有考验射术的宴射,有以箭矢投入壶中为胜的投壶,有类似于猜谜游戏的射覆、藏钩,有需要一定文化素养的吟诗、作对、唱曲等各类口头文字令。
+
+不得不提的,还有兰亭会中出现的曲水流觞。
+
+东晋时期,永和九年(353年)三月初三,正逢上巳节,书法家王羲之与谢安等四十余人结伴春游,在绍兴的兰亭聚会,于水边玩起了这个游戏。
+
+他们坐在河渠两旁,将酒杯放入水中,任其顺水而流,停在谁的面前,谁就得喝,除此之外,有时还要吟诗作赋,一觞一咏,可谓风雅典范。
+
+作为这场宴会的主角,王羲之在后世成为风流雅士宴会上的代名词。
+
+相传,王羲之极好吃鹅,因他曾官拜右军将军,后来江南吴中一带的文人,干脆把鹅叫做“右军”。同理的还有被称为“曹公”的梅子,因为曹操有望梅止渴的典故,故有此雅号。
+
+于是,在《梦溪笔谈》中,有一位风雅之士请客吃饭,特意吩咐厨子:“醋浸曹公一瓮,汤炖右军两只,聊备一馔。”不知道这名厨子到底有没有听懂。
+
+### 06
+
+文人请客,不但会玩,还好为雅言,即不好好说话。
+
+北宋初年,有个叫陶谷的文臣,是宋太祖的笔杆子,专门负责起草各种规章制度。
+
+陶谷是个大才子,但他这活儿不过是依样画葫芦,往往只需要把以前的文字稍加修改,交给皇帝一看,就能交差,因此有些人看不起他。
+
+陶谷不服气,也想建功立业,有一年,宋太祖就派他出使南方的吴越国。
+
+当时的吴越王钱俶有意归顺宋朝,听说宋太祖派人前来,赶紧设宴款待,还特意为陶谷准备当地的特产——蒸螃蟹。
+
+吴越一带产蟹,各种品种都有,钱俶为尽地主之谊,命厨师将各种蟹都做了一份。
+
+陶谷作为大宋的使者,自然要在吴越王面前威风一回,见席间呈上的螃蟹先大后小,摆了十几种,就拿这事儿开涮说:“你们可真是,一蟹不如一蟹啊。”
+
+这句话的意思,是嘲讽吴越国日薄西山,一代不如一代。
+
+钱俶气不过,也想办法反将一军,叫来厨子,端上一锅汤。
+
+陶谷看到这锅里绿油油,不禁感到好奇,问一句:“这是什么汤?”
+
+钱俶逮到机会,回答道:“葫芦做的,就叫‘依样画葫芦’。”陶谷瞬间脸色就变了,因为这是人们常调侃他的说法。钱俶总算扳回一城。
+
+### 07
+
+还有一个故事,说是北宋有一任郑州知府,叫李献臣。
+
+有一天,他府上来了个客人,这人是漕运官孙长卿的部下,刚好也在李献臣手下当过差,由于孙长卿要调任河南,就先让这名手下去李献臣处打交道。
+
+李献臣看到老部下来访,似乎也挺高兴,要留他下来吃饭,问他:“餐了未?”这是文绉绉的说法,可能还带点口音。
+
+那个手下听成了“孙来未?”就回答说,我来时,孙大人已经在收拾行李了。
+
+李献臣听着牛头不对马嘴,说:“我是问,你餐了未?”
+
+当时有些地方把打板子叫“餐”,这名手下误解了老领导的意思,只好老实交代:“我以前当差的时候,挨过十三大板。”
+
+这时,李献臣自己都无奈地笑了,说:“我是问你吃饭没有,我要请你吃饭。”
+
+一句“吃了吗”就能搞定的事,愣是问了个有来有回。
+
+### 08
+
+
+请客吃饭,是一大传统,也要讲究礼数。
+
+俗话说:“三天为请,两天为叫,当天为提溜。”
+
+古人请客吃饭,一般三天之前就要送上请帖,发出邀请,而被邀请的客人,也要及时回帖,准时赴宴,方不为失礼,跟现在发个微信定位就叫上三五好友聚餐相比,大不相同。
+
+但是,在明代,有这么一个牛人,敢于打破请客吃饭的规则。
+
+明朝人陈音在南京当官时,官至太常寺卿,生活却过得像个邋遢大王。
+
+有一天,他从单位下班,跟侍从说,你们送我到某友人家。侍从没听清,稀里糊涂地把马牵回了陈府。
+
+陈音一进门,就犯糊涂了,说:“这人怎么装修跟我家一样啊?我家的画怎么挂到他家来了?”
+
+家仆愣在一旁,一脸诧异地说:“老爷,这是咱自己家啊!”
+
+这位大人有一天收拾房间,搜出了一张请柬,上面写着某朋友请他几月几日到家中赴宴。
+
+陈音算算日子,到了那天,前往朋友府上赴宴。朋友见他不打招呼就来,感到莫名其妙。
+
+这时,陈音掏出那张请柬,问朋友:“今天不是你请客吗?”
+
+朋友看了哭笑不得:“兄弟,这张请柬是去年发的啊!”
+
+陈音不仅能搞错别人请客的时间,自己请客也记不住。有一回,他发请柬给朋友,请对方来家吃饭,结果自己把这事儿忘了,当天直奔朋友家,找人家下棋。
+
+到了饭点,家人提醒陈音的朋友:“今天有人请你吃饭,别忘了。”陈音一把拉住朋友的袖子,说:“别走啊,你去吃饭了,我怎么办?”
+
+陈音都忘了,自己就是那个请客的人。
+
+### 09
+
+古人请客宴饮,名目之繁多不胜枚举。
+
+小到婚丧嫁娶、生辰祝寿、年节庆贺、亲朋聚会的民间家宴,大到朝廷因各种国事举办的官宴,如皇帝赐予老人的“千叟宴”、赐予举子的“乡饮宴”、宴请外交使者的“外藩宴”、聚集皇室贵族的“宗室宴”、节日庆典的各种“大宴”等。
+
+一般来说,请客吃饭,是为了增进感情,但官僚士大夫之间宴饮,意义主要在于阿谀奉承、攀结权贵;皇室请客,也不过是为了巩固统治,维系统治阶级内部的团结,尤其是皇家宴饮,往往耗资巨大,极度奢侈浪费。
+
+清光绪二十年(1894年),清廷上下为慈禧太后的六十大寿操碎了心。
+
+为了满足慈禧的虚荣心,清廷提前一年成立庆典处,专门负责此事。慈禧一边对光绪皇帝率领群臣为她祝寿加以首肯,另一边有虚情假意地强调“毋得稍滋糜费”。
+
+但是,在京王公大臣为了拍马屁,将慈禧的寿辰当成压倒一切的头等大事,拨用经费数百万两。
+
+日本人得知清廷为了给慈禧过六十大寿而忙里忙外,更是下决心与清交战( “知今年慈圣庆典,华必忍让” )。
+
+这一年,中日甲午战争爆发后,宫中也曾下令节省开支,支援前线,但直到北洋水师与日军鏖战,从西华门到颐和园的工程仍未停工。最后,北洋水师一败涂地。
+
+此时,朝鲜前线连连告急,慈禧的生日庆典却照常进行,宴请皇帝、嫔妃、王公大臣,让他们伴侍膳,陪看戏,一连庆祝了好几天。史载,慈禧平时的御膳就极为豪华,但是面对几十上百道菜,她依照惯例,只尝几口就撤下,十分铺张浪费。
+
+据户部奏称,此次慈禧六十大寿,各衙门共花费银500多万两,而整个甲午战争中,户部给前线的筹款,还不到庆典支出的一半。
+
+本来是请客吃饭,却成了奢侈腐败的欢愉。
+
+### 10
+
+
+在古往今来的贤士眼中,请客不是为了虚荣,更在于礼与德。
+
+先秦的智者晏婴,是齐景公的宠臣。
+
+有一次,齐景公派一名大臣到晏婴家中办事。晏婴请客人一起用饭,结果饭量根本不够两人吃,晏婴和大臣都没吃饱。
+
+那名大臣回去后告诉了齐景公。齐景公说:“这是我的过错,我竟不知晏子家中这样穷困潦倒。”说完就命人给晏婴送去粮食和金钱,可晏婴不收。
+
+事后,晏婴向齐景公解释道:“我家并不缺少东西。一个大臣拿着国君的赏赐,如果是为百姓办事,那就应该用到该用的地方去,如果拿了这些东西,只是为了据为己有,那等我一死,财产就换了新主人。有头脑的人,谁肯去干这种事呢?”
+
+安贫乐道,才是宝贵品质,也只有能忍贫,善处贫,不屈于贫,才能脱贫致富。
+
+三国时期,孙吴名相步骘[zhì]早年清贫,靠种瓜为生。
+
+有一次,他与朋友去拜访郡中豪族焦矫。焦矫看不起这俩穷小子,自己在卧室里睡觉,过了许久才推开窗户接待他们,并命奴仆在窗户外面摆上了一张简陋的席子,上面只有几盘小青菜,自己却在室内吃着美味佳肴,喝着上等美酒。
+
+步骘的朋友为此大为不满,面露难色,步骘却淡然自若,不以为耻,香香甜甜地吃饱才离去。
+
+回去路上,步骘的友人问他,你为何能忍受如此屈辱?步骘却说:“你我二人本就地位低下,无法要求主人按照贵客的礼仪来接待我们,这有什么值得羞耻的呢?”
+
+后来,步骘在孙吴官至宰相。
+
+### 11
+
+明代的海瑞,在浙江淳安为官的时候常穿布袍、吃粗粮糙米,其清廉世人皆知。
+
+别说请客宴饮,当地人连他吃肉都不信。
+
+有一天,海瑞自己出门,上街买了些肉,立刻上了当地的热搜。大家正纳闷,海瑞为何也吃肉了,后来一打听才知道,那天是海瑞母亲的寿辰,他给老夫人买了二斤肉当生日礼物。
+
+一时的豪奢终将破灭,而饭桌上的礼仪与品德,将成为永恒。
\ No newline at end of file
diff --git "a/_posts/2024-4-26-Github\351\227\256\351\242\230\346\261\207\351\233\206.md" "b/_posts/2024-4-26-Github\351\227\256\351\242\230\346\261\207\351\233\206.md"
new file mode 100644
index 00000000000..6891596a2ca
--- /dev/null
+++ "b/_posts/2024-4-26-Github\351\227\256\351\242\230\346\261\207\351\233\206.md"
@@ -0,0 +1,59 @@
+---
+layout: post
+title: Github问题汇集
+subtitle: 记录Github使用问题解决方案
+date: 2024-04-26
+author: Ajiao
+header-img: img/post-bg-4.jpg
+catalog: true
+tags:
+ - 网络
+---
+### 问题1 No such file or directory
+
+
+
+> fatal: could not read Username for '[https://github.com](https://github.com/)': No such file or directory
+
+编辑~/.gitconfig并添加以下内容:
+
+
+>[url "git@github.com:"]
+insteadOf = [https://github.com/](https://github.com/)
+
+
+---
+### 问题2 Permission denied
+
+出现 git@github.com: Permission denied (publickey)错误解决办法
+
+进入git bash界面然后:
+
+第一步,git config --global --list 验证邮箱与GitHub注册时输入的是否一致(不一致的话会导致出现错误,要更改为与GitHub注册是的用户名与账号)
+
+第二步,通过git config --global user.name “yourname”,
+
+git config --global user.email “email@email.com ”
+
+(这里得名字和邮箱都是注册github时用的)设置全局用户名和邮箱。
+
+第三步,ssh-keygen -t rsa -C “github注册时的邮箱”,一路回车,在出现选择时输入Y,再一路回车直到生成密钥。会在/Users/***/路径下生成一个.ssh文件夹,密钥就存储在其中。
+
+第四步,到git仓库,添加秘钥,点击用户名,点击setting,点击左侧SSH and GPG keys
+
+第五步,ssh -T git@github.com 测试一下通不通,显示成功了就ok。
+
+---
+### 问题3 修改github默认仓库
+
+```
+# 查看远端地址
+git remote -v
+# 查看远端仓库名
+git remote
+# 重新设置远程仓库
+git remote set-url origin https://gitee.com/xx/xx.git (新地址)
+```
+
+最新地址:
+https://gitdl.cn/https://github.com/***/***.github.io.git
\ No newline at end of file
diff --git "a/_posts/2024-4-30-\344\270\255\345\271\264\346\224\271\345\221\275\346\234\200\351\253\230\346\230\216\347\232\204\346\226\271\346\263\225.md" "b/_posts/2024-4-30-\344\270\255\345\271\264\346\224\271\345\221\275\346\234\200\351\253\230\346\230\216\347\232\204\346\226\271\346\263\225.md"
new file mode 100644
index 00000000000..2cc669d58b5
--- /dev/null
+++ "b/_posts/2024-4-30-\344\270\255\345\271\264\346\224\271\345\221\275\346\234\200\351\253\230\346\230\216\347\232\204\346\226\271\346\263\225.md"
@@ -0,0 +1,37 @@
+---
+layout: post
+title: 中年改命最高明的方法
+subtitle: 转自微信公众号《帆书樊登读书》
+date: 2024-04-30
+author: Ajiao
+header-img: img/post-bg-2.jpg
+catalog: true
+tags:
+ - 生活
+---
+在《战安庆》中,作者周䘵丰用曾国藩的中年起伏告诉我们:每个人的中年,都需要一场“突围”。
+## 1.打开心态,才能有效反思
+
+四十三岁以前的曾国藩,已算得上是成功人士,可四十三岁以后的曾国藩,又变得什么都不是。
+
+那一年,他在长沙协办团练,先是得罪了绿营的协副将清德、鲍起豹,继而又得罪了整个湖南官场。不久后,这位皇命在身、能专折奏事的左堂大人,差点被闹事的绿营兵打死,同僚们袖手旁观看他笑话,不得已,他只能远走他乡,另谋出路。你可能要问,作为一名出色的理学家,曾国藩就不会反省一下自己的为人处世之道吗?其实他不是没反思,只不过反思的结果,往往都是别人的错。
+
+年过四十的他,被朱程理学熏陶多年,只觉得自己天理在手,别人都应“屈己从我”。平时他就表现得高人一等,碰壁之后又用“君子小人”这一套去反思,不但不得要领,反而加深了他对同僚的成见,对自我的执着。即使博学如曾国藩,也未能幸免。所以,反思要有效,心态放开很重要。
+
+人在二三十岁的时候,心态是最开放的,无论面对什么观点,都能以包容的心态去倾听、接纳。等年纪渐长,被自己的经验所困,就失去了接纳的耐心,变得喜欢下判断。“他说的不对,他水平不行。”“你不懂,你得听我说。”可能你的经验之谈,在他人眼中不过是随处可见的“大路货”,可能你每次气壮山河的打断,都是别人讨厌、疏远你的理由。
+
+在这方面,我们应该多学学大文豪苏东坡,不同流派、不同阶层的人物,他都愿意结交一二,对新鲜的事物,他也愿意尝试一番。正是因为这样的年轻心态,让他到哪都能交上朋友,混个风生水起。人到中年,最重要的是保持一颗开放和有弹性的心。时刻提醒自己,也许我是错的,然后用欢喜心去改变、去兼容,去找到更多的可能。
+
+## 2.看到他人,才能和光同尘
+
+太平天国稍一消停,四十六岁的曾国藩就被咸丰皇帝撵回了老家。出湘三载,苦战不休,得到的却是上司的猜忌、同僚的中伤,曾国藩真是想死的心都有。一开始,他尽情发泄心中的苦闷,写信骂同僚,与家中子弟吵架,骂够了就在老家屋前静坐。
+
+这段时间,他远离是非,又重新研读“老庄”,才得以用局外人的身份看待这段职场生涯。以前他觉得湖南巡抚骆秉章无能,但骆秉章不仅把湖南财政收入提高了三四倍,还练出了四五万精兵支援各地。他埋怨同僚处处掣肘,但他离开后,剩下的湘军统领如鱼得水,并没有受到排挤。
+
+可见,不是别人一无是处,而是自己骄傲自负。一旦有了这个觉悟,以后为人处世,他总是先找自己的不足,对清高好名之人恭维之,对退让琐屑之人安抚之,对有能力的后辈又鼎力扶持之,不仅全力支持学生李鸿章组建淮军,还把“战安庆”的主要功劳让给了下属胡林翼。
+
+知乎上有一个浏览量超过100万的问题:为什么人到30岁,渐渐发现身边的人都比自己厉害,他们各有千秋,而我自己却像个傻白甜一样活着?
+
+其中点赞量最高的回答是:你能发现身边的人都比你厉害,说明你很容易看到他人的优点,这有利于你向他人学习。同时,也请看到自己的优点,哪怕是自我评价的“傻白甜”,在我看来,换成“心思纯净”更为妥当。
+
+人到中年,对待自己和他人,都应该学着客观一些。既不妄自菲薄,也别揪着别人的短处不放。毕竟自己能力有限,毕竟人人都有优点。所以“挫其锐,解其纷,和其光,同其尘”,把自己融入其中,才是减小阻力的最佳方法。
\ No newline at end of file
diff --git a/_posts/2024-5-10-IDM-Activation-Script.md b/_posts/2024-5-10-IDM-Activation-Script.md
new file mode 100644
index 00000000000..fe77824b9d4
--- /dev/null
+++ b/_posts/2024-5-10-IDM-Activation-Script.md
@@ -0,0 +1,22 @@
+---
+layout: post
+title: IDM-Activation-Script
+subtitle: 一段代码激活IDM
+date: 2024-05-10
+author: Ajiao
+header-img: img/post-bg-3.jpg
+catalog: true
+tags:
+ - 网络
+---
+## 项目地址
+
+https://github.com/WindowsAddict/IDM-Activation-Script
+
+## 激活步骤
+
+- Right-click on the Windows start menu and select PowerShell or Terminal (Not CMD).
+- Copy-paste the below code and press enter
+ `irm https://massgrave.dev/ias | iex`
+- You will see the activation options, follow the on-screen instructions.
+- That's all.
\ No newline at end of file
diff --git "a/_posts/2024-5-16-Obsidian\346\255\243\346\226\207\344\275\277\347\224\250\346\200\235\346\272\220\345\256\213\344\275\223.md" "b/_posts/2024-5-16-Obsidian\346\255\243\346\226\207\344\275\277\347\224\250\346\200\235\346\272\220\345\256\213\344\275\223.md"
new file mode 100644
index 00000000000..0c67d0cbd3b
--- /dev/null
+++ "b/_posts/2024-5-16-Obsidian\346\255\243\346\226\207\344\275\277\347\224\250\346\200\235\346\272\220\345\256\213\344\275\223.md"
@@ -0,0 +1,25 @@
+---
+layout: post
+title: Obsidian正文使用思源宋体
+subtitle: 大爱思源宋体
+date: 2024-05-16
+author: Ajiao
+header-img: img/post-bg-4.jpg
+catalog: true
+tags:
+ - 网络
+---
+
+在**外观设置**中选择**css片段**,具体内容如下:
+
+```
+@import url('https://fonts.loli.net/css2?family=Noto+Serif+SC:wght@500;700&display=swap');.cm-sizer{
+ /* Screen version */
+ font-family:'Georgia', 'Noto Serif SC', serif;
+ font-style:normal;
+ font-size:21px;
+ line-height:35px;
+ font-weight:400;
+ letter-spacing: -1px; /* 设置字母间距为2像素 */
+}
+```
\ No newline at end of file
diff --git "a/_posts/2024-6-5-\345\267\245\344\270\232\347\232\204\351\235\251\345\221\275\351\235\231\346\202\204\346\202\204.md" "b/_posts/2024-6-5-\345\267\245\344\270\232\347\232\204\351\235\251\345\221\275\351\235\231\346\202\204\346\202\204.md"
new file mode 100644
index 00000000000..debf3bcf761
--- /dev/null
+++ "b/_posts/2024-6-5-\345\267\245\344\270\232\347\232\204\351\235\251\345\221\275\351\235\231\346\202\204\346\202\204.md"
@@ -0,0 +1,170 @@
+---
+layout: post
+title: 工业的革命静悄悄
+subtitle: 转自微信公众号《传达室》
+date: 2024-06-05
+author: Ajiao
+header-img: img/post-bg-3.jpg
+catalog: true
+tags:
+ - 学习
+---
+就有一个感受:2023年传闻中的“工业革命”,比以往任何时候来得更多一些:
+
+一个重大的技术发明忽然间横空出世,让我们再吃上几十年经济红利(比如,坩锅里意外烧出的神奇材料)。
+
+搞个大新闻似的“工业革命”版本,符合人民的美好期待。只是,历史的进程发展到今天,传说中新的工业革命或许是另一种版本。它正以静悄悄的方式在发生。
+
+**01**
+
+说这个版本之前,需要先回顾点历史。
+
+时间来到了1978年,那是改革开放的元年。这一年春天,中国向欧洲派出了一个高级别的政府代表团。代表团的成员,大多是国内经济建设战线的专业干部,有知识、有水平。
+
+众所周知,欧洲在三次工业革命中都跑得又早又快,经过几十上百年的技术积累,那里的发达程度让这些干部们感到吃惊。
+
+比如,他们在瑞士伯尔尼附近看到,一个低水头水力发电站,装机容量2.5万千瓦,职工只有区区12人。同时期我国江西省江口水电站,装机容量只多0.1万千瓦,职工却足足有298人。
+
+回国后,代表团的团长向高层汇报了三条意见,其中第一条就包括:
+
+西欧国家的电子技术广泛应用,劳动生产率大大提高。
+
+其实,他们在瑞士看到的,就是第三次工业革命的电子信息技术,和第二次工业革命的发电技术的融合。
+
+当时,中国的发展口号还是“四个现代化”。其中的工业现代化,主要就是对标自动化、信息化,进行从头到脚的技术改造。
+
+后来,在90年代初期,一位领导同志更提出一个观点:
+
+四个现代化,哪一化都离不开信息化。
+
+信息化得到了前所未有的重视。
+
+后来的事情大家都知道了,就是这个信息化,让中国享受了几十年的经济红利。它催生出中国如今规模庞大、引以为傲的数字经济。
+
+这段历史也反映出,中国很早就有一个技术与技术、产业与产业融合发展的意识。
+
+**02**
+
+最近几年有一个新提法:数字经济与实体经济融合发展。
+
+2016年4月19日,在网络安全和信息化工作座谈会上,这个提法首次出现,接下来在许多重要会议上,它也被反复提及。就像“房住不炒”一样,一个新的简写名词出现了:
+
+数实融合。
+
+而数字和实体的融合,恰恰就是目前被普遍认为的,第四次工业革命的标志。
+
+华中科技大学的老校长李培根院士,他是机械制造和自动化的专家。他曾说过一个话:
+
+第四次工业革命,就是数字世界和物理世界的融合。
+
+乍一听,还有点科幻小说的意思。
+
+原本隔行如隔山,“两个世界”就更难说了。那究竟什么叫,数字世界和物理世界的融合?怎么个融合法?
+
+说一个我印象很深的案例。它发生在上海宝山,数字的游戏就跟实锤的钢铁融合了起来。
+
+去年六月,腾讯和宝钢,他们共同发布了一个 “全真互联数字工厂”。
+
+这个“工厂”的原型,是宝钢的1580热轧厂。腾讯利用游戏技术的可交互、高仿真、强沉浸、实时渲染的特性,为工厂构建起了一个“数字副本”。
+
+好比说,1580热轧厂在数字世界里,从此有了一个“孪生兄弟”。
+
+这就是腾讯的数字孪生业务。从一个车间到一座城市,人们可以通过数字孪生,对它们进行远程管理。
+
+以1580热轧厂为例,它的最终完善的“副本”,能实时还原生产现场,实现生产全程的全真互联,诸如产线的运营、检修、甚至高危作业,将可以远程完成。
+
+我对这个案例印象深刻,是因为过去一说起腾讯,就想起微信和游戏。它忽然延伸到了工业,就感觉,有点东西。
+
+这也让人想起一个脍炙人口的概念:工业4.0。
+
+在2013年4月的德国汉诺威工业博览会上,这个概念被正式提出。按德国研究机构的定义,工业4.0主要是CPS(Cyber-Physical Systems)信息物理融合系统为核心。
+
+划重点,还是融合。
+
+有一部纪录片大家可以看看,名字叫《工业传奇》。其中的一集,展现了在德国巴德皮尔蒙特一家经过改造的4.0工厂:
+
+它的车间里有两条产线:一条是看得见的实体铸造产线,还有另一条“看不见的产线”,就是数据的流动:生产的数据精确地呈现给工人,工人能即时调整部署,多品种小批量的产品定制难题得到解决。
+
+类似的例子,国内有没有啊?
+
+除了上述游戏和钢铁的故事,华为和玻璃制造也有一个故事。
+
+信义玻璃,是中国最大的玻璃制造企业,产线多且分散。它的业务数据分散在上百个应用系统中,有点像战国时代 “车不同轨,书不同文”。比如,使用天然气的数据存在混乱,使得在做整体能耗优化的时无从入手。
+
+通过实施华为的数字化解决方案后,数据实现了透明可视。基于数据和数字模型,天然气能耗大幅降低,每年可以节约3-4个“小目标”。
+
+融合是真的香。
+
+**03**
+
+前三次工业革命是在事后被定义。新的工业革命则是“正在被发生,正在被定义”。
+
+与四十多年前不同,这一轮工业革命中国一直在试图抢占先机。其中的一条路径,或者说一条捷径,就是“数实融合”。
+
+搞数实融合,中国有这个优势:一个是完备的工业体系,再一个,就是茁壮的数字经济。
+
+2022年,中国的数字经济规模50.2万亿元,同比增长10.3%,在GDP中的占比有41.5%。腾讯、华为、阿里这些企业,都能达到了5000亿以上的年营收。
+
+规模是一个,这些企业的研发实力也是很重要的。
+
+有一项统计,2022年科研投入前五的互联网公司,腾讯、阿里、百度、美团、蚂蚁,共计投了1813.81亿元,相当于冰岛一个国家当年GDP总量。
+
+其中以腾讯的科研投入为例,2018年到今年上半年累计超过2360亿元,今年二季度就达到160亿元。
+
+持续高研发投入,使得专利数增长很快。截至今年6月,腾讯在全球主要国家和地区专利申请公开总数超过6.6万件,专利授权数超过3.3万件,主要集中在人工智能、云技术、大出行、即时通讯等前沿领域。
+
+这就意味着,像腾讯这样的企业,已经形成了比较强的“科技产能”。这些产能总不能完全在企业内部和在固有业务中消化,它需要对外输出。
+
+输出的方向,一个是海外。
+
+在非洲,腾讯云帮助当地最大的音乐流媒体平台Boomplay,突破了当地糟糕的网络基础设施局限,用更少的流量解决了音质优化和降噪处理难题。腾讯的支付、游戏等业务,也逐渐扬帆出海。
+
+同时,阿里巴巴、拼多多等诸多中国互联网企业的代表,在海外也是有声有色。
+
+输出的另一个方向,就是上面提到的,跨过行业的界限,与实体相融合。以前就搞互联网,现在例如腾讯已经和30多个行业合作,一起融合。
+
+传统的制造业,就更需要数字化的拥抱了。
+
+我们拿机械铸造业举例好了。
+
+目前,全世界一半以上的机械铸造企业,还是电气时代传统的生产模式。车间还要靠人工操作的天车运输,一些工艺环节也还要靠人工敲打,存在污染和安全隐患。
+
+如果像上面图中的这些车间,全部借助数字技术完成智能化改造,这又将创造多少需求,产生多少GDP。
+
+这不算工业革命?
+
+他们两者产生化学反应的价值,比坩锅里炼金高到哪里去了。
+
+因此,现在说的数实融合,跟过去有重大不同。
+
+过去二十年,中国的数字经济的发展主要在消费、社交、娱乐等领域,即面向C端;而数实融合的概念,引导数字技术逐渐由消费断延伸到生产端,从C端进入到B端。经济学者刘世锦先生就认为:
+
+如果说消费和流通领域的数字化只是序幕的话,生产领域的数字化才是数字经济发展的主战场。
+
+**04**
+
+眼下,中国的车间、矿场、城乡的数实融合,正在发生。
+
+只是由于大多发生在生产端,我们普通市民的直观感受不深。
+
+华南的一些印制电路板工厂,采用了百度智能云的智能质检,电路板质检的效率和精度大大提高。山西的煤矿,中国联通的5G煤矿专网覆盖到井下,工人因此能从容地远程操控井下切割机。
+
+在重装备制造车间,三一重工联手了腾讯等创建“根云”工业互联网平台,使维修效率大幅提升。在码头,宁波舟山港基于阿里巴巴提供技术服务,研制的码头操作系统,实现了智能化管理。
+
+数实融合,推动了实体经济的升级,助力了高质量发展,也让数字企业找到了新的发力点。
+
+要观察这个点,我觉得有个方式,就是观察那些数字经济巨头的财报。
+
+比如,今天腾讯刚刚发布的财报就显示,今年二季度,代表腾讯“数实经济”的金融科技和企业服务收入,同比增长15%,至486.4亿元,是本季业绩收入贡献最大板块。
+
+而且,这已经是该板块连续九个季度,在总营收占比超过30%。
+
+在这一场“数实融合”的浪潮中,实体经济得到赋能。而像腾讯这样的企业,也从以往的互联网连接器,逐渐进化为以技术为驱动的高科技企业。
+
+**05**
+
+历史的经验告诉我们,重大的技术发明可以引发工业革命,但技术间的相互赋能,往往也能催生新的产业红利。
+
+这同样是值得期待的。
+
+我们希望的横空出世,往往正在悄无声息。
\ No newline at end of file
diff --git "a/_posts/2024-7-1-\345\205\213\346\213\211\347\216\233\344\276\235\351\202\243\344\272\233\344\272\213\345\204\277.md" "b/_posts/2024-7-1-\345\205\213\346\213\211\347\216\233\344\276\235\351\202\243\344\272\233\344\272\213\345\204\277.md"
new file mode 100644
index 00000000000..97e9e9446b8
--- /dev/null
+++ "b/_posts/2024-7-1-\345\205\213\346\213\211\347\216\233\344\276\235\351\202\243\344\272\233\344\272\213\345\204\277.md"
@@ -0,0 +1,38 @@
+---
+layout: post
+title: 克拉玛依那些事儿
+subtitle: 大学同学手笔,文笔极佳,值得收藏。
+date: 2024-07-01
+author: Ajiao
+header-img: img/post-bg-2.jpg
+catalog: true
+tags:
+ - 生活
+---
+离开克拉玛依已经5年了,早已忘记当年的人和事。曾今为之痛苦、辛劳、恐惧、欣喜、狂热的事物都已远去了。偶尔看看当年的照片,忆起当年的我,怀念如何走到此时此地的经历,仍让我唏嘘感叹不已。我看着手中的纹路,知道有一道是在那时刻下的。我感受脉搏的跳动,想起曾在那里度过了一段激情飞扬的青春时光,值得我永远铭记于心。
+
+来到克拉玛依,出于偶然,也是必然。我大学学的化工专业,但成绩极差,去大型国企没有希望,只好退而求其次的来到克拉玛依,进入一家化工厂做倒班工人。开始的境遇极佳,一进厂便提拔为班长,月薪四、五千,福利待遇极好。每天仅仅是培训,无工作压力,休息比上班多。我感慨自己得到命运的垂青,每日便与同事抽烟、喝酒、打牌、玩网游打发日子,时光飞快的逝去。
+
+就像地狱的大门用天堂来做广告一样,半年后我便知道了等待我的究竟是何种命运。工厂开工,连续上班90天不休息,每天工作16个小时。连续30天,我全身穿着防护服,带着防护眼镜和口罩,钻进到高达二层楼的反应器入口处除锈,浑身没有一处不是沾满铁锈,瘙痒异常。瘦弱的我,时常扛着十几公斤的扳手和榔头拆卸几百公斤的阀门,徒手爬上五十米的高塔和在五米高的管架上健步如飞已成家常便饭。
+
+辛劳还是其次,最痛苦的便是倒班。每天的睡眠时间都不同,睡眠质量江河日下。休息时凌晨六点仍然睁大眼睛,毫无睡意。夜班时凌晨六点头疼欲裂,眼皮似有千斤重担一样不自觉的耷拉下来,每一秒钟都是煎熬。冬天的每个夜班都要在零下30度的严寒中用蒸汽吹开冻结的管线,还要清除蒸汽凝固的厚达30公分的寒冰。时常在一夜未合眼的情形下,继续工作4个小时,直到身体被疲惫、寒冷、饥饿、瞌睡完全打垮才算罢休。
+
+危险也如幽灵一般如影随形,准备随时夺取我的健康甚至生命。一天中午休息期间,30吨高达180度的熔盐如火山爆发般喷出,方圆50米积下厚厚的固体熔盐,所幸周围无人工作。我亲眼看见一位安全员,被熔盐烫的双腿的肌肉块块剥离,脚筋烫断,日夜呻吟。我的一位同学,被酸酐喷到脸上,整个面部烧伤,几乎毁容。我经常去处理溢出的酸酐,即使带着防毒面具,眼、鼻、耳、喉依然红肿、疼痛。有一次,高达1200度的焚烧炉开关失控,即将爆炸,车间命令我去关进气阀,整个炉体已被燃烧的出现裂缝。我怀着无比的恐惧登上炉顶,心想也许今天我就要在此命丧黄泉,但男人的责任感促使我去完成这一危险的使命。
+
+我终于知道了生活的本来面目,他像严父一般给我这个天真的孩子一记响亮的耳光,把我折磨的七荤八素。在这种情况下,我并没有沉沦,反倒越发坚强。我开始思索自己的人生,努力担起家庭的重担,寻找突破的途径。我决定通过考公务员离开这个地狱,在工作之余的所有时间都用来复习准备考试。上班时我拿着笔记本跑到无人的地方如饥似渴的背书,下班了我便独自来到图书馆,学习到闭馆为止。每天学习八小时,持续了一年。尽管公务员工作也是另一个陷阱,不足有丝毫可夸耀之处。但当年的勤奋、上进的经历让我觉得,我的青春也奋斗过、激荡过,是一笔值得珍惜的财富。
+
+家人的陪伴为我提供源源不绝的动力。为供我上大学,家人四处漂泊,流浪打工,四年居无定所。来到克拉玛依不久,我便租了套房子,将家人全部接到克拉玛依。爸爸在工厂打零工,妈妈给同事家带孩子,妹妹在市里卖化妆品。一家人虽然住在临时的简陋的家中,收入并不丰厚,但久久没有享受的家庭的温暖还是将我们紧紧的包围。我骄傲的将工资全部交给妈妈,用于生活开支和还家里欠的帐。我终于长大成人,用自己的血汗钱孝敬父母,没有比这更自豪的事了。工作虽然苦,生活却特别有滋味。每天和家人吃着热腾腾的的饭菜,晚饭后与家人散步,都成为我记忆中最温暖的回忆。随着我考上公务员来到博乐,家人又四处分离,但家人重新团聚的渴望始终激励着我不断努力。
+
+在克拉玛依朋友很多,但知己寥寥无几,大多数人随波逐流,沉沦到烟酒、赌博、按摩房中,低级庸俗的生活着。我却通过乒乓球找到了两个好朋友——范师傅和魏哥。范师傅是个居家好男人,酷爱做饭。魏哥来自河南,长年跟随公司在这里做项目,写的一手好字和好文章。我们三个经历不同的男人因为乒乓球而结识。几乎每天晚上,我们相约在球馆较量球技,挥汗如雨。打完球后又到夜市上吃烧烤,喝啤酒,兴高采烈的天南地北的胡侃,快活似神仙。聊工作,聊乒乓球,聊经历,聊国家大事。孤独的我有了友情的滋养,变得丰富和乐观,乒乓球和球友成为我重要的精神支柱。好景不长,短短三年的光景,我们为了生活又各自东奔西走,相聚遥遥无期。但当年在明朗的月光下,窸窣的树林中,我们三个人打完球后坐在凉亭里纳凉畅聊的情景,仍不时在梦中映现。
+
+2009年8月,我的公务员考试已通过笔试,即将离开克拉玛依,无甚牵挂,去意已决。然而故事并没有以喜剧轻易结束,而是用一场宏大悲剧作为结局,为这场故事涂上了浓墨重彩的点睛之笔。
+
+我答应为一位同事做伴郎,应邀参加他婚礼前的筹备晚宴。席间一位女孩让我惊为天人,她是那样的美丽端庄,举止优雅得体,谈吐落落大方。她便是新娘的亲戚、婚礼的伴娘。经过后来的了解,她来自甘肃,高中毕业后投奔亲戚来克拉玛依工作,好学上进,年纪轻轻便做到公司中层干部。她的追求者如过江之鲫,但都是碌碌无为之辈,俱被她拒绝。她始终甘于寂寞,守身如玉。她像兰花,盛开绽放整个天空;她像莲花,在物欲横流的世界超然独立;她像罂粟花,使人不计后果狂热的痴迷;又像玫瑰花,香气袭人却又不断刺伤妄图一亲芳泽的狂徒。
+
+美丽又纯洁的女孩仿佛鬼魂,谁都听说过,但没有人见过。克拉玛依以石油暴富和奇缺女人而闻名,女孩根本不会看上我这样的外乡人,对此我早已不做奢望。但是遇见她,刹那间让我沉寂多年的情感像老房子失火一样爆发,一发不可收拾。我开始埋怨命运开的这个玩笑,为我提供难以抉择的两条路。一个是离开,踏上“辉煌”的前途,脱离苦海,去做光宗耀祖的公务员;另一个是留下,去争取一位举世无双的奇女子的青睐。她的态度便成为我去留的关键。我不断的和她联系,她似乎对我并没有好感,而我的热情却与日俱增,像绝望的汉姆莱特一样整日魂不守舍,亦狂亦颠。每天半夜在忧伤中醒来,“对闲窗畔,停灯向晓,抱影无眠”。
+
+终于,我踏上了汽车,独自来到博乐参加面试,向未知的命运挑战。整整十五天,我住在宾馆,除了吃饭、睡觉,便是不停的写,仿佛自知不久于人世的绝症患者一样诉说对这个世界的眷恋喜爱之情。愤懑、无奈、恐惧、焦虑几乎将我击垮。所幸我不负重托,顺利通过面试,带着一身疲倦和两本日记回到了克拉玛依。结局是残酷的,她对我这个痴迷的傻小子没有一丝好感,断然拒绝了我的痴心妄想。为表歉意,她为我送行。在离别的电梯里,她走在我前面,我看着她乌黑的披肩发,心想这便是此生的永别,不觉泪水夺眶而出。我永远的走了,她也嫁了人,生了孩子,已为人妇人母。我也找到了情投意合的另一半,过着舒心欢畅的小日子。
+
+我已不再是原来那个我,她还会是那个她吗?每当我偶尔想起她,都会为她默默祈祷祝福,愿她永远被平静温馨的暖流包围着。现在回想起来,这一生遇到的人和事,大多都不重要,极少几个刻骨铭心的人,使我变得崇高和丰富。终有一天我会灰飞烟灭,为这个世界留下的回忆也能久些、深些、远些。我不因分别而痛哭流涕,却为相逢感激涕零。今天,我走在属于自己命定的道路上,过着庸俗、平凡的生活,却有着不后悔的美丽心情。
+
+至此,我在克拉玛依的故事已全部结束。时常像品尝陈年美酒一样痴迷的回味,挖掘记忆深处的克拉玛依。苦的已变为清醇,甜的更是馥馥吐香。那里的工作让我坚强,那里的奋斗促我成长,那里的情谊给我慰藉,那里的痴情让我疯狂。只是,我久已不在那里,不知是否还会有人亲切的回忆我的过去,我曾住过的窗口,是否还会有人默默的倾听……
diff --git "a/_posts/2024-7-11-\345\234\250\344\270\203\346\234\210.md" "b/_posts/2024-7-11-\345\234\250\344\270\203\346\234\210.md"
new file mode 100644
index 00000000000..0d0a859c140
--- /dev/null
+++ "b/_posts/2024-7-11-\345\234\250\344\270\203\346\234\210.md"
@@ -0,0 +1,38 @@
+---
+layout: post
+title: 在七月
+subtitle: 转自微信公众号《这位婧公子》
+date: 2024-07-11
+author: Ajiao
+header-img: img/post-bg-2.jpg
+catalog: true
+tags:
+ - 生活
+---
+七月,从隔壁院子里伸过来枣树的枝丫已经垂下脑袋。
+
+圆滚滚的小枣子们,透过叶子的缝隙迫不及待地向外张望。
+
+哥哥搬来长长的梯子,姐姐和我捧着篮子在树下接枣子。
+
+哥哥摇一下枝丫,枣子们就欢蹦乱跳地跳到我们的篮子里。更多的枣子一头扎到地上。
+
+如果是好的,姐姐和我就让它们和篮子里的家伙们会面。如果不好,就由着它们赖在地上,日复一日,成为土壤新的养分。
+
+七月,夜晚的星光实在亮眼。舅舅家村头放的电视剧也实在勾人。
+
+于是,在星星还没来得及镶嵌在夜幕的时候,我和姐姐,还有弟弟,去村头的电视机前报道。
+
+即使,蓉儿和靖哥哥相遇了无数次,过儿和姑姑被全真教围攻也演了几百遍。依然乐此不疲。
+
+等到天空从蓝色变成黑色,星星们也闪烁起来。我们就在门口铺上一张大大的凉席。
+
+地是我们的床,天是我们的被。星星们就是被子上绣的花。真美。
+
+七月,外婆总会收获一屋子的孩子。大的,小的,乖巧的,搞怪的……
+
+外婆喜欢看我们蹦跳,就像院里的枣子“嘣嘣、嘣、嘣嘣、嘣……”掉在地上又弹向天。我们越闹,外婆的眉眼和嘴角越往上弯。
+
+我们喜欢和外婆捉迷藏,蹦到地上的枣子们又呼啦啦全都躲在了门后面。外婆喊得越紧,我们笑得越欢。
+
+七月。今年的七月里,再也没有枣子和星星,也没有了外婆。
\ No newline at end of file
diff --git "a/_posts/2024-7-17-5\357\274\2322\350\275\273\346\226\255\351\243\237\342\200\234\347\226\227\346\225\210\342\200\235\350\266\205\350\266\212\344\272\214\347\224\262\345\217\214\350\203\215\357\274\201.md" "b/_posts/2024-7-17-5\357\274\2322\350\275\273\346\226\255\351\243\237\342\200\234\347\226\227\346\225\210\342\200\235\350\266\205\350\266\212\344\272\214\347\224\262\345\217\214\350\203\215\357\274\201.md"
new file mode 100644
index 00000000000..97ae1de9357
--- /dev/null
+++ "b/_posts/2024-7-17-5\357\274\2322\350\275\273\346\226\255\351\243\237\342\200\234\347\226\227\346\225\210\342\200\235\350\266\205\350\266\212\344\272\214\347\224\262\345\217\214\350\203\215\357\274\201.md"
@@ -0,0 +1,70 @@
+---
+layout: post
+title: 5:2轻断食“疗效”超越二甲双胍!
+subtitle: 转自微信公众号《梅斯医学》
+date: 2024-08-07
+author: Ajiao
+header-img: img/post-bg-2.jpg
+catalog: true
+tags:
+ - 生活
+---
+近20年来,最火爆、最受追捧的减肥方法莫过于「轻断食」——16+8轻断食、5:2轻断食、隔天轻断食法等等,层出不穷,令人眼花缭乱。
+
+轻断食的学名为“间歇性禁食(Intermittent Fasting, IF)”,是一种交替进食和延长禁食的做法。简单来说,就是在某个时间段内正常地进食食物,而在剩余的时间内几乎不吃。
+
+这种减肥法相对简单,不需要严格地控制每餐摄入的能量,更多是关注进食时间,比如:24小时的进食时间控制在4-12小时内不等。具体分类方法如下:
+
+➤隔日断食方案(ADF):一天进食,一天不吃或少吃,热量控制在0-500kcal,比较极端的在断食日只喝水和无糖咖啡、茶;
+
+➤5:2方案(The 5:2 diet):每周5天进食,2天为断食日,断食日热量摄入限制在500-1000kcal;
+
+➤16:8方案(限时进食,TRF):一天中16小时禁食,8小时进食,进食期间热量不限。
+
+除了关注最多的“16:8轻断食”之外,5+2方案同样受到了广泛的追捧。
+
+相比于ADF的“难坚持”以及16:8的“可能根本没有热量缺口”,每周选2天进行严格热量限制而其余5天正常饮食的方案,不仅能创造出适宜的热量缺口,还比较容易实践和坚持。
+
+先前开展的临床试验显示,坚持1年的5:2轻断食法,使得参与者的体重减轻了5-6.8kg,减肥效果那是“杠杠的”。
+
+近日,来自北京医院·国家老年医学中心的郭立新及其团队再一次为“5+2间歇性禁食”的饮食模式正名,其效果甚至远超常见的2型糖尿病的治疗药物!具体来说,5+2饮食法能够在短期内改善血糖和减轻体重,16周的治疗后体重约降低9.7kg,超越了二甲双胍和恩格列净。
+
+是药三分毒,仅仅改变饮食模式就有如此喜人的效果,一周少吃2天又何妨?
+
+研究者从一项随机、开放标签的对照临床试验EARLY队列中招募到405名新诊断(1年内)的2型糖尿病患者,且他们在过去3个月内没有使用过抗糖尿病药物。按照随机化方法,所有的参与者被按照1:1:1的比例分配到接受二甲双胍组、恩格列净组或5+2间歇性禁食饮食方案组,持续16周。
+
+135人被归入5:2代餐组(5:2MR)。这组参与者被要求在1周内非连续的2天进行“热量限制”,女性和男性的每日能量摄入量分别为500kcal和600kcal;其余5天内,参与者可以自由选择早午餐,但是晚餐只能吃一份代餐。
+
+另有134人被分配到二甲双胍组。患者需要每日服用2次二甲双胍,初始药物剂量耐受性良好的话,药物用量会从0.5g升级到2g。
+
+剩余的136人属于恩格列净组。该组参与者每天服用一次10mg的恩格列净。
+
+对比发现,在16周治疗后,5:2MR组患者的HbA1c水平出现最大幅度的下降,降低了1.9%,远超二甲双胍组的0.3%和恩格列净组的0.4%。不过,两个药物治疗组之间没有差异。
+
+根据美国糖尿病协会提出的观念,在开始生活方式干预后的至少6个月内HbA1c低于6.5%,意味着“糖尿病得到缓解”。而在本项研究中,80.0%的患者在16周的5:2MR干预后实现了这一目标;在继续8周的随访后,仍有76.6%的参与者的HbA1c水平低于6.5%。由此可见,5:2MR饮食法能够可持续地改善早期2型糖尿病患者的HbA1c水平。
+
+不仅如此,坚持采用5+2间歇性禁食的饮食模式,还能有效降低患者的空腹血浆葡萄糖水平,使其下降了30.3 mg/dL。
+
+当然,除了改善血糖控制情况外,5+2间歇性禁食法还带来了“可视化”的好处,比如患者的体重显著下降,腰围和臀围的缩小,以及部分代谢指标的提升。
+
+具体来说,16周治疗后,5:2MR组的患者体重减轻了9.7kg,远远超过了二甲双胍组的4.2kg和恩格列净组的3.9kg。此外,5:2MR组中“体重成功减轻”的比例也更高。
+
+好消息是,与接受药物治疗的患者相比,5:2MR组不仅成功减重,患者的体型也得到了一定改善,比如:腰围和臀围显著下降。同样,部分代谢指标有所好转,像收缩压和舒张压水平降低,甘油三酯和高密度脂蛋白胆固醇得到了明显改善。
+
+那么,5:2禁食法是否安全?真的不会饿得“头晕眼花”而坚持不下去?
+
+在分配到5:2MR组的135人中,1名患者出现了便秘,8人(5.9%)出现了低血糖的症状,可能与低能量饮食有关。
+
+不过,该比例与常用药物治疗组几乎一致——服用二甲双胍的134人中,有8人(6.0%)出现了低血糖,但有26人出现了轻微的胃肠道症状;恩格列净组的136人中有5人(3.7%)出现了低血糖,是三组中占比最低的,但有3名患者报告了泌尿系统症状,以及2人出现严重不良事件。
+
+研究者解释道,先前动物研究显示,糖尿病小鼠禁食期间,体内的炎症因子表达有所下调,从而缓解了炎症。也就是说,坚持5:2MR能够重塑肠道微生物群,促进白色脂肪组织褐变,进而减少胰岛素抵抗和肥胖的发生。
+
+综上所述,与2种抗糖尿病的药物相比,为期16周的5:2MR干预能够明显新诊断的2型糖尿病患者的血糖控制和减重情况。事实上,2020年中国指南建议,生活方式干预是2型糖尿病的基础治疗方式;只有在生活方式干预无法实现控制血糖之后,才需要开启药物治疗。
+
+当然,体重减轻以及改善代谢只是最基础的好处,5:2间歇性禁食方案还能带来诸多健康好处,比如:护肝和护脑。
+
+Cell Metabolism接连刊登了两项研究。第一篇揭示,坚持5:2饮食方案能够预防和改善非酒精性脂肪性肝炎(NASH)以及肝脏纤维化,阻止肝细胞癌(HCC)的发展。从机制上看,PPARα和PCK1是关键靶点,或为药物研发提供思路。
+
+第二篇则探究了5:2间歇性禁食法对老年人大脑的影响,发现:该饮食法能有效减缓大脑衰老,改善老年人的记忆力和执行功能,同时代谢指标也得到了改善。
+
+如果你在坚持16:8轻断食法,但发现一直不掉秤?不如换成5:2,说不定就打破平台期了!
\ No newline at end of file
diff --git "a/_posts/2024-8-15-\351\273\204\345\245\207\345\270\206\357\274\232\346\226\260\350\264\250\347\224\237\344\272\247\345\212\233\347\232\204\351\200\273\350\276\221\345\206\205\346\266\265\344\270\216\345\256\236\346\226\275\350\267\257\345\276\204.md" "b/_posts/2024-8-15-\351\273\204\345\245\207\345\270\206\357\274\232\346\226\260\350\264\250\347\224\237\344\272\247\345\212\233\347\232\204\351\200\273\350\276\221\345\206\205\346\266\265\344\270\216\345\256\236\346\226\275\350\267\257\345\276\204.md"
new file mode 100644
index 00000000000..4b8b81f44a2
--- /dev/null
+++ "b/_posts/2024-8-15-\351\273\204\345\245\207\345\270\206\357\274\232\346\226\260\350\264\250\347\224\237\344\272\247\345\212\233\347\232\204\351\200\273\350\276\221\345\206\205\346\266\265\344\270\216\345\256\236\346\226\275\350\267\257\345\276\204.md"
@@ -0,0 +1,272 @@
+---
+layout: post
+title: 黄奇帆:新质生产力的逻辑内涵与实施路径
+subtitle: 中共广东省委党校主办《岭南学刊》杂志2024年第3期特稿
+date: 2024-08-15
+author: Ajiao
+header-img: img/post-bg-1.jpg
+catalog: true
+tags:
+ - 工作
+---
+很高兴来广东省委党校,就学习习近平总书记关于新质生产力的重要论述,和党校2024年春季主体班的学员作一沟通交流,谈一谈我的认识和体会。
+
+2023年9月,习近平总书记在黑龙江考察时提出,要“整合科技创新资源,引领发展战略性新兴产业和未来产业,加快形成新质生产力。”2024年1月,习近平总书记在中央政治局集体学习时发表重要讲话,对新质生产力的理论内涵、发展要求进行了系统阐述。习近平总书记强调,“高质量发展需要新的生产力理论来指导。新质生产力是创新起主导作用,摆脱传统经济增长方式、生产力发展路径,具有高科技、高效能、高质量特征,符合新发展理念的先进生产力质态。它由技术革命性突破、生产要素创新性配置、产业深度转型升级而催生,以劳动者、劳动资料、劳动对象及其优化组合的跃升为基本内涵,以全要素生产率大幅提升为核心标志,特点是创新,关键在质优,本质是先进生产力。”习近平总书记关于新质生产力的精辟论述,是习近平经济思想的重要发展,为我们理解新质生产力的底层逻辑提供了重要指南。我今天在这里从五个方面来谈我的认识与体会:
+
+第一,从逻辑内涵的角度,发展新质生产力是当下中国高质量发展的内在选择、必然选择;第二,从科技创新的角度,发展新质生产力要重点围绕“五大板块”、注重“五大创新”、抓好“五大件”等三个关键环节;第三,从生产性服务业的角度,随着生产力的不断发展,社会分工不断细化,产生各种服务业,与高质量的制造业强相关的生产性服务业是发展新质生产力的生态、环境和土壤;第四,从企业运行和产业组织的角度,随着技术和分工的发展,新质生产力所对应的企业运行方式和产业组织体系也会发生深刻变化;第五,从生产关系的角度,一定的生产力配置相适应的生产关系,对发展新质生产力匹配的社会基础性变革又有相应的制度要求。
+
+# 第一部分 新质生产力是当下中国高质量发展的内在选择、必然选择
+
+新质生产力不是一般的经济增长,而是摆脱了传统生产力发展路径的增长跃迁,是实现中国式现代化的重要物质技术基础。
+
+理论上,一国经济增长和生产力发展本质上是一个经济剩余逐步积累的过程。一般有四种途径:一是通过持续的要素投入,如通过资本投入、劳动力增加和自然资源的开发利用,使得生产超过消费,产生剩余和积累。二是通过国际经济合作,比如在国际贸易中形成净出口或者引进国际投资来促进经济增长。三是通过对外武力征伐、殖民等,掠夺他国的资源和财富。四是通过科技进步和优化资源要素配置,提高全要素生产率,进而促进经济增长。
+
+对于第一种路径,在历史上推动了世界许多地区的经济发展,但也带来了资源枯竭、环境破坏和不平等等问题。中国过去的经济增长在很大程度上也得益于这种要素投入型的增长模式,但近年来随着资金、土地、劳动力等要素价格持续上涨,比较优势不再显著。而且长期形成的靠房地产、基建等投资拉动、债务驱动为主的增长模式也日益难以为继。
+
+1980年的时候,中国10亿人口,人均GDP200美元,大体上是2000亿美元总量的一个国家,占全球GDP比重只有1%,相当于欧洲小国家荷兰的经济规模。经过40年的改革开放,2020年GDP达到了18万亿美元,相比1980年的GDP增长了90倍。对中国来说,在这四十年的伟大进程中,通过大规模的基建建设、产业投资、城市的房地产开发,以及其他各个方面的经济发展,中国已成为世界第二大经济体,应该说是一个巨大的举世瞩目的历史性跨越和重大成就。
+
+这个发展一方面得益于三大红利。第一是当时我国有10亿的人口,具有低成本的劳动力的比较优势,也就是人口红利。第二是我国改革开放的基础性制度供给,形成了改革的制度红利。第三个是我国融入了全球化,就有一个全球化的红利。这三大红利推动我国长足发展、加速度发展。另一方面,从生产力要素投入角度讲,这也是我国40年大量的资源投入、资金资本投入以及劳动力投入产生的成果。到了目前这样的状态,我国能不能还按照过去40年大规模的资源投入、资金资本的投入或者劳动力投入来推动今后几十年继续高速或者持续地发展呢?显然出现了三个不可持续的问题。
+
+从资源要素投入来说,2023年我国GDP是126万亿人民币,大体上消耗了地球各种资源量的50%。全世界190多个国家,从地球内部挖掘各种矿物质原料,比如铁矿石或者煤炭,或者石油,或者天然气,或者各种做水泥用的石灰石,或者还有其他的各种矿石等等。总之,地球上目前每年采掘各种矿产资源总计约240亿吨左右,我国差不多要用120多亿吨,大体用了全球资源的50%。我国的GDP大致是全球的20%左右,我国的工业规模和进出口贸易分别是全球的30%左右。总之,我国以全球20%—30%的产出规模,消耗了全球地下资源的50%,如果我国按这个比例继续下去,再过个二十年,如果我国GDP翻了一番,是不是就把地球资源全部包下来了呢?GDP翻番,资源还要翻番,显然是不可能的。
+
+对于中国的经济来说,工业生产源头减量,从源头上降低资源消耗量;节能减排从源头上降低单位能源消耗的力度、减少碳排放是十分重要的、十分关键的,是我国持续发展的必由之路,这在我国“十四五”规划和2035年远景目标要求里面有充分的体现。中央政府明确提出,到2035年中国GDP的单位能耗要从现在全球单位能耗平均值的150%降到全球平均值;我国现在的单位能耗是全球发达国家的单位能耗的两倍,到2050年,要降到全球发达国家单位能耗的平均值等等,总之要源头减量、节能减排。如果继续按过去40年的投入方式推进,是不可持续的。
+
+从资金资本要素的投入来说,中国的经济在1980年以前是计划经济,计划经济跟市场经济相比,流通中的货币使用量相对较低,市场经济则需要增加货币流通来做润滑剂,促进各种资源优化配置。这几十年我国货币M2的增长幅度是令人震惊的,2023年年底或者2024年年初,大体上M2的货币量已经突破了300万亿。我国从20世纪40年代后期开始发行人民币以来,用了63年,到2013年M2达到了100万亿,第二个100万亿用了7年左右,第三个100万亿就是2020年到现在,用了4年左右。中国的货币发行越来越快,资金量也累积到非常巨大。
+
+总之,在十几年前,我国如果一年增加几千亿的M2,年度经济增长速度就可能增长两三个百分点,物价、房价或者股市的价格也会有波动。到了这两年,我国一年增加20万亿的M2,股市好像也没动,房市价格也不起来,商品价格好像也不敏感。商业银行里面有巨额的资金,这么多的M2是通货膨胀了吗?看着货币量好像应该是通货膨胀,但是看市场没有反应,反而感觉像通货收缩。目前这个资金对市场不敏感,都存在银行里不出来,市场没发生周转,没进股市,没进房市,也没进老百姓的口袋去消费。在这个意义上,当下中国如果还是像过去10年靠增加货币,通过增加货币来刺激经济发展,已经不能持续了,货币投放的边际效应、调控的敏感度已经大大降低了。
+
+从劳动力要素投入来说,我国1950年6亿人口,经过30年到1980年是10亿人口,近40年我国增加了4亿人口,变成14亿人口。1950年代平均每年出生人口1780万,1960年代是2400万,2000年代是1800万,2010年代是1600万,2020年出生人口已降到1200万,2023年只出生了902万,人口出生的下降趋势非常明显,下降速度也非常快。1950年代出生的人到2010年代基本全部退休,1960年代出生的人从2020年开始进入退休,而现在我国新成长的年轻人就业人群都将是1990年、2000年以后出生的,大体上每年上岗、退休人数相比会减少几百万劳动力就业人群,中国无限供给的低成本劳动力比较优势进入了拐点。
+
+现在我国人口基数也进入了拐点,我国绝对的总人口现在14亿多一点,再过个30年,到2050年以后完全可能降到12亿或者11.5亿等等,人口规模在趋降。整个人口也在走向深度老龄化,现在60岁以上的已经占整个人群数的20%了,我印象中5年前是18%,现在已经到了20%,再过十几年60岁以上人群将达到30%以上,形成深度老龄化的社会。
+
+总之,再靠劳动力要素无限投入,推动经济高速增长的可能性已经降低了。所以我讲全球经济发展中的第一种路径,靠资源、靠资金、靠劳动力等大量投入加速度发展的时代过去了。过去40年这样的发展方式已不可持续,也无法在未来复制。
+
+对于第二种路径,一个国家跟别的国家进行贸易投资、各方面的资源交换,通过国际贸易、国际投资,通过经济的开放形成优势互补,资源优化配置,扬长避短,这个过程就会产生额外的积累,会推动经济更好更快地发展。我们最近说的中国经济进入了以内循环为主体,国内国际双循环互相促进的新格局。为什么说是新格局?因为几十年来,我国是以两头在外、大进大出外循环为主体的,也有内循环,所以是以外循环为主体的国内国际双循环,现在转变为以内循环为主体,当然是一种新格局。
+
+这里面要解释一下,什么叫外循环?什么叫内循环?一个国家的进出口贸易,包括货物贸易+服务贸易,两种贸易合起来的进出口贸易量,如果这个贸易量占GDP的比重超过60%以上,就是外循环为主,60%是一个大的比重,然后内循环是40%,外循环60%以上,这就是以外循环为主。如果进出口贸易量占GDP40%以内,那这个国家、这个社会是以内循环为主的。
+
+1950年到1980年这一段时间,我国的进出口贸易占GDP的比重是10%左右,1980年中国2000多亿美元的GDP总量,进出口贸易200多亿美元即10%,所以那个时代是一个内循环为主的阶段。1980年改革开放以后,利用国际资源、国际资本、国际市场,给中国带来经济发展的动力,两头在外、大进大出,加工贸易、来料加工,各种方面的开放,大量引进外资,外资的投资也带来大的投资、大的出口等等,所有这些使中国的经济走向了外循环为主。中国在加入WTO以后,到2006年外循环达到了最高的比重,大体上2006年中国进出口贸易占GDP比重71%。我刚才说的进出口贸易占GDP60%以上外循环为主,到了70%以上,也就是比较高的外循环为主的一个体系,在那个71%里面,货物贸易占GDP的量是64%,服务贸易占7个点,加在一起是71%。
+
+那我国现在是什么状态呢?我国现在以内循环为主,国际国内双循环。外循环比重是38%。比如2023年中国GDP是126万亿,我国的进出口货物贸易是6万多亿美元,服务贸易8000多亿美元,加在一起69000亿美元不到,折算成人民币48万亿人民币,跟126万亿人民币去对比,占38%左右。2022年、2021年、2020年都是38%,小于40%,是40%以内的外循环,因此,我国就进入到了一个以内循环为主,国际国内双循环的国家。大家是不是会想,我国原来60%以上达到70%,怎么会突然这十年降到38%了呢?想当然的就会想到,可能是美国人跟我国打贸易战,加关税、脱钩、撤资、卡脖子等等,搞了一整套的地缘政治、贸易保护主义等等一系列措施,我国是被美国的贸易战逼得外循环为主变成内循环为主,这个判断当然是错误的。也有人可能会认为,是不是这三年新冠病毒疫情把我国出口的供应链、价值链破碎了,东西出不去也进不来,所以进出口萎缩了。这种判断当然也不对,因为中国的进出口贸易进入内循环为主的时间点是2016年,那时候美国还是奥巴马当总统,特朗普还没上台,还没有发生最近六七年的中美贸易战。
+
+那么我讲了这么多,就是要表述一个概念,过去靠70%、80%的开放的流量,占GDP 70%以上那种外循环为主的贸易流量,来拉动中国经济发展的时代过去了,我国要进入世界经济强国,必然变成以内循环为主,这个流量只占40%不到,不那么依赖全方位的外资或者贸易量为主体的那种开放格局。在这个意义上讲,中国的第二个路径也发生了边界条件的变化。且自2009年国际金融危机后,净出口对经济增长的贡献在大多数年份是负的。尽管我国对外开放带来了技术进步和资源配置优化效应,对经济增长贡献巨大,但近年来受美国对我国发动贸易战、打压遏制的影响,依靠国际经济合作提振经济增长潜力的难度会越来越大。
+
+对于第三种路径,历史上一些国家通过殖民他国、武力征伐,从而实现了资本的原始积累,很不光彩,且日益被世界和平发展的潮流所摒弃。党的二十大明确提出,中国式现代化是走和平发展道路的现代化,不走一些国家通过战争、殖民、掠夺等方式实现现代化的老路。
+
+以上三种路径,第三条路我国不能走,第一条和第二条走起来日益困难,但我国要在2035年左右实现14亿人的基本现代化、人均GDP达到中等发达国家水平的目标,须确保经济增速维持在5%左右。走第四条路即提高全要素生产率势在必行。目前中国的全要素生产率增速仅有美欧发达国家的40%—60%,有较大的增长空间。但如果没有科技革命的加持,单纯靠经济内在的量变也是很难提升的。恰好我国又处在第四次工业革命的前夜,以智能化为代表的新科技革命为新质生产力的迸发提供了条件。在这样的重大历史机遇面前,发展新质生产力,充分释放新科技革命带来的增长红利,不仅有利于提升我国的全要素生产率,降低要素成本、增加要素投入,也有利于发挥我国开展国际经济合作的新优势。从近期看,要通过发展新质生产力形成新的增长引擎,维持经济增长势头;从远期看,发展新质生产力是支撑14亿人实现中国式现代化的必由之路、必然选择。
+
+这么一分析,中国40年改革开放给我国留下一个增长的空间,就是全要素增长率潜力巨大。在这个意义上,今后几十年高质量发展,今后几十年成为世界经济强国,一定要推动全要素生产率的发展,而全要素生产率发展的内涵就是让新质生产力成为我国高质量发展最关键的一环。
+
+“新质生产力”在这个阶段提出来,是中国经济高质量发展的内在选择、必然选择、唯一选择。现在的发展,不能完全靠资源投入、资金投入、劳动力投入来发展,因为这些是不可持续的,最重要就是要靠科技的投入,对生产力分工协作环节的投入,对基础性制度和生产力密切有关的生产关系、社会制度变革的投入,也就是说通过技术创新、分工协作、产业链组织的进化等等,通过推动新质生产力和与之相适应的生产关系的形成,只有这样,我国才会有可持续的、高质量的发展。这是我今天要讲的第一段。为什么党中央在这会儿提出新质生产力?通过对推动经济发展的四大生产力因素一一分析,可以得出结论,中央是多么的有战略眼光、多么的睿智、多么的有前瞻性,发展新质生产力是个英明重大的决策。
+
+# 第二部分 新质生产力的科技创新、技术创新路径
+
+在这里,我主要讲三个方面。
+
+## (一)围绕新能源、新材料、数字智能技术、生物医药和高端装备制造等五大板块,推动颠覆性创新,是新质生产力发展的重中之重
+
+我们说一切行业要进步,都需要科技创新,所谓三百六十行,行行出状元。但是三百六十行的每一行的各类技术进步,并不等于新质生产力的发展。在人类的发展史上,不管是原始社会、奴隶社会还是封建社会、资本主义社会和社会主义社会,现在及未来的发展,人类的每个时代都离不开能源、材料、数字智能技术、生物医药、高端装备制造这五大板块,每个时代这五个板块的新发展、新技术的革命性进步代表着的新质生产力,都会颠覆性地开创人类发展的新时代,这五个板块永恒地伴随着人类文明的演进而向前发展。
+
+这五个板块就像五棵大树,一棵大树上面会有许多枝干,枝干上面生有许多树枝,树枝上面长出很多树叶,蔓延开以后在社会上也会形成一个巨大的行业密集体系。中央“十四五”规划和2035年远景目标里提的九大战略性新兴产业(新一代信息技术、生物技术、新能源、新材料、高端装备、新能源汽车、绿色环保及航空航天、海洋装备等产业)和六大未来产业(类脑智能、量子信息、基因技术、未来网络、深海空天开发、氢能与储能前沿科技等产业),9个加6个就是15个,把这15个一归类,都可以归在这五大板块里。所以,跟这五大板块直接相关的九大战略性新兴产业和六大未来行业方面的颠覆性创新,也是新质生产力。
+
+这五个板块的颠覆性创新,代表了时代的巨大进步,是新质生产力。这五大板块具体到每一个零件、每一个产品,一展开就可以弄出几百个行当来。其他的各个方面只是延伸出来的枝枝节节,就像一棵树有树干和主要的几根树枝,枝繁茂盛是和这几大主干有关系的。这是一个概念,就是不要把新质生产力平庸化、庸俗化、泛化,如果泛化地把新质生产力当成一个筐,什么事情都往里边装,就成了实实在在的低级红、高级黑。习近平总书记在人大代表团讲新质生产力时就讲了这些现象,不要因为搞新质生产力就把各行各业给忘了、给废了、不去重视了,但也不要一搞新质生产力,把各行各业都叫成新质生产力,也不能说搞技术进步就是新质生产力,这里边有个区分。
+
+“三百六十行,行行出状元”只是个形容词,不是说三百六十行各行各业都代表新质生产力。我们有时候看到新闻报道,某个乡镇长说我们要抓好我们乡里面的新质生产力,这个话乍一听也没错,他在学习中央文件、在表态、谈自己的思考。具体地想,如果变成中国几十万个乡都去抓新质生产力,其实也会出现方向上的散乱。因此,新质生产力技术创新的实施路径,首先要聚焦,要围绕着核心的板块、战略的板块、未来发展方向的板块展开。
+
+一是能源。每一个时代都有每一个时代的能源。当你推出了新能源,往往使这个社会进入新时代。比如第一次工业革命实际上是蒸汽机的发明,是用煤炭燃烧产生的动力形成的机械化时代。对农耕时代来说,英国人瓦特发明了蒸汽机,标志着工业革命的机械化时代到来,对当时来说就是一个新质生产力。150年前,美国人富兰克林发明了电流,福特又发明了内燃机,推动石油化工电气化时代发展,也就是第二次工业革命,电气化对于机械化来说是个新质生产力。现在到未来,进入到了清洁能源时代,太阳能、核能、氢能等新型能源相较于石化能源,是新质生产力。人类每个时代总是能源系统不断地创新。
+
+二是材料。每个时代总有材料的创新。远古时代、旧石器时代、新石器时代,仅一个石器材料,人类差不多用了几十万年才从旧石器转到新石器,到后来开始出现青铜器,到了农耕时代产生铁器,这在当时来说都叫新质生产力。现在有钢铁、石油化工,形成各种各样的新材料,比如现在集成电路用的硅材料,进一步的石墨烯材料、碳材料等等,任何一个时代材料领域的颠覆性发展都是新质生产力。
+
+三是数字智能技术。第四次工业革命是人工智能时代的革命,如今人类已经进入人工智能时代,这已经成为西方和东方全世界的共识。这个共识的基础性原因是20世纪40年代末,人工智能的原始创新奠基人物图灵提出了人工智能发展的八个台阶。第一个台阶是深度学习。第二个台阶是增强学习。第三个台阶是模式识别。第四个台阶是搜索引擎,就是数据搜索。第五个台阶是机器感觉,就是机器听觉、视觉、嗅觉、味觉、触觉,每一种感觉的发明都可以获得诺贝尔奖。第六个台阶是机器共识,是指机器具备人类基本的伦理常识、社会共识和专业知识。机器人在为社会服务时,通常会作为人类的辅助工具,不能从婴儿的状态开始学习任何东西,它成为大家可用、可做帮手的工具,基本上需要具备一般人类的思考能力。第七个台阶是自然语言生成逻辑,就是我们现在所说的ChatGPT大模型。中国人使用中文思考,英国人使用英语讨论,语言构成人类思考逻辑的内涵,人的大脑思考与语言有关。第八个台阶是类脑交叉,脑机互动。目前,马斯克、谷歌等正在研究的就是让机器的灵感信息系统与人脑直接联系,脑电波与机器人形成一体化的互动状态。
+
+这里面有一个有趣的现象,从20世纪50年代到现在,大约每10年人工智能总是走上一个台阶。最近20年进入到第七、第八个台阶。八级台阶走完了,似乎还没有科学家说人工智能在这八个台阶以外,未来还有哪几个新的台阶。可能100年后回头看,才看得清这个问题。总之,上世纪40年代基于人工智能理论想像提出的8个台阶非常伟大,人类80年来人工智能的发展走的就是这条路。
+
+当人类完成这8个台阶后,可以说人工智能8个台阶已经集大成。既然已经集大成,那么就进入了人工智能全面应用的时代,这是一种逻辑。第二种逻辑是当人工智能完成8个台阶后,人工智能是否将超越人类,是否会把人类当猴耍?这是西方科幻电影中经常有的画面。我们相信,人类总是能无限地向前探索,在人工智能时代,人类一定会推出人工智能未来发展的新路径。
+
+四是生物医药。人类总是想要延长自己的寿命,猴子、猿人、史前的人类只能活十几年,到后来三四十年、四五十年、六七十年,到现在七八十年甚至九十年上百年。其实在远古时代,谁能当医生、具有看病能力,谁就是部落领袖。“三皇五帝”的三皇都是医生。中国8000年前的皇帝伏羲,他发明了阴阳八卦太极图。在甘肃天水伏羲博览馆里放着《阴阳八卦》那本书,也不知道这本书是不是8000年前的,反正放在那里,写着《阴阳八卦》,但他那时候的《阴阳八卦》还不是打仗用的,全是看病、占卜的八卦。第二个是6000年前的神农氏,著有《神农尝百草》,也是一本医书。5000年前的轩辕黄帝更是留了一本《黄帝内经》,那已经是非常复杂的中医了。总之,能看病的、治病救人的就成了部落领袖。很直观,想象一下原始社会,你能帮人治病,你就是“神仙”,你就能当首领。当代乃至未来,发明的创新医药,能把病人治好,能使人健康,当然是人类永恒的追求。
+
+五是高端装备、高端制造。劳动工具的每一次变革,都带来划时代的生产方式的革命,劳动效率的提高使社会形态发生相应的变革,从而推动人类社会不断地向前发展。如现在做的宇宙飞船的发动机、飞机的发动机、航空母舰的发动机,能生产各种复杂零部件的高端数控装备,做芯片的光刻机,各种高端工业母机、人工智能设备等等。高端装备、高端制造是人类发展过程中的极大进步,不但解放了人类的双手,也将解放人类的大脑,必然是新质生产力。
+
+人类总是在这五个板块上不断地进行时代创新。而这五个板块只要有一个发生颠覆性的创新,都会带来时代的伟大变革。
+
+## (二)聚焦五个层次的颠覆创新是推动新质生产力发展的引擎动力
+
+科技创新是推动一切生产力往前发展的动力。邓小平曾经说过科学技术是第一生产力。但必须是颠覆性的科技创新才叫新质生产力,并非三百六十行的技术进步、一般意义的技术革新都被视为新质生产力。在工业系统、制造业系统、人类的技术进步里,颠覆性的技术创新有五个层次,每个层次的技术进步都可能是颠覆性的或者是一般性的。这五个层次具体地讲就是理论创新、技术创新、工艺创新、工具创新、要素创新。这五个层次每个层次只要有一个层次做到颠覆性创新,都可以推动新质生产力发展,没有做到颠覆性,只是一般性的创新,就不能叫新质生产力。不是说一件事五个层次都要颠覆性,只要做到五个层次里任何一个层次出现了颠覆性的创新,都可能引爆一次新质生产力级别的推动。一般性的技术创新和边缘化的创新也很重要,也是好事情,但不算新质生产力范畴的创新。
+
+第一,颠覆性的理论创新。比如说爱因斯坦的相对论是理论创新,现在的量子通信也是一个理论创新。理论创新一旦从零到一、无中生有地产生了,总会影响人类几十年、上百年的发展。
+
+第二,颠覆性的技术创新。理论和技术是两个层面,技术创新涉及到具体的生产力,理论创新不见得马上变成生产力,理论变成生产力的过程一定有技术创新和它配合,但是没有理论创新,你也不可能搞出具体的技术创新。所以技术创新的最大特点,对我们社会非常有意义的就是许多技术创新拿到了诺贝尔奖,诺贝尔奖95%左右都是由有技术创新的人获得的,理论创新的诺贝尔奖在这一百几十年里所有的拼在一起,拿到诺贝尔奖的总数占整体的诺贝尔奖总数只有百分之几,技术创新就成了推动新质生产力发展的关键。
+
+比如说一部智能手机,已成为现代人类几乎必备的物件。手机是新质生产力、数字技术发展的一个产物,现在每年都有上万亿美元的销售值,非常的厉害。别看着手机只有小小的一掌大,这一部手机里有上千个零部件,里边有12个部件却蕴含镶嵌着12个诺贝尔奖成果。如果这12个成果少了一个,现在的手机就没有这个功能。这12个技术创新,就是通讯技术层面从零到一的无中生有,具有颠覆性意义的创新。
+
+第三,颠覆性的工艺创新。即生产过程中采用的创新技术和方法,旨在提高效率、降低成本、减少环境影响或增强产品质量。理论创新与技术发明结合后,形成了一个产品,如果没有工艺制造的发明,你就只能像作坊式手工一样地做一个一个的东西。如果一天要做几十万个,一年要做几千万个、几亿个,大规模的流水线作业必须要有工艺流程的发明。人们需要将产品从整体功能到具体零部件拆分到每一个细节,然后在生产线上形成流程作业,这个流程组合起来才能大规模生产。因此,现代制造大规模生产一定有工艺流程、产业链配套设计的创新。不同的行业可能会有不同的工艺创新。比如,通过压铸一体化,特斯拉将原本需要多个零部件通过冲压和焊接等方式组装而成的车身结构件,转变为可以直接通过压铸工艺一次性成型的单一零件。这种方法不仅减少了零件数量,降低了生产时间和成本,而且还提高了车身结构的完整性和安全性。而这一创新可能会导致汽车车体制造工艺的重大变革。
+
+第四,颠覆性的工具创新。工具变革在人类发展史上始终处于重要地位,因为工具的革新带来了效率的提升和成本的下降,这样的例子有很多。比如珍妮纺织机的出现,曾被恩格斯评价为“使英国工人的状况发生颠覆性变化的第一个发明”。再比如,透射电子显微镜的出现标志着人类对微观世界观察能力的重大飞跃。EUV光刻机的出现让7纳米、5纳米芯片制造成为可能。基因测序仪的出现,让我们能够读取和解析生物体DNA或RNA的序列,极大地扩展了我们对遗传信息的理解和应用。
+
+第五,颠覆性的要素创新。过去的制造,靠劳动力、资本、能源等要素;未来的制造,除了这些传统要素外,还会有数据这一新的要素。新的要素加入,让生产函数发生了新的变化,规模经济、范围经济、学习效应会发生新的交叉组合和融合裂变。当前,人工智能技术在大数据的“喂养”下正在加速迭代,数据已经成为人工智能得以成熟的重要生产要素。未来,随着人工智能在各行各业的普及和应用,数据作为生产要素的特征和重要性会更加显著。
+
+## (三)新质生产力的发展必然带来进入千家万户的五大件未来产品
+
+新能源板块、新材料板块、新的数字智能技术板块、新生物医药板块、新的高端装备制造板块,每个时代这五个板块一旦出现颠覆性的技术创新,就会形成新质生产力。成为时代主流的新质生产力,除了改天换地将整个社会的制造系统和生产系统转换,把社会生产力加快推进、进化、发展以外,还会随之具体地转变为进入千家万户、改变人民生活的产品,这种产品既代表新质生产力技术创新的缩影,又能覆盖全社会,规模非常大,形成那个时代的“未来产品”。
+
+第一次工业革命是机械化革命,这个时代新质生产力到老百姓家庭的产品缩影,就是自行车、缝纫机、留声机、照相机、手表,拆开来都是一堆齿轮,机械化的传动。现在看来极其简单,三百年前就是伟大新质生产力的缩影,就是机械化新质生产力缩影进入千家万户的五大件。当年康熙皇帝、乾隆皇帝时期,外国人、英国人神父带着钟表送给皇帝作为礼品,就是当时最高科技的未来产品。
+
+第二次工业革命是电气化为本质的工业革命,新质生产力缩影体现在进入家庭的五大件,包括汽车、电视机、冰箱、洗衣机、空调等。这五大件100多年前在欧美出现,然后蔓延传递到全世界。这五大件真正大批量地进入中国家庭,是在改革开放的年代中,20世纪八九十年代直到现在基本覆盖到位。
+
+第三次工业革命是信息化时代的革命,信息化时代的五大件表现在大哥大的手机到4G、5G的智能手机,台式电脑到笔记本电脑、平板电脑,办公和家用的打印机、复印机、传真机等各种终端,液晶面板的电视机等等。
+
+第四次工业革命是人工智能时代的革命,现在进入了人工智能时代,这个概念已经形成了对社会改天换地的新质生产力,人工智能时代形成的新质生产力缩影体现到家庭的五大件,目前基本形成共识。
+
+第一类是有手有脚的人形机器人。实现人的感官功能,具有视觉、听觉、触觉、嗅觉、味觉和语言交换功能,可以帮助家里老人聊天、打麻将或者做家政事务,同时也可以帮助孩子娱乐、教他读书等,甚至可以帮助主人出去购买东西,人工智能的脑子把整个城市所有商店里放了些什么东西都一目了然,你可以随时咨询,然后指导你去哪里购买东西或者发指令让它去把东西买回来。
+
+第二类是个人定制的秘书式机器人。ChatGPT大模型人人都可以用,这是个综合性的训练,既是科普也是对这个机器进一步的训练。真正能形成生产力、GDP、销售值的一定是三百六十行分门别类的行业机器人,或者是具有个人的不同特点、隐私保护的定制式的机器人。这种机器人一旦买来了,各种参数一调整,变成定制式了,你可以作为一个专门的终端放在口袋里,也可以跟手机、笔记本电脑连上等等,成为专属为你服务的工具。
+
+第三类是戴在头上具有虚拟现实、脑机互动的的智能头盔或眼镜。今后这个头盔、眼镜做得很贴切,我们这些人在一起开会,哪怕头上戴了头盔、眼镜,互相看着不异化、不另类、没感觉,这是一个很简单的要求、很容易就能做到,但最重要的是它甚至可以脑机互动,脑子里想什么,一部手机、一台电脑就能在你的眼镜视频里出现,就可以拿着它进行虚拟现实操作。这些东西现在样本都有,真正要通用化、实用化,可能要二三十年以后,不过发展的确很快。
+
+第四类是车、路、云智慧网联的智能汽车。AI将把汽车的各种功能和道路的利用率发挥到极致。汽车不单是运输工具,还将为人们的工作、生活提供便捷、高效、美好、安全的场景。
+
+第五类是3D打印的机器。3D打印现在不是在做各种工具、各种小玩意的设计,人工智能的设计已经无孔不入、无奇不有,但是最主要的是材料问题、增材问题,进去的是铁粉出来一个铁器,进去的铝粉出来铝器,进去石膏粉出来牙齿、人体的骨架这一类的石膏件。门捷列夫元素表不同的原子排列就形成了各种各样的元素,最后元素这么堆积是有机物,那么堆积是无机物,整个世界就这么造出来。自然用一个东西造出千奇百怪的世界,这个原子拆开了里面还是千奇百怪的微观世界。人类不能用一种材料造出千千万万的东西,因为这是宏观的材料,人类目前也不可能微观到用原子来创造万物。所以3D打印基本上就是一定企业、家庭可以使用的工具,然后尽可能地用少量的几种材料做各种各样可能需要的东西。现在美国硅谷有很多不大不小的公司在干这个活,冰箱、洗衣机大小的3D打印设施可以做各种各样的东西,你看着五花八门、稀奇古怪。
+
+未来的五大件是进入家庭的。全世界80多亿人,有差不多20多亿个家庭,如果每个家庭要一个产品,十年来覆盖,十年一个折旧,每年要生产2亿个,十年生产20亿个。对中国来说,14亿人差不多4—5亿个家庭,所以中国家庭每年就需要四千到五千万台。这种产品因为覆盖全社会,影响力巨大,代表时代的新质生产力、创新技术的缩影,是当代的高科技产品。因为它要满足所有人群、家庭,所以生产、销售规模极大。当下对中国人来说,最重要的就是在这一轮新质生产力发展进入千家万户的产品当中,可别出现五大件都是跟跑。前三次工业革命时代的五大件,中国基本没有专利,都是跟跑。第一次工业革命还是在清王朝封闭的时候,自然都是欧美发明。第二次工业革命是在150年前,我国处在鸦片战争、日俄战争、国内辛亥革命、军阀混战等等,也丧失了跟进。第三次工业革命起步的时间我国还在“文革”阶段,但是后半段我国进入了改革开放,全面跟进了,因此我国有部分的发明创造,但不是整体的。第四次工业革命,我国处在一个最好的发展时代。在这个意义上,如果20年以后这五大件在全世界覆盖,又是欧美发明,我国还是利用我国的产业链集群、加工能力把它们引进、消化、吸收式搞出来,哪怕搞得生产规模最大,我们也很丢脸。所以在未来二三十年,力争这种未来产品至少有那么两三件是我国领跑,可能有两三件我国跟人家并跑,或者有两三件我国是跟跑。总之,不能五六件全跟跑,那就丢份了。抓新质生产力,我国要着力在五大板块上去突破、五个层次上去突破、进入千家万户的五大件未来产品上去突破,这才代表我国整体新质生产力发展的成就。
+
+# 第三部分 生产性服务业的创新发展是推动新质生产力发展的生态环境
+
+## (一)着力发展十大生产性服务业
+
+任何技术进步、任何大生产的发展都涉及到社会分工。分工越细,越需要形成协作、协调。通过协作、协调把各种碎片化的分工链接成无缝对接的产业链、供应链、价值链,这当中表现出来的分工协同就是服务业。制造业的分工产生生产性服务业,生活的分工产生生活性服务业,当今人类社会的服务业就分成了与制造业有关的生产性服务业、与生活有关的生活性服务业。我们可以直观地想象,制造业是一个社会发展的重要脊梁,所以生产性服务业一定是在人类社会的服务业中占大头。高质量的制造业,一定伴随着发达的生产性服务业。一个国家、一个地区要发展新质生产力,首先要把生产性服务业搞上去,如果这个社会生产性服务业不发达,发展新质生产力就是南辕北辙。
+
+科技进步所带来的技术创新和生产力的提升,使得社会分工趋于复杂和多样化,极大地促进了经济的发展和社会的进步。现代工业文明、现代化的生产系统,形成了十大类生产性服务业:
+
+1.产业链上的科研创新。包括三种创新,一是发明新的工业产品,不管是工业装备还是耐用消费品终端,反正是一个创新产品;二是构成这个工业产品的零部件开发,产品是高精尖的,拆开来有几百个、几千个零部件,这些零部件也是发明创造;三是生产线的开发,把这些零部件组装在一起的生产流水线,是一个工艺流程的发明创造。总之,产业链涉及到的各个环节的研究开发都属于生产性服务业。
+
+2.产业链上的检验检测及市场准入。一个产品涉及上千个零部件,这个社会可能有三千个企业分门别类能做这些零部件,每个零部件有好几个企业能做,但是到底选谁?要选质量最好、效率最高、成本相对低、比较忠诚、可持续的企业进入产业链。这时候供应商准入、产业链准入、市场准入的选择,对各种零部件质量的检验检测是现代工业生产过程中非常重要的一环。越是高技术产品,工艺复杂,这块业务就越多,代表产业链把关的功能。这种把关往往都是由产业链龙头老大自己做判断或者委托第三方来做,比如苹果产业链的准入由苹果公司直接下诊断书,华为产业链的准入由华为直接主导。
+
+3.产业链上的物流配送。物流包括铁路、公路、空运、海运、水运和仓库的无缝对接及高效协作。产品的零部件从全世界过来,上千个产品要同时到位,如果一些零部件提前到位,就会压仓产生成本;如果有一个零部件不能准时到位,会使得其他零部件躺在那里窝工,造成整个生产线误工。既不误工又不会压仓,在这个意义上,产业链物流全球化配送必须准确到位。
+
+4.产业链上的金融。产业链上我的产品卖给你,你的产品卖给他,资金怎么清算。产业链上大大小小上千家企业的金融结算不是一个一个互相串联着支付,而是由链头企业搞一个清算中心,所有企业都把买货的资金或者要收的资金直接并联在这个清算中心,然后形成快速高效的结算。还包括产业链上企业的融资贷款、租赁抵押、风险投资、发债、上市、REITs等各种各样的金融服务等。
+
+5.产业链上的生态环保、绿色服务。运用科学的方法和工具,对企业的生产活动进行全面的环境影响评估,准确识别关键环境影响因素,并提出针对性的优化措施。结合行业领先的实践和技术,为企业提供定制化的清洁生产解决方案,旨在提升生产效率的同时,显著降低环境污染。还包括环境法规遵从性指导、环境管理体系建设与认证支持、供应链环境绩效评估、环境监测与数据分析、碳足迹评估与减排策略等等的服务。
+
+6.产业链上的数字化赋能。大数据、云计算、人工智能、区块链、互联网对传统产业的赋能。通过整合先进的数字技术,对产业链的各个环节进行深度优化和重构,以实现价值最大化和效率提升。通过工业互联网的赋能,使生产流程得以实现高度自动化和智能化,显著提升生产效率和产品质量。通过产业互联网赋能,涵盖从市场需求分析、产品设计、研发到生产、物流配送、销售乃至售后服务的信息流畅和协同高效,实现跨部门、跨地区的信息共享和协同,缩短新产品开发周期,加速新产品上市进程。
+
+7.产业链上的贸易批发、零售。可以是线上的贸易批发零售,也可以是线下传统的贸易批发零售。通过供应链的数字化,将线上线下融为一体,从而提高供应链的透明度、响应速度和灵活性。利用大数据分析技术,企业能够更准确地预测市场需求,优化库存管理,降低运营成本。多渠道的分销策略使企业能够通过线上线下结合的方式拓宽销售渠道,满足不同消费者的购物偏好。总之这些都是生产性服务业。
+
+8.产业链上品牌专利的保护和推广营销。品牌专利保护,包括专利检索与分析、专利申请与代理、专利布局与规划、专利监测与预警、专利争议解决等服务。品牌推广营销,包括品牌定位与策略咨询、数字营销与社交媒体管理、公关活动与事件营销、市场调研与消费者行为分析、创新设计与视觉传达、营销效果评估与优化等服务。通过这些服务,企业可以在保护品牌专利的同时,有效地推广品牌,提升其市场竞争力。
+
+9.产业链上的各种服务外包。任何一个产业链上有几百上千个企业,需要律师服务、会计服务、人力资源服务、咨询服务、技术服务等等,各种需求分析与评估、供应商选择、市场营销、合同谈判、服务监督与管理、绩效评估、风险管理、教育培训等。服务外包的目的是通过利用外部资源,帮助企业降低成本、提高效率,并专注于其核心业务。随着技术的发展和全球化、数字化的推进,服务外包已成为许多企业优化资源配置的重要手段。
+
+10.产业链上的售后服务。售后服务不仅仅是我们以前说的产品销售后的三包服务,那是浅层次的。现在的售后服务,往往是一个硬件卖给你,过了三年五年,里面的软件1.0版、2.0版隔半年、隔一年就升级,升级以后功能更加强劲、使用更加流畅,通过迭代升级服务使客户跟企业长期挂在一起,同时企业就可以不断地延长对客户的服务收费。
+
+以前说的微笑曲线,这一头是研究开发,那一头是销售后的服务,中间就是生产、分配、流通、消费构成经济循环的全过程。随着技术进步和分工细化,现在这十大生产性服务业都攀附在这个微笑曲线上,使微笑曲线延伸了,左边研发越来越超前、往前移,后边的售后服务也越来越延长,其他生产性服务业作用发挥也越来越大,使得微笑曲线进一步拉升,就像一匹马的脸拉得长长的,这条拉长的微笑曲线就变成了马脸曲线。
+
+## (二)生产性服务业发展发达的五个宏观指标
+
+以上依据产业链的服务分工细分的十大生产性服务业基本上在各个国家都是一致的,这些服务业的发展是有统一的衡量标志和指标的。按照国家统计局的《生产性服务业统计分类(2019)》,生产性服务业包括为生产活动提供的研发设计与其他技术服务,货物运输、通用航空生产、仓储和邮政快递服务,信息服务,金融服务,节能与环保服务,生产性租赁服务,商务服务,人力资源管理与职业教育培训服务,批发与贸易经纪代理服务,生产性支持服务,共十大类。这十大类和制造业强相关,制造业的各种附加值、服务性附加值都是由它来代表,这一块如果不到位,生产制造的产品就不会高端化。目前,我国虽然制造业规模占全球比重的30%,但与制造业强相关的生产性服务业却相对滞后,在全球产业链供应链中的位势不高的根源正在于此。
+
+具体到了每个产业链,苹果产业链、华为产业链,都可以根据这个产业链详细地了解这十大服务业在干嘛。但就一个国家、一个地区、一个城市来说,是可以用宏观上的五种指标对生产性服务业的发展进度、发达程度进行衡量的。这五个指标每个国家、每个地区、每个城市都可以统计,统计出来的结果基本上就可以反映这个国家、这个地区、这个城市技术创新的生态环境、科研创新的能力高低,新质生产力有没有可能在这个地方茁壮成长,或者成长缓慢发展一般般,或者根本就无法成长,都与这些指标有关。这五个指标非常重要。
+
+第一个指标,这个国家、这个地区、这个城市生产性服务业占GDP的比重。越是发达的国家,生产性服务业的比重越高。越是相对不那么发达的国家,服务业的比重就越低。比如说美国,美国这些年生产性服务业占美国GDP的50%,是美国GDP板块里最大的一个板块。美国的GDP里农业有2%,工业有18%,服务业有80%。有时候会调侃美国,说美国脱实就虚,服务业里面有虚假。例如美国人将其在自己家庭里看护小孩和照顾老人的家庭妇女折算成工作人员,看护小孩、老人和照顾家里相当于工作应该拿到工资。假设有500万个家庭妇女折算变成500万个就业人员,一人一年按10万美元收入,即5000亿美元。这可以算作很大的数值。因为中国人不会将家庭妇女在家里的劳作当作GDP计算,所以有不同的认知。还有美国老百姓买下的产权房作为自己的居住房,是不用付房租的,但是国家统计GDP时,会假定你是租住的房屋,相当于自己租给自己,也会折算成一种GDP,他把这个一统计,也会多统计出几千亿美元。我国的确和美国不同,是两个不同文化或者不同管理方法的问题。在这个意义上,我们是可以说他有虚数的。但这都是生活性服务业,到今天为止,没有听说哪个专家分析美国的生产性服务业里有虚假水分的。
+
+我们要看到,美国的服务业,在80%的GDP里,其中三分之一是生活性服务业,三分之二是生产性服务业,也就是占GDP总量80%的服务业中有三分之二是生产性服务业,80%的三分之二就是53%,所以大致可以说美国GDP的50%是生产性服务业。而欧盟作为发达国家的组合体,服务业增加值占GDP的比重是78%,78%里面有50%是生产性服务业,也就是GDP里面有39%大致算40%是生产性服务业。去年,我国GDP中服务业增加值占54.6%,服务业中50%是生活性服务业,50%生产性服务业,也就是说GDP中生产性服务业占比27%左右,和欧洲的40%,和美国的50%比,差距较大。这也是中国式现代化最大的短板之一。换言之,我们要实现中国式现代化,必须加快发展生产性服务业。
+
+如果我国能将生产性服务业占GDP的比重由27%提高到35%,增加8个点,在我国126万亿的GDP里就是10万亿的增加值,折算成销售值就会是30万亿。30万亿的生产性服务业,绝对会增加几千万服务业就业岗位,这些就业岗位就会将我国目前房地产中过剩的写字楼全部填满。从这个意义上说,解决房地产业中的写字楼过剩问题的关键是长远地发展生产性服务业。
+
+这里有个概念,生产性服务业决定制造业的利润多少、产业附加值高低、GDP的含量。比如说苹果在中国一年一共生产了1.7亿部手机,1部手机卖1000美元,总销售额是1700亿美元。由于中国综合制造成本较低,苹果手机在中国有40%左右的税前毛利,1700亿的40%就是680亿美元。苹果没有出一分钱搞固定资产投资、生产线建设和硬件制造,也没有出一分钱的流动资金买零部件来搞组装,凭什么每年在中国的680亿美元的毛利中大体要拿走510亿美元、拿走四分之三,中国的制造业企业拿走170亿美元也挺高兴,因为整个中国制造业的平均利润率就是7%,帮苹果打工能拿到10%,大家还蛮高兴的。京东方的屏幕被苹果选上了,京东方的股票也会往上涨一点,因为效益好嘛。苹果凭什么就能拿走75%的利润,因为苹果产业链的研究开发、物流配送、市场准入、检验检测、绿色低碳、数字化赋能、金融清算、销售及售后服务都是他管的,是提供十大生产性服务业的总龙头。谁负责了十大生产性服务业,谁就是这个产业链的链头、含金量价值的堆积者和产业链的灵魂,所以它的专利要收费、它的服务要收费、它的各种其他的服务项目都要收费,最后生产性服务业决定现代制造的含金量,这是一个很重要的概念。
+
+华为一年的总产值有7000多亿元,无论是手机还是服务器、路由器和5G基站,他们都没有自己制造。华为东莞松山湖基地、上海青浦基地,包括在全球、全国其他地方的总计20万名员工,几乎都是生产性服务业的工作人员,不搞制造,具体的制造都外包给别人。7000多亿元产值中,有1000多亿元的利润,是中国各种企业利润最高的。每年拿出1000多亿元作为研究开发费,相当于7000多亿元的20%。这么大比例和大额度的研发经费,实际上投入到了十大生产性服务业的全部业务开发中。
+
+刚才提到的苹果,苹果每年将生产性服务业输入到我国,最终获得510亿美元的毛利,这相当于中国人购买了它510亿美元的服务。在这个意义上,美国人将大量的生产性服务业输入到其他国家,将大量的工业制造放在世界各地,而世界各地制造出来的产品附加值利润的2/3到3/4被他拿回去。拿回去之后GDP并不算在美国,而是算在那个国家。例如苹果在中国所获得的510亿美元利润肯定算在中国的GDP上,而他们把利润拿回去并不算在美国的账上。去年,美国的GDP是27万亿美元,它的生产性服务业输出到世界,变成利润拿回去这一块,如果拿回去2万亿,这2万亿根本没有算到它的GDP,实际上又是它的效益。从本质上看,27万亿GDP的含金量相当于29万亿或者30万亿美元。
+
+如果一个地方生产性服务业比重较低,尽管这个地方的制造业规模大,一定是二流、三流水平附加值较低的产业体系,生产出来的产品含金量不高。如果该地区工业规模较大,产品附加值极高,但生产性服务业较低,那么一定有第三方在向该地区输入生产性服务业,从而提高产品价值,产生的大部分利润就被输入生产性服务业的企业拿走了。中国式现代化,没有自己发达的生产性服务业,只是为他人做嫁衣裳。即使工业产值是全世界30%,它的大块利润也是被人家拿走。在这种情况下,中国的现代化生产体系、生产力体系与欧美发达国家相比最大的短板就是生产性服务业,并非是制造业。我国的制造业规模已经达到世界最大,硬件制造能力也不差,说制造业大而不强,其原因就是诸如研究开发的生产性服务业不到位,因此大家由此要想到生产性服务业的重要性。
+
+第二个指标,服务贸易占进出口贸易的比重。一个国家的进出口有货物贸易,也有服务贸易,服务贸易包括生活性服务业和生产性服务业的国际化活动,生活性服务业和生产性服务业只要一跨国就叫服务贸易,在国内就是服务业。当今世界有一个特征,最近三四十年,服务贸易越来越发达和国际化。40年前,整个世界的贸易量中,服务贸易只占全部贸易的5%,现在要占30%。去年,美国的进出口贸易总额是6.88万亿美元,其中货物贸易5.16万亿美元、服务贸易1.72万亿美元,服务贸易占比为25%。中国的进出口贸易总额是6.81万亿美元,其中货物贸易5.94万亿美元、服务贸易0.87万亿美元,服务贸易占比只有14.6%。欧盟27国2022年的进出口贸易总额是5.58万亿欧元,其中货物贸易3.15万亿欧元、服务贸易2.43万亿欧元,服务贸易占比为43.5%。从这些对比的数据中不难看出,我国的服务贸易比重偏低,结构也不好。我国的服务贸易大都以生活性服务贸易为主,比如旅游接待,外国人来旅游,住宾馆、到旅游景点要付费,属于生活服务业的出口。反过来,我国进口大量的生产性服务业,比如惠普、微软、苹果,他们将生产性服务业注入到了我国的生产基地,形成了对我国的服务贸易的出口。生产性服务业的服务贸易是含金量比较高、人才密集、技术密集、资本密集的服务贸易,旅游接待的服务贸易是劳动密集、含金量比较低的服务贸易。
+
+中央反复强调要把服务贸易搞上去,2020年9月在北京召开了中国国际服务贸易大会,习近平总书记发表讲话,中央7常委、国务院领导、各部部长和各省省长悉数参会,商务部印发了《全面深化服务贸易创新发展试点总体方案》,出台了122条促进服务贸易的创新措施。2021、2022、2023年的9月份连续召开如此规格的大会,并且确定今后每年召开一次,可见党中央、国务院对服务贸易的高度重视,同时也说明服务贸易的重要性。开会部署和出台创新措施的基础和核心就是要把国内的生产性服务业搞上去。如果我们国内生产性服务业上不去,这个服务贸易规模哪怕做大了,也是外国的生产性服务业大量输入中国,使得中国制造含金量提高,这是只长骨头不长肉的事情,效益是人家要拿走的。
+
+第三个指标,服务价值占高端装备、高端产品终端价值的比重。当今世界,所有的高端的装备及终端产品的价值,50%可能是硬件制造的价值,还有50%是看不见摸不着的服务价值。比如一部手机卖了7000元,可能3000多元是硬件制造的价值,还有3000多元是软件、操作系统、芯片内置的程序、各种专利体现的价值。拆开来,这些服务是看不见的,组合在一起,手机的灵魂就是这些服务,所以它的含金量占40%—50%、50%—60%,这些服务的具体表现就是刚才说的十大生产性服务业,嵌入到产品中,它们的价值就在制造品里装进去了。一个社会、一个国家高档制造品中服务价值的比重,如果这个比重在40%—50%以上的,当然是高端,这又是一个指标。
+
+第四个指标,代表新质生产力的独角兽企业占比。资本市场是服务业市场和金融市场,其中美国独角兽企业的市值占资本市场总市值的30%。美国资本市场总额有40多万亿美元,30%即12万亿美元的市值折算成人民币约为90多万亿元或者100万亿元。目前国内股票市场总市值为70万亿元人民币,包括科技创新类板块,将其视为独角兽,在股票市场中,其市值不到10万亿元。去年,中国资本市场中排名前十市值的公司,6个金融企业,1个酒类企业,1个石油化工企业,1个通信企业,1个制造业企业。美国前十大上市公司中7个高科技企业,1个金融企业,1个制造业企业,1个石油化工企业。美国这7个高科技企业都是数字技术+高端产品形成的巨无霸,体现近十年来的新质生产力,所以这也是一个标志。因此在这个意义上,我国代表新质生产力的独角兽企业占比并不高。
+
+第五个指标,全要素生产率拉动GDP增长的比重。习近平总书记在政治局会议上的讲话里提到,新质生产力的时代标志就是全要素生产率。如果全要素生产率达到GDP增长动力的50%以上,是新质生产力发展良好的社会标志和宏观经济指标。
+
+以上讲了10个生产性服务业和体现生产性服务业发展发达程度的5个宏观的经济参数。当我们推进新质生产力,只要推进成功,那么这些宏观的参数一定会亮丽。反过来,能够把一个地区的这5个宏观的参数关联的行业、产业做好,这个地区就形成了技术进步的氛围,这个地区的新质生产力就会发展。比如你到硅谷,你把这些参数一算,就知道他们很厉害。美国几十年的独角兽企业产生、新质生产力发展基本都在硅谷发生,就知道不是没有原因的。在这个意义上,十大生产性服务业加五个宏观的服务体系指标,其实就代表了新质生产力能够顺利发展的生态环境。
+
+# 第四部分 新质生产力对应的产业组织方式及企业运行模式
+
+每个时代有每个时代的产业组织方式。比如农耕时代,基本上分工不那么具体,制造业采用作坊式,一个家庭几个人,一个师傅带几个徒弟,小而全大而全,制作的是简单的工具、锄具等。一家人做纺织,什么都能干出来,因为这个东西本身就不复杂。到了现代工业化时代,产业分工越来越细化,这个时候公司制就诞生了,公司制是对农耕时代作坊制的一个升华,公司相对于作坊,结构复杂度提升、产业组织方式精细和生产效率提升。在工业文明的公司制时代,根据公司的发展演进,又可以把它分出五个层面的企业组织或者产业组织的业态模式:
+
+第一种,大而全、小而全的公司。最初的工业文明时代,公司制分工尽管也细化了,但是,一个公司里细化一点就是几个车间,或者是三五个部门,反正就是在公司内部,还是大而全、小而全。
+
+第二种,三国四方托拉斯企业。就是几个各自具有核心竞争力的跨国公司形成三国四方托拉斯的联合,这种联合是利益的联合,是不同的技术能力互相合作的联合。三国四方的七八个企业,每个企业都是各自领域、行业的领头羊。托拉斯所需要做的事情只有靠七八个企业合作才能完成,谁也不是产业链的龙头,谁也不是龙尾,大家可以平起平坐在一起合作。这种模式,至今在石油化工系统、钢铁产业系统还有这种托拉斯模式。例如美国休斯顿墨西哥湾的化工区,比利时和德国莱茵河边上路德维希港的化工产业集群、新加坡裕廊岛上的化工产业园、上海漕泾的化工产业园、重庆长寿化工产业园,包括巴斯夫在广东湛江正在投资建设的化工集群项目,都是几个国家的世界级的巨头企业合作,在这个产业链集群里,都是世界级巨头,你有你的长处,我有我的长处,我们互相资源优化配置,形成一个托拉斯。往往这种托拉斯一形成,二十年、三十年甚至五十年,没有人向他挑战,生产稳定,效益一直很好。
+
+比如,上海漕泾通过招商引资有了一个三国四方的托拉斯项目,国家审批项目的制度都为之进行了改革。1998年前的国家审批制度规定,1亿美元以下的项目由地方省级政府审批,1亿美元到2亿美元的项目由国家发改委审批,2亿美元以上报国务院审批。托拉斯项目最大的特点是5个公司同一天签约、同一天开工、同一天竣工、同时运行,互相离不开互相的。这种项目在招商时,本着诚信的原则,上游招中游、中游招下游,背靠背招商,你和东说西、北、南都同意了,和南说东、西、北都同意了,和西说东、南、北都同意了,和北说东、南、西都同意了,转来转去大家都说同意了,同意了有一天把大家叫来一起签约。这种三国四方的托拉斯,每个企业的每个项目投资都会超过2亿美元,如果项目建议书、可行性研究报告、开工报告三个环节都要报国务院审批,5个企业的5个项目就各有3个环节需要国务院批转,要出十五个文件。我当时在上海任经委主任,觉得批十五个环节肯定会影响项目进度。因此向时任国家发改委主任的曾培炎同志做了汇报,希望能改变审批方式,他听了以后认为有道理,就写了一个请示报国务院,并得到时任国务院总理朱镕基同志的同意,改革了审批方式。这种三国四方几个跨国公司巨头组合在一起的托拉斯项目,国务院只批一个综合性的项目建议书,把5个公司共计100亿美元的项目建议书放在一起批。批复以后,5个公司各管各的可行性报告、开工报告,由上海市政府报国家发改委审批即可,这样工作效率一下就提高了。这个项目搞起来以后,我们国内类似的项目都延用这种简化的审批方式。这种大项目审批方式,对于那些复杂的以托拉斯的方式运行的跨国公司项目是很有效率、非常成功的。
+
+第三种,产业链外包和产业链集群。随着分工的细化,就会出现一个产业,龙头企业做30%—40%,60%—70%的产业链外包。比如一个汽车公司,发动机、变速箱、底盘、车身四大总成自己造,七八千个零部件外包,形成一个产业链集群。冰箱、空调、洗衣机基本也是这样,品牌公司做核心零部件和总装,其余零部件外包。进一步地发展到了二八开,比如说电子产品,部件都比较小,零件碎片化,龙头企业自己干20%,80%都外包出去。
+
+第四种,链头企业只做生产性服务业,制造全部外包给代工龙头企业,形成水平分工加垂直整合一体化的产业链集群。比如苹果、惠普、微软、华为,产业链十大生产性服务业都是它管,就做“链头”,全部制造业都外包给富士康、广达、英业达、仁宝、纬创、华硕、和硕等。台湾的十大代工企业,近20多年代工了全世界每年电子产品产量的75%左右,非常了不起。各地在招商引资的时候,一种是直接和苹果、华为这种链头企业去谈,同意了就干,代工龙头企业会跟着链头企业的指挥棒来的。第二种,代工龙头企业也能做半个主,就和代工龙头企业富士康、广达、英业达、仁宝、维创等等谈好了愿意放在你这,它去说服链头企业把产品放过来,一放就是上千亿的产值。因为台湾这些企业把全世界电子产品的75%代工代下来,抓住一个就一大堆,这又是一个情况。代工龙头企业也有指挥棒的作用,一个电子终端产品往往有上千个零部件,代工龙头企业干总装和10%、20%的零部件,80%、90%的零部件往往是通过水平分工,选择分布在全球各地的各种工厂加工生产的,为了高效集约、降低成本,把分布在全球各地生产80%、90%的上千个零部件企业通过水平分工加垂直整合的方式整合在方圆100平方公里或者1000平方公里的空间里布局,变两头在外大进大出为一头在内一头在外,也就是市场一头在外,但生产基地在中国。一般来说,“两头在外”的运行方式的生产基地必须在沿海,从外面进来到沿海加工完就出去。“一头在内一头在外”的运行方式,生产基地既可以在沿海也可以在内陆,因为内陆也好,沿海也好,这一头都是一个集群,加工完出去。近十年,我国不断强调国内产业链要扩链、强链、补链,形成了制造业产业链一头在内一头在外,经过十年的推进,中国的产业链出现了深刻的变化。
+
+总之,大家可以看到2010年以前的20多年,中国进出口贸易产品50%的生产方式是加工贸易,是两头在外的加工贸易,35%是一头在内一头在外的一般贸易,还有15%是原材料、初级产品的进出,和制造无关。最近十年,我国的进出口产品中只有不到20%是两头在外的加工贸易,70%左右是一般贸易的进出口,10%左右是农产品和初级产品。讲这个意思,中国制造业扩链、强链、补链的话不是套话,真干了十年,两头在外的加工贸易方式转变成为一头在内一头在外的一般贸易,形成了零部件制造企业水平分工加垂直整合一体化的制造业产业链集群。
+
+第五种,数字化加产业链集群或更具体的说法就是产业互联网加产业链集群。随着数字网络技术和人工智能技术的不断推进,当下世界最高效的以销定产、心快打慢、以新打旧的产业组织方式是产业互联网+产业链集群,这将是新质生产力又一个标志性的推进。数字化对产业发展模式、公司发展模式的改造,形成新业态、新模式。数字化有五个环节的技术:大数据、云计算、人工智能、区块链、移动互联网,这五种数字技术每一方面都有它的底层技术。每一种创新技术、每一种数字化技术都可以直接为人类社会服务,这就叫做数字技术产业化。根据工信部有关机构测算,2022年我国数字产业化规模达到9.2万亿元,占GDP比重的7.6%。
+
+数字化技术的五个环节有机结合形成数字化平台,实际上是一个类似人体的智慧生命体。互联网、移动互联网以及物联网就像人类的神经系统,大数据就像人体内的五脏六腑、皮肤以及器官,云计算相当于人体的脊梁。没有网络,五脏六腑与脊梁就无法相互协同;没有云计算,五脏六腑就无法挂架;没有大数据,云计算就是行尸走肉、空心骷髅。有了神经系统、脊梁、五脏六腑、皮肤和器官之后,加上相当于灵魂的人工智能——人的大脑和神经末梢系统,基础的“数字化”平台就成形了。而区块链技术既具有人体中几万年遗传的不可篡改、可追溯的基因特性,又具有人体基因的去中心、分布式特性。就像更先进的“基因改造技术”,从基础层面大幅度提升大脑反应速度、骨骼健壮程度、四肢操控灵活性。数字化平台在区块链技术的帮助下,基础功能和应用将得到颠覆性改造,从而对经济社会产生更强大的推动力。
+
+数字化平台可以为一切传统经济行业服务,这就是中央说的传统产业数字化。数字化技术综合体不仅自身能够形成庞大的产业,还能够对传统产业进行赋能增效,改造升级,从而产生巨大的叠加效应、乘数效应。数字化平台与城市管理结合形成智慧城市、与金融结合形成金融科技、与建筑业结合形成智慧建筑等等。数字化平台与制造业结合形成智能制造,就是脱胎于“德国制造4.0”,被工信部定义为“中国制造2025”。它讲的是,一个大型制造业企业,通过互联网和数字化改造赋能,把市场需求、研发设计、生产制造、上中下游产业集群配套、物流配送、线上线下销售整个过程六个环节一网打尽,形成一个工业互联网。这是一种情况。
+
+当数字化平台与老百姓的生活消费场景相结合,就产生了消费互联网。过去十余年,我国消费互联网取得了举世瞩目的成绩,涌现了阿里巴巴、腾讯、百度、京东、拼多多等一批世界知名互联网企业,产生了10亿网民,从而为发展数字经济奠定了坚实的基础。在互联网蓬勃的发展中,有两方面的重要趋势是不可忽视的。
+
+一是消费互联网的发展已接近天花板。截至去年底,我国网民规模达10.92亿人,互联网普及率达77.5%;移动电话用户总数为17.27亿户,增长空间几乎见顶。从电商交易额增长情况看,2001年4亿元,2010年4.8万亿元,10年增长了12000倍;2011年6.09万亿元,2020年37.21万亿元,这个10年只增长了6倍;从增长幅度变化可以看出,今后的增长将是非常缓慢的增长。2021年、2022年电商交易总额分别为42.3万亿元、43.83万亿元,从2020年到2023年的数据不难看出,其增长空间已经非常有限。十年前中国前十的互联网公司的市值相当于美国前十的互联网公司市值的70%—80%,现有只有5%—10%,因为我国的互联网公司还是在消费互联网里打转转,而美国的互联网公司走向了产业互联网。
+
+二是发展产业互联网才是真正的蓝海。经过30年的发展,我国的互联网实现了从无到有到强的跃升,消费互联网孕育出一系列新应用新模式新业态,改变了中国,也改变了世界。如今互联网已行至下半场,消费互联网增长红利正在逐渐消退,发展的天花板已近,想要继续走在世界前列,需更多聚焦产业互联网,打开赋能产业新空间,激发更多新质生产力。与消费互联网不同,产业互联网下,每一个行业的结构、模式各不相同,并不是“一刀切”的,而是针对不同行业生态的“小锅菜”,需要一个行业、一个行业地推进。汽车产业链的产业互联网就不适用于电力产业链,化工产业链的产业互联网也无法直接平移复制到金融行业。
+
+数字化技术综合平台与各行各业结合形成产业互联网需要经历四个步骤。
+
+第一个步骤是数字化,实现“万物发声”。目的是让产业链上、中、下游各环节通过数字技术表述出来,发出“声音”、留下痕迹,为构建产业数字空间提供源头数据。
+
+第二个步骤是网络化,要实现“万物万联”。通过5G、物联网、工业互联网、卫星互联网等通信基础设施,把所有能够“发声”的单元连接在一起,高带宽、低延时地实现大范围的数据交互共享。
+
+第三个步骤是智能化,实现“人机对话”。也就是要在“万物万联”的基础上,让物与人可以交流,通过与人的智慧的融合,实现局部的智能反应与调控。
+
+第四个步骤是智慧化,实现“智慧网联”。就是借助“万物互联”“人机对话”,使整个系统中的各要素在人的智慧的驱动下,实现资源优化配置的高效运行。
+
+当然,一个个大企业的产业互联网可以由公司自己开发或者叫别人帮助开发,但是一个行业成千上万的小企业是没有能力进行数字化开发的,必须有个第三方数字化平台公司去开发。哪个企业能够开发这样的网络平台,这个企业就会成为一个产业互联网的领航者。比如广州番禺的希音公司,通过深度开发和应用,实现了这四个步骤的一体化运行,作为服装行业的一个产业互联网企业,去年做了300亿美元的服装出口,占了中国3000亿美元服装出口的10%。300亿美元的服装,通过广州白云机场出口到150多个国家的几百个城市,共计40万吨的航空货运量,占白云机场年度203万吨货运量的五分之一,机场给它批了专用跑道,只要货一到就优先发,非常了不起。希音公司按照产业互联网的布局逻辑,将与服装产业相关联的市场信息采集、需求分析、设计开发、生产制造、物流配送、产业链配套、线上线下销售的公司一网打尽,各种各样大大小小上万家企业通过互联网连接在一起,形成一个服装行业的产业互联网。在这个意义上,希音公司就是服装行业产业互联网的领航企业。
+
+产业互联网具有以下几个特点:
+
+一是产业互联网具有产值叠加效应。产业互联网与消费互联网有本质的不同。消费互联网卖掉一千亿产品就是一千亿的销售值。产业互联网如果卖掉一千亿的服装,那么这一千亿服装是由这个网络平台里的制造企业生产出来的,就相当于网络关联的这个制造企业群制造了一千亿的工业生产值,同时网络又销售了一千亿的销售值,两个一千亿产值的叠加就是两千亿;同时,网络平台里为制造业配套的零部件企业、原材料企业可能占了60%的生产成本,又有六、七百亿,再加上平台上研究开发、物流配送、其他的服务业的产值往上一加又有个一千亿,所以就构成了三个一千亿的叠加,产生三千亿的总产值。在实际的运行过程中,包括品牌、市场渠道都跟这个产业互联网连上了,产业互联网变成打遍天下,成为让人眼前一亮的一个重要品牌,几千个、上万个企业都在这个品牌的“大树”下活动。
+
+二是产业互联网将推动传统产业转型升级并重新焕发生机。
+
+因为希音公司这个产业互联网平台的存在,将珠三角地区原本要转移到东南亚或者关门的上千个劳动密集型服装制造企业又留了下来,同时带动了为服装制造企业服务配套的原材料企业、辅料企业、物流企业、设计企业等总计上万个各种各样的中小微企业的生存发展,又带动了100万人就业。由于产业互联网平台对产业链中上万个中小微企业进行了数字化赋能,就能实现市场需求、研发设计、生产制造、物流配送、市场销售等全网一盘棋,牵一发而动全身。希音公司在全球150多个国家几百个点上线下B2B、B2C和全球线上B2B、B2C的销售情况,同步的市场需求及市场行情分析情况,这些信息就会在第一时间交给网上的几十个设计单位,设计单位立即设计出20个样品,制造企业每个样品制作1000件,迅速推到市场销售。如果有5个样品的产品一卖而空,那么马上反馈回来,迅速地组织生产制作几万件推向市场,实现以销定产、以快打慢、以新打旧,这种快速反应的优势一旦建立,就会在市场竞争中取得领先。这种领先优势,既带动上万个中小微企业同步发展,又赢得消费者的喜欢认可,还得到资本市场的青睐,希音公司还未上市,其估值就超过了1000亿美元,成为了名副其实的独角兽企业。
+
+三是产业互联网必然会推动一个地区的生产性服务业加速发展。一个产业互联网之所以能够将上万家企业网络联动在一起,不是靠对上万家企业股权投资、不是靠财务补贴、不是靠渠道垄断、不是靠亲属关系,而是靠全方位的生产性服务业发展到位。一个成功的行业性产业互联网,生产销售的规模往往会很大,将带动一个地区的制造企业的发展,形成产业链集群,使这个地区成为生产制造中心;因为销售值很大,也会使这个地区成为贸易中心;因为生产销售需要物流配送,又由于体量巨大,也会使这个地区成为物流中心。产业互联网不仅带动了这个地区的制造业、贸易批发零售、物流运输,还会带动产品的研究设计和品牌开发,成为某个产业的研发和品牌设计中心。围绕这些中心的各种生产性服务业也会一并展开,会产生大量的会计师服务、律师服务、人力资源服务、绿色低碳服务、品牌专利保护及推广服务,各种金融业务的服务,各种咨询服务及服务外包的服务等等,这些生产性服务业企业也将搭载在产业互联网平台上与制造业企业融合在一起,互相缠抱依靠,形成产业互联网生态和发展新质生产力的生态。
+
+四是产业互联网将实现金融科技的全面到位。金融科技旨在解决中小微企业融资难、融资贵的问题。产业互联网使上万家企业在网上形成生产体系,各环节互相联动,每家企业的需求、生产和订单一目了然。商业银行与产业互联网一联网,对各企业尽职调查的数据应有尽有,可立体地对每个企业画像,信用、杠杆、风险高下立判,就像主办银行一样,能够快速地为产业互联网中的企业贷款融资,从而有效解决中小微企业融资难、融资贵的问题。同时产业互联网还会将网络上产生的各种产值和税收引流,拉到公司注册地,使当地形成一个区域的金融中心,不但增加这个区域的GDP,且GDP的含金量还会特别高。
+
+各地招商引资、再用各种优惠抢蛋糕的办法已难以为继。哪个地方能培养出几个行业的产业互联网,或者招商引资引进几个行业的产业互联网到当地落户,就可以将制造中心、物流中心、贸易中心、金融中心、生产性服务业中心拉到哪儿,在别人一点感觉还没有的时候,你已先行者通吃。当今世界,逐鹿中原,得产业互联网者得天下。
+
+这就是产业互联网加上中下游产业链集群水平分工垂直整合的产业新模式,是新质生产力未来发展的新业态,也将是各地、各种企业竞争的关键。这是我讲的第四个方面。
+
+# 第五部分 新质生产力相适应的生产关系
+
+生产力的发展会带动生产关系,生产关系的优化能刺激生产力发展。因此新质生产力需要与之匹配的基础性社会制度,即生产关系的构建。这涉及到改革开放,即供给侧结构性的制度化改革。这里讲得的不是广义的生产关系,而是讲技术创新本身直接相关联的一些制度。我认为有七件事情需要引起高度重视,并进行制度化的创新。
+
+第一,增大研发经费的投入。新质生产力要重视创新,特别是原始创新。我国研究开发经费的目标定位是每年占GDP的2%,这已经有十几年,有些省份、城市早就超过,但有的还在一点几,全国平均基本在2%,最近几年已经到2.5%、2.6%了。研究制定“十五五”规划和2040年远景目标时应该提出一个逻辑,设定全国研发费要占GDP的3%,到2035年是不是应当进一步提升到4%?我国过去搞基础设施非常多的投入、产能超前、建设超前,把今后二十年的基础设施需求可能都已经提前建好了,从这个意义上,将省出来的钱更多地往新质生产力所需要的科技创新上去投。这个指标是一个国家的制度化安排,是适应新质生产力发展必须要调整的。
+
+第二,增大原始创新研发经费的投入。科研创新首先是原始创新、0—1的源头发明创造、无中生有的创新。在这方面,中国过去二三十年存在的问题是投资力度不够。中国现在每年的研发费世界第二,总量不小,但是其中只有5%—6%投资在0—1的创新方面。世界发达国家,每年研发费的20%投资在0—1的源头创新上、重大发明创新的项目上。所以与发达国家相比,中国在源头创新方面的投入力度不够,到2035年应该力争使我国的原始研发创新投入占比赶上世界先进的水平,达到20%。这是一个基础性的制度,这个指标一调整,整个生产关系和新质生产力之间就比较匹配了。
+
+第三,提高原始创新成果的转化力度。在研发成果的转化上,我国转化力度不够。0—1发明以后,好不容易发明了,能够孵化出产品这一块,1—100的转化上我国转化度不够。目前中国的转化度大体上是发明量的20%,世界大体上人类发明成果的50%转化为生产力,中国目前20%的转化度在世界范围偏低。任何发明创造不可能100%转化,但40%、50%的转化是应该的。目前我国的制度是一切科研成果的知识产权专利投资者占30%,发明者、发明团队占科研成果知识产权的70%,听起来我国对发明团队高度重视,但是发明团队能发明,不见得能转化。最近这二十年,每年有上千个获得技术进步奖、创新成果奖的科研成果,但是很少有发明的人因为知识产权变成亿万富翁的,因为没有转化就没有产生生产力,就没有利润。要重视科研成果转化,还真要学发达国家的做法,发达国家不管是美国还是欧盟,知识产权专利都是三个三分之一,也就是任何科学发明的知识产权专利出来,谁投资谁拥有三分之一,谁发明谁拥有三分之一,谁转化也拥有三分之一。这样一来,如果发明者自己把它转化成生产力,那么发明者可以拿三分之二。发明者能发明,但不一定能转化;转化者情商高,懂市场,只要制度保障到位,就会有大量的转化者参与进来推动创新成果的转化。美国的《拜杜法案》就是三个三分之一的法律规范,推动硅谷成为全球研发创新及科研转化的高地。这里边我国缺一个制度机制,怎么保障转化者的利益。发展新质生产力需要这样的转化,需要有一套行之有效的科研开发的投资、发明、转化的法律制度,这也是生产关系促进新质生产力发展的重要一环。
+
+第四,建立健全培养打造独角兽的资本市场体系。好不容易1—100有了产品,怎么样把这些产品大规模生成形成独角兽,成为一个重要的产业。总体来讲,我国缺少资本市场的有力支撑,缺少金融力量的有力支持,在这个意义上,各种私募基金、公募基金、资本市场科创板怎么来推进帮助这些科创企业形成独角兽,形成重要的产业,也是我们今后要努力的事。这方面资本市场的制度安排,怎么把它到位,也是发展新质生产力的重要保障。
+
+第五,数据产权的问题。数据要素作为数字经济的重要“燃料”,与土地、劳动力、资本等生产要素不同,数据是取之不尽、用之不竭的,原始数据是碎片化的,需要加工变成有用的数据,数据产生数据,数据可以多次转让和买卖,数据在利用过程中产生了价值与产权。数据作为一种经济要素,有其特定的本质和特性,数据交易中的产权和价值界定有其特定的内涵。数据产权归属是数据产业发展需要解决的基本问题,它决定着如何在不同主体间分配数据价值、义务和责任。与土地、劳动力、资本、技术等生产要素不同的是,数据的产权问题仍未解决。土地、资本或劳动力等要素具有专属性,但数据很复杂,目前在确权方面缺乏实际的标准规则,迫切需要对数据涉及的管辖权、交易监管权、所有权、使用权等基本权利进行制度规范,这是数字经济作为新质生产力创新发展、健康发展、安全发展的基础。
+
+第六,增强对老百姓教育、文化、生活方面的投入。原来的发展比较重视物质,往往对人的发展有所忽视。现在发展新质生产力,更要重视增加劳动者创新、劳动者文化、劳动者素质的提升,这里面很重要的是在宏观分配上增加对劳动者可支配收入的分配比重。当前,我国经济发展在供给和需求两侧都面临与“人”有关的突出问题:在供给侧,劳动力供给结构发生趋势性反转,人口进入负增长和深度老龄化的新阶段;在需求侧,存在最终消费占GDP的比重偏低和居民收入在国民收入分配中的份额较低,即“双低”问题。如不干预,这两方面互相作用,会驱动经济发展进入逐步降级的“失速”陷阱。要着力在人口红利逐步消失的同时,通过深化改革、强化创新,培育和释放我国规模庞大的人力资源红利;同时,要通过改革收入分配,提高劳动报酬份额,增加消费占比,缩小收入差距,增强经济循环的内生动力。
+
+总之,过去40年来我国劳动者的可支配收入只占GDP的40%左右。在今后十几年要着力增加对人的投入,把40%变成50%,甚至到55%,我国120多万亿GDP增加10个点就是10几万亿,如果到2035年有250万亿GDP,增加10个点,就是25万亿的现金进入老百姓口袋,既提高了老百姓的消费能力,生活更美好,同时也会增加内循环的拉动力,对老百姓的生活水准和教育文化各种素质的提升都有好处。劳动者文化素养提高了,就有了更多更好的发展新质生产力的人才基础和人力支撑。
+
+第七,提高全社会对创新者的容纳度。发展新质生产力、独角兽会出现一些非常厉害的创新、创业者,这种创新、创业者是新质生产力资源优化配置、要素优化配置、企业管理方法优化配置的特殊人才,对生产的各个环节经过他的配置后会产生特殊创新,就像马斯克这样的人。我们要反思,像马斯克这样的人在中国的基层做起来,可能他还没有成功的时候就被扼杀了、被淹没了,也就是说我们的社会环境怎么容忍这种奇奇怪怪的创新者?不仅他的业务创新有别于常人,甚至个性也很奇特。在这种情况下,除了一般意义上的要重视企业家,尊重保护民营企业家的制度以外,对于新质生产力这样的创新、创造类企业家,更要给予更多的人文制度方面的保护和关怀,这里边也有文章可做,需要良好的制度管理。
+
+总之,发展新质生产力,就是要在五大板块的产业上发力,要在五个层次上进行颠覆性的创新,要培育和壮大生产性服务业,要着力全要素生产率的增长,要加快产业互联网对传统产业和实体经济的赋能,要提供有利于创新发展的制度保障,只有各方面综合发力,形成体系推进,新质生产力才能快速生成,并推动我国经济社会持续健康发展、高质量发展,从而为提升国家总体竞争实力、促进社会进步和改善民生提供坚强有力的生产力支撑。
+
+我今天就讲这些。谢谢大家!
\ No newline at end of file
diff --git "a/_posts/2024-8-19-\347\201\255\350\237\221\350\256\260.md" "b/_posts/2024-8-19-\347\201\255\350\237\221\350\256\260.md"
new file mode 100644
index 00000000000..3f3a7fcde38
--- /dev/null
+++ "b/_posts/2024-8-19-\347\201\255\350\237\221\350\256\260.md"
@@ -0,0 +1,22 @@
+---
+layout: post
+title: 灭蟑记
+subtitle: 小强打不死,但能被毒死。
+date: 2024-08-20
+author: Ajiao
+header-img: img/post-bg-2.jpg
+catalog: true
+tags:
+ - 生活
+---
+七月下旬,酷似蒸笼,蚊虫出没,家中竟然有了蟑螂,犯起了虫灾。
+
+傍晚下班回家,刚进客厅就看到木地板上虫子四散奔逃,一溜烟钻进了踢脚线下缝隙。赶上去,踩死一只。仔细一看,竟是蟑螂。蟑螂繁殖能力极强,看到一只,就意味着,有一大群。随后,房间里的虫子越来越多。厨房里、柜子里、冰箱旁,几乎到处都是,看着蟑螂遍地跑,我头皮发麻。
+
+分析家中出现蟑螂原因,有可能是因为我在拖木地板时用的拖把太湿了,导致木地板潮湿进而生虫。当然,家里有两个小孩子,零食碎屑撒在木地板上也是常有的事情,可能招致蟑螂。厨房里水盆的积水,如果没有及时泼掉的话,也可能生蟑螂。不管是什么原因,蟑螂肆虐,是不争的事实。
+
+既然有了蟑螂,而且越来越多,那就想办法处理!小红书、抖音商城、拼多多,我们先后尝试了三种低毒喷剂,还有一种食饵。每天下班回家,全家总动员,灭蟑大作战。其中,一种喷剂刺激性极大,每次喷完,脑门昏沉,喉腔干涩。然而,效果寥寥无几。妈妈说问题不大,只是宽慰而已。
+
+某天下班,老婆又带回一种食饵。看着食饵简陋的包装,我是没报太大希望的。拆了一盒,零散放在蟑螂经常出没的地方。第二天一大早,神奇的一幕出现了。首先是妈妈兴奋的告诉我,昨晚死了好多蟑螂,她已经清理了很多出去。然后,我来到食饵旁边,看到很多倒毙蟑螂,真的非常多。
+
+现在,食饵已经放置了一个星期左右了,因为效果好,还加购了一盒。每天都能看到死去的蟑螂,尤其是在冰箱旁,温暖潮湿,蟑螂最多。即便过去了有半个多月了,冰箱旁依然有蟑螂尸体出现。不过,家中蟑螂倒是越来越少,只是偶尔有虫出没。想必,过段时间家中蟑螂就能彻底消失吧!
\ No newline at end of file
diff --git "a/_posts/2024-8-7-\351\231\225\350\245\277\347\234\201\347\247\221\345\255\246\346\212\200\346\234\257\345\245\226\346\217\220\345\220\215\345\267\245\344\275\234\345\210\206\346\236\220\346\212\245\345\221\212.md" "b/_posts/2024-8-7-\351\231\225\350\245\277\347\234\201\347\247\221\345\255\246\346\212\200\346\234\257\345\245\226\346\217\220\345\220\215\345\267\245\344\275\234\345\210\206\346\236\220\346\212\245\345\221\212.md"
new file mode 100644
index 00000000000..ed18ffd4fdf
--- /dev/null
+++ "b/_posts/2024-8-7-\351\231\225\350\245\277\347\234\201\347\247\221\345\255\246\346\212\200\346\234\257\345\245\226\346\217\220\345\220\215\345\267\245\344\275\234\345\210\206\346\236\220\346\212\245\345\221\212.md"
@@ -0,0 +1,41 @@
+---
+layout: post
+title: 陕西省科技奖提名工作分析报告(2021年)
+subtitle: 关于陕西省科学技术奖数据分析
+date: 2024-08-07
+author: Ajiao
+header-img: img/post-bg-1.jpg
+catalog: true
+tags:
+ - 工作
+---
+在陕西省科学技术奖励办公室公布了2021年省科学技术奖拟奖名单后,我们认真分析了公示名单的数据特征,并结合2020年省科学技术奖授奖名单,围绕我市省科技奖提名工作的实际情况,从“对标优秀、分析差距、找准思路”出发。为做好新一年科技奖提名工作,提出了一些工作举措,具体情况报告如下:
+# 一、基本情况
+我市2021年提名省科技奖15项,8项通过形式审核,6项通过初评。在最终的评审环节,我市1项参加视频答辩,5项参加书面评审。最终,只有1项进入2021年省科技奖拟奖名单。
+从全省各地市授奖的情况看,主要呈现出以下特点:
+## 1.奖励总量减少,地市获奖数下滑。
+相比2020年奖励262项,今年奖励总数下降到246项。地市获奖总数从2020年的64项,下降到56项,各地市的省奖的授奖数总体呈下滑趋势。高校院所和医疗机构仍是获奖主力,相应的省教育厅提名54项获奖,科技厅提名14项获奖,卫健委提名15项获奖,医学会提名8项获奖。
+## 2.地市波动性大,呈两级分化趋势。
+地市获奖数波动性大,西安从2020年的18项下降到今年的9项,咸阳从2020年的6项下降到今年的1项。传统第一梯队西安、宝鸡、咸阳三市,除宝鸡从8项上升到11项(排名地市第一)外,西安和咸阳均明显下滑。传统第二梯队汉中、延安、杨凌均有不同程度上涨,其中汉中和延安上涨幅度巨大,跻身第一梯队。目前,全省地市总体呈现第一梯队(10项左右,共5家)扩大,第二梯队(5项左右,共1家),第三梯队(1项左右,6家)扩大,呈两级分化趋势。
+## 3.科技进步奖三等奖仍是地市主流。
+今年“三大奖”总计奖励了240项,其中自然科学奖、技术发明奖、科技进步奖(一等和二等奖)总计143项,各地市仅获16项,占总数的11.18%。地市奖项主要为科技进步奖三等奖。在地市提名获奖的56项中,科技进步奖三等奖占据了67.8%。科技进步奖三等奖仍是主流。
+# 二、工作启示
+对标汉中、延安、安康等科技实力接近,且获奖数较多的几个地市,从“对标优秀、寻找差距”角度,我们发现了几个特点:
+## 1.高校院所和医院占据地市半壁江山。
+在高校院所和医疗机构层面,各地市均不同程度存在资源短缺,水平不高问题,即便如此,安康、延安和汉中等地市的高校院所和医疗机构仍在科技奖申报工作中取得了辉煌成绩。以安康为例,安康今年提名科技奖超过30项,安康学院、安康中医医院、安康中心医院提名超过20项。在最终的授奖名单中,安康获奖6项,安康学院2项,安康市中医医院、安康市中心医院、安康市农科所各1项,医院和高校院所获奖数占据安康总数的83.4%。安康并非孤例,延安获奖9项,4项来自延安大学和院所。汉中获奖8项,3项来自陕西理工大学,3项来自院所。杨凌坐拥西农,更是长期位居全省前列,今年8项,7项来自西农。目前,各地市本地的高校院所和医疗机构已成为上述地市的科技奖提名工作主要阵地。相反,渭南高校院所和医疗机构多年来对科技奖获奖数的贡献为零。渭师院、渭职院、陕铁院、渭南市中心医院连续多年承担市级科技计划项目,科技产出(科技奖、专利、技术合同、横向课题)寥寥无几。今年,仅渭师院申报1项省科技奖项目,且最终落选。渭职院、陕铁院、渭南市中心医院均未推荐上报项目申报省科技奖。
+## 2.行业龙头大型国企评奖份量日益加重。
+相比西安、宝鸡等地市,其他地市行业龙头企业、大型国企数量相对偏少,但上述企业在各地市科技奖推荐工作中占据的份量日益加重。以延安为例,9项获奖成果,除了来自高校院所的4项之外,其他5项全部来自大型国企,延长石油4项,长庆油田1项。除了延安之外,汉中8项提名获奖,6项来自高校院所,其他两项分别来自陕飞和陕钢等大型国企。大型国企和行业龙头企业在科技奖评审中拥有技术积累和人才团队等先天性优势,远非临时抽调人员、临时凝练包装项目的中小企业可比。目前,渭南除了北人印机重视科技研发,多次斩获中省科技大奖外,其他诸如:中联重科、陕煤集团、渭化、蒲城清洁能源、陕焦等大型国企对科技奖贡献有限。
+## 3.大型国有行业企业与地市联系更加密切。
+大型国有企业因为行业管理体制问题,优秀的科技成果往往从行业主管部门申报,比如说:渭南高新区的金堆城钼业集团今年获得科技进步奖二等奖,由陕西有色集团提名推荐。与此同时,其他汉中、延安、宝鸡等地市,有大量的国企成果从地市推荐。以延安为例:延安今年获奖9项,延长石油4项,长庆油田1项,5项石油系统的项目选择从地市推荐。此外,汉中的陕飞、陕钢,宝鸡的中铁、中油、石油钢管等行业性大型国企,均选择从地市申报省科技奖。
+## 4.校企合作是中小企业突围重要路径。
+对于整体研发实力有限的高校院所,不具备行业话语权和影响力的中小企业,校企合作是在科技奖竞争中胜出的重要方式。以安康为例,6个获奖项目,除安康市中心医院1个项目外,其他5个获奖项目均进行了校企合作。安康本土企业紫阳中地大硒科技有限公司,与国内知名大学中国地质大学(武汉)进行了合作,成功获奖。安康学院的成果在本地企业安康市汉滨区安瀛农业科技有限公司、安康阳晨现代农业集团有限公司进行转化,获奖两项。通过校企合作,达到了有核心知识产权、有经济效益的条件,最终在省奖评选中胜出。渭南师范学院今年申报的“斑马鱼母源性补体的传递与功能研究”项目,仅与中国海洋大学进行了合作,并未与本地企业结合,没有明显的经济效益,参评自然科学二等奖,未能入围。
+# 三、工作建议
+从上述分析可得,随后科技奖提名要做到四个聚焦,聚焦本地高校院所和医疗机构,聚焦大型国企和行业龙头企业,聚焦科技进步奖三等奖,聚焦校企合作,以提高推荐质量和获奖数量。
+## 1.发挥科技项目杠杆作用,聚焦本地高校院所和医疗机构。
+从市级科技计划项目申报和资金分配入手,通过组织高校院所和医疗机构座谈会、签订项目合同任务书、设定项目申报条件、加强科技成果登记等方式,调动本地高校院所和医疗机构科技成果资源,强化本地高校院所和医疗机构成果产出。
+## 2.改变资金项目配置思路,聚焦大型国企和行业龙头企业。
+大型国企和行业龙头企业拥有技术沉淀、人才积累、行业影响等先天优势,在科技奖评选中拥有极强的竞争力,建议梳理大型国企、行业龙头企业,形成重点企业名单,有重点的深入企业调研,在中省市科技计划项目推荐和安排、创新创业平台搭建、人才评审和奖项推荐等科技资源配置时改变“广泛征集”思路,“有针对性”向大型国企和行业龙头企业靠拢,加强日常联系,加大支持力度,发掘更多成果,推荐更多成果。
+## 3.再设渭南市科学技术奖,聚焦科技进步奖三等奖。
+科技进步奖三等奖是各地市争取科技奖数量的主要阵地,主要考量两点:一必须要有核心知识产权,二必须要有显著的经济效益。科技进步奖三等奖采用书面评审,书面材料水平高低直接影响到最终结果。为了聚焦科技奖三等奖,需要提高申报奖项的数量和质量。建议对标省科技进步奖三等奖申报条件,重新设立渭南市科技进步奖。在每年省奖提名前,完成市奖的征集和评审。如无法设立渭南市科技进步奖,建议市级科技计划项目设立优秀成果转化案例专项,年前单独征集、年后单独评审。获奖项目或立项项目统一纳入市级科技计划项目体系给予支持。以便做到报奖有的放矢,提高省奖提名数量和质量。同时,组织科技奖业务培训,邀请往年获奖单位就科技奖申报资料的编制、科技成果的筛选、校企合作和成果鉴定等业务进行培训,提高科技奖申报材料的编制水平。
+## 4.多下基层调研推动校地合作,提升成果核心竞争力。
+多下基层调研,宣讲相关政策,推动校企合作。对于现有的校地校企合作项目要出成果,对于西农在渭试验示范站、西安交通大学国家技术转移中心、渭南市科技创新发展基金运营团队,要下达科技奖提名任务;对于本土高校的校地校企合作要改变思路,鼓励研发实力和水平有限的本土高校加强与本地企业合作,引导从地市推荐上报(省教育厅推荐获奖的54项,仅宝鸡文理学院牵头1项,其他均为西安高校,再无其他地市高校牵头);重点冲击科技进步奖三等奖(除西农外,三大奖再无地市高校牵头项目);对于有一定研发实力的中小企业,建议与省内外知名高校院所合作,提升核心知识产权行业影响力,提升评奖核心竞争力。
diff --git "a/_posts/2024-9-2-\345\210\235\345\277\203\344\270\216\345\235\232\345\256\210\357\274\232\344\270\200\351\203\250\346\210\221\344\273\254\350\207\252\345\267\261\347\232\204\345\225\206\344\270\232\345\217\262.md" "b/_posts/2024-9-2-\345\210\235\345\277\203\344\270\216\345\235\232\345\256\210\357\274\232\344\270\200\351\203\250\346\210\221\344\273\254\350\207\252\345\267\261\347\232\204\345\225\206\344\270\232\345\217\262.md"
new file mode 100644
index 00000000000..62519e20126
--- /dev/null
+++ "b/_posts/2024-9-2-\345\210\235\345\277\203\344\270\216\345\235\232\345\256\210\357\274\232\344\270\200\351\203\250\346\210\221\344\273\254\350\207\252\345\267\261\347\232\204\345\225\206\344\270\232\345\217\262.md"
@@ -0,0 +1,243 @@
+---
+layout: post
+title: 初心与坚守
+subtitle: 一部我们自己的商业史
+date: 2024-09-02
+author: Ajiao
+header-img: img/post-bg-3.jpg
+catalog: true
+tags:
+ - 学习
+---
+在当代中国的商业史里,1984年是绕不过去的年份,围绕“非公有制经济”的争议与摇摆在这一年里等来了一个重要的转折。
+
+尽管距离十一届三中全会正式提出改革开放已经过去了五年,但对于这个庞大的经济体来说,旧体制的巨大惯性不可能在一夜之间扭转,私营经济也很难随着一次会议的召开就变成如空气般所有人习以为常的存在。
+
+在1984年的十字路口,民间各种“经商大王”在打击经济犯罪的过程里,身陷“投机倒把”的拉扯中,合法性悬而未决。
+
+1983年8月的最后一天,人民日报头版头条刊登了一则标题为《怎么划分光彩与不光彩》的讲话稿。这是前一天召开的集体经济与个体经济先进代表表彰大会的重头戏,时任总书记让到场的同志们回去传个话:
+
+_说中央的同志讲了,集体经济和个体经济的广大劳动者不向国家伸手,为国家的富强,为人民生活方便,做出了贡献。党中央对他们表示敬意,表示慰问[1]。_
+
+继“光彩讲话”之后,1984年中央下发一号文件又再次强调:不可把政策允许的经济活动同不正之风混同起来,不可把农民一般性偏离经济政策的行为同经济犯罪混同起来。直截了当的中央喊话,加上邓小平随后南下巡视为进一步改革开放定下最强音,民间紧绷的思想终于得以解放。
+
+1984年前后,王石、张瑞敏、柳传志等人投身第一次下海经商浪潮,万科、海尔、联想的前身接连成立,史玉柱、段永平等人正准备踏上前往珠三角创业的旅程,任正非也在这一年离开了部队,复员转业南下深圳这片热土。中国的商业周期迎来改开后第一个蓬勃向上的时期。
+
+
+
+1983年的“深圳第一路”深南大道,深圳卫视
+
+但是紧张的气氛并没有完全走远。
+
+1984年春,在高山镇异型玻璃厂(即福耀玻璃前身)合资问题面前,曹德旺此前的合伙人们选择退出。他们用当时流行的顺口溜回应曹德旺的办厂热情——党的政策像月亮,初一十五不一样,然后就拿着钱走了。孤勇的曹德旺,抱着坚定的信念:**改革开放的政策是真的。**
+
+在这一块具体的时代切片下,是这群被后来人叫做“84派”的企业家,几乎每个人都必然经历的豪赌。孤注改革开放信仰的背后,是彼时整个社会对私有经济这个新生事物的陌生与困惑,而政策风向的摇摆也让更多人倾向于选择保守地生活在一贯的确定性中。
+
+《传习录》有句话叫做“未有知而不行者。知而不行,只是未知。”同理,真正下到市场之海中,在一次次抉择、一段段曲折,实践着认知的人也总是少数。
+
+非知之艰,行之惟艰。因此,也只有把企业家放在“知与行”的统一里,才能更充分的理解他们所创造的商业文明。
+
+从十一届三中全会的召开,到整个80年代断断续续的寻路,现代中国的商业探索在钟摆来回摩擦的夹缝中曲折前进,直到1992年迎来翻天覆地的新气象。
+
+## 01 为学还是从商?
+
+在中学政治教科书里,1992年是一个反复被提及的变化之年。
+
+这一年年初,邓小平到深圳、珠海、广州、上海等南方城市巡视并发表讲话;同年5月,国家体改委颁布的《有限责任公司规范意见》、《股份有限公司规范意见》第一次为民间的创业提供了制度保障;10月召开的中共十四大,正式确定我国经济体制改革的目标是建立社会主义市场经济体制。
+
+90年代以后出生的人们对这些历史时刻的理解几乎全部来自于书面材料,但对于趟过80年代纷争一路走到1992年的中国商人们而言,“市场经济”这件事终于得到官方最为正式的认可,身份合法化带来了现实环境的巨变:商业界迎来了前所未有的笃定与活力。
+
+一个颇具历史意义的现象是,延续了数千年“士农工商”排名分先后的中国社会出现了一个洋务运动之后再没有出现过的潮流:官员下海兴办企业。
+
+据当时人事部门的统计,1992年主动辞官下海者有12万人,形成了改革开放商业史里第二波重要的企业家群体——“92派”,包括陈东升、田源、毛振华、冯仑、俞敏洪、张文中等代表人物在内的“92派”,均是恢复高考后的大学生,毕业后大多数是在体制内参与政策研究、体制改革的知识分子。
+
+他们对变化的本质有着敏锐的洞察:**法治作为市场经济的基本条件,终于出现了。**
+
+作为“92派”这个概念的提出者,陈东升不止一次在公开场合表达过自己的看法:许多人低估了《有限责任公司规范意见》、《股份有限公司规范意见》这两份文件对于中国商业史的重要性。它们的印发第一次为民间的创业提供了制度保障,使得当时的创业者们可以不用重蹈“84派”在产权模糊中命运多舛的覆辙。
+
+因此,陈东升对“92派”这个群体的定义,不是简单地以1992年创办企业为划分,而是指以这两份文件及1993年出台的《公司法》为制度依据,在明晰的产权界定与市场规则下试水中国现代企业的那一批企业家。
+
+出生于1957年的陈东升,1983年从武汉大学政治经济系毕业后,一心想做一个学者,就进了对外经济贸易合作部国际贸易研究所发达国家研究室做研究。1988年,赴任国务院发展研究中心《管理世界》杂志社副总编后,模仿美国财富杂志500强评选,编制了一份“中国100家最大工业企业”的名单。这改变了他的价值选择和他的人生。
+
+那时关于中国如何富强起来社会上有很多讨论,主流观点是科技强国和教育强国,陈东升开始也是这两种路径的拥趸。当他把中国500家大企业和世界500强榜单进行对比研究,得出一个结论:**没有一大批在国际上数得着的大企业,国家的强盛无从谈起。**
+
+从那时起,实业报国的理想就在陈东升的心中扎根。而1992年发生的所有变化都预示着他们这一代人迎来了绝佳的窗口期。
+
+陈东升做出了一个重要的人生选择:自己做出一家世界500强的中国企业,实现自己的家国情怀,为推动国家富强贡献自己的力量。
+
+1993年,陈东升辞去体制内的工作,下海创办了中国第一家综合性拍卖公司中国嘉德;嘉德办得很成功,但对于陈东升来说这并不够。他很清楚,拍卖是小众行业,无法承载创办一家世界500强企业的远大理想。
+
+早年赴美国、日本等发达国家考察,看到闹市街头林立着的保险公司广告牌时,他就一直对人寿保险业保持着很强的敏感性。他相信,随着中国经济的发展,中产群体会逐步壮大,保险业会是那个可以施展巨大发展空间的赛道。
+
+初心决定定位,定位决定战略,战略决定一切。后来在《战略就是一切》里,陈东升总结道:“如何在时空变化中找到正确的方向,是每个创业者面临的首要问题。核心是‘做什么生意’和‘做什么人的生意’。”
+
+“做什么生意”本质上是行业定位,是选赛道。一个商业常识是,发展空间要足够大,天花板要足够高,行业周期要足够长的赛道,才有更大的概率做成大企业。此外,好赛道有许多条,一定要从中选择可以发挥自己长处的事情。陈东升学的是经济学,金融服务业自然成为了他的首选。
+
+“做什么人的生意”是客户定位。在政府、企业和个人这三个维度,做个人的生意受到非市场因素的影响最小,是市场经济下最好的生意。寿险的背后是一个伴随中国经济发展逐渐壮大的中产群体,这是陈东升坚信不疑的。
+
+在广阔的视野和前瞻的思考下,陈东升为“做大中国企业以强盛国力”的初心,找到了最适合自己的定位——寿险行业是一个再清晰不过的选择:行业空间大、天花板高,客户定位也符合他对中产人群会日益庞大的判断。
+
+认知是坚定的,但现实的复杂考验着陈东升行动的决心。
+
+在他申请和等待人寿保险牌照的四年里,更多的人蜂拥到证券、信托公司或者城市信用社的行业里。很多朋友和拟议中的合作伙伴等得不耐烦,都劝陈东升放弃寿险,跟随大流。
+
+但这一切并没有动摇陈东升的初心和对寿险的认知。
+
+1996年,泰康人寿成立,成为《保险法》颁布后国内首批股份制保险公司。取意“国泰民康”的背后,也蕴含着陈东升对从商这件事更深远的价值追求:为了国家强盛,为了民众福祉。
+
+对于知识青年出身的陈东升来说,这种价值选择也是“92派”身上鲜明的特点——**他们希望自己的实践所创造的不仅仅是一个企业的财报数字,而是站在市场经济、法治经济的起点上,来树立中国人自己的商业文明。**
+
+与早年草根创业那种杀出一条通路的江湖气管理方式不同,这批带着些书生意气的“92派”也是最早一批把商学院和现代企业管理学引进国内的人。
+
+1994年,北大光华和中欧国际工商管理学院相继诞生。此后数年,读商学院在企业家群体里蔚然成风。2000年,陈东升用外资股东提供的250万美元援助费,联合北京大学和母校武汉大学办了两个EMBA班,让包括他自己在内的泰康所有管理人员完整学习了工商管理硕士课程。
+
+对于以陈东升为代表的“92派”来说,知识分子出身的他们在一个逐渐规范化的市场环境中创业,经商本身不再需要经历惊心动魄的意识形态拷问,长期主义开始生根发芽,在这批企业家的企业家精神滋养下,在公平竞争、优胜劣汰的市场经济下,为过去一片空白的中国现代企业理论与实践,做出了突破性的贡献。
+
+理想照进现实。2011年,在创办泰康的15年后,陈东升登上了《财富》(中文版)“未来15年可能影响中国商业进程的5位人士”榜单。2018年,泰康又首次跻身《财富》世界500强榜单,陈东升实现了创办一家世界500强中国企业的初心。如今,泰康不仅连续7年登榜,企业综合实力每年也在稳步上升,是中国民营企业的标杆。
+
+不过,回望当年那支泱泱10万官员下海的创业大军,这仍是一个残酷的大浪淘沙。今天仍然活跃在商界的“92派”脱颖者,也都逃不出一个“熬”字。
+
+毕竟,走入市场经济的过程,并非只有和煦的春风,还有骇人的风暴。“92派”留下的商业智慧,也不只有对机遇的把握,也有对风暴的理解。
+
+正如泰康内部常常提到的一句老话:“现实比理想来得更加伟大”。身处在经济波动与市场竞争一线的企业家们,永远在面临知行合一的挑战。不忘初心的成功之所以难,是因为大多数人总会在“威逼利诱”中屈服于短期的现实环境,最终在不断地折中里失去了自己。
+
+被他的同龄人和后来者视作企业家典范的陈东升,又是如何在风浪之中坚定不移地在长期主义者条道路上走下来的?
+
+## 02 短期还是长期?
+
+有市场经济的地方,就必然会经历商业周期。中国的创业者们在这一场涉及了十几亿人口的生产力革命中,既迎来了高速的发展,也遭遇了发展中的新问题。
+
+1993年,经济发展速度明显加快,上半年的工业总产值比1992年同期增长25%。在一片热火朝天下,通胀魅影逐渐浮现。央行不得不将一年期存款基准利率上调到10.98%,来抑制居高不下的通胀。
+
+1996年底,通胀得以控制,国民经济实现“软着陆”。然而亚洲金融风暴接踵而至,国内经济增速放缓并开始出现通缩的局面。
+
+利率在急风骤雨里快速走低,从1996年5月到2002年2月,央行连续八次降息,一年期存款利率又从10.98%一路下调到1.98%。
+
+宏观利率的大幅波动,许多行业不一定会有即时的体感与反馈,但对于保险来说,利率就是这个行业的“物价水平”,急剧下降的过程对所有保险公司的经营者都带来了非常具体的挑战——利差损。
+
+所谓利差损,是指保险公司的投资收益率小于有效保单的平均预定利率而造成的亏损。一旦进入降息环境,社会整体的投资回报率走低,高预定利率的保单卖得越多,保险公司面临的长期亏损风险就越大。这把悬在保险公司头上的达摩克利斯之剑,夺走过美国、日本许多保险公司的性命。
+
+然而,就在降息周期开启前,刚诞生没多久的中国保险业为了能与银行竞争,仍在大量推出预定利率8.8%的终身寿险保单。到1997年年末,一年期存款利率降至5.67%后,许多保险公司仍然在出售预定利率7.5%的保单,以换取更多的保费。
+
+
+
+1993年至2004年的银行存款利率与终身寿险预定利率对比
+
+1997年11月7日,央行作为彼时的保险监管部门下发了一则《关于调整保险公司保费预定利率的紧急通知》,将人寿保险业务的保费预定利率上下限调整为年复利4%至6.5%,并从1997年12月1日起新签发的保单必须符合以上调整。
+
+窗口期本是为了提供过渡,但许多保险公司则是在11月的最后一周用最后的高利率“竭泽而渔”。老保险人都经历过那个公司保费收入一天就能破千万的激动,但更资深的从业者则开始深深忧虑巨大的利差损会成为这个尚不成熟的行业日后长期的负累。
+
+
+
+一张1997年9月售出的终身寿险保单,预定利率为7.5%
+
+成立于1996年的泰康,生于风暴前哨。对于陈东升来说,继募资之后,他旋即要做出下一个决定泰康长期命运的关键选择——**面对行业如此激烈的竞争,要不要用不可持续的高收益率来换取短期的规模增长?**
+
+陈东升最终给泰康定下了“不求最大,但求最好”的战略目标。在同行不顾风险通过粗放的人海战术快速扩张时,泰康则用严格的面试和筛选流程来确保招聘到具有一定教育背景和潜力的人才,以打造出一支“专业化、规范化、国际化”的队伍。
+
+在高校还没有大扩招的90年代,泰康对应聘人员提出了“35岁以下,大专文化程度以上”的硬性要求,标准之高丝毫不亚于今天互联网大厂的门槛。此外,应聘人员在通过严格面试后,上岗前还要经过层层考核筛选和实战训练,每天都有人被淘汰。前三期最终招募的营销人员,基本都有当年的大学本科学历。
+
+在那个大多数人对“市场经济”这四个字的追逐,只与短期增速有关的年代里,陈东升走到员工招聘与培训的第一线,一遍又一遍讲述公司的理念和愿景,为年轻人提供提升专业技能的培训。
+
+而经历了二十世纪最后几年的惊涛骇浪之后,陈东升也更加清楚地认识到,保险行业巨大的财富效应背后是沉重的社会责任——**“保险业是社会的稳定器,是社会经济的压舱石。一个没有价值观和行为准则的企业,怎能承担这样的社会重任?”**
+
+但更宝贵的一点是,在整个行业短期快速扩张的压力下,在那些一天之内规模激增的诱惑里,陈东升保持了一个企业家难能可贵的理性,始终站在更高的视角观察市场、研究行业、理解世界,用远见和坚持确保泰康在追求长期战略的过程中不会因为无数短期噪音而迷失方向。
+
+实际上,泰康能够在嘈杂的市场中保持自身的战略定力与长期主义,也得益于陈东升对治理结构重要性的认知。
+
+在《战略就是一切》里,陈东升总结道:股权结构是最核心的制度安排。股权结构是治理结构的基础前提,而企业的稳定发展是获得股东信任的基础。另一方面,股权结构也决定了企业家的行为,当企业家有足够的安全感,才有可能去追求长期目标。
+
+因此,即便泰康成立之初有资金困难,陈东升仍然通过自己的方式,坚持在股权设计上为泰康的长期主义打好坚固的地基。
+
+1996年终于拿下一张保险牌照后,泰康进入筹建期。当时央行明确要求保险公司的注册资本不低于5亿元,而且对股东总资产、净资产以及利润有严格的要求。但陈东升作为发起股东,即便有嘉德的成功在先,咬牙只能拿出1000万元。
+
+即便面临巨大的缺口,陈东升仍然坚持自己的立场:
+
+1)不要控股股东,每个股东出资不得超过5000万元;
+
+2)所有股东不派经营人员,由后来被推选为董事长的陈东升全权负责搭建经营班子;
+
+3)在最初的投资入股合同中,加入了一项条款:“鉴于嘉德拍卖公司独立承担了公司申报组建期间的全部工作和风险费用,允许该公司在未来3年内将资本金增加到 5000 万元。”
+
+陈东升告知所有股东 “泰康做寿险不是赚快钱”,事实上,在创立泰康人寿的前7年里,他自己也的确没有赚到一分钱。但股权设计的精妙,保证了泰康在稳定的经营治理下稳健成长,并在更长期的维度里创造出可观的股东回报。
+
+对于当年筚路蓝缕的泰康来说,创业之初对治理结构的坚持与长期巨大的人才投入,难以用短期结果来衡量好坏,考验的既是企业家的价值取舍,也是他们的行动定力。而陈东升的所有选择和坚持,最终让泰康得以在宏观周期的巨大波动中站稳了脚跟。
+
+1998年11月,原中国保监会主席马永伟到泰康调研,对泰康的发展路径给予肯定,鼓励泰康人寿要按市场规律建立现代企业制度,力求更大发展。
+
+在陈东升看来,“更大发展”也正是泰康在渡过生死关之后最重要的事情。**因为金融企业是不存在小而美的,一定要有规模。“没有规模就没有市场地位……企业不存在是先做大还是先做强的问题,只可能是先做大再做强[2]。”**
+
+但在扩张之前,亚洲金融风暴的冲击也让陈东升看到了金融行业的脆弱,因此,在扩张分支机构之前,泰康决定先引入外资壮大资本。现代化的治理、国际化的标准,也帮助泰康获得了海外大型机构的认可,最终顺利筹集11.6亿元人民币。
+
+高标准的队伍建设奠定的长期人才基础,与世纪末成功引入外资打下的厚实资本基础,使得泰康在熬过金融危机之后,成为彼时保险业「超常规跨越式发展」的典型。在陈东升知行合一的定力之下,泰康也以非常稳健的姿态成长为中国保险行业一张颇具代表性的名片。
+
+在新书《战略决定一切》里,陈东升写到:“对于这些宏观问题,任何企业都没有能力去施加影响,只能未雨绸缪,准备好应对。当发生金融危机或者经济危机,所有人都会遭殃,股票债权价格下跌,资产严重缩水。世界一片恐慌的时候,你能够说‘我很好’的情况是不存在的,只会是‘我相对比你好,你比我更差’。”
+
+事后来看,战略定力与价值观的坚守,是一个现代企业在市场经济的周期波动里能够的无形资产。但在彼时彼刻,没有人能告诉90年代的企业家十字路口应该如何选择。这是一条本没有人走,有人活着走出来了才留下的路。
+
+大时代下,人总是容易随波逐流,当市场从无到有一片蓬勃时,太多的人在机会主义的诱惑下不断改变方向,希望用最短的航线驶向财富的彼岸。但唯有跳出短期利润的左右,用长期主义去定位企业的社会价值,才有可能驶出凶险。
+
+对于今天的中国商界而言,万里无云、风平浪静的时代已过,在这个风云变化、充满不确定性的时代里,所有的创业者也早晚都会走到自己的十字路口,“92派”在中国商业变迁、经济波动中留下的经验,是后来者弥足珍贵的教科书。
+## 03 多元还是专业?
+
+
+2001年,中国正式加入WTO,全球化进程的提速带来的经济增量,消化了90年代末遗留下来的许多包袱,但也有太多的人,来不及留下他们的血泪,就消失在了黎明前的黑暗中。
+
+这一年,吴晓波的《大败局》红遍了大江南北,以案例分析的形式深入剖析了多个民营企业。它们都曾在充满激情的改革年代里,成为辉煌的弄潮儿,但最终走向令人扼腕的陨落之路。这本书序言的标题大胆而直接——从中国企业的“失败基因”谈起。
+
+吴晓波的这部成名作让许多企业家看到了盲目多元化扩张的沉疴,业界一度掀起了企业发展应该通过“多元化扩张”还是“专业化经营”的争辩。而同一年出版界另一本关于企业管理的畅销书,恰恰是刚刚被翻译成中文的《杰克·韦尔奇自传》。
+
+彼时,这位通用电气的时任CEO是世界上最负盛名的企业管理者。他在任期内,把GE打造成全球最大的多元化商业帝国,市值从130亿美元增长到超过4000亿美元,位居当时的世界第一。他的成功也把“多元化”这三个字推上了21世纪初管理学的金字塔尖,引诱着全球无数企业家去伸手触碰。
+
+除此之外,中国老板们还有更迫切的焦虑。
+
+社会主义市场经济如火如荼地搞了十年,商品供应从严重不足,走向了部分低附加值的领域出现过剩。最具代表性的就是2000年九大彩电巨头组建了“价格同盟”,试图避免陷入追求低价的恶性内卷。而1999年底海归派携着信息浪潮归国,创办的大大小小互联网公司则沐浴在方兴未艾的春风里。
+
+多元化的好处显而易见。一方面,金融风暴给太多人留下了“不要把鸡蛋放到一个篮子里”的警醒,另一方面是新浪潮来得汹涌,人们生怕不多做点新业务就会被新时代淘汰。
+
+对于陈东升来说,泰康也面临同样的路径选择问题:21世纪初银保渠道的高速扩张中,对短期产品唯规模论这种不符合寿险长期经营规律的行业现象,保持高度警惕,泰康需要提前布局一场战略转型。
+
+摆在陈东升面前的又一个关键问题是:**泰康的壮大是通过切入更多的业务来实现快速扩张,还是深耕寿险发掘这个产业更多的价值?**
+
+进入21世纪之后,泰康将自己的“三化”修正为“专业化、规范化、市场化”,并进一步明确了它们的含义:坚持专业化,专注主业、专注专业,在商业模式上规避多元化的风险;坚持市场化,走亲清政商关系的道路,避免政治上的风险;坚持规范化,不搞监管寻租,避免监管的风险。
+
+追求专业化发展道路的泰康最终也的确选择深耕寿险产业链,而不是盲目扩张到其他领域。在陈东升看来,随着改革开放的深入,市场会越来越成熟,只有走专业化的道路,才能让企业聚焦资源和精力不断深耕。对于泰康来说,最重要的命题始终是提高自己在寿险领域的核心竞争力。
+
+**更关键的因素是,在寿险行业里多年的深耕与实践让泰康颇具前瞻性地切入了一个重要的社会议题——人口老龄化趋势之下,数以亿计的中国人如何更体面的生活在一个更长寿的时代里?**
+
+实业报国的初心与造福社会的终极目标,让陈东升为泰康写下“大健康、大民生、大幸福”的定位。这种价值观层面的认知与自我期许,也在推动他去挖掘和创造寿险赛道更深层的社会价值。
+
+2007年泰康就投身到“长寿时代”,全面推进医疗大健康产业的布局,并在全国各地建设“泰康之家”实体养老社区。通过“幸福有约”实现了“**虚拟保险+实体医养服务**”的产品创新,开辟出新的市场和新的客群,突破了传统寿险的天花板,为走入创新深水区的保险行业提供了一个全新的“泰康模式”。
+
+在这个探索的道路上,泰康早期遵循“创新就是率先模仿”的理念,率先将美国养老社区引进中国。与此同时,执行与落地的过程里,泰康更真实地接触到了更多中国市场独有的特征与需求,在不断修正实践之后,诞生了“泰康模式”这个中国保险业开创性的自主商业创新:把“从摇篮到天堂”的理想变成现实的商业模式,服务全生命周期,为不断变老的世界和长寿时代的到来探索了一个企业解决方案,也在世界商业史上留下了一个中国印记。
+
+在《战略就是一切》里,陈东升写到:企业竞争本质上是战略的竞争。我认为做企业就是写一篇大文章。先想好结构、如何开篇和结尾,以终为始,善始善终,中间不受任何诱惑,不做没想好的事情,不做跟战略不相关的事情。
+
+但具体怎么做?从“要更多的钱还是要更好的治理”、到“要一时的规模还是要长期的正确”、再到“要多元化的庞大还是要专业化的壮大”,没有什么人能够为陈东升提供有效的经验,因为没有人走过他们那一代人走过的路,他必须要依靠自己的商业直觉与价值选择,不断地在实践中验证自己的道路。
+
+让自己成为活下来的人,才能把一切沉淀为经验。
+
+回望这个过程,泰康的发展壮大是战略的成功,但最根本的是陈东升的知行合一:逐步具化的初心理想、持续提升的战略认知、持之以恒的实践创新、矢志不移的价值坚守。所以即便面对短期的压力与挑战,即便在专业化的道路中走向更复杂的无人区,也不会动摇战略目标。最终,过往的一切选择造就了一家企业的今天,与此同时,它今天的一切决策,也在定义着它自己的未来。
+
+这条深耕寿险产业链的道路,不仅让陈东升实现了“做一家世界500强中国企业”的初心,更让他超越了这个最初的目标,从而延展了泰康的战略纵深与社会价值。
+
+**对于陈东升来说,泰康必须深入“长寿时代”的命题来做寿险产品的创新,本质上是在人口老龄化的时代命题下,为中国社会提供一个企业解决方案,减轻个体与国家的负担。**站在这个更高的立意之上,直面健康与养老这个未来最重要的民生问题,是陈东升为这个事业所定义的真正价值与使命。
+
+今天,当几乎各行各业都在直面中国人口老龄化这个巨大的现实境遇,试图通过创新来重塑企业价值时,泰康也就成为了一个绕不过去的学习对象。
+
+当然,对泰康而言,商业创新与探索的进程显然也还没有结束,在宏观利率进入一个长期下行趋势的时代,寿险依然面临着严峻的挑战。
+
+但就和今天所有面对转型考验的中国企业家一样,知行合一地走下去,本身就是在拓宽中国自己这本商业史的厚度。
+## 04 尾声
+
+中国当代的商业变迁,明线离不开改革开放这一场宏大叙事,暗线则是无数个微观层面的企业在日复一日地向前跋涉,是从90年代的社会碰撞与周期波动一路走来的企业家们,不断地为这个商业社会添砖加瓦。
+
+今天,人们常常会把一切叙事简化成一部时代电梯:改开的前四十五年,电梯一路向上,不管以什么样的姿势,哪怕是个草台班子,都能站到高楼之上,成就了如今的企业家。
+
+但如果我们真的仔细回望过去,从来没有什么线性的向上,看似气势如虹的高增长时代,同样面临过巨大的困难与挑战,是怀抱着“事在人为”的人们,在波动的周期与摇荡的钟摆下,在具体的市场竞争和创新的无人区里,为经济发展探索出了各种各样的新模式。
+
+全国工商联合会曾经披露过一个触目惊心的数字:我国民营企业的平均生命周期只有 2.9 年,其中60%的民营企业在5年内破产。在这种残酷的淘汰赛下,短期的生存压力常常会让企业失去长期焦点,然后在四处碰壁的头破血流中,走向遗憾。这同样也是年轻一代的创业者与企业家或早或晚都要面临的曲折。
+
+幸运的是,一批伴随着社会主义市场经济体制确立而成长起来的企业家们,在大浪淘沙的探索里积累了多年的总结与反思,勾勒出中国人自己的市场经济商业史轮廓,沉淀为后来者不可或缺的养分。
+
+“92派”从未远去,他们站在中国市场经济与现代企业制度的起点上,为新一代的创业者与企业家们提供参考,指引航向,帮助中国经济走进更远大的前程里。
\ No newline at end of file
diff --git "a/_posts/2024-9-25-\346\236\201\345\272\246\350\257\241\345\274\202\347\232\204\345\214\210\345\245\264\344\272\272.md" "b/_posts/2024-9-25-\346\236\201\345\272\246\350\257\241\345\274\202\347\232\204\345\214\210\345\245\264\344\272\272.md"
new file mode 100644
index 00000000000..cbf379c7354
--- /dev/null
+++ "b/_posts/2024-9-25-\346\236\201\345\272\246\350\257\241\345\274\202\347\232\204\345\214\210\345\245\264\344\272\272.md"
@@ -0,0 +1,591 @@
+---
+layout: post
+title: 极度诡异的匈奴人
+subtitle: 转载自微信公众号《最爱历史》
+date: 2024-09-25
+author: Ajiao
+header-img: img/post-bg-4.jpg
+catalog: true
+tags:
+ - 学习
+---
+
+白登山上,天寒地冻,一如刘邦的心情。
+
+
+
+他于隆冬时节亲率大军出击匈奴、镇压叛乱,一路势如破竹,却在最后轻敌冒进,落入埋伏之中。放眼望去,周围全是匈奴骑兵,而汉军主力迟迟无法突破封锁,来到他的面前。大汉皇帝在饥寒交迫中度过了漫长的七天,最后他采用陈平之计,贿赂单于妻子阏氏,才得以逃脱。
+
+
+
+这是汉、匈之间第一次大规模交锋。这个游牧族群对刘邦来说并不陌生,只是,他们什么时候变得这么厉害了?
+
+
+
+战国时期,燕、赵、秦三国向北扩张,将胡人打得抱头鼠窜。秦灭义渠之戎,置陇西、北地、上郡;赵破林胡、楼烦,置云中、雁门、代郡;燕破东胡,使其远遁千里,置上谷、渔阳、右北平、辽西、辽东郡。农业文明似乎扩张到一个极限了,保卫边境成了重中之重,于是人们开始建造长城。
+
+
+
+战国末年,赵国名将李牧守边。在一场战役中,李牧大破匈奴十万余骑,此后边塞十余年再看不见匈奴骑兵的身影。秦统一之后,蒙恬深入北方,击破匈奴,夺取“河南地”(今内蒙古河套伊盟一带)。
+
+
+
+也就过了大约二十多年,匈奴人已经不是当年的旧模样了。刘邦及其继任者必须要了解自己的对手。匈奴是一个怎样的族群?他们为何骁勇善战?弱点在哪?该怎么反制?
+
+
+
+
+
+▲战国时期列国长城分布图。图源:最爱历史
+
+
+
+
+
+
+
+## 贪婪的对手
+
+
+
+我们不妨来看看时人对匈奴的认识。
+
+
+
+刘邦的谋士刘敬曾出使匈奴,因在平城之战中劝阻刘邦不要冒进而被拘禁。刘邦逃出来之后,向他请教应对之策。刘敬提到,匈奴之主冒顿单于杀父代立、以母为妻,又说匈奴人贪钱,于是提出和亲之策。其本意是想利用金钱和通婚,同化匈奴。事实证明,刘敬对汉文化太过自负了,娶一个汉人公主并不会让匈奴人移风易俗。
+
+
+
+文帝时,贾谊曾估算匈奴的实力。他认为,匈奴大概六万骑兵,五口之家出一士兵,那匈奴一共才三十万人。因此,他献上“三表”“五饵”之策,也就是厚待匈奴南来者,以奢侈的生活引诱他们归附汉朝。贾谊的问题依然是傲慢。匈奴人不可能只有六万骑兵,而且按照其习俗,五口之家不止一人当兵,整个估算都建立在臆想之上。
+
+
+
+晁错则相对务实一些。他知道匈奴在苦寒之地成长,逐水草而居。根据这一点,他分析汉匈双方的长处:匈奴人马好,骑射功夫好,不惧风雪;汉人装备好,战阵佳,步战强。因此,他建议以夷制夷,并且迁徙民众充实边境。
+
+
+
+武帝时,人们对于匈奴的了解已经非常深了。《史记·匈奴列传》中描述,匈奴“逐水草迁徙,毋城郭常处耕田之业,然亦各有分地。毋文书,以言语为约束。儿能骑羊,引弓射鸟鼠;少长则射狐兔,用为食。士力能弯弓,尽为甲骑。其俗,宽则随畜,因射猎禽兽为生业;急则人习战攻以侵伐,其天性也。”
+
+
+
+司马迁依然无法摆脱偏见,比如“利则进,不利则退,不羞遁走,苟利所在,不知礼义”。这明显是用华夏的尺度去丈量游牧的世界。不过,这些文字仍给后人留下了一段关于游牧社会的珍贵历史记忆。
+
+
+
+提到游牧,大部分人会想到这样一幅画面:牧民在广阔的草原上骑着马,驱赶着畜群,随处放牧,自由自在。当他们拿起武器,就是最凶悍的战士。然而,这只是人们的浪漫想象。
+
+
+
+
+
+▲内蒙古南部清晨。图源:图虫创意
+
+
+
+匈奴活动的蒙古高原,可谓是危机四伏。气温低,冬季更是严寒,雨量少,而且极不稳定。一次不寻常的高温天气,一场突如其来的大雪,就足以摧毁人们的生计。游牧人群不得不利用牛、马、羊等动物的移动力,四处迁徙,躲避危险。
+
+
+
+一般而言,游牧是季节性的:夏天往北而冬季往南的水平移动,以及,夏季往高山而冬季向低谷的垂直移牧。初春是最危险的时节,此时牲畜羸弱,青草匮乏,且有春雪的威胁。夏季相对清闲。秋季,人们忙着给畜生养膘、打草。冬季,则在山谷定居,以避风寒。当然,危机总是会在意想不到的地方降临,所以游牧人群需要随时改变策略。
+
+
+
+频发的危机造就了游牧人群的几个特点。
+
+
+
+第一,他们不宜拥有太多财物,群体不宜过大,否则移动不便。
+
+
+
+第二,由于要经常移动,下至家庭、上至部落都要有自主决策的权力。这不利于威权的形成。当某个强势人物要求上贡财物,或者征调兵力时,人们完全可以选择逃跑。
+
+
+
+第三,只有在某些时刻,游牧人群会暂时集中在一起,比如要与另一个大部落争夺草地,或者与汉朝交战。假如战事不利,各小群体立马分散,不需要讲什么“寸土必争”“战至最后一兵一卒”的荣誉。
+
+
+
+这一切在汉人看来当然是匪夷所思。在农业社会,人们与土地牢牢捆绑在一起,投资农田,等待收成,积累财富。财富越容易积累,贫富的分化就越快。拥有的土地越多,掌握的权力也就越大。这样,就形成了一个等级分明的社会。农民的生存不得不依赖秩序,比如贷款、治安、大型水利的修建。只有活不下去,他们才会想着离开故土,因此往往要忍受沉重的剥削。
+
+
+
+游牧人群的财富不易积累,贫富的分化更慢,也不怎么需要一个指手划脚的统治者,相对来说会“平等”一些。汉人无法理解,只能用“利则进,不利则退,不羞遁走”来形容这样的社会。
+
+
+
+恰恰就是这样一群“无秩序”的人,却在一个领袖的统帅下,动员了足足四十万骑兵,围困刘邦于白登山上。这又是为什么呢?
+
+
+
+对大部分草原民族来说,游牧是很难自给自足的,人们要干点副业来维持生计,比如贸易与掠夺。贸易和掠夺在本质上是一回事,从外部世界获取资源。这个外部世界可以是农业社会,可以是其它游牧民族,也可以是自己人。可以想见,外部世界的力量越大,游牧社会就要集结越多的力量,才能进行贸易与掠夺。
+
+
+
+古代中国周边盘踞着许多游牧人群,有的地方族群之间互为世仇,习惯于掠夺自己人;有的地方结成了部落联盟,却无力扩张;只有蒙古高原一直涌现出侵略性极强、组织度极高的游牧力量。大概是因为他们要直面中原王朝,而通往富庶南方的路上,横亘着一道障碍:长城。
+
+
+
+从战国时期被李牧杀溃,到放牧之地被秦朝夺走,再到围困刘邦,依稀可见匈奴崛起的轨迹。他们在苦寒之地艰难求生,与南方往来频繁,却无法与其军队对抗。他们想办法变得强大,于是走向军事化。想办法解决内部掠夺问题,于是走向集权。想办法与中原王朝对抗,突破长城,于是走向联合。一个统治草原的力量就这样诞生了。
+
+
+
+刘敬贾谊们不能理解匈奴入侵的深层原因,还好,他们看到了匈奴的贪婪。和亲或者笼络之策虽然不能“用夏变夷”,但也算歪打正着。它以岁给、赏赐、关市贸易的方式,向北边输送了大量资源,在一定程度上减轻了匈奴掠边的次数,让汉朝得以恢复元气。
+
+
+
+
+
+▲贾谊画像。图源:网络
+
+
+
+
+
+
+
+## 冒顿时代
+
+
+
+在蒙古高原凝聚风云的时候,一代雄主应世而出。他就是冒顿单于。
+
+
+
+秦朝灭亡之际,匈奴在草原上依然备受欺负。他们向月支纳贡,被东胡鄙夷。冒顿是头曼单于之子,却不受父亲喜欢。头曼单于派他前往月支为质子,随后又袭击月支,希望能借刀杀人。冒顿偷了一匹快马逃回,以其英勇行为得到了族群的认可,得以统帅一万骑兵。后来,他杀父自立,成了匈奴的领袖。
+
+
+
+冒顿的崛起之路,得益于一个屡试不爽的招数:骄兵之计。
+
+
+
+灭东胡前,他低声下气给东胡王送良马、送爱妃,使其轻视匈奴。后来,东胡向匈奴索要草原,冒顿突然硬气起来,发动了蓄谋已久的袭击,大破东胡。白登之围前,他多次故意败给汉军,藏匿主力,用老弱病残勾引汉军追击,最后将刘邦困住。至于另一个强敌月支,《史记》也说“(月支)轻匈奴,及冒顿立,攻破月氏”。
+
+
+
+这种“狡诈”的气质,无比贴合崛起中的匈奴。
+
+
+
+当时,匈奴与汉两大政权几乎同时而起,对峙而立。白登之围后,汉朝奉行和亲政策,每年向匈奴奉送丝绸、谷物、酒等物品,然而匈奴还是时常入侵。
+
+
+
+学者王明珂将匈奴的掠夺行为分为两类:一为战略性掠夺,用暴力震慑汉朝,使其奉上财物,俗称敲诈;二为生计性掠夺,主要是为了获取生活物资。
+
+
+
+最能体现军事威慑的一场战役,是白登之围。冒顿将刘邦围住之后,在东、南、西、北四个方向,分别展示青鬃、赤黄、白龙、乌骊四种颜色的战马组成的骑兵,而汉军士兵却在寒风中瑟瑟发抖。这副画面相当有冲击力,匈奴之强、汉军之弱尽显无遗。以后的日子,人们一提到平城之战,总是心有余悸。
+
+
+
+刘邦死后,冒顿向吕后写信,表示自己“数至边境,愿游中国”,还请求娶年老色衰的吕后。吕后得信大怒,想要出兵教训匈奴,樊哙立马请战,说十万兵马可横扫匈奴。结果,季布说:“樊哙该斩!当年高皇帝率领四十万大军尚且被围困在平城,如今樊哙却想以十万兵马横扫匈奴,这是在撒谎。”吕后只能忍辱负重,献上礼物。
+
+
+
+公元前177年,匈奴右贤王劫掠边境,汉军将其赶走。结果,冒顿反说是汉朝“侵侮”了右贤王才导致这场战争,还说自己让右贤王戴罪立功,率兵西进击败了月支,引弓之民已经合为一家。威胁之意,不言自明。汉文帝虽然想要反击,但慑于匈奴兵威,只能再次奉上锦衣彩缎。
+
+
+
+汉朝奉送的财物,基本上都是奢侈品,比如美酒、丝绸之类。虽然也有粮食,但分摊下来根本满足不了多少人的需求。和世上绝大多数帝国一样,匈奴的武功未必能让治下的牧民幸福。
+
+
+
+汉地的奢侈品由单于、左右贤王等,从上而下层层分配给各部落首领,最大的作用就是塑造权威。如果没有冒顿单于的领导,怎么能得到这些珍贵的礼品呢?下次他再让各部落、各家庭丢下牲畜,骑上马拿起弓,听从号令时,还会有多少反对的声音?
+
+
+
+牧民的生活未必比农民轻松。他们不仅要照顾成群的牲畜,还要取乳、制酪、剪毛、打猎、采集、贸易等,人力相当匮乏。诚然,他们能从掠夺中得到不少资源,但前提是掠夺不影响自身的作息。正如汉朝要农民拿起武器,尽量不能耽误农时一样。冒顿的军事活动很可能会伤害牧民的生计,而得到的奢侈品于牧民的生活无补。
+
+
+
+很多人认为,匈奴南侵是为了获得粮食。这个观点很难站住脚。翻遍史书,没有一次匈奴入侵是因为饥荒,倒是有许多“掳其民众”、“驱马畜去”的记载。这说明,匈奴更需要人力与牲口。
+
+
+
+一支强悍的、可随时出征的军队,需要人。在草原上放牧,更需要人。这就是匈奴无法解决的悖论:游牧者天然倾向于自作主张,但单于需要权威。
+
+
+
+历史记录了两者之间的紧张关系。冒顿入侵南方时,汉朝往往会以闭关市作为惩罚手段。那么,通过贸易获取资源的牧民必然受到打击。汉军将领常常以“击胡关市下”作为战功,向皇帝报喜。两军交战之际,还有一大群人来南方公开进行交易,史书给出的解释是“匈奴贪”。这些嗜财物之“胡”,与南下掠夺的“胡”,明显不是一群人。
+
+
+
+反过来,单于的权力不比皇帝,各部落都能自行处理事务。冒顿也管不住手下的人进行生计性掠夺,就比如右贤王掠边。
+
+
+
+公元前174年,冒顿去世,留给后人一个既强大又分散的草原帝国。
+
+
+
+
+
+▲鄂尔多斯博物馆,匈奴王金冠。图源:图虫创意
+
+
+
+
+
+
+
+## 匈奴的命门
+
+
+
+元光二年(前133),雁门马邑富豪聂壹向汉武帝献策,称自己愿诈降于匈奴,假装献出马邑,引诱他们进入汉军的埋伏圈。汉武帝同意了这一计划,派遣三十万汉军埋伏于马邑附近,等待匈奴上钩。
+
+
+
+聂壹是边境的走私商人,与匈奴交往不浅。他对车臣单于说:自己能斩杀马邑县令,举城投降,然后大王可得全城财物。车臣单于大喜,立马动员十万骑兵入塞。途中,他看到乡野之间遍布畜牲,却不见人影,于是起了疑心。他抓了一名尉史,得知汉军设伏,率兵撤走。这就是历史上著名的“马邑之谋”。
+
+
+
+一直消极防御、缴纳贡物的汉朝,居然设下重围伏击匈奴。这说明,时代已经变了,汉武帝决心摧毁匈奴。
+
+
+
+自元光六年(前129)至元狩四年(前119),汉朝几乎连年出兵进攻匈奴。其中三次关键性战役,给予匈奴沉重的打击。元朔二年(前127),卫青击楼烦、白羊王,取“河南地”。元狩二年(前121),霍去病出击陇西,匈奴休屠、浑邪王降汉。元狩四年(前119),卫青、霍去病入大漠,匈奴远遁。
+
+
+
+汉军能够战胜匈奴,有非常多原因,但有一个原因不容忽视。
+
+
+
+细数历史上匈奴入侵南方的季节,将近一半发生在秋季。这是因为,游牧人群一般在秋季较为清闲,有余力进行掠夺。而且,秋季马肥,战斗能力强;气候干燥多风,弓箭最为强劲。
+
+
+
+汉军出击匈奴,超过一半发生在春季。这显然有农时的影响。更重要的是,经过漫长的冬季,匈奴的马匹瘦弱,无法长途奔走,这不仅仅会影响战争,同样如此也会影响生计。
+
+
+
+元朔五年(前124)春,卫青大败匈奴右贤王,俘虏一万五千余人,以及千百万头畜牲。史书上说,右贤王轻敌,大敌当前还饮酒作乐,结果被偷袭。更加不正常的是,春季是青草匮乏的时期,游牧人群本该四处觅水草,怎会如此集中,被汉军一锅端了?可以想象,匈奴为了对抗汉军,大规模动员军队,这使得游牧的人力减少,不得不集中放牧。
+
+
+
+而且,汉军连年出击让蒙古高原又多了一个莫测的凶险。匈奴部众不得不为了躲避兵祸,驱赶着畜牲到水草不丰富的地方。因此,匈奴的损失应该比汉军俘获的数字要更多一些。
+
+
+
+强大的匈奴意味着集权,集权导致不可分散,不可分散让游牧者丧失了赖以生存的移动力。有时,甚至都不需要一场战败,就能让匈奴损失惨重。
+
+
+
+本始二年(前72),汉军五路出击匈奴,斩获甚少。然而,匈奴的畜牲因迁徙而死者,不可胜数。第二年冬天,匈奴单于亲率数万骑出击乌孙。这一仗,他们打赢了。可是,他们凯旋而归时,遇上了一场大雪,一天之内雪深一丈有余。这场极端天气让匈奴随行的人民、畜产冻死了约十分之九。
+
+
+
+相似的故事在史书中频频出现,或由于战争,或由于天灾。但本质就一个问题:匈奴的体制已经不适合游牧经济了。
+
+
+
+汉武帝的雄心同样给汉地百姓带来了灾难。支持汉军进入蒙古高原作战的是一个更加严密的体制,它需要将粮食辎重从中原源源不断运往边塞。
+
+
+
+元狩四年(前119),大将军卫青、骠骑将军霍去病各率五万骑出击匈奴,后面跟着步兵数十万人,另有“私负从马十四万匹”。这要耗费多少粮食?而且,还得考虑运送粮食辎重的牲畜,其数量可参考李广利第二次西征大宛,带兵六万,共用牛十万头,马三万匹,驴、骆驼以万数。它们本身也会消耗粮草。《汉书》里说,路上消耗三十钟粮食,才能保证一石军粮(一钟等于六石四斗,三十钟就是一百九十二石),显然不是夸张之语。
+
+
+
+可以想象,汉武帝远征所花费的支出多么庞大!为了筹备这么多粮食,不搜刮百姓如何办得到?为了把粮食运往前线,又要征发多少劳役?史书这样形容得胜后的汉朝:“海内虚耗,户口减半。”
+
+
+
+不过,中原大地的生命力是顽强的。短短三十四年,春风吹又生,汉朝迎来了昭宣中兴,但草原却难以再现以往的辉煌。
+
+
+
+
+
+▲汉武帝画像。图源:网络
+
+
+
+
+
+
+
+## 和平之道
+
+
+
+公元前68年,匈奴两支万人骑准备入寇南方。途中有人叛逃,向汉朝告密,使其有了准备,匈奴被迫退兵。正是这一年,匈奴遇饥荒,畜产损失了十之六七,有一个数千人的部落南下降汉。
+
+
+
+公元前62年,匈奴单于亲率十余万骑南下,结果又有人叛逃,汉朝有了准备,单于被迫退兵,于是派人向汉朝请求和亲。
+
+
+
+匈奴的生计陷入了困难,迫切需要突破长城,获取南方的资源。假如集体的力量办不到,那么部落、个人就会自作主张归降南方。
+
+
+
+后来,匈奴爆发了“五单于争立”的内乱。不仅五个部落领袖自号单于、相互攻伐,各单于也无法约束手下的人。威权瓦解,越来越多人开始自作主张了。呼韩邪单于一度击败各竞争者,复都单于庭,但追随他的部众只剩下数万人。
+
+
+
+公元前54年,呼韩邪单于被郅支单于击败,势单力薄,不知前途在何方。左伊秩訾王提议归附汉朝,诸大臣都不同意,理由是:匈奴内斗是兄弟之争,即使失败仍有威名留世,如果向汉朝投降,必被世人耻笑?左伊秩訾王则说:“今事汉则安存,不事则危亡。”最终,呼韩邪单于决定投降,并派自己的儿子右贤王入汉为质,自己也愿意朝见皇帝。
+
+
+
+
+
+▲呼韩邪单于与王昭君。图源:影视剧照
+
+
+
+匈奴单于来降是一件史无前例的大事。皇帝给予了呼韩邪单于最高规格的待遇,但对于匈奴是否忠顺仍然抱有怀疑。汉朝不想干涉匈奴内政,也不愿将其部众分散安置于内地。最好的办法是,利用匈奴的分裂,扶持一方,对抗一方,以保证边塞安宁。
+
+
+
+事实证明,一旦汉朝愿意向游牧人群开放边界,允许资源流动,那么他们就会丧失团结一致的动力。各个部落会自谋出路,争着归附汉地王朝,以换取资源。
+
+
+
+建昭三年(前36),西域都护甘延寿、副校尉陈汤率领一支西域诸国组成的军队出击北匈奴,将郅支单于斩首,向世人宣告:“犯强汉者,虽远必诛。”听闻此消息后,呼韩邪单于“且喜且惧”,喜的是草原上没有竞争对手了,惧的是汉朝的实力。汉武帝时期,耗尽天下之力也不能消灭匈奴,但现在一支杂牌军就能让单于授首,给人的心里震撼不亚于白登之围。
+
+
+
+匈奴终于意识到,与汉朝和平交往所得的利益远远胜于双方兵戎相见。
+
+
+
+对底层牧民来说,他们可以在长城附近的草原放牧,这里的水草资源更加丰富。贸易的大门十分畅通,不会说关就关。汉元帝初年,呼韩邪单于决定北归,其中一个理由是:“民众益盛,塞下禽兽尽。”也就是说,匈奴人口膨胀,又以捕猎维持生计,使得野生动物资源枯竭。可见,牧民能够随意获取南方的资源,因其毫无节制反而造成了生计问题。
+
+
+
+贵族能得到的好处就更多了。建平二年(前5),乌孙首领卑援疐率兵入寇匈奴,被击败,向匈奴献质子。汉朝认为匈奴此举侵犯了自己的势力范围,要求匈奴归还乌孙质子。此时,匈奴已经恢复了草原统治者的地位,却欣然接受了汉朝的要求。建平四年(前3)匈奴单于上书愿朝见汉帝,此次朝见让他获得了“衣三百七十袭,锦绣缯帛三万匹,絮三万斤”的赏赐。
+
+
+
+不用敲诈,不用威胁,就能得到汉地的奢侈品。和汉朝搞好关系,还有助于击败草原上的竞争者。所付出的代价,不过是臣服的姿态。这样的买卖,谁不会心动呢?
+
+
+
+北方终于平静下来,呈现出繁荣之景。史载:“北边自宣帝以来,数世不见烟火之警,人民帜盛,牛马布野。”
+
+
+
+
+
+
+
+## 南来北往
+
+
+
+一直以来,长城都是一道封锁线,但始终有暗流涌动。汉地的富庶吸引着匈奴民众大量加入,而北方的草原对边境汉人也产生了巨大的吸引力。
+
+
+
+游牧者本身就四处迁徙,趋利避害,南来汉地自是常有之事。光是中元三年(前147),匈奴就有七位“王”率部落归附汉朝。汉武帝主动出击匈奴之后,南来者就更多了。这些人一般被安置在靠近塞内的“属国”,时常要配合汉军攻略匈奴。
+
+
+
+“胡骑”是汉军制胜的一大因素。元狩四年(前119),霍去病入大漠,从军北征的将领就有匈奴人复陆支、伊即靬、赵安稽、高不识。霍去病去世时,汉武帝调遣“属国铁甲”,从长安城一直列队到茂陵,为其送行。可见霍去病与胡骑之间的关系。
+
+
+
+
+
+▲霍去病。图源:影视剧照
+
+
+
+北上的人也不少。汉初,许多北地的实力派都与匈奴关系密切,比如韩王信、燕王陈豨、燕王卢绾。这些人在与汉廷斗争失败后,往往率亲信家人投奔匈奴。武帝时,又有李广利、李陵等大将降汉。
+
+
+
+于是就出现了一个非常有趣的现象:职业军人反复横跳,南来北往。
+
+
+
+征和三年(前90),李广利远征匈奴,部队里就有两千“属国胡骑”。这支部队战斗力强悍,迎击匈奴五千骑,丝毫不落下风,将其杀溃。后来,李广利的妻儿牵扯进巫蛊之祸,李广利不知所措,在战场上进退失据,最后迫于军事压力选择了投降。这支胡骑重新入故国后会遭遇怎样的待遇,我们不得而知。但从匈奴单于尊宠李广利来看,他们过的应该不算太差,甚至极有可能作为草原骑兵入侵南方。
+
+
+
+汉帝国在对抗匈奴时,慢慢培育出了“大汉”的意识,从那句“犯强汉者,虽远必诛”就可以看出来。然而,许多边地百姓反而没有这般强烈的民族情绪。对他们而言,哪边的生活更好,就去哪边。
+
+
+
+北方边境环境恶劣,战事频繁。如果没有强权的介入,没有多少人愿意住在这里。汉地统治者最常采用的办法是徙边和戍边。戍边士卒从遥远的家乡来到边境服役,与亲友分隔,违背人情。统治者也会招募百姓,来边地常居。招募的对象主要有两种:一是罪犯(包括死囚),二是奴婢。
+
+
+
+在帝国治下,边地始终是一个另类。
+
+
+
+迁徙而来的民众,地位低下,生活困苦,很难出头。东汉时,贾宗为朔方太守,他发现徙边者都很贫困,被当地人驱使,而且不能为吏。贾宗大力提拔徙边之人,因此,这些人都愿意为他去死。这样的个例恰恰说明边地社会的常态。
+
+
+
+而且,汉朝严格控制边境人口的进出,一旦有人擅自离开,就要受到严惩。永康元年(167),羌人多次入寇关中,威胁三辅。边将张奂派司马尹端、董卓二人出击,大破羌人,斩其首领,俘虏万余人。立下如此功勋的张奂,主动放弃了“赐钱二十万”、家中一人当官的奖赏,而请求将家族迁到弘农华阴。当世财富与庇荫后人相加,都比不上迁徙内郡一事,可见边人想要改变身份是多么困难。
+
+
+
+这种情况下,不少边人“闻匈奴中乐”,心向往之,主动逃往北方。
+
+
+
+在出土的汉简中,“亡人出塞”的内容比比皆是。有为非作歹的恶徒,有不堪剥削的士兵,有穷困潦倒的奴婢。这些人在寻找生存之地时,不得不突破那道抵御外敌的高墙。
+
+
+
+追捕与逃亡之间,近乎一场斗智。每当人员过关之时,都要出示通行证,上面有对年龄、长相、身高、肤色的详细描述。一旦发现有人出逃,通缉的文书就会飞速下达到地方,逃亡者不得不改变姓名、衣物、甚至相貌。汉军有特制的“亡人表”,是一种长条织物,其状如幡,一旦赤色的表在空中飘扬,就说明有亡人出逃。敦煌、居延等地还有“塞天田”,即用细沙或细土掩盖在平坦的边地之上,以侦察北逃者的踪迹。
+
+
+
+当然,即便防卫如此之严,逃出去的百姓依然不可胜数。汉文帝曾向全国宣告:“亡人不足以益众广地,匈奴无入塞,汉无出塞,犯今约者杀之,可以久亲。”可以看出,北逃者的确让匈奴发展壮大。
+
+
+
+即便是最雄伟的长城,也不可能实现汉文帝的梦想。
+
+
+
+
+
+▲汉代烽燧遗迹。图源:摄图网
+
+
+
+
+
+
+
+## 雇佣兵军团
+
+
+
+两汉之间,匈奴再度强大起来,相同的历史似乎再次上演。
+
+
+
+东汉建立之初,无力处理匈奴,只能奉送财帛。这种情况并未持续多久,建武二十二年(46),匈奴连年大旱,人畜损耗大半,乌桓乘弱将其击败。之后,匈奴陷入分裂,八部大人一起商议立呼韩邪单于的孙子右薁鞬日逐王比为单于,承袭呼韩邪单于的称号,并向汉朝请求内附。这就是南匈奴。汉匈双方驾轻就熟,皇帝以礼相待,赐予财物;单于臣服,遣子入质。
+
+
+
+北匈奴虽纵横大漠,但也不敢倨傲,每次南下劫掠都说自己是攻击南匈奴,不愿与东汉为敌。事实上,草原上已经没有可以威胁南方的力量了。整个东汉,对草原发起的大规模战争只有两次,一次是永平十六年(73),数万骑兵分道出塞击北匈奴,还有一次是永元元年(89)窦宪率数万大军征北匈奴,出塞三千余里,登燕然山。
+
+
+
+此役之后,北匈奴一蹶不振。永元三年(91),耿夔仅率八百名精锐骑兵,就直奔北匈奴单于的王庭,在金微山(今阿尔泰山)大败北匈奴。北单于率领残部一路向西,逃往乌孙和康居,退出了漠北。《魏书》里说,北匈奴迁徙到了葱岭,建立了悦般国,后来又来到中亚,征服了奄蔡。之后,匈奴的身影就常常出现在西方的史书中了。
+
+
+
+另一边,南匈奴逐渐向东汉靠拢。建武二十六年(50),刘秀为匈奴挑选了一块“肥美之地”,作为龙庭所在,距离五原塞(今内蒙古包头市西)80里。后来,又准许他们入居云中郡,同年再迁徙至西河郡美稷县(今内蒙古准格尔旗境)。与此同时,东汉将乌桓安排在辽东属国、辽西、右北平、渔阳、广阳、上谷、代郡、雁门、太原、朔方诸郡。
+
+
+
+东汉的北部屏障,从最西到最东,都有胡人为其把守。南匈奴和乌桓承受北匈奴和鲜卑的攻击,保护边塞的安宁。而且,东汉常常用财富煽动胡人相互攻击,你给我首级,我给你赏赐。
+
+
+
+当然,内附的胡人也会作乱。比如永元五年(93),南单于安国与左贤王师子矛盾激化。当时,使匈奴中郎将杜崇与单于安国关系不和,因此谎称匈奴叛乱,逼得安国只能举起武器。不过,在东汉的金钱战略下,总有忠于朝廷的胡人力量。讨伐安国的军队中,有南匈奴兵万骑,有乌桓、鲜卑八千骑。
+
+
+
+东汉向胡人开放边界,得到的收益是巨大的。根据大臣袁安的奏疏,永元三年(91)东汉提供给南匈奴的物资价值一亿九千余万。虽然要付出大量金钱,但与汉武帝筹边的数字相比,简直是天壤之别。而且,匈奴得到的部分财物,也会在关市贸易中回流到朝廷手中。
+
+
+
+在开放的边界下,南匈奴轻易就能得到汉地资源,却变成了一个雇佣兵军团,失去了对草原的掌控力。而一个无法统治草原的匈奴,只能慢慢沦为东汉的附庸。
+
+
+
+南匈奴入居云中时,东汉设“使匈奴中郎将”一职监视南匈奴。永和五年(140),陈龟为使匈奴中郎将,当时南匈奴左部叛乱,陈龟指责单于休利御下不利,迫使他自杀。事后,东汉因陈龟越权,而将其逮捕入狱。
+
+
+
+延熹元年(158),南匈奴叛乱,与乌桓、鲜卑一起入侵汉地。匈奴中郎将张奂以单于不能统理国事为由,将其拘禁,还上书请立左谷蠡王为单于。这已经是直接干预单于的废立了。
+
+
+
+光和二年(179),匈奴中郎将张脩与单于不合,直接将其斩杀,立右贤王羌渠为单于。最后,汉朝将张脩处死。
+
+
+
+终东汉一代,使匈奴中郎将更换达23人之多。如此频繁的更换,不是因为他们无能,而是因为他们权力太大,朝廷担心他们久居边疆,擅行其事。
+
+
+
+中平六年(189),董卓专政,东汉陷入分裂。此时,南匈奴不仅没有借机回到草原,反而分裂成了两支,一支留守南庭,另一支在单于于扶罗的率领下与白波贼一起劫掠河内、太原一带。很难说,此时匈奴还有多少游牧者。他们或许还在放牧,却已经不想再“游”了。
+
+
+
+
+
+
+
+## 融于汉地
+
+
+
+建安二十一年(216),曹操称魏王,匈奴单于呼厨泉前来拜贺,被留在了邺城。此后,匈奴被分为了五部,每部择一贵族为帅,并时刻处于汉人司马的监督之下。
+
+
+
+同时,并州刺史梁习对治下的匈奴部众采取了两个措施:一是任命上层贵族为地方官,使其与部落脱离关系;二是征调匈奴壮丁,将其编为义从、勇力,分遣各地打仗、驻防,家人则迁移至邺城,充当人质。
+
+
+
+这样,单于变成了一个虚号,部落首领变成了国家官员,匈奴部众变成了编户齐民。
+
+
+
+嘉平三年(251),邓艾注意到右贤王刘豹将分散的匈奴各部落“并为一部”,武力强盛,让人颇为担心。他献上釜底抽薪之计,建议将刘豹所部分为二国,再拉拢其中一派,“使居雁门,离国弱寇”。这是曹操分而治之政策的延续。
+
+
+
+
+
+▲曹操画像。图源:网络
+
+
+
+另一方面,由于中原战乱频繁,北方人口凋零,大量外族入塞,与汉人杂居错处,民族融合成为不可阻挡的大趋势。
+
+
+
+自西汉以来,匈奴与汉族就开始相互通婚了。东汉以来,人们有了另一个称呼——“屠各”。当然,屠各所涉甚广,既有汉代就开始汉化的匈奴休屠王部众,也有东汉末年迁入并州的南匈奴部众。
+
+
+
+在靠近漠北的地方,匈奴则与鲜卑、乌桓等民族相互融合,比如后来建立大夏的铁弗匈奴。当然,匈奴本身就并非铁板一块,而是“百蛮大国”。再加上蒙古草原上民族林立,又都是自作决策的游牧者,种族间的混合应是常态。
+
+
+
+匈奴还和西域胡、小月氏等杂胡融合,形成了新的杂胡,比如后来建立北凉的卢水胡。
+
+
+
+西晋时,一个叫江统的人上表了著名的《徙戎论》。他提到并州匈奴:“今五部之众,户至数万,人口之盛,过于西戎。”他想要将少数民族都迁到塞外,这在当时已是不可能。
+
+
+
+等到匈奴人刘渊起事时,一切都变了。
+
+
+
+他是匈奴的领袖,却也是一个精通汉文化、与并州士族交好的西晋官员。
+
+
+
+他依赖的核心团队是匈奴五部,可他的族人已经开始习于田业,有的人甚至沦为了地主的田客、奴隶。
+
+
+
+他的帐下是威风凛凛的匈奴骑兵,可他却不想如部下所说那样“复呼韩邪之业”,而是自认“汉之外甥”,高举大汉的旗帜。
+
+
+
+永嘉二年(308)十月,刘渊即皇帝位,这是中国历史上第一次一个胡人登上帝位。
+
+
+
+草原已然远去,雇佣兵的眼里看到了天下。但,匈奴人早就消融于天下。
\ No newline at end of file
diff --git "a/_posts/2025-03-14-\346\270\255\345\215\227\347\224\265\344\277\241\347\224\250\346\210\267DNS\346\216\250\350\215\220\344\274\230\345\214\226.md" "b/_posts/2025-03-14-\346\270\255\345\215\227\347\224\265\344\277\241\347\224\250\346\210\267DNS\346\216\250\350\215\220\344\274\230\345\214\226.md"
new file mode 100644
index 00000000000..184f7c90fe7
--- /dev/null
+++ "b/_posts/2025-03-14-\346\270\255\345\215\227\347\224\265\344\277\241\347\224\250\346\210\267DNS\346\216\250\350\215\220\344\274\230\345\214\226.md"
@@ -0,0 +1,67 @@
+---
+catalog: false
+date: '2025-03-14'
+header-img: ''
+layout: post
+subtitle: DNS加速网络
+tags:
+- 网络
+title: 渭南电信用户DNS推荐建议
+---
+
+根据搜索结果,以下是针对陕西渭南电信用户的DNS推荐及优化建议:
+
+---
+
+### 一、陕西渭南电信官方DNS服务器地址
+1. **陕西电信DNS(适用于渭南市)**
+ - **主DNS**:`218.30.19.40`
+ - **备用DNS**:`61.134.1.4`
+ 这两个地址是陕西电信官方提供的DNS服务器,覆盖渭南市在内的陕西省多个城市,稳定性较高,适合办公场景。
+
+2. **其他陕西电信DNS参考**
+ 部分网页提到其他陕西电信DNS地址(如`202.100.13.11`、`202.100.4.16`),但需注意其发布时间较早(如2024年),建议优先使用上述最新地址。
+
+---
+
+### 二、国内公共DNS推荐(提升速度与稳定性)
+若本地DNS响应较慢,可尝试以下公共DNS服务:
+1. **阿里DNS**
+ - 主:`223.5.5.5`
+ - 备:`223.6.6.6`
+ 阿里DNS以高速解析和稳定性著称,适合国内用户。
+
+2. **腾讯DNS**
+ - 主:`119.29.29.29`
+ 腾讯DNS在游戏和办公场景中表现优异,延迟较低。
+
+3. **114DNS**
+ - 主:`114.114.114.114`
+ - 备:`114.114.115.115`
+ 覆盖广泛,适合基础网络优化。
+
+4. **CNNIC DNS**
+ - 主:`1.2.4.8`
+ - 备:`210.2.4.8`
+ 中国互联网络信息中心提供的公共DNS,安全性较高。
+
+---
+
+### 三、优化建议
+1. **测速排查带宽问题**
+ 使用陕西电信官方测速工具(如网页5提到的[西安电信测速网](http://xa189.net/news/439-cn.html)),确认是否为带宽不足导致网速慢。
+
+2. **多DNS对比测试**
+ 不同DNS在不同地区的响应速度可能差异较大,建议通过工具(如`DNSBench`)测试后选择最优地址。
+
+3. **检查网络负载**
+ 关闭占用带宽的后台程序(如下载、视频流媒体),避免办公时段网络拥堵。
+
+4. **路由器设置优化**
+ 将DNS地址直接配置在路由器中,确保所有设备统一使用优化后的DNS。
+
+---
+
+### 四、注意事项
+- **公共DNS的适用性**:部分公共DNS(如Google的`8.8.8.8`)可能因地理位置导致延迟较高,建议优先选择国内服务。
+- **运营商劫持问题**:若使用本地DNS出现广告弹窗,可切换至公共DNS(如阿里、腾讯)规避劫持风险。
\ No newline at end of file
diff --git "a/_posts/2025-03-16-Notion-to-Github-\345\267\245\344\275\234\346\265\201\344\273\243\347\240\201\345\274\200\345\217\221.md" "b/_posts/2025-03-16-Notion-to-Github-\345\267\245\344\275\234\346\265\201\344\273\243\347\240\201\345\274\200\345\217\221.md"
new file mode 100644
index 00000000000..877828540a8
--- /dev/null
+++ "b/_posts/2025-03-16-Notion-to-Github-\345\267\245\344\275\234\346\265\201\344\273\243\347\240\201\345\274\200\345\217\221.md"
@@ -0,0 +1,405 @@
+---
+catalog: true
+date: '2025-03-16'
+header-img: img/post-bg-3.jpg
+image_hashes: []
+layout: post
+notion_id: 1b87d276-8542-8017-a8c5-cb3dbfa9be6d
+subtitle: 让 notion 作为 jekyll 后台
+tags:
+- 网络
+title: Notion to Github工作流代码
+---
+
+本站通过Jekyll 技术搭建在Github。GitHub非常稳定,但没后台,更新起来非常麻烦。之前曾使用Obsidian 作 Github 后台。虽然Obsidian堪称神器,但仅限于电脑端。在安卓手机上,不仅难以操作,而且启动速度很慢。最近,Notion 在安卓端用起来特别顺手,同步不用操心,而且移动端 App 尚可。 突发奇想:能否用Notion作后台,实现与Github的互动呢?答案是肯定的!
+
+
+# 更新日志
+
+
+- 1.0
+
+
+在Deepseek的帮助下,经过10个小时开发!准确得说,是在罗马输球后大半夜睡不着的几个小时里以及次日小半个白天,通过编写 Github Action代码,实现了Notion与Github的梦幻互动。这个版本主要实现了Notion数据库内容从 Notion 到 Github 的同步,相当于给Github搭建的jekyll网站构建了一个高水平的后台文章管理系统。
+
+
+- 1.1
+
+
+然而,我的需求并非只是同步,我还想实现增量同步提高效率,通过 Notion管理文档,以便执行删除和更新等操作,还想提高代码运行效率。经过周五晚间和周六全天尝试,终于成功了!这个版本简称 V2。除 DeepSeek 外,Kimi在代码完善的过程中也提供了巨大的帮助,主要是 DeepSeek容易出现幻觉,代码前后一致性差一些,特别是代码融合时会漏掉内容,运行经常出错,Kimi 好很多。
+
+
+- 1.2
+
+
+这几天,突然发现图片的访问链接会变化,而且速度很不稳定,不断的在amazon和github之间切换,时好时坏,非常影响访问速度,如何解决?这个版本,主要就是解决了Notion图片访问速度的问题,现在采用了cloudflare进行CDN加速,快了很多。在这里,同样要鸣谢Kimi。
+
+
+- 1.3
+
+
+采用Cloudflare给图片加速之后,发现图片访问依然有些偏慢,仔细检查之后发现,图片的尺寸太大,动辄四五兆的图片,在网站上展示还是有些吃力,那么现在的解决思路就是压缩图片,并把原来的PNG格式通过JPG格式展示出来,成功解决了图片加载偏慢的问题。另外,对增量同步逻辑也有了修改,通过比对上次同步时间和文章最后修改时间,来决定文章是否需要更新,避免每次大面积更新文章,提高了效率。
+
+
+- 1.4
+
+
+突然发现,图床仓库增加了很多图片,点开一看,全部都是重复图片。这才发现每次同步,数据库里的图片都会经历一遍下载、上传、压缩、加速流程,不仅造成仓库里面图片杂乱,也增加了资源消耗和运行时间。经过几天时间的测试更新,新版代码出炉。这个版本主要解决了多余图片的清理问题,变更了清理逻辑,增量同步更完善。
+
+
+# 完整代码
+
+
+```yaml
+name: Notion to Jekyll Sync v2
+
+on:
+ schedule:
+ - cron: "0 12 * * *" # 每天 UTC 时间 12 点自动同步
+ workflow_dispatch: # 支持手动触发
+
+jobs:
+ sync-notion-pages:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Set up Python 3.10
+ uses: actions/setup-python@v4
+ with:
+ python-version: "3.10"
+
+ - name: Install dependencies
+ run: |
+ pip install --cache-dir=/tmp/pip-cache \
+ notion-client==2.2.0 \
+ python-frontmatter==1.0.0 \
+ requests==2.31.0 \
+ mdutils==1.5.0 \
+ Pillow==9.3.0 \
+ python-dateutil==2.8.2 \
+ --index-url https://pypi.tuna.tsinghua.edu.cn/simple \
+ --trusted-host pypi.tuna.tsinghua.edu.cn
+
+ - name: Convert Notion pages to Jekyll posts
+ env:
+ NOTION_TOKEN: ${{ secrets.NOTION_TOKEN }}
+ NOTION_DATABASE_ID: ${{ secrets.NOTION_DATABASE_ID }}
+ PERSONAL_TOKEN: ${{ secrets.PERSONAL_TOKEN }}
+ run: |
+ cat << 'EOF' > notion_to_jekyll.py
+ import os
+ import logging
+ import json
+ from datetime import datetime
+ from dateutil import parser # 用于解析 Notion 的时间格式
+ from notion_client import Client
+ import frontmatter
+ from mdutils import MdUtils
+ import requests
+ import glob
+ import shutil
+ import base64
+ import hashlib
+ from PIL import Image
+ from io import BytesIO
+
+ logging.basicConfig(level=logging.INFO)
+ logger = logging.getLogger(__name__)
+
+ # 读取上次同步的时间戳
+ def get_last_sync_time():
+ try:
+ with open('.last_sync.txt', 'r') as f:
+ # 假设本地时间戳是UTC时间
+ return datetime.fromisoformat(f.read().strip()).replace(tzinfo=None)
+ except:
+ return None
+
+ # 保存本次同步的时间戳
+ def save_last_sync_time():
+ with open('.last_sync.txt', 'w') as f:
+ f.write(datetime.now().isoformat())
+
+ def get_page_content(page_id):
+ """通过 Notion API 获取页面内容(含递归子块解析)"""
+ try:
+ blocks = []
+ client = Client(auth=os.environ["NOTION_TOKEN"])
+ result = client.blocks.children.list(block_id=page_id)
+ while True:
+ blocks.extend(result.get("results", []))
+ if not result.get("has_more"):
+ break
+ result = client.blocks.children.list(
+ block_id=page_id,
+ start_cursor=result.get("next_cursor")
+ )
+ return "\n\n".join([_parse_block(b) for b in blocks]) # 修改点:双换行拼接
+ except Exception as e:
+ logger.error(f"获取内容失败: {str(e)}")
+ return ""
+
+ def _parse_block(block):
+ """解析 Notion 块为 Markdown(支持更多类型)"""
+ type_ = block["type"]
+ content = block[type_]
+ text = "".join([t["plain_text"] for t in content.get("rich_text", [])])
+
+ # 段落与标题处理
+ if type_ == "paragraph":
+ return text + "\n" # 修改点:追加换行
+ elif type_ == "heading_1":
+ return f"# {text}\n"
+ elif type_ == "heading_2":
+ return f"## {text}\n"
+ elif type_ == "heading_3":
+ return f"### {text}\n"
+ elif type_ == "bulleted_list_item":
+ return f"- {text}\n"
+ elif type_ == "numbered_list_item":
+ return f"1. {text}\n"
+ # 图片处理
+ elif type_ == "image":
+ original_url = content.get("external", {}).get("url") or content.get("file", {}).get("url")
+ if not original_url:
+ return ""
+
+ # 生成唯一的文件名,改为 jpg 格式
+ file_name = hashlib.md5(original_url.encode()).hexdigest() + ".jpg"
+
+ # 下载图片
+ try:
+ response = requests.get(original_url)
+ response.raise_for_status()
+ except requests.exceptions.RequestException as e:
+ logger.error(f"下载图片失败: {str(e)}")
+ return f"\n"
+
+ # 将图片转换为 JPG 格式并压缩
+ try:
+ image = Image.open(BytesIO(response.content))
+ image = image.convert("RGB") # 确保是 RGB 模式
+
+ # 压缩图片
+ image.thumbnail((1920, 1080)) # 调整大小以压缩
+ image_bytes = BytesIO()
+ image.save(image_bytes, format="JPEG", quality=85)
+ image_content = image_bytes.getvalue()
+ except Exception as e:
+ logger.error(f"图片格式转换失败: {str(e)}")
+ return f"\n"
+
+ # 上传图片到当前仓库的 img/in-post 目录
+ try:
+ # 使用 GitHub API 上传文件
+ github_token = os.environ["PERSONAL_TOKEN"]
+ repo = os.environ["GITHUB_REPOSITORY"] # 当前仓库
+ branch = "master" # 设置为 master 分支
+
+ # 使用 GitHub API 创建或更新文件
+ headers = {
+ "Authorization": f"token {github_token}",
+ "Accept": "application/vnd.github.v3+json"
+ }
+ url = f"https://api.github.com/repos/{repo}/contents/img/in-post/{file_name}"
+ data = {
+ "message": f"Add image {file_name}",
+ "content": base64.b64encode(image_content).decode(),
+ "branch": branch
+ }
+ response = requests.put(url, headers=headers, json=data)
+ response.raise_for_status()
+ except Exception as e:
+ logger.error(f"上传图片到 GitHub 失败: {str(e)}")
+ return f"\n"
+
+ # 使用 Cloudflare 加速后的链接
+ cdn_url = f"https://ajiao.eu.org/img/in-post/{file_name}"
+ return f"\n"
+ # 代码块处理
+ elif type_ == "code":
+ code = "\n".join([t["plain_text"] for t in content["rich_text"]])
+ return f"```{content['language']}\n{code}\n```\n"
+ # 引用块处理
+ elif type_ == "quote":
+ return f"> {text}\n"
+ return ""
+
+ def delete_unused_images(old_image_hashes, new_image_hashes):
+ """删除不再需要的图片"""
+ for old_image_hash in old_image_hashes:
+ if old_image_hash not in new_image_hashes:
+ image_path = f"img/in-post/{old_image_hash}"
+ if os.path.exists(image_path):
+ os.remove(image_path)
+ logger.info(f"删除旧图片: {image_path}")
+ # 同步删除 GitHub 仓库中的图片
+ try:
+ github_token = os.environ["PERSONAL_TOKEN"]
+ repo = os.environ["GITHUB_REPOSITORY"]
+ branch = "master"
+ headers = {
+ "Authorization": f"token {github_token}",
+ "Accept": "application/vnd.github.v3+json"
+ }
+ url = f"https://api.github.com/repos/{repo}/contents/img/in-post/{old_image_hash}"
+ data = {
+ "message": f"Remove image {old_image_hash}",
+ "sha": get_file_sha(old_image_hash),
+ "branch": branch
+ }
+ response = requests.delete(url, headers=headers, json=data)
+ response.raise_for_status()
+ except Exception as e:
+ logger.error(f"删除旧图片失败: {str(e)} (Image: {old_image_hash})")
+
+ def main():
+ notion = Client(auth=os.environ["NOTION_TOKEN"])
+ database_id = os.environ["NOTION_DATABASE_ID"]
+ last_sync = get_last_sync_time()
+
+ try:
+ # 查询所有已发布文章
+ pages = notion.databases.query(
+ database_id,
+ filter={"property": "Status", "select": {"equals": "Published"}}
+ ).get("results", [])
+ except Exception as e:
+ logger.error(f"数据库查询失败: {str(e)}")
+ return
+
+ local_posts = {}
+ notion_ids_in_notion = set()
+ # 读取本地_posts目录中的所有文章
+ for post_file in glob.glob("_posts/*.md"):
+ with open(post_file, 'r', encoding='utf-8') as f:
+ post = frontmatter.load(f)
+ if "notion_id" in post:
+ local_posts[post["notion_id"]] = post_file
+
+ # 用于记录所有被引用的图片
+ used_images = set()
+
+ for page in pages:
+ try:
+ page_id = page["id"]
+ notion_ids_in_notion.add(page_id)
+
+ # 获取notion页面的最后修改时间
+ last_edited_time_str = page["last_edited_time"]
+ # 使用 dateutil 解析时间,并移除时区信息
+ last_edited_time = parser.isoparse(last_edited_time_str).replace(tzinfo=None)
+
+ # 如果上次同步时间为空,或者notion页面的最后修改时间晚于上次同步时间,则需要更新
+ if last_sync is None or last_edited_time > last_sync:
+ # 提取基础字段
+ title = page["properties"]["Name"]["title"][0]["plain_text"].strip() if page["properties"]["Name"]["title"] else ""
+ date_str = page["properties"]["Date"]["date"]["start"].split("T")[0] if page["properties"]["Date"]["date"] else ""
+ header_img = page["properties"].get("Header-img", {}).get("select", {}).get("name", "") if page["properties"].get("Header-img", {}).get("select") else ""
+ subtitle = page["properties"].get("Subtitle", {}).get("rich_text", [{}])[0].get("plain_text", "").strip() if page["properties"].get("Subtitle", {}).get("rich_text") else ""
+ tags = [tag["name"] for tag in page["properties"].get("Tags", {}).get("multi_select", [])]
+
+ content = get_page_content(page["id"])
+ post = frontmatter.Post(content)
+ post["title"] = title
+ post["subtitle"] = subtitle
+ post["date"] = date_str
+ post["layout"] = "post"
+ post["header-img"] = header_img
+ post["catalog"] = True
+ post["tags"] = tags
+ post["notion_id"] = page_id
+
+ # 提取文章中使用的图片哈希值
+ image_hashes = []
+ for block in content.split('\n'):
+ if '[1].split(')')[0]
+ if url.startswith('https://ajiao.eu.org/img/in-post/'):
+ image_hash = url.split('/')[-1]
+ image_hashes.append(image_hash)
+ used_images.add(image_hash)
+
+ post["image_hashes"] = image_hashes # 记录文章使用的图片哈希值
+
+ # 根据 Notion ID 检查是否已经存在对应的本地文件
+ if page_id in local_posts:
+ filename = local_posts[page_id]
+ # 读取旧的文章,获取旧的图片哈希值
+ with open(filename, 'r', encoding='utf-8') as f:
+ old_post = frontmatter.load(f)
+ old_image_hashes = old_post.get("image_hashes", [])
+ # 删除旧的但不在新的文章中的图片
+ delete_unused_images(old_image_hashes, image_hashes)
+ # 更新文章
+ with open(filename, "w", encoding="utf-8") as f:
+ f.write(frontmatter.dumps(post))
+ logger.info(f"更新文章: {filename}")
+ else:
+ filename = f"_posts/{date_str}-{title.replace(' ', '-')}.md"
+ with open(filename, "w", encoding="utf-8") as f:
+ f.write(frontmatter.dumps(post))
+ logger.info(f"创建新文章: {filename}")
+ else:
+ logger.info(f"文章未修改,跳过更新: {page_id}")
+ except Exception as e:
+ logger.error(f"处理失败: {str(e)} (Page ID: {page['id']})")
+
+ # 删除本地未被处理的文章(即Notion中已删除的文章)
+ for notion_id, post_file in local_posts.items():
+ if notion_id not in [page["id"] for page in pages]:
+ try:
+ # 读取文章的 Front Matter,获取图片哈希值并删除对应的图片
+ with open(post_file, 'r', encoding='utf-8') as f:
+ post = frontmatter.load(f)
+ image_hashes = post.get("image_hashes", [])
+ # 删除图片
+ delete_unused_images(image_hashes, [])
+ os.remove(post_file)
+ logger.info(f"删除本地文章: {post_file}")
+ except Exception as e:
+ logger.error(f"删除文章失败: {str(e)} (File: {post_file})")
+
+ save_last_sync_time()
+
+ def get_file_sha(file_name):
+ """获取文件的 SHA 值"""
+ try:
+ github_token = os.environ["PERSONAL_TOKEN"]
+ repo = os.environ["GITHUB_REPOSITORY"]
+ branch = "master"
+ headers = {
+ "Authorization": f"token {github_token}",
+ "Accept": "application/vnd.github.v3+json"
+ }
+ url = f"https://api.github.com/repos/{repo}/contents/img/in-post/{file_name}"
+ response = requests.get(url, headers=headers)
+ response.raise_for_status()
+ return response.json().get("sha")
+ except Exception as e:
+ logger.error(f"获取文件 SHA 值失败: {str(e)}")
+ return None
+
+ if __name__ == "__main__":
+ main()
+ EOF
+
+ python notion_to_jekyll.py
+
+ - name: Pull remote changes
+ run: |
+ git config --global user.email "your-email@example.com"
+ git config --global user.name "Your Name"
+ git pull origin master
+
+ - name: Commit changes
+ uses: stefanzweifel/git-auto-commit-action@v4
+ with:
+ commit_message: "Auto-sync from Notion"
+ file_pattern: "_posts/* .last_sync.txt img/in-post/*"
+
+```
\ No newline at end of file
diff --git "a/_posts/2025-03-17-\347\224\267\344\272\27240\357\274\214\347\234\237\347\232\204\344\270\215\346\230\223.md" "b/_posts/2025-03-17-\347\224\267\344\272\27240\357\274\214\347\234\237\347\232\204\344\270\215\346\230\223.md"
new file mode 100644
index 00000000000..50e9868ebe2
--- /dev/null
+++ "b/_posts/2025-03-17-\347\224\267\344\272\27240\357\274\214\347\234\237\347\232\204\344\270\215\346\230\223.md"
@@ -0,0 +1,69 @@
+---
+catalog: true
+date: '2025-03-17'
+header-img: img/post-bg-2.jpg
+image_hashes:
+- 1ba6e173dd2db511f4bee31b12e1faf7.jpg
+layout: post
+notion_id: 1b97d276-8542-8077-b8ff-e1c8bdfa46ee
+subtitle: 记录一个凌乱的周末
+tags:
+- 生活
+title: 男人40,人到中年,真的不易
+---
+
+媳妇被抽调到省上参加专项工作,周天就要走。趁着周六有时间,陪娃逛商场,逛完忙着收拾。
+
+
+# 突发状况
+
+
+就在这档口,接到妹妹电话,说是妹夫很快就回来了,问我在哪?当时,我就觉得有点莫名其妙。晚上刚到家,发现我妹两岁多的小孩悠悠早早睡了。
+
+
+妈妈悄悄告诉我,妹妹去上班了,但她的小孩下午吐得很厉害。下午去看了医生,胸口后背都贴了些膏药,好些了。
+
+
+
+
+
+# 小孩发病
+
+
+周天早晨起床,三岁的宝宝就烦躁的很,我妹小孩的精神倒是还不错。当时,没太在意。等下午送完媳妇回到家。妈妈说,柠檬下午吐过一次,他们已经给娃买了药,好多了。
+
+
+然而,柠檬有发烧症状,让人很担心。小孩发烧必须重视,与其半夜折腾,不如现在就去医院看看。正巧,我妹也在家,那就顺便带上他们一并去医院。
+
+
+# 全家感染
+
+
+就在出发前,爸爸说他也不舒服,想吐。到了医院,刚刚挂上号。妈妈也有了症状,突然发了一身冷汗,然后就要上厕所,还想吐。一时间,两个老人,两个小孩,全部病了。
+
+
+怎么办?头大的很,又累又不能着急,只能一个一个来。先带两个孩子做了血常规检查,还带柠檬做了肠管B超。柠檬最近常说,她的肚肚疼。所幸,B超没问题,血常规显示细菌感染。
+
+
+# 吃药吃药
+
+
+虽然检查说是细菌感染,但我怀疑是诺如病毒,毕竟呕吐、腹泻、腹痛、发热等症状都对的上,而且传染强。
+
+
+就在等待血液检验结果时,匆忙去医院对面药店买了吗丁啉和蒙脱石散。妈妈喝了药,效果意外的好,很快就缓解了症状。
+
+
+按照医生处方,开车回家路上给小孩买了布洛芬、翅翘、蒙脱石散、头孢等药品。赶回家,爸爸身体正不舒服。赶紧吃药,等到大家情况都好了些,这才稍微有些安心。
+
+
+# 终于康复
+
+
+周一,不停的吃药,各种吃药。晚上回到家,柠檬情况好转,妈妈没有问题,但我妹的小孩悠悠依然严重,爸也没好利索。晚上,让妈做了碗酸菜面,味道不错。
+
+
+然而,睡下不久肚子就胀。不一会,就开始拉肚子了。一晚上,上了十几次厕所。周二整天没吃,饿了一天外加吃药,晚上情况明显好转。周三,这件事终于过去了。
+
+
+男人 40,上有老,下有小,还有繁重的工作,外加生病,真不容易!
\ No newline at end of file
diff --git "a/_posts/2025-03-22-\346\270\255\346\262\263\345\244\247\345\240\244\350\270\217\346\230\245.md" "b/_posts/2025-03-22-\346\270\255\346\262\263\345\244\247\345\240\244\350\270\217\346\230\245.md"
new file mode 100644
index 00000000000..bd8dcaa0db9
--- /dev/null
+++ "b/_posts/2025-03-22-\346\270\255\346\262\263\345\244\247\345\240\244\350\270\217\346\230\245.md"
@@ -0,0 +1,26 @@
+---
+catalog: true
+date: '2025-03-22'
+header-img: img/post-bg-2.jpg
+image_hashes: []
+layout: post
+notion_id: 1be7d276-8542-80c2-9b57-c029d00a11d9
+subtitle: 不出来走走,枉费了春光
+tags:
+- 生活
+title: 渭河大堤踏春
+---
+
+从宝鸡到潼关,渭河大堤横贯秦川八百里,沿着河堤,两边就是渭河生态公园。渭河大堤渭南段靠城部分,是大家周末散步,春日踏春的好地方。
+
+
+这个周末,天气刚好,桃花盛开,柳树发芽,嫩的叶子,星星点点,掩映在晴空下,仿佛给枯枝笼上了一层纱帐,又像是一团吹弹可破的绿雾。
+
+
+我带爸爸、妈妈、柠檬和悠悠去渭河大堤踏春。河堤上人不少,路边的车三三两两。我们沿着小路去了河边。
+
+
+春天里,渭河的河水并不充盈,相对清澈,桥墩下面隐蔽的地方还有年轻人垂钓。裸露的河床上,耕种着冬小麦,绿油油的一大片,长势正好。
+
+
+我们在河堤路转了一圈,还休息了一阵,感觉不错。周末出来走走,肯定远比待在家里玩手机要好得多。春天里,不出来走走,岂不枉费了春光。
\ No newline at end of file
diff --git "a/_posts/2025-03-31-\346\210\221\347\232\204\345\244\226\345\251\206.md" "b/_posts/2025-03-31-\346\210\221\347\232\204\345\244\226\345\251\206.md"
new file mode 100644
index 00000000000..122841e2dac
--- /dev/null
+++ "b/_posts/2025-03-31-\346\210\221\347\232\204\345\244\226\345\251\206.md"
@@ -0,0 +1,116 @@
+---
+catalog: true
+date: '2025-03-31'
+header-img: img/post-bg-2.jpg
+image_hashes: []
+layout: post
+notion_id: 1c77d276-8542-8199-a331-cc8cd50f1350
+subtitle: 病危中的外婆给我竖了个大拇指
+tags:
+- 生活
+title: 我的外婆
+---
+
+大年初三听到外婆病危
+
+
+初四早晨匆匆赶到西安
+
+
+跟着救护车匆匆赶回老家
+
+
+外婆躺在床上
+
+
+双眼偶睁,手脚冰凉
+
+
+气息微弱,干呕不止
+
+
+大脑还清楚,能认人,能交流
+
+
+我给外婆按了按肩揉了揉肚子
+
+
+外婆睁开眼给我竖了个大拇指
+
+
+
+
+
+打小起,外婆就特别疼我
+
+
+睡觉前给我讲故事
+
+
+好吃的东西都给我留着
+
+
+每次遇到外爷拿起棍子要打我
+
+
+我都高喊:外婆,你快回来
+
+
+惹的大家哈哈大笑
+
+
+
+
+
+外婆家屋檐旁有颗大苹果树
+
+
+每年暑假都有吃不完的苹果
+
+
+苹果树旁是柿子树
+
+
+外婆养的小黄猫老是往上爬
+
+
+道场边有株石榴树
+
+
+我见过上面结的大红石榴
+
+
+大门前的路边有老柿子树
+
+
+外婆说半夜听过柿子树哼
+
+
+
+
+
+柿子树下
+
+
+是每次来外婆家要跨过的小溪
+
+
+小溪旁还有一株歪脖子枣树
+
+
+外婆家屋后是一片竹林
+
+
+我听过春雨吹竹沙沙雨声
+
+
+外婆家屋后还有板栗树
+
+
+每年秋天有吃不完的带刺毛栗
+
+
+
+
+
+然而,这一切,再也回不来了
\ No newline at end of file
diff --git "a/_posts/2025-04-11-\346\261\237\345\220\214\345\277\227\345\246\202\344\275\225\345\272\246\350\277\207\344\272\272\347\224\237\344\275\216\350\260\267\346\234\237\357\274\237.md" "b/_posts/2025-04-11-\346\261\237\345\220\214\345\277\227\345\246\202\344\275\225\345\272\246\350\277\207\344\272\272\347\224\237\344\275\216\350\260\267\346\234\237\357\274\237.md"
new file mode 100644
index 00000000000..5e983c9b576
--- /dev/null
+++ "b/_posts/2025-04-11-\346\261\237\345\220\214\345\277\227\345\246\202\344\275\225\345\272\246\350\277\207\344\272\272\347\224\237\344\275\216\350\260\267\346\234\237\357\274\237.md"
@@ -0,0 +1,200 @@
+---
+catalog: true
+date: '2025-04-11'
+header-img: img/post-bg-3.jpg
+image_hashes: []
+layout: post
+notion_id: 1d07d276-8542-818f-997b-e60f65c22bdb
+subtitle: 积极面对,认真生活!
+tags:
+- 学习
+title: 江同志如何度过人生低谷期?
+---
+
+我昨天刷到人民日报微博发的一篇文章,叫《度过人生低谷期的7个小建议》。
+
+
+虽然煲的是一碗鸡汤,但这两年许多朋友包括我自己,都曾经或正在经历各种各样的低谷,因此看到后还是有些想法。
+
+
+陷入低谷的感觉是很难受的。
+
+
+有一个办法是可以读读领袖人物的经历,看他们是怎么面对的。譬如,毛泽东在苏区的时期曾被边缘化,邓小平“三落三起”的经历更是耳熟能详。
+
+
+那么,江同志有没有经历过低谷?他又是怎么面对的呢?
+
+
+01
+
+
+1966年5月,江同志从上海电科所副所长的职位上,调到武汉热工机械研究所当所长。
+
+
+这个研究所是为核工程做配套设计的。
+
+
+从副所长变成正所长算是升职了,但也不得不面临一些实际问题。比如两地分居,让他与温馨家庭的分离,一份工资还要分成几处花。
+
+
+那时他的月工资是158块。
+
+
+我查了一下资料,158元按照当时干部24级工资标准,在11级-13级之间,相当于中校到大校的水平,并不算低。但因为家庭负担重,所以也并不宽裕。
+
+
+据热工所的段同志回忆,他亲眼见到江同志领到工资后,在邮局汇款的情景:
+
+
+扬州的父母40元,上大学的两个妹妹共30元,自己只留20多元傍身,余下的寄给上海家里。
+
+
+热工所是新筹建的机构,所以一开始没有自己的物业,只能借住在武汉锅炉厂的一幢四层小楼里。江同志身为所长也和大家一样住单身宿舍。
+
+
+02
+
+
+尽管条件跟上海比差很多,但毕竟担任部属大所的所长,40岁也恰是年富力强,当打之年。
+
+
+正当他准备为国家的核工业作贡献的时候,史无前例的“文革”来了。
+
+
+武汉是九省通衢,华中重镇,也是运动搞得比较厉害的地方,几乎是个领导就要被斗。作为一把手的江同志,自然难以幸免。
+
+
+他的罪名是所谓的“执行资产阶级反革命路线”。
+
+
+原因无非是他去过苏联和一些西方国家,在同事面前赞美过“巴黎是个很美的城市”。甚至他的发型也被指责是“三十年代的样式”,不“革命 ”。
+
+
+真是令人十分生气。
+
+
+很快,“工宣队”和“军宣队”剥夺了他的权力,多次把他关进“小黑屋”反省。在《江同志有没有见过周总理?》这篇文章中也记述了,他因此与面见总理的机会失之交臂。
+
+
+从这个时候起,江同志进入长达4年的“低谷期”。
+
+
+03
+
+
+这种低谷不光是事业上的停滞,而且还有人格上的侮辱。
+
+
+拥有正牌大学文凭和多年技术管理经验的江同志,靠边站之后被安排干什么呢?
+
+
+答案是,清洁工。
+
+
+这种落差无疑是相当大的。
+
+
+同事们回忆,那段时间每天都可以看到他“穿着胶鞋,手拿橡皮水管和扫帚”在打扫厕所和实验室。
+
+
+人在低谷时,最容易产生的是绝望感,丧失对未来的信心。最好的办法,就是不要去想未来,专注眼前的事情。
+
+
+老同事的记忆中,江同志打扫实验室时非常认真,满头是汗。跟他说“差不多就行了”。
+
+
+可江同志却说,实验室加热段上的铜锈如果不刷彻底,会有安全隐患。
+
+
+无独有偶,这时远在上海的江同志妻子王同志,也被弄到食堂扫地擦桌子。可同事们发现,她也从不抱怨,还是“那么“娴静”。
+
+
+04
+
+
+人生的暴击是突如其来的,会让人措手不及从而迷失方向。有人会选择沉迷在娱乐中消磨时间,但学习才是治愈的良药。
+
+
+在1960年代的运动中,许多生产和科研的任务被中断。人才济济的热工所,也变得无所事事。
+
+
+尽管已经是靠边站的所领导,你都想不到江同志干起了什么事。
+
+
+他竟然在那样的环境中,亲自组织编教材,办起了英语和日语的学习班。
+
+
+他对大家说:
+
+
+虽然现在的形势下咱们没有太多的设计任务,但可以利用时间好好学习专业知识和外语,提高自己,总不会一直是这样乱哄哄的无政府状态吧。
+
+
+这段话细品一下水平很高,既描述了未来的希望,又指出了现实的出路。大家参加外语班的积极性都很高。
+
+
+在那段时光里,江同志不光为大家办起了学习班,自己还学会了游泳。
+
+
+在武汉炎热的夏天,他常常和年轻的职工一道来到东湖边。波光粼粼的湖水,见证了他很快学会的蛙泳、仰泳等几种泳姿。
+
+
+我记得前些年有一位著名官员,在遭遇仕途波折后,白天就在图书馆看书,晚上就去运动,过上“读书+出汗”的生活,慢慢走了出来。
+
+
+05
+
+
+一个人要垮下去很容易,只需要躺平就好;一个人要支棱起来不容易,需要有强大的信念。
+
+
+在江同志的低谷期里,有一段他和年轻人的对话。
+
+
+1967年的一天,一位姓滑的年轻同志,要拉江同志上街去看武斗的热闹。
+
+
+没想到江同志却对他说:
+
+
+小滑,你还年轻,要抓紧时间好好学点知识才是。我二十多岁就出过国,看到人家高度文明发达,我们真有种紧迫感。
+
+
+这应当就是他们那一代知识分子的信念。
+
+
+当时,许多员工都跑回了老家。江同志却说:“我会与热工所大楼共存亡。”
+
+
+在一个人的低谷期,他也不应停止工作。工作帮我们维护着生活和精神的秩序。
+
+
+在四年时间里,江同志确实没有离开自己的岗位,而且还想着自己来这里是搞核工程的。
+
+
+江同志原本学电机,他并不懂核能。
+
+
+但在武汉,他自己读完了长达三百多页的核工程教程。根据一位丁同志的回忆,他跟江同志去北京出差时,他还利用时间间隙,去请教原子能方面的专家,去房山参观了中国第一座核实验堆。
+
+
+可惜由于历史的原因,江同志直到离开武汉时,也没能为核工程发挥他原本该有的作用。
+
+
+老同志介绍说,退休之后的江同志依然在阅读核能方面的书籍,不知道是不是在完成当年未尽的遗憾。
+
+
+……
+
+
+以上引用的资料,大多来自《江同志在武汉热工所》这本书。
+
+
+前些年,陆续出版了多本反映江同志人生历程的书籍。《热工所》这本是其中最薄的,也说明了那段时间被打乱的节奏。
+
+
+但是,无论厚薄,都是人生。
+
+
+如果你或者身边人正在经历低谷,可以看看这本书或者这篇文章。然后学习一个,希望低谷早点过去。
\ No newline at end of file
diff --git "a/_posts/2025-06-11-\347\244\276\344\274\232\347\254\254\344\270\200\350\257\276\357\274\214\344\270\215\346\230\257\346\225\231\344\275\240\350\265\242.md" "b/_posts/2025-06-11-\347\244\276\344\274\232\347\254\254\344\270\200\350\257\276\357\274\214\344\270\215\346\230\257\346\225\231\344\275\240\350\265\242.md"
new file mode 100644
index 00000000000..7ef34fe9d66
--- /dev/null
+++ "b/_posts/2025-06-11-\347\244\276\344\274\232\347\254\254\344\270\200\350\257\276\357\274\214\344\270\215\346\230\257\346\225\231\344\275\240\350\265\242.md"
@@ -0,0 +1,161 @@
+---
+catalog: true
+date: '2025-06-11'
+header-img: img/post-bg-2.jpg
+image_hashes: []
+layout: post
+notion_id: 20d7d276-8542-8181-8cc1-f2fbb13fae75
+subtitle: 转载自微信公众号:知趣同学
+tags:
+- 生活
+title: 社会第一课,不是教你赢
+---
+
+2019年,韩国导演奉俊昊执导的电影《寄生虫》(Parasite)横扫戛纳金棕榈与奥斯卡最佳影片。它并不是一部传统意义上的励志作品,而更像是一面镜子,照出了城市里阶层之间的巨大裂缝,也照出了年轻人初入社会时的真实处境。
+
+
+故事讲述的是一个韩国底层家庭如何依靠谎言和伪装,一步步「寄生」进一个富豪人家的生活。他们居住在半地下室,靠着折披萨盒维生,生活拮据到连WiFi都要蹭邻居家的。直到儿子基宇伪造简历、混进了富豪家里做家教,整个家庭才像是搭上了一艘通往体面生活的船。
+
+
+电影中,基宇的父母反复叮嘱他:「不要被抓住。」但讽刺的是,一旦试图跨越阶层,被「抓住」几乎是必然的。
+
+
+当暴雨来临的那个夜晚,他们被迫逃回了家,却发现自己的地下室早已被污水淹没。那一刻,富人在露营,穷人在逃生。同一片天空下的两个世界,中间是无法跨越的鸿沟。
+
+
+电影最终也没有给人们答案,只是冷峻地抛出一个事实:没有背景、没有方向的普通人,想在这个社会往上走,比想象中要难得多。
+
+
+我们以为大学毕了业,有了学历、技能、热情,再加上互联网带来的信息平权,势必就会被世界温柔以待。然而现实很快就会让我们明白:你的热情也许无人买单,你的学历也只能是敲门砖,技能再硬,也敌不过这个岗位一开始就不是为你准备的。
+
+
+而我们普通人能做的,无外乎就是尽早看清规则,抓住人生时间上的红利,尽量少走弯路。
+
+
+## 01 职场:平台决定下限,跟人决定上限
+
+
+今年,全国高校毕业生人数预计高达1222万,相比去年持续增加。居高不下的数字背后,是就业竞争的愈发残酷。
+
+
+我自己在工作中有几个非常明显的感受,首先是企业在招聘的过程中,越来越看重候选人过往的工作背景。绝大多数的公司,都是参考求职者上一份工作的平台和工资来进行定岗定薪。这就有点像打游戏,起始的装备,往往可以决定你能走多远。
+
+
+所以,初入职场的年轻人,倘若第一份工作能在大厂,哪怕只是基层岗,可能也比在小公司「镀金」更具长远价值。
+
+
+从大公司跳去小公司几乎可以说是「降维打击」,就像星巴克的员工想去蜜雪冰城轻而易举,但反之则要困难的多。
+
+
+就像大家嘴巴上嘲笑被裁的大厂人只会「互联网黑话」,但中小厂真正招人的时候,身体却很诚实地想要引进这群「落难的凤凰」,大厂背景本身能带来一种求职的溢价。
+
+
+其次,是每年上千万的毕业生涌入职场,就业市场早就已经是「买方市场」。这样一来,个体的职业黄金期肉眼可见地越来越短,可能35岁就要面临职场的挑战,一旦入错了行,跨行转岗的成本非常大。
+
+
+同样的年龄竞争同一个岗位,别人已经有了5年的工作经验,你现在从0-1开始学,没有哪个买方会算不明白这笔账。
+
+
+当然,平台只是在保下限,能跟上好的领导才是直接拉高一个人的职场上限的关键,可以让年轻人少走很多弯路。但现实中,真正有能力、且愿意培养下属的管理者并不多,尤其是对于大佬而言,他本身对自己对其他人要求就高,打眼一看你不值得,基本就撤了。
+
+
+而且初入职场的年轻人,很容易判断不出来什么才是值得跟的好领导,会误以为人nice就是好。
+
+
+真正的好领导一定是既有能力拿结果,又有持续成事的野心与坚持。工作的前几年,一旦判断自己所处的环境不具备成长的空间,最好不要干耗着,因为这个阶段是最有机会跟对人的,所以别把时间浪费掉。
+
+
+除此之外,头两份工作一般会塑造一个人最基本的工作习惯和思维方式。相对而言,在规范化的体系中成长起来的人,更容易建立起很强的执行力、沟通力和风险意识。而这些能力,是很难通过「野路子」去补足。
+
+
+说职场是场马拉松可能有些夸张,但称其是「长跑」也许并不过分。所以一开始的时候一定要想清楚,因为起点越高,越容易在后续的竞争中占据主动。
+
+
+## 02 爱情:别让荷尔蒙主导了人生选择
+
+
+如果说职场是年轻人的第一战场,那么爱情则是第二战场。
+
+
+在日剧《逃避虽可耻但有用》里,女主和男主就是签订了一份「契约婚姻」。起初俩人只是生活上的互相帮助,但却在日复一日的相处中,慢慢生出真实的感情。
+
+
+这部剧告诉观众一个朴素的道理:婚姻不一定非得是浪漫的冒险,也可以是一场理性的合作。
+
+
+年轻的时候,人的选择很容易被荷尔蒙左右。因对方长得好看就奋不顾身,被一句「非你不娶」就轻易地打动,没谈几次恋爱就被催着结婚,好像「晚了就会错过整个世界」,结果婚后才发现:生活不是简单的约会吃饭仪式感……
+
+
+事实上,人在年轻的时候,不仅看不清这个世界、看不清对方,也看不清自己,根本不知道自己是什么样的、想要什么。
+
+
+以为「他对我好」就等同于「他适合我」:一场演唱会、一次深夜的路边摊、一条长长的微信消息,都可能让人「感动得稀里哗啦」。但时间久了就会发现:感动不代表合适,会说好听的话也不等于责任心。
+
+
+我一直觉得找对象的标准其实并不难:健康、有智商、有责任感。这三个词听起来朴素,但筛选起来还真的是要花费些时间。
+
+
+你以为你只是在找一个人生伴侣,其实你更是在为下一代找基因合作的伙伴,基因这个东西有时候就很邪门,你越不想要的,越可能在下一代身上体现。
+
+
+所以不要急,人生很长,别在二十几岁就把自己锁死。越晚定下来,越有可能找到真正适合的人。
+
+
+## 03 储蓄:钱要花在能带来确定性的地方
+
+
+在当下,我觉得大部分人倒也不是被消费主义洗脑,而是人和人之间那种无处不在的竞争与攀比心理在作祟:「三十岁前必须得有辆好车」「年轻时就要多出去看看长长见识」「投资自己最重要」……
+
+
+但现实是,大多数普通人的钱,根本就不是用来享受生活的,而是用来应对未来不确定性的。
+
+
+中国的居民储蓄率长期高于30%,这个数据远高于发达国家的平均水平。并不是因为我们中国人不爱花钱,而是因为我们其实是一个非常懂得未雨绸缪的民族,清楚地知道一旦失业、生病、父母没有养老金,没有人能够替自己兜底。
+
+
+所以,与其追求社会对「个体身份的定义」,不如把钱花在真正能产生价值复利的地方:比如给父母把养老金补齐,给自己买一份基础的医疗保险,在工作的城市或者是离家近的地方买一套小房子……
+
+
+现在这个节点,我知道劝人买房并不讨喜。但实际上,拥有房产给普通人所带来的安全感,远比租房更能抵御风险。
+
+
+JPMorgan Chase & Co.做过一项研究,研究表明在全球大流行期间,美国租房者的失业率明显高于自有住房者。原因很简单——有房的人更愿意稳定发展,也更容易获得资源支持。
+
+
+当然,买房也要量力而行,不要背负高额的贷款,更不要被那些所谓的「旅居房」「低价盘」忽悠。那些远离工作和亲人的房子,最后很可能就是砸在手里,既没人去住,又难以出手。
+
+
+等你岁数大一点,很快就会发现,所谓的教育医疗条件这些,都比不上家人朋友的情感连接来得重要,这可能也是中国人讲究的「落叶归根」,老了就想去熟悉的地方、见熟悉的人。
+
+
+因此,普通人的钱还是要花在住房、养老、医疗这样的刀刃上。
+
+
+这个社会总是在告诉我们「要拥有什么才算成功」。但真正过得安稳的人,往往是那些在年轻时就懂克制、有守财意识的人。他们可能看起来并不酷,但在中年之后,日子往往会比其他人要松弛很多。
+
+
+## 04 人生的每一步,都是单行道
+
+
+余华在《活着》中写道:
+
+
+>
+
+
+这句话听起来似乎有些冷,却也在暗示着人生没有回头路,每一步都只能往前走。
+
+
+这个世界是「媚青」的。年轻的时候,媒体捧着你、品牌讨好你、社交平台放大你的声音。因为你有冲动、有热情、有消费力,也更愿意挑战规则。
+
+
+但等到中年时,社会便没有那么友好:工作机会变少、身体状况开始下滑、上有老下有小,压力是成倍的增加……
+
+
+而我们这些尚能发自媒体表达观点的中年人,已经是少数的幸运者。那就更别提老年人了,他们在这个社会是很难发出声音的。
+
+
+这或许就是现实的真实与残酷之处:它给予了你容错空间,但其实又很有限。
+
+
+社会的第一课,不是要教大家怎么赢,而是教普通人怎么才能不输。因为能「不输」,能少走弯路,本身就是一种巨大的成功和幸福。
\ No newline at end of file
diff --git "a/_posts/2025-07-13-\345\214\206\345\214\206\345\261\261\350\245\277\344\271\213\350\241\214.md" "b/_posts/2025-07-13-\345\214\206\345\214\206\345\261\261\350\245\277\344\271\213\350\241\214.md"
new file mode 100644
index 00000000000..74338d54726
--- /dev/null
+++ "b/_posts/2025-07-13-\345\214\206\345\214\206\345\261\261\350\245\277\344\271\213\350\241\214.md"
@@ -0,0 +1,50 @@
+---
+catalog: true
+date: '2025-07-13'
+header-img: img/post-bg-2.jpg
+image_hashes: []
+layout: post
+notion_id: 22f7d276-8542-80c0-a659-c727727ba128
+subtitle: 25年夏天山西之旅
+tags:
+- 生活
+title: 匆匆山西之行
+---
+
+刚刚进入夏天的时候,作为全年招商活动的一部分。我们前往山西参加了一次招商活动。周四下午6点钟从渭南出发,周五下午6点钟返回渭南。凭借着高铁的便利,24小时内,横跨陕西和山西两省,闪现渭南、太原、运城。
+
+
+
+
+
+在中国的地图上,渭河平原和汾河平原连在一起,在秦岭、太行山,以及黄土高原之间,构成了一个独特的狭长地形,黄河从中一分为二。夏天白昼的时间比较长,刚登上火车的时候,外面的天色还比较亮,一路上可以看见华山、黄河、中条山。进入山西之后,高铁在汾河平原上一路北上,天色也慢慢的暗了下来,晚上大概九点多抵达了太原,办完入住十点半了。
+
+
+说来惭愧,这是我首次来山西。那么利用这一点点的时间,自然是需要出去走一走了。酒店在小店区,爱人当年在山西大学读书,对这一块相对比较熟。毕业之后再也没有来过山西,通话之间,劝我去我去她母校转转。虽然时间已经相对比较晚了,但还是出了酒店,骑上小蓝车,打开导航,一路朝山西大学方向走去。市井之间烟火气息,才是最真实的城市底色。
+
+
+虽然已经十点,晚上还有很多小摊,卖着特色小吃,首先给我留下深刻印象的是一元一串的卤串,这里的卤串有别于渭南的湖南卤串,更加精致一些,卤汁更是灵魂,味道非常特别。
+
+
+入住的酒店位于太原市小店区,距离山西大学不远,骑着小蓝车十几分钟就到。行至学校西南角的巨大人行桥下,北转沿着校园转圈,很快就看到了第一个带着山西大学字样的门牌——山西大学的游泳教学馆。再向前,就到了一个丁字路口,路口正对着山西大学西门,西门建筑很宽阔,气势恢宏,正面大字写着校训:拾光成炬、逐梦而行,八个鎏金大字、灼灼生辉。
+
+
+没有学生证,自然是进不去的。那就继续前行,很快就到了西北门,这个小门开着闸机,夜晚外出的学生不时路过。西门里有一尊伟人的雕塑,甚是雄伟。爱人当年就读的教师就在雕塑后面。楼层不高,夜色昏暗,看不出细节,这栋楼有年代了。
+
+
+山西大学没有北门,北面是一路沿街的店铺,便利店、棋牌室、涮涮店,大多都是市井小店,日常消费级别。
+
+
+转到东面,也没看到学校大门。找到了爱人以往说过多次的小吃村,许西社区。因为在大学周边,做小生意的人很多,晚上十点,依旧灯火通明。琳琅满目的小吃价格非常实惠,而且味道也很不错。尝了一家臭豆腐,给人留下深刻印象的还是:卤汁。浸润着咸辣鲜口味的卤汁,裹着炸的酥软的,滚烫的臭豆腐,别有风味。如果时间充足,这里值得花点时间闲逛。
+
+
+显然,我的闲逛时间不多。离开许西社区,返回大学东侧,再绕道南面,这里就要冷清的多。可能是因为太原纬度高一些,尽管已是初夏,晚上温度不高,骑着小蓝车,吹着初夏的夜风,返回酒店,已是晚上十二点了。
+
+
+第二天早晨,原本想起个大早去周边转转。可惜,实在太困体力不支,定好了五点的闹钟,就是无法起床。等到酒店吃完早餐,已经七点,那就附近走走。毕竟省会,基建发达,路面宽阔,但城市的绿化还有进步空间。
+
+
+九点正式出发考察,看了一些科技企业,感受很多,很受启发。相同的目的,不一样的做法,效果截然不同。中午结束太原之行,乘坐高铁前往运城,继续看点考察。这是个和渭南很像的城市,差不多的人口总数,差不多的生产总值,甚至就连宣传片的风格和渭南也别无二致。不过,这里孵化器的基建标准很高,相当不错。只是,运营和入驻企业质量并不特别。
+
+
+离开运城登上高铁,看到了站前广场的大刀关公像。运城和渭南之间,仅仅隔着一条黄河,距离之近,超乎想象。不到一个小时,高铁到站,天色尚早,想必单位的同事才刚刚下班,一场来去匆匆的山西之旅就此结束。
\ No newline at end of file
diff --git "a/_posts/2025-08-20-\346\257\233\351\200\211\357\274\232\351\242\206\345\257\274\346\240\271\346\234\254\344\270\215\345\234\250\346\204\217\344\275\240\345\271\262\344\272\206\345\244\232\345\260\221\346\264\273\357\274\214\345\217\252\345\234\250\346\204\217\350\277\231\345\233\233\347\202\271.md" "b/_posts/2025-08-20-\346\257\233\351\200\211\357\274\232\351\242\206\345\257\274\346\240\271\346\234\254\344\270\215\345\234\250\346\204\217\344\275\240\345\271\262\344\272\206\345\244\232\345\260\221\346\264\273\357\274\214\345\217\252\345\234\250\346\204\217\350\277\231\345\233\233\347\202\271.md"
new file mode 100644
index 00000000000..1fc9955f516
--- /dev/null
+++ "b/_posts/2025-08-20-\346\257\233\351\200\211\357\274\232\351\242\206\345\257\274\346\240\271\346\234\254\344\270\215\345\234\250\346\204\217\344\275\240\345\271\262\344\272\206\345\244\232\345\260\221\346\264\273\357\274\214\345\217\252\345\234\250\346\204\217\350\277\231\345\233\233\347\202\271.md"
@@ -0,0 +1,257 @@
+---
+catalog: true
+date: '2025-08-20'
+header-img: img/post-bg-1.jpg
+image_hashes: []
+layout: post
+notion_id: 2557d276-8542-808b-ad87-dc5dba084675
+subtitle: 领导点拨的工作技巧
+tags:
+- 工作
+title: 领导根本不在意你干了多少活,只在意这四点
+---
+
+我发现,很多人在职场上越来越被边缘化,不是因为不够勤奋,不是因为能力不行,而是因为一个根本性的认知错误:以为领导在意你干了多少活。
+
+
+什么意思?
+
+
+就是你每天加班到深夜,做了无数琐碎的工作,写了厚厚的工作汇报,但领导依然对你视而不见,提拔的永远是别人。
+
+
+真正聪明的下属,从来不是最忙的那个,而是最懂领导心思的那个。
+
+
+他们知道,在职场资源有限的情况下,理解领导的关注点就是升职加薪的密码。
+
+
+## 01:领会意图——读懂领导的弦外之音
+
+
+大部分普通员工的工作方式是:接到任务就开始埋头苦干。
+
+
+这个做法看起来很负责,毕竟领导交代的事情要赶紧完成,这是职场基本素养。
+
+
+但问题就出在这里。
+
+
+我见过太多这样的员工:领导说要做个报告,他们就真的只做个报告;领导说要联系客户,他们就真的只联系客户;领导说要整理资料,他们就真的只整理资料。
+
+
+结果呢?
+
+
+做出来的东西领导不满意,总是要反复修改;费了九牛二虎之力,却被说“没抓住重点”;明明完成了任务,但领导的脸色依然不好看。
+
+
+这就是典型的“表面执行”模式。
+
+
+只看到了任务的表象,没有理解任务背后的深意,整个工作就注定会偏离方向。
+
+
+毛选说:透过现象看本质,找出事物的内在联系。
+
+
+职场也是如此,分不清任务的表面要求和深层意图,就会陷入无效努力的怪圈。
+
+
+更可怕的是,这种表面执行还会让你错失展现能力的机会。
+
+
+当领导看到你只会机械地完成任务时,他会认为你缺乏战略思维;
+
+
+当领导发现你总是需要详细指导时,他会怀疑你的理解能力;
+
+
+当领导意识到你从不主动思考时,他会觉得你没有培养价值。
+
+
+于是,你只能眼睁睁地看着那些善于揣摩领导意图的同事步步高升。
+
+
+真正聪明的下属,会这样领会意图:
+
+
+当领导说“做个市场分析报告”时,他们想的是:领导为什么需要这个报告?是要做决策还是要汇报给上级?重点应该放在哪里?
+
+
+当领导说“跟进一下这个项目”时,他们想的是:这个项目目前的关键问题是什么?领导最担心的风险在哪里?需要重点关注什么指标?
+
+
+当领导说“联系一下客户”时,他们想的是:客户现在的状态如何?可能会提出什么问题?我们需要达成什么目标?
+
+
+一个善于领会意图的员工,永远能够超出领导的期望。
+
+
+因为他们不只是在完成任务,而是在解决问题,在为领导分忧,在创造价值。
+
+
+## 02:带头执行——做那个让领导放心的人
+
+
+领导最头疼的不是工作量大,而是不知道任务能不能按时按质完成。
+
+
+很多人以为,只要自己完成了分内的工作就够了。但在领导眼里,真正有价值的员工是那些能够带动整个团队向前的人。
+
+
+我见过太多这样的场景:
+
+
+领导安排了一个团队任务,大部分人都在观望,等着别人先行动;
+
+
+有人开始抱怨任务太难,有人找借口说资源不够,有人直接消极怠工;
+
+
+而那个最终被提拔的人,往往是那个第一个站出来说“我来带头”的人。
+
+
+为什么带头执行如此重要?
+
+
+因为在任何组织里,执行力都是稀缺资源。大部分人都会找理由,找借口,找退路,但真正愿意冲在前面的人永远是少数。
+
+
+毛选说:政治路线确定之后,干部就是决定的因素。
+
+
+在职场上也是如此,战略再好,没有执行力强的人去落实,一切都是空谈。
+
+
+真正的带头执行,不是盲目地冲在前面,而是要具备三个特质:
+
+
+第一,主动承担责任。
+
+
+当项目出现问题时,你不是第一个找借口的人,而是第一个想办法解决的人。领导看到的是你的担当,而不是你的推诿。
+
+
+第二,感染团队氛围。
+
+
+你的积极态度会影响周围的同事,让整个团队的士气都提升起来。领导看到的是你的影响力,而不是你的个人能力。
+
+
+第三,提供解决方案。
+
+
+你不只是在执行,还在优化流程,改进方法,提高效率。领导看到的是你的创新能力,而不是你的机械劳动。
+
+
+记住,领导要的不是一个听话的执行者,而是一个可以托付重任的合作伙伴。
+
+
+当你成为那个让领导放心的人时,更多的机会自然会向你倾斜。
+
+
+## 03:及时汇报——让领导永远知道你在做什么
+
+
+职场上最大的误区之一,就是以为埋头苦干就会被看见。
+
+
+很多人觉得,只要我做好了工作,领导自然会知道我的价值。但残酷的现实是:领导很忙,他没有时间主动关注每个人的工作状态。
+
+
+如果你不主动汇报,在领导眼里,你就是透明的。
+
+
+我见过太多优秀的员工因为不会汇报而被埋没:
+
+
+有的人默默承担了大量工作,但领导根本不知道他的贡献;有的人解决了重要问题,但没有及时汇报,功劳被别人抢走;有的人遇到了困难,闷头解决,结果延误了整个项目进度。
+
+
+真正聪明的员工,懂得汇报的艺术。
+
+
+什么时候汇报?
+
+
+不是等到工作完成才汇报,而是在关键节点主动汇报。开始执行时汇报计划,遇到问题时汇报风险,取得进展时汇报成果,完成任务时汇报结果。
+
+
+汇报什么内容?
+
+
+不是流水账式的工作记录,而是结构化的信息传递。重点汇报进展、问题、解决方案和下一步计划。让领导一眼就能看到关键信息。
+
+
+怎么汇报?
+
+
+不是长篇大论的邮件,而是简洁明了的要点总结。用数据说话,用事实证明,用结果展示价值。
+
+
+毛选说:没有调查,没有发言权。
+
+
+同样,没有汇报,就没有存在感。
+
+
+及时汇报的真正价值,不只是让领导知道你在做什么,更是展示你的思考能力和大局观。
+
+
+当你的汇报总是条理清晰、重点突出时,领导会认为你具备管理潜质;
+
+
+当你能够准确识别风险和机会时,领导会认为你具备战略眼光;
+
+
+当你的建议总是切中要害时,领导会认为你具备决策能力。
+
+
+这,才是汇报的最高境界。
+
+
+## 04:掏心窝子的话
+
+
+很多人之所以在职场上得不到重用,根本原因是对领导的关注点有着错误的认知。
+
+
+他们以为领导在意的是工作量,是加班时长,是表面的忙碌,但实际上,领导真正在意的是你能不能帮他解决问题,能不能让他放心,能不能为他创造价值。
+
+
+我见过太多因为搞错重点而错失机会的员工:
+
+
+有的人每天最早到公司,最晚离开,但做的都是重复性的低价值工作,领导看不到他们的独特贡献;
+
+
+有的人总是抱怨工作太多,压力太大,但从来不主动思考如何提高效率,如何创新方法,领导只能看到他们的负面情绪;
+
+
+有的人能力很强,工作也很认真,但从来不懂得表达和展示,结果被那些善于表现的同事超越。
+
+
+这些悲剧的根源,都是同一个错误:不懂领导的心理需求。
+
+
+真正聪明的员工,懂得一个道理:
+
+
+领导需要的不是最忙的员工,而是最有用的员工; 领导看重的不是你的辛苦,而是你的价值; 领导关心的不是你做了什么,而是你解决了什么。
+
+
+当你开始从领导的角度思考问题时,你会发现:
+
+
+你的每一个行动都变得更有针对性;你的每一次汇报都能抓住重点;你的每一个建议都能击中要害;你的每一份努力都能得到认可。
+
+
+记住,职场不是学校,不是谁最努力谁就能得到最高分。
+
+
+职场是战场,是资源争夺的游戏,是价值创造的竞技场。
+
+
+在这个游戏里,规则很简单:谁能最好地满足领导的需求,谁就能获得最多的资源和机会。
\ No newline at end of file
diff --git "a/_posts/2025-10-16-\346\233\264\344\270\212\344\270\200\345\261\202\346\245\274.md" "b/_posts/2025-10-16-\346\233\264\344\270\212\344\270\200\345\261\202\346\245\274.md"
new file mode 100644
index 00000000000..fda3285acea
--- /dev/null
+++ "b/_posts/2025-10-16-\346\233\264\344\270\212\344\270\200\345\261\202\346\245\274.md"
@@ -0,0 +1,90 @@
+---
+catalog: true
+date: '2025-10-16'
+header-img: img/post-bg-2.jpg
+image_hashes:
+- 89b0e5106b707eee1b41bc63047659ba.jpg
+layout: post
+notion_id: 28e7d276-8542-817f-a9f9-d5172b64e7a8
+subtitle: 国庆节山西之旅
+tags:
+- 生活
+title: 更上一层楼
+---
+
+白日依山尽 黄河入海流
+
+
+欲穷千里目 更上一层楼
+
+
+
+
+
+利用25年国庆假期的机会,拖家带口,终于领略了一次一千多年前唐朝诗人王焕之登临鹳雀楼的心旷神怡。
+
+
+鹳雀楼,四大名楼,位于黄河岸边山西一侧永济。
+
+
+从渭南出发,经连霍高速,从秦东出口离开东西交通大动脉,逶迤向北,不多时就到了普救寺,此次山西之行的第一个目的地。
+
+
+在这里穿插一个小插曲,原本我此行的第一个目的地是风陵渡。金庸的一句“风陵渡口初相遇,一见杨过误终生”给了这座黄河渡口太大的名气。
+
+
+去年国庆期间,曾在风陵渡对面的潼关港口镇体验过黄河的雄浑壮观。想必对面的风陵渡应该也有很不错的体验。
+
+
+可是,开车聊得很嗨,压根没注意到导航的提示。
+
+
+就知道快到了,谁知道一不小心就走过了?来到了河南的灵宝,再折转头来,经过潼关秦东过黄河,转而向北赴普救寺鹳雀楼。
+
+
+普救寺得盛名于西厢记,崔莺莺和张生的故事,几乎家喻户晓。
+
+
+不过,普救寺不在县城,而在蒲州镇,距离蒲津渡不远。当年,这是一条交通要道,自然极度繁华,从而衍生了很多故事,唐朝元稹便是其中之一。
+
+
+晚年,或许是出于亏欠,元稹有了莺莺传一书,辗转到元代就创作出了西厢记。
+
+
+普救寺位于一座土山上,土山不大,但拔地而起。山上植被郁郁葱葱,山顶一塔,现在已改名莺莺塔。
+
+
+我们从塔前广场出发,进入山门就是两梯极为陡峭的石头阶梯。普救寺位于这座小山,应当是旁边山脉的余脉,在这里堵然斩开一条豁口,上山自然极为陡峭。
+
+
+上到山顶,迎面一面大钟,上面写有普救寺三个大字,大字上书世界和平四个小字。右转穿过门廊便是莺莺塔。故事里,红娘牵线搭桥,莺莺在此幽会张生。
+
+
+穿过大雄宝殿,便是梨花深院,这里是崔莺莺一家暂住的地方。一座传统的四合院,东西厢房,对面就是正房,院子不大,但位置极佳。
+
+
+西厢记里面的西厢,便是源自这里的西厢房,这是莺莺的闺房。对面便是莺莺弟弟的卧房,正房则是老妇人房间。几个房间不大,里面是西厢记故事原型泥塑,栩栩如生。三组泥塑,三个故事,一看便知,此时可谓是无声胜有声。
+
+
+出得小院是一片开阔地,山顶平坦,一侧是福院,一侧是小广场,小广场视野不错,半山坡上则是一排窑洞,怪不得当年山上可以借宿留客,房间很多。
+
+
+经后花园下山,尝了山下小镇大名鼎鼎的永济牛肉饺子。多年前就曾耳闻,百闻不如一见。不如不见,或许不正宗,永济牛肉饺子带给我的只有两个字—失望。
+
+
+然后下一站便是鹳雀楼。鹳雀楼距离普救寺不远,穿过乡间小道,左转迁回,路过黄河铁牛,差不多半个小时,就到了鹳雀楼。
+
+
+鹳雀楼,原为北齐军事瞭楼,位于黄河岸边,监视对岸动向。处在交通要道,后世游客络绎不绝。最终,以诗篇“更上一层楼”名闻天下,跻身中国四大名楼。
+
+
+进入景区闸门,便是开阔的广场。远处,便是六层高楼。现在的鹳雀楼是上世纪八十年代翻修而成,依然气势恢宏。
+
+
+爬上高高的台阶,进入鹳雀楼内,绕楼拾级而上,半个小时才能登上楼顶观景平台。平台上,可以俯瞰黄河,如同一丝蜿蜒绸带,飘在暮色朦胧之中。
+
+
+真正登临鹳雀楼,确有一览众山小之感,虽然阴雨雾霭中看不清远处的中条山脉,近处的九曲黄河也没有那么蔚为壮观,但仍有登高望远之磅礴大气。
+
+
+恰逢国庆阴雨天气,偶有小雨影响不大。下楼回家,一路高速狂飙,不到两个小时返回渭南。短短一天时间,有点累,但开心,愉快的回忆。
\ No newline at end of file
diff --git a/_posts/cs_idols/2019-09-13-peter-john-landin.md b/_posts/cs_idols/2019-09-13-peter-john-landin.md
deleted file mode 100644
index b982c98c093..00000000000
--- a/_posts/cs_idols/2019-09-13-peter-john-landin.md
+++ /dev/null
@@ -1,33 +0,0 @@
----
-title: "Peter John Landin"
-subtitle: "「计算机科学偶像」- 彼得·约翰·兰丁"
-layout: post
-author: "Hux"
-published: false
-header-style: text
-tags:
- - CS Idols
----
-
-> - [wiki](https://en.wikipedia.org/wiki/Peter_Landin)
-> - [维基](https://zh.wikipedia.org/wiki/%E5%BD%BC%E5%BE%97%C2%B7%E5%85%B0%E4%B8%81)
-
-I was long curious about how does λ calculus become the foundation of formalizaing programming languages. It's strange that I haven't look up the answer until today: It's invented so early by Alonzo Church (whom I will write another post for) as an alternative mathematic foundation in 1930s and its relation with programming language was re-discoverred in 1960s.
-
-From the "Lambda calculus and programming languages" section of wikipedia page:
-
-> As pointed out by Peter Landin's 1965 paper "A Correspondence between ALGOL 60 and Church's Lambda-notation"
-
-I found this name quite familiar since I read his paper "The mechanical evaluation of expressions" before, in which he introduced the first abstract machine for functional programming language, namely [SECD machine](https://en.wikipedia.org/wiki/SECD_machine). This paper also define the term [Closure](https://en.wikipedia.org/wiki/Closure_(computer_programming)) which becomes a prevalent notion in computer programming nowadays.
-
-Besides of that, his contributions also include:
-
-- on ALGO definition
-- [ISWIM](https://en.wikipedia.org/wiki/ISWIM) programming language
-- [off-side rule](https://en.wikipedia.org/wiki/Off-side_rule), known as "indentation-based" syntax nowadays, popularized by Miranda, Haskell, Python, etc.
-- coin the term [syntactic sugar](https://en.wikipedia.org/wiki/Syntactic_sugar)
-
-He was much influenced by a study of McCarthy's LISP and taught [Tony Hoare](https://en.wikipedia.org/wiki/Tony_Hoare) ALGO with Peter Naur and Edsger W. Dijkstra. (Oh yes, definitely 4 more people to write).
-
-I have just download his old, influential paper "The next 700 programming languages".
-I am sure it will be an enjoyable read.
diff --git a/_posts/data_rep/2020-06-19-data-rep-int.md b/_posts/data_rep/2020-06-19-data-rep-int.md
deleted file mode 100644
index a953d6fb1ae..00000000000
--- a/_posts/data_rep/2020-06-19-data-rep-int.md
+++ /dev/null
@@ -1,333 +0,0 @@
----
-title: "Data Representation - Integer"
-subtitle: "「数据表示」整数"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - 笔记
- - 基础
- - C
- - C++
----
-
-Integers, or _whole number_ from elemental mathematics, are the most common and
-fundamental numbers used in the computers. It's represented as
-_fixed-point numbers_, contrast to _floating-point numbers_ in the machine.
-Today we are going to learn a whole bunch of way to encode it.
-
-There are mainly two properties to make a integer representation different:
-
-1. **Size, of the number of bits used**.
-usually the power of 2. e.g. 8-bit, 16-bit, 32-bit, 64-bit.
-
-2. **Signed or unsigned**.
-there are also multiple schemas to encode a signed integers.
-
-We are also gonna use the below terminologies throughout the post:
-
-- _MSB_: Most Significant Bit
-- _LSB_: Least Significant Bit
-
-
-Prerequisite - `printf` Recap
-----------------------------------------
-
-We will quickly recap the integers subset of usages of `printf`.
-Basically, we used _format specifier_ to interpolate values into strings:
-
-### [Format Specifier](http://www.cplusplus.com/reference/cstdio/printf/)
-
-> `%[flags][width][.precision][length]specifier`
-
-- `specifier`
- - `d`, `i` : signed decimal
- - `u` : unsigned decimal
- - `c` : char
- - `p`: pointer addr
- - `x` / `X` : lower/upper unsigned hex
-- `length`
- - `l` : long (at least 32)
- - `ll` : long long (at least 64)
- - `h` : short (usually 16)
- - `hh` : short short (usually 8)
-
-```cpp
-using namespace std;
-int main() {
- cout << "Size of int = "<< sizeof(int) << endl;
- cout << "Size of long = " << sizeof(long) << endl;
- cout << "Size of long long = " << sizeof(long long);
-}
-Output in 32 bit gcc compiler: 4 4 8
-Output in 64 bit gcc compiler: 4 8 8
-```
-
-### [`inttypes.h` from C99](http://www.qnx.com/developers/docs/6.5.0/index.jsp?topic=%2Fcom.qnx.doc.dinkum_en_c99%2Finttypes.html)
-
-Also in [cppreference.com](https://en.cppreference.com/w/c/types/integer)
-
-```cpp
-// signed int (d or i)
-#define PRId8 "hhd"
-#define PRId16 "hd"
-#define PRId32 "ld"
-#define PRId64 "lld"
-
-// unsigned int (u)
-#define PRIu8 "hhd"
-#define PRIu16 "hd"
-#define PRIu32 "ld"
-#define PRIu64 "lld"
-
-// unsigned hex
-#define PRIx8 "hhu"
-#define PRIx16 "hu"
-#define PRIx32 "lu"
-#define PRIx64 "llu"
-
-// uintptr_t (64 bit machine word len)
-#define PRIxPTR "llx"
-```
-
-
-Unsigned Integers
------------------
-
-The conversion between unsigned integers and binaries are trivial.
-Here, we can represent 8 bits (i.e. a _byte_) as a _hex pair_, e.g.
-`255 == 0xff == 0b11111111`.
-
-```cpp
-#include // uintN_t
-#include // PRI macros
-
-uint8_t u8 = 255;
-printf("0x%02" PRIx8 "\n", u8); // 0xff
-printf( "%" PRId8 "\n", u8); // 255
-```
-
-
-Signed Integers
------------------
-
-Signed integers are more complicated. We need to cut those bits to halves
-to represent both positive and negative integers somehow.
-
-There are four well-known schemas to encode it, according to
-[signed number representation of wikipedia](https://en.wikipedia.org/wiki/Signed_number_representations).
-
-### Sign magnitude 原码
-
-It's also called _"sign and magnitude"_. From the name we can see how straightforward it is:
-it's basically put one bit (often the _MSB_) as the _sign bit_ to represent _sign_ and the remaining bits indicating
-the magnitude (or absolute value), e.g.
-
-```cpp
- binary | sign-magn | unsigned
------------|-----------|------------
-0 000 0000 | +0 | 0
-0 111 1111 | 127 | 127
-...
-1 000 0000 | -0 | 128
-1 111 1111 | -127 | 255
-```
-
-It was used in early computer (IBM 7090) and now mainly used in the
-_significand_ part in floating-point number
-
-Pros:
-- simple and nature for human
-
-Cons:
-- 2 way to represent zeros (`+0` and `-0`)
-- not as good for machine
- - add/sub/cmp require knowing the sign
- - complicate CPU ALU design; potentially more cycles
-
-
-### [Ones' complement](https://en.wikipedia.org/wiki/Ones%27_complement) 反码
-
-It form a negative integers by applying a _bitwise NOT_
-i.e. _complement_ of its positive counterparts.
-
-```cpp
- binary | 1s comp | unsigned
------------|-----------|------------
-0000 0000 | 0 | 0
-0000 0001 | 1 | 1
-...
-0111 1111 | 127 | 127
-1000 0000 | -127 | 128
-...
-1111 1110 | -1 | 254
-1111 1111 | -0 | 255
-```
-
-N.B. _MSB_ can still be signified by MSB.
-
-It's referred to as _ones'_ complement because the negative can be formed
-by subtracting the positive **from** _ones_: `1111 1111 (-0)`
-
-```cpp
- 1111 1111 -0
-- 0111 1111 127
----------------------
- 1000 0000 -127
-```
-
-The benefits of the complement nature is that adding becomes simple,
-except we need to do an _end-around carry_ to add resulting carry
-back to get the correct result.
-
-```cpp
- 0111 1111 127
-+ 1000 0001 -126
----------------------
-1 0000 0000 0
- 1 +1 <- add carry "1" back
----------------------
- 0000 0001 1
-```
-
-Pros:
-- Arithmetics on machien are fast.
-
-Cons:
-- still 2 zeros!
-
-
-### [Twos' complement](https://en.wikipedia.org/wiki/Two%27s_complement) 补码
-
-Most of the current architecture adopted this, including x86, MIPS, ARM, etc.
-It differed with one's complement by one.
-
-```cpp
- binary | 2s comp | unsigned
------------|-----------|------------
-0000 0000 | 0 | 0
-0000 0001 | 1 | 1
-...
-0111 1111 | 127 | 127
-1000 0000 | -128 | 128
-1000 0001 | -127 | 129
-...
-1111 1110 | -2 | 254
-1111 1111 | -1 | 255
-```
-
-N.B. _MSB_ can still be signified by MSB.
-
-It's referred to as _twos'_ complement because the negative can be formed
-by subtracting the positive **from** `2 ** N` (congruent to `0000 0000 (+0)`),
-where `N` is the number of bits.
-
-E.g., for a `uint8_t`, the _sum_ of any number and it's twos' complement would
-be `256 (1 0000 0000)`:
-
-```cpp
-1 0000 0000 256 = 2 ** 8
-- 0111 1111 127
----------------------
- 1000 0001 -127
-```
-
-Becuase of this, arithmetics becomes really easier, for any number `x` e.g. `127`
-we can get its twos' complement by:
-
-1. `~x => 1000 0000` bitwise NOT (like ones' complement)
-2. `+1 => 1000 0001` add 1 (the one differed from ones' complement)
-
-Cons:
-- bad named?
-
-Pros:
-- fast machine arithmatics.
-- only 1 zeros!
-- the minimal negative is `-128`
-
-
-### [Offset binary](https://en.wikipedia.org/wiki/Offset_binary) 移码
-
-It's also called _excess-K_ (偏移 K) or _biased representation_, where `K` is
-the _biasing value_ (the new `0`), e.g. in _excess-128_:
-
-```cpp
- binary | K = 128 | unsigned
------------|-----------|------------
-0000 0000 | -128(-K)| 0
-0000 0001 | -127 | 1
-...
-0111 1111 | -1 | 127
-1000 0000 | 0 | 128 (K)
-1000 0001 | 1 | 129
-...
-1111 1111 | 127 | 255
-```
-
-It's now mainly used for the _exponent_ part of floating-point number.
-
-
-Type Conversion & `Printf`
-----------------------------------------------
-
-This might be a little bit off topic, but I want to note down what I observed
-from experimenting. Basically, `printf` would not perform an implicit type
-conversion but merely _interpret_ the bits arrangement of your arguments as you
-told it.
-
-- _UB!_ stands for _undefined behaviors_
-
-```cpp
-uint8_t u8 = 0b10000000; // 128
- int8_t s8 = 0b10000000; // -128
-
-printf("%"PRIu8 "\n", u8); // 128
-printf("%"PRId8 "\n", u8); // 128 (UB! but somehow it's got right)
-printf("%"PRId8 "\n", (int8_t)u8); // -128
-
-printf("%"PRId8 "\n", s8); // -128
-printf("%"PRIu8 "\n", s8); // 4294967168 (UB!)
-printf("%"PRId8 "\n", (uint8_t)s8); // 128
-
-printf("%"PRIxPTR "\n", s8); // ffffff80
-printf("%"PRIxPTR "\n", (uintptr_t)s8); // ffffffffffffff80
-```
-
-
-Char & [ASCII](https://en.wikipedia.org/wiki/ASCII)
------------------
-
-Traditionally, `char` is represented in the computer as 8 bits as well. And
-really, ASCII is only defined between `0` and `127` and require 7 bits.
-(8-bit Extended ASCII is not quite well popularized and supported.)
-
-It's more complicated in extension such as _Unicode_ nowadays, but we'll ignore
-it for future posts dedicated for char and string representation.
-
-So how is a `char` different with a _byte_?
-
-Well, the answer is whether a `char` is a `signed char` (backed by `int8_t`)
-or a `unsigned char` (backed by `uint8_t`) is... _implementaton-defined_.
-And most systems made it _signed_ since most types (e.g. `int`) were signed
-by default.
-
-N.B. `int` is standard-defined to be equivalent to `signed int`. This is
-not the case of `char`.
-
-That's why you often see such `typedef` such as:
-
-```cpp
-typedef unsigned char Byte_t;
-typedef uint8_t byte_t;
-```
-
-to emphysize the nature of byte should be just plain, unsigned, bits.
-
-
-References
-----------
-
--
--
diff --git a/_posts/data_rep/2020-06-21-data-rep-float.md b/_posts/data_rep/2020-06-21-data-rep-float.md
deleted file mode 100644
index 60df834679f..00000000000
--- a/_posts/data_rep/2020-06-21-data-rep-float.md
+++ /dev/null
@@ -1,331 +0,0 @@
----
-title: "Data Representation - Floating Point Numbers"
-subtitle: "「数据表示」浮点数"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - 笔记
- - 基础
- - C
- - C++
----
-
-In the last episode we talked about the data representation of integer, a kind
-of fixed-point numbers. Today we're going to learn about floating-point numbers.
-
-Floating-point numbers are used to _approximate_ real numbers. Because of the
-fact that all the stuffs in computers are, eventually, just a limited sequence
-of bits. The representation of floating-point number had to made trade-offs
-between _ranges_ and _precision_.
-
-Due to its computational complexities, CPU also have a dedicated set of
-instructions to accelerate on floating-point arithmetics.
-
-
-Terminologies
--------------
-
-The terminologies of floating-point number is coming from the
-[_scientific notation_](https://en.wikipedia.org/wiki/Scientific_notation),
-where a real number can be represented as such:
-
-```
-1.2345 = 12345 × 10 ** -4
- ----- -- --
- significand^ ^base ^exponent
-```
-
-- _significand_, or _mantissa_, 有效数字, 尾数
-- _base_, or _radix_ 底数
-- _exponent_, 幂
-
-So where is the _floating point_? It's the `.` of `1.2345`. Imaging the dot
-can be float to the left by one to make the representation `.12345`.
-
-The dot is called _radix point_, because to us it's seem to be a _decimal point_,
-but it's really a _binary point_ in the computers.
-
-Now it becomes clear that, to represent a floating-point number in computers,
-we will simply assign some bits for _significand_ and some for _exponent_, and
-potentially a bit for _sign_ and that's it.
-
-
-IEEE-754 32-bits Single-Precision Floats 单精度浮点数
-----------------------------------------
-
--
-
-It was called **single** back to IEEE-754-1985 and now **binary32** in the
-relatively new IEEE-754-2008 standard.
-
-```cpp
- (8 bits) (23 bits)
-sign exponent fraction
- 0 011 1111 1 000 0000 0000 0000 0000 0000
-
- 31 30 .... 23 22 ....................... 0
-```
-
-- The _sign_ part took 1 bit to indicate the sign of the floats. (`0` for `+`
-and `1` for `-`. This is the same treatment as the [sign magnitute](2020-06-19-data-rep-int.md##sign-magnitude-原码).
-- The _exponent_ part took 8 bits and used [_offset-binary (biased) form_](2020-06-19-data-rep-int.md#offset-binary-移码) to represent a signed integer.
-It's a variant form since it took out the `-127` (all 0s) for zero and `+128`
-(all 1s) for non-numbers, thus it ranges only `[-126, 127]` instead of
-`[-127, 128]`. Then, it choose the zero offset of `127` in these 254 bits (like
-using `128` in _excess-128_), a.k.a the _exponent bias_ in the standard.
-- The _fraction_ part took 23 bits with an _implicit leading bit_ `1` and
-represent the actual _significand_ in total precision of 24-bits.
-
-Don't be confused by why it's called _fraction_ instead of _significand_!
-It's all because that the 23 bits in the representation is indeed, representing
-the fraction part of the real significand in the scientific notation.
-
-The floating-point version of "scientific notation" is more like:
-
-```cpp
-(leading 1)
- 1. fraction × 2 ^ exponent × sign
- (base-2) (base-2)
-```
-
-So what number does the above bits represent?
-
-```cpp
-S F × E = R
-+ 1.(0) × 0 = 1
-```
-
-Aha! It's the real number `1`!
-Recall that the `E = 0b0111 1111 = 0` because it used a biased representation!
-
-We will add more non-trivial examples later.
-
-
-Demoing Floats in C/C++
------------------------
-
-Writing sample code converting between binaries (in hex) and floats are not
-as straightforward as it for integers. Luckily, there are still some hacks to
-perform it:
-
-### C - Unsafe Cast
-
-We unsafely cast a pointer to enable reinterpretation of the same binaries.
-
-```cpp
-float f1 = 0x3f800000; // C doesn't have a floating literal taking hex.
-printf("%f \n", f1); // 1065353216.000000 (???)
-
-uint32_t u2 = 0x3f800000;
-float* f2 = (float*)&u2; // unsafe cast
-printf("%f \n", *f2); // 1.000000
-```
-
-### C - Union Trick
-
-Oh I really enjoyed this one...Union in C is not only untagged union, but also
-share the exact same chunk of memory. So we are doing the same reinterpretation,
-but in a more structural and technically fancier way.
-
-```cpp
-#include
-#include
-#include
-
-float pi = (float)M_PI;
-union {
- float f;
- uint32_t u;
-} f2u = { .f = pi }; // we took the data as float
-
-printf ("pi : %f\n : 0x%" PRIx32 "\n", pi, f2u.u); // but interpret as uint32_t
-pi : 3.141593
- : 0x40490fdb
-```
-
-N.B. this trick is well-known as [type punning](https://en.wikipedia.org/wiki/Type_punning):
-
-> In computer science, type punning is a common term for any programming technique that subverts or circumvents the type system of a programming language in order to achieve an effect that would be difficult or impossible to achieve within the bounds of the formal language.
-
-### C++ - `reinterpret_cast`
-
-C++ does provide such type punning to the standard language:
-
-```cpp
-uint32_t u = 0x40490fdb;
-float a = *reinterpret_cast(&u);
-std::cout << a; // 3.14159
-```
-
-N.B. it still need to be a conversion between pointers,
-see .
-
-Besides, C++ 17 does add a floating point literal that can take hex, but it
-works in a different way, using an explicit radix point in the hex:
-
-```cpp
-float f = 0x1.2p3; // 1.2 by 2^3
-std::cout << f; // 9
-```
-
-That's try with another direction:
-
-```cpp
-#include
-#include
-#include
-
-int main() {
- double qNan = std::numeric_limits::quiet_NaN();
- printf("0x%" PRIx64 "\n", *reinterpret_cast(&qNan));
- // 0x7ff8000000000000, the canonical qNaN!
-}
-```
-
-
-Representation of Non-Numbers
------------------------------
-
-There are more in the IEEE-754!
-
-Real numbers doesn't satisfy [closure property](https://en.wikipedia.org/wiki/Closure_(mathematics))
-as integers does. Notably, the set of real numbers is NOT closed under the
-division! It could produce non-number results such as **infinity** (e.g. `1/0`)
-and [**NaN (Not-a-Number)**](https://en.wikipedia.org/wiki/NaN) (e.g. taking
-a square root of a negative number).
-
-It would be algebraically ideal if the set of floating-point numbers can be
-closed under all floating-point arithmetics. That would made many people's life
-easier. So the IEEE made it so! Non-numeber values are squeezed in.
-
-We will also include the two zeros (`+0`/`-0`) into the comparison here,
-since they are also special by being the only two demanding an `0x00` exponent:
-
-```cpp
- binary | hex |
---------------------------------------------------------
-0 00000000 00000000000000000000000 = 0000 0000 = +0
-1 00000000 00000000000000000000000 = 8000 0000 = −0
-
-0 11111111 00000000000000000000000 = 7f80 0000 = +infinity
-1 11111111 00000000000000000000000 = ff80 0000 = −infinity
-
-_ 11111111 10000000000000000000000 = _fc0 0000 = qNaN (canonical)
-_ 11111111 00000000000000000000001 = _f80 0001 = sNaN (one of them)
-```
-
-```cpp
- (8 bits) (23 bits)
-sign exponent fraction
- 0 00 0 ...0 0 = +0
- 1 00 0 ...0 0 = -0
- 0 FF 0 ...0 0 = +infinity
- 1 FF 0 ...0 0 = -infinity
- _ FF 1 ...0 0 = qNaN (canonical)
- _ FF 0 ...0 1 = sNaN (one of them)
-```
-
-Encodings of qNaN and sNaN are not specified in IEEE 754 and implemented
-differently on different processors. Luckily, both x86 and ARM family use the
-"most significant bit of fraction" to indicate whether it's quite.
-
-### More on NaN
-
-If we look carefully into the IEEE 754-2008 spec, in the _page35, 6.2.1_, it
-actually defined anything with exponent `FF` and not a infinity (i.e. with
-all the fraction bits being `0`), a NaN!
-
-> All binary NaN bit strings have all the bits of the biased exponent field E set to 1 (see 3.4). A quiet NaN bit string should be encoded with the first bit (d1) of the trailing significand field T being 1. A signaling NaN bit string should be encoded with the first bit of the trailing significand field being 0.
-
-That implies, we actually had `2 ** 24 - 2` of NaNs in a 32-bits float!
-The `24` came from the `1` sign bit plus `23` fractions and the `2` excluded
-were the `+/- inf`.
-
-The continuous 22 bits inside the fraction looks quite a waste, and there
-would be even 51 bits of them in the `double`! We will see how to made them useful
-in later episodes (spoiler: they are known as _NaN payload_).
-
-It's also worth noting that it's weird that the IEEE choose to use the MSB
-instead of the sign bit for NaN quiteness/signalness:
-
-> It seems strange to me that the bit which signifies whether or not the NaN is signaling is the top bit of the mantissa rather than the sign bit; perhaps something about how floating point pipelines are implemented makes it less natural to use the sign bit to decide whether or not to raise a signal.
-> --
-
-I guess it might be something related to the CPU pipeline? I don't know yet.
-
-
-### Equality of NaNs and Zeros.
-
-The spec defined a comparison with NaNs to return an **unordered result**, that
-means any comparison operation except `!=`, i.e. `>=, <=, >, <, =` between a
-NaN and any other floating-point number would return `false`.
-
-No surprised that most (if not every) language implemented such behaviours, e.g.
-in JavaScript:
-
-```js
-NaN !== NaN // true
-NaN === NaN // false
-NaN > 1 // false
-NaN < 1 // false
-```
-
-Position and negative zeros, however, are defined to be equal!
-
-```js
-+0 === -0 // true, using the traditional JS equality
-Object.is(+0, -0) // false, using the "SameValue" equality
-```
-
-In Cpp, we can tell them apart by looking at its sign bit:
-
-```cpp
-#include // signbit
-
-cout << (+0.0f == -0.0f); // 1
-cout << std::signbit(-0.0f); // 1
-cout << std::signbit(+0.0f); // 0
-```
-
-
-
-
-IEEE-754 64-bits Double-Precision Floats
-----------------------------------------
-
--
-
-Now, the 64-bit versions floating-point number, known as `double`, is just a
-matter of scale:
-
-```cpp
- (11 bits) (52 bits)
-sign exponent fraction
- 0
-
- 63 62 .... 52 51 ....................... 0
-```
-
-
-IEEE-754-2008 16-bits Short Floats
-----------------------------------------
-
-The 2008 edition of IEEE-754 also standardize the `short float`, which is
-neither in C or C++ standard. Though compiler extension might include it.
-
-It looks like:
-
-```cpp
-1 sign bit | 5 exponent bits | 10 fraction bits
-S E E E E E M M M M M M M M M M
-```
-
-
-
-References
-----------
-
--
--
diff --git a/_posts/data_rep/2020-06-21-data-rep-todo.md b/_posts/data_rep/2020-06-21-data-rep-todo.md
deleted file mode 100644
index 81978fcd414..00000000000
--- a/_posts/data_rep/2020-06-21-data-rep-todo.md
+++ /dev/null
@@ -1,22 +0,0 @@
----
-title: "Data Representation - TODO"
-subtitle: "「数据表示」待写"
-layout: post
-author: "Hux"
-header-style: text
-published: false
-tags:
- - 笔记
- - 基础
- - C
- - C++
----
-
-- Endianness
-- String (Char Sequence e.g. NULL `0x00`)
-- Unicode / UTF8
-- Struct and Alignment
-- Tagging
- - Tagged Pointer
- - NaN tagging
- - Tagged Integer (SMI)
diff --git a/_posts/hidden/2020-05-05-pl-chart.md b/_posts/hidden/2020-05-05-pl-chart.md
deleted file mode 100644
index fac963810e5..00000000000
--- a/_posts/hidden/2020-05-05-pl-chart.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-title: "My Programming Languages Spectrum"
-subtitle: "我的编程语言光谱"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-plchart: true
-tags:
----
-
-
diff --git a/_posts/read_sf_lf/2019-01-01-sf-lf-01-basics.md b/_posts/read_sf_lf/2019-01-01-sf-lf-01-basics.md
deleted file mode 100644
index 7511ff4adb3..00000000000
--- a/_posts/read_sf_lf/2019-01-01-sf-lf-01-basics.md
+++ /dev/null
@@ -1,209 +0,0 @@
----
-title: "「SF-LC」1 Basics"
-subtitle: "Logical Foundations - Functional Programming in Coq"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - LF (逻辑基础)
- - SF (软件基础)
- - Coq
- - 笔记
----
-
-> These series of notes combined
-> - My notes on reading _Software Foundation_ and (if any) watching on _Coq intensive_.
-> - Gotchas from my independent studies and discussion within _Prof.Fluet_'s class.
-
-> The `.v` code is a gorgeous example of _literal programming_ and the compiled `.html` website is full-fledged.
-> So this note is intended to be NOT self-contained and only focus on things I found essential or interesting.
-
-> This note is intended to be very personal and potentially mix English with Chinese (You can Lol)
-> So yeah. Don't expect it to be well organized and well written.
-> I posted it on blog mainly for my own references purpose.
-
-> The quotes could either come from the book or saying from someone (even including me).
-
-
-Data and Functions
-------------------
-
-### Custom Notation
-
-```coq
-Notation "x && y" := (andb x y).
-Notation "x || y" := (orb x y).
-```
-
-can go pretty far with unicode char...
-
-making things _infix_
-
-```coq
-Notation "x + y" := (plus x y)
- (at level 50, left associativity)
- : nat_scope.
-Notation "x - y" := (minus x y)
- (at level 50, left associativity)
- : nat_scope.
-Notation "x * y" := (mult x y)
- (at level 40, left associativity)
- : nat_scope.
-```
-
-why `40` `50`? Making sure there are still _rooms_ for priority in between...
-
-> no known PL using real number for priority though
-
-
-
-### Data Constructor with arguments
-
-there are 2 ways to define them:
-
-```coq
-Inductive color : Type :=
- | black
- | white
- | primary (p : rgb). (* ADT, need to name arg, useful in proof *)
- | primary : rgb -> color. (* GADT style, dependent type *)
-```
-
-
-
-### Syntax for arguments having the same type
-
-
-> As a notational convenience, if two or more arguments have the same type, they can be written together
-
-```coq
-Inductive nybble : Type :=
- | bits (b0 b1 b2 b3 : bit).
-```
-
-```coq
-Fixpoint mult (n m : nat) : nat :=
-Fixpoint plus (n : nat) (m : nat) : nat :=
-```
-
-
-`Fixpoint` and Structrual Recursion
------------------------------------
-
-> This requirement is a fundamental feature of Coq's design: In particular, it guarantees that every function that can be defined in Coq will terminate on all inputs.
-
-However, Coq's "decreasing analysis" is not very sophisticated. E.g.
-
-```coq
-Fixpoint evenb (n:nat) : bool :=
- match n with
- | O => true
- | S O => false
- | n => evenb (pred (pred n))
- end.
-```
-
-will result in a error that basically complains _"this structure is not shrinking"_.
-
-```
-Error:
-Recursive definition of evenb is ill-formed.
-
-evenb : nat -> bool
-n : nat
-n0 : nat
-n1 : nat
-
-Recursive call to evenb has principal argument equal to
-"Nat.pred (Nat.pred n)" instead of one of the following variables: "n0" "n1".
-
-Recursive definition is:
-"fun n : nat =>
- match n with
- | 0 => true
- | 1 => false
- | S (S _) => evenb (Nat.pred (Nat.pred n))
- end".
-```
-
-N.B. the `n0` and `n1` are sub-terms of `n` where `n = S (S _)`.
-
-So we have to make the sub-structure explicit to indicate the structure is obviously shrinking:
-
-```coq
-Fixpoint evenb (n:nat) : bool :=
- match n with
- | O => true
- | S O => false
- | S (S n') => evenb n'
- end.
-```
-
-Now Coq will know this `Fixpoint` is performing a structural recursion over the 1st recursion and it guarantees to be terminated since the structure is decreasing:
-
-```
-evenb is defined
-evenb is recursively defined (decreasing on 1st argument)
-```
-
-
-Proof by Case Analysis
-----------------------
-
-```coq
-Theorem plus_1_neq_0_firsttry : ∀n : nat,
- (n + 1) =? 0 = false.
-Proof.
- intros n.
- simpl. (* does nothing! *)
-Abort.
-```
-
-`simpl.` does nothing since both `+` and `=?` have 2 cases.
-
-so we have to `destruct` `n` as 2 cases: nullary `O` and unary `S n'`.
-
-```coq
-intros n. destruct n as [ (* O *) | (* S *) n'] eqn:E.
-```
-
-- the _intro pattern_ `as [ |n']` name new bindings.
-- `eqn:E` annonate the destructed `eqn` (equation?) as `E` in the premises of proofs. It could be elided if not explicitly used, but useful to keep for the sake of documentation as well.
-
-```coq
-subgoal 1
-
- n : nat
- E : n = 0 (* case 1, n is [O] a.k.a. [0] *)
- ============================
- (0 + 1 =? 0) = false
-
-
-subgoal 2
-
- n, n' : nat
- E : n = S n' (* case 2, n is [S n'] *)
- ============================
- (S n' + 1 =? 0) = false
-```
-
-If there is no need to specify any names, we could omit `as` clause or simply write `as [|]` or `as []`.
-In fact. Any `as` clause could be ommited and Coq will fill in random var name auto-magically.
-
-
-### A small caveat on `intro`
-
-
-```coq
-intros x y. destruct y as [ | y ] eqn:E.
-```
-
-By doing this, name `y` is shadowed. It'd usually better to use, say `y'` for this purpose.
-
-
-
-`Qed`
------
-
-standing for Latin words _"Quod Erat Demonstrandum"_...meaning "that which was to be demonstrated".
diff --git a/_posts/read_sf_lf/2019-01-02-sf-lf-02-induction.md b/_posts/read_sf_lf/2019-01-02-sf-lf-02-induction.md
deleted file mode 100644
index 071482cdad6..00000000000
--- a/_posts/read_sf_lf/2019-01-02-sf-lf-02-induction.md
+++ /dev/null
@@ -1,142 +0,0 @@
----
-title: "「SF-LC」2 Induction"
-subtitle: "Logical Foundations - Proof by Induction"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - LF (逻辑基础)
- - SF (软件基础)
- - Coq
- - 笔记
----
-
-## Review (only in slide)
-
-```coq
-Theorem review2: ∀b, (orb true b) = true.
-Theorem review3: ∀b, (orb b true) = true.
-```
-
-Whether or not it can be just `simpl.` depending on the definition of `orb`.
-
-In _Proof Engineering_, we probably won't need to include `review2` but need to include `review3` in library.
-
-> Why we have `simpl.` but not `refl.` ?
-
-
-Proving `0` is a "neutral element" for `+` (additive identity)
---------------------------------------------------------------
-
-### Proving `0 + n = n`
-
-```coq
-Theorem plus_O_n : forall n : nat, 0 + n = n.
-Proof.
- intros n. simpl. reflexivity. Qed.
-```
-
-This can be simply proved by _simplication_ bcuz the definition of `+` is defined by pattern matching against 1st operand:
-
-```coq
-Fixpoint plus (n : nat) (m : nat) : nat :=
- match n with
- | O ⇒ m
- | S n' ⇒ S (plus n' m)
- end.
-```
-
-We can observe that if `n` is `0`(`O`), no matter `m` is, it returns `m` as is.
-
-
-### Proving `n + 0 = n`
-
-#### 1st try: Simplication
-
-```coq
-Theorem plus_O_n_1 : forall n : nat, n + 0 = n.
-Proof.
- intros n.
- simpl. (* Does nothing! *)
-Abort.
-```
-
-This cannot be proved by _simplication_ bcuz `n` is unknown so _unfold_ the definition `+` won't be able to simplify anything.
-
-#### 2nd try: Case Analysis
-
-```coq
-Theorem plus_n_O_2 : ∀n:nat,
- n = n + 0.
-Proof.
- intros n. destruct n as [| n'] eqn:E.
- - (* n = 0 *)
- reflexivity. (* so far so good... *)
- - (* n = S n' *)
- simpl. (* ...but here we are stuck again *)
-Abort.
-```
-
-Our 2nd try is to use _case analysis_ (`destruct`), but the proof stucks in _inductive case_ since `n` can be infinitely large (destructed)
-
-
-#### Induction to the resucue
-
-> To prove interesting facts about numbers, lists, and other inductively defined sets, we usually need a more powerful reasoning principle: induction.
-
-Princeple of induction over natural numbers (i.e. _mathematical induction_)
-
-```coq
-P(0); ∀n' P(n') → P(S n') ====> P(n)
-```
-
-In Coq, like `destruct`, `induction` break `P(n)` into 2 subgoals:
-
-```coq
-Theorem plus_n_O : ∀n:nat, n = n + 0.
-Proof.
- intros n. induction n as [| n' IHn'].
- - (* n = 0 *) reflexivity.
- - (* n = S n' *) simpl. rewrite <- IHn'. reflexivity. Qed.
-```
-
-
-Proving `n - n = 0`
--------------------
-
-```coq
-Theorem minus_diag : ∀n,
- minus n n = 0.
-Proof.
- (* WORKED IN CLASS *)
- intros n. induction n as [| n' IHn'].
- - (* n = 0 *)
- simpl. reflexivity.
- - (* n = S n' *)
- simpl. rewrite → IHn'. reflexivity. Qed
-```
-
-Noticed that the definition of `minus`:
-
-```coq
- Fixpoint minus (n m:nat) : nat :=
- match n, m with
- | O , _ => O
- | S _ , O => n
- | S n', S m' => minus n' m'
- end.
-```
-
-`rewrite`
----------
-
-`rewrite` would do a (DFS) preorder traversal in the syntax tree.
-
-
-
-
-
-
-
-
diff --git a/_posts/read_sf_lf/2019-01-03-sf-lf-03-list.md b/_posts/read_sf_lf/2019-01-03-sf-lf-03-list.md
deleted file mode 100644
index 096c5efc64b..00000000000
--- a/_posts/read_sf_lf/2019-01-03-sf-lf-03-list.md
+++ /dev/null
@@ -1,169 +0,0 @@
----
-title: "「SF-LC」3 List"
-subtitle: "Logical Foundations - Working with Structured Data"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - LF (逻辑基础)
- - SF (软件基础)
- - Coq
- - 笔记
----
-
-Pair of Numbers
----------------
-
-Q: Why name `inductive`?
-A: Inductive means _building things bottom-up_, it doesn't have to self-referencial (recursive)
-(see below `induction on lists` as well.)
-
-```coq
-Inductive natprod : Type :=
- | pair (n1 n2 : nat).
-
-Notation "( x , y )" := (pair x y).
-```
-
-Proof on pair cannot simply `simpl.`
-
-```coq
-Theorem surjective_pairing_stuck : ∀(p : natprod),
- p = (fst p, snd p).
-Proof.
- simpl. (* Doesn't reduce anything! *)
-Abort.
-```
-
-We have to _expose the structure_:
-
-```coq
-Theorem surjective_pairing : ∀(p : natprod),
- p = (fst p, snd p).
-Proof.
- intros p. destruct p as [n m**. simpl. reflexivity. Qed.
-```
-
-It only generate **one subgoal**, becasue
-> That's because natprods can only be constructed in one way.
-
-
-### My take on `destruct`
-
-`destruct`
-
-* destruct `bool` to `true` and `false`
-* destruct `nat` to `O` and `S n'` (inductively defined)
-* destruct `pair` to `(n, m)`
-
-The **prove by case analysis (exhaustive)** is just an application of the idea of _destruction_!
-
-the idea simply _destruct_ the data type into its data constructors (representing ways of constructing this data)
-
-- Java class has only 1 way to construct (via its constructor)
-- Scala case class then have multiple way to construct
-
-
-Lists of Numbers
-----------------
-
-> Generalizing the definition of pairs
-
-```coq
-Inductive natlist : Type :=
- | nil
- | cons (n : nat) (l : natlist).
-```
-
-The ability of quosiquotation using `Notation` is awesome:
-
-```coq
-Notation "x :: l" := (cons x l) (at level 60, right associativity).
-Notation "[ ]" := nil.
-Notation "[ x ; .. ; y ]" := (cons x .. (cons y nil) ..).
-```
-
-It's exactly like OCaml, even for `;`, `at level 60` means it's tightly than `+ at level 50` .
-
-```coq
-Notation "x ++ y" := (app x y) (right associativity, at level 60).
-```
-
-Instead of SML/OCaml's `@`, Coq chooses Haskell's `++`.
-
-
-### `hd` with default
-
-Coq function (for some reason) has to be **total**, so `hd` require a `default` value as 1st argument:
-
-```coq
-Definition hd (default:nat) (l:natlist) : nat :=
- match l with
- | nil ⇒ default
- | h :: t ⇒ h
- end.
-```
-
-
-Induction on Lists.
--------------------
-
-The definition of _inductive defined set_
-
-> Each Inductive declaration defines a set of data values that can be **built up** using the declared constructors:
-> - a boolean can be either true or false;
-> - a number can be either O or S applied to another number;
-> - a list can be either nil or cons applied to a number and a list.
-
-The reverse: reasoning _inductive defined sets_
-
-> Moreover, applications of the declared constructors to one another are the
-> **only** possible shapes that elements of an inductively defined set can have,
-> and this fact directly gives rise to a way of reasoning about inductively defined sets:
-> - a number is either O or else it is S applied to some smaller number;
-> - a list is either nil or else it is cons applied to some number and some smaller list;
-
-Reasoning lists
-
-> if we have in mind some proposition `P` that mentions a list `l` and we want to argue that `P` holds for *all* lists,
-> we can reason as follows
-> 1. First, show that `P` is `true` of `l` when `l` is `nil`.
-> 2. Then show that `P` is true of `l` when `l` is `cons n l'` for some number `n` and some smaller list `l'`, assuming that `P` is `true` for `l'`.
-
-
-Search
-------
-
-```coq
-Search rev (* list all theorems of [rev] *)
-```
-
-
-Coq Conditionals (`if then else`)
----------------------------------
-
-```coq
-Fixpoint nth_error' (l:natlist) (n:nat) : natoption :=
- match l with
- | nil ⇒ None
- | a :: l' ⇒ if n =? O then Some a
- else nth_error' l' (pred n)
- end.
-```
-
-One small generalization: since the boolean type in Coq is not built-in. Coq actually supports conditional expr **over any** _inductive defined typewith two constructors_. First constructor is considered true and false for second.
-
-
-
-
-
-Stuck in Proof
---------------
-
-could be many cases
-
-* wrong tactics
-* wrong theroem!! (might derive to counterexample)
-* wrong step (most hard to figure out)
- * induction on wrong things
diff --git a/_posts/read_sf_lf/2019-01-04-sf-lf-04-poly.md b/_posts/read_sf_lf/2019-01-04-sf-lf-04-poly.md
deleted file mode 100644
index 79aa54de477..00000000000
--- a/_posts/read_sf_lf/2019-01-04-sf-lf-04-poly.md
+++ /dev/null
@@ -1,617 +0,0 @@
----
-title: "「SF-LC」4 Poly"
-subtitle: "Logical Foundations - Polymorphism and Higher-Order Functions"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - LF (逻辑基础)
- - SF (软件基础)
- - Coq
- - 笔记
----
-
-> The critical new ideas are
-> polymorphism (abstracting functions over the types of the data they manipulate) and
-> higher-order functions (treating functions as data).
-
-
-## Polymorphism
-
-Until today, We were living in the monomorphic world of Coq.
-So if we want a list, we have to define it for each type:
-
-```coq
-Inductive boollist : Type :=
- | bool_nil
- | bool_cons (b : bool) (l : boollist).
-```
-
-
-## Polymorphic Type and Constructors
-
-But of course Coq supports polymorphic type.
-So we can _abstract things over type_
-
-```coq
-Inductive list (X:Type) : Type :=
- | nil
- | cons (x : X) (l : list X).
-
-Check list.
-(* ===> list : Type -> Type *)
-```
-
-Recall from PLT course, this is exacly **Parametric Polymorphism**
-and it's **SystemFω**. the `list` here is a type-level small lambda, or **type operators**
-
-Another things I'd love to mention is the concrete syntax of `list X`,
-it didn't choose the SML/OCaml order but the Haskell order.
-
-
-### Q1. What's the type of `nil` and `cons`?
-
-Both having `forall` type
-
-```coq
-Check nil.
-(* ===> nil : forall X : Type, list X *)
-Check cons.
-(* ===> nil : forall X : Type, X -> list X -> list X *)
-```
-
-
-### Q2. What's the type of `list nat`? Why not `Type` but weird `Set`?
-
-```coq
-Check nat.
-(* ===> nat : Set *)
-Check list nat.
-(* ===> list nat : Set *)
-Check Set.
-(* ===> Set: Type *)
-Check Type.
-(* ===> Type: Type *)
-```
-
-```coq
-Check (cons nat 2 (cons nat 1 (nil nat))).
-```
-
-
-## Polymorphic Functions
-
-we can make polymorphic versions of list-processing function:
-
-Btw, Pierce follows the TAPL convention where type is written in capital letter but not greek letter,
-less clear in first look but better for typing in real programming.
-
-```coq
-Fixpoint repeat (X : Type) (x : X) (count : nat) : list X :=
- match count with
- | 0 ⇒ nil X
- | S count' ⇒ cons X x (repeat X x count')
- end.
-```
-
-This is *SystemF*.
-
-```
-Check repeat.
-(* ===> repeat : forall X : Type, X -> nat -> list X *)
-```
-
-
-## Slide QA
-
-1. ill-typed
-2. `forall X : Type, X -> nat -> list X`
-3. `list nat`
-
-
-
-## Type Argument Inference
-
-`X` must be a `Type` since `nil` expects an `Type` as its first argument.
-
-```coq
-Fixpoint repeat' X x count : list X := (* return type [:list X] can be omitted as well *)
- match count with
- | 0 ⇒ nil X
- | S count' ⇒ cons X x (repeat' X x count')
- end.
-
-Check repeat'.
-(* ===> forall X : Type, X -> nat -> list X *)
-```
-
-
-## Type Argument Synthesis
-
-We can write `_` (hole) in place of `X` and Coq will try to **unify** all local information.
-
-```coq
-Fixpoint repeat'' X x count : list X :=
- match count with
- | 0 ⇒ nil _
- | S count' ⇒ cons _ x (repeat'' _ x count')
- end.
-
-Definition list123' :=
- cons _ 1 (cons _ 2 (cons _ 3 (nil _))).
-```
-
-Same underlying mechanisms:
-
-```coq
-repeat' X x count : list X :=
-repeat' (X : _) (x : _) (count : _) : list X :=
-```
-
-
-## Implicit Arguments
-
-Using `Arguments` directives to tell if an argument need to be implicit (i.e. omitted and always to infer) or not.
-
-> Implicitly convert to `_` (synthesis) by frontend.
-
-```coq
-Arguments nil {X}.
-Arguments cons {X} _ _. (* data constructor usually don't specify the name *)
-Arguments repeat {X} x count. (* fun definition usually do *)
-```
-
-The even more convenient syntax is that we can declare them right in our function definition.
-Just _surrounding them with curly braces_.
-
-```coq
-Fixpoint repeat''' {X : Type} (x : X) (count : nat) : list X :=
- match count with
- | 0 ⇒ nil
- | S count' ⇒ cons x (repeat''' x count')
- end.
-```
-
-
-## Implicit Arguments Pitfalls on `Inductive`
-
-```coq
-Inductive list' {X:Type} : Type :=
- | nil'
- | cons' (x : X) (l : list').
-```
-
-Doing this will make `X` implicit for even `list'`, the type constructor itself...
-
-
-## Other Polymorphic List functions
-
-No difference but add implicit type argument `{X : Type}`.
-
-
-## Supplying Type Arguments Explicitly
-
-```coq
-Fail Definition mynil := nil.
-
-Definition mynil : list nat := nil.
-
-Check @nil. (* ===> @nil : forall X : Type, list X *)
-Definition mynil' := @nil nat.
-```
-
-First thought: Existential
-Second thought: A wait to be unified Universal. (after being implicit and require inference)
-
-```coq
-Check nil.
-
-nil :
- list ?X
-where ?X : [ |- Type]
-```
-
-
-## List notation
-
-```coq
-Notation "x :: y" := (cons x y)
- (at level 60, right associativity).
-Notation "[ ]" := nil.
-Notation "[ x ; .. ; y ]" := (cons x .. (cons y []) ..).
-Notation "x ++ y" := (app x y)
- (at level 60, right associativity).
-```
-
-Same with before thanks to the implicit argument
-
-
-
-## Slide Q&A 2
-
-
-1. we use `;` not `,`!!
-2. `list nat`
-3. ill-typed
-4. ill-typed
-5. `list (list nat)`
-6. `list (list nat)` (tricky in first look)
-7. `list bool`
-8. ill-typed
-9. ill-typed
-
-
-
-## Poly Pair
-
-```coq
-Inductive prod (X Y : Type) : Type :=
-| pair (x : X) (y : Y).
-Arguments pair {X} {Y} _ _. (* omit two type var **)
-
-Notation "( x , y )" := (pair x y).
-Notation "X * Y" := (prod X Y) : type_scope. (* only be used when parsing type, avoids clashing with multiplication *)
-```
-
-Be careful of `(X,Y)` and `X*Y`. Coq pick the ML way, not haskell way.
-
-
-
-## `Combine` or `Zip`
-
-```coq
-Fixpoint combine {X Y : Type} (lx : list X) (ly : list Y)
- : list (X*Y) :=
- match lx, ly with
- | [], _ ⇒ []
- | _, [] ⇒ []
- | x :: tx, y :: ty ⇒ (x, y) :: (combine tx ty)
- end.
-```
-
-Guess type?
-
-```coq
-Check @combine.
-@combine
- : forall X Y : Type,
- list X -> list Y -> list (X * Y)
-
-(* A special form of `forall`? *)
-Check combine.
-combine
- : list ?X -> list ?Y -> list (?X * ?Y)
-where
-?X : [ |- Type]
-?Y : [ |- Type]
-```
-
-
-## Poly Option
-
-```coq
-Inductive option (X:Type) : Type :=
- | Some (x : X)
- | None.
-
-Arguments Some {X} _.
-Arguments None {X}.
-
-
-(* find nth element if exist, None otherwise *)
-Fixpoint nth_error {X : Type} (l : list X) (n : nat) : option X :=
- match l with
- | [] ⇒ None
- | a :: l' ⇒ if n =? O then Some a else nth_error l' (pred n)
- end.
-```
-
-
-## Function as data
-
-_Functions as first-class citizens_
-
-
-## Higher-Order Functions
-
-```coq
-Definition doit3times {X:Type} (f:X→X) (n:X) : X :=
- f (f (f n)).
-
-Check @doit3times.
-(* ===> doit3times : forall X : Type, (X -> X) -> X -> X *)
-```
-
-
-## Filter (taking a _predicate_ on `X`)
-
-_collection-oriented_ programming style - my first time seeing this, any comments?
-
-```coq
-Fixpoint filter {X:Type} (test: X→bool) (l:list X)
- : (list X) :=
- match l with
- | [] ⇒ []
- | h :: t ⇒ if test h then h :: (filter test t)
- else filter test t
- end.
-
-Example test_filter1: filter evenb [1;2;3;4] = [2;4].
-Proof. reflexivity. Qed.
-```
-
-
-## Anonymous Functions
-
-> It is arguably a little sad, in the example just above, to be forced to define the function length_is_1 and give it a name just to be able to pass it as an argument to filter
-
-```coq
-Example test_anon_fun':
- doit3times (fun n ⇒ n * n) 2 = 256.
-Proof. reflexivity. Qed.
-```
-
-Syntax: hybrid of OCaml `fun n -> n` and SML `fn n => n`.
-and support multi-arguments (curried)
-
-```coq
-Compute ((fun x y => x + y) 3 5).
-```
-
-
-## Map
-
-Should be familar.
-
-```coq
-Fixpoint map {X Y: Type} (f:X→Y) (l:list X) : (list Y) :=
- match l with
- | [] ⇒ []
- | h :: t ⇒ (f h) :: (map f t)
- end.
-```
-
-```coq
-Check @map
-
-@map : forall X Y : Type, (X -> Y) -> list X -> list Y
-```
-
-
-## Slide Q&A 3
-
-1. as above
-
-
-
-## `option` map
-
-```coq
-Definition option_map {X Y : Type} (f : X → Y) (xo : option X) : option Y :=
- match xo with
- | None ⇒ None
- | Some x ⇒ Some (f x)
- end.
-```
-
-Functor Map (`fmap`) !
-
-
-## Fold (Reduce)
-
-```coq
-Fixpoint fold {X Y: Type} (f: X→Y→Y) (l: list X) (b: Y) : Y :=
- match l with
- | nil ⇒ b
- | h :: t ⇒ f h (fold f t b)
- end.
-```
-
-Fold Right (`foldr`). Argument order same with OCaml, different with Haskell.
-
-```coq
-Check @fold
-
-@fold
- : forall X Y : Type,
- (X -> Y -> Y) -> list X -> Y -> Y
-```
-
-## Slide Q&A 4
-
-1. as above (type can be simply readed out)
-2. `list nat -> nat -> nat`
-3. 10
-
-
-## Functions That Construct Functions
-
-Should be familar.
-Use of _closure_.
-
-```coq
-definition constfun {X: Type} (x: X) : nat→X :=
- fun (k:nat) ⇒ x.
-
-Definition ftrue := constfun true.
-Example constfun_example1 : ftrue 0 = true.
-
-Example constfun_example2 : (constfun 5) 99 = 5.
-```
-
-**Curried** and **partial application**
-
-```coq
-Check plus.
-(* ==> nat -> nat -> nat *)
-
-Check plus 3.
-(* ==> nat -> nat *)
-```
-
-
-## Universe Inconsistency
-
-I encounter this problem when doing church numeral exercise.
-
-```coq
-Definition plus (n m : cnat) : cnat := n cnat succ m.
-```
-
-will result in `universe inconsistency` error.
-
-
-```coq
-Set Printing Universes. (* giving more error msg *)
-
-In environment
-n : cnat
-m : cnat
-The term "cnat" has type "Type@{Top.168+1}" while it is expected to have type "Type@{Top.168}"
-(universe inconsistency: Cannot enforce Top.168 < Top.168 because Top.168 = Top.168).
-```
-
-
-### What's happening?
-
-> Yes, you can define: `Definition plus (n m : cnat) : cnat := n cnat succ m.` in System F. However, in Coq's richer logic, you need to be a little more careful about allowing types to be instantiated at their own types, else you run into issue of inconsistency. Essentially, there is a stratification of types (by "universes") that says that one universe cannot contain a "bigger" universe. Often, things are polymorphic in their universe (i.e., work in all universes), you run into this where you cannot instantiate the "forall X, ..." that is the definition of cnat by cnat itself.
-> -- Prof. Fluet
-
-
-###
-
-`Check Type => Type` is a bit of a lie, everytime it the `Type` is not that same, but __a bigger one__.
-
-> Formally, every Type has an index associated to it, called its _universe level_.
-
-```coq
-Set Printing Universes. (* giving more error msg *)
-
-Check Type.
-Type@{Top.1} : Type@{Top.1+1} (* {Top.1} |= *)
-
-Check Type.
-Type@{Top.2} : Type@{Top.2+1} (* {Top.2} |= *)
-```
-
-> Thus, the correct answer for that question is that `Type_i` has type `Type_j`, for any index `j > i`. This is needed to ensure the consistency of Coq's theory: _if there were only one Type, it would be possible to show a contradiction, similarly to how one gets a contradiction in set theory if you assume that there is a set of all sets._
-> Coq generates one new index variable every time you write Type, and keeps track of internal constraints
-
-> The error message you saw means that _Coq's constraint solver_ for universe levels says that there can't be a solution to the constraint system you asked for.
-
-> The problem is that the `forall` in the definition of `nat` is quantified over `Type_i`, but Coq's logic forces `nat` to be itself of type `Type_j`, with `j > i`. On the other hand, the application `n nat` requires that `j <= i`, resulting in a non-satisfiable set of index constraints.
-
-From my understanding, the essences are:
-
-1. reasons: Allowing self-application introduces _logic contradiction (paradox)_.
-2. understanding: The `forall` is quantified over _types in the previous universe_ (the universe w/o itself).
-
-
-### From
-
-```coq
-Definition identity {A : Type} (a : A) := a.
-
-Fail Definition selfid := identity (@identity).
-```
-
-```coq
-The command has indeed failed with message:
-The term "@identity" has type "forall A : Type, A -> A"
-while it is expected to have type "?A"
-(unable to find a well-typed instantiation for "?A": cannot ensure that
-"Type@{Top.1+1}" is a subtype of "Type@{Top.1}").
-```
-
-The link also introduce some advanced/experimental way to do _polymorphic universe_
-
-
-
-## Polymorphic Church Numerals w/o self-applying itself
-
-> References:
-
-### Definition
-
-Untyped doesn't need to declare type...
-STLC doesn't have enough expressive power to represent church encoding
-System F definition:
-
-```coq
-Definition cnat := forall X : Type, (X -> X) -> X -> X.
-```
-
-### `succ`
-
-```haskell
-succ = \n s z -> s (n s z)
-```
-
-```coq
-Definition succ (n : cnat) : cnat :=
- fun X s z => s (n X s z).
-```
-
-### `plus`
-
-```haskell
-plus = \m n -> m scc n
-plus = \m n s z -> m s (n s z)
-```
-
-```coq
-Definition plus (n m : cnat) : cnat :=
- n cnat succ m. (* System F *)
- fun X s z => n X s (m X s z). (* Coq *)
-```
-
-```f(TAPL)
-plus =
- lambda m:CNat.
- lambda n:CNat. (
- lambda X.
- lambda s:X->X.
- lambda z:X.
- m [X] s (n [X] s z)
- ) as CNat;
-
-plus =
- lambda m:CNat.
- lambda n:CNat.
- m [CNat] succ' n;
-```
-
-### `mult`
-
-```haskell
-mult = \m n -> m (plus n) n0
-```
-
-```coq
-Definition mult (n m : cnat) : cnat :=
- n cnat (plus m) zero. (* SystemF *)
- fun X s z => (m X (n X s) z). (* Coq *)
-```
-
-```f(TAPL)
-mult =
- lambda m:CNat.
- lambda n:CNat.
- m [CNat] (plus n) c0; /* partial app `plus` */
-```
-
-
-### `exp`
-
-```haskell
-pow = \m n -> m (mult n) n1
-exp = \m n -> n m
-```
-
-```coq
-Definition exp (n m : cnat) : cnat :=
- n cnat (mult m) one (* SystemF *)
- fun X => m (X -> X) (n X). (* Coq *)
-```
-
diff --git a/_posts/read_sf_lf/2019-01-05-sf-lf-05-tactics.md b/_posts/read_sf_lf/2019-01-05-sf-lf-05-tactics.md
deleted file mode 100644
index d77a8921e27..00000000000
--- a/_posts/read_sf_lf/2019-01-05-sf-lf-05-tactics.md
+++ /dev/null
@@ -1,351 +0,0 @@
----
-title: "「SF-LC」5 Tactics"
-subtitle: "Logical Foundations - More Basic Tactics"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - LF (逻辑基础)
- - SF (软件基础)
- - Coq
- - 笔记
----
-
-## `apply`
-
-- _exactly_ the same as some hypothesis
-- can be used to __finish__ a proof (shorter than `rewrite` then `reflexivity`)
-
-It also works with _conditional_ hypotheses:
-
-```coq
-n, m, o, p : nat
-eq1 : n = m
-eq2 : forall q r : nat, q = r -> [q; o] = [r; p]
-============================
-[n; o] = [m; p]
-
-apply eq2.
-n = m
-```
-
-It works by working backwards.
-It will try to _pattern match_ the universally quantified `q r`. (i.e. universal var)
-We match the _conclusion_ and generates the _hypothesis_ as a _subgoal_.
-
-```coq
-Theorem trans_eq : forall (X:Type) (n m o : X), n = m -> m = o -> n = o.
-
-Example trans_eq_example' : forall (a b c d e f : nat),
- [a;b] = [c;d] -> [c;d] = [e;f] -> [a;b] = [e;f].
-Proof.
- intros a b c d e f eq1 eq2.
- apply trans_eq. (* Error: Unable to find an instance for the variable m. *)
-```
-
-The _unification algo_ won't happy since:
-- it can find instance for `n = o` from `[a;b] = [e;f]` (matching both conclusion)
-- but what should be `m`? It could be anything as long as `n = m` and `m = o` holds.
-
-So we need to tell Coq explicitly which value should be picked for `m`:
-
-```coq
-apply trans_eq with (m:=[c;d]). (* <- supplying extra info, [m:=] can be ommited *)
-```
-
-> Prof Mtf: As a PL person, you should feel this is a little bit awkward since now function argument name must be remembered. (but it's just local and should be able to do any alpha-conversion).
-> named argument is more like a record.
-
-In Coq Intensive 2 (2018), someone proposed the below which works:
-
-```coq
-Example trans_eq_example'' : forall (a b c d e f : nat),
- [a;b] = [c;d] -> [c;d] = [e;f] -> [a;b] = [e;f].
-Proof.
- intros a b c d e f.
- apply trans_eq. (* Coq was able to match three at all at this time...hmm *)
-Qed.
-
-```
-
-
-## `injection` and `discrinimate`
-
-### Side Note on Terminologys of Function
-
- relation
-
-> function is defined as _a special kind of binary relation_.
-> it requires `xRy1 ∧ xRy2 → y1 = y2` called "functional" or "univalent", "right-unique", or "deterministic"
-> and also `∀x ∈ X, ∃y ∈ Y s.t. xRy` called "left-total"
-
- x ↦ f(x)
- input ↦ output
- argument ↦ value
-
- X ↦ Y
- domain 域 ↦ co-domain 陪域
- what can go into ↦ what possibly come out
-
- A ⊆ X ↦ f(A) = {f(x) | x ∈ A}
- ↦ image
- ↦ what actually come out
-
- f⁻¹(B)={x ∈ X|f(x) ∈ B} ↦ B ⊆ Y
- preimage ↦
-
- when A = X ↦ Y
- ↦ range
- image of domain
-
-Besides subset, the notation of `image` and `pre-image` can be applied to _element_ as well.
-However, by definition:
-- the image of an element `x` of domain ↦ always single element of codomain (singleton set)
-- the preimage of an element `y` of codomain ↦ may be empty, or one, or many!
- - `<= 1 ↦ 1` : injective (left-unique)
- - `>= 1 ↦ 1` : surjective (right-total)
- - ` 1 ↦ 1` : bijective
-
-Noted that the definition of "function" doesn't require "right-total"ity) until we have `surjective`.
-
-graph = `[(x, f(x))]`, these points form a "curve", 真的是图像
-
-### Total vs Partial
-
-For math, we seldon use partial function since we can simply "define a perfect domain for that".
-But in Type Theory, Category Theory, we usually consider the _domain_ `X` and the _domain of definition_ `X'`.
-
-Besides, `f(x)` can be `undefined`. (not "left-total", might not have "right")
-
-### Conclusion - the road from Relation to Function
-
-
- bi-relation
- | + right-unique
- partial function
- | + left-total
- (total) function
- + left-unique / \ + right-total
- injection surjection
- \ /
- bijection
-
-
-
-### Original notes on [Injective, surjective, Bijective](https://en.wikipedia.org/wiki/Function)
-
-All talk about the propeties of _preimage_!
-
-- Injective: `<= 1 ↦ 1` or `0, 1 ↦ 1` (distinctness)
-- Surjective: `>= 1 ↦ 1` (at least 1 in the domain)
-- Bijective: ` 1 ↦ 1` (intersection of Inj and Surj, so only `1` preimage, _one-to-one correspondence_)
-
-
-### _injectivitiy_ and _disjointness_, or `inversion`.
-
-Recall the definition of `nat`:
-
-```coq
-Inductive nat : Type :=
-| O : nat
-| S : nat → nat.
-```
-
-Besides there are two forms of `nat` (for `destruct` and `induction`), there are more facts:
-
-1. The constructor `S` is _injective_ (distinct), i.e `S n = S m -> n = m`.
-2. The constructors `O` and `S` are _disjoint_, i.e. `forall n, O != S n `.
-
-
-### `injection`
-
-- can be used to prove the _preimages_ are the same.
-- `injection` leave things in conclusion rather than hypo. with `as` would be in hypo.
-
-
-### `disjoint`
-
-- _principle of explosion_ (a logical principle)
- - asserts a contraditory hypothesis entails anything. (even false things)
- - _vacously true_
-- `false = true` is contraditory because they are distinct constructors.
-
-### `inversion`
-
-- the big hammer: inversion of the definition.
-- combining `injection` and `disjoint` and even some more `rewrite`.
- - IMH, which one to use depends on _semantics_
-
-from Coq Intensive (not sure why it's not the case in book version).
-
-```coq
-Theorem S_injective_inv : forall (n m : nat),
- S n = S m -> n = m.
-Proof.
- intros n m H. inversion H. reflexivity. Qed.
-
-
-Theorem inversion_ex1 : forall (n m : nat),
- [n] = [m] -> n = m.
-Proof.
- intros n m H. inversion H. reflexivity. Qed.
-```
-
-> Side question: could Coq derive equality function for inductive type?
-> A: nope. Equality for some inductive types are _undecidable_.
-
-### Converse of injectivity
-
-```coq
-Theorem f_equal : ∀(A B : Type) (f: A → B) (x y: A),
- x = y → f x = f y.
-Proof.
- intros A B f x y eq.
- rewrite eq. reflexivity. Qed.
-```
-
-
-### Slide Q&A 1
-
-1. The tactic fails because tho `negb` is injective but `injection` only workks on constructors.
-
-## Using Tactics in Hypotheses
-
-### Reasoning Backwards and Reasoning Forward (from Coq Intensive 2)
-
-Style of reasoning
-
-- Backwards: start with _goal_, applying tactics `simpl/destruct/induction`, generate _subgoals_, until proved.
- - iteratively reasons about what would imply the goal, until premises or previously proven theorems are reached.
-- Forwards: start with _hypo_, applying tactics, iteratively draws conclusions, until the goal is reached.
-
-Backwards reasoning is dominated stratgy of theroem prover (and execution of prolog). But not natural in informal proof.
-
-> True forward reasoning derives fact, but in Coq it's like hypo deriving hypo, very imperative.
-
-### `in`
-
-> most tactics also have a variant that performs a similar operation on a statement in the context.
-
-```coq
-simpl in H.
-simpl in *. (* in all hypo and goal *)
-
-symmetry in H.
-apply L in H.
-```
-
-### `apply`ing in hypothesis and in conclusion
-
-`apply`ing in hypo is very different with `apply`ing in conclusion.
-
-> it's not we unify the ultimate conclusion and generate premises as new goal, but trying to find a hypothesis to match and left the residual conclusion as new hypothesis.
-
-```coq
-Theorem silly3'' : forall (n : nat),
- (true = (n =? 5) -> true = ((S (S n)) =? 7)) ->
- true = (n =? 5) ->
- true = ((S (S n)) =? 7).
-Proof.
- intros n eq H.
- apply eq in H. (* or *) apply eq. (* would be different *)
- apply H. Qed.
-```
-
-Also if we add one more premises `true = true ->`,
-the subgoal generated by `apply` would be in reversed order:
-
-```coq
-Theorem silly3'' : forall (n : nat),
- (true = true -> true = (n =? 5) -> true = ((S (S n)) =? 7)) ->
- true = (n =? 5) ->
- true = ((S (S n)) =? 7).
-Proof.
-```
-> Again: "proof engineering": proof can be done in so many different ways and in different orders.
-
-
-## Varying the Induction Hypothesis
-
-Sometimes it's important to control the exact form of the induction hypothesis!!
-
-Considering:
-
-```coq
-Theorem double_injective: ∀n m,
- double n = double m → n = m.
-```
-
-if we begin with `intros n m. induction n.`
-then we get stuck in the inductive case of `n`, where the induction hypothesis `IHn'` generated is:
-
-```coq
-IHn' : double n' = double m -> n' = m
-IHn' : double n' = double (S m') -> n' = S m' (* m = S m' *)
-```
-
-This is not what we want!!
-
-To prove `double_injective`, we hope `IHn'` can give us `double n' = double m' -> n' = m'` (i.e. the `P(n-1)` case).
-
-The problem is `intros` implies _for these particular `n` and `m`_. (not more `forall` but _const_). And when we `intros n m. induction n`, we are trying to prove a statement involving _every_ n but just a _single_ m...
-
-
-### _How to keep `m` generic (universal)?_
-
-By either `induction n` before `intros m` or using `generalize dependent m`, we can have:
-
-```coq
-IHn' : forall m : nat, double n' = double m -> n' = m
-```
-where the `m` here is still universally quantified, so we can instaniate `m` with `m'` by `apply`ing it with `double n' = double m'` to yield `n' = m'` or vice versa. (recall conditional statements can be `apply`ed in 2 ways.)
-
-
-### Notes on `generalize dependent`
-
-Usually used when the argument order is conflict with instantiate (`intros`) order.
-
-> ? _reflection_: turing a computational result into a propositional result
-
-
-
-## Unfolding Definitions.
-
-> tactics like `simpl`, `reflexivity`, and `apply` will often unfold the definitions of functions automatically.
-> However, this automatic unfolding is somewhat _conservative_.
-
-`simpl.` only do unfolding when it can furthur simplify after unfolding. But sometimes you might want to explicitly `unfold` then do furthur works on that.
-
-
-## Using `destruct` on Compound Expressions
-
-destruct the whole arbitrary expression.
-
-`destruct` by default throw away the whole expression after it, which might leave you into a stuck state.
-So explicitly saying `eqn:Name` would help with that!
-
-
-## Micro Sermon - Mindless proof-hacking
-
-From Coq Intensive...
-
-- a lot of fun
-- ...w/o thinking at all
-- terrible temptation
-- you shouldn't always resist...
-
-But after 5 mins...you should step back and try to think
-
-A typical coq user
-- sitting and does not have their brain engaged all the time...
-- at some point...(get stuck)
- - oh I have to reengage brain..
-
-what is this really saying...
-
-One way: good old paper and pencil
-
-5 mins is good time!
-
-
diff --git a/_posts/read_sf_lf/2019-01-06-sf-lf-06-logic.md b/_posts/read_sf_lf/2019-01-06-sf-lf-06-logic.md
deleted file mode 100644
index 32a7355d099..00000000000
--- a/_posts/read_sf_lf/2019-01-06-sf-lf-06-logic.md
+++ /dev/null
@@ -1,587 +0,0 @@
----
-title: "「SF-LC」6 Logic"
-subtitle: "Logical Foundations - Logic in Coq"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - LF (逻辑基础)
- - SF (软件基础)
- - Coq
- - 笔记
----
-
-We have seen...
-
-* _propositions_: factual claims
- - equality propositions (`e1 = e2`)
- - implications (`P → Q`)
- - quantified propositions (`∀ x, P`)
-* _proofs_: ways of presenting __evidence__ for the truth of a proposition
-
-
-`Prop` type
------------
-
-```coq
-Check 3 = 3. (* ===> Prop. A provable prop *)
-Check 3 = 4. (* ===> Prop. A unprovable prop *)
-```
-
-`Prop` is _first-class entity_ we can
-- name it
-- _parametrized_!
-
-```coq
-Definition is_three (n : nat) : Prop :=
- n = 3.
-
-Check is_three. (* ===> nat -> Prop *)
-```
-
-### Properties
-
-> In Coq, _functions that return propositions_ are said to define _properties_ of their arguments.
-
-```coq
-Definition injective {A B} (f : A → B) :=
- ∀x y : A, f x = f y → x = y.
-Lemma succ_inj : injective S. (* can be read off as "injectivity is a property of S" *)
-Proof.
- intros n m H. injection H as H1. apply H1. Qed.
-```
-
-The equality operator `=` is also a function that returns a `Prop`. (property: _equality_)
-
-```coq
-Check @eq. (* ===> forall A : Type, A -> A -> Prop *)
-```
-
-Theroems are types, and proofs are existentials.
-
-
-Slide Q&A - 1.
---------------
-
-1. `Prop`
-2. `Prop`
-3. `Prop`
-4. Not typeable
-5. `nat -> nat`
-6. `nat -> Prop`
-7. (3)
-
-
-think that Big Lambda (the type abstraction) works at type level, accepts type var, substitute and reture a type.
-`forall` in Coq is same (the concrete syntax) and only typecheck with `Type` or its subtype `Set` & `Prop`.
-
-```coq
-Check (∀n:nat, S (pred n)). (* not typeable *)
-
-Definition foo : (forall n:nat, bool) (* foo: nat -> bool *)
- := fun x => true.
-```
-
-
-Logical Connectives
--------------------
-
-> noticed that connectives symbols are "unicodize" in book and spacemacs.
-
-
-### Conjuction (logical and)
-
-`and` is just binary `Prop -> Prop -> Prop` and associative.
-
-```coq
-Print "/\".
-Inductive and (A B : Prop) : Prop := conj : A -> B -> A /\ B
-Check and. (* ===> and : Prop -> Prop -> Prop *)
-```
-
-#### and introduction
-
-```coq
-Lemma and_intro : forall A B : Prop, A -> B -> A /\ B.
-Proof.
- intros A B HA HB. split.
- - apply HA.
- - apply HB.
-Qed.
-```
-> To prove a conjunction,
-> - use the `split` tactic. It will generate two subgoals,
-> - or use `apply and_intro.`, which match the conclusion and give its two premises as your subgoals.
-
-
-#### and elimination
-
-if we already have a proof of `and`, `destruct` can give us both.
-
-```coq
-Lemma and_example2' :
- ∀n m : nat, n = 0 ∧ m = 0 → n + m = 0.
-Proof.
- intros n m [Hn Hm]. (* = intro H. destruct H. *)
- rewrite Hn. rewrite Hm. reflexivity. Qed. (* you could use only one *)
-```
-
-Instead of packing into conjunction `∀n m : nat, n = 0 ∧ m = 0 → n + m = 0.`
-why not two separate premises? `∀n m : nat, n = 0 -> m = 0 → n + m = 0.`
-Both are fine in this case but conjunction are useful as intermediate step etc.
-
-> Coq Intensive Q: why `destruct` can work on `and`? is `and` inductively defined?
-> A: Yes.
-
-
-
-### Disjunction (locial or)
-
-#### or elimination
-
-We need do case analysis (either `P` or `Q` should be able to prove the theroem separately!)
-
-```coq
-Lemma or_example :
- forall n m : nat, n = 0 \/ m = 0 -> n * m = 0.
-Proof.
- (* This pattern implicitly does case analysis on [n = 0 \/ m = 0] *)
- intros n m [Hn | Hm]. (* = intro H. destruct H. *)
- - (* Here, [n = 0] *) rewrite Hn. reflexivity.
- - (* Here, [m = 0] *) rewrite Hm. rewrite <- mult_n_O. reflexivity.
-Qed.
-```
-
-#### or introduction
-
-When trying to establish (intro into conclusion) an `or`, using `left` or `right` to pick one side to prove is sufficient.
-
-```coq
-Lemma or_intro : forall A B : Prop, A -> A \/ B.
-Proof.
- intros A B HA.
- left. (* tactics *)
- apply HA.
-Qed.
-```
-
-
-
-### Falsehood and negation
-
-#### False?
-
-Recall the _princple of explosion_: it asserts that, if we assume a _contradiction_, then any other proposition can be derived.
-we could define `¬ P` ("not P") as `∀ Q, P → Q.`.
-
-> Coq actually makes a slightly different (but equivalent) choice, defining `¬ P as P → False`, where `False` is a specific *contradictory proposition* defined in the standard library.
-
-```coq
-Definition not (P:Prop) := P → False.
-Notation "¬x" := (not x) : type_scope.
-```
-
-Prove the _princple of explosion_:
-
-```coq
-Theorem ex_falso_quodlibet : forall (P:Prop),
- False -> P.
-Proof.
- intros P contra.
- destruct contra. Qed. (* 0 cases to prove since ⊥ is not provable. [inversion] also works *)
-```
-
-
-#### Inequality
-
-```coq
-Notation "x <> y" := (~(x = y)).
-```
-
-Same as SML and OCaml (for structural equality, OCaml uses `!=` for physical equality.)
-
-
-#### Proving of negation (or how to prove `¬P`)
-
-thinking about as `unfold not`, i.e. `P -> False`.
-so you have an assumptions `P` that could be `intros HP.` and the residual goal would be simply `False`.
-which is usually proved by some kind of contradiction in hypotheses with tactics `discriminate.` or `contradiction.`
-
-```coq
-Theorem contradiction_implies_anything : forall P Q : Prop,
- (P /\ ~P) -> Q.
-Proof.
- intros P Q [HP HNA]. (* we could [contradiction.] to end the proof here`*)
- unfold not in HNA. apply HNA in HP. (* HP : False, HNA : P -> False ⊢ HP: False *)
- destruct HP. Qed. (* destruct False. *)
-```
-
-#### Tactic `exfalso.`
-
-> If you are trying to prove a goal that is nonsensical (e.g., the goal state is `false = true`), apply `ex_falso_quodlibet` to change the goal to `False`. This makes it easier to use assumptions of the form `¬P` that may be available in the context — in particular, assumptions of the form `x≠y`.
-
-> Since reasoning with `ex_falso_quodlibet` is quite common, Coq provides a built-in tactic, `exfalso`, for applying it.
-
-
-
-## Slide Q&A - 2
-
-> ?`unfold` is implicit
-
-1. only `destruct` (if we consider `intros` destruct is also `destruct`.), ?`unfold`
-2. none (?`unfold`)
-3. `left.`
-4. `destruct`, `unfold`, `left` and `right`
-5. `discrinminate` (or `inversion`)
-
-
-
-
-### Truth
-
-```coq
-Lemma True_is_true : True.
-Proof. apply I. Qed.
-```
-
-`I : True` is a predefined Prop...
-
-
-
-### Logical Equivalence
-
-_if and only if_ is just the conjunction of two implications. (so we need `split` to get 2 subgoals)
-
-```coq
-Definition iff (P Q : Prop) := (P → Q) ∧ (Q → P).
-Notation "P ↔ Q" := (iff P Q)
- (at level 95, no associativity) : type_scope.
-```
-
-> `rewrite` and `reflexivity` can be used with iff statements, not just equalities.
-
-
-
-
-### Existential Quantification
-
-To prove a statement of the form `∃x, P`, we must show that `P` holds for some specific choice of value for `x`,
-known as the __witness__ of the existential.
-
-So we explicitly tell Coq which witness `t` we have in mind by invoking `exists t`.
-then all occurences of that "type variable" would be replaced.
-
-#### Intro
-
-```coq
-Lemma four_is_even : exists n : nat, 4 = n + n.
-Proof.
- exists 2. reflexivity.
-Qed.
-```
-
-#### Elim
-
-Below is an interesting question...by intros and destruct we can have equation `n = 4 + m` in hypotheses.
-
-```coq
-Theorem exists_example_2 : forall n,
- (exists m, n = 4 + m) ->
- (exists o, n = 2 + o).
-Proof.
- intros n [m Hm]. (* note implicit [destruct] here *)
- exists (2 + m).
- apply Hm. Qed.
-```
-
-
-
-## Programming with Propositions
-
-Considering writing a common recursive `is_in` for polymorphic lists.
-(Though we dont have a polymorphic `=?` (`eqb`) defined yet)
-
-```coq
-Fixpoint is_in {A : Type} (x : A) (l : list A) : bool :=
- match l with
- | [] => false
- | x' :: l' => if (x' =? x) then true else is_in x l'
- end.
-```
-
-Similarly, we can write this function but with disjunction and return a `Prop`!
-_so we can write function to generate/create statements/propositions!_ (thx for the idea Prop is first-class)
-
-```coq
-Fixpoint In {A : Type} (x : A) (l : list A) : Prop :=
- match l with
- | [] => False
- | x' :: l' => x' = x ∨ In x l'
- end.
-```
-
-The whole thing I understood as a _type operator_ (function in type level) and it's _recursive_!
-
-Coq dare to do that becuz its _total_, which is guarded by its _termination checker_.
-un-total PL, if having this, would make its type system _Turing Complete_ (thus having _Halting Problem_).
-(Recursive Type like ADT/GADT in ML/Haskell is a limited form of recursion allowing no arbitray recursion.)
-
-
-
-### In_map
-
-I took this one since it's like a formal version of _Property-based Tests_!.
-
-```coq
-Lemma In_map :
- forall (A B : Type) (f : A -> B) (l : list A) (x : A),
- In x l ->
- In (f x) (map f l).
-Proof.
- intros A B f l x.
- induction l as [|x' l' IHl'].
- - (* l = nil, contradiction *)
- simpl. intros [].
- - (* l = x' :: l' *)
- simpl. intros [H | H]. (* evaluating [In] gives us 2 cases: *)
- + rewrite H. left. reflexivity. (* in head of l *)
- + right. apply IHl'. apply H. (* in tail of l*)
-Qed.
-```
-
-> Q & A:
-> 1. `eq` is just another inductively defined and doesn't have any computational content. (satisfication)
-> 2. Why use `Prop` instead of `bool`? See _reflection_ below.
-
-
-### Drawbacks
-
-> In particular, it is subject to Coq's usual restrictions regarding the definition of recursive functions,
-> e.g., the requirement that they be "obviously terminating."
-
-> In the next chapter, we will see how to define propositions _inductively_,
-> a different technique with its own set of strengths and limitations.
-
-
-
-## Applying Theorems to Arguments.
-
-### `Check some_theorem` print the statement!
-
-```coq
-Check plus_comm.
-(* ===> forall n m : nat, n + m = m + n *)
-```
-
-> Coq prints the _statement_ of the `plus_comm` theorem in the same way that it prints the _type_ of any term that we ask it to Check. Why?
-
-Hmm...I just noticed that!!
-But I should notice because __Propositions are Types! (and terms are proof)__
-
-
-### Proof Object
-
-> _proofs_ as first-class objects.
-
-After `Qed.`, Coq defined they as _Proof Object_ and the _type of this obj_ is the statement of the theorem.
-
-> Provable: some type is inhabited by some thing (having terms).
-
-So I guess when we apply theorems, Coq implicitly use the type of the Proof Object. (it's already type abstraction)
-...we will get to there later at ProofObject chapter.
-
-
-### Apply theorem as function
-
-> `rewrite` select variables greedily by default
-
-```coq
-Lemma plus_comm3_take3 :
- ∀x y z, x + (y + z) = (z + y) + x.
-Proof.
- intros x y z.
- rewrite plus_comm.
- rewrite (plus_comm y z). (* we can explicitly provide type var! *)
- reflexivity.
-Qed.
-```
-
-`x y z` were some type var and _instantiated to values_ by `intros`, e.g. `x, y, z:nat`
-but we can explicilty pass in to `plus_comm`, which is a forall type abstraction! (`Δ n m. (eq (n + m) (m + n))`)
-
-> there must be something there in Proof Object so we can apply _values_ to a _type-level function_
-
-
-
-
-## Coq vs. Set Theory
-
-Coq's logical core, _the Calculus of Inductive Constructions_, is a _metalanguage for math_, but differs from other foundations of math e.g. ZFC Set Theory
-
-### Functional Extensionality
-
-```coq
-(∀x, f x = g x) → f = g
-
-∃f g, (∀x, f x = g x) → f = g
-
-∃f g, (∀x, f x = g x) ∧ f != g (* negation, consistent but not interesting... *)
-```
-
-> In common math practice, two functions `f` and `g` are considered equal if they produce the same outputs.
-> This is known as the principle of _functional extensionality_.
-
-> Informally speaking, an "extensional property" is one that pertains to an object's observable behavior.
->
-> ?
-
-This is not built-in Coq, but we can add them as Axioms.
-Why not add everything?
-> 1. One or multiple axioms combined might render _inconsistency_.
-> 2. Code extraction might be problematic
-
-> Fortunately, it is known that adding functional extensionality, in particular, is consistent.
-> [consistency](https://en.wikipedia.org/wiki/Consistency):
- a consistent theory is one that does not contain a contradiction.
-
-### Adding Axioms
-
-```coq
-Axiom functional_extensionality : forall {X Y: Type}
- {f g : X -> Y},
- (forall (x:X), f x = g x) -> f = g.
-```
-
-It's like `Admitted.` but alerts we're not going to fill in later.
-
-
-### Exercise - Proving Reverse with `app` and with `cons` are fn-exensionally equivalent.
-
-```coq
-Fixpoint rev_append {X} (l1 l2 : list X) : list X :=
- match l1 with
- | [] => l2
- | x :: l1' => rev_append l1' (x :: l2)
- end.
-
-Definition tr_rev {X} (l : list X) : list X :=
- rev_append l [].
-```
-
-BTW, this version is `tail recursive` becuz the recursive call is the last operation needs to performed.
-(In `rev` i.e. `rev t ++ [h]`, recursive call is a argument of function `++` and we are CBV.)
-
-```coq
-Lemma tr_rev_correct : forall X, @tr_rev X = @rev X.
-```
-
-
-
-### Propositions and Booleans
-
-> We've seen two different ways of expressing logical claims in Coq:
-> 1. with booleans (of type `bool`), ; computational way
-> 2. with propositions (of type `Prop`). ; logical way
-
-There're two ways to define 42 is even:
-
-```coq
-Example even_42_bool : evenb 42 = true.
-Example even_42_prop : ∃k, 42 = double k.
-```
-
-We wanna show there are _interchangable_.
-
-```coq
-Theorem even_bool_prop : ∀n,
- evenb n = true ↔ ∃k, n = double k.
-```
-
-> In view of this theorem, we say that the
-> boolean computation `evenb n` _reflects_ the truth of the proposition `∃ k, n = double k`.
-
-We can futhur general this to any equations representing as `bool` or `Prop`:
-
-```coq
-Theorem eqb_eq : ∀n1 n2 : nat,
- n1 =? n2 = true ↔ n1 = n2.
-```
-
-#### Notes on Computability.
-
-> However, even they are equivalent from a purely logical perspective,
-> they may not be equivalent `operationally`.
-
-```coq
-Fail Definition is_even_prime n :=
- if n = 2 then true
- else false.
-
-Error: The term "n = 2" has type "Prop" which is not a (co-)inductive type.
-```
-
-`=`, or `eq`, as any function in Coq, need to be computable and total. And we have no way to tell _whether any given proposition is true or false_. (...We can only naturally deduce things are inductively defined)
-
-> As a consequence, Prop in Coq does not have a universal case analysis operation telling whether any given proposition is true or false, since such an operation would allow us to write non-computable functions.
-
-> Although general non-computable properties cannot be phrased as boolean computations, it is worth noting that even many computable properties are easier to express using Prop than bool, since recursive function definitions are subject to significant restrictions in Coq.
-
-E.g. Verifying Regular Expr in next chapter.
-> Doing the same with `bool` would amount to writing a _full regular expression matcher_ (so we can execute the regex).
-
-
-#### Proof by Reflection!
-
-```coq
-(* Logically *)
-Example even_1000 : ∃k, 1000 = double k.
-Proof. ∃500. reflexivity. Qed.
-
-(* Computationally *)
-Example even_1000' : evenb 1000 = true.
-Proof. reflexivity. Qed.
-
-(* Prove logical version by reflecting in computational version *)
-Example even_1000'' : ∃k, 1000 = double k.
-Proof. apply even_bool_prop. reflexivity. Qed.
-```
-
-> As an extreme example, the Coq proof of the famous _4-color theorem_ uses reflection to reduce the analysis of hundreds of different cases to a boolean computation.
-
-
-
-### Classical vs. Constructive Logic
-
-
-...
-
-
-
-## Future Schedule
-
-> Proof got messier!
-> Lean on your past PLT experience
-
-
-As discussion leader
-
-- having many materials now
-- selected troublesome and interesting ones
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/_posts/read_sf_lf/2019-01-07-sf-lf-07-indprop.md b/_posts/read_sf_lf/2019-01-07-sf-lf-07-indprop.md
deleted file mode 100644
index 8d37b787015..00000000000
--- a/_posts/read_sf_lf/2019-01-07-sf-lf-07-indprop.md
+++ /dev/null
@@ -1,648 +0,0 @@
----
-title: "「SF-LC」7 Ind Prop"
-subtitle: "Logical Foundations - Inductively Defined Propositions (归纳定义命题)"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - LF (逻辑基础)
- - SF (软件基础)
- - Coq
- - 笔记
----
-
-Inductively Defined Propositions
---------------------------------
-
-### The 3rd way to state Evenness...
-
-Besides:
-
-```coq
-Theorem even_bool_prop : ∀n,
- evenb n = true ↔ ∃k, n = double k.
- (*bool*) (*prop*)
-```
-
-we can write an _Inductive definition_ of the `even` property!
-
-
-### Inference rules
-
-In CS, we often uses _inference rules_
-
- ev n
- ---- ev_0 ------------ ev_SS
- ev 0 ev (S (S n))
-
-and _proof tree_ (i.e. evidence), there could be multiple premieses to make it more tree-ish.
-
- ---- ev_0
- ev 0
- ---- ev_SS
- ev 2
- ---- ev_SS
- ev 4
-
-So we can literally translate them into a GADT:
-
-
-### Inductive Definition of Evenness
-
-```coq
-Inductive even : nat → Prop :=
- | ev_0 : even 0
- | ev_SS : ∀n, even n → even (S (S n)).
-
-Check even_SS.
-(* ==> : forall n : nat, even n -> even (S (S n)) *)
-```
-
-There are two ways to understand the `even` here:
-
-
-### 1. A Property of `nat` and two theorems (Intuitively)
-
-> the thing we are defining is not a `Type`, but rather a function `nat -> Prop` — i.e., a property of numbers.
-
-we have two ways to provide an evidence to show the `nat` is `even`, either or:
-1. it's `0`, we can immediately conclude it's `even`.
-2. for any `n`, if we can provide a evidence that `n` is `even`, then `S (S n)` is `even` as well.
-
-> We can think of the definition of `even` as defining a Coq property `even : nat → Prop`, together with primitive theorems `ev_0 : even 0` and `ev_SS : ∀ n, even n → even (S (S n))`.
-
-
-### 2. An "Indexed" GADT and two constructors (Technically)
-
-> In an Inductive definition, an argument to the type constructor on the left of the colon is called a "parameter", whereas an argument on the right is called an "index". -- "Software Foundaton"
-
-Considered a "parametrized" ADT such as the polymorphic list,
-
-```coq
-Inductive list (X:Type) : Type :=
- | nil
- | cons (x : X) (l : list X).
-
-Check list. (* ===> list : Type -> Type *)
-```
-
-where we defined type con `list : Type -> Type`, by having a type var `X` in the left of the `:`.
-the `X` is called a _parameter_ and would be _parametrized i.e. substituted, globally_, in constructors.
-
-
-
-Here, we write `nat` in the right of the `:` w/o giving it a name (to refer and to substitute),
-which allows the `nat` taking different values in different constructors (as constraints).
-it's called an _index_ and will form a family of type indexed by `nat` (to type check?)
-
-
-From this perspective, there is an alternative way to write this GADT:
-
-```coq
-Inductive even : nat → Prop :=
-| ev_0 : even 0
-| ev_SS (n : nat) (H : even n) : even (S (S n)).
-```
-
-we have two ways to construct the `even` type (`Prop <: Type`), either or:
-1. `ev_0` takes no argument, so simply instantiate `even` with `nat` 0
-2. `ev_SS` takes a `nat` `n` and a `H` typed `even n`,
- - the _dependency_ between two arguments thus established!
- - as long as the _constraint on same `n`_ is fullfilled, we can build type `even` with `S (S n)`
-
-The take way is that _dependent type (Pi-type)_ allow us to constriant constructors with different values.
-
-> _indexed_ way is more general. it formed a larger type, and is only used when extra power needed.
-> every parametrized one can be represented as indexed one (it's just that index happended to be the same)
-
-
-### "Constructor Theorems"
-
-> Such "constructor theorems" have the same status as proven theorems. In particular, we can use Coq's `apply` tactic with the rule names to prove `even` for particular numbers...
-
-```coq
-Theorem ev_4 : even 4.
-Proof. apply ev_SS. apply ev_SS. apply ev_0. Qed.
-```
-
-Proof States Transition:
-
- even 4
- ------ apply ev_SS.
- even 2
- ------ apply ev_SS.
- even 0
- ------ apply ev_0.
- Qed.
-
-
-I believed what `apply` do is trying to _backward reasoning_, i.e. matching the goal and leave the "evidence" need to be proved (to conclude the goal).
-
-we can write it as normal function application syntax w/o using tactics like other Dependent-typed PL as well
-
-```coq
-Theorem ev_4' : even 4.
-Proof. apply (ev_SS 2 (ev_SS 0 ev_0)). Qed.
-```
-
-
-Using Evidence in Proofs
-------------------------
-
-> Besides _constructing evidence_ that numbers are even, we can also _reason_ about such evidence.
-
-> Introducing `even` with an `Inductive` declaration tells Coq that these two constructors are the __only__ ways to build evidence that numbers are `even`.
-
-> In other words, if someone gives us evidence `E` for the assertion `even n`, then we know that `E` must have one of two shapes
-
-> This suggests that it should be possible to analyze a hypothesis of the form `even n` much _as we do inductively defined data structures_; in particular, it should be possible to argue by __induction__ and __case analysis__ on such evidence.
-
-This starts to get familiar as what we did for many calculi, ranging from Logics to PLT.
-This is called the __Inversion property__.
-
-
-### Inversion on Evidence
-
-We can prove the inersion property by ourselves:
-
-```coq
-Theorem ev_inversion :
- ∀(n : nat), even n →
- (n = 0) ∨ (∃n', n = S (S n') ∧ even n').
-Proof.
- intros n E.
- destruct E as [ | n' E'].
- - (* E = ev_0 : even 0 *) left. reflexivity.
- - (* E = ev_SS n', E' : even (S (S n')) *) right. ∃n'. split. reflexivity. apply E'.
-Qed.
-```
-
-But Coq provide the `inversion` tactics that does more! (not always good tho, too automagical)
-
-> The inversion tactic does quite a bit of work. When applied to equalities, as a special case, it does the work of both `discriminate` and `injection`. In addition, it carries out the `intros` and `rewrite`s
-
-> Here's how inversion works in general. Suppose the name `H` refers to an assumption `P` in the current context, _where `P` has been defined by an `Inductive` declaration_. Then, for each of the constructors of `P`, `inversion H` generates a subgoal in which `H` has been replaced by the _exact, specific conditions under which this constructor could have been used to prove `P`_.
-> Some of these subgoals will be self-contradictory; inversion throws these away. The ones that are left represent the cases that must be proved to establish the original goal. For those, inversion adds all equations into the proof context that must hold of the arguments given to `P` (e.g., `S (S n') = n` in the proof of `evSS_ev`).
-(`9-proof-object.md` has a better explaination on `inversion`)
-
-`inversion` is a specific use upon `destruct` (both do case analysis on constructors), but many property need `induction`!.
-By `induction (even n)`, we have cases and subgoals splitted, and induction hypothesis as well.
-
-
-### Induction on Evidence
-
-Similar to induction on inductively defined data such as `list`:
-> To prove a property of (for any `X`) `list X` holds, we can use `induction` on `list X`.
-> To prove a property of `n` holds for all numbers for which `even n` holds, we can use `induction` on `even n`.
-
-
-#### Notes on induction
-
-_The principle of induction_ is to prove `P(n-1) -> P(n)` (多米诺) for some (well-founded partial order) set of `n`.
-
-Here, we are induction over "the set of numbers fullfilling the property `even`".
-Noticed that we r proving things over this set, meaning we already have it (i.e. a proof, or a evidence) in premises, instead of proving the `even`ness of the set.
-
-
-#### Proof by Mathematical Induction is Deductive Reasoning
-
-> "Proof by induction," despite the name, is deductive. The reason is that proof by induction does not simply involve "going from many specific cases to the general case." Instead, in order for proof by induction to work, we need a deductive proof that each specific case implies the next specific case. Mathematical induction is not philosophical induction.
-
-
-> Mathematical induction is an inference rule used in formal proofs. Proofs by mathematical induction are, in fact, examples of deductive reasoning.
-> Equivalence with the well-ordering principle: The principle of mathematical induction is usually stated as an axiom of the natural numbers; see Peano axioms. However, it can be proved from the well-ordering principle. Indeed, suppose the following:
-
-
-
-#### Also, Structual Induction is one kind of Math. Induction
-
-> 和标准的数学归纳法等价于良序原理一样,结构归纳法也等价于良序原理。
-
-> ...A _well-founded_ _partial order_ is defined on the structures...
-> ...Formally speaking, this then satisfies the premises of an _axiom of well-founded induction_...
-
-
-In terms of Well-ordering and Well-founded:
-
-> If the set of all structures of a certain kind admits a well-founded partial order,
-> then every nonempty subset must have a minimal element. (This is the definition of "well-founded".)
-> 如果某种整个结构的集容纳一个良基偏序, 那么每个非空子集一定都含有最小元素。(其实这也是良基的定义
-
-
-
-
-
-Inductive Relations
--------------------
-
-Just as a single-argument proposition defines a _property_, 性质
-a two-argument proposition defines a _relation_. 关系
-
-```coq
-Inductive le : nat → nat → Prop :=
- | le_n n : le n n
- | le_S n m (H : le n m) : le n (S m).
-
-Notation "n ≤ m" := (le n m).
-```
-
-> It says that there are two ways to _give evidence_ that one number is less than or equal to another:
-
-1. either same number
-2. or give evidence that `n ≤ m` then we can have `n ≤ m + 1`.
-
-and we can use the same tactics as we did for properties.
-
-
-
-
-## Slide Q&A - 1
-
-1. First `destruct` `even n` into 2 cases, then `discriminate` on each.
-
-Another way...
-rewriting `n=1` on `even n`. It won't compute `Prop`, but `destruct` can do some `discriminate` behind the scene.
-
-
-
-## Slide Q&A - 2
-
-`inversion` and `rewrite plus_comm` (for `n+2`)
-
-
-
-
-`destruct` vs. `inversion` vs. `induction`.
--------------------------------------------
-
-> `destruct`, `inversion`, `induction` (on general thing)... similar/specialized version of each...
-
-Trying to internalize this concept better: _When to use which?_
-
-For any inductively defined proposition (`<: Type`) in hypothesis:
-meaning from type perspective, it's already a "proper type" (`::*`)
-
-```coq
-Inductive P = C1 : P1 | C2 : A2 -> P2 | ...
-```
-
-1. `destruct` case analysis on inductive type
-
-* simply give you each cases, i.e. each constructors.
-* we can destruct on `a =? b` since `=?` is inductively defined.
-
-
-2. `induction` use induction principle
-
-* proving `P` holds for all base cases
-* proving `P(n)` holds w/ `P(n-1)` for all inductive cases
-(`destruct` stucks in this case because of no induction hypothesis gained from induction principle)
-
-
-3. `inversion` invert the conclusion and give you all cases with premises of that case.
-
-For GADT, i.e. "indexed" `Prop` (property/relation), `P` could have many shape
-`inversion` give you `Ax` for shape `P` assuming built with `Cx`
-
-`inversion` discards cases when shape `P != Px`.
-(`destruct` stucks in this case because of no equation gained from inversion lemma)
-
-
-
-
-
-
-Case Study: Regular Expressions
--------------------------------
-
-
-### Definition
-
-_Definition of RegExp in formal language can be found in FCT/CC materials_
-
-```coq
-Inductive reg_exp {T : Type} : Type :=
- | EmptySet (* ∅ *)
- | EmptyStr (* ε *)
- | Char (t : T)
- | App (r1 r2 : reg_exp) (* r1r2 *)
- | Union (r1 r2 : reg_exp) (* r1 | r2 *)
- | Star (r : reg_exp). (* r* *)
-```
-
-
-> Note that this definition is _polymorphic_.
-> We depart slightly in that _we do not require the type `T` to be finite_. (difference not significant here)
-
-> `reg_exp T` describe _strings_ with characters drawn from `T` — that is, __lists of elements of `T`__.
-
-
-### Matching
-
-The matching is somewhat similar to _Parser Combinator_ in Haskell...
-
-e.g.
-`EmptyStr` matches `[]`
-`Char x` matches `[x]`
-
-> we definied it into an `Inductive` relation (can be displayed as _inference-rule_).
-somewhat type-level computing !
-
-```coq
-Inductive exp_match {T} : list T → reg_exp → Prop :=
-| MEmpty : exp_match [] EmptyStr
-| MChar x : exp_match [x] (Char x)
-| MApp s1 re1 s2 re2
- (H1 : exp_match s1 re1)
- (H2 : exp_match s2 re2) :
- exp_match (s1 ++ s2) (App re1 re2)
-(** etc. **)
-
-Notation "s =~ re" := (exp_match s re) (at level 80). (* the Perl notation! *)
-```
-
-## Slide Q&A - 3
-
-The lack of rule for `EmptySet` ("negative rule") give us what we want as PLT
-
-
-### `Union` and `Star`.
-
-> the informal rules for `Union` and `Star` correspond to _two constructors_ each.
-
-```coq
-| MUnionL s1 re1 re2
- (H1 : exp_match s1 re1) :
- exp_match s1 (Union re1 re2)
-| MUnionR re1 s2 re2
- (H2 : exp_match s2 re2) :
- exp_match s2 (Union re1 re2)
-| MStar0 re : exp_match [] (Star re)
-| MStarApp s1 s2 re
- (H1 : exp_match s1 re)
- (H2 : exp_match s2 (Star re)) :
- exp_match (s1 ++ s2) (Star re).
-```
-
-Thinking about their _NFA_: they both have non-deterministic branches!
-The recursive occurrences of `exp_match` gives as _direct argument_ (evidence) about which branches we goes.
-
-> we need some _sanity check_ since Coq simply trust what we declared...
-> that's why there is even Quick Check for Coq.
-
-### Direct Proof
-
-In fact, `MApp` is also non-deterministic about how does `re1` and `re2` collaborate...
-So we have to be explicit:
-
-```coq
-Example reg_exp_ex2 : [1; 2] =~ App (Char 1) (Char 2).
-Proof.
- apply (MApp [1] _ [2]).
- ...
-```
-
-### Inversion on Evidence
-
-This, if we want to prove via `destruct`,
-we have to write our own _inversion lemma_ (like `ev_inversion` for `even`).
-Otherwise we have no equation (which we should have) to say `contradiction`.
-
-```coq
-Example reg_exp_ex3 : ~ ([1; 2] =~ Char 1).
-Proof.
- intros H. inversion H.
-Qed.
-```
-
-### Manual Manipulation
-
-```coq
-Lemma MStar1 :
- forall T s (re : @reg_exp T) ,
- s =~ re ->
- s =~ Star re.
-Proof.
- intros T s re H.
- rewrite <- (app_nil_r _ s). (* extra "massaging" to convert [s] => [s ++ []] *)
- apply (MStarApp s [] re). (* to the shape [MStarApp] expected thus can pattern match on *)
-
- (* proving [MStarApp] requires [s1 s2 re H1 H2]. By giving [s [] re], we left two evidence *)
- | MStarApp s1 s2 re
- (H1 : exp_match s1 re)
- (H2 : exp_match s2 (Star re)) :
- exp_match (s1 ++ s2) (Star re).
-
- - apply H. (* evidence H1 *)
- - apply MStar0. (* evidence H2 *)
-Qed. (* the fun fact is that we can really think the _proof_
- as providing evidence by _partial application_. *)
-```
-
-### Induction on Evidence
-
-> By the recursive nature of `exp_match`, proofs will often require induction.
-
-```coq
-(** Recursively collecting all characters that occur in a regex **)
-Fixpoint re_chars {T} (re : reg_exp) : list T :=
- match re with
- | EmptySet ⇒ []
- | EmptyStr ⇒ []
- | Char x ⇒ [x]
- | App re1 re2 ⇒ re_chars re1 ++ re_chars re2
- | Union re1 re2 ⇒ re_chars re1 ++ re_chars re2
- | Star re ⇒ re_chars re
- end.
-```
-
-The proof of `in_re_match` went through by `inversion` on relation `s =~ re`. (which gives us all 7 cases.)
-The interesting case is `MStarApp`, where the proof tree has two _branches_ (of premises):
-
- s1 =~ re s2 =~ Star re
- --------------------------- (MStarApp)
- s1 ++ s2 =~ Star re
-
-So by induction on the relation (rule), we got _two induction hypotheses_!
-That's what we need for the proof.
-
-
-
-The `remember` tactic (Induction on Evidence of A Specific Case)
-----------------------------------------------------------------
-
-One interesting/confusing features is that `induction` over a term that's _insuffciently general_. e.g.
-
-```coq
-Lemma star_app: ∀T (s1 s2 : list T) (re : @reg_exp T),
- s1 =~ Star re →
- s2 =~ Star re →
- s1 ++ s2 =~ Star re.
-Proof.
- intros T s1 s2 re H1.
-```
-
-Here, we know the fact that both `s1` and `s2` are matching with the form `Star re`.
-But by `induction`. it will give us _all 7 cases_ to prove, but _5 of them are contradictory_!
-
-That's where we need `remember (Star re) as re'` to get this bit of information back to `discriminate`.
-
-
-### Sidenotes: `inversion` vs. `induction` on evidence
-
-We might attemp to use `inversion`,
-which is best suitted for have a specific conclusion of some rule and inverts back to get its premises.
-
-But for _recursive cases_ (e.g. `Star`), we always need `induction`.
-
-`induction` on a specific conclusion then `remember + contradiction` is similar with how `inversion` solves contradictionary cases. (They both `destruct` the inductively defined things for sure)
-
-
-
-
-Exercise: 5 stars, advanced (pumping)
--------------------------------------
-
-FCT/Wikipedia "proves" [pumping lemma for regex](https://en.wikipedia.org/wiki/Pumping_lemma_for_regular_languages) in a non-constructive way.
-
-Here we attempts to give a constructive proof.
-
-
-
-
-Case Study: Improving Reflection (互映)
--------------------------------------
-
-> we often need to relate boolean computations to statements in `Prop`
-
-```coq
-Inductive reflect (P : Prop) : bool → Prop :=
-| ReflectT (H : P) : reflect P true
-| ReflectF (H : ¬P) : reflect P false.
-```
-
-The _only_ way to construct `ReflectT/F` is by showing (a proof) of `P/¬P`,
-meaning invertion on `reflect P bool` can give us back the evidence.
-
-
-`iff_reflect` give us `eqbP`.
-
-```coq
-Lemma eqbP : ∀n m, reflect (n = m) (n =? m).
-Proof.
- intros n m. apply iff_reflect. rewrite eqb_eq. reflexivity.
-Qed.
-```
-
-This gives us a small gain in convenience: we immediately give the `Prop` from `bool`, no need to `rewrite`.
-> Proof Engineering Hacks...
-
-
-### SSReflect - small-scale reflection
-
-> a Coq library
-> used to prove 4-color theorem...!
-> simplify small proof steps with boolean computations. (somewhat automation with decision procedures)
-
-
-
-
-
-
-Extended Exercise: A Verified Regular-Expression Matcher
---------------------------------------------------------
-
-> we have defined a _match relation_ that can _prove_ a regex matches a string.
-> but it does not give us a _program_ that can _run_ to determine a match automatically...
-
-> we hope to translate _inductive rules (for constructing evidence)_ to _recursive fn_.
-> however, since `reg_exp` is recursive, Coq won't accept it always terminates
-
-theoritically, the regex = DFA so it is decidable and halt.
-technically, it only halts on finite strings but not infinite strings.
-(and infinite strings are probably beyond the scope of halting problem?)
-
-> Heavily-optimized regex matcher = translating into _state machine_ e.g. NFA/DFA.
-> Here we took a _derivative_ approach which operates purely on string.
-
-```coq
-Require Export Coq.Strings.Ascii.
-Definition string := list ascii.
-```
-
-Coq 标准库中的 ASCII 字符串也是归纳定义的,不过我们这里为了之前定义的 match relation 用 `list ascii`.
-
-> to define regex matcher over `list X` i.e. polymorphic lists.
-> we need to be able to _test equality_ for each `X` etc.
-
-
-### Rules & Derivatives.
-
-Check paper [Regular-expression derivatives reexamined - JFP 09]() as well.
-
-`app` and `star` are the hardest ones.
-
-
-#### Let's take `app` as an example
-
-##### 1. 等价 helper
-
-```coq
-Lemma app_exists : ∀(s : string) re0 re1,
- s =~ App re0 re1 ↔ ∃s0 s1, s = s0 ++ s1 ∧ s0 =~ re0 ∧ s1 =~ re1.
-```
-
-this _helper rules_ is written for the sake of convenience:
-- the `<-` is the definition of `MApp`.
-- the `->` is the `inversion s =~ App re0 re1`.
-
-##### 2. `App` 对于 `a :: s` 的匹配性质
-
-```coq
-Lemma app_ne : ∀(a : ascii) s re0 re1,
- a :: s =~ (App re0 re1) ↔
- ([ ] =~ re0 ∧ a :: s =~ re1) ∨
- ∃s0 s1, s = s0 ++ s1 ∧ a :: s0 =~ re0 ∧ s1 =~ re1.
-```
-the second rule is more interesting. It states the _property_ of `app`:
-> App re0 re1 匹配 a::s 当且仅当 (re0 匹配空字符串 且 a::s 匹配 re1) 或 (s=s0++s1,其中 a::s0 匹配 re0 且 s1 匹配 re1)。
-
-
-这两条对后来的证明很有帮助,`app_exists` 反演出来的 existential 刚好用在 `app_ne` 中.
-> https://github.com/jiangsy/SoftwareFoundation/blob/47543ce8b004cd25d0e1769f7444d57f0e26594d/IndProp.v
-
-
-##### 3. 定义 derivative 关系
-
-the relation _`re'` is a derivative of `re` on `a`_ is defind as follows:
-
-```coq
-Definition is_der re (a : ascii) re' :=
- ∀s, a :: s =~ re ↔ s =~ re'.
-```
-
-##### 4. 实现 derive
-
-Now we can impl `derive` by follwing `2`, the property.
-In paper we have:
-
- ∂ₐ(r · s) = ∂ₐr · s + ν(r) · ∂ₐs -- subscriprt "a" meaning "respective to a"
-
- where
- ν(r) = nullable(r) ? ε : ∅
-
-In our Coq implementation, `nullable(r) == match_eps(r)`,
-
-Since we know that
-`∀r, ∅ · r = ∅`,
-`∀r, ε · r = r`,
-we can be more straightforward by expanding out `v(r)`:
-
-```coq
-Fixpoint derive (a : ascii) (re : @reg_exp ascii) : @reg_exp ascii :=
-...
- | App r1 r2 => if match_eps r1 (** nullable(r) ? **)
- then Union (App (derive a r1) r2) (derive a r2) (** ∂ₐr · s + ∂ₐs **)
- else App (derive a r1) r2 (** ∂ₐr · s **)
-```
diff --git a/_posts/read_sf_lf/2019-01-08-sf-lf-08-map.md b/_posts/read_sf_lf/2019-01-08-sf-lf-08-map.md
deleted file mode 100644
index cf2489cdcb2..00000000000
--- a/_posts/read_sf_lf/2019-01-08-sf-lf-08-map.md
+++ /dev/null
@@ -1,226 +0,0 @@
----
-title: "「SF-LC」8 Maps"
-subtitle: "Logical Foundations - Total and Partial Maps"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - LF (逻辑基础)
- - SF (软件基础)
- - Coq
- - 笔记
----
-
-> useful as env
-
-Map == Dictionary
-* building data structure.
-* use of reflection to streamline proofs.
-
-Two flavors of maps:
-1. _total_ maps, return _default_ when lookup fails
-2. _partial_ maps, return `option` to indicate success/failure, using `None` as the default.
-
-
-## The Coq Standard Lib
-
-
-From now on, importing from std lib. (but should not notice much difference)
-
-```coq
-From Coq Require Import Arith.Arith.
-From Coq Require Import Bool.Bool.
-Require Export Coq.Strings.String.
-From Coq Require Import Logic.FunctionalExtensionality.
-From Coq Require Import Lists.List.
-Import ListNotations.
-```
-
-TODO: what's the differences above?
-Answered in Coq Intensive:
-- `Require` give access but need to use qualified name
-- `Import` no need to use qualified name
-- `Export` module importing me no need to use qualified name as well
-
-`String` in Coq is `list` of `Char` and `Char` is record of 8 `Bool`...
-
-
-
-## Identifiers
-
-> we need a type for the _keys_ that we use to index into our maps.
-
-In `Lists.v` (Partial Maps):
-
-```coq
-Inductive id : Type :=
- | Id (n : nat).
-```
-
-From now on we will use the `string` from Coq's std lib:
-
-
-```coq
-Definition eqb_string (x y : string) : bool :=
- if string_dec x y then true else false.
-
-Check string_dec: (* ===> *)
- : forall s1 s2 : string, {s1 = s2} + {s1 <> s2}
-```
-
-The equality check fn for `string` from stdlib is `string_des`, which returns a `sumbool` type, i.e. `{x=y} + {x≠y}`.
-> which can be thought of as an __"evidence-carrying boolean"__.
-> Formally, an element of `sumbool` is either or
-> - a proof that two things are equal
-> - a proof that they are unequal,
-> together with a tag indicating which.
-
-
-Some properties:
-
-```coq
-(* reflexive relation *)
-Theorem eqb_string_refl : ∀s : string, true = eqb_string s s.
-
-(* functional extensionality *)
-Theorem eqb_string_true_iff : ∀x y : string, eqb_string x y = true ↔ x = y.
-Theorem eqb_string_false_iff : ∀x y : string, eqb_string x y = false ↔ x ≠ y.
-```
-
-
-## Total Maps
-
-> use _functions_, rather than lists of key-value pairs, to build maps.
-> The advantage of this representation is that it offers a more _extensional_ view of maps. 外延性
-
-> (where two maps that respond to queries in the same way will be represented as literally the same thing rather than just "equivalent" data structures. This, in turn, simplifies proofs that use maps.)
-
-```coq
-Definition total_map (A : Type) := string -> A.
-
-(* empty take a default value *)
-Definition t_empty {A : Type} (v : A) : total_map A :=
- (fun _ => v).
-
-(* update take a key value pair *)
-Definition t_update {A : Type} (m : total_map A)
- (x : string) (v : A) (* : total_map A *) :=
- fun x' => if eqb_string x x' then v else m x'.
-```
-
-Where is the data stored? _Closure_!
-
-
-### My Reviews on API style of ML
-
-```coq
-Definition examplemap :=
- t_update (t_update (t_empty false) "foo" true)
- "bar" true.
-```
-
-since `t_update` is defined as so called "t-first" style.
-Reason/BuckleScript and OCaml stdlib uses this style as well:
-
-```js
-let examplemap =
- t_empty(false)
- |. t_update("foo", true) /* fast pipe */
- |. t_update("bar", true)
-```
-
-```ocaml
-val add : key -> 'a -> 'a t -> 'a t
-let examplemap =
- Map.empty
- |> Map.add "foo" true
- |> Map.add "bar" true
-```
-
-Or, In Jane Street "named-argument" style
-e.g. [Real World OCaml](https://v1.realworldocaml.org/v1/en/html/maps-and-hash-tables.html)
-
-```ocaml
-let examplemap =
- Map.empty
- |> Map.add ~key:"foo" ~data:true
- |> Map.add ~key:"bar" ~data:true
-```
-
-### Lightweight Meta-Programming in Coq - Notation
-
-In Coq, we can leverage some meta programming:
-
-```coq
-Notation "'_' '!->' v" := (t_empty v)
- (at level 100, right associativity).
-
-Notation "x '!->' v ';' m" := (t_update m x v)
- (at level 100, v at next level, right associativity).
-
-Definition examplemap' :=
- ( "bar" !-> true;
- "foo" !-> true;
- _ !-> false
- ).
-```
-
-Noticed that the "Map building" is in a _reversed_ order...
-
-> Note that we don't need to define a find operation because it is just function application!
-
-```coq
-Example update_example2 : examplemap' "foo" = true.
-Example update_example4 : examplemap' "bar" = true.
-Example update_example1 : examplemap' "baz" = false. (* default *)
-```
-
----
-
-## Partial Maps
-
-> we define partial maps on top of total maps.
-> A partial map with elements of type `A` is simply a total map with elements of type `option A` and default element `None`.
-
-```coq
-Definition partial_map (A : Type) := total_map (option A).
-
-Definition empty {A : Type} : partial_map A :=
- t_empty None.
-
-Definition update {A : Type} (m : partial_map A)
- (x : string) (v : A) :=
- (x !-> Some v ; m).
-
-Notation "x '⊢>' v ';' m" := (update m x v)
- (at level 100, v at next level, right associativity).
-
-(** hide the empty case. Since it's always [None] **)
-Notation "x '⊢>' v" := (update empty x v)
- (at level 100).
-
-(** so nice **)
-Example examplepmap :=
- ("Church" ⊢> true ;
- "Turing" ⊢> false).
-```
-
-we use the "standard" map operator `↦` for partial map since maps in CS are usually partial.
-
-
----
-
-## [Maps are functions](https://en.wikipedia.org/wiki/Map_(mathematics)#Maps_as_functions)
-
-
-> In many branches of mathematics, the term map is used to mean a function.
-> _partial map_ = _partial function_,
-> _total map_ = _total function_.
-
-
-> In category theory, "map" is often used as a synonym for morphism or arrow.
-
-
-> In formal logic, "map" is sometimes used for a functional symbol.
-
diff --git a/_posts/read_sf_lf/2019-01-09-sf-lf-09-proof-object.md b/_posts/read_sf_lf/2019-01-09-sf-lf-09-proof-object.md
deleted file mode 100644
index 511076bc06b..00000000000
--- a/_posts/read_sf_lf/2019-01-09-sf-lf-09-proof-object.md
+++ /dev/null
@@ -1,487 +0,0 @@
----
-title: "「SF-LC」9 ProofObjects"
-subtitle: "Logical Foundations - The Curry-Howard Correspondence "
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - LF (逻辑基础)
- - SF (软件基础)
- - Coq
- - 笔记
----
-
-> "Algorithms are the computational content of proofs." —Robert Harper
-
-So the book material is designed to be gradually reveal the facts that
-> Programming and proving in Coq are two sides of the same coin.
-
-
-e.g.
-- `Inductive` is useds for both data types and propositions.
-- `->` is used for both type of functions and logical implication.
-
-The fundamental idea of Coq is that:
-
-> _provability_ in Coq is represented by _concrete evidence_. When we construct the proof of a basic proposition, we are actually _building a tree of evidence_, which can be thought of as a data structure.
-
-e.g.
-- implication like `A → B`, its proof will be an _evidence transformer_: a recipe for converting evidence for A into evidence for B.
-
-> Proving manipulates evidence, much as programs manipuate data.
-
-
-Curry-Howard Correspondence
----------------------------
-
-> deep connection between the world of logic and the world of computation:
-
- propositions ~ types
- proofs / evidence ~ terms / data values
-
-
-`ev_0 : even 0`
-- `ev_0` __has type__ `even 0`
-- `ev_0` __is a proof of__ / __is evidence for__ `even 0`
-
-`ev_SS : ∀n, even n -> even (S (S n))`
-- takes a nat `n` and evidence for `even n` and yields evidence for `even (S (S n))`.
-
-This is _Props as Types_.
-
-
-Proof Objects
--------------
-
-Proofs are data! We can see the _proof object_ that results from this _proof script_.
-
-```coq
-Print ev_4.
-(* ===> ev_4 = ev_SS 2 (ev_SS 0 ev_0)
- : even 4 *)
-
-Check (ev_SS 2 (ev_SS 0 ev_0)). (* concrete derivation tree, we r explicitly say the number tho *)
-(* ===> even 4 *)
-```
-
-These two ways are the same in principle!
-
-
-Proof Scripts
--------------
-
-`Show Proof.` will show the _partially constructed_ proof terms / objects.
-`?Goal` is the _unification variable_. (the hold we need to fill in to complete the proof)
-
-more complicated in branching cases
-one hole more subgoal
-
-```coq
-Theorem ev_4'' : even 4. (* match? (even 4) *)
-Proof.
- Show Proof. (* ?Goal *)
- apply ev_SS.
- Show Proof. (* (ev_SS 2 ?Goal) *)
- apply ev_SS.
- Show Proof. (* (ev_SS 2 (ev_SS 0 ?Goal)) *)
- apply ev_0.
- Show Proof. (* ?Goal (ev_SS 2 (ev_SS 0 ev_0)) *)
-Qed.
-```
-
-> Tactic proofs are useful and convenient, but they are not essential:
-> in principle, we can always construct the required evidence by hand
-
-Agda doesn't have tactics built-in. (but also Interactive)
-
-
-Quantifiers, Implications, Functions
-------------------------------------
-
-In Coq's _computational universe_ (where data structures and programs live), to give `->`:
-- constructors (introduced by `Indutive`)
-- functions
-
-in Coq's _logical universe_ (where we carry out proofs), to give implication:
-- constructors
-- functions!
-
-
-So instead of writing proof scripts e.g._
-
-```coq
-Theorem ev_plus4 : ∀n, even n → even (4 + n).
-Proof.
- intros n H. simpl.
- apply ev_SS.
- apply ev_SS.
- apply H.
-Qed.
-```
-
-we can give proof object, which is a _function_ here, directly!
-
-```coq
-Definition ev_plus4' : ∀n, even n → even (4 + n) := (* ∀ is syntax for Pi? *)
- fun (n : nat) ⇒
- fun (H : even n) ⇒
- ev_SS (S (S n)) (ev_SS n H).
-
-
-Definition ev_plus4'' (n : nat) (H : even n) (* tricky: implicitly `Pi` when `n` get mentioned? *)
- : even (4 + n) :=
- ev_SS (S (S n)) (ev_SS n H).
-```
-
-two interesting facts:
-1. `intros x` corresponds to `λx.` (or `Pi x.`??)
-2. `apply` corresponds to...not quite function application... but more like _filling the hole_.
-3. `even n` mentions the _value_ of 1st argument `n`. i.e. _dependent type_!
-
-
-Recall Ari's question in "applying theorem as function" e.g. `plus_comm`
-why we can apply value in type-level fun.
-becuz of dependent type.
-
-Now we call them `dependent type function`
-
-
-
-### `→` is degenerated `∀` (`Pi`)
-
-> Notice that both implication (`→`) and quantification (`∀`) correspond to functions on evidence.
-> In fact, they are really the same thing: `→` is just a shorthand for a degenerate use of `∀` where there is no dependency, i.e., no need to give a name to the type on the left-hand side of the arrow:
-
-```coq
- ∀(x:nat), nat
-= ∀(_:nat), nat
-= nat → nat
-
- ∀n, ∀(E : even n), even (n + 2).
-= ∀n, ∀(_ : even n), even (n + 2).
-= ∀n, even n → even (n + 2).
-```
-
-> In general, `P → Q` is just syntactic sugar for `∀ (_:P), Q`.
-
-TaPL also mention this fact for `Pi`.
-
-
-Q&A - Slide 15
---------------
-
-1. `∀ n, even n → even (4 + n)`. (`2 + n = S (S n)`)
-
-
-
-
-Programming with Tactics.
--------------------------
-
-If we can build proofs by giving explicit terms rather than executing tactic scripts,
-you may be wondering whether we can _build programs using tactics_? Yes!
-
-```coq
-Definition add1 : nat → nat.
- intro n.
- Show Proof.
-(**
-the goal (proof state):
-
- n : nat
- =======
- nat
-
-the response:
-
- (fun n : nat => ?Goal)
-
-What is really interesting here, is that the premies [n:nat] is actually the arguments!
-again, the process of applying tactics is _partial application_
-**)
-
- apply S.
- Show Proof.
-(**
- (fun n : nat => S ?Goal)
-**)
- apply n.
-Defined.
-
-Print add1.
-(* ==> add1 = fun n : nat => S n
- : nat -> nat *)
-```
-
-> Notice that we terminate the Definition with a `.` rather than with `:=` followed by a term.
-> This tells Coq to enter _proof scripting mode_ (w/o `Proof.`, which did nothing)
-
-> Also, we terminate the proof with `Defined` rather than `Qed`; this makes the definition _transparent_ so that it can be used in computation like a normally-defined function
-> (`Qed`-defined objects are _opaque_ during computation.).
-
-`Qed` make things `unfold`able,
-thus `add 1` ends with `Qed` is not computable...
-(becuz of not even `unfold`able thus computation engine won't deal with it)
-
-> Prof.Mtf: meaning "we don't care about the details of Proof"
-
-see as well [Smart Constructor](https://wiki.haskell.org/Smart_constructors)
-
-
-> This feature is mainly useful for writing functions with dependent types
-
-In Coq - you do as much as ML/Haskell when you can...?
-Unlike Agda - you program intensively in dependent type...?
-
-When Extracting to OCaml...Coq did a lot of `Object.magic` for coercion to bypass OCaml type system. (Coq has maken sure the type safety.)
-
-
-Logical Connectives as Inductive Types
---------------------------------------
-
-> Inductive definitions are powerful enough to express most of the connectives we have seen so far.
-> Indeed, only universal quantification (with implication as a special case) is built into Coq;
-> all the others are defined inductively.
-Wow...
-
-> CoqI: What's Coq logic? Forall + Inductive type (+ coinduction), that's it.
-
-### Conjunctions
-
-```coq
-Inductive and (P Q : Prop) : Prop :=
-| conj : P → Q → and P Q.
-
-Print prod.
-(* ===>
- Inductive prod (X Y : Type) : Type :=
- | pair : X -> Y -> X * Y. *)
-```
-
-similar to `prod` (product) type... more connections happening here.
-
-> This similarity should clarify why `destruct` and `intros` patterns can be used on a conjunctive hypothesis.
-
-> Similarly, the `split` tactic actually works for any inductively defined proposition with exactly one constructor
-(so here, `apply conj`, which will match the conclusion and generate two subgoal from assumptions )
-
-A _very direct_ proof:
-
-```coq
-Definition and_comm'_aux P Q (H : P ∧ Q) : Q ∧ P :=
- match H with
- | conj HP HQ ⇒ conj HQ HP
- end.
-```
-
-
-
-### Disjunction
-
-```coq
-Inductive or (P Q : Prop) : Prop :=
-| or_introl : P → or P Q
-| or_intror : Q → or P Q.
-```
-
-this explains why `destruct` works but `split` not..
-
-
-Q&A - Slide 22 + 24
--------------------
-
-Both Question asked about what's the type of some expression
-
-```coq
-fun P Q R (H1: and P Q) (H2: and Q R) ⇒
- match (H1,H2) with
- | (conj _ _ HP _, conj _ _ _ HR) ⇒ conj P R HP HR
- end.
-
-fun P Q H ⇒
- match H with
- | or_introl HP ⇒ or_intror Q P HP
- | or_intror HQ ⇒ or_introl Q P HQ
- end.
-```
-But if you simply `Check` on them, you will get errors saying:
-`Error: The constructor conj (in type and) expects 2 arguments.` or
-`Error: The constructor or_introl (in type or) expects 2 arguments.`.
-
-
-### Coq Magics, "Implicit" Implicit and Overloading??
-
-So what's the problem?
-Well, Coq did some magics...
-
-```coq
-Print and.
-(* ===> *)
-Inductive and (A B : Prop) : Prop := conj : A -> B -> A /\ B
-For conj: Arguments A, B are implicit
-```
-
-constructor `conj` has implicit type arg w/o using `{}` in `and` ...
-
-```coq
-Inductive or (A B : Prop) : Prop :=
- or_introl : A -> A \/ B | or_intror : B -> A \/ B
-
-For or_introl, when applied to no more than 1 argument:
- Arguments A, B are implicit
-For or_introl, when applied to 2 arguments:
- Argument A is implicit
-For or_intror, when applied to no more than 1 argument:
- Arguments A, B are implicit
-For or_intror, when applied to 2 arguments:
- Argument B is implicit
-```
-
-this is even more bizarre...
-constructor `or_introl` (and `or_intror`) are _overloaded_!! (WTF)
-
-
-And the questions're still given as if they're inside the modules we defined our plain version of `and` & `or` (w/o any magics), thus we need `_` in the positions we instantiate `and` & `or` so Coq will infer.
-
-
-
-### Existential Quantification
-
-> To give evidence for an existential quantifier, we package a witness `x` together with a proof that `x` satisfies the property `P`:
-
-```coq
-Inductive ex {A : Type} (P : A → Prop) : Prop :=
-| ex_intro : ∀x : A, P x → ex P.
-
-Check ex. (* ===> *) : (?A -> Prop) -> Prop
-Check even. (* ===> *) : nat -> Prop (* ?A := nat *)
-Check ex even. (* ===> *) : Prop
-Check ex (fun n => even n) (* ===> *) : Prop (* same *)
-```
-
-one interesting fact is, _outside_ of our module, the built-in Coq behaves differently (_magically_):
-
-```coq
-Check ev. (* ===> *) : ∀ (A : Type), (A -> Prop) -> Prop
-Check even. (* ===> *) : nat -> Prop (* A := nat *)
-Check ex (fun n => even n) (* ===> *) : ∃ (n : nat) , even n : Prop (* WAT !? *)
-```
-
-A example of explicit proof object (that inhabit this type):
-
-```coq
-Definition some_nat_is_even : ∃n, even n :=
- ex_intro even 4 (ev_SS 2 (ev_SS 0 ev_0)).
-```
-
-the `ex_intro` take `even` first then `4`...not sure why the order becomes this...
-
-```coq
-Check (ex_intro). (* ===> *) : forall (P : ?A -> Prop) (x : ?A), P x -> ex P
-```
-
-To prove `ex P`, given a witness `x` and a proof of `P x`. This desugar to `∃ x, P x`
-
-- the `P` here, is getting applied when we define prop `∃ x, P x`.
-- but the `x` is not mentioned in type constructor...so it's a _existential type_.
- - I don't know why languages (including Haskell) use `forall` for _existential_ tho.
-
-`exists` tactic = applying `ex_intro`
-
-
-
-### True and False
-
-```coq
-Inductive True : Prop :=
- | I : True.
-
-(* with 0 constructors, no way of presenting evidence for False *)
-Inductive False : Prop := .
-```
-
-
-Equality
---------
-
-```coq
-Inductive eq {X:Type} : X → X → Prop :=
-| eq_refl : ∀x, eq x x.
-
-Notation "x == y" := (eq x y)
- (at level 70, no associativity)
- : type_scope.
-```
-
-
-> given a set `X`, it defines a _family_ of propositions "x is equal to y,", _indexed by_ pairs of values (x and y) from `X`.
-
-> Can we also use it to construct evidence that `1 + 1 = 2`?
-> Yes, we can. Indeed, it is the very same piece of evidence!
-
-> The reason is that Coq treats as "the same" any two terms that are convertible according to a simple set of computation rules.
-
-nothing in the unification engine but we relies on the _reduction engine_.
-
-> Q: how much is it willing to do?
-> Mtf: just run them! (since Coq is total!)
-
-```coq
-Lemma four: 2 + 2 == 1 + 3.
-Proof.
- apply eq_refl.
-Qed.
-```
-
-The `reflexivity` tactic is essentially just shorthand for `apply eq_refl`.
-
-
-Slide Q & A
------------
-
-- (4) has to be applicable thing, i.e. lambda, or "property" in the notion!
-
-In terms of provability of `reflexivity`
-
-```coq
-(fun n => S (S n)) = (fun n => 2 + n) (* reflexivity *)
-(fun n => S (S n)) = (fun n => n + 2) (* rewrite add_com *)
-```
-
-### Inversion, Again
-
-> We've seen inversion used with both equality hypotheses and hypotheses about inductively defined propositions. Now that we've seen that these are actually the same thing
-
-In general, the `inversion` tactic...
-
-1. take hypo `H` whose type `P` is inductively defined
-2. for each constructor `C` in `P`
- 1. generate new subgoal (assume `H` was built with `C`)
- 2. add the arguments (i.e. evidences of premises) of `C` as extra hypo (to the context of subgoal)
- 3. (apply `constructor` theorem), match the conclusion of `C`, calculates a set of equalities (some extra restrictions)
- 4. adds these equalities
- 5. if there is contradiction, `discriminate`, solve subgoal.
-
-
-### Q
-
-> Q: Can we write `+` in a communitive way?
-> A: I don't believe so.
-
-
-[Ground truth](https://en.wikipedia.org/wiki/Ground_truth)
- - provided by direct observation (instead of inference)
-
-[Ground term](https://en.wikipedia.org/wiki/Ground_expression#Ground_terms)
- - that does not contain any free variables.
-
-Groundness
- - 根基性?
-
-> Weird `Axiomness` might break the soundness of generated code in OCaml...
-
-
-
-
-
diff --git a/_posts/read_sf_lf/2019-01-10-sf-lf-10-ind-principle.md b/_posts/read_sf_lf/2019-01-10-sf-lf-10-ind-principle.md
deleted file mode 100644
index 0ba98c34247..00000000000
--- a/_posts/read_sf_lf/2019-01-10-sf-lf-10-ind-principle.md
+++ /dev/null
@@ -1,329 +0,0 @@
----
-title: "「SF-LC」10 IndPrinciples"
-subtitle: "Logical Foundations - Induction Principles"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - LF (逻辑基础)
- - SF (软件基础)
- - Coq
- - 笔记
----
-
-
-Basic
------
-
-> 每次我们使用 `Inductive` 来声明数据类型时,Coq 会自动为这个类型生成 _归纳原理_。
-> Every time we declare a new `Inductive` datatype, Coq automatically generates an _induction principle_ for this type.
-
-
-自然数的归纳原理:
-
-```coq
-Check nat_ind. :
-
-∀ P : nat → Prop,
- P 0 →
- (∀ n : nat, P n -> P (S n)) →
- ∀ n : nat, P n
-```
-
-written as inference rule:
-
- P 0
- ∀ n : nat, P n -> P (S n)
- -------------------------
- ∀ n : nat, P n
-
-
-> `induction` tactic is wrapper of `apply t_ind`
-
-
-> Coq 为每一个 `Inductive` 定义的数据类型生成了归纳原理,包括那些非递归的
-> Coq generates induction principles for every datatype defined with `Inductive`, including those that aren't recursive.
-
-> 尽管我们不需要使用归纳来证明非递归数据类型的性质
-> Although of course we don't need induction to prove properties of non-recursive datatypes. (`destruct` would be sufficient)
-
-> 归纳原理的概念仍然适用于它们: 它是一种证明一个对于这个类型所有值都成立的性质的方法。
-> the idea of an induction principle still makes sense for them: it gives a way to prove that a property holds for all values of the type.
-
-
-### Non-recursive
-
-```coq
-Inductive yesno : Type :=
- | yes
- | no.
-
-Check yesno_ind. :
-yesno_ind : ∀ P : yesno → Prop,
- P yes →
- P no →
- ∀ y : yesno, P y
-```
-
- P yes
- P no
- ------------------
- ∀ y : yesno, P y
-
-
-### Structural-Recursive
-
-```coq
-Inductive natlist : Type :=
- | nnil
- | ncons (n : nat) (l : natlist).
-
-Check natlist_ind. :
-natlist_ind : ∀ P : natlist → Prop,
- P nnil →
- (∀ (n : nat) (l : natlist), P l -> P (ncons n l)) →
- ∀ l : natlist, P l
-```
-
- P nnil
- ∀ (n : nat) (l : natlist), P l -> P (ncons n l)
- -----------------------------------------------
- ∀ l : natlist, P l
-
-
-`P` only need to fullfill `l : the_type` but not `n:nat` since we are proving property of `the_type`.
-
-
-### The Pattern
-
-> These generated principles follow a similar pattern.
-- induction on each cases
-- proof by exhaustiveness?
-
-```coq
-Inductive t : Type :=
- | c1 (x1 : a1) ... (xn : an)
- ...
- | cn ...
-
-t_ind : ∀P : t → Prop,
- ... case for c1 ... →
- ... case for c2 ... → ...
- ... case for cn ... →
- ∀n : t, P n
-```
-
-对于 `t` 的归纳原理是又所有对于 `c` 的归纳原理所组成的: (即所有 case 成立)
-
-对于 `c` 的归纳原理则是
-> 对于所有的类型为 `a1...an` 的值 `x1...xn`,如果 `P` 对每个 归纳的参数(每个具有类型 `t` 的 `xi`)都成立,那么 `P` 对于 `c x1 ... xn` 成立”
-
-每个具有类型 `t` 的参数的地方即发生了「递归」与「子结构」,归纳假设 = 「对子结构成立」.
-
-
-
-
-
-Polymorphism
-------------
-
-接下来考虑多态列表:
-
-
-```coq
-(* in ADT syntax *)
-Inductive list (X:Type) : Type :=
- | nil
- | cons (x : X) (l': list X)
-
-(* in GADT syntax *)
-Inductive list (X:Type) : Type :=
- | nil : list X
- | cons : X → list X → list X.
-```
-
-> here, the whole def is _parameterized_ on a `set X`: that is, we are defining a _family_ of inductive types `list X`, one for each `X`.
-
-这里,整个定义都是被集合 `X` _参数化_的:
-也即,我们定义了一个族 `list : X -> Type`, 对于每个 `X`,我们都有一个对应的_项_: `list X`, which is a `Type`, 可写作 `list X : Type`.
-
-
-> `list_ind` can be thought of as a polymorphic function that,
-> when applied to a type `X`, gives us back an induction principle specialized to the type `list X`.
-
-因此,其归纳定理 `list_ind` 是一个被 `X` 参数化多态的函数。
-当应用 `X : Type` 时,返回一个特化在 `list X : Type` 上的归纳原理
-
-
-```coq
-list_ind : ∀(X : Type) (P : list X → Prop),
- P [] →
- (∀(x : X) (l : list X), P l → P (x :: l)) →
- ∀l : list X, P l
-```
-
- ∀(X : Type), {
-
- P [] -- base structure holds
- ∀(x : X) (l : list X), P l → P (x :: l) -- sub-structure holds -> structure holds
- ---------------------------------------
- ∀l : list X, P l -- all structure holds
-
- }
-
-
-
-Induction Hypotheses 归纳假设
-----------------------------
-
-
-> The induction hypothesis is the _premise_ of this latter implication
-> — the assumption that `P` holds of `n'`, which we are allowed to use in proving that `P` holds for `S n'`.
-
-_归纳假设就是 `P n' -> P (S n')` 这个蕴含式中的前提部分_
-使用 `nat_ind` 时需要显式得用 `intros n IHn` 引入,于是就变成了 proof context 中的假设.
-
-
-
-
-
-More on the `induction` Tactic
-------------------------------
-
-### "Re-generalize" 重新泛化
-
-Noticed that in proofs using `nat_ind`, we need to keep `n` generailzed.
-if we `intros` particular `n` first then `apply nat_ind`, it won't works...
-
-But we could `intros n. induction n.`, that's `induction` tactic internally "re-generalize" the `n` we perform induction on.
-
-
-### Automatic `intros` i.e. specialize variables before the variable we induction on
-
-A canonical case is `induction n` vs `induction m` on theorem `plus_comm'' : ∀n m : nat, n + m = m + n.`.
-to keep a var generial...we can either change variable order under `∀`, or using `generalize dependent`.
-
-
-
-
-
-Induction Principles in Prop
-----------------------------
-
-### 理解依赖类型的归纳假设 与 Coq 排除证据参数的原因
-
-除了集合 `Set`,命题 `Prop` 也可以是归纳定义与 `induction` on 得.
-难点在于:_Inductive Prop_ 通常是 dependent type 的,这里会带来复杂度。
-
-考虑命题 `even`:
-
-```coq
- Inductive even : nat → Prop :=
- | ev_0 : even 0
- | ev_SS : ∀n : nat, even n → even (S (S n)).
-```
-
-我们可以猜测一个最 general 的归纳假设:
-
-```coq
-ev_ind_max : ∀ P : (∀n : nat, even n → Prop),
- P O ev_0 →
- (∀(m : nat) (E : even m), P m E → P (S (S m)) (ev_SS m E)) →
- ∀(n : nat) (E : even n), P n E
-```
-
-即:
-
-
- P 0 ev_0 -- base
- ∀(m : nat) (E : even m), P m E → P (S (S m)) (ev_SS m E) -- sub structure -> structure
- --------------------------------------------------------
- ∀(n : nat) (E : even n), P n E -- all structure
-
-
-注意这里:
-
-1. `even` is _indexed_ by nat `n` (对比 `list` is _parametrized_ by `X`)
- - 从族的角度: `even : nat -> Prop`, a family of `Prop` indexed by `nat`
- - 从实体角度: 每个 `E : even n` 对象都是一个 evidence that _particular nat is even_.
-
-2. 要证的性质 `P` is parametrized by `E : even n` 也因此连带着 by `n`. 也就是 `P : (∀n : nat, even n → Prop)` (对比 `P : list X → Prop`)
- - 所以其实关于 `even n` 的性质是同时关于数字 `n` 和证据 `even n` 这两件事的.
-
-因此 `sub structure -> structure` 说得是:
-> whenever `n` is an even number and `E` is an evidence of its evenness, if `P` holds of `n` and `E`, then it also holds of `S (S n)` and `ev_SS n E`.
-> 对于任意数字 `n` 与证据 `E`,如果 `P` 对 `n` 和 `E` 成立,那么它也对 `S (S n)` 和 `ev_SS n E` 成立。
-
-
-
-然而,当我们 `induction (H : even n)` 时,我们通常想证的性质并不包括「证据」,而是「满足该性质的这 `Type` 东西」的性质,
-比如:
-1. `nat` 上的一元关系 (性质) 证明 `nat` 的性质 : `ev_even : even n → ∃k, n = double k`
-2. `nat` 上的二元关系 证明 `nat` 上的二元关系 : `le_trans : ∀m n o, m ≤ n → n ≤ o → m ≤ o`
-3. 二元关系 `reg_exp × list T` 证明 二元关系 `reg_exp × T`: `in_re_match : ∀T (s : list T) (x : T) (re : reg_exp), s =~ re → In x s → In x (re_chars re).`
-都是如此,
-
-因此我们也不希望生成的归纳假设是包括证据的...
-原来的归纳假设:
-
- ∀P : (∀n : nat, even n → Prop),
- ... →
- ∀(n : nat) (E : even n), P n E
-
-可以被简化为只对 `nat` 参数化的归纳假设:
-
- ∀P : nat → Prop,
- ... →
- ∀(n : nat) (E: even n), P n
-
-
-因此 coq 生成的归纳原理也是不包括证据的。注意 `P` 丢弃了参数 `E`:
-
-```coq
-even_ind : ∀ P : nat -> Prop,
- P 0 →
- (∀ n : nat, even n -> P n -> P (S (S n))) →
- ∀ n : nat, even n -> P n *)
-```
-
-用人话说就是:
-1. P 对 0 成立,
-2. 对任意 n,如果 n 是偶数且 P 对 n 成立,那么 P 对 S (S n) 成立。
-=> P 对所有偶数成立
-
-
-### "General Parameter"
-
-```coq
-Inductive le : nat → nat → Prop :=
- | le_n : ∀ n, le n n
- | le_S : ∀ n m, (le n m) → (le n (S m)).
-```
-
-```coq
-Inductive le (n:nat) : nat → Prop :=
- | le_n : le n n
- | le_S m (H : le n m) : le n (S m).
-```
-
-两者虽然等价,但是共同的 `∀ n` 可以被提升为 typecon 的参数, i.e. "General Parameter" to the whole definition.
-
-其生成的归纳假设也会不同: (after renaming)
-
-```coq
-le_ind : ∀ P : nat -> nat -> Prop,
- (∀ n : nat, P n n) ->
- (∀ n m : nat, le n m -> P n m -> P n (S m)) ->
- ∀ n m : nat, le n m -> P n m
-```
-
-```coq
-le_ind : ∀ (n : nat) (P : nat -> Prop),
- P n ->
- (∀ m : nat, n <= m -> P m -> P (S m)) ->
- ∀ m : nat, n <= m -> P m
-```
-
-The 1st one looks more symmetric but 2nd one is easier (for proving things).
-
diff --git a/_posts/read_sf_lf/2019-01-11-sf-lf-11-rel.md b/_posts/read_sf_lf/2019-01-11-sf-lf-11-rel.md
deleted file mode 100644
index c319e07cbb2..00000000000
--- a/_posts/read_sf_lf/2019-01-11-sf-lf-11-rel.md
+++ /dev/null
@@ -1,265 +0,0 @@
----
-title: "「SF-LC」11 Rel"
-subtitle: "Logical Foundations - Properties of Relations"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - LF (逻辑基础)
- - SF (软件基础)
- - Coq
- - 笔记
----
-
-> relation 与injective/surjective/bijective function 等相关的知识在 `5. Tactics` 里,为了避免每次都要 `grep` 我在这里写一下。
-
-
-Relations
----------
-
-
-### Recalling [Relation](https://en.wikipedia.org/wiki/Finitary_relation)
-
-from FCT/TAPL/Wiki...
-> a possible connection between the components of a k-tuple.
-
-I have been long confused with _Unary Relations vs. Binary Relation on the Same Set (homogeneous relation)_
-I thought they were same...but turns out they are totally different!
-
-
-#### Unary/1-place relation is __Predicate__ or __Property__!
-
-Either defined via set `X ⊆ P` or `x ∈ P`,
-or defined via function `P : X -> Bool` or `P : X -> {⊥, ⊤}`.
-(usually used in Math. Logic)
-
-Property = Indicator Fn = characteristic Fn = Boolean Predicate Fn = Predicate
--
--
-
-
-#### [Binary Relation/2-place relation](https://en.wikipedia.org/wiki/Binary_relation)
-
-Defined via two sets : `R ⊆ X × Y` or `x, y ∈ R` or `xRy`. (where `x ∈ X, y ∈ Y`.)
-or via function `R: X × Y -> Bool`.
-
-##### [Homogeneous Relation 同类(的)关系](https://en.wikipedia.org/wiki/Binary_relation#Homogeneous_relation)
-
-Specifically! when `X = Y`, is called a _homogeneous relation_:
-
-Noticed that we are still concerning relations of __2 elements__!!, but they are from the same Set!
-(while 1-place relation concerning only 1 element.)
-
- R ⊆ X × X
- xRy where x ∈ X, y ∈ X
-
-it's written/spoken _Binary_ relation __on/over__ Set `X`.
-Properties e.g. _reflexive, symmetric, transitive_, are all properties of "Homogeneous Relation"!
-
-
-
-### Back to Coq
-
-"relation" is a general idea. but in Coq standard lib it means "binary relation on _a_ set X"
-> Coq `identifier` relation will always refer to a binary relation between some set and itself.
-
-it's defined as _a family of Prop parameterized by two elements of `X`_:
-
-```coq
-Definition relation (X: Type) := X → X → Prop.
-
-Check le : nat -> nat -> Prop.
-Check le : relation nat.
-```
-
-
-
-
-Basic Properties
-----------------
-
-> ways to classifying relations.
-> so theorems can be proved generically about certain sorts of relations
-
-It's pretty fun to see all mathematical things defined in Coq!
-(much more constructive)
-
-
-### [Partial Function](https://en.wikipedia.org/wiki/Partial_function)
-
-> function is defined as _a special kind of binary relation_.
-
-```coq
-Definition partial_function {X: Type} (R: relation X) :=
- ∀x y1 y2 : X, R x y1 → R x y2 → y1 = y2.
-```
-
-meaning that foreach input `x ∈ X`, there is a _unique_ `y ∈ Y` corresponded.
-
-But this only establish a _partial function_.
-because it doesn't say anything about _totality_,
-to define _total function_, we require `f` map every `x ∈ X`.
-
-- [Total "Relation"](https://en.wikipedia.org/wiki/Connex_relation)
-
- ∀x ∀y (x ∈ X ∧ y ∈ X) ⇒ (xRy ∨ yRx).
-
-totally different with _total function_ but ask the binary relation holds between every pair.
-
-
-### Reflexive
-
-```coq
-Definition transitive {X: Type} (R: relation X) :=
- ∀a b c : X, (R a b) → (R b c) → (R a c).
-```
-
-### Transitive
-
-```coq
-Definition transitive {X: Type} (R: relation X) :=
- ∀a b c : X, (R a b) → (R b c) → (R a c).
-```
-
-### Symmetric & Antisymmetric
-
-```coq
-Definition symmetric {X: Type} (R: relation X) :=
- ∀a b : X, (R a b) → (R b a).
-
-Definition antisymmetric {X: Type} (R: relation X) :=
- ∀a b : X, (R a b) → (R b a) → a = b.
-```
-
-#### Antisymmetric vs Asymmetric vs Non-symmetric (反对称 vs. 非对称 vs. 不-对称)
-
-A relation is __asymmetric__ if and only if it is both antisymmetric and irreflexive
-e.g. `<=` is neither symmetric nor asymmetric, but it's antisymmetric...
-反对称: 可以自反 (只能 reflexive 时对称) `<=`
-非对称: 不能自反 `<`
-不对称: 不是对称
-
-
-
-### Equivalence
-
-```coq
-Definition equivalence {X:Type} (R: relation X) :=
- (reflexive R) ∧ (symmetric R) ∧ (transitive R).
-```
-
-
-### Partial Orders
-
-A partial order under which _every pair_ of elements is _comparable_ is called a __total order__ or __linear order__
-In the Coq standard library it's called just `order` for short:
-
-```coq
-Definition order {X:Type} (R: relation X) :=
- (reflexive R) ∧ (antisymmetric R) ∧ (transitive R).
-```
-
-
-### Preorders
-
-a.k.a quasiorder
-
-The _subtyping_ relations are usually preorders.
-> (TAPL p185) because of the record permutation rule...there are many pairs of distinct types where each is a subtype of the other.
-
-```coq
-Definition preorder {X:Type} (R: relation X) :=
- (reflexive R) ∧ (transitive R).
-```
-
-
-
-
-
-Reflexive, Transitive Closure
------------------------------
-
-> [Closure](https://en.wikipedia.org/wiki/Closure_(mathematics)#Binary_relation_closures)
-> Closure can be considered as [Operations on bin-rel](https://en.wikipedia.org/wiki/Binary_relation#Operations_on_binary_relations)
-
-As properties such as _reflexive, transitive_,
-the __blah blah Closure__ are only talking about "homogeneous relations" i.e., Relation on a SINGLE set.
-
-
-### [Reflexive Closure](https://en.wikipedia.org/wiki/Reflexive_closure)
-
-Def. smallest reflexive relation on `X` containing `R`.
-
-Operationally, as a `=` operator on a binary relation `R`:
-
- R⁼ = R ∪ { (x, x) | x ∈ X }
-
-and this obviously satisfy `R⁼ ⊇ R`.
-
-
-### [Transitive Closure](https://en.wikipedia.org/wiki/Transitive_closure)
-
-Def. smallest transitive relation on `X` containing `R`.
-
-Operationally, as a `+` operator on a binary relation `R`:
-
- R+ = R ∪ { (x1,xn) | n > 1 ∧ (x1,x2), ..., (xn-1,xn) ∈ R }
-
-We can also constructively and inductively definition using `R^i` where `i = i-transitivity away`.
-
-
-### Reflexive, Transitive Closure
-
- R* = R⁼ ∪ R+
-
-
-
-### Why is it useful?
-
-> The idea is that _a relation is extended_ s.t.
->_the derived relation has the (reflexsive and) transitive property._ -- Prof. Arthur
-
-> e.g.
-> the "descendant" relation is the transitive closure of the "child" relation,
-> the "derives-star (⇒⋆)" relation is the reflexive-transitive closure of the "derives (⇒)" relation.
-> the "ε-closure" relation is the reflexive-transitive closure of the "ε-transition" relation.
-> the "Kleene-star (Σ⋆)" relation is the reflexive-transitive closure of the "concatentation" relation.
-
-Another way is to think them as "set closed under some operation".
-
-
-### Back to Coq
-
-```coq
-Inductive clos_refl_trans {A: Type} (R: relation A) : relation A :=
- | rt_step x y (H : R x y) : clos_refl_trans R x y (** original relation **)
- | rt_refl x : clos_refl_trans R x x (** reflexive xRx **)
- | rt_trans x y z (** transitive xRy ∧ yRz → xRz **)
- (Hxy : clos_refl_trans R x y)
- (Hyz : clos_refl_trans R y z) :
- clos_refl_trans R x z.
-```
-
-The above version will generate 2 IHs in `rt_trans` case. (since the proof tree has 2 branches).
-
-Here is a better "linked-list"-ish one. (we will exclusively use this style)
-
-```coq
-Inductive clos_refl_trans_1n {A : Type} (R : relation A) (x : A) : A → Prop :=
- | rt1n_refl : clos_refl_trans_1n R x x
- | rt1n_trans (y z : A)
- (Hxy : R x y)
- (Hrest : clos_refl_trans_1n R y z) :
- clos_refl_trans_1n R x z.
-```
-
-In later chapter, we will define a decorator `multi` that can take any binary relation on a set and return its closure relation:
-
-```coq
-Inductive multi (X : Type) (R : relation X) : relation X :=
- | multi_refl : forall x : X, multi R x x
- | multi_step : forall x y z : X, R x y -> multi R y z -> multi R x z
-```
-
-We name it `step`, standing for _doing one step of this relation_, and then we still have the rest (sub-structure) satisfied the closure relation.
diff --git a/_posts/read_sf_lf/2019-01-12-sf-lf-12-imp.md b/_posts/read_sf_lf/2019-01-12-sf-lf-12-imp.md
deleted file mode 100644
index 94fae0aece9..00000000000
--- a/_posts/read_sf_lf/2019-01-12-sf-lf-12-imp.md
+++ /dev/null
@@ -1,739 +0,0 @@
----
-title: "「SF-LC」12 Imp"
-subtitle: "Logical Foundations - Simple Imperative Programs"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - LF (逻辑基础)
- - SF (软件基础)
- - Coq
- - 笔记
----
-
-
-```pascal
-Z ::= X;;
-Y ::= 1;;
-WHILE ~(Z = 0) DO
- Y ::= Y * Z;;
- Z ::= Z - 1
-END
-```
-
-A weird convention through out all IMP is:
-- `a-`: arith
-- `b-`: bool
-- `c-`: command
-
-
-
-Arithmetic and Boolean Expression
----------------------------------
-
-### Abstract Syntax
-
-```coq
-a ::=
- | nat
- | a + a
- | a - a
- | a * a
-b ::=
- | true
- | false
- | a = a
- | a ≤ a
- | ¬b
- | b && b
-```
-
-```coq
-Inductive aexp : Type :=
- | ANum (n : nat)
- | APlus (a1 a2 : aexp)
- | AMinus (a1 a2 : aexp)
- | AMult (a1 a2 : aexp).
-Inductive bexp : Type :=
- | BTrue
- | BFalse
- | BEq (a1 a2 : aexp)
- | BLe (a1 a2 : aexp)
- | BNot (b : bexp)
- | BAnd (b1 b2 : bexp).
-```
-
-### Evaluation
-
-TODO: is this considered as "denotational semantics"?
-
-```coq
-Fixpoint aeval (a : aexp) : nat :=
- match a with
- | ANum n ⇒ n
- | APlus a1 a2 ⇒ (aeval a1) + (aeval a2)
- | AMinus a1 a2 ⇒ (aeval a1) - (aeval a2)
- | AMult a1 a2 ⇒ (aeval a1) * (aeval a2)
- end.
-Fixpoint beval (b : bexp) : bool :=
- match b with
- | BTrue ⇒ true
- | BFalse ⇒ false
- | BEq a1 a2 ⇒ (aeval a1) =? (aeval a2)
- | BLe a1 a2 ⇒ (aeval a1) <=? (aeval a2)
- | BNot b1 ⇒ negb (beval b1)
- | BAnd b1 b2 ⇒ andb (beval b1) (beval b2)
- end.
-```
-
-Supposed we have a `Fixpoint optimize_0plus (a:aexp) : aexp`
-```coq
-Theorem optimize_0plus_sound: ∀a,
- aeval (optimize_0plus a) = aeval a.
-```
-
-During the proof, many cases of `destruct aexp` are similar!
-Recursive cases such as `APlus, AMinus, AMult` all require duplicated `IH` application.
-
-> From Coq Intensive:
-when we `simpl` on `APlus` case. it's not "simplified" but give us a pattern matching.
-That's a hint that we need to furthur case analysis by `destruct n` as `0` case or `_` case.
-
-
-
-
-
-
-Coq Automation
---------------
-
-### Tacticals
-
-> "higher-order tactics".
-
-#### `try T` and `;` tacticals
-
-> if `T` fail, `try T` successfully does nothing at all
-
-> `T;T'` : performs `T'` on each subgoal generated by `T`.
-
-Super blindly but useful: (only leave the "interesting" one.)
-
-```coq
-induction a;
- (* Most cases follow directly by the IH... *)
- try (simpl; rewrite IHa1; rewrite IHa2; reflexivity).
- (* ... or are immediate by definition *)
- try reflexivity.
-```
-
-`.` is the atomic
-`;` cannot be stepped into...
-
-#### `T; [T1 | T2 | ... | Tn]` tacticals
-
-> general form or `;`
-> `T;T'` is shorthand for: `T; [T' | T' | ... | T']`.
-
-
-#### `repeat` tacticals
-
-```coq
-Theorem In10 : In 10 [1;2;3;4;5;6;7;8;9;10].
-Proof.
- repeat (try (left; reflexivity); right). Qed.
-```
-
-- stop when it fails
-- always succeeds, then loop forever! e.g. `repeat simpl`
-
-> This does not affect Coq's logical consistency,
-> construction process diverges means we have failed to construct a proof, not that we have constructed a wrong one.
-
-
-### Defining New Tactic Notations
-
-- `Tactic Notation`: syntax extension for tactics (good for simple _macros_)
-
-```coq
-Tactic Notation "simpl_and_try" tactic(c) :=
- simpl; try c.
-```
-
-- `Ltac`: scripting language for tactics (good for more sophisticated proof engineering)
-- OCaml tactic scripting API (for wizards)
-
-### The `omega` Tactic
-
-> _Presburger arithmetic_
-- arith, equality, ordering, logic connectives
-- `O(doubly expontential)`
-
-
-### A Few More Handy Tactics
-
-- `clear H`
-- `subst x`, `subst`
-- `rename ... into ...` (change auto-generated name that we don't like...)
-
-the below three are very useful in Coq Automation (w/ `try T; T'`)
-
-- `assumption`
-- `contradiction`
-- `constructor` (try to `apply` all constructors.
- Problem: might have multiple constructors applicable but some fail)
-
-
-
-
-
-
-Evaluation as a Relation
-------------------------
-
-Defined as Binary relation on `aexp × nat`.
-Exactly _Big Step / Structural Operational Semantics_.
-
-More flexible than `Fixpoint` (computation, or _Denotational_).
-...Since we can operate on `Inductive` as data I guess?
-...and we can also `induction` on the relation.
-...and when things getting more and more "un-computable" _(see below)_.
-
-> 译注:求值关系不满足对称性,因为它是有方向的。
-
-```coq
-Inductive aevalR : aexp → nat → Prop :=
- | E_ANum n :
- aevalR (ANum n) n
- | E_APlus (e1 e2: aexp) (n1 n2: nat) :
- aevalR e1 n1 →
- aevalR e2 n2 →
- aevalR (APlus e1 e2) (n1 + n2)
- | E_AMinus (e1 e2: aexp) (n1 n2: nat) :
- aevalR e1 n1 →
- aevalR e2 n2 →
- aevalR (AMinus e1 e2) (n1 - n2)
- | E_AMult (e1 e2: aexp) (n1 n2: nat) :
- aevalR e1 n1 →
- aevalR e2 n2 →
- aevalR (AMult e1 e2) (n1 * n2).
-```
-> Noticed now we now define `inductive` in a mixed style:
-> some arg is before `:` (named), some are after `:` (anonymous).
-
-We could do this as well
-
-```coq
- | E_APlus (e1 e2: aexp) (n1 n2: nat)
- (H1 : aevalR e1 n1)
- (H2 : aevalR e2 n2) :
- aevalR (APlus e1 e2) (n1 + n2)
-```
-
-`Reserved Notation` allow us using the notation during the definition!
-
-```coq
-Reserved Notation "e '\\' n" (at level 90, left associativity).
-
-Inductive aevalR : aexp → nat → Prop :=
- | E_ANum (n : nat) :
- (ANum n) \\ n
- | E_APlus (e1 e2 : aexp) (n1 n2 : nat) :
- (e1 \\ n1) →
- (e2 \\ n2) →
- (APlus e1 e2) \\ (n1 + n2)
- | E_AMinus (e1 e2 : aexp) (n1 n2 : nat) :
- (e1 \\ n1) →
- (e2 \\ n2) →
- (AMinus e1 e2) \\ (n1 - n2)
- | E_AMult (e1 e2 : aexp) (n1 n2 : nat) :
- (e1 \\ n1) →
- (e2 \\ n2) →
- (AMult e1 e2) \\ (n1 * n2)
-
- where "e '\\' n" := (aevalR e n) : type_scope.
-```
-
-I hated this infix `\\` notation...it tries to mimic `⇓` (double down arrow).
-
- e1 \\ n1
- e2 \\ n2
- -------------------- (E_APlus)
- APlus e1 e2 \\ n1+n2
-
-is actually:
-
- e1 ⇓ n1
- e2 ⇓ n2
- -------------------- (E_APlus)
- APlus e1 e2 ⇓ n1+n2
-
-
-> Coq Intensive:
-If you have two variables above the line. Think about if you need `generalize dependent`.
-
-
-### Computational vs. Relational Definitions *INTERESTING*
-
-In some cases, relational definition are much better than computational (a.k.a. functional).
-> for situations, where thing beingdefined is not easy to express as a function (or not a function at all)
-
-#### case 1 - safe division
-
-```coq
-Inductive aexp : Type :=
-| ADiv (a1 a2 : aexp). (* <--- NEW *)
-```
-- functional: how to return `ADiv (ANum 5) (ANum 0)`? probably has to be `option` (Coq is total!)
-- relational: `(a1 \\ n1) → (a2 \\ n2) → (n2 > 0) → (mult n2 n3 = n1) → (ADiv a1 a2) \\ n3`.
- - we can add a constraint `(n2 > 0)`.
-
-#### case 2 - non-determinism
-
-```coq
-Inductive aexp : Type :=
-| AAny (* <--- NEW *)
-```
-- functional: not a deterministic function...
-- relational: `E_Any (n : nat) : AAny \\ n` ... just say it's the case.
-
-
-Nonetheless, functional definition is good at:
-1. by definition deterministic (need proof in relational case)
-2. take advantage of Coq's computation engine.
-3. function can be directly "extracted" from Gallina to OCaml/Haskell
-
-In large Coq developments:
-1. given _both_ styles
-2. a lemma stating they coincise (等价)
-
-
-
-
-
-
-Expressions with Variables
---------------------------
-
-### State (Environment) 环境
-
-> A _machine state_ (or just _state_) represents the current values of _all variables_ at some point in the execution of a program.
-
-```coq
-Definition state := total_map nat.
-```
-
-
-### Syntax
-
-```coq
-Inductive aexp : Type :=
- | AId (x : string) (* <--- NEW *)
-```
-
-
-### Notations & Coercisons -- "meta-programming" and AST quasi-quotation
-
-#### Quasi-quotation
-
-[OCaml PPX & AST quasi-quotation](https://whitequark.org/blog/2014/04/16/a-guide-to-extension-points-in-ocaml/)
-
-> quasi-quotation enables one to introduce symbols that stand for a linguistic expression in a given instance and are used as that linguistic expression in a different instance.
-
-e.g. in above OCaml example, you wrote `%expr 2 + 2` and you get `[%expr [%e 2] + [%e 2]]`.
-
-
-#### Coq's _Notation Scope_ + Coercision == built-in Quasi-quotation
-
-```coq
-(** Coercision for constructors **)
-Coercion AId : string >-> aexp.
-Coercion ANum : nat >-> aexp.
-
-(** Coercision for functions **)
-Definition bool_to_bexp (b : bool) : bexp := if b then BTrue else BFalse.
-Coercion bool_to_bexp : bool >-> bexp.
-
-(** Scoped Notation **)
-Bind Scope imp_scope with aexp.
-Bind Scope imp_scope with bexp.
-
-(** the Extension Point token **)
-Delimit Scope imp_scope with imp.
-
-(** now we can write... **)
-Definition example_aexp := (3 + (X * 2))%imp : aexp.
-Definition example_aexp : aexp := (3 + (X * 2))%imp.
-Definition example_aexp := (3 + (X * 2))%imp. (* can be inferred *)
-```
-
-
-### Evaluation w/ State (Environment)
-
-Noticed that the `st` has to be threaded all the way...
-
-```coq
-Fixpoint aeval (st : state) (a : aexp) : nat :=
- match a with
- | AId x ⇒ st x (* <--- NEW *) (** lookup the environment **)
- ...
-
-Fixpoint beval (st : state) (b : bexp) : bool := ...
-
-Compute (aeval (X !-> 5) (3 + (X * 2))%imp). (** ===> 13 : nat **)
-```
-
-
-
-
-
-Commands (Statement)
---------------------
-
-```bnf
-c ::= SKIP | x ::= a | c ;; c | TEST b THEN c ELSE c FI | WHILE b DO c END
-```
-
-> we use `TEST` to avoid conflicting with the `if` and `IF` notations from the standard library.
-
-```coq
-Inductive com : Type :=
- | CSkip
- | CAss (x : string) (a : aexp)
- | CSeq (c1 c2 : com)
- | CIf (b : bexp) (c1 c2 : com)
- | CWhile (b : bexp) (c : com).
-```
-
-`notation` magics:
-
-```coq
-Bind Scope imp_scope with com.
-Notation "'SKIP'" := CSkip : imp_scope.
-Notation "x '::=' a" := (CAss x a) (at level 60) : imp_scope.
-Notation "c1 ;; c2" := (CSeq c1 c2) (at level 80, right associativity) : imp_scope.
-Notation "'WHILE' b 'DO' c 'END'" := (CWhile b c) (at level 80, right associativity) : imp_scope.
-Notation "'TEST' c1 'THEN' c2 'ELSE' c3 'FI'" := (CIf c1 c2 c3) (at level 80, right associativity) : imp_scope.
-```
-
-
-### Unset Notations
-
-```coq
-Unset Printing Notations. (** e1 + e2 -> APlus e1 e2 **)
-Set Printing Coercions. (** n -> (ANum n) **)
-Set Printing All.
-```
-
-### The `Locate` command
-
-```coq
-Locate "&&".
-
-(** give you two, [Print "&&"] only give you the default one **)
-Notation
-"x && y" := andb x y : bool_scope (default interpretation)
-"x && y" := BAnd x y : imp_scope
-```
-
-
-
-
-
-
-
-Evaluating Commands
--------------------
-
-Noticed that to _use quasi-quotation in pattern matching_, we need
-
-```coq
-Open Scope imp_scope.
-...
- | x ::= a1 => (** CAss x a1 **)
- | c1 ;; c2 => (** CSeq c1 c1 **)
-...
-Close Scope imp_scope.
-```
-
-
-An infinite loop (the `%imp` scope is inferred)
-
-```coq
-Definition loop : com :=
- WHILE true DO
- SKIP
- END.
-```
-
-> The fact that `WHILE` loops don't necessarily terminate makes defining an evaluation function tricky...
-
-
-### Evaluation as function (FAIL)
-
-In OCaml/Haskell, we simply recurse, but In Coq
-
-```coq
-| WHILE b DO c END => if (beval st b)
- then ceval_fun st (c ;; WHILE b DO c END)
- else st
-(** Cannot guess decreasing argument of fix **)
-```
-
-Well, if Coq allowed (potentially) non-terminating, the logic would be inconsistent:
-
-```coq
-Fixpoint loop_false (n : nat) : False := loop_false n. (** False is proved! **)
-```
-
-#### Step-Indexed Evaluator (SUCC)
-
-Chapter `ImpCEvalFun` provide some workarounds to make functional evalution works:
-1. _step-indexed evaluator_, i.e. limit the recursion depth. (think about Depth-Limited Search).
-2. return `option` to tell if it's a normal or abnormal termination.
-3. use `LETOPT...IN...` to reduce the "optional unwrapping" (basicaly Monadic binding `>>=`!)
- - this approach of `let-binding` became so popular in ML family.
-
-
-### Evaluation as Relation (SUCC)
-
-Again, we are using some fancy notation `st=[c]=>st'` to mimic `⇓`:
-In both PLT and TaPL, we are almost exclusively use Small-Step, but in PLC, Big-Step were used:
-
- beval st b1 = true
- st =[ c1 ]=> st'
- --------------------------------------- (E_IfTrue)
- st =[ TEST b1 THEN c1 ELSE c2 FI ]=> st'
-
-is really:
-
- H; b1 ⇓ true
- H; c1 ⇓ H'
- ---------------------------------- (E_IfTrue)
- H; TEST b1 THEN c1 ELSE c2 FI ⇓ H'
-
-```coq
-Reserved Notation "st '=[' c ']⇒' st'" (at level 40).
-Inductive ceval : com → state → state → Prop :=
-...
-| E_Seq : ∀c1 c2 st st' st'',
- st =[ c1 ]⇒ st' →
- st' =[ c2 ]⇒ st'' →
- st =[ c1 ;; c2 ]⇒ st''
-| E_IfTrue : ∀st st' b c1 c2,
- beval st b = true →
- st =[ c1 ]⇒ st' →
- st =[ TEST b THEN c1 ELSE c2 FI ]⇒ st'
-...
- where "st =[ c ]⇒ st'" := (ceval c st st').
-```
-
-By definition evaluation as relation (_in `Type` level_),
-we need to construct _proofs_ (_terms_) to define example.
-
-...noticed that in the definition of relaiton `ceval`, we actually use the computational `aevel`, `beval`..
-...noticed that we are using explicit `∀` style rather than constructor argument style (for IDK reason). They are the same!
-
-
-
-### Determinism of Evaluation
-
-> Changing from a computational to a relational definition of evaluation is a good move because it frees us from the artificial requirement that evaluation should be a total function
-> 求值不再必须是全函数
-
-> But it also raises a question: Is the second definition of evaluation really a partial function?
-> 这个定义真的是偏函数吗?(这里的重点在于 偏函数 要求 right-unique 即 deterministic)
-
-we can prove:
-
-```coq
-Theorem ceval_deterministic: ∀c st st1 st2,
- st =[ c ]⇒ st1 →
- st =[ c ]⇒ st2 →
- st1 = st2.
-Proof. ...
-```
-
-
-
-
-
-
-
-
-Reasoning About Imp Programs
-----------------------------
-
-### Case `plus2_spec`
-
-```coq
-Theorem plus2_spec : ∀st n st',
- st X = n →
- st =[ plus2 ]⇒ st' →
- st' X = n + 2.
-Proof.
- intros st n st' HX Heval.
-```
-
-this looks much better as inference rules:
-
- H(x) = n
- H; x := x + 2 ⇓ H'
- --------------------- (plus2_spec)
- H'(x) = n + 2
-
-By `inversion` on the Big Step eval relation, we can _expand_ one step of `ceval`
-(对 derivation tree 的 expanding 过程其实就是展开我们所需的计算步骤的过程)
-
- st : string -> nat
- =================================
- (X !-> st X + 2; st) X = st X + 2
-
-In inference rule:
-
- H : string → nat
- ================================
- (x ↦ H(x) + 2); H)(x) = H(x) + 2
-
-
-### Case `no_whiles_terminating`
-
-
-```coq
-Theorem no_whilesR_terminating_fail:
- forall c, no_whilesR c -> forall st, exists st', st =[ c ]=> st'.
-Proof.
- intros.
- induction H; simpl in *.
- - admit.
- - admit.
- - (* E_Seq *)
-```
-
-If we `intros st` before `induction c`,
-the IH would be _for particular `st`_ and too specific for `E_Seq`
-(It's actually okay for `TEST` since both branch derive from the same `st`)
-
-```coq
-IHno_whilesR1 : exists st' : state, st =[ c1 ]=> st'
-IHno_whilesR2 : exists st' : state, st =[ c2 ]=> st'
-============================
-exists st' : state, st =[ c1;; c2 ]=> st'
-```
-
-So we'd love to
-
-```coq
-generalize dependent st.
-induction H...
-- specialize (IHno_whilesR1 st). destruct IHno_whilesR1 as [st' Hc1].
- specialize (IHno_whilesR2 st'). destruct IHno_whilesR2 as [st'' Hc2]. (* specialize [IH2] with the existential of [IH1] **)
- exists st''.
- apply E_Seq with (st'); assumption.
-```
-
-
-
-
-
-
-Additional Exerciese
---------------------
-
-### Stack Compiler
-
-> Things that evaluate arithmetic expressions using stack:
-- Old HP Calculators
-- Forth, Postscript
-- Java Virtual Machine
-
-
-```
-infix:
- (2*3)+(3*(4-2))
-
-postfix:
- 2 3 * 3 4 2 - * +
-
-stack:
- [ ] | 2 3 * 3 4 2 - * +
- [2] | 3 * 3 4 2 - * +
- [3, 2] | * 3 4 2 - * +
- [6] | 3 4 2 - * +
- [3, 6] | 4 2 - * +
- [4, 3, 6] | 2 - * +
- [2, 4, 3, 6] | - * +
- [2, 3, 6] | * +
- [6, 6] | +
- [12] |
-```
-
-> Goal: compiler translates `aexp` into stack machine instructions.
-
-```coq
-Inductive sinstr : Type :=
-| SPush (n : nat)
-| SLoad (x : string) (* load from store (heap) *)
-| SPlus
-| SMinus
-| SMult.
-```
-
-### Correct Proof
-
-```coq
-Theorem s_compile_correct : forall (st : state) (e : aexp),
- s_execute st [] (s_compile e) = [ aeval st e ].
-```
-
-To prove this, we need a _stronger_ induction hypothesis (i.e. more general), so we state:
-
-```coq
-Theorem s_execute_theorem : forall (st : state) (e : aexp) (stack : list nat) (prog : list sinstr),
- s_execute st stack (s_compile e ++ prog) = s_execute st ((aeval st e) :: stack) prog.
-```
-
-and go through!
-
-
-
-
-### IMP `Break/Continue`
-
-```coq
-Inductive result : Type :=
- | SContinue
- | SBreak.
-```
-
-The idea is that we can add a _signal_ to notify the loop!
-
-Fun to go through!
-
-
-
-
-
-
-## Slide Q & A
-
-`st =[c1;;c2] => st'`
-
-- there would be intermediate thing after inversion so... we need _determinism_ to prove this!
- - (It won't be even true in undetermincy)
-
-- the `WHILE` one (would diverge)
- - true...how to prove?
- - induction on derivation...!
- - show contradiction for all cases
-- to prove `¬(∃st', ...)`, we intro the existentials and prove the `False`.
-
-
-
-### `Auto`
-
-`auto` includes `try`
-
-1. `Proof with auto.`
-2. `Set Intro Auto`
diff --git a/_posts/read_sf_lf/2019-01-13-sf-lf-13-imp-parser.md b/_posts/read_sf_lf/2019-01-13-sf-lf-13-imp-parser.md
deleted file mode 100644
index 2c70989edad..00000000000
--- a/_posts/read_sf_lf/2019-01-13-sf-lf-13-imp-parser.md
+++ /dev/null
@@ -1,144 +0,0 @@
----
-title: "「SF-LC」13 ImpParser"
-subtitle: "Logical Foundations - Lexing And Parsing In Coq"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - LF (逻辑基础)
- - SF (软件基础)
- - Coq
- - 笔记
----
-
-> the parser relies on some "monadic" programming idioms
-
-basically, _parser combinator_ (But 非常麻烦 in Coq)
-
-
-Lex
----
-
-```coq
-Inductive chartype := white | alpha | digit | other.
-
-Definition classifyChar (c : ascii) : chartype :=
- if isWhite c then white
- else if isAlpha c then alpha
- else if isDigit c then digit
- else other.
-
-
-Definition token := string.
-```
-
-
-
-
-Syntax
-------
-
-带 error msg 的 `option`:
-
-```coq
-Inductive optionE (X:Type) : Type :=
- | SomeE (x : X)
- | NoneE (s : string). (** w/ error msg **)
-
-Arguments SomeE {X}.
-Arguments NoneE {X}.
-```
-
-
-Monadic:
-
-```coq
-Notation "' p <- e1 ;; e2"
- := (match e1 with
- | SomeE p ⇒ e2
- | NoneE err ⇒ NoneE err
- end)
- (right associativity, p pattern, at level 60, e1 at next level).
-
-Notation "'TRY' ' p <- e1 ;; e2 'OR' e3"
- := (match e1 with
- | SomeE p ⇒ e2
- | NoneE _ ⇒ e3
- end)
- (right associativity, p pattern,
- at level 60, e1 at next level, e2 at next level).
-```
-
-
-```coq
-Definition parser (T : Type) :=
- list token → optionE (T * list token).
-```
-
-```haskell
-newtype Parser a = Parser (String -> [(a,String)])
-
-instance Monad Parser where
- -- (>>=) :: Parser a -> (a -> Parser b) -> Parser b
- p >>= f = P (\inp -> case parse p inp of
- [] -> []
- [(v,out)] -> parse (f v) out)
-```
-
-
-### combinator `many`
-
-Coq vs. Haskell
-1. explicit recursion depth, .e. _step-indexed_
-2. explicit exception `optionE` (in Haskell, it's hidden behind the `Parser` Monad as `[]`)
-3. explicit string state `xs` (in Haskell, it's hidden behind the `Parser` Monad as `String -> String`)
-4. explicit `acc`epted token (in Haskell, it's hidden behind the `Parser` Monad as `a`, argument)
-
-```coq
-Fixpoint many_helper {T} (p : parser T) acc steps xs :=
- match steps, p xs with
- | 0, _ ⇒
- NoneE "Too many recursive calls"
- | _, NoneE _ ⇒
- SomeE ((rev acc), xs)
- | S steps', SomeE (t, xs') ⇒
- many_helper p (t :: acc) steps' xs'
- end.
-
-Fixpoint many {T} (p : parser T) (steps : nat) : parser (list T) :=
- many_helper p [] steps.
-```
-
-```haskell
-manyL :: Parser a -> Parser [a]
-manyL p = many1L p <++ return [] -- left biased OR
-
-many1L :: Parser a -> Parser [a]
-many1L p = (:) <$> p <*> manyL p
--- or
-many1L p = do x <- p
- xs <- manyL p
- return (x : xs)
-```
-
-
-### `ident`
-
-
-```coq
-Definition parseIdentifier (xs : list token) : optionE (string * list token) :=
- match xs with
- | [] ⇒ NoneE "Expected identifier"
- | x::xs' ⇒ if forallb isLowerAlpha (list_of_string x)
- then SomeE (x, xs')
- else NoneE ("Illegal identifier:'" ++ x ++ "'")
- end.
-```
-
-```haskell
-ident :: Parser String
-ident = do x <- lower
- xs <- many alphanum
- return (x:xs)
-```
diff --git a/_posts/read_sf_lf/2019-01-14-sf-lf-14-imp-ceval.md b/_posts/read_sf_lf/2019-01-14-sf-lf-14-imp-ceval.md
deleted file mode 100644
index d370371096c..00000000000
--- a/_posts/read_sf_lf/2019-01-14-sf-lf-14-imp-ceval.md
+++ /dev/null
@@ -1,104 +0,0 @@
----
-title: "「SF-LC」14 ImpCEvalFun"
-subtitle: "Logical Foundations - An Evaluation Function For Imp"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - LF (逻辑基础)
- - SF (软件基础)
- - Coq
- - 笔记
----
-
-
-Step-Indexed Evaluator
-----------------------
-
-...Copied from `12-imp.md`:
-
-> Chapter `ImpCEvalFun` provide some workarounds to make functional evalution works:
-> 1. _step-indexed evaluator_, i.e. limit the recursion depth. (think about _Depth-Limited Search_).
-> 2. return `option` to tell if it's a normal or abnormal termination.
-> 3. use `LETOPT...IN...` to reduce the "optional unwrapping" (basicaly Monadic binding `>>=`!)
-> this approach of `let-binding` became so popular in ML family.
-
-
-```coq
-Notation "'LETOPT' x <== e1 'IN' e2"
- := (match e1 with
- | Some x ⇒ e2
- | None ⇒ None
- end)
- (right associativity, at level 60).
-
-Open Scope imp_scope.
-Fixpoint ceval_step (st : state) (c : com) (i : nat)
- : option state :=
- match i with
- | O ⇒ None (* depth-limit hit! *)
- | S i' ⇒
- match c with
- | SKIP ⇒
- Some st
- | l ::= a1 ⇒
- Some (l !-> aeval st a1 ; st)
- | c1 ;; c2 ⇒
- LETOPT st' <== ceval_step st c1 i' IN (* option bind *)
- ceval_step st' c2 i'
- | TEST b THEN c1 ELSE c2 FI ⇒
- if (beval st b)
- then ceval_step st c1 i'
- else ceval_step st c2 i'
- | WHILE b1 DO c1 END ⇒
- if (beval st b1)
- then LETOPT st' <== ceval_step st c1 i' IN
- ceval_step st' c i'
- else Some st
- end
- end.
-Close Scope imp_scope.
-```
-
-
-
-Relational vs. Step-Indexed Evaluation
---------------------------------------
-
-Prove `ceval_step` is equiv to `ceval`
-
-
-### ->
-
-```coq
-Theorem ceval_step__ceval: forall c st st',
- (exists i, ceval_step st c i = Some st') ->
- st =[ c ]=> st'.
-```
-
-The critical part of proof:
-
-- `destruct` for the `i`.
-- `induction i`, generalize on all `st st' c`.
- 1. `i = 0` case contradiction
- 2. `i = S i'` case;
- `destruct c`.
- - `destruct (ceval_step ...)` for the `option`
- 1. `None` case contradiction
- 2. `Some` case, use induction hypothesis...
-
-
-### <-
-
-```coq
-Theorem ceval__ceval_step: forall c st st',
- st =[ c ]=> st' ->
- exists i, ceval_step st c i = Some st'.
-Proof.
- intros c st st' Hce.
- induction Hce.
-```
-
-
-
diff --git a/_posts/read_sf_lf/2019-01-15-sf-lf-15-extraction.md b/_posts/read_sf_lf/2019-01-15-sf-lf-15-extraction.md
deleted file mode 100644
index 9e5d542d613..00000000000
--- a/_posts/read_sf_lf/2019-01-15-sf-lf-15-extraction.md
+++ /dev/null
@@ -1,156 +0,0 @@
----
-title: "「SF-LC」15 Extraction"
-subtitle: "Logical Foundations - Extracting ML From Coq"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - LF (逻辑基础)
- - SF (软件基础)
- - Coq
- - 笔记
----
-
-
-Basic Extraction
-----------------
-
-- OCaml (most mature)
-- Haskell (mostly works)
-- Scheme (a bit out of date)
-
-```coq
-Extraction "imp1.ml" ceval_step.
-```
-
-When Coq processes this command:
-
-```
-The file imp1.ml has been created by extraction.
-The file imp1.mli has been created by extraction.
-```
-
-
-
-Controlling Extraction of Specific Types
-----------------------------------------
-
-如果不做任何处理的话...生成的 `ml` 里的 `nat` 则都会是 Church Numeral...
-
-> We can tell Coq how to extract certain `Inductive` definitions to specific OCaml types.
-> we must say:
-> 1. how the Coq type itself should be represented in OCaml
-> 2. how each constructor should be translated
-
-```coq
-Extract Inductive bool ⇒ "bool" [ "true" "false" ].
-```
-
-> also, for non-enumeration types (where the constructors take arguments),
-> we give an OCaml expression that can be used as a _"recursor"_ over elements of the type. (Think Church numerals.)
-
-```coq
-Extract Inductive nat ⇒ "int"
- [ "0" "(fun x → x + 1)" ]
- "(fun zero succ n →
- if n=0 then zero () else succ (n-1))".
-```
-
-```coq
-Extract Constant plus ⇒ "( + )".
-Extract Constant mult ⇒ "( * )".
-Extract Constant eqb ⇒ "( = )".
-```
-
-> 注意:保证提取结果的合理性是你的责任。
-
-```coq
-Extract Constant minus ⇒ "( - )".
-```
-
-比如这么做很诱人……但是我们 Coq 的定义里 `0 - 1 = 0`, OCaml 的 `int` 则会有负数...
-
-
-
-### Recursor 的理论与实现 - a "encoding" of case expression and sum type
-
-```coq
-Fixpoint ceval_step (st : state) (c : com) (i : nat)
- : option state :=
- match i with
- | O => None
- | S i' =>
- match c with
-```
-```ocaml
-let rec ceval_step st c = function
- | O -> None
- | S i' ->
- (match c with
-```
-```ocaml
-let rec ceval_step st c i =
- (fun zero succ n -> if n=0 then zero () else succ (n-1))
- (fun _ -> None) (* zero *)
- (fun i' -> (* succ *)
- match c with
-```
-
-注意我们是如何使用 "recursor" 来替代 `case`, `match`, pattern matching 得。
-
-recall _sum type_ 在 PLT 中的语法与语义:
-
-```coq
-T ::=
- T + T
-
-e ::=
- case e of
- | L(e) => e
- | R(e) => e
-
-```
-```
- e → e'
- ------------- (work inside constructor)
- C(e) -> C(e')
-
- e → e'
- ------------------------------- (work on the expr match against)
- case e of ... → case e' of ...
-
- ----------------------------------------------- (match Left constructor, substitute)
- case L(v) of L(x) => e1 | R(y) => e2 → e1 [v/x]
-
- ----------------------------------------------- (match Right constructor, substitute)
- case R(v) of L(x) => e1 | R(y) => e2 → e1 [v/x]
-```
-
-可以发现 `case` 表达式可以理解为一种特殊的 application,会将其 argument 根据某种 tag (这里为构造函数) apply 到对应的 case body 上,
-每个 case body 都是和 lambda abstraction 同构的一种 binder:
-
- L(x) => e1 === λx.e1
- R(x) => e2 === λx.e2
-
- case v e1|e2 === (λx.e1|e2) v -- `e1` or `e2` depends on the _tag_ wrapped on `v`
-
-这个角度也解释了 Haskell/SML 在申明函数时直接对参数写 pattern match 的理论合理性.
-
-根据经验几乎所有的 _binding_ 都可以被 desugar 成函数(即 lambda expression).
-难点在于我们如何 re-implement 这个 _tag_ 的 _switch_ 机制?
-
-对于 `Inductive nat` 翻译到 OCaml `int` 时,这个机制可以用 `v =? 0` 来判断,因此我们的 _recursor_ 实现为
-
-```ocaml
-fun zero succ (* partial application *)
- n -> if n=0 (* 判断 tag ... *)
- then zero () (* 0 case => (λx.e1) v *)
- else succ (n-1) (* S n case => (λx.e2) v *)
-```
-
-
-
-
-
-
diff --git a/_posts/read_sf_lf/2019-01-16-sf-lf-16-auto.md b/_posts/read_sf_lf/2019-01-16-sf-lf-16-auto.md
deleted file mode 100644
index 2c7463d06a2..00000000000
--- a/_posts/read_sf_lf/2019-01-16-sf-lf-16-auto.md
+++ /dev/null
@@ -1,223 +0,0 @@
----
-title: "「SF-LC」16 Auto"
-subtitle: "Logical Foundations - More Automation"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - LF (逻辑基础)
- - SF (软件基础)
- - Coq
- - 笔记
----
-
-- `auto` - proof search
-- `Ltac` - automated forward reasoning (hypothesis matching machinery)
-- `eauto`, `eapply` - deferred instantiation of existentials
-
-
-
-`Ltac` macro
-------------
-
-```coq
-Ltac inv H := inversion H; subst; clear H.
-
-(** later in the proof... **)
-inv H5.
-```
-
-
-
-The `auto` Tactic
------------------
-
-> `auto` can free us by _searching_ for a sequence of applications that will prove the goal:
-
-```coq
-intros P Q R H1 H2 H3.
-apply H2. apply H1. assumption.
-
-
-(** can be replaced by... **)
-auto.
-```
-
-`auto` solves goals that are solvable by _any combination_ of
-- `intros`
-- `apply` (of hypotheses from the _local_ context, by default)
-
-
-> 使用 auto 一定是“安全”的,它不会失败,也不会改变当前证明的状态: auto 要么完全解决它,要么什么也不做。
-
-> Proof search could, in principle, take an arbitrarily long time,
-> so there are limits to how far auto will search by default. (i.e. `5`)
-
-```coq
-Example auto_example_3 : ∀(P Q R S T U: Prop),
- (P → Q) →
- (Q → R) →
- (R → S) →
- (S → T) →
- (T → U) →
- P →
- U.
-Proof.
- (* 当 auto 无法解决此目标时,它就什么也不做 *)
- auto.
- (* 可选的参数用来控制它的搜索深度(默认为 5), 6 就刚好能解决了! *)
- auto 6.
-Qed.
-```
-
-
-### Hint Database 提示数据库
-
-> `auto` auto considers a __hint database__ of other lemmas and constructors.
-> common lemmas about _equality_ and _logical operators_ are installed by default.
-
-> just for the purposes of one application of `auto`
-> 我们可以为某次 `auto` 的调用扩展提示数据库,`auto using ...`
-
-```coq
-Example auto_example_6 : ∀n m p : nat,
- (n ≤ p → (n ≤ m ∧ m ≤ n)) →
- n ≤ p →
- n = m.
-Proof.
- intros.
- auto using le_antisym.
-Qed.
-```
-
-
-### Global Hint Database 添加到全局提示数据库
-
-```coq
-Hint Resolve T.
-
-Hint Constructors c.
-
-Hint Unfold d.
-```
-
-
-### `Proof with auto.`
-
-Under `Proof with t`, `t1...` == `t1; t`.
-
-
-
-
-Searching For Hypotheses
-------------------------
-
-对于很常见的一种矛盾情形:
-
-```coq
-H1: beval st b = false
-H2: beval st b = true
-```
-
-`contradiction` 并不能解决,必须 `rewrite H1 in H2; inversion H2`.
-
-1. 宏:
-
-```coq
-Ltac rwinv H1 H2 := rewrite H1 in H2; inv H2.
-
-(** later in the proof... **)
-rwinv H H2.
-```
-
-2. `match goal` 调用宏
-
-```coq
-Ltac find_rwinv :=
- match goal with
- H1: ?E = true,
- H2: ?E = false
- ⊢ _ ⇒ rwinv H1 H2
- end.
-
-(** later in the proof... **)
-induction E1; intros st2 E2; inv E2; try find_rwinv; auto. (** 直接解决所有矛盾 case **)
-- (* E_Seq *)
- rewrite (IHE1_1 st'0 H1) in *. auto.
-- (* E_WhileTrue *)
- + (* b 求值为 true *)
- rewrite (IHE1_1 st'0 H3) in *. auto. Qed.
-```
-
-可以看到最后只剩这种改写形式...我们也把他们自动化了:
-
-```coq
-Ltac find_eqn :=
- match goal with
- H1: ∀x, ?P x → ?L = ?R,
- H2: ?P ?X
- ⊢ _ ⇒ rewrite (H1 X H2) in *
- end.
-```
-
-配合上 `repeat`...我们可以 keep doing useful rewrites until only trivial ones are left.
-最终效果:
-
-```coq
-Theorem ceval_deterministic''''': ∀c st st1 st2,
- st =[ c ]⇒ st1 →
- st =[ c ]⇒ st2 →
- st1 = st2.
-Proof.
- intros c st st1 st2 E1 E2.
- generalize dependent st2;
- induction E1; intros st2 E2; inv E2;
- try find_rwinv;
- repeat find_eqn; auto.
-Qed.
-```
-
-即使我们给 IMP 加上一个 `CRepeat`(其实就是 `DO c WHILE b`),
-会发现颠倒一下自动化的顺序就能 work 了
-
-```coq
- induction E1; intros st2 E2; inv E2;
- repeat find_eqn;
- try find_rwinv; auto.
-```
-
-当然,这种「超级自动化」(hyper-automation) 并不总是现实,也不好调试...
-
-
-
-### The `eapply` and `eauto` variants
-
-> 推迟量词的实例化
-
-比如对于
-
-```coq
-Example ceval_example1:
- empty_st =[
- X ::= 2;;
- TEST X ≤ 1
- THEN Y ::= 3
- ELSE Z ::= 4
- FI
- ]⇒ (Z !-> 4 ; X !-> 2).
-Proof.
- (* 我们补充了中间状态 st'... *)
- apply E_Seq with (X !-> 2).
- - apply E_Ass. reflexivity.
- - apply E_IfFalse. reflexivity. apply E_Ass. reflexivity.
-Qed.
-```
-
-没有 `with` 就会 `Error: Unable to find an instance for the variable st'`
-
-但其实 `st'` 的取值在后面的步骤是很明显(很好 infer/unify)的,所以 `eapply` works.
-
-
-
-
diff --git a/_posts/read_sf_plf/2019-03-01-sf-plf-01-equiv.md b/_posts/read_sf_plf/2019-03-01-sf-plf-01-equiv.md
deleted file mode 100644
index afd5fdcd389..00000000000
--- a/_posts/read_sf_plf/2019-03-01-sf-plf-01-equiv.md
+++ /dev/null
@@ -1,532 +0,0 @@
----
-title: "「SF-PLF」1 Equiv"
-subtitle: "Programming Language Foundations - Program Equivalence (程序的等价关系)"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - SF (软件基础)
- - PLF (编程语言基础)
- - Coq
- - 笔记
----
-
-### issues on `coqc` module linking
-
-Some module (e.g.`Map`) not found
-either maunally `make map.vo` or proof general can solve that.
-
-
-
-Behavioral Equivalence 行为等价
----------------------------
-
-> How to define _the correctness of program transformation_, e.g. `optimize_0plus` ?
-- in the setting w/o var (imp w/o var and state) : yield a program the evals to same number as original.
-- in the setting w/ var (full imp w/ assignment) : we need to consider the role of var and state.
-
-### Definitions
-
-> Two `aexps` or `bexps` are _behaviorally equivalent_ if they evaluate to the same result __in every state__.
-
-```coq
-Definition aequiv (a1 a2 : aexp) : Prop :=
- ∀(st : state), aeval st a1 = aeval st a2.
-Definition bequiv (b1 b2 : bexp) : Prop :=
- ∀(st : state), beval st b1 = beval st b2.
-```
-
-> For commands, We can't simply say ... if they evaluate to the same ending state
-> __some commands don't terminate in any final state at all!__
-
-So to define, they either or...
-1. both diverge 都发散
-2. both terminate in the same final state 都在同一个状态停机
-
-A compact way is
-> "if the first one terminates in a particular state then so does the second, and vice versa."
-
-```coq
-Definition cequiv (c1 c2 : com) : Prop :=
- ∀(st st' : state),
- (st =[ c1 ]⇒ st') ↔ (st =[ c2 ]⇒ st').
-```
-
-### Example 1 - Simple (but demonstrated)
-
-```coq
-Theorem skip_left : forall c,
- cequiv (SKIP;; c) c.
-Proof.
- intros c st st'. split; intros H.
- - (* -> *)
- inversion H; subst. (* inverse E_Seq *)
- inversion H2. subst. (* inverse E_Skip *)
- assumption.
- - (* <- *) (* reversely *)
- apply E_Seq with st. (* apply E_Seq *)
- apply E_Skip. (* apply E_Skip *)
- assumption.
-Qed.
-```
-
-Noticed that the `inversion` is like use the _inverse function_ of constructors.
-
-
-### Example 2 - WHILE true non-terminating
-
-one interesting theorem is that we can prove `WHILE ` is not terminating.
-and is equivalent to _any other non-terminating program_, e.g. `WHILE BTrue DO SKIP END`: (因为我们的「等价」只要求同「发散」即可)
-
-```coq
-Theorem WHILE_true : ∀b c,
- bequiv b true →
- cequiv
- (WHILE b DO c END)
- (WHILE true DO SKIP END).
-```
-
-
-### Example 3 - Loop Unrolling
-
-> _any number of copies of the body_ can be "unrolled" without changing meaning
-
-```coq
-Theorem loop_unrolling : ∀b c,
- cequiv
- (WHILE b DO c END)
- (TEST b THEN (c ;; WHILE b DO c END) ELSE SKIP FI). (** 展开一层 **)
-```
-
-
-### Example 4 - Use of extenionality 外延性
-
-`x !-> m x ; x` is same map with `m` by extenionality!
-
-```coq
-Theorem identity_assignment : ∀x,
- cequiv (x ::= x) SKIP.
-```
-
-
-
-
-
-Properties of Behavioral Equivalence 行为等价的性质
---------------------------------------------
-
-
-### 等价关系 (Equivalence)
-
-> 自反性(reflexive)、对称性(symmetric)和传递性 (transitive)
-
-
-### 同余关系(Congruence)
-
-> That is, the equivalence of two subprograms implies the equivalence of the larger programs in which they are _embedded_
-> 如果两个子程序等价,那么当二者所在的更大的程序中_只有二者不同_时, 这两个更大的程序也等价
-
-
- aequiv a1 a1'
- -----------------------------
- cequiv (x ::= a1) (x ::= a1')
-
- cequiv c1 c1'
- cequiv c2 c2'
- --------------------------
- cequiv (c1;;c2) (c1';;c2')
-
-
-> 这个术语应该是来自抽象代数 : 能在运算下保持的等价关系
-> ...in the sense that algebraic operations done with equivalent elements will yield equivalent elements.
-> [Congruence relation](https://en.wikipedia.org/wiki/Congruence_relation)
-
-```coq
-Theorem CAss_congruence : ∀x a1 a1', (** cequiv 是集合 commands 上的等价关系 **)
- aequiv a1 a1' →
- cequiv (CAss x a1) (CAss x a1'). (** 在 `CAss` 这个 operation 下保持等价 => 同余 **)
- cequiv (x ::= a1) (x ::= a1'). (** 或,在 `::=` 这个 command 下保持等价 => 同余 **)
-```
-
-> 在 commands 上等价但不同余的关系?
-
-I guess..."both terminating" relation?
-which is equivalence relation on commands, but the equivalence would not be maintained after, say `C_WHILE` operation.
-
-
-
-### Example - Using Congruence
-
-```coq
-Example congruence_example:
- cequiv
- (* 程序 1: *)
- (X ::= 0;;
- TEST X = 0
- THEN
- Y ::= 0
- ELSE
- Y ::= 42
- FI)
- (* 程序 2: *)
- (X ::= 0;;
- TEST X = 0
- THEN
- Y ::= X - X (* <--- 这里不同 *)
- ELSE
- Y ::= 42
- FI).
-Proof.
- apply CSeq_congruence.
- - apply refl_cequiv.
- - apply CIf_congruence.
- + apply refl_bequiv.
- + apply CAss_congruence. (** <--- 化简到只需要证明 aequiv 0 (X - X) **)
- unfold aequiv. simpl.
- * symmetry. apply minus_diag.
- + apply refl_cequiv.
-Qed.
-```
-
-
-
-
-
-Program Transformations 程序变换
-------------------------------
-
-> A program transformation is _sound_ if it preserves the behavior of the original program.
-> 如果一个程序变换保留了其原始行为,那么它就是_可靠_的
-
-我们可以定义在不同集合 `aexp, bexp, com` 上的 sound 关系:
-(有趣的是,`Inductive` 定义的非 `Prop` 的 `Type`, 确实就是 `Set`, 这是一种 PL 和数学的 Correspondence)
-- 当我们的 datatype 是 constructor 时 => 不交并
-- 当我们的 datatype 有 recursive 时 => 集合的递归定义
-
-
-```coq
-Definition atrans_sound (atrans : aexp → aexp) : Prop :=
- ∀(a : aexp), aequiv a (atrans a).
-Definition btrans_sound (btrans : bexp → bexp) : Prop :=
- ∀(b : bexp), bequiv b (btrans b).
-Definition ctrans_sound (ctrans : com → com) : Prop :=
- ∀(c : com), cequiv c (ctrans c).
-```
-
-
-### Constant Folding 常量折叠
-
-> An expression is _constant_ when it contains no variable references.
-> 不引用变量的表达式为_常量_
-
-> Constant folding is an _optimization_ that finds constant expressions and replaces them by their values.
-> 常量折叠是一种找到常量表达式并把它们替换为其值的优化方法。
-
-
-### Soundness of Constant Folding
-
-#### `aexp`
-
-```coq
-Theorem fold_constants_aexp_sound :
- atrans_sound fold_constants_aexp.
-Proof.
- unfold atrans_sound. intros a. unfold aequiv. intros st.
-
-(** 这个时候的状态:**)
-
- a : aexp
- st : state
- ============================
- aeval st a = aeval st (fold_constants_aexp a)
-
-```
-
-#### `bexp`
-
-证明 `btrans_sound fold_constants_bexp.` 要难一些,因为其中还用到了 `fold_constants_aexp`, 所以我们需要一些技巧
-
-```coq
-(** 如果不记住而是直接 destruct 的话,这部分信息就丢失了 **)
- remember (fold_constants_aexp a1) as a1' eqn:Heqa1'.
- remember (fold_constants_aexp a2) as a2' eqn:Heqa2'.
-
-(** 保留了这部分信息的目的是,使用 aexp 的可靠性定理来建立 aexp 与 值 的关系 **)
- replace (aeval st a1) with (aeval st a1') by
- (subst a1'; rewrite <- fold_constants_aexp_sound; reflexivity).
- replace (aeval st a2) with (aeval st a2') by
- (subst a2'; rewrite <- fold_constants_aexp_sound; reflexivity).
-
-(** 最后才分类讨论 **)
- destruct a1'; destruct a2'; try reflexivity.
-```
-
-#### `cmd`
-
-主要技巧在于配合使用 `Congruence` 与 `IH` 解决大部分 case,然后分类讨论 `fold_constants_bexp` 用 `sound` 做替换解决剩余 case.
-
-
-
-### Soundness of (0 + n)
-
-类似,但是接下来我们就可以证明先 ` fold_constants` 再 `optimize_0plus` 也是 sound 的.
-这里我更 general 得证明了 `ctrans` 关系的传递性:
-
-```coq
-Theorem trans_ctrans_sound : forall tr1 tr2,
- ctrans_sound tr1 ->
- ctrans_sound tr2 ->
- ctrans_sound (fun c => tr2 (tr1 c)).
-```
-
-
-
-
-
-
-Proving Inequivalence 证明程序不等价
------------------------------
-
-在这个例子中,`subst_aexp` 是 sound 得,被称为 _Constant Propagation_ (常量传播)
-
-```coq
-(** [X := 42 + 53](Y + X) => Y + (42 + 53) **)
-Example subst_aexp_ex :
- subst_aexp X (42 + 53) (Y + X)%imp = (Y + (42 + 53))%imp.
-Proof. reflexivity. Qed.
-```
-
-所以我们断言这么做是 always sound 得:
-
-```coq
-Definition subst_equiv_property := ∀x1 x2 a1 a2,
- cequiv (x1 ::= a1;; x2 ::= a2)
- (x1 ::= a1;; x2 ::= subst_aexp x1 a1 a2).
-```
-
-然而如果 `a1` 不是常量,副作用很容易让这个转换 unsound
-那么怎么证明 `¬subst_equiv_property` (即该性质不成立)? 举一个反例就好
-
-
-Informal proof
-- provide a witness
-
-Formal
-- give counterexamples via `remember`, then show `⊥`.
-
-```coq
-(** 给出一组反例,使用性质证明他们 cequiv **)
-
- remember (X ::= X + 1;;
- Y ::= X)%imp as c1.
- remember (X ::= X + 1;;
- Y ::= X + 1)%imp as c2.
- assert (cequiv c1 c2) by (subst; apply Contra).
-
-(* => *) Heqc1 : c1 = (X ::= X + 1;; Y ::= X)%imp
- Heqc2 : c2 = (X ::= X + 1;; Y ::= X + 1)%imp
- H : cequiv c1 c2
- ============================
- False
-
-
-(** 给出他们将 eval 出不同的 heap **)
-
- remember (Y !-> 1 ; X !-> 1) as st1.
- remember (Y !-> 2 ; X !-> 1) as st2.
- assert (H1 : empty_st =[ c1 ]=> st1);
- assert (H2 : empty_st =[ c2 ]=> st2);
-
- apply H in H1. (** 使用 H : cequiv c1 c2 , 我们得到 **)
-
-(* => *) H1 : empty_st =[ c2 ]=> st1
- H2 : empty_st =[ c2 ]=> st2
- ============================
- False
-
-
-(** 利用 ceval 的 deterministic **)
-
- assert (Hcontra : st1 = st2)
- by (apply (ceval_deterministic c2 empty_st); assumption).
-
-(* => *) Hcontra : st1 = st2
- ============================
- False
-
-
-(** st1, st2 are map, which are actually function!
- 这时我们可以反用 functional extenionality,直接 apply Y 然后 discrinminate **)
-
- assert (Hcontra' : st1 Y = st2 Y)
- by (rewrite Hcontra; reflexivity).
- subst. inversion Hcontra'. Qed.
-```
-
-
-
-
-Extended Exercise: Nondeterministic Imp
----------------------------------------
-
-> HAVOC roughly corresponds to an _uninitialized variable_ in a low-level language like C.
-> After the HAVOC, the variable holds a fixed but arbitrary number.
-
-我们增加一个 `HAVOC X` 语句(大灾难),会为 X 随机赋一个值...类似于「未初始化变量」
-
-
-```coq
-Inductive com : Type :=
- ...
- | CHavoc : string → com. (* <--- 新增 *)
-
-Notation "'HAVOC' l" :=
- (CHavoc l) (at level 60) : imp_scope.
-
-
-Inductive ceval : com -> state -> state -> Prop :=
- ...
- | E_Havoc : forall st (n : nat) x,
- st =[ HAVOC x ]=> (x !-> n) (** can eval to arbitraty heap **)
-```
-
-
-
-
-
-
----
-
-
-# Small-Step
-
-
-## deterministic
-
-also the def of partial function?
-
-`solve_by_inverts`
-
-in LTac. (used to generate proof)
-LTac doesn't have _termination check_. (might not be able to find...)
-
-`match` is back-tracking point.
-
-
-number passing in = depth of the iteration/recursion
-
-
-
-
----
-
-
-`ST_Plus2` need `value v1`. not redundant with `ST_Plus1`
-we might have things not `value` but cannot take step as well.
-
-
----
-
-Strong Progress
-
-
-Normal form
-
-= no relation related to (so cannot step to)
-
-
-vs Value...
-
-
-`destruct (apply t)`.
-can we do that?
-
-
----
-
-Slide Q&A.
-
-
-
-value_not_sae_as normal_form
-
-e.g (1+2) + 7
-e.g. 3 + 7
-
-
----
-
-One-step
-
-* plus
-* left + 0
-* right + 0
-
-Inf-step -> Inf terms
-
-go from 3 to `3+0`
-
-
----
-
-
-Stuck
-
-
-No StepR
-
-0 term can step into
-
-
----
-
-
-Multi-Step Reduction `->*`
-
-```coq
-Inductive multi {X : Type} (R : relation X) : relation X :=
- | multi_refl : ∀(x : X), multi R x x
- | multi_step : ∀(x y z : X),
- R x y →
- multi R y z →
- multi R x z.
-```
-
-
-can be either defined as a "head + tail" style (or "tail + head" style), or "refl + trans" style (as in `Rel.v`).
-
-the `trans` relation are underteministic in terms of the transtive relation using. (you can throw infinitely many `trans` constructors in)
-
-> having multiple form so we can jump back and forth to pick one easier for proof.
-
-
----
-
-PLT PM lang
-
-multiple smallstep relation can be markded deepner state.qjw
-er state.
-
----
-
-IMP
-
-
-`astep` no need for `value``
-
-for `If`, in PLT we have 2 rules for T/F.
-here we can compute...
-
-
----
-
-
-
-Par w/o Concurrency is deterministic
-(not vice versa)
-
-suddenly `/ ->* /` tuple
-
-
-
diff --git a/_posts/read_sf_plf/2019-03-02-sf-plf-02-hoare-1.md b/_posts/read_sf_plf/2019-03-02-sf-plf-02-hoare-1.md
deleted file mode 100644
index e0f5cc9ff3d..00000000000
--- a/_posts/read_sf_plf/2019-03-02-sf-plf-02-hoare-1.md
+++ /dev/null
@@ -1,15 +0,0 @@
----
-title: "「SF-PLF」2 Hoare"
-subtitle: "Programming Language Foundations - Hoare Logic, Part I "
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - SF (软件基础)
- - PLF (编程语言基础)
- - Coq
- - 笔记
----
-
-TBD
diff --git a/_posts/read_sf_plf/2019-03-03-sf-plf-03-hoare-2.md b/_posts/read_sf_plf/2019-03-03-sf-plf-03-hoare-2.md
deleted file mode 100644
index e49d7f7a4c4..00000000000
--- a/_posts/read_sf_plf/2019-03-03-sf-plf-03-hoare-2.md
+++ /dev/null
@@ -1,16 +0,0 @@
----
-title: "「SF-PLF」3 Hoare2"
-subtitle: "Programming Language Foundations - Hoare Logic, Part II"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - SF (软件基础)
- - PLF (编程语言基础)
- - Coq
- - 笔记
----
-
-TBD
-
diff --git a/_posts/read_sf_plf/2019-03-04-sf-plf-04-hoare-logic.md b/_posts/read_sf_plf/2019-03-04-sf-plf-04-hoare-logic.md
deleted file mode 100644
index 56c61bc575b..00000000000
--- a/_posts/read_sf_plf/2019-03-04-sf-plf-04-hoare-logic.md
+++ /dev/null
@@ -1,15 +0,0 @@
----
-title: "「SF-PLF」4 HoareAsLogic"
-subtitle: "Programming Language Foundations - Hoare Logic as a Logic"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - SF (软件基础)
- - PLF (编程语言基础)
- - Coq
- - 笔记
----
-
-TBD
diff --git a/_posts/read_sf_plf/2019-03-05-sf-plf-05-smallstep.md b/_posts/read_sf_plf/2019-03-05-sf-plf-05-smallstep.md
deleted file mode 100644
index fd2d4b25d40..00000000000
--- a/_posts/read_sf_plf/2019-03-05-sf-plf-05-smallstep.md
+++ /dev/null
@@ -1,547 +0,0 @@
----
-title: "「SF-PLF」5 Smallstep"
-subtitle: "Programming Language Foundations - Small-Step Operational Semantics"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - SF (软件基础)
- - PLF (编程语言基础)
- - Coq
- - 笔记
----
-
-
-Recall Big-step Pros & Cons
----------------------------
-
-## Big-step
-
-> 一步到位 : _eval to its final value (plus final store)_
-
-### Pros - natural (so called _natural semantics_), "all in one big step"
-
-### Cons - not catch the _essence of how program behave_
-
-> 大步语义只是一个 `程序 ↦ 结果` 这样的 pair 集合,而「如何一步步处理」才是程序「执行」的本质
-
-not just input state get mapped to output state.
-but also _intermediate state_ (which could be observed by _concurrent_ code!)
-
-
-### Cons - not technically expressive enough to express _exception / crash / non-termination_
-
-> 比如说,大步语义无法区分「不停机」与「卡住」
-> two quite different reasons of "fail to map a given state to any ending state"
-
-1. 不停机 nontermination - we want to allow this (infinite loop is the price paid for usability)
-2. 卡住 getting stuck / undefiend behaviour 未定义行为 - we want to prevent (wrong)
-
-- `WHILE_true_nonterm` 仅仅表达了「程序不能再 take step」,无法与「卡住」区分
-- `WHILE_true` 更是直接让任何「无限循环」的程序都「等价」了...而忽略了中间状态和 effect (作用)
-
-> we need _a way of presenting semantics that distinguish_ nontermination from erroneous "stuck states"
-
-
-## Small-step
-
-> 更精细化 : a _finer-grained_ way of defining and reasoning about program behaviors.
-> 原子步骤 : _"atomic steps"_ of computation are performed.
-
-
-
-
-
-
-
-A Toy Language
---------------
-
-Only Constant and Plus
-
-```coq
-Inductive tm : Type :=
- | C : nat → tm (* Constant *)
- | P : tm → tm → tm. (* Plus *)
-```
-
-### Big-Step
-
-`==>` is really `⇓`
-
- --------- (E_Const)
- C n ==> n
-
- t1 ==> n1
- t2 ==> n2
- ------------------- (E_Plus)
- P t1 t2 ==> n1 + n2
-
-
-### Small-Step
-
-> single reduction step
-> find leftmost redex
-
- ------------------------------- (ST_PlusConstConst)
- P (C n1) (C n2) --> C (n1 + n2)
-
- t1 --> t1'
- -------------------- (ST_Plus1)
- P t1 t2 --> P t1' t2
-
- t2 --> t2'
- ---------------------------- (ST_Plus2)
- P (C n1) t2 --> P (C n1) t2'
-
-
-
-
-
-
-Relations
----------
-
-> Check notes of `rel` and `tactics` for more details about bi-relation.
-
-
-### Deterministic 确定性
-
-> a.k.a Partial Function.
-> in terms of its _right uniqueness_ under mathematical context, not its emphasise on _partial_ under programming context)
-
-```coq
-Definition deterministic {X : Type} (R : relation X) :=
- ∀x y1 y2 : X, R x y1 → R x y2 → y1 = y2.
-```
-
-`deterministic step` can be proved by induction on derivation `x --> y1`
-- use `generalize dependent y2`!
-- in informal proof, we usually just take `∀ y2` by default.
-
-
-### `Ltac solve_by_inverts n`
-
-```coq
-Ltac solve_by_inverts n :=
- match goal with | H : ?T ⊢ _ ⇒
- match type of T with Prop ⇒
- solve [
- inversion H;
- match n with S (S (?n')) ⇒ subst; solve_by_inverts (S n') end ]
- end end.
-```
-
-
-### Values 值
-
-#### Abstract Machine 抽象机!
-
-> think of the `-->` relation as defining an _abstract machine_:
-
-- term = _state_ of machine 项 = 机器状态
-- step = atomic unit of computation (think as assembly opcode / CPU instructrion)
-- _halting state_ = no more computation. 停机状态
-
-> execute a term `t`:
-
-- starting state = `t`
-- repeatedly use `-->`
-- when halt, _read out_ the _final state_ as result of execution
-
-> Intutively, we call such (final state) terms _values_.
-Okay so the point is...this language is simple enough (no stuck state).
-and in this lang, value can only be `C`onst:
-
-> 在这个语言中,我们「规定」只有 `C`onst 是「值」:
-
-```coq
-Inductive value : tm → Prop :=
- | v_const : ∀n, value (C n).
-```
-
-> and we can write `ST_Plus2` more elegant:
-well...in this lang, not really, since only one form of value to write out.
-in cases we have multiple form of value, by doing this we don't have to write out any cases.
-
- value v1
- t2 --> t2'
- -------------------- (ST_Plus2)
- P v1 t2 --> P v1 t2'
-
-
-
-### Strong Progress and Normal Forms 强可进性和正规式
-
-
-> _strong progress_: every term either is a value or can "make progress"
-
-```coq
-Theorem strong_progress : ∀t,
- value t ∨ (∃t', t --> t').
-```
-
-
-> terms that cannot make progress.
-> for an arbitrary relation `R` over an arbitrary set `X`
-
-
-> _normal form_: term that cannot make progress (take a step)
-> 其实我个人比较喜欢理解为「常态」或「无能量稳定态」
-
-```coq
-Definition normal_form {X : Type} (R : relation X) (t : X) : Prop :=
- ¬∃t', R t t'.
-```
-
-
-> theorem: _in this language_, normal forms and values are actually the same thing.
-
-```coq
-Lemma value_is_nf : v, value v → normal_form step v.
-Lemma nf_is_value : ∀t, normal_form step t → value t.
-Corollary nf_same_as_value : ∀t, normal_form step t ↔ value t.
-```
-
-
-#### Value != Normal Form (not always)
-
-> value is a _syntactic_ concept : it is defined by looking at the form of a term
-> normal form is a _semantic_ one : it is defined by looking at how the term steps.
-
-
-> E.g. we can defined term that can take a step as "value":
-> 添加一个不是 normal form 的 value
-
-```coq
-Inductive value : tm → Prop :=
- | v_const : ∀n, value (C n)
- | v_funny : ∀t1 n2, value (P t1 (C n2)). (* <--- it can actually progress! *)
-```
-
-> 或者更改 `step` 让 value 不是 normal form...
-
-```coq
-Inductive step : tm -> tm -> Prop :=
- | ST_Funny : forall n,
- C n --> P (C n) (C 0) (* <--- or a weird *)
-```
-
-
-
-
-
-
-
-
-Multi-Step Reduction `-->*` 多步规约
-----------------------------------
-
-> relation `multi R`: _multi-step closure of R_
-> same as `clos_refl_trans_1n` in `Rel` chapter.
-
-```coq
-Inductive multi {X : Type} (R : relation X) : relation X :=
- | multi_refl : ∀(x : X), multi R x x
- | multi_step : ∀(x y z : X),
- R x y →
- multi R y z →
- multi R x z.
-```
-
-以上是一种方便的定义,而以下则给了我们两个 helper 定理:
-
-```coq
-Theorem multi_R : ∀(X : Type) (R : relation X) (x y : X),
- R x y →
- multi R x y.
-
-Theorem multi_trans : ∀(X : Type) (R : relation X) (x y z : X),
- multi R x y →
- multi R y z →
- multi R x z.
-```
-
-
-### Normal Forms Again
-
-
-```coq
-Definition step_normal_form := normal_form step. (** 这个是一个「性质」 Property : _ -> Prop , 从 polymorphic 的 [normal_form] 以 [step] 实例化而来 **)
-Definition normal_form_of (t t' : tm) := (** 是两个项之间的(i.e. 定义在 [tm] 集合上的) 二元关系, 即 t' 是 t 的正规式 **)
- (t -->* t' ∧ step_normal_form t').
-
-Theorem normal_forms_unique: (** single-step reduction is deterministic 可以推出 normal form is unique for a given term **)
- deterministic normal_form_of.
-```
-
-
-### Normalizing 总是可正规化得 -- "Evaluating to completion"
-
-> something stronger is true for this language (though not for all languages)
-> reduction of _any_ term `t` will eventually reach a normal form (我们知道 STLC 也有这个特性)
-
-```coq
-Definition normalizing {X : Type} (R : relation X) :=
- ∀t, ∃t',
- (multi R) t t' ∧ normal_form R t'.
-```
-
-To prove this, we need lemma showing some _congruence_ of `-->*`:
-同余关系,不过这次是定义在 `-->*` 这个关系上,again,同余指的是「关系对于结构上的操作保持」
-
-```coq
-Lemma multistep_congr_1 : ∀t1 t1' t2,
- t1 -->* t1' →
- P t1 t2 -->* P t1' t2.
-
-Lemma multistep_congr_2 : ∀t1 t2 t2',
- value t1 →
- t2 -->* t2' →
- P t1 t2 -->* P t1 t2'.
-```
-
-Then we can prove...
-
-```coq
-Theorem step_normalizing :
- normalizing step.
-```
-
-
-
-### Equivalence of Big-Step and Small-Step
-
-```coq
-Theorem eval__multistep : ∀t n,
- t ==> n → t -->* C n.
-
-Theorem multistep__eval : ∀t t',
- normal_form_of t t' → ∃n, t' = C n ∧ t ==> n. (* might be better to say value here? *)
-```
-
-
-
-
-Additional: Combined Language
------------------------------
-
-What if we combined the lang `Arith` and lang `Boolean`?
-Would `step_deterministic` and `strong_progress` still holds?
-
-Intuition:
-- `step_deterministic` should still hold
-- but `strong_progress` would definitely not!!
- - now we mixed two _types_ so we will have stuck terms e.g. `test 5` or `tru + 4`.
- - we will need type check and then we would be able to prove `progress` (which require well-typeness)
-
-```coq
-Theorem strong_progress :
- (forall t, value t \/ (exists t', t --> t')) \/
- ~ (forall t, value t \/ (exists t', t --> t')).
-Proof.
- right. intros Hcontra.
- remember (P tru fls) as stuck. (** 类似 disprove equiv = 举一个反例就好 **)
- specialize (Hcontra stuck).
- destruct Hcontra as [Hcvalue | Hcprogress]; subst.
- - inversion Hcvalue; inversion H.
- - destruct Hcprogress. inversion H. inversion H3. inversion H4.
-Qed.
-```
-
-
-
-
-
-Small-Step IMP
---------------
-
-又到了老朋友 IMP……还好没练习……简单看一下
-
-首先对于定义小步语义,我们需要定义 `value` 和 `-->` (step)
-
-### `aexp`, `bexp`
-
-```coq
-Inductive aval : aexp → Prop :=
- | av_num : ∀n, aval (ANum n).
-```
-
-`bexp` 不需要 `value` 因为在这个语言里 `BTrue` 和 `BFalse` 的 step 总是 disjointed 得,所以并没有任何复用 `value` predicate 的时候
-
-
-### `-->a`, `-->b`
-
-这里,我们先为 `aexp`, `bexp` 定义了它们各自的小步语义,
-
-> 但是,其实 from PLT we know, 我们其实也可以直接复用 `aexp`, `bexp` 的大步语义!
-> 1. 大步语义要短得多
-> 2. `aexp`, `bexp` 其实并不会出
-> - 「不停机」: 没有 jump 等控制流结构
-> - 「异常」/「卡住」: 我们在 meta-language 的 AST 里就区分了 `aexp` 和 `bexp`,相当于主动约束了类型,所以不会出现 `5 || 3` 这样 type error 的 AST
-
-
-### `cmd`, `-->`
-
-> 我们把 `SKIP` 当作一个「命令值(command value)」 i.e. 一个已经到达 normal form 的命令。
-> - 赋值命令归约到 `SKIP` (和一个新的 state)。
-> - 顺序命令等待其左侧子命令归约到 `SKIP`,然后丢弃它,并继续对右侧子命令归约。
-
-> 对 `WHILE` 命令的归约是把 `WHILE` 命令变换为条件语句,其后紧跟同一个 `WHILE` 命令。
-
-> 这些都与 PLT 是一致的
-
-
-
-
-
-
-Concurrent IMP
---------------
-
-为了展示 小步语义 的能力,let's enrich IMP with concurrency.
-- unpredictable scheduling (subcommands may be _interleaved_)
-- _share same memory_
-
-It's slightly confusing here to use `Par` (meaning _in parallel_)
-I mean, concurrency _could_ be in parallel but it doesn't have to...
-
-```coq
-Inductive com : Type :=
- | CPar : com → com → com. (* <--- NEW *)
-
-Inductive cstep : (com * state) → (com * state) → Prop :=
- (* New part: *)
- | CS_Par1 : ∀st c1 c1' c2 st',
- c1 / st --> c1' / st' →
- (PAR c1 WITH c2 END) / st --> (PAR c1' WITH c2 END) / st'
- | CS_Par2 : ∀st c1 c2 c2' st',
- c2 / st --> c2' / st' →
- (PAR c1 WITH c2 END) / st --> (PAR c1 WITH c2' END) / st'
- | CS_ParDone : ∀st,
- (PAR SKIP WITH SKIP END) / st --> SKIP / st
-```
-
-
-
-
-
-
-
-
-A Small-Step Stack Machine 小步栈机
------------------------------------
-
-啊哈!IMP 章节 Stack Machine,我们之前仅仅定义了 `Fixpoint s_execute` 和 `Fixpoint s_compile`,这里给出其小步语义
-> 对于本身就与「小步语义」在精神上更统一的「抽象机」,我怀疑其语义都应该是足够「小」的(即大小步将是一致的?)
-
-```coq
-Definition stack := list nat.
-Definition prog := list sinstr.
-
-Inductive stack_step : state -> prog * stack -> prog * stack -> Prop :=
- | SS_Push : forall st stk n p',
- stack_step st (SPush n :: p', stk) (p', n :: stk)
- | SS_Load : forall st stk i p',
- stack_step st (SLoad i :: p', stk) (p', st i :: stk)
- | SS_Plus : forall st stk n m p',
- stack_step st (SPlus :: p', n::m::stk) (p', (m+n)::stk)
- | SS_Minus : forall st stk n m p',
- stack_step st (SMinus :: p', n::m::stk) (p', (m-n)::stk)
- | SS_Mult : forall st stk n m p',
- stack_step st (SMult :: p', n::m::stk) (p', (m*n)::stk).
-
-(** closure of stack_step **)
-Definition stack_multistep st := multi (stack_step st).
-```
-
-### Compiler Correctness
-
-> 「编译器的正确性」= the notion of _semantics preservation_ (in terms of observable behaviours)
-> S = `e`
-> C = `s_compile e`
-> B(S) = `aeval st e`
-> B(C) = functional `s_execute`
-> | relational `stack_multistep`
-
-之前我们证明过 _functional/computational_ `Fixpoint` 的性质
-
-```coq
-Theorem s_compile_correct : forall (st : state) (e : aexp),
- s_execute st [] (s_compile e) = [ aeval st e ].
-
-(** 重要的是这个更一般的「描述了 prog 如何与 stack 交互」的定理 **)
-Theorem s_execute_theorem : forall (st : state) (e : aexp) (stack : list nat) (prog : list sinstr),
- s_execute st stack (s_compile e ++ prog)
- = s_execute st ((aeval st e) :: stack) prog.
-
-```
-
-现在则是证明 _relational_ `Inductive` 的性质,同样我们需要一个更一般的定理(然后原命题作为推论)
-
-```coq
-Theorem stack_step_theorem : forall (st : state) (e : aexp) (stack : list nat) (prog : list sinstr),
- stack_multistep st
- ((s_compile e ++ prog), stack)
- ( prog , (aeval st e) :: stack). (** 这里 prog 和 stack 的交互本质上和上面是一样的 **)
-Proof.
- unfold stack_multistep.
- induction e; intros; simpl in *; (** 证明 induction on aexp,然后利用 transivitiy、constructor 与 IH 即可,非常快 **)
- try (apply multi_R; constructor);
- try (
- repeat (rewrite <- app_assoc);
- eapply multi_trans; try apply IHe1;
- eapply multi_trans; try apply IHe2;
- eapply multi_R; constructor
- ).
-
-Definition compiler_is_correct_statement : Prop := forall (st : state) (e : aexp),
- stack_multistep st (s_compile e, []) ([], [aeval st e]).
-```
-
-
-
-
-
-
-Aside: A `normalize` Tactic
----------------------------
-
-Even with `eapply` and `auto`...manual normalization is tedious:
-
-```coq
-Example step_example1' :
- (P (C 3) (P (C 3) (C 4)))
- -->* (C 10).
-Proof.
- eapply multi_step. auto. simpl.
- eapply multi_step. auto. simpl.
- apply multi_refl.
-Qed.
-```
-
-We could write custom `Tactic Notation`...(i.e. tactic macros)
-
-```coq
-Tactic Notation "print_goal" :=
- match goal with ⊢ ?x ⇒ idtac x end.
-
-Tactic Notation "normalize" :=
- repeat (print_goal; eapply multi_step ;
- [ (eauto 10; fail) | (instantiate; simpl)]);
- apply multi_refl.
-```
-
-`instantiate` seems here for intros `∃`?
-
-```coq
-Example step_example1''' : exists e',
- (P (C 3) (P (C 3) (C 4)))
- -->* e'.
-Proof.
- eapply ex_intro. normalize.
-Qed.
-```
-
-But what surprise me is that we can `eapply ex_intro`, which leave the `∃` as a hole `?ex` (unification variable).
diff --git a/_posts/read_sf_plf/2019-03-06-sf-plf-06-types.md b/_posts/read_sf_plf/2019-03-06-sf-plf-06-types.md
deleted file mode 100644
index dcb695851b7..00000000000
--- a/_posts/read_sf_plf/2019-03-06-sf-plf-06-types.md
+++ /dev/null
@@ -1,269 +0,0 @@
----
-title: "「SF-PLF」6 Types"
-subtitle: "Programming Language Foundations - Type Systems"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - SF (软件基础)
- - PLF (编程语言基础)
- - Coq
- - 笔记
----
-
-This chapter:
-- typing relation -- 定型关系
-- `type preservation` and `progress` (i.e. soundness proof) -- 类型保留,可进性
-
-
-Typed Arithmetic Expressions (Toy Typed Language)
--------------------------------------------------
-
-The toy lang from `SmallStep` is too "safe" to demonstrate any __runtime (or dynamic) type errors__. -- 运行时类型错误
-So that's add some operations (common church numeral ones), and `bool` type.
-
-...same teaching order as TAPL. In PLT, we went directly to STLC.
-
-### Syntax
-
-```coq
-t ::= tru | fls | test t then t else t | zro | scc t | prd t | iszro t
-```
-
-```coq
-Inductive tm : Type :=
- | tru : tm
- | fls : tm
- | test : tm → tm → tm → tm
- | zro : tm
- | scc : tm → tm
- | prd : tm → tm
- | iszro : tm → tm.
-
-(* object language has its own bool / nat , 这里不使用 Coq (meta-language) 比较 pure 一些? *)
-Inductive bvalue : tm → Prop :=
- | bv_tru : bvalue tru
- | bv_fls : bvalue fls.
-Inductive nvalue : tm → Prop :=
- | nv_zro : nvalue zro
- | nv_scc : ∀t, nvalue t → nvalue (scc t). (** 注意这里 nv_scc 是描述所有 [scc t] 是 nvalue 的一个 constructor / tag **)
-
-(* [value?] predicate *)
-Definition value (t : tm) := bvalue t ∨ nvalue t.
-```
-
-
-### Automation
-
-`Hint` are added to database to help with `auto`.
-More details on `auto. eapply. eauto.` were mentioned in `lf/Auto`.
-
-```coq
-Hint Constructors bvalue nvalue.
-Hint Unfold value.
-Hint Unfold update.
-```
-
-
-### S.O.S
-
-Small-step operational semantics...
-can be made formally in Coq code:
-
-```coq
-Reserved Notation "t1 '-->' t2" (at level 40).
-Inductive step : tm → tm → Prop :=
- | ST_TestTru : ∀t1 t2,
- (test tru t1 t2) --> t1
- ...
-```
-
-
-
-### "is stuck" vs. "can get stuck" 卡住的项 vs. 将会卡住的项
-
-Noticed that the small-step semantics doesn't care about if some term would eventually get stuck.
-
-
-### Normal Forms and Values
-
-> 因为这个语言有 stuck 的情况,所以 `value != normal form` (terms cannot make progress)
-> `possible_results_of_reduction = value | stuck`
-
-```coq
-Notation step_normal_form := (normal_form step).
-Definition stuck (t : tm) : Prop :=
- step_normal_form t ∧ ¬value t.
-```
-
-
-### Slide Q&A 1
-
-1. Yes
-2. No `scc zro` is a value
-3. No is a value
-
-
-
-
-### Typing
-
-```coq
-Inductive ty : Type :=
- | Bool : ty
- | Nat : ty.
-```
-
-Noticed that it's just a non-dependently-typed ADT, but `: ty` is written explcitly here...they are the same!
-
-
-### Typing Relations
-
-okay the funny thing...
-it make sense to use `∈` here since `:` has been used by Coq.
-but this notation is actually represented as `\in`.
-We suddenly switch to LaTex mode...
-
-```coq
-Reserved Notation "'|-' t '\in' T" (at level 40).
-```
-
-Noticed the generic `T` here.
-In PLT we sometimes treat them as "magic" _meta variable_, here we need to make the `T` explcit (we are in the meta-language).
-
- ⊢ t1 ∈ Bool ⊢ t2 ∈ T ⊢ t3 ∈ T
- ---------------------------------- (T_Test)
- ⊢ test t1 then t2 else t3 ∈ T
-
-```coq
-| T_Test : ∀t1 t2 t3 T, (** <--- explicit ∀ T **)
- ⊢ t1 ∈ Bool →
- ⊢ t2 ∈ T →
- ⊢ t3 ∈ T →
- ⊢ test t1 t2 t3 ∈ T
-```
-
-```coq
-Example has_type_1 :
- ⊢ test fls zro (scc zro) ∈ Nat.
-Proof.
- apply T_Test. (** <--- we already know [T] from the return type [Nat] **)
- - apply T_Fls. (** ⊢ _ ∈ Bool **)
- - apply T_Zro. (** ⊢ _ ∈ Nat **)
- - apply T_Scc. (** ⊢ _ ∈ Nat **)
- + apply T_Zro.
-Qed.
-```
-
-> (Since we've included all the constructors of the typing relation in the hint database, the `auto` tactic can actually find this proof automatically.)
-
-
-#### typing relation is a conservative (or static) approximation
-
-> 类型关系是一个保守的(或静态的)近似
-
-```coq
-Example has_type_not :
- ¬( ⊢ test fls zro tru ∈ Bool ).
-Proof.
- intros Contra. solve_by_inverts 2. Qed. (** 2-depth inversions **)
-```
-
-
-### `Lemma` Canonical Forms 典范形式
-
-As PLT.
-
-
-### Progress (可进性)
-
-```coq
-Theorem progress : ∀t T,
- ⊢ t ∈ T →
- value t ∨ ∃t', t --> t'.
-```
-
-> Progress vs Strong Progress?
-Progress require the "well-typeness"!
-
-> Induction on typing relation.
-
-
-### Slide Q&A
-
-- partial function yes
-- total function no
- - thinking as our inference rules.
- - we could construct some terms that no inference rules can apply and get stucked.
-
-
-### Type Preservation (维型性)
-
-```coq
-Theorem preservation : ∀t t' T,
- ⊢ t ∈ T → (** HT **)
- t --> t' → (** HE **)
- ⊢ t' ∈ T. (** HT' **)
-```
-
-> 按 PLT 的思路 Induction on HT,需要 inversion HE 去枚举所有情况拿到 t' 之后证明 HT'
-> 按 PFPL 的思路 Inudction on HE, 只需 inversion HT,因为 HT 是按 reduction 相反方向定义的!
-> - reduction 方向,AST top-down e.g. (+ 5 5) -----> 10
-> - typing 方向,AST bottom-up e.g. |- ..:N |----- |- (+ 5 5):N
-
-```coq
-Proof with eauto.
- intros t t' T HT HE.
- generalize dependent T.
- induction HE; intros T HT;
- inversion HT; subst...
- apply nvalue_in_nat... (** 除了 ST_PrdScc 全部 inversion 解决... **)
-Qed.
-```
-
-> The preservation theorem is often called _subject reduction_, -- 主语化简
-想象 term 是主语,仅仅 term 在化简,而谓语宾语不变
-
-> one might wonder whether the opposity property — _subject expansion_ — also holds. -- 主语拓张
-No, 我们可以很容易从 `(test tru zro fls)` 证明出 `|- fls \in Nat`. -- 停机问题 (undecidable)
-
-
-
-### Type Soundness (Type Safety)
-
-> a well-typed term never get stuck.
-
-```coq
-Definition multistep := (multi step). (** <--- from SmallStep **)
-Notation "t1 '-->*' t2" := (multistep t1 t2) (at level 40).
-
-Corollary soundness : ∀t t' T,
- ⊢ t ∈ T →
- t -->* t' →
- ~(stuck t').
-Proof.
- intros t t' T HT P. induction P; intros [R S].
- destruct (progress x T HT); auto.
- apply IHP. apply (preservation x y T HT H).
- unfold stuck. split; auto. Qed.
-```
-
-Induction on `-->*`, the multi-step derivation. (i.e. the reflexive-transtive closure)
-
-Noticed that in PLT, we explcitly write out what is "non-stuck".
-But here is `~(stuck t')`
-thus the proof becomes:
-
-```coq
-R : step_normal_form x (** normal form **)
-S : ~ value x (** and not value **)
-=======================
-False (** prove this is False **)
-```
-
-The proof is weird tho.
-
-
-
-
diff --git a/_posts/read_sf_plf/2019-03-07-sf-plf-07-STLC.md b/_posts/read_sf_plf/2019-03-07-sf-plf-07-STLC.md
deleted file mode 100644
index 873ddb691ea..00000000000
--- a/_posts/read_sf_plf/2019-03-07-sf-plf-07-STLC.md
+++ /dev/null
@@ -1,315 +0,0 @@
----
-title: "「SF-PLF」7 Stlc"
-subtitle: "Programming Language Foundations - The Simply Typed Lambda-Calculus"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - SF (软件基础)
- - PLF (编程语言基础)
- - Coq
- - 笔记
----
-
-this chapter:
-- (change to new syntax...)
-- function abstraction
-- variable binding -- 变量绑定
-- substitution -- 替换
-
-
-Overview
---------
-
-"Base Types", only `Bool` for now. -- 基类型
-...again, exactly following TAPL.
-
-
-```coq
-t ::=
- | x variable
- | \x:T1.t2 abstraction -- haskell-ish lambda
- | t1 t2 application
- | tru constant true
- | fls constant false
- | test t1 then t2 else t3 conditional
-
-T ::=
- | Bool
- | T → T arrow type
-
--- example
-\x:Bool. \y:Bool. x
-(\x:Bool. \y:Bool. x) fls tru
-\f:Bool→Bool. f (f tru)
-```
-
-Some known λ-idioms:
-> two-arg functions are higher-order one-arg fun, i.e. curried
-> no named functions yet, all "anonymous" -- 匿名函数
-
-
-## Slide QA 1
-
-1. 2
-2. `Bool`, `fls`
-
-
-
-
-
-
-
-Syntax
-------
-
-Formalize syntax.
-things are, as usual, in the `Type` level, so we can "check" them w/ dependent type.
-
-```coq
-Inductive ty : Type :=
- | Bool : ty
- | Arrow : ty → ty → ty.
-
-Inductive tm : Type :=
- | var : string → tm
- | app : tm → tm → tm
- | abs : string → ty → tm → tm
- | tru : tm
- | fls : tm
- | test : tm → tm → tm → tm.
-```
-
-> Noted that, `\x:T.t` (formally, `abs x T t`), the argument type is explicitly annotated (not inferred.)
-
-
-另外,这里介绍了一个小 trick: 用 `Notation` (更接近 宏 ) 而非 `Defintion` 使得我们可以使用 `auto`...
-
-```coq
-(** idB = \x:Bool. x **)
-Notation idB := (abs x Bool (var x)).
-```
-
-
-
-
-
-
-Operational Semantics
----------------------
-
-
-### Values 值
-
-- `tru` and `fls` are values
-- what about function?
- 1. `\x:T. t` is value iff `t` value. -- Coq
- 2. `\x:T. t` is always value -- most FP lang, either CBV or CBN
-
-Coq 这么做挺奇怪的,不过对 Coq 来说:
-> terms can be considered equiv up to the computation VM (在其项化简可以做到的范围内都算相等)
-> this rich the notion of Coq's value (所以 Coq 的值的概念是比一般要大的)
-
-Three ways to construct `value` (unary relation = predicate)
-
-```coq
-Inductive value : tm → Prop :=
- | v_abs : ∀x T t, value (abs x T t)
- | v_tru : value tru
- | v_fls : value fls.
-```
-
-
-### STLC Programs 「程序」的概念也是要定义的
-
-- _closed_ = term not refer any undefined var = __complete program__
-- _open term_ = term with _free variable_
-
-> Having made the choice not to reduce under abstractions, we don't need to worry about whether variables are values, since we'll always be reducing programs "from the outside in," and that means the step relation will always be working with closed terms.
-
-if we could reduce under abstraction and variables are values... What's the implication here? 始终不懂...
-
-
-### Substitution (IMPORTANT!) 替换
-
-> `[x:=s]t` and pronounced "substitute s for x in t."
-
- (\x:Bool. test x then tru else x) fls ==> test fls then tru else fls
-
-
-Important _capture_ example:
-
- [x:=tru] (\x:Bool. x) ==> \x:Bool. x -- x is bound, we need α-conversion here
- !=> \x:Bool. tru
-
-
-Informal definition...
-
- [x:=s]x = s
- [x:=s]y = y if x ≠ y
- [x:=s](\x:T11. t12) = \x:T11. t12
- [x:=s](\y:T11. t12) = \y:T11. [x:=s]t12 if x ≠ y
- [x:=s](t1 t2) = ([x:=s]t1) ([x:=s]t2)
- ...
-
-and formally:
-
-```coq
-Reserved Notation "'[' x ':=' s ']' t" (at level 20).
-Fixpoint subst (x : string) (s : tm) (t : tm) : tm :=
- match t with
- | var x' ⇒ if eqb_string x x' then s else t (* <-- computational eqb_string *)
- | abs x' T t1 ⇒ abs x' T (if eqb_string x x' then t1 else ([x:=s] t1))
- | app t1 t2 ⇒ app ([x:=s] t1) ([x:=s] t2)
- ...
-```
-
-> Computable `Fixpoint` means _meta-function_! (in metalanguage, Coq here)
-
-
-### 如果我们考虑用于替换掉某个变量的项 s 其本身也含有自由变量, 那么定义替换将会变得困难一点。
-
-Is `if x ≠ y` for function abstraction one sufficient? -- 在 PLT 中我们采取了更严格的定义
-> Only safe if we only consider `s` is closed term.
-
-Prof.Mtf:
-> here...it's not really "_defining_ on closed terms". Technically, you can still write open terms.
-> if we want, we could define the real `closed_term`...more works to prove things tho.
-
-Prof.Mtf:
-> In some more rigorous setting...we might define `well_typed_term`
-> and the definition itself is the proof of `Preservation`!
-
-
-### Slide QA 2
-
-1. (3)
-
-
-### Reduction (beta-reduction) beta-归约
-
-Should be familar
-
- value v2
- ---------------------------- (ST_AppAbs) until value, i.e. function (β-reduction)
- (\x:T.t12) v2 --> [x:=v2]t12
-
- t1 --> t1'
- ---------------- (ST_App1) reduce lhs, Function side
- t1 t2 --> t1' t2
-
- value v1
- t2 --> t2'
- ---------------- (ST_App2) reduce rhs, Arg side
- v1 t2 --> v1 t2'
-
-
-Formally,
-(I was expecting they invents some new syntax for this one...so we only have AST)
-
-```coq
-Reserved Notation "t1 '-->' t2" (at level 40).
-Inductive step : tm → tm → Prop :=
- | ST_AppAbs : ∀x T t12 v2,
- value v2 →
- (app (abs x T t12) v2) --> [x:=v2]t12
- | ST_App1 : ∀t1 t1' t2,
- t1 --> t1' →
- app t1 t2 --> app t1' t2
- | ST_App2 : ∀v1 t2 t2',
- value v1 →
- t2 --> t2' →
- app v1 t2 --> app v1 t2'
-...
-```
-
-
-### Slide QA 3
-
-1. (1) `idBB idB -> idB`
-2. (1) `idBB (idBB idB) -> idB`
-3. if () ill-typed `idBB (notB tru) -> idBB fls ....`
- - we don't type check in step
-4. (3) `idB fls`
-5. NOT...ill-typed one & open term
-
-
-
-
-
-
-
-
-Typing
-------
-
-
-### Typing Contexts 类型上下文
-
-we need something like environment but for Types.
-
-> three-place typing judgment, informally written -- 三元类型断言
-
- Gamma ⊢ t ∈ T
-
-> "under the assumptions in Gamma, the term t has the type T."
-
-```coq
-Definition context := partial_map ty.
-(X ⊢> T11, Gamma)
-```
-
-Why `partial_map` here?
-IMP can use `total_map` because it gave default value for undefined var.
-
-
-### Typing Relations
-
-
- Gamma x = T
- ---------------- (T_Var) look up
- Gamma |- x \in T
-
- (x |-> T11 ; Gamma) |- t12 \in T12
- ---------------------------------- (T_Abs) type check against context w/ arg
- Gamma |- \x:T11.t12 \in T11->T12
-
- Gamma |- t1 \in T11->T12
- Gamma |- t2 \in T11
- ---------------------- (T_App)
- Gamma |- t1 t2 \in T12
-
-
-```coq
-Example typing_example_1 :
- empty ⊢ abs x Bool (var x) ∈ Arrow Bool Bool.
-Proof.
- apply T_Abs. apply T_Var. reflexivity. Qed.
-```
-
-
-`example_2`
-- `eapply`
-- `A` ?? looks like need need another environment to look up `A`...
-
-
-
-### Typable / Deciable
-
-
-> decidable type system = decide term if typable or not.
-> done by type checker...
-
-> can we prove...?
-> `∀ Γ e, ∃ τ, (Γ ⊢ e : τ) ∨ ¬(Γ ⊢ e : τ)` -- a type inference algorithm!
-
-> Provability in Coq witness decidabile operations.
-
-
-### show term is "not typeable"
-
-Keep inversion till the contradiction.
-
-
-
diff --git a/_posts/read_sf_plf/2019-03-08-sf-plf-08-STLC-prop.md b/_posts/read_sf_plf/2019-03-08-sf-plf-08-STLC-prop.md
deleted file mode 100644
index 3dee81a8b50..00000000000
--- a/_posts/read_sf_plf/2019-03-08-sf-plf-08-STLC-prop.md
+++ /dev/null
@@ -1,255 +0,0 @@
----
-title: "「SF-PLF」8 StlcProp"
-subtitle: "Programming Language Foundations - Properties of STLC"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - SF (软件基础)
- - PLF (编程语言基础)
- - Coq
- - 笔记
----
-
-基本的定理依赖关系 top-down:
-
-Type Safety
- - Progress
- - Canonical Forms (one for each type of value)
- - Preservation
- - Substituion
- - Context Invariance (in PLT, Exchange, and Weakening)
-
-
-Canonical Forms
----------------
-
-对于我们只有 `bool` 一个 base type 的 STLC,只需要 `bool` 和 `λ`:
-
-```coq
-Lemma canonical_forms_bool : ∀t,
- empty ⊢ t ∈ Bool →
- value t →
- (t = tru) ∨ (t = fls).
-
-Lemma canonical_forms_fun : ∀t T1 T2,
- empty ⊢ t ∈ (Arrow T1 T2) →
- value t →
- ∃x u, t = abs x T1 u.
-```
-
-
-
-Progress
---------
-
-```coq
-Theorem progress : ∀t T,
- empty ⊢ t ∈ T →
- value t ∨ ∃t', t --> t'.
-```
-
-类似 `Types` 章节的 `progress` 和 PLT 中的 proof.
-
-1. induction on typing relation
-2. induction on term
-
-这两个思路的证明基本一致,
- - `auto` 上来就用把 `tru`, `fls`, `abs` 三个 `value` 的 case 干掉了,
- - take step 的 case 则需要 witness 一个 `t'`, 这时候 Canonical Form 就派上用场了
-
-
-
-
-
-Preservation
-------------
-
-_preservation theorem_
- - induction on typing; prove it type-preserving after reduction/evaluation (what about induction on reduction?)
- - `ST_AppAbs` 比较麻烦,需要做 substitution,所以我们需要证明 substituion 本身是 type-preserving...
-_substitution lemma_
- - induction on term; prove it type-preserving after a substitution
- - 替换会将 bound var 加入 Context,所以我们需要证明 free var 对于新的 Context 仍然是 type-preserving...
- - 这里我们需要 the formal definition of _free var_ as well.
-_context invariance_
- - exchange : 交换顺序显然无影响
- - weakening : 如果不是 override 的话,添加新变量显然对于之前的 well-typeness 无影响
-
-
-### Free Occurrences
-
-在 PLT/TAPL 中,我们将 "free variables of an term" 定义为一个集合 `FV(t)`. (集合是一种 computational 的概念)
-
- FV(x) = {x}
- FV(λx.t1) = FV(t1) ∪ FV(t2)
- FV(t1 t2) = FV(t1) \ {x}
-
-在这里,我们则将 "appears_free in" 定义为 var `x` 与 term `t` 上的二元关系: (读作 judgement 即可)
-
-```coq
-Inductive appears_free_in : string → tm → Prop :=
- | afi_var : ∀x,
- appears_free_in x (var x)
- | afi_app1 : ∀x t1 t2,
- appears_free_in x t1 →
- appears_free_in x (app t1 t2)
- | afi_app2 : ∀x t1 t2,
- appears_free_in x t2 →
- appears_free_in x (app t1 t2)
- | afi_abs : ∀x y T11 t12,
- y ≠ x →
- appears_free_in x t12 →
- appears_free_in x (abs y T11 t12)
- (** 省略 test **)
- ...
-
-Hint Constructors appears_free_in.
-
-(** a term with no free vars. 等价于 ¬(∃x, appears_free_in x t). **)
-Definition closed (t:tm) := ∀x, ¬appears_free_in x t.
-```
-
-> An _open term_ is one that _may_ contain free variables.
-> "Open" precisely means "possibly containing free variables."
-
-> the closed terms are a subset of the open ones.
-> closed 是 open 的子集...这样定义吗(
-
-
-### Free Vars is in Context
-
-首先我们需要一个「free var 都是 well-typed 」的 lemma
-
-```coq
-Lemma free_in_context : ∀x t T Gamma, (** 名字有一点 misleading,意思是 "free vars is in context" 而不是 "var is free in context"... **)
- appears_free_in x t →
- Gamma ⊢ t ∈ T →
- ∃T', Gamma x = Some T'.
-```
-
-由此我们可以推论 所有在 empty context 下 well typed 的 term 都是 closed 得:
-
-```coq
-Corollary typable_empty__closed : ∀t T,
- empty ⊢ t ∈ T →
- closed t.
-```
-
-
-### Context Invariance 上下文的一些「不变式」
-
-PLT 的 Weaking 和 Exchanging 其实就对应了 Gamma 作为 `partial_map` 的 `neq` 和 `permute`
-这里,我们直接进一步地证明 「term 的 well-typeness 在『free var 的值不变的 context 变化下』是 preserving 得」:
-
-```coq
-Lemma context_invariance : ∀Gamma Gamma' t T,
- Gamma ⊢ t ∈ T →
- (∀x, appears_free_in x t → Gamma x = Gamma' x) → (** <-- 这句的意思是:对于 freevar,我们有其值不变。(如果没有括号就变成所有值都不变了……)**)
- Gamma' ⊢ t ∈ T.
-```
-
-
-### Substitution!
-
-```coq
-Lemma substitution_preserves_typing : ∀Gamma x U t v T,
- (x ⊢> U ; Gamma) ⊢ t ∈ T →
- empty ⊢ v ∈ U → (** 这里我们其实 assume 被替换进来的项,即「参数」,是 closed 得。这是一个简化的版本 **)
- Gamma ⊢ [x:=v]t ∈ T.
-```
-
-> 可以被看做一种交换律 ("commutation property")
-> 即先 type check 再 substitution 和 先 substition 再 type check 是等价的
-
-Proof by induction on term __不好证,挺麻烦的__
-
-
-### Finally, Preservation
-
-```coq
-Theorem preservation : ∀t t' T,
- empty ⊢ t ∈ T →
- t --> t' →
- empty ⊢ t' ∈ T.
-```
-
-
-### Not subject expansion
-
-```coq
-Theorem not_subject_expansion:
- ~(forall t t' T, t --> t' /\ empty |- t' \in T -> empty |- t \in T).
-```
-
- (app (abs x (Arrow Bool Bool) tru) tru) -- 考虑 term
-
- (λx:Bool->Bool . tru) tru --> tru -- 可以 step
- empty |- Bool -- step 后 well-typed
-
- empty |-/- (λx:Bool->Bool . tru) tru -- 但是原 term 显然 ill-typed
-
-
-
-
-Type Soundness
---------------
-
-```coq
-(** stuck 即在不是 value 的时候无法 step **)
-Definition stuck (t:tm) : Prop :=
- (normal_form step) t ∧ ¬value t.
-
-(** well-typed term never get stuck! **)
-Corollary soundness : ∀t t' T,
- empty ⊢ t ∈ T →
- t -->* t' →
- ~(stuck t').
-```
-
-
-
-Uniqueness of Types
--------------------
-
-> 这里的 Uniqueness 与 Right-unique / deterministic / functional 其实都是相同的内涵
-
-```coq
-Theorem unique_types : ∀Gamma e T T',
- Gamma ⊢ e ∈ T →
- Gamma ⊢ e ∈ T' →
- T = T'.
-```
-
-
-
-
-
-Additional Exercises
---------------------
-
-### STLC with Arithmetic
-
-> only `Nat`...这样就不用管 the interaction between `Bool` and `Nat`
-
-```coq
-Inductive ty : Type :=
- | Arrow : ty → ty → ty
- | Nat : ty. (** <-- the only concrete base type **)
-
-
-Inductive tm : Type :=
- | var : string → tm
- | app : tm → tm → tm
- | abs : string → ty → tm → tm
- | const : nat → tm (** <-- 居然用 metalang 的 nat 而非 zro **)
- | scc : tm → tm
- | prd : tm → tm
- | mlt : tm → tm → tm
- | test0 : tm → tm → tm → tm.
-```
-
-更多拓展见下一章 `MoreStlc.v`
-
-
diff --git a/_posts/read_sf_plf/2019-03-09-sf-plf-09-more-STLC.md b/_posts/read_sf_plf/2019-03-09-sf-plf-09-more-STLC.md
deleted file mode 100644
index 27b9b5ed0b7..00000000000
--- a/_posts/read_sf_plf/2019-03-09-sf-plf-09-more-STLC.md
+++ /dev/null
@@ -1,472 +0,0 @@
----
-title: "「SF-PLF」9 MoreStlc"
-subtitle: "Programming Language Foundations - More on The Simply Typed Lambda-Calculus"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - SF (软件基础)
- - PLF (编程语言基础)
- - Coq
- - 笔记
----
-
-> make the STLC into a PL!
-
-
-
-Simple Extensions to STLC
--------------------------
-
-> 其实这一部分我好像没有任何必要做笔记……
-
-
-### Numbers
-
-See `StlcProp.v` exercise `stlc_arith`.
-
-
-
-### Let Bindings
-
-- In PLT slide, we treat `let x = t1 in e` as a derived form of `(λx . e) t1`.
-- In PLT langF, we treat `let x:T = t1 in e` as a derived form of `(λx:T . e) t1`. (both require explicit type annotation)
-
-SF here, same as TaPL, treat it _less derived_ by _compute the type `T1` from `t1`.
-- but TaPL treat it by desugar to `λ` later on, here we directly "execute" it via substituion.
-
-我想这里有一个原因是, `λ` 必须要可以独立被 typed,但是这时候我们还没有 `t1`,无法计算出 `T1`。而 `let` 的形式中包括了 `t1`,所以可以直接计算:
-
-```coq
-t ::= Terms
- | ...
- | let x=t in t let-binding
-```
-
- Reduction:
-
- t1 --> t1'
- ---------------------------------- (ST_Let1)
- let x=t1 in t2 --> let x=t1' in t2
-
- ---------------------------- (ST_LetValue) <-- substitute as λ
- let x=v1 in t2 --> [x:=v1]t2
-
- Typing:
-
- Gamma |- t1 \in T1 x|->T1; Gamma |- t2 \in T2
- -------------------------------------------------- (T_Let)
- Gamma |- let x=t1 in t2 \in T2
-
-
-
-### Pairs (Product Type)
-
-
-```coq
-t ::= Terms
- | ...
- | (t,t) pair
- | t.fst first projection
- | t.snd second projection
-
-v ::= Values
- | ...
- | (v,v) pair value
-
-T ::= Types
- | ...
- | T * T product type
-```
-
- Reduction:
-
- t1 --> t1'
- -------------------- (ST_Pair1)
- (t1,t2) --> (t1',t2)
-
- t2 --> t2'
- -------------------- (ST_Pair2)
- (v1,t2) --> (v1,t2')
-
- t1 --> t1'
- ------------------ (ST_Fst1)
- t1.fst --> t1'.fst
-
- ------------------ (ST_FstPair)
- (v1,v2).fst --> v1
-
- t1 --> t1'
- ------------------ (ST_Snd1)
- t1.snd --> t1'.snd
-
- ------------------ (ST_SndPair)
- (v1,v2).snd --> v2
-
-
- Typing:
-
- Gamma |- t1 \in T1 Gamma |- t2 \in T2
- ----------------------------------------- (T_Pair)
- Gamma |- (t1,t2) \in T1*T2
-
- Gamma |- t \in T1*T2
- --------------------- (T_Fst)
- Gamma |- t.fst \in T1
-
- Gamma |- t \in T1*T2
- --------------------- (T_Snd)
- Gamma |- t.snd \in T2
-
-
-
-### Unit (Singleton Type) 单元类型
-
-`unit` is the only value/normal form of type `Unit`, but not the only term (also any terms that would reduce to `unit`)
-
-
-```coq
-t ::= Terms
- | ...
- | unit unit -- often written `()` as well
-
-v ::= Values
- | ...
- | unit unit value
-
-T ::= Types
- | ...
- | Unit unit type -- Haskell even write this `()`
-```
-
- No reduction rule!
-
- Typing:
-
- ---------------------- (T_Unit)
- Gamma |- unit \in Unit
-
-
-> wouldn't every computation _living in_ such a type be trivial?
-> 难道不是每个计算都不会在这样的类型中_居留_吗?
-
-> Where Unit really comes in handy is in richer languages with side effects
-> 在更丰富的语言中,使用 Unit 类型来处理副作用(side effect) 会很方便
-
-
-
-### Sum Type (Disjointed Union)
-
-> deal with values that can take two distinct forms -- binary sum type
-> 两个截然不同的 ... "二元和"类型
-
-> We create elements of these types by _tagging_ elements of the component types
-> 我们在创建这些类型的值时,会为值_标记_上其"成分"类型
-
-标签 `inl`, `inr` 可以看做为函数,即 _Data Constructor_
-
- inl : Nat -> Nat + Bool
- inr : Bool -> Nat + Bool
-
-> that _"inject"_ (注入) elements of `Nat` or `Bool` into the left and right components of the sum type `Nat+Bool`
-
-不过这里并没有把他们作为 function 来形式化,而是把 `inl` `inr` 作为关键字,把 `inl t` `inr t` 作为 primitive syntactic form...
-
-
-- In PLT slide, we use `L (e)` and say the `T2` would be "guessed" to produce `T1 + T2`, as _TaPL option 1_
-- In PLT langF, we use `L [T1 +T2] (e)` i.e. provide a explicit type annotation for the sum type, as _TaPL option 3_ (ascription)
-
-SF here, use something in the middle:
-- you provide only `T2` to `L(t1)` and `T1` would be computed from `t1` to form the `T1 + T2`.
-
-
-```coq
-t ::= Terms
- | ...
- | inl T t tagging (left)
- | inr T t tagging (right)
- | case t of case
- inl x => t
- | inr x => t
-
-v ::= Values
- | ...
- | inl T v tagged value (left)
- | inr T v tagged value (right)
-
-T ::= Types
- | ...
- | T + T sum type
-```
-
- Reduction:
-
- t1 --> t1'
- ------------------------ (ST_Inl)
- inl T2 t1 --> inl T2 t1'
-
- t2 --> t2'
- ------------------------ (ST_Inr)
- inr T1 t2 --> inr T1 t2'
-
- t0 --> t0'
- ------------------------------------------- (ST_Case)
- case t0 of inl x1 => t1 | inr x2 => t2 -->
- case t0' of inl x1 => t1 | inr x2 => t2
-
- ----------------------------------------------- (ST_CaseInl)
- case (inl T2 v1) of inl x1 => t1 | inr x2 => t2
- --> [x1:=v1]t1
-
- ----------------------------------------------- (ST_CaseInr)
- case (inr T1 v2) of inl x1 => t1 | inr x2 => t2
- --> [x2:=v1]t2
-
- Typing:
-
- Gamma |- t1 \in T1
- ------------------------------ (T_Inl)
- Gamma |- inl T2 t1 \in T1 + T2
-
- Gamma |- t2 \in T2
- ------------------------------- (T_Inr)
- Gamma |- inr T1 t2 \in T1 + T2
-
- Gamma |- t \in T1+T2
- x1|->T1; Gamma |- t1 \in T
- x2|->T2; Gamma |- t2 \in T
- ---------------------------------------------------- (T_Case)
- Gamma |- case t of inl x1 => t1 | inr x2 => t2 \in T
-
-
-
-### Lists
-
-
-> The typing features we have seen can be classified into
-> - 基本类型 _base types_ like `Bool`, and
-> - 类型构造子 _type constructors_ like `→` and `*` that build new types from old ones.
-
-> In principle, we could encode lists using pairs, sums and _recursive types_. (and _type operator_ to give the type a name in SystemFω)
-
-> 但是 recursive type 太 non-trivial 了……于是我们直接处理为一个特殊的类型吧
-
-- in PLT slide, again, we omit the type and simply write `nil : List T`
- - 有趣的是, Prof.Mtf 并不满意这个,因为会有 `hd nil` 这样 stuck 的可能,所以额外给了一个用 `unlist` (unempty list) 的 def
-
-- in PLT langF, we did use pairs + sums + recursive types:
- - langF `nil : all('a . rec('b . unit + ('a * 'b)))`
- - StlcE `nil : ∀α . µβ . unit + (α ∗ β)`
-
-- in TaPL ch11, we manually provide `T` to all term (data constructor)
- - but actually, only `nil` need it! (others can be inferred by argument)
-
-and that's we did for SF here!
-
-
-```coq
-t ::= Terms
- | ...
- | nil T -- nil need explicit type annotation
- | cons t t
- | lcase t of nil => t -- a special case for list
- | x::x => t
-
-v ::= Values
- | ...
- | nil T nil value
- | cons v v cons value
-
-T ::= Types
- | ...
- | List T list of Ts
-```
-
- Reduction:
-
- t1 --> t1'
- -------------------------- (ST_Cons1)
- cons t1 t2 --> cons t1' t2
-
- t2 --> t2'
- -------------------------- (ST_Cons2)
- cons v1 t2 --> cons v1 t2'
-
- t1 --> t1'
- ------------------------------------------- (ST_Lcase1)
- (lcase t1 of nil => t2 | xh::xt => t3) -->
- (lcase t1' of nil => t2 | xh::xt => t3)
-
- ----------------------------------------- (ST_LcaseNil)
- (lcase nil T of nil => t2 | xh::xt => t3)
- --> t2
-
- ------------------------------------------------ (ST_LcaseCons)
- (lcase (cons vh vt) of nil => t2 | xh::xt => t3)
- --> [xh:=vh,xt:=vt]t3 -- multiple substi
-
-
- Typing:
-
- ------------------------- (T_Nil)
- Gamma |- nil T \in List T
-
- Gamma |- t1 \in T Gamma |- t2 \in List T
- --------------------------------------------- (T_Cons)
- Gamma |- cons t1 t2 \in List T
-
- Gamma |- t1 \in List T1
- Gamma |- t2 \in T
- (h|->T1; t|->List T1; Gamma) |- t3 \in T
- --------------------------------------------------- (T_Lcase)
- Gamma |- (lcase t1 of nil => t2 | h::t => t3) \in T
-
-
-
-
-### General Recursion (Fixpoint)
-
-通用的递归,而非 primitive recursion (PFPL)
-
-```hs
-fact = \x:Nat . if x=0 then 1 else x * (fact (pred x)))
-```
-
-这个在 Stlc 中不被允许,因为我们在定义 `fact` 的过程中发现了一个 free 的 `fact`,要么未定义,要么不是自己。
-所以我们需要 `Fixpoint`
-
-```hs
-fact = fix (\fact:Nat->Nat.
- \x:Nat . if x=0 then 1 else x * (fact (pred x)))
-```
-
-
-```coq
-t ::= Terms
- | ...
- | fix t fixed-point operator
-```
-
- Reduction:
-
- t1 --> t1'
- ------------------ (ST_Fix1)
- fix t1 --> fix t1'
-
- -------------------------------------------- (ST_FixAbs)
- fix (\xf:T1.t2) --> [xf:=fix (\xf:T1.t2)] t2 -- fix f = f (fix f)
-
- Typing:
-
- Gamma |- t1 \in T1->T1
- ---------------------- (T_Fix)
- Gamma |- fix t1 \in T1
-
-
-
-### Records
-
-这里的定义非常 informal:
-
-
-```coq
-t ::= Terms
- | ...
- | {i1=t1, ..., in=tn} record
- | t.i projection
-
-v ::= Values
- | ...
- | {i1=v1, ..., in=vn} record value
-
-T ::= Types
- | ...
- | {i1:T1, ..., in:Tn} record type
-```
-
- Reduction:
-
- ti --> ti'
- ------------------------------------ (ST_Rcd)
- {i1=v1, ..., im=vm, in=ti , ...}
- --> {i1=v1, ..., im=vm, in=ti', ...}
-
- t1 --> t1'
- -------------- (ST_Proj1)
- t1.i --> t1'.i
-
- ------------------------- (ST_ProjRcd)
- {..., i=vi, ...}.i --> vi
-
- Typing:
-
- Gamma |- t1 \in T1 ... Gamma |- tn \in Tn
- ---------------------------------------------------- (T_Rcd)
- Gamma |- {i1=t1, ..., in=tn} \in {i1:T1, ..., in:Tn}
-
- Gamma |- t \in {..., i:Ti, ...}
- ------------------------------- (T_Proj)
- Gamma |- t.i \in Ti
-
-
-### 其他
-
-提了一嘴
-
-- Variant
-- Recursive type `μ`
-
-加起来就可以
-> give us enough mechanism to build _arbitrary inductive data types_ like lists and trees from scratch
-
-Basically
-
-ADT = Unit + Product + Sum (Variant) + Function (Expo)
-
-但是 Coq 的 `Inductive` 还需要进一步的 Pi (Dependent Product), Sigma (Dependent Sum).
-
-
-
-
-Exercise: Formalizing the Extensions
-------------------------------------
-
-### STLCE definitions
-
-基本上就是把上面的 rule 用 AST 写进来
-
-
-
-### STLCE examples
-
-> a bit of Coq hackery to automate searching for typing derivation
-
-基本上就是自动化的 pattern matching + tactics
-
-```coq
-Hint Extern 2 (has_type _ (app _ _) _) =>
- eapply T_App; auto.
-
-Hint Extern 2 (has_type _ (tlcase _ _ _ _ _) _) =>
- eapply T_Lcase; auto.
-
-Hint Extern 2 (_ = _) => compute; reflexivity.
-```
-
-
-效果非常酷:typecheck 只需要 `eauto`,reduction 只需要 `normalize`.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/_posts/read_sf_plf/2019-03-10-sf-plf-10-subtyping.md b/_posts/read_sf_plf/2019-03-10-sf-plf-10-subtyping.md
deleted file mode 100644
index fb316107b2f..00000000000
--- a/_posts/read_sf_plf/2019-03-10-sf-plf-10-subtyping.md
+++ /dev/null
@@ -1,147 +0,0 @@
----
-title: "「SF-PLF」10 Sub"
-subtitle: "Programming Language Foundations - Subtyping (子类型化)"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - SF (软件基础)
- - PLF (编程语言基础)
- - Coq
- - 笔记
----
-
-
-
-Concepts
---------
-
-
-
-### The Subsumption Rule
-
-
-### The Subtype Relation
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-### Slide QA1
-
-Record Subtyping...
-
-row type
-
-
-index? record impl as list
-
-
-width/depth/permulation
-- multiple step rules
-
-
-
----
-
-
-Java
-
-1. class - no index (thinking about offset)
-
-having both width/permulation subtyping make impl slow
-- OOP - hmm
-- ML has no permulation - for perf reason (static structure) as C
-
-ML has depth?
-- a little bit by equality
-
-
-OCaml objection has all three
-
-
-### Slide QA2
-
-Looking at Contravariant!
-
-1. (2) `{i1:S,i2:T}→U <: {i1:S,i2:T,i3:V}→U`
-
-2. (4) `{i1:T,i2:V,i3:V} <: {i1:S,i2:U} * {i3:V}` is interesting:
-
-the interesting thing is, why don't we make some subtyping rules for that as well?
-
-- there are definitely _code_ can do that
-- their _runtime_ semantics are different tho they carry same information
-- __coercion__ can used for that
-
-3 and 4. (5) ...
-
-
-A <: Top => Top -> A <: A -> A -- contravariant
-
-if we only care `(A*T)`, can use `T:Top`
-
-but to type the whole thing `: A`
-
-`Top -> A`?
-but noticed that we said `\z:A.z`
-
-can we pass `A -> A` into `Top -> A`?
- more specific more general
-
-smallest -> most specific -> `A -> A`
-largest -> most specific -> `Top -> A`
-
-
-5.
-"The type Bool has no proper subtypes." (I.e., the only type smaller than Bool is Bool itself.)
-Ture unless we have Bottom
-
-hmm seems like `Bottom` in subtyping is different with Empty/Void, which is closer to logical `Bottom ⊥` since Bottom here is subtyping of everything..
-OH they are the same: (nice)
->
-
-6. True
-
-
-
-### Inversion Lemmas for Subtyping
-
-`inversion` doesn't lose information, `induction` does.
-
-auto rememeber?? --- dependent induction
-hetergeous equaltiy
-
-
-
-In soundness proof
-
-- subtyping only affects Canonical Forms + T_Sub case in induction
-
-
-> Lemma: If Gamma ⊢ \x:S1.t2 ∈ T, then there is a type S2 such that x⊢>S1; Gamma ⊢ t2 ∈ S2 and S1 → S2 <: T.
-
-why `T` not arrow? Top...
-
-
-if including Bottom...many proof becomes hard, canonical form need to say...might be Bottom?
-
-> no, no value has type Bottom (Void)...
-
-
-
-
-
-
-
-
diff --git a/_posts/read_sf_plf/2019-03-11-sf-plf-11-typechecking.md b/_posts/read_sf_plf/2019-03-11-sf-plf-11-typechecking.md
deleted file mode 100644
index fcc7c239a56..00000000000
--- a/_posts/read_sf_plf/2019-03-11-sf-plf-11-typechecking.md
+++ /dev/null
@@ -1,253 +0,0 @@
----
-title: "「SF-PLF」11. TypeChecking"
-subtitle: "Programming Language Foundations - A Typechecker for STLC"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - SF (软件基础)
- - PLF (编程语言基础)
- - Coq
- - 笔记
----
-
-> The `has_type` relation is good but doesn't give us a _executable algorithm_ -- 不是一个算法
-> but it's _syntax directed_, just one typing rule for one term (unique typing) -- translate into function!
-
-
-Comparing Types
----------------
-
-首先我们需要 check equality for types.
-这里非常简单,如果是 SystemF 会麻烦很多,对 `∀` 要做 local nameless 或者 alpha renaming:
-
-```coq
-Fixpoint eqb_ty (T1 T2:ty) : bool :=
- match T1,T2 with
- | Bool, Bool ⇒
- true
- | Arrow T11 T12, Arrow T21 T22 ⇒
- andb (eqb_ty T11 T21) (eqb_ty T12 T22)
- | _,_ ⇒
- false
- end.
-```
-
-然后我们需要一个 refl 和一个 reflection,准确得说:「define equality by computation」,反方向用 refl 即可易证
-
-```coq
-Lemma eqb_ty_refl : ∀T1,
- eqb_ty T1 T1 = true.
-
-Lemma eqb_ty__eq : ∀T1 T2,
- eqb_ty T1 T2 = true → T1 = T2.
-```
-
-
-
-The Typechecker
----------------
-
-直接 syntax directed,不过麻烦的是需要 pattern matching `option`...
-
-```coq
-Fixpoint type_check (Gamma : context) (t : tm) : option ty :=
- match t with
- | var x =>
- Gamma x
- | abs x T11 t12 =>
- match type_check (update Gamma x T11) t12 with (** <-- 对应 t12 的 rule **)
- | Some T12 => Some (Arrow T11 T12)
- | _ => None
- end
- | app t1 t2 =>
- match type_check Gamma t1, type_check Gamma t2 with
- | Some (Arrow T11 T12),Some T2 =>
- if eqb_ty T11 T2 then Some T12 else None (** eqb_ty 见下文 **)
- | _,_ => None
- end
- ...
-```
-
-在课堂时提到关于 `eqb_ty` 的一个细节(我以前也经常犯,在 ML/Haskell 中……):
-我们能不能在 pattern matching 里支持「用同一个 binding 来 imply 说他们两需要 be equal」?
-
-```coq
-(** instead of this **)
-| Some (Arrow T11 T12),Some T2 => if eqb_ty T11 T2 then ...
-
-(** can we do this? **)
-| Some (Arrow T T' ),Some T => ...
-```
-
-> the answer is __NO__ because this demands a _decidable equality_.
-> 我好奇的是,用 typeclass 是不是就可以 bake in 这个功能了?尤其是在 Coq function 还是 total 的情况下
-
-
-
-
-
-
-Digression: Improving the Notation
-----------------------------------
-
-这里我们可以自己定义一个 Haskell `do` notation 风格的 _monadic_ notation:
-
-```coq
-Notation " x <- e1 ;; e2" := (match e1 with
- | Some x ⇒ e2
- | None ⇒ None
- end)
- (right associativity, at level 60).
-
-Notation " 'return' e "
- := (Some e) (at level 60).
-
-Notation " 'fail' "
- := None.
-```
-
-好看一些吧反正:
-
-```coq
-Fixpoint type_check (Gamma : context) (t : tm) : option ty :=
- match t with
- | var x ⇒
- Gamma x
- | abs x T11 t12 ⇒
- T12 <- type_check (update Gamma x T11) t12 ;;
- return (Arrow T11 T12)
- | app t1 t2 ⇒
- T1 <- type_check Gamma t1 ;;
- T2 <- type_check Gamma t2 ;;
- match T1 with
- | Arrow T11 T12 ⇒ if eqb_ty T11 T2 then return T12 else fail
- | _ ⇒ fail
- end
-```
-
-
-Properties
-----------
-
-最后我们需要验证一下算法的正确性:
-这里的 soundness 和 completess 都是围绕 "typechecking function ~ typing relation inference rule" 这组关系来说的:
-
-```coq
-Theorem type_checking_sound : ∀Gamma t T,
- type_check Gamma t = Some T → has_type Gamma t T.
-
-Theorem type_checking_complete : ∀Gamma t T,
- has_type Gamma t T → type_check Gamma t = Some T.
-
-```
-
-
-
-Exercise
---------
-
-给 `MoreStlc.v` 里的 StlcE 写 typechecker, 然后 prove soundness / completeness (过程中用了非常 mega 的 tactics)
-
-```coq
-(** 还不能这么写 **)
-| fst p =>
- (Prod T1 T2) <- type_check Gamma p ;;
-
-
-(** 要这样……感觉是 notation 的缘故?并且要提供 fallback case 才能通过 exhaustive check 是真的 **)
-| fst p =>
- Tp <- type_check Gamma p ;;
- match Tp with
- | (Prod T1 T2) => T1
- | _ => fail
- end.
-```
-
-
-Extra Exercise (Prof.Mtf)
--------------------------
-
-> I believe this part of exercise was added by Prof. Fluet (not found in SF website version)
-
-给 `MoreStlc.v` 的 operational semantics 写 Interpreter (`stepf`), 然后 prove soundness / completeness...
-
-
-### `step` vs. `stepf`
-
-首先我们定义了 `value` 关系的函数版本 `valuef`,
-然后我们定义 `step` 关系的函数版本 `stepf`:
-
-以 pure STLC 为例:
-
-```coq
-Inductive step : tm -> tm -> Prop :=
- | ST_AppAbs : forall x T11 t12 v2,
- value v2 ->
- (app (abs x T11 t12) v2) --> [x:=v2]t12
- | ST_App1 : forall t1 t1' t2,
- t1 --> t1' ->
- (app t1 t2) --> (app t1' t2)
- | ST_App2 : forall v1 t2 t2',
- value v1 ->
- t2 --> t2' ->
- (app v1 t2) --> (app v1 t2')
-```
-```coq
-Fixpoint stepf (t : tm) : option tm :=
- match t with
- | var x => None (* We only define step for closed terms *)
- | abs x1 T1 t2 => None (* Abstraction is a value *)
- | app t1 t2 =>
- match stepf t1, stepf t2, t1 with
- | Some t1', _ , _ => Some (app t1' t2)
- | None , Some t2', _ => assert (valuef t1) (Some (app t1 t2')) (* otherwise [t1] is a normal form *)
- | None , None , abs x T t11 => assert (valuef t2) (Some ([x:=t2]t11)) (* otherwise [t1], [t2] are normal forms *)
- | _ , _ , _ => None
- end
-
-Definition assert (b : bool) (a : option tm) : option tm := if b then a else None.
-```
-
-1. 对于关系,一直就是 implicitly applied 的,在可用时即使用。
- 对于函数,我们需要手动指定 match 的顺序
-
-2. `stepf t1 => None` 只代表这是一个 `normal form`,但不一定就是 `value`,还有可能是 stuck 了,所以我们需要额外的 `assert`ion. (失败时返回异常)
- __dynamics__ 本身与 __statics__ 是正交的,在 `typecheck` 之后我们可以有 `progress`,但是现在还没有
-
-
-
-### Soundness
-
-```coq
-Theorem sound_stepf : forall t t',
- stepf t = Some t' -> t --> t'.
-```
-
-证明用了一个 given 的非常夸张的 automation...
-
-不过帮助我找到了 `stepf` 和 `step` 的多处 inconsistency:
-- 3 次做 `subst` 时依赖的 `valuef` 不能省
-- `valuef pair` 该怎么写才合适?
- 最后把 `step` 中的 `value p ->` 改成了 `value v1 -> value v2 ->`,
- 因为 `valuef (pair v1 v2)` 出来的 `valuef v1 && valuef v2` 比较麻烦。
- 但底线是:__两者必须 consistent!__ 这时就能感受到 Formal Methods 的严谨了。
-
-
-### Completeness
-
-发现了 pair 实现漏了 2 个 case……然后才发现了 `Soundness` 自动化中的 `valuef pair` 问题
-
-
-
-Extra (Mentioned)
------------------
------
-
-[Church Style vs. Curry Style](https://lispcast.com/church-vs-curry-types/)
-[Rice's Theorem](https://en.wikipedia.org/wiki/Rice%27s_theorem)
-
-CakeML
-- prove correctness of ML lang compiler
-- latest paper on verifying GC
diff --git a/_posts/read_sf_plf/2019-03-12-sf-plf-12-records.md b/_posts/read_sf_plf/2019-03-12-sf-plf-12-records.md
deleted file mode 100644
index 1e2a18d4fb8..00000000000
--- a/_posts/read_sf_plf/2019-03-12-sf-plf-12-records.md
+++ /dev/null
@@ -1,40 +0,0 @@
----
-title: "「SF-PLF」12 Records"
-subtitle: "Programming Language Foundations - Adding Records To STLC"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - SF (软件基础)
- - PLF (编程语言基础)
- - Coq
- - 笔记
----
-
-
-## Adding Records
-
-
-```coq
-t ::= Terms:
- | {i1=t1, ..., in=tn} record
- | t.i projection
- | ...
-
-v ::= Values:
- | {i1=v1, ..., in=vn} record value
- | ...
-
-T ::= Types:
- | {i1:T1, ..., in:Tn} record type
- | ...
-```
-
-
-## Formalizing Records
-
-
-
-
-
diff --git a/_posts/read_sf_plf/2019-03-13-sf-plf-13-references.md b/_posts/read_sf_plf/2019-03-13-sf-plf-13-references.md
deleted file mode 100644
index b99b99a9e9a..00000000000
--- a/_posts/read_sf_plf/2019-03-13-sf-plf-13-references.md
+++ /dev/null
@@ -1,331 +0,0 @@
----
-title: "「SF-PLF」13 References"
-subtitle: "Programming Language Foundations - Typing Mutable References"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - SF (软件基础)
- - PLF (编程语言基础)
- - Coq
- - 笔记
----
-
-> Hux: this chapter is very similar to TAPL - ch13 References
-> But under a "formal verification" concept, it's more interesting and practical and push you to think about it!
-
-
-_computational effects_ - "side effects" of computation - _impure_ features
-- assign to mutable variables (reference cells, arrays, mutable record fields, etc.)
-- perform input and output to files, displays, or network connections;
-- make non-local transfers of control via exceptions, jumps, or continuations;
-- engage in inter-process synchronization and communication
-
-
-> The main extension will be dealing explicitly with a
-> - _store_ (or _heap_) and
-> - _pointers_ (or _reference_) that name _store locations_, or _address_...
-
-interesting refinement: type preservation
-
-
-
-Definition
-----------
-
-forms of assignments:
-- rare : Gallina - No
-- some : ML family - Explicit _reference_ and _dereference_
-- most : C family - Implicit ...
-
-For formal study, use ML's model.
-
-
-
-Syntax
-------
-
-### Types & Terms
-
-```coq
-T ::=
- | Nat
- | Unit
- | T → T
- | Ref T
-
-t ::=
- | ... Terms
- | ref t allocation
- | !t dereference
- | t := t assignment
- | l location
-```
-```coq
-Inductive ty : Type :=
- | Nat : ty
- | Unit : ty
- | Arrow : ty → ty → ty
- | Ref : ty → ty.
-
-Inductive tm : Type :=
- (* STLC with numbers: *)
- ...
- (* New terms: *)
- | unit : tm
- | ref : tm → tm
- | deref : tm → tm
- | assign : tm → tm → tm
- | loc : nat → tm. (** 这里表示 l 的方式是 wrap 一个 nat as loc **)
-```
-
-
-### Typing
-
-
- Gamma |- t1 : T1
- ------------------------ (T_Ref)
- Gamma |- ref t1 : Ref T1
-
- Gamma |- t1 : Ref T11
- --------------------- (T_Deref)
- Gamma |- !t1 : T11
-
- Gamma |- t1 : Ref T11
- Gamma |- t2 : T11
- ------------------------ (T_Assign)
- Gamma |- t1 := t2 : Unit
-
-
-### Values and Substitution
-
-```coq
-Inductive value : tm → Prop :=
- ...
- | v_unit : value unit
- | v_loc : ∀l, value (loc l). (* <-- 注意这里是一个 Π (l:nat) . value (loc l) *)
-```
-
-```coq
-Fixpoint subst (x:string) (s:tm) (t:tm) : tm :=
- match t with
- ...
- | unit ⇒ t
- | ref t1 ⇒ ref (subst x s t1)
- | deref t1 ⇒ deref (subst x s t1)
- | assign t1 t2 ⇒ assign (subst x s t1) (subst x s t2)
- | loc _ ⇒ t
- end.
-```
-
-
-
-
-Pragmatics
-----------
-
-
-### Side Effects and Sequencing
-
- r:=succ(!r); !r
-
-can be desugar to
-
- (\x:Unit. !r) (r:=succ(!r)).
-
-then we can write some "imperative programming"
-
- r:=succ(!r);
- r:=succ(!r);
- r:=succ(!r);
- !r
-
-
-### References and Aliasing
-
-_shared reference_ brings __shared state_
-
- let r = ref 5 in
- let s = r in
- s := 82;
- (!r)+1
-
-
-### Shared State
-
-_thunks_ as _methods_
-
-```haskell
-
- let c = ref 0 in
- let incc = \_:Unit. (c := succ (!c); !c) in
- let decc = \_:Unit. (c := pred (!c); !c) in (
- incc unit;
- incc unit; -- in real PL: the concrete syntax is `incc()`
- decc unit
- )
-
-```
-
-
-### Objects
-
-_constructor_ and _encapsulation_!
-
-```haskell
-
- newcounter =
- \_:Unit. -- add `(self, init_val)` would make it more "real"
- let c = ref 0 in -- private and only accessible via closure (特权方法)
- let incc = \_:Unit. (c := succ (!c); !c) in
- let decc = \_:Unit. (c := pred (!c); !c) in
- { i=incc,
- d=decc } -- return a "record", or "struct", or "object"!
-
-```
-
-
-### References to Compound Types (e.g. Function Type)
-
-Previously, we use _closure_ to represent _map_, with _functional update_
-这里的"数组" (这个到底算不算数组估计都有争议,虽然的确提供了 index 但是这个显然是 O(n) 都不知道算不算 random access...
-并不是 in-place update 里面的数据的,仅仅是一个 `ref` 包住的 map 而已 (仅仅是多了可以 shared
-
-其实或许 `list (ref nat)` 也可以表达数组? 反正都是 O(n) 每次都 linear search 也一样……
-
-```haskell
-
- newarray = \_:Unit. ref (\n:Nat.0)
- lookup = \a:NatArray. \n:Nat. (!a) n
- update = \a:NatArray. \m:Nat. \v:Nat.
- let oldf = !a in
- a := (\n:Nat. if equal m n then v else oldf n);
-
-```
-
-
-### Null References
-
-_nullptr_!
-
-Deref a nullptr:
-- exception in Java/C#
-- insecure in C/C++ <-- violate memory safety!!
-
-```haskell
-
- type Option T = Unit + T
- type Nullable T = Option (Ref T)
-
-```
-
-
-Why is `Option` outside?
-think about C, `nullptr` is A special _const_ location, like `Unit` (`None` in terms of datacon) here.
-
-
-### Garbage Collection
-
-last issue: store _de-allocation_
-
-> w/o GC, extremely difficult to achieve type safety...if a primitive for "explicit deallocation" provided
-> one can easily create _dangling reference_ i.e. references -> deleted
-
-One type-unsafe example: (pseudo code)
-
-```haskell
-
- a : Ref Nat = ref 1; -- alloc loc 0
- free(a); -- free loc 0
- b : Ref Bool = ref True; -- alloc loc 0
-
- a := !a + 1 -- BOOM!
-
-```
-
-
-
-
-
-Operational Semantics
----------------------
-
-
-### Locations
-
-> what should be the _values_ of type `Ref T`?
-
-`ref` allocate some memory/storage!
-
-> run-time store is essentially big array of bytes.
-> different datatype need to allocate different size of space (region)
-
-> we think store as _array of values_, _abstracting away different size of different values_
-> we use the word _location_ here to prevent from modeling _pointer arithmetic_, which is un-trackable by most type system
-
-location `n` is `float` doesn't tell you anything about location `n+4`...
-
-
-
-### Stores
-
-we defined `replace` as `Fixpoint` since it's computational and easier. The consequence is it has to be total.
-
-
-
-### Reduction
-
-
-
-
-
-Typing
-------
-
-typing context:
-
-```coq
-Definition context := partial_map ty.
-```
-
-### Store typings
-
-why not just make a _context_ a map of pair?
-we don't want to complicate the dynamics of language,
-and this store typing is only for type check.
-
-
-
-### The Typing Relation
-
-
-
-
-
-
-Properties
-----------
-
-### Well-Typed Stores
-
-### Extending Store Typings
-
-### Preservation, Finally
-
-### Substitution Lemma
-
-### Assignment Preserves Store Typing
-
-### Weakening for Stores
-
-### Preservation!
-
-### Progress
-
-
-
-
-
-References and Nontermination
------------------------------
diff --git a/_posts/read_sf_plf/2019-03-14-sf-plf-14-record-sub.md b/_posts/read_sf_plf/2019-03-14-sf-plf-14-record-sub.md
deleted file mode 100644
index a4f0e5a4e1f..00000000000
--- a/_posts/read_sf_plf/2019-03-14-sf-plf-14-record-sub.md
+++ /dev/null
@@ -1,42 +0,0 @@
----
-title: "「SF-PLF」14 RecordSub"
-subtitle: "Programming Language Foundations - Subtyping with Records"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - SF (软件基础)
- - PLF (编程语言基础)
- - Coq
- - 笔记
----
-
-
-```coq
-Inductive ty : Type :=
- (* record types *)
- | RNil : ty
- | RCons : string → ty → ty → ty.
-```
-
-we need typecon to identify record...
-
-
-```coq
-Inductive tm : Type :=
- | rproj ...? isn't it as well?
- (* record terms *)
- | rnil : tm
- | rcons : string → tm → tm → tm.
-``
-
-as a list...
-
-
-for Record, can compiler reorder the fields? (SML and OCaml)
-
-
-
-
-
diff --git a/_posts/read_sf_plf/2019-03-15-sf-plf-15-norm-STLC.md b/_posts/read_sf_plf/2019-03-15-sf-plf-15-norm-STLC.md
deleted file mode 100644
index d15e83b2cdb..00000000000
--- a/_posts/read_sf_plf/2019-03-15-sf-plf-15-norm-STLC.md
+++ /dev/null
@@ -1,15 +0,0 @@
----
-title: "「SF-PLF」15 Norm"
-subtitle: "Programming Language Foundations - Normalization of STLC"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - SF (软件基础)
- - PLF (编程语言基础)
- - Coq
- - 笔记
----
-
-TBD
diff --git a/_posts/read_sf_plf/2019-03-16-sf-plf-16-lib-tactics.md b/_posts/read_sf_plf/2019-03-16-sf-plf-16-lib-tactics.md
deleted file mode 100644
index 60b51ab2a71..00000000000
--- a/_posts/read_sf_plf/2019-03-16-sf-plf-16-lib-tactics.md
+++ /dev/null
@@ -1,15 +0,0 @@
----
-title: "「SF-PLF」16 LibTactics"
-subtitle: "Programming Language Foundations - A Collection of Handy General-Purpose Tactics"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - SF (软件基础)
- - PLF (编程语言基础)
- - Coq
- - 笔记
----
-
-TBD
diff --git a/_posts/read_sf_plf/2019-03-17-sf-plf-17-use-tactics.md b/_posts/read_sf_plf/2019-03-17-sf-plf-17-use-tactics.md
deleted file mode 100644
index 3c3beb34c58..00000000000
--- a/_posts/read_sf_plf/2019-03-17-sf-plf-17-use-tactics.md
+++ /dev/null
@@ -1,160 +0,0 @@
----
-title: "「SF-PLF」17 UseTactics"
-subtitle: "Programming Language Foundations - Tactic Library For Coq"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - SF (软件基础)
- - PLF (编程语言基础)
- - Coq
- - 笔记
----
-
-```coq
-From PLF Require Import LibTactics.
-```
-
-`LibTactics` vs. `SSReflect` (another tactics package)
-
-- for PL vs. for math
-- traditional vs. rethinks..so harder
-
-
-Tactics for Naming and Performing Inversion
--------------------------------------------
-
-### `introv`
-
-```coq
-Theorem ceval_deterministic: ∀c st st1 st2,
- st =[ c ]⇒ st1 →
- st =[ c ]⇒ st2 →
- st1 = st2.
-intros c st st1 st2 E1 E2. (* 以往如果想给 Hypo 命名必须说全 *)
-introv E1 E2. (* 现在可以忽略 forall 的部分 *)
-```
-
-### `inverts`
-
-```coq
-(* was... 需要 subst, clear *)
-- inversion H. subst. inversion H2. subst.
-(* now... *)
-- inverts H. inverts H2.
-
-
-(* 可以把 invert 出来的东西放在 goal 的位置让你自己用 intro 命名!*)
-inverts E2 as.
-```
-
-
-
-
-
-
-
-Tactics for N-ary Connectives
------------------------------
-
-> Because Coq encodes conjunctions and disjunctions using binary constructors ∧ and ∨...
-> to work with a `N`-ary logical connectives...
-
-### `splits`
-
-> n-ary conjunction
-
-n-ary `split`
-
-
-### `branch`
-
-> n-ary disjunction
-
-faster `destruct`?
-
-
-
-
-
-
-Tactics for Working with Equality
----------------------------------
-
-
-### `asserts_rewrite` and `cuts_rewrite`
-
-
-### `substs`
-
-better `subst` - not fail on circular eq
-
-
-### `fequals`
-
-vs `f_equal`?
-
-
-### `applys_eq`
-
-variant of `eapply`
-
-
-
-
-
-Some Convenient Shorthands
---------------------------
-
-
-### `unfolds`
-
-better `unfold`
-
-
-### `false` and `tryfalse`
-
-better `exfalso`
-
-
-### `gen`
-
-shorthand for `generalize dependent`, multiple arg.
-
-```coq
-(* old *)
-intros Gamma x U v t S Htypt Htypv.
-generalize dependent S. generalize dependent Gamma.
-
-(* new...so nice!!! *)
-introv Htypt Htypv. gen S Gamma.
-```
-
-
-### `admits`, `admit_rewrite` and `admit_goal`
-
-wrappers around `admit`
-
-
-### `sort`
-
-> proof context more readable
-
-vars -> top
-hypotheses -> bottom
-
-
-
-
-
-
-
-Tactics for Advanced Lemma Instantiation
-----------------------------------------
-
-
-### Working on `lets`
-
-### Working on `applys`, `forwards` and `specializes`
-
diff --git a/_posts/read_sf_plf/2019-03-18-sf-plf-18-use-auto.md b/_posts/read_sf_plf/2019-03-18-sf-plf-18-use-auto.md
deleted file mode 100644
index 0287e48c61b..00000000000
--- a/_posts/read_sf_plf/2019-03-18-sf-plf-18-use-auto.md
+++ /dev/null
@@ -1,70 +0,0 @@
----
-title: "「SF-PLF」18 UseAuto"
-subtitle: "Programming Language Foundations - Theory And Practice Of Automation In Coq Proofs"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - SF (软件基础)
- - PLF (编程语言基础)
- - Coq
- - 笔记
----
-
-
-
-## Basic Features of Proof Search
-
-### Strength of Proof Search
-
-> four proof-search tactics: `auto`, `eauto`, `iauto` and `jauto`.
-
-
-
-
----
-
-
-## How Proof Search Works
-
-### Search Depth
-
-### Backtracking
-
-### Adding Hints
-
-### Integration of Automation in Tactics
-
-
-
----
-
-
-
-## Example Proofs
-
-
-
----
-
-
-
-## Advanced Topics in Proof Search
-
-
-###
-
-
----
-
-
-## Decision Procedures
-
-
-### Omega
-
-### Ring
-
-### Congurence
-
diff --git a/_posts/read_sf_plf/2019-03-19-sf-plf-19-partial-eval.md b/_posts/read_sf_plf/2019-03-19-sf-plf-19-partial-eval.md
deleted file mode 100644
index 47666eab0d2..00000000000
--- a/_posts/read_sf_plf/2019-03-19-sf-plf-19-partial-eval.md
+++ /dev/null
@@ -1,15 +0,0 @@
----
-title: "「SF-PLF」19 PE"
-subtitle: "Programming Language Foundations - Partial Evaluation"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - SF (软件基础)
- - PLF (编程语言基础)
- - Coq
- - 笔记
----
-
-TBD
diff --git a/_posts/read_sf_qc/2019-09-02-sf-qc-02-typeclasses.md b/_posts/read_sf_qc/2019-09-02-sf-qc-02-typeclasses.md
deleted file mode 100644
index 79acd51316d..00000000000
--- a/_posts/read_sf_qc/2019-09-02-sf-qc-02-typeclasses.md
+++ /dev/null
@@ -1,796 +0,0 @@
----
-title: "「SF-QC」2 TypeClasses"
-subtitle: "Quickcheck - A Tutorial on Typeclasses in Coq"
-layout: post
-author: "Hux"
-header-style: text
-hidden: true
-tags:
- - SF (软件基础)
- - QC (Quickcheck)
- - Coq
- - 笔记
----
-
-Considerring printing different types with this common idiom:
-
-```coq
-showBool : bool → string
-showNat : nat → string
-showList : {A : Type} (A → string) → (list A) → string
-showPair : {A B : Type} (A → string) → (B → string) → A * B → string
-
-Definition showListOfPairsOfNats := showList (showPair showNat showNat) (* LOL *)
-```
-
-> The designers of Haskell addressed this clunkiness through _typeclasses_, a mechanism by which the typechecker is instructed to automatically construct "type-driven" functions [Wadler and Blott 1989].
-
-Coq followed Haskell's lead as well, but
-
-> because Coq's type system is so much richer than that of Haskell, and because typeclasses in Coq are used to automatically construct not only programs but also proofs, Coq's presentation of typeclasses is quite a bit less "transparent"
-
-
-Basics
-------
-
-### Classes and Instances
-
-```coq
-Class Show A : Type := {
- show : A → string
-}.
-
-Instance showBool : Show bool := {
- show := fun b:bool ⇒ if b then "true" else "false"
-}.
-```
-
-Comparing with Haskell:
-
-```haskell
-class Show a where
- show :: a -> string
-
--- you cannot override a `instance` so in reality you need a `newtype` wrapper to do this
-instance Show Bool where
- show b = if b then "True" else "Fasle"
-```
-
-> The show function is sometimes said to be overloaded, since it can be applied to arguments of many types, with potentially radically different behavior depending on the type of its argument.
-
-
-Next, we can define functions that use the overloaded function show like this:
-
-```coq
-Definition showOne {A : Type} `{Show A} (a : A) : string :=
- "The value is " ++ show a.
-
-Compute (showOne true).
-Compute (showOne 42).
-
-Definition showTwo {A B : Type}
- `{Show A} `{Show B} (a : A) (b : B) : string :=
- "First is " ++ show a ++ " and second is " ++ show b.
-
-Compute (showTwo true 42).
-Compute (showTwo Red Green).
-```
-
-> The parameter `` `{Show A}`` is a _class constraint_, which states that the function showOne is expected to be applied only to types A that belong to the Show class.
-
-> Concretely, this constraint should be thought of as an _extra parameter_ to showOne supplying _evidence_ that A is an instance of Show — i.e., it is essentially just a show function for A, which is implicitly invoked by the expression show a.
-
-读时猜测(后来发现接下来有更正确的解释):`show` 在 name resolution 到 `class Show` 时就可以根据其参数的 type(比如 `T`)infer 出「我们需要一个 `Show T` 的实现(`instance`,其实就是个 table)」,在 Haskell/Rust 中这个 table 会在 lower 到 IR 时才 made explicit,而 Coq 这里的语法就已经强调了这里需要 implicitly-and-inferred `{}` 一个 table,这个 table 的名字其实不重要,只要其 type 是被 `A` parametrized 的 `Show` 就好了,类似 ML 的 `functor` 或者 Java 的 generic `interface`。
-
-This is _Ad-hoc polymorphism_.
-
-
-#### Missing Constraint
-
-What if we forget the class constrints:
-
-```coq
-Error:
-Unable to satisfy the following constraints:
-In environment:
-A : Type
-a : A
-
-?Show : "Show A"
-```
-
-
-#### Class `Eq`
-
-```coq
-Class Eq A :=
- {
- eqb: A → A → bool;
- }.
-
-Notation "x =? y" := (eqb x y) (at level 70).
-
-Instance eqBool : Eq bool :=
- {
- eqb := fun (b c : bool) ⇒
- match b, c with
- | true, true ⇒ true
- | true, false ⇒ false
- | false, true ⇒ false
- | false, false ⇒ true
- end
- }.
-
-Instance eqNat : Eq nat :=
- {
- eqb := Nat.eqb
- }.
-```
-
-> Why should we need to define a typeclass for boolean equality when _Coq's propositional equality_ (`x = y`) is completely generic?
-> while it makes sense to _claim_ that two values `x` and `y` are equal no matter what their type is, it is not possible to write a _decidable equality checker_ for arbitrary types. In particular, equality at types like `nat → nat` is undecidable.
-
-`x = y` 返回一个需要去证的 `Prop` (relational) 而非 executable `Fixpoint` (functional)
-因为 function 的 equality 有时候会 undeciable,所以才需要加 Functional Extensionality `Axiom`(见 LF-06)
-
-```coq
-Instance eqBoolArrowBool: Eq (bool -> bool) :=
- {
- eqb := fun (f1 f2 : bool -> bool) =>
- (f1 true) =? (f2 true) && (f1 false) =? (f2 false)
- }.
-
-Compute (id =? id). (* ==> true *)
-Compute (negb =? negb). (* ==> true *)
-Compute (id =? negb). (* ==> false *)
-```
-
-这里这个 `eqb` 的定义也是基于 extensionality 的定义,如果考虑到 effects(divergence、IO)是很容易 break 的(类似 parametricity)
-
-
-
-### Parameterized Instances: New Typeclasses from Old
-
-Structural recursion
-
-```coq
-Instance showPair {A B : Type} `{Show A} `{Show B} : Show (A * B) :=
- {
- show p :=
- let (a,b) := p in
- "(" ++ show a ++ "," ++ show b ++ ")"
- }.
-Compute (show (true,42)).
-```
-
-Structural equality
-
-```coq
-Instance eqPair {A B : Type} `{Eq A} `{Eq B} : Eq (A * B) :=
- {
- eqb p1 p2 :=
- let (p1a,p1b) := p1 in
- let (p2a,p2b) := p2 in
- andb (p1a =? p2a) (p1b =? p2b)
- }.
-```
-
-Slightly more complicated example: typical list:
-
-```coq
-(* the book didn't use any from ListNotation *)
-Fixpoint showListAux {A : Type} (s : A → string) (l : list A) : string :=
- match l with
- | nil ⇒ ""
- | cons h nil ⇒ s h
- | cons h t ⇒ append (append (s h) ", ") (showListAux s t)
- end.
-Instance showList {A : Type} `{Show A} : Show (list A) :=
- {
- show l := append "[" (append (showListAux show l) "]")
- }.
-
-(* I used them though *)
-Fixpoint eqListAux {A : Type} `{Eq A} (l1 l2 : list A) : bool :=
- match l1, l2 with
- | nil, nil => true
- | (h1::t1), (h2::t2) => (h1 =? h2) && (eqListAux t1 t2)
- | _, _ => false
- end.
-
-Instance eqList {A : Type} `{Eq A} : Eq (list A) :=
- {
- eqb l1 l2 := eqListAux l1 l2
- }.
-```
-
-
-
-### Class Hierarchies
-
-> we might want a typeclass `Ord` for "ordered types" that support both equality and a less-or-equal comparison operator.
-
-A bad way would be declare a new class with two func `eq` and `le`.
-
-It's better to establish dependencies between typeclasses, similar with OOP `class` inheritence and subtyping (but better!), this gave good code reuses.
-
-> We often want to organize typeclasses into hierarchies.
-
-```coq
-Class Ord A `{Eq A} : Type :=
- {
- le : A → A → bool
- }.
-Check Ord. (* ==>
-Ord
- : forall A : Type, Eq A -> Type
-*)
-```
-
-class `Eq` is a "super(type)class" of `Ord` (not to be confused with OOP superclass)
-
-This is _Sub-typeclassing_.
-
-```coq
-Fixpoint listOrdAux {A : Type} `{Ord A} (l1 l2 : list A) : bool :=
- match l1, l2 with
- | [], _ => true
- | _, [] => false
- | h1::t1, h2::t2 => if (h1 =? h2)
- then (listOrdAux t1 t2)
- else (le h1 h2)
- end.
-
-Instance listOrd {A : Type} `{Ord A} : Ord (list A) :=
- {
- le l1 l2 := listOrdAux l1 l2
- }.
-
-(* truthy *)
-Compute (le [1] [2]).
-Compute (le [1;2] [2;2]).
-Compute (le [1;2;3] [2]).
-
-(* falsy *)
-Compute (le [1;2;3] [1]).
-Compute (le [2] [1;2;3]).
-```
-
-
-
-How It works
-------------
-
-### Implicit Generalization
-
-所以 `` `{...}`` 这个 "backtick" notation is called _implicit generalization_,比 implicit `{}` 多做了一件自动 generalize 泛化 free varabile 的事情。
-
-> that was added to Coq to support typeclasses but that can also be used to good effect elsewhere.
-
-```coq
-Definition showOne1 `{Show A} (a : A) : string :=
- "The value is " ++ show a.
-
-Print showOne1.
-(* ==>
- showOne1 =
- fun (A : Type) (H : Show A) (a : A) => "The value is " ++ show a
- : forall A : Type, Show A -> A -> string
-
- Arguments A, H are implicit and maximally inserted
-*)
-```
-
-> notice that the occurrence of `A` inside the `` `{...}`` is unbound and automatically insert the binding that we wrote explicitly before.
-
-> The "implicit and maximally generalized" annotation on the last line means that the automatically inserted bindings are treated (注:printed) as if they had been written with `{...}`, rather than `(...)`.
-
-> The "implicit" part means that the type argument `A` and the `Show` witness `H` are usually expected to be left implicit
-> whenever we write `showOne1`, Coq will automatically insert two _unification variables_ as the first two arguments.
-
-> This automatic insertion can be disabled by writing `@`, so a bare occurrence of `showOne1` means the same as `@showOne1 _ _`
-
-这里的 witness `H` 即 `A` implements `Show` 的 evidence,本质就是个 table or record,可以 written more explicitly:
-
-```coq
-Definition showOne2 `{_ : Show A} (a : A) : string :=
- "The value is " ++ show a.
-
-Definition showOne3 `{H : Show A} (a : A) : string :=
- "The value is " ++ show a.
-```
-
-甚至
-
-```coq
-Definition showOne4 `{Show} a : string :=
- "The value is " ++ show a.
-```
-
-```coq
-showOne =
-fun (A : Type) (H : Show A) (a : A) => "The value is " ++ show a
- : forall A : Type, Show A -> A -> string
-
-Set Printing Implicit.
-
-showOne =
-fun (A : Type) (H : Show A) (a : A) => "The value is " ++ @show A H a (* <-- 注意这里 *)
- : forall A : Type, Show A -> A -> string
-```
-
-#### vs. Haskell
-
-顺便,Haskell 的话,`Show` 是可以直接 inferred from the use of `show` 得
-
-```haskell
-Prelude> showOne a = show a
-Prelude> :t showOne
-showOne :: Show a => a -> String
-```
-
-但是 Coq 不行,会退化上「上一个定义的 instance Show」,还挺奇怪的(
-
-```coq
-Definition showOne5 a : string := (* not generalized *)
- "The value is " ++ show a.
-```
-
-#### Free Superclass Instance
-
-``{Ord A}` led Coq to fill in both `A` and `H : Eq A` because it's the superclass of `Ord` (appears as the second argument).
-
-```coq
-Definition max1 `{Ord A} (x y : A) :=
- if le x y then y else x.
-
-Set Printing Implicit.
-Print max1.
-(* ==>
- max1 =
- fun (A : Type) (H : Eq A) (H0 : @Ord A H) (x y : A) =>
- if @le A H H0 x y then y else x
-
- : forall (A : Type) (H : Eq A),
- @Ord A H -> A -> A -> A
-*)
-Check Ord.
-(* ==> Ord : forall A : Type, Eq A -> Type *)
-```
-
-`Ord` type 写详细的话可以是:
-
-```coq
-Ord : forall (A : Type), (H: Eq A) -> Type
-```
-
-
-#### Other usages of `` `{} ``
-
-Implicit generalized `Prop` mentioning free vars.
-
-```coq
-Generalizable Variables x y.
-
-Lemma commutativity_property : `{x + y = y + x}.
-Proof. intros. omega. Qed.
-
-Check commutativity_property.
-```
-
-Implicit generalized `fun`/`λ`, however...
-
-```coq
-Definition implicit_fun := `{x + y}.
-Compute (implicit_fun 2 3) (* ==> Error *)
-Compute (@implicit_fun 2 3)
-```
-
-Implicitly-generalized but inserted as explicit via `` `(...)``
-
-```coq
-Definition implicit_fun := `(x + y).
-Compute (implicit_fun 2 3)
-```
-
-这里可以看到 Coq 的所有语法都是正交的(非常牛逼……)
-- `()`/`{}` 控制是否是 implicit argument
-- `` ` ``-prefix 控制是否做 implicit generalization
- - N.B. 可能你忘记了但是 `→` is degenerated `∀` (`Π`),所以 generalization 自然会生成 `fun`
-
-
-### Records are Products
-
-> Record types must be declared before they are used. For example:
-
-```coq
-Record Point :=
- Build_Point
- {
- px : nat;
- py : nat
- }.
-
-(* built with constructor *)
-Check (Build_Point 2 4).
-
-(* built with record syntax *)
-Check {| px := 2; py := 4 |}.
-Check {| py := 2; px := 4 |}.
-
-(* field access, with a clunky "dot notation" *)
-Definition r : Point := {| px := 2; py := 4 |}.
-Compute (r.(px) + r.(py)).
-```
-
-和 OCaml 一样是 nominal typing 而非 structural typing。
-类似于 OCaml 中的 record 其实到 backend 了就会和 tuple 等价:都会 lower 到 Heap Block),
-Coq 中的 Record 其实和 Pair/Product 也是等价:都是 arity 为 2 的 Inductive type:
-
-```coq
-Inductive Point : Set :=
- | Build_Point : nat → nat → Point.
-```
-
-我仿造 `Print px.` 输出的定义模拟了一下:
-
-```coq
-Inductive Point2 : Set :=
- | Build_Point2 (px2:nat) (py2:nat).
-Definition px2 := fun p : Point2 => let (px, _) := p in px.
-Definition py2 := fun p : Point2 => let (_, py) := p in py.
-
-Definition r2 : Point2 := Build_Point2 2 4.
-Compute (r2.(px2) + r2.(py2)). (* => 6 *)
-
-Definition r2 : Point2 := {| px2 := 2; py2 := 4 |}. (* Error: px2 is not a projection *)
-```
-
-可以发现 dot notation 是可以工作的,`.` 应该只是一个 pipe
-但是 `{|...|}` 不知道为什么这里会认为 `px2` 不是一个 record projection.
-
-
-> Note that the field names have to be different. Any given field name can belong to only one record type.
-> This greatly simplifies type inference!
-
-
-### Typeclasses are Records
-
-> Typeclasses and instances, in turn, are basically just syntactic sugar for record types and values (together with a bit of magic for using proof search to fill in appropriate instances during typechecking...
-
-> Internally, a typeclass declaration is elaborated into a _parameterized_ `Record` declaration:
-
-```coq
-Class Show A : Type := { show : A → string }.
-
-Print Show.
-Record Show (A : Type) : Type :=
- Build_Show { show : A -> string }
-
-Set Printing All.
-Print Show.
-Variant Show (A : Type) : Type :=
- Build_Show : forall _ : forall _ : A, string, Show A
-
-(* to make it more clear... *)
-Inductive Show (A : Type) : Type :=
- | Build_Show : ∀(show : ∀(a : A), string), Show A
-
-(* or more GADT looking, i.e., implicit generalized *)
-Inductive Show (A : Type) : Type :=
- | Build_Show : (A -> string) -> Show A
-```
-
-Coq actually call a single-field record `Variant`.
-Well actually, I found it's for any single-constructor `Inductive`ly constructed type.
-You can even use `Variant` nonchangbly with `Inductive` as a keyword...
-
-```coq
-Set Printing All.
-Print Point.
-Variant Point : Set :=
- Build_Point : forall (_ : nat) (_ : nat), Point
-```
-
-> Analogously, Instance declarations become record values:
-
-```coq
-Print showNat.
-showNat = {| show := string_of_nat |}
- : Show nat
-```
-
-> Similarly, overloaded functions like show are really just _record projections_, which in turn are just functions that select a particular argument of a one-constructor Inductive type.
-
-```coq
-Print show.
-show =
- fun (A : Type) (Show0 : Show A) =>
- let (show) := Show0 in show
- : forall A : Type, Show A -> A -> string
-
-Set Printing All.
-Print show.
-show =
- fun (A : Type) (Show0 : Show A) =>
- match Show0 return (forall _ : A, string) with
- | Build_Show _ show => show
- end
- : forall (A : Type) (_ : Show A) (_ : A), string
-```
-
-
-### Inferring Instances
-
-> appropriate instances are automatically inferred (and/or constructed!) during typechecking.
-
-```coq
-Definition eg42 := show 42.
-
-Set Printing Implicit.
-Print eg42.
-eg42 = @show nat showNat 42 : string
-```
-
-different with `Compute`, `Print` 居然还可以这么把所有 implicit argument (after inferred) 都给 print 出来……
-
-type inferrence:
-
-- `show` is expanded to `@show _ _ 42`
-- obviously it's `@show nat __42`
-- obviously it's `@show nat (?H : Show Nat) 42`
-
-Okay now where to find this witness/evidence/instance/record/table/you-name-it `?H`
-
-> It attempts to find or construct such a value using a _variant of the `eauto` proof search_ procedure that refers to a "hint database" called `typeclass_instances`.
-
-```coq
-Print HintDb typeclass_instances. (* too much to be useful *)
-```
-
-"hint database" to me is better understood as a reverse of environment or typing context `Γ`. Though specialized with only `Instance` there.
-(这么一看实现一个 Scala 的 `Implicit` 也不难啊)
-
-Coq can even print what's happening during this proof search!
-
-```coq
-Set Typeclasses Debug.
-Check (show 42).
-(* ==>
- Debug: 1: looking for (Show nat) without backtracking
- Debug: 1.1: exact showNat on (Show nat), 0 subgoal(s)
-*)
-
-Check (show (true,42)).
-(* ==>
- Debug: 1: looking for (Show (bool * nat)) without backtracking
- Debug: 1.1: simple apply @showPair on (Show (bool * nat)), 2 subgoal(s)
- Debug: 1.1.3 : (Show bool)
- Debug: 1.1.3: looking for (Show bool) without backtracking
- Debug: 1.1.3.1: exact showBool on (Show bool), 0 subgoal(s)
- Debug: 1.1.3 : (Show nat)
- Debug: 1.1.3: looking for (Show nat) without backtracking
- Debug: 1.1.3.1: exact showNat on (Show nat), 0 subgoal(s) *)
-Unset Typeclasses Debug.
-```
-
-> In summary, here are the steps again:
-
-```coq
-show 42
- ===> { Implicit arguments }
-@show _ _ 42
- ===> { Typing }
-@show (?A : Type) (?Show0 : Show ?A) 42
- ===> { Unification }
-@show nat (?Show0 : Show nat) 42
- ===> { Proof search for Show Nat returns showNat }
-@show nat showNat 42
-```
-
-
-Typeclasses and Proofs
-----------------------
-
-### Propositional Typeclass Members
-
-```coq
-Class EqDec (A : Type) {H : Eq A} :=
- {
- eqb_eq : ∀ x y, x =? y = true ↔ x = y
- }.
-```
-
-```coq
-Instance eqdecNat : EqDec nat :=
- {
- eqb_eq := Nat.eqb_eq
- }.
-```
-
-这里可以用于抽象 LF-07 的 reflection
-
-
-### Substructures
-
-> Naturally, it is also possible to have typeclass instances as members of other typeclasses: these are called _substructures_.
-
-这里的 `relation` 来自 Prelude 不过和 LF-11 用法一样:
-
-```coq
-Require Import Coq.Relations.Relation_Definitions.
-Class Reflexive (A : Type) (R : relation A) :=
- {
- reflexivity : ∀ x, R x x
- }.
-Class Transitive (A : Type) (R : relation A) :=
- {
- transitivity : ∀ x y z, R x y → R y z → R x z
- }.
-```
-
-```coq
-Class PreOrder (A : Type) (R : relation A) :=
- { PreOrder_Reflexive :> Reflexive A R ;
- PreOrder_Transitive :> Transitive A R }.
-```
-
-> The syntax `:>` indicates that each `PreOrder` can be seen as a `Reflexive` and `Transitive` relation, so that, any time a reflexive relation is needed, a preorder can be used instead.
-
-这里的 `:>` 方向和 subtyping 的 _subsumption_ 是反着的……跟 SML 的 ascription `:>` 一样……
-
-- subtyping `T :> S` : value of `S` can safely be used as value of `T`
-- ascription `P :> R` : value of `P` can safely be used as value of `R`
-
-Why?
-
-
-
-Some Useful Typeclasses
------------------------
-
-### `Dec`
-
-> The `ssreflect` library defines what it means for a proposition `P` to be _decidable_ like this...
-
-```coq
-Require Import ssreflect ssrbool.
-Print decidable.
-(* ==>
- decidable = fun P : Prop => {P} + {~ P}
-*)
-```
-
-> .. where `{P} + {¬ P}` is an "informative disjunction" of `P` and `¬P`.
-
-即两个 evidence(参考 LF-07)
-
-```coq
-Class Dec (P : Prop) : Type :=
- {
- dec : decidable P
- }.
-```
-
-### Monad
-
-> In Haskell, one place typeclasses are used very heavily is with the Monad typeclass, especially in conjunction with Haskell's "do notation" for monadic actions.
-
-> Monads are an extremely powerful tool for organizing and streamlining code in a wide range of situations where computations can be thought of as yielding a result along with some kind of "effect."
-
-说话很严谨「in a wide range of situations where ... "effect"」
-
-> most older projects simply define their own monads and monadic notations — sometimes typeclass-based, often not — while newer projects use one of several generic libraries for monads. Our current favorite (as of Summer 2017) is the monad typeclasses in Gregory Malecha's `ext-lib` package:
-
-
-
-```coq
-Require Export ExtLib.Structures.Monads.
-Export MonadNotation.
-Open Scope monad_scope.
-```
-
-```coq
-Class Monad (M : Type → Type) : Type := {
- ret : ∀ {T : Type}, T → M T ;
- bind : ∀ {T U : Type}, M T → (T → M U) → M U
-}.
-
-Instance optionMonad : Monad option := {
- ret T x := Some x ;
- bind T U m f :=
- match m with
- None ⇒ None
- | Some x ⇒ f x
- end
-}.
-```
-
-Compare with Haskell:
-
-```haskell
-class Applicative m => Monad (m :: * -> *) where
- return :: a -> m a
- (>>=) :: m a -> (a -> m b) -> m b
-
-instance Monad Maybe where
- return = Just
- (>>=) = (>>=)
- where
- (>>=) :: Maybe a -> (a -> Maybe b) -> Maybe b
- Nothing >>= _ = Nothing
- (Just x) >>= f = f x
-```
-
-After mimic `do` notation: (as PLF-11)
-
-```coq
-Definition sum3 (l : list nat) : option nat :=
- x0 <- nth_opt 0 l ;;
- x1 <- nth_opt 1 l ;;
- x2 <- nth_opt 2 l ;;
- ret (x0 + x1 + x2).
-```
-
-
-Controlling Instantiation
--------------------------
-
-### "Defaulting"
-
-Would better explicitly typed. searching can be stupid
-
-### Manipulating the Hint Database
-
-> One of the ways in which Coq's typeclasses differ most from Haskell's is the lack, in Coq, of an automatic check for "overlapping instances."
-
-在 Haskell 中一大 use case 是可以做类似 C++ 的 partial specification(偏特化)
-
-- Check out [this](https://kseo.github.io/posts/2017-02-05-avoid-overlapping-instances-with-closed-type-families.html) on the pros and cons of overlapping instances in Haskell
-- Check out [this] (https://www.ibm.com/developerworks/community/blogs/12bb75c9-dfec-42f5-8b55-b669cc56ad76/entry/c__e6_a8_a1_e6_9d_bf__e7_a9_b6_e7_ab_9f_e4_bb_80_e4_b9_88_e6_98_af_e7_89_b9_e5_8c_96?lang=en) on template partial specification in C++
-
-> That is, it is completely legal to define a given type to be an instance of a given class in two different ways.
-> When this happens, it is unpredictable which instance will be found first by the instance search process;
-
-Workarounds in Coq when this happen:
-1. removing instances from hint database
-2. priorities
-
-
-
-Debugging
----------
-
-TBD.
-
-- Instantiation Failures
-- Nontermination
-
-
-Alternative Structuring Mechanisms
-----------------------------------
-
-_large-scale structuring mechanisms_
-
-> Typeclasses are just one of several mechanisms that can be used in Coq for structuring large developments. Others include:
->
-> - canonical structures
-> - bare dependent records
-> - modules and functors
-
-Module and functors is very familiar!
-
-
-Further Reading
-----------------------------------
-
-On the origins of typeclasses in Haskell:
-
-- How to make ad-hoc polymorphism less ad hoc Philip Wadler and Stephen Blott. 16'th Symposium on Principles of Programming Languages, ACM Press, Austin, Texas, January 1989.
-
-
-The original paper on typeclasses In Coq:
-
-- Matthieu Sozeau and Nicolas Oury. First-Class Type Classes. TPHOLs 2008.
-
-
diff --git a/about.html b/about.html
index 59c3d27d6b7..55d8ac41129 100644
--- a/about.html
+++ b/about.html
@@ -2,12 +2,12 @@
layout: page
title: "About"
description: "「他单纯只想把日子过得不浪费」"
-header-img: "img/bg-me-2022.jpg"
+header-img: "img/post-bg-coffee.jpg"
header-mask: 0.3
multilingual: true
---
-{% include multilingual-sel.html %}
+{% include multilingual-sel.html %}